use crate::{
Config,
evm::{CallTrace, ExecutionTrace, Trace},
tracing::Tracing,
};
mod call_tracing;
pub use call_tracing::*;
mod prestate_tracing;
pub use prestate_tracing::*;
mod execution_tracing;
pub use execution_tracing::*;
#[derive(derive_more::From, Debug)]
pub enum Tracer<T> {
CallTracer(CallTracer),
PrestateTracer(PrestateTracer<T>),
ExecutionTracer(ExecutionTracer),
}
impl<T: Config> Tracer<T>
where
T::Nonce: Into<u32>,
{
pub fn empty_trace(&self) -> Trace {
match self {
Tracer::CallTracer(_) => CallTrace::default().into(),
Tracer::PrestateTracer(tracer) => tracer.empty_trace().into(),
Tracer::ExecutionTracer(_) => ExecutionTrace::default().into(),
}
}
pub fn as_tracing(&mut self) -> &mut (dyn Tracing + 'static) {
match self {
Tracer::CallTracer(inner) => inner as &mut dyn Tracing,
Tracer::PrestateTracer(inner) => inner as &mut dyn Tracing,
Tracer::ExecutionTracer(inner) => inner as &mut dyn Tracing,
}
}
pub fn collect_trace(self) -> Option<Trace> {
match self {
Tracer::CallTracer(inner) => inner.collect_trace().map(Trace::Call),
Tracer::PrestateTracer(inner) => Some(inner.collect_trace().into()),
Tracer::ExecutionTracer(inner) => Some(inner.collect_trace().into()),
}
}
pub fn is_execution_tracer(&self) -> bool {
matches!(self, Tracer::ExecutionTracer(_))
}
}