cfx_execute_helper/observer/
mod.rs

1pub mod access_list;
2pub mod exec_tracer;
3pub mod gasman;
4mod utils;
5
6use access_list::AccessListInspector;
7use exec_tracer::ExecTracer;
8use gasman::GasMan;
9
10use cfx_executor::{
11    executive_observer::{AsTracer, DrainTrace, TracerTrait},
12    machine::Machine,
13};
14use cfx_vm_tracer_derive::{AsTracer, DrainTrace};
15use std::sync::Arc;
16
17use alloy_rpc_types_trace::geth::GethDebugTracingOptions;
18use cfx_types::Address;
19use geth_tracer::{GethTracer, TxExecContext};
20use primitives::AccessList;
21use std::collections::HashSet;
22
23#[derive(AsTracer, DrainTrace)]
24pub struct Observer {
25    pub tracer: Option<ExecTracer>, // parity tracer
26    pub gas_man: Option<GasMan>,
27    pub geth_tracer: Option<GethTracer>,
28    pub access_list_inspector: Option<AccessListInspector>,
29}
30
31impl Observer {
32    pub fn with_tracing() -> Self {
33        Observer {
34            tracer: Some(ExecTracer::default()),
35            gas_man: None,
36            geth_tracer: None,
37            access_list_inspector: None,
38        }
39    }
40
41    pub fn with_no_tracing() -> Self {
42        Observer {
43            tracer: None,
44            gas_man: None,
45            geth_tracer: None,
46            access_list_inspector: None,
47        }
48    }
49
50    pub fn virtual_call() -> Self {
51        Observer {
52            tracer: Some(ExecTracer::default()),
53            gas_man: Some(GasMan::default()),
54            geth_tracer: None,
55            access_list_inspector: None,
56        }
57    }
58
59    pub fn geth_tracer(
60        tx_exec_context: TxExecContext, machine: Arc<Machine>,
61        opts: GethDebugTracingOptions,
62    ) -> Self {
63        Observer {
64            tracer: None,
65            gas_man: None,
66            geth_tracer: Some(GethTracer::new(tx_exec_context, machine, opts)),
67            access_list_inspector: None,
68        }
69    }
70
71    pub fn access_list_inspector(
72        access_list: AccessList, excludes: HashSet<Address>,
73    ) -> Self {
74        Observer {
75            tracer: None,
76            gas_man: None,
77            geth_tracer: None,
78            access_list_inspector: Some(AccessListInspector::new(
79                access_list,
80                excludes,
81            )),
82        }
83    }
84}