carbon_raydium_launchpad_decoder/accounts/
mod.rs

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