hyperstack_idl/
discriminator.rs1use sha2::{Digest, Sha256};
4
5pub fn anchor_discriminator(preimage: &str) -> Vec<u8> {
6 let hash = Sha256::digest(preimage.as_bytes());
7 hash[..8].to_vec()
8}
9
10pub fn compute_discriminator(namespace: &str, name: &str) -> [u8; 8] {
22 let preimage = format!("{}:{}", namespace, name);
23 let bytes = anchor_discriminator(&preimage);
24 let mut result = [0u8; 8];
25 result.copy_from_slice(&bytes);
26 result
27}
28
29#[cfg(test)]
30mod tests {
31 use super::*;
32
33 #[test]
34 fn test_discriminator_global_initialize() {
35 let disc = compute_discriminator("global", "initialize");
37 assert_eq!(disc.len(), 8);
39 assert!(disc.iter().any(|&b| b != 0));
40 }
41
42 #[test]
43 fn test_discriminator_consistency() {
44 let disc1 = compute_discriminator("global", "deposit");
46 let disc2 = compute_discriminator("global", "deposit");
47 assert_eq!(disc1, disc2);
48 }
49
50 #[test]
51 fn test_discriminator_different_names() {
52 let disc1 = compute_discriminator("global", "deposit");
54 let disc2 = compute_discriminator("global", "withdraw");
55 assert_ne!(disc1, disc2);
56 }
57}