1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-11-26 12:29:06 +01:00

Fix 9874 - Improve gas maximum estimation (#10043)

This commit is contained in:
David Walsh 2020-12-15 11:16:51 -06:00 committed by Mark Stacey
parent 62b00f62db
commit b801ccdb35
4 changed files with 18 additions and 29 deletions

View File

@ -39,7 +39,6 @@ import { calcGasTotal } from '../../pages/send/send.utils'
import {
decimalToHex,
getValueFromWeiHex,
hexMax,
decGWEIToHexWEI,
hexToDecimal,
hexWEIToDecGWEI,
@ -67,6 +66,8 @@ const GAS_PRICES_LOADING_STATES = {
COMPLETED: 'COMPLETED',
}
export const FALLBACK_GAS_MULTIPLIER = 1.5
const initialState = {
aggregatorMetadata: null,
approveTxId: null,
@ -593,20 +594,16 @@ export const signAndSendTransactions = (history, metaMetricsEvent) => {
const usedQuote = getUsedQuote(state)
const usedTradeTxParams = usedQuote.trade
const estimatedGasLimit = new BigNumber(
usedQuote?.gasEstimate || decimalToHex(usedQuote?.averageGas || 0),
16,
)
const estimatedGasLimit = new BigNumber(usedQuote?.gasEstimate || `0x0`, 16)
const estimatedGasLimitWithMultiplier = estimatedGasLimit
.times(1.4, 10)
.times(usedQuote?.gasMultiplier || FALLBACK_GAS_MULTIPLIER, 10)
.round(0)
.toString(16)
const maxGasLimit =
customSwapsGas ||
hexMax(
`0x${decimalToHex(usedQuote?.maxGas || 0)}`,
estimatedGasLimitWithMultiplier,
)
(usedQuote?.gasEstimate
? estimatedGasLimitWithMultiplier
: usedQuote?.maxGas)
const usedGasPrice = getUsedSwapsGasPrice(state)
usedTradeTxParams.gas = maxGasLimit

View File

@ -1,4 +1,3 @@
import BigNumber from 'bignumber.js'
import { ETH, GWEI, WEI } from '../constants/common'
import { addHexPrefix } from '../../../../app/scripts/lib/util'
import {
@ -163,16 +162,6 @@ export function hexWEIToDecETH(hexWEI) {
})
}
export function hexMax(...hexNumbers) {
let max = hexNumbers[0]
hexNumbers.slice(1).forEach((hexNumber) => {
if (new BigNumber(hexNumber, 16).gt(max, 16)) {
max = hexNumber
}
})
return max
}
export function addHexes(aHexWEI, bHexWEI) {
return addCurrencies(aHexWEI, bHexWEI, {
aBase: 16,

View File

@ -112,6 +112,11 @@ const QUOTE_VALIDATORS = [
property: 'maxGas',
type: 'number',
},
{
property: 'gasEstimate',
type: 'number|undefined',
validator: (gasEstimate) => gasEstimate === undefined || gasEstimate > 0,
},
]
const TOKEN_VALIDATORS = [

View File

@ -12,6 +12,7 @@ import { useSwapsEthToken } from '../../../hooks/useSwapsEthToken'
import { MetaMetricsContext } from '../../../contexts/metametrics.new'
import FeeCard from '../fee-card'
import {
FALLBACK_GAS_MULTIPLIER,
getQuotes,
getSelectedQuote,
getApproveTxParams,
@ -57,7 +58,6 @@ import {
} from '../../../helpers/utils/token-util'
import {
decimalToHex,
hexMax,
hexToDecimal,
getValueFromWeiHex,
} from '../../../helpers/utils/conversions.util'
@ -123,18 +123,16 @@ export default function ViewQuote() {
usedQuote?.gasEstimateWithRefund ||
`0x${decimalToHex(usedQuote?.averageGas || 0)}`
const gasLimitForMax =
usedQuote?.gasEstimate || `0x${decimalToHex(usedQuote?.averageGas || 0)}`
const gasLimitForMax = usedQuote?.gasEstimate || `0x0`
const usedGasLimitWithMultiplier = new BigNumber(gasLimitForMax, 16)
.times(1.4, 10)
.times(usedQuote?.gasMultiplier || FALLBACK_GAS_MULTIPLIER, 10)
.round(0)
.toString(16)
const nonCustomMaxGasLimit = hexMax(
`0x${decimalToHex(usedQuote?.maxGas || 0)}`,
usedGasLimitWithMultiplier,
)
const nonCustomMaxGasLimit = usedQuote?.gasEstimate
? usedGasLimitWithMultiplier
: `0x${decimalToHex(usedQuote?.maxGas || 0)}`
const maxGasLimit = customMaxGas || nonCustomMaxGasLimit
const gasTotalInWeiHex = calcGasTotal(maxGasLimit, gasPrice)