Merge pull request #315 from troggy/txp/exclude-locked-utxos

Allow to exclude certain UTXO from coin selection
This commit is contained in:
Ivan Socolsky 2015-08-26 19:52:29 -03:00
commit 5038569319
2 changed files with 33 additions and 2 deletions

View File

@ -917,7 +917,7 @@ WalletService.prototype.getFeeLevels = function(opts, cb) {
});
};
WalletService.prototype._selectTxInputs = function(txp, cb) {
WalletService.prototype._selectTxInputs = function(txp, utxosToExclude, cb) {
var self = this;
function sortUtxos(utxos) {
@ -941,6 +941,12 @@ WalletService.prototype._selectTxInputs = function(txp, cb) {
self.getUtxos({}, function(err, utxos) {
if (err) return cb(err);
var excludeIndex = _.reduce(utxosToExclude, function(res, val) { res[val] = val; return res; }, {});
utxos = _.reject(utxos, function(utxo) {
return excludeIndex[utxo.txid + ":" + utxo.vout];
});
var totalAmount;
var availableAmount;
@ -1167,7 +1173,7 @@ WalletService.prototype.createTx = function(opts, cb) {
txp.version = '1.0.1';
}
self._selectTxInputs(txp, function(err) {
self._selectTxInputs(txp, opts.utxosToExclude, function(err) {
if (err) return cb(err);
$.checkState(txp.inputs);

View File

@ -2429,6 +2429,31 @@ describe('Wallet service', function() {
});
});
});
it('should not use UTXO provided in utxosToExclude option', function(done) {
helpers.stubUtxos(server, wallet, [1, 2, 3], function(utxos) {
var txOpts = helpers.createSimpleProposalOpts('18PzpUFkFZE8zKWUPvfykkTxmB9oMR8qP7', 4.5, 'some message', TestData.copayers[0].privKey_1H_0);
txOpts.utxosToExclude = [utxos[1].txid + ':' + utxos[1].vout];
server.createTx(txOpts, function(err, tx) {
should.exist(err);
err.code.should.equal('INSUFFICIENT_FUNDS');
err.message.should.equal('Insufficient funds');
done();
});
});
});
it('should use non-excluded UTXOs', function(done) {
helpers.stubUtxos(server, wallet, [1, 2], function(utxos) {
var txOpts = helpers.createSimpleProposalOpts('18PzpUFkFZE8zKWUPvfykkTxmB9oMR8qP7', 0.5, 'some message', TestData.copayers[0].privKey_1H_0);
txOpts.utxosToExclude = [utxos[0].txid + ':' + utxos[0].vout];
server.createTx(txOpts, function(err, tx) {
should.not.exist(err);
tx.inputs.length.should.equal(1);
tx.inputs[0].txid.should.equal(utxos[1].txid);
tx.inputs[0].vout.should.equal(utxos[1].vout);
done();
});
});
});
});
describe('#createTx backoff time', function(done) {