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

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