// Now sync the verifier. The batch from chain A is invalid, so it should have been ignored.
// The safe head should have an origin at block B42
verifier.ActL1HeadSignal(t)
verifier.ActL2PipelineFull(t)
// Ensure that the L2 Safe block is B42
require.Equal(t,uint64(42),verifier.L2Safe().L1Origin.Number,"expected to be at block #42 after losing A40-61")
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(),"L2 safe and unsafe head should be equal")
checkVerifEngine()
// Sync the sequencer, then build some new L2 blocks, up to and including with L1 origin B62
// Sync the verifier to the L2 chain with origin B62
// Run an iteration of the derivation pipeline and ensure that the L2 safe L1 origin is block B62
verifier.ActL1HeadSignal(t)
verifier.ActL2PipelineFull(t)
require.Equal(t,uint64(42),verifier.L2Safe().L1Origin.Number,"expected to be at block #42 after losing A40-61 and building 23 blocks on reorged chain")
require.Equal(t,verifier.L2Safe(),verifier.L2Unsafe(),"L2 safe and unsafe head should be equal")
checkVerifEngine()
// Ensure that the parent of the L2 block containing Alice's transaction still exists
log.Warn("batch timestamp is less than L1 origin timestamp","l2_timestamp",batch.Batch.Timestamp,"l1_timestamp",batchOrigin.Time,"origin",batchOrigin.ID())
returnBatchDrop
}
// If we ran out of sequencer time drift, then we drop the batch and produce an empty batch instead,
// If we ran out of sequencer time drift, then we drop the batch and produce an empty batch instead,
// as the sequencer is not allowed to include anything past this point without moving to the next epoch.
// as the sequencer is not allowed to include anything past this point without moving to the next epoch.
- The outer min gas limit is for the call from the `OptimismPortal` to the `L1CrossDomainMessenger`, and it can be retrieved by calling the xdm's `baseGas` function with the `message` and inner limit.
- The inner min gas limit is for the call from the `L1CrossDomainMessenger` to the target contract.
This invariant asserts that there is no chain of calls that can be made that will prevent a withdrawal from being finalized exactly `FINALIZATION_PERIOD_SECONDS` after it was successfully proven.
## Deposits of any value should always succeed unless `_to` = `address(0)` or `_isCreation` = `true`.
If the last block used more than the target amount of gas (and there were no empty blocks in between), ensure this block's baseFee increased, but not by more than the max amount per block.
## The base fee should decrease if the last block used less than the target amount of gas
After a block consumes more gas than the target gas, the base fee cannot be raised more than the maximum amount allowed. The max base fee change (per-block) is derived as follows: `prevBaseFee / BASE_FEE_MAX_CHANGE_DENOMINATOR`
## The base fee can never be lowered more than the max base fee change.
After a block consumes less than the target gas, the base fee cannot be lowered more than the maximum amount allowed. The max base fee change (per-block) is derived as follows: `prevBaseFee / BASE_FEE_MAX_CHANGE_DENOMINATOR`
## The `maxBaseFeeChange` calculation over multiple blocks can never underflow.