light_token_interface/state/compressed_token/
token_data_version.rs1use crate::TokenError;
2
3#[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], TokenDataVersion::V2 => [0, 0, 0, 0, 0, 0, 0, 3], TokenDataVersion::ShaFlat => [0, 0, 0, 0, 0, 0, 0, 4], }
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), [0, 0, 0, 0, 0, 0, 0, 3] => Ok(TokenDataVersion::V2), [0, 0, 0, 0, 0, 0, 0, 4] => Ok(TokenDataVersion::ShaFlat), _ => Err(TokenError::InvalidTokenDataVersion),
27 }
28 }
29
30 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}