A Metamask fork with Infura removed and default networks editable
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
ciphermask/ui/app/selectors/custom-gas.js

299 lines
7.5 KiB

import { addHexPrefix } from '../../../app/scripts/lib/util'
import {
conversionUtil,
conversionGreaterThan,
} from '../helpers/utils/conversion-util'
import { formatCurrency } from '../helpers/utils/confirm-tx.util'
import { decEthToConvertedCurrency as ethTotalToConvertedCurrency } from '../helpers/utils/conversions.util'
import { formatETHFee } from '../helpers/utils/formatters'
import { calcGasTotal } from '../pages/send/send.utils'
import { GAS_ESTIMATE_TYPES } from '../helpers/constants/common'
import { getCurrentCurrency, getIsMainnet, getPreferences } from '.'
const NUMBER_OF_DECIMALS_SM_BTNS = 5
export function getCustomGasLimit(state) {
return state.gas.customData.limit
}
export function getCustomGasPrice(state) {
return state.gas.customData.price
}
export function getBasicGasEstimateLoadingStatus(state) {
return state.gas.basicEstimateIsLoading
}
export function getAveragePriceEstimateInHexWEI(state) {
const averagePriceEstimate = state.gas.basicEstimates.average
return getGasPriceInHexWei(averagePriceEstimate || '0x0')
}
export function getFastPriceEstimateInHexWEI(state) {
const fastPriceEstimate = state.gas.basicEstimates.fast
return getGasPriceInHexWei(fastPriceEstimate || '0x0')
}
export function getDefaultActiveButtonIndex(
gasButtonInfo,
customGasPriceInHex,
gasPrice,
) {
return gasButtonInfo
.map(({ priceInHexWei }) => priceInHexWei)
.lastIndexOf(addHexPrefix(customGasPriceInHex || gasPrice))
}
export function getSafeLowEstimate(state) {
const {
gas: {
basicEstimates: { safeLow },
},
} = state
return safeLow
}
export function isCustomPriceSafe(state) {
const safeLow = getSafeLowEstimate(state)
const customGasPrice = getCustomGasPrice(state)
if (!customGasPrice) {
return true
}
if (safeLow === null) {
return false
}
const customPriceSafe = conversionGreaterThan(
{
value: customGasPrice,
fromNumericBase: 'hex',
fromDenomination: 'WEI',
toDenomination: 'GWEI',
},
{ value: safeLow, fromNumericBase: 'dec' },
)
return customPriceSafe
}
export function basicPriceEstimateToETHTotal(
estimate,
gasLimit,
numberOfDecimals = 9,
) {
return conversionUtil(calcGasTotal(gasLimit, estimate), {
fromNumericBase: 'hex',
toNumericBase: 'dec',
fromDenomination: 'GWEI',
numberOfDecimals,
})
}
export function getRenderableEthFee(estimate, gasLimit, numberOfDecimals = 9) {
const value = conversionUtil(estimate, {
fromNumericBase: 'dec',
toNumericBase: 'hex',
})
const fee = basicPriceEstimateToETHTotal(value, gasLimit, numberOfDecimals)
return formatETHFee(fee)
}
export function getRenderableConvertedCurrencyFee(
estimate,
gasLimit,
convertedCurrency,
conversionRate,
) {
const value = conversionUtil(estimate, {
fromNumericBase: 'dec',
toNumericBase: 'hex',
})
const fee = basicPriceEstimateToETHTotal(value, gasLimit)
const feeInCurrency = ethTotalToConvertedCurrency(
fee,
convertedCurrency,
conversionRate,
)
return formatCurrency(feeInCurrency, convertedCurrency)
}
export function priceEstimateToWei(priceEstimate) {
return conversionUtil(priceEstimate, {
fromNumericBase: 'hex',
toNumericBase: 'hex',
fromDenomination: 'GWEI',
toDenomination: 'WEI',
numberOfDecimals: 9,
})
}
export function getGasPriceInHexWei(price) {
const value = conversionUtil(price, {
fromNumericBase: 'dec',
toNumericBase: 'hex',
})
return addHexPrefix(priceEstimateToWei(value))
}
export function getRenderableGasButtonData(
estimates,
gasLimit,
showFiat,
conversionRate,
currentCurrency,
) {
const { safeLow, average, fast } = estimates
const slowEstimateData = {
gasEstimateType: GAS_ESTIMATE_TYPES.SLOW,
feeInPrimaryCurrency: getRenderableEthFee(safeLow, gasLimit),
feeInSecondaryCurrency: showFiat
? getRenderableConvertedCurrencyFee(
safeLow,
gasLimit,
currentCurrency,
conversionRate,
)
: '',
priceInHexWei: getGasPriceInHexWei(safeLow),
}
const averageEstimateData = {
gasEstimateType: GAS_ESTIMATE_TYPES.AVERAGE,
feeInPrimaryCurrency: getRenderableEthFee(average, gasLimit),
feeInSecondaryCurrency: showFiat
? getRenderableConvertedCurrencyFee(
average,
gasLimit,
currentCurrency,
conversionRate,
)
: '',
priceInHexWei: getGasPriceInHexWei(average),
}
const fastEstimateData = {
gasEstimateType: GAS_ESTIMATE_TYPES.FAST,
feeInPrimaryCurrency: getRenderableEthFee(fast, gasLimit),
feeInSecondaryCurrency: showFiat
? getRenderableConvertedCurrencyFee(
fast,
gasLimit,
currentCurrency,
conversionRate,
)
: '',
priceInHexWei: getGasPriceInHexWei(fast),
}
return {
slowEstimateData,
averageEstimateData,
fastEstimateData,
}
}
export function getRenderableBasicEstimateData(state, gasLimit) {
if (getBasicGasEstimateLoadingStatus(state)) {
return []
}
const { showFiatInTestnets } = getPreferences(state)
const isMainnet = getIsMainnet(state)
const showFiat = isMainnet || Boolean(showFiatInTestnets)
const { conversionRate } = state.metamask
const currentCurrency = getCurrentCurrency(state)
const {
slowEstimateData,
averageEstimateData,
fastEstimateData,
} = getRenderableGasButtonData(
state.gas.basicEstimates,
gasLimit,
showFiat,
conversionRate,
currentCurrency,
)
return [slowEstimateData, averageEstimateData, fastEstimateData]
}
export function getRenderableEstimateDataForSmallButtonsFromGWEI(state) {
if (getBasicGasEstimateLoadingStatus(state)) {
return []
}
const { showFiatInTestnets } = getPreferences(state)
const isMainnet = getIsMainnet(state)
const showFiat = isMainnet || Boolean(showFiatInTestnets)
const gasLimit =
state.metamask.send.gasLimit || getCustomGasLimit(state) || '0x5208'
const { conversionRate } = state.metamask
const currentCurrency = getCurrentCurrency(state)
const {
gas: {
basicEstimates: { safeLow, average, fast },
},
} = state
return [
{
gasEstimateType: GAS_ESTIMATE_TYPES.SLOW,
feeInSecondaryCurrency: showFiat
? getRenderableConvertedCurrencyFee(
safeLow,
gasLimit,
currentCurrency,
conversionRate,
)
: '',
feeInPrimaryCurrency: getRenderableEthFee(
safeLow,
gasLimit,
NUMBER_OF_DECIMALS_SM_BTNS,
true,
),
priceInHexWei: getGasPriceInHexWei(safeLow, true),
},
{
gasEstimateType: GAS_ESTIMATE_TYPES.AVERAGE,
feeInSecondaryCurrency: showFiat
? getRenderableConvertedCurrencyFee(
average,
gasLimit,
currentCurrency,
conversionRate,
)
: '',
feeInPrimaryCurrency: getRenderableEthFee(
average,
gasLimit,
NUMBER_OF_DECIMALS_SM_BTNS,
true,
),
priceInHexWei: getGasPriceInHexWei(average, true),
},
{
gasEstimateType: GAS_ESTIMATE_TYPES.FAST,
feeInSecondaryCurrency: showFiat
? getRenderableConvertedCurrencyFee(
fast,
gasLimit,
currentCurrency,
conversionRate,
)
: '',
feeInPrimaryCurrency: getRenderableEthFee(
fast,
gasLimit,
NUMBER_OF_DECIMALS_SM_BTNS,
true,
),
priceInHexWei: getGasPriceInHexWei(fast, true),
},
]
}