use borsh::{BorshDeserialize, BorshSerialize};
use light_compressed_account::Pubkey;
use super::compressed_mint::BaseMint;
impl BorshSerialize for BaseMint {
fn serialize<W: std::io::Write>(&self, writer: &mut W) -> std::io::Result<()> {
if let Some(authority) = self.mint_authority {
writer.write_all(&[1, 0, 0, 0])?; writer.write_all(&authority.to_bytes())?;
} else {
writer.write_all(&[0; 36])?; }
writer.write_all(&self.supply.to_le_bytes())?;
writer.write_all(&[self.decimals])?;
writer.write_all(&[if self.is_initialized { 1 } else { 0 }])?;
if let Some(authority) = self.freeze_authority {
writer.write_all(&[1, 0, 0, 0])?; writer.write_all(&authority.to_bytes())?;
} else {
writer.write_all(&[0; 36])?; }
Ok(())
}
}
impl BorshDeserialize for BaseMint {
fn deserialize_reader<R: std::io::Read>(buf: &mut R) -> std::io::Result<Self> {
let mut discriminator = [0u8; 4];
buf.read_exact(&mut discriminator)?;
let mut pubkey_bytes = [0u8; 32];
buf.read_exact(&mut pubkey_bytes)?;
let mint_authority = if u32::from_le_bytes(discriminator) == 1 {
Some(Pubkey::from(pubkey_bytes))
} else {
None
};
let mut supply_bytes = [0u8; 8];
buf.read_exact(&mut supply_bytes)?;
let supply = u64::from_le_bytes(supply_bytes);
let mut decimals = [0u8; 1];
buf.read_exact(&mut decimals)?;
let decimals = decimals[0];
let mut is_initialized = [0u8; 1];
buf.read_exact(&mut is_initialized)?;
let is_initialized = is_initialized[0] != 0;
let mut discriminator = [0u8; 4];
buf.read_exact(&mut discriminator)?;
let mut pubkey_bytes = [0u8; 32];
buf.read_exact(&mut pubkey_bytes)?;
let freeze_authority = if u32::from_le_bytes(discriminator) == 1 {
Some(Pubkey::from(pubkey_bytes))
} else {
None
};
Ok(Self {
mint_authority,
supply,
decimals,
is_initialized,
freeze_authority,
})
}
}