light_token_interface/state/token/
borsh.rs1use borsh::{BorshDeserialize, BorshSerialize};
2use light_compressed_account::Pubkey;
3
4use crate::state::{AccountState, ExtensionStruct, Token, ACCOUNT_TYPE_TOKEN_ACCOUNT};
5
6impl BorshSerialize for Token {
8 fn serialize<W: std::io::Write>(&self, writer: &mut W) -> std::io::Result<()> {
9 writer.write_all(&self.mint.to_bytes())?;
11
12 writer.write_all(&self.owner.to_bytes())?;
14
15 writer.write_all(&self.amount.to_le_bytes())?;
17
18 if let Some(delegate) = self.delegate {
20 writer.write_all(&[1, 0, 0, 0])?; writer.write_all(&delegate.to_bytes())?;
22 } else {
23 writer.write_all(&[0; 36])?; }
25
26 writer.write_all(&[self.state as u8])?;
28
29 if let Some(is_native) = self.is_native {
31 writer.write_all(&[1, 0, 0, 0])?; writer.write_all(&is_native.to_le_bytes())?;
33 } else {
34 writer.write_all(&[0; 12])?; }
36
37 writer.write_all(&self.delegated_amount.to_le_bytes())?;
39
40 if let Some(close_authority) = self.close_authority {
42 writer.write_all(&[1, 0, 0, 0])?; writer.write_all(&close_authority.to_bytes())?;
44 } else {
45 writer.write_all(&[0; 36])?; }
47
48 if self.extensions.is_some() {
52 writer.write_all(&[self.account_type])?;
54
55 self.extensions.serialize(writer)?;
57 }
58
59 Ok(())
60 }
61}
62
63impl BorshDeserialize for Token {
65 fn deserialize_reader<R: std::io::Read>(buf: &mut R) -> std::io::Result<Self> {
66 let mut mint_bytes = [0u8; 32];
68 buf.read_exact(&mut mint_bytes)?;
69 let mint = Pubkey::from(mint_bytes);
70
71 let mut owner_bytes = [0u8; 32];
73 buf.read_exact(&mut owner_bytes)?;
74 let owner = Pubkey::from(owner_bytes);
75
76 let mut amount_bytes = [0u8; 8];
78 buf.read_exact(&mut amount_bytes)?;
79 let amount = u64::from_le_bytes(amount_bytes);
80
81 let mut discriminator = [0u8; 4];
83 buf.read_exact(&mut discriminator)?;
84 let mut pubkey_bytes = [0u8; 32];
85 buf.read_exact(&mut pubkey_bytes)?;
86 let delegate = if u32::from_le_bytes(discriminator) == 1 {
87 Some(Pubkey::from(pubkey_bytes))
88 } else {
89 None
90 };
91
92 let mut state = [0u8; 1];
94 buf.read_exact(&mut state)?;
95 let state = state[0];
96
97 let mut discriminator = [0u8; 4];
99 buf.read_exact(&mut discriminator)?;
100 let mut value_bytes = [0u8; 8];
101 buf.read_exact(&mut value_bytes)?;
102 let is_native = if u32::from_le_bytes(discriminator) == 1 {
103 Some(u64::from_le_bytes(value_bytes))
104 } else {
105 None
106 };
107
108 let mut delegated_amount_bytes = [0u8; 8];
110 buf.read_exact(&mut delegated_amount_bytes)?;
111 let delegated_amount = u64::from_le_bytes(delegated_amount_bytes);
112
113 let mut discriminator = [0u8; 4];
115 buf.read_exact(&mut discriminator)?;
116 let mut pubkey_bytes = [0u8; 32];
117 buf.read_exact(&mut pubkey_bytes)?;
118 let close_authority = if u32::from_le_bytes(discriminator) == 1 {
119 Some(Pubkey::from(pubkey_bytes))
120 } else {
121 None
122 };
123
124 let mut account_type_byte = [0u8; 1];
128 let (account_type, extensions) = if buf.read_exact(&mut account_type_byte).is_ok() {
129 let account_type = account_type_byte[0];
130 if account_type == ACCOUNT_TYPE_TOKEN_ACCOUNT {
131 let extensions =
133 Option::<Vec<ExtensionStruct>>::deserialize_reader(buf).unwrap_or_default();
134 (account_type, extensions)
135 } else {
136 (account_type, None)
138 }
139 } else {
140 (ACCOUNT_TYPE_TOKEN_ACCOUNT, None)
143 };
144
145 Ok(Self {
146 mint,
147 owner,
148 amount,
149 delegate,
150 state: AccountState::try_from(state)
151 .map_err(|e| std::io::Error::from_raw_os_error(u32::from(e) as i32))?,
152 is_native,
153 delegated_amount,
154 close_authority,
155 account_type,
156 extensions,
157 })
158 }
159}