Skip to main content

sol_parser_sdk/logs/
mod.rs

1//! Log parser module
2//!
3//! Contains log parsers for all DEX protocols
4
5// Allow dead code for fallback text parsers (kept for future use)
6#![allow(dead_code)]
7#![allow(unused_imports)]
8#![allow(unused_variables)]
9
10pub mod discriminator_lut;
11pub mod meteora_amm;
12pub mod meteora_damm;
13pub mod meteora_dbc;
14pub mod meteora_dlmm;
15pub mod optimized_matcher;
16pub mod orca_whirlpool;
17pub mod perf_hints;
18pub mod pump;
19pub mod pump_amm;
20pub mod pump_fees;
21pub mod raydium_amm;
22pub mod raydium_clmm;
23pub mod raydium_cpmm;
24pub mod raydium_launchlab;
25pub mod utils;
26pub mod zero_copy_parser;
27
28// 导出关键的 utils 函数
29pub use discriminator_lut::{
30    discriminator_to_name, discriminator_to_protocol, lookup_discriminator,
31    parse_with_discriminator,
32};
33pub use utils::extract_discriminator_fast;
34pub use zero_copy_parser::parse_pumpfun_trade;
35
36// 重新导出主要解析函数
37pub use meteora_amm::parse_log as parse_meteora_amm_log;
38pub use meteora_damm::parse_log as parse_meteora_damm_log;
39pub use meteora_dbc::parse_log as parse_meteora_dbc_log;
40pub use meteora_dlmm::parse_log as parse_meteora_dlmm_log;
41pub use orca_whirlpool::parse_log as parse_orca_whirlpool_log;
42pub use pump::parse_log as parse_pumpfun_log;
43pub use pump_amm::parse_log as parse_pump_amm_log;
44pub use raydium_amm::parse_log as parse_raydium_amm_log;
45pub use raydium_clmm::parse_log as parse_raydium_clmm_log;
46pub use raydium_cpmm::parse_log as parse_raydium_cpmm_log;
47pub use raydium_launchlab::parse_log as parse_raydium_launchlab_log;
48
49// 重新导出工具函数
50pub use utils::*;
51
52use crate::core::clock::now_us;
53use crate::core::events::DexEvent;
54use solana_sdk::signature::Signature;
55
56/// 主日志解析入口函数
57#[inline(always)] // 零延迟优化:内联热路径
58/// `recent_blockhash`: pass as `Some(&buf)` so it is only cloned when an event is produced (not per log line).
59pub fn parse_log(
60    log: &str,
61    signature: Signature,
62    slot: u64,
63    tx_index: u64,
64    block_time_us: Option<i64>,
65    grpc_recv_us: i64,
66    event_type_filter: Option<&crate::grpc::types::EventTypeFilter>,
67    is_created_buy: bool,
68    recent_blockhash: Option<&[u8]>,
69) -> Option<DexEvent> {
70    optimized_matcher::parse_log_optimized(
71        log,
72        signature,
73        slot,
74        tx_index,
75        block_time_us,
76        grpc_recv_us,
77        event_type_filter,
78        is_created_buy,
79        recent_blockhash,
80    )
81}
82
83/// Program-aware log parser for gRPC/RPC transaction logs.
84///
85/// Solana `Program data:` lines do not include the program id. Passing the
86/// current invoke stack's program id prevents cross-protocol discriminator
87/// collisions from being misparsed.
88#[inline(always)]
89pub fn parse_log_with_program_id(
90    log: &str,
91    signature: Signature,
92    slot: u64,
93    tx_index: u64,
94    block_time_us: Option<i64>,
95    grpc_recv_us: i64,
96    event_type_filter: Option<&crate::grpc::types::EventTypeFilter>,
97    is_created_buy: bool,
98    recent_blockhash: Option<&[u8]>,
99    program_id: Option<&solana_sdk::pubkey::Pubkey>,
100) -> Option<DexEvent> {
101    optimized_matcher::parse_log_optimized_with_program_id(
102        log,
103        signature,
104        slot,
105        tx_index,
106        block_time_us,
107        grpc_recv_us,
108        event_type_filter,
109        is_created_buy,
110        recent_blockhash,
111        program_id,
112    )
113}
114
115/// 统一的日志解析入口函数(优化版本)
116#[inline(always)] // 零延迟优化:内联热路径
117pub fn parse_log_unified(
118    log: &str,
119    signature: Signature,
120    slot: u64,
121    block_time_us: Option<i64>,
122) -> Option<DexEvent> {
123    let grpc_recv_us = now_us();
124    optimized_matcher::parse_log_optimized(
125        log,
126        signature,
127        slot,
128        0,
129        block_time_us,
130        grpc_recv_us,
131        None,
132        false,
133        None,
134    )
135}