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