diff --git a/app/ante/ante_test.go b/app/ante/ante_test.go index 491a41217d..0ae08bf9ac 100644 --- a/app/ante/ante_test.go +++ b/app/ante/ante_test.go @@ -6,11 +6,16 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/core/types" + ethparams "github.com/ethereum/go-ethereum/params" "github.com/tharsis/ethermint/tests" evmtypes "github.com/tharsis/ethermint/x/evm/types" ) func (suite AnteTestSuite) TestAnteHandler() { + suite.dynamicTxFee = false + suite.SetupTest() // reset + addr, privKey := tests.NewAddrKey() to := tests.GenerateAddress() @@ -145,3 +150,242 @@ func (suite AnteTestSuite) TestAnteHandler() { }) } } + +func (suite AnteTestSuite) TestAnteHandlerWithDynamicTxFee() { + suite.dynamicTxFee = true + suite.SetupTest() // reset + + addr, privKey := tests.NewAddrKey() + to := tests.GenerateAddress() + + acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, addr.Bytes()) + suite.Require().NoError(acc.SetSequence(1)) + suite.app.AccountKeeper.SetAccount(suite.ctx, acc) + + suite.app.EvmKeeper.AddBalance(addr, big.NewInt((ethparams.InitialBaseFee+10)*100000)) + + testCases := []struct { + name string + txFn func() sdk.Tx + checkTx bool + reCheckTx bool + expPass bool + }{ + { + "success - DeliverTx (contract)", + func() sdk.Tx { + signedContractTx := + evmtypes.NewTxContract( + suite.app.EvmKeeper.ChainID(), + 1, + big.NewInt(10), + 100000, + nil, + big.NewInt(ethparams.InitialBaseFee+1), + big.NewInt(1), + nil, + &types.AccessList{}, + ) + signedContractTx.From = addr.Hex() + + tx := suite.CreateTestTx(signedContractTx, privKey, 1, true) + return tx + }, + false, false, true, + }, + { + "success - CheckTx (contract)", + func() sdk.Tx { + signedContractTx := + evmtypes.NewTxContract( + suite.app.EvmKeeper.ChainID(), + 1, + big.NewInt(10), + 100000, + nil, + big.NewInt(ethparams.InitialBaseFee+1), + big.NewInt(1), + nil, + &types.AccessList{}, + ) + signedContractTx.From = addr.Hex() + + tx := suite.CreateTestTx(signedContractTx, privKey, 1, true) + return tx + }, + true, false, true, + }, + { + "success - ReCheckTx (contract)", + func() sdk.Tx { + signedContractTx := + evmtypes.NewTxContract( + suite.app.EvmKeeper.ChainID(), + 1, + big.NewInt(10), + 100000, + nil, + big.NewInt(ethparams.InitialBaseFee+1), + big.NewInt(1), + nil, + &types.AccessList{}, + ) + signedContractTx.From = addr.Hex() + + tx := suite.CreateTestTx(signedContractTx, privKey, 1, true) + return tx + }, + false, true, true, + }, + { + "success - DeliverTx", + func() sdk.Tx { + signedTx := + evmtypes.NewTx( + suite.app.EvmKeeper.ChainID(), + 1, + &to, + big.NewInt(10), + 100000, + nil, + big.NewInt(ethparams.InitialBaseFee+1), + big.NewInt(1), + nil, + &types.AccessList{}, + ) + signedTx.From = addr.Hex() + + tx := suite.CreateTestTx(signedTx, privKey, 1, true) + return tx + }, + false, false, true, + }, + { + "success - CheckTx", + func() sdk.Tx { + signedTx := + evmtypes.NewTx( + suite.app.EvmKeeper.ChainID(), + 2, + &to, + big.NewInt(10), + 100000, + nil, + big.NewInt(ethparams.InitialBaseFee+1), + big.NewInt(1), + nil, + &types.AccessList{}, + ) + signedTx.From = addr.Hex() + + tx := suite.CreateTestTx(signedTx, privKey, 1, true) + return tx + }, + true, false, true, + }, + { + "success - ReCheckTx", + func() sdk.Tx { + signedTx := + evmtypes.NewTx( + suite.app.EvmKeeper.ChainID(), + 3, + &to, + big.NewInt(10), + 100000, + nil, + big.NewInt(ethparams.InitialBaseFee+1), + big.NewInt(1), + nil, + &types.AccessList{}, + ) + signedTx.From = addr.Hex() + + tx := suite.CreateTestTx(signedTx, privKey, 1, true) + return tx + }, false, true, true, + }, + { + "success - CheckTx (cosmos tx not signed)", + func() sdk.Tx { + signedTx := + evmtypes.NewTx( + suite.app.EvmKeeper.ChainID(), + 4, + &to, + big.NewInt(10), + 100000, + nil, + big.NewInt(ethparams.InitialBaseFee+1), + big.NewInt(1), + nil, + &types.AccessList{}, + ) + signedTx.From = addr.Hex() + + tx := suite.CreateTestTx(signedTx, privKey, 1, false) + return tx + }, false, true, true, + }, + { + "fail - CheckTx (cosmos tx is not valid)", + func() sdk.Tx { + signedTx := + evmtypes.NewTx( + suite.app.EvmKeeper.ChainID(), + 4, + &to, + big.NewInt(10), + 100000, + nil, + big.NewInt(ethparams.InitialBaseFee+1), + big.NewInt(1), + nil, + &types.AccessList{}, + ) + signedTx.From = addr.Hex() + + txBuilder := suite.CreateTestTxBuilder(signedTx, privKey, 1, false) + // bigger than MaxGasWanted + txBuilder.SetGasLimit(uint64(1 << 63)) + return txBuilder.GetTx() + }, false, true, false, + }, + { + "fail - CheckTx (memo too long)", + func() sdk.Tx { + signedTx := + evmtypes.NewTx( + suite.app.EvmKeeper.ChainID(), + 5, + &to, + big.NewInt(10), + 100000, + nil, + big.NewInt(ethparams.InitialBaseFee+1), + big.NewInt(1), + nil, + &types.AccessList{}, + ) + signedTx.From = addr.Hex() + + txBuilder := suite.CreateTestTxBuilder(signedTx, privKey, 1, true) + txBuilder.SetMemo(strings.Repeat("*", 257)) + return txBuilder.GetTx() + }, true, false, false, + }, + } + + for _, tc := range testCases { + suite.Run(tc.name, func() { + suite.ctx = suite.ctx.WithIsCheckTx(tc.reCheckTx).WithIsReCheckTx(tc.reCheckTx) + _, err := suite.anteHandler(suite.ctx, tc.txFn(), false) + if tc.expPass { + suite.Require().NoError(err) + } else { + suite.Require().Error(err) + } + }) + } + suite.dynamicTxFee = false +} diff --git a/app/ante/utils_test.go b/app/ante/utils_test.go index 67b3bbd341..81aa4db43f 100644 --- a/app/ante/utils_test.go +++ b/app/ante/utils_test.go @@ -24,6 +24,7 @@ import ( "github.com/tharsis/ethermint/encoding" "github.com/tharsis/ethermint/tests" evmtypes "github.com/tharsis/ethermint/x/evm/types" + feemarkettypes "github.com/tharsis/ethermint/x/feemarket/types" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" ) @@ -31,16 +32,28 @@ import ( type AnteTestSuite struct { suite.Suite - ctx sdk.Context - app *app.EthermintApp - clientCtx client.Context - anteHandler sdk.AnteHandler - ethSigner ethtypes.Signer + ctx sdk.Context + app *app.EthermintApp + clientCtx client.Context + anteHandler sdk.AnteHandler + ethSigner ethtypes.Signer + dynamicTxFee bool } func (suite *AnteTestSuite) SetupTest() { checkTx := false - suite.app = app.Setup(checkTx, nil) + + if suite.dynamicTxFee { + // setup feemarketGenesis params + feemarketGenesis := feemarkettypes.DefaultGenesisState() + feemarketGenesis.Params.EnableHeight = 1 + feemarketGenesis.Params.NoBaseFee = false + feemarketGenesis.BaseFee = sdk.NewInt(feemarketGenesis.Params.InitialBaseFee) + suite.app = app.Setup(checkTx, feemarketGenesis) + } else { + suite.app = app.Setup(checkTx, nil) + } + suite.ctx = suite.app.BaseApp.NewContext(checkTx, tmproto.Header{Height: 2, ChainID: "ethermint_9000-1", Time: time.Now().UTC()}) suite.ctx = suite.ctx.WithMinGasPrices(sdk.NewDecCoins(sdk.NewDecCoin(evmtypes.DefaultEVMDenom, sdk.OneInt()))) suite.ctx = suite.ctx.WithBlockGasMeter(sdk.NewGasMeter(1000000000000000000))