From b78c272090e82ab0b5737a27b1c3b0cc372801d1 Mon Sep 17 00:00:00 2001 From: Emmanuel T Odeke Date: Tue, 10 Oct 2023 11:30:11 +0300 Subject: [PATCH] fix(x/slashing/keeper): hoist non-changing addresses parsing out of redelegation loop This change hoists out, the parsing of non-changing validator address and delegator address which before were being re-parsed in every loop of the redelegation entries, parsing them once and reusing the already parsed addresses. Fixes #18032 --- CHANGELOG.md | 1 + x/staking/keeper/slash.go | 21 +++++++++++---------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e152f9200d2..fd93e227a08a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,6 +50,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### Improvements +* (x/staking/keeper) [#18035](https://github.com/cosmos/cosmos-sdk/pull/18035) Hoisted out of the redelegation loop, the non-changing validator and delegator addresses parsing. * (keyring) [#17913](https://github.com/cosmos/cosmos-sdk/pull/17913) Add `NewAutoCLIKeyring` for creating an AutoCLI keyring from a SDK keyring. * (codec) [#17913](https://github.com/cosmos/cosmos-sdk/pull/17913) `codectypes.NewAnyWithValue` supports proto v2 messages. * (client) [#17503](https://github.com/cosmos/cosmos-sdk/pull/17503) Add `client.Context{}.WithAddressCodec`, `WithValidatorAddressCodec`, `WithConsensusAddressCodec` to provide address codecs to the client context. See the [UPGRADING.md](./UPGRADING.md) for more details. diff --git a/x/staking/keeper/slash.go b/x/staking/keeper/slash.go index 5a0886141ff2..9cdd62ef8b11 100644 --- a/x/staking/keeper/slash.go +++ b/x/staking/keeper/slash.go @@ -287,6 +287,16 @@ func (k Keeper) SlashRedelegation(ctx context.Context, srcValidator types.Valida totalSlashAmount = math.ZeroInt() bondedBurnedAmount, notBondedBurnedAmount := math.ZeroInt(), math.ZeroInt() + valDstAddr, err := k.validatorAddressCodec.StringToBytes(redelegation.ValidatorDstAddress) + if err != nil { + return math.ZeroInt(), fmt.Errorf("SlashRedelegation: could not parse validator destination address: %w", err) + } + + delegatorAddress, err := k.authKeeper.AddressCodec().StringToBytes(redelegation.DelegatorAddress) + if err != nil { + return math.ZeroInt(), fmt.Errorf("SlashRedelegation: could not parse delegator address: %w", err) + } + // perform slashing on all entries within the redelegation for _, entry := range redelegation.Entries { // If redelegation started before this height, stake didn't contribute to infraction @@ -310,16 +320,7 @@ func (k Keeper) SlashRedelegation(ctx context.Context, srcValidator types.Valida continue } - valDstAddr, err := k.validatorAddressCodec.StringToBytes(redelegation.ValidatorDstAddress) - if err != nil { - panic(err) - } - - delegatorAddress, err := k.authKeeper.AddressCodec().StringToBytes(redelegation.DelegatorAddress) - if err != nil { - panic(err) - } - + // Delegations can be dynamic hence need to be looked up on every redelegation entry loop. delegation, err := k.Delegations.Get(ctx, collections.Join(sdk.AccAddress(delegatorAddress), sdk.ValAddress(valDstAddr))) if err != nil { // If deleted, delegation has zero shares, and we can't unbond any more