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  }