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