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, ¶ms)) 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 }