pub struct EngineContext<DB>where
DB: Database + DatabaseCommit + DatabaseRef + Clone + Send + Sync + 'static,
<CacheDB<DB> as Database>::Error: Clone + Send + Sync,
<DB as Database>::Error: Clone + Send + Sync,{
pub fork_info: ForkInfo,
pub cfg: CfgEnv,
pub block: BlockEnv,
pub tx: TxEnv,
pub tx_hash: TxHash,
pub snapshots: Snapshots<DB>,
pub artifacts: HashMap<Address, Artifact>,
pub recompiled_artifacts: HashMap<Address, Artifact>,
pub analysis_results: HashMap<Address, AnalysisResult>,
pub trace: Trace,
/* private fields */
}Expand description
Complete debugging context containing all analysis results and state snapshots
This struct encapsulates all the data produced during the debugging workflow, including the original transaction context, collected snapshots, analyzed source code, and recompiled artifacts. It serves as the primary data structure passed to the JSON-RPC server for time travel debugging.
Fields§
§fork_info: ForkInfoForked information
cfg: CfgEnvConfiguration environment for the EVM
block: BlockEnvBlock environment for the target block
tx: TxEnvTransaction environment for the target transaction
tx_hash: TxHashTransaction hash for the target transaction
snapshots: Snapshots<DB>Merged snapshots from both opcode-level and hook-based collection
artifacts: HashMap<Address, Artifact>Original contract artifacts with source code and metadata
recompiled_artifacts: HashMap<Address, Artifact>Recompiled artifacts with instrumented source code
analysis_results: HashMap<Address, AnalysisResult>Analysis results identifying instrumentation points
trace: TraceExecution trace showing call hierarchy and frame structure
Implementations§
Source§impl<DB> EngineContext<DB>
impl<DB> EngineContext<DB>
Sourcepub fn build(
fork_info: ForkInfo,
cfg: CfgEnv,
block: BlockEnv,
tx: TxEnv,
tx_hash: TxHash,
snapshots: Snapshots<DB>,
artifacts: HashMap<Address, Artifact>,
recompiled_artifacts: HashMap<Address, Artifact>,
analysis_results: HashMap<Address, AnalysisResult>,
trace: Trace,
) -> Result<Self>
pub fn build( fork_info: ForkInfo, cfg: CfgEnv, block: BlockEnv, tx: TxEnv, tx_hash: TxHash, snapshots: Snapshots<DB>, artifacts: HashMap<Address, Artifact>, recompiled_artifacts: HashMap<Address, Artifact>, analysis_results: HashMap<Address, AnalysisResult>, trace: Trace, ) -> Result<Self>
Build a new EngineContext with all debugging data.
This constructor consolidates all the debugging data collected during the analysis and snapshot collection phases into a unified context for debugging operations.
§Arguments
fork_info- Network and fork information for the debugging sessioncfg- EVM configuration environmentblock- Block environment for the target blocktx- Transaction environment for the target transactiontx_hash- Hash of the target transactionsnapshots- Merged snapshots from opcode and hook collectionartifacts- Original contract artifacts with source coderecompiled_artifacts- Recompiled artifacts with instrumentationanalysis_results- Analysis results identifying instrumentation pointstrace- Execution trace showing call hierarchy
§Returns
Returns a finalized EngineContext ready for debugging operations.
Source§impl<DB> EngineContext<DB>
impl<DB> EngineContext<DB>
Sourcepub fn get_bytecode_address(&self, snapshot_id: usize) -> Option<Address>
pub fn get_bytecode_address(&self, snapshot_id: usize) -> Option<Address>
Get the bytecode address for a snapshot.
Returns the address where the executing bytecode is stored, which may differ from the target address in cases of delegatecall or proxy contracts.
Sourcepub fn get_target_address(&self, snapshot_id: usize) -> Option<Address>
pub fn get_target_address(&self, snapshot_id: usize) -> Option<Address>
Get the target address for a snapshot.
Returns the address that was the target of the call, which is the address receiving the call in the current execution frame.
Sourcepub fn is_parent_trace(&self, parent_id: usize, child_id: usize) -> bool
pub fn is_parent_trace(&self, parent_id: usize, child_id: usize) -> bool
Check if one trace entry is the parent of another.
This method determines the parent-child relationship between trace entries, useful for understanding call hierarchy during debugging.
Sourcepub fn address_code_address_map(&self) -> &HashMap<Address, HashSet<Address>>
pub fn address_code_address_map(&self) -> &HashMap<Address, HashSet<Address>>
Get the address to code address mapping.
Returns a cached mapping from target addresses to all code addresses that have been executed for each target. This is useful for understanding proxy patterns and delegatecall relationships.
Source§impl<DB> EngineContext<DB>
impl<DB> EngineContext<DB>
Sourcepub fn create_evm_for_snapshot(
&self,
snapshot_id: usize,
) -> Option<MainnetEvm<DerivedContext<DB>>>
pub fn create_evm_for_snapshot( &self, snapshot_id: usize, ) -> Option<MainnetEvm<DerivedContext<DB>>>
Create a derived EVM instance for a specific snapshot.
This method creates a new EVM instance using the database state from the specified snapshot. The resulting EVM can be used for expression evaluation and function calls without affecting the original debugging state.
§Arguments
snapshot_id- The snapshot ID to create the EVM for
§Returns
Returns a configured EVM instance or None if the snapshot doesn’t exist.
Sourcepub fn send_transaction_in_derived_evm(
&self,
snapshot_id: usize,
to: Address,
data: &[u8],
value: U256,
) -> Result<ExecutionResult>
pub fn send_transaction_in_derived_evm( &self, snapshot_id: usize, to: Address, data: &[u8], value: U256, ) -> Result<ExecutionResult>
Send a mock transaction in a derived EVM.
This method executes a transaction in the EVM state at the specified snapshot without affecting the original debugging state. Used for expression evaluation that requires transaction execution.
§Arguments
snapshot_id- The snapshot ID to use as the base stateto- The target address for the transactiondata- The transaction data (call data)value- The value to send with the transaction
§Returns
Returns the execution result or an error if the transaction fails.
Sourcepub fn call_in_derived_evm(
&self,
snapshot_id: usize,
to: Address,
function: &Function,
args: &[DynSolValue],
value: Option<U256>,
) -> Result<DynSolValue>
pub fn call_in_derived_evm( &self, snapshot_id: usize, to: Address, function: &Function, args: &[DynSolValue], value: Option<U256>, ) -> Result<DynSolValue>
Invoke a contract function call in a derived EVM.
This method calls a specific contract function in the EVM state at the specified snapshot. It handles ABI encoding/decoding automatically and returns the decoded result.
§Arguments
snapshot_id- The snapshot ID to use as the base stateto- The contract address to callfunction- The ABI function definitionargs- The function argumentsvalue- Optional value to send with the call
§Returns
Returns the decoded function result or an error if the call fails.
Trait Implementations§
Source§impl<DB> Clone for EngineContext<DB>
impl<DB> Clone for EngineContext<DB>
Source§fn clone(&self) -> EngineContext<DB>
fn clone(&self) -> EngineContext<DB>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<DB> Debug for EngineContext<DB>
impl<DB> Debug for EngineContext<DB>
Source§impl<'de, DB> Deserialize<'de> for EngineContext<DB>
impl<'de, DB> Deserialize<'de> for EngineContext<DB>
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl<DB> Serialize for EngineContext<DB>
impl<DB> Serialize for EngineContext<DB>
Auto Trait Implementations§
impl<DB> !Freeze for EngineContext<DB>
impl<DB> !RefUnwindSafe for EngineContext<DB>
impl<DB> Send for EngineContext<DB>
impl<DB> Sync for EngineContext<DB>
impl<DB> Unpin for EngineContext<DB>
impl<DB> !UnwindSafe for EngineContext<DB>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
Source§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the foreground set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red() and
green(), which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg():
use yansi::{Paint, Color};
painted.fg(Color::White);Set foreground color to white using white().
use yansi::Paint;
painted.white();Source§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
Source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
Source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
Source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Source§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the background set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red() and
on_green(), which have the same functionality but
are pithier.
§Example
Set background color to red using fg():
use yansi::{Paint, Color};
painted.bg(Color::Red);Set background color to red using on_red().
use yansi::Paint;
painted.on_red();Source§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
Source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
Source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
Source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Source§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling Attribute value.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold() and
underline(), which have the same functionality
but are pithier.
§Example
Make text bold using attr():
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);Make text bold using using bold().
use yansi::Paint;
painted.bold();Source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Source§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi Quirk value.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask() and
wrap(), which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk():
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);Enable wrapping using wrap().
use yansi::Paint;
painted.wrap();Source§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
fn clear(&self) -> Painted<&T>
resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.Source§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the Condition value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted only when both stdout and stderr are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.