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