github.com/cosmos/cosmos-sdk@v0.50.10/x/staking/keeper/query_utils.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 // GetDelegatorValidators returns all validators that a delegator is bonded to. If maxRetrieve is supplied, the respective amount will be returned. 13 func (k Keeper) GetDelegatorValidators( 14 ctx context.Context, delegatorAddr sdk.AccAddress, maxRetrieve uint32, 15 ) (types.Validators, error) { 16 validators := make([]types.Validator, maxRetrieve) 17 store := k.storeService.OpenKVStore(ctx) 18 delegatorPrefixKey := types.GetDelegationsKey(delegatorAddr) 19 20 iterator, err := store.Iterator(delegatorPrefixKey, storetypes.PrefixEndBytes(delegatorPrefixKey)) // smallest to largest 21 if err != nil { 22 return types.Validators{}, err 23 } 24 defer iterator.Close() 25 26 i := 0 27 for ; iterator.Valid() && i < int(maxRetrieve); iterator.Next() { 28 delegation := types.MustUnmarshalDelegation(k.cdc, iterator.Value()) 29 30 valAddr, err := k.validatorAddressCodec.StringToBytes(delegation.GetValidatorAddr()) 31 if err != nil { 32 return types.Validators{}, err 33 } 34 35 validator, err := k.GetValidator(ctx, valAddr) 36 if err != nil { 37 return types.Validators{}, err 38 } 39 40 validators[i] = validator 41 i++ 42 } 43 44 return types.Validators{Validators: validators[:i], ValidatorCodec: k.validatorAddressCodec}, nil // trim 45 } 46 47 // GetDelegatorValidator returns a validator that a delegator is bonded to 48 func (k Keeper) GetDelegatorValidator( 49 ctx context.Context, delegatorAddr sdk.AccAddress, validatorAddr sdk.ValAddress, 50 ) (validator types.Validator, err error) { 51 delegation, err := k.GetDelegation(ctx, delegatorAddr, validatorAddr) 52 if err != nil { 53 return validator, err 54 } 55 56 valAddr, err := k.validatorAddressCodec.StringToBytes(delegation.GetValidatorAddr()) 57 if err != nil { 58 return validator, err 59 } 60 61 return k.GetValidator(ctx, valAddr) 62 } 63 64 // GetAllDelegatorDelegations returns all delegations of a delegator 65 func (k Keeper) GetAllDelegatorDelegations(ctx context.Context, delegator sdk.AccAddress) ([]types.Delegation, error) { 66 delegations := make([]types.Delegation, 0) 67 68 store := k.storeService.OpenKVStore(ctx) 69 delegatorPrefixKey := types.GetDelegationsKey(delegator) 70 71 iterator, err := store.Iterator(delegatorPrefixKey, storetypes.PrefixEndBytes(delegatorPrefixKey)) // smallest to largest 72 if err != nil { 73 return nil, err 74 } 75 defer iterator.Close() 76 77 for i := 0; iterator.Valid(); iterator.Next() { 78 delegation, err := types.UnmarshalDelegation(k.cdc, iterator.Value()) 79 if err != nil { 80 return nil, err 81 } 82 delegations = append(delegations, delegation) 83 i++ 84 } 85 86 return delegations, nil 87 } 88 89 // GetAllUnbondingDelegations returns all unbonding-delegations of a delegator 90 func (k Keeper) GetAllUnbondingDelegations(ctx context.Context, delegator sdk.AccAddress) ([]types.UnbondingDelegation, error) { 91 unbondingDelegations := make([]types.UnbondingDelegation, 0) 92 93 store := k.storeService.OpenKVStore(ctx) 94 delegatorPrefixKey := types.GetUBDsKey(delegator) 95 96 iterator, err := store.Iterator(delegatorPrefixKey, storetypes.PrefixEndBytes(delegatorPrefixKey)) // smallest to largest 97 if err != nil { 98 return nil, err 99 } 100 defer iterator.Close() 101 102 for i := 0; iterator.Valid(); iterator.Next() { 103 unbondingDelegation, err := types.UnmarshalUBD(k.cdc, iterator.Value()) 104 if err != nil { 105 return nil, err 106 } 107 unbondingDelegations = append(unbondingDelegations, unbondingDelegation) 108 i++ 109 } 110 111 return unbondingDelegations, nil 112 } 113 114 // GetAllRedelegations returns all redelegations of a delegator 115 func (k Keeper) GetAllRedelegations( 116 ctx context.Context, delegator sdk.AccAddress, srcValAddress, dstValAddress sdk.ValAddress, 117 ) ([]types.Redelegation, error) { 118 store := k.storeService.OpenKVStore(ctx) 119 delegatorPrefixKey := types.GetREDsKey(delegator) 120 121 iterator, err := store.Iterator(delegatorPrefixKey, storetypes.PrefixEndBytes(delegatorPrefixKey)) // smallest to largest 122 if err != nil { 123 return nil, err 124 } 125 defer iterator.Close() 126 127 srcValFilter := !(srcValAddress.Empty()) 128 dstValFilter := !(dstValAddress.Empty()) 129 130 redelegations := []types.Redelegation{} 131 132 for ; iterator.Valid(); iterator.Next() { 133 redelegation := types.MustUnmarshalRED(k.cdc, iterator.Value()) 134 valSrcAddr, err := k.validatorAddressCodec.StringToBytes(redelegation.ValidatorSrcAddress) 135 if err != nil { 136 return nil, err 137 } 138 valDstAddr, err := k.validatorAddressCodec.StringToBytes(redelegation.ValidatorDstAddress) 139 if err != nil { 140 return nil, err 141 } 142 if srcValFilter && !(srcValAddress.Equals(sdk.ValAddress(valSrcAddr))) { 143 continue 144 } 145 146 if dstValFilter && !(dstValAddress.Equals(sdk.ValAddress(valDstAddr))) { 147 continue 148 } 149 150 redelegations = append(redelegations, redelegation) 151 } 152 153 return redelegations, nil 154 }