Commit 974ee6ff authored by Sebastian Stammler's avatar Sebastian Stammler Committed by GitHub

ctb: Fix Holocene upgrade script (#13015)

* ctb: Fix Holocene upgrade script

* improve README

* pass deploy-config as parameter to just run, other improvements

* remove commented-out variables
parent 131320e4
......@@ -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=
......
......@@ -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`.
......@@ -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 \
.
......@@ -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 <<EOF >"$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
......@@ -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\""
......@@ -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"
......@@ -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"
......@@ -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\""
......@@ -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"]
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment