yellowstone_vixen_stake_pool_parser/
account_parser.rs

1use spl_pod::solana_program::{self, borsh1::try_from_slice_unchecked};
2use spl_stake_pool::state::{StakePool, ValidatorList};
3
4/// SplStakePool Program State
5#[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}