From e5d54afe804dea073948b598c47a7fc9ec04f1a8 Mon Sep 17 00:00:00 2001 From: Dan J Miller Date: Fri, 2 Jul 2021 13:01:27 -0230 Subject: [PATCH] Ensure transaction controller correctly estimates gas for special custom networks (#11441) --- app/scripts/controllers/transactions/index.js | 10 +++++++++- app/scripts/lib/util.js | 14 ++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/app/scripts/controllers/transactions/index.js b/app/scripts/controllers/transactions/index.js index 95d5e533d..3f6948f06 100644 --- a/app/scripts/controllers/transactions/index.js +++ b/app/scripts/controllers/transactions/index.js @@ -15,6 +15,7 @@ import { bnToHex, BnMultiplyByFraction, addHexPrefix, + getChainType, } from '../../lib/util'; import { TRANSACTION_NO_CONTRACT_ERROR_KEY } from '../../../../ui/helpers/constants/error-keys'; import { getSwapsTokensReceivedFromTxMeta } from '../../../../ui/pages/swaps/swaps.util'; @@ -24,6 +25,7 @@ import { } from '../../../../shared/constants/transaction'; import { METAMASK_CONTROLLER_EVENTS } from '../../metamask-controller'; import { GAS_LIMITS } from '../../../../shared/constants/gas'; +import { CHAIN_ID_TO_GAS_LIMIT_BUFFER_MAP } from '../../../../shared/constants/network'; import { isEIP1559Transaction } from '../../../../shared/modules/transaction.utils'; import TransactionStateManager from './tx-state-manager'; import TxGasUtil from './tx-gas-utils'; @@ -356,11 +358,16 @@ export default class TransactionController extends EventEmitter { * @returns {Promise} Object containing the default gas limit, or the simulation failure object */ async _getDefaultGasLimit(txMeta, getCodeResponse) { + const chainId = this._getCurrentChainId(); + const customNetworkGasBuffer = CHAIN_ID_TO_GAS_LIMIT_BUFFER_MAP[chainId]; + const chainType = getChainType(chainId); + if (txMeta.txParams.gas) { return {}; } else if ( txMeta.txParams.to && - txMeta.type === TRANSACTION_TYPES.SENT_ETHER + txMeta.type === TRANSACTION_TYPES.SENT_ETHER && + chainType !== 'custom' ) { // if there's data in the params, but there's no contract code, it's not a valid transaction if (txMeta.txParams.data) { @@ -389,6 +396,7 @@ export default class TransactionController extends EventEmitter { const gasLimit = this.txGasUtil.addGasBuffer( addHexPrefix(estimatedGasHex), blockGasLimit, + customNetworkGasBuffer, ); return { gasLimit, simulationFails }; } diff --git a/app/scripts/lib/util.js b/app/scripts/lib/util.js index 126e5c4f6..1b5c8e7e7 100644 --- a/app/scripts/lib/util.js +++ b/app/scripts/lib/util.js @@ -3,6 +3,10 @@ import extension from 'extensionizer'; import { stripHexPrefix } from 'ethereumjs-util'; import BN from 'bn.js'; import { memoize } from 'lodash'; +import { + MAINNET_CHAIN_ID, + TEST_CHAINS, +} from '../../../shared/constants/network'; import { ENVIRONMENT_TYPE_POPUP, @@ -180,6 +184,15 @@ function bnToHex(inputBn) { return addHexPrefix(inputBn.toString(16)); } +function getChainType(chainId) { + if (chainId === MAINNET_CHAIN_ID) { + return 'mainnet'; + } else if (TEST_CHAINS.includes(chainId)) { + return 'testnet'; + } + return 'custom'; +} + export { getPlatform, getEnvironmentType, @@ -189,4 +202,5 @@ export { checkForError, addHexPrefix, bnToHex, + getChainType, };