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
Defaults.SCAN_ADDRESS_GAP = Defaults.MAX_MAIN_ADDRESS_GAP + 20;
Defaults.FEE_LEVELS = [{
name: 'urgent',
nbBlocks: 2,
multiplier: 1.5,
defaultValue: 150000,
}, {
name: 'priority',
nbBlocks: 2,
defaultValue: 100000
}, {
name: 'normal',
nbBlocks: 3,
defaultValue: 80000
}, {
name: 'economy',
nbBlocks: 6,
defaultValue: 50000
}, {
name: 'superEconomy',
nbBlocks: 24,
defaultValue: 20000
}];
Defaults.DEFAULT_FEE_PER_KB = Defaults.FEE_LEVELS[1].defaultValue;
Defaults.FEE_LEVELS = {
btc: [{
name: 'urgent',
nbBlocks: 2,
multiplier: 1.5,
defaultValue: 150000,
}, {
name: 'priority',
nbBlocks: 2,
defaultValue: 100000
}, {
name: 'normal',
nbBlocks: 3,
defaultValue: 80000
}, {
name: 'economy',
nbBlocks: 6,
defaultValue: 50000
}, {
name: 'superEconomy',
nbBlocks: 24,
defaultValue: 20000
}],
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
Defaults.FEE_LEVELS_FALLBACK = 2;

View File

@ -1363,30 +1363,31 @@ WalletService.prototype.getSendMaxInfo = function(opts, cb) {
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) {
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) {
if (err) return cb(err);
@ -1510,8 +1511,18 @@ WalletService.prototype.getFeeLevels = function(opts, cb) {
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() {
var definedPoints = _.uniq(_.pluck(Defaults.FEE_LEVELS, 'nbBlocks'));
var definedPoints = _.uniq(_.pluck(feeLevels, 'nbBlocks'));
return _.uniq(_.flatten(_.map(definedPoints, function(p) {
return _.range(p, p + Defaults.FEE_LEVELS_FALLBACK + 1);
})));
@ -1538,16 +1549,8 @@ WalletService.prototype.getFeeLevels = function(opts, cb) {
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) {
var values = _.map(Defaults.FEE_LEVELS, function(level) {
var values = _.map(feeLevels, function(level) {
var result = {
level: level.name,
};
@ -1932,11 +1935,12 @@ WalletService.prototype._validateAndSanitizeTxOpts = function(wallet, opts, cb)
opts.feeLevel = 'normal';
}
var feeLevels = Defaults.FEE_LEVELS[wallet.coin];
if (opts.feeLevel) {
if (!_.any(Defaults.FEE_LEVELS, {
if (!_.any(feeLevels, {
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)) {
@ -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)'));
self.getSendMaxInfo({
feePerKb: opts.feePerKb || Defaults.DEFAULT_FEE_PER_KB,
feePerKb: opts.feePerKb,
excludeUnconfirmedUtxos: !!opts.excludeUnconfirmedUtxos,
returnInputs: true,
}, function(err, info) {