From 83e509bc57b05ebd2c5f10e1eee6c51576c9b11d Mon Sep 17 00:00:00 2001 From: Vladislav Varadinov Date: Wed, 19 Oct 2022 19:21:59 +0300 Subject: [PATCH] refactor: optimize AnteHandler gas consumption (#1388) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor: antehandler order and params optimization * removed additional individual params for the feemarket module * typo fix * Apply suggestions from code review - Fede Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> * typo fix * formatted using gofumpt * typo fix - missed negate operator * missed to negate conditions * added unit tests for the new param getter methods * updated changelog * Apply suggestions from code review Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> * moved to improvements * Converted unit tests into table-driven tests * added Require().Equal() to test case Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> --- CHANGELOG.md | 1 + app/ante/ante_test.go | 2 +- app/ante/eth.go | 36 ++++++------ app/ante/fee_market.go | 8 +-- app/ante/fees.go | 8 +-- app/ante/handler_options.go | 6 +- app/ante/interfaces.go | 6 ++ ethereum/eip712/preprocess_test.go | 8 ++- tests/rpc/ws_test.go | 5 +- x/evm/keeper/params.go | 35 ++++++++++++ x/evm/keeper/params_test.go | 89 ++++++++++++++++++++++++++++-- x/evm/types/access_list_tx_test.go | 2 +- x/evm/types/dynamic_fee_tx_test.go | 6 +- x/evm/types/genesis_test.go | 4 +- x/evm/types/logs_test.go | 1 - x/evm/types/tx_args_test.go | 32 +++++------ x/evm/types/utils_test.go | 2 +- x/feemarket/keeper/params.go | 9 +++ x/feemarket/keeper/params_test.go | 64 +++++++++++++++++++-- 19 files changed, 258 insertions(+), 66 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c75f7aaa..06659b47 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -52,6 +52,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### Improvements +* (ante) [\#1388](https://github.com/evmos/ethermint/pull/1388) Optimize AnteHandler gas consumption * (lint) [#1298](https://github.com/evmos/ethermint/pull/1298) 150 character line length limit, `gofumpt`, and linting * (feemarket) [\#1165](https://github.com/evmos/ethermint/pull/1165) Add hint in specs about different gas terminology in Cosmos and Ethereum. * (cli) [#1226](https://github.com/evmos/ethermint/pull/1226) Add custom app db backend flag. diff --git a/app/ante/ante_test.go b/app/ante/ante_test.go index 094fa802..b8821db9 100644 --- a/app/ante/ante_test.go +++ b/app/ante/ante_test.go @@ -344,7 +344,7 @@ func (suite AnteTestSuite) TestAnteHandler() { coinAmount := sdk.NewCoin(evmtypes.DefaultEVMDenom, sdk.NewInt(20)) gasAmount := sdk.NewCoins(coinAmount) gas := uint64(200000) - //reusing the gasAmount for deposit + // reusing the gasAmount for deposit deposit := sdk.NewCoins(coinAmount) txBuilder := suite.CreateTestEIP712SubmitProposal(from, privKey, "ethermint_9000-1", gas, gasAmount, deposit) return txBuilder.GetTx() diff --git a/app/ante/eth.go b/app/ante/eth.go index f688c4e7..62158b82 100644 --- a/app/ante/eth.go +++ b/app/ante/eth.go @@ -40,10 +40,8 @@ func NewEthSigVerificationDecorator(ek EVMKeeper) EthSigVerificationDecorator { // won't see the error message. func (esvd EthSigVerificationDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (newCtx sdk.Context, err error) { chainID := esvd.evmKeeper.ChainID() - - params := esvd.evmKeeper.GetParams(ctx) - - ethCfg := params.ChainConfig.EthereumConfig(chainID) + chainCfg := esvd.evmKeeper.GetChainConfig(ctx) + ethCfg := chainCfg.EthereumConfig(chainID) blockNum := big.NewInt(ctx.BlockHeight()) signer := ethtypes.MakeSigner(ethCfg, blockNum) @@ -53,8 +51,9 @@ func (esvd EthSigVerificationDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, s return ctx, sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "invalid message type %T, expected %T", msg, (*evmtypes.MsgEthereumTx)(nil)) } + allowUnprotectedTxs := esvd.evmKeeper.GetAllowUnprotectedTxs(ctx) ethTx := msgEthTx.AsTransaction() - if !params.AllowUnprotectedTxs && !ethTx.Protected() { + if !allowUnprotectedTxs && !ethTx.Protected() { return ctx, sdkerrors.Wrapf( sdkerrors.ErrNotSupported, "rejected unprotected Ethereum txs. Please EIP155 sign your transaction to protect it against replay-attacks") @@ -176,15 +175,13 @@ func NewEthGasConsumeDecorator( // - transaction or block gas meter runs out of gas // - sets the gas meter limit func (egcd EthGasConsumeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (sdk.Context, error) { - params := egcd.evmKeeper.GetParams(ctx) - - ethCfg := params.ChainConfig.EthereumConfig(egcd.evmKeeper.ChainID()) + chainCfg := egcd.evmKeeper.GetChainConfig(ctx) + ethCfg := chainCfg.EthereumConfig(egcd.evmKeeper.ChainID()) blockHeight := big.NewInt(ctx.BlockHeight()) homestead := ethCfg.IsHomestead(blockHeight) istanbul := ethCfg.IsIstanbul(blockHeight) london := ethCfg.IsLondon(blockHeight) - evmDenom := params.EvmDenom gasWanted := uint64(0) var events sdk.Events @@ -213,6 +210,7 @@ func (egcd EthGasConsumeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simula gasWanted += txData.GetGas() } + evmDenom := egcd.evmKeeper.GetEVMDenom(ctx) fees, priority, err := egcd.evmKeeper.DeductTxCostsFromUserBalance( ctx, *msgEthTx, @@ -436,9 +434,9 @@ func (vbd EthValidateBasicDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simu txFee := sdk.Coins{} txGasLimit := uint64(0) - params := vbd.evmKeeper.GetParams(ctx) + chainCfg := vbd.evmKeeper.GetChainConfig(ctx) chainID := vbd.evmKeeper.ChainID() - ethCfg := params.ChainConfig.EthereumConfig(chainID) + ethCfg := chainCfg.EthereumConfig(chainID) baseFee := vbd.evmKeeper.GetBaseFee(ctx, ethCfg) for _, msg := range protoTx.GetMsgs() { @@ -460,9 +458,12 @@ func (vbd EthValidateBasicDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simu } // return error if contract creation or call are disabled through governance - if !params.EnableCreate && txData.GetTo() == nil { + enableCreate := vbd.evmKeeper.GetEnableCreate(ctx) + enableCall := vbd.evmKeeper.GetEnableCall(ctx) + + if !enableCreate && txData.GetTo() == nil { return ctx, sdkerrors.Wrap(evmtypes.ErrCreateDisabled, "failed to create new contract") - } else if !params.EnableCall && txData.GetTo() != nil { + } else if !enableCall && txData.GetTo() != nil { return ctx, sdkerrors.Wrap(evmtypes.ErrCallDisabled, "failed to call contract") } @@ -470,7 +471,8 @@ func (vbd EthValidateBasicDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simu return ctx, sdkerrors.Wrap(ethtypes.ErrTxTypeNotSupported, "dynamic fee tx not supported") } - txFee = txFee.Add(sdk.NewCoin(params.EvmDenom, sdkmath.NewIntFromBigInt(txData.Fee()))) + evmDenom := vbd.evmKeeper.GetEVMDenom(ctx) + txFee = txFee.Add(sdk.NewCoin(evmDenom, sdkmath.NewIntFromBigInt(txData.Fee()))) } authInfo := protoTx.AuthInfo @@ -546,8 +548,8 @@ func NewEthMempoolFeeDecorator(ek EVMKeeper) EthMempoolFeeDecorator { // It only do the check if london hardfork not enabled or feemarket not enabled, because in that case feemarket will take over the task. func (mfd EthMempoolFeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (newCtx sdk.Context, err error) { if ctx.IsCheckTx() && !simulate { - params := mfd.evmKeeper.GetParams(ctx) - ethCfg := params.ChainConfig.EthereumConfig(mfd.evmKeeper.ChainID()) + chainCfg := mfd.evmKeeper.GetChainConfig(ctx) + ethCfg := chainCfg.EthereumConfig(mfd.evmKeeper.ChainID()) baseFee := mfd.evmKeeper.GetBaseFee(ctx, ethCfg) if baseFee == nil { for _, msg := range tx.GetMsgs() { @@ -556,7 +558,7 @@ func (mfd EthMempoolFeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulat return ctx, sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "invalid message type %T, expected %T", msg, (*evmtypes.MsgEthereumTx)(nil)) } - evmDenom := params.EvmDenom + evmDenom := mfd.evmKeeper.GetEVMDenom(ctx) feeAmt := ethMsg.GetFee() glDec := sdk.NewDec(int64(ethMsg.GetGas())) requiredFee := ctx.MinGasPrices().AmountOf(evmDenom).Mul(glDec) diff --git a/app/ante/fee_market.go b/app/ante/fee_market.go index 2f82b506..24cc504b 100644 --- a/app/ante/fee_market.go +++ b/app/ante/fee_market.go @@ -27,8 +27,8 @@ func NewGasWantedDecorator( } func (gwd GasWantedDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (newCtx sdk.Context, err error) { - params := gwd.evmKeeper.GetParams(ctx) - ethCfg := params.ChainConfig.EthereumConfig(gwd.evmKeeper.ChainID()) + chainCfg := gwd.evmKeeper.GetChainConfig(ctx) + ethCfg := chainCfg.EthereumConfig(gwd.evmKeeper.ChainID()) blockHeight := big.NewInt(ctx.BlockHeight()) isLondon := ethCfg.IsLondon(blockHeight) @@ -39,10 +39,10 @@ func (gwd GasWantedDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bo } gasWanted := feeTx.GetGas() - feeMktParams := gwd.feeMarketKeeper.GetParams(ctx) + isBaseFeeEnabled := gwd.feeMarketKeeper.GetBaseFeeEnabled(ctx) // Add total gasWanted to cumulative in block transientStore in FeeMarket module - if feeMktParams.IsBaseFeeEnabled(ctx.BlockHeight()) { + if isBaseFeeEnabled { if _, err := gwd.feeMarketKeeper.AddTransientGasWanted(ctx, gasWanted); err != nil { return ctx, sdkerrors.Wrapf(err, "failed to add gas wanted to transient store") } diff --git a/app/ante/fees.go b/app/ante/fees.go index 1d6830ab..784ead5c 100644 --- a/app/ante/fees.go +++ b/app/ante/fees.go @@ -37,10 +37,10 @@ func (mpd MinGasPriceDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate return next(ctx, tx, simulate) } - evmParams := mpd.evmKeeper.GetParams(ctx) + evmDenom := mpd.evmKeeper.GetEVMDenom(ctx) minGasPrices := sdk.DecCoins{ { - Denom: evmParams.EvmDenom, + Denom: evmDenom, Amount: minGasPrice, }, } @@ -93,8 +93,8 @@ func (empd EthMinGasPriceDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simul return next(ctx, tx, simulate) } - paramsEvm := empd.evmKeeper.GetParams(ctx) - ethCfg := paramsEvm.ChainConfig.EthereumConfig(empd.evmKeeper.ChainID()) + chainCfg := empd.evmKeeper.GetChainConfig(ctx) + ethCfg := chainCfg.EthereumConfig(empd.evmKeeper.ChainID()) baseFee := empd.evmKeeper.GetBaseFee(ctx, ethCfg) for _, msg := range tx.GetMsgs() { diff --git a/app/ante/handler_options.go b/app/ante/handler_options.go index cc244693..78f95404 100644 --- a/app/ante/handler_options.go +++ b/app/ante/handler_options.go @@ -20,7 +20,7 @@ type HandlerOptions struct { AccountKeeper evmtypes.AccountKeeper BankKeeper evmtypes.BankKeeper IBCKeeper *ibckeeper.Keeper - FeeMarketKeeper evmtypes.FeeMarketKeeper + FeeMarketKeeper FeeMarketKeeper EvmKeeper EVMKeeper FeegrantKeeper ante.FeegrantKeeper SignModeHandler authsigning.SignModeHandler @@ -70,9 +70,9 @@ func newCosmosAnteHandler(options HandlerOptions) sdk.AnteHandler { RejectMessagesDecorator{}, // reject MsgEthereumTxs ante.NewSetUpContextDecorator(), ante.NewExtensionOptionsDecorator(options.ExtensionOptionChecker), - NewMinGasPriceDecorator(options.FeeMarketKeeper, options.EvmKeeper), ante.NewValidateBasicDecorator(), ante.NewTxTimeoutHeightDecorator(), + NewMinGasPriceDecorator(options.FeeMarketKeeper, options.EvmKeeper), ante.NewValidateMemoDecorator(options.AccountKeeper), ante.NewConsumeGasForTxSizeDecorator(options.AccountKeeper), ante.NewDeductFeeDecorator(options.AccountKeeper, options.BankKeeper, options.FeegrantKeeper, options.TxFeeChecker), @@ -93,9 +93,9 @@ func newCosmosAnteHandlerEip712(options HandlerOptions) sdk.AnteHandler { ante.NewSetUpContextDecorator(), // NOTE: extensions option decorator removed // ante.NewRejectExtensionOptionsDecorator(), - NewMinGasPriceDecorator(options.FeeMarketKeeper, options.EvmKeeper), ante.NewValidateBasicDecorator(), ante.NewTxTimeoutHeightDecorator(), + NewMinGasPriceDecorator(options.FeeMarketKeeper, options.EvmKeeper), ante.NewValidateMemoDecorator(options.AccountKeeper), ante.NewConsumeGasForTxSizeDecorator(options.AccountKeeper), ante.NewDeductFeeDecorator(options.AccountKeeper, options.BankKeeper, options.FeegrantKeeper, options.TxFeeChecker), diff --git a/app/ante/interfaces.go b/app/ante/interfaces.go index 0a2cb855..dbc980ee 100644 --- a/app/ante/interfaces.go +++ b/app/ante/interfaces.go @@ -34,6 +34,11 @@ type EVMKeeper interface { GetBalance(ctx sdk.Context, addr common.Address) *big.Int ResetTransientGasUsed(ctx sdk.Context) GetTxIndexTransient(ctx sdk.Context) uint64 + GetChainConfig(ctx sdk.Context) evmtypes.ChainConfig + GetEVMDenom(ctx sdk.Context) string + GetEnableCreate(ctx sdk.Context) bool + GetEnableCall(ctx sdk.Context) bool + GetAllowUnprotectedTxs(ctx sdk.Context) bool } type protoTxProvider interface { @@ -44,4 +49,5 @@ type protoTxProvider interface { type FeeMarketKeeper interface { GetParams(ctx sdk.Context) (params feemarkettypes.Params) AddTransientGasWanted(ctx sdk.Context, gasWanted uint64) (uint64, error) + GetBaseFeeEnabled(ctx sdk.Context) bool } diff --git a/ethereum/eip712/preprocess_test.go b/ethereum/eip712/preprocess_test.go index 603454c2..db80d44e 100644 --- a/ethereum/eip712/preprocess_test.go +++ b/ethereum/eip712/preprocess_test.go @@ -23,9 +23,11 @@ import ( ) // Testing Constants -var chainId = "ethermint_9000-1" -var ctx = client.Context{}.WithTxConfig( - encoding.MakeConfig(app.ModuleBasics).TxConfig, +var ( + chainId = "ethermint_9000-1" + ctx = client.Context{}.WithTxConfig( + encoding.MakeConfig(app.ModuleBasics).TxConfig, + ) ) var feePayerAddress = "ethm17xpfvakm2amg962yls6f84z3kell8c5lthdzgl" diff --git a/tests/rpc/ws_test.go b/tests/rpc/ws_test.go index a13668e9..ea591808 100644 --- a/tests/rpc/ws_test.go +++ b/tests/rpc/ws_test.go @@ -3,13 +3,14 @@ package rpc import ( "encoding/json" "fmt" - "github.com/gorilla/websocket" - "github.com/stretchr/testify/require" "net/url" "os" "strings" "testing" "time" + + "github.com/gorilla/websocket" + "github.com/stretchr/testify/require" ) var ( diff --git a/x/evm/keeper/params.go b/x/evm/keeper/params.go index c28198b4..6d232cfa 100644 --- a/x/evm/keeper/params.go +++ b/x/evm/keeper/params.go @@ -21,3 +21,38 @@ func (k Keeper) GetParams(ctx sdk.Context) (params types.Params) { func (k Keeper) SetParams(ctx sdk.Context, params types.Params) { k.paramSpace.SetParamSet(ctx, ¶ms) } + +// GetChainConfig returns the chain configuration parameter. +func (k Keeper) GetChainConfig(ctx sdk.Context) types.ChainConfig { + chainCfg := types.ChainConfig{} + k.paramSpace.GetIfExists(ctx, types.ParamStoreKeyChainConfig, &chainCfg) + return chainCfg +} + +// GetEVMDenom returns the EVM denom. +func (k Keeper) GetEVMDenom(ctx sdk.Context) string { + evmDenom := "" + k.paramSpace.GetIfExists(ctx, types.ParamStoreKeyEVMDenom, &evmDenom) + return evmDenom +} + +// GetEnableCall returns true if the EVM Call operation is enabled. +func (k Keeper) GetEnableCall(ctx sdk.Context) bool { + enableCall := false + k.paramSpace.GetIfExists(ctx, types.ParamStoreKeyEnableCall, &enableCall) + return enableCall +} + +// GetEnableCreate returns true if the EVM Create contract operation is enabled. +func (k Keeper) GetEnableCreate(ctx sdk.Context) bool { + enableCreate := false + k.paramSpace.GetIfExists(ctx, types.ParamStoreKeyEnableCreate, &enableCreate) + return enableCreate +} + +// GetAllowUnprotectedTxs returns true if unprotected txs (i.e non-replay protected as per EIP-155) are supported by the chain. +func (k Keeper) GetAllowUnprotectedTxs(ctx sdk.Context) bool { + allowUnprotectedTx := false + k.paramSpace.GetIfExists(ctx, types.ParamStoreKeyAllowUnprotectedTxs, &allowUnprotectedTx) + return allowUnprotectedTx +} diff --git a/x/evm/keeper/params_test.go b/x/evm/keeper/params_test.go index 59598bd6..8a51256e 100644 --- a/x/evm/keeper/params_test.go +++ b/x/evm/keeper/params_test.go @@ -2,13 +2,94 @@ package keeper_test import ( "github.com/evmos/ethermint/x/evm/types" + "reflect" ) func (suite *KeeperTestSuite) TestParams() { params := suite.app.EvmKeeper.GetParams(suite.ctx) - suite.Require().Equal(types.DefaultParams(), params) - params.EvmDenom = "inj" suite.app.EvmKeeper.SetParams(suite.ctx, params) - newParams := suite.app.EvmKeeper.GetParams(suite.ctx) - suite.Require().Equal(newParams, params) + testCases := []struct { + name string + paramsFun func() interface{} + getFun func() interface{} + expected bool + }{ + { + "success - Checks if the default params are set correctly", + func() interface{} { + return types.DefaultParams() + }, + func() interface{} { + return suite.app.EvmKeeper.GetParams(suite.ctx) + }, + true, + }, + { + "success - EvmDenom param is set to \"inj\" and can be retrieved correctly", + func() interface{} { + params.EvmDenom = "inj" + suite.app.EvmKeeper.SetParams(suite.ctx, params) + return params.EvmDenom + }, + func() interface{} { + return suite.app.EvmKeeper.GetEVMDenom(suite.ctx) + }, + true, + }, + { + "success - Check EnableCreate param is set to false and can be retrieved correctly", + func() interface{} { + params.EnableCreate = false + suite.app.EvmKeeper.SetParams(suite.ctx, params) + return params.EnableCreate + }, + func() interface{} { + return suite.app.EvmKeeper.GetEnableCreate(suite.ctx) + }, + true, + }, + { + "success - Check EnableCall param is set to false and can be retrieved correctly", + func() interface{} { + params.EnableCall = false + suite.app.EvmKeeper.SetParams(suite.ctx, params) + return params.EnableCall + }, + func() interface{} { + return suite.app.EvmKeeper.GetEnableCall(suite.ctx) + }, + true, + }, + { + "success - Check AllowUnprotectedTxs param is set to false and can be retrieved correctly", + func() interface{} { + params.AllowUnprotectedTxs = false + suite.app.EvmKeeper.SetParams(suite.ctx, params) + return params.AllowUnprotectedTxs + }, + func() interface{} { + return suite.app.EvmKeeper.GetAllowUnprotectedTxs(suite.ctx) + }, + true, + }, + { + "success - Check ChainConfig param is set to the default value and can be retrieved correctly", + func() interface{} { + params.ChainConfig = types.DefaultChainConfig() + suite.app.EvmKeeper.SetParams(suite.ctx, params) + return params.ChainConfig + }, + func() interface{} { + return suite.app.EvmKeeper.GetChainConfig(suite.ctx) + }, + true, + }, + } + for _, tc := range testCases { + suite.Run(tc.name, func() { + outcome := reflect.DeepEqual(tc.paramsFun(), tc.getFun()) + suite.Require().Equal(tc.expected, outcome) + }) + } + } diff --git a/x/evm/types/access_list_tx_test.go b/x/evm/types/access_list_tx_test.go index 7ccef3ee..88a171da 100644 --- a/x/evm/types/access_list_tx_test.go +++ b/x/evm/types/access_list_tx_test.go @@ -60,7 +60,7 @@ func (suite *TxDataTestSuite) TestAccessListTxGetGasFeeCap() { func (suite *TxDataTestSuite) TestEmptyAccessList() { testCases := []struct { name string - tx AccessListTx + tx AccessListTx }{ { "empty access list tx", diff --git a/x/evm/types/dynamic_fee_tx_test.go b/x/evm/types/dynamic_fee_tx_test.go index a237af14..20e883c4 100644 --- a/x/evm/types/dynamic_fee_tx_test.go +++ b/x/evm/types/dynamic_fee_tx_test.go @@ -627,7 +627,7 @@ func (suite *TxDataTestSuite) TestDynamicFeeTxEffectiveFee() { DynamicFeeTx{ GasTipCap: &suite.sdkInt, GasFeeCap: &suite.sdkInt, - GasLimit: uint64(1), + GasLimit: uint64(1), }, (&suite.sdkInt).BigInt(), (&suite.sdkInt).BigInt(), @@ -653,8 +653,8 @@ func (suite *TxDataTestSuite) TestDynamicFeeTxEffectiveCost() { DynamicFeeTx{ GasTipCap: &suite.sdkInt, GasFeeCap: &suite.sdkInt, - GasLimit: uint64(1), - Amount: &suite.sdkZeroInt, + GasLimit: uint64(1), + Amount: &suite.sdkZeroInt, }, (&suite.sdkInt).BigInt(), (&suite.sdkInt).BigInt(), diff --git a/x/evm/types/genesis_test.go b/x/evm/types/genesis_test.go index fd8e5762..ad3e3a15 100644 --- a/x/evm/types/genesis_test.go +++ b/x/evm/types/genesis_test.go @@ -116,9 +116,9 @@ func (suite *GenesisTestSuite) TestValidateGenesis() { expPass: false, }, { - name: "copied genesis", + name: "copied genesis", genState: NewGenesisState(DefaultGenesisState().Params, DefaultGenesisState().Accounts), - expPass: true, + expPass: true, }, { name: "invalid genesis", diff --git a/x/evm/types/logs_test.go b/x/evm/types/logs_test.go index 93d797cd..8ad3d70d 100644 --- a/x/evm/types/logs_test.go +++ b/x/evm/types/logs_test.go @@ -198,4 +198,3 @@ func TestConversionFunctions(t *testing.T) { require.Nil(t, conversionErr) require.Nil(t, copyErr) } - diff --git a/x/evm/types/tx_args_test.go b/x/evm/types/tx_args_test.go index 5ebc4d7c..9e8c20aa 100644 --- a/x/evm/types/tx_args_test.go +++ b/x/evm/types/tx_args_test.go @@ -11,9 +11,9 @@ import ( func (suite *TxDataTestSuite) TestTxArgsString() { testCases := []struct { - name string - txArgs TransactionArgs - expectedString string + name string + txArgs TransactionArgs + expectedString string }{ { "empty tx args", @@ -32,25 +32,25 @@ func (suite *TxDataTestSuite) TestTxArgsString() { AccessList: ðtypes.AccessList{}, }, fmt.Sprintf("TransactionArgs{From:%v, To:%v, Gas:%v, Nonce:%v, Data:%v, Input:%v, AccessList:%v}", - &suite.addr, - &suite.addr, - &suite.hexUint64, - &suite.hexUint64, - &suite.hexDataBytes, - &suite.hexInputBytes, - ðtypes.AccessList{}), + &suite.addr, + &suite.addr, + &suite.hexUint64, + &suite.hexUint64, + &suite.hexDataBytes, + &suite.hexInputBytes, + ðtypes.AccessList{}), }, } for _, tc := range testCases { outputString := tc.txArgs.String() - suite.Require().Equal(outputString, tc.expectedString) + suite.Require().Equal(outputString, tc.expectedString) } } func (suite *TxDataTestSuite) TestConvertTxArgsEthTx() { testCases := []struct { - name string - txArgs TransactionArgs + name string + txArgs TransactionArgs }{ { "empty tx args", @@ -227,9 +227,9 @@ func (suite *TxDataTestSuite) TestToMessageEVM() { func (suite *TxDataTestSuite) TestGetFrom() { testCases := []struct { - name string - txArgs TransactionArgs - expAddress common.Address + name string + txArgs TransactionArgs + expAddress common.Address }{ { "empty from field", diff --git a/x/evm/types/utils_test.go b/x/evm/types/utils_test.go index ae3f0ce4..2b5ce2a6 100644 --- a/x/evm/types/utils_test.go +++ b/x/evm/types/utils_test.go @@ -113,4 +113,4 @@ func TestTransactionLogsEncodeDecode(t *testing.T) { txLogsEncodedDecoded, decodeErr := evmtypes.DecodeTransactionLogs(txLogsEncoded) require.Nil(t, decodeErr) require.Equal(t, txLogs, txLogsEncodedDecoded) -} \ No newline at end of file +} diff --git a/x/feemarket/keeper/params.go b/x/feemarket/keeper/params.go index 4ceae8e4..e3d7b2aa 100644 --- a/x/feemarket/keeper/params.go +++ b/x/feemarket/keeper/params.go @@ -28,6 +28,15 @@ func (k Keeper) SetParams(ctx sdk.Context, params types.Params) { // Required by EIP1559 base fee calculation. // ---------------------------------------------------------------------------- +// GetBaseFeeEnabled returns true if base fee is enabled +func (k Keeper) GetBaseFeeEnabled(ctx sdk.Context) bool { + noBaseFee := false + enableHeight := int64(0) + k.paramSpace.GetIfExists(ctx, types.ParamStoreKeyNoBaseFee, &noBaseFee) + k.paramSpace.GetIfExists(ctx, types.ParamStoreKeyEnableHeight, &enableHeight) + return !noBaseFee && ctx.BlockHeight() >= enableHeight +} + // GetBaseFee get's the base fee from the paramSpace // return nil if base fee is not enabled func (k Keeper) GetBaseFee(ctx sdk.Context) *big.Int { diff --git a/x/feemarket/keeper/params_test.go b/x/feemarket/keeper/params_test.go index 83543ec3..03f2b638 100644 --- a/x/feemarket/keeper/params_test.go +++ b/x/feemarket/keeper/params_test.go @@ -2,13 +2,69 @@ package keeper_test import ( "github.com/evmos/ethermint/x/feemarket/types" + "reflect" ) func (suite *KeeperTestSuite) TestSetGetParams() { params := suite.app.FeeMarketKeeper.GetParams(suite.ctx) - suite.Require().Equal(types.DefaultParams(), params) - params.ElasticityMultiplier = 3 suite.app.FeeMarketKeeper.SetParams(suite.ctx, params) - newParams := suite.app.FeeMarketKeeper.GetParams(suite.ctx) - suite.Require().Equal(newParams, params) + testCases := []struct { + name string + paramsFun func() interface{} + getFun func() interface{} + expected bool + }{ + { + "success - Checks if the default params are set correctly", + func() interface{} { + return types.DefaultParams() + }, + func() interface{} { + return suite.app.FeeMarketKeeper.GetParams(suite.ctx) + }, + true, + }, + { + "success - Check ElasticityMultiplier is set to 3 and can be retrieved correctly", + func() interface{} { + params.ElasticityMultiplier = 3 + suite.app.FeeMarketKeeper.SetParams(suite.ctx, params) + return params.ElasticityMultiplier + }, + func() interface{} { + return suite.app.FeeMarketKeeper.GetParams(suite.ctx).ElasticityMultiplier + }, + true, + }, + { + "success - Check BaseFeeEnabled is computed with its default params and can be retrieved correctly", + func() interface{} { + suite.app.FeeMarketKeeper.SetParams(suite.ctx, types.DefaultParams()) + return true + }, + func() interface{} { + return suite.app.FeeMarketKeeper.GetBaseFeeEnabled(suite.ctx) + }, + true, + }, + { + "success - Check BaseFeeEnabled is computed with alternate params and can be retrieved correctly", + func() interface{} { + params.NoBaseFee = true + params.EnableHeight = 5 + suite.app.FeeMarketKeeper.SetParams(suite.ctx, params) + return true + }, + func() interface{} { + return suite.app.FeeMarketKeeper.GetBaseFeeEnabled(suite.ctx) + }, + false, + }, + } + for _, tc := range testCases { + suite.Run(tc.name, func() { + outcome := reflect.DeepEqual(tc.paramsFun(), tc.getFun()) + suite.Require().Equal(tc.expected, outcome) + }) + } }