github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/wasm/proxy/context.go (about)

     1  package proxy
     2  
     3  import (
     4  	"sync"
     5  	"time"
     6  
     7  	"github.com/ethereum/go-ethereum/common"
     8  	clientcontext "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/context"
     9  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store"
    10  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    11  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth"
    12  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/params"
    13  	abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types"
    14  	tmlog "github.com/fibonacci-chain/fbc/libs/tendermint/libs/log"
    15  	dbm "github.com/fibonacci-chain/fbc/libs/tm-db"
    16  	evmwatcher "github.com/fibonacci-chain/fbc/x/evm/watcher"
    17  )
    18  
    19  const (
    20  	simulationGasLimit = 3000000
    21  )
    22  
    23  var clientCtx clientcontext.CLIContext
    24  
    25  func SetCliContext(ctx clientcontext.CLIContext) {
    26  	clientCtx = ctx
    27  }
    28  
    29  func MakeContext(storeKey sdk.StoreKey) sdk.Context {
    30  	db := dbm.NewMemDB()
    31  	cms := store.NewCommitMultiStore(db)
    32  	authKey := sdk.NewKVStoreKey(auth.StoreKey)
    33  	paramsKey := sdk.NewKVStoreKey(params.StoreKey)
    34  	paramsTKey := sdk.NewTransientStoreKey(params.TStoreKey)
    35  	cms.MountStoreWithDB(authKey, sdk.StoreTypeIAVL, db)
    36  	cms.MountStoreWithDB(paramsKey, sdk.StoreTypeIAVL, db)
    37  	cms.MountStoreWithDB(storeKey, sdk.StoreTypeIAVL, db)
    38  	cms.MountStoreWithDB(paramsTKey, sdk.StoreTypeTransient, db)
    39  
    40  	err := cms.LoadLatestVersion()
    41  	if err != nil {
    42  		panic(err)
    43  	}
    44  
    45  	header := getHeader()
    46  
    47  	ctx := sdk.NewContext(cms, header, true, tmlog.NewNopLogger())
    48  	ctx.SetGasMeter(sdk.NewGasMeter(simulationGasLimit))
    49  	return ctx
    50  }
    51  
    52  var (
    53  	qOnce      sync.Once
    54  	evmQuerier *evmwatcher.Querier
    55  )
    56  
    57  func getHeader() abci.Header {
    58  	qOnce.Do(func() {
    59  		evmQuerier = evmwatcher.NewQuerier()
    60  	})
    61  	timestamp := time.Now()
    62  	latest, _ := evmQuerier.GetLatestBlockNumber()
    63  	hash, e := evmQuerier.GetBlockHashByNumber(latest)
    64  	if e != nil {
    65  		hash = common.HexToHash("0x000000000000000000000000000000")
    66  	}
    67  
    68  	block, e := evmQuerier.GetBlockByHash(hash, false)
    69  	if e == nil {
    70  		timestamp = time.Unix(int64(block.Timestamp), 0)
    71  	}
    72  
    73  	header := abci.Header{
    74  		LastBlockId: abci.BlockID{
    75  			Hash: hash.Bytes(),
    76  		},
    77  		Height: int64(latest),
    78  		Time:   timestamp,
    79  	}
    80  	return header
    81  }