From 7b0b840f7ed12dc49039ce6beb4c0b230bf48d18 Mon Sep 17 00:00:00 2001 From: Morty <70688412+yiweichi@users.noreply.github.com> Date: Thu, 25 Jul 2024 02:10:29 +0800 Subject: [PATCH 1/9] fix: log addresses script mode (#15) --- scripts/deterministic/DeterministicDeployment.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/deterministic/DeterministicDeployment.sol b/scripts/deterministic/DeterministicDeployment.sol index 4bc8d11..adae418 100644 --- a/scripts/deterministic/DeterministicDeployment.sol +++ b/scripts/deterministic/DeterministicDeployment.sol @@ -72,7 +72,7 @@ abstract contract DeterminsticDeployment is Configuration { function setScriptMode(string memory scriptMode) internal { if (keccak256(bytes(scriptMode)) == keccak256(bytes("log-addresses"))) { - mode = ScriptMode.WriteConfig; + mode = ScriptMode.LogAddresses; } else if (keccak256(bytes(scriptMode)) == keccak256(bytes("write-config"))) { mode = ScriptMode.WriteConfig; } else if (keccak256(bytes(scriptMode)) == keccak256(bytes("verify-config"))) { From cdc9db123f0dcc3dcfffdd1b395456f260cef9e3 Mon Sep 17 00:00:00 2001 From: Morty <70688412+yiweichi@users.noreply.github.com> Date: Thu, 25 Jul 2024 18:27:49 +0800 Subject: [PATCH 2/9] feat: generate rollup explorer backend config (#14) --- docker/config-example.toml | 1 + docker/scripts/gen-configs.sh | 4 +++ .../rollup-explorer-backend-config.json | 5 +++ scripts/deterministic/Configuration.sol | 2 ++ scripts/deterministic/Constants.sol | 2 ++ scripts/deterministic/GenerateConfigs.s.sol | 32 ++++++++++++++++++- 6 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 docker/templates/rollup-explorer-backend-config.json diff --git a/docker/config-example.toml b/docker/config-example.toml index 06786a6..85a2743 100644 --- a/docker/config-example.toml +++ b/docker/config-example.toml @@ -43,6 +43,7 @@ L2GETH_SIGNER_0_ADDRESS = "0x756EA06BDEe36de11F22DCca45a31d8a178eF3c6" SCROLL_DB_CONNECTION_STRING = "postgres://postgres:scroll2022@db:5432/scroll?sslmode=disable" CHAIN_MONITOR_DB_CONNECTION_STRING = "postgres://postgres:scroll2022@db:5432/chain_monitor?sslmode=disable" BRIDGE_HISTORY_DB_CONNECTION_STRING = "postgres://postgres:scroll2022@db:5432/bridge_history?sslmode=disable" +ROLLUP_EXPLORER_DB_CONNECTION_STRING = "postgres://postgres:scroll2022@db:5432/rollup_explorer?sslmode=disable" [genesis] diff --git a/docker/scripts/gen-configs.sh b/docker/scripts/gen-configs.sh index 00da4f0..0a42c78 100755 --- a/docker/scripts/gen-configs.sh +++ b/docker/scripts/gen-configs.sh @@ -31,3 +31,7 @@ forge script scripts/deterministic/GenerateConfigs.s.sol:GenerateBalanceCheckerC echo "" echo "generating .env.frontend" forge script scripts/deterministic/GenerateConfigs.s.sol:GenerateFrontendConfig || exit 1 + +echo "" +echo "generating rollup-explorer-backend-config.json" +forge script scripts/deterministic/GenerateConfigs.s.sol:GenerateRollupExplorerBackendConfig || exit 1 diff --git a/docker/templates/rollup-explorer-backend-config.json b/docker/templates/rollup-explorer-backend-config.json new file mode 100644 index 0000000..a8ec249 --- /dev/null +++ b/docker/templates/rollup-explorer-backend-config.json @@ -0,0 +1,5 @@ +{ + "db_url": null, + "open_api_addr": "/rollupscan", + "max_per_page": 500 +} \ No newline at end of file diff --git a/scripts/deterministic/Configuration.sol b/scripts/deterministic/Configuration.sol index 8473bed..a39f682 100644 --- a/scripts/deterministic/Configuration.sol +++ b/scripts/deterministic/Configuration.sol @@ -59,6 +59,7 @@ abstract contract Configuration is Script { string internal SCROLL_DB_CONNECTION_STRING; string internal CHAIN_MONITOR_DB_CONNECTION_STRING; string internal BRIDGE_HISTORY_DB_CONNECTION_STRING; + string internal ROLLUP_EXPLORER_BACKEND_DB_CONNECTION_STRING; // genesis uint256 internal L2_MAX_ETH_SUPPLY; @@ -129,6 +130,7 @@ abstract contract Configuration is Script { SCROLL_DB_CONNECTION_STRING = cfg.readString(".db.SCROLL_DB_CONNECTION_STRING"); CHAIN_MONITOR_DB_CONNECTION_STRING = cfg.readString(".db.CHAIN_MONITOR_DB_CONNECTION_STRING"); BRIDGE_HISTORY_DB_CONNECTION_STRING = cfg.readString(".db.BRIDGE_HISTORY_DB_CONNECTION_STRING"); + ROLLUP_EXPLORER_BACKEND_DB_CONNECTION_STRING = cfg.readString(".db.ROLLUP_EXPLORER_DB_CONNECTION_STRING"); L2_MAX_ETH_SUPPLY = cfg.readUint(".genesis.L2_MAX_ETH_SUPPLY"); L2_DEPLOYER_INITIAL_BALANCE = cfg.readUint(".genesis.L2_DEPLOYER_INITIAL_BALANCE"); diff --git a/scripts/deterministic/Constants.sol b/scripts/deterministic/Constants.sol index ff02d60..58395a5 100644 --- a/scripts/deterministic/Constants.sol +++ b/scripts/deterministic/Constants.sol @@ -19,6 +19,7 @@ string constant COORDINATOR_CONFIG_TEMPLATE_PATH = "./docker/templates/coordinat string constant CHAIN_MONITOR_CONFIG_TEMPLATE_PATH = "./docker/templates/chain-monitor-config.json"; string constant BRIDGE_HISTORY_CONFIG_TEMPLATE_PATH = "./docker/templates/bridge-history-config.json"; string constant BALANCE_CHECKER_CONFIG_TEMPLATE_PATH = "./docker/templates/balance-checker-config.json"; +string constant ROLLUP_EXPLORER_BACKEND_CONFIG_TEMPLATE_PATH = "./docker/templates/rollup-explorer-backend-config.json"; // input files string constant CONFIG_PATH = "./volume/config.toml"; @@ -33,3 +34,4 @@ string constant CHAIN_MONITOR_CONFIG_PATH = "./volume/chain-monitor-config.json" string constant BRIDGE_HISTORY_CONFIG_PATH = "./volume/bridge-history-config.json"; string constant BALANCE_CHECKER_CONFIG_PATH = "./volume/balance-checker-config.json"; string constant FRONTEND_ENV_PATH = "./volume/.env.frontend"; +string constant ROLLUP_EXPLORER_BACKEND_CONFIG_PATH = "./volume/rollup-explorer-backend-config.json"; diff --git a/scripts/deterministic/GenerateConfigs.s.sol b/scripts/deterministic/GenerateConfigs.s.sol index 3cb921c..bb1fc90 100644 --- a/scripts/deterministic/GenerateConfigs.s.sol +++ b/scripts/deterministic/GenerateConfigs.s.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity =0.8.24; -import {BALANCE_CHECKER_CONFIG_PATH, BALANCE_CHECKER_CONFIG_TEMPLATE_PATH, BRIDGE_HISTORY_CONFIG_PATH, BRIDGE_HISTORY_CONFIG_TEMPLATE_PATH, CHAIN_MONITOR_CONFIG_PATH, CHAIN_MONITOR_CONFIG_TEMPLATE_PATH, COORDINATOR_CONFIG_PATH, COORDINATOR_CONFIG_TEMPLATE_PATH, FRONTEND_ENV_PATH, ROLLUP_CONFIG_PATH, ROLLUP_CONFIG_TEMPLATE_PATH} from "./Constants.sol"; +import {BALANCE_CHECKER_CONFIG_PATH, BALANCE_CHECKER_CONFIG_TEMPLATE_PATH, BRIDGE_HISTORY_CONFIG_PATH, BRIDGE_HISTORY_CONFIG_TEMPLATE_PATH, CHAIN_MONITOR_CONFIG_PATH, CHAIN_MONITOR_CONFIG_TEMPLATE_PATH, COORDINATOR_CONFIG_PATH, COORDINATOR_CONFIG_TEMPLATE_PATH, FRONTEND_ENV_PATH, ROLLUP_CONFIG_PATH, ROLLUP_CONFIG_TEMPLATE_PATH, ROLLUP_EXPLORER_BACKEND_CONFIG_PATH, ROLLUP_EXPLORER_BACKEND_CONFIG_TEMPLATE_PATH} from "./Constants.sol"; import {DeployScroll} from "./DeployScroll.s.sol"; contract GenerateRollupConfig is DeployScroll { @@ -326,3 +326,33 @@ contract GenerateFrontendConfig is DeployScroll { vm.writeLine(FRONTEND_ENV_PATH, "REACT_APP_L1_BATCH_BRIDGE_GATEWAY_PROXY_ADDR = \"\""); } } + +contract GenerateRollupExplorerBackendConfig is DeployScroll { + /*************** + * Entry point * + ***************/ + + function run() public { + setScriptMode(ScriptMode.VerifyConfig); + predictAllContracts(); + + generateRollupExplorerBackendConfig(); + } + + /********************* + * Private functions * + *********************/ + + // prettier-ignore + function generateRollupExplorerBackendConfig() private { + // initialize template file + if (vm.exists(ROLLUP_EXPLORER_BACKEND_CONFIG_PATH)) { + vm.removeFile(ROLLUP_EXPLORER_BACKEND_CONFIG_PATH); + } + + string memory template = vm.readFile(ROLLUP_EXPLORER_BACKEND_CONFIG_TEMPLATE_PATH); + vm.writeFile(ROLLUP_EXPLORER_BACKEND_CONFIG_PATH, template); + + vm.writeJson(ROLLUP_EXPLORER_BACKEND_DB_CONNECTION_STRING, ROLLUP_EXPLORER_BACKEND_CONFIG_PATH, ".db_url"); + } +} From f18a59af72ba06f6b1d7feb6b4b12cb101e52b74 Mon Sep 17 00:00:00 2001 From: Morty <70688412+yiweichi@users.noreply.github.com> Date: Mon, 29 Jul 2024 18:32:38 +0800 Subject: [PATCH 3/9] feat: robust deployment script (#16) --- .gitignore | 2 + scripts/deterministic/DeployScroll.s.sol | 411 +++++++++++------- .../deterministic/DeterministicDeployment.sol | 25 +- 3 files changed, 286 insertions(+), 152 deletions(-) diff --git a/.gitignore b/.gitignore index 88e59a6..ecf447b 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,5 @@ broadcast # Visual Studio Code .vscode + +volume \ No newline at end of file diff --git a/scripts/deterministic/DeployScroll.s.sol b/scripts/deterministic/DeployScroll.s.sol index 197e42f..528cb7f 100644 --- a/scripts/deterministic/DeployScroll.s.sol +++ b/scripts/deterministic/DeployScroll.s.sol @@ -1011,111 +1011,145 @@ contract DeployScroll is DeterminsticDeployment { **********************/ function initializeScrollChain() private { - ScrollChain(L1_SCROLL_CHAIN_PROXY_ADDR).initialize( - notnull(L1_MESSAGE_QUEUE_PROXY_ADDR), - notnull(L1_MULTIPLE_VERSION_ROLLUP_VERIFIER_ADDR), - MAX_TX_IN_CHUNK - ); + if (getInitializeCount(L1_SCROLL_CHAIN_PROXY_ADDR) == 0) { + ScrollChain(L1_SCROLL_CHAIN_PROXY_ADDR).initialize( + notnull(L1_MESSAGE_QUEUE_PROXY_ADDR), + notnull(L1_MULTIPLE_VERSION_ROLLUP_VERIFIER_ADDR), + MAX_TX_IN_CHUNK + ); + } - ScrollChain(L1_SCROLL_CHAIN_PROXY_ADDR).addSequencer(L1_COMMIT_SENDER_ADDR); - ScrollChain(L1_SCROLL_CHAIN_PROXY_ADDR).addProver(L1_FINALIZE_SENDER_ADDR); + if (!ScrollChain(L1_SCROLL_CHAIN_PROXY_ADDR).isSequencer(L1_COMMIT_SENDER_ADDR)) { + ScrollChain(L1_SCROLL_CHAIN_PROXY_ADDR).addSequencer(L1_COMMIT_SENDER_ADDR); + } + if (!ScrollChain(L1_SCROLL_CHAIN_PROXY_ADDR).isProver(L1_FINALIZE_SENDER_ADDR)) { + ScrollChain(L1_SCROLL_CHAIN_PROXY_ADDR).addProver(L1_FINALIZE_SENDER_ADDR); + } } function initializeL2GasPriceOracle() private { - L2GasPriceOracle(L2_GAS_PRICE_ORACLE_PROXY_ADDR).initialize( - 21000, // _txGas - 53000, // _txGasContractCreation - 4, // _zeroGas - 16 // _nonZeroGas - ); - - L2GasPriceOracle(L2_GAS_PRICE_ORACLE_PROXY_ADDR).updateWhitelist(L1_WHITELIST_ADDR); + if (getInitializeCount(L2_GAS_PRICE_ORACLE_PROXY_ADDR) == 0) { + L2GasPriceOracle(L2_GAS_PRICE_ORACLE_PROXY_ADDR).initialize( + 21000, // _txGas + 53000, // _txGasContractCreation + 4, // _zeroGas + 16 // _nonZeroGas + ); + } + if (L2GasPriceOracle(L2_GAS_PRICE_ORACLE_PROXY_ADDR).whitelist() != L1_WHITELIST_ADDR) { + L2GasPriceOracle(L2_GAS_PRICE_ORACLE_PROXY_ADDR).updateWhitelist(L1_WHITELIST_ADDR); + } } function initializeL1MessageQueue() private { - L1MessageQueueWithGasPriceOracle(L1_MESSAGE_QUEUE_PROXY_ADDR).initialize( - notnull(L1_SCROLL_MESSENGER_PROXY_ADDR), - notnull(L1_SCROLL_CHAIN_PROXY_ADDR), - notnull(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR), - notnull(L2_GAS_PRICE_ORACLE_PROXY_ADDR), - MAX_L1_MESSAGE_GAS_LIMIT - ); - - L1MessageQueueWithGasPriceOracle(L1_MESSAGE_QUEUE_PROXY_ADDR).initializeV2(); + if (getInitializeCount(L1_MESSAGE_QUEUE_PROXY_ADDR) == 0) { + L1MessageQueueWithGasPriceOracle(L1_MESSAGE_QUEUE_PROXY_ADDR).initialize( + notnull(L1_SCROLL_MESSENGER_PROXY_ADDR), + notnull(L1_SCROLL_CHAIN_PROXY_ADDR), + notnull(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR), + notnull(L2_GAS_PRICE_ORACLE_PROXY_ADDR), + MAX_L1_MESSAGE_GAS_LIMIT + ); + } + if ( + getInitializeCount(L1_MESSAGE_QUEUE_PROXY_ADDR) == 0 || getInitializeCount(L1_MESSAGE_QUEUE_PROXY_ADDR) == 1 + ) { + L1MessageQueueWithGasPriceOracle(L1_MESSAGE_QUEUE_PROXY_ADDR).initializeV2(); + } } function initializeL1ScrollMessenger() private { - L1ScrollMessenger(payable(L1_SCROLL_MESSENGER_PROXY_ADDR)).initialize( - notnull(L2_SCROLL_MESSENGER_PROXY_ADDR), - notnull(L1_FEE_VAULT_ADDR), - notnull(L1_SCROLL_CHAIN_PROXY_ADDR), - notnull(L1_MESSAGE_QUEUE_PROXY_ADDR) - ); + if (getInitializeCount(L1_SCROLL_MESSENGER_PROXY_ADDR) == 0) { + L1ScrollMessenger(payable(L1_SCROLL_MESSENGER_PROXY_ADDR)).initialize( + notnull(L2_SCROLL_MESSENGER_PROXY_ADDR), + notnull(L1_FEE_VAULT_ADDR), + notnull(L1_SCROLL_CHAIN_PROXY_ADDR), + notnull(L1_MESSAGE_QUEUE_PROXY_ADDR) + ); + } } function initializeEnforcedTxGateway() private { - EnforcedTxGateway(payable(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR)).initialize( - notnull(L1_MESSAGE_QUEUE_PROXY_ADDR), - notnull(L1_FEE_VAULT_ADDR) - ); + if (getInitializeCount(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR) == 0) { + EnforcedTxGateway(payable(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR)).initialize( + notnull(L1_MESSAGE_QUEUE_PROXY_ADDR), + notnull(L1_FEE_VAULT_ADDR) + ); + } // disable gateway - EnforcedTxGateway(payable(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR)).setPause(true); + if (!EnforcedTxGateway(payable(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR)).paused()) { + EnforcedTxGateway(payable(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR)).setPause(true); + } } function initializeL1GatewayRouter() private { - L1GatewayRouter(L1_GATEWAY_ROUTER_PROXY_ADDR).initialize( - notnull(L1_ETH_GATEWAY_PROXY_ADDR), - notnull(L1_STANDARD_ERC20_GATEWAY_PROXY_ADDR) - ); + if (getInitializeCount(L1_GATEWAY_ROUTER_PROXY_ADDR) == 0) { + L1GatewayRouter(L1_GATEWAY_ROUTER_PROXY_ADDR).initialize( + notnull(L1_ETH_GATEWAY_PROXY_ADDR), + notnull(L1_STANDARD_ERC20_GATEWAY_PROXY_ADDR) + ); + } } function initializeL1CustomERC20Gateway() private { - L1CustomERC20Gateway(L1_CUSTOM_ERC20_GATEWAY_PROXY_ADDR).initialize( - notnull(L2_CUSTOM_ERC20_GATEWAY_PROXY_ADDR), - notnull(L1_GATEWAY_ROUTER_PROXY_ADDR), - notnull(L1_SCROLL_MESSENGER_PROXY_ADDR) - ); + if (getInitializeCount(L1_CUSTOM_ERC20_GATEWAY_PROXY_ADDR) == 0) { + L1CustomERC20Gateway(L1_CUSTOM_ERC20_GATEWAY_PROXY_ADDR).initialize( + notnull(L2_CUSTOM_ERC20_GATEWAY_PROXY_ADDR), + notnull(L1_GATEWAY_ROUTER_PROXY_ADDR), + notnull(L1_SCROLL_MESSENGER_PROXY_ADDR) + ); + } } function initializeL1ERC1155Gateway() private { - L1ERC1155Gateway(L1_ERC1155_GATEWAY_PROXY_ADDR).initialize( - notnull(L2_ERC1155_GATEWAY_PROXY_ADDR), - notnull(L1_SCROLL_MESSENGER_PROXY_ADDR) - ); + if (getInitializeCount(L1_ERC1155_GATEWAY_PROXY_ADDR) == 0) { + L1ERC1155Gateway(L1_ERC1155_GATEWAY_PROXY_ADDR).initialize( + notnull(L2_ERC1155_GATEWAY_PROXY_ADDR), + notnull(L1_SCROLL_MESSENGER_PROXY_ADDR) + ); + } } function initializeL1ERC721Gateway() private { - L1ERC721Gateway(L1_ERC721_GATEWAY_PROXY_ADDR).initialize( - notnull(L2_ERC721_GATEWAY_PROXY_ADDR), - notnull(L1_SCROLL_MESSENGER_PROXY_ADDR) - ); + if (getInitializeCount(L1_ERC721_GATEWAY_PROXY_ADDR) == 0) { + L1ERC721Gateway(L1_ERC721_GATEWAY_PROXY_ADDR).initialize( + notnull(L2_ERC721_GATEWAY_PROXY_ADDR), + notnull(L1_SCROLL_MESSENGER_PROXY_ADDR) + ); + } } function initializeL1ETHGateway() private { - L1ETHGateway(L1_ETH_GATEWAY_PROXY_ADDR).initialize( - notnull(L2_ETH_GATEWAY_PROXY_ADDR), - notnull(L1_GATEWAY_ROUTER_PROXY_ADDR), - notnull(L1_SCROLL_MESSENGER_PROXY_ADDR) - ); + if (getInitializeCount(L1_ETH_GATEWAY_PROXY_ADDR) == 0) { + L1ETHGateway(L1_ETH_GATEWAY_PROXY_ADDR).initialize( + notnull(L2_ETH_GATEWAY_PROXY_ADDR), + notnull(L1_GATEWAY_ROUTER_PROXY_ADDR), + notnull(L1_SCROLL_MESSENGER_PROXY_ADDR) + ); + } } function initializeL1StandardERC20Gateway() private { - L1StandardERC20Gateway(L1_STANDARD_ERC20_GATEWAY_PROXY_ADDR).initialize( - notnull(L2_STANDARD_ERC20_GATEWAY_PROXY_ADDR), - notnull(L1_GATEWAY_ROUTER_PROXY_ADDR), - notnull(L1_SCROLL_MESSENGER_PROXY_ADDR), - notnull(L2_SCROLL_STANDARD_ERC20_ADDR), - notnull(L2_SCROLL_STANDARD_ERC20_FACTORY_ADDR) - ); + if (getInitializeCount(L1_STANDARD_ERC20_GATEWAY_PROXY_ADDR) == 0) { + L1StandardERC20Gateway(L1_STANDARD_ERC20_GATEWAY_PROXY_ADDR).initialize( + notnull(L2_STANDARD_ERC20_GATEWAY_PROXY_ADDR), + notnull(L1_GATEWAY_ROUTER_PROXY_ADDR), + notnull(L1_SCROLL_MESSENGER_PROXY_ADDR), + notnull(L2_SCROLL_STANDARD_ERC20_ADDR), + notnull(L2_SCROLL_STANDARD_ERC20_FACTORY_ADDR) + ); + } } function initializeL1WETHGateway() private { - L1WETHGateway(payable(L1_WETH_GATEWAY_PROXY_ADDR)).initialize( - notnull(L2_WETH_GATEWAY_PROXY_ADDR), - notnull(L1_GATEWAY_ROUTER_PROXY_ADDR), - notnull(L1_SCROLL_MESSENGER_PROXY_ADDR) - ); + if (getInitializeCount(L1_WETH_GATEWAY_PROXY_ADDR) == 0) { + L1WETHGateway(payable(L1_WETH_GATEWAY_PROXY_ADDR)).initialize( + notnull(L2_WETH_GATEWAY_PROXY_ADDR), + notnull(L1_GATEWAY_ROUTER_PROXY_ADDR), + notnull(L1_SCROLL_MESSENGER_PROXY_ADDR) + ); + } // set WETH gateway in router { @@ -1123,36 +1157,66 @@ contract DeployScroll is DeterminsticDeployment { _tokens[0] = notnull(L1_WETH_ADDR); address[] memory _gateways = new address[](1); _gateways[0] = notnull(L1_WETH_GATEWAY_PROXY_ADDR); - L1GatewayRouter(L1_GATEWAY_ROUTER_PROXY_ADDR).setERC20Gateway(_tokens, _gateways); + if (L1GatewayRouter(L1_GATEWAY_ROUTER_PROXY_ADDR).ERC20Gateway(_tokens[0]) != _gateways[0]) { + L1GatewayRouter(L1_GATEWAY_ROUTER_PROXY_ADDR).setERC20Gateway(_tokens, _gateways); + } } } function initializeL1Whitelist() private { address[] memory accounts = new address[](1); accounts[0] = L1_GAS_ORACLE_SENDER_ADDR; - Whitelist(L1_WHITELIST_ADDR).updateWhitelistStatus(accounts, true); + if (!Whitelist(L1_WHITELIST_ADDR).isSenderAllowed(accounts[0])) { + Whitelist(L1_WHITELIST_ADDR).updateWhitelistStatus(accounts, true); + } } function transferL1ContractOwnership() private { - if (DEPLOYER_ADDR == OWNER_ADDR) { - return; + if (Ownable(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR).owner() != OWNER_ADDR) { + Ownable(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR); + } + if (Ownable(L1_CUSTOM_ERC20_GATEWAY_PROXY_ADDR).owner() != OWNER_ADDR) { + Ownable(L1_CUSTOM_ERC20_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR); + } + if (Ownable(L1_ERC1155_GATEWAY_PROXY_ADDR).owner() != OWNER_ADDR) { + Ownable(L1_ERC1155_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR); + } + if (Ownable(L1_ERC721_GATEWAY_PROXY_ADDR).owner() != OWNER_ADDR) { + Ownable(L1_ERC721_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR); + } + if (Ownable(L1_ETH_GATEWAY_PROXY_ADDR).owner() != OWNER_ADDR) { + Ownable(L1_ETH_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR); + } + if (Ownable(L1_GATEWAY_ROUTER_PROXY_ADDR).owner() != OWNER_ADDR) { + Ownable(L1_GATEWAY_ROUTER_PROXY_ADDR).transferOwnership(OWNER_ADDR); + } + if (Ownable(L1_MESSAGE_QUEUE_PROXY_ADDR).owner() != OWNER_ADDR) { + Ownable(L1_MESSAGE_QUEUE_PROXY_ADDR).transferOwnership(OWNER_ADDR); + } + if (Ownable(L1_SCROLL_MESSENGER_PROXY_ADDR).owner() != OWNER_ADDR) { + Ownable(L1_SCROLL_MESSENGER_PROXY_ADDR).transferOwnership(OWNER_ADDR); + } + if (Ownable(L1_STANDARD_ERC20_GATEWAY_PROXY_ADDR).owner() != OWNER_ADDR) { + Ownable(L1_STANDARD_ERC20_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR); + } + if (Ownable(L1_WETH_GATEWAY_PROXY_ADDR).owner() != OWNER_ADDR) { + Ownable(L1_WETH_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR); + } + if (Ownable(L2_GAS_PRICE_ORACLE_PROXY_ADDR).owner() != OWNER_ADDR) { + Ownable(L2_GAS_PRICE_ORACLE_PROXY_ADDR).transferOwnership(OWNER_ADDR); + } + if (Ownable(L1_MULTIPLE_VERSION_ROLLUP_VERIFIER_ADDR).owner() != OWNER_ADDR) { + Ownable(L1_MULTIPLE_VERSION_ROLLUP_VERIFIER_ADDR).transferOwnership(OWNER_ADDR); + } + if (Ownable(L1_PROXY_ADMIN_ADDR).owner() != OWNER_ADDR) { + Ownable(L1_PROXY_ADMIN_ADDR).transferOwnership(OWNER_ADDR); + } + if (Ownable(L1_SCROLL_CHAIN_PROXY_ADDR).owner() != OWNER_ADDR) { + Ownable(L1_SCROLL_CHAIN_PROXY_ADDR).transferOwnership(OWNER_ADDR); + } + if (Ownable(L1_WHITELIST_ADDR).owner() != OWNER_ADDR) { + Ownable(L1_WHITELIST_ADDR).transferOwnership(OWNER_ADDR); } - - Ownable(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR); - Ownable(L1_CUSTOM_ERC20_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR); - Ownable(L1_ERC1155_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR); - Ownable(L1_ERC721_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR); - Ownable(L1_ETH_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR); - Ownable(L1_GATEWAY_ROUTER_PROXY_ADDR).transferOwnership(OWNER_ADDR); - Ownable(L1_MESSAGE_QUEUE_PROXY_ADDR).transferOwnership(OWNER_ADDR); - Ownable(L1_SCROLL_MESSENGER_PROXY_ADDR).transferOwnership(OWNER_ADDR); - Ownable(L1_STANDARD_ERC20_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR); - Ownable(L1_WETH_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR); - Ownable(L2_GAS_PRICE_ORACLE_PROXY_ADDR).transferOwnership(OWNER_ADDR); - Ownable(L1_MULTIPLE_VERSION_ROLLUP_VERIFIER_ADDR).transferOwnership(OWNER_ADDR); - Ownable(L1_PROXY_ADMIN_ADDR).transferOwnership(OWNER_ADDR); - Ownable(L1_SCROLL_CHAIN_PROXY_ADDR).transferOwnership(OWNER_ADDR); - Ownable(L1_WHITELIST_ADDR).transferOwnership(OWNER_ADDR); } /********************** @@ -1160,73 +1224,97 @@ contract DeployScroll is DeterminsticDeployment { **********************/ function initializeL2MessageQueue() private { - L2MessageQueue(L2_MESSAGE_QUEUE_ADDR).initialize(notnull(L2_SCROLL_MESSENGER_PROXY_ADDR)); + if (L2MessageQueue(L2_MESSAGE_QUEUE_ADDR).messenger() != notnull(L2_SCROLL_MESSENGER_PROXY_ADDR)) { + L2MessageQueue(L2_MESSAGE_QUEUE_ADDR).initialize(L2_SCROLL_MESSENGER_PROXY_ADDR); + } } function initializeL2TxFeeVault() private { - L2TxFeeVault(payable(L2_TX_FEE_VAULT_ADDR)).updateMessenger(notnull(L2_SCROLL_MESSENGER_PROXY_ADDR)); + if (L2TxFeeVault(payable(L2_TX_FEE_VAULT_ADDR)).messenger() != notnull(L2_SCROLL_MESSENGER_PROXY_ADDR)) { + L2TxFeeVault(payable(L2_TX_FEE_VAULT_ADDR)).updateMessenger(L2_SCROLL_MESSENGER_PROXY_ADDR); + } } function initializeL1GasPriceOracle() private { - L1GasPriceOracle(L1_GAS_PRICE_ORACLE_ADDR).updateWhitelist(notnull(L2_WHITELIST_ADDR)); + if (address(L1GasPriceOracle(L1_GAS_PRICE_ORACLE_ADDR).whitelist()) != notnull(L2_WHITELIST_ADDR)) { + L1GasPriceOracle(L1_GAS_PRICE_ORACLE_ADDR).updateWhitelist(L2_WHITELIST_ADDR); + } } function initializeL2ScrollMessenger() private { - L2ScrollMessenger(payable(L2_SCROLL_MESSENGER_PROXY_ADDR)).initialize(notnull(L1_SCROLL_MESSENGER_PROXY_ADDR)); + if (getInitializeCount(L2_SCROLL_MESSENGER_PROXY_ADDR) == 0) { + L2ScrollMessenger(payable(L2_SCROLL_MESSENGER_PROXY_ADDR)).initialize( + notnull(L1_SCROLL_MESSENGER_PROXY_ADDR) + ); + } } function initializeL2GatewayRouter() private { - L2GatewayRouter(L2_GATEWAY_ROUTER_PROXY_ADDR).initialize( - notnull(L2_ETH_GATEWAY_PROXY_ADDR), - notnull(L2_STANDARD_ERC20_GATEWAY_PROXY_ADDR) - ); + if (getInitializeCount(L2_GATEWAY_ROUTER_PROXY_ADDR) == 0) { + L2GatewayRouter(L2_GATEWAY_ROUTER_PROXY_ADDR).initialize( + notnull(L2_ETH_GATEWAY_PROXY_ADDR), + notnull(L2_STANDARD_ERC20_GATEWAY_PROXY_ADDR) + ); + } } function initializeL2CustomERC20Gateway() private { - L2CustomERC20Gateway(L2_CUSTOM_ERC20_GATEWAY_PROXY_ADDR).initialize( - notnull(L1_CUSTOM_ERC20_GATEWAY_PROXY_ADDR), - notnull(L2_GATEWAY_ROUTER_PROXY_ADDR), - notnull(L2_SCROLL_MESSENGER_PROXY_ADDR) - ); + if (getInitializeCount(L2_CUSTOM_ERC20_GATEWAY_PROXY_ADDR) == 0) { + L2CustomERC20Gateway(L2_CUSTOM_ERC20_GATEWAY_PROXY_ADDR).initialize( + notnull(L1_CUSTOM_ERC20_GATEWAY_PROXY_ADDR), + notnull(L2_GATEWAY_ROUTER_PROXY_ADDR), + notnull(L2_SCROLL_MESSENGER_PROXY_ADDR) + ); + } } function initializeL2ERC1155Gateway() private { - L2ERC1155Gateway(L2_ERC1155_GATEWAY_PROXY_ADDR).initialize( - notnull(L1_ERC1155_GATEWAY_PROXY_ADDR), - notnull(L2_SCROLL_MESSENGER_PROXY_ADDR) - ); + if (getInitializeCount(L2_ERC1155_GATEWAY_PROXY_ADDR) == 0) { + L2ERC1155Gateway(L2_ERC1155_GATEWAY_PROXY_ADDR).initialize( + notnull(L1_ERC1155_GATEWAY_PROXY_ADDR), + notnull(L2_SCROLL_MESSENGER_PROXY_ADDR) + ); + } } function initializeL2ERC721Gateway() private { - L2ERC721Gateway(L2_ERC721_GATEWAY_PROXY_ADDR).initialize( - notnull(L1_ERC721_GATEWAY_PROXY_ADDR), - notnull(L2_SCROLL_MESSENGER_PROXY_ADDR) - ); + if (getInitializeCount(L2_ERC721_GATEWAY_PROXY_ADDR) == 0) { + L2ERC721Gateway(L2_ERC721_GATEWAY_PROXY_ADDR).initialize( + notnull(L1_ERC721_GATEWAY_PROXY_ADDR), + notnull(L2_SCROLL_MESSENGER_PROXY_ADDR) + ); + } } function initializeL2ETHGateway() private { - L2ETHGateway(L2_ETH_GATEWAY_PROXY_ADDR).initialize( - notnull(L1_ETH_GATEWAY_PROXY_ADDR), - notnull(L2_GATEWAY_ROUTER_PROXY_ADDR), - notnull(L2_SCROLL_MESSENGER_PROXY_ADDR) - ); + if (getInitializeCount(L2_ETH_GATEWAY_PROXY_ADDR) == 0) { + L2ETHGateway(L2_ETH_GATEWAY_PROXY_ADDR).initialize( + notnull(L1_ETH_GATEWAY_PROXY_ADDR), + notnull(L2_GATEWAY_ROUTER_PROXY_ADDR), + notnull(L2_SCROLL_MESSENGER_PROXY_ADDR) + ); + } } function initializeL2StandardERC20Gateway() private { - L2StandardERC20Gateway(L2_STANDARD_ERC20_GATEWAY_PROXY_ADDR).initialize( - notnull(L1_STANDARD_ERC20_GATEWAY_PROXY_ADDR), - notnull(L2_GATEWAY_ROUTER_PROXY_ADDR), - notnull(L2_SCROLL_MESSENGER_PROXY_ADDR), - notnull(L2_SCROLL_STANDARD_ERC20_FACTORY_ADDR) - ); + if (getInitializeCount(L2_STANDARD_ERC20_GATEWAY_PROXY_ADDR) == 0) { + L2StandardERC20Gateway(L2_STANDARD_ERC20_GATEWAY_PROXY_ADDR).initialize( + notnull(L1_STANDARD_ERC20_GATEWAY_PROXY_ADDR), + notnull(L2_GATEWAY_ROUTER_PROXY_ADDR), + notnull(L2_SCROLL_MESSENGER_PROXY_ADDR), + notnull(L2_SCROLL_STANDARD_ERC20_FACTORY_ADDR) + ); + } } function initializeL2WETHGateway() private { - L2WETHGateway(payable(L2_WETH_GATEWAY_PROXY_ADDR)).initialize( - notnull(L1_WETH_GATEWAY_PROXY_ADDR), - notnull(L2_GATEWAY_ROUTER_PROXY_ADDR), - notnull(L2_SCROLL_MESSENGER_PROXY_ADDR) - ); + if (getInitializeCount(L2_WETH_GATEWAY_PROXY_ADDR) == 0) { + L2WETHGateway(payable(L2_WETH_GATEWAY_PROXY_ADDR)).initialize( + notnull(L1_WETH_GATEWAY_PROXY_ADDR), + notnull(L2_GATEWAY_ROUTER_PROXY_ADDR), + notnull(L2_SCROLL_MESSENGER_PROXY_ADDR) + ); + } // set WETH gateway in router { @@ -1234,39 +1322,70 @@ contract DeployScroll is DeterminsticDeployment { _tokens[0] = notnull(L2_WETH_ADDR); address[] memory _gateways = new address[](1); _gateways[0] = notnull(L2_WETH_GATEWAY_PROXY_ADDR); - L2GatewayRouter(L2_GATEWAY_ROUTER_PROXY_ADDR).setERC20Gateway(_tokens, _gateways); + if (L2GatewayRouter(L2_GATEWAY_ROUTER_PROXY_ADDR).ERC20Gateway(_tokens[0]) != _gateways[0]) { + L2GatewayRouter(L2_GATEWAY_ROUTER_PROXY_ADDR).setERC20Gateway(_tokens, _gateways); + } } } function initializeScrollStandardERC20Factory() private { - ScrollStandardERC20Factory(L2_SCROLL_STANDARD_ERC20_FACTORY_ADDR).transferOwnership( + if ( + ScrollStandardERC20Factory(L2_SCROLL_STANDARD_ERC20_FACTORY_ADDR).owner() != notnull(L2_STANDARD_ERC20_GATEWAY_PROXY_ADDR) - ); + ) { + ScrollStandardERC20Factory(L2_SCROLL_STANDARD_ERC20_FACTORY_ADDR).transferOwnership( + L2_STANDARD_ERC20_GATEWAY_PROXY_ADDR + ); + } } function initializeL2Whitelist() private { address[] memory accounts = new address[](1); accounts[0] = L2_GAS_ORACLE_SENDER_ADDR; - Whitelist(L2_WHITELIST_ADDR).updateWhitelistStatus(accounts, true); + if (!Whitelist(L2_WHITELIST_ADDR).isSenderAllowed(accounts[0])) { + Whitelist(L2_WHITELIST_ADDR).updateWhitelistStatus(accounts, true); + } } function transferL2ContractOwnership() private { - if (DEPLOYER_ADDR == OWNER_ADDR) { - return; + if (Ownable(L1_GAS_PRICE_ORACLE_ADDR).owner() != OWNER_ADDR) { + Ownable(L1_GAS_PRICE_ORACLE_ADDR).transferOwnership(OWNER_ADDR); + } + if (Ownable(L2_CUSTOM_ERC20_GATEWAY_PROXY_ADDR).owner() != OWNER_ADDR) { + Ownable(L2_CUSTOM_ERC20_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR); + } + if (Ownable(L2_ERC1155_GATEWAY_PROXY_ADDR).owner() != OWNER_ADDR) { + Ownable(L2_ERC1155_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR); + } + if (Ownable(L2_ERC721_GATEWAY_PROXY_ADDR).owner() != OWNER_ADDR) { + Ownable(L2_ERC721_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR); + } + if (Ownable(L2_ETH_GATEWAY_PROXY_ADDR).owner() != OWNER_ADDR) { + Ownable(L2_ETH_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR); + } + if (Ownable(L2_GATEWAY_ROUTER_PROXY_ADDR).owner() != OWNER_ADDR) { + Ownable(L2_GATEWAY_ROUTER_PROXY_ADDR).transferOwnership(OWNER_ADDR); + } + if (Ownable(L2_MESSAGE_QUEUE_ADDR).owner() != OWNER_ADDR) { + Ownable(L2_MESSAGE_QUEUE_ADDR).transferOwnership(OWNER_ADDR); + } + if (Ownable(L2_SCROLL_MESSENGER_PROXY_ADDR).owner() != OWNER_ADDR) { + Ownable(L2_SCROLL_MESSENGER_PROXY_ADDR).transferOwnership(OWNER_ADDR); + } + if (Ownable(L2_STANDARD_ERC20_GATEWAY_PROXY_ADDR).owner() != OWNER_ADDR) { + Ownable(L2_STANDARD_ERC20_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR); + } + if (Ownable(L2_TX_FEE_VAULT_ADDR).owner() != OWNER_ADDR) { + Ownable(L2_TX_FEE_VAULT_ADDR).transferOwnership(OWNER_ADDR); + } + if (Ownable(L2_WETH_GATEWAY_PROXY_ADDR).owner() != OWNER_ADDR) { + Ownable(L2_WETH_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR); + } + if (Ownable(L2_PROXY_ADMIN_ADDR).owner() != OWNER_ADDR) { + Ownable(L2_PROXY_ADMIN_ADDR).transferOwnership(OWNER_ADDR); + } + if (Ownable(L2_WHITELIST_ADDR).owner() != OWNER_ADDR) { + Ownable(L2_WHITELIST_ADDR).transferOwnership(OWNER_ADDR); } - - Ownable(L1_GAS_PRICE_ORACLE_ADDR).transferOwnership(OWNER_ADDR); - Ownable(L2_CUSTOM_ERC20_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR); - Ownable(L2_ERC1155_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR); - Ownable(L2_ERC721_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR); - Ownable(L2_ETH_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR); - Ownable(L2_GATEWAY_ROUTER_PROXY_ADDR).transferOwnership(OWNER_ADDR); - Ownable(L2_MESSAGE_QUEUE_ADDR).transferOwnership(OWNER_ADDR); - Ownable(L2_SCROLL_MESSENGER_PROXY_ADDR).transferOwnership(OWNER_ADDR); - Ownable(L2_STANDARD_ERC20_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR); - Ownable(L2_TX_FEE_VAULT_ADDR).transferOwnership(OWNER_ADDR); - Ownable(L2_WETH_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR); - Ownable(L2_PROXY_ADMIN_ADDR).transferOwnership(OWNER_ADDR); - Ownable(L2_WHITELIST_ADDR).transferOwnership(OWNER_ADDR); } } diff --git a/scripts/deterministic/DeterministicDeployment.sol b/scripts/deterministic/DeterministicDeployment.sol index adae418..bd309cf 100644 --- a/scripts/deterministic/DeterministicDeployment.sol +++ b/scripts/deterministic/DeterministicDeployment.sol @@ -6,6 +6,7 @@ import {stdToml} from "forge-std/StdToml.sol"; import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; import {ITransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import {ERC1967Upgrade} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol"; import {CONFIG_CONTRACTS_PATH, DEFAULT_DEPLOYMENT_SALT, DETERMINISTIC_DEPLOYMENT_PROXY_ADDR} from "./Constants.sol"; import {Configuration} from "./Configuration.sol"; @@ -115,7 +116,9 @@ abstract contract DeterminsticDeployment is Configuration { address proxyAddr, address implAddr ) internal { - if (!skipDeploy) { + address addr = _getImplementation(proxyAddr); + + if (!skipDeploy && addr != implAddr) { ProxyAdmin(notnull(proxyAdminAddr)).upgrade( ITransparentUpgradeableProxy(notnull(proxyAddr)), notnull(implAddr) @@ -123,11 +126,16 @@ abstract contract DeterminsticDeployment is Configuration { } } + function getInitializeCount(address contractAddr) internal view returns (uint8) { + bytes32 slotValue = vm.load(address(contractAddr), bytes32(uint256(0))); + return uint8(uint256(slotValue)); + } + /********************* * Private functions * *********************/ - function _getSalt(string memory name) internal view returns (bytes32) { + function _getSalt(string memory name) private view returns (bytes32) { return keccak256(abi.encodePacked(saltPrefix, name)); } @@ -148,11 +156,9 @@ abstract contract DeterminsticDeployment is Configuration { return addr; } - // revert if the contract is already deployed + // skip if the contract is already deployed if (addr.code.length > 0) { - revert( - string(abi.encodePacked("[ERROR] contract ", name, " (", vm.toString(addr), ") is already deployed")) - ); + return addr; } // deploy contract @@ -223,4 +229,11 @@ abstract contract DeterminsticDeployment is Configuration { } } } + + function _getImplementation(address proxyAddr) private view returns (address) { + // ERC1967Upgrade implementation slot + bytes32 _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + // get implementation address + return address(uint160(uint256(vm.load(address(proxyAddr), _IMPLEMENTATION_SLOT)))); + } } From 45bcd6cc1ad50a020e31bf48b6e215257d3b2e2e Mon Sep 17 00:00:00 2001 From: Morty <70688412+yiweichi@users.noreply.github.com> Date: Mon, 29 Jul 2024 22:52:57 +0800 Subject: [PATCH 4/9] docs: manual deployment document (#17) --- docker/config-example.toml | 2 +- docs/manual-deployment.md | 86 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 docs/manual-deployment.md diff --git a/docker/config-example.toml b/docker/config-example.toml index 85a2743..8998aa5 100644 --- a/docker/config-example.toml +++ b/docker/config-example.toml @@ -8,7 +8,7 @@ CHAIN_ID_L2 = 222222 MAX_TX_IN_CHUNK = 100 MAX_BLOCK_IN_CHUNK = 100 -MAX_L1_MESSAGE_GAS_LIMIT = 10000 +MAX_L1_MESSAGE_GAS_LIMIT = 10000000 L1_CONTRACT_DEPLOYMENT_BLOCK = 0 diff --git a/docs/manual-deployment.md b/docs/manual-deployment.md new file mode 100644 index 0000000..e33164b --- /dev/null +++ b/docs/manual-deployment.md @@ -0,0 +1,86 @@ +# Manual Deployment @scroll-tech/scroll-contracts + +## Overview + +This document will guide you through manually deploying Scroll contracts to both layer 1 and layer 2 networks. + +### Requirements + +This repository requires `node` version>=20.12.2, `yarn` and `foundry` to be previously installed. + +- **Node.js:** https://nodejs.org/en/download/package-manager +- **Yarn:** https://www.npmjs.com/package/yarn +- **Foundry:** https://book.getfoundry.sh/getting-started/installation + +### Config + +1. Create directory `volume` on the root directory of the repo (all config file will be put or generated under this directory) + +```bash +mkdir volume +``` + +2. Create config file, and copy config variables from example file `./docker/config-example.toml` + +```bash +cp ./docker/config-example.toml ./volume/config.toml +``` + +If you've previously launched Scroll chain cocomponents using Scroll-SDK, you may already have a config.toml file. If so directly copy it to `./volume/config.toml`. +**Important Note: If you are launching a scroll chain through scroll-sdk, make sure this config.toml file stay same as the one used in scroll-sdk.** + +Details about the some important variables you may want to change: + +| Configuration Variable | Description | +| -------------------------------- | ---------------------------------------------------------------------------------------- | +| L1_RPC_ENDPOINT | The RPC endpoint for the layer 1 network | +| L2_RPC_ENDPOINT | The RPC endpoint for the layer 2 network | +| CHAIN_ID_L1 | The chain ID of the layer 1 network | +| CHAIN_ID_L2 | The chain ID of the layer 2 network | +| DEPLOYER_PRIVATE_KEY | The private key of the deployer on both layer 1 and layer 2 | +| OWNER_PRIVATE_KEY | The private key of the owner of Scroll contracts on both layer 1 and layer 2 | +| L1_COMMIT_SENDER_PRIVATE_KEY | The private key of the commit sender (sequencer) on layer 1 | +| L1_FINALIZE_SENDER_PRIVATE_KEY | The private key of the finalize sender (prover) on layer 1 | +| L1_GAS_ORACLE_SENDER_PRIVATE_KEY | The private key of the gas oracle sender on layer 1 | +| L2_GAS_ORACLE_SENDER_PRIVATE_KEY | The private key of the gas oracle sender on layer 2 | +| DEPLOYER_ADDR | The address of the deployer on both layer 1 and layer 2 | +| OWNER_ADDR | The address of the owner of Scroll contracts on both layer 1 and layer 2 | +| L1_COMMIT_SENDER_ADDR | The address of the commit sender (sequencer) on layer 1 | +| L1_FINALIZE_SENDER_ADDR | The address of the finalize sender (prover) on layer 1 | +| L1_GAS_ORACLE_SENDER_ADDR | The address of the gas oracle sender on layer 1 | +| L2_GAS_ORACLE_SENDER_ADDR | The address of the gas oracle sender on layer 2 | +| DEPLOYMENT_SALT | The salt used to deploy contracts, make it unique to prevent contract address collisions | +| L1_CONTRACT_DEPLOYMENT_BLOCK | The block that l2-sequencer and bridge-history-fetcher start to sync contracts event | + +### Deploy + +1. Install packages + +```bash +yarn install +``` + +2. Initialize git submodules. + +```bash +git submodule update --init --recursive +``` + +3. Set and export environment variables (Change the RPCs to the one you are using) + +```bash +export L1_RPC_ENDPOINT=http://l1-devnet.scrollsdk +export L2_RPC_ENDPOINT=http://l2-rpc.scrollsdk +``` + +4. Generate predicted contract addresses (This step required mainly because we are checking if every contracts deployed as we expected) + +```bash +forge script scripts/deterministic/DeployScroll.s.sol:DeployScroll --sig "run(string,string)" "none" "write-config" +``` + +5. Deploy contracts on both layer1 and layer2 (Deployment may be interrupted by errors. Rerun the command to resume in such cases.) + +```bash +./docker/scripts/deploy.sh +``` From 51f99175480a9f92109fcac0fe51a0b205eace4c Mon Sep 17 00:00:00 2001 From: Morty <70688412+yiweichi@users.noreply.github.com> Date: Tue, 30 Jul 2024 00:24:49 +0800 Subject: [PATCH 5/9] fix: generate startHeight for bridge-history config (#18) --- docker/templates/bridge-history-config.json | 2 +- scripts/deterministic/GenerateConfigs.s.sol | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docker/templates/bridge-history-config.json b/docker/templates/bridge-history-config.json index de8f0a6..5ae1a9e 100644 --- a/docker/templates/bridge-history-config.json +++ b/docker/templates/bridge-history-config.json @@ -2,7 +2,7 @@ "L1": { "confirmation": 0, "endpoint": null, - "startHeight": 0, + "startHeight": null, "blockTime": 12, "fetchLimit": 16, "MessageQueueAddr": null, diff --git a/scripts/deterministic/GenerateConfigs.s.sol b/scripts/deterministic/GenerateConfigs.s.sol index bb1fc90..f437f48 100644 --- a/scripts/deterministic/GenerateConfigs.s.sol +++ b/scripts/deterministic/GenerateConfigs.s.sol @@ -203,6 +203,7 @@ contract GenerateBridgeHistoryConfig is DeployScroll { // others vm.writeJson(BRIDGE_HISTORY_DB_CONNECTION_STRING, BRIDGE_HISTORY_CONFIG_PATH, ".db.dsn"); + vm.writeJson(vm.toString(L1_CONTRACT_DEPLOYMENT_BLOCK), BRIDGE_HISTORY_CONFIG_PATH, ".L1.startHeight"); } } From cc9b57908fa4286301e88eda655e259d1822db10 Mon Sep 17 00:00:00 2001 From: Morty Date: Wed, 31 Jul 2024 04:45:45 +0800 Subject: [PATCH 6/9] fix: rollup config file --- docker/templates/rollup-config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/templates/rollup-config.json b/docker/templates/rollup-config.json index 5fc6aeb..ef7dd38 100644 --- a/docker/templates/rollup-config.json +++ b/docker/templates/rollup-config.json @@ -52,7 +52,7 @@ "enabled": true, "timeout": 3, "try_times": 5, - "base_url": "http://chain-monitorv2:8080" + "base_url": "http://chain-monitor:8080" }, "enable_test_env_bypass_features": null, "finalize_batch_without_proof_timeout_sec": null, From 1da60676cf770319cb86191aa8042b1e71faddf1 Mon Sep 17 00:00:00 2001 From: Morty Date: Wed, 31 Jul 2024 23:07:58 +0800 Subject: [PATCH 7/9] fix: dockerfile gen-config --- docker/Dockerfile.gen-configs | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/Dockerfile.gen-configs b/docker/Dockerfile.gen-configs index 95f0c86..b9c5e63 100644 --- a/docker/Dockerfile.gen-configs +++ b/docker/Dockerfile.gen-configs @@ -47,6 +47,7 @@ COPY ./docker/templates/config-contracts.toml /contracts/docker/templates/config COPY ./docker/templates/coordinator-config.json /contracts/docker/templates/coordinator-config.json COPY ./docker/templates/genesis.json /contracts/docker/templates/genesis.json COPY ./docker/templates/rollup-config.json /contracts/docker/templates/rollup-config.json +COPY ./docker/templates/rollup-explorer-backend-config.json /contracts/docker/templates/rollup-explorer-backend-config.json COPY ./docker/scripts/gen-configs.sh /contracts/docker/scripts/gen-configs.sh From 2fc37bdd9faa989ff1298acffc17446d2acb52fa Mon Sep 17 00:00:00 2001 From: Morty Date: Thu, 1 Aug 2024 17:30:03 +0800 Subject: [PATCH 8/9] feat: read max_chunks_per_batch from config.toml --- docker/config-example.toml | 1 + docker/templates/rollup-config.json | 4 ++-- scripts/deterministic/Configuration.sol | 2 ++ scripts/deterministic/GenerateConfigs.s.sol | 1 + 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/docker/config-example.toml b/docker/config-example.toml index 8998aa5..0d57e66 100644 --- a/docker/config-example.toml +++ b/docker/config-example.toml @@ -8,6 +8,7 @@ CHAIN_ID_L2 = 222222 MAX_TX_IN_CHUNK = 100 MAX_BLOCK_IN_CHUNK = 100 +MAX_CHUNK_IN_BATCH = 15 MAX_L1_MESSAGE_GAS_LIMIT = 10000000 L1_CONTRACT_DEPLOYMENT_BLOCK = 0 diff --git a/docker/templates/rollup-config.json b/docker/templates/rollup-config.json index ef7dd38..54ee273 100644 --- a/docker/templates/rollup-config.json +++ b/docker/templates/rollup-config.json @@ -49,7 +49,7 @@ "gas_price_diff": 50000 }, "chain_monitor": { - "enabled": true, + "enabled": false, "timeout": 3, "try_times": 5, "base_url": "http://chain-monitor:8080" @@ -72,7 +72,7 @@ "max_uncompressed_batch_bytes_size": 634880 }, "batch_proposer_config": { - "max_chunk_num_per_batch": 15, + "max_chunk_num_per_batch": null, "max_l1_commit_gas_per_batch": 5000000, "max_l1_commit_calldata_size_per_batch": 110000, "batch_timeout_sec": 2700, diff --git a/scripts/deterministic/Configuration.sol b/scripts/deterministic/Configuration.sol index a39f682..8d7fbe5 100644 --- a/scripts/deterministic/Configuration.sol +++ b/scripts/deterministic/Configuration.sol @@ -31,6 +31,7 @@ abstract contract Configuration is Script { uint256 internal MAX_TX_IN_CHUNK; uint256 internal MAX_BLOCK_IN_CHUNK; + uint256 internal MAX_CHUNK_IN_BATCH; uint256 internal MAX_L1_MESSAGE_GAS_LIMIT; uint256 internal L1_CONTRACT_DEPLOYMENT_BLOCK; @@ -104,6 +105,7 @@ abstract contract Configuration is Script { MAX_TX_IN_CHUNK = cfg.readUint(".general.MAX_TX_IN_CHUNK"); MAX_BLOCK_IN_CHUNK = cfg.readUint(".general.MAX_BLOCK_IN_CHUNK"); + MAX_CHUNK_IN_BATCH = cfg.readUint(".general.MAX_CHUNK_IN_BATCH"); MAX_L1_MESSAGE_GAS_LIMIT = cfg.readUint(".general.MAX_L1_MESSAGE_GAS_LIMIT"); L1_CONTRACT_DEPLOYMENT_BLOCK = cfg.readUint(".general.L1_CONTRACT_DEPLOYMENT_BLOCK"); diff --git a/scripts/deterministic/GenerateConfigs.s.sol b/scripts/deterministic/GenerateConfigs.s.sol index f437f48..5e055de 100644 --- a/scripts/deterministic/GenerateConfigs.s.sol +++ b/scripts/deterministic/GenerateConfigs.s.sol @@ -56,6 +56,7 @@ contract GenerateRollupConfig is DeployScroll { vm.writeJson(vm.toString(MAX_BLOCK_IN_CHUNK), ROLLUP_CONFIG_PATH, ".l2_config.chunk_proposer_config.max_block_num_per_chunk"); vm.writeJson(vm.toString(MAX_TX_IN_CHUNK), ROLLUP_CONFIG_PATH, ".l2_config.chunk_proposer_config.max_tx_num_per_chunk"); + vm.writeJson(vm.toString(MAX_CHUNK_IN_BATCH), ROLLUP_CONFIG_PATH, ".l2_config.batch_proposer_config.max_chunk_num_per_batch"); vm.writeJson(SCROLL_DB_CONNECTION_STRING, ROLLUP_CONFIG_PATH, ".db_config.dsn"); } From 1f9cdd7e38de85d0a0995fef1935a9a8c0b9ea33 Mon Sep 17 00:00:00 2001 From: Morty Date: Thu, 1 Aug 2024 19:40:24 +0800 Subject: [PATCH 9/9] feat: log broadcast files --- docker/scripts/deploy.sh | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docker/scripts/deploy.sh b/docker/scripts/deploy.sh index 7a0df77..6441b2b 100755 --- a/docker/scripts/deploy.sh +++ b/docker/scripts/deploy.sh @@ -44,3 +44,14 @@ forge script scripts/deterministic/DeployScroll.s.sol:DeployScroll --rpc-url "$L echo "" echo "deploying on L2" forge script scripts/deterministic/DeployScroll.s.sol:DeployScroll --rpc-url "$L2_RPC_ENDPOINT" --batch-size "$BATCH_SIZE" --sig "run(string,string)" "L2" "verify-config" --broadcast --legacy || exit 1 + +# log broadcast files +echo "" +echo "Broadcast files:" +for file in broadcast/DeployScroll.s.sol/*/*; do + if [ -f "$file" ]; then + echo "$file:" + cat "$file" + echo "" + fi +done \ No newline at end of file