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