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  }