tapyrus 0.2.7 → 0.2.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (119) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +37 -0
  3. data/.prettierignore +3 -0
  4. data/.prettierrc.yaml +3 -0
  5. data/.ruby-version +1 -1
  6. data/CODE_OF_CONDUCT.md +7 -7
  7. data/README.md +14 -17
  8. data/Rakefile +3 -3
  9. data/lib/openassets/marker_output.rb +0 -4
  10. data/lib/openassets/payload.rb +4 -10
  11. data/lib/openassets.rb +0 -2
  12. data/lib/schnorr/sign_to_contract.rb +51 -0
  13. data/lib/schnorr/signature.rb +3 -6
  14. data/lib/schnorr.rb +14 -9
  15. data/lib/tapyrus/base58.rb +7 -6
  16. data/lib/tapyrus/bip175.rb +78 -0
  17. data/lib/tapyrus/block.rb +1 -2
  18. data/lib/tapyrus/block_header.rb +15 -9
  19. data/lib/tapyrus/bloom_filter.rb +5 -3
  20. data/lib/tapyrus/chain_params.rb +1 -4
  21. data/lib/tapyrus/chainparams/dev.yml +3 -2
  22. data/lib/tapyrus/chainparams/prod.yml +3 -2
  23. data/lib/tapyrus/constants.rb +29 -23
  24. data/lib/tapyrus/errors.rb +1 -3
  25. data/lib/tapyrus/ext/ecdsa.rb +4 -4
  26. data/lib/tapyrus/ext/json_parser.rb +1 -4
  27. data/lib/tapyrus/ext.rb +1 -1
  28. data/lib/tapyrus/ext_key.rb +44 -32
  29. data/lib/tapyrus/key.rb +31 -35
  30. data/lib/tapyrus/key_path.rb +15 -12
  31. data/lib/tapyrus/logger.rb +20 -16
  32. data/lib/tapyrus/merkle_tree.rb +22 -20
  33. data/lib/tapyrus/message/addr.rb +1 -7
  34. data/lib/tapyrus/message/base.rb +0 -3
  35. data/lib/tapyrus/message/block.rb +2 -9
  36. data/lib/tapyrus/message/block_transaction_request.rb +3 -6
  37. data/lib/tapyrus/message/block_transactions.rb +2 -6
  38. data/lib/tapyrus/message/block_txn.rb +0 -4
  39. data/lib/tapyrus/message/cmpct_block.rb +1 -7
  40. data/lib/tapyrus/message/error.rb +1 -4
  41. data/lib/tapyrus/message/fee_filter.rb +1 -4
  42. data/lib/tapyrus/message/filter_add.rb +0 -4
  43. data/lib/tapyrus/message/filter_clear.rb +0 -4
  44. data/lib/tapyrus/message/filter_load.rb +2 -5
  45. data/lib/tapyrus/message/get_addr.rb +0 -4
  46. data/lib/tapyrus/message/get_block_txn.rb +0 -4
  47. data/lib/tapyrus/message/get_blocks.rb +0 -3
  48. data/lib/tapyrus/message/get_data.rb +1 -4
  49. data/lib/tapyrus/message/get_headers.rb +1 -3
  50. data/lib/tapyrus/message/header_and_short_ids.rb +3 -9
  51. data/lib/tapyrus/message/headers.rb +0 -4
  52. data/lib/tapyrus/message/headers_parser.rb +3 -8
  53. data/lib/tapyrus/message/inv.rb +1 -4
  54. data/lib/tapyrus/message/inventories_parser.rb +2 -7
  55. data/lib/tapyrus/message/inventory.rb +12 -5
  56. data/lib/tapyrus/message/mem_pool.rb +0 -4
  57. data/lib/tapyrus/message/merkle_block.rb +4 -9
  58. data/lib/tapyrus/message/network_addr.rb +7 -6
  59. data/lib/tapyrus/message/not_found.rb +0 -3
  60. data/lib/tapyrus/message/ping.rb +0 -3
  61. data/lib/tapyrus/message/pong.rb +0 -3
  62. data/lib/tapyrus/message/prefilled_tx.rb +0 -4
  63. data/lib/tapyrus/message/reject.rb +0 -3
  64. data/lib/tapyrus/message/send_cmpct.rb +1 -3
  65. data/lib/tapyrus/message/send_headers.rb +0 -3
  66. data/lib/tapyrus/message/tx.rb +0 -4
  67. data/lib/tapyrus/message/ver_ack.rb +1 -5
  68. data/lib/tapyrus/message/version.rb +2 -5
  69. data/lib/tapyrus/message.rb +14 -16
  70. data/lib/tapyrus/mnemonic.rb +17 -15
  71. data/lib/tapyrus/network/connection.rb +0 -3
  72. data/lib/tapyrus/network/message_handler.rb +61 -60
  73. data/lib/tapyrus/network/peer.rb +13 -12
  74. data/lib/tapyrus/network/peer_discovery.rb +10 -9
  75. data/lib/tapyrus/network/pool.rb +12 -12
  76. data/lib/tapyrus/network.rb +0 -2
  77. data/lib/tapyrus/node/cli.rb +12 -14
  78. data/lib/tapyrus/node/configuration.rb +1 -3
  79. data/lib/tapyrus/node/spv.rb +2 -3
  80. data/lib/tapyrus/node.rb +1 -1
  81. data/lib/tapyrus/opcodes.rb +9 -7
  82. data/lib/tapyrus/out_point.rb +5 -5
  83. data/lib/tapyrus/rpc/http_server.rb +21 -22
  84. data/lib/tapyrus/rpc/request_handler.rb +16 -21
  85. data/lib/tapyrus/rpc/tapyrus_core_client.rb +67 -25
  86. data/lib/tapyrus/rpc.rb +1 -0
  87. data/lib/tapyrus/script/color.rb +10 -0
  88. data/lib/tapyrus/script/multisig.rb +13 -12
  89. data/lib/tapyrus/script/script.rb +93 -88
  90. data/lib/tapyrus/script/script_error.rb +1 -4
  91. data/lib/tapyrus/script/script_interpreter.rb +439 -399
  92. data/lib/tapyrus/script/tx_checker.rb +20 -10
  93. data/lib/tapyrus/secp256k1/native.rb +14 -15
  94. data/lib/tapyrus/secp256k1/rfc6979.rb +7 -4
  95. data/lib/tapyrus/secp256k1/ruby.rb +10 -12
  96. data/lib/tapyrus/secp256k1.rb +0 -4
  97. data/lib/tapyrus/slip39/share.rb +41 -29
  98. data/lib/tapyrus/slip39/sss.rb +92 -49
  99. data/lib/tapyrus/slip39.rb +20 -5
  100. data/lib/tapyrus/store/chain_entry.rb +0 -4
  101. data/lib/tapyrus/store/db/level_db.rb +5 -9
  102. data/lib/tapyrus/store/db.rb +0 -2
  103. data/lib/tapyrus/store/spv_chain.rb +11 -17
  104. data/lib/tapyrus/store.rb +1 -3
  105. data/lib/tapyrus/tx.rb +45 -37
  106. data/lib/tapyrus/tx_builder.rb +160 -0
  107. data/lib/tapyrus/tx_in.rb +1 -6
  108. data/lib/tapyrus/tx_out.rb +2 -7
  109. data/lib/tapyrus/util.rb +7 -9
  110. data/lib/tapyrus/validation.rb +12 -11
  111. data/lib/tapyrus/version.rb +1 -1
  112. data/lib/tapyrus/wallet/account.rb +22 -18
  113. data/lib/tapyrus/wallet/base.rb +12 -9
  114. data/lib/tapyrus/wallet/db.rb +6 -9
  115. data/lib/tapyrus/wallet/master_key.rb +2 -4
  116. data/lib/tapyrus.rb +7 -22
  117. data/tapyrusrb.gemspec +13 -14
  118. metadata +26 -7
  119. data/.travis.yml +0 -14
data/lib/tapyrus/rpc.rb CHANGED
@@ -3,5 +3,6 @@ module Tapyrus
3
3
  autoload :HttpServer, 'tapyrus/rpc/http_server'
4
4
  autoload :RequestHandler, 'tapyrus/rpc/request_handler'
5
5
  autoload :TapyrusCoreClient, 'tapyrus/rpc/tapyrus_core_client'
6
+ autoload :Error, 'tapyrus/rpc/tapyrus_core_client'
6
7
  end
7
8
  end
@@ -24,6 +24,11 @@ module Tapyrus
24
24
  new(TokenTypes::NFT, Tapyrus.sha256(out_point.to_payload))
25
25
  end
26
26
 
27
+ # Return ColorIdentifier for native token(i.e TPC)
28
+ def self.default
29
+ new(TokenTypes::NONE, '0000000000000000000000000000000000000000000000000000000000000000'.htb)
30
+ end
31
+
27
32
  def to_payload
28
33
  [type, payload].pack('Ca*')
29
34
  end
@@ -51,6 +56,11 @@ module Tapyrus
51
56
  to_payload.eql?(other.to_payload)
52
57
  end
53
58
 
59
+ # Return true if the coin is native token(i.e TPC), otherwise false
60
+ def default?
61
+ self == ColorIdentifier.default
62
+ end
63
+
54
64
  private
55
65
 
56
66
  def initialize(type, payload)
@@ -1,11 +1,10 @@
1
1
  module Tapyrus
2
-
3
2
  # utility for multisig
4
3
  module Multisig
5
4
  include Tapyrus::Opcodes
6
5
 
7
6
  def self.prefix
8
- [OP_0].pack("C*")
7
+ [OP_0].pack('C*')
9
8
  end
10
9
 
11
10
  # generate input script sig spending a multisig output script.
@@ -23,7 +22,7 @@ module Tapyrus
23
22
  # multiple parties. Signatures must be in the same order as the
24
23
  # pubkeys in the output script being redeemed.
25
24
  def self.add_sig_to_multisig_script_sig(sig_to_add, script_sig, hash_type = SIGHASH_TYPE[:all])
26
- signature = sig_to_add + [hash_type].pack("C*")
25
+ signature = sig_to_add + [hash_type].pack('C*')
27
26
  offset = script_sig.empty? ? 0 : 1
28
27
  script_sig.insert(offset, Tapyrus::Script.pack_pushdata(signature))
29
28
  end
@@ -49,17 +48,19 @@ module Tapyrus
49
48
  pubkeys = redeem_script.get_multisig_pubkeys
50
49
 
51
50
  # find the pubkey for each signature by trying to verify it
52
- sigs = Hash[script.chunks[1...-1].map.with_index do |sig, idx|
53
- sig = sig.pushed_data
54
- pubkey = pubkeys.map do |key|
55
- Tapyrus::Key.new(pubkey: key.bth).verify(sig, sig_hash) ? key : nil
56
- end.compact.first
57
- raise "Key for signature ##{idx} not found in redeem script!" unless pubkey
58
- [pubkey, sig]
59
- end]
51
+ sigs =
52
+ Hash[
53
+ script.chunks[1...-1].map.with_index do |sig, idx|
54
+ sig = sig.pushed_data
55
+ pubkey =
56
+ pubkeys.map { |key| Tapyrus::Key.new(pubkey: key.bth).verify(sig, sig_hash) ? key : nil }.compact.first
57
+ raise "Key for signature ##{idx} not found in redeem script!" unless pubkey
58
+ [pubkey, sig]
59
+ end
60
+ ]
60
61
 
61
62
  prefix + pubkeys.map { |k| sigs[k] ? Tapyrus::Script.pack_pushdata(sigs[k]) : nil }.join +
62
63
  Tapyrus::Script.pack_pushdata(script.chunks[-1].pushed_data)
63
64
  end
64
65
  end
65
- end
66
+ end
@@ -2,7 +2,6 @@
2
2
  # https://github.com/lian/bitcoin-ruby/blob/master/COPYING
3
3
 
4
4
  module Tapyrus
5
-
6
5
  # tapyrus script
7
6
  class Script
8
7
  include Tapyrus::HexConverter
@@ -82,14 +81,12 @@ module Tapyrus
82
81
  def remove_color
83
82
  raise RuntimeError, 'Only cp2pkh and cp2sh can remove color' unless cp2pkh? or cp2sh?
84
83
 
85
- Tapyrus::Script.new.tap do |s|
86
- s.chunks = self.chunks[2..-1]
87
- end
84
+ Tapyrus::Script.new.tap { |s| s.chunks = self.chunks[2..-1] }
88
85
  end
89
86
 
90
87
  def get_multisig_pubkeys
91
88
  num = Tapyrus::Opcodes.opcode_to_small_int(chunks[-2].bth.to_i(16))
92
- (1..num).map{ |i| chunks[i].pushed_data }
89
+ (1..num).map { |i| chunks[i].pushed_data }
93
90
  end
94
91
 
95
92
  # generate m of n multisig script
@@ -104,14 +101,16 @@ module Tapyrus
104
101
  # generate script from string.
105
102
  def self.from_string(string)
106
103
  script = new
107
- string.split(' ').each do |v|
108
- opcode = Opcodes.name_to_opcode(v)
109
- if opcode
110
- script << (v =~ /^\d/ && Opcodes.small_int_to_opcode(v.ord) ? v.ord : opcode)
111
- else
112
- script << (v =~ /^[0-9]+$/ ? v.to_i : v)
104
+ string
105
+ .split(' ')
106
+ .each do |v|
107
+ opcode = Opcodes.name_to_opcode(v)
108
+ if opcode
109
+ script << (v =~ /^\d/ && Opcodes.small_int_to_opcode(v.ord) ? v.ord : opcode)
110
+ else
111
+ script << (v =~ /^[0-9]+$/ ? v.to_i : v)
112
+ end
113
113
  end
114
- end
115
114
  script
116
115
  end
117
116
 
@@ -150,19 +149,20 @@ module Tapyrus
150
149
  if opcode.pushdata?
151
150
  pushcode = opcode.ord
152
151
  packed_size = nil
153
- len = case pushcode
154
- when OP_PUSHDATA1
155
- packed_size = buf.read(1)
156
- packed_size.unpack('C').first
157
- when OP_PUSHDATA2
158
- packed_size = buf.read(2)
159
- packed_size.unpack('v').first
160
- when OP_PUSHDATA4
161
- packed_size = buf.read(4)
162
- packed_size.unpack('V').first
163
- else
164
- pushcode if pushcode < OP_PUSHDATA1
165
- end
152
+ len =
153
+ case pushcode
154
+ when OP_PUSHDATA1
155
+ packed_size = buf.read(1)
156
+ packed_size.unpack('C').first
157
+ when OP_PUSHDATA2
158
+ packed_size = buf.read(2)
159
+ packed_size.unpack('v').first
160
+ when OP_PUSHDATA4
161
+ packed_size = buf.read(4)
162
+ packed_size.unpack('V').first
163
+ else
164
+ pushcode if pushcode < OP_PUSHDATA1
165
+ end
166
166
  if len
167
167
  s.chunks << [len].pack('C') if buf.eof?
168
168
  unless buf.eof?
@@ -194,7 +194,7 @@ module Tapyrus
194
194
  return [p2sh_addr] if p2sh?
195
195
  return [cp2pkh_addr] if cp2pkh?
196
196
  return [cp2sh_addr] if cp2sh?
197
- return get_multisig_pubkeys.map{|pubkey| Tapyrus::Key.new(pubkey: pubkey.bth).to_p2pkh} if multisig?
197
+ return get_multisig_pubkeys.map { |pubkey| Tapyrus::Key.new(pubkey: pubkey.bth).to_p2pkh } if multisig?
198
198
  []
199
199
  end
200
200
 
@@ -206,8 +206,8 @@ module Tapyrus
206
206
  # whether this script is a P2PKH format script.
207
207
  def p2pkh?
208
208
  return false unless chunks.size == 5
209
- [OP_DUP, OP_HASH160, OP_EQUALVERIFY, OP_CHECKSIG] ==
210
- (chunks[0..1]+ chunks[3..4]).map(&:ord) && chunks[2].bytesize == 21
209
+ [OP_DUP, OP_HASH160, OP_EQUALVERIFY, OP_CHECKSIG] == (chunks[0..1] + chunks[3..4]).map(&:ord) &&
210
+ chunks[2].bytesize == 21
211
211
  end
212
212
 
213
213
  def p2sh?
@@ -228,8 +228,7 @@ module Tapyrus
228
228
  end
229
229
 
230
230
  def standard_op_return?
231
- op_return? && size <= MAX_OP_RETURN_RELAY &&
232
- (chunks.size == 1 || chunks[1].opcode <= OP_16)
231
+ op_return? && size <= MAX_OP_RETURN_RELAY && (chunks.size == 1 || chunks[1].opcode <= OP_16)
233
232
  end
234
233
 
235
234
  # Return whether this script is a CP2PKH format script or not.
@@ -239,8 +238,8 @@ module Tapyrus
239
238
  return false unless chunks[0].bytesize == 34
240
239
  return false unless Tapyrus::Color::ColorIdentifier.parse_from_payload(chunks[0].pushed_data)&.valid?
241
240
  return false unless chunks[1].ord == OP_COLOR
242
- [OP_DUP, OP_HASH160, OP_EQUALVERIFY, OP_CHECKSIG] ==
243
- (chunks[2..3]+ chunks[5..6]).map(&:ord) && chunks[4].bytesize == 21
241
+ [OP_DUP, OP_HASH160, OP_EQUALVERIFY, OP_CHECKSIG] == (chunks[2..3] + chunks[5..6]).map(&:ord) &&
242
+ chunks[4].bytesize == 21
244
243
  end
245
244
 
246
245
  # Return whether this script is a CP2SH format script or not.
@@ -252,7 +251,7 @@ module Tapyrus
252
251
  return false unless chunks[1].ord == OP_COLOR
253
252
  OP_HASH160 == chunks[2].ord && OP_EQUAL == chunks[4].ord && chunks[3].bytesize == 21
254
253
  end
255
-
254
+
256
255
  # Return whether this script represents colored coin.
257
256
  # @return [Boolean] true if this script is colored, otherwise false.
258
257
  def colored?
@@ -275,24 +274,25 @@ module Tapyrus
275
274
 
276
275
  # whether data push only script which dose not include other opcode
277
276
  def push_only?
278
- chunks.each do |c|
279
- return false if !c.opcode.nil? && c.opcode > OP_16
280
- end
277
+ chunks.each { |c| return false if !c.opcode.nil? && c.opcode > OP_16 }
281
278
  true
282
279
  end
283
280
 
284
281
  # get public keys in the stack.
285
282
  # @return[Array[String]] an array of the pubkeys with hex format.
286
283
  def get_pubkeys
287
- chunks.select{|c|c.pushdata? && [33, 65].include?(c.pushed_data.bytesize) && [2, 3, 4, 6, 7].include?(c.pushed_data[0].bth.to_i(16))}.map{|c|c.pushed_data.bth}
284
+ chunks
285
+ .select do |c|
286
+ c.pushdata? && [33, 65].include?(c.pushed_data.bytesize) &&
287
+ [2, 3, 4, 6, 7].include?(c.pushed_data[0].bth.to_i(16))
288
+ end
289
+ .map { |c| c.pushed_data.bth }
288
290
  end
289
291
 
290
292
  # returns the self payload. ScriptInterpreter does not use this.
291
293
  def to_script_code(skip_separator_index = 0)
292
294
  payload = to_payload
293
- if skip_separator_index > 0
294
- payload = subscript_codeseparator(skip_separator_index)
295
- end
295
+ payload = subscript_codeseparator(skip_separator_index) if skip_separator_index > 0
296
296
  Tapyrus.pack_var_string(payload)
297
297
  end
298
298
 
@@ -303,7 +303,7 @@ module Tapyrus
303
303
  elsif obj.is_a?(String)
304
304
  append_data(obj)
305
305
  elsif obj.is_a?(Array)
306
- obj.each { |o| self.<< o}
306
+ obj.each { |o| self.<< o }
307
307
  self
308
308
  end
309
309
  end
@@ -339,41 +339,44 @@ module Tapyrus
339
339
 
340
340
  # Check the item is in the chunk of the script.
341
341
  def include?(item)
342
- chunk_item = if item.is_a?(Integer)
343
- item.chr
344
- elsif item.is_a?(String)
345
- data = Encoding::ASCII_8BIT == item.encoding ? item : item.htb
346
- Tapyrus::Script.pack_pushdata(data)
347
- end
342
+ chunk_item =
343
+ if item.is_a?(Integer)
344
+ item.chr
345
+ elsif item.is_a?(String)
346
+ data = Encoding::ASCII_8BIT == item.encoding ? item : item.htb
347
+ Tapyrus::Script.pack_pushdata(data)
348
+ end
348
349
  return false unless chunk_item
349
350
  chunks.include?(chunk_item)
350
351
  end
351
352
 
352
353
  def to_s
353
- chunks.map { |c|
354
- case c
355
- when Integer
356
- opcode_to_name(c)
357
- when String
358
- return c if c.empty?
359
- if c.pushdata?
360
- v = Opcodes.opcode_to_small_int(c.ord)
361
- if v
362
- v
363
- else
364
- data = c.pushed_data
365
- if data.bytesize <= 4
366
- Script.decode_number(data.bth) # for scriptnum
354
+ chunks
355
+ .map do |c|
356
+ case c
357
+ when Integer
358
+ opcode_to_name(c)
359
+ when String
360
+ return c if c.empty?
361
+ if c.pushdata?
362
+ v = Opcodes.opcode_to_small_int(c.ord)
363
+ if v
364
+ v
367
365
  else
368
- data.bth
366
+ data = c.pushed_data
367
+ if data.bytesize <= 4
368
+ Script.decode_number(data.bth) # for scriptnum
369
+ else
370
+ data.bth
371
+ end
369
372
  end
373
+ else
374
+ opcode = Opcodes.opcode_to_name(c.ord)
375
+ opcode ? opcode : 'OP_UNKNOWN [error]'
370
376
  end
371
- else
372
- opcode = Opcodes.opcode_to_name(c.ord)
373
- opcode ? opcode : 'OP_UNKNOWN [error]'
374
377
  end
375
378
  end
376
- }.join(' ')
379
+ .join(' ')
377
380
  end
378
381
 
379
382
  # generate sha-256 hash for payload
@@ -431,17 +434,18 @@ module Tapyrus
431
434
  # binary +data+ convert pushdata which contains data length and append PUSHDATA opcode if necessary.
432
435
  def self.pack_pushdata(data)
433
436
  size = data.bytesize
434
- header = if size < OP_PUSHDATA1
435
- [size].pack('C')
436
- elsif size < 0xff
437
- [OP_PUSHDATA1, size].pack('CC')
438
- elsif size < 0xffff
439
- [OP_PUSHDATA2, size].pack('Cv')
440
- elsif size < 0xffffffff
441
- [OP_PUSHDATA4, size].pack('CV')
442
- else
443
- raise ArgumentError, 'data size is too big.'
444
- end
437
+ header =
438
+ if size < OP_PUSHDATA1
439
+ [size].pack('C')
440
+ elsif size < 0xff
441
+ [OP_PUSHDATA1, size].pack('CC')
442
+ elsif size < 0xffff
443
+ [OP_PUSHDATA2, size].pack('Cv')
444
+ elsif size < 0xffffffff
445
+ [OP_PUSHDATA4, size].pack('CV')
446
+ else
447
+ raise ArgumentError, 'data size is too big.'
448
+ end
445
449
  header + data
446
450
  end
447
451
 
@@ -465,8 +469,12 @@ module Tapyrus
465
469
  if chunk == sub_chunk
466
470
  buf << chunk
467
471
  i += 1
468
- (i = 0; buf.clear) if i == subscript.chunks.size # matched the whole subscript
469
- else # matched the part of head
472
+ (
473
+ i = 0
474
+ buf.clear
475
+ ) if i == subscript.chunks.size # matched the whole subscript
476
+ else
477
+ # matched the part of head
470
478
  i = 0
471
479
  tmp = chunk.dup
472
480
  tmp.slice!(sub_chunk)
@@ -488,7 +496,7 @@ module Tapyrus
488
496
 
489
497
  # remove all occurences of opcode. Typically it's OP_CODESEPARATOR.
490
498
  def delete_opcode(opcode)
491
- @chunks = chunks.select{|chunk| chunk.ord != opcode}
499
+ @chunks = chunks.select { |chunk| chunk.ord != opcode }
492
500
  self
493
501
  end
494
502
 
@@ -496,12 +504,10 @@ module Tapyrus
496
504
  def subscript_codeseparator(separator_index)
497
505
  buf = []
498
506
  process_separator_index = 0
499
- chunks.each{|chunk|
507
+ chunks.each do |chunk|
500
508
  buf << chunk if process_separator_index == separator_index
501
- if chunk.ord == OP_CODESEPARATOR && process_separator_index < separator_index
502
- process_separator_index += 1
503
- end
504
- }
509
+ process_separator_index += 1 if chunk.ord == OP_CODESEPARATOR && process_separator_index < separator_index
510
+ end
505
511
  buf.join
506
512
  end
507
513
 
@@ -518,10 +524,10 @@ module Tapyrus
518
524
  end
519
525
 
520
526
  def to_h
521
- h = {asm: to_s, hex: to_hex, type: type}
527
+ h = { asm: to_s, hex: to_hex, type: type }
522
528
  addrs = addresses
523
529
  unless addrs.empty?
524
- h[:req_sigs] = multisig? ? Tapyrus::Opcodes.opcode_to_small_int(chunks[0].bth.to_i(16)) :addrs.size
530
+ h[:req_sigs] = multisig? ? Tapyrus::Opcodes.opcode_to_small_int(chunks[0].bth.to_i(16)) : addrs.size
525
531
  h[:addresses] = addrs
526
532
  end
527
533
  h
@@ -568,5 +574,4 @@ module Tapyrus
568
574
  Tapyrus.encode_base58_address(color_id + hash160, Tapyrus.chain_params.cp2sh_version)
569
575
  end
570
576
  end
571
-
572
577
  end
@@ -1,8 +1,6 @@
1
1
  module Tapyrus
2
-
3
2
  # tapyrus script error
4
3
  class ScriptError < Exception
5
-
6
4
  attr_accessor :code
7
5
  attr_accessor :extra_msg
8
6
 
@@ -100,6 +98,5 @@ module Tapyrus
100
98
  def self.name_to_code(name)
101
99
  NAME_MAP[name]
102
100
  end
103
-
104
101
  end
105
- end
102
+ end