#![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::dex::generated::events::CREATOR_CLAIM_EVENT_DISCRIMINATOR;
use crate::dex::generated::events::CreatorClaimEvent;
use crate::dex::generated::events::DEPOSIT_QUOTE_EVENT_DISCRIMINATOR;
use crate::dex::generated::events::DepositQuoteEvent;
use crate::dex::generated::events::POOL_CREATE_EVENT_DISCRIMINATOR;
use crate::dex::generated::events::PROTOCOL_CLAIM_EVENT_DISCRIMINATOR;
use crate::dex::generated::events::PoolCreateEvent;
use crate::dex::generated::events::ProtocolClaimEvent;
use crate::dex::generated::events::TOKEN_CREATE_EVENT_DISCRIMINATOR;
use crate::dex::generated::events::TRADE_EVENT_DISCRIMINATOR;
use crate::dex::generated::events::TokenCreateEvent;
use crate::dex::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 SendDexEventKind {
CreatorClaimEvent,
DepositQuoteEvent,
PoolCreateEvent,
ProtocolClaimEvent,
TokenCreateEvent,
TradeEvent,
}
pub fn identify_send_dex_event(
program_id: &solana_address::Address,
data: &[u8],
) -> Option<SendDexEventKind> {
if program_id != &crate::dex::generated::SEND_DEX_ID {
return None;
}
if data.get(..ANCHOR_EVENT_CPI_DISCRIMINATOR.len())
== Some(&ANCHOR_EVENT_CPI_DISCRIMINATOR[..])
{
if data.get(8..16) == Some(&CREATOR_CLAIM_EVENT_DISCRIMINATOR[..]) {
return Some(SendDexEventKind::CreatorClaimEvent);
}
if data.get(8..16) == Some(&DEPOSIT_QUOTE_EVENT_DISCRIMINATOR[..]) {
return Some(SendDexEventKind::DepositQuoteEvent);
}
if data.get(8..16) == Some(&POOL_CREATE_EVENT_DISCRIMINATOR[..]) {
return Some(SendDexEventKind::PoolCreateEvent);
}
if data.get(8..16) == Some(&PROTOCOL_CLAIM_EVENT_DISCRIMINATOR[..]) {
return Some(SendDexEventKind::ProtocolClaimEvent);
}
if data.get(8..16) == Some(&TOKEN_CREATE_EVENT_DISCRIMINATOR[..]) {
return Some(SendDexEventKind::TokenCreateEvent);
}
if data.get(8..16) == Some(&TRADE_EVENT_DISCRIMINATOR[..]) {
return Some(SendDexEventKind::TradeEvent);
}
}
None
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum SendDexEvent {
CreatorClaimEvent(CreatorClaimEvent),
DepositQuoteEvent(DepositQuoteEvent),
PoolCreateEvent(PoolCreateEvent),
ProtocolClaimEvent(ProtocolClaimEvent),
TokenCreateEvent(TokenCreateEvent),
TradeEvent(TradeEvent),
}
pub fn try_parse_send_dex_event(
program_id: &solana_address::Address,
data: &[u8],
) -> Option<Result<SendDexEvent, std::io::Error>> {
let event_kind = identify_send_dex_event(program_id, data)?;
Some(match event_kind {
SendDexEventKind::CreatorClaimEvent => {
let mut data = &data[16..];
CreatorClaimEvent::deserialize(&mut data)
.map(SendDexEvent::CreatorClaimEvent)
}
SendDexEventKind::DepositQuoteEvent => {
let mut data = &data[16..];
DepositQuoteEvent::deserialize(&mut data)
.map(SendDexEvent::DepositQuoteEvent)
}
SendDexEventKind::PoolCreateEvent => {
let mut data = &data[16..];
PoolCreateEvent::deserialize(&mut data)
.map(SendDexEvent::PoolCreateEvent)
}
SendDexEventKind::ProtocolClaimEvent => {
let mut data = &data[16..];
ProtocolClaimEvent::deserialize(&mut data)
.map(SendDexEvent::ProtocolClaimEvent)
}
SendDexEventKind::TokenCreateEvent => {
let mut data = &data[16..];
TokenCreateEvent::deserialize(&mut data)
.map(SendDexEvent::TokenCreateEvent)
}
SendDexEventKind::TradeEvent => {
let mut data = &data[16..];
TradeEvent::deserialize(&mut data).map(SendDexEvent::TradeEvent)
}
})
}