Fix handling of arithmetic on token gas in confirm-send-token.

feature/default_network_editable
Dan 7 years ago committed by Chi Kei Chan
parent bd11e60b8c
commit 89af385a35
  1. 49
      ui/app/components/pending-tx/confirm-send-token.js
  2. 8
      ui/app/conversion-util.js
  3. 11
      ui/app/selectors.js

@ -11,12 +11,22 @@ const Identicon = require('../identicon')
const ethUtil = require('ethereumjs-util') const ethUtil = require('ethereumjs-util')
const BN = ethUtil.BN const BN = ethUtil.BN
const hexToBn = require('../../../../app/scripts/lib/hex-to-bn') const hexToBn = require('../../../../app/scripts/lib/hex-to-bn')
const { conversionUtil } = require('../../conversion-util') const {
conversionUtil,
multiplyCurrencies,
addCurrencies,
} = require('../../conversion-util')
const MIN_GAS_PRICE_GWEI_BN = new BN(1) const MIN_GAS_PRICE_GWEI_BN = new BN(1)
const GWEI_FACTOR = new BN(1e9) const GWEI_FACTOR = new BN(1e9)
const MIN_GAS_PRICE_BN = MIN_GAS_PRICE_GWEI_BN.mul(GWEI_FACTOR) const MIN_GAS_PRICE_BN = MIN_GAS_PRICE_GWEI_BN.mul(GWEI_FACTOR)
const {
getSelectedTokenExchangeRate,
getTokenExchangeRate,
getSelectedAddress,
} = require('../../selectors')
module.exports = connect(mapStateToProps, mapDispatchToProps)(ConfirmSendToken) module.exports = connect(mapStateToProps, mapDispatchToProps)(ConfirmSendToken)
function mapStateToProps (state, ownProps) { function mapStateToProps (state, ownProps) {
@ -28,10 +38,8 @@ function mapStateToProps (state, ownProps) {
identities, identities,
} = state.metamask } = state.metamask
const accounts = state.metamask.accounts const accounts = state.metamask.accounts
const selectedAddress = state.metamask.selectedAddress || Object.keys(accounts)[0] const selectedAddress = getSelectedAddress(state)
const tokenExchangeRates = state.metamask.tokenExchangeRates const tokenExchangeRate = getTokenExchangeRate(state, symbol)
const pair = `${symbol.toLowerCase()}_eth`
const { rate: tokenExchangeRate = 0 } = tokenExchangeRates[pair] || {}
return { return {
conversionRate, conversionRate,
@ -86,17 +94,14 @@ ConfirmSendToken.prototype.getGasFee = function () {
const txParams = txMeta.txParams || {} const txParams = txMeta.txParams || {}
const { decimals } = token const { decimals } = token
// Gas
const gas = txParams.gas const gas = txParams.gas
const gasBn = hexToBn(gas)
// Gas Price
const gasPrice = txParams.gasPrice || MIN_GAS_PRICE_BN.toString(16) const gasPrice = txParams.gasPrice || MIN_GAS_PRICE_BN.toString(16)
const gasPriceBn = hexToBn(gasPrice) const gasTotal = multiplyCurrencies(gas, gasPrice, {
const txFeeBn = gasBn.mul(gasPriceBn) multiplicandBase: 16,
multiplierBase: 16,
})
const USD = conversionUtil(txFeeBn, { const USD = conversionUtil(gasTotal, {
fromNumericBase: 'BN', fromNumericBase: 'BN',
toNumericBase: 'dec', toNumericBase: 'dec',
fromDenomination: 'WEI', fromDenomination: 'WEI',
@ -105,7 +110,7 @@ ConfirmSendToken.prototype.getGasFee = function () {
numberOfDecimals: 2, numberOfDecimals: 2,
conversionRate, conversionRate,
}) })
const ETH = conversionUtil(txFeeBn, { const ETH = conversionUtil(gasTotal, {
fromNumericBase: 'BN', fromNumericBase: 'BN',
toNumericBase: 'dec', toNumericBase: 'dec',
fromDenomination: 'WEI', fromDenomination: 'WEI',
@ -114,12 +119,22 @@ ConfirmSendToken.prototype.getGasFee = function () {
numberOfDecimals: 6, numberOfDecimals: 6,
conversionRate, conversionRate,
}) })
const tokenGas = multiplyCurrencies(gas, gasPrice, {
toNumericBase: 'dec',
multiplicandBase: 16,
multiplierBase: 16,
toCurrency: 'BAT',
conversionRate: tokenExchangeRate,
invertConversionRate: true,
fromDenomination: 'WEI',
numberOfDecimals: decimals || 4,
})
return { return {
fiat: +Number(USD).toFixed(2), fiat: +Number(USD).toFixed(2),
eth: ETH, eth: ETH,
token: tokenExchangeRate token: tokenExchangeRate
? +(ETH * tokenExchangeRate).toFixed(decimals) ? tokenGas
: null, : null,
} }
} }
@ -196,6 +211,8 @@ ConfirmSendToken.prototype.renderTotalPlusGas = function () {
const { fiat: fiatAmount, token: tokenAmount } = this.getAmount() const { fiat: fiatAmount, token: tokenAmount } = this.getAmount()
const { fiat: fiatGas, token: tokenGas } = this.getGasFee() const { fiat: fiatGas, token: tokenGas } = this.getGasFee()
const tokenTotal = addCurrencies(tokenAmount, tokenGas || '0')
return fiatAmount && fiatGas return fiatAmount && fiatGas
? ( ? (
h('section.flex-row.flex-center.confirm-screen-total-box ', [ h('section.flex-row.flex-center.confirm-screen-total-box ', [
@ -206,7 +223,7 @@ ConfirmSendToken.prototype.renderTotalPlusGas = function () {
h('div.confirm-screen-section-column', [ h('div.confirm-screen-section-column', [
h('div.confirm-screen-row-info', `$${fiatAmount + fiatGas} USD`), h('div.confirm-screen-row-info', `$${fiatAmount + fiatGas} USD`),
h('div.confirm-screen-row-detail', `${tokenAmount + tokenGas} ${symbol}`), h('div.confirm-screen-row-detail', `${tokenTotal} ${symbol}`),
]), ]),
]) ])
) )

@ -147,16 +147,16 @@ const addCurrencies = (a, b, options = {}) => {
const multiplyCurrencies = (a, b, options = {}) => { const multiplyCurrencies = (a, b, options = {}) => {
const { const {
toNumericBase,
numberOfDecimals,
multiplicandBase, multiplicandBase,
multiplierBase, multiplierBase,
...conversionOptions,
} = options } = options
const value = (new BigNumber(a, multiplicandBase)).times(b, multiplierBase); const value = (new BigNumber(a, multiplicandBase)).times(b, multiplierBase);
return converter({ return converter({
value, value,
toNumericBase, ...conversionOptions,
numberOfDecimals,
}) })
} }

@ -6,6 +6,7 @@ const selectors = {
getSelectedAccount, getSelectedAccount,
getSelectedToken, getSelectedToken,
getSelectedTokenExchangeRate, getSelectedTokenExchangeRate,
getTokenExchangeRate,
conversionRateSelector, conversionRateSelector,
transactionsSelector, transactionsSelector,
accountsWithSendEtherInfoSelector, accountsWithSendEtherInfoSelector,
@ -57,7 +58,15 @@ function getSelectedTokenExchangeRate (state) {
return tokenExchangeRate return tokenExchangeRate
} }
function conversionRateSelector (state) { function getTokenExchangeRate (state, tokenSymbol) {
const pair = `${tokenSymbol.toLowerCase()}_eth`
const tokenExchangeRates = state.metamask.tokenExchangeRates
const { rate: tokenExchangeRate = 0 } = tokenExchangeRates[pair] || {}
return tokenExchangeRate
}
function conversionRateSelector (state) {
return state.metamask.conversionRate return state.metamask.conversionRate
} }

Loading…
Cancel
Save