From 9fda6eafe3480ce3fb0066159186d55a5f07cdb1 Mon Sep 17 00:00:00 2001 From: Jeffery Walsh Date: Thu, 23 Jan 2025 15:18:02 -0800 Subject: [PATCH] only check first index --- .../layer1/based/ForcedInclusionStore.sol | 42 +++++++++---------- .../layer1/based/ForcedInclusionStore.t.sol | 16 +++++-- .../based/ForcedInclusionStoreTestBase.sol | 9 ++-- 3 files changed, 37 insertions(+), 30 deletions(-) diff --git a/packages/protocol/contracts/layer1/based/ForcedInclusionStore.sol b/packages/protocol/contracts/layer1/based/ForcedInclusionStore.sol index ed055319539..5b3fbb3f047 100644 --- a/packages/protocol/contracts/layer1/based/ForcedInclusionStore.sol +++ b/packages/protocol/contracts/layer1/based/ForcedInclusionStore.sol @@ -19,9 +19,12 @@ contract ForcedInclusionStore is EssentialContract, IForcedInclusionStore { uint64 forcedInclusionId; - uint256[45] private __gap; + uint256[44] private __gap; constructor(address _resolver, uint256 _inclusionWindow, uint256 _basePriorityFee) EssentialContract(_resolver) { + require(_inclusionWindow > 0, "inclusionWindow must be greater than 0"); + require(_basePriorityFee > 0, "basePriorityFee must be greater than 0"); + inclusionWindow = _inclusionWindow; basePriorityFee = _basePriorityFee; } @@ -35,10 +38,7 @@ contract ForcedInclusionStore is EssentialContract, IForcedInclusionStore { } function getRequiredPriorityFee() public view returns (uint256) { - if (forcedInclusions.length == 0) { - return basePriorityFee; - } - return (2 ** forcedInclusions.length).max(4096) * basePriorityFee; + return basePriorityFee; } function storeForcedInclusion(bytes32 blobHash, uint32 blobByteOffset, uint32 blobByteSize) payable external { @@ -59,25 +59,23 @@ contract ForcedInclusionStore is EssentialContract, IForcedInclusionStore { emit ForcedInclusionStored(forcedInclusion); } - /// @inheritdoc IForcedInclusionStore - function consumeForcedInclusion() external override returns (ForcedInclusion memory) { - address operator = resolve(LibStrings.B_TAIKO_FORCED_INCLUSION_INBOX, false); - require(msg.sender == operator, NotTaikoForcedInclusionInbox()); - - // get the first forced inclusion that is due to be included - for (uint256 i = 0; i < forcedInclusions.length; i++) { - ForcedInclusion storage inclusion = forcedInclusions[i]; - if (inclusion.timestamp + inclusionWindow <= block.timestamp) { - ForcedInclusion memory consumedInclusion = inclusion; - forcedInclusions[i] = forcedInclusions[forcedInclusions.length - 1]; - forcedInclusions.pop(); - - emit ForcedInclusionConsumed(consumedInclusion); - - return consumedInclusion; - } + function consumeForcedInclusion() external override returns (ForcedInclusion memory) { + if (forcedInclusions.length == 0) { + revert ForcedInclusionHashNotFound(); + } + + // we only need to check the first one, since it will be the oldest. + ForcedInclusion storage inclusion = forcedInclusions[0]; + if (inclusion.timestamp + inclusionWindow <= block.timestamp) { + inclusion.processed = true; + payable(msg.sender).transfer(inclusion.priorityFee); + ForcedInclusion memory consumedInclusion = inclusion; + forcedInclusions[0] = forcedInclusions[forcedInclusions.length - 1]; + forcedInclusions.pop(); + return consumedInclusion; } + // non found, return empty forcedInclusion struct ForcedInclusion memory forcedInclusion; return forcedInclusion; diff --git a/packages/protocol/test/layer1/based/ForcedInclusionStore.t.sol b/packages/protocol/test/layer1/based/ForcedInclusionStore.t.sol index 97f735c7e0d..38756c05e92 100644 --- a/packages/protocol/test/layer1/based/ForcedInclusionStore.t.sol +++ b/packages/protocol/test/layer1/based/ForcedInclusionStore.t.sol @@ -7,9 +7,11 @@ import "src/layer1/based/IForcedInclusionStore.sol"; contract ForcedInclusionStoreTest is ForcedInclusionStoreTestBase { function test_updateBasePriorityFee() public { + // get original fee + uint256 originalFee = store.basePriorityFee(); vm.prank(storeOwner); - store.updateBasePriorityFee(200); - assertEq(store.basePriorityFee(), 200); + store.updateBasePriorityFee(originalFee + 1); + assertEq(store.basePriorityFee(), originalFee + 1); } function test_updateBasePriorityFee_onlyOwner() public { @@ -43,9 +45,13 @@ contract ForcedInclusionStoreTest is ForcedInclusionStoreTestBase { uint32 blobByteOffset = 0; uint32 blobByteSize = 1024; + // get required fee + uint256 requiredFee = store.getRequiredPriorityFee(); + emit log_named_uint("Required Fee", requiredFee); vm.prank(Alice); + vm.deal(Alice, 1 ether); vm.expectRevert(IForcedInclusionStore.ForcedInclusionInsufficientPriorityFee.selector); - store.storeForcedInclusion{value: 0}(blobHash, blobByteOffset, blobByteSize); + store.storeForcedInclusion{value: requiredFee - 1}(blobHash, blobByteOffset, blobByteSize); IForcedInclusionStore.ForcedInclusion[] memory forcedInclusion = store.getForcedInclusions(); assertEq(forcedInclusion.length, 0); @@ -59,8 +65,10 @@ contract ForcedInclusionStoreTest is ForcedInclusionStoreTestBase { uint256 requiredFee = store.getRequiredPriorityFee(); vm.prank(Alice); - vm.deal(Alice, requiredFee * 2); + vm.deal(Alice, 1 ether); store.storeForcedInclusion{value: requiredFee}(blobHash1, blobByteOffset, blobByteSize); + + requiredFee = store.getRequiredPriorityFee(); store.storeForcedInclusion{value: requiredFee}(blobHash2, blobByteOffset, blobByteSize); IForcedInclusionStore.ForcedInclusion[] memory forcedInclusion = store.getForcedInclusions(); diff --git a/packages/protocol/test/layer1/based/ForcedInclusionStoreTestBase.sol b/packages/protocol/test/layer1/based/ForcedInclusionStoreTestBase.sol index 2f3ccf1363d..23c45ec5274 100644 --- a/packages/protocol/test/layer1/based/ForcedInclusionStoreTestBase.sol +++ b/packages/protocol/test/layer1/based/ForcedInclusionStoreTestBase.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.24; -import "../Layer1Test.sol"; +import "../../shared/CommonTest.sol"; import "src/layer1/based/ForcedInclusionStore.sol"; -abstract contract ForcedInclusionStoreTestBase is Layer1Test { +abstract contract ForcedInclusionStoreTestBase is CommonTest { ForcedInclusionStore internal store; address internal storeOwner; address internal operator; @@ -18,10 +18,11 @@ abstract contract ForcedInclusionStoreTestBase is Layer1Test { inclusionWindow = 10; basePriorityFee = 100; - vm.chainId(1); + vm.chainId(ethereumChainId); - resolver.registerAddress(block.chainid, "taiko_forced_inclusion_inbox", operator); + register("taiko_forced_inclusion_inbox", operator); + store = ForcedInclusionStore( deploy({ name: "forced_inclusion_store",