anvil_zksync_core/node/traces/
decoder.rs

1use std::sync::OnceLock;
2
3use alloy::json_abi::Event;
4use anvil_zksync_console::{ds, hh};
5use anvil_zksync_traces::decode::{CallTraceDecoder, CallTraceDecoderBuilderBase};
6
7pub struct CallTraceDecoderBuilder;
8
9impl CallTraceDecoderBuilder {
10    /// Create a new builder starting from a CallTraceDecoder capable of
11    /// decoding calls of DSTest-style logs
12    #[inline]
13    pub fn default() -> CallTraceDecoderBuilderBase {
14        static INIT: OnceLock<CallTraceDecoder> = OnceLock::new();
15        CallTraceDecoderBuilderBase::new(
16            INIT.get_or_init(|| {
17                CallTraceDecoder::new(
18                    hh::abi::functions()
19                        .into_values()
20                        .flatten()
21                        .map(|func| (func.selector(), vec![func]))
22                        .collect(),
23                    ds::abi::events()
24                        .into_values()
25                        .flatten()
26                        .map(|event| ((event.selector(), indexed_inputs(&event)), vec![event]))
27                        .collect(),
28                )
29            })
30            .clone(),
31        )
32    }
33}
34
35fn indexed_inputs(event: &Event) -> usize {
36    event.inputs.iter().filter(|param| param.indexed).count()
37}