carbon_token_program_decoder/accounts/
mod.rs

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