carbon_token_program_decoder/accounts/
mod.rs

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