diff --git a/eth/tracers/api.go b/eth/tracers/api.go index 6962023343..d7e3ad1fff 100644 --- a/eth/tracers/api.go +++ b/eth/tracers/api.go @@ -953,7 +953,14 @@ func (api *API) TraceCall(ctx context.Context, args ethapi.TransactionArgs, bloc } defer release() - vmctx := core.NewEVMBlockContext(block.Header(), api.chainContext(ctx), nil) + hdr := *block.Header() + if config != nil { + if err := config.BlockOverrides.ApplyHeader(&hdr); err != nil { + return nil, err + } + } + + vmctx := core.NewEVMBlockContext(&hdr, api.chainContext(ctx), nil) // Apply the customization rules if required. if config != nil { if overrideErr := config.BlockOverrides.Apply(&vmctx); overrideErr != nil { diff --git a/internal/ethapi/override/override.go b/internal/ethapi/override/override.go index 0bcf3c444d..95fbe15b76 100644 --- a/internal/ethapi/override/override.go +++ b/internal/ethapi/override/override.go @@ -171,6 +171,29 @@ func (o *BlockOverrides) Apply(blockCtx *vm.BlockContext) error { return nil } +func (o *BlockOverrides) ApplyHeader(h *types.Header) error { + if o == nil { + return nil + } + if o.Number != nil { + h.Number = o.Number.ToInt() + } + if o.Time != nil { + h.Time = uint64(*o.Time) + } + if o.GasLimit != nil { + h.GasLimit = uint64(*o.GasLimit) + } + if o.Difficulty != nil { + h.Difficulty = o.Difficulty.ToInt() + } + if o.BaseFeePerGas != nil { + h.BaseFee = o.BaseFeePerGas.ToInt() + } + + return nil +} + // MakeHeader returns a new header object with the overridden // fields. // Note: MakeHeader ignores BlobBaseFee if set. That's because