github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/distribution/keeper/querier_distr_proposal.go (about) 1 package keeper 2 3 import ( 4 "encoding/json" 5 6 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec" 7 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 8 sdkerrors "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/errors" 9 abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types" 10 comm "github.com/fibonacci-chain/fbc/x/common" 11 "github.com/fibonacci-chain/fbc/x/distribution/types" 12 ) 13 14 func queryDelegationRewards(ctx sdk.Context, _ []string, req abci.RequestQuery, k Keeper) ([]byte, error) { 15 if !k.CheckDistributionProposalValid(ctx) { 16 return nil, types.ErrCodeNotSupportDistributionProposal() 17 } 18 19 var params types.QueryDelegationRewardsParams 20 err := k.cdc.UnmarshalJSON(req.Data, ¶ms) 21 if err != nil { 22 return nil, comm.ErrUnMarshalJSONFailed(err.Error()) 23 } 24 25 // cache-wrap context as to not persist state changes during querying 26 ctx, _ = ctx.CacheContext() 27 28 val := k.stakingKeeper.Validator(ctx, params.ValidatorAddress) 29 if val == nil { 30 return nil, sdkerrors.Wrap(types.ErrCodeEmptyValidatorDistInfo(), params.ValidatorAddress.String()) 31 } 32 33 del := k.stakingKeeper.Delegator(ctx, params.DelegatorAddress) 34 if del == nil { 35 return nil, types.ErrCodeEmptyDelegationDistInfo() 36 } 37 38 found := false 39 for _, valAddr := range del.GetShareAddedValidatorAddresses() { 40 if valAddr.Equals(params.ValidatorAddress) { 41 found = true 42 } 43 } 44 if !found { 45 return nil, sdkerrors.Wrap(types.ErrCodeEmptyDelegationVoteValidator(), params.ValidatorAddress.String()) 46 } 47 48 logger := k.Logger(ctx) 49 if !k.HasDelegatorStartingInfo(ctx, val.GetOperator(), params.DelegatorAddress) { 50 if del.GetLastAddedShares().IsZero() { 51 return nil, sdkerrors.Wrap(types.ErrCodeZeroDelegationShares(), params.DelegatorAddress.String()) 52 } 53 k.initExistedDelegationStartInfo(ctx, val, del) 54 } 55 56 endingPeriod := k.incrementValidatorPeriod(ctx, val) 57 rewards := k.calculateDelegationRewards(ctx, val, params.DelegatorAddress, endingPeriod) 58 if rewards == nil { 59 rewards = sdk.DecCoins{} 60 } 61 62 logger.Debug("queryDelegationRewards", "Validator", val.GetOperator(), 63 "Delegator", params.DelegatorAddress, "Reward", rewards) 64 65 bz, err := codec.MarshalJSONIndent(k.cdc, rewards) 66 if err != nil { 67 return nil, comm.ErrMarshalJSONFailed(err.Error()) 68 } 69 70 return bz, nil 71 } 72 73 func queryDelegatorTotalRewards(ctx sdk.Context, _ []string, req abci.RequestQuery, k Keeper) ([]byte, error) { 74 if !k.CheckDistributionProposalValid(ctx) { 75 return nil, types.ErrCodeNotSupportDistributionProposal() 76 } 77 78 var params types.QueryDelegatorParams 79 err := k.cdc.UnmarshalJSON(req.Data, ¶ms) 80 if err != nil { 81 return nil, comm.ErrUnMarshalJSONFailed(err.Error()) 82 } 83 84 // cache-wrap context as to not persist state changes during querying 85 ctx, _ = ctx.CacheContext() 86 87 del := k.stakingKeeper.Delegator(ctx, params.DelegatorAddress) 88 if del == nil { 89 return nil, types.ErrCodeEmptyDelegationDistInfo() 90 } 91 92 total := sdk.DecCoins{} 93 var delRewards []types.DelegationDelegatorReward 94 95 for _, valAddr := range del.GetShareAddedValidatorAddresses() { 96 val := k.stakingKeeper.Validator(ctx, valAddr) 97 if val == nil { 98 continue 99 } 100 101 logger := k.Logger(ctx) 102 if !k.HasDelegatorStartingInfo(ctx, val.GetOperator(), params.DelegatorAddress) { 103 if del.GetLastAddedShares().IsZero() { 104 return nil, sdkerrors.Wrap(types.ErrCodeZeroDelegationShares(), params.DelegatorAddress.String()) 105 } 106 k.initExistedDelegationStartInfo(ctx, val, del) 107 } 108 109 endingPeriod := k.incrementValidatorPeriod(ctx, val) 110 delReward := k.calculateDelegationRewards(ctx, val, params.DelegatorAddress, endingPeriod) 111 if delReward == nil { 112 delReward = sdk.DecCoins{} 113 } 114 delRewards = append(delRewards, types.NewDelegationDelegatorReward(valAddr, delReward)) 115 total = total.Add(delReward...) 116 logger.Debug("queryDelegatorTotalRewards", "Validator", val.GetOperator(), 117 "Delegator", params.DelegatorAddress, "Reward", delReward) 118 } 119 120 totalRewards := types.NewQueryDelegatorTotalRewardsResponse(delRewards, total) 121 122 bz, err := json.Marshal(totalRewards) 123 if err != nil { 124 return nil, comm.ErrMarshalJSONFailed(err.Error()) 125 } 126 127 return bz, nil 128 } 129 130 func queryValidatorOutstandingRewards(ctx sdk.Context, path []string, req abci.RequestQuery, k Keeper) ([]byte, error) { 131 if !k.CheckDistributionProposalValid(ctx) { 132 return nil, types.ErrCodeNotSupportDistributionProposal() 133 } 134 135 var params types.QueryValidatorOutstandingRewardsParams 136 err := k.cdc.UnmarshalJSON(req.Data, ¶ms) 137 if err != nil { 138 return nil, comm.ErrUnMarshalJSONFailed(err.Error()) 139 } 140 141 rewards := k.GetValidatorOutstandingRewards(ctx, params.ValidatorAddress) 142 if rewards == nil { 143 rewards = sdk.DecCoins{} 144 } 145 146 bz, err := codec.MarshalJSONIndent(k.cdc, rewards) 147 if err != nil { 148 return nil, comm.ErrMarshalJSONFailed(err.Error()) 149 } 150 151 return bz, nil 152 } 153 154 func queryDelegatorValidators(ctx sdk.Context, _ []string, req abci.RequestQuery, k Keeper) ([]byte, error) { 155 var params types.QueryDelegatorParams 156 err := k.cdc.UnmarshalJSON(req.Data, ¶ms) 157 if err != nil { 158 return nil, comm.ErrUnMarshalJSONFailed(err.Error()) 159 } 160 161 // cache-wrap context as to not persist state changes during querying 162 ctx, _ = ctx.CacheContext() 163 164 delegator := k.stakingKeeper.Delegator(ctx, params.DelegatorAddress) 165 166 if delegator == nil { 167 return nil, types.ErrCodeEmptyDelegationDistInfo() 168 } 169 170 bz, err := codec.MarshalJSONIndent(k.cdc, delegator.GetShareAddedValidatorAddresses()) 171 if err != nil { 172 return nil, comm.ErrMarshalJSONFailed(err.Error()) 173 } 174 175 return bz, nil 176 }