tapyrus 0.2.7 → 0.2.12
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +37 -0
- data/.prettierignore +3 -0
- data/.prettierrc.yaml +3 -0
- data/.ruby-version +1 -1
- data/CODE_OF_CONDUCT.md +7 -7
- data/README.md +14 -17
- data/Rakefile +3 -3
- data/lib/openassets/marker_output.rb +0 -4
- data/lib/openassets/payload.rb +4 -10
- data/lib/openassets.rb +0 -2
- data/lib/schnorr/sign_to_contract.rb +51 -0
- data/lib/schnorr/signature.rb +3 -6
- data/lib/schnorr.rb +14 -9
- data/lib/tapyrus/base58.rb +7 -6
- data/lib/tapyrus/bip175.rb +78 -0
- data/lib/tapyrus/block.rb +1 -2
- data/lib/tapyrus/block_header.rb +15 -9
- data/lib/tapyrus/bloom_filter.rb +5 -3
- data/lib/tapyrus/chain_params.rb +1 -4
- data/lib/tapyrus/chainparams/dev.yml +3 -2
- data/lib/tapyrus/chainparams/prod.yml +3 -2
- data/lib/tapyrus/constants.rb +29 -23
- data/lib/tapyrus/errors.rb +1 -3
- data/lib/tapyrus/ext/ecdsa.rb +4 -4
- data/lib/tapyrus/ext/json_parser.rb +1 -4
- data/lib/tapyrus/ext.rb +1 -1
- data/lib/tapyrus/ext_key.rb +44 -32
- data/lib/tapyrus/key.rb +31 -35
- data/lib/tapyrus/key_path.rb +15 -12
- data/lib/tapyrus/logger.rb +20 -16
- data/lib/tapyrus/merkle_tree.rb +22 -20
- data/lib/tapyrus/message/addr.rb +1 -7
- data/lib/tapyrus/message/base.rb +0 -3
- data/lib/tapyrus/message/block.rb +2 -9
- data/lib/tapyrus/message/block_transaction_request.rb +3 -6
- data/lib/tapyrus/message/block_transactions.rb +2 -6
- data/lib/tapyrus/message/block_txn.rb +0 -4
- data/lib/tapyrus/message/cmpct_block.rb +1 -7
- data/lib/tapyrus/message/error.rb +1 -4
- data/lib/tapyrus/message/fee_filter.rb +1 -4
- data/lib/tapyrus/message/filter_add.rb +0 -4
- data/lib/tapyrus/message/filter_clear.rb +0 -4
- data/lib/tapyrus/message/filter_load.rb +2 -5
- data/lib/tapyrus/message/get_addr.rb +0 -4
- data/lib/tapyrus/message/get_block_txn.rb +0 -4
- data/lib/tapyrus/message/get_blocks.rb +0 -3
- data/lib/tapyrus/message/get_data.rb +1 -4
- data/lib/tapyrus/message/get_headers.rb +1 -3
- data/lib/tapyrus/message/header_and_short_ids.rb +3 -9
- data/lib/tapyrus/message/headers.rb +0 -4
- data/lib/tapyrus/message/headers_parser.rb +3 -8
- data/lib/tapyrus/message/inv.rb +1 -4
- data/lib/tapyrus/message/inventories_parser.rb +2 -7
- data/lib/tapyrus/message/inventory.rb +12 -5
- data/lib/tapyrus/message/mem_pool.rb +0 -4
- data/lib/tapyrus/message/merkle_block.rb +4 -9
- data/lib/tapyrus/message/network_addr.rb +7 -6
- data/lib/tapyrus/message/not_found.rb +0 -3
- data/lib/tapyrus/message/ping.rb +0 -3
- data/lib/tapyrus/message/pong.rb +0 -3
- data/lib/tapyrus/message/prefilled_tx.rb +0 -4
- data/lib/tapyrus/message/reject.rb +0 -3
- data/lib/tapyrus/message/send_cmpct.rb +1 -3
- data/lib/tapyrus/message/send_headers.rb +0 -3
- data/lib/tapyrus/message/tx.rb +0 -4
- data/lib/tapyrus/message/ver_ack.rb +1 -5
- data/lib/tapyrus/message/version.rb +2 -5
- data/lib/tapyrus/message.rb +14 -16
- data/lib/tapyrus/mnemonic.rb +17 -15
- data/lib/tapyrus/network/connection.rb +0 -3
- data/lib/tapyrus/network/message_handler.rb +61 -60
- data/lib/tapyrus/network/peer.rb +13 -12
- data/lib/tapyrus/network/peer_discovery.rb +10 -9
- data/lib/tapyrus/network/pool.rb +12 -12
- data/lib/tapyrus/network.rb +0 -2
- data/lib/tapyrus/node/cli.rb +12 -14
- data/lib/tapyrus/node/configuration.rb +1 -3
- data/lib/tapyrus/node/spv.rb +2 -3
- data/lib/tapyrus/node.rb +1 -1
- data/lib/tapyrus/opcodes.rb +9 -7
- data/lib/tapyrus/out_point.rb +5 -5
- data/lib/tapyrus/rpc/http_server.rb +21 -22
- data/lib/tapyrus/rpc/request_handler.rb +16 -21
- data/lib/tapyrus/rpc/tapyrus_core_client.rb +67 -25
- data/lib/tapyrus/rpc.rb +1 -0
- data/lib/tapyrus/script/color.rb +10 -0
- data/lib/tapyrus/script/multisig.rb +13 -12
- data/lib/tapyrus/script/script.rb +93 -88
- data/lib/tapyrus/script/script_error.rb +1 -4
- data/lib/tapyrus/script/script_interpreter.rb +439 -399
- data/lib/tapyrus/script/tx_checker.rb +20 -10
- data/lib/tapyrus/secp256k1/native.rb +14 -15
- data/lib/tapyrus/secp256k1/rfc6979.rb +7 -4
- data/lib/tapyrus/secp256k1/ruby.rb +10 -12
- data/lib/tapyrus/secp256k1.rb +0 -4
- data/lib/tapyrus/slip39/share.rb +41 -29
- data/lib/tapyrus/slip39/sss.rb +92 -49
- data/lib/tapyrus/slip39.rb +20 -5
- data/lib/tapyrus/store/chain_entry.rb +0 -4
- data/lib/tapyrus/store/db/level_db.rb +5 -9
- data/lib/tapyrus/store/db.rb +0 -2
- data/lib/tapyrus/store/spv_chain.rb +11 -17
- data/lib/tapyrus/store.rb +1 -3
- data/lib/tapyrus/tx.rb +45 -37
- data/lib/tapyrus/tx_builder.rb +160 -0
- data/lib/tapyrus/tx_in.rb +1 -6
- data/lib/tapyrus/tx_out.rb +2 -7
- data/lib/tapyrus/util.rb +7 -9
- data/lib/tapyrus/validation.rb +12 -11
- data/lib/tapyrus/version.rb +1 -1
- data/lib/tapyrus/wallet/account.rb +22 -18
- data/lib/tapyrus/wallet/base.rb +12 -9
- data/lib/tapyrus/wallet/db.rb +6 -9
- data/lib/tapyrus/wallet/master_key.rb +2 -4
- data/lib/tapyrus.rb +7 -22
- data/tapyrusrb.gemspec +13 -14
- metadata +26 -7
- data/.travis.yml +0 -14
data/lib/tapyrus/rpc.rb
CHANGED
data/lib/tapyrus/script/color.rb
CHANGED
@@ -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(
|
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(
|
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 =
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
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
|
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
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
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 =
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
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
|
-
|
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
|
-
|
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
|
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
|
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 =
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
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
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
v
|
363
|
-
|
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.
|
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
|
-
|
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 =
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
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
|
-
(
|
469
|
-
|
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
|
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
|
-
|
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
|