diff --git a/packages/protocol/contracts/layer1/based/LibProposing.sol b/packages/protocol/contracts/layer1/based/LibProposing.sol index b16d72a9b7b..ee76a93842d 100644 --- a/packages/protocol/contracts/layer1/based/LibProposing.sol +++ b/packages/protocol/contracts/layer1/based/LibProposing.sol @@ -36,6 +36,7 @@ library LibProposing { error L1_BLOB_NOT_AVAILABLE(); error L1_BLOB_NOT_FOUND(); + error L1_FORK_HEIGHT_ERROR(); error L1_INVALID_ANCHOR_BLOCK(); error L1_INVALID_CUSTOM_PROPOSER(); error L1_INVALID_PARAMS(); @@ -130,9 +131,11 @@ library LibProposing { // It's essential to ensure that the ring buffer for proposed blocks still has space for at // least one more block. unchecked { - if (local.b.numBlocks >= local.b.lastVerifiedBlockId + _config.blockMaxProposals + 1) { - revert L1_TOO_MANY_BLOCKS(); - } + require(local.b.numBlocks >= _config.ontakeForkHeight, L1_FORK_HEIGHT_ERROR()); + require( + local.b.numBlocks < local.b.lastVerifiedBlockId + _config.blockMaxProposals + 1, + L1_TOO_MANY_BLOCKS() + ); } address preconfTaskManager = _resolver.resolve(LibStrings.B_PRECONF_TASK_MANAGER, true); diff --git a/packages/protocol/contracts/layer1/based/TaikoL1.sol b/packages/protocol/contracts/layer1/based/TaikoL1.sol index bce9eb6daba..871aa363b8d 100644 --- a/packages/protocol/contracts/layer1/based/TaikoL1.sol +++ b/packages/protocol/contracts/layer1/based/TaikoL1.sol @@ -25,6 +25,8 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { uint256[50] private __gap; + error L1_FORK_HEIGHT_ERROR(); + modifier whenProvingNotPaused() { if (state.slotB.provingPaused) revert LibProving.L1_PROVING_PAUSED(); _; @@ -179,12 +181,16 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { /// @param _blockId Index of the block. /// @return blk_ The block. function getBlock(uint64 _blockId) external view returns (TaikoData.Block memory blk_) { + require(_blockId < getConfig().ontakeForkHeight, L1_FORK_HEIGHT_ERROR()); + (TaikoData.BlockV2 memory blk,) = LibUtils.getBlock(state, getConfig(), _blockId); blk_ = LibData.blockV2ToV1(blk); } /// @inheritdoc ITaikoL1 function getBlockV2(uint64 _blockId) external view returns (TaikoData.BlockV2 memory blk_) { + require(_blockId >= getConfig().ontakeForkHeight, L1_FORK_HEIGHT_ERROR()); + (blk_,) = LibUtils.getBlock(state, getConfig(), _blockId); } diff --git a/packages/protocol/test/layer1/based/TaikoL1.t.sol b/packages/protocol/test/layer1/based/TaikoL1.t.sol index d950a1c777a..3289979f193 100644 --- a/packages/protocol/test/layer1/based/TaikoL1.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1.t.sol @@ -11,6 +11,7 @@ contract TaikoL1_NoCooldown is TaikoL1 { config.blockMaxProposals = 10; config.blockRingBufferSize = 12; config.livenessBond = 1e18; // 1 Taiko token + config.ontakeForkHeight = 0; } } diff --git a/packages/protocol/test/layer1/based/TaikoL1LibProvingWithTiers.t.sol b/packages/protocol/test/layer1/based/TaikoL1LibProvingWithTiers.t.sol index 04d8f2da1eb..d27eb8a968c 100644 --- a/packages/protocol/test/layer1/based/TaikoL1LibProvingWithTiers.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1LibProvingWithTiers.t.sol @@ -11,6 +11,7 @@ contract TaikoL1Tiers is TaikoL1 { config.blockMaxProposals = 10; config.blockRingBufferSize = 12; config.livenessBond = 1e18; // 1 Taiko token + config.ontakeForkHeight = 0; } } diff --git a/packages/protocol/test/layer1/based/TaikoL1TestGroupBase.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroupBase.sol index 5d45d0ef695..6accc380dc8 100644 --- a/packages/protocol/test/layer1/based/TaikoL1TestGroupBase.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroupBase.sol @@ -10,6 +10,7 @@ contract TaikoL1New is TaikoL1 { config.blockMaxProposals = 20; config.blockRingBufferSize = 25; config.stateRootSyncInternal = 2; + config.ontakeForkHeight = 0; } }