use crate::{helpers::Ctx, inspectors::InspectorWithOutput};
use alloy::rpc::types::trace::geth::FourByteFrame;
use revm::Database;
use revm_inspectors::tracing::{
CallTraceArena, FourByteInspector, GethTraceBuilder, ParityTraceBuilder, TracingInspector,
};
#[derive(Clone, Debug)]
pub struct TracingInspectorOutput {
traces: CallTraceArena,
}
impl TracingInspectorOutput {
pub const fn new(traces: CallTraceArena) -> Self {
Self { traces }
}
pub const fn traces(&self) -> &CallTraceArena {
&self.traces
}
pub fn into_parity_builder(self) -> ParityTraceBuilder {
ParityTraceBuilder::new(self.traces.into_nodes(), None, Default::default())
}
pub fn into_geth_builder(self) -> GethTraceBuilder<'static> {
GethTraceBuilder::new(self.traces.into_nodes())
}
}
impl<Db: Database> InspectorWithOutput<Ctx<Db>> for TracingInspector {
type Output = TracingInspectorOutput;
fn has_output(&self) -> bool {
!self.traces().nodes().is_empty()
}
fn reset_output(&mut self) {
self.fuse();
}
fn take_output(&mut self) -> Self::Output {
let this = self.clone();
self.fuse();
TracingInspectorOutput::new(this.into_traces())
}
}
impl<Db: Database> InspectorWithOutput<Ctx<Db>> for FourByteInspector {
type Output = FourByteFrame;
fn has_output(&self) -> bool {
!self.inner().is_empty()
}
fn reset_output(&mut self) {
*self = Self::default();
}
fn take_output(&mut self) -> Self::Output {
std::mem::take(self).into()
}
}