diff options
Diffstat (limited to 'ui/app/conversion-util.js')
-rw-r--r-- | ui/app/conversion-util.js | 251 |
1 files changed, 0 insertions, 251 deletions
diff --git a/ui/app/conversion-util.js b/ui/app/conversion-util.js deleted file mode 100644 index f271b5683..000000000 --- a/ui/app/conversion-util.js +++ /dev/null @@ -1,251 +0,0 @@ -/* Currency Conversion Utility -* This utility function can be used for converting currency related values within metamask. -* The caller should be able to pass it a value, along with information about the value's -* numeric base, denomination and currency, and the desired numeric base, denomination and -* currency. It should return a single value. -* -* @param {(number | string | BN)} value The value to convert. -* @param {Object} [options] Options to specify details of the conversion -* @param {string} [options.fromCurrency = 'ETH' | 'USD'] The currency of the passed value -* @param {string} [options.toCurrency = 'ETH' | 'USD'] The desired currency of the result -* @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 {string} [options.numberOfDecimals] The desired number of decimals in the result -* @param {string} [options.roundDown] The desired number of decimals to round down to -* @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 ethUtil = require('ethereumjs-util') -const BN = ethUtil.BN -const R = require('ramda') -const { stripHexPrefix } = require('ethereumjs-util') - -BigNumber.config({ - ROUNDING_MODE: BigNumber.ROUND_HALF_DOWN, -}) - -// Big Number Constants -const BIG_NUMBER_WEI_MULTIPLIER = new BigNumber('1000000000000000000') -const BIG_NUMBER_GWEI_MULTIPLIER = new BigNumber('1000000000') -const BIG_NUMBER_ETH_MULTIPLIER = new BigNumber('1') - -// Individual Setters -const convert = R.invoker(1, 'times') -const round = R.invoker(2, 'round')(R.__, BigNumber.ROUND_HALF_DOWN) -const roundDown = R.invoker(2, 'round')(R.__, BigNumber.ROUND_DOWN) -const invertConversionRate = conversionRate => () => new BigNumber(1.0).div(conversionRate) -const decToBigNumberViaString = n => R.pipe(String, toBigNumber['dec']) - -// Setter Maps -const toBigNumber = { - hex: n => new BigNumber(stripHexPrefix(n), 16), - dec: n => new BigNumber(String(n), 10), - BN: n => new BigNumber(n.toString(16), 16), -} -const toNormalizedDenomination = { - WEI: bigNumber => bigNumber.div(BIG_NUMBER_WEI_MULTIPLIER), - GWEI: bigNumber => bigNumber.div(BIG_NUMBER_GWEI_MULTIPLIER), - ETH: bigNumber => bigNumber.div(BIG_NUMBER_ETH_MULTIPLIER), -} -const toSpecifiedDenomination = { - WEI: bigNumber => bigNumber.times(BIG_NUMBER_WEI_MULTIPLIER).round(), - GWEI: bigNumber => bigNumber.times(BIG_NUMBER_GWEI_MULTIPLIER).round(9), - ETH: bigNumber => bigNumber.times(BIG_NUMBER_ETH_MULTIPLIER).round(9), -} -const baseChange = { - hex: n => n.toString(16), - dec: n => Number(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 -const valuePropertyLens = R.over(R.lensProp('value')) -const conversionRateLens = R.over(R.lensProp('conversionRate')) - -// conditional conversionRate setting wrapper -const whenPredSetCRWithPropAndSetter = (pred, prop, setter) => R.when( - pred, - R.converge( - conversionRateLens, - [R.pipe(R.prop(prop), setter), R.identity] - ) -) - -// conditional 'value' setting wrappers -const whenPredSetWithPropAndSetter = (pred, prop, setter) => R.when( - pred, - R.converge( - valuePropertyLens, - [R.pipe(R.prop(prop), setter), R.identity] - ) -) -const whenPropApplySetterMap = (prop, setterMap) => whenPredSetWithPropAndSetter( - R.prop(prop), - prop, - R.prop(R.__, setterMap) -) - -// Conversion utility function -const converter = R.pipe( - whenPredSetCRWithPropAndSetter(R.prop('conversionRate'), 'conversionRate', decToBigNumberViaString), - whenPredSetCRWithPropAndSetter(R.prop('invertConversionRate'), 'conversionRate', invertConversionRate), - whenPropApplySetterMap('fromNumericBase', toBigNumber), - whenPropApplySetterMap('fromDenomination', toNormalizedDenomination), - whenPredSetWithPropAndSetter(fromAndToCurrencyPropsNotEqual, 'conversionRate', convert), - whenPropApplySetterMap('toDenomination', toSpecifiedDenomination), - whenPredSetWithPropAndSetter(R.prop('numberOfDecimals'), 'numberOfDecimals', round), - whenPredSetWithPropAndSetter(R.prop('roundDown'), 'roundDown', roundDown), - whenPropApplySetterMap('toNumericBase', baseChange), - R.view(R.lensProp('value')) -) - -const conversionUtil = (value, { - fromCurrency = null, - toCurrency = fromCurrency, - fromNumericBase, - toNumericBase, - fromDenomination, - toDenomination, - numberOfDecimals, - conversionRate, - invertConversionRate, -}) => converter({ - fromCurrency, - toCurrency, - fromNumericBase, - toNumericBase, - fromDenomination, - toDenomination, - numberOfDecimals, - conversionRate, - invertConversionRate, - value: value || '0', -}) - -const addCurrencies = (a, b, options = {}) => { - const { - aBase, - bBase, - ...conversionOptions - } = options - const value = (new BigNumber(a.toString(), aBase)).add(b.toString(), bBase) - - return converter({ - value, - ...conversionOptions, - }) -} - -const subtractCurrencies = (a, b, options = {}) => { - const { - aBase, - bBase, - ...conversionOptions - } = options - const value = (new BigNumber(String(a), aBase)).minus(b, bBase) - - return converter({ - value, - ...conversionOptions, - }) -} - -const multiplyCurrencies = (a, b, options = {}) => { - const { - multiplicandBase, - multiplierBase, - ...conversionOptions - } = options - - const bigNumberA = new BigNumber(String(a), multiplicandBase) - const bigNumberB = new BigNumber(String(b), multiplierBase) - - const value = bigNumberA.times(bigNumberB) - - return converter({ - value, - ...conversionOptions, - }) -} - -const conversionGreaterThan = ( - { ...firstProps }, - { ...secondProps }, -) => { - const firstValue = converter({ ...firstProps }) - const secondValue = converter({ ...secondProps }) - - return firstValue.gt(secondValue) -} - -const conversionLessThan = ( - { ...firstProps }, - { ...secondProps }, -) => { - const firstValue = converter({ ...firstProps }) - const secondValue = converter({ ...secondProps }) - - return firstValue.lt(secondValue) -} - -const conversionMax = ( - { ...firstProps }, - { ...secondProps }, -) => { - const firstIsGreater = conversionGreaterThan( - { ...firstProps }, - { ...secondProps } - ) - - return firstIsGreater ? firstProps.value : secondProps.value -} - -const conversionGTE = ( - { ...firstProps }, - { ...secondProps }, -) => { - const firstValue = converter({ ...firstProps }) - const secondValue = converter({ ...secondProps }) - return firstValue.greaterThanOrEqualTo(secondValue) -} - -const conversionLTE = ( - { ...firstProps }, - { ...secondProps }, -) => { - const firstValue = converter({ ...firstProps }) - const secondValue = converter({ ...secondProps }) - return firstValue.lessThanOrEqualTo(secondValue) -} - -const toNegative = (n, options = {}) => { - return multiplyCurrencies(n, -1, options) -} - -module.exports = { - conversionUtil, - addCurrencies, - multiplyCurrencies, - conversionGreaterThan, - conversionLessThan, - conversionGTE, - conversionLTE, - conversionMax, - toNegative, - subtractCurrencies, -} |