github.com/Finschia/finschia-sdk@v0.49.1/x/distribution/keeper/querier_test.go (about)

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