fix(evmutil): create module account on InitGenesis (#1655)

* fix(evmutil): create module account on InitGenesis

ensures the creation of the x/evmutil module account on init genesis.

* update changelog

* cleanup debug logging
This commit is contained in:
Robert Pirtle 2023-07-24 16:00:19 -07:00 committed by GitHub
parent 2bcfe5c0be
commit 15c243224c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 48 additions and 12 deletions

View File

@ -36,6 +36,11 @@ Ref: https://keepachangelog.com/en/1.0.0/
## [Unreleased] ## [Unreleased]
### Bug Fixes
- (evmutil) [#1655] Initialize x/evmutil module account in InitGenesis
## [v0.24.0]
### Features ### Features
- (evmutil) [#1590] & [#1596] Add allow list param of sdk native denoms that can be transferred to evm - (evmutil) [#1590] & [#1596] Add allow list param of sdk native denoms that can be transferred to evm
- (evmutil) [#1591] & [#1596] Configure module to support deploying ERC20KavaWrappedCosmosCoin contracts - (evmutil) [#1591] & [#1596] Configure module to support deploying ERC20KavaWrappedCosmosCoin contracts
@ -268,6 +273,7 @@ the [changelog](https://github.com/cosmos/cosmos-sdk/blob/v0.38.4/CHANGELOG.md).
- [#257](https://github.com/Kava-Labs/kava/pulls/257) Include scripts to run - [#257](https://github.com/Kava-Labs/kava/pulls/257) Include scripts to run
large-scale simulations remotely using aws-batch large-scale simulations remotely using aws-batch
[#1655]: https://github.com/Kava-Labs/kava/pull/1655
[#1624]: https://github.com/Kava-Labs/kava/pull/1624 [#1624]: https://github.com/Kava-Labs/kava/pull/1624
[#1622]: https://github.com/Kava-Labs/kava/pull/1622 [#1622]: https://github.com/Kava-Labs/kava/pull/1622
[#1614]: https://github.com/Kava-Labs/kava/pull/1614 [#1614]: https://github.com/Kava-Labs/kava/pull/1614
@ -307,7 +313,8 @@ the [changelog](https://github.com/cosmos/cosmos-sdk/blob/v0.38.4/CHANGELOG.md).
[#750]: https://github.com/Kava-Labs/kava/pull/750 [#750]: https://github.com/Kava-Labs/kava/pull/750
[#751]: https://github.com/Kava-Labs/kava/pull/751 [#751]: https://github.com/Kava-Labs/kava/pull/751
[#780]: https://github.com/Kava-Labs/kava/pull/780 [#780]: https://github.com/Kava-Labs/kava/pull/780
[unreleased]: https://github.com/Kava-Labs/kava/compare/v0.23.2...HEAD [unreleased]: https://github.com/Kava-Labs/kava/compare/v0.24.0...HEAD
[v0.24.0]: https://github.com/Kava-Labs/kava/compare/v0.24.0...v0.23.2
[v0.23.2]: https://github.com/Kava-Labs/kava/compare/v0.23.1...v0.23.2 [v0.23.2]: https://github.com/Kava-Labs/kava/compare/v0.23.1...v0.23.2
[v0.23.1]: https://github.com/Kava-Labs/kava/compare/v0.23.0...v0.23.1 [v0.23.1]: https://github.com/Kava-Labs/kava/compare/v0.23.0...v0.23.1
[v0.23.0]: https://github.com/Kava-Labs/kava/compare/v0.21.1...v0.23.0 [v0.23.0]: https://github.com/Kava-Labs/kava/compare/v0.21.1...v0.23.0

View File

@ -782,7 +782,7 @@ func NewApp(
hard.NewAppModule(app.hardKeeper, app.accountKeeper, app.bankKeeper, app.pricefeedKeeper), hard.NewAppModule(app.hardKeeper, app.accountKeeper, app.bankKeeper, app.pricefeedKeeper),
committee.NewAppModule(app.committeeKeeper, app.accountKeeper), committee.NewAppModule(app.committeeKeeper, app.accountKeeper),
incentive.NewAppModule(app.incentiveKeeper, app.accountKeeper, app.bankKeeper, app.cdpKeeper), 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), savings.NewAppModule(app.savingsKeeper, app.accountKeeper, app.bankKeeper),
liquid.NewAppModule(app.liquidKeeper), liquid.NewAppModule(app.liquidKeeper),
earn.NewAppModule(app.earnKeeper, app.accountKeeper, app.bankKeeper), earn.NewAppModule(app.earnKeeper, app.accountKeeper, app.bankKeeper),

View File

@ -10,13 +10,18 @@ import (
) )
// InitGenesis initializes the store state from a genesis state. // 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 { if err := gs.Validate(); err != nil {
panic(fmt.Sprintf("failed to validate %s genesis state: %s", types.ModuleName, err)) panic(fmt.Sprintf("failed to validate %s genesis state: %s", types.ModuleName, err))
} }
keeper.SetParams(ctx, gs.Params) 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 { for _, account := range gs.Accounts {
keeper.SetAccount(ctx, account) keeper.SetAccount(ctx, account)
} }

View File

@ -6,6 +6,7 @@ import (
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
sdkmath "cosmossdk.io/math" 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"
"github.com/kava-labs/kava/x/evmutil/testutil" "github.com/kava-labs/kava/x/evmutil/testutil"
"github.com/kava-labs/kava/x/evmutil/types" "github.com/kava-labs/kava/x/evmutil/types"
@ -28,7 +29,7 @@ func (s *genesisTestSuite) TestInitGenesis_SetAccounts() {
) )
accounts := s.Keeper.GetAllAccounts(s.Ctx) accounts := s.Keeper.GetAllAccounts(s.Ctx)
s.Require().Len(accounts, 0) 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) accounts = s.Keeper.GetAllAccounts(s.Ctx)
s.Require().Len(accounts, 1) s.Require().Len(accounts, 1)
account := s.Keeper.GetAccount(s.Ctx, s.Addrs[0]) account := s.Keeper.GetAccount(s.Ctx, s.Addrs[0])
@ -47,7 +48,7 @@ func (s *genesisTestSuite) TestInitGenesis_SetParams() {
[]types.Account{}, []types.Account{},
params, params,
) )
evmutil.InitGenesis(s.Ctx, s.Keeper, gs) evmutil.InitGenesis(s.Ctx, s.Keeper, gs, s.AccountKeeper)
params = s.Keeper.GetParams(s.Ctx) params = s.Keeper.GetParams(s.Ctx)
s.Require().Len(params.EnabledConversionPairs, 1) s.Require().Len(params.EnabledConversionPairs, 1)
s.Require().Equal(conversionPair, params.EnabledConversionPairs[0]) s.Require().Equal(conversionPair, params.EnabledConversionPairs[0])
@ -61,10 +62,25 @@ func (s *genesisTestSuite) TestInitGenesis_ValidateFail() {
types.DefaultParams(), types.DefaultParams(),
) )
s.Require().Panics(func() { 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() { func (s *genesisTestSuite) TestExportGenesis() {
accounts := []types.Account{ accounts := []types.Account{
{Address: s.Addrs[0], Balance: sdkmath.NewInt(10)}, {Address: s.Addrs[0], Balance: sdkmath.NewInt(10)},

View File

@ -184,7 +184,7 @@ func (k Keeper) LockERC20Tokens(
contractAddr := pair.GetAddress() contractAddr := pair.GetAddress()
initiatorStartBal, err := k.QueryERC20BalanceOf(ctx, contractAddr, initiator) initiatorStartBal, err := k.QueryERC20BalanceOf(ctx, contractAddr, initiator)
if err != nil { 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( res, err := k.CallEVM(

View File

@ -345,7 +345,7 @@ func (suite *ConversionTestSuite) TestConvertERC20ToCoin_EmptyContract() {
convertAmt, convertAmt,
) )
suite.Require().Error(err) 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 // bank balance should not change
bal := suite.App.GetBankKeeper().GetBalance(suite.Ctx, userAddr, pair.Denom) bal := suite.App.GetBankKeeper().GetBalance(suite.Ctx, userAddr, pair.Denom)

View File

@ -236,6 +236,10 @@ func unpackERC20ResToBigInt(res *evmtypes.MsgEthereumTxResponse, methodName stri
return nil, status.Error(codes.Internal, res.VmError) 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) anyOutput, err := types.ERC20MintableBurnableContract.ABI.Unpack(methodName, res.Ret)
if err != nil { if err != nil {
return nil, fmt.Errorf( return nil, fmt.Errorf(

View File

@ -95,15 +95,17 @@ func (AppModuleBasic) GetQueryCmd() *cobra.Command {
type AppModule struct { type AppModule struct {
AppModuleBasic AppModuleBasic
keeper keeper.Keeper keeper keeper.Keeper
bankKeeper types.BankKeeper accountKeeer types.AccountKeeper
bankKeeper types.BankKeeper
} }
// NewAppModule creates a new AppModule object // 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{ return AppModule{
AppModuleBasic: NewAppModuleBasic(), AppModuleBasic: NewAppModuleBasic(),
keeper: keeper, keeper: keeper,
accountKeeer: accountKeeper,
bankKeeper: bankKeeper, 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 // Initialize global index to index in genesis state
cdc.MustUnmarshalJSON(gs, &genState) cdc.MustUnmarshalJSON(gs, &genState)
InitGenesis(ctx, am.keeper, &genState) InitGenesis(ctx, am.keeper, &genState, am.accountKeeer)
return []abci.ValidatorUpdate{} return []abci.ValidatorUpdate{}
} }

View File

@ -4,6 +4,7 @@ import (
"context" "context"
sdk "github.com/cosmos/cosmos-sdk/types" 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"
"github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/core/vm"
evmtypes "github.com/evmos/ethermint/x/evm/types" evmtypes "github.com/evmos/ethermint/x/evm/types"
@ -11,6 +12,7 @@ import (
// AccountKeeper defines the expected account keeper interface // AccountKeeper defines the expected account keeper interface
type AccountKeeper interface { type AccountKeeper interface {
GetModuleAccount(ctx sdk.Context, moduleName string) authtypes.ModuleAccountI
GetModuleAddress(moduleName string) sdk.AccAddress GetModuleAddress(moduleName string) sdk.AccAddress
GetSequence(sdk.Context, sdk.AccAddress) (uint64, error) GetSequence(sdk.Context, sdk.AccAddress) (uint64, error)
} }