github.com/Finschia/finschia-sdk@v0.48.1/x/distribution/keeper/querier.go (about) 1 package keeper 2 3 import ( 4 "encoding/json" 5 6 abci "github.com/tendermint/tendermint/abci/types" 7 8 "github.com/Finschia/finschia-sdk/codec" 9 sdk "github.com/Finschia/finschia-sdk/types" 10 sdkerrors "github.com/Finschia/finschia-sdk/types/errors" 11 "github.com/Finschia/finschia-sdk/x/distribution/types" 12 stakingtypes "github.com/Finschia/finschia-sdk/x/staking/types" 13 ) 14 15 func NewQuerier(k Keeper, legacyQuerierCdc *codec.LegacyAmino) 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, legacyQuerierCdc) 20 21 case types.QueryValidatorOutstandingRewards: 22 return queryValidatorOutstandingRewards(ctx, path[1:], req, k, legacyQuerierCdc) 23 24 case types.QueryValidatorCommission: 25 return queryValidatorCommission(ctx, path[1:], req, k, legacyQuerierCdc) 26 27 case types.QueryValidatorSlashes: 28 return queryValidatorSlashes(ctx, path[1:], req, k, legacyQuerierCdc) 29 30 case types.QueryDelegationRewards: 31 return queryDelegationRewards(ctx, path[1:], req, k, legacyQuerierCdc) 32 33 case types.QueryDelegatorTotalRewards: 34 return queryDelegatorTotalRewards(ctx, path[1:], req, k, legacyQuerierCdc) 35 36 case types.QueryDelegatorValidators: 37 return queryDelegatorValidators(ctx, path[1:], req, k, legacyQuerierCdc) 38 39 case types.QueryWithdrawAddr: 40 return queryDelegatorWithdrawAddress(ctx, path[1:], req, k, legacyQuerierCdc) 41 42 case types.QueryCommunityPool: 43 return queryCommunityPool(ctx, path[1:], req, k, legacyQuerierCdc) 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, _ []string, _ abci.RequestQuery, k Keeper, legacyQuerierCdc *codec.LegacyAmino) ([]byte, error) { 52 params := k.GetParams(ctx) 53 54 res, err := codec.MarshalJSONIndent(legacyQuerierCdc, 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, _ []string, req abci.RequestQuery, k Keeper, legacyQuerierCdc *codec.LegacyAmino) ([]byte, error) { 63 var params types.QueryValidatorOutstandingRewardsParams 64 err := legacyQuerierCdc.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.GetRewards() == nil { 71 rewards.Rewards = sdk.DecCoins{} 72 } 73 74 bz, err := codec.MarshalJSONIndent(legacyQuerierCdc, 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, _ []string, req abci.RequestQuery, k Keeper, legacyQuerierCdc *codec.LegacyAmino) ([]byte, error) { 83 var params types.QueryValidatorCommissionParams 84 err := legacyQuerierCdc.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.Commission == nil { 91 commission.Commission = sdk.DecCoins{} 92 } 93 94 bz, err := codec.MarshalJSONIndent(legacyQuerierCdc, 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, _ []string, req abci.RequestQuery, k Keeper, legacyQuerierCdc *codec.LegacyAmino) ([]byte, error) { 103 var params types.QueryValidatorSlashesParams 104 err := legacyQuerierCdc.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(legacyQuerierCdc, 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, legacyQuerierCdc *codec.LegacyAmino) ([]byte, error) { 126 var params types.QueryDelegationRewardsParams 127 err := legacyQuerierCdc.UnmarshalJSON(req.Data, ¶ms) 128 if err != nil { 129 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) 130 } 131 132 // branch the context to isolate state changes 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(legacyQuerierCdc, 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, legacyQuerierCdc *codec.LegacyAmino) ([]byte, error) { 160 var params types.QueryDelegatorParams 161 err := legacyQuerierCdc.UnmarshalJSON(req.Data, ¶ms) 162 if err != nil { 163 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) 164 } 165 166 // branch the context to isolate state changes 167 ctx, _ = ctx.CacheContext() 168 169 total := sdk.DecCoins{} 170 171 var delRewards []types.DelegationDelegatorReward 172 173 k.stakingKeeper.IterateDelegations( 174 ctx, params.DelegatorAddress, 175 func(_ int64, del stakingtypes.DelegationI) (stop bool) { 176 valAddr := del.GetValidatorAddr() 177 val := k.stakingKeeper.Validator(ctx, valAddr) 178 endingPeriod := k.IncrementValidatorPeriod(ctx, val) 179 delReward := k.CalculateDelegationRewards(ctx, val, del, endingPeriod) 180 181 delRewards = append(delRewards, types.NewDelegationDelegatorReward(valAddr, delReward)) 182 total = total.Add(delReward...) 183 return false 184 }, 185 ) 186 187 totalRewards := types.NewQueryDelegatorTotalRewardsResponse(delRewards, total) 188 189 bz, err := json.Marshal(totalRewards) 190 if err != nil { 191 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) 192 } 193 194 return bz, nil 195 } 196 197 func queryDelegatorValidators(ctx sdk.Context, _ []string, req abci.RequestQuery, k Keeper, legacyQuerierCdc *codec.LegacyAmino) ([]byte, error) { 198 var params types.QueryDelegatorParams 199 err := legacyQuerierCdc.UnmarshalJSON(req.Data, ¶ms) 200 if err != nil { 201 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) 202 } 203 204 // branch the context to isolate state changes 205 ctx, _ = ctx.CacheContext() 206 207 var validators []sdk.ValAddress 208 209 k.stakingKeeper.IterateDelegations( 210 ctx, params.DelegatorAddress, 211 func(_ int64, del stakingtypes.DelegationI) (stop bool) { 212 validators = append(validators, del.GetValidatorAddr()) 213 return false 214 }, 215 ) 216 217 bz, err := codec.MarshalJSONIndent(legacyQuerierCdc, validators) 218 if err != nil { 219 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) 220 } 221 222 return bz, nil 223 } 224 225 func queryDelegatorWithdrawAddress(ctx sdk.Context, _ []string, req abci.RequestQuery, k Keeper, legacyQuerierCdc *codec.LegacyAmino) ([]byte, error) { 226 var params types.QueryDelegatorWithdrawAddrParams 227 err := legacyQuerierCdc.UnmarshalJSON(req.Data, ¶ms) 228 if err != nil { 229 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) 230 } 231 232 // branch the context to isolate state changes 233 ctx, _ = ctx.CacheContext() 234 withdrawAddr := k.GetDelegatorWithdrawAddr(ctx, params.DelegatorAddress) 235 236 bz, err := codec.MarshalJSONIndent(legacyQuerierCdc, withdrawAddr) 237 if err != nil { 238 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) 239 } 240 241 return bz, nil 242 } 243 244 func queryCommunityPool(ctx sdk.Context, _ []string, _ abci.RequestQuery, k Keeper, legacyQuerierCdc *codec.LegacyAmino) ([]byte, error) { 245 pool := k.GetFeePoolCommunityCoins(ctx) 246 if pool == nil { 247 pool = sdk.DecCoins{} 248 } 249 250 bz, err := legacyQuerierCdc.MarshalJSON(pool) 251 if err != nil { 252 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) 253 } 254 255 return bz, nil 256 }