diff --git a/lib/common/defaults.js b/lib/common/defaults.js index d07bf78..670b167 100644 --- a/lib/common/defaults.js +++ b/lib/common/defaults.js @@ -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; diff --git a/lib/server.js b/lib/server.js index 06e3df1..22833ff 100644 --- a/lib/server.js +++ b/lib/server.js @@ -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) {