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  }