diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index edac431a5..9987defdf 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -708,6 +708,10 @@ "gasLimitTooLow": { "message": "Gas limit must be at least 21000" }, + "gasLimitTooLowWithDynamicFee": { + "message": "Gas limit must be at least $1", + "description": "$1 is the custom gas limit, in decimal." + }, "gasPrice": { "message": "Gas Price (GWEI)" }, diff --git a/ui/app/components/app/gas-customization/advanced-gas-inputs/advanced-gas-inputs.component.js b/ui/app/components/app/gas-customization/advanced-gas-inputs/advanced-gas-inputs.component.js index 75319090d..6f299cbaa 100644 --- a/ui/app/components/app/gas-customization/advanced-gas-inputs/advanced-gas-inputs.component.js +++ b/ui/app/components/app/gas-customization/advanced-gas-inputs/advanced-gas-inputs.component.js @@ -3,6 +3,7 @@ import PropTypes from 'prop-types' import classnames from 'classnames' import { debounce } from 'lodash' import Tooltip from '../../../ui/tooltip' +import { MIN_GAS_LIMIT_DEC } from '../../../../pages/send/send.constants' export default class AdvancedGasInputs extends Component { static contextTypes = { @@ -18,6 +19,11 @@ export default class AdvancedGasInputs extends Component { customPriceIsSafe: PropTypes.bool, isSpeedUp: PropTypes.bool, customGasLimitMessage: PropTypes.string, + minimumGasLimit: PropTypes.number, + } + + static defaultProps = { + minimumGasLimit: MIN_GAS_LIMIT_DEC, } constructor (props) { @@ -84,7 +90,7 @@ export default class AdvancedGasInputs extends Component { return {} } - gasLimitError ({ insufficientBalance, gasLimit }) { + gasLimitError ({ insufficientBalance, gasLimit, minimumGasLimit }) { const { t } = this.context if (insufficientBalance) { @@ -92,9 +98,9 @@ export default class AdvancedGasInputs extends Component { errorText: t('insufficientBalance'), errorType: 'error', } - } else if (gasLimit < 21000) { + } else if (gasLimit < minimumGasLimit) { return { - errorText: t('gasLimitTooLow'), + errorText: t('gasLimitTooLowWithDynamicFee', [minimumGasLimit]), errorType: 'error', } } @@ -153,6 +159,7 @@ export default class AdvancedGasInputs extends Component { customPriceIsSafe, isSpeedUp, customGasLimitMessage, + minimumGasLimit, } = this.props const { gasPrice, @@ -172,7 +179,7 @@ export default class AdvancedGasInputs extends Component { const { errorText: gasLimitErrorText, errorType: gasLimitErrorType, - } = this.gasLimitError({ insufficientBalance, gasLimit }) + } = this.gasLimitError({ insufficientBalance, gasLimit, minimumGasLimit }) const gasLimitErrorComponent = gasLimitErrorType ? (
{ gasLimitErrorText } diff --git a/ui/app/components/app/gas-customization/advanced-gas-inputs/tests/advanced-gas-input-component.test.js b/ui/app/components/app/gas-customization/advanced-gas-inputs/tests/advanced-gas-input-component.test.js index a18e0e114..b47a224a6 100644 --- a/ui/app/components/app/gas-customization/advanced-gas-inputs/tests/advanced-gas-input-component.test.js +++ b/ui/app/components/app/gas-customization/advanced-gas-inputs/tests/advanced-gas-input-component.test.js @@ -17,6 +17,7 @@ describe('Advanced Gas Inputs', function () { insufficientBalance: false, customPriceIsSafe: true, isSpeedUp: false, + minimumGasLimit: 21000, } beforeEach(function () { @@ -91,7 +92,7 @@ describe('Advanced Gas Inputs', function () { assert.equal(renderError.length, 2) assert.equal(renderError.at(0).text(), 'zeroGasPriceOnSpeedUpError') - assert.equal(renderError.at(1).text(), 'gasLimitTooLow') + assert.equal(renderError.at(1).text(), 'gasLimitTooLowWithDynamicFee') }) it('warns when custom gas price is too low', function () { diff --git a/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/advanced-tab-content.component.js b/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/advanced-tab-content.component.js index 255012392..176fd9b12 100644 --- a/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/advanced-tab-content.component.js +++ b/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/advanced-tab-content.component.js @@ -27,6 +27,7 @@ export default class AdvancedTabContent extends Component { isSpeedUp: PropTypes.bool, isEthereumNetwork: PropTypes.bool, customGasLimitMessage: PropTypes.string, + minimumGasLimit: PropTypes.number.isRequired, } renderDataSummary (transactionFee, timeRemaining) { @@ -67,6 +68,7 @@ export default class AdvancedTabContent extends Component { transactionFee, isEthereumNetwork, customGasLimitMessage, + minimumGasLimit, } = this.props return ( @@ -83,6 +85,7 @@ export default class AdvancedTabContent extends Component { customPriceIsSafe={customPriceIsSafe} isSpeedUp={isSpeedUp} customGasLimitMessage={customGasLimitMessage} + minimumGasLimit={minimumGasLimit} />
{ isEthereumNetwork diff --git a/ui/app/components/app/gas-customization/gas-modal-page-container/gas-modal-page-container.component.js b/ui/app/components/app/gas-customization/gas-modal-page-container/gas-modal-page-container.component.js index 061f43a95..249b29ca7 100644 --- a/ui/app/components/app/gas-customization/gas-modal-page-container/gas-modal-page-container.component.js +++ b/ui/app/components/app/gas-customization/gas-modal-page-container/gas-modal-page-container.component.js @@ -53,7 +53,8 @@ export default class GasModalPageContainer extends Component { customTotalSupplement: PropTypes.string, isSwap: PropTypes.bool, value: PropTypes.string, - conversionRate: PropTypes.number, + conversionRate: PropTypes.string, + minimumGasLimit: PropTypes.number.isRequired, } state = { @@ -98,6 +99,7 @@ export default class GasModalPageContainer extends Component { }, isEthereumNetwork, customGasLimitMessage, + minimumGasLimit, } = this.props return ( @@ -116,6 +118,7 @@ export default class GasModalPageContainer extends Component { isSpeedUp={isSpeedUp} isRetry={isRetry} isEthereumNetwork={isEthereumNetwork} + minimumGasLimit={minimumGasLimit} /> ) } diff --git a/ui/app/components/app/gas-customization/gas-modal-page-container/gas-modal-page-container.container.js b/ui/app/components/app/gas-customization/gas-modal-page-container/gas-modal-page-container.container.js index 52aaf5162..c2275c247 100644 --- a/ui/app/components/app/gas-customization/gas-modal-page-container/gas-modal-page-container.container.js +++ b/ui/app/components/app/gas-customization/gas-modal-page-container/gas-modal-page-container.container.js @@ -62,6 +62,7 @@ import { calcGasTotal, isBalanceSufficient, } from '../../../../pages/send/send.utils' +import { MIN_GAS_LIMIT_DEC } from '../../../../pages/send/send.constants' import { calcMaxAmount } from '../../../../pages/send/send-content/send-amount-row/amount-max-button/amount-max-button.utils' import GasModalPageContainer from './gas-modal-page-container.component' @@ -75,6 +76,7 @@ const mapStateToProps = (state, ownProps) => { customTotalSupplement = '', extraInfoRow = null, useFastestButtons = false, + minimumGasLimit = MIN_GAS_LIMIT_DEC, } = modalProps || {} const { transaction = {} } = ownProps const selectedTransaction = isSwap @@ -202,6 +204,7 @@ const mapStateToProps = (state, ownProps) => { conversionRate, value, customTotalSupplement, + minimumGasLimit, } } @@ -264,6 +267,7 @@ const mergeProps = (stateProps, dispatchProps, ownProps) => { tokenBalance, customGasLimit, transaction, + minimumGasLimit, } = stateProps const { hideGasButtonGroup: dispatchHideGasButtonGroup, @@ -333,7 +337,7 @@ const mergeProps = (stateProps, dispatchProps, ownProps) => { disableSave: ( insufficientBalance || (isSpeedUp && customGasPrice === 0) || - customGasLimit < 21000 + customGasLimit < minimumGasLimit ), } } diff --git a/ui/app/components/app/gas-customization/gas-modal-page-container/tests/gas-modal-page-container-container.test.js b/ui/app/components/app/gas-customization/gas-modal-page-container/tests/gas-modal-page-container-container.test.js index 57514e5fa..00e15f943 100644 --- a/ui/app/components/app/gas-customization/gas-modal-page-container/tests/gas-modal-page-container-container.test.js +++ b/ui/app/components/app/gas-customization/gas-modal-page-container/tests/gas-modal-page-container-container.test.js @@ -63,6 +63,7 @@ describe('gas-modal-page-container container', function () { id: 34, }, extraInfoRow: { label: 'mockLabel', value: 'mockValue' }, + minimumGasLimit: 21000, }, }, }, @@ -170,6 +171,7 @@ describe('gas-modal-page-container container', function () { id: 34, }, value: '0x640000000000000', + minimumGasLimit: 21000, } const baseMockOwnProps = { transaction: { id: 34 } } const tests = [ diff --git a/ui/app/pages/swaps/view-quote/view-quote.js b/ui/app/pages/swaps/view-quote/view-quote.js index a94b2319b..371e75666 100644 --- a/ui/app/pages/swaps/view-quote/view-quote.js +++ b/ui/app/pages/swaps/view-quote/view-quote.js @@ -131,12 +131,11 @@ export default function ViewQuote () { .round(0) .toString(16) - const maxGasLimit = (customMaxGas || - hexMax( - (`0x${decimalToHex(usedQuote?.maxGas || 0)}`), - usedGasLimitWithMultiplier, - ) + const nonCustomMaxGasLimit = hexMax( + (`0x${decimalToHex(usedQuote?.maxGas || 0)}`), + usedGasLimitWithMultiplier, ) + const maxGasLimit = customMaxGas || nonCustomMaxGasLimit const gasTotalInWeiHex = calcGasTotal(maxGasLimit, gasPrice) @@ -394,6 +393,7 @@ export default function ViewQuote () { : null ), useFastestButtons: true, + minimumGasLimit: Number(hexToDecimal(nonCustomMaxGasLimit)), })) const tokenApprovalTextComponent = (