diff --git a/lib/primitives/mtx.js b/lib/primitives/mtx.js index 495e7dbc..5d96782d 100644 --- a/lib/primitives/mtx.js +++ b/lib/primitives/mtx.js @@ -21,6 +21,7 @@ const consensus = require('../protocol/consensus'); const policy = require('../protocol/policy'); const Amount = require('../btc/amount'); const Stack = require('../script/stack'); +const util = require('../utils/util'); /** * MTX @@ -1460,6 +1461,32 @@ class MTX extends TX { return super.getJSON(network, this.view); } + /** + * Inject properties from a json object + * @param {Object} json + */ + + fromJSON(json) { + super.fromJSON(json); + + for (let i = 0; i < json.inputs.length; i++) { + const input = json.inputs[i]; + const {prevout} = input; + + if (!input.coin) + continue; + + const coin = Coin.fromJSON(input.coin); + + coin.hash = util.revHex(prevout.hash); + coin.index = prevout.index; + + this.view.addCoin(coin); + } + + return this; + } + /** * Instantiate a transaction from a * jsonified transaction object. diff --git a/test/tx-test.js b/test/tx-test.js index 1f09418f..659d8d84 100644 --- a/test/tx-test.js +++ b/test/tx-test.js @@ -10,6 +10,7 @@ const random = require('bcrypto/lib/random'); const util = require('../lib/utils/util'); const consensus = require('../lib/protocol/consensus'); const TX = require('../lib/primitives/tx'); +const MTX = require('../lib/primitives/mtx'); const Output = require('../lib/primitives/output'); const Outpoint = require('../lib/primitives/outpoint'); const Script = require('../lib/script/script'); @@ -1102,4 +1103,19 @@ describe('TX', function() { assert.strictEqual(json.index, index); } }); + + it('should recover coins from JSON', () => { + const [tx, view] = tx2.getTX(); + + const mtx = MTX.fromTX(tx); + mtx.view = view; + + // get input value as example + const value1 = mtx.getInputValue(); + + const mtx2 = MTX.fromJSON(mtx.toJSON()); + const value2 = mtx2.getInputValue(); + + assert.strictEqual(value1, value2); + }); });