153 lines
4.3 KiB
Go
153 lines
4.3 KiB
Go
package keeper
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
"github.com/cosmos/cosmos-sdk/x/staking/exported"
|
|
"github.com/cosmos/cosmos-sdk/x/staking/types"
|
|
)
|
|
|
|
//_______________________________________________________________________
|
|
// Validator Set
|
|
|
|
// iterate through the validator set and perform the provided function
|
|
func (k Keeper) IterateValidators(ctx sdk.Context, fn func(index int64, validator exported.ValidatorI) (stop bool)) {
|
|
store := ctx.KVStore(k.storeKey)
|
|
|
|
iterator := sdk.KVStorePrefixIterator(store, types.ValidatorsKey)
|
|
defer iterator.Close()
|
|
|
|
i := int64(0)
|
|
|
|
for ; iterator.Valid(); iterator.Next() {
|
|
validator := types.MustUnmarshalValidator(k.cdc, iterator.Value())
|
|
stop := fn(i, validator) // XXX is this safe will the validator unexposed fields be able to get written to?
|
|
|
|
if stop {
|
|
break
|
|
}
|
|
i++
|
|
}
|
|
}
|
|
|
|
// iterate through the bonded validator set and perform the provided function
|
|
func (k Keeper) IterateBondedValidatorsByPower(ctx sdk.Context, fn func(index int64, validator exported.ValidatorI) (stop bool)) {
|
|
store := ctx.KVStore(k.storeKey)
|
|
maxValidators := k.MaxValidators(ctx)
|
|
|
|
iterator := sdk.KVStoreReversePrefixIterator(store, types.ValidatorsByPowerIndexKey)
|
|
defer iterator.Close()
|
|
|
|
i := int64(0)
|
|
for ; iterator.Valid() && i < int64(maxValidators); iterator.Next() {
|
|
address := iterator.Value()
|
|
validator := k.mustGetValidator(ctx, address)
|
|
|
|
if validator.IsBonded() {
|
|
stop := fn(i, validator) // XXX is this safe will the validator unexposed fields be able to get written to?
|
|
if stop {
|
|
break
|
|
}
|
|
i++
|
|
}
|
|
}
|
|
}
|
|
|
|
// iterate through the active validator set and perform the provided function
|
|
func (k Keeper) IterateLastValidators(ctx sdk.Context, fn func(index int64, validator exported.ValidatorI) (stop bool)) {
|
|
iterator := k.LastValidatorsIterator(ctx)
|
|
defer iterator.Close()
|
|
|
|
i := int64(0)
|
|
|
|
for ; iterator.Valid(); iterator.Next() {
|
|
address := types.AddressFromLastValidatorPowerKey(iterator.Key())
|
|
|
|
validator, found := k.GetValidator(ctx, address)
|
|
if !found {
|
|
panic(fmt.Sprintf("validator record not found for address: %v\n", address))
|
|
}
|
|
|
|
stop := fn(i, validator) // XXX is this safe will the validator unexposed fields be able to get written to?
|
|
if stop {
|
|
break
|
|
}
|
|
i++
|
|
}
|
|
}
|
|
|
|
// Validator gets the Validator interface for a particular address
|
|
func (k Keeper) Validator(ctx sdk.Context, address sdk.ValAddress) exported.ValidatorI {
|
|
val, found := k.GetValidator(ctx, address)
|
|
if !found {
|
|
return nil
|
|
}
|
|
|
|
return val
|
|
}
|
|
|
|
// ValidatorByConsAddr gets the validator interface for a particular pubkey
|
|
func (k Keeper) ValidatorByConsAddr(ctx sdk.Context, addr sdk.ConsAddress) exported.ValidatorI {
|
|
val, found := k.GetValidatorByConsAddr(ctx, addr)
|
|
if !found {
|
|
return nil
|
|
}
|
|
|
|
return val
|
|
}
|
|
|
|
//_______________________________________________________________________
|
|
// Delegation Set
|
|
|
|
// Returns self as it is both a validatorset and delegationset
|
|
func (k Keeper) GetValidatorSet() types.ValidatorSet {
|
|
return k
|
|
}
|
|
|
|
// Delegation get the delegation interface for a particular set of delegator and validator addresses
|
|
func (k Keeper) Delegation(ctx sdk.Context, addrDel sdk.AccAddress, addrVal sdk.ValAddress) exported.DelegationI {
|
|
bond, ok := k.GetDelegation(ctx, addrDel, addrVal)
|
|
if !ok {
|
|
return nil
|
|
}
|
|
|
|
return bond
|
|
}
|
|
|
|
// iterate through all of the delegations from a delegator
|
|
func (k Keeper) IterateDelegations(ctx sdk.Context, delAddr sdk.AccAddress,
|
|
fn func(index int64, del exported.DelegationI) (stop bool)) {
|
|
store := ctx.KVStore(k.storeKey)
|
|
delegatorPrefixKey := types.GetDelegationsKey(delAddr)
|
|
|
|
iterator := sdk.KVStorePrefixIterator(store, delegatorPrefixKey) // smallest to largest
|
|
defer iterator.Close()
|
|
|
|
for i := int64(0); iterator.Valid(); iterator.Next() {
|
|
del := types.MustUnmarshalDelegation(k.cdc, iterator.Value())
|
|
|
|
stop := fn(i, del)
|
|
if stop {
|
|
break
|
|
}
|
|
i++
|
|
}
|
|
}
|
|
|
|
// return all delegations used during genesis dump
|
|
// TODO: remove this func, change all usage for iterate functionality
|
|
func (k Keeper) GetAllSDKDelegations(ctx sdk.Context) (delegations []types.Delegation) {
|
|
store := ctx.KVStore(k.storeKey)
|
|
|
|
iterator := sdk.KVStorePrefixIterator(store, types.DelegationKey)
|
|
defer iterator.Close()
|
|
|
|
for ; iterator.Valid(); iterator.Next() {
|
|
delegation := types.MustUnmarshalDelegation(k.cdc, iterator.Value())
|
|
delegations = append(delegations, delegation)
|
|
}
|
|
|
|
return
|
|
}
|