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 }