mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-23 09:52:26 +01:00
Fix handling of arithmetic on token gas in confirm-send-token.
This commit is contained in:
parent
bd11e60b8c
commit
89af385a35
@ -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(gasTotal, {
|
||||||
const USD = conversionUtil(txFeeBn, {
|
|
||||||
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,6 +58,14 @@ function getSelectedTokenExchangeRate (state) {
|
|||||||
return tokenExchangeRate
|
return tokenExchangeRate
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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) {
|
function conversionRateSelector (state) {
|
||||||
return state.metamask.conversionRate
|
return state.metamask.conversionRate
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user