carbon_openbook_v2_decoder/accounts/
mod.rs

1use {
2    super::OpenbookV2Decoder,
3    crate::PROGRAM_ID,
4    carbon_core::{account::AccountDecoder, deserialize::CarbonDeserialize},
5};
6pub mod book_side;
7pub mod event_heap;
8pub mod market;
9pub mod open_orders_account;
10pub mod open_orders_indexer;
11pub mod stub_oracle;
12
13pub enum OpenbookV2Account {
14    Market(Box<market::Market>),
15    OpenOrdersAccount(Box<open_orders_account::OpenOrdersAccount>),
16    OpenOrdersIndexer(open_orders_indexer::OpenOrdersIndexer),
17    StubOracle(stub_oracle::StubOracle),
18    BookSide(Box<book_side::BookSide>),
19    EventHeap(Box<event_heap::EventHeap>),
20}
21
22impl AccountDecoder<'_> for OpenbookV2Decoder {
23    type AccountType = OpenbookV2Account;
24    fn decode_account(
25        &self,
26        account: &solana_account::Account,
27    ) -> Option<carbon_core::account::DecodedAccount<Self::AccountType>> {
28        if !account.owner.eq(&PROGRAM_ID) {
29            return None;
30        }
31
32        if let Some(decoded_account) = market::Market::deserialize(account.data.as_slice()) {
33            return Some(carbon_core::account::DecodedAccount {
34                lamports: account.lamports,
35                data: OpenbookV2Account::Market(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            open_orders_account::OpenOrdersAccount::deserialize(account.data.as_slice())
44        {
45            return Some(carbon_core::account::DecodedAccount {
46                lamports: account.lamports,
47                data: OpenbookV2Account::OpenOrdersAccount(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) =
55            open_orders_indexer::OpenOrdersIndexer::deserialize(account.data.as_slice())
56        {
57            return Some(carbon_core::account::DecodedAccount {
58                lamports: account.lamports,
59                data: OpenbookV2Account::OpenOrdersIndexer(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) = stub_oracle::StubOracle::deserialize(account.data.as_slice())
67        {
68            return Some(carbon_core::account::DecodedAccount {
69                lamports: account.lamports,
70                data: OpenbookV2Account::StubOracle(decoded_account),
71                owner: account.owner,
72                executable: account.executable,
73                rent_epoch: account.rent_epoch,
74            });
75        }
76
77        if let Some(decoded_account) = book_side::BookSide::deserialize(account.data.as_slice()) {
78            return Some(carbon_core::account::DecodedAccount {
79                lamports: account.lamports,
80                data: OpenbookV2Account::BookSide(Box::new(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) = event_heap::EventHeap::deserialize(account.data.as_slice()) {
88            return Some(carbon_core::account::DecodedAccount {
89                lamports: account.lamports,
90                data: OpenbookV2Account::EventHeap(Box::new(decoded_account)),
91                owner: account.owner,
92                executable: account.executable,
93                rent_epoch: account.rent_epoch,
94            });
95        }
96
97        None
98    }
99}