sol_parser_sdk/instr/
mod.rs

1//! 指令解析器模块
2//!
3//! 包含所有 DEX 协议的指令解析器实现
4
5pub mod utils;
6pub mod program_ids;
7pub mod raydium_launchpad;
8pub mod pumpfun;
9pub mod pump_amm;
10pub mod raydium_clmm;
11pub mod raydium_cpmm;
12pub mod raydium_amm;
13pub mod orca_whirlpool;
14pub mod meteora_amm;
15pub mod meteora_damm;
16pub mod meteora_dlmm;
17
18// 重新导出主要解析函数
19pub use raydium_launchpad::parse_instruction as parse_raydium_launchpad_instruction;
20pub use pumpfun::parse_instruction as parse_pumpfun_instruction;
21pub use pump_amm::parse_instruction as parse_pump_amm_instruction;
22pub use raydium_clmm::parse_instruction as parse_raydium_clmm_instruction;
23pub use raydium_cpmm::parse_instruction as parse_raydium_cpmm_instruction;
24pub use raydium_amm::parse_instruction as parse_raydium_amm_instruction;
25pub use orca_whirlpool::parse_instruction as parse_orca_whirlpool_instruction;
26pub use meteora_amm::parse_instruction as parse_meteora_amm_instruction;
27pub use meteora_damm::parse_instruction as parse_meteora_damm_instruction;
28pub use meteora_dlmm::parse_instruction as parse_meteora_dlmm_instruction;
29
30// 重新导出工具函数
31pub use utils::*;
32
33use solana_sdk::{pubkey::Pubkey, signature::Signature};
34use crate::core::events::DexEvent;
35use program_ids::*;
36
37/// 统一的指令解析入口函数
38#[inline]
39pub fn parse_instruction_unified(
40    instruction_data: &[u8],
41    accounts: &[Pubkey],
42    signature: Signature,
43    slot: u64,
44    tx_index: u64,
45    block_time: Option<i64>,
46    program_id: &Pubkey,
47) -> Option<DexEvent> {
48    // 快速检查指令数据长度,避免无效解析
49    if instruction_data.is_empty() {
50        return None;
51    }
52
53    // 根据程序 ID 路由到相应的解析器,按使用频率排序
54
55    // PumpFun (最常用)
56    if *program_id == PUMPFUN_PROGRAM_ID {
57        return parse_pumpfun_instruction(instruction_data, accounts, signature, slot, tx_index, block_time);
58    }
59
60    // Raydium AMM (高频)
61    if *program_id == RAYDIUM_AMM_V4_PROGRAM_ID {
62        return parse_raydium_amm_instruction(instruction_data, accounts, signature, slot, tx_index, block_time);
63    }
64
65    // Raydium CLMM
66    if *program_id == RAYDIUM_CLMM_PROGRAM_ID {
67        return parse_raydium_clmm_instruction(instruction_data, accounts, signature, slot, tx_index, block_time);
68    }
69
70    // Orca Whirlpool
71    if *program_id == ORCA_WHIRLPOOL_PROGRAM_ID {
72        return parse_orca_whirlpool_instruction(instruction_data, accounts, signature, slot, tx_index, block_time);
73    }
74
75    // Raydium CPMM
76    if *program_id == RAYDIUM_CPMM_PROGRAM_ID {
77        return parse_raydium_cpmm_instruction(instruction_data, accounts, signature, slot, tx_index, block_time);
78    }
79
80    // Meteora DAMM
81    if *program_id == METEORA_DAMM_V2_PROGRAM_ID {
82        return parse_meteora_damm_instruction(instruction_data, accounts, signature, slot, tx_index, block_time);
83    }
84
85    // Meteora DLMM
86    if *program_id == METEORA_DLMM_PROGRAM_ID {
87        return parse_meteora_dlmm_instruction(instruction_data, accounts, signature, slot, tx_index, block_time);
88    }
89
90    // Raydium Launchpad
91    if *program_id == BONK_PROGRAM_ID {
92        return parse_raydium_launchpad_instruction(instruction_data, accounts, signature, slot, tx_index, block_time);
93    }
94
95    // Pump AMM
96    if *program_id == PUMPSWAP_PROGRAM_ID {
97        return parse_pump_amm_instruction(instruction_data, accounts, signature, slot, tx_index, block_time);
98    }
99
100    // Meteora AMM
101    if *program_id == METEORA_POOLS_PROGRAM_ID {
102        return parse_meteora_amm_instruction(instruction_data, accounts, signature, slot, tx_index, block_time);
103    }
104
105    None
106}