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  }