github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/evm/keeper/keeper_test.go (about) 1 package keeper_test 2 3 import ( 4 "math/big" 5 "testing" 6 "time" 7 8 ethcmn "github.com/ethereum/go-ethereum/common" 9 ethtypes "github.com/ethereum/go-ethereum/core/types" 10 ethcrypto "github.com/ethereum/go-ethereum/crypto" 11 12 "github.com/fibonacci-chain/fbc/app" 13 ethermint "github.com/fibonacci-chain/fbc/app/types" 14 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 15 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth" 16 abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types" 17 "github.com/fibonacci-chain/fbc/x/evm/keeper" 18 "github.com/fibonacci-chain/fbc/x/evm/types" 19 "github.com/fibonacci-chain/fbc/x/evm/watcher" 20 21 "github.com/spf13/viper" 22 "github.com/stretchr/testify/suite" 23 ) 24 25 const addrHex = "0x756F45E3FA69347A9A973A725E3C98bC4db0b4c1" 26 const hex = "0x0d87a3a5f73140f46aac1bf419263e4e94e87c292f25007700ab7f2060e2af68" 27 28 var ( 29 hash = ethcmn.FromHex(hex) 30 ) 31 32 type KeeperTestSuite struct { 33 suite.Suite 34 35 ctx sdk.Context 36 querier sdk.Querier 37 app *app.FBChainApp 38 stateDB *types.CommitStateDB 39 address ethcmn.Address 40 } 41 42 func (suite *KeeperTestSuite) SetupTest() { 43 checkTx := false 44 viper.Set(watcher.FlagFastQuery, true) 45 suite.app = app.Setup(checkTx) 46 suite.ctx = suite.app.BaseApp.NewContext(checkTx, abci.Header{Height: 1, ChainID: "ethermint-3", Time: time.Now().UTC()}) 47 suite.stateDB = types.CreateEmptyCommitStateDB(suite.app.EvmKeeper.GenerateCSDBParams(), suite.ctx) 48 suite.querier = keeper.NewQuerier(*suite.app.EvmKeeper) 49 suite.address = ethcmn.HexToAddress(addrHex) 50 51 balance := sdk.NewCoins(ethermint.NewPhotonCoin(sdk.ZeroInt())) 52 acc := ðermint.EthAccount{ 53 BaseAccount: auth.NewBaseAccount(sdk.AccAddress(suite.address.Bytes()), balance, nil, 0, 0), 54 CodeHash: ethcrypto.Keccak256(nil), 55 } 56 57 suite.app.AccountKeeper.SetAccount(suite.ctx, acc) 58 suite.app.EvmKeeper.ResetHooks() 59 } 60 61 func TestKeeperTestSuite(t *testing.T) { 62 suite.Run(t, new(KeeperTestSuite)) 63 } 64 65 func (suite *KeeperTestSuite) TestTransactionLogs() { 66 ethHash := ethcmn.BytesToHash(hash) 67 log := ðtypes.Log{ 68 Address: suite.address, 69 Data: []byte("log"), 70 BlockNumber: 10, 71 TxHash: ethHash, 72 } 73 log2 := ðtypes.Log{ 74 Address: suite.address, 75 Data: []byte("log2"), 76 BlockNumber: 11, 77 TxHash: ethHash, 78 } 79 expLogs := []*ethtypes.Log{log} 80 81 suite.stateDB.WithContext(suite.ctx).SetLogs(ethHash, expLogs) 82 logs, err := suite.stateDB.WithContext(suite.ctx).GetLogs(ethHash) 83 suite.Require().NoError(err) 84 suite.Require().Equal(expLogs, logs) 85 86 expLogs = []*ethtypes.Log{log, log2} 87 88 // add another log under the zero hash 89 log3 := ðtypes.Log{ 90 Address: suite.address, 91 Data: []byte("log3"), 92 BlockNumber: 10, 93 TxHash: ethHash, 94 } 95 96 expLogs = append(expLogs, log3) 97 suite.stateDB.WithContext(suite.ctx).SetLogs(ethHash, expLogs) 98 txLogs, err := suite.stateDB.WithContext(suite.ctx).GetLogs(ethHash) 99 suite.Require().NoError(err) 100 suite.Require().Equal(3, len(txLogs)) 101 102 suite.Require().Equal(ethHash.String(), txLogs[0].TxHash.String()) 103 suite.Require().Equal([]*ethtypes.Log{log, log2, log3}, txLogs) 104 } 105 106 func (suite *KeeperTestSuite) TestDBStorage() { 107 // Perform state transitions 108 suite.stateDB.WithContext(suite.ctx).CreateAccount(suite.address) 109 suite.stateDB.WithContext(suite.ctx).SetBalance(suite.address, big.NewInt(5)) 110 suite.stateDB.WithContext(suite.ctx).SetNonce(suite.address, 4) 111 suite.stateDB.WithContext(suite.ctx).SetState(suite.address, ethcmn.HexToHash("0x2"), ethcmn.HexToHash("0x3")) 112 suite.stateDB.WithContext(suite.ctx).SetCode(suite.address, []byte{0x1}) 113 114 // Test block hash mapping functionality 115 suite.app.EvmKeeper.SetBlockHeight(suite.ctx, hash, 7) 116 height, found := suite.app.EvmKeeper.GetBlockHeight(suite.ctx, ethcmn.BytesToHash(hash)) 117 suite.Require().True(found) 118 suite.Require().Equal(int64(7), height) 119 120 blockHash := ethcmn.FromHex("0x715b419f1d184ed45fbd641caccc849e699474505b10b9c3b0a0376aab04f87f") 121 suite.app.EvmKeeper.SetBlockHeight(suite.ctx, blockHash, 8) 122 123 // Test block height mapping functionality 124 testBloom := ethtypes.BytesToBloom([]byte{0x1, 0x3}) 125 suite.app.EvmKeeper.SetBlockBloom(suite.ctx, 4, testBloom) 126 127 // Get those state transitions 128 suite.Require().Equal(suite.stateDB.WithContext(suite.ctx).GetBalance(suite.address).Cmp(big.NewInt(5)), 0) 129 suite.Require().Equal(suite.stateDB.WithContext(suite.ctx).GetNonce(suite.address), uint64(4)) 130 suite.Require().Equal(suite.stateDB.WithContext(suite.ctx).GetState(suite.address, ethcmn.HexToHash("0x2")), ethcmn.HexToHash("0x3")) 131 suite.Require().Equal(suite.stateDB.WithContext(suite.ctx).GetCode(suite.address), []byte{0x1}) 132 133 height, found = suite.app.EvmKeeper.GetBlockHeight(suite.ctx, ethcmn.BytesToHash(hash)) 134 suite.Require().True(found) 135 suite.Require().Equal(height, int64(7)) 136 height, found = suite.app.EvmKeeper.GetBlockHeight(suite.ctx, ethcmn.BytesToHash(blockHash)) 137 suite.Require().True(found) 138 suite.Require().Equal(height, int64(8)) 139 140 suite.stateDB.WithContext(suite.ctx).SetHeightHash(uint64(8), ethcmn.HexToHash("0x5")) 141 heightHash := suite.stateDB.WithContext(suite.ctx).GetHeightHash(uint64(8)) 142 suite.Require().Equal(heightHash, ethcmn.HexToHash("0x5")) 143 144 bloom := suite.app.EvmKeeper.GetBlockBloom(suite.ctx, 4) 145 suite.Require().Equal(bloom, testBloom) 146 147 suite.stateDB.WithContext(suite.ctx).IntermediateRoot(false) 148 149 stg, err := suite.app.EvmKeeper.GetAccountStorage(suite.ctx, suite.address) 150 suite.Require().NoError(err, "failed to get account storage") 151 suite.Require().Equal(stg[0].Value, ethcmn.HexToHash("0x3")) 152 153 // commit stateDB 154 _, err = suite.stateDB.WithContext(suite.ctx).Commit(false) 155 suite.Require().NoError(err, "failed to commit StateDB") 156 157 // simulate BaseApp EndBlocker commitment 158 suite.app.Commit(abci.RequestCommit{}) 159 } 160 161 func (suite *KeeperTestSuite) TestChainConfig() { 162 config, found := suite.app.EvmKeeper.GetChainConfig(suite.ctx) 163 suite.Require().True(found) 164 suite.Require().Equal(types.DefaultChainConfig(), config) 165 166 config.EIP150Block = sdk.NewInt(100) 167 suite.app.EvmKeeper.SetChainConfig(suite.ctx, config) 168 newConfig, found := suite.app.EvmKeeper.GetChainConfig(suite.ctx) 169 suite.Require().True(found) 170 suite.Require().Equal(config, newConfig) 171 // read config from cache 172 newCachedConfig, newCachedFound := suite.app.EvmKeeper.GetChainConfig(suite.ctx) 173 suite.Require().True(newCachedFound) 174 suite.Require().Equal(config, newCachedConfig) 175 }