github.com/cosmos/cosmos-sdk@v0.50.10/x/staking/keeper/alias_functions.go (about) 1 package keeper 2 3 import ( 4 "context" 5 6 storetypes "cosmossdk.io/store/types" 7 8 sdk "github.com/cosmos/cosmos-sdk/types" 9 "github.com/cosmos/cosmos-sdk/x/staking/types" 10 ) 11 12 // Validator Set 13 14 // IterateValidators iterates through the validator set and perform the provided function 15 func (k Keeper) IterateValidators(ctx context.Context, fn func(index int64, validator types.ValidatorI) (stop bool)) error { 16 store := k.storeService.OpenKVStore(ctx) 17 iterator, err := store.Iterator(types.ValidatorsKey, storetypes.PrefixEndBytes(types.ValidatorsKey)) 18 if err != nil { 19 return err 20 } 21 defer iterator.Close() 22 23 i := int64(0) 24 25 for ; iterator.Valid(); iterator.Next() { 26 validator, err := types.UnmarshalValidator(k.cdc, iterator.Value()) 27 if err != nil { 28 return err 29 } 30 stop := fn(i, validator) // XXX is this safe will the validator unexposed fields be able to get written to? 31 32 if stop { 33 break 34 } 35 i++ 36 } 37 38 return nil 39 } 40 41 // IterateBondedValidatorsByPower iterates through the bonded validator set and perform the provided function 42 func (k Keeper) IterateBondedValidatorsByPower(ctx context.Context, fn func(index int64, validator types.ValidatorI) (stop bool)) error { 43 store := k.storeService.OpenKVStore(ctx) 44 maxValidators, err := k.MaxValidators(ctx) 45 if err != nil { 46 return err 47 } 48 49 iterator, err := store.ReverseIterator(types.ValidatorsByPowerIndexKey, storetypes.PrefixEndBytes(types.ValidatorsByPowerIndexKey)) 50 if err != nil { 51 return err 52 } 53 defer iterator.Close() 54 55 i := int64(0) 56 for ; iterator.Valid() && i < int64(maxValidators); iterator.Next() { 57 address := iterator.Value() 58 validator := k.mustGetValidator(ctx, address) 59 60 if validator.IsBonded() { 61 stop := fn(i, validator) // XXX is this safe will the validator unexposed fields be able to get written to? 62 if stop { 63 break 64 } 65 i++ 66 } 67 } 68 69 return nil 70 } 71 72 // IterateLastValidators iterates through the active validator set and perform the provided function 73 func (k Keeper) IterateLastValidators(ctx context.Context, fn func(index int64, validator types.ValidatorI) (stop bool)) error { 74 iterator, err := k.LastValidatorsIterator(ctx) 75 if err != nil { 76 return err 77 } 78 defer iterator.Close() 79 80 i := int64(0) 81 82 for ; iterator.Valid(); iterator.Next() { 83 address := types.AddressFromLastValidatorPowerKey(iterator.Key()) 84 85 validator, err := k.GetValidator(ctx, address) 86 if err != nil { 87 return err 88 } 89 90 stop := fn(i, validator) // XXX is this safe will the validator unexposed fields be able to get written to? 91 if stop { 92 break 93 } 94 i++ 95 } 96 return nil 97 } 98 99 // Validator gets the Validator interface for a particular address 100 func (k Keeper) Validator(ctx context.Context, address sdk.ValAddress) (types.ValidatorI, error) { 101 return k.GetValidator(ctx, address) 102 } 103 104 // ValidatorByConsAddr gets the validator interface for a particular pubkey 105 func (k Keeper) ValidatorByConsAddr(ctx context.Context, addr sdk.ConsAddress) (types.ValidatorI, error) { 106 return k.GetValidatorByConsAddr(ctx, addr) 107 } 108 109 // Delegation Set 110 111 // GetValidatorSet returns self as it is both a validatorset and delegationset 112 func (k Keeper) GetValidatorSet() types.ValidatorSet { 113 return k 114 } 115 116 // Delegation gets the delegation interface for a particular set of delegator and validator addresses 117 func (k Keeper) Delegation(ctx context.Context, addrDel sdk.AccAddress, addrVal sdk.ValAddress) (types.DelegationI, error) { 118 bond, err := k.GetDelegation(ctx, addrDel, addrVal) 119 if err != nil { 120 return nil, err 121 } 122 123 return bond, nil 124 } 125 126 // IterateDelegations iterates through all of the delegations from a delegator 127 func (k Keeper) IterateDelegations(ctx context.Context, delAddr sdk.AccAddress, 128 fn func(index int64, del types.DelegationI) (stop bool), 129 ) error { 130 store := k.storeService.OpenKVStore(ctx) 131 delegatorPrefixKey := types.GetDelegationsKey(delAddr) 132 iterator, err := store.Iterator(delegatorPrefixKey, storetypes.PrefixEndBytes(delegatorPrefixKey)) 133 if err != nil { 134 return err 135 } 136 defer iterator.Close() 137 138 for i := int64(0); iterator.Valid(); iterator.Next() { 139 del, err := types.UnmarshalDelegation(k.cdc, iterator.Value()) 140 if err != nil { 141 return err 142 } 143 144 stop := fn(i, del) 145 if stop { 146 break 147 } 148 i++ 149 } 150 151 return nil 152 } 153 154 // GetAllSDKDelegations returns all delegations used during genesis dump 155 // TODO: remove this func, change all usage for iterate functionality 156 func (k Keeper) GetAllSDKDelegations(ctx context.Context) (delegations []types.Delegation, err error) { 157 store := k.storeService.OpenKVStore(ctx) 158 iterator, err := store.Iterator(types.DelegationKey, storetypes.PrefixEndBytes(types.DelegationKey)) 159 if err != nil { 160 return delegations, err 161 } 162 defer iterator.Close() 163 164 for ; iterator.Valid(); iterator.Next() { 165 delegation, err := types.UnmarshalDelegation(k.cdc, iterator.Value()) 166 if err != nil { 167 return delegations, err 168 } 169 delegations = append(delegations, delegation) 170 } 171 172 return 173 }