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 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::{EventType, EventTypeFilter};
use crate::logs::perf_hints::unlikely;
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 utils::*;
use crate::core::events::DexEvent;
use program_ids::*;
use solana_sdk::{pubkey::Pubkey, signature::Signature};
#[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 let Some(filter) = event_type_filter {
if let Some(ref include_only) = filter.include_only {
let should_parse = include_only.iter().any(|t| {
matches!(
t,
EventType::PumpFunMigrate
| EventType::MeteoraDammV2Swap
| EventType::MeteoraDammV2AddLiquidity
| EventType::MeteoraDammV2CreatePosition
| EventType::MeteoraDammV2ClosePosition
| EventType::MeteoraDammV2RemoveLiquidity
)
});
if unlikely(!should_parse) {
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,
);
}
None
}