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 }