github.com/Finschia/finschia-sdk@v0.48.1/x/distribution/keeper/grpc_query.go (about) 1 package keeper 2 3 import ( 4 "context" 5 6 "google.golang.org/grpc/codes" 7 "google.golang.org/grpc/status" 8 9 "github.com/Finschia/finschia-sdk/store/prefix" 10 sdk "github.com/Finschia/finschia-sdk/types" 11 sdkerrors "github.com/Finschia/finschia-sdk/types/errors" 12 "github.com/Finschia/finschia-sdk/types/query" 13 "github.com/Finschia/finschia-sdk/x/distribution/types" 14 stakingtypes "github.com/Finschia/finschia-sdk/x/staking/types" 15 ) 16 17 var _ types.QueryServer = Keeper{} 18 19 // Params queries params of distribution module 20 func (k Keeper) Params(c context.Context, req *types.QueryParamsRequest) (*types.QueryParamsResponse, error) { 21 ctx := sdk.UnwrapSDKContext(c) 22 var params types.Params 23 k.paramSpace.GetParamSet(ctx, ¶ms) 24 25 return &types.QueryParamsResponse{Params: params}, nil 26 } 27 28 // ValidatorOutstandingRewards queries rewards of a validator address 29 func (k Keeper) ValidatorOutstandingRewards(c context.Context, req *types.QueryValidatorOutstandingRewardsRequest) (*types.QueryValidatorOutstandingRewardsResponse, error) { 30 if req == nil { 31 return nil, status.Error(codes.InvalidArgument, "invalid request") 32 } 33 34 if req.ValidatorAddress == "" { 35 return nil, status.Error(codes.InvalidArgument, "empty validator address") 36 } 37 38 ctx := sdk.UnwrapSDKContext(c) 39 40 valAdr, err := sdk.ValAddressFromBech32(req.ValidatorAddress) 41 if err != nil { 42 return nil, err 43 } 44 rewards := k.GetValidatorOutstandingRewards(ctx, valAdr) 45 46 return &types.QueryValidatorOutstandingRewardsResponse{Rewards: rewards}, nil 47 } 48 49 // ValidatorCommission queries accumulated commission for a validator 50 func (k Keeper) ValidatorCommission(c context.Context, req *types.QueryValidatorCommissionRequest) (*types.QueryValidatorCommissionResponse, error) { 51 if req == nil { 52 return nil, status.Error(codes.InvalidArgument, "invalid request") 53 } 54 55 if req.ValidatorAddress == "" { 56 return nil, status.Error(codes.InvalidArgument, "empty validator address") 57 } 58 59 ctx := sdk.UnwrapSDKContext(c) 60 61 valAdr, err := sdk.ValAddressFromBech32(req.ValidatorAddress) 62 if err != nil { 63 return nil, err 64 } 65 commission := k.GetValidatorAccumulatedCommission(ctx, valAdr) 66 67 return &types.QueryValidatorCommissionResponse{Commission: commission}, nil 68 } 69 70 // ValidatorSlashes queries slash events of a validator 71 func (k Keeper) ValidatorSlashes(c context.Context, req *types.QueryValidatorSlashesRequest) (*types.QueryValidatorSlashesResponse, error) { 72 if req == nil { 73 return nil, status.Error(codes.InvalidArgument, "invalid request") 74 } 75 76 if req.ValidatorAddress == "" { 77 return nil, status.Error(codes.InvalidArgument, "empty validator address") 78 } 79 80 if req.EndingHeight < req.StartingHeight { 81 return nil, status.Errorf(codes.InvalidArgument, "starting height greater than ending height (%d > %d)", req.StartingHeight, req.EndingHeight) 82 } 83 84 ctx := sdk.UnwrapSDKContext(c) 85 events := make([]types.ValidatorSlashEvent, 0) 86 store := ctx.KVStore(k.storeKey) 87 valAddr, err := sdk.ValAddressFromBech32(req.ValidatorAddress) 88 if err != nil { 89 return nil, status.Errorf(codes.InvalidArgument, "invalid validator address") 90 } 91 slashesStore := prefix.NewStore(store, types.GetValidatorSlashEventPrefix(valAddr)) 92 93 pageRes, err := query.FilteredPaginate(slashesStore, req.Pagination, func(key []byte, value []byte, accumulate bool) (bool, error) { 94 var result types.ValidatorSlashEvent 95 err := k.cdc.Unmarshal(value, &result) 96 if err != nil { 97 return false, err 98 } 99 100 if result.ValidatorPeriod < req.StartingHeight || result.ValidatorPeriod > req.EndingHeight { 101 return false, nil 102 } 103 104 if accumulate { 105 events = append(events, result) 106 } 107 return true, nil 108 }) 109 if err != nil { 110 return nil, err 111 } 112 113 return &types.QueryValidatorSlashesResponse{Slashes: events, Pagination: pageRes}, nil 114 } 115 116 // DelegationRewards the total rewards accrued by a delegation 117 func (k Keeper) DelegationRewards(c context.Context, req *types.QueryDelegationRewardsRequest) (*types.QueryDelegationRewardsResponse, error) { 118 if req == nil { 119 return nil, status.Error(codes.InvalidArgument, "invalid request") 120 } 121 122 if req.DelegatorAddress == "" { 123 return nil, status.Error(codes.InvalidArgument, "empty delegator address") 124 } 125 126 if req.ValidatorAddress == "" { 127 return nil, status.Error(codes.InvalidArgument, "empty validator address") 128 } 129 130 ctx := sdk.UnwrapSDKContext(c) 131 132 valAdr, err := sdk.ValAddressFromBech32(req.ValidatorAddress) 133 if err != nil { 134 return nil, err 135 } 136 137 val := k.stakingKeeper.Validator(ctx, valAdr) 138 if val == nil { 139 return nil, sdkerrors.Wrap(types.ErrNoValidatorExists, req.ValidatorAddress) 140 } 141 142 delAdr, err := sdk.AccAddressFromBech32(req.DelegatorAddress) 143 if err != nil { 144 return nil, err 145 } 146 del := k.stakingKeeper.Delegation(ctx, delAdr, valAdr) 147 if del == nil { 148 return nil, types.ErrNoDelegationExists 149 } 150 151 endingPeriod := k.IncrementValidatorPeriod(ctx, val) 152 rewards := k.CalculateDelegationRewards(ctx, val, del, endingPeriod) 153 154 return &types.QueryDelegationRewardsResponse{Rewards: rewards}, nil 155 } 156 157 // DelegationTotalRewards the total rewards accrued by a each validator 158 func (k Keeper) DelegationTotalRewards(c context.Context, req *types.QueryDelegationTotalRewardsRequest) (*types.QueryDelegationTotalRewardsResponse, error) { 159 if req == nil { 160 return nil, status.Error(codes.InvalidArgument, "invalid request") 161 } 162 163 if req.DelegatorAddress == "" { 164 return nil, status.Error(codes.InvalidArgument, "empty delegator address") 165 } 166 167 ctx := sdk.UnwrapSDKContext(c) 168 169 total := sdk.DecCoins{} 170 var delRewards []types.DelegationDelegatorReward 171 172 delAdr, err := sdk.AccAddressFromBech32(req.DelegatorAddress) 173 if err != nil { 174 return nil, err 175 } 176 177 k.stakingKeeper.IterateDelegations( 178 ctx, delAdr, 179 func(_ int64, del stakingtypes.DelegationI) (stop bool) { 180 valAddr := del.GetValidatorAddr() 181 val := k.stakingKeeper.Validator(ctx, valAddr) 182 endingPeriod := k.IncrementValidatorPeriod(ctx, val) 183 delReward := k.CalculateDelegationRewards(ctx, val, del, endingPeriod) 184 185 delRewards = append(delRewards, types.NewDelegationDelegatorReward(valAddr, delReward)) 186 total = total.Add(delReward...) 187 return false 188 }, 189 ) 190 191 return &types.QueryDelegationTotalRewardsResponse{Rewards: delRewards, Total: total}, nil 192 } 193 194 // DelegatorValidators queries the validators list of a delegator 195 func (k Keeper) DelegatorValidators(c context.Context, req *types.QueryDelegatorValidatorsRequest) (*types.QueryDelegatorValidatorsResponse, error) { 196 if req == nil { 197 return nil, status.Error(codes.InvalidArgument, "invalid request") 198 } 199 200 if req.DelegatorAddress == "" { 201 return nil, status.Error(codes.InvalidArgument, "empty delegator address") 202 } 203 204 ctx := sdk.UnwrapSDKContext(c) 205 delAdr, err := sdk.AccAddressFromBech32(req.DelegatorAddress) 206 if err != nil { 207 return nil, err 208 } 209 var validators []string 210 211 k.stakingKeeper.IterateDelegations( 212 ctx, delAdr, 213 func(_ int64, del stakingtypes.DelegationI) (stop bool) { 214 validators = append(validators, del.GetValidatorAddr().String()) 215 return false 216 }, 217 ) 218 219 return &types.QueryDelegatorValidatorsResponse{Validators: validators}, nil 220 } 221 222 // DelegatorWithdrawAddress queries Query/delegatorWithdrawAddress 223 func (k Keeper) DelegatorWithdrawAddress(c context.Context, req *types.QueryDelegatorWithdrawAddressRequest) (*types.QueryDelegatorWithdrawAddressResponse, error) { 224 if req == nil { 225 return nil, status.Error(codes.InvalidArgument, "invalid request") 226 } 227 228 if req.DelegatorAddress == "" { 229 return nil, status.Error(codes.InvalidArgument, "empty delegator address") 230 } 231 delAdr, err := sdk.AccAddressFromBech32(req.DelegatorAddress) 232 if err != nil { 233 return nil, err 234 } 235 236 ctx := sdk.UnwrapSDKContext(c) 237 withdrawAddr := k.GetDelegatorWithdrawAddr(ctx, delAdr) 238 239 return &types.QueryDelegatorWithdrawAddressResponse{WithdrawAddress: withdrawAddr.String()}, nil 240 } 241 242 // CommunityPool queries the community pool coins 243 func (k Keeper) CommunityPool(c context.Context, req *types.QueryCommunityPoolRequest) (*types.QueryCommunityPoolResponse, error) { 244 ctx := sdk.UnwrapSDKContext(c) 245 pool := k.GetFeePoolCommunityCoins(ctx) 246 247 return &types.QueryCommunityPoolResponse{Pool: pool}, nil 248 }