pub mod meteora_amm;
pub mod meteora_damm;
pub mod meteora_dlmm;
pub mod orca_whirlpool;
pub mod program_ids;
pub mod pump;
pub mod pump_amm;
pub mod pump_fees;
pub mod raydium_amm;
pub mod raydium_clmm;
pub mod raydium_cpmm;
pub mod raydium_launchpad;
pub mod utils;
pub mod all_inner;
pub mod inner_common; pub mod pump_amm_inner; pub mod pump_inner; pub mod raydium_clmm_inner; use crate::grpc::types::EventTypeFilter;
pub use meteora_damm::parse_instruction as parse_meteora_damm_instruction;
pub use pump::parse_instruction as parse_pumpfun_instruction;
pub use pump_amm::parse_instruction as parse_pumpswap_instruction;
pub use raydium_launchpad::parse_instruction as parse_raydium_launchpad_instruction;
pub use utils::*;
use crate::core::events::DexEvent;
use program_ids::*;
use solana_sdk::{pubkey::Pubkey, signature::Signature};
#[inline(always)]
fn filter_allows_untyped_protocol(event_type_filter: Option<&EventTypeFilter>) -> bool {
event_type_filter.and_then(|f| f.include_only.as_ref()).is_none()
}
#[inline]
pub fn parse_instruction_unified(
instruction_data: &[u8],
accounts: &[Pubkey],
signature: Signature,
slot: u64,
tx_index: u64,
block_time_us: Option<i64>,
grpc_recv_us: i64,
event_type_filter: Option<&EventTypeFilter>,
program_id: &Pubkey,
) -> Option<DexEvent> {
if instruction_data.is_empty() {
return None;
}
if *program_id == PUMPFUN_PROGRAM_ID {
if event_type_filter.is_some() && !event_type_filter.unwrap().includes_pumpfun() {
return None;
}
return parse_pumpfun_instruction(
instruction_data,
accounts,
signature,
slot,
tx_index,
block_time_us,
grpc_recv_us,
);
}
else if *program_id == PUMPSWAP_PROGRAM_ID {
if event_type_filter.is_some() && !event_type_filter.unwrap().includes_pumpswap() {
return None;
}
return parse_pumpswap_instruction(
instruction_data,
accounts,
signature,
slot,
tx_index,
block_time_us,
);
}
else if *program_id == METEORA_DAMM_V2_PROGRAM_ID {
if event_type_filter.is_some() && !event_type_filter.unwrap().includes_meteora_damm_v2() {
return None;
}
return parse_meteora_damm_instruction(
instruction_data,
accounts,
signature,
slot,
tx_index,
block_time_us,
grpc_recv_us,
);
}
else if *program_id == PUMP_FEES_PROGRAM_ID {
if event_type_filter.is_some() && !event_type_filter.unwrap().includes_pump_fees() {
return None;
}
return crate::instr::pump_fees::parse_instruction(
instruction_data,
accounts,
signature,
slot,
tx_index,
block_time_us,
grpc_recv_us,
);
}
else if *program_id == BONK_PROGRAM_ID {
if event_type_filter.is_some() && !event_type_filter.unwrap().includes_raydium_launchpad() {
return None;
}
return parse_raydium_launchpad_instruction(
instruction_data,
accounts,
signature,
slot,
tx_index,
block_time_us,
);
}
else if *program_id == RAYDIUM_CPMM_PROGRAM_ID {
if !filter_allows_untyped_protocol(event_type_filter) {
return None;
}
return crate::instr::raydium_cpmm::parse_instruction(
instruction_data,
accounts,
signature,
slot,
tx_index,
block_time_us,
);
}
else if *program_id == RAYDIUM_CLMM_PROGRAM_ID {
if !filter_allows_untyped_protocol(event_type_filter) {
return None;
}
return crate::instr::raydium_clmm::parse_instruction(
instruction_data,
accounts,
signature,
slot,
tx_index,
block_time_us,
);
}
else if *program_id == RAYDIUM_AMM_V4_PROGRAM_ID {
if !filter_allows_untyped_protocol(event_type_filter) {
return None;
}
return crate::instr::raydium_amm::parse_instruction(
instruction_data,
accounts,
signature,
slot,
tx_index,
block_time_us,
);
}
else if *program_id == ORCA_WHIRLPOOL_PROGRAM_ID {
if !filter_allows_untyped_protocol(event_type_filter) {
return None;
}
return crate::instr::orca_whirlpool::parse_instruction(
instruction_data,
accounts,
signature,
slot,
tx_index,
block_time_us,
);
}
else if *program_id == METEORA_POOLS_PROGRAM_ID {
if !filter_allows_untyped_protocol(event_type_filter) {
return None;
}
return crate::instr::meteora_amm::parse_instruction(
instruction_data,
accounts,
signature,
slot,
tx_index,
block_time_us,
);
}
else if *program_id == METEORA_DLMM_PROGRAM_ID {
if !filter_allows_untyped_protocol(event_type_filter) {
return None;
}
return crate::instr::meteora_dlmm::parse_instruction(
instruction_data,
accounts,
signature,
slot,
tx_index,
block_time_us,
);
}
None
}