From bcbac78fe62b00593d73952bf0e07847ee6c0f30 Mon Sep 17 00:00:00 2001 From: Robert Pirtle Date: Fri, 21 Jul 2023 15:06:40 -0700 Subject: [PATCH] fix(evmutil): create module account on InitGenesis ensures the creation of the x/evmutil module account on init genesis. --- app/app.go | 2 +- x/evmutil/client/cli/tx.go | 3 +++ x/evmutil/genesis.go | 7 +++++- x/evmutil/genesis_test.go | 22 ++++++++++++++++--- x/evmutil/keeper/conversion_evm_native.go | 2 +- .../keeper/conversion_evm_native_test.go | 2 +- x/evmutil/keeper/erc20.go | 4 ++++ x/evmutil/module.go | 10 +++++---- x/evmutil/types/expected_keepers.go | 2 ++ 9 files changed, 43 insertions(+), 11 deletions(-) diff --git a/app/app.go b/app/app.go index 03c05dba1d..b43ccf1e63 100644 --- a/app/app.go +++ b/app/app.go @@ -782,7 +782,7 @@ func NewApp( hard.NewAppModule(app.hardKeeper, app.accountKeeper, app.bankKeeper, app.pricefeedKeeper), committee.NewAppModule(app.committeeKeeper, app.accountKeeper), incentive.NewAppModule(app.incentiveKeeper, app.accountKeeper, app.bankKeeper, app.cdpKeeper), - evmutil.NewAppModule(app.evmutilKeeper, app.bankKeeper), + evmutil.NewAppModule(app.evmutilKeeper, app.bankKeeper, app.accountKeeper), savings.NewAppModule(app.savingsKeeper, app.accountKeeper, app.bankKeeper), liquid.NewAppModule(app.liquidKeeper), earn.NewAppModule(app.earnKeeper, app.accountKeeper, app.bankKeeper), diff --git a/x/evmutil/client/cli/tx.go b/x/evmutil/client/cli/tx.go index 22201af648..da8e062aa8 100644 --- a/x/evmutil/client/cli/tx.go +++ b/x/evmutil/client/cli/tx.go @@ -100,6 +100,7 @@ func getCmdConvertEvmERC20ToCoin() *cobra.Command { } signer := clientCtx.GetFromAddress() + fmt.Println("signer: ", signer.String()) initiator, err := ParseAddrFromHexOrBech32(signer.String()) if err != nil { return err @@ -119,6 +120,8 @@ func getCmdConvertEvmERC20ToCoin() *cobra.Command { return err } + fmt.Printf("%+v\n", msg) + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), &msg) }, } diff --git a/x/evmutil/genesis.go b/x/evmutil/genesis.go index 80a0d1b158..209dda2560 100644 --- a/x/evmutil/genesis.go +++ b/x/evmutil/genesis.go @@ -10,13 +10,18 @@ import ( ) // InitGenesis initializes the store state from a genesis state. -func InitGenesis(ctx sdk.Context, keeper keeper.Keeper, gs *types.GenesisState) { +func InitGenesis(ctx sdk.Context, keeper keeper.Keeper, gs *types.GenesisState, ak types.AccountKeeper) { if err := gs.Validate(); err != nil { panic(fmt.Sprintf("failed to validate %s genesis state: %s", types.ModuleName, err)) } keeper.SetParams(ctx, gs.Params) + // initialize module account + if moduleAcc := ak.GetModuleAccount(ctx, types.ModuleName); moduleAcc == nil { + panic(fmt.Sprintf("%s module account has not been set", types.ModuleName)) + } + for _, account := range gs.Accounts { keeper.SetAccount(ctx, account) } diff --git a/x/evmutil/genesis_test.go b/x/evmutil/genesis_test.go index a1dc31c57d..0c71f9ffa8 100644 --- a/x/evmutil/genesis_test.go +++ b/x/evmutil/genesis_test.go @@ -6,6 +6,7 @@ import ( "github.com/stretchr/testify/suite" sdkmath "cosmossdk.io/math" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/kava-labs/kava/x/evmutil" "github.com/kava-labs/kava/x/evmutil/testutil" "github.com/kava-labs/kava/x/evmutil/types" @@ -28,7 +29,7 @@ func (s *genesisTestSuite) TestInitGenesis_SetAccounts() { ) accounts := s.Keeper.GetAllAccounts(s.Ctx) s.Require().Len(accounts, 0) - evmutil.InitGenesis(s.Ctx, s.Keeper, gs) + evmutil.InitGenesis(s.Ctx, s.Keeper, gs, s.AccountKeeper) accounts = s.Keeper.GetAllAccounts(s.Ctx) s.Require().Len(accounts, 1) account := s.Keeper.GetAccount(s.Ctx, s.Addrs[0]) @@ -47,7 +48,7 @@ func (s *genesisTestSuite) TestInitGenesis_SetParams() { []types.Account{}, params, ) - evmutil.InitGenesis(s.Ctx, s.Keeper, gs) + evmutil.InitGenesis(s.Ctx, s.Keeper, gs, s.AccountKeeper) params = s.Keeper.GetParams(s.Ctx) s.Require().Len(params.EnabledConversionPairs, 1) s.Require().Equal(conversionPair, params.EnabledConversionPairs[0]) @@ -61,10 +62,25 @@ func (s *genesisTestSuite) TestInitGenesis_ValidateFail() { types.DefaultParams(), ) s.Require().Panics(func() { - evmutil.InitGenesis(s.Ctx, s.Keeper, gs) + evmutil.InitGenesis(s.Ctx, s.Keeper, gs, s.AccountKeeper) }) } +func (s *genesisTestSuite) TestInitGenesis_ModuleAccount() { + gs := types.NewGenesisState( + []types.Account{}, + types.DefaultParams(), + ) + s.Require().NotPanics(func() { + evmutil.InitGenesis(s.Ctx, s.Keeper, gs, s.AccountKeeper) + }) + // check for module account this way b/c GetModuleAccount creates if not existing. + acc := s.AccountKeeper.GetAccount(s.Ctx, s.AccountKeeper.GetModuleAddress(types.ModuleName)) + s.Require().NotNil(acc) + _, ok := acc.(authtypes.ModuleAccountI) + s.Require().True(ok) +} + func (s *genesisTestSuite) TestExportGenesis() { accounts := []types.Account{ {Address: s.Addrs[0], Balance: sdkmath.NewInt(10)}, diff --git a/x/evmutil/keeper/conversion_evm_native.go b/x/evmutil/keeper/conversion_evm_native.go index fb94261eb2..9765beaa1d 100644 --- a/x/evmutil/keeper/conversion_evm_native.go +++ b/x/evmutil/keeper/conversion_evm_native.go @@ -184,7 +184,7 @@ func (k Keeper) LockERC20Tokens( contractAddr := pair.GetAddress() initiatorStartBal, err := k.QueryERC20BalanceOf(ctx, contractAddr, initiator) if err != nil { - return errorsmod.Wrapf(types.ErrEVMCall, "failed to retrieve balance %s", err.Error()) + return errorsmod.Wrapf(types.ErrEVMCall, "failed to retrieve balance: %s", err.Error()) } res, err := k.CallEVM( diff --git a/x/evmutil/keeper/conversion_evm_native_test.go b/x/evmutil/keeper/conversion_evm_native_test.go index f352f8ef08..ec5821f757 100644 --- a/x/evmutil/keeper/conversion_evm_native_test.go +++ b/x/evmutil/keeper/conversion_evm_native_test.go @@ -345,7 +345,7 @@ func (suite *ConversionTestSuite) TestConvertERC20ToCoin_EmptyContract() { convertAmt, ) suite.Require().Error(err) - suite.Require().ErrorContains(err, "contract call failed: method 'balanceOf'") + suite.Require().ErrorContains(err, "failed to retrieve balance: failed to unpack method balanceOf") // bank balance should not change bal := suite.App.GetBankKeeper().GetBalance(suite.Ctx, userAddr, pair.Denom) diff --git a/x/evmutil/keeper/erc20.go b/x/evmutil/keeper/erc20.go index f2096569a0..a4b7fe5db5 100644 --- a/x/evmutil/keeper/erc20.go +++ b/x/evmutil/keeper/erc20.go @@ -236,6 +236,10 @@ func unpackERC20ResToBigInt(res *evmtypes.MsgEthereumTxResponse, methodName stri return nil, status.Error(codes.Internal, res.VmError) } + if len(res.Ret) == 0 { + return nil, fmt.Errorf("failed to unpack method %s: expected response to be big.Int but found nil", methodName) + } + anyOutput, err := types.ERC20MintableBurnableContract.ABI.Unpack(methodName, res.Ret) if err != nil { return nil, fmt.Errorf( diff --git a/x/evmutil/module.go b/x/evmutil/module.go index 15455c70ef..c2e85907d8 100644 --- a/x/evmutil/module.go +++ b/x/evmutil/module.go @@ -95,15 +95,17 @@ func (AppModuleBasic) GetQueryCmd() *cobra.Command { type AppModule struct { AppModuleBasic - keeper keeper.Keeper - bankKeeper types.BankKeeper + keeper keeper.Keeper + accountKeeer types.AccountKeeper + bankKeeper types.BankKeeper } // NewAppModule creates a new AppModule object -func NewAppModule(keeper keeper.Keeper, bankKeeper types.BankKeeper) AppModule { +func NewAppModule(keeper keeper.Keeper, bankKeeper types.BankKeeper, accountKeeper types.AccountKeeper) AppModule { return AppModule{ AppModuleBasic: NewAppModuleBasic(), keeper: keeper, + accountKeeer: accountKeeper, bankKeeper: bankKeeper, } } @@ -146,7 +148,7 @@ func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, gs json.Ra // Initialize global index to index in genesis state cdc.MustUnmarshalJSON(gs, &genState) - InitGenesis(ctx, am.keeper, &genState) + InitGenesis(ctx, am.keeper, &genState, am.accountKeeer) return []abci.ValidatorUpdate{} } diff --git a/x/evmutil/types/expected_keepers.go b/x/evmutil/types/expected_keepers.go index 220175286b..31b4e4aac7 100644 --- a/x/evmutil/types/expected_keepers.go +++ b/x/evmutil/types/expected_keepers.go @@ -4,6 +4,7 @@ import ( "context" sdk "github.com/cosmos/cosmos-sdk/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/vm" evmtypes "github.com/evmos/ethermint/x/evm/types" @@ -11,6 +12,7 @@ import ( // AccountKeeper defines the expected account keeper interface type AccountKeeper interface { + GetModuleAccount(ctx sdk.Context, moduleName string) authtypes.ModuleAccountI GetModuleAddress(moduleName string) sdk.AccAddress GetSequence(sdk.Context, sdk.AccAddress) (uint64, error) }