yellowstone_vixen_stake_pool_parser/
account_parser.rs1use spl_pod::solana_program::{self, borsh1::try_from_slice_unchecked};
2use spl_stake_pool::state::{StakePool, ValidatorList};
3
4#[allow(clippy::large_enum_variant)]
6#[derive(Debug)]
7pub enum SplStakePoolProgramState {
8 StakePool(StakePool),
9 ValidatorList(ValidatorList),
10}
11
12impl SplStakePoolProgramState {
13 pub fn try_unpack(data_bytes: &[u8]) -> yellowstone_vixen_core::ParseResult<Self> {
14 let first_byte = data_bytes[0];
15
16 match first_byte {
17 0 => Err(yellowstone_vixen_core::ParseError::from(
18 "Uninitialized Account".to_owned(),
19 )),
20 1 => {
21 let stake_pool = try_from_slice_unchecked::<StakePool>(data_bytes)?;
22 Ok(SplStakePoolProgramState::StakePool(stake_pool))
23 },
24 2 => {
25 let validator_list = try_from_slice_unchecked::<ValidatorList>(data_bytes)?;
26 Ok(SplStakePoolProgramState::ValidatorList(validator_list))
27 },
28 _ => Err(yellowstone_vixen_core::ParseError::from(
29 "Invalid Account".to_owned(),
30 )),
31 }
32 }
33}
34
35#[derive(Debug, Copy, Clone)]
36pub struct AccountParser;
37
38impl yellowstone_vixen_core::Parser for AccountParser {
39 type Input = yellowstone_vixen_core::AccountUpdate;
40 type Output = SplStakePoolProgramState;
41
42 fn id(&self) -> std::borrow::Cow<'static, str> { "spl_stake_pool::AccountParser".into() }
43
44 fn prefilter(&self) -> yellowstone_vixen_core::Prefilter {
45 yellowstone_vixen_core::Prefilter::builder()
46 .account_owners([spl_stake_pool::ID])
47 .build()
48 .unwrap()
49 }
50
51 async fn parse(
52 &self,
53 acct: &yellowstone_vixen_core::AccountUpdate,
54 ) -> yellowstone_vixen_core::ParseResult<Self::Output> {
55 let inner = acct
56 .account
57 .as_ref()
58 .ok_or(solana_program::program_error::ProgramError::InvalidArgument)?;
59 SplStakePoolProgramState::try_unpack(&inner.data)
60 }
61}
62
63impl yellowstone_vixen_core::ProgramParser for AccountParser {
64 #[inline]
65 fn program_id(&self) -> yellowstone_vixen_core::Pubkey { spl_stake_pool::ID.to_bytes().into() }
66}