diff --git a/CHANGELOG.md b/CHANGELOG.md index c75f7aaaba..06659b474b 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 094fa80272..b8821db959 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 f688c4e76b..62158b829b 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 2f82b506ca..24cc504b12 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 1d6830abab..784ead5c33 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 cc2446934d..78f9540428 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 0a2cb8557e..dbc980eec2 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 603454c206..db80d44e79 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 a13668e930..ea591808af 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 c28198b489..6d232cfa22 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 59598bd6ac..8a51256e9c 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 7ccef3ee42..88a171dabb 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 a237af1456..20e883c4ee 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 fd8e5762ac..ad3e3a155e 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 93d797cd06..8ad3d70d45 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 5ebc4d7cd4..9e8c20aa0b 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 ae3f0ce48a..2b5ce2a6d7 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 4ceae8e431..e3d7b2aa23 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 83543ec3d9..03f2b638cd 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) + }) + } }