diff --git a/lib/bcoin/txdb.js b/lib/bcoin/txdb.js index 00ccee4b..d37ff92b 100644 --- a/lib/bcoin/txdb.js +++ b/lib/bcoin/txdb.js @@ -940,17 +940,22 @@ TXPool.prototype._unconfirm = function unconfirm(tx, map, callback, force) { }); }; -TXPool.prototype.getTXHashes = function getTXHashes(address, callback) { +TXPool.prototype.getAllHashes = function getAllHashes(address, callback) { var self = this; var prefix = this.prefix + '/'; var txs = []; var iter; + if (typeof address === 'function') { + callback = address; + address = null; + } + callback = utils.ensure(callback); if (Array.isArray(address)) { return utils.forEachSerial(address, function(address, next) { - self.getTXHashes(address, function(err, tx) { + self.getAllHashes(address, function(err, tx) { if (err) return next(err); @@ -1009,6 +1014,11 @@ TXPool.prototype.getPendingHashes = function getPendingHashes(address, callback) var txs = []; var iter; + if (typeof address === 'function') { + callback = address; + address = null; + } + callback = utils.ensure(callback); if (Array.isArray(address)) { @@ -1067,17 +1077,22 @@ TXPool.prototype.getPendingHashes = function getPendingHashes(address, callback) })(); }; -TXPool.prototype.getCoinIDs = function getCoinIDs(address, callback) { +TXPool.prototype.getCoinHashes = function getCoinHashes(address, callback) { var self = this; var prefix = this.prefix + '/'; var coins = []; var iter; + if (typeof address === 'function') { + callback = address; + address = null; + } + callback = utils.ensure(callback); if (Array.isArray(address)) { return utils.forEachSerial(address, function(address, next) { - self.getCoinIDs(address, function(err, coin) { + self.getCoinHashes(address, function(err, coin) { if (err) return next(err); @@ -1089,15 +1104,17 @@ TXPool.prototype.getCoinIDs = function getCoinIDs(address, callback) { if (err) return callback(err); - coins = utils.uniqs(coins); - return callback(null, coins); }); } iter = this.db.iterator({ - gte: address ? prefix + 'u/a/' + address : prefix + 'u/t', - lte: address ? prefix + 'u/a/' + address + '~' : prefix + 'u/t~', + gte: address + ? prefix + 'u/a/' + address + : prefix + 'u/t', + lte: address + ? prefix + 'u/a/' + address + '~' + : prefix + 'u/t~', keys: true, values: false, fillCache: false, @@ -1120,10 +1137,12 @@ TXPool.prototype.getCoinIDs = function getCoinIDs(address, callback) { }); } + key = key.split('/'); + if (address) - coins.push(key.split('/').slice(4).join('/')); + coins.push([key[4], +key[5]]); else - coins.push(key.split('/').slice(3).join('/')); + coins.push([key[3], +key[4]]); next(); }); @@ -1135,6 +1154,11 @@ TXPool.prototype.getHeightRangeHashes = function getHeightRangeHashes(address, o var txs = []; var iter; + if (typeof address === 'function') { + callback = address; + address = null; + } + callback = utils.ensure(callback); iter = this.db.iterator({ @@ -1187,6 +1211,11 @@ TXPool.prototype.getRangeHashes = function getRangeHashes(address, options, call var txs = []; var iter; + if (typeof address === 'function') { + callback = address; + address = null; + } + callback = utils.ensure(callback); iter = this.db.iterator({ @@ -1234,6 +1263,11 @@ TXPool.prototype.getRange = function getLast(address, options, callback) { var self = this; var txs = []; + if (typeof address === 'function') { + callback = address; + address = null; + } + return this.getRangeHashes(address, options, function(err, hashes) { if (err) return callback(err); @@ -1260,6 +1294,12 @@ TXPool.prototype.getRange = function getLast(address, options, callback) { }; TXPool.prototype.getLast = function getLast(address, limit, callback) { + if (typeof limit === 'function') { + callback = limit; + limit = address; + address = null; + } + return this.getRange(address, { start: 0, end: 0xffffffff, @@ -1268,11 +1308,16 @@ TXPool.prototype.getLast = function getLast(address, limit, callback) { }, callback); }; -TXPool.prototype.getAllByAddress = function getAllByAddress(address, callback) { +TXPool.prototype.getAll = function getAll(address, callback) { var self = this; var txs = []; - return this.getTXHashes(address, function(err, hashes) { + if (typeof address === 'function') { + callback = address; + address = null; + } + + return this.getAllHashes(address, function(err, hashes) { if (err) return callback(err); @@ -1298,7 +1343,12 @@ TXPool.prototype.getAllByAddress = function getAllByAddress(address, callback) { }; TXPool.prototype.getLastTime = function getLastTime(address, callback) { - return this.getAllByAddress(address, function(err, txs) { + if (typeof address === 'function') { + callback = address; + address = null; + } + + return this.getAll(address, function(err, txs) { var lastTs, lastHeight; if (err) @@ -1319,10 +1369,15 @@ TXPool.prototype.getLastTime = function getLastTime(address, callback) { }); }; -TXPool.prototype.getPendingByAddress = function getPendingByAddress(address, callback) { +TXPool.prototype.getPending = function getPending(address, callback) { var self = this; var txs = []; + if (typeof address === 'function') { + callback = address; + address = null; + } + return this.getPendingHashes(address, function(err, hashes) { if (err) return callback(err); @@ -1348,17 +1403,21 @@ TXPool.prototype.getPendingByAddress = function getPendingByAddress(address, cal }); }; -TXPool.prototype.getCoinsByAddress = function getCoinsByAddress(address, callback) { +TXPool.prototype.getCoins = function getCoins(address, callback) { var self = this; var coins = []; - return this.getCoinIDs(address, function(err, map) { + if (typeof address === 'function') { + callback = address; + address = null; + } + + return this.getCoinHashes(address, function(err, hashes) { if (err) return callback(err); - utils.forEachSerial(map, function(id, next) { - var parts = id.split('/'); - self.getCoin(parts[0], +parts[1], function(err, coin) { + utils.forEachSerial(hashes, function(key, next) { + self.getCoin(key[0], key[1], function(err, coin) { if (err) return callback(err); @@ -1458,14 +1517,11 @@ TXPool.prototype.fillCoins = function fillCoins(tx, callback) { TXPool.prototype.getTX = function getTX(hash, callback) { var prefix = this.prefix + '/'; - var id = prefix + 't/t/' + hash; + var key = prefix + 't/t/' + hash; - this.db.get(id, function(err, tx) { - if (err) { - if (err.type === 'NotFoundError') - return callback(); + this.db.get(key, function(err, tx) { + if (err && err.type !== 'NotFoundError') return callback(err); - } if (!tx) return callback(); @@ -1482,14 +1538,11 @@ TXPool.prototype.getTX = function getTX(hash, callback) { TXPool.prototype.getCoin = function getCoin(hash, index, callback) { var prefix = this.prefix + '/'; - var id = prefix + 'u/t/' + hash + '/' + index; + var key = prefix + 'u/t/' + hash + '/' + index; - this.db.get(id, function(err, coin) { - if (err) { - if (err.type === 'NotFoundError') - return callback(); + this.db.get(key, function(err, coin) { + if (err && err.type !== 'NotFoundError') return callback(err); - } if (!coin) return callback(); @@ -1506,37 +1559,48 @@ TXPool.prototype.getCoin = function getCoin(hash, index, callback) { }); }; -TXPool.prototype.getBalanceByAddress = function getBalanceByAddress(address, callback) { - return this.getCoinsByAddress(address, function(err, coins) { +TXPool.prototype.getBalance = function getBalance(address, callback) { + var confirmed = new bn(0); + var unconfirmed = new bn(0); + var i; + + if (typeof address === 'function') { + callback = address; + address = null; + } + + return this.getCoins(address, function(err, coins) { if (err) return callback(err); - coins = coins.reduce(function(acc, coin) { - return acc.iadd(coin.value); - }, new bn(0)); + for (i = 0; i < coins.length; i++) { + if (coins[i].height !== -1) + confirmed.iadd(coins[i].value); + unconfirmed.iadd(coins[i].value); + } - return callback(null, coins); + return callback(null, unconfirmed, confirmed, coins); }); }; -TXPool.prototype.getAllHashes = function getAllHashes(callback) { - return this.getTXHashes(null, callback); +TXPool.prototype.getAllHashesByAddress = function getAllHashesByAddress(address, callback) { + return this.getAllHashes(address, callback); }; -TXPool.prototype.getAll = function getAll(callback) { - return this.getAllByAddress(null, callback); +TXPool.prototype.getAllByAddress = function getAllByAddress(address, callback) { + return this.getAll(address, callback); }; -TXPool.prototype.getCoins = function getCoins(callback) { - return this.getCoinsByAddress(null, callback); +TXPool.prototype.getCoinsByAddress = function getCoins(address, callback) { + return this.getCoins(address, callback); }; -TXPool.prototype.getPending = function getPending(callback) { - return this.getPendingByAddress(null, callback); +TXPool.prototype.getPendingByAddress = function getPendingByAddress(address, callback) { + return this.getPending(address, callback); }; -TXPool.prototype.getBalance = function getBalance(callback) { - return this.getBalanceByAddress(null, callback); +TXPool.prototype.getBalanceByAddress = function getBalanceByAddress(address, callback) { + return this.getBalance(address, callback); }; TXPool.prototype.addUnchecked = function addUnchecked(tx, callback, force) { diff --git a/lib/bcoin/walletdb.js b/lib/bcoin/walletdb.js index 442d6bdb..05a6b32b 100644 --- a/lib/bcoin/walletdb.js +++ b/lib/bcoin/walletdb.js @@ -85,8 +85,8 @@ WalletDB.prototype._init = function _init() { return; this.db = bcoin.ldb('wallet', { - cacheSize: 4 * 1024 * 1024, - writeBufferSize: 4 * 1024 * 1024 + cacheSize: 8 << 20, + writeBufferSize: 4 << 20 }); this.db.open(function(err) { @@ -101,7 +101,7 @@ WalletDB.prototype._init = function _init() { indexExtra: true, indexAddress: true, mapAddress: true, - verify: true + verify: this.options.verify }); this.tx.on('error', function(err) { diff --git a/test/wallet-test.js b/test/wallet-test.js index 720a54c0..6fa137fa 100644 --- a/test/wallet-test.js +++ b/test/wallet-test.js @@ -25,6 +25,7 @@ var dummyInput = { describe('Wallet', function() { var wdb = new bcoin.walletdb(); + wdb.tx.options.verify = true; it('should generate new key and address', function() { var w = bcoin.wallet();