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  }