Refactor x/staking Validation and Delegation tests based on MsgCreateValidator.Pubkey type change. (#7526)
* testing: refactore Validation and Delegation handling of x/staking This Changeset introduces set of improvements for writing tests. The idea is to create a testing subpackage which will provide functions to make tests more dev-friendly and wrap higher level use-cases. Here is a show-up of of creating a service for staking module for tests. This PR also changes the `x/staking/types.MsgCreateValidator.Pubkey` from string to types.Any. This change motivated the other change to show the pattern I'm describing here. * add validator checks * type change fixes * use deprecated * adding test slashing * new network comment update * working on tests * Fix TestMsgPkDecode test * Add UnpackInterfaces to MsgCreateValidator * Fix tests * Convert bech32 pubkey to proto * Fix test * fix v039/migrate_test/TestMigrate * fix tests * testslashing: rename Service to Helper * file rename * update TestMsgDecode Co-authored-by: blushi <marie.gauthier63@gmail.com> Co-authored-by: Amaury Martiny <amaury.martiny@protonmail.com> Co-authored-by: Cory Levinson <cjlevinson@gmail.com>
This commit is contained in:
co-authored by
blushi
Amaury Martiny
Cory Levinson
parent
0f8fdf60df
commit
8eaf2ececc
@@ -11,8 +11,8 @@ import (
|
||||
"github.com/cosmos/cosmos-sdk/simapp"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
"github.com/cosmos/cosmos-sdk/x/slashing"
|
||||
slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper"
|
||||
"github.com/cosmos/cosmos-sdk/x/staking"
|
||||
"github.com/cosmos/cosmos-sdk/x/staking/teststaking"
|
||||
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
|
||||
)
|
||||
|
||||
@@ -22,20 +22,15 @@ func TestBeginBlocker(t *testing.T) {
|
||||
|
||||
pks := simapp.CreateTestPubKeys(1)
|
||||
simapp.AddTestAddrsFromPubKeys(app, ctx, pks, sdk.TokensFromConsensusPower(200))
|
||||
|
||||
power := int64(100)
|
||||
amt := sdk.TokensFromConsensusPower(power)
|
||||
addr, pk := sdk.ValAddress(pks[0].Address()), pks[0]
|
||||
tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper)
|
||||
|
||||
// bond the validator
|
||||
res, err := staking.NewHandler(app.StakingKeeper)(ctx, slashingkeeper.NewTestMsgCreateValidator(addr, pk, amt))
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, res)
|
||||
|
||||
amt := tstaking.CreateValidatorWithValPower(addr, pk, 100, true)
|
||||
staking.EndBlocker(ctx, app.StakingKeeper)
|
||||
require.Equal(
|
||||
t, app.BankKeeper.GetAllBalances(ctx, sdk.AccAddress(addr)),
|
||||
sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.GetParams(ctx).BondDenom, slashingkeeper.InitTokens.Sub(amt))),
|
||||
sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.GetParams(ctx).BondDenom, InitTokens.Sub(amt))),
|
||||
)
|
||||
require.Equal(t, amt, app.StakingKeeper.Validator(ctx, addr).GetBondedTokens())
|
||||
|
||||
|
||||
@@ -63,13 +63,14 @@ func TestSlashingMsgs(t *testing.T) {
|
||||
description := stakingtypes.NewDescription("foo_moniker", "", "", "", "")
|
||||
commission := stakingtypes.NewCommissionRates(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec())
|
||||
|
||||
createValidatorMsg := stakingtypes.NewMsgCreateValidator(
|
||||
createValidatorMsg, err := stakingtypes.NewMsgCreateValidator(
|
||||
sdk.ValAddress(addr1), valKey.PubKey(), bondCoin, description, commission, sdk.OneInt(),
|
||||
)
|
||||
require.NoError(t, err)
|
||||
|
||||
header := tmproto.Header{Height: app.LastBlockHeight() + 1}
|
||||
txGen := simapp.MakeEncodingConfig().TxConfig
|
||||
_, _, err := simapp.SignCheckDeliver(t, txGen, app.BaseApp, header, []sdk.Msg{createValidatorMsg}, "", []uint64{0}, []uint64{0}, true, true, priv1)
|
||||
_, _, err = simapp.SignCheckDeliver(t, txGen, app.BaseApp, header, []sdk.Msg{createValidatorMsg}, "", []uint64{0}, []uint64{0}, true, true, priv1)
|
||||
require.NoError(t, err)
|
||||
simapp.CheckBalance(t, app, addr1, sdk.Coins{genCoin.Sub(bondCoin)})
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ import (
|
||||
"github.com/cosmos/cosmos-sdk/simapp"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
"github.com/cosmos/cosmos-sdk/x/slashing"
|
||||
"github.com/cosmos/cosmos-sdk/x/slashing/keeper"
|
||||
"github.com/cosmos/cosmos-sdk/x/slashing/testslashing"
|
||||
"github.com/cosmos/cosmos-sdk/x/slashing/types"
|
||||
)
|
||||
|
||||
@@ -18,7 +18,7 @@ func TestExportAndInitGenesis(t *testing.T) {
|
||||
app := simapp.Setup(false)
|
||||
ctx := app.BaseApp.NewContext(false, tmproto.Header{})
|
||||
|
||||
app.SlashingKeeper.SetParams(ctx, keeper.TestParams())
|
||||
app.SlashingKeeper.SetParams(ctx, testslashing.TestParams())
|
||||
|
||||
addrDels := simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.TokensFromConsensusPower(200))
|
||||
|
||||
@@ -31,7 +31,7 @@ func TestExportAndInitGenesis(t *testing.T) {
|
||||
app.SlashingKeeper.SetValidatorSigningInfo(ctx, sdk.ConsAddress(addrDels[1]), info2)
|
||||
genesisState := slashing.ExportGenesis(ctx, app.SlashingKeeper)
|
||||
|
||||
require.Equal(t, genesisState.Params, keeper.TestParams())
|
||||
require.Equal(t, genesisState.Params, testslashing.TestParams())
|
||||
require.Len(t, genesisState.SigningInfos, 2)
|
||||
require.Equal(t, genesisState.SigningInfos[0].ValidatorSigningInfo, info1)
|
||||
|
||||
|
||||
+32
-70
@@ -6,18 +6,18 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/testutil/testdata"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/simapp"
|
||||
"github.com/cosmos/cosmos-sdk/testutil/testdata"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
"github.com/cosmos/cosmos-sdk/x/slashing"
|
||||
"github.com/cosmos/cosmos-sdk/x/slashing/keeper"
|
||||
"github.com/cosmos/cosmos-sdk/x/slashing/testslashing"
|
||||
"github.com/cosmos/cosmos-sdk/x/slashing/types"
|
||||
"github.com/cosmos/cosmos-sdk/x/staking"
|
||||
"github.com/cosmos/cosmos-sdk/x/staking/teststaking"
|
||||
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
|
||||
)
|
||||
|
||||
@@ -25,29 +25,23 @@ func TestCannotUnjailUnlessJailed(t *testing.T) {
|
||||
// initial setup
|
||||
app := simapp.Setup(false)
|
||||
ctx := app.BaseApp.NewContext(false, tmproto.Header{})
|
||||
|
||||
pks := simapp.CreateTestPubKeys(1)
|
||||
simapp.AddTestAddrsFromPubKeys(app, ctx, pks, sdk.TokensFromConsensusPower(200))
|
||||
|
||||
tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper)
|
||||
slh := slashing.NewHandler(app.SlashingKeeper)
|
||||
amt := sdk.TokensFromConsensusPower(100)
|
||||
addr, val := sdk.ValAddress(pks[0].Address()), pks[0]
|
||||
|
||||
msg := keeper.NewTestMsgCreateValidator(addr, val, amt)
|
||||
res, err := staking.NewHandler(app.StakingKeeper)(ctx, msg)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, res)
|
||||
|
||||
amt := tstaking.CreateValidatorWithValPower(addr, val, 100, true)
|
||||
staking.EndBlocker(ctx, app.StakingKeeper)
|
||||
|
||||
require.Equal(
|
||||
t, app.BankKeeper.GetAllBalances(ctx, sdk.AccAddress(addr)),
|
||||
sdk.Coins{sdk.NewCoin(app.StakingKeeper.GetParams(ctx).BondDenom, keeper.InitTokens.Sub(amt))},
|
||||
sdk.Coins{sdk.NewCoin(app.StakingKeeper.GetParams(ctx).BondDenom, InitTokens.Sub(amt))},
|
||||
)
|
||||
require.Equal(t, amt, app.StakingKeeper.Validator(ctx, addr).GetBondedTokens())
|
||||
|
||||
// assert non-jailed validator can't be unjailed
|
||||
res, err = slh(ctx, types.NewMsgUnjail(addr))
|
||||
res, err := slh(ctx, types.NewMsgUnjail(addr))
|
||||
require.Error(t, err)
|
||||
require.Nil(t, res)
|
||||
require.True(t, errors.Is(types.ErrValidatorNotJailed, err))
|
||||
@@ -60,33 +54,25 @@ func TestCannotUnjailUnlessMeetMinSelfDelegation(t *testing.T) {
|
||||
pks := simapp.CreateTestPubKeys(1)
|
||||
simapp.AddTestAddrsFromPubKeys(app, ctx, pks, sdk.TokensFromConsensusPower(200))
|
||||
|
||||
tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper)
|
||||
slh := slashing.NewHandler(app.SlashingKeeper)
|
||||
amtInt := int64(100)
|
||||
addr, val, amt := sdk.ValAddress(pks[0].Address()), pks[0], sdk.TokensFromConsensusPower(amtInt)
|
||||
msg := keeper.NewTestMsgCreateValidator(addr, val, amt)
|
||||
addr, val := sdk.ValAddress(pks[0].Address()), pks[0]
|
||||
amt := sdk.TokensFromConsensusPower(100)
|
||||
msg := tstaking.CreateValidatorMsg(addr, val, amt.Int64())
|
||||
msg.MinSelfDelegation = amt
|
||||
|
||||
res, err := staking.NewHandler(app.StakingKeeper)(ctx, msg)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, res)
|
||||
tstaking.Handle(msg, true)
|
||||
|
||||
staking.EndBlocker(ctx, app.StakingKeeper)
|
||||
|
||||
require.Equal(
|
||||
t, app.BankKeeper.GetAllBalances(ctx, sdk.AccAddress(addr)),
|
||||
sdk.Coins{sdk.NewCoin(app.StakingKeeper.GetParams(ctx).BondDenom, keeper.InitTokens.Sub(amt))},
|
||||
sdk.Coins{sdk.NewCoin(app.StakingKeeper.GetParams(ctx).BondDenom, InitTokens.Sub(amt))},
|
||||
)
|
||||
|
||||
unbondAmt := sdk.NewCoin(app.StakingKeeper.GetParams(ctx).BondDenom, sdk.OneInt())
|
||||
undelegateMsg := stakingtypes.NewMsgUndelegate(sdk.AccAddress(addr), addr, unbondAmt)
|
||||
res, err = staking.NewHandler(app.StakingKeeper)(ctx, undelegateMsg)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, res)
|
||||
|
||||
tstaking.Undelegate(sdk.AccAddress(addr), addr, sdk.OneInt(), true)
|
||||
require.True(t, app.StakingKeeper.Validator(ctx, addr).IsJailed())
|
||||
|
||||
// assert non-jailed validator can't be unjailed
|
||||
res, err = slh(ctx, types.NewMsgUnjail(addr))
|
||||
res, err := slh(ctx, types.NewMsgUnjail(addr))
|
||||
require.Error(t, err)
|
||||
require.Nil(t, res)
|
||||
require.True(t, errors.Is(types.ErrSelfDelegationTooLowToUnjail, err))
|
||||
@@ -96,25 +82,17 @@ func TestJailedValidatorDelegations(t *testing.T) {
|
||||
// initial setup
|
||||
app := simapp.Setup(false)
|
||||
ctx := app.BaseApp.NewContext(false, tmproto.Header{Time: time.Unix(0, 0)})
|
||||
|
||||
pks := simapp.CreateTestPubKeys(3)
|
||||
simapp.AddTestAddrsFromPubKeys(app, ctx, pks, sdk.TokensFromConsensusPower(20))
|
||||
app.SlashingKeeper.SetParams(ctx, keeper.TestParams())
|
||||
|
||||
simapp.AddTestAddrsFromPubKeys(app, ctx, pks, sdk.TokensFromConsensusPower(20))
|
||||
app.SlashingKeeper.SetParams(ctx, testslashing.TestParams())
|
||||
|
||||
tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper)
|
||||
stakingParams := app.StakingKeeper.GetParams(ctx)
|
||||
app.StakingKeeper.SetParams(ctx, stakingParams)
|
||||
|
||||
// create a validator
|
||||
bondAmount := sdk.TokensFromConsensusPower(10)
|
||||
valPubKey := pks[1]
|
||||
valAddr, consAddr := sdk.ValAddress(pks[1].Address()), sdk.ConsAddress(pks[0].Address())
|
||||
|
||||
msgCreateVal := keeper.NewTestMsgCreateValidator(valAddr, valPubKey, bondAmount)
|
||||
res, err := staking.NewHandler(app.StakingKeeper)(ctx, msgCreateVal)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, res)
|
||||
|
||||
// end block
|
||||
amt := tstaking.CreateValidatorWithValPower(valAddr, pks[1], 10, true)
|
||||
staking.EndBlocker(ctx, app.StakingKeeper)
|
||||
|
||||
// set dummy signing info
|
||||
@@ -123,20 +101,12 @@ func TestJailedValidatorDelegations(t *testing.T) {
|
||||
|
||||
// delegate tokens to the validator
|
||||
delAddr := sdk.AccAddress(pks[2].Address())
|
||||
msgDelegate := keeper.NewTestMsgDelegate(delAddr, valAddr, bondAmount)
|
||||
res, err = staking.NewHandler(app.StakingKeeper)(ctx, msgDelegate)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, res)
|
||||
|
||||
unbondAmt := sdk.NewCoin(app.StakingKeeper.GetParams(ctx).BondDenom, bondAmount)
|
||||
tstaking.Delegate(delAddr, valAddr, amt.Int64())
|
||||
|
||||
// unbond validator total self-delegations (which should jail the validator)
|
||||
msgUndelegate := stakingtypes.NewMsgUndelegate(sdk.AccAddress(valAddr), valAddr, unbondAmt)
|
||||
res, err = staking.NewHandler(app.StakingKeeper)(ctx, msgUndelegate)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, res)
|
||||
|
||||
_, err = app.StakingKeeper.CompleteUnbonding(ctx, sdk.AccAddress(valAddr), valAddr)
|
||||
valAcc := sdk.AccAddress(valAddr)
|
||||
tstaking.Undelegate(valAcc, valAddr, amt, true)
|
||||
_, err := app.StakingKeeper.CompleteUnbonding(ctx, sdk.AccAddress(valAddr), valAddr)
|
||||
require.Nil(t, err, "expected complete unbonding validator to be ok, got: %v", err)
|
||||
|
||||
// verify validator still exists and is jailed
|
||||
@@ -145,15 +115,12 @@ func TestJailedValidatorDelegations(t *testing.T) {
|
||||
require.True(t, validator.IsJailed())
|
||||
|
||||
// verify the validator cannot unjail itself
|
||||
res, err = slashing.NewHandler(app.SlashingKeeper)(ctx, types.NewMsgUnjail(valAddr))
|
||||
res, err := slashing.NewHandler(app.SlashingKeeper)(ctx, types.NewMsgUnjail(valAddr))
|
||||
require.Error(t, err)
|
||||
require.Nil(t, res)
|
||||
|
||||
// self-delegate to validator
|
||||
msgSelfDelegate := keeper.NewTestMsgDelegate(sdk.AccAddress(valAddr), valAddr, bondAmount)
|
||||
res, err = staking.NewHandler(app.StakingKeeper)(ctx, msgSelfDelegate)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, res)
|
||||
tstaking.Delegate(valAcc, valAddr, amt.Int64())
|
||||
|
||||
// verify the validator can now unjail itself
|
||||
res, err = slashing.NewHandler(app.SlashingKeeper)(ctx, types.NewMsgUnjail(valAddr))
|
||||
@@ -177,26 +144,21 @@ func TestHandleAbsentValidator(t *testing.T) {
|
||||
// initial setup
|
||||
app := simapp.Setup(false)
|
||||
ctx := app.BaseApp.NewContext(false, tmproto.Header{Time: time.Unix(0, 0)})
|
||||
|
||||
pks := simapp.CreateTestPubKeys(1)
|
||||
simapp.AddTestAddrsFromPubKeys(app, ctx, pks, sdk.TokensFromConsensusPower(200))
|
||||
app.SlashingKeeper.SetParams(ctx, keeper.TestParams())
|
||||
app.SlashingKeeper.SetParams(ctx, testslashing.TestParams())
|
||||
|
||||
power := int64(100)
|
||||
amt := sdk.TokensFromConsensusPower(power)
|
||||
addr, val := sdk.ValAddress(pks[0].Address()), pks[0]
|
||||
sh := staking.NewHandler(app.StakingKeeper)
|
||||
slh := slashing.NewHandler(app.SlashingKeeper)
|
||||
tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper)
|
||||
|
||||
res, err := sh(ctx, keeper.NewTestMsgCreateValidator(addr, val, amt))
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, res)
|
||||
|
||||
amt := tstaking.CreateValidatorWithValPower(addr, val, power, true)
|
||||
staking.EndBlocker(ctx, app.StakingKeeper)
|
||||
|
||||
require.Equal(
|
||||
t, app.BankKeeper.GetAllBalances(ctx, sdk.AccAddress(addr)),
|
||||
sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.GetParams(ctx).BondDenom, keeper.InitTokens.Sub(amt))),
|
||||
sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.GetParams(ctx).BondDenom, InitTokens.Sub(amt))),
|
||||
)
|
||||
require.Equal(t, amt, app.StakingKeeper.Validator(ctx, addr).GetBondedTokens())
|
||||
|
||||
@@ -274,7 +236,7 @@ func TestHandleAbsentValidator(t *testing.T) {
|
||||
require.Equal(t, amt.Int64()-slashAmt, validator.GetTokens().Int64())
|
||||
|
||||
// unrevocation should fail prior to jail expiration
|
||||
res, err = slh(ctx, types.NewMsgUnjail(addr))
|
||||
res, err := slh(ctx, types.NewMsgUnjail(addr))
|
||||
require.Error(t, err)
|
||||
require.Nil(t, res)
|
||||
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
package slashing_test
|
||||
|
||||
import (
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
)
|
||||
|
||||
var (
|
||||
InitTokens = sdk.TokensFromConsensusPower(200)
|
||||
)
|
||||
@@ -14,7 +14,7 @@ import (
|
||||
"github.com/cosmos/cosmos-sdk/types/query"
|
||||
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
|
||||
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
|
||||
"github.com/cosmos/cosmos-sdk/x/slashing/keeper"
|
||||
"github.com/cosmos/cosmos-sdk/x/slashing/testslashing"
|
||||
"github.com/cosmos/cosmos-sdk/x/slashing/types"
|
||||
)
|
||||
|
||||
@@ -33,7 +33,7 @@ func (suite *SlashingTestSuite) SetupTest() {
|
||||
|
||||
app.AccountKeeper.SetParams(ctx, authtypes.DefaultParams())
|
||||
app.BankKeeper.SetParams(ctx, banktypes.DefaultParams())
|
||||
app.SlashingKeeper.SetParams(ctx, keeper.TestParams())
|
||||
app.SlashingKeeper.SetParams(ctx, testslashing.TestParams())
|
||||
|
||||
addrDels := simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.TokensFromConsensusPower(200))
|
||||
|
||||
@@ -60,7 +60,7 @@ func (suite *SlashingTestSuite) TestGRPCQueryParams() {
|
||||
paramsResp, err := queryClient.Params(gocontext.Background(), &types.QueryParamsRequest{})
|
||||
|
||||
suite.NoError(err)
|
||||
suite.Equal(keeper.TestParams(), paramsResp.Params)
|
||||
suite.Equal(testslashing.TestParams(), paramsResp.Params)
|
||||
}
|
||||
|
||||
func (suite *SlashingTestSuite) TestGRPCSigningInfo() {
|
||||
|
||||
@@ -9,8 +9,9 @@ import (
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/simapp"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
"github.com/cosmos/cosmos-sdk/x/slashing/keeper"
|
||||
"github.com/cosmos/cosmos-sdk/x/slashing/testslashing"
|
||||
"github.com/cosmos/cosmos-sdk/x/staking"
|
||||
"github.com/cosmos/cosmos-sdk/x/staking/teststaking"
|
||||
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
|
||||
)
|
||||
|
||||
@@ -22,19 +23,15 @@ func TestUnJailNotBonded(t *testing.T) {
|
||||
p.MaxValidators = 5
|
||||
app.StakingKeeper.SetParams(ctx, p)
|
||||
|
||||
amt := sdk.TokensFromConsensusPower(100)
|
||||
sh := staking.NewHandler(app.StakingKeeper)
|
||||
|
||||
addrDels := simapp.AddTestAddrsIncremental(app, ctx, 6, sdk.TokensFromConsensusPower(200))
|
||||
valAddrs := simapp.ConvertAddrsToValAddrs(addrDels)
|
||||
pks := simapp.CreateTestPubKeys(6)
|
||||
tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper)
|
||||
|
||||
// create max (5) validators all with the same power
|
||||
for i := uint32(0); i < p.MaxValidators; i++ {
|
||||
addr, val := valAddrs[i], pks[i]
|
||||
res, err := sh(ctx, keeper.NewTestMsgCreateValidator(addr, val, amt))
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, res)
|
||||
tstaking.CreateValidatorWithValPower(addr, val, 100, true)
|
||||
}
|
||||
|
||||
staking.EndBlocker(ctx, app.StakingKeeper)
|
||||
@@ -42,45 +39,33 @@ func TestUnJailNotBonded(t *testing.T) {
|
||||
|
||||
// create a 6th validator with less power than the cliff validator (won't be bonded)
|
||||
addr, val := valAddrs[5], pks[5]
|
||||
createValMsg := keeper.NewTestMsgCreateValidator(addr, val, sdk.TokensFromConsensusPower(50))
|
||||
createValMsg.MinSelfDelegation = sdk.TokensFromConsensusPower(50)
|
||||
res, err := sh(ctx, createValMsg)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, res)
|
||||
amt := sdk.TokensFromConsensusPower(50)
|
||||
msg := tstaking.CreateValidatorMsg(addr, val, amt.Int64())
|
||||
msg.MinSelfDelegation = amt
|
||||
tstaking.Handle(msg, true)
|
||||
|
||||
staking.EndBlocker(ctx, app.StakingKeeper)
|
||||
ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1)
|
||||
|
||||
validator, ok := app.StakingKeeper.GetValidator(ctx, addr)
|
||||
require.True(t, ok)
|
||||
require.False(t, validator.Jailed)
|
||||
require.Equal(t, stakingtypes.BondStatusUnbonded, validator.GetStatus().String())
|
||||
tstaking.CheckValidator(addr, stakingtypes.Unbonded, false)
|
||||
|
||||
// unbond below minimum self-delegation
|
||||
msgUnbond := stakingtypes.NewMsgUndelegate(sdk.AccAddress(addr), addr, sdk.NewCoin(p.BondDenom, sdk.TokensFromConsensusPower(1)))
|
||||
res, err = sh(ctx, msgUnbond)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, res)
|
||||
require.Equal(t, p.BondDenom, tstaking.Denom)
|
||||
tstaking.Undelegate(sdk.AccAddress(addr), addr, sdk.TokensFromConsensusPower(1), true)
|
||||
|
||||
staking.EndBlocker(ctx, app.StakingKeeper)
|
||||
ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1)
|
||||
|
||||
// verify that validator is jailed
|
||||
validator, ok = app.StakingKeeper.GetValidator(ctx, addr)
|
||||
require.True(t, ok)
|
||||
require.True(t, validator.Jailed)
|
||||
tstaking.CheckValidator(addr, -1, true)
|
||||
|
||||
// verify we cannot unjail (yet)
|
||||
require.Error(t, app.SlashingKeeper.Unjail(ctx, addr))
|
||||
|
||||
staking.EndBlocker(ctx, app.StakingKeeper)
|
||||
ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1)
|
||||
|
||||
// bond to meet minimum self-delegation
|
||||
msgBond := stakingtypes.NewMsgDelegate(sdk.AccAddress(addr), addr, sdk.NewCoin(p.BondDenom, sdk.TokensFromConsensusPower(1)))
|
||||
res, err = sh(ctx, msgBond)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, res)
|
||||
tstaking.DelegateWithPower(sdk.AccAddress(addr), addr, 1)
|
||||
|
||||
staking.EndBlocker(ctx, app.StakingKeeper)
|
||||
ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1)
|
||||
@@ -88,9 +73,7 @@ func TestUnJailNotBonded(t *testing.T) {
|
||||
// verify we can immediately unjail
|
||||
require.NoError(t, app.SlashingKeeper.Unjail(ctx, addr))
|
||||
|
||||
validator, ok = app.StakingKeeper.GetValidator(ctx, addr)
|
||||
require.True(t, ok)
|
||||
require.False(t, validator.Jailed)
|
||||
tstaking.CheckValidator(addr, -1, false)
|
||||
}
|
||||
|
||||
// Test a new validator entering the validator set
|
||||
@@ -103,20 +86,14 @@ func TestHandleNewValidator(t *testing.T) {
|
||||
addrDels := simapp.AddTestAddrsIncremental(app, ctx, 1, sdk.TokensFromConsensusPower(200))
|
||||
valAddrs := simapp.ConvertAddrsToValAddrs(addrDels)
|
||||
pks := simapp.CreateTestPubKeys(1)
|
||||
|
||||
addr, val := valAddrs[0], pks[0]
|
||||
amt := sdk.TokensFromConsensusPower(100)
|
||||
sh := staking.NewHandler(app.StakingKeeper)
|
||||
|
||||
tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper)
|
||||
ctx = ctx.WithBlockHeight(app.SlashingKeeper.SignedBlocksWindow(ctx) + 1)
|
||||
|
||||
// Validator created
|
||||
res, err := sh(ctx, keeper.NewTestMsgCreateValidator(addr, val, amt))
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, res)
|
||||
amt := tstaking.CreateValidatorWithValPower(addr, val, 100, true)
|
||||
|
||||
staking.EndBlocker(ctx, app.StakingKeeper)
|
||||
|
||||
require.Equal(
|
||||
t, app.BankKeeper.GetAllBalances(ctx, sdk.AccAddress(addr)),
|
||||
sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.GetParams(ctx).BondDenom, InitTokens.Sub(amt))),
|
||||
@@ -149,18 +126,15 @@ func TestHandleAlreadyJailed(t *testing.T) {
|
||||
// initial setup
|
||||
app := simapp.Setup(false)
|
||||
ctx := app.BaseApp.NewContext(false, tmproto.Header{})
|
||||
power := int64(100)
|
||||
|
||||
amt := sdk.TokensFromConsensusPower(power)
|
||||
addrDels := simapp.AddTestAddrsIncremental(app, ctx, 1, sdk.TokensFromConsensusPower(200))
|
||||
valAddrs := simapp.ConvertAddrsToValAddrs(addrDels)
|
||||
pks := simapp.CreateTestPubKeys(1)
|
||||
|
||||
addr, val := valAddrs[0], pks[0]
|
||||
sh := staking.NewHandler(app.StakingKeeper)
|
||||
res, err := sh(ctx, keeper.NewTestMsgCreateValidator(addr, val, amt))
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, res)
|
||||
power := int64(100)
|
||||
tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper)
|
||||
|
||||
amt := tstaking.CreateValidatorWithValPower(addr, val, power, true)
|
||||
|
||||
staking.EndBlocker(ctx, app.StakingKeeper)
|
||||
|
||||
@@ -206,7 +180,7 @@ func TestValidatorDippingInAndOut(t *testing.T) {
|
||||
// TestParams set the SignedBlocksWindow to 1000 and MaxMissedBlocksPerWindow to 500
|
||||
app := simapp.Setup(false)
|
||||
ctx := app.BaseApp.NewContext(false, tmproto.Header{})
|
||||
app.SlashingKeeper.SetParams(ctx, keeper.TestParams())
|
||||
app.SlashingKeeper.SetParams(ctx, testslashing.TestParams())
|
||||
|
||||
params := app.StakingKeeper.GetParams(ctx)
|
||||
params.MaxValidators = 1
|
||||
@@ -216,14 +190,12 @@ func TestValidatorDippingInAndOut(t *testing.T) {
|
||||
pks := simapp.CreateTestPubKeys(3)
|
||||
simapp.AddTestAddrsFromPubKeys(app, ctx, pks, sdk.TokensFromConsensusPower(200))
|
||||
|
||||
amt := sdk.TokensFromConsensusPower(power)
|
||||
addr, val := pks[0].Address(), pks[0]
|
||||
consAddr := sdk.ConsAddress(addr)
|
||||
sh := staking.NewHandler(app.StakingKeeper)
|
||||
res, err := sh(ctx, keeper.NewTestMsgCreateValidator(sdk.ValAddress(addr), val, amt))
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, res)
|
||||
tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper)
|
||||
valAddr := sdk.ValAddress(addr)
|
||||
|
||||
tstaking.CreateValidatorWithValPower(valAddr, val, power, true)
|
||||
staking.EndBlocker(ctx, app.StakingKeeper)
|
||||
|
||||
// 100 first blocks OK
|
||||
@@ -234,30 +206,21 @@ func TestValidatorDippingInAndOut(t *testing.T) {
|
||||
}
|
||||
|
||||
// kick first validator out of validator set
|
||||
newAmt := sdk.TokensFromConsensusPower(101)
|
||||
res, err = sh(ctx, keeper.NewTestMsgCreateValidator(sdk.ValAddress(pks[1].Address()), pks[1], newAmt))
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, res)
|
||||
|
||||
tstaking.CreateValidatorWithValPower(sdk.ValAddress(pks[1].Address()), pks[1], 101, true)
|
||||
validatorUpdates := staking.EndBlocker(ctx, app.StakingKeeper)
|
||||
require.Equal(t, 2, len(validatorUpdates))
|
||||
validator, _ := app.StakingKeeper.GetValidator(ctx, sdk.ValAddress(addr))
|
||||
require.Equal(t, stakingtypes.Unbonding, validator.Status)
|
||||
tstaking.CheckValidator(valAddr, stakingtypes.Unbonding, false)
|
||||
|
||||
// 600 more blocks happened
|
||||
height = int64(700)
|
||||
height = 700
|
||||
ctx = ctx.WithBlockHeight(height)
|
||||
|
||||
// validator added back in
|
||||
delTokens := sdk.TokensFromConsensusPower(50)
|
||||
res, err = sh(ctx, keeper.NewTestMsgDelegate(sdk.AccAddress(pks[2].Address()), sdk.ValAddress(pks[0].Address()), delTokens))
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, res)
|
||||
tstaking.DelegateWithPower(sdk.AccAddress(pks[2].Address()), sdk.ValAddress(pks[0].Address()), 50)
|
||||
|
||||
validatorUpdates = staking.EndBlocker(ctx, app.StakingKeeper)
|
||||
require.Equal(t, 2, len(validatorUpdates))
|
||||
validator, _ = app.StakingKeeper.GetValidator(ctx, sdk.ValAddress(addr))
|
||||
require.Equal(t, stakingtypes.Bonded, validator.Status)
|
||||
tstaking.CheckValidator(valAddr, stakingtypes.Bonded, false)
|
||||
newPower := int64(150)
|
||||
|
||||
// validator misses a block
|
||||
@@ -265,8 +228,7 @@ func TestValidatorDippingInAndOut(t *testing.T) {
|
||||
height++
|
||||
|
||||
// shouldn't be jailed/kicked yet
|
||||
validator, _ = app.StakingKeeper.GetValidator(ctx, sdk.ValAddress(addr))
|
||||
require.Equal(t, stakingtypes.Bonded, validator.Status)
|
||||
tstaking.CheckValidator(valAddr, stakingtypes.Bonded, false)
|
||||
|
||||
// validator misses 500 more blocks, 501 total
|
||||
latest := height
|
||||
@@ -277,8 +239,7 @@ func TestValidatorDippingInAndOut(t *testing.T) {
|
||||
|
||||
// should now be jailed & kicked
|
||||
staking.EndBlocker(ctx, app.StakingKeeper)
|
||||
validator, _ = app.StakingKeeper.GetValidator(ctx, sdk.ValAddress(addr))
|
||||
require.Equal(t, stakingtypes.Unbonding, validator.Status)
|
||||
tstaking.CheckValidator(valAddr, stakingtypes.Unbonding, true)
|
||||
|
||||
// check all the signing information
|
||||
signInfo, found := app.SlashingKeeper.GetValidatorSigningInfo(ctx, consAddr)
|
||||
@@ -302,8 +263,7 @@ func TestValidatorDippingInAndOut(t *testing.T) {
|
||||
|
||||
// validator should not be kicked since we reset counter/array when it was jailed
|
||||
staking.EndBlocker(ctx, app.StakingKeeper)
|
||||
validator, _ = app.StakingKeeper.GetValidator(ctx, sdk.ValAddress(addr))
|
||||
require.Equal(t, stakingtypes.Bonded, validator.Status)
|
||||
tstaking.CheckValidator(valAddr, stakingtypes.Bonded, false)
|
||||
|
||||
// validator misses 501 blocks
|
||||
latest = height
|
||||
@@ -314,6 +274,5 @@ func TestValidatorDippingInAndOut(t *testing.T) {
|
||||
|
||||
// validator should now be jailed & kicked
|
||||
staking.EndBlocker(ctx, app.StakingKeeper)
|
||||
validator, _ = app.StakingKeeper.GetValidator(ctx, sdk.ValAddress(addr))
|
||||
require.Equal(t, stakingtypes.Unbonding, validator.Status)
|
||||
tstaking.CheckValidator(valAddr, stakingtypes.Unbonding, true)
|
||||
}
|
||||
|
||||
@@ -11,13 +11,14 @@ import (
|
||||
"github.com/cosmos/cosmos-sdk/codec"
|
||||
"github.com/cosmos/cosmos-sdk/simapp"
|
||||
"github.com/cosmos/cosmos-sdk/x/slashing/keeper"
|
||||
"github.com/cosmos/cosmos-sdk/x/slashing/testslashing"
|
||||
"github.com/cosmos/cosmos-sdk/x/slashing/types"
|
||||
)
|
||||
|
||||
func TestNewQuerier(t *testing.T) {
|
||||
app := simapp.Setup(false)
|
||||
ctx := app.BaseApp.NewContext(false, tmproto.Header{})
|
||||
app.SlashingKeeper.SetParams(ctx, keeper.TestParams())
|
||||
app.SlashingKeeper.SetParams(ctx, testslashing.TestParams())
|
||||
legacyQuerierCdc := codec.NewAminoCodec(app.LegacyAmino())
|
||||
querier := keeper.NewQuerier(app.SlashingKeeper, legacyQuerierCdc.LegacyAmino)
|
||||
|
||||
@@ -35,7 +36,7 @@ func TestQueryParams(t *testing.T) {
|
||||
legacyQuerierCdc := codec.NewAminoCodec(cdc)
|
||||
app := simapp.Setup(false)
|
||||
ctx := app.BaseApp.NewContext(false, tmproto.Header{})
|
||||
app.SlashingKeeper.SetParams(ctx, keeper.TestParams())
|
||||
app.SlashingKeeper.SetParams(ctx, testslashing.TestParams())
|
||||
|
||||
querier := keeper.NewQuerier(app.SlashingKeeper, legacyQuerierCdc.LegacyAmino)
|
||||
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
package keeper
|
||||
|
||||
// DONTCOVER
|
||||
|
||||
import (
|
||||
"github.com/tendermint/tendermint/crypto"
|
||||
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
"github.com/cosmos/cosmos-sdk/x/slashing/types"
|
||||
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
|
||||
)
|
||||
|
||||
// TODO remove dependencies on staking (should only refer to validator set type from sdk)
|
||||
|
||||
var (
|
||||
InitTokens = sdk.TokensFromConsensusPower(200)
|
||||
)
|
||||
|
||||
// Have to change these parameters for tests
|
||||
// lest the tests take forever
|
||||
func TestParams() types.Params {
|
||||
params := types.DefaultParams()
|
||||
params.SignedBlocksWindow = 1000
|
||||
params.DowntimeJailDuration = 60 * 60
|
||||
|
||||
return params
|
||||
}
|
||||
|
||||
func NewTestMsgCreateValidator(address sdk.ValAddress, pubKey crypto.PubKey, amt sdk.Int) *stakingtypes.MsgCreateValidator {
|
||||
commission := stakingtypes.NewCommissionRates(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec())
|
||||
|
||||
return stakingtypes.NewMsgCreateValidator(
|
||||
address, pubKey, sdk.NewCoin(sdk.DefaultBondDenom, amt),
|
||||
stakingtypes.Description{}, commission, sdk.OneInt(),
|
||||
)
|
||||
}
|
||||
|
||||
func NewTestMsgDelegate(delAddr sdk.AccAddress, valAddr sdk.ValAddress, delAmount sdk.Int) *stakingtypes.MsgDelegate {
|
||||
amount := sdk.NewCoin(sdk.DefaultBondDenom, delAmount)
|
||||
return stakingtypes.NewMsgDelegate(delAddr, valAddr, amount)
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package testslashing
|
||||
|
||||
import (
|
||||
"github.com/cosmos/cosmos-sdk/x/slashing/types"
|
||||
)
|
||||
|
||||
// TestParams construct default slashing params for tests.
|
||||
// Have to change these parameters for tests
|
||||
// lest the tests take forever
|
||||
func TestParams() types.Params {
|
||||
params := types.DefaultParams()
|
||||
params.SignedBlocksWindow = 1000
|
||||
params.DowntimeJailDuration = 60 * 60
|
||||
|
||||
return params
|
||||
}
|
||||
Reference in New Issue
Block a user