From f5993b1c627b08c8ce71a247084a56e87eeaca81 Mon Sep 17 00:00:00 2001 From: Marko Date: Thu, 6 Apr 2023 10:56:12 +0200 Subject: [PATCH] refactor(gov): remove global bech32 (#15682) --- tests/e2e/gov/deposits.go | 5 ++-- tests/e2e/gov/query.go | 5 ++-- x/gov/client/cli/query.go | 18 +++++------ x/gov/client/cli/query_test.go | 5 ++-- x/gov/keeper/common_test.go | 4 +++ x/gov/keeper/deposit.go | 30 ++++++++++++++----- x/gov/keeper/deposit_test.go | 20 ++++++++++--- x/gov/keeper/grpc_query.go | 8 ++--- x/gov/keeper/grpc_query_test.go | 14 ++++++--- x/gov/keeper/hooks_test.go | 7 ++++- x/gov/keeper/keeper.go | 2 +- x/gov/keeper/keeper_test.go | 38 ++++++++++++++++++------ x/gov/keeper/msg_server.go | 10 +++---- x/gov/keeper/msg_server_test.go | 25 +++++++++++++--- x/gov/keeper/proposal_test.go | 18 +++++------ x/gov/keeper/tally.go | 7 +++-- x/gov/keeper/vote.go | 5 +++- x/gov/keeper/vote_test.go | 6 +++- x/gov/module.go | 8 +++-- x/gov/testutil/expected_keepers_mocks.go | 30 +++++++++++++++++++ x/gov/types/expected_keepers.go | 3 ++ 21 files changed, 198 insertions(+), 70 deletions(-) diff --git a/tests/e2e/gov/deposits.go b/tests/e2e/gov/deposits.go index a00003af4261..4b433aef26de 100644 --- a/tests/e2e/gov/deposits.go +++ b/tests/e2e/gov/deposits.go @@ -8,6 +8,7 @@ import ( "github.com/stretchr/testify/suite" "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/codec/address" "github.com/cosmos/cosmos-sdk/testutil" clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" "github.com/cosmos/cosmos-sdk/testutil/network" @@ -56,7 +57,7 @@ func (s *DepositTestSuite) submitProposal(val *network.Validator, initialDeposit s.Require().NoError(s.network.WaitForNextBlock()) // query proposals, return the last's id - cmd := cli.GetCmdQueryProposals() + cmd := cli.GetCmdQueryProposals(address.NewBech32Codec("cosmos")) args := []string{fmt.Sprintf("--%s=json", flags.FlagOutput)} res, err := clitestutil.ExecTestCLICmd(val.ClientCtx, cmd, args) s.Require().NoError(err) @@ -130,7 +131,7 @@ func (s *DepositTestSuite) TestQueryProposalAfterVotingPeriod() { proposalID := strconv.FormatUint(id, 10) args := []string{fmt.Sprintf("--%s=json", flags.FlagOutput)} - cmd := cli.GetCmdQueryProposals() + cmd := cli.GetCmdQueryProposals(address.NewBech32Codec("cosmos")) _, err := clitestutil.ExecTestCLICmd(val.ClientCtx, cmd, args) s.Require().NoError(err) diff --git a/tests/e2e/gov/query.go b/tests/e2e/gov/query.go index 062c93fb044b..23b7c67f564a 100644 --- a/tests/e2e/gov/query.go +++ b/tests/e2e/gov/query.go @@ -5,6 +5,7 @@ import ( "strings" "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/codec/address" clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/gov/client/cli" @@ -305,7 +306,7 @@ func (s *E2ETestSuite) TestCmdGetProposals() { tc := tc s.Run(tc.name, func() { - cmd := cli.GetCmdQueryProposals() + cmd := cli.GetCmdQueryProposals(address.NewBech32Codec("cosmos")) clientCtx := val.ClientCtx out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) @@ -532,7 +533,7 @@ func (s *E2ETestSuite) TestCmdQueryVote() { for _, tc := range testCases { tc := tc s.Run(tc.name, func() { - cmd := cli.GetCmdQueryVote() + cmd := cli.GetCmdQueryVote(address.NewBech32Codec("cosmos")) clientCtx := val.ClientCtx out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) diff --git a/x/gov/client/cli/query.go b/x/gov/client/cli/query.go index f93bf8b1fd32..9907f05d89de 100644 --- a/x/gov/client/cli/query.go +++ b/x/gov/client/cli/query.go @@ -5,11 +5,11 @@ import ( "strconv" "strings" + "cosmossdk.io/core/address" "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/version" gcutils "github.com/cosmos/cosmos-sdk/x/gov/client/utils" "github.com/cosmos/cosmos-sdk/x/gov/types" @@ -17,7 +17,7 @@ import ( ) // GetQueryCmd returns the cli query commands for this module -func GetQueryCmd() *cobra.Command { +func GetQueryCmd(ac address.Codec) *cobra.Command { // Group gov queries under a subcommand govQueryCmd := &cobra.Command{ Use: types.ModuleName, @@ -29,8 +29,8 @@ func GetQueryCmd() *cobra.Command { govQueryCmd.AddCommand( GetCmdQueryProposal(), - GetCmdQueryProposals(), - GetCmdQueryVote(), + GetCmdQueryProposals(ac), + GetCmdQueryVote(ac), GetCmdQueryVotes(), GetCmdQueryParams(), GetCmdQueryParam(), @@ -93,7 +93,7 @@ $ %s query gov proposal 1 // GetCmdQueryProposals implements a query proposals command. Command to Get // Proposals Information. -func GetCmdQueryProposals() *cobra.Command { +func GetCmdQueryProposals(ac address.Codec) *cobra.Command { cmd := &cobra.Command{ Use: "proposals", Short: "Query proposals with optional filters", @@ -117,14 +117,14 @@ $ %s query gov proposals --page=2 --limit=100 var proposalStatus v1.ProposalStatus if len(bechDepositorAddr) != 0 { - _, err := sdk.AccAddressFromBech32(bechDepositorAddr) + _, err := ac.StringToBytes(bechDepositorAddr) if err != nil { return err } } if len(bechVoterAddr) != 0 { - _, err := sdk.AccAddressFromBech32(bechVoterAddr) + _, err := ac.StringToBytes(bechVoterAddr) if err != nil { return err } @@ -181,7 +181,7 @@ $ %s query gov proposals --page=2 --limit=100 // GetCmdQueryVote implements the query proposal vote command. Command to Get a // Vote Information. -func GetCmdQueryVote() *cobra.Command { +func GetCmdQueryVote(ac address.Codec) *cobra.Command { cmd := &cobra.Command{ Use: "vote [proposal-id] [voter-addr]", Args: cobra.ExactArgs(2), @@ -218,7 +218,7 @@ $ %s query gov vote 1 cosmos1skjwj5whet0lpe65qaq4rpq03hjxlwd9nf39lk return fmt.Errorf("failed to fetch proposal-id %d: %s", proposalID, err) } - voterAddr, err := sdk.AccAddressFromBech32(args[1]) + voterAddr, err := ac.StringToBytes(args[1]) if err != nil { return err } diff --git a/x/gov/client/cli/query_test.go b/x/gov/client/cli/query_test.go index c5f756b25bf7..baa74d6d2de3 100644 --- a/x/gov/client/cli/query_test.go +++ b/x/gov/client/cli/query_test.go @@ -4,6 +4,7 @@ import ( "fmt" "strings" + "github.com/cosmos/cosmos-sdk/codec/address" clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" "github.com/cosmos/cosmos-sdk/client/flags" @@ -214,7 +215,7 @@ func (s *CLITestSuite) TestCmdGetProposals() { tc := tc s.Run(tc.name, func() { - cmd := cli.GetCmdQueryProposals() + cmd := cli.GetCmdQueryProposals(address.NewBech32Codec("cosmos")) cmd.SetArgs(tc.args) s.Require().Contains(fmt.Sprint(cmd), strings.TrimSpace(tc.expCmdOutput)) }) @@ -374,7 +375,7 @@ func (s *CLITestSuite) TestCmdQueryVote() { for _, tc := range testCases { tc := tc s.Run(tc.name, func() { - cmd := cli.GetCmdQueryVote() + cmd := cli.GetCmdQueryVote(address.NewBech32Codec("cosmos")) cmd.SetArgs(tc.args) if len(tc.args) != 0 { diff --git a/x/gov/keeper/common_test.go b/x/gov/keeper/common_test.go index 76ff9efe4677..fe17762e0b54 100644 --- a/x/gov/keeper/common_test.go +++ b/x/gov/keeper/common_test.go @@ -79,10 +79,14 @@ func setupGovKeeper(t *testing.T) ( acctKeeper.EXPECT().GetModuleAddress(types.ModuleName).Return(govAcct).AnyTimes() acctKeeper.EXPECT().GetModuleAddress(disttypes.ModuleName).Return(distAcct).AnyTimes() acctKeeper.EXPECT().GetModuleAccount(gomock.Any(), types.ModuleName).Return(authtypes.NewEmptyModuleAccount(types.ModuleName)).AnyTimes() + acctKeeper.EXPECT().StringToBytes(govAcct.String()).Return(govAcct, nil).AnyTimes() + acctKeeper.EXPECT().BytesToString(govAcct).Return(govAcct.String(), nil).AnyTimes() + trackMockBalances(bankKeeper, distributionKeeper) stakingKeeper.EXPECT().TokensFromConsensusPower(ctx, gomock.Any()).DoAndReturn(func(ctx sdk.Context, power int64) math.Int { return sdk.TokensFromConsensusPower(power, math.NewIntFromUint64(1000000)) }).AnyTimes() + stakingKeeper.EXPECT().BondDenom(ctx).Return("stake").AnyTimes() stakingKeeper.EXPECT().IterateBondedValidatorsByPower(gomock.Any(), gomock.Any()).AnyTimes() stakingKeeper.EXPECT().IterateDelegations(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() diff --git a/x/gov/keeper/deposit.go b/x/gov/keeper/deposit.go index 2aaca6e25fce..e83cc493848d 100644 --- a/x/gov/keeper/deposit.go +++ b/x/gov/keeper/deposit.go @@ -30,7 +30,10 @@ func (keeper Keeper) GetDeposit(ctx sdk.Context, proposalID uint64, depositorAdd func (keeper Keeper) SetDeposit(ctx sdk.Context, deposit v1.Deposit) { store := ctx.KVStore(keeper.storeKey) bz := keeper.cdc.MustMarshal(&deposit) - depositor := sdk.MustAccAddressFromBech32(deposit.Depositor) + depositor, err := keeper.authKeeper.StringToBytes(deposit.Depositor) + if err != nil { + panic(err) + } store.Set(types.DepositKey(deposit.ProposalId, depositor), bz) } @@ -65,7 +68,10 @@ func (keeper Keeper) DeleteAndBurnDeposits(ctx sdk.Context, proposalID uint64) { panic(err) } - depositor := sdk.MustAccAddressFromBech32(deposit.Depositor) + depositor, err := keeper.authKeeper.StringToBytes(deposit.Depositor) + if err != nil { + panic(err) + } store.Delete(types.DepositKey(proposalID, depositor)) return false @@ -176,7 +182,11 @@ func (keeper Keeper) ChargeDeposit(ctx sdk.Context, proposalID uint64, destAddre var cancellationCharges sdk.Coins for _, deposit := range keeper.GetDeposits(ctx, proposalID) { - depositerAddress := sdk.MustAccAddressFromBech32(deposit.Depositor) + depositerAddress, err := keeper.authKeeper.StringToBytes(deposit.Depositor) + if err != nil { + return err + } + var remainingAmount sdk.Coins for _, coins := range deposit.Amount { @@ -225,8 +235,11 @@ func (keeper Keeper) ChargeDeposit(ctx sdk.Context, proposalID uint64, destAddre return err } default: - destAccAddress := sdk.MustAccAddressFromBech32(destAddress) - err := keeper.bankKeeper.SendCoinsFromModuleToAccount( + destAccAddress, err := keeper.authKeeper.StringToBytes(destAddress) + if err != nil { + return err + } + err = keeper.bankKeeper.SendCoinsFromModuleToAccount( ctx, types.ModuleName, destAccAddress, cancellationCharges, ) if err != nil { @@ -243,9 +256,12 @@ func (keeper Keeper) RefundAndDeleteDeposits(ctx sdk.Context, proposalID uint64) store := ctx.KVStore(keeper.storeKey) keeper.IterateDeposits(ctx, proposalID, func(deposit v1.Deposit) bool { - depositor := sdk.MustAccAddressFromBech32(deposit.Depositor) + depositor, err := keeper.authKeeper.StringToBytes(deposit.Depositor) + if err != nil { + panic(err) + } - err := keeper.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, depositor, deposit.Amount) + err = keeper.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, depositor, deposit.Amount) if err != nil { panic(err) } diff --git a/x/gov/keeper/deposit_test.go b/x/gov/keeper/deposit_test.go index 6c421e72f2a8..90eb68069cde 100644 --- a/x/gov/keeper/deposit_test.go +++ b/x/gov/keeper/deposit_test.go @@ -7,6 +7,7 @@ import ( sdkmath "cosmossdk.io/math" "github.com/stretchr/testify/require" + "github.com/cosmos/cosmos-sdk/codec/address" simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" @@ -35,7 +36,7 @@ func TestDeposits(t *testing.T) { for _, tc := range testcases { t.Run(tc.name, func(t *testing.T) { - govKeeper, _, bankKeeper, stakingKeeper, distKeeper, _, ctx := setupGovKeeper(t) + govKeeper, authKeeper, bankKeeper, stakingKeeper, distKeeper, _, ctx := setupGovKeeper(t) trackMockBalances(bankKeeper, distKeeper) // With expedited proposals the minimum deposit is higher, so we must @@ -47,6 +48,10 @@ func TestDeposits(t *testing.T) { } TestAddrs := simtestutil.AddTestAddrsIncremental(bankKeeper, stakingKeeper, ctx, 2, sdkmath.NewInt(10000000*depositMultiplier)) + for _, addr := range TestAddrs { + authKeeper.EXPECT().BytesToString(addr).Return(addr.String(), nil).AnyTimes() + authKeeper.EXPECT().StringToBytes(addr.String()).Return(addr, nil).AnyTimes() + } tp := TestProposal proposal, err := govKeeper.SubmitProposal(ctx, tp, "", "title", "summary", TestAddrs[0], tc.expedited) @@ -297,10 +302,14 @@ func TestChargeDeposit(t *testing.T) { } t.Run(testName(i), func(t *testing.T) { - govKeeper, _, bankKeeper, stakingKeeper, _, _, ctx := setupGovKeeper(t) + govKeeper, authKeeper, bankKeeper, stakingKeeper, _, _, ctx := setupGovKeeper(t) params := v1.DefaultParams() params.ProposalCancelRatio = tc.proposalCancelRatio TestAddrs := simtestutil.AddTestAddrsIncremental(bankKeeper, stakingKeeper, ctx, 2, sdk.NewInt(10000000000)) + for _, addr := range TestAddrs { + authKeeper.EXPECT().BytesToString(addr).Return(addr.String(), nil).AnyTimes() + authKeeper.EXPECT().StringToBytes(addr.String()).Return(addr, nil).AnyTimes() + } switch i { case 0: @@ -326,10 +335,12 @@ func TestChargeDeposit(t *testing.T) { _, err = govKeeper.AddDeposit(ctx, proposalID, TestAddrs[0], fiveStake) require.NoError(t, err) + codec := address.NewBech32Codec("cosmos") // get balances of dest address var prevBalance sdk.Coin if len(params.ProposalCancelDest) != 0 { - accAddr := sdk.MustAccAddressFromBech32(params.ProposalCancelDest) + accAddr, err := codec.StringToBytes(params.ProposalCancelDest) + require.NoError(t, err) prevBalance = bankKeeper.GetBalance(ctx, accAddr, sdk.DefaultBondDenom) } @@ -345,7 +356,8 @@ func TestChargeDeposit(t *testing.T) { require.NoError(t, err) if len(params.ProposalCancelDest) != 0 { - accAddr := sdk.MustAccAddressFromBech32(params.ProposalCancelDest) + accAddr, err := codec.StringToBytes(params.ProposalCancelDest) + require.NoError(t, err) newBalanceAfterCancelProposal := bankKeeper.GetBalance(ctx, accAddr, sdk.DefaultBondDenom) cancellationCharges := sdkmath.NewInt(0) for _, deposits := range allDeposits { diff --git a/x/gov/keeper/grpc_query.go b/x/gov/keeper/grpc_query.go index b0b16d286757..54733e649dca 100644 --- a/x/gov/keeper/grpc_query.go +++ b/x/gov/keeper/grpc_query.go @@ -67,7 +67,7 @@ func (q Keeper) Proposals(c context.Context, req *v1.QueryProposalsRequest) (*v1 // match voter address (if supplied) if len(req.Voter) > 0 { - voter, err := sdk.AccAddressFromBech32(req.Voter) + voter, err := q.authKeeper.StringToBytes(req.Voter) if err != nil { return nil, err } @@ -77,7 +77,7 @@ func (q Keeper) Proposals(c context.Context, req *v1.QueryProposalsRequest) (*v1 // match depositor (if supplied) if len(req.Depositor) > 0 { - depositor, err := sdk.AccAddressFromBech32(req.Depositor) + depositor, err := q.authKeeper.StringToBytes(req.Depositor) if err != nil { return nil, err } @@ -115,7 +115,7 @@ func (q Keeper) Vote(c context.Context, req *v1.QueryVoteRequest) (*v1.QueryVote ctx := sdk.UnwrapSDKContext(c) - voter, err := sdk.AccAddressFromBech32(req.Voter) + voter, err := q.authKeeper.StringToBytes(req.Voter) if err != nil { return nil, err } @@ -211,7 +211,7 @@ func (q Keeper) Deposit(c context.Context, req *v1.QueryDepositRequest) (*v1.Que ctx := sdk.UnwrapSDKContext(c) - depositor, err := sdk.AccAddressFromBech32(req.Depositor) + depositor, err := q.authKeeper.StringToBytes(req.Depositor) if err != nil { return nil, err } diff --git a/x/gov/keeper/grpc_query_test.go b/x/gov/keeper/grpc_query_test.go index 42dc50f85da4..7c63d36417fc 100644 --- a/x/gov/keeper/grpc_query_test.go +++ b/x/gov/keeper/grpc_query_test.go @@ -9,6 +9,8 @@ import ( simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/cosmos/cosmos-sdk/codec/address" "github.com/cosmos/cosmos-sdk/types/query" v3 "github.com/cosmos/cosmos-sdk/x/gov/migrations/v3" v1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" @@ -657,8 +659,10 @@ func (suite *KeeperTestSuite) TestGRPCQueryVotes() { {ProposalId: proposal.Id, Voter: addrs[0].String(), Options: v1.NewNonSplitVoteOption(v1.OptionAbstain)}, {ProposalId: proposal.Id, Voter: addrs[1].String(), Options: v1.NewNonSplitVoteOption(v1.OptionYes)}, } - accAddr1, err1 := sdk.AccAddressFromBech32(votes[0].Voter) - accAddr2, err2 := sdk.AccAddressFromBech32(votes[1].Voter) + + codec := address.NewBech32Codec("cosmos") + accAddr1, err1 := codec.StringToBytes(votes[0].Voter) + accAddr2, err2 := codec.StringToBytes(votes[1].Voter) suite.Require().NoError(err1) suite.Require().NoError(err2) suite.Require().NoError(suite.govKeeper.AddVote(ctx, proposal.Id, accAddr1, votes[0].Options, "")) @@ -759,8 +763,10 @@ func (suite *KeeperTestSuite) TestLegacyGRPCQueryVotes() { {ProposalId: proposal.Id, Voter: addrs[0].String(), Options: v1beta1.NewNonSplitVoteOption(v1beta1.OptionAbstain)}, {ProposalId: proposal.Id, Voter: addrs[1].String(), Options: v1beta1.NewNonSplitVoteOption(v1beta1.OptionYes)}, } - accAddr1, err1 := sdk.AccAddressFromBech32(votes[0].Voter) - accAddr2, err2 := sdk.AccAddressFromBech32(votes[1].Voter) + codec := address.NewBech32Codec("cosmos") + + accAddr1, err1 := codec.StringToBytes(votes[0].Voter) + accAddr2, err2 := codec.StringToBytes(votes[1].Voter) suite.Require().NoError(err1) suite.Require().NoError(err2) suite.Require().NoError(suite.govKeeper.AddVote(ctx, proposal.Id, accAddr1, v1.NewNonSplitVoteOption(v1.OptionAbstain), "")) diff --git a/x/gov/keeper/hooks_test.go b/x/gov/keeper/hooks_test.go index 0711d8fd48bd..430f6487bc20 100644 --- a/x/gov/keeper/hooks_test.go +++ b/x/gov/keeper/hooks_test.go @@ -47,9 +47,14 @@ func (h *MockGovHooksReceiver) AfterProposalVotingPeriodEnded(ctx sdk.Context, p func TestHooks(t *testing.T) { minDeposit := v1.DefaultParams().MinDeposit - govKeeper, _, bankKeeper, stakingKeeper, _, _, ctx := setupGovKeeper(t) + govKeeper, authKeeper, bankKeeper, stakingKeeper, _, _, ctx := setupGovKeeper(t) addrs := simtestutil.AddTestAddrs(bankKeeper, stakingKeeper, ctx, 1, minDeposit[0].Amount) + for _, addr := range addrs { + authKeeper.EXPECT().BytesToString(addr).Return(addr.String(), nil).AnyTimes() + authKeeper.EXPECT().StringToBytes(addr.String()).Return(addr, nil).AnyTimes() + } + govHooksReceiver := MockGovHooksReceiver{} keeper.UnsafeSetHooks( diff --git a/x/gov/keeper/keeper.go b/x/gov/keeper/keeper.go index 399a4179fc8f..c1ccf6f049dc 100644 --- a/x/gov/keeper/keeper.go +++ b/x/gov/keeper/keeper.go @@ -68,7 +68,7 @@ func NewKeeper( panic(fmt.Sprintf("%s module account has not been set", types.ModuleName)) } - if _, err := sdk.AccAddressFromBech32(authority); err != nil { + if _, err := authKeeper.StringToBytes(authority); err != nil { panic(fmt.Sprintf("invalid authority address: %s", authority)) } diff --git a/x/gov/keeper/keeper_test.go b/x/gov/keeper/keeper_test.go index ff8cf14a6ecf..ab7ba18d64a8 100644 --- a/x/gov/keeper/keeper_test.go +++ b/x/gov/keeper/keeper_test.go @@ -10,6 +10,7 @@ import ( "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/codec/address" simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/gov/keeper" @@ -20,6 +21,8 @@ import ( minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" ) +var address1 = "cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r" + type KeeperTestSuite struct { suite.Suite @@ -72,34 +75,51 @@ func (suite *KeeperTestSuite) reset() { suite.legacyMsgSrvr = keeper.NewLegacyMsgServerImpl(govAcct.String(), suite.msgSrvr) suite.addrs = simtestutil.AddTestAddrsIncremental(bankKeeper, stakingKeeper, ctx, 3, sdkmath.NewInt(30000000)) + + for _, addr := range suite.addrs { + suite.acctKeeper.EXPECT().BytesToString(addr).Return(addr.String(), nil).AnyTimes() + suite.acctKeeper.EXPECT().StringToBytes(addr.String()).Return(addr, nil).AnyTimes() + } } func TestIncrementProposalNumber(t *testing.T) { - govKeeper, _, _, _, _, _, ctx := setupGovKeeper(t) + govKeeper, authKeeper, _, _, _, _, ctx := setupGovKeeper(t) + + ac := address.NewBech32Codec("cosmos") + addrBz, err := ac.StringToBytes(address1) + require.NoError(t, err) + authKeeper.EXPECT().StringToBytes(address1).Return(addrBz, nil).AnyTimes() + authKeeper.EXPECT().BytesToString(addrBz).Return(address1, nil).AnyTimes() tp := TestProposal - _, err := govKeeper.SubmitProposal(ctx, tp, "", "test", "summary", sdk.AccAddress("cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r"), false) + _, err = govKeeper.SubmitProposal(ctx, tp, "", "test", "summary", addrBz, false) require.NoError(t, err) - _, err = govKeeper.SubmitProposal(ctx, tp, "", "test", "summary", sdk.AccAddress("cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r"), false) + _, err = govKeeper.SubmitProposal(ctx, tp, "", "test", "summary", addrBz, false) require.NoError(t, err) - _, err = govKeeper.SubmitProposal(ctx, tp, "", "test", "summary", sdk.AccAddress("cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r"), true) + _, err = govKeeper.SubmitProposal(ctx, tp, "", "test", "summary", addrBz, true) require.NoError(t, err) - _, err = govKeeper.SubmitProposal(ctx, tp, "", "test", "summary", sdk.AccAddress("cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r"), true) + _, err = govKeeper.SubmitProposal(ctx, tp, "", "test", "summary", addrBz, true) require.NoError(t, err) - _, err = govKeeper.SubmitProposal(ctx, tp, "", "test", "summary", sdk.AccAddress("cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r"), false) + _, err = govKeeper.SubmitProposal(ctx, tp, "", "test", "summary", addrBz, false) require.NoError(t, err) - proposal6, err := govKeeper.SubmitProposal(ctx, tp, "", "test", "summary", sdk.AccAddress("cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r"), false) + proposal6, err := govKeeper.SubmitProposal(ctx, tp, "", "test", "summary", addrBz, false) require.NoError(t, err) require.Equal(t, uint64(6), proposal6.Id) } func TestProposalQueues(t *testing.T) { - govKeeper, _, _, _, _, _, ctx := setupGovKeeper(t) + govKeeper, authKeeper, _, _, _, _, ctx := setupGovKeeper(t) + + ac := address.NewBech32Codec("cosmos") + addrBz, err := ac.StringToBytes(address1) + require.NoError(t, err) + authKeeper.EXPECT().StringToBytes(address1).Return(addrBz, nil).AnyTimes() + authKeeper.EXPECT().BytesToString(addrBz).Return(address1, nil).AnyTimes() // create test proposals tp := TestProposal - proposal, err := govKeeper.SubmitProposal(ctx, tp, "", "test", "summary", sdk.AccAddress("cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r"), false) + proposal, err := govKeeper.SubmitProposal(ctx, tp, "", "test", "summary", addrBz, false) require.NoError(t, err) inactiveIterator := govKeeper.InactiveProposalQueueIterator(ctx, *proposal.DepositEndTime) diff --git a/x/gov/keeper/msg_server.go b/x/gov/keeper/msg_server.go index 8e83178246d1..eb94ecb18312 100644 --- a/x/gov/keeper/msg_server.go +++ b/x/gov/keeper/msg_server.go @@ -37,7 +37,7 @@ func (k msgServer) SubmitProposal(goCtx context.Context, msg *v1.MsgSubmitPropos return nil, err } - proposer, err := sdk.AccAddressFromBech32(msg.GetProposer()) + proposer, err := k.authKeeper.StringToBytes(msg.GetProposer()) if err != nil { return nil, err } @@ -86,7 +86,7 @@ func (k msgServer) SubmitProposal(goCtx context.Context, msg *v1.MsgSubmitPropos // CancelProposals implements the MsgServer.CancelProposal method. func (k msgServer) CancelProposal(goCtx context.Context, msg *v1.MsgCancelProposal) (*v1.MsgCancelProposalResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) - _, err := sdk.AccAddressFromBech32(msg.Proposer) + _, err := k.authKeeper.StringToBytes(msg.Proposer) if err != nil { return nil, err } @@ -140,7 +140,7 @@ func (k msgServer) ExecLegacyContent(goCtx context.Context, msg *v1.MsgExecLegac // Vote implements the MsgServer.Vote method. func (k msgServer) Vote(goCtx context.Context, msg *v1.MsgVote) (*v1.MsgVoteResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) - accAddr, err := sdk.AccAddressFromBech32(msg.Voter) + accAddr, err := k.authKeeper.StringToBytes(msg.Voter) if err != nil { return nil, err } @@ -163,7 +163,7 @@ func (k msgServer) Vote(goCtx context.Context, msg *v1.MsgVote) (*v1.MsgVoteResp // VoteWeighted implements the MsgServer.VoteWeighted method. func (k msgServer) VoteWeighted(goCtx context.Context, msg *v1.MsgVoteWeighted) (*v1.MsgVoteWeightedResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) - accAddr, accErr := sdk.AccAddressFromBech32(msg.Voter) + accAddr, accErr := k.authKeeper.StringToBytes(msg.Voter) if accErr != nil { return nil, accErr } @@ -186,7 +186,7 @@ func (k msgServer) VoteWeighted(goCtx context.Context, msg *v1.MsgVoteWeighted) // Deposit implements the MsgServer.Deposit method. func (k msgServer) Deposit(goCtx context.Context, msg *v1.MsgDeposit) (*v1.MsgDepositResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) - accAddr, err := sdk.AccAddressFromBech32(msg.Depositor) + accAddr, err := k.authKeeper.StringToBytes(msg.Depositor) if err != nil { return nil, err } diff --git a/x/gov/keeper/msg_server_test.go b/x/gov/keeper/msg_server_test.go index 936edb4e4d86..eef8dd112436 100644 --- a/x/gov/keeper/msg_server_test.go +++ b/x/gov/keeper/msg_server_test.go @@ -1,6 +1,7 @@ package keeper_test import ( + "errors" "strings" "time" @@ -13,6 +14,11 @@ import ( "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" ) +var ( + longAddress = "cosmos1v9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpv9skzctpg0s5ed" + longAddressError = "address max length is 255" +) + func (suite *KeeperTestSuite) TestSubmitProposalReq() { suite.reset() govAcct := suite.govKeeper.GetGovernanceAccount(suite.ctx).GetAddress() @@ -233,6 +239,8 @@ func (suite *KeeperTestSuite) TestVoteReq() { ) suite.Require().NoError(err) + suite.acctKeeper.EXPECT().StringToBytes(longAddress).Return(nil, errors.New(longAddressError)).AnyTimes() + res, err := suite.msgSrvr.SubmitProposal(suite.ctx, msg) suite.Require().NoError(err) suite.Require().NotNil(res.ProposalId) @@ -288,7 +296,7 @@ func (suite *KeeperTestSuite) TestVoteReq() { voter: sdk.AccAddress(strings.Repeat("a", 300)), metadata: "", expErr: true, - expErrMsg: "address max length is 255", + expErrMsg: longAddressError, }, "all good": { preRun: func() uint64 { @@ -360,6 +368,8 @@ func (suite *KeeperTestSuite) TestVoteWeightedReq() { suite.Require().NotNil(res.ProposalId) proposalID := res.ProposalId + suite.acctKeeper.EXPECT().StringToBytes(longAddress).Return(nil, errors.New(longAddressError)).AnyTimes() + cases := map[string]struct { preRun func() uint64 vote *v1.MsgVote @@ -411,7 +421,7 @@ func (suite *KeeperTestSuite) TestVoteWeightedReq() { voter: sdk.AccAddress(strings.Repeat("a", 300)), metadata: "", expErr: true, - expErrMsg: "address max length is 255", + expErrMsg: longAddressError, }, "all good": { preRun: func() uint64 { @@ -603,6 +613,8 @@ func (suite *KeeperTestSuite) TestLegacyMsgVote() { suite.Require().NotNil(res.ProposalId) proposalID := res.ProposalId + suite.acctKeeper.EXPECT().StringToBytes(longAddress).Return(nil, errors.New(longAddressError)).AnyTimes() + cases := map[string]struct { preRun func() uint64 expErr bool @@ -643,7 +655,7 @@ func (suite *KeeperTestSuite) TestLegacyMsgVote() { voter: sdk.AccAddress(strings.Repeat("a", 300)), metadata: "", expErr: true, - expErrMsg: "address max length is 255", + expErrMsg: longAddressError, }, "all good": { preRun: func() uint64 { @@ -715,6 +727,8 @@ func (suite *KeeperTestSuite) TestLegacyVoteWeighted() { suite.Require().NotNil(res.ProposalId) proposalID := res.ProposalId + suite.acctKeeper.EXPECT().StringToBytes(longAddress).Return(nil, errors.New(longAddressError)).AnyTimes() + cases := map[string]struct { preRun func() uint64 vote *v1beta1.MsgVote @@ -756,7 +770,7 @@ func (suite *KeeperTestSuite) TestLegacyVoteWeighted() { voter: sdk.AccAddress(strings.Repeat("a", 300)), metadata: "", expErr: true, - expErrMsg: "address max length is 255", + expErrMsg: longAddressError, }, "all good": { preRun: func() uint64 { @@ -1192,6 +1206,9 @@ func (suite *KeeperTestSuite) TestSubmitProposal_InitialDeposit() { govKeeper, ctx := suite.govKeeper, suite.ctx address := simtestutil.AddTestAddrs(suite.bankKeeper, suite.stakingKeeper, ctx, 1, tc.accountBalance[0].Amount)[0] + suite.acctKeeper.EXPECT().StringToBytes(address.String()).Return(address, nil).AnyTimes() + suite.acctKeeper.EXPECT().BytesToString(address).Return(address.String(), nil).AnyTimes() + params := v1.DefaultParams() params.MinDeposit = tc.minDeposit params.MinInitialDepositRatio = tc.minInitialDepositRatio.String() diff --git a/x/gov/keeper/proposal_test.go b/x/gov/keeper/proposal_test.go index c9acd6c898f4..2a888cf14816 100644 --- a/x/gov/keeper/proposal_test.go +++ b/x/gov/keeper/proposal_test.go @@ -28,7 +28,7 @@ func (suite *KeeperTestSuite) TestGetSetProposal() { for _, tc := range testCases { tp := TestProposal - proposal, err := suite.govKeeper.SubmitProposal(suite.ctx, tp, "", "test", "summary", sdk.AccAddress("cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r"), tc.expedited) + proposal, err := suite.govKeeper.SubmitProposal(suite.ctx, tp, "", "test", "summary", suite.addrs[0], tc.expedited) suite.Require().NoError(err) proposalID := proposal.Id suite.govKeeper.SetProposal(suite.ctx, proposal) @@ -57,7 +57,7 @@ func (suite *KeeperTestSuite) TestDeleteProposal() { }, ) tp := TestProposal - proposal, err := suite.govKeeper.SubmitProposal(suite.ctx, tp, "", "test", "summary", sdk.AccAddress("cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r"), tc.expedited) + proposal, err := suite.govKeeper.SubmitProposal(suite.ctx, tp, "", "test", "summary", suite.addrs[0], tc.expedited) suite.Require().NoError(err) proposalID := proposal.Id suite.govKeeper.SetProposal(suite.ctx, proposal) @@ -78,7 +78,7 @@ func (suite *KeeperTestSuite) TestActivateVotingPeriod() { for _, tc := range testCases { tp := TestProposal - proposal, err := suite.govKeeper.SubmitProposal(suite.ctx, tp, "", "test", "summary", sdk.AccAddress("cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r"), tc.expedited) + proposal, err := suite.govKeeper.SubmitProposal(suite.ctx, tp, "", "test", "summary", suite.addrs[0], tc.expedited) suite.Require().NoError(err) suite.Require().Nil(proposal.VotingStartTime) @@ -115,7 +115,7 @@ func (suite *KeeperTestSuite) TestDeleteProposalInVotingPeriod() { for _, tc := range testCases { suite.reset() tp := TestProposal - proposal, err := suite.govKeeper.SubmitProposal(suite.ctx, tp, "", "test", "summary", sdk.AccAddress("cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r"), tc.expedited) + proposal, err := suite.govKeeper.SubmitProposal(suite.ctx, tp, "", "test", "summary", suite.addrs[0], tc.expedited) suite.Require().NoError(err) suite.Require().Nil(proposal.VotingStartTime) @@ -134,7 +134,7 @@ func (suite *KeeperTestSuite) TestDeleteProposalInVotingPeriod() { // add vote voteOptions := []*v1.WeightedVoteOption{{Option: v1.OptionYes, Weight: "1.0"}} - err = suite.govKeeper.AddVote(suite.ctx, proposal.Id, sdk.AccAddress("cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r"), voteOptions, "") + err = suite.govKeeper.AddVote(suite.ctx, proposal.Id, suite.addrs[0], voteOptions, "") suite.Require().NoError(err) suite.Require().NotPanics(func() { @@ -142,7 +142,7 @@ func (suite *KeeperTestSuite) TestDeleteProposalInVotingPeriod() { }, "") // add vote but proposal is deleted along with its VotingPeriodProposalKey - err = suite.govKeeper.AddVote(suite.ctx, proposal.Id, sdk.AccAddress("cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r"), voteOptions, "") + err = suite.govKeeper.AddVote(suite.ctx, proposal.Id, suite.addrs[0], voteOptions, "") suite.Require().ErrorContains(err, ": inactive proposal") } } @@ -181,7 +181,7 @@ func (suite *KeeperTestSuite) TestSubmitProposal() { for i, tc := range testCases { prop, err := v1.NewLegacyContent(tc.content, tc.authority) suite.Require().NoError(err) - _, err = suite.govKeeper.SubmitProposal(suite.ctx, []sdk.Msg{prop}, tc.metadata, "title", "", sdk.AccAddress("cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r"), tc.expedited) + _, err = suite.govKeeper.SubmitProposal(suite.ctx, []sdk.Msg{prop}, tc.metadata, "title", "", suite.addrs[0], tc.expedited) suite.Require().True(errors.Is(tc.expectedErr, err), "tc #%d; got: %v, expected: %v", i, err, tc.expectedErr) } } @@ -190,11 +190,11 @@ func (suite *KeeperTestSuite) TestGetProposalsFiltered() { proposalID := uint64(1) status := []v1.ProposalStatus{v1.StatusDepositPeriod, v1.StatusVotingPeriod} - addr1 := sdk.AccAddress("foo_________________") + addr1 := suite.addrs[1] for _, s := range status { for i := 0; i < 50; i++ { - p, err := v1.NewProposal(TestProposal, proposalID, time.Now(), time.Now(), "metadata", "title", "summary", sdk.AccAddress("cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r"), false) + p, err := v1.NewProposal(TestProposal, proposalID, time.Now(), time.Now(), "metadata", "title", "summary", suite.addrs[0], false) suite.Require().NoError(err) p.Status = s diff --git a/x/gov/keeper/tally.go b/x/gov/keeper/tally.go index 27fc4d1f799a..d40778d8038c 100644 --- a/x/gov/keeper/tally.go +++ b/x/gov/keeper/tally.go @@ -36,9 +36,12 @@ func (keeper Keeper) Tally(ctx sdk.Context, proposal v1.Proposal) (passes, burnD keeper.IterateVotes(ctx, proposal.Id, func(vote v1.Vote) bool { // if validator, just record it in the map - voter := sdk.MustAccAddressFromBech32(vote.Voter) + voter, err := keeper.authKeeper.StringToBytes(vote.Voter) + if err != nil { + panic(err) + } - valAddrStr := sdk.ValAddress(voter.Bytes()).String() + valAddrStr := sdk.ValAddress(voter).String() if val, ok := currValidators[valAddrStr]; ok { val.Vote = vote.Options currValidators[valAddrStr] = val diff --git a/x/gov/keeper/vote.go b/x/gov/keeper/vote.go index 79295b9ed006..0a1e2b6f6cf5 100644 --- a/x/gov/keeper/vote.go +++ b/x/gov/keeper/vote.go @@ -82,7 +82,10 @@ func (keeper Keeper) GetVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.A func (keeper Keeper) SetVote(ctx sdk.Context, vote v1.Vote) { store := ctx.KVStore(keeper.storeKey) bz := keeper.cdc.MustMarshal(&vote) - addr := sdk.MustAccAddressFromBech32(vote.Voter) + addr, err := keeper.authKeeper.StringToBytes(vote.Voter) + if err != nil { + panic(err) + } store.Set(types.VoteKey(vote.ProposalId, addr), bz) } diff --git a/x/gov/keeper/vote_test.go b/x/gov/keeper/vote_test.go index b1060a7c4f21..29e1e89722f4 100644 --- a/x/gov/keeper/vote_test.go +++ b/x/gov/keeper/vote_test.go @@ -12,8 +12,12 @@ import ( ) func TestVotes(t *testing.T) { - govKeeper, _, bankKeeper, stakingKeeper, _, _, ctx := setupGovKeeper(t) + govKeeper, authKeeper, bankKeeper, stakingKeeper, _, _, ctx := setupGovKeeper(t) addrs := simtestutil.AddTestAddrsIncremental(bankKeeper, stakingKeeper, ctx, 2, sdkmath.NewInt(10000000)) + for _, addr := range addrs { + authKeeper.EXPECT().BytesToString(addr).Return(addr.String(), nil).AnyTimes() + authKeeper.EXPECT().StringToBytes(addr.String()).Return(addr, nil).AnyTimes() + } tp := TestProposal proposal, err := govKeeper.SubmitProposal(ctx, tp, "", "title", "description", sdk.AccAddress("cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r"), false) diff --git a/x/gov/module.go b/x/gov/module.go index ab09328b6e1e..01a6583592ee 100644 --- a/x/gov/module.go +++ b/x/gov/module.go @@ -13,6 +13,7 @@ import ( "golang.org/x/exp/slices" modulev1 "cosmossdk.io/api/cosmos/gov/module/v1" + "cosmossdk.io/core/address" "cosmossdk.io/core/appmodule" "cosmossdk.io/depinject" @@ -47,6 +48,7 @@ var ( type AppModuleBasic struct { cdc codec.Codec legacyProposalHandlers []govclient.ProposalHandler // legacy proposal handlers which live in governance cli and rest + ac address.Codec } // NewAppModuleBasic creates a new AppModuleBasic object @@ -109,8 +111,8 @@ func getProposalCLIHandlers(handlers []govclient.ProposalHandler) []*cobra.Comma } // GetQueryCmd returns the root query command for the gov module. -func (AppModuleBasic) GetQueryCmd() *cobra.Command { - return cli.GetQueryCmd() +func (ab AppModuleBasic) GetQueryCmd() *cobra.Command { + return cli.GetQueryCmd(ab.ac) } // RegisterInterfaces implements InterfaceModule.RegisterInterfaces @@ -137,7 +139,7 @@ func NewAppModule( ak govtypes.AccountKeeper, bk govtypes.BankKeeper, ss govtypes.ParamSubspace, ) AppModule { return AppModule{ - AppModuleBasic: AppModuleBasic{cdc: cdc}, + AppModuleBasic: AppModuleBasic{cdc: cdc, ac: ak}, keeper: keeper, accountKeeper: ak, bankKeeper: bk, diff --git a/x/gov/testutil/expected_keepers_mocks.go b/x/gov/testutil/expected_keepers_mocks.go index e59d2a5656ce..58027e55ea89 100644 --- a/x/gov/testutil/expected_keepers_mocks.go +++ b/x/gov/testutil/expected_keepers_mocks.go @@ -40,6 +40,21 @@ func (m *MockAccountKeeper) EXPECT() *MockAccountKeeperMockRecorder { return m.recorder } +// BytesToString mocks base method. +func (m *MockAccountKeeper) BytesToString(bz []byte) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BytesToString", bz) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// BytesToString indicates an expected call of BytesToString. +func (mr *MockAccountKeeperMockRecorder) BytesToString(bz interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BytesToString", reflect.TypeOf((*MockAccountKeeper)(nil).BytesToString), bz) +} + // GetAccount mocks base method. func (m *MockAccountKeeper) GetAccount(ctx context.Context, addr types.AccAddress) types.AccountI { m.ctrl.T.Helper() @@ -106,6 +121,21 @@ func (mr *MockAccountKeeperMockRecorder) SetModuleAccount(arg0, arg1 interface{} return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetModuleAccount", reflect.TypeOf((*MockAccountKeeper)(nil).SetModuleAccount), arg0, arg1) } +// StringToBytes mocks base method. +func (m *MockAccountKeeper) StringToBytes(text string) ([]byte, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StringToBytes", text) + ret0, _ := ret[0].([]byte) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StringToBytes indicates an expected call of StringToBytes. +func (mr *MockAccountKeeperMockRecorder) StringToBytes(text interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StringToBytes", reflect.TypeOf((*MockAccountKeeper)(nil).StringToBytes), text) +} + // MockBankKeeper is a mock of BankKeeper interface. type MockBankKeeper struct { ctrl *gomock.Controller diff --git a/x/gov/types/expected_keepers.go b/x/gov/types/expected_keepers.go index 81e488851035..2ffc4a135ffa 100644 --- a/x/gov/types/expected_keepers.go +++ b/x/gov/types/expected_keepers.go @@ -3,6 +3,7 @@ package types import ( "context" + addresscodec "cosmossdk.io/core/address" "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" @@ -36,6 +37,8 @@ type DistributionKeeper interface { // AccountKeeper defines the expected account keeper (noalias) type AccountKeeper interface { + addresscodec.Codec + GetAccount(ctx context.Context, addr sdk.AccAddress) sdk.AccountI GetModuleAddress(name string) sdk.AccAddress