@@ -59,24 +59,30 @@ func CanWithdrawInvariant(k distr.Keeper, sk types.StakingKeeper) sdk.Invariant
5959
6060 var remaining sdk.DecCoins
6161
62+ valDelegationAddrs := make (map [string ][]sdk.AccAddress )
63+ for _ , del := range sk .GetAllSDKDelegations (ctx ) {
64+ valAddr := del .GetValidatorAddr ().String ()
65+ valDelegationAddrs [valAddr ] = append (valDelegationAddrs [valAddr ], del .GetDelegatorAddr ())
66+ }
67+
6268 // iterate over all validators
6369 sk .IterateValidators (ctx , func (_ int64 , val sdk.Validator ) (stop bool ) {
6470 _ = k .WithdrawValidatorCommission (ctx , val .GetOperator ())
65- // TODO fetch delegations just for the validator, requires sdk.ValidatorSet change
66- // iterate over all current delegations, withdraw rewards
67- dels := sk .GetAllSDKDelegations (ctx )
68- for _ , delegation := range dels {
69- if delegation .GetValidatorAddr ().String () == val .GetOperator ().String () {
70- err := k .WithdrawDelegationRewards (ctx , delegation .GetDelegatorAddr (), delegation .GetValidatorAddr ())
71- if err != nil {
71+
72+ delegationAddrs , ok := valDelegationAddrs [val .GetOperator ().String ()]
73+ if ok {
74+ for _ , delAddr := range delegationAddrs {
75+ if err := k .WithdrawDelegationRewards (ctx , delAddr , val .GetOperator ()); err != nil {
7276 panic (err )
7377 }
7478 }
7579 }
80+
7681 remaining = k .GetValidatorOutstandingRewards (ctx , val .GetOperator ())
7782 if len (remaining ) > 0 && remaining [0 ].Amount .LT (sdk .ZeroDec ()) {
7883 return true
7984 }
85+
8086 return false
8187 })
8288
0 commit comments