diff options
-rw-r--r-- | package.json | 2 | ||||
-rw-r--r-- | ui/app/components/pending-tx.js | 30 | ||||
-rw-r--r-- | ui/app/conversion-util.js | 141 |
3 files changed, 51 insertions, 122 deletions
diff --git a/package.json b/package.json index 771e73108..82f464986 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,6 @@ "async": "^2.5.0", "await-semaphore": "^0.1.1", "babel-runtime": "^6.23.0", - "bignumber.js": "^4.0.4", "bip39": "^2.2.0", "bluebird": "^3.5.0", "bn.js": "^4.11.7", @@ -116,7 +115,6 @@ "pump": "^1.0.2", "pumpify": "^1.3.4", "qrcode-npm": "0.0.3", - "ramda": "^0.24.1", "react": "^15.0.2", "react-addons-css-transition-group": "^15.6.0", "react-dom": "^15.5.4", diff --git a/ui/app/components/pending-tx.js b/ui/app/components/pending-tx.js index a0d59207d..ab425abf5 100644 --- a/ui/app/components/pending-tx.js +++ b/ui/app/components/pending-tx.js @@ -85,6 +85,8 @@ PendingTx.prototype.render = function () { const txFeeBn = gasBn.mul(gasPriceBn) + const amountBn = hexToBn(txParams.value) + // TODO: insufficient balance should be handled on send screen // const maxCost = txFeeBn.add(amountBn) // const balanceBn = hexToBn(balance) @@ -97,39 +99,27 @@ PendingTx.prototype.render = function () { const endOfToAddress = txParams.to.slice(txParams.to.length - 4) const gasFeeInUSD = conversionUtil(txFeeBn, { - fromNumericBase: 'BN', - toNumericBase: 'dec', - fromDenomination: 'WEI', - fromCurrency: 'ETH', + fromFormat: 'BN', + fromCurrency: 'GWEI', toCurrency: 'USD', - numberOfDecimals: 2, conversionRate, }) const gasFeeInETH = conversionUtil(txFeeBn, { - fromNumericBase: 'BN', - toNumericBase: 'dec', - fromDenomination: 'WEI', - fromCurrency: 'ETH', + fromFormat: 'BN', + fromCurrency: 'GWEI', toCurrency: 'ETH', - numberOfDecimals: 6, conversionRate, }) - const totalInUSD = conversionUtil(txParams.value, { - fromNumericBase: 'hex', - toNumericBase: 'dec', - fromCurrency: 'ETH', + const totalInUSD = conversionUtil(amountBn, { + fromFormat: 'BN', toCurrency: 'USD', - numberOfDecimals: 2, conversionRate, }) - const totalInETH = conversionUtil(txParams.value, { - fromNumericBase: 'hex', - toNumericBase: 'dec', - fromCurrency: 'ETH', + const totalInETH = conversionUtil(amountBn, { + fromFormat: 'BN', toCurrency: 'ETH', conversionRate, - numberOfDecimals: 6, }) this.inputs = [] diff --git a/ui/app/conversion-util.js b/ui/app/conversion-util.js index 5e1125194..8f2214500 100644 --- a/ui/app/conversion-util.js +++ b/ui/app/conversion-util.js @@ -1,108 +1,49 @@ -/* 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 {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 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') - -// Individual Setters -const convert = R.invoker(1, 'times') -const round = R.invoker(2, 'toFormat')(R.__, BigNumber.ROUND_DOWN) - -// Setter Maps -const toBigNumber = { - hex: n => new BigNumber(stripHexPrefix(n), 16), - dec: n => new BigNumber(n, 10), - BN: n => new BigNumber(n.toString(16), 16), -} -const toNormalizedDenomination = { - WEI: bigNumber => bigNumber.div(BIG_NUMBER_WEI_MULTIPLIER) -} -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 -const valuePropertyLense = R.over(R.lensProp('value')) - -// conditional 'value' setting wrappers -const whenPredSetWithPropAndSetter = (pred, prop, setter) => R.when( - 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 -const converter = R.pipe( - whenPropApplySetterMap('fromNumericBase', toBigNumber), - whenPropApplySetterMap('fromDenomination', toNormalizedDenomination), - whenPredSetWithPropAndSetter(fromAndToCurrencyPropsNotEqual, 'conversionRate', convert), - whenPredSetWithPropAndSetter(R.prop('numberOfDecimals'), 'numberOfDecimals', round), - whenPropApplySetterMap('toNumericBase', baseChange), - R.view(R.lensProp('value')) -); +const { + numericBalance, + parseBalance, + formatBalance, + normalizeToWei, + valueTable, +} = require('./util') +const hexToBn = require('../../app/scripts/lib/hex-to-bn') +const { BN } = require('ethereumjs-util') +const GWEI_MULTIPLIER = normalizeToWei(hexToBn(valueTable.gwei.toString(16)), 'gwei'); const conversionUtil = (value, { - fromCurrency = null, - toCurrency = fromCurrency, - fromNumericBase, - toNumericBase, - fromDenomination, - numberOfDecimals, - conversionRate, -}) => converter({ fromCurrency, toCurrency, - fromNumericBase, - toNumericBase, - fromDenomination, - numberOfDecimals, + fromFormat, + toFormat, + precision = 2, conversionRate, - value, -}); +}) => { + let result; + + if (fromFormat === 'BN') { + if (fromCurrency !== 'GWEI') { + result = normalizeToWei(value, 'gwei') + } + else { + result = value + } + + result = result.toString(16) + result = formatBalance(result, 9) + result = result.split(' ') + result = Number(result[0]) * 1000000000 + } + + if (fromCurrency === 'GWEI') { + result = result / 1000000000 + } + + if (toCurrency === 'USD') { + result = result * conversionRate + result = result.toFixed(precision) + } + + return result +}; module.exports = { conversionUtil, |