diff --git a/CHANGELOG.md b/CHANGELOG.md index 5bb7d2a4751c..ae91923bd934 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -73,6 +73,15 @@ Ref: https://keepachangelog.com/en/1.0.0/ * remove `Keeper`: `IterateValidatorHistoricalRewards`, `GetValidatorHistoricalRewards`, `SetValidatorHistoricalRewards`, `DeleteValidatorHistoricalRewards`, `DeleteValidatorHistoricalReward`, `DeleteAllValidatorHistoricalRewards` * (x/slashing) [#16441](https://github.com/cosmos/cosmos-sdk/pull/16441) Params state is migrated to collections. `GetParams` has been removed. * (types) [#16918](https://github.com/cosmos/cosmos-sdk/pull/16918) Remove `IntProto` and `DecProto`. Instead, `math.Int` and `math.LegacyDec` should be used respectively. Both types support `Marshal` and `Unmarshal` which should be used for binary marshaling. +* (x/staking) [#17098](https://github.com/cosmos/cosmos-sdk/pull/17098) `NewMsgCreateValidator`, `NewValidator`, `NewMsgCancelUnbondingDelegation`, `NewMsgUndelegate`, `NewMsgBeginRedelegate`, `NewMsgDelegate` and `NewMsgEditValidator` takes a string instead of `sdk.ValAddress` or `sdk.AccAddress` + * `NewMsgCreateValidator.Validate()` takes an address codec in order to decode the address + * `NewRedelegationResponse` takes a string instead of `sdk.ValAddress` or `sdk.AccAddress` + * `NewRedelegation` and `NewUnbondingDelegation` takes a validatorAddressCodec and a delegatorAddressCodec in order to decode the addresses + * `BuildCreateValidatorMsg` takes a ValidatorAddressCodec in order to decode addresses +* (x/slashing) [#17098](https://github.com/cosmos/cosmos-sdk/pull/17098) `NewMsgUnjail` takes a string instead of `sdk.ValAddress` +* (x/genutil) [#17098](https://github.com/cosmos/cosmos-sdk/pull/17098) `GenAppStateFromConfig`, AddGenesisAccountCmd and `GenTxCmd` takes an addresscodec to decode addresses +* (x/distribution) [#17098](https://github.com/cosmos/cosmos-sdk/pull/17098) `NewMsgDepositValidatorRewardsPool`, `NewMsgFundCommunityPool`, `NewMsgWithdrawValidatorCommission` and `NewMsgWithdrawDelegatorReward` takes a string instead of `sdk.ValAddress` or `sdk.AccAddress` + ### CLI Breaking Changes diff --git a/simapp/simd/cmd/testnet.go b/simapp/simd/cmd/testnet.go index fdb0474a062a..8d79184844fe 100644 --- a/simapp/simd/cmd/testnet.go +++ b/simapp/simd/cmd/testnet.go @@ -23,6 +23,7 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + "github.com/cosmos/cosmos-sdk/runtime" "github.com/cosmos/cosmos-sdk/server" srvconfig "github.com/cosmos/cosmos-sdk/server/config" "github.com/cosmos/cosmos-sdk/testutil" @@ -144,7 +145,7 @@ Example: args.numValidators, _ = cmd.Flags().GetInt(flagNumValidators) args.algo, _ = cmd.Flags().GetString(flags.FlagKeyType) - return initTestnetFiles(clientCtx, cmd, config, mbm, genBalIterator, args) + return initTestnetFiles(clientCtx, cmd, config, mbm, genBalIterator, clientCtx.TxConfig.SigningContext().ValidatorAddressCodec(), args) }, } @@ -204,6 +205,7 @@ func initTestnetFiles( nodeConfig *cmtconfig.Config, mbm module.BasicManager, genBalIterator banktypes.GenesisBalancesIterator, + valAddrCodec runtime.ValidatorAddressCodec, args initArgs, ) error { if args.chainID == "" { @@ -296,9 +298,13 @@ func initTestnetFiles( genBalances = append(genBalances, banktypes.Balance{Address: addr.String(), Coins: coins.Sort()}) genAccounts = append(genAccounts, authtypes.NewBaseAccount(addr, nil, 0, 0)) + valStr, err := valAddrCodec.BytesToString(sdk.ValAddress(addr)) + if err != nil { + return err + } valTokens := sdk.TokensFromConsensusPower(100, sdk.DefaultPowerReduction) createValMsg, err := stakingtypes.NewMsgCreateValidator( - sdk.ValAddress(addr), + valStr, valPubKeys[i], sdk.NewCoin(sdk.DefaultBondDenom, valTokens), stakingtypes.NewDescription(nodeDirName, "", "", "", ""), @@ -345,7 +351,7 @@ func initTestnetFiles( err := collectGenFiles( clientCtx, nodeConfig, args.chainID, nodeIDs, valPubKeys, args.numValidators, - args.outputDir, args.nodeDirPrefix, args.nodeDaemonHome, genBalIterator, + args.outputDir, args.nodeDirPrefix, args.nodeDaemonHome, genBalIterator, valAddrCodec, ) if err != nil { return err @@ -402,7 +408,7 @@ func initGenFiles( func collectGenFiles( clientCtx client.Context, nodeConfig *cmtconfig.Config, chainID string, nodeIDs []string, valPubKeys []cryptotypes.PubKey, numValidators int, - outputDir, nodeDirPrefix, nodeDaemonHome string, genBalIterator banktypes.GenesisBalancesIterator, + outputDir, nodeDirPrefix, nodeDaemonHome string, genBalIterator banktypes.GenesisBalancesIterator, valAddrCodec runtime.ValidatorAddressCodec, ) error { var appState json.RawMessage genTime := cmttime.Now() @@ -423,7 +429,8 @@ func collectGenFiles( return err } - nodeAppState, err := genutil.GenAppStateFromConfig(clientCtx.Codec, clientCtx.TxConfig, nodeConfig, initCfg, appGenesis, genBalIterator, genutiltypes.DefaultMessageValidator) + nodeAppState, err := genutil.GenAppStateFromConfig(clientCtx.Codec, clientCtx.TxConfig, nodeConfig, initCfg, appGenesis, genBalIterator, genutiltypes.DefaultMessageValidator, + valAddrCodec) if err != nil { return err } diff --git a/tests/e2e/authz/tx.go b/tests/e2e/authz/tx.go index cc93b99855a8..225a8332e8ad 100644 --- a/tests/e2e/authz/tx.go +++ b/tests/e2e/authz/tx.go @@ -172,7 +172,7 @@ var ( ) func execDelegate(val *network.Validator, args []string) (testutil.BufferWriter, error) { - cmd := stakingcli.NewDelegateCmd() + cmd := stakingcli.NewDelegateCmd(addresscodec.NewBech32Codec("cosmosvaloper"), addresscodec.NewBech32Codec("cosmos")) clientCtx := val.ClientCtx return clitestutil.ExecTestCLICmd(clientCtx, cmd, args) } diff --git a/tests/e2e/distribution/suite.go b/tests/e2e/distribution/suite.go index 2fc0c78bd21d..54d02961f747 100644 --- a/tests/e2e/distribution/suite.go +++ b/tests/e2e/distribution/suite.go @@ -139,7 +139,7 @@ func (s *E2ETestSuite) TestNewWithdrawRewardsCmd() { _, _ = s.network.WaitForHeightWithTimeout(10, time.Minute) ctx := svrcmd.CreateExecuteContext(context.Background()) - cmd := cli.NewWithdrawRewardsCmd() + cmd := cli.NewWithdrawRewardsCmd(address.NewBech32Codec("cosmosvaloper"), address.NewBech32Codec("cosmos")) cmd.SetContext(ctx) cmd.SetArgs(args) s.Require().NoError(client.SetCmdClientContextHandler(clientCtx, cmd)) @@ -227,7 +227,7 @@ func (s *E2ETestSuite) TestNewWithdrawAllRewardsCmd() { tc := tc s.Run(tc.name, func() { - cmd := cli.NewWithdrawAllRewardsCmd() + cmd := cli.NewWithdrawAllRewardsCmd(address.NewBech32Codec("cosmosvaloper"), address.NewBech32Codec("cosmos")) clientCtx := val.ClientCtx _, _ = s.network.WaitForHeightWithTimeout(10, time.Minute) @@ -367,7 +367,7 @@ func (s *E2ETestSuite) TestNewFundCommunityPoolCmd() { tc := tc s.Run(tc.name, func() { - cmd := cli.NewFundCommunityPoolCmd() + cmd := cli.NewFundCommunityPoolCmd(address.NewBech32Codec("cosmos")) clientCtx := val.ClientCtx out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) diff --git a/tests/e2e/distribution/withdraw_all_suite.go b/tests/e2e/distribution/withdraw_all_suite.go index 555dc25587e2..18a7a5b11555 100644 --- a/tests/e2e/distribution/withdraw_all_suite.go +++ b/tests/e2e/distribution/withdraw_all_suite.go @@ -10,7 +10,7 @@ import ( "cosmossdk.io/simapp" "github.com/cosmos/cosmos-sdk/client/flags" - addresscodec "github.com/cosmos/cosmos-sdk/codec/address" + "github.com/cosmos/cosmos-sdk/codec/address" "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" "github.com/cosmos/cosmos-sdk/testutil" @@ -66,7 +66,7 @@ func (s *WithdrawAllTestSuite) TestNewWithdrawAllRewardsGenerateOnly() { val.ClientCtx, val.Address, newAddr, - sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(2000))), addresscodec.NewBech32Codec("cosmos"), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(2000))), address.NewBech32Codec("cosmos"), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))).String()), ) @@ -82,7 +82,7 @@ func (s *WithdrawAllTestSuite) TestNewWithdrawAllRewardsGenerateOnly() { fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))).String()), } - cmd := stakingcli.NewDelegateCmd() + cmd := stakingcli.NewDelegateCmd(clientCtx.InterfaceRegistry.SigningContext().ValidatorAddressCodec(), clientCtx.InterfaceRegistry.SigningContext().AddressCodec()) _, err = clitestutil.ExecTestCLICmd(clientCtx, cmd, args) require.NoError(err) require.NoError(s.network.WaitForNextBlock()) @@ -109,7 +109,7 @@ func (s *WithdrawAllTestSuite) TestNewWithdrawAllRewardsGenerateOnly() { fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))).String()), } - cmd = cli.NewWithdrawAllRewardsCmd() + cmd = cli.NewWithdrawAllRewardsCmd(address.NewBech32Codec("cosmosvaloper"), address.NewBech32Codec("cosmos")) out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, args) if err != nil { return err @@ -132,7 +132,7 @@ func (s *WithdrawAllTestSuite) TestNewWithdrawAllRewardsGenerateOnly() { fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))).String()), } - cmd = cli.NewWithdrawAllRewardsCmd() + cmd = cli.NewWithdrawAllRewardsCmd(address.NewBech32Codec("cosmosvaloper"), address.NewBech32Codec("cosmos")) out, err = clitestutil.ExecTestCLICmd(clientCtx, cmd, args) require.NoError(err) // expect 1 transaction in the generated file when --max-msgs in a tx set 2, since there are only delegations. diff --git a/tests/e2e/staking/suite.go b/tests/e2e/staking/suite.go index c88f5ad74e71..174138281967 100644 --- a/tests/e2e/staking/suite.go +++ b/tests/e2e/staking/suite.go @@ -115,7 +115,7 @@ func (s *E2ETestSuite) TestBlockResults() { require.NoError(s.network.WaitForNextBlock()) // Use CLI to create a delegation from the new account to validator `val`. - cmd := cli.NewDelegateCmd() + cmd := cli.NewDelegateCmd(addresscodec.NewBech32Codec("cosmosvaloper"), addresscodec.NewBech32Codec("cosmos")) _, err = clitestutil.ExecTestCLICmd(val.ClientCtx, cmd, []string{ val.ValAddress.String(), sdk.NewCoin(s.cfg.BondDenom, math.NewInt(150)).String(), diff --git a/tests/e2e/staking/test_helpers.go b/tests/e2e/staking/test_helpers.go index e2951834d101..6605dc867dae 100644 --- a/tests/e2e/staking/test_helpers.go +++ b/tests/e2e/staking/test_helpers.go @@ -7,6 +7,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" + addresscodec "github.com/cosmos/cosmos-sdk/codec/address" "github.com/cosmos/cosmos-sdk/testutil" clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" sdk "github.com/cosmos/cosmos-sdk/types" @@ -31,7 +32,7 @@ func MsgRedelegateExec(clientCtx client.Context, from, src, dst, amount fmt.Stri args = append(args, extraArgs...) args = append(args, commonArgs...) - return clitestutil.ExecTestCLICmd(clientCtx, stakingcli.NewRedelegateCmd(), args) + return clitestutil.ExecTestCLICmd(clientCtx, stakingcli.NewRedelegateCmd(addresscodec.NewBech32Codec("cosmosvaloper"), addresscodec.NewBech32Codec("cosmos")), args) } // MsgUnbondExec creates a unbond message. @@ -47,5 +48,5 @@ func MsgUnbondExec(clientCtx client.Context, from, valAddress, args = append(args, commonArgs...) args = append(args, extraArgs...) - return clitestutil.ExecTestCLICmd(clientCtx, stakingcli.NewUnbondCmd(), args) + return clitestutil.ExecTestCLICmd(clientCtx, stakingcli.NewUnbondCmd(addresscodec.NewBech32Codec("cosmosvaloper"), addresscodec.NewBech32Codec("cosmos")), args) } diff --git a/tests/integration/auth/migrations/v2/store_test.go b/tests/integration/auth/migrations/v2/store_test.go index ca25f97ecd7b..7d441a66b75f 100644 --- a/tests/integration/auth/migrations/v2/store_test.go +++ b/tests/integration/auth/migrations/v2/store_test.go @@ -776,7 +776,7 @@ func createValidator(t *testing.T, ctx sdk.Context, bankKeeper bankkeeper.Keeper valAddrs := simtestutil.ConvertAddrsToValAddrs(addrs) pks := simtestutil.CreateTestPubKeys(1) - val1, err := stakingtypes.NewValidator(valAddrs[0], pks[0], stakingtypes.Description{}) + val1, err := stakingtypes.NewValidator(valAddrs[0].String(), pks[0], stakingtypes.Description{}) require.NoError(t, err) require.NoError(t, stakingKeeper.SetValidator(ctx, val1)) diff --git a/tests/integration/distribution/keeper/msg_server_test.go b/tests/integration/distribution/keeper/msg_server_test.go index 4469b1404b21..dcce82ad1955 100644 --- a/tests/integration/distribution/keeper/msg_server_test.go +++ b/tests/integration/distribution/keeper/msg_server_test.go @@ -174,7 +174,7 @@ func TestMsgWithdrawDelegatorReward(t *testing.T) { } // setup staking validator - validator, err := stakingtypes.NewValidator(f.valAddr, PKS[0], stakingtypes.Description{}) + validator, err := stakingtypes.NewValidator(f.valAddr.String(), PKS[0], stakingtypes.Description{}) assert.NilError(t, err) commission := stakingtypes.NewCommission(math.LegacyZeroDec(), math.LegacyOneDec(), math.LegacyOneDec()) validator, err = validator.SetInitialCommission(commission) diff --git a/tests/integration/gov/keeper/common_test.go b/tests/integration/gov/keeper/common_test.go index c642ff1f1798..d36f54a29b26 100644 --- a/tests/integration/gov/keeper/common_test.go +++ b/tests/integration/gov/keeper/common_test.go @@ -41,11 +41,11 @@ func createValidators(t *testing.T, f *fixture, powers []int64) ([]sdk.AccAddres valAddrs := simtestutil.ConvertAddrsToValAddrs(addrs) pks := simtestutil.CreateTestPubKeys(5) - val1, err := stakingtypes.NewValidator(valAddrs[0], pks[0], stakingtypes.Description{}) + val1, err := stakingtypes.NewValidator(valAddrs[0].String(), pks[0], stakingtypes.Description{}) assert.NilError(t, err) - val2, err := stakingtypes.NewValidator(valAddrs[1], pks[1], stakingtypes.Description{}) + val2, err := stakingtypes.NewValidator(valAddrs[1].String(), pks[1], stakingtypes.Description{}) assert.NilError(t, err) - val3, err := stakingtypes.NewValidator(valAddrs[2], pks[2], stakingtypes.Description{}) + val3, err := stakingtypes.NewValidator(valAddrs[2].String(), pks[2], stakingtypes.Description{}) assert.NilError(t, err) assert.NilError(t, f.stakingKeeper.SetValidator(f.ctx, val1)) diff --git a/tests/integration/staking/keeper/genesis_test.go b/tests/integration/staking/keeper/genesis_test.go index 8884318b02df..9bd000261ae5 100644 --- a/tests/integration/staking/keeper/genesis_test.go +++ b/tests/integration/staking/keeper/genesis_test.go @@ -196,7 +196,7 @@ func TestInitGenesisLargeValidatorSet(t *testing.T) { bondedPoolAmt := math.ZeroInt() for i := range validators { validators[i], err = types.NewValidator( - sdk.ValAddress(addrs[i]), + sdk.ValAddress(addrs[i]).String(), PKs[i], types.NewDescription(fmt.Sprintf("#%d", i), "", "", "", ""), ) diff --git a/tests/integration/staking/keeper/grpc_query_test.go b/tests/integration/staking/keeper/grpc_query_test.go index 4b152d62f159..c5500f232b98 100644 --- a/tests/integration/staking/keeper/grpc_query_test.go +++ b/tests/integration/staking/keeper/grpc_query_test.go @@ -568,7 +568,7 @@ func TestGRPCQueryUnbondingDelegation(t *testing.T) { } }, false, - "invalid Bech32", + "hrp does not match bech32 prefix", }, { "delegation not found for validator", diff --git a/tests/integration/staking/keeper/msg_server_test.go b/tests/integration/staking/keeper/msg_server_test.go index 9edcc02d96ce..f84c305795dc 100644 --- a/tests/integration/staking/keeper/msg_server_test.go +++ b/tests/integration/staking/keeper/msg_server_test.go @@ -8,6 +8,7 @@ import ( "cosmossdk.io/math" + "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/bank/testutil" @@ -40,7 +41,7 @@ func TestCancelUnbondingDelegation(t *testing.T) { delegatorAddr := addrs[1] // setup a new validator with bonded status - validator, err := types.NewValidator(valAddr, PKs[0], types.NewDescription("Validator", "", "", "", "")) + validator, err := types.NewValidator(valAddr.String(), PKs[0], types.NewDescription("Validator", "", "", "", "")) validator.Status = types.Bonded assert.NilError(t, err) assert.NilError(t, f.stakingKeeper.SetValidator(ctx, validator)) @@ -55,6 +56,7 @@ func TestCancelUnbondingDelegation(t *testing.T) { ctx.BlockTime().Add(time.Minute*10), unbondingAmount.Amount, 0, + address.NewBech32Codec("cosmosvaloper"), address.NewBech32Codec("cosmos"), ) // set and retrieve a record diff --git a/tests/integration/staking/keeper/slash_test.go b/tests/integration/staking/keeper/slash_test.go index 4b0bd47e9fdf..7595e7034e72 100644 --- a/tests/integration/staking/keeper/slash_test.go +++ b/tests/integration/staking/keeper/slash_test.go @@ -10,6 +10,7 @@ import ( "cosmossdk.io/math" + "github.com/cosmos/cosmos-sdk/codec/address" sdk "github.com/cosmos/cosmos-sdk/types" banktestutil "github.com/cosmos/cosmos-sdk/x/bank/testutil" "github.com/cosmos/cosmos-sdk/x/staking/keeper" @@ -62,7 +63,7 @@ func TestSlashUnbondingDelegation(t *testing.T) { // set an unbonding delegation with expiration timestamp (beyond which the // unbonding delegation shouldn't be slashed) ubd := types.NewUnbondingDelegation(addrDels[0], addrVals[0], 0, - time.Unix(5, 0), math.NewInt(10), 0) + time.Unix(5, 0), math.NewInt(10), 0, address.NewBech32Codec("cosmosvaloper"), address.NewBech32Codec("cosmos")) assert.NilError(t, f.stakingKeeper.SetUnbondingDelegation(f.sdkCtx, ubd)) @@ -121,7 +122,7 @@ func TestSlashRedelegation(t *testing.T) { // set a redelegation with an expiration timestamp beyond which the // redelegation shouldn't be slashed rd := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 0, - time.Unix(5, 0), math.NewInt(10), math.LegacyNewDec(10), 0) + time.Unix(5, 0), math.NewInt(10), math.LegacyNewDec(10), 0, address.NewBech32Codec("cosmosvaloper"), address.NewBech32Codec("cosmos")) assert.NilError(t, f.stakingKeeper.SetRedelegation(f.sdkCtx, rd)) @@ -259,7 +260,7 @@ func TestSlashWithUnbondingDelegation(t *testing.T) { // set an unbonding delegation with expiration timestamp beyond which the // unbonding delegation shouldn't be slashed ubdTokens := f.stakingKeeper.TokensFromConsensusPower(f.sdkCtx, 4) - ubd := types.NewUnbondingDelegation(addrDels[0], addrVals[0], 11, time.Unix(0, 0), ubdTokens, 0) + ubd := types.NewUnbondingDelegation(addrDels[0], addrVals[0], 11, time.Unix(0, 0), ubdTokens, 0, address.NewBech32Codec("cosmosvaloper"), address.NewBech32Codec("cosmos")) assert.NilError(t, f.stakingKeeper.SetUnbondingDelegation(f.sdkCtx, ubd)) // slash validator for the first time @@ -389,7 +390,7 @@ func TestSlashWithRedelegation(t *testing.T) { // set a redelegation rdTokens := f.stakingKeeper.TokensFromConsensusPower(f.sdkCtx, 6) - rd := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 11, time.Unix(0, 0), rdTokens, math.LegacyNewDecFromInt(rdTokens), 0) + rd := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 11, time.Unix(0, 0), rdTokens, math.LegacyNewDecFromInt(rdTokens), 0, address.NewBech32Codec("cosmosvaloper"), address.NewBech32Codec("cosmos")) assert.NilError(t, f.stakingKeeper.SetRedelegation(f.sdkCtx, rd)) // set the associated delegation @@ -547,7 +548,7 @@ func TestSlashBoth(t *testing.T) { // set a redelegation with expiration timestamp beyond which the // redelegation shouldn't be slashed rdATokens := f.stakingKeeper.TokensFromConsensusPower(f.sdkCtx, 6) - rdA := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 11, time.Unix(0, 0), rdATokens, math.LegacyNewDecFromInt(rdATokens), 0) + rdA := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 11, time.Unix(0, 0), rdATokens, math.LegacyNewDecFromInt(rdATokens), 0, address.NewBech32Codec("cosmosvaloper"), address.NewBech32Codec("cosmos")) assert.NilError(t, f.stakingKeeper.SetRedelegation(f.sdkCtx, rdA)) // set the associated delegation @@ -558,7 +559,7 @@ func TestSlashBoth(t *testing.T) { // unbonding delegation shouldn't be slashed) ubdATokens := f.stakingKeeper.TokensFromConsensusPower(f.sdkCtx, 4) ubdA := types.NewUnbondingDelegation(addrDels[0], addrVals[0], 11, - time.Unix(0, 0), ubdATokens, 0) + time.Unix(0, 0), ubdATokens, 0, address.NewBech32Codec("cosmosvaloper"), address.NewBech32Codec("cosmos")) assert.NilError(t, f.stakingKeeper.SetUnbondingDelegation(f.sdkCtx, ubdA)) bondedCoins := sdk.NewCoins(sdk.NewCoin(bondDenom, rdATokens.MulRaw(2))) diff --git a/tests/integration/staking/keeper/validator_test.go b/tests/integration/staking/keeper/validator_test.go index 11bdf0824684..70c3633f4683 100644 --- a/tests/integration/staking/keeper/validator_test.go +++ b/tests/integration/staking/keeper/validator_test.go @@ -20,7 +20,7 @@ import ( func newMonikerValidator(tb testing.TB, operator sdk.ValAddress, pubKey cryptotypes.PubKey, moniker string) types.Validator { tb.Helper() - v, err := types.NewValidator(operator, pubKey, types.Description{Moniker: moniker}) + v, err := types.NewValidator(operator.String(), pubKey, types.Description{Moniker: moniker}) assert.NilError(tb, err) return v } diff --git a/tests/integration/staking/simulation/operations_test.go b/tests/integration/staking/simulation/operations_test.go index 7fb8bbeb3dd1..d1a11bfb6271 100644 --- a/tests/integration/staking/simulation/operations_test.go +++ b/tests/integration/staking/simulation/operations_test.go @@ -18,6 +18,7 @@ import ( "cosmossdk.io/math" "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/codec/address" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/runtime" @@ -203,7 +204,7 @@ func (s *SimTestSuite) TestSimulateMsgCancelUnbondingDelegation() { s.setupValidatorRewards(ctx, validator0.GetOperator()) // unbonding delegation - udb := types.NewUnbondingDelegation(delegator.Address, validator0.GetOperator(), s.app.LastBlockHeight()+1, blockTime.Add(2*time.Minute), delTokens, 0) + udb := types.NewUnbondingDelegation(delegator.Address, validator0.GetOperator(), s.app.LastBlockHeight()+1, blockTime.Add(2*time.Minute), delTokens, 0, address.NewBech32Codec("cosmosvaloper"), address.NewBech32Codec("cosmos")) require.NoError(s.stakingKeeper.SetUnbondingDelegation(ctx, udb)) s.setupValidatorRewards(ctx, validator0.GetOperator()) diff --git a/testutil/network/network.go b/testutil/network/network.go index 83758639806f..c56c5f054533 100644 --- a/testutil/network/network.go +++ b/testutil/network/network.go @@ -521,7 +521,7 @@ func New(l Logger, baseDir string, cfg Config) (*Network, error) { } createValMsg, err := stakingtypes.NewMsgCreateValidator( - sdk.ValAddress(addr), + sdk.ValAddress(addr).String(), valPubKeys[i], sdk.NewCoin(cfg.BondDenom, cfg.BondedTokens), stakingtypes.NewDescription(nodeDirName, "", "", "", ""), diff --git a/testutil/network/util.go b/testutil/network/util.go index c70108535c74..9615751600b9 100644 --- a/testutil/network/util.go +++ b/testutil/network/util.go @@ -142,7 +142,7 @@ func collectGenFiles(cfg Config, vals []*Validator, outputDir string) error { } appState, err := genutil.GenAppStateFromConfig(cfg.Codec, cfg.TxConfig, - cmtCfg, initCfg, appGenesis, banktypes.GenesisBalancesIterator{}, genutiltypes.DefaultMessageValidator) + cmtCfg, initCfg, appGenesis, banktypes.GenesisBalancesIterator{}, genutiltypes.DefaultMessageValidator, cfg.TxConfig.SigningContext().ValidatorAddressCodec()) if err != nil { return err } diff --git a/testutil/testnet/genesis.go b/testutil/testnet/genesis.go index a28df6ad9ec4..f75b14d5244c 100644 --- a/testutil/testnet/genesis.go +++ b/testutil/testnet/genesis.go @@ -12,6 +12,7 @@ import ( "cosmossdk.io/math" "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/codec/address" codectypes "github.com/cosmos/cosmos-sdk/codec/types" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" @@ -97,7 +98,7 @@ func (b *GenesisBuilder) GenTx(privVal secp256k1.PrivKey, val cmttypes.GenesisVa // Produce the create validator message. msg, err := stakingtypes.NewMsgCreateValidator( - privVal.PubKey().Address().Bytes(), + sdk.ValAddress(privVal.PubKey().Address()).String(), pubKey, amount, stakingtypes.Description{ @@ -114,7 +115,7 @@ func (b *GenesisBuilder) GenTx(privVal secp256k1.PrivKey, val cmttypes.GenesisVa panic(err) } - if err := msg.Validate(); err != nil { + if err := msg.Validate(address.NewBech32Codec("cosmosvaloper")); err != nil { panic(err) } diff --git a/x/distribution/client/cli/tx.go b/x/distribution/client/cli/tx.go index 905656a65587..577389028856 100644 --- a/x/distribution/client/cli/tx.go +++ b/x/distribution/client/cli/tx.go @@ -28,7 +28,7 @@ const ( ) // NewTxCmd returns a root CLI command handler for all x/distribution transaction commands. -func NewTxCmd(ac address.Codec) *cobra.Command { +func NewTxCmd(valAc, ac address.Codec) *cobra.Command { distTxCmd := &cobra.Command{ Use: types.ModuleName, Short: "Distribution transactions subcommands", @@ -38,11 +38,11 @@ func NewTxCmd(ac address.Codec) *cobra.Command { } distTxCmd.AddCommand( - NewWithdrawRewardsCmd(), - NewWithdrawAllRewardsCmd(), + NewWithdrawRewardsCmd(valAc, ac), + NewWithdrawAllRewardsCmd(valAc, ac), NewSetWithdrawAddrCmd(ac), - NewFundCommunityPoolCmd(), - NewDepositValidatorRewardsPoolCmd(), + NewFundCommunityPoolCmd(ac), + NewDepositValidatorRewardsPoolCmd(valAc, ac), ) return distTxCmd @@ -77,7 +77,7 @@ func newSplitAndApply( } // NewWithdrawRewardsCmd returns a CLI command handler for creating a MsgWithdrawDelegatorReward transaction. -func NewWithdrawRewardsCmd() *cobra.Command { +func NewWithdrawRewardsCmd(valCodec, ac address.Codec) *cobra.Command { bech32PrefixValAddr := sdk.GetConfig().GetBech32ValidatorAddrPrefix() cmd := &cobra.Command{ @@ -100,16 +100,20 @@ $ %s tx distribution withdraw-rewards %s1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj if err != nil { return err } - delAddr := clientCtx.GetFromAddress() - valAddr, err := sdk.ValAddressFromBech32(args[0]) + delAddr, err := ac.BytesToString(clientCtx.GetFromAddress()) + if err != nil { + return err + } + + _, err = valCodec.StringToBytes(args[0]) if err != nil { return err } - msgs := []sdk.Msg{types.NewMsgWithdrawDelegatorReward(delAddr, valAddr)} + msgs := []sdk.Msg{types.NewMsgWithdrawDelegatorReward(delAddr, args[0])} if commission, _ := cmd.Flags().GetBool(FlagCommission); commission { - msgs = append(msgs, types.NewMsgWithdrawValidatorCommission(valAddr)) + msgs = append(msgs, types.NewMsgWithdrawValidatorCommission(args[0])) } return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msgs...) @@ -123,7 +127,7 @@ $ %s tx distribution withdraw-rewards %s1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj } // NewWithdrawAllRewardsCmd returns a CLI command handler for creating a MsgWithdrawDelegatorReward transaction. -func NewWithdrawAllRewardsCmd() *cobra.Command { +func NewWithdrawAllRewardsCmd(valCodec, ac address.Codec) *cobra.Command { cmd := &cobra.Command{ Use: "withdraw-all-rewards", Short: "withdraw all delegations rewards for a delegator", @@ -143,7 +147,10 @@ $ %[1]s tx distribution withdraw-all-rewards --from mykey if err != nil { return err } - delAddr := clientCtx.GetFromAddress() + delAddr, err := ac.BytesToString(clientCtx.GetFromAddress()) + if err != nil { + return err + } // The transaction cannot be generated offline since it requires a query // to get all the validators. @@ -152,7 +159,7 @@ $ %[1]s tx distribution withdraw-all-rewards --from mykey } queryClient := types.NewQueryClient(clientCtx) - delValsRes, err := queryClient.DelegatorValidators(cmd.Context(), &types.QueryDelegatorValidatorsRequest{DelegatorAddress: delAddr.String()}) + delValsRes, err := queryClient.DelegatorValidators(cmd.Context(), &types.QueryDelegatorValidatorsRequest{DelegatorAddress: delAddr}) if err != nil { return err } @@ -161,12 +168,12 @@ $ %[1]s tx distribution withdraw-all-rewards --from mykey // build multi-message transaction msgs := make([]sdk.Msg, 0, len(validators)) for _, valAddr := range validators { - val, err := sdk.ValAddressFromBech32(valAddr) + _, err := valCodec.StringToBytes(valAddr) if err != nil { return err } - msg := types.NewMsgWithdrawDelegatorReward(delAddr, val) + msg := types.NewMsgWithdrawDelegatorReward(delAddr, valAddr) msgs = append(msgs, msg) } @@ -222,7 +229,7 @@ $ %s tx distribution set-withdraw-addr %s1gghjut3ccd8ay0zduzj64hwre2fxs9ld75ru9p } // NewFundCommunityPoolCmd returns a CLI command handler for creating a MsgFundCommunityPool transaction. -func NewFundCommunityPoolCmd() *cobra.Command { +func NewFundCommunityPoolCmd(ac address.Codec) *cobra.Command { cmd := &cobra.Command{ Use: "fund-community-pool [amount]", Args: cobra.ExactArgs(1), @@ -241,7 +248,10 @@ $ %s tx distribution fund-community-pool 100uatom --from mykey if err != nil { return err } - depositorAddr := clientCtx.GetFromAddress() + depositorAddr, err := ac.BytesToString(clientCtx.GetFromAddress()) + if err != nil { + return err + } amount, err := sdk.ParseCoinsNormalized(args[0]) if err != nil { return err @@ -260,7 +270,7 @@ $ %s tx distribution fund-community-pool 100uatom --from mykey // NewDepositValidatorRewardsPoolCmd returns a CLI command handler for creating // a MsgDepositValidatorRewardsPool transaction. -func NewDepositValidatorRewardsPoolCmd() *cobra.Command { +func NewDepositValidatorRewardsPoolCmd(valCodec, ac address.Codec) *cobra.Command { cmd := &cobra.Command{ Use: "fund-validator-rewards-pool [val_addr] [amount]", Args: cobra.ExactArgs(2), @@ -275,9 +285,12 @@ func NewDepositValidatorRewardsPoolCmd() *cobra.Command { return err } - depositorAddr := clientCtx.GetFromAddress() + depositorAddr, err := ac.BytesToString(clientCtx.GetFromAddress()) + if err != nil { + return err + } - valAddr, err := sdk.ValAddressFromBech32(args[0]) + _, err = valCodec.StringToBytes(args[0]) if err != nil { return err } @@ -287,7 +300,7 @@ func NewDepositValidatorRewardsPoolCmd() *cobra.Command { return err } - msg := types.NewMsgDepositValidatorRewardsPool(depositorAddr, valAddr, amount) + msg := types.NewMsgDepositValidatorRewardsPool(depositorAddr, args[0], amount) return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) }, } diff --git a/x/distribution/client/cli/tx_test.go b/x/distribution/client/cli/tx_test.go index 941aeb653bae..2f90e87e8073 100644 --- a/x/distribution/client/cli/tx_test.go +++ b/x/distribution/client/cli/tx_test.go @@ -99,7 +99,7 @@ func (s *CLITestSuite) TestTxWithdrawRewardsCmd() { fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(10))).String()), }, - "invalid Bech32 prefix", + "hrp does not match bech32 prefix", }, { "valid transaction", @@ -133,7 +133,7 @@ func (s *CLITestSuite) TestTxWithdrawRewardsCmd() { args := append([]string{tc.valAddr.String()}, tc.args...) ctx := svrcmd.CreateExecuteContext(context.Background()) - cmd := cli.NewWithdrawRewardsCmd() + cmd := cli.NewWithdrawRewardsCmd(address.NewBech32Codec("cosmosvaloper"), address.NewBech32Codec("cosmos")) cmd.SetContext(ctx) cmd.SetArgs(args) s.Require().NoError(client.SetCmdClientContextHandler(s.clientCtx, cmd)) @@ -185,7 +185,7 @@ func (s *CLITestSuite) TestTxWithdrawAllRewardsCmd() { tc := tc s.Run(tc.name, func() { - cmd := cli.NewWithdrawAllRewardsCmd() + cmd := cli.NewWithdrawAllRewardsCmd(address.NewBech32Codec("cosmosvaloper"), address.NewBech32Codec("cosmos")) out, err := clitestutil.ExecTestCLICmd(s.clientCtx, cmd, tc.args) if tc.expectErrMsg != "" { @@ -287,7 +287,7 @@ func (s *CLITestSuite) TestTxFundCommunityPoolCmd() { tc := tc s.Run(tc.name, func() { - cmd := cli.NewFundCommunityPoolCmd() + cmd := cli.NewFundCommunityPoolCmd(address.NewBech32Codec("cosmos")) out, err := clitestutil.ExecTestCLICmd(s.clientCtx, cmd, tc.args) if tc.expectErr { diff --git a/x/distribution/keeper/allocation.go b/x/distribution/keeper/allocation.go index 1fd7990a7577..35814953dd6a 100644 --- a/x/distribution/keeper/allocation.go +++ b/x/distribution/keeper/allocation.go @@ -89,13 +89,18 @@ func (k Keeper) AllocateTokensToValidator(ctx context.Context, val stakingtypes. commission := tokens.MulDec(val.GetCommission()) shared := tokens.Sub(commission) + valStr, err := k.stakingKeeper.ValidatorAddressCodec().BytesToString(val.GetOperator()) + if err != nil { + return err + } + // update current commission sdkCtx := sdk.UnwrapSDKContext(ctx) sdkCtx.EventManager().EmitEvent( sdk.NewEvent( types.EventTypeCommission, sdk.NewAttribute(sdk.AttributeKeyAmount, commission.String()), - sdk.NewAttribute(types.AttributeKeyValidator, val.GetOperator().String()), + sdk.NewAttribute(types.AttributeKeyValidator, valStr), ), ) currentCommission, err := k.ValidatorsAccumulatedCommission.Get(ctx, val.GetOperator()) diff --git a/x/distribution/keeper/allocation_test.go b/x/distribution/keeper/allocation_test.go index e5f2db8b7a5c..a341393e444c 100644 --- a/x/distribution/keeper/allocation_test.go +++ b/x/distribution/keeper/allocation_test.go @@ -13,6 +13,7 @@ import ( "cosmossdk.io/math" storetypes "cosmossdk.io/store/types" + "github.com/cosmos/cosmos-sdk/codec/address" "github.com/cosmos/cosmos-sdk/runtime" "github.com/cosmos/cosmos-sdk/testutil" sdk "github.com/cosmos/cosmos-sdk/types" @@ -38,6 +39,7 @@ func TestAllocateTokensToValidatorWithCommission(t *testing.T) { accountKeeper := distrtestutil.NewMockAccountKeeper(ctrl) accountKeeper.EXPECT().GetModuleAddress("distribution").Return(distrAcc.GetAddress()) + stakingKeeper.EXPECT().ValidatorAddressCodec().Return(address.NewBech32Codec("cosmosvaloper")).AnyTimes() distrKeeper := keeper.NewKeeper( encCfg.Codec, @@ -91,6 +93,7 @@ func TestAllocateTokensToManyValidators(t *testing.T) { feeCollectorAcc := authtypes.NewEmptyModuleAccount("fee_collector") accountKeeper.EXPECT().GetModuleAddress("distribution").Return(distrAcc.GetAddress()) accountKeeper.EXPECT().GetModuleAccount(gomock.Any(), "fee_collector").Return(feeCollectorAcc) + stakingKeeper.EXPECT().ValidatorAddressCodec().Return(address.NewBech32Codec("cosmosvaloper")).AnyTimes() distrKeeper := keeper.NewKeeper( encCfg.Codec, @@ -217,6 +220,7 @@ func TestAllocateTokensTruncation(t *testing.T) { feeCollectorAcc := authtypes.NewEmptyModuleAccount("fee_collector") accountKeeper.EXPECT().GetModuleAddress("distribution").Return(distrAcc.GetAddress()) accountKeeper.EXPECT().GetModuleAccount(gomock.Any(), "fee_collector").Return(feeCollectorAcc) + stakingKeeper.EXPECT().ValidatorAddressCodec().Return(address.NewBech32Codec("cosmosvaloper")).AnyTimes() distrKeeper := keeper.NewKeeper( encCfg.Codec, @@ -248,7 +252,7 @@ func TestAllocateTokensTruncation(t *testing.T) { // create third validator with 10% commission valAddr2 := sdk.ValAddress(valConsAddr2) - val2, err := stakingtypes.NewValidator(sdk.ValAddress(valConsAddr2), valConsPk1, stakingtypes.Description{}) + val2, err := stakingtypes.NewValidator(sdk.ValAddress(valConsAddr2).String(), valConsPk1, stakingtypes.Description{}) require.NoError(t, err) val2.Commission = stakingtypes.NewCommission(math.LegacyNewDecWithPrec(1, 1), math.LegacyNewDecWithPrec(1, 1), math.LegacyNewDec(0)) stakingKeeper.EXPECT().ValidatorByConsAddr(gomock.Any(), sdk.GetConsAddress(valConsPk2)).Return(val2, nil).AnyTimes() diff --git a/x/distribution/keeper/genesis.go b/x/distribution/keeper/genesis.go index e018eeeb75b4..3c55c1fb9de1 100644 --- a/x/distribution/keeper/genesis.go +++ b/x/distribution/keeper/genesis.go @@ -52,7 +52,7 @@ func (k Keeper) InitGenesis(ctx sdk.Context, data types.GenesisState) { } for _, rew := range data.OutstandingRewards { - valAddr, err := sdk.ValAddressFromBech32(rew.ValidatorAddress) + valAddr, err := k.stakingKeeper.ValidatorAddressCodec().StringToBytes(rew.ValidatorAddress) if err != nil { panic(err) } @@ -63,7 +63,7 @@ func (k Keeper) InitGenesis(ctx sdk.Context, data types.GenesisState) { moduleHoldings = moduleHoldings.Add(rew.OutstandingRewards...) } for _, acc := range data.ValidatorAccumulatedCommissions { - valAddr, err := sdk.ValAddressFromBech32(acc.ValidatorAddress) + valAddr, err := k.stakingKeeper.ValidatorAddressCodec().StringToBytes(acc.ValidatorAddress) if err != nil { panic(err) } @@ -73,17 +73,17 @@ func (k Keeper) InitGenesis(ctx sdk.Context, data types.GenesisState) { } } for _, his := range data.ValidatorHistoricalRewards { - valAddr, err := sdk.ValAddressFromBech32(his.ValidatorAddress) + valAddr, err := k.stakingKeeper.ValidatorAddressCodec().StringToBytes(his.ValidatorAddress) if err != nil { panic(err) } - err = k.ValidatorHistoricalRewards.Set(ctx, collections.Join(valAddr, his.Period), his.Rewards) + err = k.ValidatorHistoricalRewards.Set(ctx, collections.Join(sdk.ValAddress(valAddr), his.Period), his.Rewards) if err != nil { panic(err) } } for _, cur := range data.ValidatorCurrentRewards { - valAddr, err := sdk.ValAddressFromBech32(cur.ValidatorAddress) + valAddr, err := k.stakingKeeper.ValidatorAddressCodec().StringToBytes(cur.ValidatorAddress) if err != nil { panic(err) } @@ -93,7 +93,7 @@ func (k Keeper) InitGenesis(ctx sdk.Context, data types.GenesisState) { } } for _, del := range data.DelegatorStartingInfos { - valAddr, err := sdk.ValAddressFromBech32(del.ValidatorAddress) + valAddr, err := k.stakingKeeper.ValidatorAddressCodec().StringToBytes(del.ValidatorAddress) if err != nil { panic(err) } @@ -102,13 +102,13 @@ func (k Keeper) InitGenesis(ctx sdk.Context, data types.GenesisState) { panic(err) } - err = k.DelegatorStartingInfo.Set(ctx, collections.Join(valAddr, sdk.AccAddress(delegatorAddress)), del.StartingInfo) + err = k.DelegatorStartingInfo.Set(ctx, collections.Join(sdk.ValAddress(valAddr), sdk.AccAddress(delegatorAddress)), del.StartingInfo) if err != nil { panic(err) } } for _, evt := range data.ValidatorSlashEvents { - valAddr, err := sdk.ValAddressFromBech32(evt.ValidatorAddress) + valAddr, err := k.stakingKeeper.ValidatorAddressCodec().StringToBytes(evt.ValidatorAddress) if err != nil { panic(err) } diff --git a/x/distribution/keeper/grpc_query.go b/x/distribution/keeper/grpc_query.go index 27578913f8d5..371713e7fc75 100644 --- a/x/distribution/keeper/grpc_query.go +++ b/x/distribution/keeper/grpc_query.go @@ -47,7 +47,7 @@ func (k Querier) ValidatorDistributionInfo(ctx context.Context, req *types.Query return nil, status.Error(codes.InvalidArgument, "empty validator address") } - valAdr, err := sdk.ValAddressFromBech32(req.ValidatorAddress) + valAdr, err := k.stakingKeeper.ValidatorAddressCodec().StringToBytes(req.ValidatorAddress) if err != nil { return nil, err } @@ -106,7 +106,7 @@ func (k Querier) ValidatorOutstandingRewards(ctx context.Context, req *types.Que return nil, status.Error(codes.InvalidArgument, "empty validator address") } - valAdr, err := sdk.ValAddressFromBech32(req.ValidatorAddress) + valAdr, err := k.stakingKeeper.ValidatorAddressCodec().StringToBytes(req.ValidatorAddress) if err != nil { return nil, err } @@ -117,7 +117,7 @@ func (k Querier) ValidatorOutstandingRewards(ctx context.Context, req *types.Que } if validator == nil { - return nil, errors.Wrapf(types.ErrNoValidatorExists, valAdr.String()) + return nil, errors.Wrapf(types.ErrNoValidatorExists, req.ValidatorAddress) } rewards, err := k.Keeper.ValidatorOutstandingRewards.Get(ctx, valAdr) @@ -138,7 +138,7 @@ func (k Querier) ValidatorCommission(ctx context.Context, req *types.QueryValida return nil, status.Error(codes.InvalidArgument, "empty validator address") } - valAdr, err := sdk.ValAddressFromBech32(req.ValidatorAddress) + valAdr, err := k.stakingKeeper.ValidatorAddressCodec().StringToBytes(req.ValidatorAddress) if err != nil { return nil, err } @@ -149,7 +149,7 @@ func (k Querier) ValidatorCommission(ctx context.Context, req *types.QueryValida } if validator == nil { - return nil, errors.Wrapf(types.ErrNoValidatorExists, valAdr.String()) + return nil, errors.Wrapf(types.ErrNoValidatorExists, req.ValidatorAddress) } commission, err := k.ValidatorsAccumulatedCommission.Get(ctx, valAdr) if err != nil && !errors.IsOf(err, collections.ErrNotFound) { @@ -173,7 +173,7 @@ func (k Querier) ValidatorSlashes(ctx context.Context, req *types.QueryValidator return nil, status.Errorf(codes.InvalidArgument, "starting height greater than ending height (%d > %d)", req.StartingHeight, req.EndingHeight) } - valAddr, err := sdk.ValAddressFromBech32(req.ValidatorAddress) + valAddr, err := k.stakingKeeper.ValidatorAddressCodec().StringToBytes(req.ValidatorAddress) if err != nil { return nil, status.Errorf(codes.InvalidArgument, "invalid validator address") } @@ -216,7 +216,7 @@ func (k Querier) DelegationRewards(ctx context.Context, req *types.QueryDelegati return nil, status.Error(codes.InvalidArgument, "empty validator address") } - valAdr, err := sdk.ValAddressFromBech32(req.ValidatorAddress) + valAdr, err := k.stakingKeeper.ValidatorAddressCodec().StringToBytes(req.ValidatorAddress) if err != nil { return nil, err } diff --git a/x/distribution/keeper/msg_server.go b/x/distribution/keeper/msg_server.go index 584019f0eb0f..ada03eaf02c2 100644 --- a/x/distribution/keeper/msg_server.go +++ b/x/distribution/keeper/msg_server.go @@ -45,7 +45,7 @@ func (k msgServer) SetWithdrawAddress(ctx context.Context, msg *types.MsgSetWith } func (k msgServer) WithdrawDelegatorReward(ctx context.Context, msg *types.MsgWithdrawDelegatorReward) (*types.MsgWithdrawDelegatorRewardResponse, error) { - valAddr, err := sdk.ValAddressFromBech32(msg.ValidatorAddress) + valAddr, err := k.stakingKeeper.ValidatorAddressCodec().StringToBytes(msg.ValidatorAddress) if err != nil { return nil, sdkerrors.ErrInvalidAddress.Wrapf("invalid validator address: %s", err) } @@ -76,7 +76,7 @@ func (k msgServer) WithdrawDelegatorReward(ctx context.Context, msg *types.MsgWi } func (k msgServer) WithdrawValidatorCommission(ctx context.Context, msg *types.MsgWithdrawValidatorCommission) (*types.MsgWithdrawValidatorCommissionResponse, error) { - valAddr, err := sdk.ValAddressFromBech32(msg.ValidatorAddress) + valAddr, err := k.stakingKeeper.ValidatorAddressCodec().StringToBytes(msg.ValidatorAddress) if err != nil { return nil, sdkerrors.ErrInvalidAddress.Wrapf("invalid validator address: %s", err) } @@ -178,7 +178,7 @@ func (k msgServer) DepositValidatorRewardsPool(ctx context.Context, msg *types.M return nil, err } - valAddr, err := sdk.ValAddressFromBech32(msg.ValidatorAddress) + valAddr, err := k.stakingKeeper.ValidatorAddressCodec().StringToBytes(msg.ValidatorAddress) if err != nil { return nil, err } @@ -189,7 +189,7 @@ func (k msgServer) DepositValidatorRewardsPool(ctx context.Context, msg *types.M } if validator == nil { - return nil, errors.Wrapf(types.ErrNoValidatorExists, valAddr.String()) + return nil, errors.Wrapf(types.ErrNoValidatorExists, msg.ValidatorAddress) } // Allocate tokens from the distribution module to the validator, which are diff --git a/x/distribution/module.go b/x/distribution/module.go index 30cc0b799d2a..3cf9dfdfc415 100644 --- a/x/distribution/module.go +++ b/x/distribution/module.go @@ -79,7 +79,7 @@ func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx sdkclient.Context, mux // GetTxCmd returns the root tx command for the distribution module. func (ab AppModuleBasic) GetTxCmd() *cobra.Command { - return cli.NewTxCmd(ab.ac) + return cli.NewTxCmd(ab.cdc.InterfaceRegistry().SigningContext().ValidatorAddressCodec(), ab.cdc.InterfaceRegistry().SigningContext().AddressCodec()) } // RegisterInterfaces implements InterfaceModule diff --git a/x/distribution/simulation/operations.go b/x/distribution/simulation/operations.go index 3480b97628a2..beb9ae868888 100644 --- a/x/distribution/simulation/operations.go +++ b/x/distribution/simulation/operations.go @@ -153,7 +153,7 @@ func SimulateMsgWithdrawDelegatorReward(txConfig client.TxConfig, ak types.Accou account := ak.GetAccount(ctx, simAccount.Address) spendable := bk.SpendableCoins(ctx, account.GetAddress()) - msg := types.NewMsgWithdrawDelegatorReward(simAccount.Address, validator.GetOperator()) + msg := types.NewMsgWithdrawDelegatorReward(simAccount.Address.String(), validator.GetOperator().String()) txCtx := simulation.OperationInput{ R: r, @@ -207,7 +207,7 @@ func SimulateMsgWithdrawValidatorCommission(txConfig client.TxConfig, ak types.A account := ak.GetAccount(ctx, simAccount.Address) spendable := bk.SpendableCoins(ctx, account.GetAddress()) - msg := types.NewMsgWithdrawValidatorCommission(validator.GetOperator()) + msg := types.NewMsgWithdrawValidatorCommission(validator.GetOperator().String()) txCtx := simulation.OperationInput{ R: r, @@ -256,7 +256,7 @@ func SimulateMsgFundCommunityPool(txConfig client.TxConfig, ak types.AccountKeep } } - msg := types.NewMsgFundCommunityPool(fundAmount, funder.Address) + msg := types.NewMsgFundCommunityPool(fundAmount, funder.Address.String()) txCtx := simulation.OperationInput{ R: r, diff --git a/x/distribution/simulation/operations_test.go b/x/distribution/simulation/operations_test.go index 830c07460ee3..bbbb368f097a 100644 --- a/x/distribution/simulation/operations_test.go +++ b/x/distribution/simulation/operations_test.go @@ -298,7 +298,7 @@ func (suite *SimTestSuite) getTestingValidator(accounts []simtypes.Account, comm account := accounts[n] valPubKey := account.PubKey valAddr := sdk.ValAddress(account.PubKey.Address().Bytes()) - validator, err := stakingtypes.NewValidator(valAddr, valPubKey, stakingtypes. + validator, err := stakingtypes.NewValidator(valAddr.String(), valPubKey, stakingtypes. Description{}) require.NoError(err) validator, err = validator.SetInitialCommission(commission) diff --git a/x/distribution/testutil/staking_helper.go b/x/distribution/testutil/staking_helper.go index d3919af944f9..309a9e11a773 100644 --- a/x/distribution/testutil/staking_helper.go +++ b/x/distribution/testutil/staking_helper.go @@ -13,7 +13,7 @@ import ( func CreateValidator(pk cryptotypes.PubKey, stake math.Int) (stakingtypes.Validator, error) { valConsAddr := sdk.GetConsAddress(pk) - val, err := stakingtypes.NewValidator(sdk.ValAddress(valConsAddr), pk, stakingtypes.Description{Moniker: "TestValidator"}) + val, err := stakingtypes.NewValidator(sdk.ValAddress(valConsAddr).String(), pk, stakingtypes.Description{Moniker: "TestValidator"}) val.Tokens = stake val.DelegatorShares = math.LegacyNewDecFromInt(val.Tokens) return val, err diff --git a/x/distribution/types/msg.go b/x/distribution/types/msg.go index 44202deaef4a..231e86bd34d4 100644 --- a/x/distribution/types/msg.go +++ b/x/distribution/types/msg.go @@ -21,34 +21,34 @@ func NewMsgSetWithdrawAddress(delAddr, withdrawAddr sdk.AccAddress) *MsgSetWithd } } -func NewMsgWithdrawDelegatorReward(delAddr sdk.AccAddress, valAddr sdk.ValAddress) *MsgWithdrawDelegatorReward { +func NewMsgWithdrawDelegatorReward(delAddr, valAddr string) *MsgWithdrawDelegatorReward { return &MsgWithdrawDelegatorReward{ - DelegatorAddress: delAddr.String(), - ValidatorAddress: valAddr.String(), + DelegatorAddress: delAddr, + ValidatorAddress: valAddr, } } -func NewMsgWithdrawValidatorCommission(valAddr sdk.ValAddress) *MsgWithdrawValidatorCommission { +func NewMsgWithdrawValidatorCommission(valAddr string) *MsgWithdrawValidatorCommission { return &MsgWithdrawValidatorCommission{ - ValidatorAddress: valAddr.String(), + ValidatorAddress: valAddr, } } // NewMsgFundCommunityPool returns a new MsgFundCommunityPool with a sender and // a funding amount. -func NewMsgFundCommunityPool(amount sdk.Coins, depositor sdk.AccAddress) *MsgFundCommunityPool { +func NewMsgFundCommunityPool(amount sdk.Coins, depositor string) *MsgFundCommunityPool { return &MsgFundCommunityPool{ Amount: amount, - Depositor: depositor.String(), + Depositor: depositor, } } // NewMsgDepositValidatorRewardsPool returns a new MsgDepositValidatorRewardsPool // with a depositor and a funding amount. -func NewMsgDepositValidatorRewardsPool(depositor sdk.AccAddress, valAddr sdk.ValAddress, amount sdk.Coins) *MsgDepositValidatorRewardsPool { +func NewMsgDepositValidatorRewardsPool(depositor, valAddr string, amount sdk.Coins) *MsgDepositValidatorRewardsPool { return &MsgDepositValidatorRewardsPool{ Amount: amount, - Depositor: depositor.String(), - ValidatorAddress: valAddr.String(), + Depositor: depositor, + ValidatorAddress: valAddr, } } diff --git a/x/genutil/client/cli/collect.go b/x/genutil/client/cli/collect.go index a3821e458e96..5502445960d7 100644 --- a/x/genutil/client/cli/collect.go +++ b/x/genutil/client/cli/collect.go @@ -10,6 +10,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/runtime" "github.com/cosmos/cosmos-sdk/server" "github.com/cosmos/cosmos-sdk/x/genutil" "github.com/cosmos/cosmos-sdk/x/genutil/types" @@ -18,7 +19,7 @@ import ( const flagGenTxDir = "gentx-dir" // CollectGenTxsCmd - return the cobra command to collect genesis transactions -func CollectGenTxsCmd(genBalIterator types.GenesisBalancesIterator, defaultNodeHome string, validator types.MessageValidator) *cobra.Command { +func CollectGenTxsCmd(genBalIterator types.GenesisBalancesIterator, defaultNodeHome string, validator types.MessageValidator, valAddrCodec runtime.ValidatorAddressCodec) *cobra.Command { cmd := &cobra.Command{ Use: "collect-gentxs", Short: "Collect genesis txs and output a genesis.json file", @@ -50,7 +51,7 @@ func CollectGenTxsCmd(genBalIterator types.GenesisBalancesIterator, defaultNodeH toPrint := newPrintInfo(config.Moniker, appGenesis.ChainID, nodeID, genTxsDir, json.RawMessage("")) initCfg := types.NewInitConfig(appGenesis.ChainID, genTxsDir, nodeID, valPubKey) - appMessage, err := genutil.GenAppStateFromConfig(cdc, clientCtx.TxConfig, config, initCfg, appGenesis, genBalIterator, validator) + appMessage, err := genutil.GenAppStateFromConfig(cdc, clientCtx.TxConfig, config, initCfg, appGenesis, genBalIterator, validator, valAddrCodec) if err != nil { return errors.Wrap(err, "failed to get genesis app state from config") } diff --git a/x/genutil/client/cli/commands.go b/x/genutil/client/cli/commands.go index d150bb4bcca2..0db6b39bfba3 100644 --- a/x/genutil/client/cli/commands.go +++ b/x/genutil/client/cli/commands.go @@ -34,11 +34,11 @@ func CommandsWithCustomMigrationMap(txConfig client.TxConfig, moduleBasics modul gentxModule := moduleBasics[genutiltypes.ModuleName].(genutil.AppModuleBasic) cmd.AddCommand( - GenTxCmd(moduleBasics, txConfig, banktypes.GenesisBalancesIterator{}, defaultNodeHome), + GenTxCmd(moduleBasics, txConfig, banktypes.GenesisBalancesIterator{}, defaultNodeHome, txConfig.SigningContext().ValidatorAddressCodec()), MigrateGenesisCmd(migrationMap), - CollectGenTxsCmd(banktypes.GenesisBalancesIterator{}, defaultNodeHome, gentxModule.GenTxValidator), + CollectGenTxsCmd(banktypes.GenesisBalancesIterator{}, defaultNodeHome, gentxModule.GenTxValidator, txConfig.SigningContext().ValidatorAddressCodec()), ValidateGenesisCmd(moduleBasics), - AddGenesisAccountCmd(defaultNodeHome), + AddGenesisAccountCmd(defaultNodeHome, txConfig.SigningContext().AddressCodec()), ) return cmd diff --git a/x/genutil/client/cli/genaccount.go b/x/genutil/client/cli/genaccount.go index 0bedc26a1ba6..100048751be7 100644 --- a/x/genutil/client/cli/genaccount.go +++ b/x/genutil/client/cli/genaccount.go @@ -6,6 +6,8 @@ import ( "github.com/spf13/cobra" + address "cosmossdk.io/core/address" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/crypto/keyring" @@ -24,7 +26,7 @@ const ( // AddGenesisAccountCmd returns add-genesis-account cobra Command. // This command is provided as a default, applications are expected to provide their own command if custom genesis accounts are needed. -func AddGenesisAccountCmd(defaultNodeHome string) *cobra.Command { +func AddGenesisAccountCmd(defaultNodeHome string, addressCodec address.Codec) *cobra.Command { cmd := &cobra.Command{ Use: "add-genesis-account [address_or_key_name] [coin][,[coin]]", Short: "Add a genesis account to genesis.json", @@ -42,7 +44,7 @@ contain valid denominations. Accounts may optionally be supplied with vesting pa config.SetRoot(clientCtx.HomeDir) var kr keyring.Keyring - addr, err := sdk.AccAddressFromBech32(args[0]) + addr, err := addressCodec.StringToBytes(args[0]) if err != nil { inBuf := bufio.NewReader(cmd.InOrStdin()) keyringBackend, _ := cmd.Flags().GetString(flags.FlagKeyringBackend) diff --git a/x/genutil/client/cli/genaccount_test.go b/x/genutil/client/cli/genaccount_test.go index 5de4922ae386..573d9a41bbf8 100644 --- a/x/genutil/client/cli/genaccount_test.go +++ b/x/genutil/client/cli/genaccount_test.go @@ -12,6 +12,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" + addresscodec "github.com/cosmos/cosmos-sdk/codec/address" "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" "github.com/cosmos/cosmos-sdk/server" @@ -90,7 +91,7 @@ func TestAddGenesisAccountCmd(t *testing.T) { ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx) ctx = context.WithValue(ctx, server.ServerContextKey, serverCtx) - cmd := genutilcli.AddGenesisAccountCmd(home) + cmd := genutilcli.AddGenesisAccountCmd(home, addresscodec.NewBech32Codec("cosmos")) cmd.SetArgs([]string{ tc.addr, tc.denom, diff --git a/x/genutil/client/cli/gentx.go b/x/genutil/client/cli/gentx.go index dfbcbab2a9f4..ce1b91e08e58 100644 --- a/x/genutil/client/cli/gentx.go +++ b/x/genutil/client/cli/gentx.go @@ -11,6 +11,7 @@ import ( "github.com/spf13/cobra" + address "cosmossdk.io/core/address" "cosmossdk.io/errors" "github.com/cosmos/cosmos-sdk/client" @@ -28,7 +29,7 @@ import ( ) // GenTxCmd builds the application's gentx command. -func GenTxCmd(mbm module.BasicManager, txEncCfg client.TxEncodingConfig, genBalIterator types.GenesisBalancesIterator, defaultNodeHome string) *cobra.Command { +func GenTxCmd(mbm module.BasicManager, txEncCfg client.TxEncodingConfig, genBalIterator types.GenesisBalancesIterator, defaultNodeHome string, valAdddressCodec address.Codec) *cobra.Command { ipDefault, _ := server.ExternalIP() fsCreateValidator, defaultsDesc := cli.CreateValidatorMsgFlagSet(ipDefault) @@ -37,7 +38,7 @@ func GenTxCmd(mbm module.BasicManager, txEncCfg client.TxEncodingConfig, genBalI Short: "Generate a genesis tx carrying a self delegation", Args: cobra.ExactArgs(2), Long: fmt.Sprintf(`Generate a genesis transaction that creates a validator with a self-delegation, -that is signed by the key in the Keyring referenced by a given name. A node ID and Bech32 consensus +that is signed by the key in the Keyring referenced by a given name. A node ID and consensus pubkey may optionally be provided. If they are omitted, they will be retrieved from the priv_validator.json file. The following default parameters are included: %s @@ -153,7 +154,7 @@ $ %s gentx my-key-name 1000000stake --home=/path/to/home/dir --keyring-backend=o createValCfg.Amount = amount // create a 'create-validator' message - txBldr, msg, err := cli.BuildCreateValidatorMsg(clientCtx, createValCfg, txFactory, true) + txBldr, msg, err := cli.BuildCreateValidatorMsg(clientCtx, createValCfg, txFactory, true, valAdddressCodec) if err != nil { return errors.Wrap(err, "failed to build create-validator message") } diff --git a/x/genutil/client/cli/gentx_test.go b/x/genutil/client/cli/gentx_test.go index b62ad9d380aa..1f7ffeabce5a 100644 --- a/x/genutil/client/cli/gentx_test.go +++ b/x/genutil/client/cli/gentx_test.go @@ -15,6 +15,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/codec/address" "github.com/cosmos/cosmos-sdk/crypto/keyring" svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" @@ -127,6 +128,7 @@ func (s *CLITestSuite) TestGenTxCmd() { clientCtx.TxConfig, banktypes.GenesisBalancesIterator{}, clientCtx.HomeDir, + address.NewBech32Codec("cosmosvaloper"), ) cmd.SetContext(ctx) cmd.SetArgs(tc.args) diff --git a/x/genutil/collect.go b/x/genutil/collect.go index d7fbf38dcdbb..422a278b5af3 100644 --- a/x/genutil/collect.go +++ b/x/genutil/collect.go @@ -14,6 +14,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" + sdkruntime "github.com/cosmos/cosmos-sdk/runtime" sdk "github.com/cosmos/cosmos-sdk/types" bankexported "github.com/cosmos/cosmos-sdk/x/bank/exported" "github.com/cosmos/cosmos-sdk/x/genutil/types" @@ -23,11 +24,11 @@ import ( // GenAppStateFromConfig gets the genesis app state from the config func GenAppStateFromConfig(cdc codec.JSONCodec, txEncodingConfig client.TxEncodingConfig, config *cfg.Config, initCfg types.InitConfig, genesis *types.AppGenesis, genBalIterator types.GenesisBalancesIterator, - validator types.MessageValidator, + validator types.MessageValidator, valAddrCodec sdkruntime.ValidatorAddressCodec, ) (appState json.RawMessage, err error) { // process genesis transactions, else create default genesis.json appGenTxs, persistentPeers, err := CollectTxs( - cdc, txEncodingConfig.TxJSONDecoder(), config.Moniker, initCfg.GenTxsDir, genesis, genBalIterator, validator) + cdc, txEncodingConfig.TxJSONDecoder(), config.Moniker, initCfg.GenTxsDir, genesis, genBalIterator, validator, valAddrCodec) if err != nil { return appState, err } @@ -66,7 +67,7 @@ func GenAppStateFromConfig(cdc codec.JSONCodec, txEncodingConfig client.TxEncodi // the list of appGenTxs, and persistent peers required to generate genesis.json. func CollectTxs(cdc codec.JSONCodec, txJSONDecoder sdk.TxDecoder, moniker, genTxsDir string, genesis *types.AppGenesis, genBalIterator types.GenesisBalancesIterator, - validator types.MessageValidator, + validator types.MessageValidator, valAddrCodec sdkruntime.ValidatorAddressCodec, ) (appGenTxs []sdk.Tx, persistentPeers string, err error) { // prepare a map of all balances in genesis state to then validate // against the validators addresses @@ -133,7 +134,7 @@ func CollectTxs(cdc codec.JSONCodec, txJSONDecoder sdk.TxDecoder, moniker, genTx msg := msgs[0].(*stakingtypes.MsgCreateValidator) // validate validator addresses and funds against the accounts in the state - valAddr, err := sdk.ValAddressFromBech32(msg.ValidatorAddress) + valAddr, err := valAddrCodec.StringToBytes(msg.ValidatorAddress) if err != nil { return appGenTxs, persistentPeers, err } diff --git a/x/genutil/collect_test.go b/x/genutil/collect_test.go index 3f0a32a07915..fa18cd6f5882 100644 --- a/x/genutil/collect_test.go +++ b/x/genutil/collect_test.go @@ -9,6 +9,7 @@ import ( "github.com/cosmos/gogoproto/proto" "github.com/cosmos/cosmos-sdk/codec" + addresscodec "github.com/cosmos/cosmos-sdk/codec/address" cdctypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/server" sdk "github.com/cosmos/cosmos-sdk/types" @@ -59,7 +60,8 @@ func TestCollectTxsHandlesDirectories(t *testing.T) { balItr := new(doNothingIterator) dnc := &doNothingUnmarshalJSON{cdc} - if _, _, err := genutil.CollectTxs(dnc, txDecoder, "foo", testDir, genesis, balItr, types.DefaultMessageValidator); err != nil { + if _, _, err := genutil.CollectTxs(dnc, txDecoder, "foo", testDir, genesis, balItr, types.DefaultMessageValidator, + addresscodec.NewBech32Codec("cosmosvaloper")); err != nil { t.Fatal(err) } } diff --git a/x/genutil/gentx_test.go b/x/genutil/gentx_test.go index 3d7aa4d78f99..70c742aa6b9d 100644 --- a/x/genutil/gentx_test.go +++ b/x/genutil/gentx_test.go @@ -65,10 +65,10 @@ func (suite *GenTxTestSuite) SetupTest() { amount := sdk.NewInt64Coin(sdk.DefaultBondDenom, 50) one := math.OneInt() suite.msg1, err = stakingtypes.NewMsgCreateValidator( - sdk.ValAddress(pk1.Address()), pk1, amount, desc, comm, one) + sdk.ValAddress(pk1.Address()).String(), pk1, amount, desc, comm, one) suite.NoError(err) suite.msg2, err = stakingtypes.NewMsgCreateValidator( - sdk.ValAddress(pk2.Address()), pk1, amount, desc, comm, one) + sdk.ValAddress(pk2.Address()).String(), pk1, amount, desc, comm, one) suite.NoError(err) } diff --git a/x/genutil/types/genesis_state_test.go b/x/genutil/types/genesis_state_test.go index 66de2b3e5042..90660a44105e 100644 --- a/x/genutil/types/genesis_state_test.go +++ b/x/genutil/types/genesis_state_test.go @@ -41,10 +41,10 @@ func TestValidateGenesisMultipleMessages(t *testing.T) { desc := stakingtypes.NewDescription("testname", "", "", "", "") comm := stakingtypes.CommissionRates{} - msg1, err := stakingtypes.NewMsgCreateValidator(sdk.ValAddress(pk1.Address()), pk1, sdk.NewInt64Coin(sdk.DefaultBondDenom, 50), desc, comm, math.OneInt()) + msg1, err := stakingtypes.NewMsgCreateValidator(sdk.ValAddress(pk1.Address()).String(), pk1, sdk.NewInt64Coin(sdk.DefaultBondDenom, 50), desc, comm, math.OneInt()) require.NoError(t, err) - msg2, err := stakingtypes.NewMsgCreateValidator(sdk.ValAddress(pk2.Address()), pk2, + msg2, err := stakingtypes.NewMsgCreateValidator(sdk.ValAddress(pk2.Address()).String(), pk2, sdk.NewInt64Coin(sdk.DefaultBondDenom, 50), desc, comm, math.OneInt()) require.NoError(t, err) @@ -62,7 +62,7 @@ func TestValidateGenesisMultipleMessages(t *testing.T) { func TestValidateGenesisBadMessage(t *testing.T) { desc := stakingtypes.NewDescription("testname", "", "", "", "") - msg1 := stakingtypes.NewMsgEditValidator(sdk.ValAddress(pk1.Address()), desc, nil, nil) + msg1 := stakingtypes.NewMsgEditValidator(sdk.ValAddress(pk1.Address()).String(), desc, nil, nil) txConfig := moduletestutil.MakeTestEncodingConfig(staking.AppModuleBasic{}, genutil.AppModuleBasic{}).TxConfig txBuilder := txConfig.NewTxBuilder() diff --git a/x/gov/abci_test.go b/x/gov/abci_test.go index 43e537608b99..411e6cd7f88e 100644 --- a/x/gov/abci_test.go +++ b/x/gov/abci_test.go @@ -611,7 +611,7 @@ func createValidators(t *testing.T, stakingMsgSvr stakingtypes.MsgServer, ctx sd for i := 0; i < len(addrs); i++ { valTokens := sdk.TokensFromConsensusPower(powerAmt[i], sdk.DefaultPowerReduction) valCreateMsg, err := stakingtypes.NewMsgCreateValidator( - addrs[i], pubkeys[i], sdk.NewCoin(sdk.DefaultBondDenom, valTokens), + addrs[i].String(), pubkeys[i], sdk.NewCoin(sdk.DefaultBondDenom, valTokens), TestDescription, TestCommissionRates, math.OneInt(), ) require.NoError(t, err) diff --git a/x/gov/keeper/hooks_test.go b/x/gov/keeper/hooks_test.go index 8d0f0d9e3b47..2123f4812435 100644 --- a/x/gov/keeper/hooks_test.go +++ b/x/gov/keeper/hooks_test.go @@ -54,6 +54,7 @@ func TestHooks(t *testing.T) { addrs := simtestutil.AddTestAddrs(bankKeeper, stakingKeeper, ctx, 1, minDeposit[0].Amount) authKeeper.EXPECT().AddressCodec().Return(address.NewBech32Codec("cosmos")).AnyTimes() + stakingKeeper.EXPECT().ValidatorAddressCodec().Return(address.NewBech32Codec("cosmosvaloper")).AnyTimes() govHooksReceiver := MockGovHooksReceiver{} diff --git a/x/gov/keeper/tally.go b/x/gov/keeper/tally.go index 63248ef3a1d5..2486c056b41b 100644 --- a/x/gov/keeper/tally.go +++ b/x/gov/keeper/tally.go @@ -28,7 +28,11 @@ func (keeper Keeper) Tally(ctx context.Context, proposal v1.Proposal) (passes, b // fetch all the bonded validators, insert them into currValidators err = keeper.sk.IterateBondedValidatorsByPower(ctx, func(index int64, validator stakingtypes.ValidatorI) (stop bool) { - currValidators[validator.GetOperator().String()] = v1.NewValidatorGovInfo( + valStr, err := keeper.sk.ValidatorAddressCodec().BytesToString(validator.GetOperator()) + if err != nil { + return false + } + currValidators[valStr] = v1.NewValidatorGovInfo( validator.GetOperator(), validator.GetBondedTokens(), validator.GetDelegatorShares(), @@ -50,7 +54,10 @@ func (keeper Keeper) Tally(ctx context.Context, proposal v1.Proposal) (passes, b return false, err } - valAddrStr := sdk.ValAddress(voter).String() + valAddrStr, err := keeper.sk.ValidatorAddressCodec().BytesToString(voter) + if err != nil { + return false, err + } if val, ok := currValidators[valAddrStr]; ok { val.Vote = vote.Options currValidators[valAddrStr] = val diff --git a/x/gov/keeper/tally_test.go b/x/gov/keeper/tally_test.go index eb4a196690de..6708b84d65bf 100644 --- a/x/gov/keeper/tally_test.go +++ b/x/gov/keeper/tally_test.go @@ -10,6 +10,7 @@ import ( sdkmath "cosmossdk.io/math" + "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" @@ -31,6 +32,7 @@ func TestTally(t *testing.T) { var ( // handy functions setTotalBonded = func(s suite, n int64) { + s.mocks.stakingKeeper.EXPECT().ValidatorAddressCodec().Return(address.NewBech32Codec("cosmosvaloper")).AnyTimes() s.mocks.stakingKeeper.EXPECT().TotalBondedTokens(gomock.Any()). Return(sdkmath.NewInt(n), nil) } diff --git a/x/gov/testutil/expected_keepers_mocks.go b/x/gov/testutil/expected_keepers_mocks.go index cf036c1a98c6..6f0d5ef04bb5 100644 --- a/x/gov/testutil/expected_keepers_mocks.go +++ b/x/gov/testutil/expected_keepers_mocks.go @@ -1056,6 +1056,20 @@ func (mr *MockStakingKeeperMockRecorder) TotalBondedTokens(arg0 interface{}) *go return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TotalBondedTokens", reflect.TypeOf((*MockStakingKeeper)(nil).TotalBondedTokens), arg0) } +// ValidatorAddressCodec mocks base method. +func (m *MockStakingKeeper) ValidatorAddressCodec() address.Codec { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ValidatorAddressCodec") + ret0, _ := ret[0].(address.Codec) + return ret0 +} + +// ValidatorAddressCodec indicates an expected call of ValidatorAddressCodec. +func (mr *MockStakingKeeperMockRecorder) ValidatorAddressCodec() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ValidatorAddressCodec", reflect.TypeOf((*MockStakingKeeper)(nil).ValidatorAddressCodec)) +} + // MockDistributionKeeper is a mock of DistributionKeeper interface. type MockDistributionKeeper struct { ctrl *gomock.Controller diff --git a/x/gov/types/expected_keepers.go b/x/gov/types/expected_keepers.go index 4a1917c437e7..199aac1cdeba 100644 --- a/x/gov/types/expected_keepers.go +++ b/x/gov/types/expected_keepers.go @@ -18,6 +18,7 @@ type ParamSubspace interface { // StakingKeeper expected staking keeper (Validator and Delegator sets) (noalias) type StakingKeeper interface { + ValidatorAddressCodec() addresscodec.Codec // iterate through bonded validators by operator address, execute func for each validator IterateBondedValidatorsByPower( context.Context, func(index int64, validator stakingtypes.ValidatorI) (stop bool), diff --git a/x/slashing/app_test.go b/x/slashing/app_test.go index 0ad0ac89550a..1e1b36e0602e 100644 --- a/x/slashing/app_test.go +++ b/x/slashing/app_test.go @@ -81,7 +81,7 @@ func TestSlashingMsgs(t *testing.T) { commission := stakingtypes.NewCommissionRates(math.LegacyZeroDec(), math.LegacyZeroDec(), math.LegacyZeroDec()) createValidatorMsg, err := stakingtypes.NewMsgCreateValidator( - sdk.ValAddress(addr1), valKey.PubKey(), bondCoin, description, commission, math.OneInt(), + sdk.ValAddress(addr1).String(), valKey.PubKey(), bondCoin, description, commission, math.OneInt(), ) require.NoError(t, err) diff --git a/x/slashing/client/cli/tx.go b/x/slashing/client/cli/tx.go index bcb7836e6d7d..8e6ab0ead6d5 100644 --- a/x/slashing/client/cli/tx.go +++ b/x/slashing/client/cli/tx.go @@ -3,15 +3,16 @@ package cli import ( "github.com/spf13/cobra" + "cosmossdk.io/core/address" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/client/tx" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/slashing/types" ) // NewTxCmd returns a root CLI command handler for all x/slashing transaction commands. -func NewTxCmd() *cobra.Command { +func NewTxCmd(ac address.Codec) *cobra.Command { slashingTxCmd := &cobra.Command{ Use: types.ModuleName, Short: "Slashing transaction subcommands", @@ -20,12 +21,12 @@ func NewTxCmd() *cobra.Command { RunE: client.ValidateCmd, } - slashingTxCmd.AddCommand(NewUnjailTxCmd()) + slashingTxCmd.AddCommand(NewUnjailTxCmd(ac)) return slashingTxCmd } // NewUnjailTxCmd returns a CLI command handler for creating a MsgUnjail transaction. -func NewUnjailTxCmd() *cobra.Command { +func NewUnjailTxCmd(valAc address.Codec) *cobra.Command { cmd := &cobra.Command{ Use: "unjail", Args: cobra.NoArgs, @@ -39,9 +40,13 @@ $ tx slashing unjail --from mykey if err != nil { return err } - valAddr := clientCtx.GetFromAddress() - msg := types.NewMsgUnjail(sdk.ValAddress(valAddr)) + valAddr, err := valAc.BytesToString(clientCtx.GetFromAddress()) + if err != nil { + return err + } + + msg := types.NewMsgUnjail(valAddr) return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) }, diff --git a/x/slashing/client/cli/tx_test.go b/x/slashing/client/cli/tx_test.go index 02703b42c927..5b278e84e127 100644 --- a/x/slashing/client/cli/tx_test.go +++ b/x/slashing/client/cli/tx_test.go @@ -13,6 +13,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/codec/address" "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" "github.com/cosmos/cosmos-sdk/crypto/types" @@ -96,7 +97,7 @@ func (s *CLITestSuite) TestNewUnjailTxCmd() { tc := tc s.Run(tc.name, func() { - cmd := cli.NewUnjailTxCmd() + cmd := cli.NewUnjailTxCmd(address.NewBech32Codec("cosmosvaloper")) clientCtx := s.clientCtx out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) diff --git a/x/slashing/keeper/hooks_test.go b/x/slashing/keeper/hooks_test.go index 0456bcb9c170..1ccdddcb2c06 100644 --- a/x/slashing/keeper/hooks_test.go +++ b/x/slashing/keeper/hooks_test.go @@ -24,7 +24,7 @@ func (s *KeeperTestSuite) TestAfterValidatorCreatedOrRemoved() { _, pubKey, addr := testdata.KeyTestPubAddr() valAddr := sdk.ValAddress(addr) - validator, err := stakingtypes.NewValidator(sdk.ValAddress(addr), pubKey, stakingtypes.Description{}) + validator, err := stakingtypes.NewValidator(sdk.ValAddress(addr).String(), pubKey, stakingtypes.Description{}) require.NoError(err) s.stakingKeeper.EXPECT().Validator(ctx, valAddr).Return(validator, nil) diff --git a/x/slashing/keeper/keeper_test.go b/x/slashing/keeper/keeper_test.go index ac8a6d441d86..65e6eaaa2ed6 100644 --- a/x/slashing/keeper/keeper_test.go +++ b/x/slashing/keeper/keeper_test.go @@ -12,6 +12,7 @@ import ( storetypes "cosmossdk.io/store/types" "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/codec/address" "github.com/cosmos/cosmos-sdk/runtime" sdktestutil "github.com/cosmos/cosmos-sdk/testutil" "github.com/cosmos/cosmos-sdk/testutil/testdata" @@ -47,6 +48,7 @@ func (s *KeeperTestSuite) SetupTest() { // gomock initializations ctrl := gomock.NewController(s.T()) s.stakingKeeper = slashingtestutil.NewMockStakingKeeper(ctrl) + s.stakingKeeper.EXPECT().ValidatorAddressCodec().Return(address.NewBech32Codec("cosmosvaloper")).AnyTimes() s.ctx = ctx s.slashingKeeper = slashingkeeper.NewKeeper( diff --git a/x/slashing/keeper/msg_server.go b/x/slashing/keeper/msg_server.go index 5b22436d5128..d2cc181e73c7 100644 --- a/x/slashing/keeper/msg_server.go +++ b/x/slashing/keeper/msg_server.go @@ -46,7 +46,7 @@ func (k msgServer) UpdateParams(goCtx context.Context, msg *types.MsgUpdateParam // Validators must submit a transaction to unjail itself after // having been jailed (and thus unbonded) for downtime func (k msgServer) Unjail(goCtx context.Context, msg *types.MsgUnjail) (*types.MsgUnjailResponse, error) { - valAddr, err := sdk.ValAddressFromBech32(msg.ValidatorAddr) + valAddr, err := k.sk.ValidatorAddressCodec().StringToBytes(msg.ValidatorAddr) if err != nil { return nil, sdkerrors.ErrInvalidAddress.Wrapf("validator input address: %s", err) } diff --git a/x/slashing/keeper/msg_server_test.go b/x/slashing/keeper/msg_server_test.go index 8cdc5d11c610..4e5d28d41098 100644 --- a/x/slashing/keeper/msg_server_test.go +++ b/x/slashing/keeper/msg_server_test.go @@ -167,7 +167,7 @@ func (s *KeeperTestSuite) TestUnjail() { malleate: func() *slashingtypes.MsgUnjail { _, pubKey, addr := testdata.KeyTestPubAddr() valAddr := sdk.ValAddress(addr) - val, err := types.NewValidator(valAddr, pubKey, types.Description{Moniker: "test"}) + val, err := types.NewValidator(valAddr.String(), pubKey, types.Description{Moniker: "test"}) s.Require().NoError(err) s.stakingKeeper.EXPECT().Validator(s.ctx, valAddr).Return(val, nil) @@ -201,7 +201,7 @@ func (s *KeeperTestSuite) TestUnjail() { _, pubKey, addr := testdata.KeyTestPubAddr() valAddr := sdk.ValAddress(addr) - val, err := types.NewValidator(valAddr, pubKey, types.Description{Moniker: "test"}) + val, err := types.NewValidator(valAddr.String(), pubKey, types.Description{Moniker: "test"}) val.Tokens = sdkmath.NewInt(1000) val.DelegatorShares = sdkmath.LegacyNewDec(1) val.Jailed = false @@ -230,7 +230,7 @@ func (s *KeeperTestSuite) TestUnjail() { _, pubKey, addr := testdata.KeyTestPubAddr() valAddr := sdk.ValAddress(addr) - val, err := types.NewValidator(valAddr, pubKey, types.Description{Moniker: "test"}) + val, err := types.NewValidator(valAddr.String(), pubKey, types.Description{Moniker: "test"}) val.Tokens = sdkmath.NewInt(1000) val.DelegatorShares = sdkmath.LegacyNewDec(1) val.Jailed = true @@ -259,7 +259,7 @@ func (s *KeeperTestSuite) TestUnjail() { _, pubKey, addr := testdata.KeyTestPubAddr() valAddr := sdk.ValAddress(addr) - val, err := types.NewValidator(valAddr, pubKey, types.Description{Moniker: "test"}) + val, err := types.NewValidator(valAddr.String(), pubKey, types.Description{Moniker: "test"}) val.Tokens = sdkmath.NewInt(1000) val.DelegatorShares = sdkmath.LegacyNewDec(1) val.Jailed = true @@ -288,7 +288,7 @@ func (s *KeeperTestSuite) TestUnjail() { _, pubKey, addr := testdata.KeyTestPubAddr() valAddr := sdk.ValAddress(addr) - val, err := types.NewValidator(valAddr, pubKey, types.Description{Moniker: "test"}) + val, err := types.NewValidator(valAddr.String(), pubKey, types.Description{Moniker: "test"}) val.Tokens = sdkmath.NewInt(1000) val.DelegatorShares = sdkmath.LegacyNewDec(1) diff --git a/x/slashing/module.go b/x/slashing/module.go index 1a28a7c3c4a8..3adfa711e277 100644 --- a/x/slashing/module.go +++ b/x/slashing/module.go @@ -84,8 +84,8 @@ func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *g } // GetTxCmd returns the root tx command for the slashing module. -func (AppModuleBasic) GetTxCmd() *cobra.Command { - return cli.NewTxCmd() +func (amb AppModuleBasic) GetTxCmd() *cobra.Command { + return cli.NewTxCmd(amb.cdc.InterfaceRegistry().SigningContext().ValidatorAddressCodec()) } // AppModule implements an application module for the slashing module. diff --git a/x/slashing/simulation/operations.go b/x/slashing/simulation/operations.go index e807f114ebad..ffd20930954a 100644 --- a/x/slashing/simulation/operations.go +++ b/x/slashing/simulation/operations.go @@ -109,7 +109,7 @@ func SimulateMsgUnjail( return simtypes.NoOpMsg(types.ModuleName, msgType, "unable to generate fees"), nil, err } - msg := types.NewMsgUnjail(validator.GetOperator()) + msg := types.NewMsgUnjail(validator.GetOperator().String()) tx, err := simtestutil.GenSignedMockTx( r, diff --git a/x/slashing/simulation/operations_test.go b/x/slashing/simulation/operations_test.go index 8c555fb6682f..7a0869cf6e05 100644 --- a/x/slashing/simulation/operations_test.go +++ b/x/slashing/simulation/operations_test.go @@ -206,7 +206,7 @@ func getTestingValidator(ctx sdk.Context, stakingKeeper *stakingkeeper.Keeper, a account := accounts[n] valPubKey := account.ConsKey.PubKey() valAddr := sdk.ValAddress(account.PubKey.Address().Bytes()) - validator, err := stakingtypes.NewValidator(valAddr, valPubKey, stakingtypes.Description{}) + validator, err := stakingtypes.NewValidator(valAddr.String(), valPubKey, stakingtypes.Description{}) if err != nil { return stakingtypes.Validator{}, fmt.Errorf("failed to create validator: %w", err) } diff --git a/x/slashing/testutil/expected_keepers_mocks.go b/x/slashing/testutil/expected_keepers_mocks.go index a9e6ce81d2d6..7772d082d139 100644 --- a/x/slashing/testutil/expected_keepers_mocks.go +++ b/x/slashing/testutil/expected_keepers_mocks.go @@ -8,6 +8,7 @@ import ( context "context" reflect "reflect" + address "cosmossdk.io/core/address" math "cosmossdk.io/math" types "github.com/cosmos/cosmos-sdk/types" types0 "github.com/cosmos/cosmos-sdk/x/params/types" @@ -400,6 +401,20 @@ func (mr *MockStakingKeeperMockRecorder) Validator(arg0, arg1 interface{}) *gomo return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Validator", reflect.TypeOf((*MockStakingKeeper)(nil).Validator), arg0, arg1) } +// ValidatorAddressCodec mocks base method. +func (m *MockStakingKeeper) ValidatorAddressCodec() address.Codec { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ValidatorAddressCodec") + ret0, _ := ret[0].(address.Codec) + return ret0 +} + +// ValidatorAddressCodec indicates an expected call of ValidatorAddressCodec. +func (mr *MockStakingKeeperMockRecorder) ValidatorAddressCodec() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ValidatorAddressCodec", reflect.TypeOf((*MockStakingKeeper)(nil).ValidatorAddressCodec)) +} + // ValidatorByConsAddr mocks base method. func (m *MockStakingKeeper) ValidatorByConsAddr(arg0 context.Context, arg1 types.ConsAddress) (types1.ValidatorI, error) { m.ctrl.T.Helper() diff --git a/x/slashing/types/expected_keepers.go b/x/slashing/types/expected_keepers.go index 468a8700bd28..1cb3c1c1f956 100644 --- a/x/slashing/types/expected_keepers.go +++ b/x/slashing/types/expected_keepers.go @@ -3,6 +3,7 @@ package types import ( context "context" + "cosmossdk.io/core/address" "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" @@ -35,6 +36,7 @@ type ParamSubspace interface { // StakingKeeper expected staking keeper type StakingKeeper interface { + ValidatorAddressCodec() address.Codec // iterate through validators by operator address, execute func for each validator IterateValidators(context.Context, func(index int64, validator stakingtypes.ValidatorI) (stop bool)) error diff --git a/x/slashing/types/msg.go b/x/slashing/types/msg.go index d70bb2d3c046..e7a48f2ddd83 100644 --- a/x/slashing/types/msg.go +++ b/x/slashing/types/msg.go @@ -11,8 +11,8 @@ var ( ) // NewMsgUnjail creates a new MsgUnjail instance -func NewMsgUnjail(validatorAddr sdk.ValAddress) *MsgUnjail { +func NewMsgUnjail(validatorAddr string) *MsgUnjail { return &MsgUnjail{ - ValidatorAddr: validatorAddr.String(), + ValidatorAddr: validatorAddr, } } diff --git a/x/slashing/types/msg_test.go b/x/slashing/types/msg_test.go index 17f3ba6d6032..6ccf68376943 100644 --- a/x/slashing/types/msg_test.go +++ b/x/slashing/types/msg_test.go @@ -12,7 +12,7 @@ import ( func TestMsgUnjailGetSignBytes(t *testing.T) { addr := sdk.AccAddress("abcd") - msg := NewMsgUnjail(sdk.ValAddress(addr)) + msg := NewMsgUnjail(sdk.ValAddress(addr).String()) pc := codec.NewProtoCodec(types.NewInterfaceRegistry()) bytes, err := pc.MarshalAminoJSON(msg) require.NoError(t, err) diff --git a/x/staking/app_test.go b/x/staking/app_test.go index 04a026780d53..ae68287c40a7 100644 --- a/x/staking/app_test.go +++ b/x/staking/app_test.go @@ -69,7 +69,7 @@ func TestStakingMsgs(t *testing.T) { // create validator description := types.NewDescription("foo_moniker", "", "", "", "") createValidatorMsg, err := types.NewMsgCreateValidator( - sdk.ValAddress(addr1), valKey.PubKey(), bondCoin, description, commissionRates, math.OneInt(), + sdk.ValAddress(addr1).String(), valKey.PubKey(), bondCoin, description, commissionRates, math.OneInt(), ) require.NoError(t, err) @@ -94,7 +94,7 @@ func TestStakingMsgs(t *testing.T) { // edit the validator description = types.NewDescription("bar_moniker", "", "", "", "") - editValidatorMsg := types.NewMsgEditValidator(sdk.ValAddress(addr1), description, nil, nil) + editValidatorMsg := types.NewMsgEditValidator(sdk.ValAddress(addr1).String(), description, nil, nil) header = cmtproto.Header{Height: app.LastBlockHeight() + 1} _, _, err = simtestutil.SignCheckDeliver(t, txConfig, app.BaseApp, header, []sdk.Msg{editValidatorMsg}, "", []uint64{0}, []uint64{1}, true, true, priv1) @@ -107,7 +107,7 @@ func TestStakingMsgs(t *testing.T) { // delegate require.True(t, sdk.Coins{genCoin}.Equal(bankKeeper.GetAllBalances(ctxCheck, addr2))) - delegateMsg := types.NewMsgDelegate(addr2, sdk.ValAddress(addr1), bondCoin) + delegateMsg := types.NewMsgDelegate(addr2.String(), sdk.ValAddress(addr1).String(), bondCoin) header = cmtproto.Header{Height: app.LastBlockHeight() + 1} _, _, err = simtestutil.SignCheckDeliver(t, txConfig, app.BaseApp, header, []sdk.Msg{delegateMsg}, "", []uint64{1}, []uint64{0}, true, true, priv2) @@ -119,7 +119,7 @@ func TestStakingMsgs(t *testing.T) { require.NoError(t, err) // begin unbonding - beginUnbondingMsg := types.NewMsgUndelegate(addr2, sdk.ValAddress(addr1), bondCoin) + beginUnbondingMsg := types.NewMsgUndelegate(addr2.String(), sdk.ValAddress(addr1).String(), bondCoin) header = cmtproto.Header{Height: app.LastBlockHeight() + 1} _, _, err = simtestutil.SignCheckDeliver(t, txConfig, app.BaseApp, header, []sdk.Msg{beginUnbondingMsg}, "", []uint64{1}, []uint64{1}, true, true, priv2) require.NoError(t, err) diff --git a/x/staking/client/cli/flags.go b/x/staking/client/cli/flags.go index d4388e5c13f8..08789cfa6736 100644 --- a/x/staking/client/cli/flags.go +++ b/x/staking/client/cli/flags.go @@ -44,9 +44,9 @@ var ( func init() { fsShares.String(FlagSharesAmount, "", "Amount of source-shares to either unbond or redelegate as a positive integer or decimal") fsShares.String(FlagSharesFraction, "", "Fraction of source-shares to either unbond or redelegate as a positive integer or decimal >0 and <=1") - fsValidator.String(FlagAddressValidator, "", "The Bech32 address of the validator") - fsRedelegation.String(FlagAddressValidatorSrc, "", "The Bech32 address of the source validator") - fsRedelegation.String(FlagAddressValidatorDst, "", "The Bech32 address of the destination validator") + fsValidator.String(FlagAddressValidator, "", "The address of the validator") + fsRedelegation.String(FlagAddressValidatorSrc, "", "The address of the source validator") + fsRedelegation.String(FlagAddressValidatorDst, "", "The address of the destination validator") } // FlagSetCommissionCreate Returns the FlagSet used for commission create. diff --git a/x/staking/client/cli/tx.go b/x/staking/client/cli/tx.go index 0bf5411ae0cb..ce4b57c6fa32 100644 --- a/x/staking/client/cli/tx.go +++ b/x/staking/client/cli/tx.go @@ -9,6 +9,7 @@ import ( "github.com/spf13/cobra" flag "github.com/spf13/pflag" + "cosmossdk.io/core/address" errorsmod "cosmossdk.io/errors" "cosmossdk.io/math" @@ -33,7 +34,7 @@ var ( ) // NewTxCmd returns a root CLI command handler for all x/staking transaction commands. -func NewTxCmd() *cobra.Command { +func NewTxCmd(valAddrCodec, ac address.Codec) *cobra.Command { stakingTxCmd := &cobra.Command{ Use: types.ModuleName, Short: "Staking transaction subcommands", @@ -43,19 +44,19 @@ func NewTxCmd() *cobra.Command { } stakingTxCmd.AddCommand( - NewCreateValidatorCmd(), - NewEditValidatorCmd(), - NewDelegateCmd(), - NewRedelegateCmd(), - NewUnbondCmd(), - NewCancelUnbondingDelegation(), + NewCreateValidatorCmd(valAddrCodec), + NewEditValidatorCmd(valAddrCodec), + NewDelegateCmd(valAddrCodec, ac), + NewRedelegateCmd(valAddrCodec, ac), + NewUnbondCmd(valAddrCodec, ac), + NewCancelUnbondingDelegation(valAddrCodec, ac), ) return stakingTxCmd } // NewCreateValidatorCmd returns a CLI command handler for creating a MsgCreateValidator transaction. -func NewCreateValidatorCmd() *cobra.Command { +func NewCreateValidatorCmd(ac address.Codec) *cobra.Command { cmd := &cobra.Command{ Use: "create-validator [path/to/validator.json]", Short: "create new validator initialized with a self-delegation to it", @@ -99,7 +100,7 @@ where we can get the pubkey using "%s tendermint show-validator" return err } - txf, msg, err := newBuildCreateValidatorMsg(clientCtx, txf, cmd.Flags(), validator) + txf, msg, err := newBuildCreateValidatorMsg(clientCtx, txf, cmd.Flags(), validator, ac) if err != nil { return err } @@ -118,7 +119,7 @@ where we can get the pubkey using "%s tendermint show-validator" } // NewEditValidatorCmd returns a CLI command handler for creating a MsgEditValidator transaction. -func NewEditValidatorCmd() *cobra.Command { +func NewEditValidatorCmd(ac address.Codec) *cobra.Command { cmd := &cobra.Command{ Use: "edit-validator", Short: "edit an existing validator account", @@ -127,7 +128,7 @@ func NewEditValidatorCmd() *cobra.Command { if err != nil { return err } - valAddr := clientCtx.GetFromAddress() + moniker, _ := cmd.Flags().GetString(FlagEditMoniker) identity, _ := cmd.Flags().GetString(FlagIdentity) website, _ := cmd.Flags().GetString(FlagWebsite) @@ -159,7 +160,12 @@ func NewEditValidatorCmd() *cobra.Command { newMinSelfDelegation = &msb } - msg := types.NewMsgEditValidator(sdk.ValAddress(valAddr), description, newRate, newMinSelfDelegation) + valAddr, err := ac.BytesToString(clientCtx.GetFromAddress()) + if err != nil { + return err + } + + msg := types.NewMsgEditValidator(valAddr, description, newRate, newMinSelfDelegation) return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) }, @@ -174,9 +180,7 @@ func NewEditValidatorCmd() *cobra.Command { } // NewDelegateCmd returns a CLI command handler for creating a MsgDelegate transaction. -func NewDelegateCmd() *cobra.Command { - bech32PrefixValAddr := sdk.GetConfig().GetBech32ValidatorAddrPrefix() - +func NewDelegateCmd(valAddrCodec, ac address.Codec) *cobra.Command { cmd := &cobra.Command{ Use: "delegate [validator-addr] [amount]", Args: cobra.ExactArgs(2), @@ -185,9 +189,9 @@ func NewDelegateCmd() *cobra.Command { fmt.Sprintf(`Delegate an amount of liquid coins to a validator from your wallet. Example: -$ %s tx staking delegate %s1l2rsakp388kuv9k8qzq6lrm9taddae7fpx59wm 1000stake --from mykey +$ %s tx staking delegate cosmosvalopers1l2rsakp388kuv9k8qzq6lrm9taddae7fpx59wm 1000stake --from mykey `, - version.AppName, bech32PrefixValAddr, + version.AppName, ), ), RunE: func(cmd *cobra.Command, args []string) error { @@ -200,13 +204,17 @@ $ %s tx staking delegate %s1l2rsakp388kuv9k8qzq6lrm9taddae7fpx59wm 1000stake --f return err } - delAddr := clientCtx.GetFromAddress() - valAddr, err := sdk.ValAddressFromBech32(args[0]) + delAddr, err := ac.BytesToString(clientCtx.GetFromAddress()) if err != nil { return err } - msg := types.NewMsgDelegate(delAddr, valAddr, amount) + _, err = valAddrCodec.StringToBytes(args[0]) + if err != nil { + return err + } + + msg := types.NewMsgDelegate(delAddr, args[0], amount) return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) }, @@ -218,9 +226,7 @@ $ %s tx staking delegate %s1l2rsakp388kuv9k8qzq6lrm9taddae7fpx59wm 1000stake --f } // NewRedelegateCmd returns a CLI command handler for creating a MsgBeginRedelegate transaction. -func NewRedelegateCmd() *cobra.Command { - bech32PrefixValAddr := sdk.GetConfig().GetBech32ValidatorAddrPrefix() - +func NewRedelegateCmd(valAddrCodec, ac address.Codec) *cobra.Command { cmd := &cobra.Command{ Use: "redelegate [src-validator-addr] [dst-validator-addr] [amount]", Short: "Redelegate illiquid tokens from one validator to another", @@ -229,9 +235,9 @@ func NewRedelegateCmd() *cobra.Command { fmt.Sprintf(`Redelegate an amount of illiquid staking tokens from one validator to another. Example: -$ %s tx staking redelegate %s1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj %s1l2rsakp388kuv9k8qzq6lrm9taddae7fpx59wm 100stake --from mykey +$ %s tx staking redelegate cosmosvalopers1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj cosmosvalopers1l2rsakp388kuv9k8qzq6lrm9taddae7fpx59wm 100stake --from mykey `, - version.AppName, bech32PrefixValAddr, bech32PrefixValAddr, + version.AppName, ), ), RunE: func(cmd *cobra.Command, args []string) error { @@ -239,13 +245,17 @@ $ %s tx staking redelegate %s1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj %s1l2rsakp3 if err != nil { return err } - delAddr := clientCtx.GetFromAddress() - valSrcAddr, err := sdk.ValAddressFromBech32(args[0]) + delAddr, err := ac.BytesToString(clientCtx.GetFromAddress()) + if err != nil { + return err + } + + _, err = valAddrCodec.StringToBytes(args[0]) if err != nil { return err } - valDstAddr, err := sdk.ValAddressFromBech32(args[1]) + _, err = valAddrCodec.StringToBytes(args[1]) if err != nil { return err } @@ -255,7 +265,7 @@ $ %s tx staking redelegate %s1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj %s1l2rsakp3 return err } - msg := types.NewMsgBeginRedelegate(delAddr, valSrcAddr, valDstAddr, amount) + msg := types.NewMsgBeginRedelegate(delAddr, args[0], args[1], amount) return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) }, @@ -267,7 +277,7 @@ $ %s tx staking redelegate %s1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj %s1l2rsakp3 } // NewUnbondCmd returns a CLI command handler for creating a MsgUndelegate transaction. -func NewUnbondCmd() *cobra.Command { +func NewUnbondCmd(valAddrCodec, ac address.Codec) *cobra.Command { bech32PrefixValAddr := sdk.GetConfig().GetBech32ValidatorAddrPrefix() cmd := &cobra.Command{ @@ -289,8 +299,11 @@ $ %s tx staking unbond %s1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj 100stake --from return err } - delAddr := clientCtx.GetFromAddress() - valAddr, err := sdk.ValAddressFromBech32(args[0]) + delAddr, err := ac.BytesToString(clientCtx.GetFromAddress()) + if err != nil { + return err + } + _, err = valAddrCodec.StringToBytes(args[0]) if err != nil { return err } @@ -300,7 +313,7 @@ $ %s tx staking unbond %s1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj 100stake --from return err } - msg := types.NewMsgUndelegate(delAddr, valAddr, amount) + msg := types.NewMsgUndelegate(delAddr, args[0], amount) return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) }, @@ -312,7 +325,7 @@ $ %s tx staking unbond %s1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj 100stake --from } // NewCancelUnbondingDelegation returns a CLI command handler for creating a MsgCancelUnbondingDelegation transaction. -func NewCancelUnbondingDelegation() *cobra.Command { +func NewCancelUnbondingDelegation(valAddrCodec, ac address.Codec) *cobra.Command { bech32PrefixValAddr := sdk.GetConfig().GetBech32ValidatorAddrPrefix() cmd := &cobra.Command{ @@ -335,8 +348,12 @@ $ %s tx staking cancel-unbond %s1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj 100stake if err != nil { return err } - delAddr := clientCtx.GetFromAddress() - valAddr, err := sdk.ValAddressFromBech32(args[0]) + delAddr, err := ac.BytesToString(clientCtx.GetFromAddress()) + if err != nil { + return err + } + + _, err = valAddrCodec.StringToBytes(args[0]) if err != nil { return err } @@ -351,7 +368,7 @@ $ %s tx staking cancel-unbond %s1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj 100stake return errorsmod.Wrap(fmt.Errorf("invalid height: %d", creationHeight), "invalid height") } - msg := types.NewMsgCancelUnbondingDelegation(delAddr, valAddr, creationHeight, amount) + msg := types.NewMsgCancelUnbondingDelegation(delAddr, args[0], creationHeight, amount) return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) }, @@ -362,7 +379,7 @@ $ %s tx staking cancel-unbond %s1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj 100stake return cmd } -func newBuildCreateValidatorMsg(clientCtx client.Context, txf tx.Factory, fs *flag.FlagSet, val validator) (tx.Factory, *types.MsgCreateValidator, error) { +func newBuildCreateValidatorMsg(clientCtx client.Context, txf tx.Factory, fs *flag.FlagSet, val validator, valAc address.Codec) (tx.Factory, *types.MsgCreateValidator, error) { valAddr := clientCtx.GetFromAddress() description := types.NewDescription( @@ -373,13 +390,17 @@ func newBuildCreateValidatorMsg(clientCtx client.Context, txf tx.Factory, fs *fl val.Details, ) + valStr, err := valAc.BytesToString(sdk.ValAddress(valAddr)) + if err != nil { + return txf, nil, err + } msg, err := types.NewMsgCreateValidator( - sdk.ValAddress(valAddr), val.PubKey, val.Amount, description, val.CommissionRates, val.MinSelfDelegation, + valStr, val.PubKey, val.Amount, description, val.CommissionRates, val.MinSelfDelegation, ) if err != nil { return txf, nil, err } - if err := msg.Validate(); err != nil { + if err := msg.Validate(valAc); err != nil { return txf, nil, err } @@ -549,7 +570,7 @@ func PrepareConfigForTxCreateValidator(flagSet *flag.FlagSet, moniker, nodeID, c } // BuildCreateValidatorMsg makes a new MsgCreateValidator. -func BuildCreateValidatorMsg(clientCtx client.Context, config TxCreateValidatorConfig, txBldr tx.Factory, generateOnly bool) (tx.Factory, sdk.Msg, error) { +func BuildCreateValidatorMsg(clientCtx client.Context, config TxCreateValidatorConfig, txBldr tx.Factory, generateOnly bool, valCodec address.Codec) (tx.Factory, sdk.Msg, error) { amounstStr := config.Amount amount, err := sdk.ParseCoinNormalized(amounstStr) if err != nil { @@ -582,8 +603,13 @@ func BuildCreateValidatorMsg(clientCtx client.Context, config TxCreateValidatorC return txBldr, nil, errorsmod.Wrap(sdkerrors.ErrInvalidRequest, "minimum self delegation must be a positive integer") } + valStr, err := valCodec.BytesToString(sdk.ValAddress(valAddr)) + if err != nil { + return txBldr, nil, err + } + msg, err := types.NewMsgCreateValidator( - sdk.ValAddress(valAddr), + valStr, config.PubKey, amount, description, diff --git a/x/staking/client/cli/tx_test.go b/x/staking/client/cli/tx_test.go index ac3ceee290d8..77d4727606d2 100644 --- a/x/staking/client/cli/tx_test.go +++ b/x/staking/client/cli/tx_test.go @@ -14,6 +14,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" + addresscodec "github.com/cosmos/cosmos-sdk/codec/address" "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" @@ -161,7 +162,7 @@ func (s *CLITestSuite) TestPrepareConfigForTxCreateValidator() { func (s *CLITestSuite) TestNewCreateValidatorCmd() { require := s.Require() - cmd := cli.NewCreateValidatorCmd() + cmd := cli.NewCreateValidatorCmd(addresscodec.NewBech32Codec("cosmosvaloper")) validJSON := fmt.Sprintf(` { @@ -308,7 +309,7 @@ func (s *CLITestSuite) TestNewCreateValidatorCmd() { } func (s *CLITestSuite) TestNewEditValidatorCmd() { - cmd := cli.NewEditValidatorCmd() + cmd := cli.NewEditValidatorCmd(addresscodec.NewBech32Codec("cosmos")) moniker := "testing" details := "bio" @@ -431,7 +432,7 @@ func (s *CLITestSuite) TestNewEditValidatorCmd() { } func (s *CLITestSuite) TestNewDelegateCmd() { - cmd := cli.NewDelegateCmd() + cmd := cli.NewDelegateCmd(addresscodec.NewBech32Codec("cosmosvaloper"), addresscodec.NewBech32Codec("cosmos")) testCases := []struct { name string @@ -494,7 +495,7 @@ func (s *CLITestSuite) TestNewDelegateCmd() { } func (s *CLITestSuite) TestNewRedelegateCmd() { - cmd := cli.NewRedelegateCmd() + cmd := cli.NewRedelegateCmd(addresscodec.NewBech32Codec("cosmosvaloper"), addresscodec.NewBech32Codec("cosmos")) testCases := []struct { name string @@ -576,7 +577,7 @@ func (s *CLITestSuite) TestNewRedelegateCmd() { } func (s *CLITestSuite) TestNewUnbondCmd() { - cmd := cli.NewUnbondCmd() + cmd := cli.NewUnbondCmd(addresscodec.NewBech32Codec("cosmosvaloper"), addresscodec.NewBech32Codec("cosmos")) testCases := []struct { name string @@ -639,7 +640,7 @@ func (s *CLITestSuite) TestNewUnbondCmd() { } func (s *CLITestSuite) TestNewCancelUnbondingDelegationCmd() { - cmd := cli.NewCancelUnbondingDelegation() + cmd := cli.NewCancelUnbondingDelegation(addresscodec.NewBech32Codec("cosmosvaloper"), addresscodec.NewBech32Codec("cosmos")) testCases := []struct { name string diff --git a/x/staking/keeper/delegation.go b/x/staking/keeper/delegation.go index e5849b8daa8e..7d6210eb7cc3 100644 --- a/x/staking/keeper/delegation.go +++ b/x/staking/keeper/delegation.go @@ -304,7 +304,7 @@ func (k Keeper) GetDelegatorBonded(ctx context.Context, delegator sdk.AccAddress bonded := math.LegacyZeroDec() err := k.IterateDelegatorDelegations(ctx, delegator, func(delegation types.Delegation) bool { - validatorAddr, err := sdk.ValAddressFromBech32(delegation.ValidatorAddress) + validatorAddr, err := k.validatorAddressCodec.StringToBytes(delegation.ValidatorAddress) if err != nil { panic(err) // shouldn't happen } @@ -385,7 +385,7 @@ func (k Keeper) SetUnbondingDelegation(ctx context.Context, ubd types.UnbondingD store := k.storeService.OpenKVStore(ctx) bz := types.MustMarshalUBD(k.cdc, ubd) - valAddr, err := sdk.ValAddressFromBech32(ubd.ValidatorAddress) + valAddr, err := k.validatorAddressCodec.StringToBytes(ubd.ValidatorAddress) if err != nil { return err } @@ -406,7 +406,7 @@ func (k Keeper) RemoveUnbondingDelegation(ctx context.Context, ubd types.Unbondi } store := k.storeService.OpenKVStore(ctx) - addr, err := sdk.ValAddressFromBech32(ubd.ValidatorAddress) + addr, err := k.validatorAddressCodec.StringToBytes(ubd.ValidatorAddress) if err != nil { return err } @@ -435,7 +435,7 @@ func (k Keeper) SetUnbondingDelegationEntry( if err == nil { isNewUbdEntry = ubd.AddEntry(creationHeight, minTime, balance, id) } else if errors.Is(err, types.ErrNoUnbondingDelegation) { - ubd = types.NewUnbondingDelegation(delegatorAddr, validatorAddr, creationHeight, minTime, balance, id) + ubd = types.NewUnbondingDelegation(delegatorAddr, validatorAddr, creationHeight, minTime, balance, id, k.validatorAddressCodec, k.authKeeper.AddressCodec()) } else { return ubd, err } @@ -653,11 +653,11 @@ func (k Keeper) SetRedelegation(ctx context.Context, red types.Redelegation) err store := k.storeService.OpenKVStore(ctx) bz := types.MustMarshalRED(k.cdc, red) - valSrcAddr, err := sdk.ValAddressFromBech32(red.ValidatorSrcAddress) + valSrcAddr, err := k.validatorAddressCodec.StringToBytes(red.ValidatorSrcAddress) if err != nil { return err } - valDestAddr, err := sdk.ValAddressFromBech32(red.ValidatorDstAddress) + valDestAddr, err := k.validatorAddressCodec.StringToBytes(red.ValidatorDstAddress) if err != nil { return err } @@ -691,7 +691,7 @@ func (k Keeper) SetRedelegationEntry(ctx context.Context, red.AddEntry(creationHeight, minTime, balance, sharesDst, id) } else if errors.Is(err, types.ErrNoRedelegation) { red = types.NewRedelegation(delegatorAddr, validatorSrcAddr, - validatorDstAddr, creationHeight, minTime, balance, sharesDst, id) + validatorDstAddr, creationHeight, minTime, balance, sharesDst, id, k.validatorAddressCodec, k.authKeeper.AddressCodec()) } else { return types.Redelegation{}, err } @@ -744,11 +744,11 @@ func (k Keeper) RemoveRedelegation(ctx context.Context, red types.Redelegation) } store := k.storeService.OpenKVStore(ctx) - valSrcAddr, err := sdk.ValAddressFromBech32(red.ValidatorSrcAddress) + valSrcAddr, err := k.validatorAddressCodec.StringToBytes(red.ValidatorSrcAddress) if err != nil { return err } - valDestAddr, err := sdk.ValAddressFromBech32(red.ValidatorDstAddress) + valDestAddr, err := k.validatorAddressCodec.StringToBytes(red.ValidatorDstAddress) if err != nil { return err } diff --git a/x/staking/keeper/delegation_test.go b/x/staking/keeper/delegation_test.go index ab689985a78f..26fe6fbebb6b 100644 --- a/x/staking/keeper/delegation_test.go +++ b/x/staking/keeper/delegation_test.go @@ -179,7 +179,7 @@ func (s *KeeperTestSuite) TestDelegationsByValIndex() { // delegate 2 tokens // // total delegations after delegating: del1 -> 2stake - _, err := s.msgServer.Delegate(ctx, stakingtypes.NewMsgDelegate(addrDels[0], valAddrs[0], sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(2)))) + _, err := s.msgServer.Delegate(ctx, stakingtypes.NewMsgDelegate(addrDels[0].String(), valAddrs[0].String(), sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(2)))) require.NoError(err) dels, err := s.stakingKeeper.GetValidatorDelegations(ctx, valAddrs[0]) @@ -189,7 +189,7 @@ func (s *KeeperTestSuite) TestDelegationsByValIndex() { // delegate 4 tokens // // total delegations after delegating: del1 -> 2stake, del2 -> 4stake - _, err = s.msgServer.Delegate(ctx, stakingtypes.NewMsgDelegate(addrDels[1], valAddrs[0], sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(4)))) + _, err = s.msgServer.Delegate(ctx, stakingtypes.NewMsgDelegate(addrDels[1].String(), valAddrs[0].String(), sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(4)))) require.NoError(err) dels, err = s.stakingKeeper.GetValidatorDelegations(ctx, valAddrs[0]) @@ -199,7 +199,7 @@ func (s *KeeperTestSuite) TestDelegationsByValIndex() { // undelegate 1 token from del1 // // total delegations after undelegating: del1 -> 1stake, del2 -> 4stake - _, err = s.msgServer.Undelegate(ctx, stakingtypes.NewMsgUndelegate(addrDels[0], valAddrs[0], sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(1)))) + _, err = s.msgServer.Undelegate(ctx, stakingtypes.NewMsgUndelegate(addrDels[0].String(), valAddrs[0].String(), sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(1)))) require.NoError(err) dels, err = s.stakingKeeper.GetValidatorDelegations(ctx, valAddrs[0]) @@ -209,7 +209,7 @@ func (s *KeeperTestSuite) TestDelegationsByValIndex() { // undelegate 1 token from del1 // // total delegations after undelegating: del2 -> 4stake - _, err = s.msgServer.Undelegate(ctx, stakingtypes.NewMsgUndelegate(addrDels[0], valAddrs[0], sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(1)))) + _, err = s.msgServer.Undelegate(ctx, stakingtypes.NewMsgUndelegate(addrDels[0].String(), valAddrs[0].String(), sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(1)))) require.NoError(err) dels, err = s.stakingKeeper.GetValidatorDelegations(ctx, valAddrs[0]) @@ -219,7 +219,7 @@ func (s *KeeperTestSuite) TestDelegationsByValIndex() { // undelegate 2 tokens from del2 // // total delegations after undelegating: del2 -> 2stake - _, err = s.msgServer.Undelegate(ctx, stakingtypes.NewMsgUndelegate(addrDels[1], valAddrs[0], sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(2)))) + _, err = s.msgServer.Undelegate(ctx, stakingtypes.NewMsgUndelegate(addrDels[1].String(), valAddrs[0].String(), sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(2)))) require.NoError(err) dels, err = s.stakingKeeper.GetValidatorDelegations(ctx, valAddrs[0]) @@ -229,7 +229,7 @@ func (s *KeeperTestSuite) TestDelegationsByValIndex() { // undelegate 2 tokens from del2 // // total delegations after undelegating: [] - _, err = s.msgServer.Undelegate(ctx, stakingtypes.NewMsgUndelegate(addrDels[1], valAddrs[0], sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(2)))) + _, err = s.msgServer.Undelegate(ctx, stakingtypes.NewMsgUndelegate(addrDels[1].String(), valAddrs[0].String(), sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(2)))) require.NoError(err) dels, err = s.stakingKeeper.GetValidatorDelegations(ctx, valAddrs[0]) @@ -253,6 +253,7 @@ func (s *KeeperTestSuite) TestUnbondingDelegation() { time.Unix(0, 0).UTC(), math.NewInt(5), 0, + address.NewBech32Codec("cosmosvaloper"), address.NewBech32Codec("cosmos"), ) // set and retrieve a record @@ -309,6 +310,7 @@ func (s *KeeperTestSuite) TestUnbondingDelegationsFromValidator() { time.Unix(0, 0).UTC(), math.NewInt(5), 0, + address.NewBech32Codec("cosmosvaloper"), address.NewBech32Codec("cosmos"), ) // set and retrieve a record @@ -674,7 +676,7 @@ func (s *KeeperTestSuite) TestGetRedelegationsFromSrcValidator() { rd := stakingtypes.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 0, time.Unix(0, 0), math.NewInt(5), - math.LegacyNewDec(5), 0) + math.LegacyNewDec(5), 0, address.NewBech32Codec("cosmosvaloper"), address.NewBech32Codec("cosmos")) // set and retrieve a record err := keeper.SetRedelegation(ctx, rd) @@ -704,7 +706,7 @@ func (s *KeeperTestSuite) TestRedelegation() { rd := stakingtypes.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 0, time.Unix(0, 0).UTC(), math.NewInt(5), - math.LegacyNewDec(5), 0) + math.LegacyNewDec(5), 0, address.NewBech32Codec("cosmosvaloper"), address.NewBech32Codec("cosmos")) // test shouldn't have and redelegations has, err := keeper.HasReceivingRedelegation(ctx, addrDels[0], addrVals[1]) @@ -1066,6 +1068,7 @@ func (s *KeeperTestSuite) TestUnbondingDelegationAddEntry() { time.Unix(0, 0).UTC(), math.NewInt(10), 0, + address.NewBech32Codec("cosmosvaloper"), address.NewBech32Codec("cosmos"), ) var initialEntries []stakingtypes.UnbondingDelegationEntry initialEntries = append(initialEntries, ubd.Entries...) @@ -1107,6 +1110,7 @@ func (s *KeeperTestSuite) TestSetUnbondingDelegationEntry() { time.Unix(0, 0).UTC(), math.NewInt(5), 0, + address.NewBech32Codec("cosmosvaloper"), address.NewBech32Codec("cosmos"), ) // set and retrieve a record diff --git a/x/staking/keeper/genesis.go b/x/staking/keeper/genesis.go index 65a53c0cbe46..ca544e7d26aa 100644 --- a/x/staking/keeper/genesis.go +++ b/x/staking/keeper/genesis.go @@ -173,7 +173,7 @@ func (k Keeper) InitGenesis(ctx context.Context, data *types.GenesisState) (res // don't need to run CometBFT updates if we exported if data.Exported { for _, lv := range data.LastValidatorPowers { - valAddr, err := sdk.ValAddressFromBech32(lv.Address) + valAddr, err := k.validatorAddressCodec.StringToBytes(lv.Address) if err != nil { panic(err) } @@ -231,7 +231,11 @@ func (k Keeper) ExportGenesis(ctx sdk.Context) *types.GenesisState { var lastValidatorPowers []types.LastValidatorPower err = k.IterateLastValidatorPowers(ctx, func(addr sdk.ValAddress, power int64) (stop bool) { - lastValidatorPowers = append(lastValidatorPowers, types.LastValidatorPower{Address: addr.String(), Power: power}) + addrStr, err := k.validatorAddressCodec.BytesToString(addr) + if err != nil { + panic(err) + } + lastValidatorPowers = append(lastValidatorPowers, types.LastValidatorPower{Address: addrStr, Power: power}) return false }) if err != nil { diff --git a/x/staking/keeper/grpc_query.go b/x/staking/keeper/grpc_query.go index b74c332d0a8a..e80b5de8598e 100644 --- a/x/staking/keeper/grpc_query.go +++ b/x/staking/keeper/grpc_query.go @@ -72,7 +72,7 @@ func (k Querier) Validator(ctx context.Context, req *types.QueryValidatorRequest return nil, status.Error(codes.InvalidArgument, "validator address cannot be empty") } - valAddr, err := sdk.ValAddressFromBech32(req.ValidatorAddr) + valAddr, err := k.validatorAddressCodec.StringToBytes(req.ValidatorAddr) if err != nil { return nil, err } @@ -95,7 +95,7 @@ func (k Querier) ValidatorDelegations(ctx context.Context, req *types.QueryValid return nil, status.Error(codes.InvalidArgument, "validator address cannot be empty") } - valAddr, err := sdk.ValAddressFromBech32(req.ValidatorAddr) + valAddr, err := k.validatorAddressCodec.StringToBytes(req.ValidatorAddr) if err != nil { return nil, err } @@ -174,7 +174,7 @@ func (k Querier) ValidatorUnbondingDelegations(ctx context.Context, req *types.Q } var ubds types.UnbondingDelegations - valAddr, err := sdk.ValAddressFromBech32(req.ValidatorAddr) + valAddr, err := k.validatorAddressCodec.StringToBytes(req.ValidatorAddr) if err != nil { return nil, err } @@ -221,7 +221,7 @@ func (k Querier) Delegation(ctx context.Context, req *types.QueryDelegationReque return nil, err } - valAddr, err := sdk.ValAddressFromBech32(req.ValidatorAddr) + valAddr, err := k.validatorAddressCodec.StringToBytes(req.ValidatorAddr) if err != nil { return nil, err } @@ -260,7 +260,7 @@ func (k Querier) UnbondingDelegation(ctx context.Context, req *types.QueryUnbond return nil, err } - valAddr, err := sdk.ValAddressFromBech32(req.ValidatorAddr) + valAddr, err := k.validatorAddressCodec.StringToBytes(req.ValidatorAddr) if err != nil { return nil, err } @@ -332,7 +332,7 @@ func (k Querier) DelegatorValidator(ctx context.Context, req *types.QueryDelegat return nil, err } - valAddr, err := sdk.ValAddressFromBech32(req.ValidatorAddr) + valAddr, err := k.validatorAddressCodec.StringToBytes(req.ValidatorAddr) if err != nil { return nil, err } @@ -504,12 +504,12 @@ func queryRedelegation(ctx context.Context, k Querier, req *types.QueryRedelegat return nil, err } - srcValAddr, err := sdk.ValAddressFromBech32(req.SrcValidatorAddr) + srcValAddr, err := k.validatorAddressCodec.StringToBytes(req.SrcValidatorAddr) if err != nil { return nil, err } - dstValAddr, err := sdk.ValAddressFromBech32(req.DstValidatorAddr) + dstValAddr, err := k.validatorAddressCodec.StringToBytes(req.DstValidatorAddr) if err != nil { return nil, err } @@ -527,7 +527,7 @@ func queryRedelegation(ctx context.Context, k Querier, req *types.QueryRedelegat } func queryRedelegationsFromSrcValidator(store storetypes.KVStore, k Querier, req *types.QueryRedelegationsRequest) (redels types.Redelegations, res *query.PageResponse, err error) { - valAddr, err := sdk.ValAddressFromBech32(req.SrcValidatorAddr) + valAddr, err := k.validatorAddressCodec.StringToBytes(req.SrcValidatorAddr) if err != nil { return nil, nil, err } @@ -617,16 +617,16 @@ func redelegationsToRedelegationResponses(ctx context.Context, k *Keeper, redels resp := make(types.RedelegationResponses, len(redels)) for i, redel := range redels { - valSrcAddr, err := sdk.ValAddressFromBech32(redel.ValidatorSrcAddress) + _, err := k.validatorAddressCodec.StringToBytes(redel.ValidatorSrcAddress) if err != nil { - panic(err) + return nil, err } - valDstAddr, err := sdk.ValAddressFromBech32(redel.ValidatorDstAddress) + valDstAddr, err := k.validatorAddressCodec.StringToBytes(redel.ValidatorDstAddress) if err != nil { - panic(err) + return nil, err } - delegatorAddress, err := k.authKeeper.AddressCodec().StringToBytes(redel.DelegatorAddress) + _, err = k.authKeeper.AddressCodec().StringToBytes(redel.DelegatorAddress) if err != nil { return nil, err } @@ -649,9 +649,9 @@ func redelegationsToRedelegationResponses(ctx context.Context, k *Keeper, redels } resp[i] = types.NewRedelegationResponse( - delegatorAddress, - valSrcAddr, - valDstAddr, + redel.DelegatorAddress, + redel.ValidatorSrcAddress, + redel.ValidatorDstAddress, entryResponses, ) } diff --git a/x/staking/keeper/invariants.go b/x/staking/keeper/invariants.go index 3c749925bc62..3f73f8a9bbc0 100644 --- a/x/staking/keeper/invariants.go +++ b/x/staking/keeper/invariants.go @@ -189,7 +189,11 @@ func DelegatorSharesInvariant(k *Keeper) sdk.Invariant { // initialize a map: validator -> its delegation shares for _, validator := range validators { - validatorsDelegationShares[validator.GetOperator().String()] = math.LegacyZeroDec() + addrStr, err := k.validatorAddressCodec.BytesToString(validator.GetOperator()) + if err != nil { + panic(err) + } + validatorsDelegationShares[addrStr] = math.LegacyZeroDec() } // iterate through all the delegations to calculate the total delegation shares for each validator @@ -207,7 +211,11 @@ func DelegatorSharesInvariant(k *Keeper) sdk.Invariant { // for each validator, check if its total delegation shares calculated from the step above equals to its expected delegation shares for _, validator := range validators { expValTotalDelShares := validator.GetDelegatorShares() - calculatedValTotalDelShares := validatorsDelegationShares[validator.GetOperator().String()] + addrStr, err := k.validatorAddressCodec.BytesToString(validator.GetOperator()) + if err != nil { + panic(err) + } + calculatedValTotalDelShares := validatorsDelegationShares[addrStr] if !calculatedValTotalDelShares.Equal(expValTotalDelShares) { broken = true msg += fmt.Sprintf("broken delegator shares invariance:\n"+ diff --git a/x/staking/keeper/msg_server.go b/x/staking/keeper/msg_server.go index d7fb9744a72b..8ecd4ed209f5 100644 --- a/x/staking/keeper/msg_server.go +++ b/x/staking/keeper/msg_server.go @@ -38,7 +38,7 @@ func (k msgServer) CreateValidator(ctx context.Context, msg *types.MsgCreateVali return nil, sdkerrors.ErrInvalidAddress.Wrapf("invalid validator address: %s", err) } - if err := msg.Validate(); err != nil { + if err := msg.Validate(k.validatorAddressCodec); err != nil { return nil, err } @@ -99,7 +99,7 @@ func (k msgServer) CreateValidator(ctx context.Context, msg *types.MsgCreateVali } } - validator, err := types.NewValidator(valAddr, pk, msg.Description) + validator, err := types.NewValidator(msg.ValidatorAddress, pk, msg.Description) if err != nil { return nil, err } diff --git a/x/staking/keeper/msg_server_test.go b/x/staking/keeper/msg_server_test.go index 82b30abe13f0..df339ae371cb 100644 --- a/x/staking/keeper/msg_server_test.go +++ b/x/staking/keeper/msg_server_test.go @@ -252,7 +252,7 @@ func (s *KeeperTestSuite) TestMsgEditValidator() { require.NotNil(pk) comm := stakingtypes.NewCommissionRates(math.LegacyNewDec(0), math.LegacyNewDec(0), math.LegacyNewDec(0)) - msg, err := stakingtypes.NewMsgCreateValidator(ValAddr, pk, sdk.NewCoin("stake", math.NewInt(10)), stakingtypes.Description{Moniker: "NewVal"}, comm, math.OneInt()) + msg, err := stakingtypes.NewMsgCreateValidator(ValAddr.String(), pk, sdk.NewCoin("stake", math.NewInt(10)), stakingtypes.Description{Moniker: "NewVal"}, comm, math.OneInt()) require.NoError(err) res, err := msgServer.CreateValidator(ctx, msg) @@ -426,7 +426,7 @@ func (s *KeeperTestSuite) TestMsgDelegate() { comm := stakingtypes.NewCommissionRates(math.LegacyNewDec(0), math.LegacyNewDec(0), math.LegacyNewDec(0)) - msg, err := stakingtypes.NewMsgCreateValidator(ValAddr, pk, sdk.NewCoin("stake", math.NewInt(10)), stakingtypes.Description{Moniker: "NewVal"}, comm, math.OneInt()) + msg, err := stakingtypes.NewMsgCreateValidator(ValAddr.String(), pk, sdk.NewCoin("stake", math.NewInt(10)), stakingtypes.Description{Moniker: "NewVal"}, comm, math.OneInt()) require.NoError(err) res, err := msgServer.CreateValidator(ctx, msg) @@ -551,14 +551,14 @@ func (s *KeeperTestSuite) TestMsgBeginRedelegate() { comm := stakingtypes.NewCommissionRates(math.LegacyNewDec(0), math.LegacyNewDec(0), math.LegacyNewDec(0)) amt := sdk.Coin{Denom: sdk.DefaultBondDenom, Amount: keeper.TokensFromConsensusPower(s.ctx, int64(100))} - msg, err := stakingtypes.NewMsgCreateValidator(srcValAddr, pk, amt, stakingtypes.Description{Moniker: "NewVal"}, comm, math.OneInt()) + msg, err := stakingtypes.NewMsgCreateValidator(srcValAddr.String(), pk, amt, stakingtypes.Description{Moniker: "NewVal"}, comm, math.OneInt()) require.NoError(err) res, err := msgServer.CreateValidator(ctx, msg) require.NoError(err) require.NotNil(res) s.bankKeeper.EXPECT().DelegateCoinsFromAccountToModule(gomock.Any(), addr2, stakingtypes.NotBondedPoolName, gomock.Any()).AnyTimes() - msg, err = stakingtypes.NewMsgCreateValidator(dstValAddr, dstPk, amt, stakingtypes.Description{Moniker: "NewVal"}, comm, math.OneInt()) + msg, err = stakingtypes.NewMsgCreateValidator(dstValAddr.String(), dstPk, amt, stakingtypes.Description{Moniker: "NewVal"}, comm, math.OneInt()) require.NoError(err) res, err = msgServer.CreateValidator(ctx, msg) @@ -713,7 +713,7 @@ func (s *KeeperTestSuite) TestMsgUndelegate() { comm := stakingtypes.NewCommissionRates(math.LegacyNewDec(0), math.LegacyNewDec(0), math.LegacyNewDec(0)) amt := sdk.Coin{Denom: sdk.DefaultBondDenom, Amount: keeper.TokensFromConsensusPower(s.ctx, int64(100))} - msg, err := stakingtypes.NewMsgCreateValidator(ValAddr, pk, amt, stakingtypes.Description{Moniker: "NewVal"}, comm, math.OneInt()) + msg, err := stakingtypes.NewMsgCreateValidator(ValAddr.String(), pk, amt, stakingtypes.Description{Moniker: "NewVal"}, comm, math.OneInt()) require.NoError(err) res, err := msgServer.CreateValidator(ctx, msg) require.NoError(err) @@ -827,7 +827,7 @@ func (s *KeeperTestSuite) TestMsgUndelegate() { } func (s *KeeperTestSuite) TestMsgCancelUnbondingDelegation() { - ctx, keeper, msgServer := s.ctx, s.stakingKeeper, s.msgServer + ctx, keeper, msgServer, ak := s.ctx, s.stakingKeeper, s.msgServer, s.accountKeeper require := s.Require() pk := ed25519.GenPrivKey().PubKey() @@ -838,7 +838,7 @@ func (s *KeeperTestSuite) TestMsgCancelUnbondingDelegation() { s.bankKeeper.EXPECT().DelegateCoinsFromAccountToModule(gomock.Any(), Addr, stakingtypes.NotBondedPoolName, gomock.Any()).AnyTimes() - msg, err := stakingtypes.NewMsgCreateValidator(ValAddr, pk, amt, stakingtypes.Description{Moniker: "NewVal"}, comm, math.OneInt()) + msg, err := stakingtypes.NewMsgCreateValidator(ValAddr.String(), pk, amt, stakingtypes.Description{Moniker: "NewVal"}, comm, math.OneInt()) require.NoError(err) res, err := msgServer.CreateValidator(ctx, msg) require.NoError(err) @@ -851,7 +851,7 @@ func (s *KeeperTestSuite) TestMsgCancelUnbondingDelegation() { require.NoError(err) require.Equal(del, resDel) - ubd := stakingtypes.NewUnbondingDelegation(Addr, ValAddr, 10, ctx.BlockTime().Add(time.Minute*10), shares.RoundInt(), 0) + ubd := stakingtypes.NewUnbondingDelegation(Addr, ValAddr, 10, ctx.BlockTime().Add(time.Minute*10), shares.RoundInt(), 0, keeper.ValidatorAddressCodec(), ak.AddressCodec()) require.NoError(keeper.SetUnbondingDelegation(ctx, ubd)) resUnbond, err := keeper.GetUnbondingDelegation(ctx, Addr, ValAddr) require.NoError(err) diff --git a/x/staking/keeper/query_utils.go b/x/staking/keeper/query_utils.go index f7951fc2944f..6bb16da3fcd0 100644 --- a/x/staking/keeper/query_utils.go +++ b/x/staking/keeper/query_utils.go @@ -131,19 +131,19 @@ func (k Keeper) GetAllRedelegations( for ; iterator.Valid(); iterator.Next() { redelegation := types.MustUnmarshalRED(k.cdc, iterator.Value()) - valSrcAddr, err := sdk.ValAddressFromBech32(redelegation.ValidatorSrcAddress) + valSrcAddr, err := k.validatorAddressCodec.StringToBytes(redelegation.ValidatorSrcAddress) if err != nil { return nil, err } - valDstAddr, err := sdk.ValAddressFromBech32(redelegation.ValidatorDstAddress) + valDstAddr, err := k.validatorAddressCodec.StringToBytes(redelegation.ValidatorDstAddress) if err != nil { return nil, err } - if srcValFilter && !(srcValAddress.Equals(valSrcAddr)) { + if srcValFilter && !(srcValAddress.Equals(sdk.ValAddress(valSrcAddr))) { continue } - if dstValFilter && !(dstValAddress.Equals(valDstAddr)) { + if dstValFilter && !(dstValAddress.Equals(sdk.ValAddress(valDstAddr))) { continue } diff --git a/x/staking/keeper/slash.go b/x/staking/keeper/slash.go index fc98a44585b8..d23b9b720a8e 100644 --- a/x/staking/keeper/slash.go +++ b/x/staking/keeper/slash.go @@ -53,9 +53,14 @@ func (k Keeper) Slash(ctx context.Context, consAddr sdk.ConsAddress, infractionH // NOTE: Correctness dependent on invariant that unbonding delegations / redelegations must also have been completely // slashed in this case - which we don't explicitly check, but should be true. // Log the slash attempt for future reference (maybe we should tag it too) + conStr, err := k.consensusAddressCodec.BytesToString(consAddr) + if err != nil { + panic(err) + } + logger.Error( "WARNING: ignored attempt to slash a nonexistent validator; we recommend you investigate immediately", - "validator", consAddr.String(), + "validator", conStr, ) return math.NewInt(0), nil } else if err != nil { @@ -170,9 +175,13 @@ func (k Keeper) Slash(ctx context.Context, consAddr sdk.ConsAddress, infractionH panic("invalid validator status") } + valAddr, err := k.validatorAddressCodec.BytesToString(validator.GetOperator()) + if err != nil { + panic(err) + } logger.Info( "validator slashed by slash factor", - "validator", validator.GetOperator().String(), + "validator", valAddr, "slash_factor", slashFactor.String(), "burned", tokensToBurn, ) @@ -300,7 +309,7 @@ func (k Keeper) SlashRedelegation(ctx context.Context, srcValidator types.Valida continue } - valDstAddr, err := sdk.ValAddressFromBech32(redelegation.ValidatorDstAddress) + valDstAddr, err := k.validatorAddressCodec.StringToBytes(redelegation.ValidatorDstAddress) if err != nil { panic(err) } diff --git a/x/staking/keeper/unbonding.go b/x/staking/keeper/unbonding.go index a0fb55de8c46..1813797b9761 100644 --- a/x/staking/keeper/unbonding.go +++ b/x/staking/keeper/unbonding.go @@ -172,7 +172,7 @@ func (k Keeper) SetUnbondingDelegationByUnbondingID(ctx context.Context, ubd typ if err != nil { return err } - valAddr, err := sdk.ValAddressFromBech32(ubd.ValidatorAddress) + valAddr, err := k.validatorAddressCodec.StringToBytes(ubd.ValidatorAddress) if err != nil { return err } @@ -196,12 +196,12 @@ func (k Keeper) SetRedelegationByUnbondingID(ctx context.Context, red types.Rede return err } - valSrcAddr, err := sdk.ValAddressFromBech32(red.ValidatorSrcAddress) + valSrcAddr, err := k.validatorAddressCodec.StringToBytes(red.ValidatorSrcAddress) if err != nil { return err } - valDstAddr, err := sdk.ValAddressFromBech32(red.ValidatorDstAddress) + valDstAddr, err := k.validatorAddressCodec.StringToBytes(red.ValidatorDstAddress) if err != nil { return err } @@ -220,7 +220,7 @@ func (k Keeper) SetRedelegationByUnbondingID(ctx context.Context, red types.Rede func (k Keeper) SetValidatorByUnbondingID(ctx context.Context, val types.Validator, id uint64) error { store := k.storeService.OpenKVStore(ctx) - valAddr, err := sdk.ValAddressFromBech32(val.OperatorAddress) + valAddr, err := k.validatorAddressCodec.StringToBytes(val.OperatorAddress) if err != nil { return err } diff --git a/x/staking/keeper/unbonding_test.go b/x/staking/keeper/unbonding_test.go index 93f817170628..65e7c9de835b 100644 --- a/x/staking/keeper/unbonding_test.go +++ b/x/staking/keeper/unbonding_test.go @@ -5,6 +5,7 @@ import ( "cosmossdk.io/math" + addresscodec "github.com/cosmos/cosmos-sdk/codec/address" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/staking/testutil" "github.com/cosmos/cosmos-sdk/x/staking/types" @@ -82,6 +83,7 @@ func (s *KeeperTestSuite) TestUnbondingDelegationByUnbondingIDAccessors() { time.Unix(0, 0).UTC(), math.NewInt(5), 0, + addresscodec.NewBech32Codec("cosmosvaloper"), addresscodec.NewBech32Codec("cosmos"), ), }, { @@ -94,6 +96,7 @@ func (s *KeeperTestSuite) TestUnbondingDelegationByUnbondingIDAccessors() { time.Unix(0, 0).UTC(), math.NewInt(5), 0, + addresscodec.NewBech32Codec("cosmosvaloper"), addresscodec.NewBech32Codec("cosmos"), ), }, { @@ -106,6 +109,7 @@ func (s *KeeperTestSuite) TestUnbondingDelegationByUnbondingIDAccessors() { time.Unix(0, 0).UTC(), math.NewInt(5), 0, + addresscodec.NewBech32Codec("cosmosvaloper"), addresscodec.NewBech32Codec("cosmos"), ), }, } @@ -157,6 +161,7 @@ func (s *KeeperTestSuite) TestRedelegationByUnbondingIDAccessors() { math.NewInt(10), math.LegacyNewDec(10), 0, + addresscodec.NewBech32Codec("cosmosvaloper"), addresscodec.NewBech32Codec("cosmos"), ), }, { @@ -171,6 +176,7 @@ func (s *KeeperTestSuite) TestRedelegationByUnbondingIDAccessors() { math.NewInt(10), math.LegacyNewDec(10), 0, + addresscodec.NewBech32Codec("cosmosvaloper"), addresscodec.NewBech32Codec("cosmos"), ), }, { @@ -185,6 +191,7 @@ func (s *KeeperTestSuite) TestRedelegationByUnbondingIDAccessors() { math.NewInt(10), math.LegacyNewDec(10), 0, + addresscodec.NewBech32Codec("cosmosvaloper"), addresscodec.NewBech32Codec("cosmos"), ), }, } @@ -284,6 +291,7 @@ func (s *KeeperTestSuite) TestUnbondingCanComplete() { time.Unix(0, 0).UTC(), math.NewInt(5), unbondingID, + addresscodec.NewBech32Codec("cosmosvaloper"), addresscodec.NewBech32Codec("cosmos"), ) require.NoError(s.stakingKeeper.SetUnbondingDelegation(s.ctx, ubd)) require.NoError(s.stakingKeeper.SetUnbondingDelegationByUnbondingID(s.ctx, ubd, unbondingID)) @@ -311,6 +319,7 @@ func (s *KeeperTestSuite) TestUnbondingCanComplete() { math.NewInt(10), math.LegacyNewDec(10), unbondingID, + addresscodec.NewBech32Codec("cosmosvaloper"), addresscodec.NewBech32Codec("cosmos"), ) require.NoError(s.stakingKeeper.SetRedelegation(s.ctx, red)) require.NoError(s.stakingKeeper.SetRedelegationByUnbondingID(s.ctx, red, unbondingID)) diff --git a/x/staking/keeper/val_state_change.go b/x/staking/keeper/val_state_change.go index 43f1f463353d..af0e61cdf92f 100644 --- a/x/staking/keeper/val_state_change.go +++ b/x/staking/keeper/val_state_change.go @@ -9,6 +9,7 @@ import ( abci "github.com/cometbft/cometbft/abci/types" gogotypes "github.com/cosmos/gogoproto/types" + "cosmossdk.io/core/address" "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" @@ -46,7 +47,7 @@ func (k Keeper) BlockValidatorUpdates(ctx context.Context) ([]abci.ValidatorUpda } for _, dvPair := range matureUnbonds { - addr, err := sdk.ValAddressFromBech32(dvPair.ValidatorAddress) + addr, err := k.validatorAddressCodec.StringToBytes(dvPair.ValidatorAddress) if err != nil { return nil, err } @@ -77,11 +78,11 @@ func (k Keeper) BlockValidatorUpdates(ctx context.Context) ([]abci.ValidatorUpda } for _, dvvTriplet := range matureRedelegations { - valSrcAddr, err := sdk.ValAddressFromBech32(dvvTriplet.ValidatorSrcAddress) + valSrcAddr, err := k.validatorAddressCodec.StringToBytes(dvvTriplet.ValidatorSrcAddress) if err != nil { return nil, err } - valDstAddr, err := sdk.ValAddressFromBech32(dvvTriplet.ValidatorDstAddress) + valDstAddr, err := k.validatorAddressCodec.StringToBytes(dvvTriplet.ValidatorDstAddress) if err != nil { return nil, err } @@ -211,7 +212,7 @@ func (k Keeper) ApplyAndReturnValidatorSetUpdates(ctx context.Context) (updates totalPower = totalPower.Add(math.NewInt(newPower)) } - noLongerBonded, err := sortNoLongerBonded(last) + noLongerBonded, err := sortNoLongerBonded(last, k.validatorAddressCodec) if err != nil { return nil, err } @@ -472,13 +473,13 @@ func (k Keeper) getLastValidatorsByAddr(ctx context.Context) (validatorsByAddr, // given a map of remaining validators to previous bonded power // returns the list of validators to be unbonded, sorted by operator address -func sortNoLongerBonded(last validatorsByAddr) ([][]byte, error) { +func sortNoLongerBonded(last validatorsByAddr, ac address.Codec) ([][]byte, error) { // sort the map keys for determinism noLongerBonded := make([][]byte, len(last)) index := 0 for valAddrStr := range last { - valAddrBytes, err := sdk.ValAddressFromBech32(valAddrStr) + valAddrBytes, err := ac.StringToBytes(valAddrStr) if err != nil { return nil, err } diff --git a/x/staking/keeper/validator.go b/x/staking/keeper/validator.go index e92c49047157..4db228ec1ecb 100644 --- a/x/staking/keeper/validator.go +++ b/x/staking/keeper/validator.go @@ -1,6 +1,7 @@ package keeper import ( + "bytes" "context" "errors" "fmt" @@ -481,19 +482,19 @@ func (k Keeper) DeleteValidatorQueue(ctx context.Context, val types.Validator) e // since address string may change due to Bech32 prefix change, we parse the addresses into bytes // format for normalization - deletingAddr, err := sdk.ValAddressFromBech32(val.OperatorAddress) + deletingAddr, err := k.validatorAddressCodec.StringToBytes(val.OperatorAddress) if err != nil { return err } for _, addr := range addrs { - storedAddr, err := sdk.ValAddressFromBech32(addr) + storedAddr, err := k.validatorAddressCodec.StringToBytes(addr) if err != nil { // even if we don't error here, it will error in UnbondAllMatureValidators at unbond time return err } - if !storedAddr.Equals(deletingAddr) { - newAddrs = append(newAddrs, storedAddr.String()) + if !bytes.Equal(storedAddr, deletingAddr) { + newAddrs = append(newAddrs, addr) } } @@ -546,7 +547,7 @@ func (k Keeper) UnbondAllMatureValidators(ctx context.Context) error { } for _, valAddr := range addrs.Addresses { - addr, err := sdk.ValAddressFromBech32(valAddr) + addr, err := k.validatorAddressCodec.StringToBytes(valAddr) if err != nil { return err } diff --git a/x/staking/module.go b/x/staking/module.go index d1e6edfe6038..a90a2dc52ccc 100644 --- a/x/staking/module.go +++ b/x/staking/module.go @@ -90,8 +90,8 @@ func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *g } // GetTxCmd returns the root tx command for the staking module. -func (AppModuleBasic) GetTxCmd() *cobra.Command { - return cli.NewTxCmd() +func (amb AppModuleBasic) GetTxCmd() *cobra.Command { + return cli.NewTxCmd(amb.cdc.InterfaceRegistry().SigningContext().ValidatorAddressCodec(), amb.cdc.InterfaceRegistry().SigningContext().AddressCodec()) } // AppModule implements an application module for the staking module. diff --git a/x/staking/simulation/decoder_test.go b/x/staking/simulation/decoder_test.go index 8998b49f7c66..0179794929b1 100644 --- a/x/staking/simulation/decoder_test.go +++ b/x/staking/simulation/decoder_test.go @@ -9,6 +9,7 @@ import ( "cosmossdk.io/math" + "github.com/cosmos/cosmos-sdk/codec/address" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/kv" @@ -28,11 +29,11 @@ func TestDecodeStore(t *testing.T) { dec := simulation.NewDecodeStore(cdc) bondTime := time.Now().UTC() - val, err := types.NewValidator(valAddr1, delPk1, types.NewDescription("test", "test", "test", "test", "test")) + val, err := types.NewValidator(valAddr1.String(), delPk1, types.NewDescription("test", "test", "test", "test", "test")) require.NoError(t, err) del := types.NewDelegation(delAddr1.String(), valAddr1.String(), math.LegacyOneDec()) - ubd := types.NewUnbondingDelegation(delAddr1, valAddr1, 15, bondTime, math.OneInt(), 1) - red := types.NewRedelegation(delAddr1, valAddr1, valAddr1, 12, bondTime, math.OneInt(), math.LegacyOneDec(), 0) + ubd := types.NewUnbondingDelegation(delAddr1, valAddr1, 15, bondTime, math.OneInt(), 1, address.NewBech32Codec("cosmosvaloper"), address.NewBech32Codec("cosmos")) + red := types.NewRedelegation(delAddr1, valAddr1, valAddr1, 12, bondTime, math.OneInt(), math.LegacyOneDec(), 0, address.NewBech32Codec("cosmosvaloper"), address.NewBech32Codec("cosmos")) oneIntBz, err := math.OneInt().Marshal() require.NoError(t, err) diff --git a/x/staking/simulation/genesis.go b/x/staking/simulation/genesis.go index c2977e19e286..08cc7dd05c20 100644 --- a/x/staking/simulation/genesis.go +++ b/x/staking/simulation/genesis.go @@ -76,7 +76,7 @@ func RandomizedGenState(simState *module.SimulationState) { simulation.RandomDecAmount(simState.Rand, maxCommission), ) - validator, err := types.NewValidator(valAddr, simState.Accounts[i].ConsKey.PubKey(), types.Description{}) + validator, err := types.NewValidator(valAddr.String(), simState.Accounts[i].ConsKey.PubKey(), types.Description{}) if err != nil { panic(err) } diff --git a/x/staking/simulation/operations.go b/x/staking/simulation/operations.go index e5a15c6d409f..50ba0a27e4aa 100644 --- a/x/staking/simulation/operations.go +++ b/x/staking/simulation/operations.go @@ -170,7 +170,7 @@ func SimulateMsgCreateValidator( simtypes.RandomDecAmount(r, maxCommission), ) - msg, err := types.NewMsgCreateValidator(address, simAccount.ConsKey.PubKey(), selfDelegation, description, commission, math.OneInt()) + msg, err := types.NewMsgCreateValidator(address.String(), simAccount.ConsKey.PubKey(), selfDelegation, description, commission, math.OneInt()) if err != nil { return simtypes.NoOpMsg(types.ModuleName, sdk.MsgTypeURL(msg), "unable to create CreateValidator message"), nil, err } @@ -241,7 +241,7 @@ func SimulateMsgEditValidator( simtypes.RandStringOfLength(r, 10), ) - msg := types.NewMsgEditValidator(address, description, &newCommissionRate, nil) + msg := types.NewMsgEditValidator(address.String(), description, &newCommissionRate, nil) txCtx := simulation.OperationInput{ R: r, @@ -321,7 +321,7 @@ func SimulateMsgDelegate( } } - msg := types.NewMsgDelegate(simAccount.Address, val.GetOperator(), bondAmt) + msg := types.NewMsgDelegate(simAccount.Address.String(), val.GetOperator().String(), bondAmt) txCtx := simulation.OperationInput{ R: r, @@ -413,7 +413,7 @@ func SimulateMsgUndelegate( } msg := types.NewMsgUndelegate( - delAddrBz, valAddr, sdk.NewCoin(bondDenom, unbondAmt), + delAddr, valAddr.String(), sdk.NewCoin(bondDenom, unbondAmt), ) // need to retrieve the simulation account associated with delegation to retrieve PrivKey @@ -525,7 +525,7 @@ func SimulateMsgCancelUnbondingDelegate( } msg := types.NewMsgCancelUnbondingDelegation( - simAccount.Address, valAddr, unbondingDelegationEntry.CreationHeight, sdk.NewCoin(bondDenom, cancelBondAmt), + simAccount.Address.String(), valAddr.String(), unbondingDelegationEntry.CreationHeight, sdk.NewCoin(bondDenom, cancelBondAmt), ) spendable := bk.SpendableCoins(ctx, simAccount.Address) @@ -666,7 +666,7 @@ func SimulateMsgBeginRedelegate( } msg := types.NewMsgBeginRedelegate( - delAddrBz, srcAddr, destAddr, + delAddr, srcAddr.String(), destAddr.String(), sdk.NewCoin(bondDenom, redAmt), ) diff --git a/x/staking/testutil/helpers.go b/x/staking/testutil/helpers.go index 7ed64e46131b..2387952b6172 100644 --- a/x/staking/testutil/helpers.go +++ b/x/staking/testutil/helpers.go @@ -52,7 +52,7 @@ func (sh *Helper) CreateValidatorWithValPower(addr sdk.ValAddress, pk cryptotype // CreateValidatorMsg returns a message used to create validator in this service. func (sh *Helper) CreateValidatorMsg(addr sdk.ValAddress, pk cryptotypes.PubKey, stakeAmount math.Int) *stakingtypes.MsgCreateValidator { coin := sdk.NewCoin(sh.Denom, stakeAmount) - msg, err := stakingtypes.NewMsgCreateValidator(addr, pk, coin, stakingtypes.Description{}, sh.Commission, math.OneInt()) + msg, err := stakingtypes.NewMsgCreateValidator(addr.String(), pk, coin, stakingtypes.Description{}, sh.Commission, math.OneInt()) require.NoError(sh.t, err) return msg } @@ -63,7 +63,7 @@ func (sh *Helper) CreateValidatorWithMsg(ctx context.Context, msg *stakingtypes. } func (sh *Helper) createValidator(addr sdk.ValAddress, pk cryptotypes.PubKey, coin sdk.Coin, ok bool) { - msg, err := stakingtypes.NewMsgCreateValidator(addr, pk, coin, stakingtypes.Description{Moniker: "TestValidator"}, sh.Commission, math.OneInt()) + msg, err := stakingtypes.NewMsgCreateValidator(addr.String(), pk, coin, stakingtypes.Description{Moniker: "TestValidator"}, sh.Commission, math.OneInt()) require.NoError(sh.t, err) res, err := sh.msgSrvr.CreateValidator(sh.Ctx, msg) if ok { @@ -78,7 +78,7 @@ func (sh *Helper) createValidator(addr sdk.ValAddress, pk cryptotypes.PubKey, co // Delegate calls staking module staking module `MsgServer/Delegate` to delegate stake for a validator func (sh *Helper) Delegate(delegator sdk.AccAddress, val sdk.ValAddress, amount math.Int) { coin := sdk.NewCoin(sh.Denom, amount) - msg := stakingtypes.NewMsgDelegate(delegator, val, coin) + msg := stakingtypes.NewMsgDelegate(delegator.String(), val.String(), coin) res, err := sh.msgSrvr.Delegate(sh.Ctx, msg) require.NoError(sh.t, err) require.NotNil(sh.t, res) @@ -87,7 +87,7 @@ func (sh *Helper) Delegate(delegator sdk.AccAddress, val sdk.ValAddress, amount // DelegateWithPower calls staking module `MsgServer/Delegate` to delegate stake for a validator func (sh *Helper) DelegateWithPower(delegator sdk.AccAddress, val sdk.ValAddress, power int64) { coin := sdk.NewCoin(sh.Denom, sh.k.TokensFromConsensusPower(sh.Ctx, power)) - msg := stakingtypes.NewMsgDelegate(delegator, val, coin) + msg := stakingtypes.NewMsgDelegate(delegator.String(), val.String(), coin) res, err := sh.msgSrvr.Delegate(sh.Ctx, msg) require.NoError(sh.t, err) require.NotNil(sh.t, res) @@ -96,7 +96,7 @@ func (sh *Helper) DelegateWithPower(delegator sdk.AccAddress, val sdk.ValAddress // Undelegate calls staking module `MsgServer/Undelegate` to unbound some stake from a validator. func (sh *Helper) Undelegate(delegator sdk.AccAddress, val sdk.ValAddress, amount math.Int, ok bool) { unbondAmt := sdk.NewCoin(sh.Denom, amount) - msg := stakingtypes.NewMsgUndelegate(delegator, val, unbondAmt) + msg := stakingtypes.NewMsgUndelegate(delegator.String(), val.String(), unbondAmt) res, err := sh.msgSrvr.Undelegate(sh.Ctx, msg) if ok { require.NoError(sh.t, err) diff --git a/x/staking/testutil/validator.go b/x/staking/testutil/validator.go index fccecba4870f..b8c40beaba55 100644 --- a/x/staking/testutil/validator.go +++ b/x/staking/testutil/validator.go @@ -13,7 +13,7 @@ import ( // NewValidator is a testing helper method to create validators in tests func NewValidator(tb testing.TB, operator sdk.ValAddress, pubKey cryptotypes.PubKey) types.Validator { tb.Helper() - v, err := types.NewValidator(operator, pubKey, types.Description{}) + v, err := types.NewValidator(operator.String(), pubKey, types.Description{}) require.NoError(tb, err) return v } diff --git a/x/staking/types/authz_test.go b/x/staking/types/authz_test.go index 246fbc267523..ab382d8cf5e6 100644 --- a/x/staking/types/authz_test.go +++ b/x/staking/types/authz_test.go @@ -73,7 +73,7 @@ func TestAuthzAuthorizations(t *testing.T) { []sdk.ValAddress{}, stakingtypes.AuthorizationType_AUTHORIZATION_TYPE_DELEGATE, &coin100, - stakingtypes.NewMsgDelegate(delAddr, val1, coin100), + stakingtypes.NewMsgDelegate(delAddr.String(), val1.String(), coin100), false, true, nil, @@ -84,7 +84,7 @@ func TestAuthzAuthorizations(t *testing.T) { []sdk.ValAddress{}, stakingtypes.AuthorizationType_AUTHORIZATION_TYPE_DELEGATE, &coin100, - stakingtypes.NewMsgDelegate(delAddr, val1, coin150), + stakingtypes.NewMsgDelegate(delAddr.String(), val1.String(), coin150), true, false, nil, @@ -95,7 +95,7 @@ func TestAuthzAuthorizations(t *testing.T) { []sdk.ValAddress{}, stakingtypes.AuthorizationType_AUTHORIZATION_TYPE_DELEGATE, &coin100, - stakingtypes.NewMsgDelegate(delAddr, val1, coin50), + stakingtypes.NewMsgDelegate(delAddr.String(), val1.String(), coin50), false, false, &stakingtypes.StakeAuthorization{ @@ -110,7 +110,7 @@ func TestAuthzAuthorizations(t *testing.T) { []sdk.ValAddress{}, stakingtypes.AuthorizationType_AUTHORIZATION_TYPE_DELEGATE, &coin100, - stakingtypes.NewMsgDelegate(delAddr, val3, coin100), + stakingtypes.NewMsgDelegate(delAddr.String(), val3.String(), coin100), true, false, nil, @@ -121,7 +121,7 @@ func TestAuthzAuthorizations(t *testing.T) { []sdk.ValAddress{}, stakingtypes.AuthorizationType_AUTHORIZATION_TYPE_DELEGATE, nil, - stakingtypes.NewMsgDelegate(delAddr, val2, coin100), + stakingtypes.NewMsgDelegate(delAddr.String(), val2.String(), coin100), false, false, &stakingtypes.StakeAuthorization{ @@ -136,7 +136,7 @@ func TestAuthzAuthorizations(t *testing.T) { []sdk.ValAddress{val1}, stakingtypes.AuthorizationType_AUTHORIZATION_TYPE_DELEGATE, nil, - stakingtypes.NewMsgDelegate(delAddr, val1, coin100), + stakingtypes.NewMsgDelegate(delAddr.String(), val1.String(), coin100), true, false, nil, @@ -147,7 +147,7 @@ func TestAuthzAuthorizations(t *testing.T) { []sdk.ValAddress{val1}, stakingtypes.AuthorizationType_AUTHORIZATION_TYPE_DELEGATE, nil, - stakingtypes.NewMsgDelegate(delAddr, val2, coin100), + stakingtypes.NewMsgDelegate(delAddr.String(), val2.String(), coin100), false, false, &stakingtypes.StakeAuthorization{ @@ -162,7 +162,7 @@ func TestAuthzAuthorizations(t *testing.T) { []sdk.ValAddress{}, stakingtypes.AuthorizationType_AUTHORIZATION_TYPE_UNDELEGATE, &coin100, - stakingtypes.NewMsgUndelegate(delAddr, val1, coin100), + stakingtypes.NewMsgUndelegate(delAddr.String(), val1.String(), coin100), false, true, nil, @@ -173,7 +173,7 @@ func TestAuthzAuthorizations(t *testing.T) { []sdk.ValAddress{}, stakingtypes.AuthorizationType_AUTHORIZATION_TYPE_UNDELEGATE, &coin100, - stakingtypes.NewMsgUndelegate(delAddr, val1, coin50), + stakingtypes.NewMsgUndelegate(delAddr.String(), val1.String(), coin50), false, false, &stakingtypes.StakeAuthorization{ @@ -188,7 +188,7 @@ func TestAuthzAuthorizations(t *testing.T) { []sdk.ValAddress{}, stakingtypes.AuthorizationType_AUTHORIZATION_TYPE_UNDELEGATE, &coin100, - stakingtypes.NewMsgUndelegate(delAddr, val3, coin100), + stakingtypes.NewMsgUndelegate(delAddr.String(), val3.String(), coin100), true, false, nil, @@ -199,7 +199,7 @@ func TestAuthzAuthorizations(t *testing.T) { []sdk.ValAddress{}, stakingtypes.AuthorizationType_AUTHORIZATION_TYPE_UNDELEGATE, nil, - stakingtypes.NewMsgUndelegate(delAddr, val2, coin100), + stakingtypes.NewMsgUndelegate(delAddr.String(), val2.String(), coin100), false, false, &stakingtypes.StakeAuthorization{ @@ -214,7 +214,7 @@ func TestAuthzAuthorizations(t *testing.T) { []sdk.ValAddress{val1}, stakingtypes.AuthorizationType_AUTHORIZATION_TYPE_UNDELEGATE, &coin100, - stakingtypes.NewMsgUndelegate(delAddr, val1, coin100), + stakingtypes.NewMsgUndelegate(delAddr.String(), val1.String(), coin100), true, false, nil, @@ -226,7 +226,7 @@ func TestAuthzAuthorizations(t *testing.T) { []sdk.ValAddress{}, stakingtypes.AuthorizationType_AUTHORIZATION_TYPE_REDELEGATE, &coin100, - stakingtypes.NewMsgUndelegate(delAddr, val1, coin100), + stakingtypes.NewMsgUndelegate(delAddr.String(), val1.String(), coin100), false, true, nil, @@ -237,7 +237,7 @@ func TestAuthzAuthorizations(t *testing.T) { []sdk.ValAddress{}, stakingtypes.AuthorizationType_AUTHORIZATION_TYPE_REDELEGATE, &coin100, - stakingtypes.NewMsgBeginRedelegate(delAddr, val1, val1, coin50), + stakingtypes.NewMsgBeginRedelegate(delAddr.String(), val1.String(), val1.String(), coin50), false, false, &stakingtypes.StakeAuthorization{ @@ -252,7 +252,7 @@ func TestAuthzAuthorizations(t *testing.T) { []sdk.ValAddress{}, stakingtypes.AuthorizationType_AUTHORIZATION_TYPE_REDELEGATE, &coin100, - stakingtypes.NewMsgBeginRedelegate(delAddr, val3, val3, coin100), + stakingtypes.NewMsgBeginRedelegate(delAddr.String(), val3.String(), val3.String(), coin100), true, false, nil, @@ -263,7 +263,7 @@ func TestAuthzAuthorizations(t *testing.T) { []sdk.ValAddress{}, stakingtypes.AuthorizationType_AUTHORIZATION_TYPE_REDELEGATE, nil, - stakingtypes.NewMsgBeginRedelegate(delAddr, val2, val2, coin100), + stakingtypes.NewMsgBeginRedelegate(delAddr.String(), val2.String(), val2.String(), coin100), false, false, &stakingtypes.StakeAuthorization{ @@ -278,7 +278,7 @@ func TestAuthzAuthorizations(t *testing.T) { []sdk.ValAddress{val1}, stakingtypes.AuthorizationType_AUTHORIZATION_TYPE_REDELEGATE, &coin100, - stakingtypes.NewMsgBeginRedelegate(delAddr, val1, val1, coin100), + stakingtypes.NewMsgBeginRedelegate(delAddr.String(), val1.String(), val1.String(), coin100), true, false, nil, @@ -289,7 +289,7 @@ func TestAuthzAuthorizations(t *testing.T) { []sdk.ValAddress{}, stakingtypes.AuthorizationType_AUTHORIZATION_TYPE_CANCEL_UNBONDING_DELEGATION, &coin100, - stakingtypes.NewMsgCancelUnbondingDelegation(delAddr, val1, ctx.HeaderInfo().Height, coin100), + stakingtypes.NewMsgCancelUnbondingDelegation(delAddr.String(), val1.String(), ctx.HeaderInfo().Height, coin100), false, true, nil, @@ -300,7 +300,7 @@ func TestAuthzAuthorizations(t *testing.T) { []sdk.ValAddress{}, stakingtypes.AuthorizationType_AUTHORIZATION_TYPE_CANCEL_UNBONDING_DELEGATION, &coin100, - stakingtypes.NewMsgCancelUnbondingDelegation(delAddr, val1, ctx.HeaderInfo().Height, coin50), + stakingtypes.NewMsgCancelUnbondingDelegation(delAddr.String(), val1.String(), ctx.HeaderInfo().Height, coin50), false, false, &stakingtypes.StakeAuthorization{ @@ -317,7 +317,7 @@ func TestAuthzAuthorizations(t *testing.T) { []sdk.ValAddress{}, stakingtypes.AuthorizationType_AUTHORIZATION_TYPE_CANCEL_UNBONDING_DELEGATION, &coin100, - stakingtypes.NewMsgCancelUnbondingDelegation(delAddr, val3, ctx.HeaderInfo().Height, coin50), + stakingtypes.NewMsgCancelUnbondingDelegation(delAddr.String(), val3.String(), ctx.HeaderInfo().Height, coin50), true, false, nil, @@ -328,7 +328,7 @@ func TestAuthzAuthorizations(t *testing.T) { []sdk.ValAddress{}, stakingtypes.AuthorizationType_AUTHORIZATION_TYPE_CANCEL_UNBONDING_DELEGATION, nil, - stakingtypes.NewMsgCancelUnbondingDelegation(delAddr, val2, ctx.HeaderInfo().Height, coin100), + stakingtypes.NewMsgCancelUnbondingDelegation(delAddr.String(), val2.String(), ctx.HeaderInfo().Height, coin100), false, false, &stakingtypes.StakeAuthorization{ @@ -345,7 +345,7 @@ func TestAuthzAuthorizations(t *testing.T) { []sdk.ValAddress{val1}, stakingtypes.AuthorizationType_AUTHORIZATION_TYPE_CANCEL_UNBONDING_DELEGATION, &coin100, - stakingtypes.NewMsgCancelUnbondingDelegation(delAddr, val1, ctx.HeaderInfo().Height, coin100), + stakingtypes.NewMsgCancelUnbondingDelegation(delAddr.String(), val1.String(), ctx.HeaderInfo().Height, coin100), true, false, nil, diff --git a/x/staking/types/delegation.go b/x/staking/types/delegation.go index 3ebf5e6bb893..3284316246f8 100644 --- a/x/staking/types/delegation.go +++ b/x/staking/types/delegation.go @@ -5,6 +5,7 @@ import ( "strings" "time" + "cosmossdk.io/core/address" "cosmossdk.io/math" "github.com/cosmos/cosmos-sdk/codec" @@ -111,10 +112,19 @@ func UnmarshalUBDE(cdc codec.BinaryCodec, value []byte) (ubd UnbondingDelegation func NewUnbondingDelegation( delegatorAddr sdk.AccAddress, validatorAddr sdk.ValAddress, creationHeight int64, minTime time.Time, balance math.Int, id uint64, + valAc, delAc address.Codec, ) UnbondingDelegation { + valAddr, err := valAc.BytesToString(validatorAddr) + if err != nil { + panic(err) + } + delAddr, err := delAc.BytesToString(delegatorAddr) + if err != nil { + panic(err) + } return UnbondingDelegation{ - DelegatorAddress: delegatorAddr.String(), - ValidatorAddress: validatorAddr.String(), + DelegatorAddress: delAddr, + ValidatorAddress: valAddr, Entries: []UnbondingDelegationEntry{ NewUnbondingDelegationEntry(creationHeight, minTime, balance, id), }, @@ -208,11 +218,25 @@ func (e RedelegationEntry) OnHold() bool { func NewRedelegation( delegatorAddr sdk.AccAddress, validatorSrcAddr, validatorDstAddr sdk.ValAddress, creationHeight int64, minTime time.Time, balance math.Int, sharesDst math.LegacyDec, id uint64, + valAc, delAc address.Codec, ) Redelegation { + valSrcAddr, err := valAc.BytesToString(validatorSrcAddr) + if err != nil { + panic(err) + } + valDstAddr, err := valAc.BytesToString(validatorDstAddr) + if err != nil { + panic(err) + } + delAddr, err := delAc.BytesToString(delegatorAddr) + if err != nil { + panic(err) + } + return Redelegation{ - DelegatorAddress: delegatorAddr.String(), - ValidatorSrcAddress: validatorSrcAddr.String(), - ValidatorDstAddress: validatorDstAddr.String(), + DelegatorAddress: delAddr, + ValidatorSrcAddress: valSrcAddr, + ValidatorDstAddress: valDstAddr, Entries: []RedelegationEntry{ NewRedelegationEntry(creationHeight, minTime, balance, sharesDst, id), }, @@ -303,13 +327,13 @@ func (d DelegationResponses) String() (out string) { // NewRedelegationResponse crates a new RedelegationEntryResponse instance. func NewRedelegationResponse( - delegatorAddr sdk.AccAddress, validatorSrc, validatorDst sdk.ValAddress, entries []RedelegationEntryResponse, + delegatorAddr, validatorSrc, validatorDst string, entries []RedelegationEntryResponse, ) RedelegationResponse { return RedelegationResponse{ Redelegation: Redelegation{ - DelegatorAddress: delegatorAddr.String(), - ValidatorSrcAddress: validatorSrc.String(), - ValidatorDstAddress: validatorDst.String(), + DelegatorAddress: delegatorAddr, + ValidatorSrcAddress: validatorSrc, + ValidatorDstAddress: validatorDst, }, Entries: entries, } diff --git a/x/staking/types/delegation_test.go b/x/staking/types/delegation_test.go index 027ff9855262..3ce9d8b6c535 100644 --- a/x/staking/types/delegation_test.go +++ b/x/staking/types/delegation_test.go @@ -11,6 +11,7 @@ import ( "cosmossdk.io/math" "github.com/cosmos/cosmos-sdk/codec" + addresscodec "github.com/cosmos/cosmos-sdk/codec/address" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/staking/types" ) @@ -36,7 +37,7 @@ func TestDelegationString(t *testing.T) { func TestUnbondingDelegationEqual(t *testing.T) { ubd1 := types.NewUnbondingDelegation(sdk.AccAddress(valAddr1), valAddr2, 0, - time.Unix(0, 0), math.NewInt(0), 1) + time.Unix(0, 0), math.NewInt(0), 1, addresscodec.NewBech32Codec("cosmosvaloper"), addresscodec.NewBech32Codec("cosmos")) ubd2 := ubd1 ok := ubd1.String() == ubd2.String() @@ -51,7 +52,7 @@ func TestUnbondingDelegationEqual(t *testing.T) { func TestUnbondingDelegationString(t *testing.T) { ubd := types.NewUnbondingDelegation(sdk.AccAddress(valAddr1), valAddr2, 0, - time.Unix(0, 0), math.NewInt(0), 1) + time.Unix(0, 0), math.NewInt(0), 1, addresscodec.NewBech32Codec("cosmosvaloper"), addresscodec.NewBech32Codec("cosmos")) require.NotEmpty(t, ubd.String()) } @@ -59,10 +60,10 @@ func TestUnbondingDelegationString(t *testing.T) { func TestRedelegationEqual(t *testing.T) { r1 := types.NewRedelegation(sdk.AccAddress(valAddr1), valAddr2, valAddr3, 0, time.Unix(0, 0), math.NewInt(0), - math.LegacyNewDec(0), 1) + math.LegacyNewDec(0), 1, addresscodec.NewBech32Codec("cosmosvaloper"), addresscodec.NewBech32Codec("cosmos")) r2 := types.NewRedelegation(sdk.AccAddress(valAddr1), valAddr2, valAddr3, 0, time.Unix(0, 0), math.NewInt(0), - math.LegacyNewDec(0), 1) + math.LegacyNewDec(0), 1, addresscodec.NewBech32Codec("cosmosvaloper"), addresscodec.NewBech32Codec("cosmos")) require.True(t, proto.Equal(&r1, &r2)) r2.Entries[0].SharesDst = math.LegacyNewDec(10) @@ -73,7 +74,7 @@ func TestRedelegationEqual(t *testing.T) { func TestRedelegationString(t *testing.T) { r := types.NewRedelegation(sdk.AccAddress(valAddr1), valAddr2, valAddr3, 0, time.Unix(0, 0), math.NewInt(0), - math.LegacyNewDec(10), 1) + math.LegacyNewDec(10), 1, addresscodec.NewBech32Codec("cosmosvaloper"), addresscodec.NewBech32Codec("cosmos")) require.NotEmpty(t, r.String()) } @@ -113,8 +114,8 @@ func TestRedelegationResponses(t *testing.T) { types.NewRedelegationEntryResponse(0, time.Unix(0, 0), math.LegacyNewDec(5), math.NewInt(5), math.NewInt(5), 0), types.NewRedelegationEntryResponse(0, time.Unix(0, 0), math.LegacyNewDec(5), math.NewInt(5), math.NewInt(5), 0), } - rdr1 := types.NewRedelegationResponse(sdk.AccAddress(valAddr1), valAddr2, valAddr3, entries) - rdr2 := types.NewRedelegationResponse(sdk.AccAddress(valAddr2), valAddr1, valAddr3, entries) + rdr1 := types.NewRedelegationResponse(sdk.AccAddress(valAddr1).String(), valAddr2.String(), valAddr3.String(), entries) + rdr2 := types.NewRedelegationResponse(sdk.AccAddress(valAddr2).String(), valAddr1.String(), valAddr3.String(), entries) rdrs := types.RedelegationResponses{rdr1, rdr2} bz1, err := json.Marshal(rdr1) diff --git a/x/staking/types/msg.go b/x/staking/types/msg.go index 09744a69d23f..0119bc82adcc 100644 --- a/x/staking/types/msg.go +++ b/x/staking/types/msg.go @@ -1,6 +1,7 @@ package types import ( + "cosmossdk.io/core/address" errorsmod "cosmossdk.io/errors" "cosmossdk.io/math" @@ -24,7 +25,7 @@ var ( // NewMsgCreateValidator creates a new MsgCreateValidator instance. // Delegator address and validator address are the same. func NewMsgCreateValidator( - valAddr sdk.ValAddress, pubKey cryptotypes.PubKey, + valAddr string, pubKey cryptotypes.PubKey, selfDelegation sdk.Coin, description Description, commission CommissionRates, minSelfDelegation math.Int, ) (*MsgCreateValidator, error) { var pkAny *codectypes.Any @@ -36,7 +37,7 @@ func NewMsgCreateValidator( } return &MsgCreateValidator{ Description: description, - ValidatorAddress: valAddr.String(), + ValidatorAddress: valAddr, Pubkey: pkAny, Value: selfDelegation, Commission: commission, @@ -45,9 +46,9 @@ func NewMsgCreateValidator( } // Validate validates the MsgCreateValidator sdk msg. -func (msg MsgCreateValidator) Validate() error { +func (msg MsgCreateValidator) Validate(ac address.Codec) error { // note that unmarshaling from bech32 ensures both non-empty and valid - _, err := sdk.ValAddressFromBech32(msg.ValidatorAddress) + _, err := ac.StringToBytes(msg.ValidatorAddress) if err != nil { return sdkerrors.ErrInvalidAddress.Wrapf("invalid validator address: %s", err) } @@ -93,50 +94,50 @@ func (msg MsgCreateValidator) UnpackInterfaces(unpacker codectypes.AnyUnpacker) } // NewMsgEditValidator creates a new MsgEditValidator instance -func NewMsgEditValidator(valAddr sdk.ValAddress, description Description, newRate *math.LegacyDec, newMinSelfDelegation *math.Int) *MsgEditValidator { +func NewMsgEditValidator(valAddr string, description Description, newRate *math.LegacyDec, newMinSelfDelegation *math.Int) *MsgEditValidator { return &MsgEditValidator{ Description: description, CommissionRate: newRate, - ValidatorAddress: valAddr.String(), + ValidatorAddress: valAddr, MinSelfDelegation: newMinSelfDelegation, } } // NewMsgDelegate creates a new MsgDelegate instance. -func NewMsgDelegate(delAddr sdk.AccAddress, valAddr sdk.ValAddress, amount sdk.Coin) *MsgDelegate { +func NewMsgDelegate(delAddr, valAddr string, amount sdk.Coin) *MsgDelegate { return &MsgDelegate{ - DelegatorAddress: delAddr.String(), - ValidatorAddress: valAddr.String(), + DelegatorAddress: delAddr, + ValidatorAddress: valAddr, Amount: amount, } } // NewMsgBeginRedelegate creates a new MsgBeginRedelegate instance. func NewMsgBeginRedelegate( - delAddr sdk.AccAddress, valSrcAddr, valDstAddr sdk.ValAddress, amount sdk.Coin, + delAddr, valSrcAddr, valDstAddr string, amount sdk.Coin, ) *MsgBeginRedelegate { return &MsgBeginRedelegate{ - DelegatorAddress: delAddr.String(), - ValidatorSrcAddress: valSrcAddr.String(), - ValidatorDstAddress: valDstAddr.String(), + DelegatorAddress: delAddr, + ValidatorSrcAddress: valSrcAddr, + ValidatorDstAddress: valDstAddr, Amount: amount, } } // NewMsgUndelegate creates a new MsgUndelegate instance. -func NewMsgUndelegate(delAddr sdk.AccAddress, valAddr sdk.ValAddress, amount sdk.Coin) *MsgUndelegate { +func NewMsgUndelegate(delAddr, valAddr string, amount sdk.Coin) *MsgUndelegate { return &MsgUndelegate{ - DelegatorAddress: delAddr.String(), - ValidatorAddress: valAddr.String(), + DelegatorAddress: delAddr, + ValidatorAddress: valAddr, Amount: amount, } } // NewMsgCancelUnbondingDelegation creates a new MsgCancelUnbondingDelegation instance. -func NewMsgCancelUnbondingDelegation(delAddr sdk.AccAddress, valAddr sdk.ValAddress, creationHeight int64, amount sdk.Coin) *MsgCancelUnbondingDelegation { +func NewMsgCancelUnbondingDelegation(delAddr, valAddr string, creationHeight int64, amount sdk.Coin) *MsgCancelUnbondingDelegation { return &MsgCancelUnbondingDelegation{ - DelegatorAddress: delAddr.String(), - ValidatorAddress: valAddr.String(), + DelegatorAddress: delAddr, + ValidatorAddress: valAddr, Amount: amount, CreationHeight: creationHeight, } diff --git a/x/staking/types/msg_test.go b/x/staking/types/msg_test.go index 5d58fef1811a..23f5047de186 100644 --- a/x/staking/types/msg_test.go +++ b/x/staking/types/msg_test.go @@ -36,7 +36,7 @@ func TestMsgDecode(t *testing.T) { // now let's try to serialize the whole message commission1 := types.NewCommissionRates(math.LegacyZeroDec(), math.LegacyZeroDec(), math.LegacyZeroDec()) - msg, err := types.NewMsgCreateValidator(valAddr1, pk1, coinPos, types.Description{}, commission1, math.OneInt()) + msg, err := types.NewMsgCreateValidator(valAddr1.String(), pk1, coinPos, types.Description{}, commission1, math.OneInt()) require.NoError(t, err) msgSerialized, err := cdc.MarshalInterface(msg) require.NoError(t, err) diff --git a/x/staking/types/validator.go b/x/staking/types/validator.go index 8599d791dcf0..59fb78af07bd 100644 --- a/x/staking/types/validator.go +++ b/x/staking/types/validator.go @@ -40,14 +40,14 @@ var ( var _ ValidatorI = Validator{} // NewValidator constructs a new Validator -func NewValidator(operator sdk.ValAddress, pubKey cryptotypes.PubKey, description Description) (Validator, error) { +func NewValidator(operator string, pubKey cryptotypes.PubKey, description Description) (Validator, error) { pkAny, err := codectypes.NewAnyWithValue(pubKey) if err != nil { return Validator{}, err } return Validator{ - OperatorAddress: operator.String(), + OperatorAddress: operator, ConsensusPubkey: pkAny, Jailed: false, Status: Unbonded, diff --git a/x/staking/types/validator_test.go b/x/staking/types/validator_test.go index cbc16bb8eea6..f8f031789016 100644 --- a/x/staking/types/validator_test.go +++ b/x/staking/types/validator_test.go @@ -346,7 +346,7 @@ func mkValidator(tokens int64, shares math.LegacyDec) types.Validator { // Creates a new validators and asserts the error check. func newValidator(t *testing.T, operator sdk.ValAddress, pubKey cryptotypes.PubKey) types.Validator { t.Helper() - v, err := types.NewValidator(operator, pubKey, types.Description{}) + v, err := types.NewValidator(operator.String(), pubKey, types.Description{}) require.NoError(t, err) return v }