From 1ba97a3883df98f2fc8fbe0096e7f39f20e17a63 Mon Sep 17 00:00:00 2001 From: Ivan Socolsky Date: Sun, 8 Feb 2015 11:47:04 -0300 Subject: [PATCH] fix address creation when wallet not complete --- lib/model/wallet.js | 9 +++++++- lib/server.js | 3 ++- test/integration.js | 51 +++++++++++++++++++++++++++++++++++---------- 3 files changed, 50 insertions(+), 13 deletions(-) diff --git a/lib/model/wallet.js b/lib/model/wallet.js index 8bf50d2..5191523 100644 --- a/lib/model/wallet.js +++ b/lib/model/wallet.js @@ -2,6 +2,7 @@ var _ = require('lodash'); var util = require('util'); +var $ = require('preconditions').singleton(); var Bitcore = require('bitcore'); var BitcoreAddress = Bitcore.Address; @@ -111,9 +112,15 @@ Wallet.prototype.getPublicKey = function(copayerId, path) { return copayer.getPublicKey(path); }; +Wallet.prototype.isComplete = function() { + return this.status == 'complete'; +}; + Wallet.prototype.createAddress = function(isChange) { + $.checkState(this.isComplete()); + var path = this.addressManager.getNewAddressPath(isChange); - + var publicKeys = _.map(this.copayers, function(copayer) { var xpub = new Bitcore.HDPublicKey(copayer.xPubKey); return xpub.derive(path).publicKey; diff --git a/lib/server.js b/lib/server.js index 5a1c49e..b58c288 100644 --- a/lib/server.js +++ b/lib/server.js @@ -113,7 +113,7 @@ CopayServer.prototype.createWallet = function(opts, cb) { }); self.storage.storeWallet(wallet, function(err) { - return cb(err,wallet.id); + return cb(err, wallet.id); }); }; @@ -200,6 +200,7 @@ CopayServer.prototype.createAddress = function(opts, cb) { Utils.runLocked(self.walletId, cb, function(cb) { self.getWallet({}, function(err, wallet) { if (err) return cb(err); + if (!wallet.isComplete()) return cb(new ClientError('Wallet is not complete')); var address = wallet.createAddress(opts.isChange); diff --git a/test/integration.js b/test/integration.js index 249d911..ced4a41 100644 --- a/test/integration.js +++ b/test/integration.js @@ -349,7 +349,7 @@ describe('Copay server', function() { n: 1, pubKey: keyPair.pub, }; - server.createWallet(walletOpts, function(err,walletId) { + server.createWallet(walletOpts, function(err, walletId) { should.not.exist(err); var copayer1Opts = { walletId: walletId, @@ -568,7 +568,37 @@ describe('Copay server', function() { }); }); - it.skip('should fail to create address when wallet is not complete', function(done) {}); + it('should fail to create address when wallet is not complete', function(done) { + var server = new CopayServer(); + var walletOpts = { + name: 'my wallet', + m: 2, + n: 3, + pubKey: keyPair.pub, + }; + server.createWallet(walletOpts, function(err, walletId) { + should.not.exist(err); + var copayerOpts = { + walletId: walletId, + name: 'me', + xPubKey: aXPubKey, + xPubKeySignature: aXPubKeySignature, + }; + server.joinWallet(copayerOpts, function(err, copayerId) { + should.not.exist(err); + helpers.getAuthServer(copayerId, function(server) { + server.createAddress({ + isChange: false, + }, function(err, address) { + should.not.exist(address); + err.should.exist; + err.message.should.contain('not complete'); + done(); + }); + }); + }); + }); + }); it('should create many addresses on simultaneous requests', function(done) { async.map(_.range(10), function(i, cb) { @@ -981,7 +1011,7 @@ describe('Copay server', function() { var server, wallet, clock; beforeEach(function(done) { - if (server) + if (server) return done(); this.timeout(5000); @@ -1000,14 +1030,13 @@ describe('Copay server', function() { amount: helpers.toSatoshi(0.1), }; async.eachSeries(_.range(10), function(i, next) { - clock.tick(10000); - server.createTx(txOpts, function(err, tx) { - next(); - }); - }, function(err) { - return done(err); - } - ); + clock.tick(10000); + server.createTx(txOpts, function(err, tx) { + next(); + }); + }, function(err) { + return done(err); + }); }); }); });