Browse Source

fix address creation when wallet not complete

activeAddress
Ivan Socolsky 10 years ago
parent
commit
1ba97a3883
  1. 9
      lib/model/wallet.js
  2. 3
      lib/server.js
  3. 51
      test/integration.js

9
lib/model/wallet.js

@ -2,6 +2,7 @@
var _ = require('lodash'); var _ = require('lodash');
var util = require('util'); var util = require('util');
var $ = require('preconditions').singleton();
var Bitcore = require('bitcore'); var Bitcore = require('bitcore');
var BitcoreAddress = Bitcore.Address; var BitcoreAddress = Bitcore.Address;
@ -111,9 +112,15 @@ Wallet.prototype.getPublicKey = function(copayerId, path) {
return copayer.getPublicKey(path); return copayer.getPublicKey(path);
}; };
Wallet.prototype.isComplete = function() {
return this.status == 'complete';
};
Wallet.prototype.createAddress = function(isChange) { Wallet.prototype.createAddress = function(isChange) {
$.checkState(this.isComplete());
var path = this.addressManager.getNewAddressPath(isChange); var path = this.addressManager.getNewAddressPath(isChange);
var publicKeys = _.map(this.copayers, function(copayer) { var publicKeys = _.map(this.copayers, function(copayer) {
var xpub = new Bitcore.HDPublicKey(copayer.xPubKey); var xpub = new Bitcore.HDPublicKey(copayer.xPubKey);
return xpub.derive(path).publicKey; return xpub.derive(path).publicKey;

3
lib/server.js

@ -113,7 +113,7 @@ CopayServer.prototype.createWallet = function(opts, cb) {
}); });
self.storage.storeWallet(wallet, function(err) { 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) { Utils.runLocked(self.walletId, cb, function(cb) {
self.getWallet({}, function(err, wallet) { self.getWallet({}, function(err, wallet) {
if (err) return cb(err); if (err) return cb(err);
if (!wallet.isComplete()) return cb(new ClientError('Wallet is not complete'));
var address = wallet.createAddress(opts.isChange); var address = wallet.createAddress(opts.isChange);

51
test/integration.js

@ -349,7 +349,7 @@ describe('Copay server', function() {
n: 1, n: 1,
pubKey: keyPair.pub, pubKey: keyPair.pub,
}; };
server.createWallet(walletOpts, function(err,walletId) { server.createWallet(walletOpts, function(err, walletId) {
should.not.exist(err); should.not.exist(err);
var copayer1Opts = { var copayer1Opts = {
walletId: walletId, 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) { it('should create many addresses on simultaneous requests', function(done) {
async.map(_.range(10), function(i, cb) { async.map(_.range(10), function(i, cb) {
@ -981,7 +1011,7 @@ describe('Copay server', function() {
var server, wallet, clock; var server, wallet, clock;
beforeEach(function(done) { beforeEach(function(done) {
if (server) if (server)
return done(); return done();
this.timeout(5000); this.timeout(5000);
@ -1000,14 +1030,13 @@ describe('Copay server', function() {
amount: helpers.toSatoshi(0.1), amount: helpers.toSatoshi(0.1),
}; };
async.eachSeries(_.range(10), function(i, next) { async.eachSeries(_.range(10), function(i, next) {
clock.tick(10000); clock.tick(10000);
server.createTx(txOpts, function(err, tx) { server.createTx(txOpts, function(err, tx) {
next(); next();
}); });
}, function(err) { }, function(err) {
return done(err); return done(err);
} });
);
}); });
}); });
}); });

Loading…
Cancel
Save