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  }