Improve iterate validators dist. invariant (#3818)
This commit is contained in:
@@ -59,24 +59,30 @@ func CanWithdrawInvariant(k distr.Keeper, sk types.StakingKeeper) sdk.Invariant
|
|||||||
|
|
||||||
var remaining sdk.DecCoins
|
var remaining sdk.DecCoins
|
||||||
|
|
||||||
|
valDelegationAddrs := make(map[string][]sdk.AccAddress)
|
||||||
|
for _, del := range sk.GetAllSDKDelegations(ctx) {
|
||||||
|
valAddr := del.GetValidatorAddr().String()
|
||||||
|
valDelegationAddrs[valAddr] = append(valDelegationAddrs[valAddr], del.GetDelegatorAddr())
|
||||||
|
}
|
||||||
|
|
||||||
// iterate over all validators
|
// iterate over all validators
|
||||||
sk.IterateValidators(ctx, func(_ int64, val sdk.Validator) (stop bool) {
|
sk.IterateValidators(ctx, func(_ int64, val sdk.Validator) (stop bool) {
|
||||||
_ = k.WithdrawValidatorCommission(ctx, val.GetOperator())
|
_ = k.WithdrawValidatorCommission(ctx, val.GetOperator())
|
||||||
// TODO fetch delegations just for the validator, requires sdk.ValidatorSet change
|
|
||||||
// iterate over all current delegations, withdraw rewards
|
delegationAddrs, ok := valDelegationAddrs[val.GetOperator().String()]
|
||||||
dels := sk.GetAllSDKDelegations(ctx)
|
if ok {
|
||||||
for _, delegation := range dels {
|
for _, delAddr := range delegationAddrs {
|
||||||
if delegation.GetValidatorAddr().String() == val.GetOperator().String() {
|
if err := k.WithdrawDelegationRewards(ctx, delAddr, val.GetOperator()); err != nil {
|
||||||
err := k.WithdrawDelegationRewards(ctx, delegation.GetDelegatorAddr(), delegation.GetValidatorAddr())
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
remaining = k.GetValidatorOutstandingRewards(ctx, val.GetOperator())
|
remaining = k.GetValidatorOutstandingRewards(ctx, val.GetOperator())
|
||||||
if len(remaining) > 0 && remaining[0].Amount.LT(sdk.ZeroDec()) {
|
if len(remaining) > 0 && remaining[0].Amount.LT(sdk.ZeroDec()) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
return false
|
return false
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user