Summary
Both settlement collectors convert a settlement event/log into an L1HandlerTx inside an if let Ok(tx) = ... guard. When l1_handler_tx_from_event / l1_handler_tx_from_log returns Err (malformed event, unexpected shape, decode failure), the message is silently dropped — no log, no metric, no retry.
Because the settlement contract assigns a global monotonic message nonce, a silently dropped message is a hole in the sequence.
Where
crates/messaging/src/stream/collector/starknet.rs — if let Ok(tx) = l1_handler_tx_from_event(e, chain_id) { ... } in gather.
crates/messaging/src/stream/collector/ethereum.rs — if let Ok(tx) = l1_handler_tx_from_log(log.clone(), chain_id) { ... } in gather.
Impact
A single malformed/unexpected event is dropped with no operator-visible signal, and (before the nonce-gate fix) this would stall all later messages. At minimum this should be observable.
Fix idea
Log the conversion error at error/warn (with block + tx_index + reason) instead of silently discarding it, and consider surfacing a metric or parking the message for inspection rather than dropping it.
Follow-up split from the L1-handler nonce-gate fix (case B3b in the investigation).
Summary
Both settlement collectors convert a settlement event/log into an
L1HandlerTxinside anif let Ok(tx) = ...guard. Whenl1_handler_tx_from_event/l1_handler_tx_from_logreturnsErr(malformed event, unexpected shape, decode failure), the message is silently dropped — no log, no metric, no retry.Because the settlement contract assigns a global monotonic message nonce, a silently dropped message is a hole in the sequence.
Where
crates/messaging/src/stream/collector/starknet.rs—if let Ok(tx) = l1_handler_tx_from_event(e, chain_id) { ... }ingather.crates/messaging/src/stream/collector/ethereum.rs—if let Ok(tx) = l1_handler_tx_from_log(log.clone(), chain_id) { ... }ingather.Impact
A single malformed/unexpected event is dropped with no operator-visible signal, and (before the nonce-gate fix) this would stall all later messages. At minimum this should be observable.
Fix idea
Log the conversion error at
error/warn(with block + tx_index + reason) instead of silently discarding it, and consider surfacing a metric or parking the message for inspection rather than dropping it.Follow-up split from the L1-handler nonce-gate fix (case B3b in the investigation).