cache address activity

This commit is contained in:
Ivan Socolsky 2015-10-28 13:23:13 -03:00
parent 89575da4e8
commit 0b43b3b85c
3 changed files with 36 additions and 2 deletions

View File

@ -19,6 +19,7 @@ Address.create = function(opts) {
x.publicKeys = opts.publicKeys;
x.network = Bitcore.Address(x.address).toObject().network;
x.type = opts.type || WalletUtils.SCRIPT_TYPES.P2SH;
x.hasActivity = undefined;
return x;
};
@ -34,6 +35,7 @@ Address.fromObj = function(obj) {
x.path = obj.path;
x.publicKeys = obj.publicKeys;
x.type = obj.type || WalletUtils.SCRIPT_TYPES.P2SH;
x.hasActivity = obj.hasActivity;
return x;
};

View File

@ -702,10 +702,31 @@ WalletService.prototype._canCreateAddress = function(ignoreMaxGap, cb) {
var latestAddresses = _.takeRight(_.reject(addresses, {
isChange: true
}), WalletService.MAX_MAIN_ADDRESS_GAP);
if (latestAddresses.length < WalletService.MAX_MAIN_ADDRESS_GAP) return cb(null, true);
if (latestAddresses.length < WalletService.MAX_MAIN_ADDRESS_GAP || _.any(latestAddresses, {
hasActivity: true
})) return cb(null, true);
var bc = self._getBlockchainExplorer(latestAddresses[0].network);
bc.getAddressActivity(_.pluck(latestAddresses, 'address'), cb);
var activityFound = false;
var i = latestAddresses.length;
async.whilst(function() {
return i > 0 && !activityFound;
}, function(next) {
bc.getAddressActivity(latestAddresses[--i].address, function(err, res) {
if (err) return next(err);
activityFound = !!res;
return next();
});
}, function(err) {
if (err) return cb(err);
if (!activityFound) return cb(null, false);
var address = latestAddresses[i];
address.hasActivity = true;
self.storage.storeAddress(self.walletId, address, function(err) {
return cb(err, true);
});
});
});
};

View File

@ -383,6 +383,17 @@ Storage.prototype.fetchAddresses = function(walletId, cb) {
});
};
Storage.prototype.storeAddress = function(walletId, address, cb) {
var self = this;
self.db.collection(collections.ADDRESSES).update({
address: address.address
}, address, {
w: 1,
upsert: false,
}, cb);
};
Storage.prototype.storeAddressAndWallet = function(wallet, addresses, cb) {
var self = this;