sendfun-sdk 3.0.0

Rust SDK for send.fun programs
Documentation
#![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
)]

//! This code was AUTOGENERATED using the codama library.
//! Please DO NOT EDIT THIS FILE, instead use visitors
//! to add features, then rerun codama to update it.
//!
//! <https://github.com/codama-idl/codama>
//!

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;

/// Shared event-framing tag prepended to every framed event emitted by the
/// `send_launchpad` program.
pub const ANCHOR_EVENT_CPI_DISCRIMINATOR: [u8; 8] =
	[228, 69, 165, 46, 81, 203, 154, 29];

/// Event kinds for the `send_launchpad` program.
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum SendLaunchpadEventKind {
	CompleteEvent,
	CreatorClaimEvent,
	MigrateEvent,
	ProtocolClaimEvent,
	RecycleEvent,
	TokenCreateEvent,
	TradeEvent,
}

/// Identifies a `send_launchpad` event from the provided data.
///
/// A foreign `program_id` is a `None`, not an error: callers iterate whole transactions where
/// other programs are ordinary.
/// Data that lacks the shared CPI framing is rejected with a single compare.
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
}

/// Parsed event variants for the `send_launchpad` program.
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum SendLaunchpadEvent {
	CompleteEvent(CompleteEvent),
	CreatorClaimEvent(CreatorClaimEvent),
	MigrateEvent(MigrateEvent),
	ProtocolClaimEvent(ProtocolClaimEvent),
	RecycleEvent(RecycleEvent),
	TokenCreateEvent(TokenCreateEvent),
	TradeEvent(TradeEvent),
}

/// Tries to parse a `send_launchpad` event from the provided data.
///
/// `None` when [`identify_send_launchpad_event`] finds nothing; `Some(Err(_))`
/// when one matches but fails to deserialize. Use [`Option::transpose`] to propagate failures
/// with `?`, or scan a batch:
///
/// ```ignore
/// let events: Vec<SendLaunchpadEvent> = datas
///     .iter()
///     .filter_map(|data| try_parse_send_launchpad_event(program_id, data))
///     .collect::<Result<_, _>>()?;
/// ```
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 => {
			// ANCHOR_EVENT_CPI_DISCRIMINATOR (8) + COMPLETE_EVENT_DISCRIMINATOR (8)
			let mut data = &data[16..];
			CompleteEvent::deserialize(&mut data)
				.map(SendLaunchpadEvent::CompleteEvent)
		}
		SendLaunchpadEventKind::CreatorClaimEvent => {
			// ANCHOR_EVENT_CPI_DISCRIMINATOR (8) + CREATOR_CLAIM_EVENT_DISCRIMINATOR (8)
			let mut data = &data[16..];
			CreatorClaimEvent::deserialize(&mut data)
				.map(SendLaunchpadEvent::CreatorClaimEvent)
		}
		SendLaunchpadEventKind::MigrateEvent => {
			// ANCHOR_EVENT_CPI_DISCRIMINATOR (8) + MIGRATE_EVENT_DISCRIMINATOR (8)
			let mut data = &data[16..];
			MigrateEvent::deserialize(&mut data)
				.map(SendLaunchpadEvent::MigrateEvent)
		}
		SendLaunchpadEventKind::ProtocolClaimEvent => {
			// ANCHOR_EVENT_CPI_DISCRIMINATOR (8) + PROTOCOL_CLAIM_EVENT_DISCRIMINATOR (8)
			let mut data = &data[16..];
			ProtocolClaimEvent::deserialize(&mut data)
				.map(SendLaunchpadEvent::ProtocolClaimEvent)
		}
		SendLaunchpadEventKind::RecycleEvent => {
			// ANCHOR_EVENT_CPI_DISCRIMINATOR (8) + RECYCLE_EVENT_DISCRIMINATOR (8)
			let mut data = &data[16..];
			RecycleEvent::deserialize(&mut data)
				.map(SendLaunchpadEvent::RecycleEvent)
		}
		SendLaunchpadEventKind::TokenCreateEvent => {
			// ANCHOR_EVENT_CPI_DISCRIMINATOR (8) + TOKEN_CREATE_EVENT_DISCRIMINATOR (8)
			let mut data = &data[16..];
			TokenCreateEvent::deserialize(&mut data)
				.map(SendLaunchpadEvent::TokenCreateEvent)
		}
		SendLaunchpadEventKind::TradeEvent => {
			// ANCHOR_EVENT_CPI_DISCRIMINATOR (8) + TRADE_EVENT_DISCRIMINATOR (8)
			let mut data = &data[16..];
			TradeEvent::deserialize(&mut data)
				.map(SendLaunchpadEvent::TradeEvent)
		}
	})
}