From f00b5dbe68e6f4a7cff806479b854ee4ca61e645 Mon Sep 17 00:00:00 2001 From: Ivan Socolsky Date: Tue, 27 Oct 2015 15:19:38 -0300 Subject: [PATCH 01/10] refactor constant definition --- lib/server.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/server.js b/lib/server.js index 7650f88..909cb81 100644 --- a/lib/server.js +++ b/lib/server.js @@ -34,7 +34,6 @@ var blockchainExplorerOpts; var messageBroker; var serviceVersion; -var MAX_KEYS = 100; /** * Creates an instance of the Bitcore Wallet Service. @@ -53,6 +52,8 @@ function WalletService() { }; +WalletService.MAX_KEYS = 100; + // Time after which a Tx proposal can be erased by any copayer. in seconds WalletService.DELETE_LOCKTIME = 24 * 3600; @@ -518,7 +519,7 @@ WalletService.prototype.addAccess = function(opts, cb) { return cb(Errors.NOT_AUTHORIZED); } - if (copayer.requestPubKeys.length > MAX_KEYS) + if (copayer.requestPubKeys.length > WalletService.MAX_KEYS) return cb(Errors.TOO_MANY_KEYS); self._addKeyToCopayer(wallet, copayer, opts, cb); From 2f990f42a8cf1b7b4a8fcab8b90f93537d6dc44f Mon Sep 17 00:00:00 2001 From: Ivan Socolsky Date: Tue, 27 Oct 2015 15:38:11 -0300 Subject: [PATCH 02/10] test --- lib/errors/errordefinitions.js | 1 + lib/server.js | 4 +++- test/integration/server.js | 26 ++++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/lib/errors/errordefinitions.js b/lib/errors/errordefinitions.js index 93fc6e3..b701509 100644 --- a/lib/errors/errordefinitions.js +++ b/lib/errors/errordefinitions.js @@ -17,6 +17,7 @@ var errors = { INVALID_ADDRESS: 'Invalid address', KEY_IN_COPAYER: 'Key already registered', LOCKED_FUNDS: 'Funds are locked by pending transaction proposals', + MAIN_ADDRESS_GAP_REACHED: 'Maximum number of consecutive addresses without activity reached', NOT_AUTHORIZED: 'Not authorized', TOO_MANY_KEYS: 'Too many keys registered', TX_ALREADY_BROADCASTED: 'The transaction proposal is already broadcasted', diff --git a/lib/server.js b/lib/server.js index 909cb81..622afdd 100644 --- a/lib/server.js +++ b/lib/server.js @@ -63,9 +63,11 @@ WalletService.BACKOFF_OFFSET = 3; // Time a copayer need to wait to create a new TX after her tx previous proposal we rejected. (incremental). in Minutes. WalletService.BACKOFF_TIME = 2; +WalletService.MAX_MAIN_ADDRESS_GAP = 20; + // Fund scanning parameters WalletService.SCAN_CONFIG = { - maxGap: 20, + maxGap: WalletService.MAX_MAIN_ADDRESS_GAP, }; WalletService.FEE_LEVELS = [{ diff --git a/test/integration/server.js b/test/integration/server.js index 9deb40d..93b2331 100644 --- a/test/integration/server.js +++ b/test/integration/server.js @@ -1667,6 +1667,32 @@ describe('Wallet service', function() { }); }); }); + + it.only('should fail to create more consecutive addresses with no activity than allowed', function(done) { + var MAX_MAIN_ADDRESS_GAP_old = WalletService.MAX_MAIN_ADDRESS_GAP; + var n = WalletService.MAX_MAIN_ADDRESS_GAP = 2; + helpers.stubAddressActivity([]); + async.map(_.range(n), function(i, next) { + server.createAddress({}, next); + }, function(err, addresses) { + addresses.length.should.equal(n); + + server.createAddress({}, function(err, address) { + should.exist(err); + should.not.exist(address); + err.code.should.equal('MAIN_ADDRESS_GAP_REACHED'); + server.createAddress({ + ignoreMaxGap: true + }, function(err, address) { + should.not.exist(err); + should.exist(address); + address.path.should.equal('m/0/' + n); + WalletService.MAX_MAIN_ADDRESS_GAP = MAX_MAIN_ADDRESS_GAP_old; + done(); + }); + }); + }); + }); }); describe('1-of-1 (BIP44 & P2PKH)', function() { From a8a6962c7499868bb3314fe5b2ed13ea63b79107 Mon Sep 17 00:00:00 2001 From: Ivan Socolsky Date: Tue, 27 Oct 2015 16:00:29 -0300 Subject: [PATCH 03/10] check activity of previous addresses before generating a new one --- lib/blockchainexplorers/insight.js | 42 +++++++++++++++++++++--------- lib/server.js | 37 +++++++++++++++++++++----- test/integration/server.js | 2 +- 3 files changed, 61 insertions(+), 20 deletions(-) diff --git a/lib/blockchainexplorers/insight.js b/lib/blockchainexplorers/insight.js index cec4e70..ce98d13 100644 --- a/lib/blockchainexplorers/insight.js +++ b/lib/blockchainexplorers/insight.js @@ -113,21 +113,39 @@ Insight.prototype.getTransactions = function(addresses, from, to, cb) { }); }; -Insight.prototype.getAddressActivity = function(address, cb) { - var url = this.url + this.apiPrefix + '/addr/' + address; - var args = { - method: 'GET', - url: url, - json: true, +Insight.prototype.getAddressActivity = function(addresses, cb) { + function getOneAddressActivity(address, cb) { + var url = this.url + this.apiPrefix + '/addr/' + address; + var args = { + method: 'GET', + url: url, + json: true, + }; + + request(args, function(err, res, result) { + if (res && res.statusCode == 404) return cb(); + if (err || res.statusCode !== 200) + return cb(_parseErr(err, res)); + + var nbTxs = result.unconfirmedTxApperances + result.txApperances; + return cb(null, nbTxs > 0); + }); }; - request(args, function(err, res, result) { - if (res && res.statusCode == 404) return cb(); - if (err || res.statusCode !== 200) - return cb(_parseErr(err, res)); + addresses = [].concat(addresses); + var activityFound = false; + var i = 0; - var nbTxs = result.unconfirmedTxApperances + result.txApperances; - return cb(null, nbTxs > 0); + async.until(function() { + return activityFound; + }, function(next) { + getOneAddressActivity(addresses[i++], function(err, res) { + if (err) return next(err); + activityFound = !!res; + return next(); + }); + }, function(err) { + return cb(err, activityFound); }); }; diff --git a/lib/server.js b/lib/server.js index 622afdd..8c80fd2 100644 --- a/lib/server.js +++ b/lib/server.js @@ -692,29 +692,52 @@ WalletService.prototype.getPreferences = function(opts, cb) { }); }; +WalletService.prototype._canCreateAddress = function(ignoreMaxGap, cb) { + var self = this; + + if (ignoreMaxGap) return cb(null, true); + self.storage.fetchAddresses(self.walletId, function(err, addresses) { + if (err) return cb(err); + var latestAddresses = _.takeRight(_.reject(addresses, { + isChange: true + }), WalletService.MAX_MAIN_ADDRESS_GAP); + if (latestAddresses.length < WalletService.MAX_MAIN_ADDRESS_GAP) return cb(null, true); + + var bc = self._getBlockchainExplorer(latestAddresses[0].network); + bc.getAddressActivity(latestAddresses, cb); + }); +}; /** * Creates a new address. * @param {Object} opts + * @param {Boolean} [opts.ignoreMaxGap=false] - Ignore constraint of maximum number of consecutive addresses without activity * @returns {Address} address */ WalletService.prototype.createAddress = function(opts, cb) { var self = this; + opts = opts || {}; + self._runLocked(cb, function(cb) { self.getWallet({}, function(err, wallet) { if (err) return cb(err); if (!wallet.isComplete()) return cb(Errors.WALLET_NOT_COMPLETE); - var address = wallet.createAddress(false); - - self.storage.storeAddressAndWallet(wallet, address, function(err) { + self._canCreateAddress(opts.ignoreMaxGap, function(err, canCreate) { if (err) return cb(err); + if (!canCreate) return cb(Errors.MAIN_ADDRESS_GAP_REACHED); - self._notify('NewAddress', { - address: address.address, - }, function() { - return cb(null, address); + var address = wallet.createAddress(false); + + self.storage.storeAddressAndWallet(wallet, address, function(err) { + if (err) return cb(err); + + self._notify('NewAddress', { + address: address.address, + }, function() { + return cb(null, address); + }); }); }); }); diff --git a/test/integration/server.js b/test/integration/server.js index 93b2331..11b9e9b 100644 --- a/test/integration/server.js +++ b/test/integration/server.js @@ -1668,7 +1668,7 @@ describe('Wallet service', function() { }); }); - it.only('should fail to create more consecutive addresses with no activity than allowed', function(done) { + it('should fail to create more consecutive addresses with no activity than allowed', function(done) { var MAX_MAIN_ADDRESS_GAP_old = WalletService.MAX_MAIN_ADDRESS_GAP; var n = WalletService.MAX_MAIN_ADDRESS_GAP = 2; helpers.stubAddressActivity([]); From cf37d013b64052dc3611540821c1e52552e72cc6 Mon Sep 17 00:00:00 2001 From: Ivan Socolsky Date: Tue, 27 Oct 2015 16:22:42 -0300 Subject: [PATCH 04/10] changed stub methods & more tests --- lib/server.js | 3 +- test/integration/server.js | 66 ++++++++++++++++++++++---------------- 2 files changed, 40 insertions(+), 29 deletions(-) diff --git a/lib/server.js b/lib/server.js index 8c80fd2..b4a9bc7 100644 --- a/lib/server.js +++ b/lib/server.js @@ -696,6 +696,7 @@ WalletService.prototype._canCreateAddress = function(ignoreMaxGap, cb) { var self = this; if (ignoreMaxGap) return cb(null, true); + self.storage.fetchAddresses(self.walletId, function(err, addresses) { if (err) return cb(err); var latestAddresses = _.takeRight(_.reject(addresses, { @@ -704,7 +705,7 @@ WalletService.prototype._canCreateAddress = function(ignoreMaxGap, cb) { if (latestAddresses.length < WalletService.MAX_MAIN_ADDRESS_GAP) return cb(null, true); var bc = self._getBlockchainExplorer(latestAddresses[0].network); - bc.getAddressActivity(latestAddresses, cb); + bc.getAddressActivity(_.pluck(latestAddresses, 'address'), cb); }); }; diff --git a/test/integration/server.js b/test/integration/server.js index 11b9e9b..e5d86e9 100644 --- a/test/integration/server.js +++ b/test/integration/server.js @@ -237,8 +237,8 @@ helpers.stubFeeLevels = function(levels) { }; helpers.stubAddressActivity = function(activeAddresses) { - blockchainExplorer.getAddressActivity = function(address, cb) { - return cb(null, _.contains(activeAddresses, address)); + blockchainExplorer.getAddressActivity = function(addresses, cb) { + return cb(null, _.intersection(activeAddresses, [].concat(addresses)).length > 0); }; }; @@ -1667,32 +1667,6 @@ describe('Wallet service', function() { }); }); }); - - it('should fail to create more consecutive addresses with no activity than allowed', function(done) { - var MAX_MAIN_ADDRESS_GAP_old = WalletService.MAX_MAIN_ADDRESS_GAP; - var n = WalletService.MAX_MAIN_ADDRESS_GAP = 2; - helpers.stubAddressActivity([]); - async.map(_.range(n), function(i, next) { - server.createAddress({}, next); - }, function(err, addresses) { - addresses.length.should.equal(n); - - server.createAddress({}, function(err, address) { - should.exist(err); - should.not.exist(address); - err.code.should.equal('MAIN_ADDRESS_GAP_REACHED'); - server.createAddress({ - ignoreMaxGap: true - }, function(err, address) { - should.not.exist(err); - should.exist(address); - address.path.should.equal('m/0/' + n); - WalletService.MAX_MAIN_ADDRESS_GAP = MAX_MAIN_ADDRESS_GAP_old; - done(); - }); - }); - }); - }); }); describe('1-of-1 (BIP44 & P2PKH)', function() { @@ -1741,6 +1715,42 @@ describe('Wallet service', function() { done(); }); }); + + it('should fail to create more consecutive addresses with no activity than allowed', function(done) { + var MAX_MAIN_ADDRESS_GAP_old = WalletService.MAX_MAIN_ADDRESS_GAP; + WalletService.MAX_MAIN_ADDRESS_GAP = 2; + helpers.stubAddressActivity([]); + async.map(_.range(2), function(i, next) { + server.createAddress({}, next); + }, function(err, addresses) { + addresses.length.should.equal(2); + + server.createAddress({}, function(err, address) { + should.exist(err); + should.not.exist(address); + err.code.should.equal('MAIN_ADDRESS_GAP_REACHED'); + server.createAddress({ + ignoreMaxGap: true + }, function(err, address) { + should.not.exist(err); + should.exist(address); + address.path.should.equal('m/0/2'); + + helpers.stubAddressActivity([ + '1GdXraZ1gtoVAvBh49D4hK9xLm6SKgesoE', // m/0/2 + ]); + server.createAddress({}, function(err, address) { + should.not.exist(err); + should.exist(address); + address.path.should.equal('m/0/3'); + + WalletService.MAX_MAIN_ADDRESS_GAP = MAX_MAIN_ADDRESS_GAP_old; + done(); + }); + }); + }); + }); + }); }); }); From 89575da4e83ba92a54dc6da80a4c58f50b415da3 Mon Sep 17 00:00:00 2001 From: Ivan Socolsky Date: Tue, 27 Oct 2015 16:51:15 -0300 Subject: [PATCH 05/10] optimize activity check for single address --- lib/blockchainexplorers/insight.js | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/lib/blockchainexplorers/insight.js b/lib/blockchainexplorers/insight.js index ce98d13..3f7f384 100644 --- a/lib/blockchainexplorers/insight.js +++ b/lib/blockchainexplorers/insight.js @@ -1,6 +1,7 @@ 'use strict'; var _ = require('lodash'); +var async = require('async'); var $ = require('preconditions').singleton(); var log = require('npmlog'); log.debug = log.verbose; @@ -114,8 +115,10 @@ Insight.prototype.getTransactions = function(addresses, from, to, cb) { }; Insight.prototype.getAddressActivity = function(addresses, cb) { - function getOneAddressActivity(address, cb) { - var url = this.url + this.apiPrefix + '/addr/' + address; + var self = this; + + function getOneAddressActivity(address, cb2) { + var url = self.url + self.apiPrefix + '/addr/' + address; var args = { method: 'GET', url: url, @@ -123,21 +126,26 @@ Insight.prototype.getAddressActivity = function(addresses, cb) { }; request(args, function(err, res, result) { - if (res && res.statusCode == 404) return cb(); + if (res && res.statusCode == 404) return cb2(); if (err || res.statusCode !== 200) - return cb(_parseErr(err, res)); + return cb2(_parseErr(err, res)); var nbTxs = result.unconfirmedTxApperances + result.txApperances; - return cb(null, nbTxs > 0); + return cb2(null, nbTxs > 0); }); }; addresses = [].concat(addresses); + + if (addresses.length == 1) { + return getOneAddressActivity(addresses[0], cb); + } + var activityFound = false; var i = 0; async.until(function() { - return activityFound; + return i == addresses.length || activityFound; }, function(next) { getOneAddressActivity(addresses[i++], function(err, res) { if (err) return next(err); From 0b43b3b85ceeb910e7b028ed2d67e20dcacaec2d Mon Sep 17 00:00:00 2001 From: Ivan Socolsky Date: Wed, 28 Oct 2015 13:23:13 -0300 Subject: [PATCH 06/10] cache address activity --- lib/model/address.js | 2 ++ lib/server.js | 25 +++++++++++++++++++++++-- lib/storage.js | 11 +++++++++++ 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/lib/model/address.js b/lib/model/address.js index a286187..c6af424 100644 --- a/lib/model/address.js +++ b/lib/model/address.js @@ -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; }; diff --git a/lib/server.js b/lib/server.js index b4a9bc7..1350148 100644 --- a/lib/server.js +++ b/lib/server.js @@ -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); + }); + }); }); }; diff --git a/lib/storage.js b/lib/storage.js index 983737f..e525615 100644 --- a/lib/storage.js +++ b/lib/storage.js @@ -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; From 64a48db99155c4164ebd2d30063da973dfdfb33f Mon Sep 17 00:00:00 2001 From: Ivan Socolsky Date: Wed, 28 Oct 2015 13:25:32 -0300 Subject: [PATCH 07/10] check single address activity on blockchain --- lib/blockchainexplorers/insight.js | 48 ++++++++---------------------- test/integration/server.js | 4 +-- 2 files changed, 14 insertions(+), 38 deletions(-) diff --git a/lib/blockchainexplorers/insight.js b/lib/blockchainexplorers/insight.js index 3f7f384..950930f 100644 --- a/lib/blockchainexplorers/insight.js +++ b/lib/blockchainexplorers/insight.js @@ -1,7 +1,6 @@ 'use strict'; var _ = require('lodash'); -var async = require('async'); var $ = require('preconditions').singleton(); var log = require('npmlog'); log.debug = log.verbose; @@ -114,46 +113,23 @@ Insight.prototype.getTransactions = function(addresses, from, to, cb) { }); }; -Insight.prototype.getAddressActivity = function(addresses, cb) { +Insight.prototype.getAddressActivity = function(address, cb) { var self = this; - function getOneAddressActivity(address, cb2) { - var url = self.url + self.apiPrefix + '/addr/' + address; - var args = { - method: 'GET', - url: url, - json: true, - }; - - request(args, function(err, res, result) { - if (res && res.statusCode == 404) return cb2(); - if (err || res.statusCode !== 200) - return cb2(_parseErr(err, res)); - - var nbTxs = result.unconfirmedTxApperances + result.txApperances; - return cb2(null, nbTxs > 0); - }); + var url = self.url + self.apiPrefix + '/addr/' + address; + var args = { + method: 'GET', + url: url, + json: true, }; - addresses = [].concat(addresses); + request(args, function(err, res, result) { + if (res && res.statusCode == 404) return cb(); + if (err || res.statusCode !== 200) + return cb(_parseErr(err, res)); - if (addresses.length == 1) { - return getOneAddressActivity(addresses[0], cb); - } - - var activityFound = false; - var i = 0; - - async.until(function() { - return i == addresses.length || activityFound; - }, function(next) { - getOneAddressActivity(addresses[i++], function(err, res) { - if (err) return next(err); - activityFound = !!res; - return next(); - }); - }, function(err) { - return cb(err, activityFound); + var nbTxs = result.unconfirmedTxApperances + result.txApperances; + return cb(null, nbTxs > 0); }); }; diff --git a/test/integration/server.js b/test/integration/server.js index e5d86e9..c5dcc97 100644 --- a/test/integration/server.js +++ b/test/integration/server.js @@ -237,8 +237,8 @@ helpers.stubFeeLevels = function(levels) { }; helpers.stubAddressActivity = function(activeAddresses) { - blockchainExplorer.getAddressActivity = function(addresses, cb) { - return cb(null, _.intersection(activeAddresses, [].concat(addresses)).length > 0); + blockchainExplorer.getAddressActivity = function(address, cb) { + return cb(null, _.contains(activeAddresses, address)); }; }; From ff1ca22825869e936f7d6ad5a7f6caee329e6a8b Mon Sep 17 00:00:00 2001 From: Ivan Socolsky Date: Wed, 28 Oct 2015 13:42:38 -0300 Subject: [PATCH 08/10] test cache --- test/integration/server.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/test/integration/server.js b/test/integration/server.js index c5dcc97..73201dd 100644 --- a/test/integration/server.js +++ b/test/integration/server.js @@ -1751,6 +1751,29 @@ describe('Wallet service', function() { }); }); }); + + it('should cache address activity', function(done) { + var MAX_MAIN_ADDRESS_GAP_old = WalletService.MAX_MAIN_ADDRESS_GAP; + WalletService.MAX_MAIN_ADDRESS_GAP = 2; + helpers.stubAddressActivity([]); + async.map(_.range(2), function(i, next) { + server.createAddress({}, next); + }, function(err, addresses) { + addresses.length.should.equal(2); + + helpers.stubAddressActivity([addresses[1].address]); + var getAddressActivitySpy = sinon.spy(blockchainExplorer, 'getAddressActivity'); + server.createAddress({}, function(err, address) { + should.not.exist(err); + server.createAddress({}, function(err, address) { + should.not.exist(err); + getAddressActivitySpy.callCount.should.equal(1); + WalletService.MAX_MAIN_ADDRESS_GAP = MAX_MAIN_ADDRESS_GAP_old; + done(); + }); + }); + }); + }); }); }); From 1872f07eed6b194789b5ea302b7e7c62a81a86fa Mon Sep 17 00:00:00 2001 From: Ivan Socolsky Date: Thu, 29 Oct 2015 15:28:11 -0300 Subject: [PATCH 09/10] do not perform check on v1 API --- lib/expressapp.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/expressapp.js b/lib/expressapp.js index aafceda..a306437 100644 --- a/lib/expressapp.js +++ b/lib/expressapp.js @@ -259,8 +259,19 @@ ExpressApp.prototype.start = function(opts, cb) { }); }); - + // DEPRECATED router.post('/v1/addresses/', function(req, res) { + getServerWithAuth(req, res, function(server) { + server.createAddress({ + ignoreMaxGap: true + }, function(err, address) { + if (err) return returnError(err, res, req); + res.json(address); + }); + }); + }); + + router.post('/v2/addresses/', function(req, res) { getServerWithAuth(req, res, function(server) { server.createAddress(req.body, function(err, address) { if (err) return returnError(err, res, req); From 69dda0ed6a67eb82a201f867e768aebee252fdb5 Mon Sep 17 00:00:00 2001 From: Ivan Socolsky Date: Thu, 29 Oct 2015 16:35:30 -0300 Subject: [PATCH 10/10] remove unused walletId param --- lib/server.js | 2 +- lib/storage.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/server.js b/lib/server.js index 1350148..9be8a7c 100644 --- a/lib/server.js +++ b/lib/server.js @@ -723,7 +723,7 @@ WalletService.prototype._canCreateAddress = function(ignoreMaxGap, cb) { var address = latestAddresses[i]; address.hasActivity = true; - self.storage.storeAddress(self.walletId, address, function(err) { + self.storage.storeAddress(address, function(err) { return cb(err, true); }); }); diff --git a/lib/storage.js b/lib/storage.js index e525615..ebbdf14 100644 --- a/lib/storage.js +++ b/lib/storage.js @@ -383,7 +383,7 @@ Storage.prototype.fetchAddresses = function(walletId, cb) { }); }; -Storage.prototype.storeAddress = function(walletId, address, cb) { +Storage.prototype.storeAddress = function(address, cb) { var self = this; self.db.collection(collections.ADDRESSES).update({