From d0b5acdb608f1308d9b41c22800ae7c4c8886576 Mon Sep 17 00:00:00 2001 From: tejks Date: Mon, 27 May 2024 13:21:51 +0200 Subject: [PATCH 1/6] feat: StateTransitionManager tests --- .../foundry/unit/concrete/Utils/Utils.sol | 5 +- .../AdminManagement.t.sol | 56 +++++++++ .../CreateNewChain.t.sol | 52 +++++++- .../StateTransitionManager/FreezeChain.t.sol | 18 +++ .../ProtocolVersion.t.sol | 113 ++++++++++++++++++ .../StateTransitionManagerSetters.t.sol | 112 +++++++++++++++++ .../_StateTransitionManager_Shared.t.sol | 26 +++- 7 files changed, 377 insertions(+), 5 deletions(-) create mode 100644 l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/AdminManagement.t.sol create mode 100644 l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/ProtocolVersion.t.sol create mode 100644 l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/StateTransitionManagerSetters.t.sol diff --git a/l1-contracts/test/foundry/unit/concrete/Utils/Utils.sol b/l1-contracts/test/foundry/unit/concrete/Utils/Utils.sol index 3b46d212a..4f01144a3 100644 --- a/l1-contracts/test/foundry/unit/concrete/Utils/Utils.sol +++ b/l1-contracts/test/foundry/unit/concrete/Utils/Utils.sol @@ -210,7 +210,7 @@ library Utils { } function getGettersSelectors() public pure returns (bytes4[] memory) { - bytes4[] memory selectors = new bytes4[](30); + bytes4[] memory selectors = new bytes4[](31); selectors[0] = GettersFacet.getVerifier.selector; selectors[1] = GettersFacet.getAdmin.selector; selectors[2] = GettersFacet.getPendingAdmin.selector; @@ -240,7 +240,8 @@ library Utils { selectors[26] = GettersFacet.getTotalBatchesVerified.selector; selectors[27] = GettersFacet.getTotalBatchesExecuted.selector; selectors[28] = GettersFacet.getL2SystemContractsUpgradeTxHash.selector; - selectors[29] = GettersFacet.getChainId.selector; + selectors[29] = GettersFacet.baseTokenGasPriceMultiplierDenominator.selector; + selectors[30] = GettersFacet.baseTokenGasPriceMultiplierNominator.selector; return selectors; } diff --git a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/AdminManagement.t.sol b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/AdminManagement.t.sol new file mode 100644 index 000000000..0afc8db74 --- /dev/null +++ b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/AdminManagement.t.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import {StateTransitionManagerTest} from "./_StateTransitionManager_Shared.t.sol"; +import {Diamond} from "contracts/state-transition/libraries/Diamond.sol"; + +contract AdminManagement is StateTransitionManagerTest { + function test_RevertWhen_IsNotAdminOrOwner() public { + address newAdmin = makeAddr("newadmin"); + + vm.stopPrank(); + vm.prank(newAdmin); + vm.expectRevert(bytes("STM: not owner or admin")); + chainContractAddress.setPendingAdmin(newAdmin); + } + + function test_SuccessfulSetPendingAdmin() public { + address newAdmin = makeAddr("newadmin"); + + chainContractAddress.setPendingAdmin(newAdmin); + } + + function test_RevertWhen_IsNotNewAdminSender() public { + address newAdmin = makeAddr("newadmin"); + address random = makeAddr("random"); + + chainContractAddress.setPendingAdmin(newAdmin); + + vm.stopPrank(); + vm.prank(random); + vm.expectRevert(bytes("n42")); + chainContractAddress.acceptAdmin(); + } + + function test_RevertWhen_PendingAdminNotExists() public { + address random = makeAddr("random"); + + vm.stopPrank(); + vm.prank(random); + vm.expectRevert(bytes("n42")); + chainContractAddress.acceptAdmin(); + } + + function test_SuccessfulAcceptPendingAdmin() public { + address newAdmin = makeAddr("newadmin"); + address random = makeAddr("random"); + + chainContractAddress.setPendingAdmin(newAdmin); + + vm.stopPrank(); + vm.prank(newAdmin); + chainContractAddress.acceptAdmin(); + + assertEq(chainContractAddress.admin(), newAdmin); + } +} diff --git a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/CreateNewChain.t.sol b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/CreateNewChain.t.sol index 0598779a4..03a0c0ad9 100644 --- a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/CreateNewChain.t.sol +++ b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/CreateNewChain.t.sol @@ -1,9 +1,10 @@ -// // SPDX-License-Identifier: MIT +// SPDX-License-Identifier: MIT pragma solidity 0.8.24; import {StateTransitionManagerTest} from "./_StateTransitionManager_Shared.t.sol"; import {Diamond} from "contracts/state-transition/libraries/Diamond.sol"; import {Unauthorized, HashMismatch} from "contracts/common/L1ContractErrors.sol"; +import {StateTransitionManager} from "contracts/state-transition/StateTransitionManager.sol"; contract createNewChainTest is StateTransitionManagerTest { function setUp() public { @@ -46,4 +47,53 @@ contract createNewChainTest is StateTransitionManagerTest { assertEq(newChainAdmin, admin); assertNotEq(newChainAddress, address(0)); } + + function test_SuccessfulCreationOfNewChainAndReturnChainIds() public { + createNewChain(getDiamondCutData(diamondInit)); + createNewChainWithId(getDiamondCutData(diamondInit), 10); + + uint256[] memory chainIds = chainContractAddress.getAllHyperchainChainIDs(); + assertEq(chainIds.length, 2); + assertEq(chainIds[0], chainId); + assertEq(chainIds[1], 10); + } + + function test_SuccessfulCreationOfNewChainAndReturnChainAddresses() public { + createNewChain(getDiamondCutData(diamondInit)); + createNewChainWithId(getDiamondCutData(diamondInit), 10); + + address[] memory hyperchainAddresses = chainContractAddress.getAllHyperchains(); + assertEq(hyperchainAddresses.length, 2); + assertEq(hyperchainAddresses[0], chainContractAddress.getHyperchain(chainId)); + assertEq(hyperchainAddresses[1], chainContractAddress.getHyperchain(10)); + } + + function test_RevertWhen_AlreadyDeployedHyperchainAddressIsZero() public { + vm.expectRevert(bytes("STM: hyperchain zero")); + + chainContractAddress.registerAlreadyDeployedHyperchain(chainId, address(0)); + } + + function test_SuccessfulRegisterAlreadyDeployedHyperchain() public { + address randomHyperchain = makeAddr("randomHyperchain"); + + chainContractAddress.registerAlreadyDeployedHyperchain(10, randomHyperchain); + + assertEq(chainContractAddress.getHyperchain(10), randomHyperchain); + } + + function test_RevertWhen_HyperchainLimitReached() public { + for (uint256 i = 0; i < MAX_NUMBER_OF_HYPERCHAINS; i++) { + createNewChainWithId(getDiamondCutData(diamondInit), 10 + i); + } + + uint256[] memory chainIds = chainContractAddress.getAllHyperchainChainIDs(); + assertEq(chainIds.length, MAX_NUMBER_OF_HYPERCHAINS); + + vm.stopPrank(); + vm.startPrank(governor); + + vm.expectRevert("STM: Hyperchain limit reached"); + chainContractAddress.registerAlreadyDeployedHyperchain(100, makeAddr("randomHyperchain")); + } } diff --git a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/FreezeChain.t.sol b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/FreezeChain.t.sol index 98dc2661e..fe5e7248d 100644 --- a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/FreezeChain.t.sol +++ b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/FreezeChain.t.sol @@ -32,4 +32,22 @@ contract freezeChainTest is StateTransitionManagerTest { vm.expectRevert(bytes("q1")); isChainFrozen = gettersFacet.isDiamondStorageFrozen(); } + + function test_RevertWhen_UnfreezingChain() public { + uint256 newChainid = 10; + createNewChainWithId(getDiamondCutData(diamondInit), newChainid); + + address newChainAddress = chainContractAddress.getHyperchain(newChainid); + GettersFacet gettersFacet = GettersFacet(newChainAddress); + bool isChainFrozen = gettersFacet.isDiamondStorageFrozen(); + assertEq(isChainFrozen, false); + + vm.stopPrank(); + vm.startPrank(governor); + + chainContractAddress.freezeChain(newChainid); + + vm.expectRevert(bytes.concat("q1")); + chainContractAddress.unfreezeChain(newChainid); + } } diff --git a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/ProtocolVersion.t.sol b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/ProtocolVersion.t.sol new file mode 100644 index 000000000..423052de1 --- /dev/null +++ b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/ProtocolVersion.t.sol @@ -0,0 +1,113 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import {StateTransitionManagerTest} from "./_StateTransitionManager_Shared.t.sol"; +import {Diamond} from "contracts/state-transition/libraries/Diamond.sol"; +import {GettersFacet} from "contracts/state-transition/chain-deps/facets/Getters.sol"; +import {UtilsFacet} from "foundry-test/unit/concrete/Utils/UtilsFacet.sol"; +import {FeeParams, PubdataPricingMode} from "contracts/state-transition/chain-deps/ZkSyncHyperchainStorage.sol"; + +contract ProtocolVersion is StateTransitionManagerTest { + // setNewVersionUpgrade + function test_SuccessfulSetNewVersionUpgrade() public { + createNewChain(getDiamondCutData(diamondInit)); + + vm.stopPrank(); + vm.startPrank(governor); + + uint256 oldProtocolVersion = chainContractAddress.protocolVersion(); + uint256 oldProtocolVersionDeadline = chainContractAddress.protocolVersionDeadline(oldProtocolVersion); + + assertEq(oldProtocolVersion, 0); + assertEq(oldProtocolVersionDeadline, type(uint256).max); + + chainContractAddress.setNewVersionUpgrade(getDiamondCutData(diamondInit), oldProtocolVersion, 1000, 1); + + uint256 newProtocolVersion = chainContractAddress.protocolVersion(); + uint256 newProtocolVersionDeadline = chainContractAddress.protocolVersionDeadline(newProtocolVersion); + + oldProtocolVersionDeadline = chainContractAddress.protocolVersionDeadline(oldProtocolVersion); + + assertEq(newProtocolVersion, 1); + assertEq(newProtocolVersionDeadline, type(uint256).max); + assertEq(oldProtocolVersionDeadline, 1000); + } + + // protocolVersionIsActive + function test_SuccessfulProtocolVersionIsActive() public { + createNewChain(getDiamondCutData(diamondInit)); + + vm.stopPrank(); + vm.startPrank(governor); + + chainContractAddress.setNewVersionUpgrade(getDiamondCutData(diamondInit), 0, 0, 1); + + assertEq(chainContractAddress.protocolVersionIsActive(0), false); + assertEq(chainContractAddress.protocolVersionIsActive(1), true); + } + + // setProtocolVersionDeadline + function test_SuccessfulSetProtocolVersionDeadline() public { + createNewChain(getDiamondCutData(diamondInit)); + + vm.stopPrank(); + vm.startPrank(governor); + + uint256 deadlineBefore = chainContractAddress.protocolVersionDeadline(0); + assertEq(deadlineBefore, type(uint256).max); + + uint256 newDeadline = 1000; + chainContractAddress.setProtocolVersionDeadline(0, newDeadline); + + uint256 deadline = chainContractAddress.protocolVersionDeadline(0); + assertEq(deadline, newDeadline); + } + + // executeUpgrade + function test_SuccessfulExecuteUpdate() public { + createNewChain(getDiamondCutData(diamondInit)); + + vm.stopPrank(); + vm.startPrank(governor); + + Diamond.FacetCut[] memory customFacetCuts = new Diamond.FacetCut[](1); + customFacetCuts[0] = Diamond.FacetCut({ + facet: facetCuts[2].facet, + action: Diamond.Action.Replace, + isFreezable: true, + selectors: facetCuts[2].selectors + }); + + chainContractAddress.executeUpgrade(chainId, getDiamondCutDataWithCustomFacets(address(0), customFacetCuts)); + } + + // upgradeChainFromVersion + function test_SuccessfulUpgradeChainFromVersion() public { + createNewChain(getDiamondCutData(diamondInit)); + + vm.stopPrank(); + vm.startPrank(governor); + + Diamond.FacetCut[] memory customFacetCuts = new Diamond.FacetCut[](1); + customFacetCuts[0] = Diamond.FacetCut({ + facet: facetCuts[2].facet, + action: Diamond.Action.Replace, + isFreezable: true, + selectors: facetCuts[2].selectors + }); + + chainContractAddress.setNewVersionUpgrade( + getDiamondCutDataWithCustomFacets(address(0), customFacetCuts), + 0, + 0, + 1 + ); + + vm.expectRevert(bytes("AdminFacet: protocolVersion mismatch in STC after upgrading")); + chainContractAddress.upgradeChainFromVersion( + chainId, + 0, + getDiamondCutDataWithCustomFacets(address(0), customFacetCuts) + ); + } +} diff --git a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/StateTransitionManagerSetters.t.sol b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/StateTransitionManagerSetters.t.sol new file mode 100644 index 000000000..4cd98548e --- /dev/null +++ b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/StateTransitionManagerSetters.t.sol @@ -0,0 +1,112 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import {StateTransitionManagerTest} from "./_StateTransitionManager_Shared.t.sol"; +import {Diamond} from "contracts/state-transition/libraries/Diamond.sol"; +import {GettersFacet} from "contracts/state-transition/chain-deps/facets/Getters.sol"; +import {UtilsFacet} from "foundry-test/unit/concrete/Utils/UtilsFacet.sol"; +import {FeeParams, PubdataPricingMode} from "contracts/state-transition/chain-deps/ZkSyncHyperchainStorage.sol"; + +contract StateTransitionManagerSetters is StateTransitionManagerTest { + // setPriorityTxMaxGasLimit + function test_SuccessfulSetPriorityTxMaxGasLimit() public { + createNewChain(getDiamondCutData(diamondInit)); + + address chainAddress = chainContractAddress.getHyperchain(chainId); + GettersFacet gettersFacet = GettersFacet(chainAddress); + + vm.stopPrank(); + vm.startPrank(governor); + + uint256 newMaxGasLimit = 1000; + chainContractAddress.setPriorityTxMaxGasLimit(chainId, newMaxGasLimit); + + uint256 maxGasLimit = gettersFacet.getPriorityTxMaxGasLimit(); + + assertEq(maxGasLimit, newMaxGasLimit); + } + + // setTokenMultiplier + function test_SuccessfulSetTokenMultiplier() public { + createNewChain(getDiamondCutData(diamondInit)); + + address chainAddress = chainContractAddress.getHyperchain(chainId); + GettersFacet gettersFacet = GettersFacet(chainAddress); + + vm.stopPrank(); + vm.startPrank(governor); + + uint128 newNominator = 1; + uint128 newDenominator = 1000; + chainContractAddress.setTokenMultiplier(chainId, newNominator, newDenominator); + + uint128 nominator = gettersFacet.baseTokenGasPriceMultiplierNominator(); + uint128 denominator = gettersFacet.baseTokenGasPriceMultiplierDenominator(); + + assertEq(newNominator, nominator); + assertEq(newDenominator, denominator); + } + + // changeFeeParams + function test_SuccessfulChangeFeeParams() public { + createNewChain(getDiamondCutData(diamondInit)); + + address chainAddress = chainContractAddress.getHyperchain(chainId); + UtilsFacet utilsFacet = UtilsFacet(chainAddress); + + vm.stopPrank(); + vm.startPrank(governor); + + FeeParams memory newFeeParams = FeeParams({ + pubdataPricingMode: PubdataPricingMode.Rollup, + batchOverheadL1Gas: 1000000, + maxPubdataPerBatch: 120000, + maxL2GasPerBatch: 80000000, + priorityTxMaxPubdata: 99000, + minimalL2GasPrice: 250000000 + }); + + chainContractAddress.changeFeeParams(chainId, newFeeParams); + + FeeParams memory feeParams = utilsFacet.util_getFeeParams(); + + assertEq(feeParams.batchOverheadL1Gas, newFeeParams.batchOverheadL1Gas); + assertEq(feeParams.maxPubdataPerBatch, newFeeParams.maxPubdataPerBatch); + assertEq(feeParams.maxL2GasPerBatch, newFeeParams.maxL2GasPerBatch); + assertEq(feeParams.priorityTxMaxPubdata, newFeeParams.priorityTxMaxPubdata); + assertEq(feeParams.minimalL2GasPrice, newFeeParams.minimalL2GasPrice); + } + + // setValidator + function test_SuccessfulSetValidator() public { + createNewChain(getDiamondCutData(diamondInit)); + + address chainAddress = chainContractAddress.getHyperchain(chainId); + GettersFacet gettersFacet = GettersFacet(chainAddress); + + vm.stopPrank(); + vm.startPrank(governor); + + address validator = address(0x1); + chainContractAddress.setValidator(chainId, validator, true); + + bool isActive = gettersFacet.isValidator(validator); + assertTrue(isActive); + } + + // setPorterAvailability + function test_SuccessfulSetPorterAvailability() public { + createNewChain(getDiamondCutData(diamondInit)); + + address chainAddress = chainContractAddress.getHyperchain(chainId); + UtilsFacet utilsFacet = UtilsFacet(chainAddress); + + vm.stopPrank(); + vm.startPrank(governor); + + chainContractAddress.setPorterAvailability(chainId, true); + + bool isAvailable = utilsFacet.util_getZkPorterAvailability(); + assertTrue(isAvailable); + } +} diff --git a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/_StateTransitionManager_Shared.t.sol b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/_StateTransitionManager_Shared.t.sol index 918cfa476..f67c93976 100644 --- a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/_StateTransitionManager_Shared.t.sol +++ b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/_StateTransitionManager_Shared.t.sol @@ -36,14 +36,16 @@ contract StateTransitionManagerTest is Test { uint256 chainId = block.chainid; address internal testnetVerifier = address(new TestnetVerifier()); + uint256 internal constant MAX_NUMBER_OF_HYPERCHAINS = 10; + Diamond.FacetCut[] internal facetCuts; function deploy() public { bridgehub = new Bridgehub(); newChainAdmin = makeAddr("chainadmin"); - vm.startPrank(address(bridgehub)); - stateTransitionManager = new StateTransitionManager(address(bridgehub), type(uint256).max); + vm.startPrank(bridgehub); + stateTransitionManager = new StateTransitionManager(bridgehub, MAX_NUMBER_OF_HYPERCHAINS); diamondInit = address(new DiamondInit()); genesisUpgradeContract = new GenesisUpgrade(); @@ -128,6 +130,13 @@ contract StateTransitionManagerTest is Test { return Diamond.DiamondCutData({facetCuts: facetCuts, initAddress: _diamondInit, initCalldata: initCalldata}); } + function getDiamondCutDataWithCustomFacets( + address _diamondInit, + Diamond.FacetCut[] memory _facetCuts + ) internal returns (Diamond.DiamondCutData memory) { + return Diamond.DiamondCutData({facetCuts: _facetCuts, initAddress: _diamondInit, initCalldata: bytes("")}); + } + function createNewChain(Diamond.DiamondCutData memory _diamondCut) internal { vm.stopPrank(); vm.startPrank(address(bridgehub)); @@ -141,6 +150,19 @@ contract StateTransitionManagerTest is Test { }); } + function createNewChainWithId(Diamond.DiamondCutData memory _diamondCut, uint256 id) internal { + vm.stopPrank(); + vm.startPrank(bridgehub); + + chainContractAddress.createNewChain({ + _chainId: id, + _baseToken: baseToken, + _sharedBridge: sharedBridge, + _admin: newChainAdmin, + _diamondCut: abi.encode(_diamondCut) + }); + } + // add this to be excluded from coverage report function test() internal virtual {} } From e71cd7baa916eb981ee6c5378b795caba368916d Mon Sep 17 00:00:00 2001 From: tejks Date: Mon, 27 May 2024 13:43:00 +0200 Subject: [PATCH 2/6] fix: Linter errors --- .../StateTransitionManager/AdminManagement.t.sol | 2 -- .../StateTransitionManager/ProtocolVersion.t.sol | 3 --- .../StateTransitionManager/StateTransitionManagerSetters.t.sol | 1 - 3 files changed, 6 deletions(-) diff --git a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/AdminManagement.t.sol b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/AdminManagement.t.sol index 0afc8db74..30d278d27 100644 --- a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/AdminManagement.t.sol +++ b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/AdminManagement.t.sol @@ -2,7 +2,6 @@ pragma solidity 0.8.24; import {StateTransitionManagerTest} from "./_StateTransitionManager_Shared.t.sol"; -import {Diamond} from "contracts/state-transition/libraries/Diamond.sol"; contract AdminManagement is StateTransitionManagerTest { function test_RevertWhen_IsNotAdminOrOwner() public { @@ -43,7 +42,6 @@ contract AdminManagement is StateTransitionManagerTest { function test_SuccessfulAcceptPendingAdmin() public { address newAdmin = makeAddr("newadmin"); - address random = makeAddr("random"); chainContractAddress.setPendingAdmin(newAdmin); diff --git a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/ProtocolVersion.t.sol b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/ProtocolVersion.t.sol index 423052de1..9ecfe85fd 100644 --- a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/ProtocolVersion.t.sol +++ b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/ProtocolVersion.t.sol @@ -3,9 +3,6 @@ pragma solidity 0.8.24; import {StateTransitionManagerTest} from "./_StateTransitionManager_Shared.t.sol"; import {Diamond} from "contracts/state-transition/libraries/Diamond.sol"; -import {GettersFacet} from "contracts/state-transition/chain-deps/facets/Getters.sol"; -import {UtilsFacet} from "foundry-test/unit/concrete/Utils/UtilsFacet.sol"; -import {FeeParams, PubdataPricingMode} from "contracts/state-transition/chain-deps/ZkSyncHyperchainStorage.sol"; contract ProtocolVersion is StateTransitionManagerTest { // setNewVersionUpgrade diff --git a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/StateTransitionManagerSetters.t.sol b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/StateTransitionManagerSetters.t.sol index 4cd98548e..8ef695a5b 100644 --- a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/StateTransitionManagerSetters.t.sol +++ b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/StateTransitionManagerSetters.t.sol @@ -2,7 +2,6 @@ pragma solidity 0.8.24; import {StateTransitionManagerTest} from "./_StateTransitionManager_Shared.t.sol"; -import {Diamond} from "contracts/state-transition/libraries/Diamond.sol"; import {GettersFacet} from "contracts/state-transition/chain-deps/facets/Getters.sol"; import {UtilsFacet} from "foundry-test/unit/concrete/Utils/UtilsFacet.sol"; import {FeeParams, PubdataPricingMode} from "contracts/state-transition/chain-deps/ZkSyncHyperchainStorage.sol"; From aa89a96399888d19254f1784335a9dad52307461 Mon Sep 17 00:00:00 2001 From: tejks Date: Wed, 29 May 2024 13:54:51 +0200 Subject: [PATCH 3/6] fix: Typos + vm governor pranking --- .../StateTransitionManager/AdminManagement.t.sol | 8 ++++---- .../StateTransitionManager/CreateNewChain.t.sol | 3 --- .../StateTransitionManager/FreezeChain.t.sol | 6 ------ .../StateTransitionManager/ProtocolVersion.t.sol | 15 --------------- .../StateTransitionManagerSetters.t.sol | 15 --------------- .../_StateTransitionManager_Shared.t.sol | 8 ++++++-- 6 files changed, 10 insertions(+), 45 deletions(-) diff --git a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/AdminManagement.t.sol b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/AdminManagement.t.sol index 30d278d27..28101918b 100644 --- a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/AdminManagement.t.sol +++ b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/AdminManagement.t.sol @@ -5,7 +5,7 @@ import {StateTransitionManagerTest} from "./_StateTransitionManager_Shared.t.sol contract AdminManagement is StateTransitionManagerTest { function test_RevertWhen_IsNotAdminOrOwner() public { - address newAdmin = makeAddr("newadmin"); + address newAdmin = makeAddr("newAdmin"); vm.stopPrank(); vm.prank(newAdmin); @@ -14,13 +14,13 @@ contract AdminManagement is StateTransitionManagerTest { } function test_SuccessfulSetPendingAdmin() public { - address newAdmin = makeAddr("newadmin"); + address newAdmin = makeAddr("newAdmin"); chainContractAddress.setPendingAdmin(newAdmin); } function test_RevertWhen_IsNotNewAdminSender() public { - address newAdmin = makeAddr("newadmin"); + address newAdmin = makeAddr("newAdmin"); address random = makeAddr("random"); chainContractAddress.setPendingAdmin(newAdmin); @@ -41,7 +41,7 @@ contract AdminManagement is StateTransitionManagerTest { } function test_SuccessfulAcceptPendingAdmin() public { - address newAdmin = makeAddr("newadmin"); + address newAdmin = makeAddr("newAdmin"); chainContractAddress.setPendingAdmin(newAdmin); diff --git a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/CreateNewChain.t.sol b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/CreateNewChain.t.sol index 03a0c0ad9..70248e30f 100644 --- a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/CreateNewChain.t.sol +++ b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/CreateNewChain.t.sol @@ -90,9 +90,6 @@ contract createNewChainTest is StateTransitionManagerTest { uint256[] memory chainIds = chainContractAddress.getAllHyperchainChainIDs(); assertEq(chainIds.length, MAX_NUMBER_OF_HYPERCHAINS); - vm.stopPrank(); - vm.startPrank(governor); - vm.expectRevert("STM: Hyperchain limit reached"); chainContractAddress.registerAlreadyDeployedHyperchain(100, makeAddr("randomHyperchain")); } diff --git a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/FreezeChain.t.sol b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/FreezeChain.t.sol index fe5e7248d..725b8afc3 100644 --- a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/FreezeChain.t.sol +++ b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/FreezeChain.t.sol @@ -19,9 +19,6 @@ contract freezeChainTest is StateTransitionManagerTest { bool isChainFrozen = gettersFacet.isDiamondStorageFrozen(); assertEq(isChainFrozen, false); - vm.stopPrank(); - vm.startPrank(governor); - chainContractAddress.freezeChain(block.chainid); // Repeated call should revert @@ -42,9 +39,6 @@ contract freezeChainTest is StateTransitionManagerTest { bool isChainFrozen = gettersFacet.isDiamondStorageFrozen(); assertEq(isChainFrozen, false); - vm.stopPrank(); - vm.startPrank(governor); - chainContractAddress.freezeChain(newChainid); vm.expectRevert(bytes.concat("q1")); diff --git a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/ProtocolVersion.t.sol b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/ProtocolVersion.t.sol index 9ecfe85fd..9ce434914 100644 --- a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/ProtocolVersion.t.sol +++ b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/ProtocolVersion.t.sol @@ -9,9 +9,6 @@ contract ProtocolVersion is StateTransitionManagerTest { function test_SuccessfulSetNewVersionUpgrade() public { createNewChain(getDiamondCutData(diamondInit)); - vm.stopPrank(); - vm.startPrank(governor); - uint256 oldProtocolVersion = chainContractAddress.protocolVersion(); uint256 oldProtocolVersionDeadline = chainContractAddress.protocolVersionDeadline(oldProtocolVersion); @@ -34,9 +31,6 @@ contract ProtocolVersion is StateTransitionManagerTest { function test_SuccessfulProtocolVersionIsActive() public { createNewChain(getDiamondCutData(diamondInit)); - vm.stopPrank(); - vm.startPrank(governor); - chainContractAddress.setNewVersionUpgrade(getDiamondCutData(diamondInit), 0, 0, 1); assertEq(chainContractAddress.protocolVersionIsActive(0), false); @@ -47,9 +41,6 @@ contract ProtocolVersion is StateTransitionManagerTest { function test_SuccessfulSetProtocolVersionDeadline() public { createNewChain(getDiamondCutData(diamondInit)); - vm.stopPrank(); - vm.startPrank(governor); - uint256 deadlineBefore = chainContractAddress.protocolVersionDeadline(0); assertEq(deadlineBefore, type(uint256).max); @@ -64,9 +55,6 @@ contract ProtocolVersion is StateTransitionManagerTest { function test_SuccessfulExecuteUpdate() public { createNewChain(getDiamondCutData(diamondInit)); - vm.stopPrank(); - vm.startPrank(governor); - Diamond.FacetCut[] memory customFacetCuts = new Diamond.FacetCut[](1); customFacetCuts[0] = Diamond.FacetCut({ facet: facetCuts[2].facet, @@ -82,9 +70,6 @@ contract ProtocolVersion is StateTransitionManagerTest { function test_SuccessfulUpgradeChainFromVersion() public { createNewChain(getDiamondCutData(diamondInit)); - vm.stopPrank(); - vm.startPrank(governor); - Diamond.FacetCut[] memory customFacetCuts = new Diamond.FacetCut[](1); customFacetCuts[0] = Diamond.FacetCut({ facet: facetCuts[2].facet, diff --git a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/StateTransitionManagerSetters.t.sol b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/StateTransitionManagerSetters.t.sol index 8ef695a5b..deae5967b 100644 --- a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/StateTransitionManagerSetters.t.sol +++ b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/StateTransitionManagerSetters.t.sol @@ -14,9 +14,6 @@ contract StateTransitionManagerSetters is StateTransitionManagerTest { address chainAddress = chainContractAddress.getHyperchain(chainId); GettersFacet gettersFacet = GettersFacet(chainAddress); - vm.stopPrank(); - vm.startPrank(governor); - uint256 newMaxGasLimit = 1000; chainContractAddress.setPriorityTxMaxGasLimit(chainId, newMaxGasLimit); @@ -32,9 +29,6 @@ contract StateTransitionManagerSetters is StateTransitionManagerTest { address chainAddress = chainContractAddress.getHyperchain(chainId); GettersFacet gettersFacet = GettersFacet(chainAddress); - vm.stopPrank(); - vm.startPrank(governor); - uint128 newNominator = 1; uint128 newDenominator = 1000; chainContractAddress.setTokenMultiplier(chainId, newNominator, newDenominator); @@ -53,9 +47,6 @@ contract StateTransitionManagerSetters is StateTransitionManagerTest { address chainAddress = chainContractAddress.getHyperchain(chainId); UtilsFacet utilsFacet = UtilsFacet(chainAddress); - vm.stopPrank(); - vm.startPrank(governor); - FeeParams memory newFeeParams = FeeParams({ pubdataPricingMode: PubdataPricingMode.Rollup, batchOverheadL1Gas: 1000000, @@ -83,9 +74,6 @@ contract StateTransitionManagerSetters is StateTransitionManagerTest { address chainAddress = chainContractAddress.getHyperchain(chainId); GettersFacet gettersFacet = GettersFacet(chainAddress); - vm.stopPrank(); - vm.startPrank(governor); - address validator = address(0x1); chainContractAddress.setValidator(chainId, validator, true); @@ -100,9 +88,6 @@ contract StateTransitionManagerSetters is StateTransitionManagerTest { address chainAddress = chainContractAddress.getHyperchain(chainId); UtilsFacet utilsFacet = UtilsFacet(chainAddress); - vm.stopPrank(); - vm.startPrank(governor); - chainContractAddress.setPorterAvailability(chainId, true); bool isAvailable = utilsFacet.util_getZkPorterAvailability(); diff --git a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/_StateTransitionManager_Shared.t.sol b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/_StateTransitionManager_Shared.t.sol index f67c93976..aefea0fdb 100644 --- a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/_StateTransitionManager_Shared.t.sol +++ b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/_StateTransitionManager_Shared.t.sol @@ -139,7 +139,7 @@ contract StateTransitionManagerTest is Test { function createNewChain(Diamond.DiamondCutData memory _diamondCut) internal { vm.stopPrank(); - vm.startPrank(address(bridgehub)); + vm.prank(bridgehub); chainContractAddress.createNewChain({ _chainId: chainId, @@ -148,11 +148,13 @@ contract StateTransitionManagerTest is Test { _admin: newChainAdmin, _diamondCut: abi.encode(_diamondCut) }); + + vm.startPrank(governor); } function createNewChainWithId(Diamond.DiamondCutData memory _diamondCut, uint256 id) internal { vm.stopPrank(); - vm.startPrank(bridgehub); + vm.prank(bridgehub); chainContractAddress.createNewChain({ _chainId: id, @@ -161,6 +163,8 @@ contract StateTransitionManagerTest is Test { _admin: newChainAdmin, _diamondCut: abi.encode(_diamondCut) }); + + vm.startPrank(governor); } // add this to be excluded from coverage report From 09bdc44b55e7b0ceabf728c2af799626d537158e Mon Sep 17 00:00:00 2001 From: tommysr <47206288+tommysr@users.noreply.github.com> Date: Tue, 1 Oct 2024 13:37:10 +0200 Subject: [PATCH 4/6] use explicit reverts --- .../test/foundry/unit/concrete/Utils/Utils.sol | 7 ++++--- .../StateTransitionManager/AdminManagement.t.sol | 13 ++++++++++--- .../StateTransitionManager/CreateNewChain.t.sol | 6 +++--- .../StateTransitionManager/ProtocolVersion.t.sol | 8 +++++++- .../StateTransitionManagerSetters.t.sol | 4 ++++ .../_StateTransitionManager_Shared.t.sol | 11 +++++++---- yarn.lock | 7 ------- 7 files changed, 35 insertions(+), 21 deletions(-) diff --git a/l1-contracts/test/foundry/unit/concrete/Utils/Utils.sol b/l1-contracts/test/foundry/unit/concrete/Utils/Utils.sol index 4f01144a3..2bc6c3077 100644 --- a/l1-contracts/test/foundry/unit/concrete/Utils/Utils.sol +++ b/l1-contracts/test/foundry/unit/concrete/Utils/Utils.sol @@ -210,7 +210,7 @@ library Utils { } function getGettersSelectors() public pure returns (bytes4[] memory) { - bytes4[] memory selectors = new bytes4[](31); + bytes4[] memory selectors = new bytes4[](32); selectors[0] = GettersFacet.getVerifier.selector; selectors[1] = GettersFacet.getAdmin.selector; selectors[2] = GettersFacet.getPendingAdmin.selector; @@ -240,8 +240,9 @@ library Utils { selectors[26] = GettersFacet.getTotalBatchesVerified.selector; selectors[27] = GettersFacet.getTotalBatchesExecuted.selector; selectors[28] = GettersFacet.getL2SystemContractsUpgradeTxHash.selector; - selectors[29] = GettersFacet.baseTokenGasPriceMultiplierDenominator.selector; - selectors[30] = GettersFacet.baseTokenGasPriceMultiplierNominator.selector; + selectors[29] = GettersFacet.getChainId.selector; + selectors[30] = GettersFacet.baseTokenGasPriceMultiplierDenominator.selector; + selectors[31] = GettersFacet.baseTokenGasPriceMultiplierNominator.selector; return selectors; } diff --git a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/AdminManagement.t.sol b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/AdminManagement.t.sol index 28101918b..95b59577b 100644 --- a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/AdminManagement.t.sol +++ b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/AdminManagement.t.sol @@ -2,14 +2,21 @@ pragma solidity 0.8.24; import {StateTransitionManagerTest} from "./_StateTransitionManager_Shared.t.sol"; +import {console} from "forge-std/console.sol"; +import {Unauthorized} from "contracts/common/L1ContractErrors.sol"; + contract AdminManagement is StateTransitionManagerTest { + function setUp() public { + deploy(); + } + function test_RevertWhen_IsNotAdminOrOwner() public { address newAdmin = makeAddr("newAdmin"); vm.stopPrank(); vm.prank(newAdmin); - vm.expectRevert(bytes("STM: not owner or admin")); + vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, newAdmin)); chainContractAddress.setPendingAdmin(newAdmin); } @@ -27,7 +34,7 @@ contract AdminManagement is StateTransitionManagerTest { vm.stopPrank(); vm.prank(random); - vm.expectRevert(bytes("n42")); + vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, random)); chainContractAddress.acceptAdmin(); } @@ -36,7 +43,7 @@ contract AdminManagement is StateTransitionManagerTest { vm.stopPrank(); vm.prank(random); - vm.expectRevert(bytes("n42")); + vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector, random)); chainContractAddress.acceptAdmin(); } diff --git a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/CreateNewChain.t.sol b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/CreateNewChain.t.sol index 70248e30f..b22c2a4d1 100644 --- a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/CreateNewChain.t.sol +++ b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/CreateNewChain.t.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.24; import {StateTransitionManagerTest} from "./_StateTransitionManager_Shared.t.sol"; import {Diamond} from "contracts/state-transition/libraries/Diamond.sol"; -import {Unauthorized, HashMismatch} from "contracts/common/L1ContractErrors.sol"; +import {Unauthorized, HashMismatch, ZeroAddress, HyperchainLimitReached} from "contracts/common/L1ContractErrors.sol"; import {StateTransitionManager} from "contracts/state-transition/StateTransitionManager.sol"; contract createNewChainTest is StateTransitionManagerTest { @@ -69,7 +69,7 @@ contract createNewChainTest is StateTransitionManagerTest { } function test_RevertWhen_AlreadyDeployedHyperchainAddressIsZero() public { - vm.expectRevert(bytes("STM: hyperchain zero")); + vm.expectRevert(ZeroAddress.selector); chainContractAddress.registerAlreadyDeployedHyperchain(chainId, address(0)); } @@ -90,7 +90,7 @@ contract createNewChainTest is StateTransitionManagerTest { uint256[] memory chainIds = chainContractAddress.getAllHyperchainChainIDs(); assertEq(chainIds.length, MAX_NUMBER_OF_HYPERCHAINS); - vm.expectRevert("STM: Hyperchain limit reached"); + vm.expectRevert(HyperchainLimitReached.selector); chainContractAddress.registerAlreadyDeployedHyperchain(100, makeAddr("randomHyperchain")); } } diff --git a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/ProtocolVersion.t.sol b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/ProtocolVersion.t.sol index 9ce434914..8bd874939 100644 --- a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/ProtocolVersion.t.sol +++ b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/ProtocolVersion.t.sol @@ -3,8 +3,14 @@ pragma solidity 0.8.24; import {StateTransitionManagerTest} from "./_StateTransitionManager_Shared.t.sol"; import {Diamond} from "contracts/state-transition/libraries/Diamond.sol"; +import {ProtocolIdNotGreater} from "contracts/common/L1ContractErrors.sol"; + contract ProtocolVersion is StateTransitionManagerTest { + function setUp() public { + deploy(); + } + // setNewVersionUpgrade function test_SuccessfulSetNewVersionUpgrade() public { createNewChain(getDiamondCutData(diamondInit)); @@ -85,7 +91,7 @@ contract ProtocolVersion is StateTransitionManagerTest { 1 ); - vm.expectRevert(bytes("AdminFacet: protocolVersion mismatch in STC after upgrading")); + vm.expectRevert(ProtocolIdNotGreater.selector); chainContractAddress.upgradeChainFromVersion( chainId, 0, diff --git a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/StateTransitionManagerSetters.t.sol b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/StateTransitionManagerSetters.t.sol index deae5967b..4d4616a32 100644 --- a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/StateTransitionManagerSetters.t.sol +++ b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/StateTransitionManagerSetters.t.sol @@ -7,6 +7,10 @@ import {UtilsFacet} from "foundry-test/unit/concrete/Utils/UtilsFacet.sol"; import {FeeParams, PubdataPricingMode} from "contracts/state-transition/chain-deps/ZkSyncHyperchainStorage.sol"; contract StateTransitionManagerSetters is StateTransitionManagerTest { + function setUp() public { + deploy(); + } + // setPriorityTxMaxGasLimit function test_SuccessfulSetPriorityTxMaxGasLimit() public { createNewChain(getDiamondCutData(diamondInit)); diff --git a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/_StateTransitionManager_Shared.t.sol b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/_StateTransitionManager_Shared.t.sol index aefea0fdb..0e0491358 100644 --- a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/_StateTransitionManager_Shared.t.sol +++ b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/_StateTransitionManager_Shared.t.sol @@ -20,6 +20,8 @@ import {StateTransitionManager} from "contracts/state-transition/StateTransition import {StateTransitionManagerInitializeData, ChainCreationParams} from "contracts/state-transition/IStateTransitionManager.sol"; import {TestnetVerifier} from "contracts/state-transition/TestnetVerifier.sol"; import {ZeroAddress} from "contracts/common/L1ContractErrors.sol"; +import {console} from "forge-std/console.sol"; + contract StateTransitionManagerTest is Test { StateTransitionManager internal stateTransitionManager; @@ -44,8 +46,8 @@ contract StateTransitionManagerTest is Test { bridgehub = new Bridgehub(); newChainAdmin = makeAddr("chainadmin"); - vm.startPrank(bridgehub); - stateTransitionManager = new StateTransitionManager(bridgehub, MAX_NUMBER_OF_HYPERCHAINS); + vm.startPrank(address(bridgehub)); + stateTransitionManager = new StateTransitionManager(address(bridgehub), MAX_NUMBER_OF_HYPERCHAINS); diamondInit = address(new DiamondInit()); genesisUpgradeContract = new GenesisUpgrade(); @@ -116,6 +118,7 @@ contract StateTransitionManagerTest is Test { admin, abi.encodeCall(StateTransitionManager.initialize, stmInitializeData) ); + chainContractAddress = StateTransitionManager(address(transparentUpgradeableProxy)); vm.stopPrank(); @@ -139,7 +142,7 @@ contract StateTransitionManagerTest is Test { function createNewChain(Diamond.DiamondCutData memory _diamondCut) internal { vm.stopPrank(); - vm.prank(bridgehub); + vm.prank(address(bridgehub)); chainContractAddress.createNewChain({ _chainId: chainId, @@ -154,7 +157,7 @@ contract StateTransitionManagerTest is Test { function createNewChainWithId(Diamond.DiamondCutData memory _diamondCut, uint256 id) internal { vm.stopPrank(); - vm.prank(bridgehub); + vm.prank(address(bridgehub)); chainContractAddress.createNewChain({ _chainId: id, diff --git a/yarn.lock b/yarn.lock index 66cd67b1a..6ab96b427 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7931,10 +7931,3 @@ zksync-ethers@^5.9.0: integrity sha512-Y2Mx6ovvxO6UdC2dePLguVzvNToOY8iLWeq5ne+jgGSJxAi/f4He/NF6FNsf6x1aWX0o8dy4Df8RcOQXAkj5qw== dependencies: ethers "~5.7.0" - -zksync-web3@^0.15.4: - version "0.15.5" - resolved "https://registry.yarnpkg.com/zksync-web3/-/zksync-web3-0.15.5.tgz#aabe379464963ab573e15948660a709f409b5316" - integrity sha512-97gB7OKJL4spegl8fGO54g6cvTd/75G6yFWZWEa2J09zhjTrfqabbwE/GwiUJkFQ5BbzoH4JaTlVz1hoYZI+DQ== - dependencies: - ethers "~5.7.0" From 2a02804ad49a594867f18e4779abf9504cf53216 Mon Sep 17 00:00:00 2001 From: tommysr <47206288+tommysr@users.noreply.github.com> Date: Tue, 1 Oct 2024 15:28:56 +0200 Subject: [PATCH 5/6] test initialize function in stm --- .../AdminManagement.t.sol | 1 - .../StateTransitionManager/Initialize.t.sol | 89 +++++++++++++++++++ .../ProtocolVersion.t.sol | 18 +++- .../StateTransitionManagerSetters.t.sol | 2 +- .../_StateTransitionManager_Shared.t.sol | 5 -- 5 files changed, 105 insertions(+), 10 deletions(-) create mode 100644 l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/Initialize.t.sol diff --git a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/AdminManagement.t.sol b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/AdminManagement.t.sol index 95b59577b..aa817b05d 100644 --- a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/AdminManagement.t.sol +++ b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/AdminManagement.t.sol @@ -5,7 +5,6 @@ import {StateTransitionManagerTest} from "./_StateTransitionManager_Shared.t.sol import {console} from "forge-std/console.sol"; import {Unauthorized} from "contracts/common/L1ContractErrors.sol"; - contract AdminManagement is StateTransitionManagerTest { function setUp() public { deploy(); diff --git a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/Initialize.t.sol b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/Initialize.t.sol new file mode 100644 index 000000000..eca9452df --- /dev/null +++ b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/Initialize.t.sol @@ -0,0 +1,89 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import {TransparentUpgradeableProxy} from "@openzeppelin/contracts-v4/proxy/transparent/TransparentUpgradeableProxy.sol"; +import {StateTransitionManager} from "contracts/state-transition/StateTransitionManager.sol"; +import {StateTransitionManagerInitializeData, ChainCreationParams} from "contracts/state-transition/IStateTransitionManager.sol"; +import {GenesisUpgradeZero, GenesisBatchHashZero, GenesisIndexStorageZero, GenesisBatchCommitmentZero} from "contracts/common/L1ContractErrors.sol"; +import {StateTransitionManagerTest} from "./_StateTransitionManager_Shared.t.sol"; + +contract StateTransitionManagerInitializeTest is StateTransitionManagerTest { + function setUp() public { + deploy(); + } + + modifier asBridgeHub() { + vm.stopPrank(); + vm.startPrank(address(bridgehub)); + + _; + } + + function _deployStmWithParams(ChainCreationParams memory params, bytes4 err) internal { + StateTransitionManagerInitializeData memory stmInitializeData = StateTransitionManagerInitializeData({ + owner: governor, + validatorTimelock: validator, + chainCreationParams: params, + protocolVersion: 0 + }); + + StateTransitionManager stm = new StateTransitionManager(address(bridgehub), MAX_NUMBER_OF_HYPERCHAINS); + + vm.expectRevert(err); + TransparentUpgradeableProxy transparentUpgradeableProxy = new TransparentUpgradeableProxy( + address(stm), + admin, + abi.encodeCall(StateTransitionManager.initialize, stmInitializeData) + ); + + StateTransitionManager(address(transparentUpgradeableProxy)); + } + + function test_RevertWhen_genesisUpgradeIsZero() public asBridgeHub { + ChainCreationParams memory chainCreationParams = ChainCreationParams({ + genesisUpgrade: address(0), + genesisBatchHash: bytes32(uint256(0x01)), + genesisIndexRepeatedStorageChanges: 0x01, + genesisBatchCommitment: bytes32(uint256(0x01)), + diamondCut: getDiamondCutData(address(diamondInit)) + }); + + _deployStmWithParams(chainCreationParams, GenesisUpgradeZero.selector); + } + + function test_RevertWhen_genesBatchHashIsZero() public asBridgeHub { + ChainCreationParams memory chainCreationParams = ChainCreationParams({ + genesisUpgrade: address(genesisUpgradeContract), + genesisBatchHash: bytes32(uint256(0)), + genesisIndexRepeatedStorageChanges: 0x01, + genesisBatchCommitment: bytes32(uint256(0x01)), + diamondCut: getDiamondCutData(address(diamondInit)) + }); + + _deployStmWithParams(chainCreationParams, GenesisBatchHashZero.selector); + } + + function test_RevertWhen_genesisIndexRepeatedStorageChangesIsZero() public asBridgeHub { + ChainCreationParams memory chainCreationParams = ChainCreationParams({ + genesisUpgrade: address(genesisUpgradeContract), + genesisBatchHash: bytes32(uint256(0x01)), + genesisIndexRepeatedStorageChanges: 0, + genesisBatchCommitment: bytes32(uint256(0x01)), + diamondCut: getDiamondCutData(address(diamondInit)) + }); + + _deployStmWithParams(chainCreationParams, GenesisIndexStorageZero.selector); + } + + function test_RevertWhen_genesisBatchCommitmentIsZero() public asBridgeHub { + ChainCreationParams memory chainCreationParams = ChainCreationParams({ + genesisUpgrade: address(genesisUpgradeContract), + genesisBatchHash: bytes32(uint256(0x01)), + genesisIndexRepeatedStorageChanges: 0x01, + genesisBatchCommitment: bytes32(uint256(0)), + diamondCut: getDiamondCutData(address(diamondInit)) + }); + + _deployStmWithParams(chainCreationParams, GenesisBatchCommitmentZero.selector); + } +} diff --git a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/ProtocolVersion.t.sol b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/ProtocolVersion.t.sol index 8bd874939..1a37ff888 100644 --- a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/ProtocolVersion.t.sol +++ b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/ProtocolVersion.t.sol @@ -4,7 +4,7 @@ pragma solidity 0.8.24; import {StateTransitionManagerTest} from "./_StateTransitionManager_Shared.t.sol"; import {Diamond} from "contracts/state-transition/libraries/Diamond.sol"; import {ProtocolIdNotGreater} from "contracts/common/L1ContractErrors.sol"; - +import {SemVer} from "contracts/common/libraries/SemVer.sol"; contract ProtocolVersion is StateTransitionManagerTest { function setUp() public { @@ -21,14 +21,26 @@ contract ProtocolVersion is StateTransitionManagerTest { assertEq(oldProtocolVersion, 0); assertEq(oldProtocolVersionDeadline, type(uint256).max); - chainContractAddress.setNewVersionUpgrade(getDiamondCutData(diamondInit), oldProtocolVersion, 1000, 1); + uint256 newProtocolVersionSemVer = SemVer.packSemVer(0, 1, 0); + + chainContractAddress.setNewVersionUpgrade( + getDiamondCutData(diamondInit), + oldProtocolVersion, + 1000, + newProtocolVersionSemVer + ); uint256 newProtocolVersion = chainContractAddress.protocolVersion(); uint256 newProtocolVersionDeadline = chainContractAddress.protocolVersionDeadline(newProtocolVersion); oldProtocolVersionDeadline = chainContractAddress.protocolVersionDeadline(oldProtocolVersion); - assertEq(newProtocolVersion, 1); + (uint32 major, uint32 minor, uint32 patch) = chainContractAddress.getSemverProtocolVersion(); + + assertEq(major, 0); + assertEq(minor, 1); + assertEq(patch, 0); + assertEq(newProtocolVersion, newProtocolVersionSemVer); assertEq(newProtocolVersionDeadline, type(uint256).max); assertEq(oldProtocolVersionDeadline, 1000); } diff --git a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/StateTransitionManagerSetters.t.sol b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/StateTransitionManagerSetters.t.sol index 4d4616a32..ede42af0b 100644 --- a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/StateTransitionManagerSetters.t.sol +++ b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/StateTransitionManagerSetters.t.sol @@ -9,7 +9,7 @@ import {FeeParams, PubdataPricingMode} from "contracts/state-transition/chain-de contract StateTransitionManagerSetters is StateTransitionManagerTest { function setUp() public { deploy(); - } + } // setPriorityTxMaxGasLimit function test_SuccessfulSetPriorityTxMaxGasLimit() public { diff --git a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/_StateTransitionManager_Shared.t.sol b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/_StateTransitionManager_Shared.t.sol index 0e0491358..da7c3dcbb 100644 --- a/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/_StateTransitionManager_Shared.t.sol +++ b/l1-contracts/test/foundry/unit/concrete/state-transition/StateTransitionManager/_StateTransitionManager_Shared.t.sol @@ -20,8 +20,6 @@ import {StateTransitionManager} from "contracts/state-transition/StateTransition import {StateTransitionManagerInitializeData, ChainCreationParams} from "contracts/state-transition/IStateTransitionManager.sol"; import {TestnetVerifier} from "contracts/state-transition/TestnetVerifier.sol"; import {ZeroAddress} from "contracts/common/L1ContractErrors.sol"; -import {console} from "forge-std/console.sol"; - contract StateTransitionManagerTest is Test { StateTransitionManager internal stateTransitionManager; @@ -169,7 +167,4 @@ contract StateTransitionManagerTest is Test { vm.startPrank(governor); } - - // add this to be excluded from coverage report - function test() internal virtual {} } From 4248e68ec66d8b22f803bef032c2c0df7cade8a7 Mon Sep 17 00:00:00 2001 From: tommysr <47206288+tommysr@users.noreply.github.com> Date: Tue, 1 Oct 2024 15:52:36 +0200 Subject: [PATCH 6/6] revert lock change --- yarn.lock | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/yarn.lock b/yarn.lock index 6ab96b427..66cd67b1a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7931,3 +7931,10 @@ zksync-ethers@^5.9.0: integrity sha512-Y2Mx6ovvxO6UdC2dePLguVzvNToOY8iLWeq5ne+jgGSJxAi/f4He/NF6FNsf6x1aWX0o8dy4Df8RcOQXAkj5qw== dependencies: ethers "~5.7.0" + +zksync-web3@^0.15.4: + version "0.15.5" + resolved "https://registry.yarnpkg.com/zksync-web3/-/zksync-web3-0.15.5.tgz#aabe379464963ab573e15948660a709f409b5316" + integrity sha512-97gB7OKJL4spegl8fGO54g6cvTd/75G6yFWZWEa2J09zhjTrfqabbwE/GwiUJkFQ5BbzoH4JaTlVz1hoYZI+DQ== + dependencies: + ethers "~5.7.0"