carbon_token_program_decoder/accounts/
mod.rs

1use {
2    crate::TokenProgramDecoder,
3    carbon_core::account::{AccountDecoder, DecodedAccount},
4    solana_sdk::{account::ReadableAccount, program_pack::Pack},
5};
6
7pub enum TokenProgramAccount {
8    Account(spl_token::state::Account),
9    Mint(spl_token::state::Mint),
10    Multisig(spl_token::state::Multisig),
11}
12
13impl AccountDecoder<'_> for TokenProgramDecoder {
14    type AccountType = TokenProgramAccount;
15
16    fn decode_account(
17        &self,
18        account: &solana_sdk::account::Account,
19    ) -> Option<DecodedAccount<Self::AccountType>> {
20        if !account.owner.eq(&spl_token::id()) {
21            return None;
22        }
23
24        if let Ok(data) = spl_token::state::Account::unpack(account.data()) {
25            return Some(DecodedAccount {
26                data: TokenProgramAccount::Account(data),
27                lamports: account.lamports,
28                owner: account.owner,
29                executable: account.executable,
30                rent_epoch: account.rent_epoch,
31            });
32        };
33        if let Ok(data) = spl_token::state::Mint::unpack(account.data()) {
34            return Some(DecodedAccount {
35                data: TokenProgramAccount::Mint(data),
36                lamports: account.lamports,
37                owner: account.owner,
38                executable: account.executable,
39                rent_epoch: account.rent_epoch,
40            });
41        };
42        if let Ok(data) = spl_token::state::Multisig::unpack(account.data()) {
43            return Some(DecodedAccount {
44                data: TokenProgramAccount::Multisig(data),
45                lamports: account.lamports,
46                owner: account.owner,
47                executable: account.executable,
48                rent_epoch: account.rent_epoch,
49            });
50        };
51
52        None
53    }
54}