carbon_token_program_decoder/accounts/
mod.rs1use {
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}