use {
crate::types::{AccountState, 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 Token {
pub mint: Pubkey,
pub owner: Pubkey,
pub amount: u64,
pub delegate: Option<Pubkey>,
pub state: AccountState,
pub is_native: Option<u64>,
pub delegated_amount: u64,
pub close_authority: Option<Pubkey>,
pub extensions: Option<Vec<Extension>>,
}
impl From<spl_token_2022::extension::StateWithExtensions<'_, spl_token_2022::state::Account>>
for Token
{
fn from(
value: spl_token_2022::extension::StateWithExtensions<'_, spl_token_2022::state::Account>,
) -> Self {
let extensions = value.get_extension_types().ok().map(|extensions| {
extensions
.iter()
.filter_map(|extension_type| {
crate::types::Extension::from_account_and_type(&value, extension_type)
})
.collect::<Vec<_>>()
});
Token {
mint: value.base.mint,
owner: value.base.owner,
amount: value.base.amount,
delegate: value.base.delegate.into(),
state: match value.base.state {
spl_token_2022::state::AccountState::Uninitialized => {
crate::types::AccountState::Uninitialized
}
spl_token_2022::state::AccountState::Initialized => {
crate::types::AccountState::Initialized
}
spl_token_2022::state::AccountState::Frozen => crate::types::AccountState::Frozen,
},
is_native: value.base.is_native.into(),
delegated_amount: value.base.delegated_amount,
close_authority: value.base.close_authority.into(),
extensions,
}
}
}