github.com/Finschia/finschia-sdk@v0.49.1/x/slashing/app_test.go (about)

     1  package slashing_test
     2  
     3  import (
     4  	"errors"
     5  	"testing"
     6  
     7  	ocabci "github.com/Finschia/ostracon/abci/types"
     8  	"github.com/stretchr/testify/require"
     9  	tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
    10  
    11  	"github.com/Finschia/finschia-sdk/crypto/keys/ed25519"
    12  	"github.com/Finschia/finschia-sdk/crypto/keys/secp256k1"
    13  	"github.com/Finschia/finschia-sdk/simapp"
    14  	sdk "github.com/Finschia/finschia-sdk/types"
    15  	authtypes "github.com/Finschia/finschia-sdk/x/auth/types"
    16  	banktypes "github.com/Finschia/finschia-sdk/x/bank/types"
    17  	"github.com/Finschia/finschia-sdk/x/slashing/types"
    18  	stakingtypes "github.com/Finschia/finschia-sdk/x/staking/types"
    19  )
    20  
    21  var (
    22  	priv1 = secp256k1.GenPrivKey()
    23  	addr1 = sdk.AccAddress(priv1.PubKey().Address())
    24  
    25  	valKey  = ed25519.GenPrivKey()
    26  	valAddr = sdk.AccAddress(valKey.PubKey().Address())
    27  )
    28  
    29  func checkValidator(t *testing.T, app *simapp.SimApp, _ sdk.AccAddress, expFound bool) stakingtypes.Validator {
    30  	t.Helper()
    31  	ctxCheck := app.BaseApp.NewContext(true, tmproto.Header{})
    32  	validator, found := app.StakingKeeper.GetValidator(ctxCheck, sdk.ValAddress(addr1))
    33  	require.Equal(t, expFound, found)
    34  	return validator
    35  }
    36  
    37  func checkValidatorSigningInfo(t *testing.T, app *simapp.SimApp, addr sdk.ConsAddress, expFound bool) types.ValidatorSigningInfo {
    38  	t.Helper()
    39  	ctxCheck := app.BaseApp.NewContext(true, tmproto.Header{})
    40  	signingInfo, found := app.SlashingKeeper.GetValidatorSigningInfo(ctxCheck, addr)
    41  	require.Equal(t, expFound, found)
    42  	return signingInfo
    43  }
    44  
    45  func TestSlashingMsgs(t *testing.T) {
    46  	genTokens := sdk.TokensFromConsensusPower(42, sdk.DefaultPowerReduction)
    47  	bondTokens := sdk.TokensFromConsensusPower(10, sdk.DefaultPowerReduction)
    48  	genCoin := sdk.NewCoin(sdk.DefaultBondDenom, genTokens)
    49  	bondCoin := sdk.NewCoin(sdk.DefaultBondDenom, bondTokens)
    50  
    51  	acc1 := &authtypes.BaseAccount{
    52  		Address: addr1.String(),
    53  	}
    54  	accs := authtypes.GenesisAccounts{acc1}
    55  	balances := []banktypes.Balance{
    56  		{
    57  			Address: addr1.String(),
    58  			Coins:   sdk.Coins{genCoin},
    59  		},
    60  	}
    61  
    62  	app := simapp.SetupWithGenesisAccounts(accs, balances...)
    63  	simapp.CheckBalance(t, app, addr1, sdk.Coins{genCoin})
    64  
    65  	description := stakingtypes.NewDescription("foo_moniker", "", "", "", "")
    66  	commission := stakingtypes.NewCommissionRates(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec())
    67  
    68  	createValidatorMsg, err := stakingtypes.NewMsgCreateValidator(
    69  		sdk.ValAddress(addr1), valKey.PubKey(), bondCoin, description, commission, sdk.OneInt(),
    70  	)
    71  	require.NoError(t, err)
    72  
    73  	header := tmproto.Header{Height: app.LastBlockHeight() + 1}
    74  	txGen := simapp.MakeTestEncodingConfig().TxConfig
    75  	_, _, err = simapp.SignCheckDeliver(t, txGen, app.BaseApp, header, []sdk.Msg{createValidatorMsg}, "", []uint64{0}, []uint64{0}, true, true, priv1)
    76  	require.NoError(t, err)
    77  	simapp.CheckBalance(t, app, addr1, sdk.Coins{genCoin.Sub(bondCoin)})
    78  
    79  	header = tmproto.Header{Height: app.LastBlockHeight() + 1}
    80  	app.BeginBlock(ocabci.RequestBeginBlock{Header: header})
    81  
    82  	validator := checkValidator(t, app, addr1, true)
    83  	require.Equal(t, sdk.ValAddress(addr1).String(), validator.OperatorAddress)
    84  	require.Equal(t, stakingtypes.Bonded, validator.Status)
    85  	require.True(sdk.IntEq(t, bondTokens, validator.BondedTokens()))
    86  	unjailMsg := &types.MsgUnjail{ValidatorAddr: sdk.ValAddress(addr1).String()}
    87  
    88  	checkValidatorSigningInfo(t, app, sdk.ConsAddress(valAddr), true)
    89  
    90  	// unjail should fail with unknown validator
    91  	header = tmproto.Header{Height: app.LastBlockHeight() + 1}
    92  	_, res, err := simapp.SignCheckDeliver(t, txGen, app.BaseApp, header, []sdk.Msg{unjailMsg}, "", []uint64{0}, []uint64{1}, false, false, priv1)
    93  	require.Error(t, err)
    94  	require.Nil(t, res)
    95  	require.True(t, errors.Is(types.ErrValidatorNotJailed, err))
    96  }