sol_parser_sdk/instr/
mod.rs1pub mod meteora_amm;
6pub mod meteora_damm;
7pub mod meteora_dlmm;
8pub mod orca_whirlpool;
9pub mod program_ids;
10pub mod pump_amm;
11pub mod pump;
12pub mod raydium_amm;
13pub mod raydium_clmm;
14pub mod raydium_cpmm;
15pub mod raydium_launchpad;
16pub mod utils;
17
18pub mod inner_common; pub mod pump_inner; pub mod pump_amm_inner; pub mod raydium_clmm_inner; pub mod all_inner; use crate::grpc::types::{EventType, EventTypeFilter};
25use crate::logs::perf_hints::unlikely;
26
27pub use meteora_damm::parse_instruction as parse_meteora_damm_instruction;
29pub use pump::parse_instruction as parse_pumpfun_instruction;
30pub use pump_amm::parse_instruction as parse_pumpswap_instruction;
31
32pub use utils::*;
34
35use crate::core::events::DexEvent;
36use program_ids::*;
37use solana_sdk::{pubkey::Pubkey, signature::Signature};
38
39#[inline]
41pub fn parse_instruction_unified(
42 instruction_data: &[u8],
43 accounts: &[Pubkey],
44 signature: Signature,
45 slot: u64,
46 tx_index: u64,
47 block_time_us: Option<i64>,
48 grpc_recv_us: i64,
49 event_type_filter: Option<&EventTypeFilter>,
50 program_id: &Pubkey,
51) -> Option<DexEvent> {
52 if instruction_data.is_empty() {
54 return None;
55 }
56
57 if let Some(filter) = event_type_filter {
59 if let Some(ref include_only) = filter.include_only {
60 let should_parse = include_only.iter().any(|t| {
61 matches!(
62 t,
63 EventType::PumpFunMigrate
64 | EventType::MeteoraDammV2Swap
65 | EventType::MeteoraDammV2AddLiquidity
66 | EventType::MeteoraDammV2CreatePosition
67 | EventType::MeteoraDammV2ClosePosition
68 | EventType::MeteoraDammV2RemoveLiquidity
69 )
70 });
71 if unlikely(!should_parse) {
72 return None;
73 }
74 }
75 }
76
77 if *program_id == PUMPFUN_PROGRAM_ID {
81 if event_type_filter.is_some() && !event_type_filter.unwrap().includes_pumpfun() {
82 return None;
83 }
84 return parse_pumpfun_instruction(
85 instruction_data,
86 accounts,
87 signature,
88 slot,
89 tx_index,
90 block_time_us,
91 grpc_recv_us,
92 );
93 }
94 else if *program_id == PUMPSWAP_PROGRAM_ID {
96 if event_type_filter.is_some() && !event_type_filter.unwrap().includes_pumpswap() {
97 return None;
98 }
99 return parse_pumpswap_instruction(
100 instruction_data,
101 accounts,
102 signature,
103 slot,
104 tx_index,
105 block_time_us,
106 );
107 }
108 else if *program_id == METEORA_DAMM_V2_PROGRAM_ID {
110 if event_type_filter.is_some() && !event_type_filter.unwrap().includes_meteora_damm_v2() {
111 return None;
112 }
113 return parse_meteora_damm_instruction(
114 instruction_data,
115 accounts,
116 signature,
117 slot,
118 tx_index,
119 block_time_us,
120 grpc_recv_us,
121 );
122 }
123
124 None
125}