carbon_boop_decoder/accounts/
mod.rs

1use carbon_core::account::AccountDecoder;
2use carbon_core::deserialize::CarbonDeserialize;
3
4use crate::PROGRAM_ID;
5
6use super::BoopDecoder;
7pub mod amm_config;
8pub mod bonding_curve;
9pub mod config;
10pub mod locked_cp_liquidity_state;
11
12pub enum BoopAccount {
13    AmmConfig(amm_config::AmmConfig),
14    BondingCurve(bonding_curve::BondingCurve),
15    Config(config::Config),
16    LockedCpLiquidityState(locked_cp_liquidity_state::LockedCpLiquidityState),
17}
18
19impl AccountDecoder<'_> for BoopDecoder {
20    type AccountType = BoopAccount;
21    fn decode_account(
22        &self,
23        account: &solana_account::Account,
24    ) -> Option<carbon_core::account::DecodedAccount<Self::AccountType>> {
25        if !account.owner.eq(&PROGRAM_ID) {
26            return None;
27        }
28
29        if let Some(decoded_account) = amm_config::AmmConfig::deserialize(account.data.as_slice()) {
30            return Some(carbon_core::account::DecodedAccount {
31                lamports: account.lamports,
32                data: BoopAccount::AmmConfig(decoded_account),
33                owner: account.owner,
34                executable: account.executable,
35                rent_epoch: account.rent_epoch,
36            });
37        }
38
39        if let Some(decoded_account) =
40            bonding_curve::BondingCurve::deserialize(account.data.as_slice())
41        {
42            return Some(carbon_core::account::DecodedAccount {
43                lamports: account.lamports,
44                data: BoopAccount::BondingCurve(decoded_account),
45                owner: account.owner,
46                executable: account.executable,
47                rent_epoch: account.rent_epoch,
48            });
49        }
50
51        if let Some(decoded_account) = config::Config::deserialize(account.data.as_slice()) {
52            return Some(carbon_core::account::DecodedAccount {
53                lamports: account.lamports,
54                data: BoopAccount::Config(decoded_account),
55                owner: account.owner,
56                executable: account.executable,
57                rent_epoch: account.rent_epoch,
58            });
59        }
60
61        if let Some(decoded_account) =
62            locked_cp_liquidity_state::LockedCpLiquidityState::deserialize(account.data.as_slice())
63        {
64            return Some(carbon_core::account::DecodedAccount {
65                lamports: account.lamports,
66                data: BoopAccount::LockedCpLiquidityState(decoded_account),
67                owner: account.owner,
68                executable: account.executable,
69                rent_epoch: account.rent_epoch,
70            });
71        }
72
73        None
74    }
75}