github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/distribution/keeper/querier_distr_proposal.go (about)

     1  package keeper
     2  
     3  import (
     4  	"encoding/json"
     5  
     6  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
     7  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     8  	sdkerrors "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/errors"
     9  	abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types"
    10  	comm "github.com/fibonacci-chain/fbc/x/common"
    11  	"github.com/fibonacci-chain/fbc/x/distribution/types"
    12  )
    13  
    14  func queryDelegationRewards(ctx sdk.Context, _ []string, req abci.RequestQuery, k Keeper) ([]byte, error) {
    15  	if !k.CheckDistributionProposalValid(ctx) {
    16  		return nil, types.ErrCodeNotSupportDistributionProposal()
    17  	}
    18  
    19  	var params types.QueryDelegationRewardsParams
    20  	err := k.cdc.UnmarshalJSON(req.Data, &params)
    21  	if err != nil {
    22  		return nil, comm.ErrUnMarshalJSONFailed(err.Error())
    23  	}
    24  
    25  	// cache-wrap context as to not persist state changes during querying
    26  	ctx, _ = ctx.CacheContext()
    27  
    28  	val := k.stakingKeeper.Validator(ctx, params.ValidatorAddress)
    29  	if val == nil {
    30  		return nil, sdkerrors.Wrap(types.ErrCodeEmptyValidatorDistInfo(), params.ValidatorAddress.String())
    31  	}
    32  
    33  	del := k.stakingKeeper.Delegator(ctx, params.DelegatorAddress)
    34  	if del == nil {
    35  		return nil, types.ErrCodeEmptyDelegationDistInfo()
    36  	}
    37  
    38  	found := false
    39  	for _, valAddr := range del.GetShareAddedValidatorAddresses() {
    40  		if valAddr.Equals(params.ValidatorAddress) {
    41  			found = true
    42  		}
    43  	}
    44  	if !found {
    45  		return nil, sdkerrors.Wrap(types.ErrCodeEmptyDelegationVoteValidator(), params.ValidatorAddress.String())
    46  	}
    47  
    48  	logger := k.Logger(ctx)
    49  	if !k.HasDelegatorStartingInfo(ctx, val.GetOperator(), params.DelegatorAddress) {
    50  		if del.GetLastAddedShares().IsZero() {
    51  			return nil, sdkerrors.Wrap(types.ErrCodeZeroDelegationShares(), params.DelegatorAddress.String())
    52  		}
    53  		k.initExistedDelegationStartInfo(ctx, val, del)
    54  	}
    55  
    56  	endingPeriod := k.incrementValidatorPeriod(ctx, val)
    57  	rewards := k.calculateDelegationRewards(ctx, val, params.DelegatorAddress, endingPeriod)
    58  	if rewards == nil {
    59  		rewards = sdk.DecCoins{}
    60  	}
    61  
    62  	logger.Debug("queryDelegationRewards", "Validator", val.GetOperator(),
    63  		"Delegator", params.DelegatorAddress, "Reward", rewards)
    64  
    65  	bz, err := codec.MarshalJSONIndent(k.cdc, rewards)
    66  	if err != nil {
    67  		return nil, comm.ErrMarshalJSONFailed(err.Error())
    68  	}
    69  
    70  	return bz, nil
    71  }
    72  
    73  func queryDelegatorTotalRewards(ctx sdk.Context, _ []string, req abci.RequestQuery, k Keeper) ([]byte, error) {
    74  	if !k.CheckDistributionProposalValid(ctx) {
    75  		return nil, types.ErrCodeNotSupportDistributionProposal()
    76  	}
    77  
    78  	var params types.QueryDelegatorParams
    79  	err := k.cdc.UnmarshalJSON(req.Data, &params)
    80  	if err != nil {
    81  		return nil, comm.ErrUnMarshalJSONFailed(err.Error())
    82  	}
    83  
    84  	// cache-wrap context as to not persist state changes during querying
    85  	ctx, _ = ctx.CacheContext()
    86  
    87  	del := k.stakingKeeper.Delegator(ctx, params.DelegatorAddress)
    88  	if del == nil {
    89  		return nil, types.ErrCodeEmptyDelegationDistInfo()
    90  	}
    91  
    92  	total := sdk.DecCoins{}
    93  	var delRewards []types.DelegationDelegatorReward
    94  
    95  	for _, valAddr := range del.GetShareAddedValidatorAddresses() {
    96  		val := k.stakingKeeper.Validator(ctx, valAddr)
    97  		if val == nil {
    98  			continue
    99  		}
   100  
   101  		logger := k.Logger(ctx)
   102  		if !k.HasDelegatorStartingInfo(ctx, val.GetOperator(), params.DelegatorAddress) {
   103  			if del.GetLastAddedShares().IsZero() {
   104  				return nil, sdkerrors.Wrap(types.ErrCodeZeroDelegationShares(), params.DelegatorAddress.String())
   105  			}
   106  			k.initExistedDelegationStartInfo(ctx, val, del)
   107  		}
   108  
   109  		endingPeriod := k.incrementValidatorPeriod(ctx, val)
   110  		delReward := k.calculateDelegationRewards(ctx, val, params.DelegatorAddress, endingPeriod)
   111  		if delReward == nil {
   112  			delReward = sdk.DecCoins{}
   113  		}
   114  		delRewards = append(delRewards, types.NewDelegationDelegatorReward(valAddr, delReward))
   115  		total = total.Add(delReward...)
   116  		logger.Debug("queryDelegatorTotalRewards", "Validator", val.GetOperator(),
   117  			"Delegator", params.DelegatorAddress, "Reward", delReward)
   118  	}
   119  
   120  	totalRewards := types.NewQueryDelegatorTotalRewardsResponse(delRewards, total)
   121  
   122  	bz, err := json.Marshal(totalRewards)
   123  	if err != nil {
   124  		return nil, comm.ErrMarshalJSONFailed(err.Error())
   125  	}
   126  
   127  	return bz, nil
   128  }
   129  
   130  func queryValidatorOutstandingRewards(ctx sdk.Context, path []string, req abci.RequestQuery, k Keeper) ([]byte, error) {
   131  	if !k.CheckDistributionProposalValid(ctx) {
   132  		return nil, types.ErrCodeNotSupportDistributionProposal()
   133  	}
   134  
   135  	var params types.QueryValidatorOutstandingRewardsParams
   136  	err := k.cdc.UnmarshalJSON(req.Data, &params)
   137  	if err != nil {
   138  		return nil, comm.ErrUnMarshalJSONFailed(err.Error())
   139  	}
   140  
   141  	rewards := k.GetValidatorOutstandingRewards(ctx, params.ValidatorAddress)
   142  	if rewards == nil {
   143  		rewards = sdk.DecCoins{}
   144  	}
   145  
   146  	bz, err := codec.MarshalJSONIndent(k.cdc, rewards)
   147  	if err != nil {
   148  		return nil, comm.ErrMarshalJSONFailed(err.Error())
   149  	}
   150  
   151  	return bz, nil
   152  }
   153  
   154  func queryDelegatorValidators(ctx sdk.Context, _ []string, req abci.RequestQuery, k Keeper) ([]byte, error) {
   155  	var params types.QueryDelegatorParams
   156  	err := k.cdc.UnmarshalJSON(req.Data, &params)
   157  	if err != nil {
   158  		return nil, comm.ErrUnMarshalJSONFailed(err.Error())
   159  	}
   160  
   161  	// cache-wrap context as to not persist state changes during querying
   162  	ctx, _ = ctx.CacheContext()
   163  
   164  	delegator := k.stakingKeeper.Delegator(ctx, params.DelegatorAddress)
   165  
   166  	if delegator == nil {
   167  		return nil, types.ErrCodeEmptyDelegationDistInfo()
   168  	}
   169  
   170  	bz, err := codec.MarshalJSONIndent(k.cdc, delegator.GetShareAddedValidatorAddresses())
   171  	if err != nil {
   172  		return nil, comm.ErrMarshalJSONFailed(err.Error())
   173  	}
   174  
   175  	return bz, nil
   176  }