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 := &ethermint.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 := &ethtypes.Log{
    68  		Address:     suite.address,
    69  		Data:        []byte("log"),
    70  		BlockNumber: 10,
    71  		TxHash:      ethHash,
    72  	}
    73  	log2 := &ethtypes.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 := &ethtypes.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  }