use sha2::{Digest, Sha256};
pub fn anchor_discriminator(preimage: &str) -> Vec<u8> {
let hash = Sha256::digest(preimage.as_bytes());
hash[..8].to_vec()
}
pub fn compute_discriminator(namespace: &str, name: &str) -> [u8; 8] {
let preimage = format!("{}:{}", namespace, name);
let bytes = anchor_discriminator(&preimage);
let mut result = [0u8; 8];
result.copy_from_slice(&bytes);
result
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_discriminator_global_initialize() {
let disc = compute_discriminator("global", "initialize");
assert_eq!(disc.len(), 8);
assert!(disc.iter().any(|&b| b != 0));
}
#[test]
fn test_discriminator_consistency() {
let disc1 = compute_discriminator("global", "deposit");
let disc2 = compute_discriminator("global", "deposit");
assert_eq!(disc1, disc2);
}
#[test]
fn test_discriminator_different_names() {
let disc1 = compute_discriminator("global", "deposit");
let disc2 = compute_discriminator("global", "withdraw");
assert_ne!(disc1, disc2);
}
}