Revert "Overhaul currency conversion utility and update calls to utility in pending-tx."

This reverts commit 080890a46e.
feature/default_network_editable
Chi Kei Chan 7 years ago
parent 080890a46e
commit b64471833f
  1. 2
      package.json
  2. 30
      ui/app/components/pending-tx.js
  3. 135
      ui/app/conversion-util.js

@ -52,7 +52,6 @@
"async": "^2.5.0", "async": "^2.5.0",
"await-semaphore": "^0.1.1", "await-semaphore": "^0.1.1",
"babel-runtime": "^6.23.0", "babel-runtime": "^6.23.0",
"bignumber.js": "^4.0.4",
"bip39": "^2.2.0", "bip39": "^2.2.0",
"bluebird": "^3.5.0", "bluebird": "^3.5.0",
"bn.js": "^4.11.7", "bn.js": "^4.11.7",
@ -116,7 +115,6 @@
"pump": "^1.0.2", "pump": "^1.0.2",
"pumpify": "^1.3.4", "pumpify": "^1.3.4",
"qrcode-npm": "0.0.3", "qrcode-npm": "0.0.3",
"ramda": "^0.24.1",
"react": "^15.0.2", "react": "^15.0.2",
"react-addons-css-transition-group": "^15.6.0", "react-addons-css-transition-group": "^15.6.0",
"react-dom": "^15.5.4", "react-dom": "^15.5.4",

@ -85,6 +85,8 @@ PendingTx.prototype.render = function () {
const txFeeBn = gasBn.mul(gasPriceBn) const txFeeBn = gasBn.mul(gasPriceBn)
const amountBn = hexToBn(txParams.value)
// TODO: insufficient balance should be handled on send screen // TODO: insufficient balance should be handled on send screen
// const maxCost = txFeeBn.add(amountBn) // const maxCost = txFeeBn.add(amountBn)
// const balanceBn = hexToBn(balance) // const balanceBn = hexToBn(balance)
@ -97,39 +99,27 @@ PendingTx.prototype.render = function () {
const endOfToAddress = txParams.to.slice(txParams.to.length - 4) const endOfToAddress = txParams.to.slice(txParams.to.length - 4)
const gasFeeInUSD = conversionUtil(txFeeBn, { const gasFeeInUSD = conversionUtil(txFeeBn, {
fromNumericBase: 'BN', fromFormat: 'BN',
toNumericBase: 'dec', fromCurrency: 'GWEI',
fromDenomination: 'WEI',
fromCurrency: 'ETH',
toCurrency: 'USD', toCurrency: 'USD',
numberOfDecimals: 2,
conversionRate, conversionRate,
}) })
const gasFeeInETH = conversionUtil(txFeeBn, { const gasFeeInETH = conversionUtil(txFeeBn, {
fromNumericBase: 'BN', fromFormat: 'BN',
toNumericBase: 'dec', fromCurrency: 'GWEI',
fromDenomination: 'WEI',
fromCurrency: 'ETH',
toCurrency: 'ETH', toCurrency: 'ETH',
numberOfDecimals: 6,
conversionRate, conversionRate,
}) })
const totalInUSD = conversionUtil(txParams.value, { const totalInUSD = conversionUtil(amountBn, {
fromNumericBase: 'hex', fromFormat: 'BN',
toNumericBase: 'dec',
fromCurrency: 'ETH',
toCurrency: 'USD', toCurrency: 'USD',
numberOfDecimals: 2,
conversionRate, conversionRate,
}) })
const totalInETH = conversionUtil(txParams.value, { const totalInETH = conversionUtil(amountBn, {
fromNumericBase: 'hex', fromFormat: 'BN',
toNumericBase: 'dec',
fromCurrency: 'ETH',
toCurrency: 'ETH', toCurrency: 'ETH',
conversionRate, conversionRate,
numberOfDecimals: 6,
}) })
this.inputs = [] this.inputs = []

@ -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…
Cancel
Save