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