From a3fc9159a0abf440160bd0e2521a306ea73c1e36 Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Fri, 12 Feb 2016 16:01:15 -0800 Subject: [PATCH] add more extractor functions. --- lib/bcoin/script.js | 98 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 96 insertions(+), 2 deletions(-) diff --git a/lib/bcoin/script.js b/lib/bcoin/script.js index 12a5f9cb..e33e4bf1 100644 --- a/lib/bcoin/script.js +++ b/lib/bcoin/script.js @@ -1201,10 +1201,22 @@ script.createNulldata = function createNulldata(flags) { }; script.getRedeem = function getRedeem(s) { - if (!Array.isArray(s[s.length - 1])) + var raw, redeem; + + raw = s[s.length - 1]; + + if (!Array.isArray(raw)) return; - return script.decode(s[s.length - 1]); + if (raw._redeem) + return raw._redeem; + + redeem = script.decode(raw); + + utils.hidden(redeem, '_raw', raw); + utils.hidden(raw, '_redeem', redeem); + + return redeem; }; script.getType = @@ -1521,6 +1533,71 @@ script.getUnknownData = function getUnknownData(s) { }; }; +script.getInputKeys = function getInputKeys(s, prev) { + if (script.isScripthashInput(s)) + return script.getOutputKeys(script.getRedeem(s)); + + if (prev) + return script.getOutputKeys(prev); + + if (script.isPubkeyhashInput(s)) + return [s[1]]; + + return []; +}; + +script.getOutputKeys = function getOutputKeys(s) { + if (script.isPubkey(s)) + return [s[0]]; + + if (script.isMultisig(s)) + return s.slice(1, -2); + + return []; +}; + +script.getInputKeyHashes = function getInputKeyHashes(s, prev) { + if (script.isScripthashInput(s)) + return script.getOutputKeyHashes(script.getRedeem(s)); + + if (prev) + return script.getOuputKeyHashes(prev); + + if (script.isPubkeyhashInput(s)) + return [bcoin.address.hash160(s[1])]; + + return []; +}; + +script.getOuputKeyHashes = function getOuputKeyHashes(s) { + if (script.isPubkey(s)) + return [bcoin.address.hash160(s[0])]; + + if (script.isPubkeyhash(s)) + return [s[2]]; + + if (script.isMultisig(s)) { + return s.slice(1, -2).map(function(key) { + return bcoin.address.hash160(key); + }); + } + + return []; +}; + +script.getInputScripthash = function getInputScripthash(s, prev) { + if (prev) + return script.getOutputScripthash(prev); + + if (script.isScripthashInput(s)) + return bcoin.address.hash160(s[s.length - 1]); +}; + +script.getOutputScripthash = function getOutputScripthash(s) { + if (script.isScripthash(s)) + return s[1]; +}; + script.getInputAddress = function getInputAddress(s, prev) { if (prev) return script.getOutputAddress(prev); @@ -1556,6 +1633,23 @@ script.getOutputAddress = function getOutputAddress(s) { return bcoin.address.toAddress(s[1], 'scripthash'); }; +script.getInputMN = function getInputMN(s, prev) { + if (script.isScripthashInput(s)) + return script.getOutputMN(script.getRedeem(s)); + + if (prev) + return script.getOuputMN(prev); + + return { m: 1, n: 1 }; +}; + +script.getOuputMN = function getOuputMN(s) { + if (script.isMultisig(s)) + return { m: s[0], n: s[s.length - 2] }; + + return { m: 1, n: 1 }; +}; + script.isPubkey = function isPubkey(s, key) { var res;