Skip to content

Commit 973787d

Browse files
authored
update: proper events sorting (#818)
1 parent 27c9275 commit 973787d

File tree

1 file changed

+67
-8
lines changed

1 file changed

+67
-8
lines changed

madara/crates/primitives/receipt/src/from_blockifier.rs

Lines changed: 67 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -98,16 +98,75 @@ pub fn from_blockifier_execution_info(res: &TransactionExecutionInfo, tx: &Trans
9898
})
9999
})
100100
.collect();
101-
let events = recursive_call_info_iter(res)
101+
102+
// get all validate_calls
103+
let validate_calls = res.validate_call_info.iter().flat_map(|call_info| call_info.iter());
104+
105+
let validate_events = validate_calls
102106
.flat_map(|call| {
103-
call.execution.events.iter().map(|event| Event {
104-
// See above for why we use storage address.
105-
from_address: call.call.storage_address.into(),
106-
keys: event.event.keys.iter().map(|k| k.0).collect(),
107-
data: event.event.data.0.clone(),
107+
call.execution.events.iter().map(|event| {
108+
let ordered_event = Event {
109+
// See above for why we use storage address.
110+
from_address: call.call.storage_address.into(),
111+
keys: event.event.keys.iter().map(|k| k.0).collect(),
112+
data: event.event.data.0.clone(),
113+
};
114+
(ordered_event, event.order)
108115
})
109-
})
110-
.collect();
116+
}).collect::<Vec<(Event, usize)>>();
117+
118+
// Sort by order and extract just the Events
119+
let mut validate_events_with_order = validate_events;
120+
validate_events_with_order.sort_by_key(|(_, order)| *order);
121+
let final_validate_events: Vec<Event> = validate_events_with_order.into_iter().map(|(event, _)| event).collect();
122+
123+
// get all execute_calls
124+
let execute_calls = res.execute_call_info.iter().flat_map(|call_info| call_info.iter());
125+
126+
let execute_events = execute_calls
127+
.flat_map(|call| {
128+
call.execution.events.iter().map(|event| {
129+
let ordered_event = Event {
130+
// See above for why we use storage address.
131+
from_address: call.call.storage_address.into(),
132+
keys: event.event.keys.iter().map(|k| k.0).collect(),
133+
data: event.event.data.0.clone(),
134+
};
135+
(ordered_event, event.order)
136+
})
137+
}).collect::<Vec<(Event, usize)>>();
138+
139+
// Sort by order and extract just the Events
140+
let mut execute_events_with_order = execute_events;
141+
execute_events_with_order.sort_by_key(|(_, order)| *order);
142+
let final_execute_events: Vec<Event> = execute_events_with_order.into_iter().map(|(event, _)| event).collect();
143+
144+
145+
// get all fee_transfer_calls
146+
let fee_transfer_calls = res.fee_transfer_call_info.iter().flat_map(|call_info| call_info.iter());
147+
148+
let fee_transfer_events = fee_transfer_calls
149+
.flat_map(|call| {
150+
call.execution.events.iter().map(|event| {
151+
let ordered_event = Event {
152+
// See above for why we use storage address.
153+
from_address: call.call.storage_address.into(),
154+
keys: event.event.keys.iter().map(|k| k.0).collect(),
155+
data: event.event.data.0.clone(),
156+
};
157+
(ordered_event, event.order)
158+
})
159+
}).collect::<Vec<(Event, usize)>>();
160+
161+
// Sort by order and extract just the Events
162+
let mut fee_transfer_events_with_order = fee_transfer_events;
163+
fee_transfer_events_with_order.sort_by_key(|(_, order)| *order);
164+
let final_fee_transfer_events: Vec<Event> = fee_transfer_events_with_order.into_iter().map(|(event, _)| event).collect();
165+
166+
167+
let mut events = final_validate_events.clone();
168+
events.extend(final_execute_events);
169+
events.extend(final_fee_transfer_events);
111170

112171
// Note: these should not be iterated over recursively because they include the inner calls
113172
// We only add up the root calls here without recursing into the inner calls.

0 commit comments

Comments
 (0)