github.com/Finschia/finschia-sdk@v0.48.1/x/distribution/keeper/keeper_test.go (about)

     1  package keeper_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/assert"
     7  	"github.com/stretchr/testify/require"
     8  	tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
     9  
    10  	"github.com/Finschia/finschia-sdk/simapp"
    11  	sdk "github.com/Finschia/finschia-sdk/types"
    12  	"github.com/Finschia/finschia-sdk/x/distribution/types"
    13  )
    14  
    15  func TestSetWithdrawAddr(t *testing.T) {
    16  	app := simapp.Setup(false)
    17  	ctx := app.BaseApp.NewContext(false, tmproto.Header{})
    18  
    19  	addr := simapp.AddTestAddrs(app, ctx, 2, sdk.NewInt(1000000000))
    20  
    21  	params := app.DistrKeeper.GetParams(ctx)
    22  	params.WithdrawAddrEnabled = false
    23  	app.DistrKeeper.SetParams(ctx, params)
    24  
    25  	err := app.DistrKeeper.SetWithdrawAddr(ctx, addr[0], addr[1])
    26  	require.NotNil(t, err)
    27  
    28  	params.WithdrawAddrEnabled = true
    29  	app.DistrKeeper.SetParams(ctx, params)
    30  
    31  	err = app.DistrKeeper.SetWithdrawAddr(ctx, addr[0], addr[1])
    32  	require.Nil(t, err)
    33  
    34  	require.Error(t, app.DistrKeeper.SetWithdrawAddr(ctx, addr[0], distrAcc.GetAddress()))
    35  }
    36  
    37  func TestWithdrawValidatorCommission(t *testing.T) {
    38  	app := simapp.Setup(false)
    39  	ctx := app.BaseApp.NewContext(false, tmproto.Header{})
    40  
    41  	valCommission := sdk.DecCoins{
    42  		sdk.NewDecCoinFromDec("mytoken", sdk.NewDec(5).Quo(sdk.NewDec(4))),
    43  		sdk.NewDecCoinFromDec("stake", sdk.NewDec(3).Quo(sdk.NewDec(2))),
    44  	}
    45  
    46  	addr := simapp.AddTestAddrs(app, ctx, 1, sdk.NewInt(1000000000))
    47  	valAddrs := simapp.ConvertAddrsToValAddrs(addr)
    48  
    49  	// set module account coins
    50  	distrAcc := app.DistrKeeper.GetDistributionAccount(ctx)
    51  	coins := sdk.NewCoins(sdk.NewCoin("mytoken", sdk.NewInt(2)), sdk.NewCoin("stake", sdk.NewInt(2)))
    52  	require.NoError(t, simapp.FundModuleAccount(app, ctx, distrAcc.GetName(), coins))
    53  
    54  	app.AccountKeeper.SetModuleAccount(ctx, distrAcc)
    55  
    56  	// check initial balance
    57  	balance := app.BankKeeper.GetAllBalances(ctx, sdk.AccAddress(valAddrs[0]))
    58  	expTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 1000)
    59  	expCoins := sdk.NewCoins(sdk.NewCoin("stake", expTokens))
    60  	require.Equal(t, expCoins, balance)
    61  
    62  	// set outstanding rewards
    63  	app.DistrKeeper.SetValidatorOutstandingRewards(ctx, valAddrs[0], types.ValidatorOutstandingRewards{Rewards: valCommission})
    64  
    65  	// set commission
    66  	app.DistrKeeper.SetValidatorAccumulatedCommission(ctx, valAddrs[0], types.ValidatorAccumulatedCommission{Commission: valCommission})
    67  
    68  	// withdraw commission
    69  	_, err := app.DistrKeeper.WithdrawValidatorCommission(ctx, valAddrs[0])
    70  	require.NoError(t, err)
    71  
    72  	// check balance increase
    73  	balance = app.BankKeeper.GetAllBalances(ctx, sdk.AccAddress(valAddrs[0]))
    74  	require.Equal(t, sdk.NewCoins(
    75  		sdk.NewCoin("mytoken", sdk.NewInt(1)),
    76  		sdk.NewCoin("stake", expTokens.AddRaw(1)),
    77  	), balance)
    78  
    79  	// check remainder
    80  	remainder := app.DistrKeeper.GetValidatorAccumulatedCommission(ctx, valAddrs[0]).Commission
    81  	require.Equal(t, sdk.DecCoins{
    82  		sdk.NewDecCoinFromDec("mytoken", sdk.NewDec(1).Quo(sdk.NewDec(4))),
    83  		sdk.NewDecCoinFromDec("stake", sdk.NewDec(1).Quo(sdk.NewDec(2))),
    84  	}, remainder)
    85  
    86  	require.True(t, true)
    87  }
    88  
    89  func TestGetTotalRewards(t *testing.T) {
    90  	app := simapp.Setup(false)
    91  	ctx := app.BaseApp.NewContext(false, tmproto.Header{})
    92  
    93  	valCommission := sdk.DecCoins{
    94  		sdk.NewDecCoinFromDec("mytoken", sdk.NewDec(5).Quo(sdk.NewDec(4))),
    95  		sdk.NewDecCoinFromDec("stake", sdk.NewDec(3).Quo(sdk.NewDec(2))),
    96  	}
    97  
    98  	addr := simapp.AddTestAddrs(app, ctx, 2, sdk.NewInt(1000000000))
    99  	valAddrs := simapp.ConvertAddrsToValAddrs(addr)
   100  
   101  	app.DistrKeeper.SetValidatorOutstandingRewards(ctx, valAddrs[0], types.ValidatorOutstandingRewards{Rewards: valCommission})
   102  	app.DistrKeeper.SetValidatorOutstandingRewards(ctx, valAddrs[1], types.ValidatorOutstandingRewards{Rewards: valCommission})
   103  
   104  	expectedRewards := valCommission.MulDec(sdk.NewDec(2))
   105  	totalRewards := app.DistrKeeper.GetTotalRewards(ctx)
   106  
   107  	require.Equal(t, expectedRewards, totalRewards)
   108  }
   109  
   110  func TestFundCommunityPool(t *testing.T) {
   111  	app := simapp.Setup(false)
   112  	ctx := app.BaseApp.NewContext(false, tmproto.Header{})
   113  
   114  	addr := simapp.AddTestAddrs(app, ctx, 2, sdk.ZeroInt())
   115  
   116  	amount := sdk.NewCoins(sdk.NewInt64Coin("stake", 100))
   117  	require.NoError(t, simapp.FundAccount(app, ctx, addr[0], amount))
   118  
   119  	initPool := app.DistrKeeper.GetFeePool(ctx)
   120  	assert.Empty(t, initPool.CommunityPool)
   121  
   122  	err := app.DistrKeeper.FundCommunityPool(ctx, amount, addr[0])
   123  	assert.Nil(t, err)
   124  
   125  	assert.Equal(t, initPool.CommunityPool.Add(sdk.NewDecCoinsFromCoins(amount...)...), app.DistrKeeper.GetFeePool(ctx).CommunityPool)
   126  	assert.Empty(t, app.BankKeeper.GetAllBalances(ctx, addr[0]))
   127  }