carbon_atlas_staking_decoder/accounts/
mod.rs1use crate::AtlasStakingDecoder;
3use crate::PROGRAM_ID;
4
5pub mod registered_stake;
6pub mod staking_account;
7pub mod staking_vars;
8
9#[derive(Debug, Clone, PartialEq)]
10#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11#[cfg_attr(feature = "serde", serde(tag = "type", content = "data"))]
12pub enum AtlasStakingAccount {
13 RegisteredStake(Box<registered_stake::RegisteredStake>),
14 StakingAccount(Box<staking_account::StakingAccount>),
15 StakingVars(Box<staking_vars::StakingVars>),
16}
17
18impl<'a> carbon_core::account::AccountDecoder<'a> for AtlasStakingDecoder {
19 type AccountType = AtlasStakingAccount;
20
21 fn decode_account(
22 &self,
23 account: &'a solana_account::Account,
24 ) -> Option<carbon_core::account::DecodedAccount<Self::AccountType>> {
25 if account.owner != PROGRAM_ID {
26 return None;
27 }
28
29 let data = account.data.as_slice();
30
31 {
32 if let Some(decoded) = registered_stake::RegisteredStake::decode(data) {
33 return Some(carbon_core::account::DecodedAccount {
34 lamports: account.lamports,
35 data: AtlasStakingAccount::RegisteredStake(Box::new(decoded)),
36 owner: account.owner,
37 executable: account.executable,
38 rent_epoch: account.rent_epoch,
39 });
40 }
41 }
42 {
43 if let Some(decoded) = staking_account::StakingAccount::decode(data) {
44 return Some(carbon_core::account::DecodedAccount {
45 lamports: account.lamports,
46 data: AtlasStakingAccount::StakingAccount(Box::new(decoded)),
47 owner: account.owner,
48 executable: account.executable,
49 rent_epoch: account.rent_epoch,
50 });
51 }
52 }
53 {
54 if let Some(decoded) = staking_vars::StakingVars::decode(data) {
55 return Some(carbon_core::account::DecodedAccount {
56 lamports: account.lamports,
57 data: AtlasStakingAccount::StakingVars(Box::new(decoded)),
58 owner: account.owner,
59 executable: account.executable,
60 rent_epoch: account.rent_epoch,
61 });
62 }
63 }
64
65 None
66 }
67}