diff --git a/lib/transaction/input/multisigscripthash.js b/lib/transaction/input/multisigscripthash.js index 1a36a14..d56e1ad 100644 --- a/lib/transaction/input/multisigscripthash.js +++ b/lib/transaction/input/multisigscripthash.js @@ -9,12 +9,13 @@ var $ = require('../../util/preconditions'); var Script = require('../../script'); var Signature = require('../../crypto/signature'); var Sighash = require('../sighash'); +var PublicKey = require('../../publickey'); var BufferUtil = require('../../util/buffer'); /** * @constructor */ -function MultiSigScriptHashInput(input, pubkeys, threshold) { +function MultiSigScriptHashInput(input, pubkeys, threshold, signatures) { Input.apply(this, arguments); var self = this; this.publicKeys = _.sortBy(pubkeys, function(publicKey) { return publicKey.toString('hex'); }); @@ -27,10 +28,50 @@ function MultiSigScriptHashInput(input, pubkeys, threshold) { }); this.threshold = threshold; // Empty array of signatures - this.signatures = new Array(this.publicKeys.length); + this.signatures = signatures ? this._deserializeSignatures(signatures) : new Array(this.publicKeys.length); } inherits(MultiSigScriptHashInput, Input); +MultiSigScriptHashInput.prototype.toObject = function() { + var obj = Input.prototype.toObject.apply(this, arguments); + obj.threshold = this.threshold; + obj.publicKeys = _.map(this.publicKeys, function(publicKey) { return publicKey.toString(); }); + obj.signatures = this._serializeSignatures(); + return obj; +}; + +MultiSigScriptHashInput.prototype._deserializeSignatures = function(signatures) { + return _.map(signatures, function(signature) { + if (!signature) { + return signature; + } + return { + publicKey: new PublicKey(signature.publicKey), + prevTxId: signature.txId, + outputIndex: signature.outputIndex, + inputIndex: signature.inputIndex, + signature: Signature.fromString(signature.signature), + sigtype: signature.sigtype + }; + }); +}; + +MultiSigScriptHashInput.prototype._serializeSignatures = function() { + return _.map(this.signatures, function(signature) { + if (!signature) { + return signature; + } + return { + publicKey: signature.publicKey.toString(), + prevTxId: signature.txId, + outputIndex: signature.outputIndex, + inputIndex: signature.inputIndex, + signature: signature.signature.toString(), + sigtype: signature.sigtype + }; + }); +}; + MultiSigScriptHashInput.prototype.getSignatures = function(transaction, privateKey, index, sigtype) { $.checkState(this.output instanceof Output); sigtype = sigtype || Signature.SIGHASH_ALL; diff --git a/lib/transaction/transaction.js b/lib/transaction/transaction.js index 38568fe..f7c73fb 100644 --- a/lib/transaction/transaction.js +++ b/lib/transaction/transaction.js @@ -234,6 +234,18 @@ Transaction.prototype.toObject = function toObject() { Transaction.prototype.fromObject = function(transaction) { var self = this; _.each(transaction.inputs, function(input) { + if (input.output.script) { + input.output.script = new Script(input.output.script); + if (input.output.script.isPublicKeyHashOut()) { + self.addInput(new Input.PublicKeyHash(input)); + return; + } else if (input.output.script.isScriptHashOut() && input.publicKeys && input.threshold) { + self.addInput(new Input.MultiSigScriptHash( + input, input.publicKeys, input.threshold, input.signatures + )); + return; + } + } self.addInput(new Input(input)); }); _.each(transaction.outputs, function(output) {