Skip to content

Commit

Permalink
only check first index
Browse files Browse the repository at this point in the history
  • Loading branch information
cyberhorsey committed Jan 23, 2025
1 parent a79e6bd commit 9fda6ea
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 30 deletions.
42 changes: 20 additions & 22 deletions packages/protocol/contracts/layer1/based/ForcedInclusionStore.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -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 {
Expand All @@ -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;
Expand Down
16 changes: 12 additions & 4 deletions packages/protocol/test/layer1/based/ForcedInclusionStore.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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);
Expand All @@ -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();
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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",
Expand Down

0 comments on commit 9fda6ea

Please sign in to comment.