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