#![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::launchpad::generated::events::COMPLETE_EVENT_DISCRIMINATOR;
use crate::launchpad::generated::events::CREATOR_CLAIM_EVENT_DISCRIMINATOR;
use crate::launchpad::generated::events::CompleteEvent;
use crate::launchpad::generated::events::CreatorClaimEvent;
use crate::launchpad::generated::events::MIGRATE_EVENT_DISCRIMINATOR;
use crate::launchpad::generated::events::MigrateEvent;
use crate::launchpad::generated::events::PROTOCOL_CLAIM_EVENT_DISCRIMINATOR;
use crate::launchpad::generated::events::ProtocolClaimEvent;
use crate::launchpad::generated::events::RECYCLE_EVENT_DISCRIMINATOR;
use crate::launchpad::generated::events::RecycleEvent;
use crate::launchpad::generated::events::TOKEN_CREATE_EVENT_DISCRIMINATOR;
use crate::launchpad::generated::events::TRADE_EVENT_DISCRIMINATOR;
use crate::launchpad::generated::events::TokenCreateEvent;
use crate::launchpad::generated::events::TradeEvent;
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 SendLaunchpadEventKind {
CompleteEvent,
CreatorClaimEvent,
MigrateEvent,
ProtocolClaimEvent,
RecycleEvent,
TokenCreateEvent,
TradeEvent,
}
pub fn identify_send_launchpad_event(
program_id: &solana_address::Address,
data: &[u8],
) -> Option<SendLaunchpadEventKind> {
if program_id != &crate::launchpad::generated::SEND_LAUNCHPAD_ID {
return None;
}
if data.get(..ANCHOR_EVENT_CPI_DISCRIMINATOR.len())
== Some(&ANCHOR_EVENT_CPI_DISCRIMINATOR[..])
{
if data.get(8..16) == Some(&COMPLETE_EVENT_DISCRIMINATOR[..]) {
return Some(SendLaunchpadEventKind::CompleteEvent);
}
if data.get(8..16) == Some(&CREATOR_CLAIM_EVENT_DISCRIMINATOR[..]) {
return Some(SendLaunchpadEventKind::CreatorClaimEvent);
}
if data.get(8..16) == Some(&MIGRATE_EVENT_DISCRIMINATOR[..]) {
return Some(SendLaunchpadEventKind::MigrateEvent);
}
if data.get(8..16) == Some(&PROTOCOL_CLAIM_EVENT_DISCRIMINATOR[..]) {
return Some(SendLaunchpadEventKind::ProtocolClaimEvent);
}
if data.get(8..16) == Some(&RECYCLE_EVENT_DISCRIMINATOR[..]) {
return Some(SendLaunchpadEventKind::RecycleEvent);
}
if data.get(8..16) == Some(&TOKEN_CREATE_EVENT_DISCRIMINATOR[..]) {
return Some(SendLaunchpadEventKind::TokenCreateEvent);
}
if data.get(8..16) == Some(&TRADE_EVENT_DISCRIMINATOR[..]) {
return Some(SendLaunchpadEventKind::TradeEvent);
}
}
None
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum SendLaunchpadEvent {
CompleteEvent(CompleteEvent),
CreatorClaimEvent(CreatorClaimEvent),
MigrateEvent(MigrateEvent),
ProtocolClaimEvent(ProtocolClaimEvent),
RecycleEvent(RecycleEvent),
TokenCreateEvent(TokenCreateEvent),
TradeEvent(TradeEvent),
}
pub fn try_parse_send_launchpad_event(
program_id: &solana_address::Address,
data: &[u8],
) -> Option<Result<SendLaunchpadEvent, std::io::Error>> {
let event_kind = identify_send_launchpad_event(program_id, data)?;
Some(match event_kind {
SendLaunchpadEventKind::CompleteEvent => {
let mut data = &data[16..];
CompleteEvent::deserialize(&mut data)
.map(SendLaunchpadEvent::CompleteEvent)
}
SendLaunchpadEventKind::CreatorClaimEvent => {
let mut data = &data[16..];
CreatorClaimEvent::deserialize(&mut data)
.map(SendLaunchpadEvent::CreatorClaimEvent)
}
SendLaunchpadEventKind::MigrateEvent => {
let mut data = &data[16..];
MigrateEvent::deserialize(&mut data)
.map(SendLaunchpadEvent::MigrateEvent)
}
SendLaunchpadEventKind::ProtocolClaimEvent => {
let mut data = &data[16..];
ProtocolClaimEvent::deserialize(&mut data)
.map(SendLaunchpadEvent::ProtocolClaimEvent)
}
SendLaunchpadEventKind::RecycleEvent => {
let mut data = &data[16..];
RecycleEvent::deserialize(&mut data)
.map(SendLaunchpadEvent::RecycleEvent)
}
SendLaunchpadEventKind::TokenCreateEvent => {
let mut data = &data[16..];
TokenCreateEvent::deserialize(&mut data)
.map(SendLaunchpadEvent::TokenCreateEvent)
}
SendLaunchpadEventKind::TradeEvent => {
let mut data = &data[16..];
TradeEvent::deserialize(&mut data)
.map(SendLaunchpadEvent::TradeEvent)
}
})
}