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

     1  package keeper
     2  
     3  import (
     4  	"strings"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/require"
     8  
     9  	abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types"
    10  
    11  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
    12  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    13  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/distribution/types"
    14  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/staking"
    15  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/supply"
    16  )
    17  
    18  const custom = "custom"
    19  
    20  func getQueriedParams(t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier sdk.Querier) types.Params {
    21  	var params types.Params
    22  
    23  	bz, err := querier(ctx, []string{types.QueryParams}, abci.RequestQuery{})
    24  	require.Nil(t, err)
    25  	require.Nil(t, cdc.UnmarshalJSON(bz, &params))
    26  
    27  	return params
    28  }
    29  
    30  func getQueriedValidatorOutstandingRewards(t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier sdk.Querier, validatorAddr sdk.ValAddress) (outstandingRewards sdk.DecCoins) {
    31  	query := abci.RequestQuery{
    32  		Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryValidatorOutstandingRewards}, "/"),
    33  		Data: cdc.MustMarshalJSON(types.NewQueryValidatorOutstandingRewardsParams(validatorAddr)),
    34  	}
    35  
    36  	bz, err := querier(ctx, []string{types.QueryValidatorOutstandingRewards}, query)
    37  	require.Nil(t, err)
    38  	require.Nil(t, cdc.UnmarshalJSON(bz, &outstandingRewards))
    39  
    40  	return
    41  }
    42  
    43  func getQueriedValidatorCommission(t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier sdk.Querier, validatorAddr sdk.ValAddress) (validatorCommission sdk.DecCoins) {
    44  	query := abci.RequestQuery{
    45  		Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryValidatorCommission}, "/"),
    46  		Data: cdc.MustMarshalJSON(types.NewQueryValidatorCommissionParams(validatorAddr)),
    47  	}
    48  
    49  	bz, err := querier(ctx, []string{types.QueryValidatorCommission}, query)
    50  	require.Nil(t, err)
    51  	require.Nil(t, cdc.UnmarshalJSON(bz, &validatorCommission))
    52  
    53  	return
    54  }
    55  
    56  func getQueriedValidatorSlashes(t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier sdk.Querier, validatorAddr sdk.ValAddress, startHeight uint64, endHeight uint64) (slashes []types.ValidatorSlashEvent) {
    57  	query := abci.RequestQuery{
    58  		Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryValidatorSlashes}, "/"),
    59  		Data: cdc.MustMarshalJSON(types.NewQueryValidatorSlashesParams(validatorAddr, startHeight, endHeight)),
    60  	}
    61  
    62  	bz, err := querier(ctx, []string{types.QueryValidatorSlashes}, query)
    63  	require.Nil(t, err)
    64  	require.Nil(t, cdc.UnmarshalJSON(bz, &slashes))
    65  
    66  	return
    67  }
    68  
    69  func getQueriedDelegationRewards(t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier sdk.Querier, delegatorAddr sdk.AccAddress, validatorAddr sdk.ValAddress) (rewards sdk.DecCoins) {
    70  	query := abci.RequestQuery{
    71  		Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryDelegationRewards}, "/"),
    72  		Data: cdc.MustMarshalJSON(types.NewQueryDelegationRewardsParams(delegatorAddr, validatorAddr)),
    73  	}
    74  
    75  	bz, err := querier(ctx, []string{types.QueryDelegationRewards}, query)
    76  	require.Nil(t, err)
    77  	require.Nil(t, cdc.UnmarshalJSON(bz, &rewards))
    78  
    79  	return
    80  }
    81  
    82  func getQueriedDelegatorTotalRewards(t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier sdk.Querier, delegatorAddr sdk.AccAddress) (response types.QueryDelegatorTotalRewardsResponse) {
    83  	query := abci.RequestQuery{
    84  		Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryDelegatorTotalRewards}, "/"),
    85  		Data: cdc.MustMarshalJSON(types.NewQueryDelegatorParams(delegatorAddr)),
    86  	}
    87  
    88  	bz, err := querier(ctx, []string{types.QueryDelegatorTotalRewards}, query)
    89  	require.Nil(t, err)
    90  	require.Nil(t, cdc.UnmarshalJSON(bz, &response))
    91  
    92  	return
    93  }
    94  
    95  func getQueriedCommunityPool(t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier sdk.Querier) (ptr []byte) {
    96  	query := abci.RequestQuery{
    97  		Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryCommunityPool}, ""),
    98  		Data: []byte{},
    99  	}
   100  
   101  	cp, err := querier(ctx, []string{types.QueryCommunityPool}, query)
   102  	require.Nil(t, err)
   103  	require.Nil(t, cdc.UnmarshalJSON(cp, &ptr))
   104  
   105  	return
   106  }
   107  
   108  func TestQueries(t *testing.T) {
   109  	cdc := codec.New()
   110  	types.RegisterCodec(cdc)
   111  	supply.RegisterCodec(cdc)
   112  	ctx, _, keeper, sk, _ := CreateTestInputDefault(t, false, 100)
   113  	querier := NewQuerier(keeper)
   114  
   115  	// test param queries
   116  	params := types.Params{
   117  		CommunityTax:        sdk.NewDecWithPrec(3, 1),
   118  		BaseProposerReward:  sdk.NewDecWithPrec(2, 1),
   119  		BonusProposerReward: sdk.NewDecWithPrec(1, 1),
   120  		WithdrawAddrEnabled: true,
   121  	}
   122  
   123  	keeper.SetParams(ctx, params)
   124  
   125  	paramsRes := getQueriedParams(t, ctx, cdc, querier)
   126  	require.Equal(t, params.CommunityTax, paramsRes.CommunityTax)
   127  	require.Equal(t, params.BaseProposerReward, paramsRes.BaseProposerReward)
   128  	require.Equal(t, params.BonusProposerReward, paramsRes.BonusProposerReward)
   129  	require.Equal(t, params.WithdrawAddrEnabled, paramsRes.WithdrawAddrEnabled)
   130  
   131  	// test outstanding rewards query
   132  	outstandingRewards := sdk.DecCoins{{Denom: "mytoken", Amount: sdk.NewDec(3)}, {Denom: "myothertoken", Amount: sdk.NewDecWithPrec(3, 7)}}
   133  	keeper.SetValidatorOutstandingRewards(ctx, valOpAddr1, outstandingRewards)
   134  	retOutstandingRewards := getQueriedValidatorOutstandingRewards(t, ctx, cdc, querier, valOpAddr1)
   135  	require.Equal(t, outstandingRewards, retOutstandingRewards)
   136  
   137  	// test validator commission query
   138  	commission := sdk.DecCoins{{Denom: "token1", Amount: sdk.NewDec(4)}, {Denom: "token2", Amount: sdk.NewDec(2)}}
   139  	keeper.SetValidatorAccumulatedCommission(ctx, valOpAddr1, commission)
   140  	retCommission := getQueriedValidatorCommission(t, ctx, cdc, querier, valOpAddr1)
   141  	require.Equal(t, commission, retCommission)
   142  
   143  	// test delegator's total rewards query
   144  	delRewards := getQueriedDelegatorTotalRewards(t, ctx, cdc, querier, sdk.AccAddress(valOpAddr1))
   145  	require.Equal(t, types.QueryDelegatorTotalRewardsResponse{}, delRewards)
   146  
   147  	// test validator slashes query with height range
   148  	slashOne := types.NewValidatorSlashEvent(3, sdk.NewDecWithPrec(5, 1))
   149  	slashTwo := types.NewValidatorSlashEvent(7, sdk.NewDecWithPrec(6, 1))
   150  	keeper.SetValidatorSlashEvent(ctx, valOpAddr1, 3, 0, slashOne)
   151  	keeper.SetValidatorSlashEvent(ctx, valOpAddr1, 7, 0, slashTwo)
   152  	slashes := getQueriedValidatorSlashes(t, ctx, cdc, querier, valOpAddr1, 0, 2)
   153  	require.Equal(t, 0, len(slashes))
   154  	slashes = getQueriedValidatorSlashes(t, ctx, cdc, querier, valOpAddr1, 0, 5)
   155  	require.Equal(t, []types.ValidatorSlashEvent{slashOne}, slashes)
   156  	slashes = getQueriedValidatorSlashes(t, ctx, cdc, querier, valOpAddr1, 0, 10)
   157  	require.Equal(t, []types.ValidatorSlashEvent{slashOne, slashTwo}, slashes)
   158  
   159  	// test delegation rewards query
   160  	sh := staking.NewHandler(sk)
   161  	comm := staking.NewCommissionRates(sdk.NewDecWithPrec(5, 1), sdk.NewDecWithPrec(5, 1), sdk.NewDec(0))
   162  	msg := staking.NewMsgCreateValidator(
   163  		valOpAddr1, valConsPk1, sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100)), staking.Description{}, comm, sdk.OneInt(),
   164  	)
   165  
   166  	res, err := sh(ctx, msg)
   167  	require.NoError(t, err)
   168  	require.NotNil(t, res)
   169  
   170  	staking.EndBlocker(ctx, sk)
   171  
   172  	val := sk.Validator(ctx, valOpAddr1)
   173  	rewards := getQueriedDelegationRewards(t, ctx, cdc, querier, sdk.AccAddress(valOpAddr1), valOpAddr1)
   174  	require.True(t, rewards.IsZero())
   175  	initial := int64(10)
   176  	ctx.SetBlockHeight(ctx.BlockHeight() + 1)
   177  	tokens := sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDec(initial)}}
   178  	keeper.AllocateTokensToValidator(ctx, val, tokens)
   179  	rewards = getQueriedDelegationRewards(t, ctx, cdc, querier, sdk.AccAddress(valOpAddr1), valOpAddr1)
   180  	require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDec(initial / 2)}}, rewards)
   181  
   182  	// test delegator's total rewards query
   183  	delRewards = getQueriedDelegatorTotalRewards(t, ctx, cdc, querier, sdk.AccAddress(valOpAddr1))
   184  	expectedDelReward := types.NewDelegationDelegatorReward(valOpAddr1,
   185  		sdk.DecCoins{sdk.NewInt64DecCoin(sdk.DefaultBondDenom, 5)})
   186  	wantDelRewards := types.NewQueryDelegatorTotalRewardsResponse(
   187  		[]types.DelegationDelegatorReward{expectedDelReward}, expectedDelReward.Reward)
   188  	require.Equal(t, wantDelRewards, delRewards)
   189  
   190  	// currently community pool hold nothing so we should return null
   191  	communityPool := getQueriedCommunityPool(t, ctx, cdc, querier)
   192  	require.Nil(t, communityPool)
   193  }