light_token_interface/state/compressed_token/
token_data_version.rs

1use crate::TokenError;
2
3/// TokenDataVersion is recorded in the token account discriminator.
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
5#[repr(u8)]
6pub enum TokenDataVersion {
7    V1 = 1u8,
8    V2 = 2u8,
9    ShaFlat = 3u8,
10}
11
12impl TokenDataVersion {
13    pub fn discriminator(&self) -> [u8; 8] {
14        match self {
15            TokenDataVersion::V1 => [2, 0, 0, 0, 0, 0, 0, 0], // 2 le
16            TokenDataVersion::V2 => [0, 0, 0, 0, 0, 0, 0, 3], // 3 be
17            TokenDataVersion::ShaFlat => [0, 0, 0, 0, 0, 0, 0, 4], // 4 be
18        }
19    }
20
21    pub fn from_discriminator(discriminator: [u8; 8]) -> Result<Self, TokenError> {
22        match discriminator {
23            [2, 0, 0, 0, 0, 0, 0, 0] => Ok(TokenDataVersion::V1), // 2 le
24            [0, 0, 0, 0, 0, 0, 0, 3] => Ok(TokenDataVersion::V2), // 3 be
25            [0, 0, 0, 0, 0, 0, 0, 4] => Ok(TokenDataVersion::ShaFlat), // 4 be
26            _ => Err(TokenError::InvalidTokenDataVersion),
27        }
28    }
29
30    /// Serializes amount to bytes using version-specific endianness
31    /// V1: little-endian, V2: big-endian
32    pub fn serialize_amount_bytes(&self, amount: u64) -> Result<[u8; 32], TokenError> {
33        let mut amount_bytes = [0u8; 32];
34        match self {
35            TokenDataVersion::V1 => {
36                amount_bytes[24..].copy_from_slice(&amount.to_le_bytes());
37            }
38            TokenDataVersion::V2 => {
39                amount_bytes[24..].copy_from_slice(&amount.to_be_bytes());
40            }
41            _ => {
42                return Err(TokenError::InvalidTokenDataVersion);
43            }
44        }
45        Ok(amount_bytes)
46    }
47}
48
49impl TryFrom<u8> for TokenDataVersion {
50    type Error = crate::TokenError;
51
52    fn try_from(value: u8) -> Result<Self, Self::Error> {
53        match value {
54            1 => Ok(TokenDataVersion::V1),
55            2 => Ok(TokenDataVersion::V2),
56            3 => Ok(TokenDataVersion::ShaFlat),
57            _ => Err(crate::TokenError::InvalidTokenDataVersion),
58        }
59    }
60}