neo_solidity/solidity/validate/
selectors.rs

1fn canonical_param_type(ty: &str) -> String {
2    let mut parts = ty.split_whitespace();
3    match parts.next() {
4        Some("struct" | "enum") => parts.next().unwrap_or_default().to_string(),
5        Some(first) => first.to_string(),
6        None => String::new(),
7    }
8}
9
10fn compute_function_selector(name: &str, param_types: &[String]) -> [u8; 4] {
11    if name.eq_ignore_ascii_case("constructor") {
12        return [0u8; 4];
13    }
14
15    let signature = if param_types.is_empty() {
16        format!("{name}()")
17    } else {
18        format!("{name}({})", param_types.join(","))
19    };
20
21    let mut hasher = Keccak256::new();
22    hasher.update(signature.as_bytes());
23    let digest = hasher.finalize();
24    let mut selector = [0u8; 4];
25    selector.copy_from_slice(&digest[..4]);
26    selector
27}
28