Skip to content

Commit 30494a8

Browse files
committed
fetch address by walletId/coin
1 parent 98bdaeb commit 30494a8

File tree

4 files changed

+73
-74
lines changed

4 files changed

+73
-74
lines changed

Diff for: lib/blockchainmonitor.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ BlockchainMonitor.prototype._initExplorer = function(coin, network, explorer) {
102102
socket.on('connect_error', function() {
103103
log.error('Error connecting to ' + explorer.getConnectionInfo());
104104
});
105-
socket.on('tx', _.bind(self._handleIncomingTx, self));
105+
socket.on('tx', _.bind(self._handleIncomingTx, self, coin, network));
106106
socket.on('block', _.bind(self._handleNewBlock, self, coin, network));
107107
};
108108

@@ -150,7 +150,7 @@ BlockchainMonitor.prototype._handleThirdPartyBroadcasts = function(data, process
150150
});
151151
};
152152

153-
BlockchainMonitor.prototype._handleIncomingPayments = function(data) {
153+
BlockchainMonitor.prototype._handleIncomingPayments = function(coin, network, data) {
154154
var self = this;
155155

156156
if (!data || !data.vout) return;
@@ -166,7 +166,7 @@ BlockchainMonitor.prototype._handleIncomingPayments = function(data) {
166166
if (_.isEmpty(outs)) return;
167167

168168
async.each(outs, function(out, next) {
169-
self.storage.fetchAddress(out.address, function(err, address) {
169+
self.storage.fetchAddressByCoin(coin, out.address, function(err, address) {
170170
if (err) {
171171
log.error('Could not fetch addresses from the db');
172172
return next(err);
@@ -219,9 +219,9 @@ BlockchainMonitor.prototype._updateActiveAddresses = function(address, cb) {
219219
});
220220
};
221221

222-
BlockchainMonitor.prototype._handleIncomingTx = function(data) {
222+
BlockchainMonitor.prototype._handleIncomingTx = function(coin, network, data) {
223223
this._handleThirdPartyBroadcasts(data);
224-
this._handleIncomingPayments(data);
224+
this._handleIncomingPayments(coin, network, data);
225225
};
226226

227227
BlockchainMonitor.prototype._notifyNewBlock = function(coin, network, hash) {

Diff for: lib/server.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,7 @@ WalletService.prototype.getWalletFromIdentifier = function(opts, cb) {
427427
});
428428
},
429429
function(done) {
430-
self.storage.fetchAddress(opts.identifier, function(err, address) {
430+
self.storage.fetchAddressByCoin(Defaults.COIN, opts.identifier, function(err, address) {
431431
if (address) walletId = address.walletId;
432432
return done(err);
433433
});
@@ -461,7 +461,7 @@ WalletService.prototype.getWalletFromIdentifier = function(opts, cb) {
461461
var outputs = _.first(self._normalizeTxHistory(tx)).outputs;
462462
var toAddresses = _.pluck(outputs, 'address');
463463
async.detect(toAddresses, function(addressStr, nextAddress) {
464-
self.storage.fetchAddress(addressStr, function(err, address) {
464+
self.storage.fetchAddressByCoin(coinNetwork.coin, addressStr, function(err, address) {
465465
if (err || !address) return nextAddress(err, false);
466466
walletId = address.walletId;
467467
nextAddress(null, true);
@@ -2047,7 +2047,7 @@ WalletService.prototype.createTx = function(opts, cb) {
20472047
});
20482048
} else {
20492049
if (opts.changeAddress) {
2050-
self.storage.fetchAddress(opts.changeAddress, function(err, address) {
2050+
self.storage.fetchAddressByWalletId(wallet.id, opts.changeAddress, function(err, address) {
20512051
if (err) return cb(Errors.INVALID_CHANGE_ADDRESS);
20522052
return cb(null, address);
20532053
});

Diff for: lib/storage.js

+31-31
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,7 @@ Storage.prototype.storeAddress = function(address, cb) {
461461
var self = this;
462462

463463
self.db.collection(collections.ADDRESSES).update({
464+
walletId: address.walletId,
464465
address: address.address
465466
}, address, {
466467
w: 1,
@@ -471,45 +472,22 @@ Storage.prototype.storeAddress = function(address, cb) {
471472
Storage.prototype.storeAddressAndWallet = function(wallet, addresses, cb) {
472473
var self = this;
473474

474-
function saveAddresses(addresses, cb) {
475-
if (_.isEmpty(addresses)) return cb();
476-
self.db.collection(collections.ADDRESSES).insert(addresses, {
477-
w: 1
478-
}, cb);
479-
};
480-
481475
var addresses = [].concat(addresses);
482-
if (addresses.length == 0) return cb();
476+
if (_.isEmpty(addresses)) return cb();
483477

484-
async.filter(addresses, function(address, next) {
485-
self.db.collection(collections.ADDRESSES).findOne({
486-
address: address.address,
487-
}, {
488-
walletId: true,
489-
}, function(err, result) {
490-
if (err || !result) return next(true);
491-
if (result.walletId != wallet.id) {
492-
log.warn('Address ' + address.address + ' exists in more than one wallet.');
493-
return next(true);
494-
}
495-
// Ignore if address was already in wallet
496-
return next(false);
497-
});
498-
}, function(newAddresses) {
499-
if (newAddresses.length < addresses.length) {
500-
log.warn('Attempted to store already existing addresses on wallet ' + wallet.id);
501-
}
502-
saveAddresses(newAddresses, function(err) {
503-
if (err) return cb(err);
504-
self.storeWallet(wallet, cb);
505-
});
478+
self.db.collection(collections.ADDRESSES).insert(addresses, {
479+
w: 1
480+
}, function(err) {
481+
if (err) return cb(err);
482+
self.storeWallet(wallet, cb);
506483
});
507484
};
508485

509-
Storage.prototype.fetchAddress = function(address, cb) {
486+
Storage.prototype.fetchAddressByWalletId = function(walletId, address, cb) {
510487
var self = this;
511488

512489
this.db.collection(collections.ADDRESSES).findOne({
490+
walletId: walletId,
513491
address: address,
514492
}, function(err, result) {
515493
if (err) return cb(err);
@@ -519,6 +497,27 @@ Storage.prototype.fetchAddress = function(address, cb) {
519497
});
520498
};
521499

500+
Storage.prototype.fetchAddressByCoin = function(coin, address, cb) {
501+
var self = this;
502+
503+
this.db.collection(collections.ADDRESSES).find({
504+
address: address,
505+
}).toArray(function(err, result) {
506+
if (err) return cb(err);
507+
if (!result || _.isEmpty(result)) return cb();
508+
if (result.length > 1) {
509+
result = _.find(result, function(address) {
510+
return coin == (address.coin || Defaults.COIN);
511+
});
512+
} else {
513+
result = _.first(result);
514+
}
515+
if (!result) return cb();
516+
517+
return cb(null, Model.Address.fromObj(result));
518+
});
519+
};
520+
522521
Storage.prototype.fetchPreferences = function(walletId, copayerId, cb) {
523522
this.db.collection(collections.PREFERENCES).find({
524523
walletId: walletId,
@@ -610,6 +609,7 @@ Storage.prototype.cleanActiveAddresses = function(walletId, cb) {
610609
Storage.prototype.storeActiveAddresses = function(walletId, addresses, cb) {
611610
var self = this;
612611

612+
if (_.isEmpty(addresses)) return cb();
613613
async.each(addresses, function(address, next) {
614614
var record = {
615615
walletId: walletId,

Diff for: test/integration/server.js

+34-35
Original file line numberDiff line numberDiff line change
@@ -1188,22 +1188,6 @@ describe('Wallet service', function() {
11881188
});
11891189
});
11901190

1191-
it('should protect against storing same address multiple times', function(done) {
1192-
server.createAddress({}, function(err, address) {
1193-
should.not.exist(err);
1194-
should.exist(address);
1195-
delete address._id;
1196-
server.storage.storeAddressAndWallet(wallet, address, function(err) {
1197-
should.not.exist(err);
1198-
server.getMainAddresses({}, function(err, addresses) {
1199-
should.not.exist(err);
1200-
addresses.length.should.equal(1);
1201-
done();
1202-
});
1203-
});
1204-
});
1205-
});
1206-
12071191
it('should create many addresses on simultaneous requests', function(done) {
12081192
var N = 5;
12091193
async.mapSeries(_.range(N), function(i, cb) {
@@ -7615,42 +7599,57 @@ describe('Wallet service', function() {
76157599
});
76167600
});
76177601

7618-
describe.skip('BTC & BCH wallets with same seed', function() {
7619-
var server, wBtc, wBch;
7602+
describe('BTC & BCH wallets with same seed', function() {
7603+
var server = {},
7604+
wallet = {};
76207605
beforeEach(function(done) {
76217606
helpers.createAndJoinWallet(1, 1, function(s, w) {
7622-
server = s;
7623-
wBtc = w;
7607+
server.btc = s;
7608+
wallet.btc = w;
76247609
w.copayers[0].id.should.equal(TestData.copayers[0].id44btc);
7625-
helpers.createAndJoinWallet(1, 1, function(s, w) {
7626-
wBch = w;
7627-
w.copayers[0].id.should.equal(TestData.copayers[0].id44btc);
7610+
helpers.createAndJoinWallet(1, 1, {
7611+
coin: 'bch'
7612+
}, function(s, w) {
7613+
server.bch = s;
7614+
wallet.bch = w;
7615+
w.copayers[0].id.should.equal(TestData.copayers[0].id44bch);
76287616
done();
76297617
});
76307618
});
76317619
});
76327620

76337621
it('should create address', function(done) {
7634-
server.createAddress({}, function(err, address) {
7622+
server.btc.createAddress({}, function(err, address) {
76357623
should.not.exist(err);
76367624
should.exist(address);
7637-
address.walletId.should.equal(wallet.id);
7625+
address.walletId.should.equal(wallet.btc.id);
7626+
address.coin.should.equal('btc');
76387627
address.network.should.equal('livenet');
76397628
address.address.should.equal('1L3z9LPd861FWQhf3vDn89Fnc9dkdBo2CG');
7640-
address.isChange.should.be.false;
7641-
address.path.should.equal('m/0/0');
7642-
address.type.should.equal('P2PKH');
7643-
server.getNotifications({}, function(err, notifications) {
7629+
server.bch.createAddress({}, function(err, address) {
76447630
should.not.exist(err);
7645-
var notif = _.find(notifications, {
7646-
type: 'NewAddress'
7631+
should.exist(address);
7632+
address.walletId.should.equal(wallet.bch.id);
7633+
address.coin.should.equal('bch');
7634+
address.network.should.equal('livenet');
7635+
address.address.should.equal('1L3z9LPd861FWQhf3vDn89Fnc9dkdBo2CG');
7636+
server.btc.getMainAddresses({}, function(err, addresses) {
7637+
should.not.exist(err);
7638+
addresses.length.should.equal(1);
7639+
addresses[0].coin.should.equal('btc');
7640+
addresses[0].walletId.should.equal(wallet.btc.id);
7641+
addresses[0].address.should.equal('1L3z9LPd861FWQhf3vDn89Fnc9dkdBo2CG');
7642+
server.bch.getMainAddresses({}, function(err, addresses) {
7643+
should.not.exist(err);
7644+
addresses.length.should.equal(1);
7645+
addresses[0].coin.should.equal('bch');
7646+
addresses[0].walletId.should.equal(wallet.bch.id);
7647+
addresses[0].address.should.equal('1L3z9LPd861FWQhf3vDn89Fnc9dkdBo2CG');
7648+
done();
7649+
});
76477650
});
7648-
should.exist(notif);
7649-
notif.data.address.should.equal(address.address);
7650-
done();
76517651
});
76527652
});
76537653
});
7654-
76557654
});
76567655
});

0 commit comments

Comments
 (0)