@@ -27,7 +27,6 @@ import (
2727 "github.com/onflow/flow-evm-gateway/metrics"
2828 "github.com/onflow/flow-evm-gateway/models"
2929 errs "github.com/onflow/flow-evm-gateway/models/errors"
30- "github.com/onflow/flow-evm-gateway/services/replayer"
3130 "github.com/onflow/flow-evm-gateway/storage"
3231 "github.com/onflow/flow-evm-gateway/storage/pebble"
3332
@@ -66,6 +65,7 @@ type Requester interface {
6665 from common.Address ,
6766 height uint64 ,
6867 stateOverrides * ethTypes.StateOverride ,
68+ blockOverrides * ethTypes.BlockOverrides ,
6969 ) ([]byte , error )
7070
7171 // EstimateGas executes the given signed transaction data on the state for the given EVM block height.
@@ -95,15 +95,16 @@ type Requester interface {
9595var _ Requester = & EVM {}
9696
9797type EVM struct {
98- registerStore * pebble.RegisterStorage
99- blocksProvider * replayer.BlocksProvider
100- client * CrossSporkClient
101- config config.Config
102- txPool * TxPool
103- logger zerolog.Logger
104- blocks storage.BlockIndexer
105- mux sync.Mutex
106- keystore * KeyStore
98+ registerStore * pebble.RegisterStorage
99+ blocksProvider * BlocksProvider
100+ client * CrossSporkClient
101+ config config.Config
102+ txPool * TxPool
103+ logger zerolog.Logger
104+ blocks storage.BlockIndexer
105+ mux sync.Mutex
106+ keystore * KeyStore
107+
107108 head * types.Header
108109 evmSigner types.Signer
109110 validationOptions * txpool.ValidationOptions
@@ -112,7 +113,7 @@ type EVM struct {
112113
113114func NewEVM (
114115 registerStore * pebble.RegisterStorage ,
115- blocksProvider * replayer. BlocksProvider ,
116+ blocksProvider * BlocksProvider ,
116117 client * CrossSporkClient ,
117118 config config.Config ,
118119 logger zerolog.Logger ,
@@ -250,7 +251,7 @@ func (e *EVM) GetBalance(
250251 address common.Address ,
251252 height uint64 ,
252253) (* big.Int , error ) {
253- view , err := e .getBlockView (height )
254+ view , err := e .getBlockView (height , nil )
254255 if err != nil {
255256 return nil , err
256257 }
@@ -262,7 +263,7 @@ func (e *EVM) GetNonce(
262263 address common.Address ,
263264 height uint64 ,
264265) (uint64 , error ) {
265- view , err := e .getBlockView (height )
266+ view , err := e .getBlockView (height , nil )
266267 if err != nil {
267268 return 0 , err
268269 }
@@ -275,7 +276,7 @@ func (e *EVM) GetStorageAt(
275276 hash common.Hash ,
276277 height uint64 ,
277278) (common.Hash , error ) {
278- view , err := e .getBlockView (height )
279+ view , err := e .getBlockView (height , nil )
279280 if err != nil {
280281 return common.Hash {}, err
281282 }
@@ -288,8 +289,9 @@ func (e *EVM) Call(
288289 from common.Address ,
289290 height uint64 ,
290291 stateOverrides * ethTypes.StateOverride ,
292+ blockOverrides * ethTypes.BlockOverrides ,
291293) ([]byte , error ) {
292- result , err := e .dryRunTx (tx , from , height , stateOverrides )
294+ result , err := e .dryRunTx (tx , from , height , stateOverrides , blockOverrides )
293295 if err != nil {
294296 return nil , err
295297 }
@@ -327,7 +329,7 @@ func (e *EVM) EstimateGas(
327329 tx .Gas = passingGasLimit
328330 // We first execute the transaction at the highest allowable gas limit,
329331 // since if this fails we can return the error immediately.
330- result , err := e .dryRunTx (tx , from , height , stateOverrides )
332+ result , err := e .dryRunTx (tx , from , height , stateOverrides , nil )
331333 if err != nil {
332334 return 0 , err
333335 }
@@ -352,7 +354,7 @@ func (e *EVM) EstimateGas(
352354 optimisticGasLimit := (result .GasConsumed + result .GasRefund + gethParams .CallStipend ) * 64 / 63
353355 if optimisticGasLimit < passingGasLimit {
354356 tx .Gas = optimisticGasLimit
355- result , err = e .dryRunTx (tx , from , height , stateOverrides )
357+ result , err = e .dryRunTx (tx , from , height , stateOverrides , nil )
356358 if err != nil {
357359 // This should not happen under normal conditions since if we make it this far the
358360 // transaction had run without error at least once before.
@@ -382,7 +384,7 @@ func (e *EVM) EstimateGas(
382384 mid = failingGasLimit * 2
383385 }
384386 tx .Gas = mid
385- result , err = e .dryRunTx (tx , from , height , stateOverrides )
387+ result , err = e .dryRunTx (tx , from , height , stateOverrides , nil )
386388 if err != nil {
387389 return 0 , err
388390 }
@@ -405,7 +407,7 @@ func (e *EVM) GetCode(
405407 address common.Address ,
406408 height uint64 ,
407409) ([]byte , error ) {
408- view , err := e .getBlockView (height )
410+ view , err := e .getBlockView (height , nil )
409411 if err != nil {
410412 return nil , err
411413 }
@@ -437,7 +439,14 @@ func (e *EVM) GetLatestEVMHeight(ctx context.Context) (uint64, error) {
437439 return height , nil
438440}
439441
440- func (e * EVM ) getBlockView (height uint64 ) (* query.View , error ) {
442+ func (e * EVM ) getBlockView (
443+ height uint64 ,
444+ blockOverrides * ethTypes.BlockOverrides ,
445+ ) (* query.View , error ) {
446+ if blockOverrides != nil {
447+ e .blocksProvider .SetBlockOverrides (blockOverrides )
448+ }
449+
441450 viewProvider := query .NewViewProvider (
442451 e .config .FlowNetworkID ,
443452 evm .StorageAccountAddress (e .config .FlowNetworkID ),
@@ -467,8 +476,9 @@ func (e *EVM) dryRunTx(
467476 from common.Address ,
468477 height uint64 ,
469478 stateOverrides * ethTypes.StateOverride ,
479+ blockOverrides * ethTypes.BlockOverrides ,
470480) (* evmTypes.Result , error ) {
471- view , err := e .getBlockView (height )
481+ view , err := e .getBlockView (height , blockOverrides )
472482 if err != nil {
473483 return nil , err
474484 }
@@ -592,7 +602,7 @@ func (e *EVM) validateTransactionWithState(
592602 if err != nil {
593603 return err
594604 }
595- view , err := e .getBlockView (height )
605+ view , err := e .getBlockView (height , nil )
596606 if err != nil {
597607 return err
598608 }
0 commit comments