1use crate::core::events::*;
6use solana_sdk::{pubkey::Pubkey, signature::Signature};
7
8pub 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 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 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 instruction_events.extend(log_events);
47 instruction_events
48}
49
50pub 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
68pub trait EventListener {
70 fn on_dex_event(&self, event: &DexEvent);
71}
72
73pub 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
94pub 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 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); }
117
118 for log in logs {
120 if let Some(log_event) = crate::logs::parse_log_unified(log, signature, slot, block_time) {
121 callback(log_event); }
123 }
124
125 }
128
129pub 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
146pub trait StreamingEventListener {
148 fn on_dex_event_streaming(&mut self, event: DexEvent);
149}
150
151pub 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}