carbon-token-program-decoder 0.12.0

Token Program Decoder
Documentation
use {
    crate::TokenProgramDecoder,
    carbon_core::account::{AccountDecoder, DecodedAccount},
    solana_account::ReadableAccount,
    solana_program::program_pack::Pack,
};

pub enum TokenProgramAccount {
    Account(spl_token_interface::state::Account),
    Mint(spl_token_interface::state::Mint),
    Multisig(spl_token_interface::state::Multisig),
}

impl AccountDecoder<'_> for TokenProgramDecoder {
    type AccountType = TokenProgramAccount;

    fn decode_account(
        &self,
        account: &solana_account::Account,
    ) -> Option<DecodedAccount<Self::AccountType>> {
        if !account.owner.eq(&spl_token_interface::id()) {
            return None;
        }

        if let Ok(data) = spl_token_interface::state::Account::unpack(account.data()) {
            return Some(DecodedAccount {
                data: TokenProgramAccount::Account(data),
                lamports: account.lamports,
                owner: account.owner,
                executable: account.executable,
                rent_epoch: account.rent_epoch,
            });
        };
        if let Ok(data) = spl_token_interface::state::Mint::unpack(account.data()) {
            return Some(DecodedAccount {
                data: TokenProgramAccount::Mint(data),
                lamports: account.lamports,
                owner: account.owner,
                executable: account.executable,
                rent_epoch: account.rent_epoch,
            });
        };
        if let Ok(data) = spl_token_interface::state::Multisig::unpack(account.data()) {
            return Some(DecodedAccount {
                data: TokenProgramAccount::Multisig(data),
                lamports: account.lamports,
                owner: account.owner,
                executable: account.executable,
                rent_epoch: account.rent_epoch,
            });
        };

        None
    }
}