neo_solidity/solidity/validate/
selectors.rs1fn 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