add more info to response
This commit is contained in:
parent
6b8af51993
commit
6d8b4e70b6
|
@ -1177,13 +1177,19 @@ WalletService.prototype.getSendMaxInfo = function(opts, cb) {
|
||||||
amount: 0,
|
amount: 0,
|
||||||
fee: 0,
|
fee: 0,
|
||||||
inputs: [],
|
inputs: [],
|
||||||
|
utxosBelowFee: 0,
|
||||||
|
amountBelowFee: 0,
|
||||||
|
utxosAboveMaxSize: 0,
|
||||||
|
amountAboveMaxSize: 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
var inputs = _.reject(utxos, 'locked');
|
var inputs = _.reject(utxos, 'locked');
|
||||||
if (!!opts.excludeUnconfirmedUtxos) {
|
if (!!opts.excludeUnconfirmedUtxos) {
|
||||||
inputs = _.filter(inputs, 'confirmations');
|
inputs = _.filter(inputs, 'confirmations');
|
||||||
}
|
}
|
||||||
inputs = _.sortBy(inputs, 'satoshis');
|
inputs = _.sortBy(inputs, function(input) {
|
||||||
|
return -input.satoshis;
|
||||||
|
});
|
||||||
|
|
||||||
if (_.isEmpty(inputs)) return cb(null, info);
|
if (_.isEmpty(inputs)) return cb(null, info);
|
||||||
|
|
||||||
|
@ -1195,17 +1201,27 @@ WalletService.prototype.getSendMaxInfo = function(opts, cb) {
|
||||||
feePerKb: opts.feePerKb,
|
feePerKb: opts.feePerKb,
|
||||||
});
|
});
|
||||||
|
|
||||||
var lastFee = txp.getEstimatedFee();
|
var baseTxpSize = txp.getEstimatedSize();
|
||||||
_.eachRight(inputs, function(input) {
|
var baseTxpFee = baseTxpSize * txp.feePerKb / 1000.;
|
||||||
txp.inputs.push(input);
|
var sizePerInput = txp.getEstimatedSizeForSingleInput();
|
||||||
var fee = txp.getEstimatedFee();
|
var feePerInput = sizePerInput * txp.feePerKb / 1000.;
|
||||||
var sizeInKb = txp.getEstimatedSize() / 1000.;
|
|
||||||
if (fee - lastFee > input.satoshis || sizeInKb > Defaults.MAX_TX_SIZE_IN_KB) {
|
var partitionedByAmount = _.partition(inputs, function(input) {
|
||||||
txp.inputs.pop();
|
return input.satoshis > feePerInput;
|
||||||
|
});
|
||||||
|
|
||||||
|
info.utxosBelowFee = partitionedByAmount[1].length;
|
||||||
|
info.amountBelowFee = _.sum(partitionedByAmount[1], 'satoshis');
|
||||||
|
inputs = partitionedByAmount[0];
|
||||||
|
|
||||||
|
_.each(inputs, function(input, i) {
|
||||||
|
var sizeInKb = (baseTxpSize + (i + 1) * sizePerInput) / 1000.;
|
||||||
|
if (sizeInKb > Defaults.MAX_TX_SIZE_IN_KB) {
|
||||||
|
info.utxosAboveMaxSize = inputs.length - i;
|
||||||
|
info.amountAboveMaxSize = _.sum(_.slice(inputs, i), 'satoshis');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
txp.inputs.push(input);
|
||||||
lastFee = fee;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if (_.isEmpty(txp.inputs)) return cb(null, info);
|
if (_.isEmpty(txp.inputs)) return cb(null, info);
|
||||||
|
|
|
@ -3696,7 +3696,7 @@ describe('Wallet service', function() {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
it('should be able to get send max info on empty wallet', function(done) {
|
it('should be able to get send max info on 0 utxo wallet', function(done) {
|
||||||
server.getSendMaxInfo({
|
server.getSendMaxInfo({
|
||||||
feePerKb: 10000,
|
feePerKb: 10000,
|
||||||
returnInputs: true,
|
returnInputs: true,
|
||||||
|
@ -3707,6 +3707,10 @@ describe('Wallet service', function() {
|
||||||
info.amount.should.equal(0);
|
info.amount.should.equal(0);
|
||||||
info.fee.should.equal(0);
|
info.fee.should.equal(0);
|
||||||
info.inputs.should.be.empty;
|
info.inputs.should.be.empty;
|
||||||
|
info.utxosBelowFee.should.equal(0);
|
||||||
|
info.amountBelowFee.should.equal(0);
|
||||||
|
info.utxosAboveMaxSize.should.equal(0);
|
||||||
|
info.amountAboveMaxSize.should.equal(0);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -3722,6 +3726,10 @@ describe('Wallet service', function() {
|
||||||
info.size.should.equal(1304);
|
info.size.should.equal(1304);
|
||||||
info.fee.should.equal(info.size * 10000 / 1000.);
|
info.fee.should.equal(info.size * 10000 / 1000.);
|
||||||
info.amount.should.equal(1e8 - info.fee);
|
info.amount.should.equal(1e8 - info.fee);
|
||||||
|
info.utxosBelowFee.should.equal(0);
|
||||||
|
info.amountBelowFee.should.equal(0);
|
||||||
|
info.utxosAboveMaxSize.should.equal(0);
|
||||||
|
info.amountAboveMaxSize.should.equal(0);
|
||||||
sendTx(info, done);
|
sendTx(info, done);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -3790,7 +3798,7 @@ describe('Wallet service', function() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it('should ignore utxos not contributing to total amount (below their cost in fee)', function(done) {
|
it('should ignore utxos not contributing to total amount (below their cost in fee)', function(done) {
|
||||||
helpers.stubUtxos(server, wallet, ['u0.1', 0.2, 0.3, 0.4, 0.000001, 0.0002, 0.0003], function() {
|
helpers.stubUtxos(server, wallet, ['u0.1', 0.2, 0.3, 0.4, '1bit', '100bit', '200bit'], function() {
|
||||||
server.getSendMaxInfo({
|
server.getSendMaxInfo({
|
||||||
feePerKb: 0.001e8,
|
feePerKb: 0.001e8,
|
||||||
returnInputs: true,
|
returnInputs: true,
|
||||||
|
@ -3801,6 +3809,8 @@ describe('Wallet service', function() {
|
||||||
info.size.should.equal(1304);
|
info.size.should.equal(1304);
|
||||||
info.fee.should.equal(info.size * 0.001e8 / 1000.);
|
info.fee.should.equal(info.size * 0.001e8 / 1000.);
|
||||||
info.amount.should.equal(1e8 - info.fee);
|
info.amount.should.equal(1e8 - info.fee);
|
||||||
|
info.utxosBelowFee.should.equal(3);
|
||||||
|
info.amountBelowFee.should.equal(301e2);
|
||||||
server.getSendMaxInfo({
|
server.getSendMaxInfo({
|
||||||
feePerKb: 0.0001e8,
|
feePerKb: 0.0001e8,
|
||||||
returnInputs: true,
|
returnInputs: true,
|
||||||
|
@ -3810,7 +3820,9 @@ describe('Wallet service', function() {
|
||||||
info.inputs.length.should.equal(6);
|
info.inputs.length.should.equal(6);
|
||||||
info.size.should.equal(1907);
|
info.size.should.equal(1907);
|
||||||
info.fee.should.equal(info.size * 0.0001e8 / 1000.);
|
info.fee.should.equal(info.size * 0.0001e8 / 1000.);
|
||||||
info.amount.should.equal(1.0005e8 - info.fee);
|
info.amount.should.equal(1.0003e8 - info.fee);
|
||||||
|
info.utxosBelowFee.should.equal(1);
|
||||||
|
info.amountBelowFee.should.equal(1e2);
|
||||||
sendTx(info, done);
|
sendTx(info, done);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -3828,6 +3840,8 @@ describe('Wallet service', function() {
|
||||||
info.size.should.equal(0);
|
info.size.should.equal(0);
|
||||||
info.fee.should.equal(0);
|
info.fee.should.equal(0);
|
||||||
info.amount.should.equal(0);
|
info.amount.should.equal(0);
|
||||||
|
info.utxosBelowFee.should.equal(3);
|
||||||
|
info.amountBelowFee.should.equal(40e2);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -3844,6 +3858,8 @@ describe('Wallet service', function() {
|
||||||
should.exist(info);
|
should.exist(info);
|
||||||
info.size.should.be.below(2000);
|
info.size.should.be.below(2000);
|
||||||
info.inputs.length.should.be.below(9);
|
info.inputs.length.should.be.below(9);
|
||||||
|
info.utxosAboveMaxSize.should.equal(3);
|
||||||
|
info.amountAboveMaxSize.should.equal(3e8);
|
||||||
Defaults.MAX_TX_SIZE_IN_KB = _oldDefault;
|
Defaults.MAX_TX_SIZE_IN_KB = _oldDefault;
|
||||||
sendTx(info, done);
|
sendTx(info, done);
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue