Skip to main content

sendfun_sdk/dex/generated/events/
send_dex_events.rs

1#![allow(
2	clippy::all,
3	clippy::pedantic,
4	clippy::nursery,
5	clippy::expect_used,
6	clippy::unwrap_used,
7	clippy::indexing_slicing,
8	clippy::allow_attributes,
9	clippy::allow_attributes_without_reason,
10	clippy::mem_forget,
11	unfulfilled_lint_expectations,
12	unexpected_cfgs,
13	unused_imports
14)]
15
16//! This code was AUTOGENERATED using the codama library.
17//! Please DO NOT EDIT THIS FILE, instead use visitors
18//! to add features, then rerun codama to update it.
19//!
20//! <https://github.com/codama-idl/codama>
21//!
22
23use crate::dex::generated::events::CREATOR_CLAIM_EVENT_DISCRIMINATOR;
24use crate::dex::generated::events::CreatorClaimEvent;
25use crate::dex::generated::events::DEPOSIT_QUOTE_EVENT_DISCRIMINATOR;
26use crate::dex::generated::events::DepositQuoteEvent;
27use crate::dex::generated::events::POOL_CREATE_EVENT_DISCRIMINATOR;
28use crate::dex::generated::events::PROTOCOL_CLAIM_EVENT_DISCRIMINATOR;
29use crate::dex::generated::events::PoolCreateEvent;
30use crate::dex::generated::events::ProtocolClaimEvent;
31use crate::dex::generated::events::TOKEN_CREATE_EVENT_DISCRIMINATOR;
32use crate::dex::generated::events::TRADE_EVENT_DISCRIMINATOR;
33use crate::dex::generated::events::TokenCreateEvent;
34use crate::dex::generated::events::TradeEvent;
35use borsh::BorshDeserialize;
36
37/// Shared event-framing tag prepended to every framed event emitted by the
38/// `send_dex` program.
39pub const ANCHOR_EVENT_CPI_DISCRIMINATOR: [u8; 8] =
40	[228, 69, 165, 46, 81, 203, 154, 29];
41
42/// Event kinds for the `send_dex` program.
43#[derive(Clone, Debug, Eq, PartialEq)]
44pub enum SendDexEventKind {
45	CreatorClaimEvent,
46	DepositQuoteEvent,
47	PoolCreateEvent,
48	ProtocolClaimEvent,
49	TokenCreateEvent,
50	TradeEvent,
51}
52
53/// Identifies a `send_dex` event from the provided data.
54///
55/// A foreign `program_id` is a `None`, not an error: callers iterate whole transactions where
56/// other programs are ordinary.
57/// Data that lacks the shared CPI framing is rejected with a single compare.
58pub fn identify_send_dex_event(
59	program_id: &solana_address::Address,
60	data: &[u8],
61) -> Option<SendDexEventKind> {
62	if program_id != &crate::dex::generated::SEND_DEX_ID {
63		return None;
64	}
65	if data.get(..ANCHOR_EVENT_CPI_DISCRIMINATOR.len())
66		== Some(&ANCHOR_EVENT_CPI_DISCRIMINATOR[..])
67	{
68		if data.get(8..16) == Some(&CREATOR_CLAIM_EVENT_DISCRIMINATOR[..]) {
69			return Some(SendDexEventKind::CreatorClaimEvent);
70		}
71		if data.get(8..16) == Some(&DEPOSIT_QUOTE_EVENT_DISCRIMINATOR[..]) {
72			return Some(SendDexEventKind::DepositQuoteEvent);
73		}
74		if data.get(8..16) == Some(&POOL_CREATE_EVENT_DISCRIMINATOR[..]) {
75			return Some(SendDexEventKind::PoolCreateEvent);
76		}
77		if data.get(8..16) == Some(&PROTOCOL_CLAIM_EVENT_DISCRIMINATOR[..]) {
78			return Some(SendDexEventKind::ProtocolClaimEvent);
79		}
80		if data.get(8..16) == Some(&TOKEN_CREATE_EVENT_DISCRIMINATOR[..]) {
81			return Some(SendDexEventKind::TokenCreateEvent);
82		}
83		if data.get(8..16) == Some(&TRADE_EVENT_DISCRIMINATOR[..]) {
84			return Some(SendDexEventKind::TradeEvent);
85		}
86	}
87	None
88}
89
90/// Parsed event variants for the `send_dex` program.
91#[derive(Clone, Debug, Eq, PartialEq)]
92pub enum SendDexEvent {
93	CreatorClaimEvent(CreatorClaimEvent),
94	DepositQuoteEvent(DepositQuoteEvent),
95	PoolCreateEvent(PoolCreateEvent),
96	ProtocolClaimEvent(ProtocolClaimEvent),
97	TokenCreateEvent(TokenCreateEvent),
98	TradeEvent(TradeEvent),
99}
100
101/// Tries to parse a `send_dex` event from the provided data.
102///
103/// `None` when [`identify_send_dex_event`] finds nothing; `Some(Err(_))`
104/// when one matches but fails to deserialize. Use [`Option::transpose`] to propagate failures
105/// with `?`, or scan a batch:
106///
107/// ```ignore
108/// let events: Vec<SendDexEvent> = datas
109///     .iter()
110///     .filter_map(|data| try_parse_send_dex_event(program_id, data))
111///     .collect::<Result<_, _>>()?;
112/// ```
113pub fn try_parse_send_dex_event(
114	program_id: &solana_address::Address,
115	data: &[u8],
116) -> Option<Result<SendDexEvent, std::io::Error>> {
117	let event_kind = identify_send_dex_event(program_id, data)?;
118	Some(match event_kind {
119		SendDexEventKind::CreatorClaimEvent => {
120			// ANCHOR_EVENT_CPI_DISCRIMINATOR (8) + CREATOR_CLAIM_EVENT_DISCRIMINATOR (8)
121			let mut data = &data[16..];
122			CreatorClaimEvent::deserialize(&mut data)
123				.map(SendDexEvent::CreatorClaimEvent)
124		}
125		SendDexEventKind::DepositQuoteEvent => {
126			// ANCHOR_EVENT_CPI_DISCRIMINATOR (8) + DEPOSIT_QUOTE_EVENT_DISCRIMINATOR (8)
127			let mut data = &data[16..];
128			DepositQuoteEvent::deserialize(&mut data)
129				.map(SendDexEvent::DepositQuoteEvent)
130		}
131		SendDexEventKind::PoolCreateEvent => {
132			// ANCHOR_EVENT_CPI_DISCRIMINATOR (8) + POOL_CREATE_EVENT_DISCRIMINATOR (8)
133			let mut data = &data[16..];
134			PoolCreateEvent::deserialize(&mut data)
135				.map(SendDexEvent::PoolCreateEvent)
136		}
137		SendDexEventKind::ProtocolClaimEvent => {
138			// ANCHOR_EVENT_CPI_DISCRIMINATOR (8) + PROTOCOL_CLAIM_EVENT_DISCRIMINATOR (8)
139			let mut data = &data[16..];
140			ProtocolClaimEvent::deserialize(&mut data)
141				.map(SendDexEvent::ProtocolClaimEvent)
142		}
143		SendDexEventKind::TokenCreateEvent => {
144			// ANCHOR_EVENT_CPI_DISCRIMINATOR (8) + TOKEN_CREATE_EVENT_DISCRIMINATOR (8)
145			let mut data = &data[16..];
146			TokenCreateEvent::deserialize(&mut data)
147				.map(SendDexEvent::TokenCreateEvent)
148		}
149		SendDexEventKind::TradeEvent => {
150			// ANCHOR_EVENT_CPI_DISCRIMINATOR (8) + TRADE_EVENT_DISCRIMINATOR (8)
151			let mut data = &data[16..];
152			TradeEvent::deserialize(&mut data).map(SendDexEvent::TradeEvent)
153		}
154	})
155}