use {
crate::types::Extension, solana_pubkey::Pubkey,
spl_token_2022::extension::BaseStateWithExtensions,
};
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, borsh::BorshSerialize, borsh::BorshDeserialize, PartialEq)]
pub struct Mint {
pub mint_authority: Option<Pubkey>,
pub supply: u64,
pub decimals: u8,
pub is_initialized: bool,
pub freeze_authority: Option<Pubkey>,
pub extensions: Option<Vec<Extension>>,
}
impl From<spl_token_2022::extension::StateWithExtensions<'_, spl_token_2022::state::Mint>>
for Mint
{
fn from(
value: spl_token_2022::extension::StateWithExtensions<'_, spl_token_2022::state::Mint>,
) -> Self {
let extensions = value.get_extension_types().ok().map(|extensions| {
extensions
.iter()
.filter_map(|extension_type| {
crate::types::Extension::from_mint_and_type(&value, extension_type)
})
.collect::<Vec<_>>()
});
Mint {
mint_authority: value.base.mint_authority.into(),
supply: value.base.supply,
decimals: value.base.decimals,
is_initialized: value.base.is_initialized,
freeze_authority: value.base.freeze_authority.into(),
extensions,
}
}
}