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