1use crate::core::events::*;
12use smallvec::{smallvec, SmallVec};
13use solana_sdk::{pubkey::Pubkey, signature::Signature};
14
15#[inline] pub fn parse_transaction_events(
31 instruction_data: &[u8],
32 accounts: &[Pubkey],
33 logs: &[String],
34 signature: Signature,
35 slot: u64,
36 tx_index: u64,
37 block_time_us: Option<i64>,
38 program_id: &Pubkey,
39) -> SmallVec<[DexEvent; 4]> {
40 let mut events = smallvec![]; if let Some(instr_event) = crate::instr::parse_instruction_unified(
44 instruction_data,
45 accounts,
46 signature,
47 slot,
48 tx_index,
49 block_time_us,
50 0,
51 None,
52 program_id,
53 ) {
54 events.push(instr_event);
55 }
56
57 for log in logs {
59 if let Some(log_event) = crate::logs::parse_log_unified(log, signature, slot, block_time_us)
60 {
61 events.push(log_event); }
63 }
65
66 events
67}
68
69#[inline] pub fn parse_logs_only(
72 logs: &[String],
73 signature: Signature,
74 slot: u64,
75 block_time_us: Option<i64>,
76) -> SmallVec<[DexEvent; 4]> {
77 let mut events = SmallVec::with_capacity(logs.len().min(4)); for log in logs {
81 if let Some(event) = crate::logs::parse_log_unified(log, signature, slot, block_time_us) {
82 events.push(event);
83 }
84 }
85
86 events
87}
88
89pub trait EventListener {
91 fn on_dex_event(&self, event: &DexEvent);
92}
93
94pub fn parse_transaction_with_listener<T: EventListener>(
96 instruction_data: &[u8],
97 accounts: &[Pubkey],
98 logs: &[String],
99 signature: Signature,
100 slot: u64,
101 tx_index: u64,
102 block_time_us: Option<i64>,
103 program_id: &Pubkey,
104 listener: &T,
105) {
106 let events = parse_transaction_events(
107 instruction_data,
108 accounts,
109 logs,
110 signature,
111 slot,
112 tx_index,
113 block_time_us,
114 program_id,
115 );
116
117 for event in &events {
118 listener.on_dex_event(event);
119 }
120}
121
122pub fn parse_transaction_events_streaming<F>(
127 instruction_data: &[u8],
128 accounts: &[Pubkey],
129 logs: &[String],
130 signature: Signature,
131 slot: u64,
132 tx_index: u64,
133 block_time_us: Option<i64>,
134 program_id: &Pubkey,
135 mut callback: F,
136) where
137 F: FnMut(DexEvent),
138{
139 if let Some(instr_event) = crate::instr::parse_instruction_unified(
141 instruction_data,
142 accounts,
143 signature,
144 slot,
145 tx_index,
146 block_time_us,
147 0,
148 None,
149 program_id,
150 ) {
151 callback(instr_event);
152 }
153
154 for log in logs {
156 if let Some(log_event) = crate::logs::parse_log_unified(log, signature, slot, block_time_us)
157 {
158 callback(log_event); }
160 }
161
162 }
165
166pub fn parse_logs_streaming<F>(
168 logs: &[String],
169 signature: Signature,
170 slot: u64,
171 block_time_us: Option<i64>,
172 mut callback: F,
173) where
174 F: FnMut(DexEvent),
175{
176 for log in logs {
177 if let Some(event) = crate::logs::parse_log_unified(log, signature, slot, block_time_us) {
178 callback(event);
179 }
180 }
181}
182
183pub trait StreamingEventListener {
185 fn on_dex_event_streaming(&mut self, event: DexEvent);
186}
187
188pub fn parse_transaction_with_streaming_listener<T: StreamingEventListener>(
190 instruction_data: &[u8],
191 accounts: &[Pubkey],
192 logs: &[String],
193 signature: Signature,
194 slot: u64,
195 tx_index: u64,
196 block_time_us: Option<i64>,
197 program_id: &Pubkey,
198 listener: &mut T,
199) {
200 parse_transaction_events_streaming(
201 instruction_data,
202 accounts,
203 logs,
204 signature,
205 slot,
206 tx_index,
207 block_time_us,
208 program_id,
209 |event| listener.on_dex_event_streaming(event),
210 );
211}