Merge pull request #650 from isocolsky/feat/low-fees

Tag only unconfirmed txs with low fee
This commit is contained in:
Matias Alejo Garcia 2017-04-14 19:25:00 +02:00 committed by GitHub
commit cb3ee35deb
2 changed files with 52 additions and 22 deletions

View File

@ -2864,6 +2864,34 @@ WalletService.prototype.getTxHistory = function(opts, cb) {
}); });
}; };
function tagLowFees(wallet, txs, cb) {
var unconfirmed = _.filter(txs, {
confirmations: 0
});
if (_.isEmpty(unconfirmed)) return cb();
self.getFeeLevels({
network: wallet.network
}, function(err, levels) {
if (err) {
log.warn('Could not fetch fee levels', err);
} else {
var level = _.find(levels, {
level: 'superEconomy'
});
if (!level || !level.nbBlocks) {
log.debug('Cannot compute super economy fee level from blockchain');
} else {
var minFeePerKb = level.feePerKb;
_.each(unconfirmed, function(tx) {
tx.lowFees = tx.feePerKb < minFeePerKb;
});
}
}
return cb();
});
};
self.getWallet({}, function(err, wallet) { self.getWallet({}, function(err, wallet) {
if (err) return cb(err); if (err) return cb(err);
@ -2912,24 +2940,9 @@ WalletService.prototype.getTxHistory = function(opts, cb) {
var finalTxs = decorate(wallet, res.txs.items, addresses, res.txps, res.notes); var finalTxs = decorate(wallet, res.txs.items, addresses, res.txps, res.notes);
self.getFeeLevels({ tagLowFees(wallet, finalTxs, function(err) {
network: wallet.network if (err)
}, function(err, levels) { log.warn('Failed to tag unconfirmed with low fee');
if (err) {
log.warn('Could not fetch fee levels', err);
} else {
var level = _.find(levels, {
level: 'superEconomy'
});
if (!level || !level.nbBlocks) {
log.debug('Cannot compute super economy fee level from blockchain');
} else {
var minFeePerKb = level.feePerKb;
_.each(finalTxs, function(tx) {
tx.lowFees = tx.feePerKb < minFeePerKb;
});
}
}
if (res.txs.fromCache) if (res.txs.fromCache)
log.debug("History from cache for:", self.walletId, from, to); log.debug("History from cache for:", self.walletId, from, to);

View File

@ -6305,14 +6305,14 @@ describe('Wallet service', function() {
done(); done();
}); });
}); });
it('should set lowFees atribute for sub-superEconomy level fees', function(done) { it('should set lowFees atribute for sub-superEconomy level fees on unconfirmed txs', function(done) {
helpers.stubFeeLevels({ helpers.stubFeeLevels({
24: 10000, 24: 10000,
}); });
server._normalizeTxHistory = sinon.stub().returnsArg(0); server._normalizeTxHistory = sinon.stub().returnsArg(0);
var txs = [{ var txs = [{
txid: '1', txid: '1',
confirmations: 1, confirmations: 0,
fees: 100, fees: 100,
time: 20, time: 20,
inputs: [{ inputs: [{
@ -6326,7 +6326,7 @@ describe('Wallet service', function() {
size: 500, size: 500,
}, { }, {
txid: '2', txid: '2',
confirmations: 1, confirmations: 0,
fees: 6000, fees: 6000,
time: 20, time: 20,
inputs: [{ inputs: [{
@ -6338,6 +6338,20 @@ describe('Wallet service', function() {
amount: 200, amount: 200,
}], }],
size: 500, size: 500,
}, {
txid: '3',
confirmations: 6,
fees: 100,
time: 20,
inputs: [{
address: 'external',
amount: 500,
}],
outputs: [{
address: mainAddresses[0].address,
amount: 200,
}],
size: 500,
}]; }];
helpers.stubHistory(txs); helpers.stubHistory(txs);
server.getTxHistory({}, function(err, txs) { server.getTxHistory({}, function(err, txs) {
@ -6345,9 +6359,12 @@ describe('Wallet service', function() {
var tx = txs[0]; var tx = txs[0];
tx.feePerKb.should.equal(200); tx.feePerKb.should.equal(200);
tx.lowFees.should.be.true; tx.lowFees.should.be.true;
var tx = txs[1]; tx = txs[1];
tx.feePerKb.should.equal(12000); tx.feePerKb.should.equal(12000);
tx.lowFees.should.be.false; tx.lowFees.should.be.false;
tx = txs[2];
tx.feePerKb.should.equal(200);
should.not.exist(tx.lowFees);
done(); done();
}); });
}); });