carbon_wavebreak_decoder/accounts/
mod.rs

1use carbon_core::account::AccountDecoder;
2use carbon_core::deserialize::CarbonDeserialize;
3
4use crate::PROGRAM_ID;
5
6use super::WavebreakDecoder;
7pub mod authority_config;
8pub mod bonding_curve;
9pub mod consumed_permission;
10pub mod mint_config;
11pub mod permission_config;
12
13pub enum WavebreakAccount {
14    AuthorityConfig(Box<authority_config::AuthorityConfig>),
15    BondingCurve(bonding_curve::BondingCurve),
16    MintConfig(mint_config::MintConfig),
17    PermissionConfig(permission_config::PermissionConfig),
18    ConsumedPermission(consumed_permission::ConsumedPermission),
19}
20
21impl AccountDecoder<'_> for WavebreakDecoder {
22    type AccountType = WavebreakAccount;
23    fn decode_account(
24        &self,
25        account: &solana_account::Account,
26    ) -> Option<carbon_core::account::DecodedAccount<Self::AccountType>> {
27        if !account.owner.eq(&PROGRAM_ID) {
28            return None;
29        }
30
31        if let Some(decoded_account) =
32            authority_config::AuthorityConfig::deserialize(account.data.as_slice())
33        {
34            return Some(carbon_core::account::DecodedAccount {
35                lamports: account.lamports,
36                data: WavebreakAccount::AuthorityConfig(Box::new(decoded_account)),
37                owner: account.owner,
38                executable: account.executable,
39                rent_epoch: account.rent_epoch,
40            });
41        }
42
43        if let Some(decoded_account) =
44            bonding_curve::BondingCurve::deserialize(account.data.as_slice())
45        {
46            return Some(carbon_core::account::DecodedAccount {
47                lamports: account.lamports,
48                data: WavebreakAccount::BondingCurve(decoded_account),
49                owner: account.owner,
50                executable: account.executable,
51                rent_epoch: account.rent_epoch,
52            });
53        }
54
55        if let Some(decoded_account) = mint_config::MintConfig::deserialize(account.data.as_slice())
56        {
57            return Some(carbon_core::account::DecodedAccount {
58                lamports: account.lamports,
59                data: WavebreakAccount::MintConfig(decoded_account),
60                owner: account.owner,
61                executable: account.executable,
62                rent_epoch: account.rent_epoch,
63            });
64        }
65
66        if let Some(decoded_account) =
67            permission_config::PermissionConfig::deserialize(account.data.as_slice())
68        {
69            return Some(carbon_core::account::DecodedAccount {
70                lamports: account.lamports,
71                data: WavebreakAccount::PermissionConfig(decoded_account),
72                owner: account.owner,
73                executable: account.executable,
74                rent_epoch: account.rent_epoch,
75            });
76        }
77
78        if let Some(decoded_account) =
79            consumed_permission::ConsumedPermission::deserialize(account.data.as_slice())
80        {
81            return Some(carbon_core::account::DecodedAccount {
82                lamports: account.lamports,
83                data: WavebreakAccount::ConsumedPermission(decoded_account),
84                owner: account.owner,
85                executable: account.executable,
86                rent_epoch: account.rent_epoch,
87            });
88        }
89
90        None
91    }
92}