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 }