Skip to main content

carbon_virtual_curve_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::VirtualCurveDecoder;
8pub mod claim_fee_operator;
9pub mod config;
10pub mod lock_escrow;
11pub mod meteora_damm_migration_metadata;
12pub mod meteora_damm_v2_metadata;
13pub mod partner_metadata;
14pub mod pool_config;
15pub mod virtual_pool;
16pub mod virtual_pool_metadata;
17
18pub enum VirtualCurveAccount {
19    ClaimFeeOperator(claim_fee_operator::ClaimFeeOperator),
20    Config(config::Config),
21    LockEscrow(lock_escrow::LockEscrow),
22    MeteoraDammMigrationMetadata(meteora_damm_migration_metadata::MeteoraDammMigrationMetadata),
23    MeteoraDammV2Metadata(meteora_damm_v2_metadata::MeteoraDammV2Metadata),
24    PartnerMetadata(partner_metadata::PartnerMetadata),
25    PoolConfig(Box<pool_config::PoolConfig>),
26    VirtualPool(virtual_pool::VirtualPool),
27    VirtualPoolMetadata(virtual_pool_metadata::VirtualPoolMetadata),
28}
29
30impl AccountDecoder<'_> for VirtualCurveDecoder {
31    type AccountType = VirtualCurveAccount;
32    fn decode_account(
33        &self,
34        account: &solana_account::Account,
35    ) -> Option<carbon_core::account::DecodedAccount<Self::AccountType>> {
36        if !account.owner.eq(&PROGRAM_ID) {
37            return None;
38        }
39
40        if let Some(decoded_account) =
41            claim_fee_operator::ClaimFeeOperator::deserialize(account.data.as_slice())
42        {
43            return Some(carbon_core::account::DecodedAccount {
44                lamports: account.lamports,
45                data: VirtualCurveAccount::ClaimFeeOperator(decoded_account),
46                owner: account.owner,
47                executable: account.executable,
48                rent_epoch: account.rent_epoch,
49            });
50        }
51
52        if let Some(decoded_account) = config::Config::deserialize(account.data.as_slice()) {
53            return Some(carbon_core::account::DecodedAccount {
54                lamports: account.lamports,
55                data: VirtualCurveAccount::Config(decoded_account),
56                owner: account.owner,
57                executable: account.executable,
58                rent_epoch: account.rent_epoch,
59            });
60        }
61
62        if let Some(decoded_account) = lock_escrow::LockEscrow::deserialize(account.data.as_slice())
63        {
64            return Some(carbon_core::account::DecodedAccount {
65                lamports: account.lamports,
66                data: VirtualCurveAccount::LockEscrow(decoded_account),
67                owner: account.owner,
68                executable: account.executable,
69                rent_epoch: account.rent_epoch,
70            });
71        }
72
73        if let Some(decoded_account) =
74            meteora_damm_migration_metadata::MeteoraDammMigrationMetadata::deserialize(
75                account.data.as_slice(),
76            )
77        {
78            return Some(carbon_core::account::DecodedAccount {
79                lamports: account.lamports,
80                data: VirtualCurveAccount::MeteoraDammMigrationMetadata(decoded_account),
81                owner: account.owner,
82                executable: account.executable,
83                rent_epoch: account.rent_epoch,
84            });
85        }
86
87        if let Some(decoded_account) =
88            meteora_damm_v2_metadata::MeteoraDammV2Metadata::deserialize(account.data.as_slice())
89        {
90            return Some(carbon_core::account::DecodedAccount {
91                lamports: account.lamports,
92                data: VirtualCurveAccount::MeteoraDammV2Metadata(decoded_account),
93                owner: account.owner,
94                executable: account.executable,
95                rent_epoch: account.rent_epoch,
96            });
97        }
98
99        if let Some(decoded_account) =
100            partner_metadata::PartnerMetadata::deserialize(account.data.as_slice())
101        {
102            return Some(carbon_core::account::DecodedAccount {
103                lamports: account.lamports,
104                data: VirtualCurveAccount::PartnerMetadata(decoded_account),
105                owner: account.owner,
106                executable: account.executable,
107                rent_epoch: account.rent_epoch,
108            });
109        }
110
111        if let Some(decoded_account) = pool_config::PoolConfig::deserialize(account.data.as_slice())
112        {
113            return Some(carbon_core::account::DecodedAccount {
114                lamports: account.lamports,
115                data: VirtualCurveAccount::PoolConfig(Box::new(decoded_account)),
116                owner: account.owner,
117                executable: account.executable,
118                rent_epoch: account.rent_epoch,
119            });
120        }
121
122        if let Some(decoded_account) =
123            virtual_pool::VirtualPool::deserialize(account.data.as_slice())
124        {
125            return Some(carbon_core::account::DecodedAccount {
126                lamports: account.lamports,
127                data: VirtualCurveAccount::VirtualPool(decoded_account),
128                owner: account.owner,
129                executable: account.executable,
130                rent_epoch: account.rent_epoch,
131            });
132        }
133
134        if let Some(decoded_account) =
135            virtual_pool_metadata::VirtualPoolMetadata::deserialize(account.data.as_slice())
136        {
137            return Some(carbon_core::account::DecodedAccount {
138                lamports: account.lamports,
139                data: VirtualCurveAccount::VirtualPoolMetadata(decoded_account),
140                owner: account.owner,
141                executable: account.executable,
142                rent_epoch: account.rent_epoch,
143            });
144        }
145
146        None
147    }
148}