Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enhance test coverage for upgrade contracts #1240

Merged
merged 70 commits into from
Feb 11, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
cb406ea
feat: Create BaseUpgrade setup and setter
tejks May 24, 2024
09dd298
feat: BaseZkSyncUpgrade tests
tejks May 24, 2024
ad72ed6
feat: BaseZkSyncUpgradeGenesis tests
tejks May 24, 2024
ee013c9
feat: UpgradeHyperchains tests
tejks May 24, 2024
4394ff3
feat: DefaultUpgrade + Upgrade_v1_4_1 tests
tejks May 24, 2024
513c30a
fix: Test factoryDeps
tejks May 28, 2024
e0366f1
feat: Fuzz testing for selected functions
tejks May 29, 2024
aa3e564
feat: Check storage after upgrade
tejks May 31, 2024
3ed5beb
fix: Move tests to the upgrade folder
tejks May 31, 2024
1b4286b
fix: NewProtocolVersion fuzzing too many inputs
tejks May 31, 2024
fe78057
test: Update tests for semver protocol version
tejks Aug 16, 2024
635022a
feat: Update upgrade contracts to handle selector errors
tejks Sep 30, 2024
80ab825
fix: Correct typos
tejks Sep 30, 2024
23be6f6
fix: Update incorrect contract name
tejks Oct 1, 2024
421e044
Merge branch 'dev' into test/upgrade-contracts
saxenism Jan 20, 2025
4e502fa
Merge branch 'dev' into test/upgrade-contracts
saxenism Jan 28, 2025
f32bddc
test commit
Jan 28, 2025
42ebfe0
resolved issue of missing import files
saxenism Jan 29, 2025
582ab22
removed last refs of ZkSyncHyperchainBase
saxenism Jan 29, 2025
bb8a0da
removed/replaced deprecated vars
saxenism Jan 31, 2025
927a896
commented out L1GatewayTests -- Integration
saxenism Jan 31, 2025
1c443ad
reran hashes
saxenism Jan 31, 2025
c444061
prettier
saxenism Jan 31, 2025
2ebd663
fixing comparison hash
saxenism Feb 5, 2025
81b9645
fix lint/prettier, uncommented tests, Hashes match, locally every tes…
saxenism Feb 5, 2025
daddfe1
test revert removed. please work this time :(
saxenism Feb 5, 2025
603c4f0
added explicit permission to read from l1-contracts/script-out
saxenism Feb 5, 2025
863d05e
updated hash
saxenism Feb 5, 2025
9d79667
resolved pr comments from stas
saxenism Feb 6, 2025
92e43dc
ran lint check
saxenism Feb 6, 2025
3f52f40
skipping hash calculation for bootloader test
saxenism Feb 6, 2025
31cc44e
lint fix
saxenism Feb 6, 2025
3c1ac6c
copied AllContractsHashes from dev
saxenism Feb 6, 2025
2c83d29
feat: Create BaseUpgrade setup and setter
tejks May 24, 2024
0850190
feat: BaseZkSyncUpgrade tests
tejks May 24, 2024
9664cef
feat: BaseZkSyncUpgradeGenesis tests
tejks May 24, 2024
9fb0b0f
feat: UpgradeHyperchains tests
tejks May 24, 2024
b9a690b
feat: DefaultUpgrade + Upgrade_v1_4_1 tests
tejks May 24, 2024
86f9f3b
fix: Test factoryDeps
tejks May 28, 2024
1dc81b9
feat: Fuzz testing for selected functions
tejks May 29, 2024
a11aa15
feat: Check storage after upgrade
tejks May 31, 2024
abd26eb
fix: Move tests to the upgrade folder
tejks May 31, 2024
fd01632
fix: NewProtocolVersion fuzzing too many inputs
tejks May 31, 2024
8ff295f
test: Update tests for semver protocol version
tejks Aug 16, 2024
5d077c9
feat: Update upgrade contracts to handle selector errors
tejks Sep 30, 2024
fe04334
fix: Correct typos
tejks Sep 30, 2024
21ecc44
fix: Update incorrect contract name
tejks Oct 1, 2024
c05d79b
test commit
Jan 28, 2025
132134d
resolved issue of missing import files
saxenism Jan 29, 2025
68705f5
removed last refs of ZkSyncHyperchainBase
saxenism Jan 29, 2025
b695124
removed/replaced deprecated vars
saxenism Jan 31, 2025
1bf34ff
commented out L1GatewayTests -- Integration
saxenism Jan 31, 2025
0ce33ef
merged dev
saxenism Feb 6, 2025
bcf0181
prettier
saxenism Jan 31, 2025
4876a4f
fixing comparison hash
saxenism Feb 5, 2025
d2cb5a0
fix lint/prettier, uncommented tests, Hashes match, locally every tes…
saxenism Feb 5, 2025
213434a
test revert removed. please work this time :(
saxenism Feb 5, 2025
62bc12f
added explicit permission to read from l1-contracts/script-out
saxenism Feb 5, 2025
f3f13fa
updated hash
saxenism Feb 5, 2025
1cb4151
resolved pr comments from stas
saxenism Feb 6, 2025
9e26c49
ran lint check
saxenism Feb 6, 2025
c2f12f1
skipping hash calculation for bootloader test
saxenism Feb 6, 2025
ae3c2ad
lint fix
saxenism Feb 6, 2025
f9b7cf0
copied AllContractsHashes from dev
saxenism Feb 6, 2025
4d2058b
Merge branch 'test/upgrade-contracts' of https://github.com/neothepro…
saxenism Feb 6, 2025
425e01c
ran lint:fix
saxenism Feb 6, 2025
1ad9c19
pushing updated compilation timestamp
saxenism Feb 6, 2025
b27483f
modified wrong tests and moved them under the foundry directory
saxenism Feb 7, 2025
de2dbfa
Fixed PR review comments
saxenism Feb 10, 2025
015f6d3
rebuilt
saxenism Feb 10, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions l1-contracts/foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ fs_permissions = [
{ access = "read", path = "../l2-contracts/artifacts-zk/" },
{ access = "read", path = "../l2-contracts/zkout/" },
{ access = "read", path = "../l1-contracts/artifacts-zk/" },
{ access = "read", path = "../l1-contracts/script-out/" },
{ access = "read", path = "../da-contracts/" },
{ access = "read", path = "../system-contracts/zkout/" },
{ access = "read", path = "./script-config" },
Expand Down
266 changes: 266 additions & 0 deletions l1-contracts/test/foundry/l1/upgrades/BaseZkSyncUpgrade.t.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,266 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;

import {Test} from "forge-std/Test.sol";

import {BaseZkSyncUpgrade, ProposedUpgrade} from "contracts/upgrades/BaseZkSyncUpgrade.sol";
import {VerifierParams} from "contracts/state-transition/chain-interfaces/IVerifier.sol";
import {MAX_NEW_FACTORY_DEPS, SYSTEM_UPGRADE_L2_TX_TYPE, MAX_ALLOWED_MINOR_VERSION_DELTA} from "contracts/common/Config.sol";
import {SemVer} from "contracts/common/libraries/SemVer.sol";
import {ProtocolVersionMinorDeltaTooBig, TimeNotReached, InvalidTxType, L2UpgradeNonceNotEqualToNewProtocolVersion, TooManyFactoryDeps, ProtocolVersionTooSmall, PreviousUpgradeNotCleaned, PreviousUpgradeNotFinalized, PatchCantSetUpgradeTxn, PreviousProtocolMajorVersionNotZero, NewProtocolMajorVersionNotZero, PatchUpgradeCantSetDefaultAccount, PatchUpgradeCantSetBootloader} from "contracts/upgrades/ZkSyncUpgradeErrors.sol";
import {L2ContractHelper} from "contracts/common/libraries/L2ContractHelper.sol";

import {BaseUpgrade} from "./_SharedBaseUpgrade.t.sol";
import {BaseUpgradeUtils} from "./_SharedBaseUpgradeUtils.t.sol";

contract DummyBaseZkSyncUpgrade is BaseZkSyncUpgrade, BaseUpgradeUtils {}

contract BaseZkSyncUpgradeTest is BaseUpgrade {
DummyBaseZkSyncUpgrade baseZkSyncUpgrade;

function setUp() public {
baseZkSyncUpgrade = new DummyBaseZkSyncUpgrade();

_prepareProposedUpgrade();

baseZkSyncUpgrade.setPriorityTxMaxGasLimit(1 ether);
baseZkSyncUpgrade.setPriorityTxMaxPubdata(1000000);
}

// Upgrade is not ready yet
function test_revertWhen_UpgradeIsNotReady(uint256 upgradeTimestamp) public {
vm.assume(upgradeTimestamp > block.timestamp);

proposedUpgrade.upgradeTimestamp = upgradeTimestamp;

vm.expectRevert(abi.encodeWithSelector(TimeNotReached.selector, upgradeTimestamp, block.timestamp));
baseZkSyncUpgrade.upgrade(proposedUpgrade);
}

// New protocol version is not greater than the current one
function test_revertWhen_newProtocolVersionIsNotGreaterThanTheCurrentOne(
uint32 currentProtocolVersion,
uint32 newProtocolVersion
) public {
vm.assume(newProtocolVersion <= currentProtocolVersion && newProtocolVersion > 0);

uint256 semVerCurrentProtocolVersion = SemVer.packSemVer(0, currentProtocolVersion, 0);
uint256 semVerNewProtocolVersion = SemVer.packSemVer(0, newProtocolVersion, 0);

baseZkSyncUpgrade.setProtocolVersion(semVerCurrentProtocolVersion);

proposedUpgrade.newProtocolVersion = semVerNewProtocolVersion;

vm.expectRevert(abi.encodeWithSelector(ProtocolVersionTooSmall.selector));
baseZkSyncUpgrade.upgrade(proposedUpgrade);
}

// Previous major version is not zero
function test_revertWhen_MajorVersionIsNotZero() public {
baseZkSyncUpgrade.setProtocolVersion(SemVer.packSemVer(1, 0, 0));

proposedUpgrade.newProtocolVersion = SemVer.packSemVer(1, 1, 0);

vm.expectRevert(abi.encodeWithSelector(PreviousProtocolMajorVersionNotZero.selector));
baseZkSyncUpgrade.upgrade(proposedUpgrade);
}

// New major version is not zero
function test_revertWhen_MajorMustAlwaysBeZero(uint32 newProtocolVersion) public {
vm.assume(newProtocolVersion > 0);

proposedUpgrade.newProtocolVersion = SemVer.packSemVer(1, newProtocolVersion, 0);

vm.expectRevert(abi.encodeWithSelector(NewProtocolMajorVersionNotZero.selector));
baseZkSyncUpgrade.upgrade(proposedUpgrade);
}

// Protocol version difference is too big
function test_revertWhen_tooBigProtocolVersionDifference(
uint32 newProtocolVersion,
uint8 oldProtocolVersion
) public {
vm.assume(newProtocolVersion > MAX_ALLOWED_MINOR_VERSION_DELTA + oldProtocolVersion + 1);
baseZkSyncUpgrade.setProtocolVersion(SemVer.packSemVer(0, oldProtocolVersion, 0));
uint256 semVerNewProtocolVersion = SemVer.packSemVer(0, newProtocolVersion, 0);

proposedUpgrade.newProtocolVersion = semVerNewProtocolVersion;

vm.expectRevert(
abi.encodeWithSelector(
ProtocolVersionMinorDeltaTooBig.selector,
MAX_ALLOWED_MINOR_VERSION_DELTA,
newProtocolVersion - oldProtocolVersion
)
);
baseZkSyncUpgrade.upgrade(proposedUpgrade);
}

// Previous upgrade has not been finalized
function test_revertWhen_previousUpgradeHasNotBeenFinalized() public {
bytes32 l2SystemContractsUpgradeTxHash = bytes32(bytes("txHash"));
baseZkSyncUpgrade.setL2SystemContractsUpgradeTxHash(l2SystemContractsUpgradeTxHash);

vm.expectRevert(abi.encodeWithSelector(PreviousUpgradeNotFinalized.selector, l2SystemContractsUpgradeTxHash));
baseZkSyncUpgrade.upgrade(proposedUpgrade);
}

// Batch number of the previous upgrade has not been cleaned
function test_revertWhen_batchNumberOfThePreviousUpgradeHasNotBeenCleaned(uint256 batchNumber) public {
vm.assume(batchNumber > 0);

baseZkSyncUpgrade.setL2SystemContractsUpgradeBatchNumber(batchNumber);

vm.expectRevert(abi.encodeWithSelector(PreviousUpgradeNotCleaned.selector));
baseZkSyncUpgrade.upgrade(proposedUpgrade);
}

// Patch upgrade can't set bootloader
function test_revertWhen_PatchUpgradeCantSetBootloader() public {
baseZkSyncUpgrade.setProtocolVersion(SemVer.packSemVer(0, 1, 0));
proposedUpgrade.newProtocolVersion = SemVer.packSemVer(0, 1, 1);

vm.expectRevert(abi.encodeWithSelector(PatchUpgradeCantSetBootloader.selector));
baseZkSyncUpgrade.upgrade(proposedUpgrade);
}

// Patch upgrade can't set default account
function test_revertWhen_PatchUpgradeCantSetDefaultAccount() public {
baseZkSyncUpgrade.setProtocolVersion(SemVer.packSemVer(0, 1, 0));
proposedUpgrade.newProtocolVersion = SemVer.packSemVer(0, 1, 1);
proposedUpgrade.bootloaderHash = bytes32(0);

vm.expectRevert(abi.encodeWithSelector(PatchUpgradeCantSetDefaultAccount.selector));
baseZkSyncUpgrade.upgrade(proposedUpgrade);
}

// L2 system upgrade tx type is wrong
function test_revertWhen_InvalidTxType(uint256 newTxType) public {
vm.assume(newTxType != SYSTEM_UPGRADE_L2_TX_TYPE && newTxType > 0);
proposedUpgrade.l2ProtocolUpgradeTx.txType = newTxType;

vm.expectRevert(abi.encodeWithSelector(InvalidTxType.selector, newTxType));
baseZkSyncUpgrade.upgrade(proposedUpgrade);
}

// Patch upgrade can't set upgrade txn
function test_revertWhen_PatchCantSetUpgradeTxn() public {
// Change bootload and default account hashes to 0, to skip previous path only checks
proposedUpgrade.bootloaderHash = bytes32(0);
proposedUpgrade.defaultAccountHash = bytes32(0);

baseZkSyncUpgrade.setProtocolVersion(SemVer.packSemVer(0, 1, 0));
proposedUpgrade.newProtocolVersion = SemVer.packSemVer(0, 1, 1);

vm.expectRevert(abi.encodeWithSelector(PatchCantSetUpgradeTxn.selector));
baseZkSyncUpgrade.upgrade(proposedUpgrade);
}

// L2 upgrade nonce is not equal to the new protocol version
function test_revertWhen_L2UpgradeNonceIsNotEqualToNewProtocolVersion(
uint32 newProtocolVersion,
uint32 nonce
) public {
vm.assume(newProtocolVersion > 0);
vm.assume(nonce != newProtocolVersion && nonce > 0);

uint256 semVerNewProtocolVersion = SemVer.packSemVer(0, newProtocolVersion, 0);

baseZkSyncUpgrade.setProtocolVersion(SemVer.packSemVer(0, newProtocolVersion - 1, 0));

proposedUpgrade.newProtocolVersion = semVerNewProtocolVersion;
proposedUpgrade.l2ProtocolUpgradeTx.nonce = nonce;

vm.expectRevert(
abi.encodeWithSelector(L2UpgradeNonceNotEqualToNewProtocolVersion.selector, nonce, newProtocolVersion)
);
baseZkSyncUpgrade.upgrade(proposedUpgrade);
}

// Factory deps can be at most 64 (MAX_NEW_FACTORY_DEPS)
function test_revertWhen_FactoryDepsCanBeAtMost64(uint8 maxNewFactoryDeps) public {
vm.assume(maxNewFactoryDeps > MAX_NEW_FACTORY_DEPS);

proposedUpgrade.l2ProtocolUpgradeTx.factoryDeps = new uint256[](maxNewFactoryDeps);

vm.expectRevert(abi.encodeWithSelector(TooManyFactoryDeps.selector));
baseZkSyncUpgrade.upgrade(proposedUpgrade);
}

// Upgrade with mock factoryDepHash
function test_upgrade_WithMockFactoryDepHash() public {
bytes[] memory factoryDeps = new bytes[](1);
factoryDeps[0] = "11111111111111111111111111111111";

proposedUpgrade.l2ProtocolUpgradeTx.factoryDeps = new uint256[](1);

bytes32 bytecodeHash = L2ContractHelper.hashL2Bytecode(factoryDeps[0]);

baseZkSyncUpgrade.upgrade(proposedUpgrade);
}

function test_SuccessWith_VerifierAddressIsZero() public {
proposedUpgrade.verifier = address(0);

baseZkSyncUpgrade.upgrade(proposedUpgrade);

assertEq(baseZkSyncUpgrade.getProtocolVersion(), proposedUpgrade.newProtocolVersion);
assertEq(baseZkSyncUpgrade.getL2DefaultAccountBytecodeHash(), proposedUpgrade.defaultAccountHash);
assertEq(baseZkSyncUpgrade.getL2BootloaderBytecodeHash(), proposedUpgrade.bootloaderHash);
}

function test_SuccessWith_NewVerifierParamsIsZero() public {
proposedUpgrade.verifierParams = VerifierParams({
recursionNodeLevelVkHash: bytes32(0),
recursionLeafLevelVkHash: bytes32(0),
recursionCircuitsSetVksHash: bytes32(0)
});

baseZkSyncUpgrade.upgrade(proposedUpgrade);

assertEq(baseZkSyncUpgrade.getProtocolVersion(), proposedUpgrade.newProtocolVersion);
assertEq(baseZkSyncUpgrade.getVerifier(), proposedUpgrade.verifier);
assertEq(baseZkSyncUpgrade.getL2DefaultAccountBytecodeHash(), proposedUpgrade.defaultAccountHash);
assertEq(baseZkSyncUpgrade.getL2BootloaderBytecodeHash(), proposedUpgrade.bootloaderHash);
}

function test_SuccessWith_L2BootloaderBytecodeHashIsZero() public {
proposedUpgrade.bootloaderHash = bytes32(0);

baseZkSyncUpgrade.upgrade(proposedUpgrade);

assertEq(baseZkSyncUpgrade.getProtocolVersion(), proposedUpgrade.newProtocolVersion);
assertEq(baseZkSyncUpgrade.getVerifier(), proposedUpgrade.verifier);
assertEq(baseZkSyncUpgrade.getL2DefaultAccountBytecodeHash(), proposedUpgrade.defaultAccountHash);
}

function test_SuccessWith_L2DefaultAccountBytecodeHashIsZero() public {
proposedUpgrade.defaultAccountHash = bytes32(0);

baseZkSyncUpgrade.upgrade(proposedUpgrade);

assertEq(baseZkSyncUpgrade.getProtocolVersion(), proposedUpgrade.newProtocolVersion);
assertEq(baseZkSyncUpgrade.getVerifier(), proposedUpgrade.verifier);
assertEq(baseZkSyncUpgrade.getL2BootloaderBytecodeHash(), proposedUpgrade.bootloaderHash);
}

function test_SuccessWith_TxTypeIsZero() public {
proposedUpgrade.l2ProtocolUpgradeTx.txType = 0;

baseZkSyncUpgrade.upgrade(proposedUpgrade);

assertEq(baseZkSyncUpgrade.getProtocolVersion(), proposedUpgrade.newProtocolVersion);
assertEq(baseZkSyncUpgrade.getVerifier(), proposedUpgrade.verifier);
assertEq(baseZkSyncUpgrade.getL2DefaultAccountBytecodeHash(), proposedUpgrade.defaultAccountHash);
assertEq(baseZkSyncUpgrade.getL2BootloaderBytecodeHash(), proposedUpgrade.bootloaderHash);
}

function test_SuccessUpgrade() public {
baseZkSyncUpgrade.upgrade(proposedUpgrade);

assertEq(baseZkSyncUpgrade.getProtocolVersion(), proposedUpgrade.newProtocolVersion);
assertEq(baseZkSyncUpgrade.getVerifier(), proposedUpgrade.verifier);
assertEq(baseZkSyncUpgrade.getL2DefaultAccountBytecodeHash(), proposedUpgrade.defaultAccountHash);
assertEq(baseZkSyncUpgrade.getL2BootloaderBytecodeHash(), proposedUpgrade.bootloaderHash);
}
}
114 changes: 114 additions & 0 deletions l1-contracts/test/foundry/l1/upgrades/BaseZkSyncUpgradeGenesis.t.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;

import {Test} from "forge-std/Test.sol";

import {BaseZkSyncUpgradeGenesis} from "contracts/upgrades/BaseZkSyncUpgradeGenesis.sol";
import {ProtocolVersionTooSmall, ProtocolVersionDeltaTooLarge, PreviousUpgradeNotFinalized, PreviousUpgradeBatchNotCleared, ProtocolMajorVersionNotZero} from "contracts/upgrades/ZkSyncUpgradeErrors.sol";
import {MAX_ALLOWED_MINOR_VERSION_DELTA} from "contracts/common/Config.sol";
import {SemVer} from "contracts/common/libraries/SemVer.sol";

import {BaseUpgrade} from "./_SharedBaseUpgrade.t.sol";
import {BaseUpgradeUtils} from "./_SharedBaseUpgradeUtils.t.sol";

contract DummyBaseZkSyncUpgradeGenesis is BaseZkSyncUpgradeGenesis, BaseUpgradeUtils {}

contract BaseZkSyncUpgradeGenesisTest is BaseUpgrade {
DummyBaseZkSyncUpgradeGenesis baseZkSyncUpgrade;

function setUp() public {
baseZkSyncUpgrade = new DummyBaseZkSyncUpgradeGenesis();

_prepareProposedUpgrade();

baseZkSyncUpgrade.setPriorityTxMaxGasLimit(1 ether);
baseZkSyncUpgrade.setPriorityTxMaxPubdata(1000000);
}

// New protocol version is not greater than the current one
function test_revertWhen_newProtocolVersionIsNotGreaterThanTheCurrentOne(
uint32 currentProtocolVersion,
uint32 newProtocolVersion
) public {
vm.assume(newProtocolVersion < currentProtocolVersion && newProtocolVersion > 0);

uint256 semVerCurrentProtocolVersion = SemVer.packSemVer(0, currentProtocolVersion, 0);
uint256 semVerNewProtocolVersion = SemVer.packSemVer(0, newProtocolVersion, 0);

baseZkSyncUpgrade.setProtocolVersion(semVerCurrentProtocolVersion);

proposedUpgrade.newProtocolVersion = semVerNewProtocolVersion;

vm.expectRevert(abi.encodeWithSelector(ProtocolVersionTooSmall.selector));
baseZkSyncUpgrade.upgrade(proposedUpgrade);
}

// Major version is not zero
function test_revertWhen_MajorVersionIsNotZero() public {
baseZkSyncUpgrade.setProtocolVersion(SemVer.packSemVer(1, 0, 0));

proposedUpgrade.newProtocolVersion = SemVer.packSemVer(1, 1, 0);

vm.expectRevert(abi.encodeWithSelector(ProtocolMajorVersionNotZero.selector));
baseZkSyncUpgrade.upgrade(proposedUpgrade);
}

// New major version is not zero
function test_revertWhen_MajorMustAlwaysBeZero(uint32 newProtocolVersion) public {
vm.assume(newProtocolVersion > 0);

proposedUpgrade.newProtocolVersion = SemVer.packSemVer(1, newProtocolVersion, 0);

vm.expectRevert(abi.encodeWithSelector(ProtocolMajorVersionNotZero.selector));
baseZkSyncUpgrade.upgrade(proposedUpgrade);
}

// Protocol version difference is too big
function test_revertWhen_tooBigProtocolVersionDifference(
uint32 newProtocolVersion,
uint8 oldProtocolVersion
) public {
vm.assume(newProtocolVersion > MAX_ALLOWED_MINOR_VERSION_DELTA + oldProtocolVersion + 1);
baseZkSyncUpgrade.setProtocolVersion(SemVer.packSemVer(0, oldProtocolVersion, 0));
uint256 semVerNewProtocolVersion = SemVer.packSemVer(0, newProtocolVersion, 0);

proposedUpgrade.newProtocolVersion = semVerNewProtocolVersion;

vm.expectRevert(
abi.encodeWithSelector(
ProtocolVersionDeltaTooLarge.selector,
newProtocolVersion - oldProtocolVersion,
MAX_ALLOWED_MINOR_VERSION_DELTA
)
);
baseZkSyncUpgrade.upgrade(proposedUpgrade);
}

// Previous upgrade has not been finalized
function test_revertWhen_previousUpgradeHasNotBeenFinalized() public {
bytes32 l2SystemContractsUpgradeTxHash = bytes32(bytes("txHash"));
baseZkSyncUpgrade.setL2SystemContractsUpgradeTxHash(l2SystemContractsUpgradeTxHash);

vm.expectRevert(abi.encodeWithSelector(PreviousUpgradeNotFinalized.selector, l2SystemContractsUpgradeTxHash));
baseZkSyncUpgrade.upgrade(proposedUpgrade);
}

// Batch number of the previous upgrade has not been cleaned
function test_revertWhen_batchNumberOfThePreviousUpgradeHasNotBeenCleaned(uint256 batchNumber) public {
vm.assume(batchNumber > 0);

baseZkSyncUpgrade.setL2SystemContractsUpgradeBatchNumber(batchNumber);

vm.expectRevert(abi.encodeWithSelector(PreviousUpgradeBatchNotCleared.selector));
baseZkSyncUpgrade.upgrade(proposedUpgrade);
}

function test_SuccessUpgrade() public {
baseZkSyncUpgrade.upgrade(proposedUpgrade);

assertEq(baseZkSyncUpgrade.getProtocolVersion(), proposedUpgrade.newProtocolVersion);
assertEq(baseZkSyncUpgrade.getVerifier(), proposedUpgrade.verifier);
assertEq(baseZkSyncUpgrade.getL2DefaultAccountBytecodeHash(), proposedUpgrade.defaultAccountHash);
assertEq(baseZkSyncUpgrade.getL2BootloaderBytecodeHash(), proposedUpgrade.bootloaderHash);
}
}
Loading
Loading