github.com/Finschia/finschia-sdk@v0.48.1/x/staking/keeper/query_utils.go (about)

     1  package keeper
     2  
     3  import (
     4  	sdk "github.com/Finschia/finschia-sdk/types"
     5  	"github.com/Finschia/finschia-sdk/x/staking/types"
     6  )
     7  
     8  // Return all validators that a delegator is bonded to. If maxRetrieve is supplied, the respective amount will be returned.
     9  func (k Keeper) GetDelegatorValidators(
    10  	ctx sdk.Context, delegatorAddr sdk.AccAddress, maxRetrieve uint32,
    11  ) types.Validators {
    12  	validators := make([]types.Validator, maxRetrieve)
    13  
    14  	store := ctx.KVStore(k.storeKey)
    15  	delegatorPrefixKey := types.GetDelegationsKey(delegatorAddr)
    16  
    17  	iterator := sdk.KVStorePrefixIterator(store, delegatorPrefixKey) // smallest to largest
    18  	defer iterator.Close()
    19  
    20  	i := 0
    21  	for ; iterator.Valid() && i < int(maxRetrieve); iterator.Next() {
    22  		delegation := types.MustUnmarshalDelegation(k.cdc, iterator.Value())
    23  
    24  		validator, found := k.GetValidator(ctx, delegation.GetValidatorAddr())
    25  		if !found {
    26  			panic(types.ErrNoValidatorFound)
    27  		}
    28  
    29  		validators[i] = validator
    30  		i++
    31  	}
    32  
    33  	return validators[:i] // trim
    34  }
    35  
    36  // return a validator that a delegator is bonded to
    37  func (k Keeper) GetDelegatorValidator(
    38  	ctx sdk.Context, delegatorAddr sdk.AccAddress, validatorAddr sdk.ValAddress,
    39  ) (validator types.Validator, err error) {
    40  	delegation, found := k.GetDelegation(ctx, delegatorAddr, validatorAddr)
    41  	if !found {
    42  		return validator, types.ErrNoDelegation
    43  	}
    44  
    45  	validator, found = k.GetValidator(ctx, delegation.GetValidatorAddr())
    46  	if !found {
    47  		panic(types.ErrNoValidatorFound)
    48  	}
    49  
    50  	return validator, nil
    51  }
    52  
    53  // return all delegations for a delegator
    54  func (k Keeper) GetAllDelegatorDelegations(ctx sdk.Context, delegator sdk.AccAddress) []types.Delegation {
    55  	delegations := make([]types.Delegation, 0)
    56  
    57  	store := ctx.KVStore(k.storeKey)
    58  	delegatorPrefixKey := types.GetDelegationsKey(delegator)
    59  
    60  	iterator := sdk.KVStorePrefixIterator(store, delegatorPrefixKey) // smallest to largest
    61  	defer iterator.Close()
    62  
    63  	i := 0
    64  
    65  	for ; iterator.Valid(); iterator.Next() {
    66  		delegation := types.MustUnmarshalDelegation(k.cdc, iterator.Value())
    67  		delegations = append(delegations, delegation)
    68  		i++
    69  	}
    70  
    71  	return delegations
    72  }
    73  
    74  // return all unbonding-delegations for a delegator
    75  func (k Keeper) GetAllUnbondingDelegations(ctx sdk.Context, delegator sdk.AccAddress) []types.UnbondingDelegation {
    76  	unbondingDelegations := make([]types.UnbondingDelegation, 0)
    77  
    78  	store := ctx.KVStore(k.storeKey)
    79  	delegatorPrefixKey := types.GetUBDsKey(delegator)
    80  
    81  	iterator := sdk.KVStorePrefixIterator(store, delegatorPrefixKey) // smallest to largest
    82  	defer iterator.Close()
    83  
    84  	for i := 0; iterator.Valid(); iterator.Next() {
    85  		unbondingDelegation := types.MustUnmarshalUBD(k.cdc, iterator.Value())
    86  		unbondingDelegations = append(unbondingDelegations, unbondingDelegation)
    87  		i++
    88  	}
    89  
    90  	return unbondingDelegations
    91  }
    92  
    93  // return all redelegations for a delegator
    94  func (k Keeper) GetAllRedelegations(
    95  	ctx sdk.Context, delegator sdk.AccAddress, srcValAddress, dstValAddress sdk.ValAddress,
    96  ) []types.Redelegation {
    97  	store := ctx.KVStore(k.storeKey)
    98  	delegatorPrefixKey := types.GetREDsKey(delegator)
    99  
   100  	iterator := sdk.KVStorePrefixIterator(store, delegatorPrefixKey) // smallest to largest
   101  	defer iterator.Close()
   102  
   103  	srcValFilter := !(srcValAddress.Empty())
   104  	dstValFilter := !(dstValAddress.Empty())
   105  
   106  	redelegations := []types.Redelegation{}
   107  
   108  	for ; iterator.Valid(); iterator.Next() {
   109  		redelegation := types.MustUnmarshalRED(k.cdc, iterator.Value())
   110  		valSrcAddr, err := sdk.ValAddressFromBech32(redelegation.ValidatorSrcAddress)
   111  		if err != nil {
   112  			panic(err)
   113  		}
   114  		valDstAddr, err := sdk.ValAddressFromBech32(redelegation.ValidatorDstAddress)
   115  		if err != nil {
   116  			panic(err)
   117  		}
   118  		if srcValFilter && !(srcValAddress.Equals(valSrcAddr)) {
   119  			continue
   120  		}
   121  
   122  		if dstValFilter && !(dstValAddress.Equals(valDstAddr)) {
   123  			continue
   124  		}
   125  
   126  		redelegations = append(redelegations, redelegation)
   127  	}
   128  
   129  	return redelegations
   130  }