From 10d1da4382a242a3cca34f776bc277a734f13b8b Mon Sep 17 00:00:00 2001 From: 0xDiscotech <131301107+0xDiscotech@users.noreply.github.com> Date: Tue, 11 Nov 2025 19:05:45 -0300 Subject: [PATCH] feat: add check and interface --- src/RevShareContractsUpgrader.sol | 5 ++++ src/interfaces/IRevShareContractsUpgrader.sol | 25 +++++++++++++++++++ .../RevShareContractsUpgrader.t.sol | 22 ++++++++++++++-- 3 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 src/interfaces/IRevShareContractsUpgrader.sol diff --git a/src/RevShareContractsUpgrader.sol b/src/RevShareContractsUpgrader.sol index 889775934..2604daa24 100644 --- a/src/RevShareContractsUpgrader.sol +++ b/src/RevShareContractsUpgrader.sol @@ -30,6 +30,9 @@ contract RevShareContractsUpgrader { /// @notice Thrown when chain fees recipient is zero address error ChainFeesRecipientCannotBeZeroAddress(); + /// @notice Thrown when gas limit is zero + error GasLimitCannotBeZero(); + /// @notice Thrown when array is empty error EmptyArray(); @@ -64,6 +67,7 @@ contract RevShareContractsUpgrader { if (config.portal == address(0)) revert PortalCannotBeZeroAddress(); if (config.l1WithdrawerConfig.recipient == address(0)) revert L1WithdrawerRecipientCannotBeZeroAddress(); if (config.chainFeesRecipient == address(0)) revert ChainFeesRecipientCannotBeZeroAddress(); + if (config.l1WithdrawerConfig.gasLimit == 0) revert GasLimitCannotBeZero(); // Deploy L1Withdrawer and SuperchainRevenueShareCalculator address precalculatedCalculator = @@ -111,6 +115,7 @@ contract RevShareContractsUpgrader { if (config.portal == address(0)) revert PortalCannotBeZeroAddress(); if (config.l1WithdrawerConfig.recipient == address(0)) revert L1WithdrawerRecipientCannotBeZeroAddress(); if (config.chainFeesRecipient == address(0)) revert ChainFeesRecipientCannotBeZeroAddress(); + if (config.l1WithdrawerConfig.gasLimit == 0) revert GasLimitCannotBeZero(); // Deploy L1Withdrawer and SuperchainRevenueShareCalculator address calculator = diff --git a/src/interfaces/IRevShareContractsUpgrader.sol b/src/interfaces/IRevShareContractsUpgrader.sol new file mode 100644 index 000000000..6a63c9ffa --- /dev/null +++ b/src/interfaces/IRevShareContractsUpgrader.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface IRevShareContractsUpgrader { + error PortalCannotBeZeroAddress(); + error L1WithdrawerRecipientCannotBeZeroAddress(); + error ChainFeesRecipientCannotBeZeroAddress(); + error GasLimitCannotBeZero(); + error EmptyArray(); + + struct L1WithdrawerConfig { + uint256 minWithdrawalAmount; + address recipient; + uint32 gasLimit; + } + + struct RevShareConfig { + address portal; + L1WithdrawerConfig l1WithdrawerConfig; + address chainFeesRecipient; + } + + function upgradeAndSetupRevShare(RevShareConfig[] calldata _configs) external; + function setupRevShare(RevShareConfig[] calldata _configs) external; +} diff --git a/test/template/revenue-share-upgrade-path/RevShareContractsUpgrader.t.sol b/test/template/revenue-share-upgrade-path/RevShareContractsUpgrader.t.sol index 4bd823e9e..749c62935 100644 --- a/test/template/revenue-share-upgrade-path/RevShareContractsUpgrader.t.sol +++ b/test/template/revenue-share-upgrade-path/RevShareContractsUpgrader.t.sol @@ -400,6 +400,15 @@ contract RevShareContractsUpgrader_UpgradeAndSetupRevShare_Test is RevShareContr upgrader.upgradeAndSetupRevShare(configs); } + /// @notice Test that upgradeAndSetupRevShare reverts when gas limit is zero + function test_upgradeAndSetupRevShare_whenGasLimitIsZero_reverts() public { + RevShareContractsUpgrader.RevShareConfig[] memory configs = new RevShareContractsUpgrader.RevShareConfig[](1); + configs[0] = _createRevShareConfig(PORTAL_ONE, MIN_WITHDRAWAL_AMOUNT, L1_RECIPIENT_ONE, 0, CHAIN_FEES_RECIPIENT_ONE); + + vm.expectRevert(RevShareContractsUpgrader.GasLimitCannotBeZero.selector); + upgrader.upgradeAndSetupRevShare(configs); + } + /// @notice Fuzz test successful upgradeAndSetupRevShare with single chain function testFuzz_upgradeAndSetupRevShare_singleChain_succeeds( address _portal, @@ -412,7 +421,7 @@ contract RevShareContractsUpgrader_UpgradeAndSetupRevShare_Test is RevShareContr _assumeValidAddress(_portal); _assumeValidAddress(_l1Recipient); _assumeValidAddress(_chainFeesRecipient); - bound(_gasLimit, 1, type(uint32).max); + _gasLimit = uint32(bound(_gasLimit, 1, type(uint32).max)); RevShareContractsUpgrader.RevShareConfig[] memory configs = new RevShareContractsUpgrader.RevShareConfig[](1); configs[0] = _createRevShareConfig(_portal, _minWithdrawalAmount, _l1Recipient, _gasLimit, _chainFeesRecipient); @@ -529,6 +538,15 @@ contract RevShareContractsUpgrader_SetupRevShare_Test is RevShareContractsUpgrad upgrader.setupRevShare(configs); } + /// @notice Test that setupRevShare reverts when gas limit is zero + function test_setupRevShare_whenGasLimitIsZero_reverts() public { + RevShareContractsUpgrader.RevShareConfig[] memory configs = new RevShareContractsUpgrader.RevShareConfig[](1); + configs[0] = _createRevShareConfig(PORTAL_ONE, MIN_WITHDRAWAL_AMOUNT, L1_RECIPIENT_ONE, 0, CHAIN_FEES_RECIPIENT_ONE); + + vm.expectRevert(RevShareContractsUpgrader.GasLimitCannotBeZero.selector); + upgrader.setupRevShare(configs); + } + /// @notice Fuzz test successful setupRevShare with single chain function testFuzz_setupRevShare_singleChain_succeeds( address _portal, @@ -542,7 +560,7 @@ contract RevShareContractsUpgrader_SetupRevShare_Test is RevShareContractsUpgrad _assumeValidAddress(_portal); _assumeValidAddress(_l1Recipient); _assumeValidAddress(_chainFeesRecipient); - bound(_gasLimit, 1, type(uint32).max); + _gasLimit = uint32(bound(_gasLimit, 1, type(uint32).max)); RevShareContractsUpgrader.RevShareConfig[] memory configs = new RevShareContractsUpgrader.RevShareConfig[](1); configs[0] = _createRevShareConfig(_portal, _minWithdrawalAmount, _l1Recipient, _gasLimit, _chainFeesRecipient);