From fe86abc09352d78a1ed47ec13deffedd3abefb2b Mon Sep 17 00:00:00 2001 From: Esteban Ordano Date: Mon, 5 Jan 2015 12:32:40 -0300 Subject: [PATCH] Add `change` when serializing transaction --- lib/address.js | 19 +++++++++++++++++++ lib/transaction/transaction.js | 7 +++++++ test/address.js | 2 +- test/transaction/transaction.js | 10 ++++++++++ 4 files changed, 37 insertions(+), 1 deletion(-) diff --git a/lib/address.js b/lib/address.js index 96d1a06..221fd96 100644 --- a/lib/address.js +++ b/lib/address.js @@ -112,6 +112,8 @@ Address.prototype._classifyArguments = function(data, network, type) { return Address._transformScript(data, network); } else if (typeof(data) === 'string') { return Address._transformString(data, network, type); + } else if (_.isObject(data)) { + return Address._transformObject(data); } else { throw new TypeError('First argument is an unrecognized data format.'); } @@ -139,6 +141,23 @@ Address._transformHash = function(hash){ return info; }; +/** + * Deserializes an address serialized through `Address#toObject()` + * @param {Object} data + * @param {string} data.hash - the hash that this address encodes + * @param {string} data.type - either 'pubkeyhash' or 'scripthash' + * @param {Network=} data.network - the name of the network associated + * @return {Address} + */ +Address._transformObject = function(data) { + $.checkArgument(data.hash, 'Must provide a `hash` property'); + $.checkArgument(data.type, 'Must provide a `type` property'); + data.hashBuffer = new Buffer(data.hash, 'hex'); + data.network = Networks.get(data.network) || Networks.defaultNetwork; + + return data; +}; + /** * Internal function to discover the network and type based on the first data byte * diff --git a/lib/transaction/transaction.js b/lib/transaction/transaction.js index 5370e25..2031094 100644 --- a/lib/transaction/transaction.js +++ b/lib/transaction/transaction.js @@ -202,6 +202,9 @@ Transaction.prototype.fromJSON = function(json) { outputs.forEach(function(output) { self.outputs.push(Output.fromJSON(output)); }); + if (json.change) { + this.change(json.change); + } this.version = json.version; this.nLockTime = json.nLockTime; return this; @@ -217,6 +220,7 @@ Transaction.prototype.toObject = function toObject() { outputs.push(output.toObject()); }); return { + change: this._change ? this._change.toObject() : undefined, version: this.version, inputs: inputs, outputs: outputs, @@ -232,6 +236,9 @@ Transaction.prototype.fromObject = function(transaction) { _.each(transaction.outputs, function(output) { self.addOutput(new Output(output)); }); + if (transaction.change) { + this.change(transaction.change); + } this.nLockTime = transaction.nLockTime; this.version = transaction.version; }; diff --git a/test/address.js b/test/address.js index b75c7ae..063871b 100644 --- a/test/address.js +++ b/test/address.js @@ -233,7 +233,7 @@ describe('Address', function() { it('should error because of unrecognized data format', function() { (function() { return new Address(new Error()); - }).should.throw('First argument is an unrecognized data format.'); + }).should.throw(bitcore.errors.InvalidArgument); }); it('should error because of incorrect format for pubkey hash', function() { diff --git a/test/transaction/transaction.js b/test/transaction/transaction.js index 742be1e..8adb53b 100644 --- a/test/transaction/transaction.js +++ b/test/transaction/transaction.js @@ -213,6 +213,16 @@ describe('Transaction', function() { }); }); + describe('serialization', function() { + it('stores the change address correctly', function() { + var serialized = new Transaction() + .change(changeAddress) + .toObject(); + var deserialized = new Transaction(serialized); + expect(deserialized._change.toString()).to.equal(changeAddress); + }); + }); + describe('checked serialize', function() { it('fails if no change address was set', function() { var transaction = new Transaction()