sol_parser_sdk/core/
unified_parser.rs

1//! 统一解析器 - 简化的单一入口解析器
2//!
3//! 提供完整的交易解析能力,支持指令和日志数据处理
4
5use crate::core::events::*;
6use solana_sdk::{pubkey::Pubkey, signature::Signature};
7
8/// 主要解析函数 - 解析完整交易并返回所有 DEX 事件
9///
10/// 参数:
11/// - instruction_data: 交易指令数据
12/// - accounts: 账户列表
13/// - logs: 交易日志
14/// - signature: 交易签名
15/// - slot: 区块高度
16/// - block_time: 区块时间
17/// - program_id: 程序 ID
18pub fn parse_transaction_events(
19    instruction_data: &[u8],
20    accounts: &[Pubkey],
21    logs: &[String],
22    signature: Signature,
23    slot: u64,
24    tx_index: u64,
25    block_time: Option<i64>,
26    program_id: &Pubkey,
27) -> Vec<DexEvent> {
28    let mut instruction_events = Vec::new();
29    let mut log_events = Vec::new();
30
31    // 1. 解析指令事件
32    if let Some(instr_event) = crate::instr::parse_instruction_unified(
33        instruction_data, accounts, signature, slot, tx_index, block_time, program_id
34    ) {
35        instruction_events.push(instr_event);
36    }
37
38    // 2. 解析日志事件
39    for log in logs {
40        if let Some(log_event) = crate::logs::parse_log_unified(log, signature, slot, block_time) {
41            log_events.push(log_event);
42        }
43    }
44
45    // 3. 合并指令和日志事件
46    instruction_events.extend(log_events);
47    instruction_events
48}
49
50/// 简化版本 - 仅解析日志事件
51pub fn parse_logs_only(
52    logs: &[String],
53    signature: Signature,
54    slot: u64,
55    block_time: Option<i64>,
56) -> Vec<DexEvent> {
57    let mut events = Vec::new();
58
59    for log in logs {
60        if let Some(event) = crate::logs::parse_log_unified(log, signature, slot, block_time) {
61            events.push(event);
62        }
63    }
64
65    events
66}
67
68/// 事件监听器 trait - 用户可以实现此 trait 来处理解析出的事件
69pub trait EventListener {
70    fn on_dex_event(&self, event: &DexEvent);
71}
72
73/// 使用监听器解析交易的便捷函数
74pub fn parse_transaction_with_listener<T: EventListener>(
75    instruction_data: &[u8],
76    accounts: &[Pubkey],
77    logs: &[String],
78    signature: Signature,
79    slot: u64,
80    tx_index: u64,
81    block_time: Option<i64>,
82    program_id: &Pubkey,
83    listener: &T,
84) {
85    let events = parse_transaction_events(
86        instruction_data, accounts, logs, signature, slot, tx_index, block_time, program_id
87    );
88
89    for event in &events {
90        listener.on_dex_event(event);
91    }
92}
93
94/// 流式解析交易事件 - 每解析出一个事件就立即回调
95///
96/// 这个版本不做事件合并,确保每个事件都能立即被处理
97/// 适用于需要实时响应的场景
98pub fn parse_transaction_events_streaming<F>(
99    instruction_data: &[u8],
100    accounts: &[Pubkey],
101    logs: &[String],
102    signature: Signature,
103    slot: u64,
104    tx_index: u64,
105    block_time: Option<i64>,
106    program_id: &Pubkey,
107    mut callback: F,
108) where
109    F: FnMut(DexEvent)
110{
111    // 1. 先解析指令事件(如果有) - 立即回调
112    if let Some(instr_event) = crate::instr::parse_instruction_unified(
113        instruction_data, accounts, signature, slot, tx_index, block_time, program_id
114    ) {
115        callback(instr_event);  // 立即回调指令事件
116    }
117
118    // 2. 逐个解析日志事件 - 每个事件立即回调
119    for log in logs {
120        if let Some(log_event) = crate::logs::parse_log_unified(log, signature, slot, block_time) {
121            callback(log_event);  // 立即回调日志事件,不等待其他日志
122        }
123    }
124
125    // 注意:这里完全不做事件合并和缓存,确保每个事件都是立即回调
126    // 回调顺序:先指令事件,然后按日志顺序回调日志事件
127}
128
129/// 流式解析日志事件 - 每解析出一个事件就立即回调
130pub fn parse_logs_streaming<F>(
131    logs: &[String],
132    signature: Signature,
133    slot: u64,
134    block_time: Option<i64>,
135    mut callback: F,
136) where
137    F: FnMut(DexEvent)
138{
139    for log in logs {
140        if let Some(event) = crate::logs::parse_log_unified(log, signature, slot, block_time) {
141            callback(event);
142        }
143    }
144}
145
146/// 流式事件监听器 trait - 适用于流式处理
147pub trait StreamingEventListener {
148    fn on_dex_event_streaming(&mut self, event: DexEvent);
149}
150
151/// 使用流式监听器解析交易的便捷函数
152pub fn parse_transaction_with_streaming_listener<T: StreamingEventListener>(
153    instruction_data: &[u8],
154    accounts: &[Pubkey],
155    logs: &[String],
156    signature: Signature,
157    slot: u64,
158    tx_index: u64,
159    block_time: Option<i64>,
160    program_id: &Pubkey,
161    listener: &mut T,
162) {
163    parse_transaction_events_streaming(
164        instruction_data,
165        accounts,
166        logs,
167        signature,
168        slot,
169        tx_index,
170        block_time,
171        program_id,
172        |event| listener.on_dex_event_streaming(event)
173    );
174}