github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/x/staking/keeper/alias_functions.go (about) 1 package keeper 2 3 import ( 4 "fmt" 5 6 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 7 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/staking/exported" 8 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/staking/types" 9 ) 10 11 //_______________________________________________________________________ 12 // Validator Set 13 14 // iterate through the validator set and perform the provided function 15 func (k Keeper) IterateValidators(ctx sdk.Context, fn func(index int64, validator exported.ValidatorI) (stop bool)) { 16 store := ctx.KVStore(k.storeKey) 17 iterator := sdk.KVStorePrefixIterator(store, types.ValidatorsKey) 18 defer iterator.Close() 19 i := int64(0) 20 for ; iterator.Valid(); iterator.Next() { 21 validator := types.MustUnmarshalValidator(k.cdc, iterator.Value()) 22 stop := fn(i, validator) // XXX is this safe will the validator unexposed fields be able to get written to? 23 if stop { 24 break 25 } 26 i++ 27 } 28 } 29 30 // iterate through the bonded validator set and perform the provided function 31 func (k Keeper) IterateBondedValidatorsByPower(ctx sdk.Context, fn func(index int64, validator exported.ValidatorI) (stop bool)) { 32 store := ctx.KVStore(k.storeKey) 33 maxValidators := k.MaxValidators(ctx) 34 35 iterator := sdk.KVStoreReversePrefixIterator(store, types.ValidatorsByPowerIndexKey) 36 defer iterator.Close() 37 38 i := int64(0) 39 for ; iterator.Valid() && i < int64(maxValidators); iterator.Next() { 40 address := iterator.Value() 41 validator := k.mustGetValidator(ctx, address) 42 43 if validator.IsBonded() { 44 stop := fn(i, validator) // XXX is this safe will the validator unexposed fields be able to get written to? 45 if stop { 46 break 47 } 48 i++ 49 } 50 } 51 } 52 53 // iterate through the active validator set and perform the provided function 54 func (k Keeper) IterateLastValidators(ctx sdk.Context, fn func(index int64, validator exported.ValidatorI) (stop bool)) { 55 iterator := k.LastValidatorsIterator(ctx) 56 defer iterator.Close() 57 i := int64(0) 58 for ; iterator.Valid(); iterator.Next() { 59 address := types.AddressFromLastValidatorPowerKey(iterator.Key()) 60 validator, found := k.GetValidator(ctx, address) 61 if !found { 62 panic(fmt.Sprintf("validator record not found for address: %v\n", address)) 63 } 64 65 stop := fn(i, validator) // XXX is this safe will the validator unexposed fields be able to get written to? 66 if stop { 67 break 68 } 69 i++ 70 } 71 } 72 73 // Validator gets the Validator interface for a particular address 74 func (k Keeper) Validator(ctx sdk.Context, address sdk.ValAddress) exported.ValidatorI { 75 val, found := k.GetValidator(ctx, address) 76 if !found { 77 return nil 78 } 79 return val 80 } 81 82 // ValidatorByConsAddr gets the validator interface for a particular pubkey 83 func (k Keeper) ValidatorByConsAddr(ctx sdk.Context, addr sdk.ConsAddress) exported.ValidatorI { 84 val, found := k.GetValidatorByConsAddr(ctx, addr) 85 if !found { 86 return nil 87 } 88 return val 89 } 90 91 //_______________________________________________________________________ 92 // Delegation Set 93 94 // Returns self as it is both a validatorset and delegationset 95 func (k Keeper) GetValidatorSet() types.ValidatorSet { 96 return nil 97 } 98 99 // Delegation get the delegation interface for a particular set of delegator and validator addresses 100 func (k Keeper) Delegation(ctx sdk.Context, addrDel sdk.AccAddress, addrVal sdk.ValAddress) exported.DelegationI { 101 bond, ok := k.GetDelegation(ctx, addrDel, addrVal) 102 if !ok { 103 return nil 104 } 105 106 return bond 107 } 108 109 // iterate through all of the delegations from a delegator 110 func (k Keeper) IterateDelegations(ctx sdk.Context, delAddr sdk.AccAddress, 111 fn func(index int64, del exported.DelegationI) (stop bool)) { 112 113 store := ctx.KVStore(k.storeKey) 114 delegatorPrefixKey := types.GetDelegationsKey(delAddr) 115 iterator := sdk.KVStorePrefixIterator(store, delegatorPrefixKey) // smallest to largest 116 defer iterator.Close() 117 for i := int64(0); iterator.Valid(); iterator.Next() { 118 del := types.MustUnmarshalDelegation(k.cdc, iterator.Value()) 119 stop := fn(i, del) 120 if stop { 121 break 122 } 123 i++ 124 } 125 } 126 127 // return all delegations used during genesis dump 128 // TODO: remove this func, change all usage for iterate functionality 129 func (k Keeper) GetAllSDKDelegations(ctx sdk.Context) (delegations []types.Delegation) { 130 store := ctx.KVStore(k.storeKey) 131 iterator := sdk.KVStorePrefixIterator(store, types.DelegationKey) 132 defer iterator.Close() 133 134 for ; iterator.Valid(); iterator.Next() { 135 delegation := types.MustUnmarshalDelegation(k.cdc, iterator.Value()) 136 delegations = append(delegations, delegation) 137 } 138 return delegations 139 } 140 141 func (k Keeper) IsValidator(ctx sdk.Context, addr sdk.AccAddress) bool { 142 var curValidators []string 143 // fetch all the bonded validators, insert them into currValidators 144 k.IterateBondedValidatorsByPower(ctx, func(index int64, validator exported.ValidatorI) (stop bool) { 145 curValidators = append(curValidators, validator.GetOperator().String()) 146 return false 147 }) 148 149 valStr := sdk.ValAddress(addr).String() 150 for _, val := range curValidators { 151 if valStr == val { 152 return true 153 } 154 } 155 return false 156 }