Skip to content

Commit

Permalink
Fix merge artifacts
Browse files Browse the repository at this point in the history
  • Loading branch information
0xVolosnikov committed Jan 21, 2025
1 parent 14f5c20 commit fec1c24
Show file tree
Hide file tree
Showing 7 changed files with 108 additions and 63 deletions.
2 changes: 1 addition & 1 deletion l1-contracts/deploy-scripts/ChainConfigurationReader.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ pragma solidity ^0.8.21;
import {Script, console2 as console} from "forge-std/Script.sol";
import {Vm} from "forge-std/Vm.sol";
import {IZkSyncHyperchain} from "contracts/state-transition/chain-interfaces/IZkSyncHyperchain.sol";
import {PubdataPricingMode} from "contracts/state-transition/chain-deps/ZkSyncHyperchainStorage.sol";
import {PubdataPricingMode} from "contracts/state-transition/chain-deps/ZKChainStorage.sol";
import {StateTransitionManager} from "contracts/state-transition/StateTransitionManager.sol";
import {ValidatorTimelock} from "contracts/state-transition/ValidatorTimelock.sol";
import {ChainAdmin} from "contracts/governance/ChainAdmin.sol";
Expand Down
10 changes: 4 additions & 6 deletions l1-contracts/deploy-scripts/DeployL1.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,6 @@ contract DeployL1Script is Script, DeployUtils {
deployErc20BridgeImplementation();
deployErc20BridgeProxy();
updateSharedBridge();

deployChainRegistrar();
deployCTMDeploymentTracker();
setBridgehubParams();
Expand Down Expand Up @@ -212,7 +211,7 @@ contract DeployL1Script is Script, DeployUtils {

function deployChainRegistrar() internal {
bytes memory bytecodeImplementation = abi.encodePacked(type(ChainRegistrar).creationCode);
address chainRegistrarImplementation = deployViaCreate2(bytecodeImplementation);
address chainRegistrarImplementation = deployViaCreate2(bytecodeImplementation, "");
console.log("Chain Registrar implementation deployed at:", chainRegistrarImplementation);

bytes memory bytecode = abi.encodePacked(
Expand All @@ -222,11 +221,11 @@ contract DeployL1Script is Script, DeployUtils {
addresses.transparentProxyAdmin,
abi.encodeCall(
ChainRegistrar.initialize,
(addresses.bridgehub.bridgehubProxy, config.l2Deployer, config.ownerAddress)
(addresses.bridgehub.bridgehubProxy, config.deployerAddress, config.ownerAddress)
)
)
);
address chainRegistrar = deployViaCreate2(bytecode);
address chainRegistrar = deployViaCreate2(bytecode, "");
console.log("Chain Registrar deployed at:", chainRegistrar);
addresses.chainRegistrar = chainRegistrar;
}
Expand Down Expand Up @@ -712,7 +711,6 @@ contract DeployL1Script is Script, DeployUtils {
vm.serializeString("deployed_addresses", "state_transition", stateTransition);

vm.serializeAddress("deployed_addresses", "chain_registrar", addresses.chainRegistrar);

vm.serializeAddress("deployed_addresses", "l1_rollup_da_manager", addresses.daAddresses.rollupDAManager);
vm.serializeAddress(
"deployed_addresses",
Expand Down Expand Up @@ -793,4 +791,4 @@ contract DeployL1Script is Script, DeployUtils {

// add this to be excluded from coverage report
function test() internal virtual override {}
}
}
1 change: 1 addition & 0 deletions l1-contracts/deploy-scripts/DeployUtils.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ struct DeployedAddresses {
address blobVersionedHashRetriever;
address validatorTimelock;
address create2Factory;
address chainRegistrar;
}

// solhint-disable-next-line gas-struct-packing
Expand Down
2 changes: 1 addition & 1 deletion l1-contracts/deploy-scripts/ProposeChainRegistration.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import {Script, console2 as console} from "forge-std/Script.sol";
import {stdToml} from "forge-std/StdToml.sol";
import {IERC20} from "@openzeppelin/contracts-v4/token/ERC20/IERC20.sol";
import {ChainRegistrar} from "contracts/chain-registrar/ChainRegistrar.sol";
import {PubdataPricingMode} from "contracts/state-transition/chain-deps/ZkSyncHyperchainStorage.sol";
import {PubdataPricingMode} from "contracts/state-transition/chain-deps/ZKChainStorage.sol";

contract ProposeChainRegistration is Script {
using stdToml for string;
Expand Down
16 changes: 13 additions & 3 deletions l1-contracts/src.ts/deploy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -345,11 +345,21 @@ export class Deployer {

public async deployChainAdmin(create2Salt: string, ethTxOptions: ethers.providers.TransactionRequest) {
ethTxOptions.gasLimit ??= 10_000_000;
// Firstly, we deploy the access control restriction for the chain admin
const accessControlRestriction = await this.deployViaCreate2(
"AccessControlRestriction",
[0, this.ownerAddress],
create2Salt,
ethTxOptions
);
if (this.verbose) {
console.log(`CONTRACTS_ACCESS_CONTROL_RESTRICTION_ADDR=${accessControlRestriction}`);
}

// We deploy the ChainAdmin contract itself
// Then we deploy the ChainAdmin contract itself
const contractAddress = await this.deployViaCreate2(
"ChainAdmin",
[this.ownerAddress, ethers.constants.AddressZero],
[[accessControlRestriction]],
create2Salt,
ethTxOptions
);
Expand Down Expand Up @@ -1861,4 +1871,4 @@ export class Deployer {
const l1ChainId = this.isZkMode() ? getNumberFromEnv("ETH_CLIENT_CHAIN_ID") : await this.deployWallet.getChainId();
return +l1ChainId;
}
}
}

Check failure on line 1874 in l1-contracts/src.ts/deploy.ts

View workflow job for this annotation

GitHub Actions / lint

Insert `⏎`

Check failure on line 1874 in l1-contracts/src.ts/deploy.ts

View workflow job for this annotation

GitHub Actions / lint

Insert `⏎`

Check failure on line 1874 in l1-contracts/src.ts/deploy.ts

View workflow job for this annotation

GitHub Actions / lint

Insert `⏎`
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {Utils} from "test/foundry/l1/unit/concrete/Utils/Utils.sol";

contract ChainAdminTest is Test {
ChainAdmin internal chainAdmin;
AccessControlRestriction internal restriction;
GettersFacet internal gettersFacet;
DummyRestriction internal dummyRestriction;

Expand All @@ -27,7 +28,11 @@ contract ChainAdminTest is Test {
function setUp() public {
owner = makeAddr("random address");

chainAdmin = new ChainAdmin(owner, address(0));
restriction = new AccessControlRestriction(0, owner);
address[] memory restrictions = new address[](1);
restrictions[0] = address(restriction);

chainAdmin = new ChainAdmin(restrictions);

gettersFacet = new GettersFacet();
dummyRestriction = new DummyRestriction(true);
Expand Down Expand Up @@ -118,43 +123,67 @@ contract ChainAdminTest is Test {
vm.expectEmit(true, false, false, true);
emit IChainAdmin.UpdateUpgradeTimestamp(protocolVersion, timestamp);

vm.prank(address(owner));
vm.prank(address(chainAdmin));
chainAdmin.setUpgradeTimestamp(protocolVersion, timestamp);
}

function test_multicallRevertNoCalls() public {
IChainAdmin.Call[] memory calls = new IChainAdmin.Call[](0);
Call[] memory calls = new Call[](0);

vm.prank(owner);
vm.expectRevert(NoCallsProvided.selector);
chainAdmin.multicall(calls, false);
}

function test_multicallRevertFailedCall() public {
IChainAdmin.Call[] memory calls = new IChainAdmin.Call[](1);
calls[0] = IChainAdmin.Call({
target: address(chainAdmin),
value: 0,
data: abi.encodeCall(gettersFacet.getAdmin, ())
});
Call[] memory calls = new Call[](1);
calls[0] = Call({target: address(chainAdmin), value: 0, data: abi.encodeCall(gettersFacet.getAdmin, ())});

vm.expectRevert();
vm.prank(owner);
chainAdmin.multicall(calls, true);
}

function test_validateCallAccessToFunctionDenied(bytes32 role) public {
vm.assume(role != DEFAULT_ADMIN_ROLE);

Call[] memory calls = new Call[](2);
calls[0] = Call({target: address(gettersFacet), value: 0, data: abi.encodeCall(gettersFacet.getAdmin, ())});
calls[1] = Call({target: address(gettersFacet), value: 0, data: abi.encodeCall(gettersFacet.getVerifier, ())});

vm.prank(owner);
restriction.setRequiredRoleForCall(address(gettersFacet), gettersFacet.getAdmin.selector, role);

vm.expectRevert(
abi.encodeWithSelector(
AccessToFunctionDenied.selector,
address(gettersFacet),
gettersFacet.getAdmin.selector,
owner
)
);
vm.prank(owner);
chainAdmin.multicall(calls, true);
}

function test_validateCallAccessToFallbackDenied(bytes32 role) public {
vm.assume(role != DEFAULT_ADMIN_ROLE);

Call[] memory calls = new Call[](2);
calls[0] = Call({target: address(gettersFacet), value: 0, data: ""});
calls[1] = Call({target: address(gettersFacet), value: 0, data: abi.encodeCall(gettersFacet.getVerifier, ())});

vm.prank(owner);
restriction.setRequiredRoleForFallback(address(gettersFacet), role);

vm.expectRevert(abi.encodeWithSelector(AccessToFallbackDenied.selector, address(gettersFacet), owner));
vm.prank(owner);
chainAdmin.multicall(calls, true);
}

function test_multicall() public {
IChainAdmin.Call[] memory calls = new IChainAdmin.Call[](2);
calls[0] = IChainAdmin.Call({
target: address(gettersFacet),
value: 0,
data: abi.encodeCall(gettersFacet.getAdmin, ())
});
calls[1] = IChainAdmin.Call({
target: address(gettersFacet),
value: 0,
data: abi.encodeCall(gettersFacet.getVerifier, ())
});
Call[] memory calls = new Call[](2);
calls[0] = Call({target: address(gettersFacet), value: 0, data: abi.encodeCall(gettersFacet.getAdmin, ())});
calls[1] = Call({target: address(gettersFacet), value: 0, data: abi.encodeCall(gettersFacet.getVerifier, ())});

vm.prank(owner);
chainAdmin.multicall(calls, true);
Expand All @@ -172,4 +201,4 @@ contract ChainAdminTest is Test {

return minor * semverMinorVersionMultiplier + patch;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,60 +3,67 @@ pragma solidity ^0.8.0;

import {Test} from "forge-std/Test.sol";
import {Vm} from "forge-std/Vm.sol";
import {DummyStateTransitionManagerWBH} from "contracts/dev-contracts/test/DummyStateTransitionManagerWithBridgeHubAddress.sol";
import {DummyChainTypeManagerWBH} from "contracts/dev-contracts/test/DummyChainTypeManagerWithBridgeHubAddress.sol";
import {VerifierParams, IVerifier} from "contracts/state-transition/chain-interfaces/IVerifier.sol";
import {GettersFacet} from "contracts/state-transition/chain-deps/facets/Getters.sol";

import "contracts/bridgehub/Bridgehub.sol";
import "contracts/chain-registrar/ChainRegistrar.sol";
import {PubdataPricingMode} from "contracts/state-transition/chain-deps/ZkSyncHyperchainStorage.sol";
import {PubdataPricingMode} from "contracts/state-transition/chain-deps/ZKChainStorage.sol";
import {InitializeDataNewChain as DiamondInitializeDataNewChain} from "contracts/state-transition/chain-interfaces/IDiamondInit.sol";
import "contracts/dev-contracts/test/DummyBridgehub.sol";
import "contracts/dev-contracts/test/DummySharedBridge.sol";
import {L1SharedBridge} from "contracts/bridge/L1SharedBridge.sol";
import {L1AssetRouter} from "contracts/bridge/asset-router/L1AssetRouter.sol";
import {console2 as console} from "forge-std/Script.sol";
import {Diamond} from "contracts/state-transition/libraries/Diamond.sol";
import {ChainCreationParams} from "contracts/state-transition/IStateTransitionManager.sol";
import {FeeParams} from "contracts/state-transition/chain-deps/ZkSyncHyperchainStorage.sol";
import "contracts/dev-contracts/test/DummyHyperchain.sol";
import {ChainCreationParams} from "contracts/state-transition/IChainTypeManager.sol";
import {FeeParams} from "contracts/state-transition/chain-deps/ZKChainStorage.sol";
import "contracts/dev-contracts/test/DummyZKChain.sol";
import {TestnetERC20Token} from "contracts/dev-contracts/TestnetERC20Token.sol";
import {TransparentUpgradeableProxy} from "@openzeppelin/contracts-v4/proxy/transparent/TransparentUpgradeableProxy.sol";

import {L1Nullifier} from "contracts/bridge/L1Nullifier.sol";
import {L1NullifierDev} from "contracts/dev-contracts/L1NullifierDev.sol";

contract ChainRegistrarTest is Test {
DummyBridgehub private bridgeHub;
DummyStateTransitionManagerWBH private stm;
DummyChainTypeManagerWBH private ctm;
address private admin;
address private deployer;
ChainRegistrar private chainRegistrar;
L1SharedBridge private sharedBridge;
L1AssetRouter private assetRouter;
bytes diamondCutData;
bytes initCalldata;
address l1NullifierAddress;
L1Nullifier l1NullifierImpl;
L1Nullifier l1Nullifier;

constructor() public {
constructor() {
bridgeHub = new DummyBridgehub();
stm = new DummyStateTransitionManagerWBH(address(bridgeHub));
ctm = new DummyChainTypeManagerWBH(address(bridgeHub));
admin = makeAddr("admin");
deployer = makeAddr("deployer");
address defaultOwner = bridgeHub.owner();
vm.prank(defaultOwner);
bridgeHub.transferOwnership(admin);
vm.prank(admin);
bridgeHub.acceptOwnership();

sharedBridge = new L1SharedBridge({
l1NullifierImpl = new L1NullifierDev({
_bridgehub: IBridgehub(address(bridgeHub)),
_eraChainId: 270,
_eraDiamondProxy: makeAddr("era")
});

assetRouter = new L1AssetRouter({
_l1WethAddress: makeAddr("weth"),
_bridgehub: IBridgehub(bridgeHub),
_bridgehub: address(bridgeHub),
_l1Nullifier: address(l1NullifierImpl),
_eraChainId: 270,
_eraDiamondProxy: makeAddr("era")
});
address defaultOwnerSb = sharedBridge.owner();
address defaultOwnerSb = assetRouter.owner();
vm.prank(defaultOwnerSb);
sharedBridge.transferOwnership(admin);
assetRouter.transferOwnership(admin);
vm.startPrank(admin);
sharedBridge.acceptOwnership();
bridgeHub.setSharedBridge(address(sharedBridge));
bridgeHub.addStateTransitionManager(address(stm));
bridgeHub.addToken(ETH_TOKEN_ADDRESS);
assetRouter.acceptOwnership();
bridgeHub.setSharedBridge(address(assetRouter));

Diamond.FacetCut[] memory facetCuts = new Diamond.FacetCut[](0);

Expand Down Expand Up @@ -87,17 +94,19 @@ contract ChainRegistrarTest is Test {
initAddress: makeAddr("init"),
initCalldata: initCalldata
});

ChainCreationParams memory chainCreationParams = ChainCreationParams({
genesisUpgrade: makeAddr("genesis"),
genesisBatchHash: bytes32(uint256(0x01)),
genesisIndexRepeatedStorageChanges: 0x01,
genesisBatchCommitment: bytes32(uint256(0x01)),
diamondCut: diamondCutDataStruct
diamondCut: diamondCutDataStruct,
forceDeploymentsData: hex""
});
diamondCutData = abi.encode(diamondCutDataStruct);
vm.stopPrank();
vm.prank(stm.admin());
stm.setChainCreationParams(chainCreationParams);
vm.prank(ctm.admin());
ctm.setChainCreationParams(chainCreationParams);
address chainRegistrarImplementation = address(new ChainRegistrar());
TransparentUpgradeableProxy chainRegistrarProxy = new TransparentUpgradeableProxy(
chainRegistrarImplementation,
Expand Down Expand Up @@ -243,13 +252,11 @@ contract ChainRegistrarTest is Test {
}

function registerChainAndVerify(address author, uint256 chainId) internal {
DummyHyperchain hyperchain = new DummyHyperchain(address(bridgeHub), 270);
hyperchain.initialize(admin);
DummyZKChain zkChain = new DummyZKChain(address(bridgeHub), 270, 6);
vm.prank(admin);
stm.setHyperchain(1, address(hyperchain));
bridgeHub.setStateTransitionManager(chainId, address(stm));
ctm.setZKChain(1, address(zkChain));
vm.prank(admin);
sharedBridge.initializeChainGovernance(chainId, makeAddr("l2bridge"));
//assetRouter.initializeChainGovernance(chainId, makeAddr("l2bridge"));
ChainRegistrar.RegisteredChainConfig memory registeredConfig = chainRegistrar.getRegisteredChainConfig(chainId);
(
uint256 proposedChainId,
Expand Down

0 comments on commit fec1c24

Please sign in to comment.