Class: Bech32::SilentPaymentAddr

Inherits:
Object
  • Object
show all
Defined in:
lib/bech32/silent_payment_addr.rb,
sig/bech32/silent_payment_addr.rbs

Overview

BIP-352 silent payment address.

Constant Summary collapse

HRP_MAINNET =

Returns:

  • (String)
'sp'
HRP_TESTNET =

Returns:

  • (String)
'tsp'

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(hrp, version, scan_key, spend_key) ⇒ SilentPaymentAddr

Initialize SilentPaymentAddr.

Parameters:

  • hrp (String)
  • version (Integer)
  • scan_key (String)
  • spend_key (String)


18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/bech32/silent_payment_addr.rb', line 18

def initialize(hrp, version, scan_key, spend_key)
  raise ArgumentError, "hrp must be sp or tsp." unless [HRP_MAINNET, HRP_TESTNET].include?(hrp)
  raise ArgumentError, "version must be Integer." unless version.is_a?(Integer)
  raise ArgumentError, "scan_key must be String." unless scan_key.is_a?(String)
  raise ArgumentError, "spend_key must be String." unless spend_key.is_a?(String)
  raise ArgumentError, 'scan_key must be 33 bytes.' unless [scan_key].pack('H*').bytesize == 33
  raise ArgumentError, 'spend_key must be 33 bytes.' unless [spend_key].pack('H*').bytesize == 33
  @hrp = hrp
  @version = version
  @scan_key = scan_key
  @spend_key = spend_key
end

Instance Attribute Details

#hrpString (readonly)

Returns the value of attribute hrp.

Returns:

  • (String)


8
9
10
# File 'lib/bech32/silent_payment_addr.rb', line 8

def hrp
  @hrp
end

#scan_keyString (readonly)

Returns the value of attribute scan_key.

Returns:

  • (String)


10
11
12
# File 'lib/bech32/silent_payment_addr.rb', line 10

def scan_key
  @scan_key
end

#spend_keyString (readonly)

Returns the value of attribute spend_key.

Returns:

  • (String)


11
12
13
# File 'lib/bech32/silent_payment_addr.rb', line 11

def spend_key
  @spend_key
end

#versionInteger (readonly)

Returns the value of attribute version.

Returns:

  • (Integer)


9
10
11
# File 'lib/bech32/silent_payment_addr.rb', line 9

def version
  @version
end

Class Method Details

.parse(addr) ⇒ SilentPaymentAddr

Parse silent payment address string.

Parameters:

  • addr (String)

Returns:



35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/bech32/silent_payment_addr.rb', line 35

def self.parse(addr)
  raise ArgumentError, "addr must be String." unless addr.is_a?(String)
  hrp, data, spec = Bech32.decode(addr, addr.length)
  raise ArgumentError, "addr must be encoded with bech32m." unless spec == Bech32::Encoding::BECH32M
  raise ArgumentError, 'Invalid hrp.' if hrp.nil? || data[0].nil? || ![HRP_MAINNET, HRP_TESTNET].include?(hrp)
  version = data[0]
  converted = Bech32.convert_bits(data[1..-1], 5, 8, false)
  raise ArgumentError, "Invalid data." if converted.nil?
  keys = converted.pack('C*').unpack1('H*')
  raise ArgumentError, "Invalid key size." unless keys.length == 132
  scan = keys[0...66]
  spend = keys[66..-1]
  Bech32::SilentPaymentAddr.new(hrp, version, scan, spend)
end

Instance Method Details

#to_sString

Generate silent payment address string.

Returns:

  • (String)


52
53
54
55
56
# File 'lib/bech32/silent_payment_addr.rb', line 52

def to_s
  keys = scan_key + spend_key
  data = [keys].pack('H*').unpack('C*')
  Bech32.encode(hrp, [version] + Bech32.convert_bits(data, 8, 5), Bech32::Encoding::BECH32M)
end