diff --git a/.github/workflows/docker-release.yml b/.github/workflows/docker-release.yml index c695ef58..57650712 100644 --- a/.github/workflows/docker-release.yml +++ b/.github/workflows/docker-release.yml @@ -45,7 +45,7 @@ jobs: - name: Build deploy image id: build_deploy_image env: - REPOSITORY: scrolltech/scroll-stack-contracts + REPOSITORY: shuunifra/scroll-stack-contracts uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0 with: platforms: linux/amd64,linux/arm64 @@ -58,7 +58,7 @@ jobs: - name: Build gen image id: build_gen_image env: - REPOSITORY: scrolltech/scroll-stack-contracts + REPOSITORY: shuunifra/scroll-stack-contracts uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0 with: platforms: linux/amd64,linux/arm64 @@ -67,3 +67,16 @@ jobs: file: docker/Dockerfile.gen-configs tags: | ${{ env.REPOSITORY }}:gen-configs-${{ github.sha }} + + - name: Build verify image + id: build_verify_image + env: + REPOSITORY: shuunifra/scroll-stack-contracts + uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0 + with: + platforms: linux/amd64,linux/arm64 + push: true + context: . + file: docker/Dockerfile.verify + tags: | + ${{ env.REPOSITORY }}:verify-${{ github.sha }} diff --git a/docker/config-example.toml b/docker/config-example.toml index e4098e52..64c51c6e 100644 --- a/docker/config-example.toml +++ b/docker/config-example.toml @@ -69,8 +69,8 @@ MAX_BATCH_IN_BUNDLE = 30 MAX_L1_MESSAGE_GAS_LIMIT = 10_000_000 TEST_ENV_MOCK_FINALIZE_ENABLED = true TEST_ENV_MOCK_FINALIZE_TIMEOUT_SEC = 300 -FINALIZE_BATCH_DEADLINE_SEC = 43200 -RELAY_MESSAGE_DEADLINE_SEC = 21600 +FINALIZE_BATCH_DEADLINE_SEC = 4 +RELAY_MESSAGE_DEADLINE_SEC = 5 [frontend] diff --git a/docker/scripts/verify.sh b/docker/scripts/verify.sh index a9d694c5..4460ae2e 100644 --- a/docker/scripts/verify.sh +++ b/docker/scripts/verify.sh @@ -48,7 +48,7 @@ get_source_code_name() { L1_SCROLL_MESSENGER_PROXY_ADDR) echo TransparentUpgradeableProxy ;; L1_ENFORCED_TX_GATEWAY_IMPLEMENTATION_ADDR) echo EnforcedTxGateway ;; L1_ENFORCED_TX_GATEWAY_PROXY_ADDR) echo TransparentUpgradeableProxy ;; - L1_ZKEVM_VERIFIER_V2_ADDR) echo ZkEvmVerifierV2 ;; + L1_ZKEVM_VERIFIER_V1_ADDR) echo ZkEvmVerifierV2 ;; L1_MULTIPLE_VERSION_ROLLUP_VERIFIER_ADDR ) echo MultipleVersionRollupVerifierSetOwner ;; L1_MESSAGE_QUEUE_V1_IMPLEMENTATION_ADDR) echo L1MessageQueueV1WithGasPriceOracle ;; L1_MESSAGE_QUEUE_V1_PROXY_ADDR) echo TransparentUpgradeableProxy ;; diff --git a/docker/templates/config-contracts.toml b/docker/templates/config-contracts.toml index ee564283..204dafd4 100644 --- a/docker/templates/config-contracts.toml +++ b/docker/templates/config-contracts.toml @@ -7,7 +7,7 @@ L1_SCROLL_MESSENGER_PROXY_ADDR = "" L1_ENFORCED_TX_GATEWAY_IMPLEMENTATION_ADDR = "" L1_ENFORCED_TX_GATEWAY_PROXY_ADDR = "" L1_PLONK_VERIFIER_ADDR = "" -L1_ZKEVM_VERIFIER_V2_ADDR = "" +L1_ZKEVM_VERIFIER_V1_ADDR = "" L1_MULTIPLE_VERSION_ROLLUP_VERIFIER_ADDR = "" L1_MESSAGE_QUEUE_V1_IMPLEMENTATION_ADDR = "" L1_MESSAGE_QUEUE_V1_PROXY_ADDR = "" @@ -60,4 +60,3 @@ L2_WETH_GATEWAY_IMPLEMENTATION_ADDR = "" L2_CUSTOM_ERC20_GATEWAY_IMPLEMENTATION_ADDR = "" L2_ERC721_GATEWAY_IMPLEMENTATION_ADDR = "" L2_ERC1155_GATEWAY_IMPLEMENTATION_ADDR = "" -L1_ZKEVM_VERIFIER_EUCLIDl_ADDR = "" \ No newline at end of file diff --git a/foundry.toml b/foundry.toml index 10e43765..5000db55 100644 --- a/foundry.toml +++ b/foundry.toml @@ -9,7 +9,7 @@ libs = ["lib"] remappings = [] # a list of remappings libraries = [] # a list of deployed libraries to link against cache = true # whether to cache builds or not -# force = true # whether to ignore the cache (clean build) +force = false # whether to ignore the cache (clean build) evm_version = 'cancun' # the evm version (by hardfork name) solc_version = '0.8.24' # override for the solc version (setting this ignores `auto_detect_solc`) optimizer = true # enable or disable the solc optimizer @@ -30,3 +30,8 @@ block_timestamp = 0 # the value of `bl block_difficulty = 0 # the value of `block.difficulty` in tests gas_reports = ["L2GasPriceOracle"] + +# remove bytecode hash for reliable deterministic addresses +bytecode_hash = 'none' + +# file system permissions diff --git a/scripts/deterministic/DeployScroll.s.sol b/scripts/deterministic/DeployScroll.s.sol index 34f1e120..7d448e06 100644 --- a/scripts/deterministic/DeployScroll.s.sol +++ b/scripts/deterministic/DeployScroll.s.sol @@ -24,8 +24,7 @@ import {MultipleVersionRollupVerifierSetOwner} from "./contracts/MultipleVersion import {ScrollChain} from "../../src/L1/rollup/ScrollChain.sol"; import {ZkEvmVerifierV2} from "../../src/libraries/verifier/ZkEvmVerifierV2.sol"; import {GasTokenExample} from "../../src/alternative-gas-token/GasTokenExample.sol"; - -//import {L1ScrollMessengerNonETH} from "../../src/alternative-gas-token/L1ScrollMessengerNonETH.sol"; //shu@unifra.io GROUP01 +import {L1ScrollMessengerNonETH} from "../../src/alternative-gas-token/L1ScrollMessengerNonETH.sol"; import {L1GasTokenGateway} from "../../src/alternative-gas-token/L1GasTokenGateway.sol"; import {L1WrappedTokenGateway} from "../../src/alternative-gas-token/L1WrappedTokenGateway.sol"; @@ -40,18 +39,19 @@ import {L2WETHGateway} from "../../src/L2/gateways/L2WETHGateway.sol"; import {L1GasPriceOracle} from "../../src/L2/predeploys/L1GasPriceOracle.sol"; import {L2MessageQueue} from "../../src/L2/predeploys/L2MessageQueue.sol"; import {L2TxFeeVault} from "../../src/L2/predeploys/L2TxFeeVault.sol"; -//import {L2TxFeeVaultWithGasToken} from "../../src/alternative-gas-token/L2TxFeeVaultWithGasToken.sol"; //shu@unifra.io GROUP02 +import {L2TxFeeVaultWithGasToken} from "../../src/alternative-gas-token/L2TxFeeVaultWithGasToken.sol"; import {Whitelist} from "../../src/L2/predeploys/Whitelist.sol"; import {WrappedEther} from "../../src/L2/predeploys/WrappedEther.sol"; import {ScrollStandardERC20} from "../../src/libraries/token/ScrollStandardERC20.sol"; import {ScrollStandardERC20FactorySetOwner} from "./contracts/ScrollStandardERC20FactorySetOwner.sol"; import {ScrollChainMockFinalize} from "../../src/mocks/ScrollChainMockFinalize.sol"; -import {SystemConfig} from "../../src/L1/system-contract/SystemConfig.sol"; -import {ZkEvmVerifierPostEuclid} from "../../src/libraries/verifier/ZkEvmVerifierPostEuclid.sol"; + import "./Constants.sol"; import "./Configuration.sol"; import "./DeterministicDeployment.sol"; +import {SystemConfig} from "../../src/L1/system-contract/SystemConfig.sol"; +import {ZkEvmVerifierPostEuclid} from "../../src/libraries/verifier/ZkEvmVerifierPostEuclid.sol"; import {console} from "forge-std/Script.sol"; /// @dev The minimum deployer account balance. @@ -114,8 +114,7 @@ contract DeployScroll is DeterministicDeployment { address internal L1_WETH_GATEWAY_PROXY_ADDR; address internal L1_WHITELIST_ADDR; address internal L1_PLONK_VERIFIER_ADDR; - address internal L1_ZKEVM_VERIFIER_V2_ADDR; - address internal L1_ZKEVM_VERIFIER_EUCLIDl_ADDR; + address internal L1_ZKEVM_VERIFIER_V1_ADDR; address internal L1_GAS_TOKEN_ADDR; address internal L1_GAS_TOKEN_GATEWAY_IMPLEMENTATION_ADDR; address internal L1_GAS_TOKEN_GATEWAY_PROXY_ADDR; @@ -203,7 +202,9 @@ contract DeployScroll is DeterministicDeployment { function run(string memory layer, string memory scriptMode) public { broadcastLayer = parseLayer(layer); ScriptMode mode = parseScriptMode(scriptMode); + DeterministicDeployment.initialize(mode); + checkDeployerBalance(); deployAllContracts(); initializeL1Contracts(); @@ -332,11 +333,8 @@ contract DeployScroll is DeterministicDeployment { function deployAllContracts() private { deployL1Contracts1stPass(); - deployL2Contracts1stPass(); - deployL1Contracts2ndPass(); - deployL2Contracts2ndPass(); } @@ -349,21 +347,19 @@ contract DeployScroll is DeterministicDeployment { deployL1SystemConfig(); deployL1Whitelist(); deployL1ScrollChainProxy(); - deployL1EnforcedTxGatewayProxy(); deployL1ScrollMessengerProxy(); - deployL1ETHGatewayProxy(); + deployL1EnforcedTxGatewayProxy(); + deployL1MessageQueueProxy(); deployL1PlonkVerifier(); deployL1ZkEvmVerifier(); deployL1MultipleVersionRollupVerifier(); deployL1EnforcedTxGatewayImpl(); - deployL1MessageQueue(); - deployL1ScrollChain(); deployL1GatewayRouter(); - + deployL1ETHGatewayProxy(); deployL1WETHGatewayProxy(); deployL1StandardERC20GatewayProxy(); deployL1CustomERC20GatewayProxy(); @@ -543,26 +539,7 @@ contract DeployScroll is DeterministicDeployment { constructorArgs ); - //upgrade(L2_PROXY_ADMIN_ADDR, L1_ENFORCED_TX_GATEWAY_PROXY_ADDR, L1_ENFORCED_TX_GATEWAY_IMPLEMENTATION_ADDR); - } - - function deployL1EnforcedTxGateway() private { - L1_ENFORCED_TX_GATEWAY_IMPLEMENTATION_ADDR = deploy( - "L1_ENFORCED_TX_GATEWAY_IMPLEMENTATION", - type(EnforcedTxGateway).creationCode - ); - - bytes memory args = abi.encode( - notnull(L1_ENFORCED_TX_GATEWAY_IMPLEMENTATION_ADDR), - notnull(L1_PROXY_ADMIN_ADDR), - new bytes(0) - ); - - L1_ENFORCED_TX_GATEWAY_PROXY_ADDR = deploy( - "L1_ENFORCED_TX_GATEWAY_PROXY", - type(TransparentUpgradeableProxy).creationCode, - args - ); + upgrade(L1_PROXY_ADMIN_ADDR, L1_ENFORCED_TX_GATEWAY_PROXY_ADDR, L1_ENFORCED_TX_GATEWAY_IMPLEMENTATION_ADDR); } function deployL1PlonkVerifier() private { @@ -570,29 +547,25 @@ contract DeployScroll is DeterministicDeployment { } function deployL1ZkEvmVerifier() private { - // bytes memory args = abi.encode(notnull(L1_PLONK_VERIFIER_ADDR), V4_VERIFIER_DIGEST); - // L1_ZKEVM_VERIFIER_V2_ADDR = deploy("L1_ZKEVM_VERIFIER_V2", type(ZkEvmVerifierV2).creationCode, args); - //TODO shu@unifra.io WHERE is VERIFIER_DIGEST_1 bytes32 VERIFIER_DIGEST_1 = 0x0000000000000000111111111111111100000000000000001111111111111111; bytes32 VERIFIER_DIGEST_2 = 0x0000000000000000111111111111111100000000000000001111111111111112; - // ZkEvmVerifierPostEuclid x = new ZkEvmVerifierPostEuclid( - // L1_PLONK_VERIFIER_ADDR, - // VERIFIER_DIGEST_1, - // VERIFIER_DIGEST_2 - // ); - bytes memory constructorArgs = abi.encode( notnull(L1_PLONK_VERIFIER_ADDR), VERIFIER_DIGEST_1, VERIFIER_DIGEST_2 ); - L1_ZKEVM_VERIFIER_EUCLIDl_ADDR = deploy( - "L1_ZKEVM_VERIFIER_EUCLIDl", + L1_ZKEVM_VERIFIER_V1_ADDR = deploy( + "L1_ZKEVM_VERIFIER_V1", type(ZkEvmVerifierPostEuclid).creationCode, constructorArgs ); + /* + zkEvmVerifier = new ZkEvmVerifierPostEuclid(L1_PLONK_VERIFIER_ADDR, VERIFIER_DIGEST_1, VERIFIER_DIGEST_2); + + logAddress("L1_ZKEVM_VERIFIER_V1_ADDR", address(zkEvmVerifier)); + */ } function deployL1MultipleVersionRollupVerifier() private { @@ -602,7 +575,7 @@ contract DeployScroll is DeterministicDeployment { // register V4 verifier: DarwinV2 upgrade, plonk verifier v0.13.1 // version 6 comes from 'scripts/foundry/DeployL1BridgeContracts.s.sol:deployMultipleVersionRollupVerifier' _versions[0] = 6; - _verifiers[0] = notnull(L1_ZKEVM_VERIFIER_EUCLIDl_ADDR); + _verifiers[0] = notnull(L1_ZKEVM_VERIFIER_V1_ADDR); bytes memory args = abi.encode(DEPLOYER_ADDR, _versions, _verifiers); L1_MULTIPLE_VERSION_ROLLUP_VERIFIER_ADDR = deploy( "L1_MULTIPLE_VERSION_ROLLUP_VERIFIER", @@ -662,19 +635,9 @@ contract DeployScroll is DeterministicDeployment { ); upgrade(L1_PROXY_ADMIN_ADDR, L1_MESSAGE_QUEUE_V2_PROXY_ADDR, L1_MESSAGE_QUEUE_V2_IMPLEMENTATION_ADDR); - - //upgrade(L2_PROXY_ADMIN_ADDR, L1_ENFORCED_TX_GATEWAY_PROXY_ADDR, L1_ENFORCED_TX_GATEWAY_IMPLEMENTATION_ADDR); } function deployL1ScrollChain() private { - // ScrollChain constructor( - // uint64 _chainId, - // address _messageQueueV1, - // address _messageQueueV2, - // address _verifier, - // address _system - // ) - bytes memory args = abi.encode( CHAIN_ID_L2, notnull(L1_MESSAGE_QUEUE_V1_PROXY_ADDR), @@ -882,17 +845,15 @@ contract DeployScroll is DeterministicDeployment { if (!ALTERNATIVE_GAS_TOKEN_ENABLED) { bytes memory args = abi.encode(DEPLOYER_ADDR, L1_FEE_VAULT_ADDR, FEE_VAULT_MIN_WITHDRAW_AMOUNT); L2_TX_FEE_VAULT_ADDR = deploy("L2_TX_FEE_VAULT", type(L2TxFeeVault).creationCode, args); + } else { + bytes memory args = abi.encode( + L2_ETH_GATEWAY_PROXY_ADDR, + DEPLOYER_ADDR, + L1_FEE_VAULT_ADDR, + FEE_VAULT_MIN_WITHDRAW_AMOUNT + ); + L2_TX_FEE_VAULT_ADDR = deploy("L2_TX_FEE_VAULT", type(L2TxFeeVaultWithGasToken).creationCode, args); } - // shu@unifra.io GROUP02 - // else { - // bytes memory args = abi.encode( - // L2_ETH_GATEWAY_PROXY_ADDR, - // DEPLOYER_ADDR, - // L1_FEE_VAULT_ADDR, - // FEE_VAULT_MIN_WITHDRAW_AMOUNT - // ); - // L2_TX_FEE_VAULT_ADDR = deploy("L2_TX_FEE_VAULT", type(L2TxFeeVaultWithGasToken).creationCode, args); - // } } function deployL2ProxyAdmin() private { @@ -1021,28 +982,21 @@ contract DeployScroll is DeterministicDeployment { ***************************/ function deployL1ScrollMessenger() private { - //default ALTERNATIVE_GAS_TOKEN_ENABLED is false //shu@unifra.io GROUP01 if (ALTERNATIVE_GAS_TOKEN_ENABLED) { - // bytes memory args = abi.encode( - // notnull(L1_GAS_TOKEN_GATEWAY_PROXY_ADDR), - // notnull(L2_SCROLL_MESSENGER_PROXY_ADDR), - // notnull(L1_SCROLL_CHAIN_PROXY_ADDR), - // notnull(L1_MESSAGE_QUEUE_V2_PROXY_ADDR) - // ); - // L1_SCROLL_MESSENGER_IMPLEMENTATION_ADDR = deploy( - // "L1_SCROLL_MESSENGER_IMPLEMENTATION", - // type(L1ScrollMessengerNonETH).creationCode, - // args - // ); + bytes memory args = abi.encode( + notnull(L1_GAS_TOKEN_GATEWAY_PROXY_ADDR), + notnull(L2_SCROLL_MESSENGER_PROXY_ADDR), + notnull(L1_SCROLL_CHAIN_PROXY_ADDR), + notnull(L1_MESSAGE_QUEUE_V1_PROXY_ADDR), + notnull(L1_MESSAGE_QUEUE_V2_PROXY_ADDR) + ); + + L1_SCROLL_MESSENGER_IMPLEMENTATION_ADDR = deploy( + "L1_SCROLL_MESSENGER_IMPLEMENTATION", + type(L1ScrollMessengerNonETH).creationCode, + args + ); } else { - /* - L1ScrollMessenger - constructor( - address _counterpart, - address _rollup, - address _messageQueueV1, - address _messageQueueV2) - */ bytes memory args = abi.encode( notnull(L2_SCROLL_MESSENGER_PROXY_ADDR), notnull(L1_SCROLL_CHAIN_PROXY_ADDR), @@ -1390,14 +1344,13 @@ contract DeployScroll is DeterministicDeployment { } function initializeEnforcedTxGateway() private { - //TODO shu@unifra.io in DogeOs, we do not need it - // if (getInitializeCount(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR) == 0) { - // EnforcedTxGateway(payable(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR)).initialize(); - // } - // // disable gateway - // if (!EnforcedTxGateway(payable(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR)).paused()) { - // EnforcedTxGateway(payable(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR)).setPause(true); - // } + if (getInitializeCount(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR) == 0) { + EnforcedTxGateway(payable(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR)).initialize(); + } + // disable gateway + if (!EnforcedTxGateway(payable(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR)).paused()) { + EnforcedTxGateway(payable(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR)).setPause(true); + } } function initializeL1GatewayRouter() private { @@ -1531,7 +1484,7 @@ contract DeployScroll is DeterministicDeployment { } function transferL1ContractOwnership() private { - //transferOwnership(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR, OWNER_ADDR); + transferOwnership(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR, OWNER_ADDR); transferOwnership(L1_SYSTEM_CONFIG_PROXY_ADDR, OWNER_ADDR); transferOwnership(L1_CUSTOM_ERC20_GATEWAY_PROXY_ADDR, OWNER_ADDR); transferOwnership(L1_ERC1155_GATEWAY_PROXY_ADDR, OWNER_ADDR); diff --git a/scripts/deterministic/GenerateGenesis.s.sol b/scripts/deterministic/GenerateGenesis.s.sol index c78d1a0d..0955298f 100644 --- a/scripts/deterministic/GenerateGenesis.s.sol +++ b/scripts/deterministic/GenerateGenesis.s.sol @@ -4,7 +4,7 @@ pragma solidity =0.8.24; import {L1GasPriceOracle} from "../../src/L2/predeploys/L1GasPriceOracle.sol"; import {L2MessageQueue} from "../../src/L2/predeploys/L2MessageQueue.sol"; import {L2TxFeeVault} from "../../src/L2/predeploys/L2TxFeeVault.sol"; -//import {L2TxFeeVaultWithGasToken} from "../../src/alternative-gas-token/L2TxFeeVaultWithGasToken.sol"; //shu@unifra.io GROUP02 +import {L2TxFeeVaultWithGasToken} from "../../src/alternative-gas-token/L2TxFeeVaultWithGasToken.sol"; import {Whitelist} from "../../src/L2/predeploys/Whitelist.sol"; import {WrappedEther} from "../../src/L2/predeploys/WrappedEther.sol"; @@ -160,18 +160,15 @@ contract GenerateGenesis is DeployScroll { vm.prank(DEPLOYER_ADDR); _vault.updateMessenger(L2_SCROLL_MESSENGER_PROXY_ADDR); _vaultAddr = address(_vault); + } else { + L2TxFeeVaultWithGasToken _vault = new L2TxFeeVaultWithGasToken( + L2_ETH_GATEWAY_PROXY_ADDR, + DEPLOYER_ADDR, + L1_FEE_VAULT_ADDR, + FEE_VAULT_MIN_WITHDRAW_AMOUNT + ); + _vaultAddr = address(_vault); } - //else - //shu@unifra.io GROUP02 - // { - // L2TxFeeVaultWithGasToken _vault = new L2TxFeeVaultWithGasToken( - // L2_ETH_GATEWAY_PROXY_ADDR, - // DEPLOYER_ADDR, - // L1_FEE_VAULT_ADDR, - // FEE_VAULT_MIN_WITHDRAW_AMOUNT - // ); - // _vaultAddr = address(_vault); - // } vm.etch(predeployAddr, _vaultAddr.code); @@ -247,20 +244,20 @@ contract GenerateGenesis is DeployScroll { vm.toString(L1_MESSAGE_QUEUE_V1_PROXY_ADDR), GENESIS_JSON_PATH, ".config.scroll.l1Config.l1MessageQueueAddress" - ); - + ); + + vm.writeJson( + vm.toString(L1_SCROLL_CHAIN_PROXY_ADDR), + GENESIS_JSON_PATH, + ".config.scroll.l1Config.scrollChainAddress" + ); + vm.writeJson( vm.toString(L1_MESSAGE_QUEUE_V2_PROXY_ADDR), GENESIS_JSON_PATH, ".config.scroll.l1Config.l1MessageQueueV2Address" ); - vm.writeJson( - vm.toString(L1_SCROLL_CHAIN_PROXY_ADDR), - GENESIS_JSON_PATH, - ".config.scroll.l1Config.scrollChainAddress" - ); - vm.writeJson( vm.toString(L1_SYSTEM_CONFIG_PROXY_ADDR), GENESIS_JSON_PATH, diff --git a/src/package.json b/src/package.json index 65e36b9c..555c1a1e 100644 --- a/src/package.json +++ b/src/package.json @@ -9,6 +9,7 @@ "files": [ "L1/gateways", "L1/rollup/IL1MessageQueueV1.sol", + "L1/rollup/IL1MessageQueueV2.sol", "L1/rollup/IL2GasPriceOracle.sol", "L1/rollup/IScrollChain.sol", "L1/IL1ScrollMessenger.sol",