test utxo confirmation priority
This commit is contained in:
parent
a8cd4fe2c6
commit
62c0fb06ef
|
@ -1376,7 +1376,6 @@ WalletService.prototype._selectTxInputs2 = function(txp, utxosToExclude, cb) {
|
||||||
};
|
};
|
||||||
|
|
||||||
function select(utxos) {
|
function select(utxos) {
|
||||||
var txpAmount = txp.getTotalAmount();
|
|
||||||
var i = 0;
|
var i = 0;
|
||||||
var total = 0;
|
var total = 0;
|
||||||
var selected = [];
|
var selected = [];
|
||||||
|
@ -1384,12 +1383,18 @@ WalletService.prototype._selectTxInputs2 = function(txp, utxosToExclude, cb) {
|
||||||
console.log('*** [server.js ln1362] ----------------------- select for amount of:', txpAmount); // TODO
|
console.log('*** [server.js ln1362] ----------------------- select for amount of:', txpAmount); // TODO
|
||||||
|
|
||||||
// TODO: fix for when fee is specified instead of feePerKb
|
// TODO: fix for when fee is specified instead of feePerKb
|
||||||
|
var txpAmount = txp.getTotalAmount();
|
||||||
var baseTxpSize = txp.getEstimatedSize();
|
var baseTxpSize = txp.getEstimatedSize();
|
||||||
var baseTxpFee = baseTxpSize * txp.feePerKb / 1000.;
|
var baseTxpFee = baseTxpSize * txp.feePerKb / 1000.;
|
||||||
var sizePerInput = txp.getEstimatedSizeForSingleInput();
|
var sizePerInput = txp.getEstimatedSizeForSingleInput();
|
||||||
var feePerInput = sizePerInput * txp.feePerKb / 1000.;
|
var feePerInput = sizePerInput * txp.feePerKb / 1000.;
|
||||||
|
|
||||||
console.log('*** [server.js ln1375] feePerInput:', feePerInput); // TODO
|
var totalValueInUtxos = _.sum(utxos, 'satoshis') - baseTxpFee - (utxos.length * feePerInput);
|
||||||
|
if (totalValueInUtxos < txpAmount) {
|
||||||
|
console.log('*** [server.js ln1380] value in all utxos:', totalValueInUtxos, ' is inusfficient to cover for txp amount:', txpAmount); // TODO
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
var partitions = _.partition(utxos, function(utxo) {
|
var partitions = _.partition(utxos, function(utxo) {
|
||||||
return utxo.satoshis > txpAmount * Defaults.UTXO_SELECTION_MAX_SINGLE_UTXO_FACTOR;
|
return utxo.satoshis > txpAmount * Defaults.UTXO_SELECTION_MAX_SINGLE_UTXO_FACTOR;
|
||||||
|
|
|
@ -5746,9 +5746,9 @@ describe('Wallet service', function() {
|
||||||
var txOpts = {
|
var txOpts = {
|
||||||
outputs: [{
|
outputs: [{
|
||||||
toAddress: '18PzpUFkFZE8zKWUPvfykkTxmB9oMR8qP7',
|
toAddress: '18PzpUFkFZE8zKWUPvfykkTxmB9oMR8qP7',
|
||||||
amount: 20000,
|
amount: 200e2,
|
||||||
}],
|
}],
|
||||||
feePerKb: 1000,
|
feePerKb: 10e2,
|
||||||
};
|
};
|
||||||
server.createTx(txOpts, function(err, txp) {
|
server.createTx(txOpts, function(err, txp) {
|
||||||
should.not.exist(err);
|
should.not.exist(err);
|
||||||
|
@ -5775,7 +5775,7 @@ describe('Wallet service', function() {
|
||||||
should.exist(txp);
|
should.exist(txp);
|
||||||
txp.inputs.length.should.equal(3);
|
txp.inputs.length.should.equal(3);
|
||||||
_.all(txp.inputs, function(input) {
|
_.all(txp.inputs, function(input) {
|
||||||
return input == 10000;
|
return input == 100e2;
|
||||||
});
|
});
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
@ -5786,9 +5786,9 @@ describe('Wallet service', function() {
|
||||||
var txOpts = {
|
var txOpts = {
|
||||||
outputs: [{
|
outputs: [{
|
||||||
toAddress: '18PzpUFkFZE8zKWUPvfykkTxmB9oMR8qP7',
|
toAddress: '18PzpUFkFZE8zKWUPvfykkTxmB9oMR8qP7',
|
||||||
amount: 30000,
|
amount: 300e2,
|
||||||
}],
|
}],
|
||||||
feePerKb: 1000,
|
feePerKb: 10e2,
|
||||||
};
|
};
|
||||||
server.createTx(txOpts, function(err, txp) {
|
server.createTx(txOpts, function(err, txp) {
|
||||||
should.not.exist(err);
|
should.not.exist(err);
|
||||||
|
@ -5811,12 +5811,8 @@ describe('Wallet service', function() {
|
||||||
feePerKb: 20e2,
|
feePerKb: 20e2,
|
||||||
};
|
};
|
||||||
server.createTx(txOpts, function(err, txp) {
|
server.createTx(txOpts, function(err, txp) {
|
||||||
console.log('*** [server.js ln5790] err:', err); // TODO
|
|
||||||
|
|
||||||
should.not.exist(err);
|
should.not.exist(err);
|
||||||
should.exist(txp);
|
should.exist(txp);
|
||||||
console.log('*** [server.js ln5792] txp.fee:', txp.fee); // TODO
|
|
||||||
|
|
||||||
txp.inputs.length.should.equal(1);
|
txp.inputs.length.should.equal(1);
|
||||||
txp.inputs[0].satoshis.should.equal(1e8);
|
txp.inputs[0].satoshis.should.equal(1e8);
|
||||||
|
|
||||||
|
@ -5872,15 +5868,15 @@ describe('Wallet service', function() {
|
||||||
var txOpts = {
|
var txOpts = {
|
||||||
outputs: [{
|
outputs: [{
|
||||||
toAddress: '18PzpUFkFZE8zKWUPvfykkTxmB9oMR8qP7',
|
toAddress: '18PzpUFkFZE8zKWUPvfykkTxmB9oMR8qP7',
|
||||||
amount: 20000,
|
amount: 200e2,
|
||||||
}],
|
}],
|
||||||
feePerKb: 8000,
|
feePerKb: 80e2,
|
||||||
};
|
};
|
||||||
server.createTx(txOpts, function(err, txp) {
|
server.createTx(txOpts, function(err, txp) {
|
||||||
should.not.exist(err);
|
should.not.exist(err);
|
||||||
should.exist(txp);
|
should.exist(txp);
|
||||||
txp.inputs.length.should.equal(3);
|
txp.inputs.length.should.equal(3);
|
||||||
txOpts.feePerKb = 12000;
|
txOpts.feePerKb = 120e2;
|
||||||
server.createTx(txOpts, function(err, txp) {
|
server.createTx(txOpts, function(err, txp) {
|
||||||
should.exist(err);
|
should.exist(err);
|
||||||
should.not.exist(txp);
|
should.not.exist(txp);
|
||||||
|
@ -5889,6 +5885,80 @@ describe('Wallet service', function() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
it('should fail to select utxos if not enough to cover tx amount', function(done) {
|
||||||
|
helpers.stubUtxos(server, wallet, ['100bit', '100bit', '100bit'], function() {
|
||||||
|
var txOpts = {
|
||||||
|
outputs: [{
|
||||||
|
toAddress: '18PzpUFkFZE8zKWUPvfykkTxmB9oMR8qP7',
|
||||||
|
amount: 400e2,
|
||||||
|
}],
|
||||||
|
feePerKb: 10e2,
|
||||||
|
};
|
||||||
|
server.createTx(txOpts, function(err, txp) {
|
||||||
|
should.exist(err);
|
||||||
|
should.not.exist(txp);
|
||||||
|
err.code.should.equal('INSUFFICIENT_FUNDS');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it('should fail to select utxos if not enough to cover fees', function(done) {
|
||||||
|
helpers.stubUtxos(server, wallet, ['100bit', '100bit', '100bit'], function() {
|
||||||
|
var txOpts = {
|
||||||
|
outputs: [{
|
||||||
|
toAddress: '18PzpUFkFZE8zKWUPvfykkTxmB9oMR8qP7',
|
||||||
|
amount: 299e2,
|
||||||
|
}],
|
||||||
|
feePerKb: 10e2,
|
||||||
|
};
|
||||||
|
server.createTx(txOpts, function(err, txp) {
|
||||||
|
should.exist(err);
|
||||||
|
should.not.exist(txp);
|
||||||
|
err.code.should.equal('INSUFFICIENT_FUNDS_FOR_FEE');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it('should prefer a higher fee (breaking all limits) if inputs have 6+ confirmations', function(done) {
|
||||||
|
helpers.stubUtxos(server, wallet, ['2c 2000bit'].concat(_.times(20, function() {
|
||||||
|
return '100bit';
|
||||||
|
})), function() {
|
||||||
|
var txOpts = {
|
||||||
|
outputs: [{
|
||||||
|
toAddress: '18PzpUFkFZE8zKWUPvfykkTxmB9oMR8qP7',
|
||||||
|
amount: 1500e2,
|
||||||
|
}],
|
||||||
|
feePerKb: 10e2,
|
||||||
|
};
|
||||||
|
server.createTx(txOpts, function(err, txp) {
|
||||||
|
should.not.exist(err);
|
||||||
|
should.exist(txp);
|
||||||
|
_.all(txp.inputs, function(input) {
|
||||||
|
return input == 100e2;
|
||||||
|
});
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it('should select unconfirmed utxos if not enough confirmed utxos', function(done) {
|
||||||
|
helpers.stubUtxos(server, wallet, ['u 1btc', '0.5btc'], function() {
|
||||||
|
var txOpts = {
|
||||||
|
outputs: [{
|
||||||
|
toAddress: '18PzpUFkFZE8zKWUPvfykkTxmB9oMR8qP7',
|
||||||
|
amount: 0.8e8,
|
||||||
|
}],
|
||||||
|
feePerKb: 100e2,
|
||||||
|
};
|
||||||
|
server.createTx(txOpts, function(err, txp) {
|
||||||
|
should.not.exist(err);
|
||||||
|
should.exist(txp);
|
||||||
|
txp.inputs.length.should.equal(1);
|
||||||
|
txp.inputs[0].satoshis.should.equal(1e8);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue