#![allow(
clippy::all,
clippy::pedantic,
clippy::nursery,
clippy::expect_used,
clippy::unwrap_used,
clippy::indexing_slicing,
clippy::allow_attributes,
clippy::allow_attributes_without_reason,
clippy::mem_forget,
unfulfilled_lint_expectations,
unexpected_cfgs,
unused_imports
)]
use crate::nexus::generated::events::CLAIM_EVENT_DISCRIMINATOR;
use crate::nexus::generated::events::ClaimEvent;
use crate::nexus::generated::events::STAKE_EVENT_DISCRIMINATOR;
use crate::nexus::generated::events::StakeEvent;
use crate::nexus::generated::events::UNSTAKE_EVENT_DISCRIMINATOR;
use crate::nexus::generated::events::UnstakeEvent;
use borsh::BorshDeserialize;
pub const ANCHOR_EVENT_CPI_DISCRIMINATOR: [u8; 8] =
[228, 69, 165, 46, 81, 203, 154, 29];
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum SendNexusEventKind {
ClaimEvent,
StakeEvent,
UnstakeEvent,
}
pub fn identify_send_nexus_event(
program_id: &solana_address::Address,
data: &[u8],
) -> Option<SendNexusEventKind> {
if program_id != &crate::nexus::generated::SEND_NEXUS_ID {
return None;
}
if data.get(..ANCHOR_EVENT_CPI_DISCRIMINATOR.len())
== Some(&ANCHOR_EVENT_CPI_DISCRIMINATOR[..])
{
if data.get(8..16) == Some(&CLAIM_EVENT_DISCRIMINATOR[..]) {
return Some(SendNexusEventKind::ClaimEvent);
}
if data.get(8..16) == Some(&STAKE_EVENT_DISCRIMINATOR[..]) {
return Some(SendNexusEventKind::StakeEvent);
}
if data.get(8..16) == Some(&UNSTAKE_EVENT_DISCRIMINATOR[..]) {
return Some(SendNexusEventKind::UnstakeEvent);
}
}
None
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum SendNexusEvent {
ClaimEvent(ClaimEvent),
StakeEvent(StakeEvent),
UnstakeEvent(UnstakeEvent),
}
pub fn try_parse_send_nexus_event(
program_id: &solana_address::Address,
data: &[u8],
) -> Option<Result<SendNexusEvent, std::io::Error>> {
let event_kind = identify_send_nexus_event(program_id, data)?;
Some(match event_kind {
SendNexusEventKind::ClaimEvent => {
let mut data = &data[16..];
ClaimEvent::deserialize(&mut data).map(SendNexusEvent::ClaimEvent)
}
SendNexusEventKind::StakeEvent => {
let mut data = &data[16..];
StakeEvent::deserialize(&mut data).map(SendNexusEvent::StakeEvent)
}
SendNexusEventKind::UnstakeEvent => {
let mut data = &data[16..];
UnstakeEvent::deserialize(&mut data)
.map(SendNexusEvent::UnstakeEvent)
}
})
}