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 }