github.com/cosmos/cosmos-sdk@v0.50.10/x/slashing/abci_test.go (about)

     1  package slashing_test
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  
     7  	abci "github.com/cometbft/cometbft/abci/types"
     8  	cmtproto "github.com/cometbft/cometbft/proto/tendermint/types"
     9  	"github.com/stretchr/testify/require"
    10  
    11  	"cosmossdk.io/depinject"
    12  	"cosmossdk.io/log"
    13  
    14  	codectypes "github.com/cosmos/cosmos-sdk/codec/types"
    15  	simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims"
    16  	sdk "github.com/cosmos/cosmos-sdk/types"
    17  	bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper"
    18  	"github.com/cosmos/cosmos-sdk/x/slashing"
    19  	slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper"
    20  	"github.com/cosmos/cosmos-sdk/x/slashing/testutil"
    21  	stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper"
    22  	stakingtestutil "github.com/cosmos/cosmos-sdk/x/staking/testutil"
    23  	stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
    24  )
    25  
    26  func TestBeginBlocker(t *testing.T) {
    27  	var (
    28  		interfaceRegistry codectypes.InterfaceRegistry
    29  		bankKeeper        bankkeeper.Keeper
    30  		stakingKeeper     *stakingkeeper.Keeper
    31  		slashingKeeper    slashingkeeper.Keeper
    32  	)
    33  
    34  	app, err := simtestutil.Setup(
    35  		depinject.Configs(
    36  			testutil.AppConfig,
    37  			depinject.Supply(log.NewNopLogger()),
    38  		),
    39  		&interfaceRegistry,
    40  		&bankKeeper,
    41  		&stakingKeeper,
    42  		&slashingKeeper,
    43  	)
    44  	require.NoError(t, err)
    45  
    46  	ctx := app.BaseApp.NewContext(false)
    47  
    48  	pks := simtestutil.CreateTestPubKeys(1)
    49  	simtestutil.AddTestAddrsFromPubKeys(bankKeeper, stakingKeeper, ctx, pks, stakingKeeper.TokensFromConsensusPower(ctx, 200))
    50  	addr, pk := sdk.ValAddress(pks[0].Address()), pks[0]
    51  	tstaking := stakingtestutil.NewHelper(t, ctx, stakingKeeper)
    52  
    53  	// bond the validator
    54  	power := int64(100)
    55  	amt := tstaking.CreateValidatorWithValPower(addr, pk, power, true)
    56  	stakingKeeper.EndBlocker(ctx)
    57  	bondDenom, err := stakingKeeper.BondDenom(ctx)
    58  	require.NoError(t, err)
    59  	require.Equal(
    60  		t, bankKeeper.GetAllBalances(ctx, sdk.AccAddress(addr)),
    61  		sdk.NewCoins(sdk.NewCoin(bondDenom, testutil.InitTokens.Sub(amt))),
    62  	)
    63  	val, err := stakingKeeper.Validator(ctx, addr)
    64  	require.NoError(t, err)
    65  	require.Equal(t, amt, val.GetBondedTokens())
    66  
    67  	abciVal := abci.Validator{
    68  		Address: pk.Address(),
    69  		Power:   power,
    70  	}
    71  
    72  	ctx = ctx.WithVoteInfos([]abci.VoteInfo{{
    73  		Validator:   abciVal,
    74  		BlockIdFlag: cmtproto.BlockIDFlagCommit,
    75  	}})
    76  
    77  	err = slashing.BeginBlocker(ctx, slashingKeeper)
    78  	require.NoError(t, err)
    79  
    80  	info, err := slashingKeeper.GetValidatorSigningInfo(ctx, sdk.ConsAddress(pk.Address()))
    81  	require.NoError(t, err)
    82  	require.Equal(t, ctx.BlockHeight(), info.StartHeight)
    83  	require.Equal(t, int64(1), info.IndexOffset)
    84  	require.Equal(t, time.Unix(0, 0).UTC(), info.JailedUntil)
    85  	require.Equal(t, int64(0), info.MissedBlocksCounter)
    86  
    87  	height := int64(0)
    88  
    89  	signedBlocksWindow, err := slashingKeeper.SignedBlocksWindow(ctx)
    90  	require.NoError(t, err)
    91  	// for 100 blocks, mark the validator as having signed
    92  	for ; height < signedBlocksWindow; height++ {
    93  		ctx = ctx.WithBlockHeight(height).
    94  			WithVoteInfos([]abci.VoteInfo{{
    95  				Validator:   abciVal,
    96  				BlockIdFlag: cmtproto.BlockIDFlagCommit,
    97  			}})
    98  
    99  		err = slashing.BeginBlocker(ctx, slashingKeeper)
   100  		require.NoError(t, err)
   101  	}
   102  
   103  	minSignedPerWindow, err := slashingKeeper.MinSignedPerWindow(ctx)
   104  	require.NoError(t, err)
   105  	// for 50 blocks, mark the validator as having not signed
   106  	for ; height < ((signedBlocksWindow * 2) - minSignedPerWindow + 1); height++ {
   107  		ctx = ctx.WithBlockHeight(height).
   108  			WithVoteInfos([]abci.VoteInfo{{
   109  				Validator:   abciVal,
   110  				BlockIdFlag: cmtproto.BlockIDFlagAbsent,
   111  			}})
   112  
   113  		err = slashing.BeginBlocker(ctx, slashingKeeper)
   114  		require.NoError(t, err)
   115  	}
   116  
   117  	// end block
   118  	_, err = stakingKeeper.EndBlocker(ctx)
   119  	require.NoError(t, err)
   120  
   121  	// validator should be jailed
   122  	validator, err := stakingKeeper.GetValidatorByConsAddr(ctx, sdk.GetConsAddress(pk))
   123  	require.NoError(t, err)
   124  	require.Equal(t, stakingtypes.Unbonding, validator.GetStatus())
   125  }