github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/x/distribution/keeper/querier.go (about) 1 package keeper 2 3 import ( 4 "encoding/json" 5 6 abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types" 7 8 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec" 9 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 10 sdkerrors "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/errors" 11 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/distribution/types" 12 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/staking/exported" 13 ) 14 15 func NewQuerier(k Keeper) sdk.Querier { 16 return func(ctx sdk.Context, path []string, req abci.RequestQuery) ([]byte, error) { 17 switch path[0] { 18 case types.QueryParams: 19 return queryParams(ctx, path[1:], req, k) 20 21 case types.QueryValidatorOutstandingRewards: 22 return queryValidatorOutstandingRewards(ctx, path[1:], req, k) 23 24 case types.QueryValidatorCommission: 25 return queryValidatorCommission(ctx, path[1:], req, k) 26 27 case types.QueryValidatorSlashes: 28 return queryValidatorSlashes(ctx, path[1:], req, k) 29 30 case types.QueryDelegationRewards: 31 return queryDelegationRewards(ctx, path[1:], req, k) 32 33 case types.QueryDelegatorTotalRewards: 34 return queryDelegatorTotalRewards(ctx, path[1:], req, k) 35 36 case types.QueryDelegatorValidators: 37 return queryDelegatorValidators(ctx, path[1:], req, k) 38 39 case types.QueryWithdrawAddr: 40 return queryDelegatorWithdrawAddress(ctx, path[1:], req, k) 41 42 case types.QueryCommunityPool: 43 return queryCommunityPool(ctx, path[1:], req, k) 44 45 default: 46 return nil, sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "unknown query path: %s", path[0]) 47 } 48 } 49 } 50 51 func queryParams(ctx sdk.Context, path []string, req abci.RequestQuery, k Keeper) ([]byte, error) { 52 params := k.GetParams(ctx) 53 54 res, err := codec.MarshalJSONIndent(k.cdc, params) 55 if err != nil { 56 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) 57 } 58 59 return res, nil 60 } 61 62 func queryValidatorOutstandingRewards(ctx sdk.Context, path []string, req abci.RequestQuery, k Keeper) ([]byte, error) { 63 var params types.QueryValidatorOutstandingRewardsParams 64 err := k.cdc.UnmarshalJSON(req.Data, ¶ms) 65 if err != nil { 66 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) 67 } 68 69 rewards := k.GetValidatorOutstandingRewards(ctx, params.ValidatorAddress) 70 if rewards == nil { 71 rewards = sdk.DecCoins{} 72 } 73 74 bz, err := codec.MarshalJSONIndent(k.cdc, rewards) 75 if err != nil { 76 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) 77 } 78 79 return bz, nil 80 } 81 82 func queryValidatorCommission(ctx sdk.Context, path []string, req abci.RequestQuery, k Keeper) ([]byte, error) { 83 var params types.QueryValidatorCommissionParams 84 err := k.cdc.UnmarshalJSON(req.Data, ¶ms) 85 if err != nil { 86 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) 87 } 88 89 commission := k.GetValidatorAccumulatedCommission(ctx, params.ValidatorAddress) 90 if commission == nil { 91 commission = sdk.DecCoins{} 92 } 93 94 bz, err := codec.MarshalJSONIndent(k.cdc, commission) 95 if err != nil { 96 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) 97 } 98 99 return bz, nil 100 } 101 102 func queryValidatorSlashes(ctx sdk.Context, path []string, req abci.RequestQuery, k Keeper) ([]byte, error) { 103 var params types.QueryValidatorSlashesParams 104 err := k.cdc.UnmarshalJSON(req.Data, ¶ms) 105 if err != nil { 106 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) 107 } 108 109 events := make([]types.ValidatorSlashEvent, 0) 110 k.IterateValidatorSlashEventsBetween(ctx, params.ValidatorAddress, params.StartingHeight, params.EndingHeight, 111 func(height uint64, event types.ValidatorSlashEvent) (stop bool) { 112 events = append(events, event) 113 return false 114 }, 115 ) 116 117 bz, err := codec.MarshalJSONIndent(k.cdc, events) 118 if err != nil { 119 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) 120 } 121 122 return bz, nil 123 } 124 125 func queryDelegationRewards(ctx sdk.Context, _ []string, req abci.RequestQuery, k Keeper) ([]byte, error) { 126 var params types.QueryDelegationRewardsParams 127 err := k.cdc.UnmarshalJSON(req.Data, ¶ms) 128 if err != nil { 129 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) 130 } 131 132 // cache-wrap context as to not persist state changes during querying 133 ctx, _ = ctx.CacheContext() 134 135 val := k.stakingKeeper.Validator(ctx, params.ValidatorAddress) 136 if val == nil { 137 return nil, sdkerrors.Wrap(types.ErrNoValidatorExists, params.ValidatorAddress.String()) 138 } 139 140 del := k.stakingKeeper.Delegation(ctx, params.DelegatorAddress, params.ValidatorAddress) 141 if del == nil { 142 return nil, types.ErrNoDelegationExists 143 } 144 145 endingPeriod := k.incrementValidatorPeriod(ctx, val) 146 rewards := k.calculateDelegationRewards(ctx, val, del, endingPeriod) 147 if rewards == nil { 148 rewards = sdk.DecCoins{} 149 } 150 151 bz, err := codec.MarshalJSONIndent(k.cdc, rewards) 152 if err != nil { 153 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) 154 } 155 156 return bz, nil 157 } 158 159 func queryDelegatorTotalRewards(ctx sdk.Context, _ []string, req abci.RequestQuery, k Keeper) ([]byte, error) { 160 var params types.QueryDelegatorParams 161 err := k.cdc.UnmarshalJSON(req.Data, ¶ms) 162 if err != nil { 163 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) 164 } 165 166 // cache-wrap context as to not persist state changes during querying 167 ctx, _ = ctx.CacheContext() 168 169 total := sdk.DecCoins{} 170 var delRewards []types.DelegationDelegatorReward 171 172 k.stakingKeeper.IterateDelegations( 173 ctx, params.DelegatorAddress, 174 func(_ int64, del exported.DelegationI) (stop bool) { 175 valAddr := del.GetValidatorAddr() 176 val := k.stakingKeeper.Validator(ctx, valAddr) 177 endingPeriod := k.incrementValidatorPeriod(ctx, val) 178 delReward := k.calculateDelegationRewards(ctx, val, del, endingPeriod) 179 180 delRewards = append(delRewards, types.NewDelegationDelegatorReward(valAddr, delReward)) 181 total = total.Add(delReward...) 182 return false 183 }, 184 ) 185 186 totalRewards := types.NewQueryDelegatorTotalRewardsResponse(delRewards, total) 187 188 bz, err := json.Marshal(totalRewards) 189 if err != nil { 190 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) 191 } 192 193 return bz, nil 194 } 195 196 func queryDelegatorValidators(ctx sdk.Context, _ []string, req abci.RequestQuery, k Keeper) ([]byte, error) { 197 var params types.QueryDelegatorParams 198 err := k.cdc.UnmarshalJSON(req.Data, ¶ms) 199 if err != nil { 200 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) 201 } 202 203 // cache-wrap context as to not persist state changes during querying 204 ctx, _ = ctx.CacheContext() 205 206 var validators []sdk.ValAddress 207 208 k.stakingKeeper.IterateDelegations( 209 ctx, params.DelegatorAddress, 210 func(_ int64, del exported.DelegationI) (stop bool) { 211 validators = append(validators, del.GetValidatorAddr()) 212 return false 213 }, 214 ) 215 216 bz, err := codec.MarshalJSONIndent(k.cdc, validators) 217 if err != nil { 218 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) 219 } 220 221 return bz, nil 222 } 223 224 func queryDelegatorWithdrawAddress(ctx sdk.Context, _ []string, req abci.RequestQuery, k Keeper) ([]byte, error) { 225 var params types.QueryDelegatorWithdrawAddrParams 226 err := k.cdc.UnmarshalJSON(req.Data, ¶ms) 227 if err != nil { 228 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) 229 } 230 231 // cache-wrap context as to not persist state changes during querying 232 ctx, _ = ctx.CacheContext() 233 withdrawAddr := k.GetDelegatorWithdrawAddr(ctx, params.DelegatorAddress) 234 235 bz, err := codec.MarshalJSONIndent(k.cdc, withdrawAddr) 236 if err != nil { 237 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) 238 } 239 240 return bz, nil 241 } 242 243 func queryCommunityPool(ctx sdk.Context, _ []string, req abci.RequestQuery, k Keeper) ([]byte, error) { 244 pool := k.GetFeePoolCommunityCoins(ctx) 245 if pool == nil { 246 pool = sdk.DecCoins{} 247 } 248 249 bz, err := k.cdc.MarshalJSON(pool) 250 if err != nil { 251 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) 252 } 253 254 return bz, nil 255 }