diff --git a/packages/bitcore-lib/lib/script/script.js b/packages/bitcore-lib/lib/script/script.js index 07f5ea8ffa2..fe6a213e9ad 100644 --- a/packages/bitcore-lib/lib/script/script.js +++ b/packages/bitcore-lib/lib/script/script.js @@ -157,12 +157,21 @@ Script.fromASM = function(str) { var opcode = Opcode(token); var opcodenum = opcode.toNumber(); - if (opcodenum == null) { + if (_.isUndefined(opcodenum)) { var buf = Buffer.from(tokens[i], 'hex'); + if (buf.length < 0x4c){ + opcodenum=buf.length + }else if (buf.length <= 0x100) { + opcodenum=Opcode.OP_PUSHDATA1 + }else if(buf.length <= 0x10000){ + opcodenum=Opcode.OP_PUSHDATA2 + }else if(buf.length <= 0x100000000){ + opcodenum=Opcode.OP_PUSHDATA4 + } script.chunks.push({ buf: buf, len: buf.length, - opcodenum: buf.length + opcodenum: opcodenum }); i = i + 1; } else if (opcodenum === Opcode.OP_PUSHDATA1 || @@ -953,6 +962,7 @@ Script.buildWitnessV1Out = function(to, scriptTree) { } } + function buildTree(tree) { if (Array.isArray(tree)) { const [left, leftH] = buildTree(tree[0]); diff --git a/packages/bitcore-lib/test/script/script.js b/packages/bitcore-lib/test/script/script.js index 6bb3e622c65..b4371016712 100644 --- a/packages/bitcore-lib/test/script/script.js +++ b/packages/bitcore-lib/test/script/script.js @@ -203,6 +203,31 @@ describe('Script', function() { script.chunks[3].opcodenum.should.equal(Opcode.OP_EQUALVERIFY); script.chunks[4].opcodenum.should.equal(Opcode.OP_CHECKSIG); }); + + it('should parse OP_PUSHDATA in ASM', function() { + const data0 = '01'.repeat(0x4b) + const data1 = '01'.repeat(0x4c) + const data2 = '01'.repeat(0x100) + const data3 = '01'.repeat(0x100+1) + const data4 = '01'.repeat(0x10000) + const data5 = '01'.repeat(0x10000+1) + const data6 = '01'.repeat(1) + var asm = `${data0} ${data1} ${data2} ${data3} ${data4} ${data5} ${data6}`; + var script = Script.fromASM(asm); + script.chunks[0].opcodenum.should.equal(0x4b); + script.chunks[1].opcodenum.should.equal(Opcode.OP_PUSHDATA1); + script.chunks[1].len.should.equal(0x4c); + script.chunks[2].opcodenum.should.equal(Opcode.OP_PUSHDATA1); + script.chunks[2].len.should.equal(0x100); + script.chunks[3].opcodenum.should.equal(Opcode.OP_PUSHDATA2); + script.chunks[3].len.should.equal(0x100+1); + script.chunks[4].opcodenum.should.equal(Opcode.OP_PUSHDATA2); + script.chunks[4].len.should.equal(0x10000); + script.chunks[5].opcodenum.should.equal(Opcode.OP_PUSHDATA4); + script.chunks[5].len.should.equal(0x10000+1); + script.chunks[6].opcodenum.should.equal(1); + script.chunks[6].len.should.equal(1); + }); }); describe('#fromString', function() {