github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/staking/keeper/shares.go (about)

     1  package keeper
     2  
     3  import (
     4  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     5  	"github.com/fibonacci-chain/fbc/x/staking/types"
     6  )
     7  
     8  // GetShares gets the shares entity
     9  func (k Keeper) GetShares(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) (types.Shares, bool) {
    10  	store := ctx.KVStore(k.storeKey)
    11  	sharesBytes := store.Get(types.GetSharesKey(valAddr, delAddr))
    12  	var shares types.Shares
    13  	// the delegator never adds shares to this val before
    14  	if sharesBytes == nil {
    15  		return shares, false
    16  	}
    17  
    18  	shares = types.MustUnmarshalShares(k.cdcMarshl.GetCdc(), sharesBytes)
    19  	return shares, true
    20  }
    21  
    22  // SetShares sets the shares that added to validators to store
    23  func (k Keeper) SetShares(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress, shares types.Shares) {
    24  	key := types.GetSharesKey(valAddr, delAddr)
    25  	sharesBytes := k.cdcMarshl.GetCdc().MustMarshalBinaryLengthPrefixed(shares)
    26  	ctx.KVStore(k.storeKey).Set(key, sharesBytes)
    27  }
    28  
    29  // DeleteShares deletes shares entire from store
    30  func (k Keeper) DeleteShares(ctx sdk.Context, valAddr sdk.ValAddress, delAddr sdk.AccAddress) {
    31  	ctx.KVStore(k.storeKey).Delete(types.GetSharesKey(valAddr, delAddr))
    32  }
    33  
    34  // GetValidatorAllShares returns all shares added to a specific validator and it's useful for querier
    35  func (k Keeper) GetValidatorAllShares(ctx sdk.Context, valAddr sdk.ValAddress) types.SharesResponses {
    36  	store := ctx.KVStore(k.storeKey)
    37  
    38  	var sharesResps types.SharesResponses
    39  	iterator := sdk.KVStorePrefixIterator(store, types.GetSharesToValidatorsKey(valAddr))
    40  	defer iterator.Close()
    41  
    42  	for ; iterator.Valid(); iterator.Next() {
    43  		// 1.get the delegator address
    44  		delAddr := sdk.AccAddress(iterator.Key()[1+sdk.AddrLen:])
    45  
    46  		// 2.get the shares
    47  		shares := types.MustUnmarshalShares(k.cdcMarshl.GetCdc(), iterator.Value())
    48  
    49  		// 3.assemble the result
    50  		sharesResps = append(sharesResps, types.NewSharesResponse(delAddr, shares))
    51  	}
    52  
    53  	return sharesResps
    54  }
    55  
    56  // IterateShares iterates through all of the shares from store
    57  func (k Keeper) IterateShares(ctx sdk.Context, fn func(index int64, delAddr sdk.AccAddress, valAddr sdk.ValAddress,
    58  	shares types.Shares) (stop bool)) {
    59  	store := ctx.KVStore(k.storeKey)
    60  	iterator := sdk.KVStorePrefixIterator(store, types.SharesKey)
    61  	defer iterator.Close()
    62  
    63  	boundIndex := sdk.AddrLen + 1
    64  	for i := int64(0); iterator.Valid(); iterator.Next() {
    65  		// 1.get delegator/validator address from the key
    66  		key := iterator.Key()
    67  		valAddr, delAddr := sdk.ValAddress(key[1:boundIndex]), sdk.AccAddress(key[boundIndex:])
    68  
    69  		// 2.get the shares
    70  		var shares types.Shares
    71  		k.cdcMarshl.GetCdc().MustUnmarshalBinaryLengthPrefixed(iterator.Value(), &shares)
    72  
    73  		// 3.call back the function
    74  		if stop := fn(i, delAddr, valAddr, shares); stop {
    75  			break
    76  		}
    77  		i++
    78  	}
    79  }
    80  
    81  // GetDelegatorsByProxy returns all delegator addresses binding a proxy and it's useful for querier
    82  func (k Keeper) GetDelegatorsByProxy(ctx sdk.Context, proxyAddr sdk.AccAddress) (delAddrs []sdk.AccAddress) {
    83  	k.IterateProxy(ctx, proxyAddr, false, func(_ int64, delAddr, _ sdk.AccAddress) (stop bool) {
    84  		delAddrs = append(delAddrs, delAddr)
    85  		return false
    86  	})
    87  
    88  	return
    89  }