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