neo_solidity/solidity/convert/
events.rs

1fn convert_event(event: EventIR) -> EventMetadata {
2    let normalized = normalize_event_signature(&event.name, &event.parameters);
3    EventMetadata {
4        name: event.name,
5        normalized_name: normalized,
6        parameters: event
7            .parameters
8            .into_iter()
9            .map(|param| EventParameter {
10                name: param.name,
11                ty: param.ty,
12                indexed: param.indexed,
13            })
14            .collect(),
15    }
16}
17
18fn normalize_event_signature(name: &str, params: &[crate::frontend::EventParameterIR]) -> String {
19    fn canonical_param_type(ty: &str) -> String {
20        let mut parts = ty.split_whitespace();
21        match parts.next() {
22            Some("struct" | "enum") => parts.next().unwrap_or_default().to_string(),
23            Some(first) => first.to_string(),
24            None => String::new(),
25        }
26    }
27
28    let base = name.trim().to_ascii_lowercase();
29    let param_types: Vec<String> = params
30        .iter()
31        .map(|param| canonical_param_type(&param.ty).to_ascii_lowercase())
32        .collect();
33
34    // `event Foo` with no parameters is valid Solidity syntax (treated as Foo()).
35    if param_types.is_empty() {
36        format!("{base}()")
37    } else {
38        // Preserve the declared order; Neo ABI dispatches events by name only,
39        // so we use this signature only for de-duplication and validation.
40        format!("{base}({})", param_types.join(","))
41    }
42}