diff --git a/lib/bcoin/input.js b/lib/bcoin/input.js index 12fac103..f5517f7c 100644 --- a/lib/bcoin/input.js +++ b/lib/bcoin/input.js @@ -64,14 +64,52 @@ Input.prototype.__defineGetter__('data', function() { return data; }); -Input.prototype.__defineGetter__('addr', function() { - return this.data.addr; -}); - Input.prototype.__defineGetter__('type', function() { return this.data.type; }); +Input.prototype.__defineGetter__('sig', function() { + return this.data.sigs[0]; +}); + +Input.prototype.__defineGetter__('pub', function() { + return this.data.pubs[0]; +}); + +Input.prototype.__defineGetter__('hash', function() { + return this.data.hashes[0]; +}); + +Input.prototype.__defineGetter__('addr', function() { + return this.data.scriptaddr + || this.data.addrs[0] + || this._id(this.type); +}); + +Input.prototype.__defineGetter__('sigs', function() { + return this.data.sigs; +}); + +Input.prototype.__defineGetter__('pubs', function() { + return this.data.pubs; +}); + +Input.prototype.__defineGetter__('hashes', function() { + return this.data.hashes; +}); + +Input.prototype.__defineGetter__('addrs', function() { + return this.data.addrs; +}); + +Input.prototype.__defineGetter__('m', function() { + return this.data.m || 1; +}); + +Input.prototype.__defineGetter__('n', function() { + return this.data.n || this.data.m || 1; +}); + Input.prototype.__defineGetter__('lock', function() { if (!this.output) return 0; @@ -120,22 +158,23 @@ Input.getData = function getData(input) { schema = { type: null, side: 'input', - coinbase: null, - height: -1, - sig: null, - pub: null, - hash: null, - addr: null, - multisig: null, + sigs: [], + pubs: [], + hashes: [], + addrs: [], redeem: null, + scripthash: null, + scriptaddr: null, + m: 0, + n: 0, + height: -1, flags: null, text: null, - value: new bn(0), lock: 0, + value: new bn(0), script: s, seq: input.seq, tx: null, - txid: null, index: null, _script: null, none: false @@ -144,35 +183,25 @@ Input.getData = function getData(input) { if (bcoin.script.lockTime(sub)) sub = sub.slice(3); - if (!input.out) { - return utils.merge(schema, { - type: 'unknown', - addr: input._id('unknown'), - none: true - }); - } - - if (+input.out.hash === 0) { + if (input.out && +input.out.hash === 0) { data = bcoin.script.coinbase(input.script); return utils.merge(schema, { type: 'coinbase', - coinbase: data, - height: data.height || -1, - addr: input._id('coinbase'), + height: data.height != null ? data.height : -1, flags: data.flags, text: data.text.join('').replace(/[\r\n\t\v]/g, ''), none: true }); } - if (input.out.tx) { + if (input.out && input.out.tx) { output = input.out.tx.outputs[input.out.index]; data = bcoin.output.getData(output); if (data.type === 'pubkey' ) { - data.sig = sub[0]; + data.sigs = [sub[0]]; } else if (data.type === 'pubkeyhash') { - data.sig = sub[0]; - data.pub = sub[1]; + data.sigs = [sub[0]]; + data.pubs = [sub[1]]; } else if (data.type === 'scripthash') { // We work backwards here: scripthash is one of the few cases // where we get more data from the input than the output. @@ -186,13 +215,11 @@ Input.getData = function getData(input) { val.script = data.script; data = val; } else if (data.type === 'multisig') { - data.multisig.sigs = sub.slice(1); - data.sig = sub[1]; + data.sigs = sub.slice(1); } return utils.merge(data, { seq: input.seq, - // tx: input.out.tx, - txid: input.out.hash, + tx: input.out.hash, index: input.out.index, _script: s }); @@ -201,8 +228,7 @@ Input.getData = function getData(input) { if (bcoin.script.isPubkeyInput(s)) { return utils.merge(schema, { type: 'pubkey', - sig: sub[0], - addr: input._id('unknown'), + sigs: [sub[0]], none: true }); } @@ -213,31 +239,30 @@ Input.getData = function getData(input) { addr = bcoin.wallet.hash2addr(hash); return utils.merge(schema, { type: 'pubkeyhash', - sig: sub[0], - pub: pub, - hash: hash, - addr: addr + sigs: [sub[0]], + pubs: [pub], + hashes: [hash], + addrs: [addr] }); } if (bcoin.script.isScripthashInput(s)) { sig = sub.slice(1, -1); - pub = sub[sub.length - 1]; - hash = utils.ripesha(pub); + redeem = sub[sub.length - 1]; + hash = utils.ripesha(redeem); addr = bcoin.wallet.hash2addr(hash, 'scripthash'); - redeem = bcoin.script.decode(pub); + redeem = bcoin.script.decode(redeem); data = bcoin.output.getData({ script: redeem, value: new bn(0) }); - data.multisig.sig = sig; return utils.merge(data, { type: 'scripthash', side: 'input', - sig: sig[0], - hash: hash, - addr: addr, + sigs: sig, redeem: redeem, + scripthash: hash, + scriptaddr: addr, script: s, seq: input.seq }); @@ -247,23 +272,14 @@ Input.getData = function getData(input) { sig = sub.slice(1); return utils.merge(schema, { type: 'multisig', - sig: sub[0], - addr: input._id('unknown'), - multisig: { - m: sig.length, - n: null, - sigs: sig, - pubs: null, - hashes: null, - addrs: null - }, + sigs: sig, + m: sig.length, none: true }); } return utils.merge(schema, { type: 'unknown', - addr: input._id('unknown'), none: true }); }; @@ -280,10 +296,12 @@ Input.prototype.inspect = function inspect() { return { type: this.type, addr: this.addr, + sigs: this.sigs.map(utils.toHex), + pubs: this.pubs.map(utils.toHex), text: this.text, lock: this.lock, - script: bcoin.script.format(this.script)[0], value: utils.btc(output.value), + script: bcoin.script.format(this.script)[0], seq: this.seq, output: output }; diff --git a/lib/bcoin/output.js b/lib/bcoin/output.js index e5487048..7c04f2a7 100644 --- a/lib/bcoin/output.js +++ b/lib/bcoin/output.js @@ -48,14 +48,52 @@ Output.prototype.__defineGetter__('data', function() { return data; }); -Output.prototype.__defineGetter__('addr', function() { - return this.data.addr; -}); - Output.prototype.__defineGetter__('type', function() { return this.data.type; }); +Output.prototype.__defineGetter__('sig', function() { + return this.data.sigs[0]; +}); + +Output.prototype.__defineGetter__('pub', function() { + return this.data.pubs[0]; +}); + +Output.prototype.__defineGetter__('hash', function() { + return this.data.hashes[0]; +}); + +Output.prototype.__defineGetter__('addr', function() { + return this.data.scriptaddr + || this.data.addrs[0] + || this._id(this.type); +}); + +Output.prototype.__defineGetter__('sigs', function() { + return this.data.sigs; +}); + +Output.prototype.__defineGetter__('pubs', function() { + return this.data.pubs; +}); + +Output.prototype.__defineGetter__('hashes', function() { + return this.data.hashes; +}); + +Output.prototype.__defineGetter__('addrs', function() { + return this.data.addrs; +}); + +Output.prototype.__defineGetter__('m', function() { + return this.data.m || 1; +}); + +Output.prototype.__defineGetter__('n', function() { + return this.data.n || this.data.m || 1; +}); + Output.prototype.__defineGetter__('lock', function() { var lock = bcoin.script.lockTime(this.script); if (!lock) @@ -88,22 +126,23 @@ Output.getData = function getData(output) { schema = { type: null, side: 'output', - coinbase: null, - height: -1, - sig: null, - pub: null, - hash: null, - addr: null, - multisig: null, + sigs: [], + pubs: [], + hashes: [], + addrs: [], redeem: null, + scripthash: null, + scriptaddr: null, + m: 0, + n: 0, + height: -1, flags: null, text: null, - value: new bn(0), lock: lock ? lock.toNumber() : 0, + value: new bn(0), script: s, seq: null, tx: null, - txid: null, index: null, _script: null, none: false @@ -118,9 +157,9 @@ Output.getData = function getData(output) { addr = bcoin.wallet.hash2addr(hash); return utils.merge(schema, { type: 'pubkey', - pub: pub, - hash: hash, - addr: addr, + pubs: [pub], + hashes: [hash], + addrs: [addr], value: output.value }); } @@ -131,34 +170,27 @@ Output.getData = function getData(output) { return utils.merge(schema, { type: 'pubkeyhash', side: 'output', - hash: hash, - addr: addr, + hashes: [hash], + addrs: [addr], value: output.value }); } pubs = bcoin.script.isMultisig(s); if (pubs) { - hash = utils.ripesha(pubs[0]); - addr = bcoin.wallet.hash2addr(hash); + hash = pubs.map(function(key) { + return utils.ripesha(key); + }); + addr = hash.map(function(hash) { + return bcoin.wallet.hash2addr(hash); + }); return utils.merge(schema, { type: 'multisig', - pub: pubs[0], - hash: hash, - addr: addr, - multisig: { - m: new bn(sub[0]).toNumber(), - n: new bn(sub[sub.length - 2]).toNumber(), - sigs: null, - pubs: pubs, - hashes: pubs.map(function(key) { - return utils.ripesha(key); - }), - addrs: pubs.map(function(key) { - var hash = utils.ripesha(key); - return bcoin.wallet.hash2addr(hash); - }) - }, + pubs: pubs, + hashes: hash, + addrs: addr, + m: new bn(sub[0]).toNumber(), + n: new bn(sub[sub.length - 2]).toNumber(), value: output.value }); } @@ -169,16 +201,8 @@ Output.getData = function getData(output) { return utils.merge(schema, { type: 'scripthash', side: 'output', - hash: hash, - addr: addr, - multisig: { - m: null, - n: null, - sigs: null, - pubs: null, - hashes: null, - addrs: null - }, + scripthash: hash, + scriptaddr: addr, value: output.value }); } @@ -187,7 +211,6 @@ Output.getData = function getData(output) { ret = bcoin.script.colored(s); return utils.merge(schema, { type: 'colored', - addr: output._id('colored'), flags: ret, text: utils.array2utf8(ret), value: output.value, @@ -197,37 +220,26 @@ Output.getData = function getData(output) { return utils.merge(schema, { type: 'unknown', - addr: output._id('unknown'), none: true }); }; Output.prototype.inspect = function inspect() { - var multisig = this.data.multisig || null; - var redeem = this.type === 'scripthash' - ? bcoin.script.format(this.data.redeem)[0] - : null; - - if (multisig) { - multisig = { - m: multisig.m, - n: multisig.n, - sigs: (multisig.sigs || []).map(utils.toHex), - pubs: (multisig.pubs || []).map(utils.toHex), - hashes: multisig.hashes || [], - addrs: multisig.addrs || [] - }; - } - return { type: this.type, addr: this.addr, + pubs: this.pubs.map(utils.toHex), + hashes: this.hashes.map(utils.toHex), + addrs: this.addrs, + redeem: this.type === 'scripthash' + ? bcoin.script.format(this.data.redeem)[0] + : null, + m: this.m, + n: this.n, text: this.text, lock: this.lock, - script: bcoin.script.format(this.script)[0], value: utils.btc(this.value), - multisig: multisig, - redeem: redeem + script: bcoin.script.format(this.script)[0] }; };