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, &params)
    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  }