Currently the coupling is implied by CurrentL1 (last derived data) and SafeL2 (last L2 safe head).
But since the safe-block just reflects the engine, which is not atomically coupled to the derivation, this can be inaccurate data.
Instead, we can add a DerivedSafe and DerivedFrom attribute to the SyncStatus (or to a separately managed attribute, to not make SyncStatus larger than it already is) for the latest derived safe-block.
This data is strictly coupled, and emitted whenever the safe-block changes, with engine.SafeDerivedEvent.
We can then update the op-challenger to use this more accurate information.
Currently the coupling is implied by
CurrentL1
(last derived data) andSafeL2
(last L2 safe head). But since the safe-block just reflects the engine, which is not atomically coupled to the derivation, this can be inaccurate data.Instead, we can add a
DerivedSafe
andDerivedFrom
attribute to theSyncStatus
(or to a separately managed attribute, to not make SyncStatus larger than it already is) for the latest derived safe-block. This data is strictly coupled, and emitted whenever the safe-block changes, withengine.SafeDerivedEvent
. We can then update the op-challenger to use this more accurate information.