From 16ab635645c9aade7909c9e4ee1cac9acd111ff7 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 19 Jul 2023 16:02:28 +0200 Subject: [PATCH] refactor(staking): use validator & address codecs in staking (backport #16958) (#17066) Co-authored-by: Marko Co-authored-by: Julien Robert --- CHANGELOG.md | 3 +- api/cosmos/staking/v1beta1/staking.pulsar.go | 8 +-- proto/cosmos/staking/v1beta1/staking.proto | 12 ++--- tests/e2e/distribution/grpc_query_suite.go | 2 +- .../distribution/keeper/grpc_query_test.go | 2 +- .../distribution/keeper/msg_server_test.go | 8 +-- .../staking/keeper/delegation_test.go | 2 +- .../integration/staking/keeper/slash_test.go | 6 +-- .../staking/keeper/unbonding_test.go | 2 +- .../staking/keeper/validator_bench_test.go | 28 ++++++++--- testutil/sims/app_helpers.go | 2 +- x/distribution/keeper/delegation.go | 44 ++++++++++++----- x/distribution/keeper/delegation_test.go | 37 ++++++++++---- x/distribution/keeper/grpc_query.go | 10 ++-- x/distribution/keeper/invariants.go | 10 ++-- x/distribution/simulation/operations.go | 6 ++- x/distribution/simulation/operations_test.go | 5 +- .../testutil/expected_keepers_mocks.go | 14 ++++++ x/distribution/testutil/staking_helper.go | 2 +- x/distribution/types/expected_keepers.go | 1 + x/distribution/types/query.go | 4 +- x/gov/keeper/tally.go | 2 +- x/slashing/abci_test.go | 10 ++-- x/slashing/keeper/msg_server_test.go | 8 +-- x/slashing/simulation/operations_test.go | 7 +-- x/staking/keeper/delegation.go | 49 +++++++++++++------ x/staking/keeper/delegation_test.go | 46 ++++++++--------- x/staking/keeper/genesis.go | 9 +++- x/staking/keeper/grpc_query.go | 22 ++++++--- x/staking/keeper/invariants.go | 2 +- x/staking/keeper/msg_server.go | 2 +- x/staking/keeper/msg_server_test.go | 6 +-- x/staking/keeper/query_utils.go | 14 +++++- x/staking/migrations/v5/migrations_test.go | 2 +- x/staking/simulation/decoder_test.go | 2 +- x/staking/simulation/genesis.go | 2 +- x/staking/simulation/operations.go | 28 +++++++---- x/staking/simulation/operations_test.go | 6 +-- x/staking/types/delegation.go | 22 +++------ x/staking/types/delegation_test.go | 8 +-- x/staking/types/exported.go | 6 +-- x/staking/types/staking.pb.go | 8 +-- 42 files changed, 302 insertions(+), 167 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 77527c70dcad..a08c1aa86e29 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -137,7 +137,8 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### API Breaking Changes -* (staking) [#16959](https://github.com/cosmos/cosmos-sdk/pull/16959) Add validator and consensus address codec as staking keeper arguments. +* (x/staking) [#16958](https://github.com/cosmos/cosmos-sdk/pull/16958) DelegationI interface `GetDelegatorAddr` & `GetValidatorAddr` have been migrated to return string instead of sdk.AccAddress and sdk.ValAddress respectively. stakingtypes.NewDelegation takes a string instead of sdk.AccAddress and sdk.ValAddress. +* (x/staking) [#16959](https://github.com/cosmos/cosmos-sdk/pull/16959) Add validator and consensus address codec as staking keeper arguments. * (types) [#16272](https://github.com/cosmos/cosmos-sdk/pull/16272) `FeeGranter` in the `FeeTx` interface returns `[]byte` instead of `string`. * (testutil) [#16899](https://github.com/cosmos/cosmos-sdk/pull/16899) The *cli testutil* `QueryBalancesExec` has been removed. Use the gRPC or REST query instead. * (x/auth) [#16650](https://github.com/cosmos/cosmos-sdk/pull/16650) The *cli testutil* `QueryAccountExec` has been removed. Use the gRPC or REST query instead. diff --git a/api/cosmos/staking/v1beta1/staking.pulsar.go b/api/cosmos/staking/v1beta1/staking.pulsar.go index a1597d175f5e..9ec8314f45ca 100644 --- a/api/cosmos/staking/v1beta1/staking.pulsar.go +++ b/api/cosmos/staking/v1beta1/staking.pulsar.go @@ -13395,9 +13395,9 @@ type Delegation struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // delegator_address is the bech32-encoded address of the delegator. + // delegator_address is the encoded address of the delegator. DelegatorAddress string `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty"` - // validator_address is the bech32-encoded address of the validator. + // validator_address is the encoded address of the validator. ValidatorAddress string `protobuf:"bytes,2,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty"` // shares define the delegation shares received. Shares string `protobuf:"bytes,3,opt,name=shares,proto3" json:"shares,omitempty"` @@ -13451,9 +13451,9 @@ type UnbondingDelegation struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // delegator_address is the bech32-encoded address of the delegator. + // delegator_address is the encoded address of the delegator. DelegatorAddress string `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty"` - // validator_address is the bech32-encoded address of the validator. + // validator_address is the encoded address of the validator. ValidatorAddress string `protobuf:"bytes,2,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty"` // entries are the unbonding delegation entries. Entries []*UnbondingDelegationEntry `protobuf:"bytes,3,rep,name=entries,proto3" json:"entries,omitempty"` // unbonding delegation entries diff --git a/proto/cosmos/staking/v1beta1/staking.proto b/proto/cosmos/staking/v1beta1/staking.proto index b1946fa17353..583f453b754f 100644 --- a/proto/cosmos/staking/v1beta1/staking.proto +++ b/proto/cosmos/staking/v1beta1/staking.proto @@ -196,9 +196,9 @@ message Delegation { option (gogoproto.equal) = false; option (gogoproto.goproto_getters) = false; - // delegator_address is the bech32-encoded address of the delegator. + // delegator_address is the encoded address of the delegator. string delegator_address = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; - // validator_address is the bech32-encoded address of the validator. + // validator_address is the encoded address of the validator. string validator_address = 2 [(cosmos_proto.scalar) = "cosmos.ValidatorAddressString"]; // shares define the delegation shares received. string shares = 3 [ @@ -214,13 +214,13 @@ message UnbondingDelegation { option (gogoproto.equal) = false; option (gogoproto.goproto_getters) = false; - // delegator_address is the bech32-encoded address of the delegator. + // delegator_address is the encoded address of the delegator. string delegator_address = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; - // validator_address is the bech32-encoded address of the validator. + // validator_address is the encoded address of the validator. string validator_address = 2 [(cosmos_proto.scalar) = "cosmos.ValidatorAddressString"]; // entries are the unbonding delegation entries. repeated UnbondingDelegationEntry entries = 3 - [(gogoproto.nullable) = false, (amino.dont_omitempty) = true]; // unbonding delegation entries + [(gogoproto.nullable) = false, (amino.dont_omitempty) = true]; // unbonding delegation entries } // UnbondingDelegationEntry defines an unbonding object with relevant metadata. @@ -293,7 +293,7 @@ message Redelegation { string validator_dst_address = 3 [(cosmos_proto.scalar) = "cosmos.ValidatorAddressString"]; // entries are the redelegation entries. repeated RedelegationEntry entries = 4 - [(gogoproto.nullable) = false, (amino.dont_omitempty) = true]; // redelegation entries + [(gogoproto.nullable) = false, (amino.dont_omitempty) = true]; // redelegation entries } // Params defines the parameters for the x/staking module. diff --git a/tests/e2e/distribution/grpc_query_suite.go b/tests/e2e/distribution/grpc_query_suite.go index a397a5e06054..6d40625d7e57 100644 --- a/tests/e2e/distribution/grpc_query_suite.go +++ b/tests/e2e/distribution/grpc_query_suite.go @@ -312,7 +312,7 @@ func (s *GRPCQueryTestSuite) TestQueryDelegatorRewardsGRPC() { &types.QueryDelegationTotalRewardsResponse{}, &types.QueryDelegationTotalRewardsResponse{ Rewards: []types.DelegationDelegatorReward{ - types.NewDelegationDelegatorReward(val.ValAddress, rewards), + types.NewDelegationDelegatorReward(val.ValAddress.String(), rewards), }, Total: rewards, }, diff --git a/tests/integration/distribution/keeper/grpc_query_test.go b/tests/integration/distribution/keeper/grpc_query_test.go index efcb0f882c75..603b67e0c76b 100644 --- a/tests/integration/distribution/keeper/grpc_query_test.go +++ b/tests/integration/distribution/keeper/grpc_query_test.go @@ -508,7 +508,7 @@ func TestGRPCDelegationRewards(t *testing.T) { // setup delegation delTokens := sdk.TokensFromConsensusPower(2, sdk.DefaultPowerReduction) validator, issuedShares := val.AddTokensFromDel(delTokens) - delegation := stakingtypes.NewDelegation(delAddr, f.valAddr, issuedShares) + delegation := stakingtypes.NewDelegation(delAddr.String(), f.valAddr.String(), issuedShares) assert.NilError(t, f.stakingKeeper.SetDelegation(f.sdkCtx, delegation)) assert.NilError(t, f.distrKeeper.SetDelegatorStartingInfo(f.sdkCtx, validator.GetOperator(), delAddr, types.NewDelegatorStartingInfo(2, math.LegacyNewDec(initialStake), 20))) diff --git a/tests/integration/distribution/keeper/msg_server_test.go b/tests/integration/distribution/keeper/msg_server_test.go index 1260dc1b0ad7..bd4710203bf1 100644 --- a/tests/integration/distribution/keeper/msg_server_test.go +++ b/tests/integration/distribution/keeper/msg_server_test.go @@ -194,10 +194,10 @@ func TestMsgWithdrawDelegatorReward(t *testing.T) { // setup delegation delTokens := sdk.TokensFromConsensusPower(2, sdk.DefaultPowerReduction) validator, issuedShares := validator.AddTokensFromDel(delTokens) - delegation := stakingtypes.NewDelegation(delAddr, validator.GetOperator(), issuedShares) - assert.NilError(t, f.stakingKeeper.SetDelegation(f.sdkCtx, delegation)) - err = f.distrKeeper.SetDelegatorStartingInfo(f.sdkCtx, validator.GetOperator(), delAddr, distrtypes.NewDelegatorStartingInfo(2, math.LegacyOneDec(), 20)) - require.NoError(t, err) + + delegation := stakingtypes.NewDelegation(delAddr.String(), validator.GetOperator().String(), issuedShares) + require.NoError(t, f.stakingKeeper.SetDelegation(f.sdkCtx, delegation)) + require.NoError(t, f.distrKeeper.SetDelegatorStartingInfo(f.sdkCtx, validator.GetOperator(), delAddr, distrtypes.NewDelegatorStartingInfo(2, math.LegacyOneDec(), 20))) // setup validator rewards decCoins := sdk.DecCoins{sdk.NewDecCoinFromDec(sdk.DefaultBondDenom, math.LegacyOneDec())} historicalRewards := distrtypes.NewValidatorHistoricalRewards(decCoins, 2) diff --git a/tests/integration/staking/keeper/delegation_test.go b/tests/integration/staking/keeper/delegation_test.go index 4f1a64032b01..a68c68ee13e9 100644 --- a/tests/integration/staking/keeper/delegation_test.go +++ b/tests/integration/staking/keeper/delegation_test.go @@ -51,7 +51,7 @@ func TestUnbondingDelegationsMaxEntries(t *testing.T) { assert.Assert(math.IntEq(t, startTokens, validator.BondedTokens())) assert.Assert(t, validator.IsBonded()) - delegation := types.NewDelegation(addrDel, addrVal, issuedShares) + delegation := types.NewDelegation(addrDel.String(), addrVal.String(), issuedShares) assert.NilError(t, f.stakingKeeper.SetDelegation(ctx, delegation)) maxEntries, err := f.stakingKeeper.MaxEntries(ctx) diff --git a/tests/integration/staking/keeper/slash_test.go b/tests/integration/staking/keeper/slash_test.go index 2d6aec0840be..caed3a8da496 100644 --- a/tests/integration/staking/keeper/slash_test.go +++ b/tests/integration/staking/keeper/slash_test.go @@ -125,7 +125,7 @@ func TestSlashRedelegation(t *testing.T) { assert.NilError(t, f.stakingKeeper.SetRedelegation(f.sdkCtx, rd)) // set the associated delegation - del := types.NewDelegation(addrDels[0], addrVals[1], math.LegacyNewDec(10)) + del := types.NewDelegation(addrDels[0].String(), addrVals[1].String(), math.LegacyNewDec(10)) assert.NilError(t, f.stakingKeeper.SetDelegation(f.sdkCtx, del)) // started redelegating prior to the current height, stake didn't contribute to infraction @@ -392,7 +392,7 @@ func TestSlashWithRedelegation(t *testing.T) { assert.NilError(t, f.stakingKeeper.SetRedelegation(f.sdkCtx, rd)) // set the associated delegation - del := types.NewDelegation(addrDels[0], addrVals[1], math.LegacyNewDecFromInt(rdTokens)) + del := types.NewDelegation(addrDels[0].String(), addrVals[1].String(), math.LegacyNewDecFromInt(rdTokens)) assert.NilError(t, f.stakingKeeper.SetDelegation(f.sdkCtx, del)) // update bonded tokens @@ -550,7 +550,7 @@ func TestSlashBoth(t *testing.T) { assert.NilError(t, f.stakingKeeper.SetRedelegation(f.sdkCtx, rdA)) // set the associated delegation - delA := types.NewDelegation(addrDels[0], addrVals[1], math.LegacyNewDecFromInt(rdATokens)) + delA := types.NewDelegation(addrDels[0].String(), addrVals[1].String(), math.LegacyNewDecFromInt(rdATokens)) assert.NilError(t, f.stakingKeeper.SetDelegation(f.sdkCtx, delA)) // set an unbonding delegation with expiration timestamp (beyond which the diff --git a/tests/integration/staking/keeper/unbonding_test.go b/tests/integration/staking/keeper/unbonding_test.go index 2448fa6e08f4..a61189f88382 100644 --- a/tests/integration/staking/keeper/unbonding_test.go +++ b/tests/integration/staking/keeper/unbonding_test.go @@ -67,7 +67,7 @@ func SetupUnbondingTests(t *testing.T, f *fixture, hookCalled *bool, ubdeID *uin assert.Assert(t, validator1.IsBonded()) // Create a delegator - delegation := types.NewDelegation(addrDels[0], addrVals[0], issuedShares1) + delegation := types.NewDelegation(addrDels[0].String(), addrVals[0].String(), issuedShares1) assert.NilError(t, f.stakingKeeper.SetDelegation(f.sdkCtx, delegation)) // Create a validator to redelegate to diff --git a/tests/integration/staking/keeper/validator_bench_test.go b/tests/integration/staking/keeper/validator_bench_test.go index c8f83c44079d..d69d6fe4f329 100644 --- a/tests/integration/staking/keeper/validator_bench_test.go +++ b/tests/integration/staking/keeper/validator_bench_test.go @@ -1,6 +1,7 @@ package keeper_test import ( + "bytes" "fmt" "testing" @@ -59,8 +60,11 @@ func BenchmarkGetValidatorDelegations(b *testing.B) { delegator := sdk.AccAddress(fmt.Sprintf("address%d", i)) banktestutil.FundAccount(f.sdkCtx, f.bankKeeper, delegator, sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(int64(i))))) - NewDel := types.NewDelegation(delegator, val, math.LegacyNewDec(int64(i))) - f.stakingKeeper.SetDelegation(f.sdkCtx, NewDel) + NewDel := types.NewDelegation(delegator.String(), val.String(), math.LegacyNewDec(int64(i))) + + if err := f.stakingKeeper.SetDelegation(f.sdkCtx, NewDel); err != nil { + panic(err) + } } } @@ -90,10 +94,11 @@ func BenchmarkGetValidatorDelegationsLegacy(b *testing.B) { for _, val := range valAddrs { for i := 0; i < delegationsNum; i++ { delegator := sdk.AccAddress(fmt.Sprintf("address%d", i)) - banktestutil.FundAccount(f.sdkCtx, f.bankKeeper, delegator, - sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(int64(i))))) - NewDel := types.NewDelegation(delegator, val, math.LegacyNewDec(int64(i))) - f.stakingKeeper.SetDelegation(f.sdkCtx, NewDel) + banktestutil.FundAccount(f.sdkCtx, f.bankKeeper, delegator, sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(int64(i))))) + NewDel := types.NewDelegation(delegator.String(), val.String(), math.LegacyNewDec(int64(i))) + if err := f.stakingKeeper.SetDelegation(f.sdkCtx, NewDel); err != nil { + panic(err) + } } } @@ -114,8 +119,15 @@ func updateValidatorDelegationsLegacy(f *fixture, existingValAddr, newValAddr sd for ; iterator.Valid(); iterator.Next() { delegation := types.MustUnmarshalDelegation(cdc, iterator.Value()) - if delegation.GetValidatorAddr().Equals(existingValAddr) { - k.RemoveDelegation(f.sdkCtx, delegation) + valAddr, err := k.ValidatorAddressCodec().StringToBytes(delegation.GetValidatorAddr()) + if err != nil { + panic(err) + } + + if bytes.EqualFold(valAddr, existingValAddr) { + if err := k.RemoveDelegation(f.sdkCtx, delegation); err != nil { + panic(err) + } delegation.ValidatorAddress = newValAddr.String() k.SetDelegation(f.sdkCtx, delegation) } diff --git a/testutil/sims/app_helpers.go b/testutil/sims/app_helpers.go index ba0210d0b58f..04abc34fac3a 100644 --- a/testutil/sims/app_helpers.go +++ b/testutil/sims/app_helpers.go @@ -223,7 +223,7 @@ func GenesisStateWithValSet( MinSelfDelegation: sdkmath.ZeroInt(), } validators = append(validators, validator) - delegations = append(delegations, stakingtypes.NewDelegation(genAccs[0].GetAddress(), val.Address.Bytes(), sdkmath.LegacyOneDec())) + delegations = append(delegations, stakingtypes.NewDelegation(genAccs[0].GetAddress().String(), sdk.ValAddress(val.Address).String(), sdkmath.LegacyOneDec())) } diff --git a/x/distribution/keeper/delegation.go b/x/distribution/keeper/delegation.go index bf555d6321c6..275515b6a128 100644 --- a/x/distribution/keeper/delegation.go +++ b/x/distribution/keeper/delegation.go @@ -80,8 +80,19 @@ func (k Keeper) calculateDelegationRewardsBetween(ctx context.Context, val staki // calculate the total rewards accrued by a delegation func (k Keeper) CalculateDelegationRewards(ctx context.Context, val stakingtypes.ValidatorI, del stakingtypes.DelegationI, endingPeriod uint64) (rewards sdk.DecCoins, err error) { + addrCodec := k.authKeeper.AddressCodec() + delAddr, err := addrCodec.StringToBytes(del.GetDelegatorAddr()) + if err != nil { + return sdk.DecCoins{}, err + } + + valAddr, err := k.stakingKeeper.ValidatorAddressCodec().StringToBytes(del.GetValidatorAddr()) + if err != nil { + return sdk.DecCoins{}, err + } + // fetch starting info for delegation - startingInfo, err := k.GetDelegatorStartingInfo(ctx, del.GetValidatorAddr(), del.GetDelegatorAddr()) + startingInfo, err := k.GetDelegatorStartingInfo(ctx, sdk.ValAddress(valAddr), sdk.AccAddress(delAddr)) if err != nil { return } @@ -107,7 +118,7 @@ func (k Keeper) CalculateDelegationRewards(ctx context.Context, val stakingtypes // for them for the stake sanity check below. endingHeight := uint64(sdkCtx.BlockHeight()) if endingHeight > startingHeight { - k.IterateValidatorSlashEventsBetween(ctx, del.GetValidatorAddr(), startingHeight, endingHeight, + k.IterateValidatorSlashEventsBetween(ctx, valAddr, startingHeight, endingHeight, func(height uint64, event types.ValidatorSlashEvent) (stop bool) { endingPeriod := event.ValidatorPeriod if endingPeriod > startingPeriod { @@ -176,8 +187,19 @@ func (k Keeper) CalculateDelegationRewards(ctx context.Context, val stakingtypes } func (k Keeper) withdrawDelegationRewards(ctx context.Context, val stakingtypes.ValidatorI, del stakingtypes.DelegationI) (sdk.Coins, error) { + addrCodec := k.authKeeper.AddressCodec() + delAddr, err := addrCodec.StringToBytes(del.GetDelegatorAddr()) + if err != nil { + return nil, err + } + + valAddr, err := k.stakingKeeper.ValidatorAddressCodec().StringToBytes(del.GetValidatorAddr()) + if err != nil { + return nil, err + } + // check existence of delegator starting info - hasInfo, err := k.HasDelegatorStartingInfo(ctx, del.GetValidatorAddr(), del.GetDelegatorAddr()) + hasInfo, err := k.HasDelegatorStartingInfo(ctx, sdk.ValAddress(valAddr), sdk.AccAddress(delAddr)) if err != nil { return nil, err } @@ -197,7 +219,7 @@ func (k Keeper) withdrawDelegationRewards(ctx context.Context, val stakingtypes. return nil, err } - outstanding, err := k.GetValidatorOutstandingRewardsCoins(ctx, del.GetValidatorAddr()) + outstanding, err := k.GetValidatorOutstandingRewardsCoins(ctx, sdk.ValAddress(valAddr)) if err != nil { return nil, err } @@ -209,7 +231,7 @@ func (k Keeper) withdrawDelegationRewards(ctx context.Context, val stakingtypes. logger := k.Logger(ctx) logger.Info( "rounding error withdrawing rewards from validator", - "delegator", del.GetDelegatorAddr().String(), + "delegator", del.GetDelegatorAddr(), "validator", val.GetOperator().String(), "got", rewards.String(), "expected", rewardsRaw.String(), @@ -221,7 +243,7 @@ func (k Keeper) withdrawDelegationRewards(ctx context.Context, val stakingtypes. // add coins to user account if !finalRewards.IsZero() { - withdrawAddr, err := k.GetDelegatorWithdrawAddr(ctx, del.GetDelegatorAddr()) + withdrawAddr, err := k.GetDelegatorWithdrawAddr(ctx, delAddr) if err != nil { return nil, err } @@ -234,7 +256,7 @@ func (k Keeper) withdrawDelegationRewards(ctx context.Context, val stakingtypes. // update the outstanding rewards and the community pool only if the // transaction was successful - err = k.SetValidatorOutstandingRewards(ctx, del.GetValidatorAddr(), types.ValidatorOutstandingRewards{Rewards: outstanding.Sub(rewards)}) + err = k.SetValidatorOutstandingRewards(ctx, sdk.ValAddress(valAddr), types.ValidatorOutstandingRewards{Rewards: outstanding.Sub(rewards)}) if err != nil { return nil, err } @@ -251,19 +273,19 @@ func (k Keeper) withdrawDelegationRewards(ctx context.Context, val stakingtypes. } // decrement reference count of starting period - startingInfo, err := k.GetDelegatorStartingInfo(ctx, del.GetValidatorAddr(), del.GetDelegatorAddr()) + startingInfo, err := k.GetDelegatorStartingInfo(ctx, sdk.ValAddress(valAddr), sdk.AccAddress(delAddr)) if err != nil { return nil, err } startingPeriod := startingInfo.PreviousPeriod - err = k.decrementReferenceCount(ctx, del.GetValidatorAddr(), startingPeriod) + err = k.decrementReferenceCount(ctx, sdk.ValAddress(valAddr), startingPeriod) if err != nil { return nil, err } // remove delegator starting info - err = k.DeleteDelegatorStartingInfo(ctx, del.GetValidatorAddr(), del.GetDelegatorAddr()) + err = k.DeleteDelegatorStartingInfo(ctx, sdk.ValAddress(valAddr), sdk.AccAddress(delAddr)) if err != nil { return nil, err } @@ -285,7 +307,7 @@ func (k Keeper) withdrawDelegationRewards(ctx context.Context, val stakingtypes. types.EventTypeWithdrawRewards, sdk.NewAttribute(sdk.AttributeKeyAmount, finalRewards.String()), sdk.NewAttribute(types.AttributeKeyValidator, val.GetOperator().String()), - sdk.NewAttribute(types.AttributeKeyDelegator, del.GetDelegatorAddr().String()), + sdk.NewAttribute(types.AttributeKeyDelegator, del.GetDelegatorAddr()), ), ) diff --git a/x/distribution/keeper/delegation_test.go b/x/distribution/keeper/delegation_test.go index bc586b379c16..2efd49fbef2b 100644 --- a/x/distribution/keeper/delegation_test.go +++ b/x/distribution/keeper/delegation_test.go @@ -10,6 +10,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" @@ -35,6 +36,8 @@ func TestCalculateRewardsBasic(t *testing.T) { accountKeeper := distrtestutil.NewMockAccountKeeper(ctrl) accountKeeper.EXPECT().GetModuleAddress("distribution").Return(distrAcc.GetAddress()) + stakingKeeper.EXPECT().ValidatorAddressCodec().Return(address.NewBech32Codec(sdk.Bech32PrefixValAddr)).AnyTimes() + accountKeeper.EXPECT().AddressCodec().Return(address.NewBech32Codec(sdk.Bech32MainPrefix)).AnyTimes() distrKeeper := keeper.NewKeeper( encCfg.Codec, @@ -58,7 +61,7 @@ func TestCalculateRewardsBasic(t *testing.T) { val.Commission = stakingtypes.NewCommission(math.LegacyNewDecWithPrec(5, 1), math.LegacyNewDecWithPrec(5, 1), math.LegacyNewDec(0)) // delegation mock - del := stakingtypes.NewDelegation(addr, valAddr, val.DelegatorShares) + del := stakingtypes.NewDelegation(addr.String(), valAddr.String(), val.DelegatorShares) stakingKeeper.EXPECT().Validator(gomock.Any(), valAddr).Return(val, nil).Times(3) stakingKeeper.EXPECT().Delegation(gomock.Any(), addr, valAddr).Return(del, nil) @@ -118,6 +121,8 @@ func TestCalculateRewardsAfterSlash(t *testing.T) { accountKeeper := distrtestutil.NewMockAccountKeeper(ctrl) accountKeeper.EXPECT().GetModuleAddress("distribution").Return(distrAcc.GetAddress()) + stakingKeeper.EXPECT().ValidatorAddressCodec().Return(address.NewBech32Codec(sdk.Bech32PrefixValAddr)).AnyTimes() + accountKeeper.EXPECT().AddressCodec().Return(address.NewBech32Codec(sdk.Bech32MainPrefix)).AnyTimes() distrKeeper := keeper.NewKeeper( encCfg.Codec, @@ -142,7 +147,7 @@ func TestCalculateRewardsAfterSlash(t *testing.T) { require.NoError(t, err) val.Commission = stakingtypes.NewCommission(math.LegacyNewDecWithPrec(5, 1), math.LegacyNewDecWithPrec(5, 1), math.LegacyNewDec(0)) - del := stakingtypes.NewDelegation(addr, valAddr, val.DelegatorShares) + del := stakingtypes.NewDelegation(addr.String(), valAddr.String(), val.DelegatorShares) // set mock calls stakingKeeper.EXPECT().Validator(gomock.Any(), valAddr).Return(val, nil).Times(4) @@ -218,6 +223,8 @@ func TestCalculateRewardsAfterManySlashes(t *testing.T) { accountKeeper := distrtestutil.NewMockAccountKeeper(ctrl) accountKeeper.EXPECT().GetModuleAddress("distribution").Return(distrAcc.GetAddress()) + stakingKeeper.EXPECT().ValidatorAddressCodec().Return(address.NewBech32Codec(sdk.Bech32PrefixValAddr)).AnyTimes() + accountKeeper.EXPECT().AddressCodec().Return(address.NewBech32Codec(sdk.Bech32MainPrefix)).AnyTimes() distrKeeper := keeper.NewKeeper( encCfg.Codec, @@ -243,7 +250,7 @@ func TestCalculateRewardsAfterManySlashes(t *testing.T) { val.Commission = stakingtypes.NewCommission(math.LegacyNewDecWithPrec(5, 1), math.LegacyNewDecWithPrec(5, 1), math.LegacyNewDec(0)) // delegation mocks - del := stakingtypes.NewDelegation(addr, valAddr, val.DelegatorShares) + del := stakingtypes.NewDelegation(addr.String(), valAddr.String(), val.DelegatorShares) stakingKeeper.EXPECT().Validator(gomock.Any(), valAddr).Return(val, nil).Times(4) stakingKeeper.EXPECT().Delegation(gomock.Any(), addr, valAddr).Return(del, nil) @@ -338,6 +345,8 @@ func TestCalculateRewardsMultiDelegator(t *testing.T) { accountKeeper := distrtestutil.NewMockAccountKeeper(ctrl) accountKeeper.EXPECT().GetModuleAddress("distribution").Return(distrAcc.GetAddress()) + stakingKeeper.EXPECT().ValidatorAddressCodec().Return(address.NewBech32Codec(sdk.Bech32PrefixValAddr)).AnyTimes() + accountKeeper.EXPECT().AddressCodec().Return(address.NewBech32Codec(sdk.Bech32MainPrefix)).AnyTimes() distrKeeper := keeper.NewKeeper( encCfg.Codec, @@ -361,7 +370,7 @@ func TestCalculateRewardsMultiDelegator(t *testing.T) { val.Commission = stakingtypes.NewCommission(math.LegacyNewDecWithPrec(5, 1), math.LegacyNewDecWithPrec(5, 1), math.LegacyNewDec(0)) - del0 := stakingtypes.NewDelegation(addr0, valAddr, val.DelegatorShares) + del0 := stakingtypes.NewDelegation(addr0.String(), valAddr.String(), val.DelegatorShares) // set mock calls stakingKeeper.EXPECT().Validator(gomock.Any(), valAddr).Return(val, nil).Times(4) @@ -433,6 +442,8 @@ func TestWithdrawDelegationRewardsBasic(t *testing.T) { accountKeeper := distrtestutil.NewMockAccountKeeper(ctrl) accountKeeper.EXPECT().GetModuleAddress("distribution").Return(distrAcc.GetAddress()) + stakingKeeper.EXPECT().ValidatorAddressCodec().Return(address.NewBech32Codec(sdk.Bech32PrefixValAddr)).AnyTimes() + accountKeeper.EXPECT().AddressCodec().Return(address.NewBech32Codec(sdk.Bech32MainPrefix)).AnyTimes() distrKeeper := keeper.NewKeeper( encCfg.Codec, @@ -457,7 +468,7 @@ func TestWithdrawDelegationRewardsBasic(t *testing.T) { val.Commission = stakingtypes.NewCommission(math.LegacyNewDecWithPrec(5, 1), math.LegacyNewDecWithPrec(5, 1), math.LegacyNewDec(0)) // delegation mock - del := stakingtypes.NewDelegation(addr, valAddr, val.DelegatorShares) + del := stakingtypes.NewDelegation(addr.String(), valAddr.String(), val.DelegatorShares) stakingKeeper.EXPECT().Validator(gomock.Any(), valAddr).Return(val, nil).Times(5) stakingKeeper.EXPECT().Delegation(gomock.Any(), addr, valAddr).Return(del, nil).Times(3) @@ -506,6 +517,8 @@ func TestCalculateRewardsAfterManySlashesInSameBlock(t *testing.T) { accountKeeper := distrtestutil.NewMockAccountKeeper(ctrl) accountKeeper.EXPECT().GetModuleAddress("distribution").Return(distrAcc.GetAddress()) + stakingKeeper.EXPECT().ValidatorAddressCodec().Return(address.NewBech32Codec(sdk.Bech32PrefixValAddr)).AnyTimes() + accountKeeper.EXPECT().AddressCodec().Return(address.NewBech32Codec(sdk.Bech32MainPrefix)).AnyTimes() distrKeeper := keeper.NewKeeper( encCfg.Codec, @@ -530,7 +543,7 @@ func TestCalculateRewardsAfterManySlashesInSameBlock(t *testing.T) { val.Commission = stakingtypes.NewCommission(math.LegacyNewDecWithPrec(5, 1), math.LegacyNewDecWithPrec(5, 1), math.LegacyNewDec(0)) // delegation mock - del := stakingtypes.NewDelegation(addr, valAddr, val.DelegatorShares) + del := stakingtypes.NewDelegation(addr.String(), valAddr.String(), val.DelegatorShares) stakingKeeper.EXPECT().Validator(gomock.Any(), valAddr).Return(val, nil).Times(5) stakingKeeper.EXPECT().Delegation(gomock.Any(), addr, valAddr).Return(del, nil) @@ -618,6 +631,8 @@ func TestCalculateRewardsMultiDelegatorMultiSlash(t *testing.T) { accountKeeper := distrtestutil.NewMockAccountKeeper(ctrl) accountKeeper.EXPECT().GetModuleAddress("distribution").Return(distrAcc.GetAddress()) + stakingKeeper.EXPECT().ValidatorAddressCodec().Return(address.NewBech32Codec(sdk.Bech32PrefixValAddr)).AnyTimes() + accountKeeper.EXPECT().AddressCodec().Return(address.NewBech32Codec(sdk.Bech32MainPrefix)).AnyTimes() distrKeeper := keeper.NewKeeper( encCfg.Codec, @@ -643,7 +658,7 @@ func TestCalculateRewardsMultiDelegatorMultiSlash(t *testing.T) { val.Commission = stakingtypes.NewCommission(math.LegacyNewDecWithPrec(5, 1), math.LegacyNewDecWithPrec(5, 1), math.LegacyNewDec(0)) // validator and delegation mocks - del := stakingtypes.NewDelegation(addr, valAddr, val.DelegatorShares) + del := stakingtypes.NewDelegation(addr.String(), valAddr.String(), val.DelegatorShares) stakingKeeper.EXPECT().Validator(gomock.Any(), valAddr).Return(val, nil).Times(3) stakingKeeper.EXPECT().Delegation(gomock.Any(), addr, valAddr).Return(del, nil) @@ -750,6 +765,8 @@ func TestCalculateRewardsMultiDelegatorMultWithdraw(t *testing.T) { accountKeeper := distrtestutil.NewMockAccountKeeper(ctrl) accountKeeper.EXPECT().GetModuleAddress("distribution").Return(distrAcc.GetAddress()) + stakingKeeper.EXPECT().ValidatorAddressCodec().Return(address.NewBech32Codec(sdk.Bech32PrefixValAddr)).AnyTimes() + accountKeeper.EXPECT().AddressCodec().Return(address.NewBech32Codec(sdk.Bech32MainPrefix)).AnyTimes() distrKeeper := keeper.NewKeeper( encCfg.Codec, @@ -773,7 +790,7 @@ func TestCalculateRewardsMultiDelegatorMultWithdraw(t *testing.T) { val.Commission = stakingtypes.NewCommission(math.LegacyNewDecWithPrec(5, 1), math.LegacyNewDecWithPrec(5, 1), math.LegacyNewDec(0)) // validator and delegation mocks - del := stakingtypes.NewDelegation(addr, valAddr, val.DelegatorShares) + del := stakingtypes.NewDelegation(addr.String(), valAddr.String(), val.DelegatorShares) stakingKeeper.EXPECT().Validator(gomock.Any(), valAddr).Return(val, nil).Times(3) stakingKeeper.EXPECT().Delegation(gomock.Any(), addr, valAddr).Return(del, nil).Times(5) @@ -946,6 +963,8 @@ func Test100PercentCommissionReward(t *testing.T) { accountKeeper := distrtestutil.NewMockAccountKeeper(ctrl) accountKeeper.EXPECT().GetModuleAddress("distribution").Return(distrAcc.GetAddress()) + stakingKeeper.EXPECT().ValidatorAddressCodec().Return(address.NewBech32Codec(sdk.Bech32PrefixValAddr)).AnyTimes() + accountKeeper.EXPECT().AddressCodec().Return(address.NewBech32Codec(sdk.Bech32MainPrefix)).AnyTimes() distrKeeper := keeper.NewKeeper( encCfg.Codec, @@ -969,7 +988,7 @@ func Test100PercentCommissionReward(t *testing.T) { val.Commission = stakingtypes.NewCommission(math.LegacyNewDecWithPrec(10, 1), math.LegacyNewDecWithPrec(10, 1), math.LegacyNewDec(0)) // validator and delegation mocks - del := stakingtypes.NewDelegation(addr, valAddr, val.DelegatorShares) + del := stakingtypes.NewDelegation(addr.String(), valAddr.String(), val.DelegatorShares) stakingKeeper.EXPECT().Validator(gomock.Any(), valAddr).Return(val, nil).Times(3) stakingKeeper.EXPECT().Delegation(gomock.Any(), addr, valAddr).Return(del, nil).Times(3) diff --git a/x/distribution/keeper/grpc_query.go b/x/distribution/keeper/grpc_query.go index fbb0b877fb74..442b75dce44f 100644 --- a/x/distribution/keeper/grpc_query.go +++ b/x/distribution/keeper/grpc_query.go @@ -276,7 +276,11 @@ func (k Querier) DelegationTotalRewards(ctx context.Context, req *types.QueryDel err = k.stakingKeeper.IterateDelegations( ctx, delAdr, func(_ int64, del stakingtypes.DelegationI) (stop bool) { - valAddr := del.GetValidatorAddr() + valAddr, err := k.stakingKeeper.ValidatorAddressCodec().StringToBytes(del.GetValidatorAddr()) + if err != nil { + panic(err) + } + val, err := k.stakingKeeper.Validator(ctx, valAddr) if err != nil { panic(err) @@ -292,7 +296,7 @@ func (k Querier) DelegationTotalRewards(ctx context.Context, req *types.QueryDel panic(err) } - delRewards = append(delRewards, types.NewDelegationDelegatorReward(valAddr, delReward)) + delRewards = append(delRewards, types.NewDelegationDelegatorReward(del.GetValidatorAddr(), delReward)) total = total.Add(delReward...) return false }, @@ -323,7 +327,7 @@ func (k Querier) DelegatorValidators(ctx context.Context, req *types.QueryDelega err = k.stakingKeeper.IterateDelegations( ctx, delAdr, func(_ int64, del stakingtypes.DelegationI) (stop bool) { - validators = append(validators, del.GetValidatorAddr().String()) + validators = append(validators, del.GetValidatorAddr()) return false }, ) diff --git a/x/distribution/keeper/invariants.go b/x/distribution/keeper/invariants.go index 1a9f947fc5a9..e053bbcc599a 100644 --- a/x/distribution/keeper/invariants.go +++ b/x/distribution/keeper/invariants.go @@ -69,15 +69,19 @@ func CanWithdrawInvariant(k Keeper) sdk.Invariant { var remaining sdk.DecCoins - valDelegationAddrs := make(map[string][]sdk.AccAddress) + valDelegationAddrs := make(map[string][][]byte) allDelegations, err := k.stakingKeeper.GetAllSDKDelegations(ctx) if err != nil { panic(err) } for _, del := range allDelegations { - valAddr := del.GetValidatorAddr().String() - valDelegationAddrs[valAddr] = append(valDelegationAddrs[valAddr], del.GetDelegatorAddr()) + delAddr, err := k.authKeeper.AddressCodec().StringToBytes(del.GetDelegatorAddr()) + if err != nil { + panic(err) + } + valAddr := del.GetValidatorAddr() + valDelegationAddrs[valAddr] = append(valDelegationAddrs[valAddr], delAddr) } // iterate over all validators diff --git a/x/distribution/simulation/operations.go b/x/distribution/simulation/operations.go index 472af5fdae65..cb085872d4eb 100644 --- a/x/distribution/simulation/operations.go +++ b/x/distribution/simulation/operations.go @@ -134,7 +134,11 @@ func SimulateMsgWithdrawDelegatorReward(txConfig client.TxConfig, ak types.Accou delegation := delegations[r.Intn(len(delegations))] - validator, err := sk.Validator(ctx, delegation.GetValidatorAddr()) + delAddr, err := sk.ValidatorAddressCodec().StringToBytes(delegation.GetValidatorAddr()) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, sdk.MsgTypeURL(&types.MsgWithdrawDelegatorReward{}), "error converting validator address"), nil, err + } + validator, err := sk.Validator(ctx, delAddr) if err != nil { return simtypes.NoOpMsg(types.ModuleName, sdk.MsgTypeURL(&types.MsgWithdrawDelegatorReward{}), "error getting validator"), nil, err } diff --git a/x/distribution/simulation/operations_test.go b/x/distribution/simulation/operations_test.go index 8d4c6ba36672..e8a5c1e4a0f6 100644 --- a/x/distribution/simulation/operations_test.go +++ b/x/distribution/simulation/operations_test.go @@ -109,8 +109,9 @@ func (suite *SimTestSuite) TestSimulateMsgWithdrawDelegatorReward() { delTokens := sdk.TokensFromConsensusPower(2, sdk.DefaultPowerReduction) validator0, issuedShares := validator0.AddTokensFromDel(delTokens) delegator := accounts[1] - delegation := stakingtypes.NewDelegation(delegator.Address, validator0.GetOperator(), issuedShares) - suite.stakingKeeper.SetDelegation(suite.ctx, delegation) + + delegation := stakingtypes.NewDelegation(delegator.Address.String(), validator0.GetOperator().String(), issuedShares) + suite.Require().NoError(suite.stakingKeeper.SetDelegation(suite.ctx, delegation)) suite.distrKeeper.SetDelegatorStartingInfo(suite.ctx, validator0.GetOperator(), delegator.Address, types.NewDelegatorStartingInfo(2, math.LegacyOneDec(), 200)) suite.setupValidatorRewards(validator0.GetOperator()) diff --git a/x/distribution/testutil/expected_keepers_mocks.go b/x/distribution/testutil/expected_keepers_mocks.go index 0262a57fc1c0..d1972d79a2cc 100644 --- a/x/distribution/testutil/expected_keepers_mocks.go +++ b/x/distribution/testutil/expected_keepers_mocks.go @@ -338,6 +338,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) (types0.ValidatorI, error) { m.ctrl.T.Helper() diff --git a/x/distribution/testutil/staking_helper.go b/x/distribution/testutil/staking_helper.go index a568898aabf3..6244373786e9 100644 --- a/x/distribution/testutil/staking_helper.go +++ b/x/distribution/testutil/staking_helper.go @@ -111,7 +111,7 @@ func Delegate( err = distrKeeper.Hooks().BeforeDelegationSharesModified(ctx, delegator, validator.GetOperator()) } else { err = distrKeeper.Hooks().BeforeDelegationCreated(ctx, delegator, validator.GetOperator()) - del := stakingtypes.NewDelegation(delegator, validator.GetOperator(), math.LegacyZeroDec()) + del := stakingtypes.NewDelegation(delegator.String(), validator.GetOperator().String(), math.LegacyZeroDec()) delegation = &del } diff --git a/x/distribution/types/expected_keepers.go b/x/distribution/types/expected_keepers.go index 75090b6914ca..41e9c76656af 100644 --- a/x/distribution/types/expected_keepers.go +++ b/x/distribution/types/expected_keepers.go @@ -34,6 +34,7 @@ type BankKeeper interface { // StakingKeeper expected staking keeper (noalias) 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/distribution/types/query.go b/x/distribution/types/query.go index e7efccd1e13d..973b038b7e11 100644 --- a/x/distribution/types/query.go +++ b/x/distribution/types/query.go @@ -32,6 +32,6 @@ func (res QueryDelegatorTotalRewardsResponse) String() string { } // NewDelegationDelegatorReward constructs a DelegationDelegatorReward. -func NewDelegationDelegatorReward(valAddr sdk.ValAddress, reward sdk.DecCoins) DelegationDelegatorReward { - return DelegationDelegatorReward{ValidatorAddress: valAddr.String(), Reward: reward} +func NewDelegationDelegatorReward(valAddr string, reward sdk.DecCoins) DelegationDelegatorReward { + return DelegationDelegatorReward{ValidatorAddress: valAddr, Reward: reward} } diff --git a/x/gov/keeper/tally.go b/x/gov/keeper/tally.go index 46d149e341ec..63248ef3a1d5 100644 --- a/x/gov/keeper/tally.go +++ b/x/gov/keeper/tally.go @@ -58,7 +58,7 @@ func (keeper Keeper) Tally(ctx context.Context, proposal v1.Proposal) (passes, b // iterate over all delegations from voter, deduct from any delegated-to validators err = keeper.sk.IterateDelegations(ctx, voter, func(index int64, delegation stakingtypes.DelegationI) (stop bool) { - valAddrStr := delegation.GetValidatorAddr().String() + valAddrStr := delegation.GetValidatorAddr() if val, ok := currValidators[valAddrStr]; ok { // There is no need to handle the special case that validator address equal to voter address. diff --git a/x/slashing/abci_test.go b/x/slashing/abci_test.go index 792f391f85b2..2bdbd90913ce 100644 --- a/x/slashing/abci_test.go +++ b/x/slashing/abci_test.go @@ -24,10 +24,12 @@ import ( ) func TestBeginBlocker(t *testing.T) { - var interfaceRegistry codectypes.InterfaceRegistry - var bankKeeper bankkeeper.Keeper - var stakingKeeper *stakingkeeper.Keeper - var slashingKeeper slashingkeeper.Keeper + var ( + interfaceRegistry codectypes.InterfaceRegistry + bankKeeper bankkeeper.Keeper + stakingKeeper *stakingkeeper.Keeper + slashingKeeper slashingkeeper.Keeper + ) app, err := simtestutil.Setup( depinject.Configs( diff --git a/x/slashing/keeper/msg_server_test.go b/x/slashing/keeper/msg_server_test.go index 29f066acf01d..dc9bb093c275 100644 --- a/x/slashing/keeper/msg_server_test.go +++ b/x/slashing/keeper/msg_server_test.go @@ -214,7 +214,7 @@ func (s *KeeperTestSuite) TestUnjail() { s.slashingKeeper.SetValidatorSigningInfo(s.ctx, sdk.ConsAddress(addr), info) s.stakingKeeper.EXPECT().Validator(s.ctx, valAddr).Return(val, nil) - del := types.NewDelegation(addr, valAddr, sdkmath.LegacyNewDec(100)) + del := types.NewDelegation(addr.String(), valAddr.String(), sdkmath.LegacyNewDec(100)) s.stakingKeeper.EXPECT().Delegation(s.ctx, addr, valAddr).Return(del, nil) @@ -244,7 +244,7 @@ func (s *KeeperTestSuite) TestUnjail() { s.slashingKeeper.SetValidatorSigningInfo(s.ctx, sdk.ConsAddress(addr), info) s.stakingKeeper.EXPECT().Validator(s.ctx, valAddr).Return(val, nil) - del := types.NewDelegation(addr, valAddr, sdkmath.LegacyNewDec(100)) + del := types.NewDelegation(addr.String(), valAddr.String(), sdkmath.LegacyNewDec(100)) s.stakingKeeper.EXPECT().Delegation(s.ctx, addr, valAddr).Return(del, nil) @@ -274,7 +274,7 @@ func (s *KeeperTestSuite) TestUnjail() { s.slashingKeeper.SetValidatorSigningInfo(s.ctx, sdk.ConsAddress(addr), info) s.stakingKeeper.EXPECT().Validator(s.ctx, valAddr).Return(val, nil) - del := types.NewDelegation(addr, valAddr, sdkmath.LegacyNewDec(10000)) + del := types.NewDelegation(addr.String(), valAddr.String(), sdkmath.LegacyNewDec(10000)) s.stakingKeeper.EXPECT().Delegation(s.ctx, addr, valAddr).Return(del, nil) @@ -304,7 +304,7 @@ func (s *KeeperTestSuite) TestUnjail() { s.slashingKeeper.SetValidatorSigningInfo(s.ctx, sdk.ConsAddress(addr), info) s.stakingKeeper.EXPECT().Validator(s.ctx, valAddr).Return(val, nil) - del := types.NewDelegation(addr, valAddr, sdkmath.LegacyNewDec(100)) + del := types.NewDelegation(addr.String(), valAddr.String(), sdkmath.LegacyNewDec(100)) s.stakingKeeper.EXPECT().Delegation(s.ctx, addr, valAddr).Return(del, nil) s.stakingKeeper.EXPECT().Unjail(s.ctx, sdk.ConsAddress(addr)).Return(nil) diff --git a/x/slashing/simulation/operations_test.go b/x/slashing/simulation/operations_test.go index f0d970a41043..cce1052f9838 100644 --- a/x/slashing/simulation/operations_test.go +++ b/x/slashing/simulation/operations_test.go @@ -175,9 +175,10 @@ func (suite *SimTestSuite) TestSimulateMsgUnjail() { validator0, issuedShares := validator0.AddTokensFromDel(delTokens) val0AccAddress, err := sdk.ValAddressFromBech32(validator0.OperatorAddress) suite.Require().NoError(err) - selfDelegation := stakingtypes.NewDelegation(val0AccAddress.Bytes(), validator0.GetOperator(), issuedShares) - suite.stakingKeeper.SetDelegation(ctx, selfDelegation) - suite.distrKeeper.SetDelegatorStartingInfo(ctx, validator0.GetOperator(), val0AccAddress.Bytes(), distrtypes.NewDelegatorStartingInfo(2, math.LegacyOneDec(), 200)) + + selfDelegation := stakingtypes.NewDelegation(suite.accounts[0].Address.String(), validator0.GetOperator().String(), issuedShares) + suite.Require().NoError(suite.stakingKeeper.SetDelegation(ctx, selfDelegation)) + suite.Require().NoError(suite.distrKeeper.SetDelegatorStartingInfo(ctx, validator0.GetOperator(), val0AccAddress.Bytes(), distrtypes.NewDelegatorStartingInfo(2, math.LegacyOneDec(), 200))) // begin a new block suite.app.FinalizeBlock(&abci.RequestFinalizeBlock{Height: suite.app.LastBlockHeight() + 1, Hash: suite.app.LastCommitID().Hash, Time: blockTime}) diff --git a/x/staking/keeper/delegation.go b/x/staking/keeper/delegation.go index f385bdd121b2..ac82f5f4b64b 100644 --- a/x/staking/keeper/delegation.go +++ b/x/staking/keeper/delegation.go @@ -129,15 +129,20 @@ func (k Keeper) SetDelegation(ctx context.Context, delegation types.Delegation) return err } + valAddr, err := k.validatorAddressCodec.StringToBytes(delegation.GetValidatorAddr()) + if err != nil { + return err + } + store := k.storeService.OpenKVStore(ctx) b := types.MustMarshalDelegation(k.cdc, delegation) - err = store.Set(types.GetDelegationKey(delegatorAddress, delegation.GetValidatorAddr()), b) + err = store.Set(types.GetDelegationKey(delegatorAddress, valAddr), b) if err != nil { return err } // set the delegation in validator delegator index - return store.Set(types.GetDelegationsByValKey(delegation.GetValidatorAddr(), delegatorAddress), []byte{}) + return store.Set(types.GetDelegationsByValKey(valAddr, delegatorAddress), []byte{}) } // RemoveDelegation removes a delegation @@ -147,18 +152,23 @@ func (k Keeper) RemoveDelegation(ctx context.Context, delegation types.Delegatio return err } + valAddr, err := k.validatorAddressCodec.StringToBytes(delegation.GetValidatorAddr()) + if err != nil { + return err + } + // TODO: Consider calling hooks outside of the store wrapper functions, it's unobvious. - if err := k.Hooks().BeforeDelegationRemoved(ctx, delegatorAddress, delegation.GetValidatorAddr()); err != nil { + if err := k.Hooks().BeforeDelegationRemoved(ctx, delegatorAddress, valAddr); err != nil { return err } store := k.storeService.OpenKVStore(ctx) - err = store.Delete(types.GetDelegationKey(delegatorAddress, delegation.GetValidatorAddr())) + err = store.Delete(types.GetDelegationKey(delegatorAddress, valAddr)) if err != nil { return err } - return store.Delete(types.GetDelegationsByValKey(delegation.GetValidatorAddr(), delegatorAddress)) + return store.Delete(types.GetDelegationsByValKey(valAddr, delegatorAddress)) } // GetUnbondingDelegations returns a given amount of all the delegator unbonding-delegations. @@ -868,7 +878,17 @@ func (k Keeper) Delegate( err = k.Hooks().BeforeDelegationSharesModified(ctx, delAddr, validator.GetOperator()) } else if errors.Is(err, types.ErrNoDelegation) { // not found - delegation = types.NewDelegation(delAddr, validator.GetOperator(), math.LegacyZeroDec()) + delAddrStr, err1 := k.authKeeper.AddressCodec().BytesToString(delAddr) + if err1 != nil { + return math.LegacyDec{}, err1 + } + + valAddrStr, err1 := k.validatorAddressCodec.BytesToString(validator.GetOperator()) + if err1 != nil { + return math.LegacyDec{}, err1 + } + + delegation = types.NewDelegation(delAddrStr, valAddrStr, math.LegacyZeroDec()) err = k.Hooks().BeforeDelegationCreated(ctx, delAddr, validator.GetOperator()) } else { return math.LegacyZeroDec(), err @@ -878,11 +898,6 @@ func (k Keeper) Delegate( return math.LegacyZeroDec(), err } - delegatorAddress, err := k.authKeeper.AddressCodec().StringToBytes(delegation.DelegatorAddress) - if err != nil { - return math.LegacyZeroDec(), err - } - // if subtractAccount is true then we are // performing a delegation and not a redelegation, thus the source tokens are // all non bonded @@ -908,7 +923,7 @@ func (k Keeper) Delegate( } coins := sdk.NewCoins(sdk.NewCoin(bondDenom, bondAmt)) - if err := k.bankKeeper.DelegateCoinsFromAccountToModule(ctx, delegatorAddress, sendName, coins); err != nil { + if err := k.bankKeeper.DelegateCoinsFromAccountToModule(ctx, delAddr, sendName, coins); err != nil { return math.LegacyDec{}, err } } else { @@ -947,7 +962,7 @@ func (k Keeper) Delegate( } // Call the after-modification hook - if err := k.Hooks().AfterDelegationModified(ctx, delegatorAddress, delegation.GetValidatorAddr()); err != nil { + if err := k.Hooks().AfterDelegationModified(ctx, delAddr, validator.GetOperator()); err != nil { return newShares, err } @@ -1009,8 +1024,14 @@ func (k Keeper) Unbond( if err = k.SetDelegation(ctx, delegation); err != nil { return amount, err } + + valAddr, err1 := k.validatorAddressCodec.StringToBytes(delegation.GetValidatorAddr()) + if err != nil { + return amount, err1 + } + // call the after delegation modification hook - err = k.Hooks().AfterDelegationModified(ctx, delegatorAddress, delegation.GetValidatorAddr()) + err = k.Hooks().AfterDelegationModified(ctx, delegatorAddress, valAddr) } if err != nil { diff --git a/x/staking/keeper/delegation_test.go b/x/staking/keeper/delegation_test.go index 02a78a3da1f2..ab689985a78f 100644 --- a/x/staking/keeper/delegation_test.go +++ b/x/staking/keeper/delegation_test.go @@ -42,7 +42,7 @@ func (s *KeeperTestSuite) TestDelegation() { } // first add a validators[0] to delegate too - bond1to1 := stakingtypes.NewDelegation(addrDels[0], valAddrs[0], math.LegacyNewDec(9)) + bond1to1 := stakingtypes.NewDelegation(addrDels[0].String(), valAddrs[0].String(), math.LegacyNewDec(9)) // check the empty keeper first _, err := keeper.GetDelegation(ctx, addrDels[0], valAddrs[0]) @@ -62,11 +62,11 @@ func (s *KeeperTestSuite) TestDelegation() { require.Equal(bond1to1, resBond) // add some more records - bond1to2 := stakingtypes.NewDelegation(addrDels[0], valAddrs[1], math.LegacyNewDec(9)) - bond1to3 := stakingtypes.NewDelegation(addrDels[0], valAddrs[2], math.LegacyNewDec(9)) - bond2to1 := stakingtypes.NewDelegation(addrDels[1], valAddrs[0], math.LegacyNewDec(9)) - bond2to2 := stakingtypes.NewDelegation(addrDels[1], valAddrs[1], math.LegacyNewDec(9)) - bond2to3 := stakingtypes.NewDelegation(addrDels[1], valAddrs[2], math.LegacyNewDec(9)) + bond1to2 := stakingtypes.NewDelegation(addrDels[0].String(), valAddrs[1].String(), math.LegacyNewDec(9)) + bond1to3 := stakingtypes.NewDelegation(addrDels[0].String(), valAddrs[2].String(), math.LegacyNewDec(9)) + bond2to1 := stakingtypes.NewDelegation(addrDels[1].String(), valAddrs[0].String(), math.LegacyNewDec(9)) + bond2to2 := stakingtypes.NewDelegation(addrDels[1].String(), valAddrs[1].String(), math.LegacyNewDec(9)) + bond2to3 := stakingtypes.NewDelegation(addrDels[1].String(), valAddrs[2].String(), math.LegacyNewDec(9)) require.NoError(keeper.SetDelegation(ctx, bond1to2)) require.NoError(keeper.SetDelegation(ctx, bond1to3)) require.NoError(keeper.SetDelegation(ctx, bond2to1)) @@ -375,7 +375,7 @@ func (s *KeeperTestSuite) TestUnbondDelegation() { s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.NotBondedPoolName, stakingtypes.BondedPoolName, gomock.Any()) _ = stakingkeeper.TestingUpdateValidator(keeper, ctx, validator, true) - delegation := stakingtypes.NewDelegation(delAddrs[0], valAddrs[0], issuedShares) + delegation := stakingtypes.NewDelegation(delAddrs[0].String(), valAddrs[0].String(), issuedShares) require.NoError(keeper.SetDelegation(ctx, delegation)) bondTokens := keeper.TokensFromConsensusPower(ctx, 6) @@ -415,7 +415,7 @@ func (s *KeeperTestSuite) TestUndelegateSelfDelegationBelowMinSelfDelegation() { require.NoError(keeper.SetValidatorByConsAddr(ctx, validator)) require.True(validator.IsBonded()) - selfDelegation := stakingtypes.NewDelegation(sdk.AccAddress(addrVals[0].Bytes()), addrVals[0], issuedShares) + selfDelegation := stakingtypes.NewDelegation(sdk.AccAddress(addrVals[0].Bytes()).String(), addrVals[0].String(), issuedShares) require.NoError(keeper.SetDelegation(ctx, selfDelegation)) // create a second delegation to this validator @@ -425,7 +425,7 @@ func (s *KeeperTestSuite) TestUndelegateSelfDelegationBelowMinSelfDelegation() { require.Equal(delTokens, issuedShares.RoundInt()) validator = stakingkeeper.TestingUpdateValidator(keeper, ctx, validator, true) - delegation := stakingtypes.NewDelegation(addrDels[0], addrVals[0], issuedShares) + delegation := stakingtypes.NewDelegation(addrDels[0].String(), addrVals[0].String(), issuedShares) require.NoError(keeper.SetDelegation(ctx, delegation)) val0AccAddr := sdk.AccAddress(addrVals[0].Bytes()) @@ -462,7 +462,7 @@ func (s *KeeperTestSuite) TestUndelegateFromUnbondingValidator() { validator = stakingkeeper.TestingUpdateValidator(keeper, ctx, validator, true) require.True(validator.IsBonded()) - selfDelegation := stakingtypes.NewDelegation(addrVals[0].Bytes(), addrVals[0], issuedShares) + selfDelegation := stakingtypes.NewDelegation(addrDels[0].String(), addrVals[0].String(), issuedShares) require.NoError(keeper.SetDelegation(ctx, selfDelegation)) // create a second delegation to this validator @@ -472,7 +472,7 @@ func (s *KeeperTestSuite) TestUndelegateFromUnbondingValidator() { require.Equal(delTokens, issuedShares.RoundInt()) stakingkeeper.TestingUpdateValidator(keeper, ctx, validator, true) - delegation := stakingtypes.NewDelegation(addrDels[1], addrVals[0], issuedShares) + delegation := stakingtypes.NewDelegation(addrDels[1].String(), addrVals[0].String(), issuedShares) require.NoError(keeper.SetDelegation(ctx, delegation)) header := ctx.BlockHeader() @@ -539,7 +539,7 @@ func (s *KeeperTestSuite) TestUndelegateFromUnbondedValidator() { require.True(validator.IsBonded()) val0AccAddr := sdk.AccAddress(addrVals[0]) - selfDelegation := stakingtypes.NewDelegation(val0AccAddr, addrVals[0], issuedShares) + selfDelegation := stakingtypes.NewDelegation(val0AccAddr.String(), addrVals[0].String(), issuedShares) require.NoError(keeper.SetDelegation(ctx, selfDelegation)) // create a second delegation to this validator @@ -548,7 +548,7 @@ func (s *KeeperTestSuite) TestUndelegateFromUnbondedValidator() { require.Equal(delTokens, issuedShares.RoundInt()) validator = stakingkeeper.TestingUpdateValidator(keeper, ctx, validator, true) require.True(validator.IsBonded()) - delegation := stakingtypes.NewDelegation(addrDels[1], addrVals[0], issuedShares) + delegation := stakingtypes.NewDelegation(addrDels[1].String(), addrVals[0].String(), issuedShares) require.NoError(keeper.SetDelegation(ctx, delegation)) ctx = ctx.WithBlockHeight(10) @@ -618,7 +618,7 @@ func (s *KeeperTestSuite) TestUnbondingAllDelegationFromValidator() { require.True(validator.IsBonded()) val0AccAddr := sdk.AccAddress(addrVals[0].Bytes()) - selfDelegation := stakingtypes.NewDelegation(val0AccAddr, addrVals[0], issuedShares) + selfDelegation := stakingtypes.NewDelegation(val0AccAddr.String(), addrVals[0].String(), issuedShares) require.NoError(keeper.SetDelegation(ctx, selfDelegation)) // create a second delegation to this validator @@ -629,7 +629,7 @@ func (s *KeeperTestSuite) TestUnbondingAllDelegationFromValidator() { validator = stakingkeeper.TestingUpdateValidator(keeper, ctx, validator, true) require.True(validator.IsBonded()) - delegation := stakingtypes.NewDelegation(addrDels[1], addrVals[0], issuedShares) + delegation := stakingtypes.NewDelegation(addrDels[1].String(), addrVals[0].String(), issuedShares) require.NoError(keeper.SetDelegation(ctx, delegation)) ctx = ctx.WithBlockHeight(10) @@ -789,7 +789,7 @@ func (s *KeeperTestSuite) TestRedelegateToSameValidator() { val0AccAddr := sdk.AccAddress(addrVals[0].Bytes()) - selfDelegation := stakingtypes.NewDelegation(val0AccAddr, addrVals[0], issuedShares) + selfDelegation := stakingtypes.NewDelegation(val0AccAddr.String(), addrVals[0].String(), issuedShares) require.NoError(keeper.SetDelegation(ctx, selfDelegation)) _, err := keeper.BeginRedelegation(ctx, val0AccAddr, addrVals[0], addrVals[0], math.LegacyNewDec(5)) @@ -811,7 +811,7 @@ func (s *KeeperTestSuite) TestRedelegationMaxEntries() { s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.NotBondedPoolName, stakingtypes.BondedPoolName, gomock.Any()) _ = stakingkeeper.TestingUpdateValidator(keeper, ctx, validator, true) val0AccAddr := sdk.AccAddress(addrVals[0].Bytes()) - selfDelegation := stakingtypes.NewDelegation(val0AccAddr, addrVals[0], issuedShares) + selfDelegation := stakingtypes.NewDelegation(val0AccAddr.String(), addrVals[0].String(), issuedShares) require.NoError(keeper.SetDelegation(ctx, selfDelegation)) // create a second validator @@ -866,7 +866,7 @@ func (s *KeeperTestSuite) TestRedelegateSelfDelegation() { validator = stakingkeeper.TestingUpdateValidator(keeper, ctx, validator, true) val0AccAddr := sdk.AccAddress(addrVals[0]) - selfDelegation := stakingtypes.NewDelegation(val0AccAddr, addrVals[0], issuedShares) + selfDelegation := stakingtypes.NewDelegation(val0AccAddr.String(), addrVals[0].String(), issuedShares) require.NoError(keeper.SetDelegation(ctx, selfDelegation)) // create a second validator @@ -883,7 +883,7 @@ func (s *KeeperTestSuite) TestRedelegateSelfDelegation() { require.Equal(delTokens, issuedShares.RoundInt()) stakingkeeper.TestingUpdateValidator(keeper, ctx, validator, true) - delegation := stakingtypes.NewDelegation(addrDels[0], addrVals[0], issuedShares) + delegation := stakingtypes.NewDelegation(addrDels[0].String(), addrVals[0].String(), issuedShares) require.NoError(keeper.SetDelegation(ctx, delegation)) _, err := keeper.BeginRedelegation(ctx, val0AccAddr, addrVals[0], addrVals[1], math.LegacyNewDecFromInt(delTokens)) @@ -915,7 +915,7 @@ func (s *KeeperTestSuite) TestRedelegateFromUnbondingValidator() { s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.NotBondedPoolName, stakingtypes.BondedPoolName, gomock.Any()) validator = stakingkeeper.TestingUpdateValidator(keeper, ctx, validator, true) val0AccAddr := sdk.AccAddress(addrVals[0].Bytes()) - selfDelegation := stakingtypes.NewDelegation(val0AccAddr, addrVals[0], issuedShares) + selfDelegation := stakingtypes.NewDelegation(val0AccAddr.String(), addrVals[0].String(), issuedShares) require.NoError(keeper.SetDelegation(ctx, selfDelegation)) // create a second delegation to this validator @@ -924,7 +924,7 @@ func (s *KeeperTestSuite) TestRedelegateFromUnbondingValidator() { validator, issuedShares = validator.AddTokensFromDel(delTokens) require.Equal(delTokens, issuedShares.RoundInt()) stakingkeeper.TestingUpdateValidator(keeper, ctx, validator, true) - delegation := stakingtypes.NewDelegation(addrDels[1], addrVals[0], issuedShares) + delegation := stakingtypes.NewDelegation(addrDels[1].String(), addrVals[0].String(), issuedShares) require.NoError(keeper.SetDelegation(ctx, delegation)) // create a second validator @@ -996,7 +996,7 @@ func (s *KeeperTestSuite) TestRedelegateFromUnbondedValidator() { s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.NotBondedPoolName, stakingtypes.BondedPoolName, gomock.Any()) validator = stakingkeeper.TestingUpdateValidator(keeper, ctx, validator, true) val0AccAddr := sdk.AccAddress(addrVals[0].Bytes()) - selfDelegation := stakingtypes.NewDelegation(val0AccAddr, addrVals[0], issuedShares) + selfDelegation := stakingtypes.NewDelegation(val0AccAddr.String(), addrVals[0].String(), issuedShares) require.NoError(keeper.SetDelegation(ctx, selfDelegation)) // create a second delegation to this validator @@ -1005,7 +1005,7 @@ func (s *KeeperTestSuite) TestRedelegateFromUnbondedValidator() { validator, issuedShares = validator.AddTokensFromDel(delTokens) require.Equal(delTokens, issuedShares.RoundInt()) stakingkeeper.TestingUpdateValidator(keeper, ctx, validator, true) - delegation := stakingtypes.NewDelegation(addrDels[1], addrVals[0], issuedShares) + delegation := stakingtypes.NewDelegation(addrDels[1].String(), addrVals[0].String(), issuedShares) require.NoError(keeper.SetDelegation(ctx, delegation)) // create a second validator diff --git a/x/staking/keeper/genesis.go b/x/staking/keeper/genesis.go index dfd3368bf426..56e5cbd3c3d2 100644 --- a/x/staking/keeper/genesis.go +++ b/x/staking/keeper/genesis.go @@ -84,9 +84,14 @@ func (k Keeper) InitGenesis(ctx context.Context, data *types.GenesisState) (res panic(fmt.Errorf("invalid delegator address: %s", err)) } + valAddr, err := k.validatorAddressCodec.StringToBytes(delegation.GetValidatorAddr()) + if err != nil { + panic(err) + } + // Call the before-creation hook if not exported if !data.Exported { - if err := k.Hooks().BeforeDelegationCreated(ctx, delegatorAddress, delegation.GetValidatorAddr()); err != nil { + if err := k.Hooks().BeforeDelegationCreated(ctx, delegatorAddress, valAddr); err != nil { panic(err) } } @@ -97,7 +102,7 @@ func (k Keeper) InitGenesis(ctx context.Context, data *types.GenesisState) (res // Call the after-modification hook if not exported if !data.Exported { - if err := k.Hooks().AfterDelegationModified(ctx, delegatorAddress, delegation.GetValidatorAddr()); err != nil { + if err := k.Hooks().AfterDelegationModified(ctx, delegatorAddress, valAddr); err != nil { panic(err) } } diff --git a/x/staking/keeper/grpc_query.go b/x/staking/keeper/grpc_query.go index 5d5906e25b82..7b72ec54a7a2 100644 --- a/x/staking/keeper/grpc_query.go +++ b/x/staking/keeper/grpc_query.go @@ -148,12 +148,12 @@ func (k Querier) getValidatorDelegationsLegacy(ctx context.Context, req *types.Q valStore := prefix.NewStore(store, types.DelegationKey) return query.GenericFilteredPaginate(k.cdc, valStore, req.Pagination, func(key []byte, delegation *types.Delegation) (*types.Delegation, error) { - valAddr, err := sdk.ValAddressFromBech32(req.ValidatorAddr) + _, err := k.validatorAddressCodec.StringToBytes(req.ValidatorAddr) if err != nil { return nil, err } - if !delegation.GetValidatorAddr().Equals(valAddr) { + if !strings.EqualFold(delegation.GetValidatorAddr(), req.ValidatorAddr) { return nil, nil } @@ -452,7 +452,12 @@ func (k Querier) DelegatorValidators(ctx context.Context, req *types.QueryDelega return err } - validator, err := k.GetValidator(ctx, delegation.GetValidatorAddr()) + valAddr, err := k.validatorAddressCodec.StringToBytes(delegation.GetValidatorAddr()) + if err != nil { + return err + } + + validator, err := k.GetValidator(ctx, valAddr) if err != nil { return err } @@ -565,12 +570,17 @@ func queryAllRedelegations(store storetypes.KVStore, k Querier, req *types.Query // util func delegationToDelegationResponse(ctx context.Context, k *Keeper, del types.Delegation) (types.DelegationResponse, error) { - val, err := k.GetValidator(ctx, del.GetValidatorAddr()) + valAddr, err := k.validatorAddressCodec.StringToBytes(del.GetValidatorAddr()) + if err != nil { + return types.DelegationResponse{}, err + } + + val, err := k.GetValidator(ctx, valAddr) if err != nil { return types.DelegationResponse{}, err } - delegatorAddress, err := k.authKeeper.AddressCodec().StringToBytes(del.DelegatorAddress) + _, err = k.authKeeper.AddressCodec().StringToBytes(del.DelegatorAddress) if err != nil { return types.DelegationResponse{}, err } @@ -581,7 +591,7 @@ func delegationToDelegationResponse(ctx context.Context, k *Keeper, del types.De } return types.NewDelegationResp( - delegatorAddress, + del.DelegatorAddress, del.GetValidatorAddr(), del.Shares, sdk.NewCoin(bondDenom, val.TokensFromShares(del.Shares).TruncateInt()), diff --git a/x/staking/keeper/invariants.go b/x/staking/keeper/invariants.go index c36176a6f6ec..3c749925bc62 100644 --- a/x/staking/keeper/invariants.go +++ b/x/staking/keeper/invariants.go @@ -199,7 +199,7 @@ func DelegatorSharesInvariant(k *Keeper) sdk.Invariant { } for _, delegation := range delegations { - delegationValidatorAddr := delegation.GetValidatorAddr().String() + delegationValidatorAddr := delegation.GetValidatorAddr() validatorDelegationShares := validatorsDelegationShares[delegationValidatorAddr] validatorsDelegationShares[delegationValidatorAddr] = validatorDelegationShares.Add(delegation.Shares) } diff --git a/x/staking/keeper/msg_server.go b/x/staking/keeper/msg_server.go index 96ab186397dd..83425321ac06 100644 --- a/x/staking/keeper/msg_server.go +++ b/x/staking/keeper/msg_server.go @@ -239,7 +239,7 @@ func (k msgServer) EditValidator(ctx context.Context, msg *types.MsgEditValidato // Delegate defines a method for performing a delegation of coins from a delegator to a validator func (k msgServer) Delegate(ctx context.Context, msg *types.MsgDelegate) (*types.MsgDelegateResponse, error) { - valAddr, valErr := sdk.ValAddressFromBech32(msg.ValidatorAddress) + valAddr, valErr := k.validatorAddressCodec.StringToBytes(msg.ValidatorAddress) if valErr != nil { return nil, sdkerrors.ErrInvalidAddress.Wrapf("invalid validator address: %s", valErr) } diff --git a/x/staking/keeper/msg_server_test.go b/x/staking/keeper/msg_server_test.go index 41afa942f5d3..82b30abe13f0 100644 --- a/x/staking/keeper/msg_server_test.go +++ b/x/staking/keeper/msg_server_test.go @@ -566,7 +566,7 @@ func (s *KeeperTestSuite) TestMsgBeginRedelegate() { require.NotNil(res) shares := math.LegacyNewDec(100) - del := stakingtypes.NewDelegation(Addr, srcValAddr, shares) + del := stakingtypes.NewDelegation(Addr.String(), srcValAddr.String(), shares) require.NoError(keeper.SetDelegation(ctx, del)) _, err = keeper.GetDelegation(ctx, Addr, srcValAddr) require.NoError(err) @@ -720,7 +720,7 @@ func (s *KeeperTestSuite) TestMsgUndelegate() { require.NotNil(res) shares := math.LegacyNewDec(100) - del := stakingtypes.NewDelegation(Addr, ValAddr, shares) + del := stakingtypes.NewDelegation(Addr.String(), ValAddr.String(), shares) require.NoError(keeper.SetDelegation(ctx, del)) _, err = keeper.GetDelegation(ctx, Addr, ValAddr) require.NoError(err) @@ -845,7 +845,7 @@ func (s *KeeperTestSuite) TestMsgCancelUnbondingDelegation() { require.NotNil(res) shares := math.LegacyNewDec(100) - del := stakingtypes.NewDelegation(Addr, ValAddr, shares) + del := stakingtypes.NewDelegation(Addr.String(), ValAddr.String(), shares) require.NoError(keeper.SetDelegation(ctx, del)) resDel, err := keeper.GetDelegation(ctx, Addr, ValAddr) require.NoError(err) diff --git a/x/staking/keeper/query_utils.go b/x/staking/keeper/query_utils.go index c8298c001e20..f7951fc2944f 100644 --- a/x/staking/keeper/query_utils.go +++ b/x/staking/keeper/query_utils.go @@ -27,7 +27,12 @@ func (k Keeper) GetDelegatorValidators( for ; iterator.Valid() && i < int(maxRetrieve); iterator.Next() { delegation := types.MustUnmarshalDelegation(k.cdc, iterator.Value()) - validator, err := k.GetValidator(ctx, delegation.GetValidatorAddr()) + valAddr, err := k.validatorAddressCodec.StringToBytes(delegation.GetValidatorAddr()) + if err != nil { + return nil, err + } + + validator, err := k.GetValidator(ctx, valAddr) if err != nil { return nil, err } @@ -48,7 +53,12 @@ func (k Keeper) GetDelegatorValidator( return validator, err } - return k.GetValidator(ctx, delegation.GetValidatorAddr()) + valAddr, err := k.validatorAddressCodec.StringToBytes(delegation.GetValidatorAddr()) + if err != nil { + return validator, err + } + + return k.GetValidator(ctx, valAddr) } // GetAllDelegatorDelegations returns all delegations of a delegator diff --git a/x/staking/migrations/v5/migrations_test.go b/x/staking/migrations/v5/migrations_test.go index ca7662833658..3cb91168e0f7 100644 --- a/x/staking/migrations/v5/migrations_test.go +++ b/x/staking/migrations/v5/migrations_test.go @@ -90,7 +90,7 @@ func TestDelegationsByValidatorMigrations(t *testing.T) { var addedDels []stakingtypes.Delegation for i := 1; i < 11; i++ { - del1 := stakingtypes.NewDelegation(accAddrs[i], valAddrs[0], sdkmath.LegacyNewDec(100)) + del1 := stakingtypes.NewDelegation(accAddrs[i].String(), valAddrs[0].String(), sdkmath.LegacyNewDec(100)) store.Set(stakingtypes.GetDelegationKey(accAddrs[i], valAddrs[0]), stakingtypes.MustMarshalDelegation(cdc, del1)) addedDels = append(addedDels, del1) } diff --git a/x/staking/simulation/decoder_test.go b/x/staking/simulation/decoder_test.go index e1139a0434f2..4ddde8ce4855 100644 --- a/x/staking/simulation/decoder_test.go +++ b/x/staking/simulation/decoder_test.go @@ -30,7 +30,7 @@ func TestDecodeStore(t *testing.T) { val, err := types.NewValidator(valAddr1, delPk1, types.NewDescription("test", "test", "test", "test", "test")) require.NoError(t, err) - del := types.NewDelegation(delAddr1, valAddr1, math.LegacyOneDec()) + 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) diff --git a/x/staking/simulation/genesis.go b/x/staking/simulation/genesis.go index 1716fff3da8c..c2977e19e286 100644 --- a/x/staking/simulation/genesis.go +++ b/x/staking/simulation/genesis.go @@ -84,7 +84,7 @@ func RandomizedGenState(simState *module.SimulationState) { validator.DelegatorShares = sdkmath.LegacyNewDecFromInt(simState.InitialStake) validator.Commission = commission - delegation := types.NewDelegation(simState.Accounts[i].Address, valAddr, sdkmath.LegacyNewDecFromInt(simState.InitialStake)) + delegation := types.NewDelegation(simState.Accounts[i].Address.String(), valAddr.String(), sdkmath.LegacyNewDecFromInt(simState.InitialStake)) validators = append(validators, validator) delegations = append(delegations, delegation) diff --git a/x/staking/simulation/operations.go b/x/staking/simulation/operations.go index 4b8bfa455915..e5a15c6d409f 100644 --- a/x/staking/simulation/operations.go +++ b/x/staking/simulation/operations.go @@ -379,7 +379,12 @@ func SimulateMsgUndelegate( delegation := delegations[r.Intn(len(delegations))] delAddr := delegation.GetDelegatorAddr() - hasMaxUD, err := k.HasMaxUnbondingDelegationEntries(ctx, delAddr, valAddr) + delAddrBz, err := ak.AddressCodec().StringToBytes(delAddr) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, msgType, "error getting delegator address bytes"), nil, err + } + + hasMaxUD, err := k.HasMaxUnbondingDelegationEntries(ctx, delAddrBz, valAddr) if err != nil { return simtypes.NoOpMsg(types.ModuleName, msgType, "error getting max unbonding delegation entries"), nil, err } @@ -408,14 +413,14 @@ func SimulateMsgUndelegate( } msg := types.NewMsgUndelegate( - delAddr, valAddr, sdk.NewCoin(bondDenom, unbondAmt), + delAddrBz, valAddr, sdk.NewCoin(bondDenom, unbondAmt), ) // need to retrieve the simulation account associated with delegation to retrieve PrivKey var simAccount simtypes.Account for _, simAcc := range accs { - if simAcc.Address.Equals(delAddr) { + if simAcc.Address.Equals(sdk.AccAddress(delAddrBz)) { simAccount = simAcc break } @@ -425,7 +430,7 @@ func SimulateMsgUndelegate( return simtypes.NoOpMsg(types.ModuleName, sdk.MsgTypeURL(msg), "account private key is nil"), nil, nil } - account := ak.GetAccount(ctx, delAddr) + account := ak.GetAccount(ctx, delAddrBz) spendable := bk.SpendableCoins(ctx, account.GetAddress()) txCtx := simulation.OperationInput{ @@ -583,7 +588,12 @@ func SimulateMsgBeginRedelegate( delegation := delegations[r.Intn(len(delegations))] delAddr := delegation.GetDelegatorAddr() - hasRecRedel, err := k.HasReceivingRedelegation(ctx, delAddr, srcAddr) + delAddrBz, err := ak.AddressCodec().StringToBytes(delAddr) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, msgType, "error getting delegator address bytes"), nil, err + } + + hasRecRedel, err := k.HasReceivingRedelegation(ctx, delAddrBz, srcAddr) if err != nil { return simtypes.NoOpMsg(types.ModuleName, msgType, "error getting receiving redelegation"), nil, err } @@ -599,7 +609,7 @@ func SimulateMsgBeginRedelegate( } destAddr := destVal.GetOperator() - hasMaxRedel, err := k.HasMaxRedelegationEntries(ctx, delAddr, srcAddr, destAddr) + hasMaxRedel, err := k.HasMaxRedelegationEntries(ctx, delAddrBz, srcAddr, destAddr) if err != nil { return simtypes.NoOpMsg(types.ModuleName, msgType, "error getting max redelegation entries"), nil, err } @@ -636,7 +646,7 @@ func SimulateMsgBeginRedelegate( var simAccount simtypes.Account for _, simAcc := range accs { - if simAcc.Address.Equals(delAddr) { + if simAcc.Address.Equals(sdk.AccAddress(delAddrBz)) { simAccount = simAcc break } @@ -647,7 +657,7 @@ func SimulateMsgBeginRedelegate( return simtypes.NoOpMsg(types.ModuleName, msgType, "account private key is nil"), nil, nil } - account := ak.GetAccount(ctx, delAddr) + account := ak.GetAccount(ctx, delAddrBz) spendable := bk.SpendableCoins(ctx, account.GetAddress()) bondDenom, err := k.BondDenom(ctx) @@ -656,7 +666,7 @@ func SimulateMsgBeginRedelegate( } msg := types.NewMsgBeginRedelegate( - delAddr, srcAddr, destAddr, + delAddrBz, srcAddr, destAddr, sdk.NewCoin(bondDenom, redAmt), ) diff --git a/x/staking/simulation/operations_test.go b/x/staking/simulation/operations_test.go index 99e707203c4f..3dc76e4f508c 100644 --- a/x/staking/simulation/operations_test.go +++ b/x/staking/simulation/operations_test.go @@ -196,7 +196,7 @@ func (s *SimTestSuite) TestSimulateMsgCancelUnbondingDelegation() { delTokens := s.stakingKeeper.TokensFromConsensusPower(ctx, 2) validator0, issuedShares := validator0.AddTokensFromDel(delTokens) delegator := s.accounts[2] - delegation := types.NewDelegation(delegator.Address, validator0.GetOperator(), issuedShares) + delegation := types.NewDelegation(delegator.Address.String(), validator0.GetOperator().String(), issuedShares) require.NoError(s.stakingKeeper.SetDelegation(ctx, delegation)) require.NoError(s.distrKeeper.SetDelegatorStartingInfo(ctx, validator0.GetOperator(), delegator.Address, distrtypes.NewDelegatorStartingInfo(2, math.LegacyOneDec(), 200))) @@ -290,7 +290,7 @@ func (s *SimTestSuite) TestSimulateMsgUndelegate() { delTokens := s.stakingKeeper.TokensFromConsensusPower(ctx, 2) validator0, issuedShares := validator0.AddTokensFromDel(delTokens) delegator := s.accounts[2] - delegation := types.NewDelegation(delegator.Address, validator0.GetOperator(), issuedShares) + delegation := types.NewDelegation(delegator.Address.String(), validator0.GetOperator().String(), issuedShares) require.NoError(s.stakingKeeper.SetDelegation(ctx, delegation)) require.NoError(s.distrKeeper.SetDelegatorStartingInfo(ctx, validator0.GetOperator(), delegator.Address, distrtypes.NewDelegatorStartingInfo(2, math.LegacyOneDec(), 200))) @@ -332,7 +332,7 @@ func (s *SimTestSuite) TestSimulateMsgBeginRedelegate() { // setup accounts[3] as delegator delegator := s.accounts[3] - delegation := types.NewDelegation(delegator.Address, validator0.GetOperator(), issuedShares) + delegation := types.NewDelegation(delegator.Address.String(), validator0.GetOperator().String(), issuedShares) require.NoError(s.stakingKeeper.SetDelegation(ctx, delegation)) require.NoError(s.distrKeeper.SetDelegatorStartingInfo(ctx, validator0.GetOperator(), delegator.Address, distrtypes.NewDelegatorStartingInfo(2, math.LegacyOneDec(), 200))) diff --git a/x/staking/types/delegation.go b/x/staking/types/delegation.go index b75149e4075c..3ebf5e6bb893 100644 --- a/x/staking/types/delegation.go +++ b/x/staking/types/delegation.go @@ -15,10 +15,10 @@ import ( var _ DelegationI = Delegation{} // NewDelegation creates a new delegation object -func NewDelegation(delegatorAddr sdk.AccAddress, validatorAddr sdk.ValAddress, shares math.LegacyDec) Delegation { +func NewDelegation(delegatorAddr, validatorAddr string, shares math.LegacyDec) Delegation { return Delegation{ - DelegatorAddress: delegatorAddr.String(), - ValidatorAddress: validatorAddr.String(), + DelegatorAddress: delegatorAddr, + ValidatorAddress: validatorAddr, Shares: shares, } } @@ -45,18 +45,12 @@ func UnmarshalDelegation(cdc codec.BinaryCodec, value []byte) (delegation Delega return delegation, err } -func (d Delegation) GetDelegatorAddr() sdk.AccAddress { - delAddr := sdk.MustAccAddressFromBech32(d.DelegatorAddress) - - return delAddr +func (d Delegation) GetDelegatorAddr() string { + return d.DelegatorAddress } -func (d Delegation) GetValidatorAddr() sdk.ValAddress { - addr, err := sdk.ValAddressFromBech32(d.ValidatorAddress) - if err != nil { - panic(err) - } - return addr +func (d Delegation) GetValidatorAddr() string { + return d.ValidatorAddress } func (d Delegation) GetShares() math.LegacyDec { return d.Shares } @@ -273,7 +267,7 @@ func (d Redelegations) String() (out string) { // NewDelegationResp creates a new DelegationResponse instance func NewDelegationResp( - delegatorAddr sdk.AccAddress, validatorAddr sdk.ValAddress, shares math.LegacyDec, balance sdk.Coin, + delegatorAddr, validatorAddr string, shares math.LegacyDec, balance sdk.Coin, ) DelegationResponse { return DelegationResponse{ Delegation: NewDelegation(delegatorAddr, validatorAddr, shares), diff --git a/x/staking/types/delegation_test.go b/x/staking/types/delegation_test.go index e61d6607c157..027ff9855262 100644 --- a/x/staking/types/delegation_test.go +++ b/x/staking/types/delegation_test.go @@ -16,7 +16,7 @@ import ( ) func TestDelegationEqual(t *testing.T) { - d1 := types.NewDelegation(sdk.AccAddress(valAddr1), valAddr2, math.LegacyNewDec(100)) + d1 := types.NewDelegation(sdk.AccAddress(valAddr1).String(), valAddr2.String(), math.LegacyNewDec(100)) d2 := d1 ok := d1.String() == d2.String() @@ -30,7 +30,7 @@ func TestDelegationEqual(t *testing.T) { } func TestDelegationString(t *testing.T) { - d := types.NewDelegation(sdk.AccAddress(valAddr1), valAddr2, math.LegacyNewDec(100)) + d := types.NewDelegation(sdk.AccAddress(valAddr1).String(), valAddr2.String(), math.LegacyNewDec(100)) require.NotEmpty(t, d.String()) } @@ -80,9 +80,9 @@ func TestRedelegationString(t *testing.T) { func TestDelegationResponses(t *testing.T) { cdc := codec.NewLegacyAmino() - dr1 := types.NewDelegationResp(sdk.AccAddress(valAddr1), valAddr2, math.LegacyNewDec(5), + dr1 := types.NewDelegationResp(sdk.AccAddress(valAddr1).String(), valAddr2.String(), math.LegacyNewDec(5), sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(5))) - dr2 := types.NewDelegationResp(sdk.AccAddress(valAddr1), valAddr3, math.LegacyNewDec(5), + dr2 := types.NewDelegationResp(sdk.AccAddress(valAddr1).String(), valAddr3.String(), math.LegacyNewDec(5), sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(5))) drs := types.DelegationResponses{dr1, dr2} diff --git a/x/staking/types/exported.go b/x/staking/types/exported.go index 598b3a682edf..f9c8351e06bd 100644 --- a/x/staking/types/exported.go +++ b/x/staking/types/exported.go @@ -11,9 +11,9 @@ import ( // DelegationI delegation bond for a delegated proof of stake system type DelegationI interface { - GetDelegatorAddr() sdk.AccAddress // delegator sdk.AccAddress for the bond - GetValidatorAddr() sdk.ValAddress // validator operator address - GetShares() math.LegacyDec // amount of validator's shares held in this delegation + GetDelegatorAddr() string // delegator string for the bond + GetValidatorAddr() string // validator operator address + GetShares() math.LegacyDec // amount of validator's shares held in this delegation } // ValidatorI expected validator functions diff --git a/x/staking/types/staking.pb.go b/x/staking/types/staking.pb.go index 9a792b8b925a..3730eafd77fc 100644 --- a/x/staking/types/staking.pb.go +++ b/x/staking/types/staking.pb.go @@ -633,9 +633,9 @@ func (m *DVVTriplets) GetTriplets() []DVVTriplet { // owned by one delegator, and is associated with the voting power of one // validator. type Delegation struct { - // delegator_address is the bech32-encoded address of the delegator. + // delegator_address is the encoded address of the delegator. DelegatorAddress string `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty"` - // validator_address is the bech32-encoded address of the validator. + // validator_address is the encoded address of the validator. ValidatorAddress string `protobuf:"bytes,2,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty"` // shares define the delegation shares received. Shares cosmossdk_io_math.LegacyDec `protobuf:"bytes,3,opt,name=shares,proto3,customtype=cosmossdk.io/math.LegacyDec" json:"shares"` @@ -677,9 +677,9 @@ var xxx_messageInfo_Delegation proto.InternalMessageInfo // UnbondingDelegation stores all of a single delegator's unbonding bonds // for a single validator in an time-ordered list. type UnbondingDelegation struct { - // delegator_address is the bech32-encoded address of the delegator. + // delegator_address is the encoded address of the delegator. DelegatorAddress string `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty"` - // validator_address is the bech32-encoded address of the validator. + // validator_address is the encoded address of the validator. ValidatorAddress string `protobuf:"bytes,2,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty"` // entries are the unbonding delegation entries. Entries []UnbondingDelegationEntry `protobuf:"bytes,3,rep,name=entries,proto3" json:"entries"`