1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
extern crate sha2;
use std::convert::TryInto;

use sha2::Digest;

/// Calculates the discriminant for a function using SHA-256 hash.
///
/// The discriminant is defined as the first 8 bytes of the SHA-256 hash of the function name.
///
/// NOTE: Functions require a namespace prefix, e.g. `global:initialize`.
/// The default namespace is `global`.
///
/// # Arguments
///
/// * `input` - A string slice that holds the function name.
///
/// # Returns
///
/// An array of 8 bytes representing the discriminant.
///
/// # Examples
///
/// ```
/// let discriminant = sol_dev_utils::anchor_discriminant("global:initialize");
/// assert_eq!(discriminant, [175, 175, 109, 31, 13, 152, 155, 237]);
/// ```
pub fn anchor_discriminant(input: &str) -> [u8; 8] {
    let mut hasher = sha2::Sha256::new();
    hasher.update(input);
    let result = hasher.finalize();
    result[..8].try_into().unwrap()
}