github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/x/slashing/app_test.go (about)

     1  // nolint
     2  // DONTCOVER
     3  package slashing
     4  
     5  import (
     6  	"errors"
     7  	"testing"
     8  
     9  	abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types"
    10  	"github.com/fibonacci-chain/fbc/libs/tendermint/crypto/secp256k1"
    11  	"github.com/stretchr/testify/require"
    12  
    13  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    14  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth"
    15  	authexported "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/exported"
    16  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/bank"
    17  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/mock"
    18  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/staking"
    19  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/staking/types"
    20  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/supply"
    21  	supplyexported "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/supply/exported"
    22  )
    23  
    24  var (
    25  	priv1 = secp256k1.GenPrivKey()
    26  	addr1 = sdk.AccAddress(priv1.PubKey().Address())
    27  	coins = sdk.Coins{sdk.NewInt64Coin("foocoin", 10)}
    28  )
    29  
    30  // initialize the mock application for this module
    31  func getMockApp(t *testing.T) (*mock.App, staking.Keeper, Keeper) {
    32  	mapp := mock.NewApp()
    33  
    34  	RegisterCodec(mapp.Cdc.GetCdc())
    35  	staking.RegisterCodec(mapp.Cdc.GetCdc())
    36  	supply.RegisterCodec(mapp.Cdc.GetCdc())
    37  
    38  	keyStaking := sdk.NewKVStoreKey(staking.StoreKey)
    39  	keySlashing := sdk.NewKVStoreKey(StoreKey)
    40  	keySupply := sdk.NewKVStoreKey(supply.StoreKey)
    41  
    42  	feeCollector := supply.NewEmptyModuleAccount(auth.FeeCollectorName)
    43  	notBondedPool := supply.NewEmptyModuleAccount(types.NotBondedPoolName, supply.Burner, supply.Staking)
    44  	bondPool := supply.NewEmptyModuleAccount(types.BondedPoolName, supply.Burner, supply.Staking)
    45  
    46  	blacklistedAddrs := make(map[string]bool)
    47  	blacklistedAddrs[feeCollector.GetAddress().String()] = true
    48  	blacklistedAddrs[notBondedPool.GetAddress().String()] = true
    49  	blacklistedAddrs[bondPool.GetAddress().String()] = true
    50  
    51  	bankKeeper := bank.NewBaseKeeper(mapp.AccountKeeper, mapp.ParamsKeeper.Subspace(bank.DefaultParamspace), blacklistedAddrs)
    52  	maccPerms := map[string][]string{
    53  		auth.FeeCollectorName:     nil,
    54  		staking.NotBondedPoolName: {supply.Burner, supply.Staking},
    55  		staking.BondedPoolName:    {supply.Burner, supply.Staking},
    56  	}
    57  	supplyKeeper := supply.NewKeeper(mapp.Cdc.GetCdc(), keySupply, mapp.AccountKeeper, bank.NewBankKeeperAdapter(bankKeeper), maccPerms)
    58  	stakingKeeper := staking.NewKeeper(mapp.Cdc.GetCdc(), keyStaking, supplyKeeper, mapp.ParamsKeeper.Subspace(staking.DefaultParamspace))
    59  	keeper := NewKeeper(mapp.Cdc.GetCdc(), keySlashing, stakingKeeper, mapp.ParamsKeeper.Subspace(DefaultParamspace))
    60  	mapp.Router().AddRoute(staking.RouterKey, staking.NewHandler(stakingKeeper))
    61  	mapp.Router().AddRoute(RouterKey, NewHandler(keeper))
    62  
    63  	mapp.SetEndBlocker(getEndBlocker(stakingKeeper))
    64  	mapp.SetInitChainer(getInitChainer(mapp, stakingKeeper, mapp.AccountKeeper, supplyKeeper,
    65  		[]supplyexported.ModuleAccountI{feeCollector, notBondedPool, bondPool}))
    66  
    67  	require.NoError(t, mapp.CompleteSetup(keyStaking, keySupply, keySlashing))
    68  
    69  	return mapp, stakingKeeper, keeper
    70  }
    71  
    72  // staking endblocker
    73  func getEndBlocker(keeper staking.Keeper) sdk.EndBlocker {
    74  	return func(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock {
    75  		validatorUpdates := staking.EndBlocker(ctx, keeper)
    76  		return abci.ResponseEndBlock{
    77  			ValidatorUpdates: validatorUpdates,
    78  		}
    79  	}
    80  }
    81  
    82  // overwrite the mock init chainer
    83  func getInitChainer(mapp *mock.App, keeper staking.Keeper, accountKeeper types.AccountKeeper, supplyKeeper types.SupplyKeeper,
    84  	blacklistedAddrs []supplyexported.ModuleAccountI) sdk.InitChainer {
    85  	return func(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain {
    86  		// set module accounts
    87  		for _, macc := range blacklistedAddrs {
    88  			supplyKeeper.SetModuleAccount(ctx, macc)
    89  		}
    90  
    91  		mapp.InitChainer(ctx, req)
    92  		stakingGenesis := staking.DefaultGenesisState()
    93  		validators := staking.InitGenesis(ctx, keeper, accountKeeper, supplyKeeper, stakingGenesis)
    94  		return abci.ResponseInitChain{
    95  			Validators: validators,
    96  		}
    97  	}
    98  }
    99  
   100  func checkValidator(t *testing.T, mapp *mock.App, keeper staking.Keeper,
   101  	addr sdk.AccAddress, expFound bool) staking.Validator {
   102  	ctxCheck := mapp.BaseApp.NewContext(true, abci.Header{})
   103  	validator, found := keeper.GetValidator(ctxCheck, sdk.ValAddress(addr1))
   104  	require.Equal(t, expFound, found)
   105  	return validator
   106  }
   107  
   108  func checkValidatorSigningInfo(t *testing.T, mapp *mock.App, keeper Keeper,
   109  	addr sdk.ConsAddress, expFound bool) ValidatorSigningInfo {
   110  	ctxCheck := mapp.BaseApp.NewContext(true, abci.Header{})
   111  	signingInfo, found := keeper.GetValidatorSigningInfo(ctxCheck, addr)
   112  	require.Equal(t, expFound, found)
   113  	return signingInfo
   114  }
   115  
   116  func TestSlashingMsgs(t *testing.T) {
   117  	mapp, stakingKeeper, keeper := getMockApp(t)
   118  
   119  	genTokens := sdk.TokensFromConsensusPower(42)
   120  	bondTokens := sdk.TokensFromConsensusPower(10)
   121  	genCoin := sdk.NewCoin(sdk.DefaultBondDenom, genTokens)
   122  	bondCoin := sdk.NewCoin(sdk.DefaultBondDenom, bondTokens)
   123  
   124  	acc1 := &auth.BaseAccount{
   125  		Address: addr1,
   126  		Coins:   sdk.Coins{genCoin},
   127  	}
   128  	accs := []authexported.Account{acc1}
   129  	mock.SetGenesis(mapp, accs)
   130  	mapp.BeginBlock(abci.RequestBeginBlock{Header: abci.Header{Height: mapp.LastBlockHeight() + 1}})
   131  	mapp.EndBlock(abci.RequestEndBlock{})
   132  	mapp.Commit(abci.RequestCommit{})
   133  
   134  	description := staking.NewDescription("foo_moniker", "", "", "", "")
   135  	commission := staking.NewCommissionRates(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec())
   136  
   137  	createValidatorMsg := staking.NewMsgCreateValidator(
   138  		sdk.ValAddress(addr1), priv1.PubKey(), bondCoin, description, commission, sdk.OneInt(),
   139  	)
   140  
   141  	header := abci.Header{Height: mapp.LastBlockHeight() + 1}
   142  	mock.SignCheckDeliver(t, mapp.Cdc.GetCdc(), mapp.BaseApp, header, []sdk.Msg{createValidatorMsg}, []uint64{0}, []uint64{0}, true, true, priv1)
   143  	mock.CheckBalance(t, mapp, addr1, sdk.Coins{genCoin.Sub(bondCoin).Sub(sdk.NewDecCoin(sdk.DefaultBondDenom, sdk.OneInt()))})
   144  
   145  	header = abci.Header{Height: mapp.LastBlockHeight() + 1}
   146  	mapp.BeginBlock(abci.RequestBeginBlock{Header: header})
   147  
   148  	validator := checkValidator(t, mapp, stakingKeeper, addr1, true)
   149  	require.Equal(t, sdk.ValAddress(addr1), validator.OperatorAddress)
   150  	require.Equal(t, sdk.Bonded, validator.Status)
   151  	require.True(sdk.IntEq(t, bondTokens, validator.BondedTokens()))
   152  	unjailMsg := MsgUnjail{ValidatorAddr: sdk.ValAddress(validator.ConsPubKey.Address())}
   153  
   154  	// no signing info yet
   155  	checkValidatorSigningInfo(t, mapp, keeper, sdk.ConsAddress(addr1), false)
   156  
   157  	// unjail should fail with unknown validator
   158  	header = abci.Header{Height: mapp.LastBlockHeight() + 1}
   159  	_, res, err := mock.SignCheckDeliver(t, mapp.Cdc.GetCdc(), mapp.BaseApp, header, []sdk.Msg{unjailMsg}, []uint64{0}, []uint64{1}, false, false, priv1)
   160  	require.Error(t, err)
   161  	require.Nil(t, res)
   162  	require.True(t, errors.Is(ErrValidatorNotJailed, err))
   163  }