commit
ba0d399cc5
|
@ -38,6 +38,15 @@ AddressManager.prototype._incrementIndex = function(isChange) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
AddressManager.prototype.rewindIndex = function(isChange, n) {
|
||||||
|
n = _.isUndefined(n) ? 1 : n;
|
||||||
|
if (isChange) {
|
||||||
|
this.changeAddressIndex = Math.max(0, this.changeAddressIndex - n);
|
||||||
|
} else {
|
||||||
|
this.receiveAddressIndex = Math.max(0, this.receiveAddressIndex - n);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
AddressManager.prototype.getCurrentAddressPath = function(isChange) {
|
AddressManager.prototype.getCurrentAddressPath = function(isChange) {
|
||||||
return 'm/' +
|
return 'm/' +
|
||||||
this.copayerIndex + '/' +
|
this.copayerIndex + '/' +
|
||||||
|
|
|
@ -1164,7 +1164,7 @@ WalletService.prototype.scan = function(opts, cb) {
|
||||||
function deriveAddresses(size, derivator, cb) {
|
function deriveAddresses(size, derivator, cb) {
|
||||||
async.mapSeries(_.range(size), function(i, next) {
|
async.mapSeries(_.range(size), function(i, next) {
|
||||||
setTimeout(function() {
|
setTimeout(function() {
|
||||||
next(null, derivator());
|
next(null, derivator.derive());
|
||||||
}, WalletService.scanConfig.DERIVATION_DELAY)
|
}, WalletService.scanConfig.DERIVATION_DELAY)
|
||||||
}, cb);
|
}, cb);
|
||||||
};
|
};
|
||||||
|
@ -1184,10 +1184,14 @@ WalletService.prototype.scan = function(opts, cb) {
|
||||||
deriveAddresses(WalletService.scanConfig.SCAN_WINDOW, derivator, function(err, addresses) {
|
deriveAddresses(WalletService.scanConfig.SCAN_WINDOW, derivator, function(err, addresses) {
|
||||||
if (err) return next(err);
|
if (err) return next(err);
|
||||||
networkName = networkName || Bitcore.Address(addresses[0].address).toObject().network;
|
networkName = networkName || Bitcore.Address(addresses[0].address).toObject().network;
|
||||||
allAddresses.push(addresses);
|
|
||||||
checkActivity(_.pluck(addresses, 'address'), networkName, function(err, thereIsActivity) {
|
checkActivity(_.pluck(addresses, 'address'), networkName, function(err, thereIsActivity) {
|
||||||
if (err) return next(new Error('Could not fetch TX activity:' + err));
|
if (err) return next(new Error('Could not fetch TX activity:' + err));
|
||||||
activity = thereIsActivity;
|
activity = thereIsActivity;
|
||||||
|
if (thereIsActivity) {
|
||||||
|
allAddresses.push(addresses);
|
||||||
|
} else {
|
||||||
|
derivator.rewind(WalletService.scanConfig.SCAN_WINDOW);
|
||||||
|
}
|
||||||
next();
|
next();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -1208,10 +1212,16 @@ WalletService.prototype.scan = function(opts, cb) {
|
||||||
|
|
||||||
var derivators = [];
|
var derivators = [];
|
||||||
_.each([false, true], function(isChange) {
|
_.each([false, true], function(isChange) {
|
||||||
derivators.push(_.bind(wallet.createAddress, wallet, isChange));
|
derivators.push({
|
||||||
|
derive: _.bind(wallet.createAddress, wallet, isChange),
|
||||||
|
rewind: _.bind(wallet.addressManager.rewindIndex, wallet.addressManager, isChange),
|
||||||
|
});
|
||||||
if (opts.includeCopayerBranches) {
|
if (opts.includeCopayerBranches) {
|
||||||
_.each(wallet.copayers, function(copayer) {
|
_.each(wallet.copayers, function(copayer) {
|
||||||
derivators.push(_.bind(copayer.createAddress, copayer, wallet, isChange));
|
derivators.push({
|
||||||
|
derive: _.bind(copayer.createAddress, copayer, wallet, isChange),
|
||||||
|
rewind: _.bind(copayer.addressManager.rewindIndex, copayer.addressManager, isChange),
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -2538,7 +2538,11 @@ describe('Wallet service', function() {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should scan main addresses', function(done) {
|
it('should scan main addresses', function(done) {
|
||||||
helpers.stubAddressActivity(['3K2VWMXheGZ4qG35DyGjA2dLeKfaSr534A']);
|
helpers.stubAddressActivity(
|
||||||
|
['3K2VWMXheGZ4qG35DyGjA2dLeKfaSr534A', // m/2147483647/0/0
|
||||||
|
'3NezgtNbuDzL2sFhnfxyVy8bHp4v6ud252', // m/2147483647/0/2
|
||||||
|
'3CQ2hCMUu1SCPVPMpfCCuT3nAfHGiHV1o7', // m/2147483647/1/0
|
||||||
|
]);
|
||||||
var expectedPaths = [
|
var expectedPaths = [
|
||||||
'm/2147483647/0/0',
|
'm/2147483647/0/0',
|
||||||
'm/2147483647/0/1',
|
'm/2147483647/0/1',
|
||||||
|
@ -2563,18 +2567,20 @@ describe('Wallet service', function() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it('should scan main addresses & copayer addresses', function(done) {
|
it('should scan main addresses & copayer addresses', function(done) {
|
||||||
helpers.stubAddressActivity(['3K2VWMXheGZ4qG35DyGjA2dLeKfaSr534A']);
|
helpers.stubAddressActivity(
|
||||||
|
['3K2VWMXheGZ4qG35DyGjA2dLeKfaSr534A', // m/2147483647/0/0
|
||||||
|
'3CQ2hCMUu1SCPVPMpfCCuT3nAfHGiHV1o7', // m/2147483647/1/0
|
||||||
|
'3BYHznBmosYxUj1NWcjdFKX2tdsH7UT1YG', // m/0/0/1
|
||||||
|
'3Eg1uPkGnwyU42bRiaDuo6Cu9bjjhoG7Sh', // m/1/1/0
|
||||||
|
'3AYmZ63tMd2AHN8QLfu5D2nfRzCH66psWx', // m/1/0/0
|
||||||
|
]);
|
||||||
var expectedPaths = [
|
var expectedPaths = [
|
||||||
'm/2147483647/0/0',
|
'm/2147483647/0/0',
|
||||||
'm/2147483647/0/1',
|
'm/2147483647/0/1',
|
||||||
'm/2147483647/0/2',
|
|
||||||
'm/2147483647/0/3',
|
|
||||||
'm/2147483647/1/0',
|
'm/2147483647/1/0',
|
||||||
'm/2147483647/1/1',
|
'm/2147483647/1/1',
|
||||||
'm/0/0/0',
|
'm/0/0/0',
|
||||||
'm/0/0/1',
|
'm/0/0/1',
|
||||||
'm/0/1/0',
|
|
||||||
'm/0/1/1',
|
|
||||||
'm/1/0/0',
|
'm/1/0/0',
|
||||||
'm/1/0/1',
|
'm/1/0/1',
|
||||||
'm/1/1/0',
|
'm/1/1/0',
|
||||||
|
@ -2658,7 +2664,11 @@ describe('Wallet service', function() {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should start an asynchronous scan', function(done) {
|
it('should start an asynchronous scan', function(done) {
|
||||||
helpers.stubAddressActivity(['3K2VWMXheGZ4qG35DyGjA2dLeKfaSr534A']);
|
helpers.stubAddressActivity([
|
||||||
|
'3K2VWMXheGZ4qG35DyGjA2dLeKfaSr534A', // m/2147483647/0/0
|
||||||
|
'3NezgtNbuDzL2sFhnfxyVy8bHp4v6ud252', // m/2147483647/0/2
|
||||||
|
'3CQ2hCMUu1SCPVPMpfCCuT3nAfHGiHV1o7', // m/2147483647/1/1
|
||||||
|
]);
|
||||||
var expectedPaths = [
|
var expectedPaths = [
|
||||||
'm/2147483647/0/0',
|
'm/2147483647/0/0',
|
||||||
'm/2147483647/0/1',
|
'm/2147483647/0/1',
|
||||||
|
|
|
@ -33,4 +33,28 @@ describe('AddressManager', function() {
|
||||||
am.getNewAddressPath(true).should.equal('m/2/1/0');
|
am.getNewAddressPath(true).should.equal('m/2/1/0');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
describe('#rewindIndex', function() {
|
||||||
|
it('should rewind main index', function() {
|
||||||
|
var am = AddressManager.create({});
|
||||||
|
am.getNewAddressPath(false).should.equal('m/2147483647/0/0');
|
||||||
|
am.getNewAddressPath(false).should.equal('m/2147483647/0/1');
|
||||||
|
am.getNewAddressPath(false).should.equal('m/2147483647/0/2');
|
||||||
|
am.rewindIndex(false, 2);
|
||||||
|
am.getNewAddressPath(false).should.equal('m/2147483647/0/1');
|
||||||
|
});
|
||||||
|
it('should rewind change index', function() {
|
||||||
|
var am = AddressManager.create({});
|
||||||
|
am.getNewAddressPath(true).should.equal('m/2147483647/1/0');
|
||||||
|
am.rewindIndex(false, 1);
|
||||||
|
am.getNewAddressPath(true).should.equal('m/2147483647/1/1');
|
||||||
|
am.rewindIndex(true, 2);
|
||||||
|
am.getNewAddressPath(true).should.equal('m/2147483647/1/0');
|
||||||
|
});
|
||||||
|
it('should stop at 0', function() {
|
||||||
|
var am = AddressManager.create({});
|
||||||
|
am.getNewAddressPath(false).should.equal('m/2147483647/0/0');
|
||||||
|
am.rewindIndex(false, 20);
|
||||||
|
am.getNewAddressPath(false).should.equal('m/2147483647/0/0');
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue