Skip to main content

sol_parser_sdk/instr/
mod.rs

1//! 指令解析器模块
2//!
3//! 包含所有 DEX 协议的指令解析器实现
4
5pub 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
18// Inner instruction 解析器(16字节 discriminator)
19pub mod inner_common;        // 通用零拷贝读取函数
20pub mod pump_inner;          // PumpFun inner instruction
21pub mod pump_amm_inner;      // PumpSwap inner instruction
22pub mod raydium_clmm_inner;  // Raydium CLMM inner instruction
23pub mod all_inner;           // 其他所有协议的 inner instruction(统一文件)
24use crate::grpc::types::{EventType, EventTypeFilter};
25use crate::logs::perf_hints::unlikely;
26
27// 重新导出主要解析函数
28pub 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
32// 重新导出工具函数
33pub use utils::*;
34
35use crate::core::events::DexEvent;
36use program_ids::*;
37use solana_sdk::{pubkey::Pubkey, signature::Signature};
38
39/// 统一的指令解析入口函数
40#[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    // 快速检查指令数据长度,避免无效解析
53    if instruction_data.is_empty() {
54        return None;
55    }
56
57    // 提前过滤和解析
58    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    // 根据程序 ID 路由到相应的解析器,按使用频率排序
78
79    // Pumpfun
80    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    // PumpSwap (Pump AMM)
95    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    // Meteora DAMM
109    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}