bech32 1.4.2 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 48d29f1fc27cc6566387a4810caa45c5abf8acfd98f53d5bc91467f4479f97c4
4
- data.tar.gz: e681f66af497af6f5f5089a4cdfd7937fda0a53bba80ba11c7fd7f3ea650163d
3
+ metadata.gz: 368eb6deb6248ddb8f5cbcba18ec90a3ed11b84f60a3de80bb59301eb5c7f1a2
4
+ data.tar.gz: a0d8654790ab71f8460eecdbf17248e8acd3748bf2011b94afe32dd079b2248b
5
5
  SHA512:
6
- metadata.gz: 0e479ba31346cb4e8d3ab586d780ec7586a076f9a89040c3cb48177243f814440e491592b9473555bb8fb08a7c40a9c82f0bb45065e768d42f4b97404dc904c5
7
- data.tar.gz: 053b883473ccf56a6c529898c7c707aaf3abd21e25f097ced6c61e9e52b5919e19b2d36230c0e56c7631748fad366ea468c614971781c54500be1408a06e54b0
6
+ metadata.gz: f3aad0caf6fce5ce425bd0c4e59e934ecfe96bc6fec30cd5c5c7a6ee73f266824c7f90193f4e008ea24f8a65239d13c3763d35c8211d5fa2485cb8317e56d527
7
+ data.tar.gz: 4891f6c6f80b6b11cd136637c9fd204070a2fab2b170919b34c976219d9885eb8ed43ba688b2002fcc1db4df4b2755d1b169744cfaea578e64336afa327b4b65
@@ -19,10 +19,10 @@ jobs:
19
19
  runs-on: ubuntu-latest
20
20
  strategy:
21
21
  matrix:
22
- ruby-version: ['3.0', '3.1', '3.2']
22
+ ruby-version: ['3.0', '3.1', '3.2', '3.3', '3.4']
23
23
 
24
24
  steps:
25
- - uses: actions/checkout@v2
25
+ - uses: actions/checkout@v4
26
26
  - name: Set up Ruby
27
27
  # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
28
28
  # change this to (see https://github.com/ruby/setup-ruby#versioning):
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- ruby-3.0.0
1
+ ruby-3.4.1
data/README.md CHANGED
@@ -100,6 +100,34 @@ segwit_addr.addr
100
100
  => 'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4'
101
101
  ```
102
102
 
103
+ ### Silent payment address
104
+
105
+ Decode silent payment address.
106
+
107
+ ```ruby
108
+ addr = Bech32::SilentPaymentAddr.parse('sp1qqgste7k9hx0qftg6qmwlkqtwuy6cycyavzmzj85c6qdfhjdpdjtdgqjuexzk6murw56suy3e0rd2cgqvycxttddwsvgxe2usfpxumr70xc9pkqwv')
109
+
110
+ # sp version
111
+ addr.version
112
+ => 0
113
+ # scan public key
114
+ addr.scan_key
115
+ => '0220bcfac5b99e04ad1a06ddfb016ee13582609d60b6291e98d01a9bc9a16c96d4'
116
+ # spend public key
117
+ addr.spend_key
118
+ => '025cc9856d6f8375350e123978daac200c260cb5b5ae83106cab90484dcd8fcf36'
119
+ ```
120
+
121
+ Encode sp address.
122
+
123
+ ```ruby
124
+ addr = Bech32::SilentPaymentAddr.new('sp', 0, '0220bcfac5b99e04ad1a06ddfb016ee13582609d60b6291e98d01a9bc9a16c96d4', '025cc9856d6f8375350e123978daac200c260cb5b5ae83106cab90484dcd8fcf36')
125
+
126
+ # sp address
127
+ addr.to_s
128
+ => 'sp1qqgste7k9hx0qftg6qmwlkqtwuy6cycyavzmzj85c6qdfhjdpdjtdgqjuexzk6murw56suy3e0rd2cgqvycxttddwsvgxe2usfpxumr70xc9pkqwv'
129
+ ```
130
+
103
131
  ### Nostr
104
132
 
105
133
  Supports encoding/decoding of Nostr's [NIP-19](https://github.com/nostr-protocol/nips/blob/master/19.md) entities.
@@ -147,22 +175,22 @@ The `encode` command takes `HRP`, `data`, and type (`bech32` or `bech32m`) as ar
147
175
  $ bech32 encode genesis 000409190707111719041a120308120a060c161408110d091b090009021b1e1d150e190215010d0a1603091e1f0b100609090d1a1c1a13030c120c0c0f1c020d1d1a0e170b1c17021018121e0a021c121a1c0d161b16131d1609130f1d13180f1e081d041d0a110f110d1313081c11100600180b000c08140c1e130e0f090c160e0018191e1d1c0016060c11101214121e19070d1a0c1c15020414001f10100c09090600181806001809080e180507021913031100030216141b100908160c1213120f1912011f07021c13190d1900170c1d1203040f071c1908050504130e080d0a100d130b03000a0a08191310090918120f11031104120c15180c15120a0f1919070c1c12060c1911091010120a0d191b040c1613020e1911081f000b1a0b0514150c1613010d0c1c030b17011805090119061e0b051e130c00030419000112030110181d011a000f020c0901080c1113060201041a0e1b060a15160506181c11140c1c1d0b1b14020c131e0b0f071519181e0b1f0e0a08170f1d0c05060e1c1b0e160c0f0a171d0b101a1a1f1417160e0d1414030e161b0a000709100d15020c000e010c00000000 bech32
148
176
  genesis1qyfe883hey6jrgj2xvk5g3dfmfqfzm7a4wez4pd2krf7ltsxffd6u6nrvjvv0uzda6whtuhzscj72zuj6udkmknakfn0anc07gaya2303dnngu3sxqctqvg5v7nw0fvkwqce7auqkxv3sj5j7e8d6vu4zy5qlssvffxqccxqcfgwc98zenr3qrzk5msfgkvjnj0ejpl8zunedeqhvajry08ueg99ynwgd2sdntrq22gensffcj03r3yjv4cv4j20ee8vujxve3fssj2demyvknzwe3glqt6t954vknpdvurthpc9fpex7t97nvqryeqpjrpscap6q0zvfpgv3nxzpy6wmx24k9xcu35vuatm5zvn7t084ec7tlw2gh0av9xwumwkv02hats66l5hkwd55rwkm2q8fsd4zvqwpvqqqqtdc6rp
149
177
 
178
+ Note: `data` must be converted from 8-bit to 5-bit units.
179
+
150
180
  #### Decode
151
181
 
152
182
  The `decode` command takes bech32/bech32m string as arguments and outputs `HRP`, `data`, and type.
153
183
 
154
184
  $ bech32 decode genesis1qyfe883hey6jrgj2xvk5g3dfmfqfzm7a4wez4pd2krf7ltsxffd6u6nrvjvv0uzda6whtuhzscj72zuj6udkmknakfn0anc07gaya2303dnngu3sxqctqvg5v7nw0fvkwqce7auqkxv3sj5j7e8d6vu4zy5qlssvffxqccxqcfgwc98zenr3qrzk5msfgkvjnj0ejpl8zunedeqhvajry08ueg99ynwgd2sdntrq22gensffcj03r3yjv4cv4j20ee8vujxve3fssj2demyvknzwe3glqt6t954vknpdvurthpc9fpex7t97nvqryeqpjrpscap6q0zvfpgv3nxzpy6wmx24k9xcu35vuatm5zvn7t084ec7tlw2gh0av9xwumwkv02hats66l5hkwd55rwkm2q8fsd4zvqwpvqqqqtdc6rp
155
185
  HRP: genesis
156
- DATA: [0, 4, 9, 25, 7, 7, 17, 23, 25, 4, 26, 18, 3, 8, 18, 10, 6, 12, 22, 20, 8, 17, 13, 9, 27, 9, 0, 9, 2, 27, 30, 29, 21, 14, 25, 2, 21, 1, 13, 10, 22, 3, 9, 30, 31, 11, 16, 6, 9, 9, 13, 26, 28, 26, 19, 3, 12, 18, 12, 12, 15, 28, 2, 13, 29, 26, 14, 23, 11, 28, 23, 2, 16, 24, 18, 30, 10, 2, 28, 18, 26, 28, 13, 22, 27, 22, 19, 29, 22, 9, 19, 15, 29, 19, 24, 15, 30, 8, 29, 4, 29, 10, 17, 15, 17, 13, 19, 19, 8, 28, 17, 16, 6, 0, 24, 11, 0, 12, 8, 20, 12, 30, 19, 14, 15, 9, 12, 22, 14, 0, 24, 25, 30, 29, 28, 0, 22, 6, 12, 17, 16, 18, 20, 18, 30, 25, 7, 13, 26, 12, 28, 21, 2, 4, 20, 0, 31, 16, 16, 12, 9, 9, 6, 0, 24, 24, 6, 0, 24, 9, 8, 14, 24, 5, 7, 2, 25, 19, 3, 17, 0, 3, 2, 22, 20, 27, 16, 9, 8, 22, 12, 18, 19, 18, 15, 25, 18, 1, 31, 7, 2, 28, 19, 25, 13, 25, 0, 23, 12, 29, 18, 3, 4, 15, 7, 28, 25, 8, 5, 5, 4, 19, 14, 8, 13, 10, 16, 13, 19, 11, 3, 0, 10, 10, 8, 25, 19, 16, 9, 9, 24, 18, 15, 17, 3, 17, 4, 18, 12, 21, 24, 12, 21, 18, 10, 15, 25, 25, 7, 12, 28, 18, 6, 12, 25, 17, 9, 16, 16, 18, 10, 13, 25, 27, 4, 12, 22, 19, 2, 14, 25, 17, 8, 31, 0, 11, 26, 11, 5, 20, 21, 12, 22, 19, 1, 13, 12, 28, 3, 11, 23, 1, 24, 5, 9, 1, 25, 6, 30, 11, 5, 30, 19, 12, 0, 3, 4, 25, 0, 1, 18, 3, 1, 16, 24, 29, 1, 26, 0, 15, 2, 12, 9, 1, 8, 12, 17, 19, 6, 2, 1, 4, 26, 14, 27, 6, 10, 21, 22, 5, 6, 24, 28, 17, 20, 12, 28, 29, 11, 27, 20, 2, 12, 19, 30, 11, 15, 7, 21, 25, 24, 30, 11, 31, 14, 10, 8, 23, 15, 29, 12, 5, 6, 14, 28, 27, 14, 22, 12, 15, 10, 23, 29, 11, 16, 26, 26, 31, 20, 23, 22, 14, 13, 20, 20, 3, 14, 22, 27, 10, 0, 7, 9, 16, 13, 21, 2, 12, 0, 14, 1, 12, 0, 0, 0, 0]
186
+ DATA: 000409190707111719041a120308120a060c161408110d091b090009021b1e1d150e190215010d0a1603091e1f0b100609090d1a1c1a13030c120c0c0f1c020d1d1a0e170b1c17021018121e0a021c121a1c0d161b16131d1609130f1d13180f1e081d041d0a110f110d1313081c11100600180b000c08140c1e130e0f090c160e0018191e1d1c0016060c11101214121e19070d1a0c1c15020414001f10100c09090600181806001809080e180507021913031100030216141b100908160c1213120f1912011f07021c13190d1900170c1d1203040f071c1908050504130e080d0a100d130b03000a0a08191310090918120f11031104120c15180c15120a0f1919070c1c12060c1911091010120a0d191b040c1613020e1911081f000b1a0b0514150c1613010d0c1c030b17011805090119061e0b051e130c00030419000112030110181d011a000f020c0901080c1113060201041a0e1b060a15160506181c11140c1c1d0b1b14020c131e0b0f071519181e0b1f0e0a08170f1d0c05060e1c1b0e160c0f0a171d0b101a1a1f1417160e0d1414030e161b0a000709100d15020c000e010c00000000
157
187
  TYPE: bech32
158
188
 
159
- Note: `DATA` is not bit-converted.
160
-
161
189
  If bech32 string has segwit hrp, it will also output witness version and witness program:
162
190
 
163
191
  $ bech32 decode bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kt5nd6y
164
192
  HRP: bc
165
- DATA: [1, 14, 20, 15, 7, 13, 26, 0, 25, 18, 6, 11, 13, 8, 21, 4, 20, 3, 17, 2, 29, 3, 12, 29, 3, 4, 15, 24, 20, 6, 14, 30, 22, 14, 20, 15, 7, 13, 26, 0, 25, 18, 6, 11, 13, 8, 21, 4, 20, 3, 17, 2, 29, 3, 12, 29, 3, 4, 15, 24, 20, 6, 14, 30, 22]
193
+ DATA: 010e140f070d1a001912060b0d081504140311021d030c1d03040f1814060e1e160e140f070d1a001912060b0d081504140311021d030c1d03040f1814060e1e16
166
194
  TYPE: bech32m
167
195
  WITNESS VERSION: 1
168
196
  WITNESS PROGRAM: 751e76e8199196d454941c45d1b3a323f1433bd6751e76e8199196d454941c45d1b3a323f1433bd6
@@ -171,13 +199,25 @@ If bech32 string has NIP-19 hrp, it will also output NIP-19 entry:
171
199
 
172
200
  $ bech32 decode nprofile1qqsrhuxx8l9ex335q7he0f09aej04zpazpl0ne2cgukyawd24mayt8gpp4mhxue69uhhytnc9e3k7mgpz4mhxue69uhkg6nzv9ejuumpv34kytnrdaksjlyr9p
173
201
  HRP: nprofile
174
- DATA: [0, 0, 16, 3, 23, 28, 6, 6, 7, 31, 5, 25, 6, 17, 17, 20, 0, 30, 23, 25, 15, 9, 15, 5, 29, 25, 18, 15, 21, 2, 1, 29, 2, 1, 31, 15, 19, 25, 10, 24, 8, 28, 22, 4, 29, 14, 13, 10, 21, 27, 29, 4, 11, 7, 8, 1, 1, 21, 27, 23, 6, 28, 25, 26, 5, 28, 23, 23, 4, 11, 19, 24, 5, 25, 17, 22, 30, 27, 8, 1, 2, 21, 27, 23, 6, 28, 25, 26, 5, 28, 23, 22, 8, 26, 19, 2, 12, 5, 25, 18, 28, 28, 27, 1, 12, 17, 21, 22, 4, 11, 19, 3, 13, 29, 22, 16]
202
+ DATA: 00001003171c0606071f051906111114001e17190f090f051d19120f1502011d02011f0f13190a18081c16041d0e0d0a151b1d040b07080101151b17061c191a051c1717040b1318051911161e1b080102151b17061c191a051c1716081a13020c0519121c1c1b010c111516040b13030d1d1610
175
203
  TYPE: bech32
176
204
  NIP19 Entities:
177
205
  special: 3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d
178
206
  relay: wss://r.x.com
179
207
  relay: wss://djbas.sadkb.com
180
208
 
209
+ If sp address, it will also output scan/spend public key:
210
+
211
+ $ bech32 decode sp1qqgste7k9hx0qftg6qmwlkqtwuy6cycyavzmzj85c6qdfhjdpdjtdgqjuexzk6murw56suy3e0rd2cgqvycxttddwsvgxe2usfpxumr70xc9pkqwv
212
+ HRP: sp
213
+ DATA: 000008100b191e160517060f00090b081a001b0e1f16000b0e1c041a180418041d0c021b02120714181a000d0917120d010d120b0d0800121c190602161a1b1c030e141a101c0411190f030d0a1808000c0418060b0b0d0d0e100c0806190a1c100901061c1b031e0f0618
214
+ TYPE: bech32m
215
+ version: 0
216
+ scan public key: 0220bcfac5b99e04ad1a06ddfb016ee13582609d60b6291e98d01a9bc9a16c96d4
217
+ spend public key: 025cc9856d6f8375350e123978daac200c260cb5b5ae83106cab90484dcd8fcf36
218
+
219
+ Note: `DATA` is data without bit conversion. When used, the `DATA` must be converted from 5-bit to 8-bit and padded as necessary.
220
+
181
221
  ## License
182
222
 
183
223
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/exe/bech32 CHANGED
@@ -25,13 +25,14 @@ class CLI < Thor
25
25
  DATA: #{data.pack('C*').unpack1('H*')}
26
26
  TYPE: #{spec == Bech32::Encoding::BECH32 ? 'bech32' : 'bech32m'}
27
27
  EOS
28
- if [Bech32::SegwitAddr::HRP_MAINNET, Bech32::SegwitAddr::HRP_TESTNET, Bech32::SegwitAddr::HRP_REGTEST].include?(hrp)
28
+ case hrp
29
+ when Bech32::SegwitAddr::HRP_MAINNET, Bech32::SegwitAddr::HRP_TESTNET, Bech32::SegwitAddr::HRP_REGTEST
29
30
  addr = Bech32::SegwitAddr.new(bech32_str)
30
31
  puts <<~EOS
31
32
  WITNESS VERSION: #{addr.ver}
32
33
  WITNESS PROGRAM: #{addr.prog.pack('C*').unpack1('H*')}
33
34
  EOS
34
- elsif Bech32::Nostr::NIP19::ALL_PREFIXES.include?(hrp)
35
+ when *Bech32::Nostr::NIP19::ALL_PREFIXES
35
36
  entity = Bech32::Nostr::NIP19.decode(bech32_str)
36
37
  if entity.is_a?(Bech32::Nostr::BareEntity)
37
38
  puts <<~EOS
@@ -43,6 +44,13 @@ class CLI < Thor
43
44
  puts " #{entry.to_s}"
44
45
  end
45
46
  end
47
+ when Bech32::SilentPaymentAddr::HRP_MAINNET, Bech32::SilentPaymentAddr::HRP_TESTNET
48
+ addr = Bech32::SilentPaymentAddr.parse(bech32_str)
49
+ puts <<~EOS
50
+ version: #{addr.version}
51
+ scan public key: #{addr.scan_key}
52
+ spend public key: #{addr.spend_key}
53
+ EOS
46
54
  end
47
55
  else
48
56
  puts 'Can not decode.'
@@ -0,0 +1,57 @@
1
+ module Bech32
2
+ # BIP-352 silent payment address.
3
+ # https://github.com/bitcoin/bips/blob/master/bip-0352.mediawiki#user-content-Address_encoding
4
+ class SilentPaymentAddr
5
+ HRP_MAINNET = 'sp'
6
+ HRP_TESTNET = 'tsp'
7
+
8
+ attr_reader :hrp
9
+ attr_reader :version
10
+ attr_reader :scan_key
11
+ attr_reader :spend_key
12
+
13
+ # Constructor
14
+ # @param [String] hrp HRP for silent payment address.
15
+ # @param [Integer] version The version of sp address.
16
+ # @param [String] scan_key The scan public key with hex format.
17
+ # @param [String] spend_key The spend public key with hex format.
18
+ def initialize(hrp, version, scan_key, spend_key)
19
+ raise ArgumentError, "hrp must be sp or tsp." unless [HRP_MAINNET, HRP_TESTNET].include?(hrp)
20
+ raise ArgumentError, "version must be Integer." unless version.is_a?(Integer)
21
+ raise ArgumentError, "scan_key must be String." unless scan_key.is_a?(String)
22
+ raise ArgumentError, "spend_key must be String." unless spend_key.is_a?(String)
23
+ raise ArgumentError, 'scan_key must be 33 bytes.' unless [scan_key].pack('H*').bytesize == 33
24
+ raise ArgumentError, 'spend_key must be 33 bytes.' unless [spend_key].pack('H*').bytesize == 33
25
+ @hrp = hrp
26
+ @version = version
27
+ @scan_key = scan_key
28
+ @spend_key = spend_key
29
+ end
30
+
31
+ # Parse silent payment address.
32
+ # @param [String] addr Silent payment address.
33
+ # @return [Bech32::SilentPaymentAddr]
34
+ # @raise [ArgumentError]
35
+ def self.parse(addr)
36
+ raise ArgumentError, "addr must be String." unless addr.is_a?(String)
37
+ hrp, data, spec = Bech32.decode(addr, addr.length)
38
+ raise ArgumentError, "addr must be encoded with bech32m." unless spec == Bech32::Encoding::BECH32M
39
+ raise ArgumentError, 'Invalid hrp.' if hrp.nil? || data[0].nil? || ![HRP_MAINNET, HRP_TESTNET].include?(hrp)
40
+ version = data[0]
41
+ keys = Bech32.convert_bits(data[1..-1], 5, 8, false).pack('C*').unpack1('H*')
42
+ raise ArgumentError, "Invalid key size." unless keys.length == 132
43
+ scan = keys[0...66]
44
+ spend = keys[66..-1]
45
+ Bech32::SilentPaymentAddr.new(hrp, version, scan, spend)
46
+ end
47
+
48
+ # Get silent payment address.
49
+ # @return [String]
50
+ def to_s
51
+ keys = scan_key + spend_key
52
+ data = [keys].pack('H*').unpack('C*')
53
+ Bech32.encode(hrp, [version] + Bech32.convert_bits(data, 8, 5), Bech32::Encoding::BECH32M)
54
+ end
55
+
56
+ end
57
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Bech32
4
- VERSION = '1.4.2'
4
+ VERSION = '1.5.0'
5
5
  end
data/lib/bech32.rb CHANGED
@@ -7,6 +7,7 @@ module Bech32
7
7
 
8
8
  autoload :SegwitAddr, 'bech32/segwit_addr'
9
9
  autoload :Nostr, 'bech32/nostr'
10
+ autoload :SilentPaymentAddr, 'bech32/silent_payment_addr'
10
11
 
11
12
  SEPARATOR = '1'
12
13
 
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bech32
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.2
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shigeyuki Azuchi
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2023-08-28 00:00:00.000000000 Z
10
+ date: 2025-03-25 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: thor
@@ -79,12 +78,12 @@ files:
79
78
  - lib/bech32/nostr/entity.rb
80
79
  - lib/bech32/nostr/nip19.rb
81
80
  - lib/bech32/segwit_addr.rb
81
+ - lib/bech32/silent_payment_addr.rb
82
82
  - lib/bech32/version.rb
83
83
  homepage: https://github.com/azuchi/bech32rb
84
84
  licenses:
85
85
  - MIT
86
86
  metadata: {}
87
- post_install_message:
88
87
  rdoc_options: []
89
88
  require_paths:
90
89
  - lib
@@ -99,8 +98,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
99
98
  - !ruby/object:Gem::Version
100
99
  version: '0'
101
100
  requirements: []
102
- rubygems_version: 3.2.3
103
- signing_key:
101
+ rubygems_version: 3.6.3
104
102
  specification_version: 4
105
103
  summary: The implementation of Bech32 encoder and decoder.
106
104
  test_files: []