github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/evm/keeper/invariants_test.go (about) 1 package keeper_test 2 3 import ( 4 "math/big" 5 6 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 7 authtypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/types" 8 9 "github.com/fibonacci-chain/fbc/app/crypto/ethsecp256k1" 10 ethermint "github.com/fibonacci-chain/fbc/app/types" 11 12 ethcmn "github.com/ethereum/go-ethereum/common" 13 ) 14 15 func (suite *KeeperTestSuite) TestBalanceInvariant() { 16 privkey, err := ethsecp256k1.GenerateKey() 17 suite.Require().NoError(err) 18 19 address := ethcmn.HexToAddress(privkey.PubKey().Address().String()) 20 21 testCases := []struct { 22 name string 23 malleate func() 24 expBroken bool 25 }{ 26 { 27 "balance mismatch", 28 func() { 29 acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, address.Bytes()) 30 suite.Require().NotNil(acc) 31 err := acc.SetCoins(sdk.NewCoins(ethermint.NewPhotonCoinInt64(1))) 32 suite.Require().NoError(err) 33 suite.app.AccountKeeper.SetAccount(suite.ctx, acc) 34 35 suite.app.EvmKeeper.SetBalance(suite.ctx, address, big.NewInt(1000)) 36 }, 37 false, 38 }, 39 { 40 "balance ok", 41 func() { 42 acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, address.Bytes()) 43 suite.Require().NotNil(acc) 44 err := acc.SetCoins(sdk.NewCoins(ethermint.NewPhotonCoinInt64(1))) 45 suite.Require().NoError(err) 46 suite.app.AccountKeeper.SetAccount(suite.ctx, acc) 47 48 suite.app.EvmKeeper.SetBalance(suite.ctx, address, big.NewInt(1000000000000000000)) 49 }, 50 false, 51 }, 52 { 53 "invalid account type", 54 func() { 55 acc := authtypes.NewBaseAccountWithAddress(address.Bytes()) 56 suite.app.AccountKeeper.SetAccount(suite.ctx, &acc) 57 }, 58 false, 59 }, 60 } 61 62 for _, tc := range testCases { 63 suite.Run(tc.name, func() { 64 suite.SetupTest() // reset values 65 66 tc.malleate() 67 68 _, broken := suite.app.EvmKeeper.BalanceInvariant()(suite.ctx) 69 if tc.expBroken { 70 suite.Require().True(broken) 71 } else { 72 suite.Require().False(broken) 73 } 74 }) 75 } 76 } 77 78 func (suite *KeeperTestSuite) TestNonceInvariant() { 79 privkey, err := ethsecp256k1.GenerateKey() 80 suite.Require().NoError(err) 81 82 address := ethcmn.HexToAddress(privkey.PubKey().Address().String()) 83 84 testCases := []struct { 85 name string 86 malleate func() 87 expBroken bool 88 }{ 89 { 90 "nonce mismatch", 91 func() { 92 acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, address.Bytes()) 93 suite.Require().NotNil(acc) 94 err := acc.SetSequence(1) 95 suite.Require().NoError(err) 96 suite.app.AccountKeeper.SetAccount(suite.ctx, acc) 97 98 suite.app.EvmKeeper.SetNonce(suite.ctx, address, 100) 99 }, 100 false, 101 }, 102 { 103 "nonce ok", 104 func() { 105 acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, address.Bytes()) 106 suite.Require().NotNil(acc) 107 err := acc.SetSequence(1) 108 suite.Require().NoError(err) 109 suite.app.AccountKeeper.SetAccount(suite.ctx, acc) 110 111 suite.app.EvmKeeper.SetNonce(suite.ctx, address, 1) 112 }, 113 false, 114 }, 115 { 116 "invalid account type", 117 func() { 118 acc := authtypes.NewBaseAccountWithAddress(address.Bytes()) 119 suite.app.AccountKeeper.SetAccount(suite.ctx, &acc) 120 }, 121 false, 122 }, 123 } 124 125 for _, tc := range testCases { 126 suite.Run(tc.name, func() { 127 suite.SetupTest() // reset values 128 129 tc.malleate() 130 131 _, broken := suite.app.EvmKeeper.NonceInvariant()(suite.ctx) 132 if tc.expBroken { 133 suite.Require().True(broken) 134 } else { 135 suite.Require().False(broken) 136 } 137 }) 138 } 139 }