rpc: refactor listunspent.

This commit is contained in:
Christopher Jeffrey 2016-08-11 03:04:47 -07:00
parent e910147544
commit e098fdeca4
No known key found for this signature in database
GPG Key ID: 8962AB9DE6666BBD

View File

@ -3365,8 +3365,7 @@ RPC.prototype.listunspent = function listunspent(args, callback) {
var minDepth = 1; var minDepth = 1;
var maxDepth = 9999999; var maxDepth = 9999999;
var out = []; var out = [];
var map = {}; var i, addresses, addrs, depth, address, hash;
var i, addresses, coin, depth, address, hash, ring;
if (args.help || args.length > 3) { if (args.help || args.length > 3) {
return callback(new RPCError('listunspent' return callback(new RPCError('listunspent'
@ -3379,57 +3378,51 @@ RPC.prototype.listunspent = function listunspent(args, callback) {
if (args.length > 1) if (args.length > 1)
maxDepth = Number(args[1]); maxDepth = Number(args[1]);
if (args.length > 2)
addrs = args[2];
if (!utils.isNumber(minDepth) || !utils.isNumber(maxDepth)) if (!utils.isNumber(minDepth) || !utils.isNumber(maxDepth))
return callback(new RPCError('Invalid parameter.')); return callback(new RPCError('Invalid parameter.'));
if (Array.isArray(args[2])) { if (Array.isArray(addrs)) {
addresses = true; addresses = {};
utils.forEachSerial(args[2], function(address, next) { for (i = 0; i < addrs.length; i++) {
hash = bcoin.address.getHash(String(address), 'hex'); address = String(addrs[i]);
hash = bcoin.address.getHash(address, 'hex');
if (!hash) if (!hash)
return next(new RPCError('Invalid address.')); return callback(new RPCError('Invalid address.'));
if (map[hash]) if (addresses[hash])
return next(new RPCError('Duplicate address.')); return callback(new RPCError('Duplicate address.'));
self.wallet.getKeyring(hash, function(err, ring) { addresses[hash] = true;
if (err) }
return callback(err);
if (ring)
map[hash] = ring;
next();
});
}, function(err) {
if (err)
return callback(err);
self.wallet.getCoins(done);
});
} else {
this.wallet.getCoins(done);
} }
function done(err, coins) { this.wallet.getCoins(function(err, coins) {
if (err) if (err)
return callback(err); return callback(err);
for (i = 0; i < coins.length; i++) { utils.forEachSerial(coins, function(coin, next) {
coin = coins[i];
depth = coin.height !== -1 depth = coin.height !== -1
? self.chain.height - coin.height + 1 ? self.chain.height - coin.height + 1
: 0; : 0;
if (!(depth > minDepth && depth < maxDepth)) if (!(depth > minDepth && depth < maxDepth))
continue; return next();
address = coin.getAddress(); address = coin.getAddress();
hash = coin.getHash('hex'); hash = coin.getHash('hex');
ring = hash ? map[hash] : null;
if (addresses && !ring) if (addresses) {
continue; if (!hash || !addresses[hash])
return next();
}
self.wallet.getKeyring(hash, function(err, ring) {
if (err)
return next(err);
out.push({ out.push({
txid: utils.revHex(coin.hash), txid: utils.revHex(coin.hash),
@ -3445,10 +3438,15 @@ RPC.prototype.listunspent = function listunspent(args, callback) {
spendable: true, spendable: true,
solvable: true solvable: true
}); });
}
next();
});
}, function(err) {
if (err)
return callback(err);
callback(null, out); callback(null, out);
} });
});
}; };
RPC.prototype.lockunspent = function lockunspent(args, callback) { RPC.prototype.lockunspent = function lockunspent(args, callback) {