|
94 | 94 | error_origin: false, |
95 | 95 | subtraces: Vec::new(), |
96 | 96 | trace_address, |
97 | | - slot_changes: Vec::new(), // Initialize empty slot changes |
| 97 | + slot_accesses: Vec::new(), // Initialize empty slot accesses |
98 | 98 | }; |
99 | 99 |
|
100 | 100 | self.call_traces.push(trace); |
@@ -156,7 +156,7 @@ where |
156 | 156 | error_origin: false, |
157 | 157 | subtraces: Vec::new(), |
158 | 158 | trace_address, |
159 | | - slot_changes: Vec::new(), // Initialize empty slot changes |
| 159 | + slot_accesses: Vec::new(), // Initialize empty slot accesses |
160 | 160 | }; |
161 | 161 |
|
162 | 162 | self.call_traces.push(trace); |
@@ -288,17 +288,39 @@ where |
288 | 288 | // Store the slot change in the current call trace |
289 | 289 | let index = self.call_stack.last().unwrap(); |
290 | 290 | let call_trace = &mut self.call_traces[*index]; |
291 | | - call_trace.slot_changes.push(SlotChange { |
| 291 | + call_trace.slot_accesses.push(SlotAccess { |
292 | 292 | address: target, |
293 | 293 | slot, |
294 | 294 | old_value: old, |
295 | 295 | new_value: value, |
| 296 | + is_write: true, // This is a write operation |
296 | 297 | }); |
297 | 298 | // Update the slot cache |
298 | 299 | self.slot_cache.insert((target, slot), value); |
299 | 300 | } |
300 | 301 | _ => {} |
301 | 302 | } |
| 303 | + } else if opcode == 0x54 && self.call_stack.last().is_some() { |
| 304 | + let slot = interp.stack.pop(); |
| 305 | + if let Some(slot) = slot { |
| 306 | + let _ = interp.stack.push(slot); |
| 307 | + let target = interp.input.target_address(); |
| 308 | + let cached = self.slot_cache.get(&(target, slot)); |
| 309 | + let value = if let Some(old) = cached { |
| 310 | + *old |
| 311 | + } else { |
| 312 | + context.db().storage(target, slot).unwrap_or_default() |
| 313 | + }; |
| 314 | + let index = self.call_stack.last().unwrap(); |
| 315 | + let call_trace = &mut self.call_traces[*index]; |
| 316 | + call_trace.slot_accesses.push(SlotAccess { |
| 317 | + address: target, |
| 318 | + slot, |
| 319 | + old_value: value, |
| 320 | + new_value: value, |
| 321 | + is_write: false, // This is a read operation |
| 322 | + }); |
| 323 | + } |
302 | 324 | } |
303 | 325 | } |
304 | 326 | } |
0 commit comments