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;
11pub mod pump_fees;
12pub mod pump_amm;
13pub mod raydium_amm;
14pub mod raydium_clmm;
15pub mod raydium_cpmm;
16pub mod raydium_launchpad;
17pub mod utils;
18
19// Inner instruction 解析器(16字节 discriminator)
20pub mod all_inner;
21pub mod inner_common; // 通用零拷贝读取函数
22pub mod pump_amm_inner; // PumpSwap inner instruction
23pub mod pump_inner; // PumpFun inner instruction
24pub mod raydium_clmm_inner; // Raydium CLMM inner instruction // 其他所有协议的 inner instruction(统一文件)
25use crate::grpc::types::EventTypeFilter;
26// 重新导出主要解析函数
27pub use meteora_damm::parse_instruction as parse_meteora_damm_instruction;
28pub use pump::parse_instruction as parse_pumpfun_instruction;
29pub use pump_amm::parse_instruction as parse_pumpswap_instruction;
30
31// 重新导出工具函数
32pub use utils::*;
33
34use crate::core::events::DexEvent;
35use program_ids::*;
36use solana_sdk::{pubkey::Pubkey, signature::Signature};
37
38/// 统一的指令解析入口函数
39#[inline]
40pub fn parse_instruction_unified(
41    instruction_data: &[u8],
42    accounts: &[Pubkey],
43    signature: Signature,
44    slot: u64,
45    tx_index: u64,
46    block_time_us: Option<i64>,
47    grpc_recv_us: i64,
48    event_type_filter: Option<&EventTypeFilter>,
49    program_id: &Pubkey,
50) -> Option<DexEvent> {
51    // 快速检查指令数据长度,避免无效解析
52    if instruction_data.is_empty() {
53        return None;
54    }
55
56    // 根据程序 ID 路由到相应的解析器,按使用频率排序
57
58    // Pumpfun
59    if *program_id == PUMPFUN_PROGRAM_ID {
60        if event_type_filter.is_some() && !event_type_filter.unwrap().includes_pumpfun() {
61            return None;
62        }
63        return parse_pumpfun_instruction(
64            instruction_data,
65            accounts,
66            signature,
67            slot,
68            tx_index,
69            block_time_us,
70            grpc_recv_us,
71        );
72    }
73    // PumpSwap (Pump AMM)
74    else if *program_id == PUMPSWAP_PROGRAM_ID {
75        if event_type_filter.is_some() && !event_type_filter.unwrap().includes_pumpswap() {
76            return None;
77        }
78        return parse_pumpswap_instruction(
79            instruction_data,
80            accounts,
81            signature,
82            slot,
83            tx_index,
84            block_time_us,
85        );
86    }
87    // Meteora DAMM
88    else if *program_id == METEORA_DAMM_V2_PROGRAM_ID {
89        if event_type_filter.is_some() && !event_type_filter.unwrap().includes_meteora_damm_v2() {
90            return None;
91        }
92        return parse_meteora_damm_instruction(
93            instruction_data,
94            accounts,
95            signature,
96            slot,
97            tx_index,
98            block_time_us,
99            grpc_recv_us,
100        );
101    }
102    // Pump fees (`pfeeUx...`)
103    else if *program_id == PUMP_FEES_PROGRAM_ID {
104        if event_type_filter.is_some() && !event_type_filter.unwrap().includes_pump_fees() {
105            return None;
106        }
107        return crate::instr::pump_fees::parse_instruction(
108            instruction_data,
109            accounts,
110            signature,
111            slot,
112            tx_index,
113            block_time_us,
114            grpc_recv_us,
115        );
116    }
117
118    None
119}