github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/distribution/keeper/querier_distr_proposal_test.go (about) 1 package keeper 2 3 import ( 4 "fmt" 5 "testing" 6 "time" 7 8 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 9 abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types" 10 tmtypes "github.com/fibonacci-chain/fbc/libs/tendermint/types" 11 "github.com/fibonacci-chain/fbc/x/distribution/types" 12 "github.com/fibonacci-chain/fbc/x/staking" 13 stakingexported "github.com/fibonacci-chain/fbc/x/staking/exported" 14 "github.com/stretchr/testify/require" 15 "github.com/tendermint/go-amino" 16 ) 17 18 func getQueriedValidatorOutstandingRewards(t *testing.T, ctx sdk.Context, querier sdk.Querier, 19 validatorAddr sdk.ValAddress) (outstandingRewards sdk.DecCoins) { 20 bz, err := amino.MarshalJSON(types.NewQueryValidatorCommissionParams(validatorAddr)) 21 require.NoError(t, err) 22 result, err := querier(ctx, []string{types.QueryValidatorOutstandingRewards}, abci.RequestQuery{Data: bz}) 23 require.NoError(t, err) 24 err = amino.UnmarshalJSON(result, &outstandingRewards) 25 require.NoError(t, err) 26 27 return outstandingRewards 28 } 29 30 func getQueriedValidatorCommission(t *testing.T, ctx sdk.Context, querier sdk.Querier, 31 validatorAddr sdk.ValAddress) (validatorCommission sdk.DecCoins) { 32 bz, err := amino.MarshalJSON(types.NewQueryValidatorCommissionParams(validatorAddr)) 33 require.NoError(t, err) 34 35 result, err := querier(ctx, []string{types.QueryValidatorCommission}, abci.RequestQuery{Data: bz}) 36 require.NoError(t, err) 37 38 err = amino.UnmarshalJSON(result, &validatorCommission) 39 require.NoError(t, err) 40 41 return validatorCommission 42 } 43 44 func getQueriedDelegatorTotalRewards(t *testing.T, ctx sdk.Context, querier sdk.Querier, 45 delegatorAddr sdk.AccAddress) (response types.QueryDelegatorTotalRewardsResponse) { 46 bz, err := amino.MarshalJSON(types.NewQueryDelegatorParams(delegatorAddr)) 47 require.NoError(t, err) 48 49 result, err := querier(ctx, []string{types.QueryDelegatorTotalRewards}, abci.RequestQuery{Data: bz}) 50 require.NoError(t, err) 51 52 err = amino.UnmarshalJSON(result, &response) 53 require.NoError(t, err) 54 55 return response 56 } 57 58 func getQueriedDelegationRewards(t *testing.T, ctx sdk.Context, querier sdk.Querier, 59 delegatorAddr sdk.AccAddress, validatorAddr sdk.ValAddress) (rewards sdk.DecCoins) { 60 bz, err := amino.MarshalJSON(types.NewQueryDelegationRewardsParams(delegatorAddr, validatorAddr)) 61 require.NoError(t, err) 62 63 result, err := querier(ctx, []string{types.QueryDelegationRewards}, abci.RequestQuery{Data: bz}) 64 require.NoError(t, err) 65 66 err = amino.UnmarshalJSON(result, &rewards) 67 require.NoError(t, err) 68 69 return rewards 70 } 71 72 func getQueriedCommunityPool(t *testing.T, ctx sdk.Context, querier sdk.Querier) (ptr []byte) { 73 result, err := querier(ctx, []string{types.QueryCommunityPool}, abci.RequestQuery{Data: nil}) 74 require.NoError(t, err) 75 76 err = amino.UnmarshalJSON(result, &ptr) 77 require.NoError(t, err) 78 79 return 80 } 81 82 func TestRewards(t *testing.T) { 83 tmtypes.UnittestOnlySetMilestoneVenus2Height(-1) 84 ctx, _, keeper, sk, _ := CreateTestInputDefault(t, false, 1000) 85 querier := NewQuerier(keeper) 86 87 keeper.SetInitExistedValidatorFlag(ctx, true) 88 keeper.SetDistributionType(ctx, types.DistributionTypeOnChain) 89 keeper.stakingKeeper.IterateValidators(ctx, func(index int64, validator stakingexported.ValidatorI) (stop bool) { 90 if validator != nil { 91 keeper.initExistedValidatorForDistrProposal(ctx, validator) 92 } 93 return false 94 }) 95 96 //try twice, do nothing 97 commissionBefore := keeper.GetValidatorAccumulatedCommission(ctx, valOpAddr1) 98 require.True(t, keeper.HasValidatorOutstandingRewards(ctx, valOpAddr1)) 99 validator := keeper.stakingKeeper.Validator(ctx, valOpAddr1) 100 keeper.initExistedValidatorForDistrProposal(ctx, validator) 101 commissionAfter := keeper.GetValidatorAccumulatedCommission(ctx, valOpAddr1) 102 require.Equal(t, commissionBefore, commissionAfter) 103 104 //test outstanding rewards query 105 outstandingRewards := sdk.DecCoins{{Denom: "mytoken", Amount: sdk.NewDec(3)}, {Denom: "myothertoken", Amount: sdk.NewDecWithPrec(3, 7)}} 106 keeper.SetValidatorOutstandingRewards(ctx, valOpAddr1, outstandingRewards) 107 require.Equal(t, outstandingRewards, getQueriedValidatorOutstandingRewards(t, ctx, querier, valOpAddr1)) 108 109 // test validator commission query 110 commission := sdk.DecCoins{{Denom: "token1", Amount: sdk.NewDec(4)}, {Denom: "token2", Amount: sdk.NewDec(2)}} 111 keeper.SetValidatorAccumulatedCommission(ctx, valOpAddr1, commission) 112 retCommission := getQueriedValidatorCommission(t, ctx, querier, valOpAddr1) 113 require.Equal(t, commission, retCommission) 114 115 // test delegator's total rewards query 116 delegateAmount, sdkErr := sdk.ParseDecCoin(fmt.Sprintf("100%s", sk.BondDenom(ctx))) 117 require.Nil(t, sdkErr) 118 dAddr1 := TestDelAddrs[0] 119 err := sk.Delegate(ctx, dAddr1, delegateAmount) 120 require.Nil(t, err) 121 122 ctx.SetBlockTime(time.Now()) 123 // add shares 124 vals, sdkErr := sk.GetValidatorsToAddShares(ctx, TestValAddrs) 125 require.Nil(t, sdkErr) 126 delegator, found := sk.GetDelegator(ctx, dAddr1) 127 require.True(t, found) 128 totalTokens := delegator.Tokens.Add(delegator.TotalDelegatedTokens) 129 shares, sdkErr := sk.AddSharesToValidators(ctx, dAddr1, vals, totalTokens) 130 require.Nil(t, sdkErr) 131 lenVals := len(vals) 132 valAddrs := make([]sdk.ValAddress, lenVals) 133 for i := 0; i < lenVals; i++ { 134 valAddrs[i] = vals[i].OperatorAddress 135 } 136 delegator.ValidatorAddresses = valAddrs 137 delegator.Shares = shares 138 sk.SetDelegator(ctx, delegator) 139 140 //types.NewDelegationDelegatorReward(TestValAddrs[0], nil) 141 expect := types.NewQueryDelegatorTotalRewardsResponse( 142 []types.DelegationDelegatorReward{ 143 types.NewDelegationDelegatorReward(TestValAddrs[0], nil), 144 types.NewDelegationDelegatorReward(TestValAddrs[1], nil), 145 types.NewDelegationDelegatorReward(TestValAddrs[2], nil), 146 types.NewDelegationDelegatorReward(TestValAddrs[3], nil)}, 147 nil) 148 149 delRewards := getQueriedDelegatorTotalRewards(t, ctx, querier, dAddr1) 150 require.Equal(t, expect, delRewards) 151 152 // test delegation rewards query 153 newRate, _ := sdk.NewDecFromStr("0.5") 154 ctx.SetBlockTime(time.Now()) 155 DoEditValidator(t, ctx, sk, TestValAddrs[0], newRate) 156 require.NoError(t, err) 157 158 staking.EndBlocker(ctx, sk) 159 160 val := sk.Validator(ctx, valOpAddr1) 161 rewards := getQueriedDelegationRewards(t, ctx, querier, dAddr1, TestValAddrs[0]) 162 require.True(t, rewards.IsZero()) 163 initial := int64(1000000) 164 ctx.SetBlockHeight(ctx.BlockHeight() + 1) 165 tokens := sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDec(initial)}} 166 sdk.NewDec(initial) 167 168 keeper.AllocateTokensToValidator(ctx, val, tokens) 169 rewards = getQueriedDelegationRewards(t, ctx, querier, dAddr1, TestValAddrs[0]) 170 require.True(t, rewards.AmountOf(sdk.DefaultBondDenom).LT(sdk.NewDec(initial/2))) 171 require.True(t, rewards.AmountOf(sdk.DefaultBondDenom).GT(sdk.NewDec(initial/2-1))) 172 173 // test delegator's total rewards query 174 delRewards = getQueriedDelegatorTotalRewards(t, ctx, querier, dAddr1) 175 wantDelRewards := types.NewQueryDelegatorTotalRewardsResponse( 176 []types.DelegationDelegatorReward{ 177 types.NewDelegationDelegatorReward(TestValAddrs[0], rewards), 178 types.NewDelegationDelegatorReward(TestValAddrs[1], nil), 179 types.NewDelegationDelegatorReward(TestValAddrs[2], nil), 180 types.NewDelegationDelegatorReward(TestValAddrs[3], nil)}, 181 rewards) 182 183 require.Equal(t, wantDelRewards, delRewards) 184 185 // currently community pool hold nothing so we should return null 186 communityPool := getQueriedCommunityPool(t, ctx, querier) 187 require.Nil(t, communityPool) 188 }