add script.isMultisigOut
This commit is contained in:
parent
350816ad40
commit
96e1451d28
@ -170,6 +170,67 @@ Script.prototype.toString = function() {
|
|||||||
return str.substr(0, str.length - 1);
|
return str.substr(0, str.length - 1);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// script classification methods
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns true if this is a pay to pubkey hash output script
|
||||||
|
*/
|
||||||
|
Script.prototype.isPublicKeyHashOut = function() {
|
||||||
|
return this.chunks[0] === Opcode('OP_DUP').toNumber() &&
|
||||||
|
this.chunks[1] === Opcode('OP_HASH160').toNumber() &&
|
||||||
|
this.chunks[2].buf &&
|
||||||
|
this.chunks[3] === Opcode('OP_EQUALVERIFY').toNumber() &&
|
||||||
|
this.chunks[4] === Opcode('OP_CHECKSIG').toNumber();
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns true if this is a pay to public key hash input script
|
||||||
|
*/
|
||||||
|
Script.prototype.isPublicKeyHashIn = function() {
|
||||||
|
return !!(this.chunks.length === 2 &&
|
||||||
|
this.chunks[0].buf &&
|
||||||
|
this.chunks[1].buf);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns true if this is a p2sh output script
|
||||||
|
*/
|
||||||
|
Script.prototype.isScriptHashOut = function() {
|
||||||
|
return this.chunks.length === 3 &&
|
||||||
|
this.chunks[0] === Opcode('OP_HASH160').toNumber() &&
|
||||||
|
this.chunks[1].buf &&
|
||||||
|
this.chunks[1].buf.length === 20 &&
|
||||||
|
this.chunks[2] === Opcode('OP_EQUAL').toNumber();
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns true if this is a p2sh input script
|
||||||
|
* Note that these are frequently indistinguishable from pubkeyhashin
|
||||||
|
*/
|
||||||
|
Script.prototype.isScriptHashIn = function() {
|
||||||
|
return this.chunks.every(function(chunk) {
|
||||||
|
return Buffer.isBuffer(chunk.buf);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns true if this is a mutlsig output script
|
||||||
|
*/
|
||||||
|
Script.prototype.isMultisigOut = function() {
|
||||||
|
return (this.chunks.length > 3 &&
|
||||||
|
Opcode.isSmallIntOp(this.chunks[0]) &&
|
||||||
|
this.chunks.slice(1, this.chunks.length - 2).every(function(obj) {
|
||||||
|
return obj.buf && Buffer.isBuffer(obj.buf);
|
||||||
|
}) &&
|
||||||
|
Opcode.isSmallIntOp(this.chunks[this.chunks.length - 2]) &&
|
||||||
|
this.chunks[this.chunks.length - 1] === Opcode.map.OP_CHECKMULTISIG);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns true if this is an OP_RETURN data script
|
||||||
|
*/
|
||||||
Script.prototype.isOpReturn = function() {
|
Script.prototype.isOpReturn = function() {
|
||||||
return (this.chunks[0] === Opcode('OP_RETURN').toNumber() &&
|
return (this.chunks[0] === Opcode('OP_RETURN').toNumber() &&
|
||||||
(this.chunks.length === 1 ||
|
(this.chunks.length === 1 ||
|
||||||
@ -179,34 +240,8 @@ Script.prototype.isOpReturn = function() {
|
|||||||
this.chunks[1].length === this.chunks.len)));
|
this.chunks[1].length === this.chunks.len)));
|
||||||
};
|
};
|
||||||
|
|
||||||
Script.prototype.isPublicKeyHashOut = function() {
|
|
||||||
return this.chunks[0] === Opcode('OP_DUP').toNumber() &&
|
|
||||||
this.chunks[1] === Opcode('OP_HASH160').toNumber() &&
|
|
||||||
this.chunks[2].buf &&
|
|
||||||
this.chunks[3] === Opcode('OP_EQUALVERIFY').toNumber() &&
|
|
||||||
this.chunks[4] === Opcode('OP_CHECKSIG').toNumber();
|
|
||||||
};
|
|
||||||
|
|
||||||
Script.prototype.isPublicKeyHashIn = function() {
|
// Script construction methods
|
||||||
return !!(this.chunks.length === 2 &&
|
|
||||||
this.chunks[0].buf &&
|
|
||||||
this.chunks[1].buf);
|
|
||||||
};
|
|
||||||
|
|
||||||
Script.prototype.isScriptHashOut = function() {
|
|
||||||
return this.chunks.length === 3 &&
|
|
||||||
this.chunks[0] === Opcode('OP_HASH160').toNumber() &&
|
|
||||||
this.chunks[1].buf &&
|
|
||||||
this.chunks[1].buf.length === 20 &&
|
|
||||||
this.chunks[2] === Opcode('OP_EQUAL').toNumber();
|
|
||||||
};
|
|
||||||
|
|
||||||
//note that these are frequently indistinguishable from pubkeyhashin
|
|
||||||
Script.prototype.isScriptHashIn = function() {
|
|
||||||
return this.chunks.every(function(chunk) {
|
|
||||||
return Buffer.isBuffer(chunk.buf);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a script element at the start of the script.
|
* Adds a script element at the start of the script.
|
||||||
|
|||||||
@ -96,8 +96,11 @@
|
|||||||
"mocha": "~2.0.1",
|
"mocha": "~2.0.1",
|
||||||
"run-sequence": "^1.0.2",
|
"run-sequence": "^1.0.2",
|
||||||
"karma": "^0.12.28",
|
"karma": "^0.12.28",
|
||||||
|
"karma-firefox-launcher": "^0.1.3",
|
||||||
"karma-mocha": "^0.1.9",
|
"karma-mocha": "^0.1.9",
|
||||||
"karma-firefox-launcher": "^0.1.3"
|
"lodash": "^2.4.1",
|
||||||
|
"mocha": "~2.0.1",
|
||||||
|
"run-sequence": "^1.0.2"
|
||||||
},
|
},
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -251,6 +251,28 @@ describe('Script', function() {
|
|||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('#isMultisigOut', function() {
|
||||||
|
it('should classify known multisig out 1 as multisig out', function() {
|
||||||
|
Script('OP_2 21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 OP_2 OP_CHECKMULTISIG').isMultisigOut().should.equal(true);
|
||||||
|
});
|
||||||
|
it('should classify known multisig out 2 as multisig out', function() {
|
||||||
|
Script('OP_1 21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 OP_2 OP_CHECKMULTISIG').isMultisigOut().should.equal(true);
|
||||||
|
});
|
||||||
|
it('should classify known multisig out 3 as multisig out', function() {
|
||||||
|
Script('OP_2 21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 OP_3 OP_CHECKMULTISIG').isMultisigOut().should.equal(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should classify non-multisig out 1 as non-multisig out', function() {
|
||||||
|
Script('OP_2 21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 OP_2 OP_CHECKMULTISIG OP_EQUAL').isMultisigOut().should.equal(false);
|
||||||
|
});
|
||||||
|
it('should classify non-multisig out 2 as non-multisig out', function() {
|
||||||
|
Script('OP_2').isMultisigOut().should.equal(false);
|
||||||
|
});
|
||||||
|
it('should classify non-multisig out 3 as non-multisig out', function() {
|
||||||
|
Script('OP_2 OP_2 21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 OP_2 OP_CHECKMULTISIG OP_EQUAL').isMultisigOut().should.equal(false);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('#add and #prepend', function() {
|
describe('#add and #prepend', function() {
|
||||||
|
|
||||||
it('should add these ops', function() {
|
it('should add these ops', function() {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user