github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/evidence/internal/keeper/infraction_test.go (about) 1 package keeper_test 2 3 import ( 4 "time" 5 6 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 7 "github.com/fibonacci-chain/fbc/x/evidence/internal/types" 8 "github.com/fibonacci-chain/fbc/x/staking" 9 stakingtypes "github.com/fibonacci-chain/fbc/x/staking/types" 10 11 "github.com/fibonacci-chain/fbc/libs/tendermint/crypto" 12 ) 13 14 const EPOCH = 252 15 16 func newTestMsgCreateValidator(address sdk.ValAddress, pubKey crypto.PubKey, amt sdk.Int) stakingtypes.MsgCreateValidator { 17 // commission := staking.NewCommission(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()) 18 msd := sdk.NewDecCoinFromDec(sdk.DefaultBondDenom, sdk.NewDec(10000)) 19 return staking.NewMsgCreateValidator(address, pubKey, 20 staking.NewDescription("my moniker", "my identity", "my website", "my details"), msd, 21 ) 22 } 23 24 func (suite *KeeperTestSuite) TestHandleDoubleSign() { 25 ctx := suite.ctx.WithIsCheckTx(false).WithBlockHeight(EPOCH) 26 suite.populateValidators(ctx) 27 28 power := sdk.NewIntFromUint64(10000) 29 stakingParams := suite.app.StakingKeeper.GetParams(ctx) 30 amt := power 31 operatorAddr, val := valAddresses[0], pubkeys[0] 32 33 // create validator 34 res, err := staking.NewHandler(suite.app.StakingKeeper)(ctx, newTestMsgCreateValidator(operatorAddr, val, amt)) 35 suite.NoError(err) 36 suite.NotNil(res) 37 38 // execute end-blocker and verify validator attributes 39 staking.EndBlocker(ctx, suite.app.StakingKeeper) 40 suite.Equal( 41 suite.app.BankKeeper.GetCoins(ctx, sdk.AccAddress(operatorAddr)), 42 sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, initAmt.Sub(amt))), 43 ) 44 45 // handle a signature to set signing info 46 suite.app.SlashingKeeper.HandleValidatorSignature(ctx, val.Address(), amt.Int64(), true) 47 48 // double sign less than max age 49 evidence := types.Equivocation{ 50 Height: 0, 51 Time: time.Unix(0, 0), 52 Power: power.Int64(), 53 ConsensusAddress: sdk.ConsAddress(val.Address()), 54 } 55 suite.keeper.HandleDoubleSign(ctx, evidence) 56 57 // should be jailed and tombstoned 58 suite.True(suite.app.StakingKeeper.Validator(ctx, operatorAddr).IsJailed()) 59 suite.True(suite.app.SlashingKeeper.IsTombstoned(ctx, sdk.ConsAddress(val.Address()))) 60 61 // submit duplicate evidence 62 suite.keeper.HandleDoubleSign(ctx, evidence) 63 64 // jump to past the unbonding period 65 ctx.SetBlockTime(time.Unix(1, 0).Add(stakingParams.UnbondingTime)) 66 67 // require we cannot unjail 68 suite.Error(suite.app.SlashingKeeper.Unjail(ctx, operatorAddr)) 69 70 // require we be able to unbond now 71 ctx.SetBlockHeight(ctx.BlockHeight() + 1) 72 msgDestroy := stakingtypes.NewMsgDestroyValidator(sdk.AccAddress(operatorAddr)) 73 res, err = staking.NewHandler(suite.app.StakingKeeper)(ctx, msgDestroy) 74 suite.NoError(err) 75 suite.NotNil(res) 76 } 77 78 func (suite *KeeperTestSuite) TestHandleDoubleSign_TooOld() { 79 ctx := suite.ctx.WithIsCheckTx(false).WithBlockHeight(EPOCH).WithBlockTime(time.Now()) 80 suite.populateValidators(ctx) 81 82 power := sdk.NewIntFromUint64(10000) 83 //stakingParams := suite.app.StakingKeeper.GetParams(ctx) 84 amt := power 85 operatorAddr, val := valAddresses[0], pubkeys[0] 86 87 // create validator 88 res, err := staking.NewHandler(suite.app.StakingKeeper)(ctx, newTestMsgCreateValidator(operatorAddr, val, amt)) 89 suite.NoError(err) 90 suite.NotNil(res) 91 92 // execute end-blocker and verify validator attributes 93 staking.EndBlocker(ctx, suite.app.StakingKeeper) 94 suite.Equal( 95 suite.app.BankKeeper.GetCoins(ctx, sdk.AccAddress(operatorAddr)), 96 sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, initAmt.Sub(amt))), 97 ) 98 99 evidence := types.Equivocation{ 100 Height: 0, 101 Time: ctx.BlockTime(), 102 Power: power.Int64(), 103 ConsensusAddress: sdk.ConsAddress(val.Address()), 104 } 105 ctx.SetBlockTime(ctx.BlockTime().Add(suite.app.EvidenceKeeper.MaxEvidenceAge(ctx) + 1)) 106 suite.keeper.HandleDoubleSign(ctx, evidence) 107 108 suite.False(suite.app.StakingKeeper.Validator(ctx, operatorAddr).IsJailed()) 109 suite.False(suite.app.SlashingKeeper.IsTombstoned(ctx, sdk.ConsAddress(val.Address()))) 110 }