s.log.Warn("last submitted block lagged behind L2 safe head: batch submission will continue from the safe head now","last",s.l2SubmittedBlock,"safe",syncStatus.SafeL2)
require.Equal(t,sd.RollupCfg.Genesis.L1,verifier.L2Safe().L1Origin,"expected to be back at genesis origin after losing A0 and A1")
ifsd.RollupCfg.SpanBatchTime==nil{
// before span batch hard fork
require.NotZero(t,verifier.L2Safe().Number,"still preserving old L2 blocks that did not reference reorged L1 chain (assuming more than one L2 block per L1 block)")
require.Equal(t,verifier.L2Safe(),verifier.L2Unsafe(),"head is at safe block after L1 reorg")
}else{
// after span batch hard fork
require.Zero(t,verifier.L2Safe().Number,"safe head is at genesis block because span batch referenced reorged L1 chain is not accepted")
require.Equal(t,verifier.L2Unsafe().ID(),sequencer.L2Unsafe().ParentID(),"head is at the highest unsafe block that references canonical L1 chain(genesis block)")
batcher.l2BufferedBlock=eth.L2BlockRef{}// must reset batcher to resubmit blocks included in the last batch
}
checkVerifEngine()
// and sync the sequencer, then build some new L2 blocks, up to and including with L1 origin B2
eq.log.Warn("L2 reorg: existing unsafe block does not match derived attributes from L1","err",err,"unsafe",eq.unsafeHead,"pending_safe",eq.pendingSafeHead,"safe",eq.safeHead)
// geth cannot wind back a chain without reorging to a new, previously non-canonical, block