This reverts commit 080890a46e
.
feature/default_network_editable
parent
080890a46e
commit
b64471833f
@ -1,108 +1,49 @@ |
|||||||
/* Currency Conversion Utility |
const { |
||||||
* This utility function can be used for converting currency related values within metamask. |
numericBalance, |
||||||
* The caller should be able to pass it a value, along with information about the value's |
parseBalance, |
||||||
* numeric base, denomination and currency, and the desired numeric base, denomination and |
formatBalance, |
||||||
* currency. It should return a single value. |
normalizeToWei, |
||||||
* |
valueTable, |
||||||
* @param {(number | string | BN)} value The value to convert. |
} = require('./util') |
||||||
* @param {Object} [options] Options to specify details of the conversion |
const hexToBn = require('../../app/scripts/lib/hex-to-bn') |
||||||
* @param {string} [options.fromCurrency = 'ETH' | 'USD'] The currency of the passed value |
const { BN } = require('ethereumjs-util') |
||||||
* @param {string} [options.toCurrency = 'ETH' | 'USD'] The desired currency of the result |
const GWEI_MULTIPLIER = normalizeToWei(hexToBn(valueTable.gwei.toString(16)), 'gwei'); |
||||||
* @param {string} [options.fromNumericBase = 'hex' | 'dec' | 'BN'] The numeric basic of the passed value. |
|
||||||
* @param {string} [options.toNumericBase = 'hex' | 'dec' | 'BN'] The desired numeric basic of the result. |
|
||||||
* @param {string} [options.fromDenomination = 'WEI'] The denomination of the passed value |
|
||||||
* @param {number} [options.numberOfDecimals] The desired number of in the result |
|
||||||
* @param {number} [options.conversionRate] The rate to use to make the fromCurrency -> toCurrency conversion |
|
||||||
* @returns {(number | string | BN)} |
|
||||||
* |
|
||||||
* The utility passes value along with the options as a single object to the `converter` function. |
|
||||||
* `converter` uses Ramda.js to apply a composition of conditional setters to the `value` property, depending |
|
||||||
* on the accompanying options. Some of these conditional setters are selected via key-value maps, where |
|
||||||
* the keys are specified in the options parameters and the values are setter functions. |
|
||||||
*/ |
|
||||||
|
|
||||||
const BigNumber = require('bignumber.js') |
const conversionUtil = (value, { |
||||||
const R = require('ramda') |
fromCurrency, |
||||||
const { stripHexPrefix } = require('ethereumjs-util') |
toCurrency, |
||||||
|
fromFormat, |
||||||
BigNumber.config({ |
toFormat, |
||||||
ROUNDING_MODE: BigNumber.ROUND_HALF_DOWN, |
precision = 2, |
||||||
}) |
conversionRate, |
||||||
|
}) => { |
||||||
// Big Number Constants
|
let result; |
||||||
const BIG_NUMBER_WEI_MULTIPLIER = new BigNumber('1000000000000000000') |
|
||||||
|
|
||||||
// Individual Setters
|
|
||||||
const convert = R.invoker(1, 'times') |
|
||||||
const round = R.invoker(2, 'toFormat')(R.__, BigNumber.ROUND_DOWN) |
|
||||||
|
|
||||||
// Setter Maps
|
if (fromFormat === 'BN') { |
||||||
const toBigNumber = { |
if (fromCurrency !== 'GWEI') { |
||||||
hex: n => new BigNumber(stripHexPrefix(n), 16), |
result = normalizeToWei(value, 'gwei') |
||||||
dec: n => new BigNumber(n, 10), |
|
||||||
BN: n => new BigNumber(n.toString(16), 16), |
|
||||||
} |
} |
||||||
const toNormalizedDenomination = { |
else { |
||||||
WEI: bigNumber => bigNumber.div(BIG_NUMBER_WEI_MULTIPLIER) |
result = value |
||||||
} |
} |
||||||
const baseChange = { |
|
||||||
hex: n => n.toString(16), |
|
||||||
dec: n => n.toString(10), |
|
||||||
BN: n => new BN(n.toString(16)), |
|
||||||
} |
|
||||||
|
|
||||||
// Predicates
|
|
||||||
const fromAndToCurrencyPropsNotEqual = R.compose( |
|
||||||
R.not, |
|
||||||
R.eqBy(R.__, 'fromCurrency', 'toCurrency'), |
|
||||||
R.flip(R.prop) |
|
||||||
) |
|
||||||
|
|
||||||
// Lens
|
result = result.toString(16) |
||||||
const valuePropertyLense = R.over(R.lensProp('value')) |
result = formatBalance(result, 9) |
||||||
|
result = result.split(' ') |
||||||
|
result = Number(result[0]) * 1000000000 |
||||||
|
} |
||||||
|
|
||||||
// conditional 'value' setting wrappers
|
if (fromCurrency === 'GWEI') { |
||||||
const whenPredSetWithPropAndSetter = (pred, prop, setter) => R.when( |
result = result / 1000000000 |
||||||
pred, |
} |
||||||
R.converge( |
|
||||||
valuePropertyLense, |
|
||||||
[R.pipe(R.prop(prop), setter), R.identity] |
|
||||||
) |
|
||||||
) |
|
||||||
const whenPropApplySetterMap = (prop, setterMap) => whenPredSetWithPropAndSetter( |
|
||||||
R.prop(prop), |
|
||||||
prop, |
|
||||||
R.prop(R.__, setterMap) |
|
||||||
) |
|
||||||
|
|
||||||
// Conversion utility function
|
if (toCurrency === 'USD') { |
||||||
const converter = R.pipe( |
result = result * conversionRate |
||||||
whenPropApplySetterMap('fromNumericBase', toBigNumber), |
result = result.toFixed(precision) |
||||||
whenPropApplySetterMap('fromDenomination', toNormalizedDenomination), |
} |
||||||
whenPredSetWithPropAndSetter(fromAndToCurrencyPropsNotEqual, 'conversionRate', convert), |
|
||||||
whenPredSetWithPropAndSetter(R.prop('numberOfDecimals'), 'numberOfDecimals', round), |
|
||||||
whenPropApplySetterMap('toNumericBase', baseChange), |
|
||||||
R.view(R.lensProp('value')) |
|
||||||
); |
|
||||||
|
|
||||||
const conversionUtil = (value, { |
return result |
||||||
fromCurrency = null, |
}; |
||||||
toCurrency = fromCurrency, |
|
||||||
fromNumericBase, |
|
||||||
toNumericBase, |
|
||||||
fromDenomination, |
|
||||||
numberOfDecimals, |
|
||||||
conversionRate, |
|
||||||
}) => converter({ |
|
||||||
fromCurrency, |
|
||||||
toCurrency, |
|
||||||
fromNumericBase, |
|
||||||
toNumericBase, |
|
||||||
fromDenomination, |
|
||||||
numberOfDecimals, |
|
||||||
conversionRate, |
|
||||||
value, |
|
||||||
}); |
|
||||||
|
|
||||||
module.exports = { |
module.exports = { |
||||||
conversionUtil, |
conversionUtil, |
||||||
|
Loading…
Reference in new issue