diff --git a/js/models/core/BuilderMockV0.js b/js/models/core/BuilderMockV0.js new file mode 100644 index 000000000..be3926d10 --- /dev/null +++ b/js/models/core/BuilderMockV0.js @@ -0,0 +1,26 @@ +'use strict'; + + +var bitcore = require('bitcore'); +var Transaction = bitcore.Transaction; + +function BuilderMockV0 (data) { + this.vanilla = data; + this.tx = new Transaction(); + this.tx.parse(new Buffer(data.tx, 'hex')); +}; + +BuilderMockV0.prototype.build = function() { + return this.tx; +}; + + +BuilderMockV0.prototype.getSelectedUnspent = function() { + return []; +}; + +BuilderMockV0.prototype.toObj = function() { + return this.vanilla; +}; + +module.exports = BuilderMockV0; diff --git a/js/models/core/TxProposal.js b/js/models/core/TxProposal.js index cb5c4987b..943c3e97a 100644 --- a/js/models/core/TxProposal.js +++ b/js/models/core/TxProposal.js @@ -4,6 +4,7 @@ var bitcore = require('bitcore'); var _ = require('underscore'); var util = bitcore.util; var Transaction = bitcore.Transaction; +var BuilderMockV0 = require('./BuilderMockV0');; var TransactionBuilder = bitcore.TransactionBuilder; var Script = bitcore.Script; var Key = bitcore.Key; @@ -147,7 +148,12 @@ TxProposal.fromObj = function(o, forceOpts) { try { o.builder = TransactionBuilder.fromObj(o.builderObj); } catch (e) { - throw new Error("Invalid or Incompatible Backup Detected."); + + // backwards (V0) compatatibility fix. + if (!o.version) { + o.builder = new BuilderMockV0(o.builderObj); + o.readonly = 1; + }; } return new TxProposal(o); }; diff --git a/js/models/core/TxProposals.js b/js/models/core/TxProposals.js index c5ecd49f0..44f1f9bb7 100644 --- a/js/models/core/TxProposals.js +++ b/js/models/core/TxProposals.js @@ -1,9 +1,11 @@ 'use strict'; +var BuilderMockV0 = require('./BuilderMockV0');; var bitcore = require('bitcore'); var util = bitcore.util; var Transaction = bitcore.Transaction; -var TxProposal = require('./TxProposal'); +var BuilderMockV0 = require('./BuilderMockV0');; +var TxProposal = require('./TxProposal');; var Script = bitcore.Script; var Key = bitcore.Key; var buffertools = bitcore.buffertools; diff --git a/test/test.TxProposal.js b/test/test.TxProposal.js index 1371e44f4..78dff1541 100644 --- a/test/test.TxProposal.js +++ b/test/test.TxProposal.js @@ -120,7 +120,7 @@ describe('TxProposal', function() { builderObj: b.toObj(), inputChainPaths: ['m/1'], }); - }).should.throw('Invalid or Incompatible Backup Detected'); + }).should.throw('Invalid'); }); it('sets force opts', function() { var b = new FakeBuilder(); @@ -134,7 +134,7 @@ describe('TxProposal', function() { }; (function() { txp = TxProposal.fromObj(o,{pepe:100}); - }).should.throw('Invalid or Incompatible Backup Detected'); + }).should.throw('Invalid tx proposal: no ins'); o.builderObj.opts.should.deep.equal({juan:1, pepe:100, feeSat:undefined, fee:undefined}); }); }); diff --git a/test/test.WalletFactory.js b/test/test.WalletFactory.js index 058f91c9b..b79bdcd5c 100644 --- a/test/test.WalletFactory.js +++ b/test/test.WalletFactory.js @@ -432,13 +432,16 @@ describe('WalletFactory model', function() { wf.network.start.getCall(0).args[0].privkey.length.should.equal(64); //privkey is hex of private key buffer }); }); - describe('break backwards compatibility with older versions', function() { - it('should\'nt be able to import unencrypted legacy wallet TxProposal: v0', function() { + describe('dont break backwards compatibility of wallets', function() { + it('should be able to import unencrypted legacy wallet TxProposal: v0', function() { + var wf = new WalletFactory(config, '0.0.5'); + var w = wf.fromObj(JSON.parse(legacyO)); - (function() { - var wf = new WalletFactory(config, '0.0.5'); - var w = wf.fromObj(JSON.parse(legacyO)); - }).should.throw('Invalid or Incompatible Backup Detected'); + should.exist(w); + w.id.should.equal('55d4bd062d32f90a'); + should.exist(w.publicKeyRing.getCopayerId); + should.exist(w.txProposals.toObj()); + should.exist(w.privateKey.toObj()); }); it('should be able to import simple 1-of-1 encrypted legacy testnet wallet', function(done) {