github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/staking/keeper/invariants_test.go (about)

     1  package keeper
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     8  	"github.com/fibonacci-chain/fbc/x/staking/types"
     9  	"github.com/stretchr/testify/require"
    10  )
    11  
    12  func TestDelegatorAddSharesInvariant(t *testing.T) {
    13  	initPower := int64(1000000)
    14  	ctx, _, mKeeper := CreateTestInput(t, false, initPower)
    15  	k := mKeeper.Keeper
    16  	dAddr := Addrs[0]
    17  	vAddr1, vAddr2 := sdk.ValAddress(Addrs[1]), sdk.ValAddress(Addrs[2])
    18  	vPk1, vPk2 := PKs[1], PKs[2]
    19  
    20  	// create validator
    21  	msgCreateValidator1 := NewTestMsgCreateValidator(vAddr1, vPk1, types.DefaultMinSelfDelegation)
    22  	validator1 := types.NewValidator(msgCreateValidator1.ValidatorAddress, msgCreateValidator1.PubKey,
    23  		msgCreateValidator1.Description, msgCreateValidator1.MinSelfDelegation.Amount)
    24  	k.SetValidator(ctx, validator1)
    25  	k.SetValidatorByConsAddr(ctx, validator1)
    26  	k.SetNewValidatorByPowerIndex(ctx, validator1)
    27  	// add shares of equal value of msd for validator itself
    28  	defaultMinSelfDelegationToken1 := sdk.NewDecCoinFromDec(k.BondDenom(ctx), validator1.MinSelfDelegation)
    29  	err := k.AddSharesAsMinSelfDelegation(ctx, msgCreateValidator1.DelegatorAddress, &validator1, defaultMinSelfDelegationToken1)
    30  	require.Nil(t, err)
    31  
    32  	msgCreateValidator2 := NewTestMsgCreateValidator(vAddr2, vPk2, types.DefaultMinSelfDelegation)
    33  	validator2 := types.NewValidator(msgCreateValidator2.ValidatorAddress, msgCreateValidator2.PubKey,
    34  		msgCreateValidator2.Description, msgCreateValidator2.MinSelfDelegation.Amount)
    35  	k.SetValidator(ctx, validator2)
    36  	k.SetValidatorByConsAddr(ctx, validator2)
    37  	k.SetNewValidatorByPowerIndex(ctx, validator2)
    38  	// add shares of equal value of msd for validator itself
    39  	defaultMinSelfDelegationToken2 := sdk.NewDecCoinFromDec(k.BondDenom(ctx), validator2.MinSelfDelegation)
    40  	err = k.AddSharesAsMinSelfDelegation(ctx, msgCreateValidator2.DelegatorAddress, &validator2, defaultMinSelfDelegationToken2)
    41  	require.Nil(t, err)
    42  
    43  	// deposit
    44  	delegateAmount, sdkErr := sdk.ParseDecCoin(fmt.Sprintf("100%s", k.BondDenom(ctx)))
    45  	require.Nil(t, sdkErr)
    46  	err = k.Delegate(ctx, dAddr, delegateAmount)
    47  	require.Nil(t, err)
    48  
    49  	// add shares
    50  	vals, sdkErr := k.GetValidatorsToAddShares(ctx, []sdk.ValAddress{vAddr1, vAddr2})
    51  	require.Nil(t, sdkErr)
    52  	delegator, found := k.GetDelegator(ctx, dAddr)
    53  	require.True(t, found)
    54  	totalTokens := delegator.Tokens.Add(delegator.TotalDelegatedTokens)
    55  	shares, sdkErr := k.AddSharesToValidators(ctx, dAddr, vals, totalTokens)
    56  	require.Nil(t, sdkErr)
    57  	lenVals := len(vals)
    58  	valAddrs := make([]sdk.ValAddress, lenVals)
    59  	for i := 0; i < lenVals; i++ {
    60  		valAddrs[i] = vals[i].OperatorAddress
    61  	}
    62  	delegator.ValidatorAddresses = valAddrs
    63  	delegator.Shares = shares
    64  	k.SetDelegator(ctx, delegator)
    65  
    66  	// sanity check pass
    67  	invariantFunc := DelegatorAddSharesInvariant(k)
    68  	require.NotNil(t, invariantFunc)
    69  	_, broken := invariantFunc(ctx)
    70  	require.False(t, broken)
    71  
    72  	// sanity check pass failed
    73  	validator, found := k.GetValidator(ctx, vAddr1)
    74  	require.True(t, found)
    75  	validator.DelegatorShares = validator.DelegatorShares.Add(sdk.OneDec())
    76  	k.SetValidator(ctx, validator)
    77  	_, broken = invariantFunc(ctx)
    78  	require.True(t, broken)
    79  
    80  }