bitcoinrb 0.3.1 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/.travis.yml +6 -3
  4. data/README.md +17 -6
  5. data/bitcoinrb.gemspec +9 -8
  6. data/exe/bitcoinrbd +5 -0
  7. data/lib/bitcoin.rb +35 -19
  8. data/lib/bitcoin/bip85_entropy.rb +111 -0
  9. data/lib/bitcoin/block_filter.rb +14 -0
  10. data/lib/bitcoin/block_header.rb +2 -0
  11. data/lib/bitcoin/chain_params.rb +9 -8
  12. data/lib/bitcoin/chainparams/regtest.yml +1 -1
  13. data/lib/bitcoin/chainparams/signet.yml +39 -0
  14. data/lib/bitcoin/chainparams/testnet.yml +1 -1
  15. data/lib/bitcoin/constants.rb +45 -12
  16. data/lib/bitcoin/descriptor.rb +1 -1
  17. data/lib/bitcoin/errors.rb +19 -0
  18. data/lib/bitcoin/ext.rb +5 -0
  19. data/lib/bitcoin/ext/ecdsa.rb +31 -0
  20. data/lib/bitcoin/ext/json_parser.rb +46 -0
  21. data/lib/bitcoin/ext_key.rb +50 -19
  22. data/lib/bitcoin/key.rb +46 -29
  23. data/lib/bitcoin/key_path.rb +12 -5
  24. data/lib/bitcoin/message.rb +79 -0
  25. data/lib/bitcoin/message/addr_v2.rb +34 -0
  26. data/lib/bitcoin/message/base.rb +17 -0
  27. data/lib/bitcoin/message/cf_parser.rb +16 -0
  28. data/lib/bitcoin/message/cfcheckpt.rb +36 -0
  29. data/lib/bitcoin/message/cfheaders.rb +40 -0
  30. data/lib/bitcoin/message/cfilter.rb +35 -0
  31. data/lib/bitcoin/message/fee_filter.rb +1 -1
  32. data/lib/bitcoin/message/filter_load.rb +3 -3
  33. data/lib/bitcoin/message/get_cfcheckpt.rb +29 -0
  34. data/lib/bitcoin/message/get_cfheaders.rb +24 -0
  35. data/lib/bitcoin/message/get_cfilters.rb +25 -0
  36. data/lib/bitcoin/message/header_and_short_ids.rb +1 -1
  37. data/lib/bitcoin/message/inventory.rb +1 -1
  38. data/lib/bitcoin/message/merkle_block.rb +1 -1
  39. data/lib/bitcoin/message/network_addr.rb +141 -18
  40. data/lib/bitcoin/message/ping.rb +1 -1
  41. data/lib/bitcoin/message/pong.rb +1 -1
  42. data/lib/bitcoin/message/send_addr_v2.rb +13 -0
  43. data/lib/bitcoin/message/send_cmpct.rb +2 -2
  44. data/lib/bitcoin/message/version.rb +7 -0
  45. data/lib/bitcoin/mnemonic.rb +7 -7
  46. data/lib/bitcoin/network/peer.rb +9 -4
  47. data/lib/bitcoin/network/peer_discovery.rb +1 -1
  48. data/lib/bitcoin/node/cli.rb +14 -10
  49. data/lib/bitcoin/node/configuration.rb +3 -1
  50. data/lib/bitcoin/node/spv.rb +9 -1
  51. data/lib/bitcoin/opcodes.rb +14 -1
  52. data/lib/bitcoin/out_point.rb +7 -0
  53. data/lib/bitcoin/payment_code.rb +92 -0
  54. data/lib/bitcoin/psbt/hd_key_path.rb +1 -1
  55. data/lib/bitcoin/psbt/input.rb +8 -17
  56. data/lib/bitcoin/psbt/output.rb +1 -1
  57. data/lib/bitcoin/psbt/tx.rb +11 -16
  58. data/lib/bitcoin/rpc/bitcoin_core_client.rb +22 -12
  59. data/lib/bitcoin/rpc/request_handler.rb +3 -3
  60. data/lib/bitcoin/script/script.rb +68 -28
  61. data/lib/bitcoin/script/script_error.rb +27 -1
  62. data/lib/bitcoin/script/script_interpreter.rb +164 -67
  63. data/lib/bitcoin/script/tx_checker.rb +64 -14
  64. data/lib/bitcoin/secp256k1.rb +1 -0
  65. data/lib/bitcoin/secp256k1/native.rb +138 -25
  66. data/lib/bitcoin/secp256k1/rfc6979.rb +43 -0
  67. data/lib/bitcoin/secp256k1/ruby.rb +82 -54
  68. data/lib/bitcoin/sighash_generator.rb +156 -0
  69. data/lib/bitcoin/store.rb +2 -1
  70. data/lib/bitcoin/store/chain_entry.rb +1 -0
  71. data/lib/bitcoin/store/db/level_db.rb +2 -2
  72. data/lib/bitcoin/store/utxo_db.rb +226 -0
  73. data/lib/bitcoin/tx.rb +17 -88
  74. data/lib/bitcoin/tx_in.rb +4 -5
  75. data/lib/bitcoin/tx_out.rb +2 -3
  76. data/lib/bitcoin/util.rb +34 -6
  77. data/lib/bitcoin/version.rb +1 -1
  78. data/lib/bitcoin/wallet.rb +1 -0
  79. data/lib/bitcoin/wallet/account.rb +2 -1
  80. data/lib/bitcoin/wallet/base.rb +3 -3
  81. data/lib/bitcoin/wallet/db.rb +1 -1
  82. data/lib/bitcoin/wallet/master_key.rb +1 -0
  83. data/lib/bitcoin/wallet/utxo.rb +37 -0
  84. metadata +66 -32
@@ -18,14 +18,13 @@ module Bitcoin
18
18
 
19
19
  def self.parse_from_payload(payload)
20
20
  buf = payload.is_a?(String) ? StringIO.new(payload) : payload
21
- value = buf.read(8).unpack('q').first
21
+ value = buf.read(8).unpack1('q')
22
22
  script_size = Bitcoin.unpack_var_int_from_io(buf)
23
23
  new(value: value, script_pubkey: Script.parse_from_payload(buf.read(script_size)))
24
24
  end
25
25
 
26
26
  def to_payload
27
- s = script_pubkey.to_payload
28
- [value].pack('Q') << Bitcoin.pack_var_int(s.length) << s
27
+ [value].pack('Q') << script_pubkey.to_payload(true)
29
28
  end
30
29
 
31
30
  def to_empty_payload
data/lib/bitcoin/util.rb CHANGED
@@ -33,7 +33,7 @@ module Bitcoin
33
33
 
34
34
  # @return an integer for a valid payload, otherwise nil
35
35
  def unpack_var_int(payload)
36
- case payload.unpack('C').first
36
+ case payload.unpack1('C')
37
37
  when 0xfd
38
38
  payload.unpack('xva*')
39
39
  when 0xfe
@@ -47,14 +47,14 @@ module Bitcoin
47
47
 
48
48
  # @return an integer for a valid payload, otherwise nil
49
49
  def unpack_var_int_from_io(buf)
50
- uchar = buf.read(1)&.unpack('C')&.first
50
+ uchar = buf.read(1)&.unpack1('C')
51
51
  case uchar
52
52
  when 0xfd
53
- buf.read(2)&.unpack('v')&.first
53
+ buf.read(2)&.unpack1('v')
54
54
  when 0xfe
55
- buf.read(4)&.unpack('V')&.first
55
+ buf.read(4)&.unpack1('V')
56
56
  when 0xff
57
- buf.read(8)&.unpack('Q')&.first
57
+ buf.read(8)&.unpack1('Q')
58
58
  else
59
59
  uchar
60
60
  end
@@ -79,7 +79,7 @@ module Bitcoin
79
79
 
80
80
  # byte convert to the sequence of bits packed eight in a byte with the least significant bit first.
81
81
  def byte_to_bit(byte)
82
- byte.unpack('b*').first
82
+ byte.unpack1('b*')
83
83
  end
84
84
 
85
85
  # padding zero to the left of binary string until bytesize.
@@ -96,6 +96,15 @@ module Bitcoin
96
96
  Digest::RMD160.hexdigest(Digest::SHA256.digest(hex.htb))
97
97
  end
98
98
 
99
+ # Generate tagged hash value.
100
+ # @param [String] tag tag value.
101
+ # @param [String] msg the message to be hashed.
102
+ # @return [String] the hash value with binary format.
103
+ def tagged_hash(tag, msg)
104
+ tag_hash = Digest::SHA256.digest(tag)
105
+ Digest::SHA256.digest(tag_hash + tag_hash + msg)
106
+ end
107
+
99
108
  # encode Base58 check address.
100
109
  # @param [String] hex the address payload.
101
110
  # @param [String] addr_version the address version for P2PKH and P2SH.
@@ -128,6 +137,25 @@ module Bitcoin
128
137
  OpenSSL::HMAC.digest(DIGEST_NAME_SHA256, key, data)
129
138
  end
130
139
 
140
+ # check whether +addr+ is valid address.
141
+ # @param [String] addr an address
142
+ # @return [Boolean] if valid address return true, otherwise false.
143
+ def valid_address?(addr)
144
+ begin
145
+ Bitcoin::Script.parse_from_addr(addr)
146
+ true
147
+ rescue Exception
148
+ false
149
+ end
150
+ end
151
+
131
152
  end
132
153
 
154
+ module HexConverter
155
+
156
+ def to_hex
157
+ to_payload.bth
158
+ end
159
+
160
+ end
133
161
  end
@@ -1,3 +1,3 @@
1
1
  module Bitcoin
2
- VERSION = "0.3.1"
2
+ VERSION = "0.7.0"
3
3
  end
@@ -4,5 +4,6 @@ module Bitcoin
4
4
  autoload :Account, 'bitcoin/wallet/account'
5
5
  autoload :DB, 'bitcoin/wallet/db'
6
6
  autoload :MasterKey, 'bitcoin/wallet/master_key'
7
+ autoload :Utxo, 'bitcoin/wallet/utxo'
7
8
  end
8
9
  end
@@ -3,6 +3,7 @@ module Bitcoin
3
3
 
4
4
  # the account in BIP-44
5
5
  class Account
6
+ include Bitcoin::HexConverter
6
7
 
7
8
  PURPOSE_TYPE = {legacy: 44, nested_witness: 49, native_segwit: 84}
8
9
 
@@ -42,7 +43,7 @@ module Bitcoin
42
43
 
43
44
  def to_payload
44
45
  payload = account_key.to_payload
45
- payload << Bitcoin.pack_var_string(name.unpack('H*').first.htb)
46
+ payload << Bitcoin.pack_var_string(name.unpack1('H*').htb)
46
47
  payload << [purpose, index, receive_depth, change_depth, lookahead].pack('I*')
47
48
  payload
48
49
  end
@@ -1,4 +1,4 @@
1
- require 'leveldb'
1
+ require 'leveldb-native'
2
2
  module Bitcoin
3
3
  module Wallet
4
4
 
@@ -20,14 +20,14 @@ module Bitcoin
20
20
  # @param [String] wallet_id new wallet id.
21
21
  # @param [String] path_prefix wallet file path prefix.
22
22
  # @return [Bitcoin::Wallet::Base] the wallet
23
- def self.create(wallet_id = 1, path_prefix = default_path_prefix)
23
+ def self.create(wallet_id = 1, path_prefix = default_path_prefix, purpose = Account::PURPOSE_TYPE[:native_segwit])
24
24
  raise ArgumentError, "wallet_id : #{wallet_id} already exist." if self.exist?(wallet_id, path_prefix)
25
25
  w = self.new(wallet_id, path_prefix)
26
26
  # generate seed
27
27
  raise RuntimeError, 'the seed already exist.' if w.db.registered_master?
28
28
  master = Bitcoin::Wallet::MasterKey.generate
29
29
  w.db.register_master_key(master)
30
- w.create_account('Default')
30
+ w.create_account(purpose, 'Default')
31
31
  w
32
32
  end
33
33
 
@@ -15,7 +15,7 @@ module Bitcoin
15
15
 
16
16
  def initialize(path = "#{Bitcoin.base_dir}/db/wallet")
17
17
  FileUtils.mkdir_p(path)
18
- @level_db = ::LevelDB::DB.new(path)
18
+ @level_db = ::LevelDBNative::DB.new(path)
19
19
  end
20
20
 
21
21
  # close database
@@ -3,6 +3,7 @@ module Bitcoin
3
3
 
4
4
  # HD Wallet master seed
5
5
  class MasterKey
6
+ include Bitcoin::HexConverter
6
7
  extend Bitcoin::Util
7
8
  include Bitcoin::Util
8
9
  include Bitcoin::KeyPath
@@ -0,0 +1,37 @@
1
+ module Bitcoin
2
+ module Wallet
3
+ class Utxo
4
+ attr_reader :tx_hash
5
+ attr_reader :index
6
+ attr_reader :block_height
7
+ attr_reader :value
8
+ attr_reader :script_pubkey
9
+
10
+ def initialize(tx_hash, index, value, script_pubkey, block_height = nil)
11
+ @tx_hash = tx_hash
12
+ @index = index
13
+ @block_height = block_height
14
+ @value = value
15
+ @script_pubkey = script_pubkey
16
+ end
17
+
18
+ def self.parse_from_payload(payload)
19
+ return nil if payload.nil?
20
+
21
+ tx_hash, index, block_height, value, payload = payload.unpack('H64VVQa*')
22
+
23
+ buf = StringIO.new(payload)
24
+ script_size = Bitcoin.unpack_var_int_from_io(buf)
25
+ script_pubkey = Bitcoin::Script.parse_from_payload(buf.read(script_size));
26
+ new(tx_hash, index, value, script_pubkey, block_height == 0 ? nil : block_height )
27
+ end
28
+
29
+ def to_payload
30
+ payload = [tx_hash, index, block_height.nil? ? 0 : block_height, value].pack('H64VVQ')
31
+ s = script_pubkey.to_payload
32
+ payload << Bitcoin.pack_var_int(s.length) << s
33
+ payload
34
+ end
35
+ end
36
+ end
37
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bitcoinrb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - azuchi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-12-02 00:00:00.000000000 Z
11
+ date: 2021-02-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ecdsa
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 1.0.3
61
+ version: 1.1.0
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 1.0.3
68
+ version: 1.1.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: daemon-spawn
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -137,7 +137,7 @@ dependencies:
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
139
  - !ruby/object:Gem::Dependency
140
- name: rest-client
140
+ name: iniparse
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
143
  - - ">="
@@ -151,7 +151,7 @@ dependencies:
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0'
153
153
  - !ruby/object:Gem::Dependency
154
- name: iniparse
154
+ name: siphash
155
155
  requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
157
  - - ">="
@@ -165,63 +165,63 @@ dependencies:
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0'
167
167
  - !ruby/object:Gem::Dependency
168
- name: siphash
168
+ name: protobuf
169
169
  requirement: !ruby/object:Gem::Requirement
170
170
  requirements:
171
- - - ">="
171
+ - - '='
172
172
  - !ruby/object:Gem::Version
173
- version: '0'
173
+ version: 3.8.5
174
174
  type: :runtime
175
175
  prerelease: false
176
176
  version_requirements: !ruby/object:Gem::Requirement
177
177
  requirements:
178
- - - ">="
178
+ - - '='
179
179
  - !ruby/object:Gem::Version
180
- version: '0'
180
+ version: 3.8.5
181
181
  - !ruby/object:Gem::Dependency
182
- name: protobuf
182
+ name: json_pure
183
183
  requirement: !ruby/object:Gem::Requirement
184
184
  requirements:
185
- - - '='
185
+ - - ">="
186
186
  - !ruby/object:Gem::Version
187
- version: 3.8.5
187
+ version: 2.3.1
188
188
  type: :runtime
189
189
  prerelease: false
190
190
  version_requirements: !ruby/object:Gem::Requirement
191
191
  requirements:
192
- - - '='
192
+ - - ">="
193
193
  - !ruby/object:Gem::Version
194
- version: 3.8.5
194
+ version: 2.3.1
195
195
  - !ruby/object:Gem::Dependency
196
- name: scrypt
196
+ name: bip-schnorr
197
197
  requirement: !ruby/object:Gem::Requirement
198
198
  requirements:
199
199
  - - ">="
200
200
  - !ruby/object:Gem::Version
201
- version: '0'
201
+ version: 0.3.2
202
202
  type: :runtime
203
203
  prerelease: false
204
204
  version_requirements: !ruby/object:Gem::Requirement
205
205
  requirements:
206
206
  - - ">="
207
207
  - !ruby/object:Gem::Version
208
- version: '0'
208
+ version: 0.3.2
209
209
  - !ruby/object:Gem::Dependency
210
- name: activesupport
210
+ name: base32
211
211
  requirement: !ruby/object:Gem::Requirement
212
212
  requirements:
213
- - - "~>"
213
+ - - ">="
214
214
  - !ruby/object:Gem::Version
215
- version: 5.2.3
215
+ version: 0.3.4
216
216
  type: :runtime
217
217
  prerelease: false
218
218
  version_requirements: !ruby/object:Gem::Requirement
219
219
  requirements:
220
- - - "~>"
220
+ - - ">="
221
221
  - !ruby/object:Gem::Version
222
- version: 5.2.3
222
+ version: 0.3.4
223
223
  - !ruby/object:Gem::Dependency
224
- name: leveldb-ruby
224
+ name: leveldb-native
225
225
  requirement: !ruby/object:Gem::Requirement
226
226
  requirements:
227
227
  - - ">="
@@ -252,16 +252,16 @@ dependencies:
252
252
  name: rake
253
253
  requirement: !ruby/object:Gem::Requirement
254
254
  requirements:
255
- - - "~>"
255
+ - - ">="
256
256
  - !ruby/object:Gem::Version
257
- version: '10.0'
257
+ version: 12.3.3
258
258
  type: :development
259
259
  prerelease: false
260
260
  version_requirements: !ruby/object:Gem::Requirement
261
261
  requirements:
262
- - - "~>"
262
+ - - ">="
263
263
  - !ruby/object:Gem::Version
264
- version: '10.0'
264
+ version: 12.3.3
265
265
  - !ruby/object:Gem::Dependency
266
266
  name: rspec
267
267
  requirement: !ruby/object:Gem::Requirement
@@ -290,7 +290,21 @@ dependencies:
290
290
  - - ">="
291
291
  - !ruby/object:Gem::Version
292
292
  version: '0'
293
- description: "[WIP]The implementation of Bitcoin Protocol for Ruby."
293
+ - !ruby/object:Gem::Dependency
294
+ name: webmock
295
+ requirement: !ruby/object:Gem::Requirement
296
+ requirements:
297
+ - - ">="
298
+ - !ruby/object:Gem::Version
299
+ version: 3.11.1
300
+ type: :development
301
+ prerelease: false
302
+ version_requirements: !ruby/object:Gem::Requirement
303
+ requirements:
304
+ - - ">="
305
+ - !ruby/object:Gem::Version
306
+ version: 3.11.1
307
+ description: The implementation of Bitcoin Protocol for Ruby.
294
308
  email:
295
309
  - azuchi@chaintope.com
296
310
  executables:
@@ -317,6 +331,7 @@ files:
317
331
  - exe/bitcoinrbd
318
332
  - lib/bitcoin.rb
319
333
  - lib/bitcoin/base58.rb
334
+ - lib/bitcoin/bip85_entropy.rb
320
335
  - lib/bitcoin/bit_stream.rb
321
336
  - lib/bitcoin/block.rb
322
337
  - lib/bitcoin/block_filter.rb
@@ -325,9 +340,14 @@ files:
325
340
  - lib/bitcoin/chain_params.rb
326
341
  - lib/bitcoin/chainparams/mainnet.yml
327
342
  - lib/bitcoin/chainparams/regtest.yml
343
+ - lib/bitcoin/chainparams/signet.yml
328
344
  - lib/bitcoin/chainparams/testnet.yml
329
345
  - lib/bitcoin/constants.rb
330
346
  - lib/bitcoin/descriptor.rb
347
+ - lib/bitcoin/errors.rb
348
+ - lib/bitcoin/ext.rb
349
+ - lib/bitcoin/ext/ecdsa.rb
350
+ - lib/bitcoin/ext/json_parser.rb
331
351
  - lib/bitcoin/ext_key.rb
332
352
  - lib/bitcoin/gcs_filter.rb
333
353
  - lib/bitcoin/key.rb
@@ -336,11 +356,16 @@ files:
336
356
  - lib/bitcoin/merkle_tree.rb
337
357
  - lib/bitcoin/message.rb
338
358
  - lib/bitcoin/message/addr.rb
359
+ - lib/bitcoin/message/addr_v2.rb
339
360
  - lib/bitcoin/message/base.rb
340
361
  - lib/bitcoin/message/block.rb
341
362
  - lib/bitcoin/message/block_transaction_request.rb
342
363
  - lib/bitcoin/message/block_transactions.rb
343
364
  - lib/bitcoin/message/block_txn.rb
365
+ - lib/bitcoin/message/cf_parser.rb
366
+ - lib/bitcoin/message/cfcheckpt.rb
367
+ - lib/bitcoin/message/cfheaders.rb
368
+ - lib/bitcoin/message/cfilter.rb
344
369
  - lib/bitcoin/message/cmpct_block.rb
345
370
  - lib/bitcoin/message/error.rb
346
371
  - lib/bitcoin/message/fee_filter.rb
@@ -350,6 +375,9 @@ files:
350
375
  - lib/bitcoin/message/get_addr.rb
351
376
  - lib/bitcoin/message/get_block_txn.rb
352
377
  - lib/bitcoin/message/get_blocks.rb
378
+ - lib/bitcoin/message/get_cfcheckpt.rb
379
+ - lib/bitcoin/message/get_cfheaders.rb
380
+ - lib/bitcoin/message/get_cfilters.rb
353
381
  - lib/bitcoin/message/get_data.rb
354
382
  - lib/bitcoin/message/get_headers.rb
355
383
  - lib/bitcoin/message/header_and_short_ids.rb
@@ -366,6 +394,7 @@ files:
366
394
  - lib/bitcoin/message/pong.rb
367
395
  - lib/bitcoin/message/prefilled_tx.rb
368
396
  - lib/bitcoin/message/reject.rb
397
+ - lib/bitcoin/message/send_addr_v2.rb
369
398
  - lib/bitcoin/message/send_cmpct.rb
370
399
  - lib/bitcoin/message/send_headers.rb
371
400
  - lib/bitcoin/message/tx.rb
@@ -391,6 +420,7 @@ files:
391
420
  - lib/bitcoin/node/spv.rb
392
421
  - lib/bitcoin/opcodes.rb
393
422
  - lib/bitcoin/out_point.rb
423
+ - lib/bitcoin/payment_code.rb
394
424
  - lib/bitcoin/payments.rb
395
425
  - lib/bitcoin/payments/output.pb.rb
396
426
  - lib/bitcoin/payments/payment.pb.rb
@@ -416,7 +446,9 @@ files:
416
446
  - lib/bitcoin/script_witness.rb
417
447
  - lib/bitcoin/secp256k1.rb
418
448
  - lib/bitcoin/secp256k1/native.rb
449
+ - lib/bitcoin/secp256k1/rfc6979.rb
419
450
  - lib/bitcoin/secp256k1/ruby.rb
451
+ - lib/bitcoin/sighash_generator.rb
420
452
  - lib/bitcoin/slip39.rb
421
453
  - lib/bitcoin/slip39/share.rb
422
454
  - lib/bitcoin/slip39/sss.rb
@@ -426,6 +458,7 @@ files:
426
458
  - lib/bitcoin/store/db.rb
427
459
  - lib/bitcoin/store/db/level_db.rb
428
460
  - lib/bitcoin/store/spv_chain.rb
461
+ - lib/bitcoin/store/utxo_db.rb
429
462
  - lib/bitcoin/tx.rb
430
463
  - lib/bitcoin/tx_in.rb
431
464
  - lib/bitcoin/tx_out.rb
@@ -437,6 +470,7 @@ files:
437
470
  - lib/bitcoin/wallet/base.rb
438
471
  - lib/bitcoin/wallet/db.rb
439
472
  - lib/bitcoin/wallet/master_key.rb
473
+ - lib/bitcoin/wallet/utxo.rb
440
474
  - lib/openassets.rb
441
475
  - lib/openassets/marker_output.rb
442
476
  - lib/openassets/payload.rb
@@ -460,8 +494,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
460
494
  - !ruby/object:Gem::Version
461
495
  version: '0'
462
496
  requirements: []
463
- rubygems_version: 3.0.3
497
+ rubygems_version: 3.2.3
464
498
  signing_key:
465
499
  specification_version: 4
466
- summary: "[WIP]The implementation of Bitcoin Protocol for Ruby."
500
+ summary: The implementation of Bitcoin Protocol for Ruby.
467
501
  test_files: []