Merge PR #2176: Ensure Legacy Validator Delegation Invariants
* Test and allow jailed validator to self-bond * Implement TestJailedValidatorDelegations * Restructure TestJailedValidatorDelegations * Add Delegation to Validator type and update handleMsgUnjail accordingly * Update ErrMissingSelfDelegation error message * Update democoin mock validator set impl * Update pending log * Add comment to ValidatorSet
This commit is contained in:
committed by
Rigel
parent
2d92803b9f
commit
df33452490
@@ -193,6 +193,97 @@ func TestDuplicatesMsgCreateValidatorOnBehalfOf(t *testing.T) {
|
||||
require.False(t, got.IsOK(), "%v", got)
|
||||
}
|
||||
|
||||
func TestLegacyValidatorDelegations(t *testing.T) {
|
||||
ctx, _, keeper := keep.CreateTestInput(t, false, int64(1000))
|
||||
setInstantUnbondPeriod(keeper, ctx)
|
||||
|
||||
bondAmount := int64(10)
|
||||
valAddr, valPubKey := keep.Addrs[0], keep.PKs[0]
|
||||
delAddr := keep.Addrs[1]
|
||||
|
||||
// create validator
|
||||
msgCreateVal := newTestMsgCreateValidator(valAddr, valPubKey, bondAmount)
|
||||
got := handleMsgCreateValidator(ctx, msgCreateVal, keeper)
|
||||
require.True(t, got.IsOK(), "expected create validator msg to be ok, got %v", got)
|
||||
|
||||
// verify the validator exists and has the correct attributes
|
||||
validator, found := keeper.GetValidator(ctx, valAddr)
|
||||
require.True(t, found)
|
||||
require.Equal(t, sdk.Bonded, validator.Status)
|
||||
require.Equal(t, bondAmount, validator.DelegatorShares.RoundInt64())
|
||||
require.Equal(t, bondAmount, validator.BondedTokens().RoundInt64())
|
||||
|
||||
// delegate tokens to the validator
|
||||
msgDelegate := newTestMsgDelegate(delAddr, valAddr, bondAmount)
|
||||
got = handleMsgDelegate(ctx, msgDelegate, keeper)
|
||||
require.True(t, got.IsOK(), "expected delegation to be ok, got %v", got)
|
||||
|
||||
// verify validator bonded shares
|
||||
validator, found = keeper.GetValidator(ctx, valAddr)
|
||||
require.True(t, found)
|
||||
require.Equal(t, bondAmount*2, validator.DelegatorShares.RoundInt64())
|
||||
require.Equal(t, bondAmount*2, validator.BondedTokens().RoundInt64())
|
||||
|
||||
// unbond validator total self-delegations (which should jail the validator)
|
||||
unbondShares := sdk.NewDec(10)
|
||||
msgBeginUnbonding := NewMsgBeginUnbonding(valAddr, valAddr, unbondShares)
|
||||
msgCompleteUnbonding := NewMsgCompleteUnbonding(valAddr, valAddr)
|
||||
|
||||
got = handleMsgBeginUnbonding(ctx, msgBeginUnbonding, keeper)
|
||||
require.True(t, got.IsOK(), "expected begin unbonding validator msg to be ok, got %v", got)
|
||||
|
||||
got = handleMsgCompleteUnbonding(ctx, msgCompleteUnbonding, keeper)
|
||||
require.True(t, got.IsOK(), "expected complete unbonding validator msg to be ok, got %v", got)
|
||||
|
||||
// verify the validator record still exists, is jailed, and has correct tokens
|
||||
validator, found = keeper.GetValidator(ctx, valAddr)
|
||||
require.True(t, found)
|
||||
require.True(t, validator.Jailed)
|
||||
require.Equal(t, sdk.NewDec(10), validator.Tokens)
|
||||
|
||||
// verify delegation still exists
|
||||
bond, found := keeper.GetDelegation(ctx, delAddr, valAddr)
|
||||
require.True(t, found)
|
||||
require.Equal(t, bondAmount, bond.Shares.RoundInt64())
|
||||
require.Equal(t, bondAmount, validator.DelegatorShares.RoundInt64())
|
||||
|
||||
// verify a delegator cannot create a new delegation to the now jailed validator
|
||||
msgDelegate = newTestMsgDelegate(delAddr, valAddr, bondAmount)
|
||||
got = handleMsgDelegate(ctx, msgDelegate, keeper)
|
||||
require.False(t, got.IsOK(), "expected delegation to not be ok, got %v", got)
|
||||
|
||||
// verify the validator can still self-delegate
|
||||
msgSelfDelegate := newTestMsgDelegate(valAddr, valAddr, bondAmount)
|
||||
got = handleMsgDelegate(ctx, msgSelfDelegate, keeper)
|
||||
require.True(t, got.IsOK(), "expected delegation to not be ok, got %v", got)
|
||||
|
||||
// verify validator bonded shares
|
||||
validator, found = keeper.GetValidator(ctx, valAddr)
|
||||
require.True(t, found)
|
||||
require.Equal(t, bondAmount*2, validator.DelegatorShares.RoundInt64())
|
||||
require.Equal(t, bondAmount*2, validator.Tokens.RoundInt64())
|
||||
|
||||
// unjail the validator now that is has non-zero self-delegated shares
|
||||
keeper.Unjail(ctx, valPubKey)
|
||||
|
||||
// verify the validator can now accept delegations
|
||||
msgDelegate = newTestMsgDelegate(delAddr, valAddr, bondAmount)
|
||||
got = handleMsgDelegate(ctx, msgDelegate, keeper)
|
||||
require.True(t, got.IsOK(), "expected delegation to be ok, got %v", got)
|
||||
|
||||
// verify validator bonded shares
|
||||
validator, found = keeper.GetValidator(ctx, valAddr)
|
||||
require.True(t, found)
|
||||
require.Equal(t, bondAmount*3, validator.DelegatorShares.RoundInt64())
|
||||
require.Equal(t, bondAmount*3, validator.Tokens.RoundInt64())
|
||||
|
||||
// verify new delegation
|
||||
bond, found = keeper.GetDelegation(ctx, delAddr, valAddr)
|
||||
require.True(t, found)
|
||||
require.Equal(t, bondAmount*2, bond.Shares.RoundInt64())
|
||||
require.Equal(t, bondAmount*3, validator.DelegatorShares.RoundInt64())
|
||||
}
|
||||
|
||||
func TestIncrementsMsgDelegate(t *testing.T) {
|
||||
initBond := int64(1000)
|
||||
ctx, accMapper, keeper := keep.CreateTestInput(t, false, initBond)
|
||||
|
||||
Reference in New Issue
Block a user