From 2b7ac7621d6e1340a6784e6f9978bdc3d8fbbd89 Mon Sep 17 00:00:00 2001 From: adaki2004 Date: Fri, 12 Jan 2024 13:09:29 +0530 Subject: [PATCH 01/10] AssignmentHook changes: - add chainId to hashed assignment - prevent replay and then repay of bind in the same assigmenthook array --- packages/protocol/contracts/L1/hooks/AssignmentHook.sol | 8 +++++--- packages/protocol/contracts/L1/libs/LibProposing.sol | 6 ++++-- packages/protocol/test/L1/TaikoL1TestBase.sol | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/packages/protocol/contracts/L1/hooks/AssignmentHook.sol b/packages/protocol/contracts/L1/hooks/AssignmentHook.sol index 0c2637ddb4d..4ef3f2eab26 100644 --- a/packages/protocol/contracts/L1/hooks/AssignmentHook.sol +++ b/packages/protocol/contracts/L1/hooks/AssignmentHook.sol @@ -32,7 +32,7 @@ contract AssignmentHook is EssentialContract, IHook { uint64 expiry; uint64 maxBlockId; uint64 maxProposedIn; - bytes32 metaHash; + uint64 chainId; TaikoData.TierFee[] tierFees; bytes signature; } @@ -76,7 +76,6 @@ contract AssignmentHook is EssentialContract, IHook { // Check assignment validity if ( block.timestamp > assignment.expiry - || assignment.metaHash != 0 && blk.metaHash != assignment.metaHash || assignment.maxBlockId != 0 && meta.id > assignment.maxBlockId || assignment.maxProposedIn != 0 && block.number > assignment.maxProposedIn ) { @@ -120,7 +119,9 @@ contract AssignmentHook is EssentialContract, IHook { refund = msg.value - input.tip; } // Paying ERC20 tokens - IERC20(assignment.feeToken).safeTransferFrom(msg.sender, blk.assignedProver, proverFee); + IERC20(assignment.feeToken).safeTransferFrom( + meta.coinbase, blk.assignedProver, proverFee + ); } // block.coinbase can be address(0) in tests @@ -149,6 +150,7 @@ contract AssignmentHook is EssentialContract, IHook { "PROVER_ASSIGNMENT", taikoAddress, blobHash, + assignment.chainId, assignment.feeToken, assignment.expiry, assignment.maxBlockId, diff --git a/packages/protocol/contracts/L1/libs/LibProposing.sol b/packages/protocol/contracts/L1/libs/LibProposing.sol index ada8cefa5a9..92f2cb6bc2e 100644 --- a/packages/protocol/contracts/L1/libs/LibProposing.sol +++ b/packages/protocol/contracts/L1/libs/LibProposing.sol @@ -261,8 +261,10 @@ library LibProposing { } // Check that after hooks, the Taiko Token balance of this contract - // have increased by at least config.livenessBond - if (tko.balanceOf(address(this)) < tkoBalance + config.livenessBond) { + // have increased by the same amount as config.livenessBond (to prevent) + // multiple draining payments by a malicious proposer nesting the same + // hook. + if (tko.balanceOf(address(this)) != tkoBalance + config.livenessBond) { revert L1_LIVENESS_BOND_NOT_RECEIVED(); } } diff --git a/packages/protocol/test/L1/TaikoL1TestBase.sol b/packages/protocol/test/L1/TaikoL1TestBase.sol index 900bae377ca..322a208cf93 100644 --- a/packages/protocol/test/L1/TaikoL1TestBase.sol +++ b/packages/protocol/test/L1/TaikoL1TestBase.sol @@ -198,7 +198,7 @@ abstract contract TaikoL1TestBase is TaikoTest { expiry: uint64(block.timestamp + 60 minutes), maxBlockId: 0, maxProposedIn: 0, - metaHash: 0, + chainId: uint64(block.chainid), signature: new bytes(0) }); From 9b290ed895b5bfee9a06a4dabb3557cd134710c8 Mon Sep 17 00:00:00 2001 From: adaki2004 Date: Fri, 12 Jan 2024 20:48:44 +0530 Subject: [PATCH 02/10] Brecht and David comments --- packages/protocol/contracts/L1/TaikoErrors.sol | 1 + .../protocol/contracts/L1/hooks/AssignmentHook.sol | 10 +++++++--- packages/protocol/contracts/L1/libs/LibProposing.sol | 5 +++++ packages/protocol/test/L1/TaikoL1TestBase.sol | 3 ++- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/packages/protocol/contracts/L1/TaikoErrors.sol b/packages/protocol/contracts/L1/TaikoErrors.sol index 52c6a25e53a..8972101c517 100644 --- a/packages/protocol/contracts/L1/TaikoErrors.sol +++ b/packages/protocol/contracts/L1/TaikoErrors.sol @@ -46,6 +46,7 @@ abstract contract TaikoErrors { error L1_PROVING_PAUSED(); error L1_RECEIVE_DISABLED(); error L1_TOO_MANY_BLOCKS(); + error L1_TOO_MANY_HOOKS(); error L1_TOO_MANY_TIERS(); error L1_TRANSITION_ID_ZERO(); error L1_TRANSITION_NOT_FOUND(); diff --git a/packages/protocol/contracts/L1/hooks/AssignmentHook.sol b/packages/protocol/contracts/L1/hooks/AssignmentHook.sol index 4ef3f2eab26..95d8bfa9890 100644 --- a/packages/protocol/contracts/L1/hooks/AssignmentHook.sol +++ b/packages/protocol/contracts/L1/hooks/AssignmentHook.sol @@ -29,10 +29,11 @@ contract AssignmentHook is EssentialContract, IHook { struct ProverAssignment { address feeToken; + uint64 chainId; uint64 expiry; uint64 maxBlockId; uint64 maxProposedIn; - uint64 chainId; + bytes32 metaHash; TaikoData.TierFee[] tierFees; bytes signature; } @@ -76,6 +77,7 @@ contract AssignmentHook is EssentialContract, IHook { // Check assignment validity if ( block.timestamp > assignment.expiry + || assignment.metaHash != 0 && blk.metaHash != assignment.metaHash || assignment.maxBlockId != 0 && meta.id > assignment.maxBlockId || assignment.maxProposedIn != 0 && block.number > assignment.maxProposedIn ) { @@ -142,15 +144,17 @@ contract AssignmentHook is EssentialContract, IHook { bytes32 blobHash ) public - pure + view returns (bytes32) { return keccak256( abi.encode( "PROVER_ASSIGNMENT", + assignment.chainId, taikoAddress, + address(this), + assignment.metaHash, blobHash, - assignment.chainId, assignment.feeToken, assignment.expiry, assignment.maxBlockId, diff --git a/packages/protocol/contracts/L1/libs/LibProposing.sol b/packages/protocol/contracts/L1/libs/LibProposing.sol index 92f2cb6bc2e..6581f384211 100644 --- a/packages/protocol/contracts/L1/libs/LibProposing.sol +++ b/packages/protocol/contracts/L1/libs/LibProposing.sol @@ -52,6 +52,7 @@ library LibProposing { error L1_LIVENESS_BOND_NOT_RECEIVED(); error L1_PROPOSER_NOT_EOA(); error L1_TOO_MANY_BLOCKS(); + error L1_TOO_MANY_HOOKS(); error L1_TXLIST_OFFSET(); error L1_TXLIST_SIZE(); error L1_UNAUTHORIZED(); @@ -243,6 +244,10 @@ library LibProposing { IERC20 tko = IERC20(resolver.resolve("taiko_token", false)); uint256 tkoBalance = tko.balanceOf(address(this)); + // Allow max one hook - for now - but keep the API for + // possibility to have more in the future. + if (params.hookCalls.length > 1) revert L1_TOO_MANY_HOOKS(); + // Run all hooks. // Note that address(this).balance has been updated with msg.value, // prior to any code in this function has been executed. diff --git a/packages/protocol/test/L1/TaikoL1TestBase.sol b/packages/protocol/test/L1/TaikoL1TestBase.sol index 322a208cf93..a9cdf383f6d 100644 --- a/packages/protocol/test/L1/TaikoL1TestBase.sol +++ b/packages/protocol/test/L1/TaikoL1TestBase.sol @@ -194,11 +194,12 @@ abstract contract TaikoL1TestBase is TaikoTest { AssignmentHook.ProverAssignment memory assignment = AssignmentHook.ProverAssignment({ feeToken: address(0), + chainId: uint64(block.chainid), tierFees: tierFees, expiry: uint64(block.timestamp + 60 minutes), maxBlockId: 0, maxProposedIn: 0, - chainId: uint64(block.chainid), + metaHash: 0, signature: new bytes(0) }); From f768e9a1c164574094504287f1f65b0a012a32aa Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Sat, 13 Jan 2024 12:36:43 +0800 Subject: [PATCH 03/10] Update AssignmentHook.sol --- .../contracts/L1/hooks/AssignmentHook.sol | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/packages/protocol/contracts/L1/hooks/AssignmentHook.sol b/packages/protocol/contracts/L1/hooks/AssignmentHook.sol index 95d8bfa9890..ab3ef9aa8ee 100644 --- a/packages/protocol/contracts/L1/hooks/AssignmentHook.sol +++ b/packages/protocol/contracts/L1/hooks/AssignmentHook.sol @@ -40,7 +40,7 @@ contract AssignmentHook is EssentialContract, IHook { struct Input { ProverAssignment assignment; - uint256 tip; + uint256 builderTip; // A tip to L1 block builder } // Max gas paying the prover. This should be large enough to prevent the @@ -103,32 +103,31 @@ contract AssignmentHook is EssentialContract, IHook { // Ether or ERC20 tokens. uint256 refund; if (assignment.feeToken == address(0)) { - if (msg.value < proverFee + input.tip) { + uint256 totalFee = proverFee + input.builderTip; + if (msg.value < totalFee) { revert HOOK_ASSIGNMENT_INSUFFICIENT_FEE(); } unchecked { - refund = msg.value - proverFee - input.tip; + refund = msg.value - totalFee; } // Paying Ether blk.assignedProver.sendEther(proverFee, MAX_GAS_PAYING_PROVER); } else { - if (msg.value < input.tip) { + if (msg.value < input.builderTip) { revert HOOK_ASSIGNMENT_INSUFFICIENT_FEE(); } unchecked { - refund = msg.value - input.tip; + refund = msg.value - input.builderTip; } // Paying ERC20 tokens - IERC20(assignment.feeToken).safeTransferFrom( - meta.coinbase, blk.assignedProver, proverFee - ); + IERC20(assignment.feeToken).safeTransferFrom(msg.sender, blk.assignedProver, proverFee); } // block.coinbase can be address(0) in tests - if (input.tip != 0 && block.coinbase != address(0)) { - address(block.coinbase).sendEther(input.tip); + if (input.builderTip != 0 && block.coinbase != address(0)) { + address(block.coinbase).sendEther(input.builderTip); } if (refund != 0) { From ba794eaa0521202648399db5d00e330c9b8ff50a Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Sat, 13 Jan 2024 12:43:19 +0800 Subject: [PATCH 04/10] Update AssignmentHook.sol --- packages/protocol/contracts/L1/hooks/AssignmentHook.sol | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/protocol/contracts/L1/hooks/AssignmentHook.sol b/packages/protocol/contracts/L1/hooks/AssignmentHook.sol index ab3ef9aa8ee..8970c18c2c3 100644 --- a/packages/protocol/contracts/L1/hooks/AssignmentHook.sol +++ b/packages/protocol/contracts/L1/hooks/AssignmentHook.sol @@ -71,6 +71,7 @@ contract AssignmentHook is EssentialContract, IHook { nonReentrant onlyFromNamed("taiko") { + // Note that 'msg.sender' is the TaikoL1 contract address. Input memory input = abi.decode(data, (Input)); ProverAssignment memory assignment = input.assignment; @@ -122,7 +123,9 @@ contract AssignmentHook is EssentialContract, IHook { refund = msg.value - input.builderTip; } // Paying ERC20 tokens - IERC20(assignment.feeToken).safeTransferFrom(msg.sender, blk.assignedProver, proverFee); + IERC20(assignment.feeToken).safeTransferFrom( + meta.coinbase, blk.assignedProver, proverFee + ); } // block.coinbase can be address(0) in tests @@ -131,6 +134,7 @@ contract AssignmentHook is EssentialContract, IHook { } if (refund != 0) { + // Send all remaininger Ether back to TaikoL1 contract msg.sender.sendEther(refund); } From 2b74b29337c9fedf015a99a28328600a1f7ffd5a Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Sat, 13 Jan 2024 12:43:57 +0800 Subject: [PATCH 05/10] Update AssignmentHook.sol --- .../protocol/contracts/L1/hooks/AssignmentHook.sol | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/protocol/contracts/L1/hooks/AssignmentHook.sol b/packages/protocol/contracts/L1/hooks/AssignmentHook.sol index 8970c18c2c3..de0786a20f1 100644 --- a/packages/protocol/contracts/L1/hooks/AssignmentHook.sol +++ b/packages/protocol/contracts/L1/hooks/AssignmentHook.sol @@ -40,7 +40,7 @@ contract AssignmentHook is EssentialContract, IHook { struct Input { ProverAssignment assignment; - uint256 builderTip; // A tip to L1 block builder + uint256 tip; // A tip to L1 block builder } // Max gas paying the prover. This should be large enough to prevent the @@ -104,7 +104,7 @@ contract AssignmentHook is EssentialContract, IHook { // Ether or ERC20 tokens. uint256 refund; if (assignment.feeToken == address(0)) { - uint256 totalFee = proverFee + input.builderTip; + uint256 totalFee = proverFee + input.tip; if (msg.value < totalFee) { revert HOOK_ASSIGNMENT_INSUFFICIENT_FEE(); } @@ -116,11 +116,11 @@ contract AssignmentHook is EssentialContract, IHook { // Paying Ether blk.assignedProver.sendEther(proverFee, MAX_GAS_PAYING_PROVER); } else { - if (msg.value < input.builderTip) { + if (msg.value < input.tip) { revert HOOK_ASSIGNMENT_INSUFFICIENT_FEE(); } unchecked { - refund = msg.value - input.builderTip; + refund = msg.value - input.tip; } // Paying ERC20 tokens IERC20(assignment.feeToken).safeTransferFrom( @@ -129,8 +129,8 @@ contract AssignmentHook is EssentialContract, IHook { } // block.coinbase can be address(0) in tests - if (input.builderTip != 0 && block.coinbase != address(0)) { - address(block.coinbase).sendEther(input.builderTip); + if (input.tip != 0 && block.coinbase != address(0)) { + address(block.coinbase).sendEther(input.tip); } if (refund != 0) { From bea1787d0bd11015fd3c09fa4166493dbe52478b Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Sat, 13 Jan 2024 12:48:19 +0800 Subject: [PATCH 06/10] Update AssignmentHook.sol --- .../contracts/L1/hooks/AssignmentHook.sol | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/packages/protocol/contracts/L1/hooks/AssignmentHook.sol b/packages/protocol/contracts/L1/hooks/AssignmentHook.sol index de0786a20f1..fe62bc2cf0b 100644 --- a/packages/protocol/contracts/L1/hooks/AssignmentHook.sol +++ b/packages/protocol/contracts/L1/hooks/AssignmentHook.sol @@ -71,7 +71,11 @@ contract AssignmentHook is EssentialContract, IHook { nonReentrant onlyFromNamed("taiko") { - // Note that 'msg.sender' is the TaikoL1 contract address. + // Note that + // - 'msg.sender' is the TaikoL1 contract address + // - 'block.coinbase' is the L1 block builder + // - 'meta.coinbase' is the L2 block proposer + Input memory input = abi.decode(data, (Input)); ProverAssignment memory assignment = input.assignment; @@ -87,7 +91,8 @@ contract AssignmentHook is EssentialContract, IHook { // Hash the assignment with the blobHash, this hash will be signed by // the prover, therefore, we add a string as a prefix. - bytes32 hash = hashAssignment(assignment, msg.sender, meta.blobHash); + address taikoL1Address = msg.sender; + bytes32 hash = hashAssignment(assignment, taikoL1Address, meta.blobHash); if (!blk.assignedProver.isValidSignature(hash, assignment.signature)) { revert HOOK_ASSIGNMENT_INVALID_SIG(); @@ -95,7 +100,7 @@ contract AssignmentHook is EssentialContract, IHook { // Send the liveness bond to the Taiko contract IERC20 tko = IERC20(resolve("taiko_token", false)); - tko.transferFrom(blk.assignedProver, msg.sender, blk.livenessBond); + tko.transferFrom(blk.assignedProver, taikoL1Address, blk.livenessBond); // Find the prover fee using the minimal tier uint256 proverFee = _getProverFee(assignment.tierFees, meta.minTier); @@ -135,7 +140,7 @@ contract AssignmentHook is EssentialContract, IHook { if (refund != 0) { // Send all remaininger Ether back to TaikoL1 contract - msg.sender.sendEther(refund); + taikoL1Address.sendEther(refund); } emit BlockAssigned(blk.assignedProver, meta, assignment); @@ -143,7 +148,7 @@ contract AssignmentHook is EssentialContract, IHook { function hashAssignment( ProverAssignment memory assignment, - address taikoAddress, + address taikoL1Address, bytes32 blobHash ) public @@ -154,7 +159,7 @@ contract AssignmentHook is EssentialContract, IHook { abi.encode( "PROVER_ASSIGNMENT", assignment.chainId, - taikoAddress, + taikoL1Address, address(this), assignment.metaHash, blobHash, From 1f02544e497587eba823e0015197a3d96477d6bd Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Sat, 13 Jan 2024 15:08:55 +0800 Subject: [PATCH 07/10] fix(protocol): hash L1 chain id to assignment hook (#15490) --- packages/protocol/contracts/L1/ITaikoL1.sol | 4 ++++ packages/protocol/contracts/L1/TaikoL1.sol | 5 ++--- packages/protocol/contracts/L1/hooks/AssignmentHook.sol | 4 ++-- packages/protocol/test/L1/TaikoL1TestBase.sol | 1 - 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/protocol/contracts/L1/ITaikoL1.sol b/packages/protocol/contracts/L1/ITaikoL1.sol index 46aac217bef..df94d42190e 100644 --- a/packages/protocol/contracts/L1/ITaikoL1.sol +++ b/packages/protocol/contracts/L1/ITaikoL1.sol @@ -43,4 +43,8 @@ interface ITaikoL1 { /// @notice Verifies up to a certain number of blocks. /// @param maxBlocksToVerify Max number of blocks to verify. function verifyBlocks(uint64 maxBlocksToVerify) external; + + /// @notice Gets the configuration of the TaikoL1 contract. + /// @return Config struct containing configuration parameters. + function getConfig() external view returns (TaikoData.Config memory); } diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol index 948eb385547..2efee8cd8a4 100644 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ b/packages/protocol/contracts/L1/TaikoL1.sol @@ -203,9 +203,8 @@ contract TaikoL1 is return ITierProvider(resolve("tier_provider", false)).getMinTier(rand); } - /// @notice Gets the configuration of the TaikoL1 contract. - /// @return Config struct containing configuration parameters. - function getConfig() public view virtual returns (TaikoData.Config memory) { + /// @inheritdoc ITaikoL1 + function getConfig() public view virtual override returns (TaikoData.Config memory) { // All hard-coded configurations: // - treasury: the actual TaikoL2 address. // - blockMaxTxs: 150 (limited by the PSE zkEVM circuits) diff --git a/packages/protocol/contracts/L1/hooks/AssignmentHook.sol b/packages/protocol/contracts/L1/hooks/AssignmentHook.sol index fe62bc2cf0b..fa589085348 100644 --- a/packages/protocol/contracts/L1/hooks/AssignmentHook.sol +++ b/packages/protocol/contracts/L1/hooks/AssignmentHook.sol @@ -18,6 +18,7 @@ import "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; import "lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol"; import "../../common/EssentialContract.sol"; import "../../libs/LibAddress.sol"; +import "../ITaikoL1.sol"; import "../TaikoData.sol"; import "./IHook.sol"; @@ -29,7 +30,6 @@ contract AssignmentHook is EssentialContract, IHook { struct ProverAssignment { address feeToken; - uint64 chainId; uint64 expiry; uint64 maxBlockId; uint64 maxProposedIn; @@ -158,7 +158,7 @@ contract AssignmentHook is EssentialContract, IHook { return keccak256( abi.encode( "PROVER_ASSIGNMENT", - assignment.chainId, + ITaikoL1(taikoL1Address).getConfig().chainId, taikoL1Address, address(this), assignment.metaHash, diff --git a/packages/protocol/test/L1/TaikoL1TestBase.sol b/packages/protocol/test/L1/TaikoL1TestBase.sol index a9cdf383f6d..900bae377ca 100644 --- a/packages/protocol/test/L1/TaikoL1TestBase.sol +++ b/packages/protocol/test/L1/TaikoL1TestBase.sol @@ -194,7 +194,6 @@ abstract contract TaikoL1TestBase is TaikoTest { AssignmentHook.ProverAssignment memory assignment = AssignmentHook.ProverAssignment({ feeToken: address(0), - chainId: uint64(block.chainid), tierFees: tierFees, expiry: uint64(block.timestamp + 60 minutes), maxBlockId: 0, From 78b88c1d0f47cfa8905c3c398e4b1dbee64d6328 Mon Sep 17 00:00:00 2001 From: adaki2004 Date: Sat, 13 Jan 2024 12:44:54 +0530 Subject: [PATCH 08/10] remove 1-hook limit --- packages/protocol/contracts/L1/TaikoErrors.sol | 1 - packages/protocol/contracts/L1/libs/LibProposing.sol | 4 ---- 2 files changed, 5 deletions(-) diff --git a/packages/protocol/contracts/L1/TaikoErrors.sol b/packages/protocol/contracts/L1/TaikoErrors.sol index 8972101c517..52c6a25e53a 100644 --- a/packages/protocol/contracts/L1/TaikoErrors.sol +++ b/packages/protocol/contracts/L1/TaikoErrors.sol @@ -46,7 +46,6 @@ abstract contract TaikoErrors { error L1_PROVING_PAUSED(); error L1_RECEIVE_DISABLED(); error L1_TOO_MANY_BLOCKS(); - error L1_TOO_MANY_HOOKS(); error L1_TOO_MANY_TIERS(); error L1_TRANSITION_ID_ZERO(); error L1_TRANSITION_NOT_FOUND(); diff --git a/packages/protocol/contracts/L1/libs/LibProposing.sol b/packages/protocol/contracts/L1/libs/LibProposing.sol index 6581f384211..7e9808bd543 100644 --- a/packages/protocol/contracts/L1/libs/LibProposing.sol +++ b/packages/protocol/contracts/L1/libs/LibProposing.sol @@ -244,10 +244,6 @@ library LibProposing { IERC20 tko = IERC20(resolver.resolve("taiko_token", false)); uint256 tkoBalance = tko.balanceOf(address(this)); - // Allow max one hook - for now - but keep the API for - // possibility to have more in the future. - if (params.hookCalls.length > 1) revert L1_TOO_MANY_HOOKS(); - // Run all hooks. // Note that address(this).balance has been updated with msg.value, // prior to any code in this function has been executed. From 48036e0d41d35986c395470dd79452d6df9b67f3 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Sat, 13 Jan 2024 15:49:11 +0800 Subject: [PATCH 09/10] Update LibProposing.sol --- packages/protocol/contracts/L1/libs/LibProposing.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/protocol/contracts/L1/libs/LibProposing.sol b/packages/protocol/contracts/L1/libs/LibProposing.sol index 7e9808bd543..92f2cb6bc2e 100644 --- a/packages/protocol/contracts/L1/libs/LibProposing.sol +++ b/packages/protocol/contracts/L1/libs/LibProposing.sol @@ -52,7 +52,6 @@ library LibProposing { error L1_LIVENESS_BOND_NOT_RECEIVED(); error L1_PROPOSER_NOT_EOA(); error L1_TOO_MANY_BLOCKS(); - error L1_TOO_MANY_HOOKS(); error L1_TXLIST_OFFSET(); error L1_TXLIST_SIZE(); error L1_UNAUTHORIZED(); From 08cab909e4cab27526b29226a22ea34675c2cc7e Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Sat, 13 Jan 2024 15:50:57 +0800 Subject: [PATCH 10/10] Update AssignmentHook.sol --- packages/protocol/contracts/L1/hooks/AssignmentHook.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/protocol/contracts/L1/hooks/AssignmentHook.sol b/packages/protocol/contracts/L1/hooks/AssignmentHook.sol index fa589085348..6a03d59c3f4 100644 --- a/packages/protocol/contracts/L1/hooks/AssignmentHook.sol +++ b/packages/protocol/contracts/L1/hooks/AssignmentHook.sol @@ -19,7 +19,6 @@ import "lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol"; import "../../common/EssentialContract.sol"; import "../../libs/LibAddress.sol"; import "../ITaikoL1.sol"; -import "../TaikoData.sol"; import "./IHook.sol"; /// @title AssignmentHook