neo_solidity/solidity/validate/contract/
events.rs

1fn validate_events(metadata: &ContractMetadata, diagnostics: &mut Vec<Diagnostic>) {
2    use std::collections::{BTreeSet, HashMap};
3
4    let mut event_groups: HashMap<String, BTreeSet<String>> = HashMap::new();
5
6    for event in &metadata.events {
7        event_groups
8            .entry(event.name.trim().to_ascii_lowercase())
9            .or_default()
10            .insert(event.normalized_name.clone());
11
12        if event.parameters.len() > 16 {
13            diagnostics.push(Diagnostic::warning(format!(
14                "event '{}' has {} parameters which exceeds Neo ABI limits",
15                event.name,
16                event.parameters.len()
17            )));
18        }
19    }
20
21    // Neo N3 ABI dispatches events by name only, so event overloading is not supported.
22    // Reject multiple distinct signatures that share the same event name.
23    for (event_name, signatures) in event_groups {
24        if signatures.len() > 1 {
25            let mut sigs: Vec<_> = signatures.into_iter().collect();
26            sigs.sort();
27            diagnostics.push(Diagnostic::error(format!(
28                "event '{event_name}' is overloaded ({} distinct signatures): {}. Neo N3 requires unique event names",
29                sigs.len(),
30                sigs.join(", ")
31            )));
32        }
33    }
34}