coin dependent default fee levels

This commit is contained in:
Ivan Socolsky 2017-08-29 16:33:35 -03:00
parent cb4ebe8c50
commit acdf99a34f
No known key found for this signature in database
GPG Key ID: FAECE6A05FAA4F56
2 changed files with 67 additions and 58 deletions

View File

@ -24,30 +24,35 @@ Defaults.MAX_MAIN_ADDRESS_GAP = 20;
// TODO: should allow different gap sizes for external/internal chains // TODO: should allow different gap sizes for external/internal chains
Defaults.SCAN_ADDRESS_GAP = Defaults.MAX_MAIN_ADDRESS_GAP + 20; Defaults.SCAN_ADDRESS_GAP = Defaults.MAX_MAIN_ADDRESS_GAP + 20;
Defaults.FEE_LEVELS = [{ Defaults.FEE_LEVELS = {
name: 'urgent', btc: [{
nbBlocks: 2, name: 'urgent',
multiplier: 1.5, nbBlocks: 2,
defaultValue: 150000, multiplier: 1.5,
}, { defaultValue: 150000,
name: 'priority', }, {
nbBlocks: 2, name: 'priority',
defaultValue: 100000 nbBlocks: 2,
}, { defaultValue: 100000
name: 'normal', }, {
nbBlocks: 3, name: 'normal',
defaultValue: 80000 nbBlocks: 3,
}, { defaultValue: 80000
name: 'economy', }, {
nbBlocks: 6, name: 'economy',
defaultValue: 50000 nbBlocks: 6,
}, { defaultValue: 50000
name: 'superEconomy', }, {
nbBlocks: 24, name: 'superEconomy',
defaultValue: 20000 nbBlocks: 24,
}]; defaultValue: 20000
}],
Defaults.DEFAULT_FEE_PER_KB = Defaults.FEE_LEVELS[1].defaultValue; bch: [{
name: 'normal',
nbBlocks: 2,
defaultValue: 2000,
}]
};
// How many levels to fallback to if the value returned by the network for a given nbBlocks is -1 // How many levels to fallback to if the value returned by the network for a given nbBlocks is -1
Defaults.FEE_LEVELS_FALLBACK = 2; Defaults.FEE_LEVELS_FALLBACK = 2;

View File

@ -1363,30 +1363,31 @@ WalletService.prototype.getSendMaxInfo = function(opts, cb) {
opts = opts || {}; opts = opts || {};
var feeArgs = !!opts.feeLevel + _.isNumber(opts.feePerKb);
if (feeArgs > 1)
return cb(new ClientError('Only one of feeLevel/feePerKb can be specified'));
if (feeArgs == 0) {
log.debug('No fee provided, using "normal" fee level');
opts.feeLevel = 'normal';
}
if (opts.feeLevel) {
if (!_.any(Defaults.FEE_LEVELS, {
name: opts.feeLevel
}))
return cb(new ClientError('Invalid fee level. Valid values are ' + _.pluck(Defaults.FEE_LEVELS, 'name').join(', ')));
}
if (_.isNumber(opts.feePerKb)) {
if (opts.feePerKb < Defaults.MIN_FEE_PER_KB || opts.feePerKb > Defaults.MAX_FEE_PER_KB)
return cb(new ClientError('Invalid fee per KB'));
}
self.getWallet({}, function(err, wallet) { self.getWallet({}, function(err, wallet) {
if (err) return cb(err); if (err) return cb(err);
var feeArgs = !!opts.feeLevel + _.isNumber(opts.feePerKb);
if (feeArgs > 1)
return cb(new ClientError('Only one of feeLevel/feePerKb can be specified'));
if (feeArgs == 0) {
log.debug('No fee provided, using "normal" fee level');
opts.feeLevel = 'normal';
}
var feeLevels = Defaults.FEE_LEVELS[wallet.coin];
if (opts.feeLevel) {
if (!_.any(feeLevels, {
name: opts.feeLevel
}))
return cb(new ClientError('Invalid fee level. Valid values are ' + _.pluck(feeLevels, 'name').join(', ')));
}
if (_.isNumber(opts.feePerKb)) {
if (opts.feePerKb < Defaults.MIN_FEE_PER_KB || opts.feePerKb > Defaults.MAX_FEE_PER_KB)
return cb(new ClientError('Invalid fee per KB'));
}
self._getUtxosForCurrentWallet(null, function(err, utxos) { self._getUtxosForCurrentWallet(null, function(err, utxos) {
if (err) return cb(err); if (err) return cb(err);
@ -1510,8 +1511,18 @@ WalletService.prototype.getFeeLevels = function(opts, cb) {
opts = opts || {}; opts = opts || {};
opts.coin = opts.coin || Defaults.COIN;
if (!Utils.checkValueInCollection(opts.coin, Constants.COINS))
return cb(new ClientError('Invalid coin'));
opts.network = opts.network || 'livenet';
if (!Utils.checkValueInCollection(opts.network, Constants.NETWORKS))
return cb(new ClientError('Invalid network'));
var feeLevels = Defaults.FEE_LEVELS[opts.coin];
function samplePoints() { function samplePoints() {
var definedPoints = _.uniq(_.pluck(Defaults.FEE_LEVELS, 'nbBlocks')); var definedPoints = _.uniq(_.pluck(feeLevels, 'nbBlocks'));
return _.uniq(_.flatten(_.map(definedPoints, function(p) { return _.uniq(_.flatten(_.map(definedPoints, function(p) {
return _.range(p, p + Defaults.FEE_LEVELS_FALLBACK + 1); return _.range(p, p + Defaults.FEE_LEVELS_FALLBACK + 1);
}))); })));
@ -1538,16 +1549,8 @@ WalletService.prototype.getFeeLevels = function(opts, cb) {
return result; return result;
}; };
opts.coin = opts.coin || Defaults.COIN;
if (!Utils.checkValueInCollection(opts.coin, Constants.COINS))
return cb(new ClientError('Invalid coin'));
opts.network = opts.network || 'livenet';
if (!Utils.checkValueInCollection(opts.network, Constants.NETWORKS))
return cb(new ClientError('Invalid network'));
self._sampleFeeLevels(opts.coin, opts.network, samplePoints(), function(err, feeSamples) { self._sampleFeeLevels(opts.coin, opts.network, samplePoints(), function(err, feeSamples) {
var values = _.map(Defaults.FEE_LEVELS, function(level) { var values = _.map(feeLevels, function(level) {
var result = { var result = {
level: level.name, level: level.name,
}; };
@ -1932,11 +1935,12 @@ WalletService.prototype._validateAndSanitizeTxOpts = function(wallet, opts, cb)
opts.feeLevel = 'normal'; opts.feeLevel = 'normal';
} }
var feeLevels = Defaults.FEE_LEVELS[wallet.coin];
if (opts.feeLevel) { if (opts.feeLevel) {
if (!_.any(Defaults.FEE_LEVELS, { if (!_.any(feeLevels, {
name: opts.feeLevel name: opts.feeLevel
})) }))
return next(new ClientError('Invalid fee level. Valid values are ' + _.pluck(Defaults.FEE_LEVELS, 'name').join(', '))); return next(new ClientError('Invalid fee level. Valid values are ' + _.pluck(feeLevels, 'name').join(', ')));
} }
if (_.isNumber(opts.feePerKb)) { if (_.isNumber(opts.feePerKb)) {
@ -1964,7 +1968,7 @@ WalletService.prototype._validateAndSanitizeTxOpts = function(wallet, opts, cb)
return next(new ClientError('Fee is not allowed when sendMax is specified (use feeLevel/feePerKb instead)')); return next(new ClientError('Fee is not allowed when sendMax is specified (use feeLevel/feePerKb instead)'));
self.getSendMaxInfo({ self.getSendMaxInfo({
feePerKb: opts.feePerKb || Defaults.DEFAULT_FEE_PER_KB, feePerKb: opts.feePerKb,
excludeUnconfirmedUtxos: !!opts.excludeUnconfirmedUtxos, excludeUnconfirmedUtxos: !!opts.excludeUnconfirmedUtxos,
returnInputs: true, returnInputs: true,
}, function(err, info) { }, function(err, info) {