|
@ -855,44 +855,53 @@ WalletService.prototype._getUtxosForAddresses = function(addresses, cb) { |
|
|
}); |
|
|
}); |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
WalletService.prototype._getUtxosForCurrentWallet = function(cb) { |
|
|
WalletService.prototype._getUtxosForCurrentWallet = function(addresses, cb) { |
|
|
var self = this; |
|
|
var self = this; |
|
|
|
|
|
|
|
|
function utxoKey(utxo) { |
|
|
function utxoKey(utxo) { |
|
|
return utxo.txid + '|' + utxo.vout |
|
|
return utxo.txid + '|' + utxo.vout |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
// Get addresses for this wallet
|
|
|
async.waterfall([ |
|
|
self.storage.fetchAddresses(self.walletId, function(err, addresses) { |
|
|
|
|
|
if (err) return cb(err); |
|
|
|
|
|
|
|
|
|
|
|
var addressStrs = _.pluck(addresses, 'address'); |
|
|
function(next) { |
|
|
self._getUtxosForAddresses(addressStrs, function(err, utxos) { |
|
|
if (_.isArray(addresses) && addresses.length > 0) { |
|
|
if (err) return cb(err); |
|
|
next(null, addresses); |
|
|
if (utxos.length == 0) return cb(null, []); |
|
|
} else { |
|
|
|
|
|
self.storage.fetchAddresses(self.walletId, next); |
|
|
|
|
|
} |
|
|
|
|
|
}, |
|
|
|
|
|
function(addresses, next) { |
|
|
|
|
|
if (addresses.length == 0) return next(null, []); |
|
|
|
|
|
|
|
|
self.getPendingTxs({}, function(err, txps) { |
|
|
var addressStrs = _.pluck(addresses, 'address'); |
|
|
if (err) return cb(err); |
|
|
self._getUtxosForAddresses(addressStrs, function(err, utxos) { |
|
|
|
|
|
if (err) return next(err); |
|
|
|
|
|
if (utxos.length == 0) return next(null, []); |
|
|
|
|
|
|
|
|
var lockedInputs = _.map(_.flatten(_.pluck(txps, 'inputs')), utxoKey); |
|
|
self.getPendingTxs({}, function(err, txps) { |
|
|
var utxoIndex = _.indexBy(utxos, utxoKey); |
|
|
if (err) return next(err); |
|
|
_.each(lockedInputs, function(input) { |
|
|
|
|
|
if (utxoIndex[input]) { |
|
|
|
|
|
utxoIndex[input].locked = true; |
|
|
|
|
|
} |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
// Needed for the clients to sign UTXOs
|
|
|
var lockedInputs = _.map(_.flatten(_.pluck(txps, 'inputs')), utxoKey); |
|
|
var addressToPath = _.indexBy(addresses, 'address'); |
|
|
var utxoIndex = _.indexBy(utxos, utxoKey); |
|
|
_.each(utxos, function(utxo) { |
|
|
_.each(lockedInputs, function(input) { |
|
|
utxo.path = addressToPath[utxo.address].path; |
|
|
if (utxoIndex[input]) { |
|
|
utxo.publicKeys = addressToPath[utxo.address].publicKeys; |
|
|
utxoIndex[input].locked = true; |
|
|
}); |
|
|
} |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
// Needed for the clients to sign UTXOs
|
|
|
|
|
|
var addressToPath = _.indexBy(addresses, 'address'); |
|
|
|
|
|
_.each(utxos, function(utxo) { |
|
|
|
|
|
utxo.path = addressToPath[utxo.address].path; |
|
|
|
|
|
utxo.publicKeys = addressToPath[utxo.address].publicKeys; |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
return cb(null, utxos); |
|
|
return next(null, utxos); |
|
|
|
|
|
}); |
|
|
}); |
|
|
}); |
|
|
}); |
|
|
}, |
|
|
}); |
|
|
], cb); |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
@ -907,7 +916,7 @@ WalletService.prototype.getUtxos = function(opts, cb) { |
|
|
opts = opts || {}; |
|
|
opts = opts || {}; |
|
|
|
|
|
|
|
|
if (_.isUndefined(opts.addresses)) { |
|
|
if (_.isUndefined(opts.addresses)) { |
|
|
self._getUtxosForCurrentWallet(cb); |
|
|
self._getUtxosForCurrentWallet(null, cb); |
|
|
} else { |
|
|
} else { |
|
|
self._getUtxosForAddresses(opts.addresses, cb); |
|
|
self._getUtxosForAddresses(opts.addresses, cb); |
|
|
} |
|
|
} |
|
@ -981,7 +990,7 @@ WalletService.prototype.getBalance = function(opts, cb) { |
|
|
if (err) { |
|
|
if (err) { |
|
|
log.error('Could not compute size of send max transaction', err); |
|
|
log.error('Could not compute size of send max transaction', err); |
|
|
} |
|
|
} |
|
|
balance.totalBytesToSendMax = size || null; |
|
|
balance.totalBytesToSendMax = _.isNumber(size) ? size : null; |
|
|
return cb(null, balance); |
|
|
return cb(null, balance); |
|
|
}); |
|
|
}); |
|
|
}); |
|
|
}); |
|
@ -1600,7 +1609,7 @@ WalletService.prototype._broadcastRawTx = function(network, raw, cb) { |
|
|
bc.broadcast(raw, function(err, txid) { |
|
|
bc.broadcast(raw, function(err, txid) { |
|
|
if (err) return cb(err); |
|
|
if (err) return cb(err); |
|
|
return cb(null, txid); |
|
|
return cb(null, txid); |
|
|
}) |
|
|
}); |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|