refactor(x/staking): migrate to use env (#19414)
Co-authored-by: Facundo <facundomedica@gmail.com>
This commit is contained in:
@@ -105,7 +105,7 @@ func initFixture(t *testing.T) *fixture {
|
||||
log.NewNopLogger(),
|
||||
)
|
||||
|
||||
stakingKeeper := stakingkeeper.NewKeeper(cdc, runtime.NewKVStoreService(keys[stakingtypes.StoreKey]), accountKeeper, bankKeeper, authority.String(), addresscodec.NewBech32Codec(sdk.Bech32PrefixValAddr), addresscodec.NewBech32Codec(sdk.Bech32PrefixConsAddr))
|
||||
stakingKeeper := stakingkeeper.NewKeeper(cdc, runtime.NewEnvironment(runtime.NewKVStoreService(keys[stakingtypes.StoreKey]), log.NewNopLogger()), accountKeeper, bankKeeper, authority.String(), addresscodec.NewBech32Codec(sdk.Bech32PrefixValAddr), addresscodec.NewBech32Codec(sdk.Bech32PrefixConsAddr))
|
||||
require.NoError(t, stakingKeeper.Params.Set(newCtx, stakingtypes.DefaultParams()))
|
||||
|
||||
poolKeeper := poolkeeper.NewKeeper(
|
||||
|
||||
@@ -125,7 +125,7 @@ func initFixture(tb testing.TB) *fixture {
|
||||
log.NewNopLogger(),
|
||||
)
|
||||
|
||||
stakingKeeper := stakingkeeper.NewKeeper(cdc, runtime.NewKVStoreService(keys[stakingtypes.StoreKey]), accountKeeper, bankKeeper, authority.String(), addresscodec.NewBech32Codec(sdk.Bech32PrefixValAddr), addresscodec.NewBech32Codec(sdk.Bech32PrefixConsAddr))
|
||||
stakingKeeper := stakingkeeper.NewKeeper(cdc, runtime.NewEnvironment(runtime.NewKVStoreService(keys[stakingtypes.StoreKey]), log.NewNopLogger()), accountKeeper, bankKeeper, authority.String(), addresscodec.NewBech32Codec(sdk.Bech32PrefixValAddr), addresscodec.NewBech32Codec(sdk.Bech32PrefixConsAddr))
|
||||
|
||||
slashingKeeper := slashingkeeper.NewKeeper(cdc, codec.NewLegacyAmino(), runtime.NewKVStoreService(keys[slashingtypes.StoreKey]), stakingKeeper, authority.String())
|
||||
|
||||
|
||||
@@ -92,7 +92,7 @@ func initFixture(tb testing.TB) *fixture {
|
||||
log.NewNopLogger(),
|
||||
)
|
||||
|
||||
stakingKeeper := stakingkeeper.NewKeeper(cdc, runtime.NewKVStoreService(keys[stakingtypes.StoreKey]), accountKeeper, bankKeeper, authority.String(), addresscodec.NewBech32Codec(sdk.Bech32PrefixValAddr), addresscodec.NewBech32Codec(sdk.Bech32PrefixConsAddr))
|
||||
stakingKeeper := stakingkeeper.NewKeeper(cdc, runtime.NewEnvironment(runtime.NewKVStoreService(keys[stakingtypes.StoreKey]), log.NewNopLogger()), accountKeeper, bankKeeper, authority.String(), addresscodec.NewBech32Codec(sdk.Bech32PrefixValAddr), addresscodec.NewBech32Codec(sdk.Bech32PrefixConsAddr))
|
||||
|
||||
poolKeeper := poolkeeper.NewKeeper(cdc, runtime.NewKVStoreService(keys[pooltypes.StoreKey]), accountKeeper, bankKeeper, stakingKeeper, authority.String())
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"cosmossdk.io/core/comet"
|
||||
coreheader "cosmossdk.io/core/header"
|
||||
"cosmossdk.io/depinject"
|
||||
"cosmossdk.io/log"
|
||||
authkeeper "cosmossdk.io/x/auth/keeper"
|
||||
@@ -22,6 +23,9 @@ import (
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
)
|
||||
|
||||
// TestBeginBlocker is a unit test function that tests the behavior of the BeginBlocker function.
|
||||
// It sets up the necessary dependencies and context, creates a validator, and performs various operations
|
||||
// to test the slashing logic. It checks if the validator is correctly jailed after a certain number of blocks.
|
||||
func TestBeginBlocker(t *testing.T) {
|
||||
var (
|
||||
interfaceRegistry codectypes.InterfaceRegistry
|
||||
@@ -85,7 +89,7 @@ func TestBeginBlocker(t *testing.T) {
|
||||
|
||||
info, err := slashingKeeper.ValidatorSigningInfo.Get(ctx, sdk.ConsAddress(pk.Address()))
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, ctx.BlockHeight(), info.StartHeight)
|
||||
require.Equal(t, ctx.HeaderInfo().Height, info.StartHeight)
|
||||
require.Equal(t, int64(1), info.IndexOffset)
|
||||
require.Equal(t, time.Unix(0, 0).UTC(), info.JailedUntil)
|
||||
require.Equal(t, int64(0), info.MissedBlocksCounter)
|
||||
@@ -96,7 +100,7 @@ func TestBeginBlocker(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
// for 100 blocks, mark the validator as having signed
|
||||
for ; height < signedBlocksWindow; height++ {
|
||||
ctx = ctx.WithBlockHeight(height)
|
||||
ctx = ctx.WithHeaderInfo(coreheader.Info{Height: height})
|
||||
|
||||
err = slashing.BeginBlocker(ctx, slashingKeeper)
|
||||
require.NoError(t, err)
|
||||
@@ -106,7 +110,7 @@ func TestBeginBlocker(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
// for 50 blocks, mark the validator as having not signed
|
||||
for ; height < ((signedBlocksWindow * 2) - minSignedPerWindow + 1); height++ {
|
||||
ctx = ctx.WithBlockHeight(height).WithCometInfo(comet.Info{
|
||||
ctx = ctx.WithHeaderInfo(coreheader.Info{Height: height}).WithBlockHeight(height).WithCometInfo(comet.Info{
|
||||
LastCommit: comet.CommitInfo{Votes: []comet.VoteInfo{{
|
||||
Validator: abciVal,
|
||||
BlockIDFlag: comet.BlockIDFlagAbsent,
|
||||
|
||||
@@ -9,6 +9,7 @@ import (
|
||||
|
||||
"cosmossdk.io/core/appmodule"
|
||||
"cosmossdk.io/core/comet"
|
||||
coreheader "cosmossdk.io/core/header"
|
||||
"cosmossdk.io/log"
|
||||
storetypes "cosmossdk.io/store/types"
|
||||
"cosmossdk.io/x/auth"
|
||||
@@ -92,7 +93,7 @@ func initFixture(tb testing.TB) *fixture {
|
||||
log.NewNopLogger(),
|
||||
)
|
||||
|
||||
stakingKeeper := stakingkeeper.NewKeeper(cdc, runtime.NewKVStoreService(keys[stakingtypes.StoreKey]), accountKeeper, bankKeeper, authority.String(), addresscodec.NewBech32Codec(sdk.Bech32PrefixValAddr), addresscodec.NewBech32Codec(sdk.Bech32PrefixConsAddr))
|
||||
stakingKeeper := stakingkeeper.NewKeeper(cdc, runtime.NewEnvironment(runtime.NewKVStoreService(keys[stakingtypes.StoreKey]), log.NewNopLogger()), accountKeeper, bankKeeper, authority.String(), addresscodec.NewBech32Codec(sdk.Bech32PrefixValAddr), addresscodec.NewBech32Codec(sdk.Bech32PrefixConsAddr))
|
||||
|
||||
slashingKeeper := slashingkeeper.NewKeeper(cdc, &codec.LegacyAmino{}, runtime.NewKVStoreService(keys[slashingtypes.StoreKey]), stakingKeeper, authority.String())
|
||||
|
||||
@@ -308,7 +309,7 @@ func TestHandleAlreadyJailed(t *testing.T) {
|
||||
consaddr, err := f.stakingKeeper.ConsensusAddressCodec().BytesToString(val.Address())
|
||||
assert.NilError(t, err)
|
||||
|
||||
info := slashingtypes.NewValidatorSigningInfo(consaddr, f.ctx.BlockHeight(), int64(0), time.Unix(0, 0), false, int64(0))
|
||||
info := slashingtypes.NewValidatorSigningInfo(consaddr, f.ctx.HeaderInfo().Height, int64(0), time.Unix(0, 0), false, int64(0))
|
||||
assert.NilError(t, f.slashingKeeper.ValidatorSigningInfo.Set(f.ctx, sdk.ConsAddress(val.Address()), info))
|
||||
|
||||
acc := f.accountKeeper.NewAccountWithAddress(f.ctx, sdk.AccAddress(addr))
|
||||
@@ -325,7 +326,7 @@ func TestHandleAlreadyJailed(t *testing.T) {
|
||||
// 1000 first blocks OK
|
||||
height := int64(0)
|
||||
for ; height < signedBlocksWindow; height++ {
|
||||
f.ctx = f.ctx.WithBlockHeight(height)
|
||||
f.ctx = f.ctx.WithHeaderInfo(coreheader.Info{Height: height}).WithBlockHeight(height)
|
||||
err = f.slashingKeeper.HandleValidatorSignature(f.ctx, val.Address(), power, comet.BlockIDFlagCommit)
|
||||
assert.NilError(t, err)
|
||||
}
|
||||
@@ -335,7 +336,7 @@ func TestHandleAlreadyJailed(t *testing.T) {
|
||||
|
||||
// 501 blocks missed
|
||||
for ; height < signedBlocksWindow+(signedBlocksWindow-minSignedPerWindow)+1; height++ {
|
||||
f.ctx = f.ctx.WithBlockHeight(height)
|
||||
f.ctx = f.ctx.WithHeaderInfo(coreheader.Info{Height: height}).WithBlockHeight(height)
|
||||
err = f.slashingKeeper.HandleValidatorSignature(f.ctx, val.Address(), power, comet.BlockIDFlagAbsent)
|
||||
assert.NilError(t, err)
|
||||
}
|
||||
@@ -353,7 +354,7 @@ func TestHandleAlreadyJailed(t *testing.T) {
|
||||
assert.DeepEqual(t, resultingTokens, validator.GetTokens())
|
||||
|
||||
// another block missed
|
||||
f.ctx = f.ctx.WithBlockHeight(height)
|
||||
f.ctx = f.ctx.WithHeaderInfo(coreheader.Info{Height: height}).WithBlockHeight(height)
|
||||
assert.NilError(t, f.slashingKeeper.HandleValidatorSignature(f.ctx, val.Address(), power, comet.BlockIDFlagAbsent))
|
||||
|
||||
// validator should not have been slashed twice
|
||||
@@ -404,7 +405,7 @@ func TestValidatorDippingInAndOut(t *testing.T) {
|
||||
// 100 first blocks OK
|
||||
height := int64(0)
|
||||
for ; height < int64(100); height++ {
|
||||
f.ctx = f.ctx.WithBlockHeight(height)
|
||||
f.ctx = f.ctx.WithBlockHeight(height).WithHeaderInfo(coreheader.Info{Height: height})
|
||||
assert.NilError(t, f.slashingKeeper.HandleValidatorSignature(f.ctx, val.Address(), power, comet.BlockIDFlagCommit))
|
||||
}
|
||||
|
||||
@@ -418,7 +419,7 @@ func TestValidatorDippingInAndOut(t *testing.T) {
|
||||
|
||||
// 600 more blocks happened
|
||||
height += 600
|
||||
f.ctx = f.ctx.WithBlockHeight(height)
|
||||
f.ctx = f.ctx.WithBlockHeight(height).WithHeaderInfo(coreheader.Info{Height: height})
|
||||
|
||||
// validator added back in
|
||||
tstaking.DelegateWithPower(sdk.AccAddress(pks[2].Address()), valAddr, 50)
|
||||
@@ -444,7 +445,7 @@ func TestValidatorDippingInAndOut(t *testing.T) {
|
||||
// misses 500 blocks + within the signing windows i.e. 700-1700
|
||||
// validators misses all 1000 blocks of a SignedBlockWindows
|
||||
for ; height < latest+1; height++ {
|
||||
err = f.slashingKeeper.HandleValidatorSignature(f.ctx.WithBlockHeight(height), val.Address(), newPower, comet.BlockIDFlagAbsent)
|
||||
err = f.slashingKeeper.HandleValidatorSignature(f.ctx.WithBlockHeight(height).WithHeaderInfo(coreheader.Info{Height: height}), val.Address(), newPower, comet.BlockIDFlagAbsent)
|
||||
assert.NilError(t, err)
|
||||
}
|
||||
|
||||
@@ -466,7 +467,7 @@ func TestValidatorDippingInAndOut(t *testing.T) {
|
||||
|
||||
// some blocks pass
|
||||
height = int64(5000)
|
||||
f.ctx = f.ctx.WithBlockHeight(height)
|
||||
f.ctx = f.ctx.WithBlockHeight(height).WithHeaderInfo(coreheader.Info{Height: height})
|
||||
|
||||
info = slashingtypes.NewValidatorSigningInfo(consaddrStr, f.ctx.BlockHeight(), int64(0), time.Unix(0, 0), false, int64(0))
|
||||
err = f.slashingKeeper.ValidatorSigningInfo.Set(f.ctx, consAddr, info)
|
||||
@@ -494,7 +495,7 @@ func TestValidatorDippingInAndOut(t *testing.T) {
|
||||
// validator misses 501 blocks after SignedBlockWindow period (1000 blocks)
|
||||
latest = signedBlocksWindow + height
|
||||
for ; height < latest+minSignedPerWindow; height++ {
|
||||
f.ctx = f.ctx.WithBlockHeight(height)
|
||||
f.ctx = f.ctx.WithBlockHeight(height).WithHeaderInfo(coreheader.Info{Height: height})
|
||||
err = f.slashingKeeper.HandleValidatorSignature(f.ctx, val.Address(), newPower, comet.BlockIDFlagAbsent)
|
||||
assert.NilError(t, err)
|
||||
}
|
||||
|
||||
@@ -142,7 +142,7 @@ func initFixture(tb testing.TB) *fixture {
|
||||
log.NewNopLogger(),
|
||||
)
|
||||
|
||||
stakingKeeper := stakingkeeper.NewKeeper(cdc, runtime.NewKVStoreService(keys[types.StoreKey]), accountKeeper, bankKeeper, authority.String(), addresscodec.NewBech32Codec(sdk.Bech32PrefixValAddr), addresscodec.NewBech32Codec(sdk.Bech32PrefixConsAddr))
|
||||
stakingKeeper := stakingkeeper.NewKeeper(cdc, runtime.NewEnvironment(runtime.NewKVStoreService(keys[types.StoreKey]), log.NewNopLogger()), accountKeeper, bankKeeper, authority.String(), addresscodec.NewBech32Codec(sdk.Bech32PrefixValAddr), addresscodec.NewBech32Codec(sdk.Bech32PrefixConsAddr))
|
||||
|
||||
authModule := auth.NewAppModule(cdc, accountKeeper, authsims.RandomGenesisAccounts)
|
||||
bankModule := bank.NewAppModule(cdc, bankKeeper, accountKeeper)
|
||||
|
||||
@@ -66,7 +66,7 @@ func TestUnbondingDelegationsMaxEntries(t *testing.T) {
|
||||
totalUnbonded := math.NewInt(0)
|
||||
for i := int64(0); i < int64(maxEntries); i++ {
|
||||
var err error
|
||||
ctx = ctx.WithBlockHeight(i)
|
||||
ctx = ctx.WithHeaderInfo(header.Info{Height: i})
|
||||
var amount math.Int
|
||||
completionTime, amount, err = f.stakingKeeper.Undelegate(ctx, addrDel, addrVal, math.LegacyNewDec(1))
|
||||
assert.NilError(t, err)
|
||||
|
||||
@@ -106,7 +106,7 @@ func initDeterministicFixture(t *testing.T) *deterministicFixture {
|
||||
log.NewNopLogger(),
|
||||
)
|
||||
|
||||
stakingKeeper := stakingkeeper.NewKeeper(cdc, runtime.NewKVStoreService(keys[stakingtypes.StoreKey]), accountKeeper, bankKeeper, authority.String(), addresscodec.NewBech32Codec(sdk.Bech32PrefixValAddr), addresscodec.NewBech32Codec(sdk.Bech32PrefixConsAddr))
|
||||
stakingKeeper := stakingkeeper.NewKeeper(cdc, runtime.NewEnvironment(runtime.NewKVStoreService(keys[stakingtypes.StoreKey]), log.NewNopLogger()), accountKeeper, bankKeeper, authority.String(), addresscodec.NewBech32Codec(sdk.Bech32PrefixValAddr), addresscodec.NewBech32Codec(sdk.Bech32PrefixConsAddr))
|
||||
|
||||
authModule := auth.NewAppModule(cdc, accountKeeper, authsims.RandomGenesisAccounts)
|
||||
bankModule := bank.NewAppModule(cdc, bankKeeper, accountKeeper)
|
||||
|
||||
@@ -327,8 +327,7 @@ func TestRotateConsPubKey(t *testing.T) {
|
||||
|
||||
ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1)
|
||||
|
||||
newCtx := ctx.WithHeaderInfo(header.Info{Time: ctx.HeaderInfo().Time.Add(params.UnbondingTime)})
|
||||
newCtx = newCtx.WithBlockHeight(newCtx.BlockHeight() + 1)
|
||||
newCtx := ctx.WithHeaderInfo(header.Info{Height: ctx.BlockHeight() + 1, Time: ctx.HeaderInfo().Time.Add(params.UnbondingTime)}).WithBlockHeight(ctx.BlockHeight() + 1)
|
||||
// this should remove keys from waiting queue since unbonding time is reached
|
||||
_, err = stakingKeeper.EndBlocker(newCtx)
|
||||
assert.NilError(t, err)
|
||||
|
||||
@@ -254,7 +254,10 @@ func TestSlashValidatorAtCurrentHeight(t *testing.T) {
|
||||
assert.DeepEqual(t, f.stakingKeeper.TokensFromConsensusPower(f.sdkCtx, 5).String(), diffTokens.String())
|
||||
}
|
||||
|
||||
// tests Slash at a previous height with an unbonding delegation
|
||||
// TestSlashWithUnbondingDelegation tests the slashing of a validator with an unbonding delegation.
|
||||
// It sets up an environment with a validator and an unbonding delegation, and then performs slashing
|
||||
// operations on the validator. The test verifies that the slashing correctly affects the unbonding
|
||||
// delegation and the validator's power.
|
||||
func TestSlashWithUnbondingDelegation(t *testing.T) {
|
||||
f, addrDels, addrVals := bootstrapSlashTest(t, 10)
|
||||
|
||||
@@ -271,7 +274,7 @@ func TestSlashWithUnbondingDelegation(t *testing.T) {
|
||||
assert.NilError(t, f.stakingKeeper.SetUnbondingDelegation(f.sdkCtx, ubd))
|
||||
|
||||
// slash validator for the first time
|
||||
f.sdkCtx = f.sdkCtx.WithBlockHeight(12)
|
||||
f.sdkCtx = f.sdkCtx.WithHeaderInfo(header.Info{Height: 12})
|
||||
bondedPool := f.stakingKeeper.GetBondedPool(f.sdkCtx)
|
||||
oldBondedPoolBalances := f.bankKeeper.GetAllBalances(f.sdkCtx, bondedPool.GetAddress())
|
||||
|
||||
@@ -417,7 +420,7 @@ func TestSlashWithRedelegation(t *testing.T) {
|
||||
oldNotBonded := f.bankKeeper.GetBalance(f.sdkCtx, notBondedPool.GetAddress(), bondDenom).Amount
|
||||
|
||||
// slash validator
|
||||
f.sdkCtx = f.sdkCtx.WithBlockHeight(12)
|
||||
f.sdkCtx = f.sdkCtx.WithBlockHeight(12).WithHeaderInfo(header.Info{Height: 12})
|
||||
_, found := f.stakingKeeper.GetValidatorByConsAddr(f.sdkCtx, consAddr)
|
||||
assert.Assert(t, found)
|
||||
|
||||
@@ -485,7 +488,7 @@ func TestSlashWithRedelegation(t *testing.T) {
|
||||
assert.Equal(t, int64(4), validator.GetConsensusPower(f.stakingKeeper.PowerReduction(f.sdkCtx)))
|
||||
|
||||
// slash the validator again, by 100%
|
||||
f.sdkCtx = f.sdkCtx.WithBlockHeight(12)
|
||||
f.sdkCtx = f.sdkCtx.WithBlockHeight(12).WithHeaderInfo(header.Info{Height: 12})
|
||||
_, found = f.stakingKeeper.GetValidatorByConsAddr(f.sdkCtx, consAddr)
|
||||
assert.Assert(t, found)
|
||||
|
||||
@@ -518,7 +521,7 @@ func TestSlashWithRedelegation(t *testing.T) {
|
||||
|
||||
// slash the validator again, by 100%
|
||||
// no stake remains to be slashed
|
||||
f.sdkCtx = f.sdkCtx.WithBlockHeight(12)
|
||||
f.sdkCtx = f.sdkCtx.WithBlockHeight(12).WithHeaderInfo(header.Info{Height: 12})
|
||||
// validator still in unbonding period
|
||||
validator, _ = f.stakingKeeper.GetValidatorByConsAddr(f.sdkCtx, consAddr)
|
||||
assert.Equal(t, validator.GetStatus(), sdk.Unbonding)
|
||||
@@ -585,7 +588,7 @@ func TestSlashBoth(t *testing.T) {
|
||||
oldBonded := f.bankKeeper.GetBalance(f.sdkCtx, bondedPool.GetAddress(), bondDenom).Amount
|
||||
oldNotBonded := f.bankKeeper.GetBalance(f.sdkCtx, notBondedPool.GetAddress(), bondDenom).Amount
|
||||
// slash validator
|
||||
f.sdkCtx = f.sdkCtx.WithBlockHeight(12)
|
||||
f.sdkCtx = f.sdkCtx.WithBlockHeight(12).WithHeaderInfo(header.Info{Height: 12})
|
||||
_, found := f.stakingKeeper.GetValidatorByConsAddr(f.sdkCtx, sdk.GetConsAddress(PKs[0]))
|
||||
assert.Assert(t, found)
|
||||
consAddr0 := sdk.ConsAddress(PKs[0].Address())
|
||||
|
||||
Reference in New Issue
Block a user