diff --git a/packages/contracts-bedrock/scripts/upgrades/holocene/.env.example b/packages/contracts-bedrock/scripts/upgrades/holocene/.env.example index 02d67a4bad06f..2d7d84e67aa95 100644 --- a/packages/contracts-bedrock/scripts/upgrades/holocene/.env.example +++ b/packages/contracts-bedrock/scripts/upgrades/holocene/.env.example @@ -2,6 +2,8 @@ # ↓ Required ↓ # ############################################## +# NOTE: The deploy config must be provided as a first argument to `just run`! + # The network to deploy the contracts to. # Must be one of 'mainnet', 'sepolia' NETWORK= @@ -15,12 +17,6 @@ ETH_RPC_URL= # Private key used to deploy the new contracts for this upgrade PRIVATE_KEY= -# Path to the deploy config JSON file -DEPLOY_CONFIG_PATH= - -# Path to the folder where output artifacts will be stored -OUTPUT_FOLDER_PATH= - # Address of deployed `PreimageOracle` contract. PREIMAGE_ORACLE_ADDR= diff --git a/packages/contracts-bedrock/scripts/upgrades/holocene/README.md b/packages/contracts-bedrock/scripts/upgrades/holocene/README.md index f16127ffebbd0..a671362bff853 100644 --- a/packages/contracts-bedrock/scripts/upgrades/holocene/README.md +++ b/packages/contracts-bedrock/scripts/upgrades/holocene/README.md @@ -37,5 +37,20 @@ cp .env.example .env && vim .env # - Deploy the new smart contract implementations. # - Optionally, generate a safe upgrade bundle. # - Optionally, generate a `superchain-ops` upgrade task. -just run +# +# The first argument must be the absolute path to your deploy-config.json. +# You can optionally specify an output folder path different from the default `output/` as a +# second argument to `just run`, also as an absolute path. +just run $(realpath path/to/deploy-config.json) ``` + +Note that in order to build the Docker image, you have to allow Docker to use at least 16GB of +memory, or the Solidity compilations may fail. Docker's default is only 8GB. + +The `deploy-config.json` that you use for your chain must set the latest `faultGameAbsolutePrestate` +value, not the one at deployment. There's currently one available that includes the Sepolia +Superchain Holocene activations for Base, OP, Mode and Zora: +`0x03925193e3e89f87835bbdf3a813f60b2aa818a36bbe71cd5d8fd7e79f5e8afe` + +If you want to make local modifications to the scripts in `scripts/`, you need to build the Docker +image again with `just build-image` before running `just run`. diff --git a/packages/contracts-bedrock/scripts/upgrades/holocene/justfile b/packages/contracts-bedrock/scripts/upgrades/holocene/justfile index 08cdc771ac92c..ac08df6813242 100644 --- a/packages/contracts-bedrock/scripts/upgrades/holocene/justfile +++ b/packages/contracts-bedrock/scripts/upgrades/holocene/justfile @@ -4,16 +4,19 @@ default: # Run the deployment / upgrade generation image. If the image is not present locally, # it will be built. -run *args='': +run deploy-config-path output-folder-path="$(pwd)/output/" *args='': #!/bin/bash if [ ! "$(docker images -q op-holocene-upgrade:local 2> /dev/null)" ]; then just build-image fi + mkdir -p {{output-folder-path}} + # Run the deployment. - docker run \ + docker run -it \ --rm \ - -v $OUTPUT_FOLDER_PATH/:/output \ + -v {{output-folder-path}}:/output \ + -v {{deploy-config-path}}:/app/packages/contracts-bedrock/deploy-config/deploy-config.json \ --env-file=.env \ op-holocene-upgrade:local {{args}} @@ -22,5 +25,5 @@ build-image: docker build \ -t op-holocene-upgrade:local \ -f upgrade.dockerfile \ - --build-arg REV=op-contracts/v1.8.0-rc.1 \ + --build-arg REV=op-contracts/v1.8.0-rc.2 \ . diff --git a/packages/contracts-bedrock/scripts/upgrades/holocene/scripts/main.sh b/packages/contracts-bedrock/scripts/upgrades/holocene/scripts/main.sh index 95fe1a43c231b..7ae6a55ed72a2 100755 --- a/packages/contracts-bedrock/scripts/upgrades/holocene/scripts/main.sh +++ b/packages/contracts-bedrock/scripts/upgrades/holocene/scripts/main.sh @@ -37,8 +37,7 @@ export NETWORK="${NETWORK:?NETWORK must be set}" export ETHERSCAN_API_KEY=${ETHERSCAN_API_KEY:?ETHERSCAN_API_KEY must be set} export ETH_RPC_URL=${ETH_RPC_URL:?ETH_RPC_URL must be set} export PRIVATE_KEY=${PRIVATE_KEY:?PRIVATE_KEY must be set} -export BASE_DEPLOY_CONFIG_PATH=${DEPLOY_CONFIG_PATH:?DEPLOY_CONFIG_PATH must be set} -export OUTPUT_FOLDER_PATH=${OUTPUT_FOLDER_PATH:?OUTPUT_FOLDER_PATH must be set} +export OUTPUT_FOLDER_PATH="/output" export SYSTEM_CONFIG_IMPL_ADDR=${SYSTEM_CONFIG_IMPL_ADDR:-$(fetch_standard_address "$NETWORK" "$RELEASE" "system_config")} export MIPS_IMPL_ADDR=${MIPS_IMPL_ADDR:-$(fetch_standard_address "$NETWORK" "$RELEASE" "mips")} export PREIMAGE_ORACLE_ADDR=${PREIMAGE_ORACLE_ADDR:?PREIMAGE_ORACLE_ADDR must be set} @@ -53,8 +52,8 @@ export USE_PERMISSIONLESS_FAULT_PROOFS=${USE_PERMISSIONLESS_FAULT_PROOFS:?USE_PE # Sanity check FP configuration. if [[ $USE_PERMISSIONLESS_FAULT_PROOFS == true && $USE_FAULT_PROOFS == false ]]; then - echo "Error: USE_PERMISSIONLESS_FAULT_PROOFS cannot be true if USE_FAULT_PROOFS is false" - exit 1 + echo "Error: USE_PERMISSIONLESS_FAULT_PROOFS cannot be true if USE_FAULT_PROOFS is false" + exit 1 fi # Make the output folder, if it doesn't exist @@ -63,26 +62,28 @@ mkdir -p "$OUTPUT_FOLDER_PATH" # Find the contracts-bedrock directory CONTRACTS_BEDROCK_DIR=$(pwd) while [[ "$CONTRACTS_BEDROCK_DIR" != "/" && "${CONTRACTS_BEDROCK_DIR##*/}" != "contracts-bedrock" ]]; do - CONTRACTS_BEDROCK_DIR=$(dirname "$CONTRACTS_BEDROCK_DIR") + CONTRACTS_BEDROCK_DIR=$(dirname "$CONTRACTS_BEDROCK_DIR") done # Error out if we couldn't find it for some reason if [[ "$CONTRACTS_BEDROCK_DIR" == "/" ]]; then - echo "Error: 'contracts-bedrock' directory not found" - exit 1 + echo "Error: 'contracts-bedrock' directory not found" + exit 1 fi -# Set file paths from command-line arguments +# The deploy config is mounted via Docker to this file export DEPLOY_CONFIG_PATH="$CONTRACTS_BEDROCK_DIR/deploy-config/deploy-config.json" -# Copy the files into the paths so that the script can actually access it -cp "$BASE_DEPLOY_CONFIG_PATH" "$DEPLOY_CONFIG_PATH" - -# Run deploy.sh +# Run deploy.sh if deployments.json does not exist DEPLOY_LOG_PATH="$OUTPUT_FOLDER_PATH/deploy.log" -if ! "$SCRIPT_DIR/deploy.sh" | tee "$DEPLOY_LOG_PATH"; then +DEPLOYMENTS_JSON_PATH="$OUTPUT_FOLDER_PATH/deployments.json" +if [[ ! -f "$DEPLOYMENTS_JSON_PATH" ]]; then + if ! "$SCRIPT_DIR/deploy.sh" | tee "$DEPLOY_LOG_PATH"; then echo "Error: deploy.sh failed" exit 1 + fi +else + prompt "Skipping deployment as $DEPLOYMENTS_JSON_PATH already exists. Continue?" fi # Extract the addresses from the deployment logs @@ -102,8 +103,7 @@ reqenv "FDG_IMPL" reqenv "PDG_IMPL" # Generate deployments.json with extracted addresses -DEPLOYMENTS_JSON_PATH="$OUTPUT_FOLDER_PATH/deployments.json" -cat << EOF > "$DEPLOYMENTS_JSON_PATH" +cat <"$DEPLOYMENTS_JSON_PATH" { "SystemConfig": "$SYSTEM_CONFIG_IMPL", "MIPS": "$MIPS_IMPL", @@ -121,16 +121,16 @@ prompt "Generate safe upgrade bundle for SystemConfig?" # Generate the system config upgrade bundle if ! "$SCRIPT_DIR/sys-cfg-bundle.sh"; then - echo "Error: sys-cfg-bundle.sh failed" - exit 1 + echo "Error: sys-cfg-bundle.sh failed" + exit 1 fi prompt "Generate superchain-ops upgrade task for SystemConfig upgrade bundle?" # Generate the superchain-ops upgrade task if ! "$SCRIPT_DIR/sc-ops-sys-cfg.sh"; then - echo "Error: sc-ops-sys-cfg.sh failed" - exit 1 + echo "Error: sc-ops-sys-cfg.sh failed" + exit 1 fi if [[ $USE_FAULT_PROOFS == true ]]; then @@ -138,15 +138,15 @@ if [[ $USE_FAULT_PROOFS == true ]]; then # Generate the proofs contracts' upgrade bundle if ! "$SCRIPT_DIR/proofs-bundle.sh"; then - echo "Error: proofs-bundle.sh failed" - exit 1 + echo "Error: proofs-bundle.sh failed" + exit 1 fi prompt "Generate superchain-ops upgrade task for proofs contracts upgrade bundle?" # Generate the superchain-ops upgrade task if ! "$SCRIPT_DIR/sc-ops-proofs.sh"; then - echo "Error: sc-ops-proofs.sh failed" - exit 1 + echo "Error: sc-ops-proofs.sh failed" + exit 1 fi fi diff --git a/packages/contracts-bedrock/scripts/upgrades/holocene/scripts/proofs-bundle.sh b/packages/contracts-bedrock/scripts/upgrades/holocene/scripts/proofs-bundle.sh index 85295d3040f1f..bc0b0c7ff314d 100755 --- a/packages/contracts-bedrock/scripts/upgrades/holocene/scripts/proofs-bundle.sh +++ b/packages/contracts-bedrock/scripts/upgrades/holocene/scripts/proofs-bundle.sh @@ -31,24 +31,24 @@ TX_1_PAYLOAD=$(cast calldata "setImplementation(uint32,address)" 1 "$PDG_IMPL") TX_2_PAYLOAD=$(cast calldata "setImplementation(uint32,address)" 0 "$FDG_IMPL") # Replace variables -sed -i '' "s/\$L1_CHAIN_ID/$L1_CHAIN_ID/g" "$BUNDLE_PATH" -sed -i '' "s/\$PDG_IMPL/$PDG_IMPL/g" "$BUNDLE_PATH" -sed -i '' "s/\$TX_1_PAYLOAD/$TX_1_PAYLOAD/g" "$BUNDLE_PATH" -sed -i '' "s/\$TX_2_PAYLOAD/$TX_2_PAYLOAD/g" "$BUNDLE_PATH" +sed -i "s/\$L1_CHAIN_ID/$L1_CHAIN_ID/g" "$BUNDLE_PATH" +sed -i "s/\$PDG_IMPL/$PDG_IMPL/g" "$BUNDLE_PATH" +sed -i "s/\$TX_1_PAYLOAD/$TX_1_PAYLOAD/g" "$BUNDLE_PATH" +sed -i "s/\$TX_2_PAYLOAD/$TX_2_PAYLOAD/g" "$BUNDLE_PATH" # Conditionally, if the FDG is being deployed, append the bundle extension if [ "$USE_PERMISSIONLESS_FAULT_PROOFS" == true ]; then echo "✨ USE_PERMISSIONLESS_FAULT_PROOFS=true | Adding FDG deployment to upgrade bundle." jq --argjson fdg_extension "$(cat ./templates/fdg_bundle_extension.json)" \ '.transactions += [$fdg_extension]' \ - "$BUNDLE_PATH" > "$BUNDLE_PATH.tmp" + "$BUNDLE_PATH" >"$BUNDLE_PATH.tmp" mv "$BUNDLE_PATH.tmp" "$BUNDLE_PATH" # Replace variables - sed -i '' "s/\$FDG_IMPL/$FDG_IMPL/g" "$BUNDLE_PATH" - sed -i '' "s/\$TX_2_PAYLOAD/$TX_2_PAYLOAD/g" "$BUNDLE_PATH" + sed -i "s/\$FDG_IMPL/$FDG_IMPL/g" "$BUNDLE_PATH" + sed -i "s/\$TX_2_PAYLOAD/$TX_2_PAYLOAD/g" "$BUNDLE_PATH" fi -sed -i '' "s/\$DISPUTE_GAME_FACTORY_PROXY_ADDR/$DISPUTE_GAME_FACTORY_PROXY_ADDR/g" "$BUNDLE_PATH" +sed -i "s/\$DISPUTE_GAME_FACTORY_PROXY_ADDR/$DISPUTE_GAME_FACTORY_PROXY_ADDR/g" "$BUNDLE_PATH" echo "✨ Generated proof contracts upgrade bundle at \"$BUNDLE_PATH\"" diff --git a/packages/contracts-bedrock/scripts/upgrades/holocene/scripts/sc-ops-proofs.sh b/packages/contracts-bedrock/scripts/upgrades/holocene/scripts/sc-ops-proofs.sh index d4ff18db5738e..ec386727d3bd9 100755 --- a/packages/contracts-bedrock/scripts/upgrades/holocene/scripts/sc-ops-proofs.sh +++ b/packages/contracts-bedrock/scripts/upgrades/holocene/scripts/sc-ops-proofs.sh @@ -27,9 +27,9 @@ cp -R "$SCRIPT_DIR/../templates/proofs-sc-ops-task/." "$TASK_DIR/" msup render -i "$TASK_DIR/input.json" -o "$TASK_DIR/OVERVIEW.md" # Generate the README -sed -i '' "s/\$MIPS_IMPL/$MIPS_IMPL/g" "$TASK_DIR/README.md" -sed -i '' "s/\$FDG_IMPL/$FDG_IMPL/g" "$TASK_DIR/README.md" -sed -i '' "s/\$PDG_IMPL/$PDG_IMPL/g" "$TASK_DIR/README.md" +sed -i "s/\$MIPS_IMPL/$MIPS_IMPL/g" "$TASK_DIR/README.md" +sed -i "s/\$FDG_IMPL/$FDG_IMPL/g" "$TASK_DIR/README.md" +sed -i "s/\$PDG_IMPL/$PDG_IMPL/g" "$TASK_DIR/README.md" # Generate the validation doc OLD_FDG=$(cast call "$DISPUTE_GAME_FACTORY_PROXY_ADDR" "gameImpls(uint32)" 0) @@ -40,8 +40,8 @@ PADDED_OLD_PDG=$(cast 2u "$OLD_PDG") PADDED_FDG_IMPL=$(cast 2u "$FDG_IMPL") PADDED_PDG_IMPL=$(cast 2u "$PDG_IMPL") -sed -i '' "s/\$DISPUTE_GAME_FACTORY_PROXY_ADDR/$DISPUTE_GAME_FACTORY_PROXY_ADDR/g" "$TASK_DIR/VALIDATION.md" -sed -i '' "s/\$OLD_FDG/$PADDED_OLD_FDG/g" "$TASK_DIR/VALIDATION.md" -sed -i '' "s/\$FDG_IMPL/$PADDED_FDG_IMPL/g" "$TASK_DIR/VALIDATION.md" -sed -i '' "s/\$PDG_IMPL/$PADDED_PDG_IMPL/g" "$TASK_DIR/VALIDATION.md" -sed -i '' "s/\$OLD_PDG/$PADDED_OLD_PDG/g" "$TASK_DIR/VALIDATION.md" +sed -i "s/\$DISPUTE_GAME_FACTORY_PROXY_ADDR/$DISPUTE_GAME_FACTORY_PROXY_ADDR/g" "$TASK_DIR/VALIDATION.md" +sed -i "s/\$OLD_FDG/$PADDED_OLD_FDG/g" "$TASK_DIR/VALIDATION.md" +sed -i "s/\$FDG_IMPL/$PADDED_FDG_IMPL/g" "$TASK_DIR/VALIDATION.md" +sed -i "s/\$PDG_IMPL/$PADDED_PDG_IMPL/g" "$TASK_DIR/VALIDATION.md" +sed -i "s/\$OLD_PDG/$PADDED_OLD_PDG/g" "$TASK_DIR/VALIDATION.md" diff --git a/packages/contracts-bedrock/scripts/upgrades/holocene/scripts/sc-ops-sys-cfg.sh b/packages/contracts-bedrock/scripts/upgrades/holocene/scripts/sc-ops-sys-cfg.sh index b0e4a57b32b70..a87de445d3d5a 100755 --- a/packages/contracts-bedrock/scripts/upgrades/holocene/scripts/sc-ops-sys-cfg.sh +++ b/packages/contracts-bedrock/scripts/upgrades/holocene/scripts/sc-ops-sys-cfg.sh @@ -25,7 +25,7 @@ cp -R "$SCRIPT_DIR/../templates/sys-cfg-sc-ops-task/." "$TASK_DIR/" msup render -i "$TASK_DIR/input.json" -o "$TASK_DIR/OVERVIEW.md" # Generate the README -sed -i '' "s/\$SYSTEM_CONFIG_IMPL/$SYSTEM_CONFIG_IMPL/g" "$TASK_DIR/README.md" +sed -i "s/\$SYSTEM_CONFIG_IMPL/$SYSTEM_CONFIG_IMPL/g" "$TASK_DIR/README.md" # Generate the validation doc OLD_SYS_CFG=$(cast impl "$SYSTEM_CONFIG_PROXY_ADDR") @@ -33,6 +33,6 @@ OLD_SYS_CFG=$(cast impl "$SYSTEM_CONFIG_PROXY_ADDR") PADDED_OLD_SYS_CFG=$(cast 2u "$OLD_SYS_CFG") PADDED_SYS_CFG=$(cast 2u "$SYSTEM_CONFIG_IMPL") -sed -i '' "s/\$SYSTEM_CONFIG_PROXY_ADDR/$SYSTEM_CONFIG_PROXY_ADDR/g" "$TASK_DIR/VALIDATION.md" -sed -i '' "s/\$OLD_SYS_CFG/$PADDED_OLD_SYS_CFG/g" "$TASK_DIR/VALIDATION.md" -sed -i '' "s/\$SYSTEM_CONFIG_IMPL/$PADDED_SYS_CFG/g" "$TASK_DIR/VALIDATION.md" +sed -i "s/\$SYSTEM_CONFIG_PROXY_ADDR/$SYSTEM_CONFIG_PROXY_ADDR/g" "$TASK_DIR/VALIDATION.md" +sed -i "s/\$OLD_SYS_CFG/$PADDED_OLD_SYS_CFG/g" "$TASK_DIR/VALIDATION.md" +sed -i "s/\$SYSTEM_CONFIG_IMPL/$PADDED_SYS_CFG/g" "$TASK_DIR/VALIDATION.md" diff --git a/packages/contracts-bedrock/scripts/upgrades/holocene/scripts/sys-cfg-bundle.sh b/packages/contracts-bedrock/scripts/upgrades/holocene/scripts/sys-cfg-bundle.sh index 64c34088ebf53..bde4917e6b823 100755 --- a/packages/contracts-bedrock/scripts/upgrades/holocene/scripts/sys-cfg-bundle.sh +++ b/packages/contracts-bedrock/scripts/upgrades/holocene/scripts/sys-cfg-bundle.sh @@ -26,10 +26,10 @@ cp ./templates/sys_cfg_upgrade_bundle_template.json "$BUNDLE_PATH" TX_1_PAYLOAD=$(cast calldata "upgrade(address,address)" "$SYSTEM_CONFIG_PROXY_ADDR" "$SYSTEM_CONFIG_IMPL") # Replace variables -sed -i '' "s/\$L1_CHAIN_ID/$L1_CHAIN_ID/g" "$BUNDLE_PATH" -sed -i '' "s/\$PROXY_ADMIN_ADDR/$PROXY_ADMIN_ADDR/g" "$BUNDLE_PATH" -sed -i '' "s/\$SYSTEM_CONFIG_PROXY_ADDR/$SYSTEM_CONFIG_PROXY_ADDR/g" "$BUNDLE_PATH" -sed -i '' "s/\$SYSTEM_CONFIG_IMPL/$SYSTEM_CONFIG_IMPL/g" "$BUNDLE_PATH" -sed -i '' "s/\$TX_1_PAYLOAD/$TX_1_PAYLOAD/g" "$BUNDLE_PATH" +sed -i "s/\$L1_CHAIN_ID/$L1_CHAIN_ID/g" "$BUNDLE_PATH" +sed -i "s/\$PROXY_ADMIN_ADDR/$PROXY_ADMIN_ADDR/g" "$BUNDLE_PATH" +sed -i "s/\$SYSTEM_CONFIG_PROXY_ADDR/$SYSTEM_CONFIG_PROXY_ADDR/g" "$BUNDLE_PATH" +sed -i "s/\$SYSTEM_CONFIG_IMPL/$SYSTEM_CONFIG_IMPL/g" "$BUNDLE_PATH" +sed -i "s/\$TX_1_PAYLOAD/$TX_1_PAYLOAD/g" "$BUNDLE_PATH" echo "✨ Generated SystemConfig upgrade bundle at \"$BUNDLE_PATH\"" diff --git a/packages/contracts-bedrock/scripts/upgrades/holocene/upgrade.dockerfile b/packages/contracts-bedrock/scripts/upgrades/holocene/upgrade.dockerfile index f91ff8dadd83e..33166fe6e5ad0 100644 --- a/packages/contracts-bedrock/scripts/upgrades/holocene/upgrade.dockerfile +++ b/packages/contracts-bedrock/scripts/upgrades/holocene/upgrade.dockerfile @@ -58,5 +58,8 @@ RUN forge script ./scripts/upgrades/holocene/DeployUpgrade.s.sol || true # Set the working directory to where upgrade.sh is located WORKDIR /app/packages/contracts-bedrock/scripts/upgrades/holocene +# allows to use modified local scripts +COPY scripts/*.sh ./scripts/ + # Set the entrypoint to the main.sh script ENTRYPOINT ["./scripts/main.sh"]