diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index 418876959..485a897af 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -14,10 +14,6 @@ jobs: steps: - uses: actions/checkout@v4 - uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3.10.0 - - uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0 - with: - username: ${{ vars.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - name: Get short commit id run: | @@ -28,5 +24,4 @@ jobs: - name: Build image uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6.16.0 with: - tags: ${{ vars.DOCKER_USERNAME }}/e2e:${{ env.SHORT_COMMIT_ID }} push: false diff --git a/scenarios/agglayer-upgrade-with-supplied-version/README.md b/scenarios/agglayer-upgrade-with-supplied-version/README.md new file mode 100644 index 000000000..2c8c4570a --- /dev/null +++ b/scenarios/agglayer-upgrade-with-supplied-version/README.md @@ -0,0 +1,59 @@ +# Agglayer Upgrade/Downgrade Automation + +This repo contains e2e test scenario to automate **Agglayer image upgrade and downgrade** while running rollup testnets inside **Kurtosis**. + +It is designed to: + +- Bootstrap multiple rollup flavors ( e.g 1 Validium and 2 Rollup ) into the **same Kurtosis enclave**. +- Start Agglayer using a **FROM_TAG** version. +- Upgrade Agglayer to a **TO_TAG** version. +- Optionally downgrade back to the original **FROM_TAG** for validation. +- Cleanly tear down the setup using: + ```bash + kurtosis enclave rm cdk --force + ``` + +--- + +## Scripts + +- `run.sh` + Main orchestration script. Handles bootstrap, upgrade, and optional downgrade. + - **Create the .env file:** + ```bash + cp env.example .env + ``` + + - **Upgrade usage:** + ```bash + ./run.sh FROM_TAG TO_TAG + ``` + + example + + ```bash + ./run.sh 0.3.4 0.3.5 + ``` + + - **Downgrade usage:** + ```bash + ./run.sh FROM_TAG TO_TAG downgrade + ``` + example + + ```bash + ./run.sh 0.3.5 0.3.4 downgrade + ``` +## Arguments & Descriptions + +| Argument | Required | Description | +|------------------------|----------|-------------| +| `` | Yes | Docker image tag to start with (e.g., `0.3.4`)| +| `` | Yes | Docker image tag to upgrade to (e.g., `0.3.5`)| +| `[ACTION]` | No | Optional: set to `downgrade` to downgrade back to `` after upgrade | + +--- + + + +```` diff --git a/scenarios/agglayer-upgrade-with-supplied-version/assets/add_rollup_type.json b/scenarios/agglayer-upgrade-with-supplied-version/assets/add_rollup_type.json new file mode 100644 index 000000000..6fb808903 --- /dev/null +++ b/scenarios/agglayer-upgrade-with-supplied-version/assets/add_rollup_type.json @@ -0,0 +1,17 @@ +{ + "type": "EOA", + "consensusContract": "PolygonPessimisticConsensus", + "consensusContractAddress": "0xAC77A07dD1683DeA96c08F286b67783fB1e4B583", + "polygonRollupManagerAddress": "0x2F50ef6b8e8Ee4E579B17619A92dE3E2ffbD8AD2", + "verifierAddress": "0xf22E2B040B639180557745F47aB97dFA95B1e22a", + "description": "Type: Pessimistic, Upgrade v0.2.x to v0.3.x", + "forkID": 12, + "timelockDelay": 0, + "timelockSalt": "", + "deployerPvtKey": "0x12d7de8621a77640c9241b2595ba78ce443d05e94090365ab3bb5e19df82c625", + "maxFeePerGas": "", + "maxPriorityFeePerGas": "", + "multiplierGas": "", + "genesisRoot": "0xd9c8633088ce212acd9280c5f64623add99871234145a808ab6fbdbac5659a87", + "programVKey": "0x00e60517ac96bf6255d81083269e72c14ad006e5f336f852f7ee3efb91b966be" +} diff --git a/scenarios/agglayer-upgrade-with-supplied-version/assets/cdk-erigon-pp.yml b/scenarios/agglayer-upgrade-with-supplied-version/assets/cdk-erigon-pp.yml new file mode 100644 index 000000000..c16f97604 --- /dev/null +++ b/scenarios/agglayer-upgrade-with-supplied-version/assets/cdk-erigon-pp.yml @@ -0,0 +1,72 @@ +# This file has been generated automatically. +deployment_stages: + deploy_l1: false + deploy_agglayer: false + deploy_cdk_bridge_ui: false + deploy_l2_contracts: true + deploy_optimism_rollup: false + deploy_op_succinct: false +args: + deployment_suffix: "-003" + zkevm_rollup_chain_id: 30303 + zkevm_rollup_id: 3 + verbosity: debug + agglayer_contracts_image: europe-west2-docker.pkg.dev/prj-polygonlabs-devtools-dev/public/zkevm-contracts:v8.1.0-rc.2-fork.13 + zkevm_prover_image: hermeznetwork/zkevm-prover:v9.0.0-RC3-fork.13 + additional_services: [] + consensus_contract_type: pessimistic + sp1_prover_key: '' + agglayer_prover_primary_prover: mock-prover + erigon_strict_mode: false + gas_token_enabled: false + zkevm_use_real_verifier: false + enable_normalcy: true + agglayer_prover_sp1_key: "0x50630eb71ab68ff812fcb9b9c58859f9e9f70a62b7e9e97c9c1cc09d86c760d8" # Replace with valid key + aggkit_components: aggsender,bridge + sequencer_type: erigon + cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.63.0-rc4 + + + # sequencer + zkevm_l2_sequencer_address: "0x0d59BC8C02A089D48d9Cd465b74Cb6E23dEB950D" + zkevm_l2_sequencer_private_key: "0xf6385a27e7710349617340c6f9310e88f0aad10d01646a9bb204177431babcd8" + + # aggregator + zkevm_l2_aggregator_address: "0x2D20D9081fb403E856355F2cddd1C4863D0109cb" + zkevm_l2_aggregator_private_key: "0x2cb77c2cca48d3fee64c14d73564fd6e90676a4f6da6545681e10c8b9b22fce2" + + # claimtxmanager + zkevm_l2_claimtxmanager_address: "0x1359D1eAf25aADaA04304Ee7EFC5b94C43e0e1D5" + zkevm_l2_claimtxmanager_private_key: "0xb0244fcbf83d7aaa2d51dc78a55233058af31797a974d25f724de041f3484418" + + # timelock + zkevm_l2_timelock_address: "0x7803E33388C695E7cbd85eD55f4abe6455E9ce2e" + zkevm_l2_timelock_private_key: "0xe12e739b58489a2c2f49c472169ba20eb89d039e71f04d5342ab645dc3fb6540" + + # admin + # zkevm_l2_admin_address: "0x5666Cc6B46ad32b469D9Aec7C1eE6d02f7312759" + # zkevm_l2_admin_private_key: "0xd2ee309113fc97bed6030201fea0d1234d6b4acbc47b9a4fe12a8fa5270052aa" + + # loadtest + zkevm_l2_loadtest_address: "0x5198d92d278Fd36e5745C308F728d256198A0e3d" + zkevm_l2_loadtest_private_key: "0xcc594c53eca19f9e56200cadf60c94757b0bdee1fc4bc73552ba879d51fd82b3" + + # agglayer + zkevm_l2_agglayer_address: "0x9b5A1f2bC7bb48419d9f6407CFcA454F87884072" + zkevm_l2_agglayer_private_key: "0x7b1164f53f633e940089031a3c265c308d2bcf4756bc8dcf9046bf00e21ec3b1" + + # dac + zkevm_l2_dac_address: "0xA9875E9B9FE3BD46da758ba69a5d4B9dFCA6F133" + zkevm_l2_dac_private_key: "0x5d1a923f60e2423932f782dab9510e1c2fd64b0f29b0893978864191ecdd6f4f" + + # proofsigner + zkevm_l2_proofsigner_address: "0x3AA075513578d86dC63f9344cD9489b948d7686a" + zkevm_l2_proofsigner_private_key: "0xfd402dcc8c7fc7ce0df59fe12f33da7ac2ed760a619188ff16974fde16f9b00e" + + # l1testing + zkevm_l2_l1testing_address: "0x943413d3b2E1B6aF09a758c35b6F5d23a4d6d262" + zkevm_l2_l1testing_private_key: "0x27d8ab2d65296d0da072b172ca9ca874583f9930adb6ac3222fd9494ae7c7f0d" + + # claimsponsor + zkevm_l2_claimsponsor_address: "0xeA06890A8A547aDd71f98A6845542eb3B63C2862" + zkevm_l2_claimsponsor_private_key: "0xb97112e36cfcde131faa110430eed6593b75406e5d6991d8db3ed0f492a73b6f" diff --git a/scenarios/agglayer-upgrade-with-supplied-version/assets/cdk-erigon-rollup-003.yml b/scenarios/agglayer-upgrade-with-supplied-version/assets/cdk-erigon-rollup-003.yml new file mode 100644 index 000000000..0d9eb4f12 --- /dev/null +++ b/scenarios/agglayer-upgrade-with-supplied-version/assets/cdk-erigon-rollup-003.yml @@ -0,0 +1,69 @@ +# This file has been generated automatically. +deployment_stages: + deploy_l1: false + deploy_agglayer: false + deploy_cdk_bridge_ui: false + deploy_l2_contracts: true + deploy_optimism_rollup: false + deploy_op_succinct: false +args: + verbosity: debug + agglayer_contracts_image: europe-west2-docker.pkg.dev/prj-polygonlabs-devtools-dev/public/zkevm-contracts:v8.1.0-rc.2-fork.13 + zkevm_prover_image: hermeznetwork/zkevm-prover:v9.0.0-RC3-fork.13 + additional_services: [] + consensus_contract_type: rollup + sequencer_type: erigon + agglayer_prover_sp1_key: "0x50630eb71ab68ff812fcb9b9c58859f9e9f70a62b7e9e97c9c1cc09d86c760d8" # Replace with valid key + deployment_suffix: "-003" + zkevm_rollup_chain_id: 20203 + zkevm_rollup_id: 3 + + + + + + # polycli wallet inspect --mnemonic 'tennis coconut priority easy toward lava lake cigar address private visit purity' --addresses 11 | tee keys.txt | jq -r '.Addresses[] | [.ETHAddress, .HexPrivateKey] | @tsv' | awk 'BEGIN{split("sequencer,aggregator,claimtxmanager,timelock,admin,loadtest,agglayer,dac,proofsigner,l1testing,claimsponsor",roles,",")} {print "# " roles[NR] "\nzkevm_l2_" roles[NR] "_address: " $1 ""; print "zkevm_l2_" roles[NR] "_private_key: 0x" $2 "\n"}' + + # sequencer + zkevm_l2_sequencer_address: "0x3bd49B59d0d61e83FA5C7856312b9bfEddbCbDA8" + zkevm_l2_sequencer_private_key: "0xf1b0412da5d68afa81e8301d93c56b125ee764e2fab4e919afb81ae14babc5e3" + + # aggregator + zkevm_l2_aggregator_address: "0x3BAEE05bd44f4Ee84709C7Df6861A3528f4c8286" + zkevm_l2_aggregator_private_key: "0x8bcbeae7253c993102e8269f2b48639a832095e0a0235b609472b7b9286290b9" + + # claimtxmanager + zkevm_l2_claimtxmanager_address: "0x1a1C53bA714643B53b39D82409915b513349a1ff" + zkevm_l2_claimtxmanager_private_key: "0xcc8de19498a724ec38c7c774d447a51e629ee947ec360f16913ab3000f5ad676" + + # timelock + zkevm_l2_timelock_address: "0xb2BCBC707c88f1a41d3DBb982b9A8996cA83Df82" + zkevm_l2_timelock_private_key: "0xfbfd097f603d5ed2f1bf79a756d021e8c2a1771bb13ea42a36f534ac731739d3" + + # # admin + # zkevm_l2_admin_address: "0x78770Cc5Bd03F93B8B401Ea91B77DF544Deb2265" + # zkevm_l2_admin_private_key: "0x6048871542899ff1d8ef8e2efc8037115676b083f1fcc680b995f3bb9470bcf6" + + # loadtest + zkevm_l2_loadtest_address: "0x51406206342270c822b5d9dfb261279eEdF0Af20" + zkevm_l2_loadtest_private_key: "0x72e05c95e8c0b0380c1353dbfd50d1d8a762861ac008b8c270963f81abf4304c" + + # agglayer + zkevm_l2_agglayer_address: "0xB8b680902bba8e04C78660D33a97a87E4CC4e797" + zkevm_l2_agglayer_private_key: "0x6fadecf5f47e84428042d36ecbfb1d05c587d658cb0d66e10151561e74340e81" + + # dac + zkevm_l2_dac_address: "0x64a19B5D36664fa68dc8bAC6574A5B272F08ACc1" + zkevm_l2_dac_private_key: "0x29506f6abfd8ff62b29af422c4a0af1dbc989d7154220da916e565c8cc04ce47" + + # proofsigner + zkevm_l2_proofsigner_address: "0xD3F0C080A75f537B361A3Eadf24EE5d6F72a15B3" + zkevm_l2_proofsigner_private_key: "0x89ac1075d2f7c27ba296fb4d625b0e10f272f8f7fa96320f7f0832a41b18e54b" + + # l1testing + zkevm_l2_l1testing_address: "0xcd9Ac30C72a8757F446F814aFfbc32847c2CD17D" + zkevm_l2_l1testing_private_key: "0xbdbfded25015702c72558c5a3cea747713734d3535fe832b4cd4f1bb882977ea" + + # claimsponsor + zkevm_l2_claimsponsor_address: "0xB2c5d585cc8c1f9FC51035941CFdA42DB83E9886" + zkevm_l2_claimsponsor_private_key: "0x4c545e05d1e85a36d316b92a4de4588c60fe3c5dbb2c235306d1ce4e439b751a" diff --git a/scenarios/agglayer-upgrade-with-supplied-version/assets/cdk-erigon-rollup.yml b/scenarios/agglayer-upgrade-with-supplied-version/assets/cdk-erigon-rollup.yml new file mode 100644 index 000000000..14daa090d --- /dev/null +++ b/scenarios/agglayer-upgrade-with-supplied-version/assets/cdk-erigon-rollup.yml @@ -0,0 +1,69 @@ +# This file has been generated automatically. +deployment_stages: + deploy_l1: false + deploy_agglayer: false + deploy_cdk_bridge_ui: false + deploy_l2_contracts: true + deploy_optimism_rollup: false + deploy_op_succinct: false +args: + verbosity: debug + agglayer_contracts_image: europe-west2-docker.pkg.dev/prj-polygonlabs-devtools-dev/public/zkevm-contracts:v8.1.0-rc.2-fork.13 + zkevm_prover_image: hermeznetwork/zkevm-prover:v9.0.0-RC3-fork.13 + additional_services: [] + consensus_contract_type: rollup + sequencer_type: erigon + agglayer_prover_sp1_key: "0x50630eb71ab68ff812fcb9b9c58859f9e9f70a62b7e9e97c9c1cc09d86c760d8" # Replace with valid key + deployment_suffix: "-002" + zkevm_rollup_chain_id: 20202 + zkevm_rollup_id: 2 + + + + + + # polycli wallet inspect --mnemonic 'tennis coconut priority easy toward lava lake cigar address private visit purity' --addresses 11 | tee keys.txt | jq -r '.Addresses[] | [.ETHAddress, .HexPrivateKey] | @tsv' | awk 'BEGIN{split("sequencer,aggregator,claimtxmanager,timelock,admin,loadtest,agglayer,dac,proofsigner,l1testing,claimsponsor",roles,",")} {print "# " roles[NR] "\nzkevm_l2_" roles[NR] "_address: " $1 ""; print "zkevm_l2_" roles[NR] "_private_key: 0x" $2 "\n"}' + + # sequencer + zkevm_l2_sequencer_address: "0x3bd49B59d0d61e83FA5C7856312b9bfEddbCbDA8" + zkevm_l2_sequencer_private_key: "0xf1b0412da5d68afa81e8301d93c56b125ee764e2fab4e919afb81ae14babc5e3" + + # aggregator + zkevm_l2_aggregator_address: "0x3BAEE05bd44f4Ee84709C7Df6861A3528f4c8286" + zkevm_l2_aggregator_private_key: "0x8bcbeae7253c993102e8269f2b48639a832095e0a0235b609472b7b9286290b9" + + # claimtxmanager + zkevm_l2_claimtxmanager_address: "0x1a1C53bA714643B53b39D82409915b513349a1ff" + zkevm_l2_claimtxmanager_private_key: "0xcc8de19498a724ec38c7c774d447a51e629ee947ec360f16913ab3000f5ad676" + + # timelock + zkevm_l2_timelock_address: "0xb2BCBC707c88f1a41d3DBb982b9A8996cA83Df82" + zkevm_l2_timelock_private_key: "0xfbfd097f603d5ed2f1bf79a756d021e8c2a1771bb13ea42a36f534ac731739d3" + + # # admin + # zkevm_l2_admin_address: "0x78770Cc5Bd03F93B8B401Ea91B77DF544Deb2265" + # zkevm_l2_admin_private_key: "0x6048871542899ff1d8ef8e2efc8037115676b083f1fcc680b995f3bb9470bcf6" + + # loadtest + zkevm_l2_loadtest_address: "0x51406206342270c822b5d9dfb261279eEdF0Af20" + zkevm_l2_loadtest_private_key: "0x72e05c95e8c0b0380c1353dbfd50d1d8a762861ac008b8c270963f81abf4304c" + + # agglayer + zkevm_l2_agglayer_address: "0xB8b680902bba8e04C78660D33a97a87E4CC4e797" + zkevm_l2_agglayer_private_key: "0x6fadecf5f47e84428042d36ecbfb1d05c587d658cb0d66e10151561e74340e81" + + # dac + zkevm_l2_dac_address: "0x64a19B5D36664fa68dc8bAC6574A5B272F08ACc1" + zkevm_l2_dac_private_key: "0x29506f6abfd8ff62b29af422c4a0af1dbc989d7154220da916e565c8cc04ce47" + + # proofsigner + zkevm_l2_proofsigner_address: "0xD3F0C080A75f537B361A3Eadf24EE5d6F72a15B3" + zkevm_l2_proofsigner_private_key: "0x89ac1075d2f7c27ba296fb4d625b0e10f272f8f7fa96320f7f0832a41b18e54b" + + # l1testing + zkevm_l2_l1testing_address: "0xcd9Ac30C72a8757F446F814aFfbc32847c2CD17D" + zkevm_l2_l1testing_private_key: "0xbdbfded25015702c72558c5a3cea747713734d3535fe832b4cd4f1bb882977ea" + + # claimsponsor + zkevm_l2_claimsponsor_address: "0xB2c5d585cc8c1f9FC51035941CFdA42DB83E9886" + zkevm_l2_claimsponsor_private_key: "0x4c545e05d1e85a36d316b92a4de4588c60fe3c5dbb2c235306d1ce4e439b751a" diff --git a/scenarios/agglayer-upgrade-with-supplied-version/assets/cdk-erigon-validium.yml b/scenarios/agglayer-upgrade-with-supplied-version/assets/cdk-erigon-validium.yml new file mode 100644 index 000000000..1e015e2ac --- /dev/null +++ b/scenarios/agglayer-upgrade-with-supplied-version/assets/cdk-erigon-validium.yml @@ -0,0 +1,16 @@ +deployment_stages: + deploy_l2_contracts: true + deploy_optimism_rollup: false + deploy_op_succinct: false +args: + verbosity: debug + agglayer_contracts_image: europe-west2-docker.pkg.dev/prj-polygonlabs-devtools-dev/public/zkevm-contracts:v8.1.0-rc.2-fork.13 + zkevm_prover_image: hermeznetwork/zkevm-prover:v9.0.0-RC3-fork.13 + consensus_contract_type: cdk_validium + additional_services: [] + sequencer_type: erigon + agglayer_prover_sp1_key: "0x50630eb71ab68ff812fcb9b9c58859f9e9f70a62b7e9e97c9c1cc09d86c760d8" # Replace with valid key + + + + diff --git a/scenarios/agglayer-upgrade-with-supplied-version/check_verification.sh b/scenarios/agglayer-upgrade-with-supplied-version/check_verification.sh new file mode 100644 index 000000000..fde18a26a --- /dev/null +++ b/scenarios/agglayer-upgrade-with-supplied-version/check_verification.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +set -euo pipefail + +# These get replaced by the host helper script +ROLLUP_MANAGER="__ROLLUP_MANAGER__" # from combined.json: polygonRollupManagerAddress + + +RPC_URL="${RPC_URL:-http://el-1-geth-lighthouse:8545}" +LOOKBACK="${LOOKBACK:-100}" # set the look back for event to be 100 blocks + +EVENT="VerifyBatchesTrustedAggregator(uint32,uint64,bytes32,bytes32,address)" + +CURRENT="$(cast block-number --rpc-url "$RPC_URL")" # gets the lates blocknumber captured by CURRENT variable +FROM=$(( CURRENT - LOOKBACK )) # set the start of scan window +if (( FROM < 0 )); then FROM=0; fi # if the scan range is less than 0 we set it to begin from 0 + +echo "Scanning blocks $FROM → $CURRENT on $RPC_URL" +echo " contract (rollup manager): $ROLLUP_MANAGER" +echo " event: $EVENT" +echo " lookback: $LOOKBACK blocks" + +TMP_JSON="$(mktemp -t verify-logs.XXXXXX.json)" +trap 'rm -f "$TMP_JSON"' EXIT + +# Stream logs as pretty JSON to terminal (if jq is installed) and save raw JSON to file +if command -v jq >/dev/null 2>&1; then + cast logs \ + --address "$ROLLUP_MANAGER" "$EVENT" \ + --from-block "$FROM" --to-block "$CURRENT" \ + --rpc-url "$RPC_URL" \ + --json \ + | tee "$TMP_JSON" | jq -C . +else + echo "(jq not found — showing raw JSON)" + cast logs \ + --address "$ROLLUP_MANAGER" "$EVENT" \ + --from-block "$FROM" --to-block "$CURRENT" \ + --rpc-url "$RPC_URL" \ + --json | tee "$TMP_JSON" +fi + +FOUND=0 +if command -v jq >/dev/null 2>&1; then + FOUND="$(jq 'length' "$TMP_JSON")" # count how many item are in the json file +else + # crude fallback: count '[' then subtract brackets; if it's "[]", FOUND stays 0 + # (safe enough for our purpose when jq isn't available) + if grep -q '"address"' "$TMP_JSON"; then # checks is tem_json contains substring address + FOUND="$(grep -c '"address"' "$TMP_JSON" || true)" # counts lines that contains the address substring + fi +fi + +if [[ $FOUND -gt 0 ]]; then + echo "[SUCCESS---] Found ${FOUND} verification event(s) for $ROLLUP_MANAGER in the last $LOOKBACK blocks." + if command -v jq >/dev/null 2>&1; then + echo "--- summary ---" + # Show a compact, human-readable list + jq -r '.[] | "block=\(.blockNumber) tx=\(.transactionHash) logIndex=\(.logIndex) rollupIdTopic=\(.topics[1]) aggregatorTopic=\(.topics[2])"' "$TMP_JSON" + fi + exit 0 +else + echo "[ERROR---] No verification events found for $ROLLUP_MANAGER in the last $LOOKBACK blocks." + exit 2 +fi diff --git a/scenarios/agglayer-upgrade-with-supplied-version/env.example b/scenarios/agglayer-upgrade-with-supplied-version/env.example new file mode 100644 index 000000000..dd85d7f53 --- /dev/null +++ b/scenarios/agglayer-upgrade-with-supplied-version/env.example @@ -0,0 +1,6 @@ +ENCLAVE_NAME=cdk +KURTOSIS_PACKAGE_HASH=be8cab2e9ed799ab91319fee0f488fab04a393ac # Latest commit +# KURTOSIS_PACKAGE_HASH=e05e8cdcfee52a106ec6850b8956b77171cdd948 # Kurtosis tag v0.3.4 + v9.0.0-rc.2-pp contracts + CDK-Erigon Validium by default +SP1_NETWORK_KEY=0x50630eb71ab68ff812fcb9b9c58859f9e9f70a62b7e9e97c9c1cc09d86c760d8 # Replace with valid key +FROM_TAG=0.3.5 +TO_TAG=0.3.4 \ No newline at end of file diff --git a/scenarios/agglayer-upgrade-with-supplied-version/run.sh b/scenarios/agglayer-upgrade-with-supplied-version/run.sh new file mode 100755 index 000000000..ad8cbeae9 --- /dev/null +++ b/scenarios/agglayer-upgrade-with-supplied-version/run.sh @@ -0,0 +1,405 @@ +#!/bin/env bash +set -e + + +# ---------------------------------------------------------------------- +# Function: Adds rollup RPCs to agglayer and restarts the service +# ---------------------------------------------------------------------- +add_rollup_rpc_to_agglayer() { + echo "Updating agglayer config..." + + kurtosis service exec cdk agglayer ' + set -eu + file=/etc/zkevm/agglayer-config.toml + if ! grep -q "2 = http://cdk-erigon-rpc-002:8123" "$file"; then + sed -i "/1 = \"http:\/\/cdk-erigon-rpc-001:8123\"/a 2 = \"http://cdk-erigon-rpc-002:8123\"" "$file" + sed -i "/2 = \"http:\/\/cdk-erigon-rpc-002:8123\"/a 3 = \"http://cdk-erigon-rpc-003:8123\"" "$file" + fi + ' + + echo "Restarting agglayer..." + kurtosis service stop cdk agglayer + kurtosis service start cdk agglayer + + echo "Done." +} + + + +# ----------------------------------------------------------------------------------------------------------------- +# Function: to verify deployment by checking for events VerifyBatchesTrustedAggregator in the contract deployments +# ------------------------------------------------------------------------------------------------------------------ +run_verification_in_container() ( + set -euo pipefail + set -o pipefail + + SERVICE_NAME="${1:?Usage: run_verification_in_container [LOCAL_SCRIPT] [RPC_URL]}" + LOCAL_SCRIPT="${2:-./check_verification.sh}" + RPC_URL="${3:-http://el-1-geth-lighthouse:8545}" + + LOG_DIR="${LOG_DIR:-./logs}" + mkdir -p "$LOG_DIR" + LOG_FILE="${LOG_DIR}/${SERVICE_NAME}.log" + + START_TS="$(date -Is)" # current timestamp + echo "[START ${START_TS}] ${SERVICE_NAME}" + + # Find the kurtosis container for the service + # It finds the most recent container whose name starts with ${SERVICE_NAME}-- and stores its name in CONTAINER + CONTAINER="$(docker ps -a --format '{{.Names}}' | grep -E "^${SERVICE_NAME}--" | head -n1 || true)" + + # Run and stream output to both terminal and log + { + echo "---- ${START_TS} BEGIN ${SERVICE_NAME} ----" + # checks if no service was found and exits + if [[ -z "${CONTAINER}" ]]; then + echo "No container found matching \"${SERVICE_NAME}--*\"" >&2 + echo "---- $(date -Is) END ${SERVICE_NAME} rc=127 ----" + exit 127 + fi + + # continues execution if service was found + echo "Using container: ${CONTAINER}" + + # Copy local script into the container + REMOTE_SCRIPT="/tmp/check_verification.sh" + echo "Copying ${LOCAL_SCRIPT} -> ${CONTAINER}:${REMOTE_SCRIPT}" + docker cp "${LOCAL_SCRIPT}" "${CONTAINER}:${REMOTE_SCRIPT}" + + # Patch placeholders from combined.json and execute + docker exec -e RPC_URL="${RPC_URL}" "${CONTAINER}" bash -lc ' + set -euo pipefail + FILE=/opt/zkevm/combined.json + [[ -f "$FILE" ]] || { echo "Missing $FILE"; exit 1; } + + if command -v jq >/dev/null 2>&1; then + ROLLUP_MANAGER=$(jq -r ".polygonRollupManagerAddress" "$FILE") + else + ROLLUP_MANAGER=$(grep -oP "\"polygonRollupManagerAddress\"\\s*:\\s*\"\\K0x[0-9a-fA-F]+" "$FILE") + fi + + [[ -n "$ROLLUP_MANAGER" ]] || { echo "Could not parse polygonRollupManagerAddress"; exit 1; } + + + echo "ROLLUP_MANAGER=$ROLLUP_MANAGER" + + sed -i "s|__ROLLUP_MANAGER__|$ROLLUP_MANAGER|g" "'"$REMOTE_SCRIPT"'" + chmod +x "'"$REMOTE_SCRIPT"'" + "'"$REMOTE_SCRIPT"'" + ' + RC=$? # saves exits status of prev execution + echo "---- $(date -Is) END ${SERVICE_NAME} rc=${RC} ----" + exit "$RC" + } 2>&1 | tee -a "$LOG_FILE". # stdout & stderr from the prev cmd, pipes it & appends to log file shows also on terminal. + + # Preserve the exit code of the block (left side of the pipe) + RC=${PIPESTATUS[0]} # captures the exit code of the first command in the pipeline + END_TS="$(date -Is)" + if [[ $RC -eq 0 ]]; then + echo "[FINISH ${END_TS}] ${SERVICE_NAME} ✅ (rc=0) | log: ${LOG_FILE}" + elif [[ $RC -eq 2 ]]; then + echo "[FINISH ${END_TS}] ${SERVICE_NAME} ⚠️ No verification events (rc=2) | log: ${LOG_FILE}" + else + echo "[FINISH ${END_TS}] ${SERVICE_NAME} ❌ (rc=${RC}) | log: ${LOG_FILE}" + fi + exit "$RC" +) + + +# ---------------------------------------------------------------------- +# Load environment +# ---------------------------------------------------------------------- +if [[ -f ../common/load-env.sh ]]; then + source ../common/load-env.sh +else + echo "load-env.sh not found!" + exit 1 +fi + +if [ -f .env ]; then + source .env +else + echo ".env not found — shell exiting." + exit 1 +fi + + +# ------------------------------------------------------------------------------ +# CLI Arguments +# ────────────────────────────────────────────────────────────────────────────── +# Usage: ./run.sh [action] +# e.g. 0.3.0-rc.21 +# e.g. 0.3.5 +# [1] optional: perform upgrade from kurtosis base image (either 1(kurtosis base image) or 2(base image from cli)) +# [action] optional: perform downgrade back to +# Exit immediately if no args provided +if [[ $# -lt 2 ]]; then + echo "Error: Missing required arguments." + echo "Usage: $0 [action]" + exit 1 +fi + + +PREV_FROM_TAG="$FROM_TAG" +PREV_TO_TAG="$TO_TAG" + + + +FROM_TAG="$1" +TO_TAG="$2" +ACTION="${3:-upgrade}" + + +if [[ "$ACTION" == "downgrade" ]]; then + if [[ "$TO_TAG" == "$PREV_FROM_TAG" && "$FROM_TAG" == "$PREV_TO_TAG" ]]; then + echo "Downgrade tags match previous upgrade." + else + echo "Downgrade tag mismatch!" + echo "Expected FROM_TAG=$PREV_TO_TAG, TO_TAG=$PREV_FROM_TAG" + echo "Got FROM_TAG=$FROM_TAG, TO_TAG=$TO_TAG" + exit 1 + fi +fi + +# Compose full image references +IMAGE_BASE="ghcr.io/agglayer/agglayer" +FROM_IMAGE="${IMAGE_BASE}:${FROM_TAG}" +TO_IMAGE="${IMAGE_BASE}:${TO_TAG}" + + + + +sed -i "s#^FROM_TAG=.*#FROM_TAG=$FROM_TAG#" .env +sed -i "s#^TO_TAG=.*#TO_TAG=$TO_TAG#" .env + + +KURTOSIS_HASH="$KURTOSIS_PACKAGE_HASH" +KURTOSIS_ENCLAVE_NAME="$ENCLAVE_NAME" + + + +echo ":-kurtosis hash:= $KURTOSIS_HASH" +echo ":-enclave name:= $KURTOSIS_ENCLAVE_NAME" +echo ":-from image:= $FROM_IMAGE" +echo ":-to image:= $TO_IMAGE" +echo ":-from tag:= $FROM_TAG" +echo ":-to tag:= $TO_TAG" +echo ":-action:= $ACTION" + + + +# Create a yml files with a real SP1 keys if needed +yq -y --arg sp1key "$SP1_NETWORK_KEY" --arg newImage "$FROM_IMAGE" ' + .args.agglayer_prover_sp1_key = $sp1key | + .args.agglayer_image = $newImage +' ./assets/cdk-erigon-validium.yml > initial-cdk-erigon-validium.yml + +yq -y --arg sp1key "$SP1_NETWORK_KEY" ' +.args.agglayer_prover_sp1_key = $sp1key +' ./assets/cdk-erigon-rollup.yml > initial-cdk-erigon-rollup.yml + + +yq -y --arg sp1key "$SP1_NETWORK_KEY" ' +.args.agglayer_prover_sp1_key = $sp1key +' ./assets/cdk-erigon-rollup-003.yml > initial-cdk-erigon-rollup-003.yml + + + + +# checks if the user is requesting for downgrade +if [[ "$ACTION" == "downgrade" ]]; then + + # check if there is a running enclave + ENCLAVE_EXIST=$(kurtosis enclave ls | awk '$3 == "RUNNING" {print $2; exit}') + if [[ "$ENCLAVE_EXIST" != "$KURTOSIS_ENCLAVE_NAME" ]]; then + echo "Enclave name is not $KURTOSIS_ENCLAVE_NAME. Exiting...OR No Running enclave " + exit 1 + fi + + echo '╔═══════════════════════════════════════════════════════════════════════════════════════════════════════╗' + echo '║ R U N N I N G D O W N G R A D E F O R A G G L A Y E R F R O M S U P L I E D T A G ║' + echo '╚═══════════════════════════════════════════════════════════════════════════════════════════════════════╝' + + + + TO_IMAGE_SERVICE_CONFIG_FILE=$(mktemp) + kurtosis service inspect cdk agglayer --output json \ + | jq --arg img "$TO_IMAGE" '.image = $img' > "$TO_IMAGE_SERVICE_CONFIG_FILE" + + echo "$TO_IMAGE_SERVICE_CONFIG_FILE" + cat "$TO_IMAGE_SERVICE_CONFIG_FILE" + + kurtosis service rm "$KURTOSIS_ENCLAVE_NAME" agglayer + kurtosis service add cdk agglayer --json-service-config "$TO_IMAGE_SERVICE_CONFIG_FILE" + rm "$TO_IMAGE_SERVICE_CONFIG_FILE" + + + + + TO_PROVER_IMAGE_SERVICE_CONFIG_FILE=$(mktemp) + kurtosis service inspect cdk agglayer-prover --output json \ + | jq --arg img "$TO_IMAGE" '.image = $img' > "$TO_PROVER_IMAGE_SERVICE_CONFIG_FILE" + kurtosis service add cdk agglayer-prover --json-service-config "$TO_PROVER_IMAGE_SERVICE_CONFIG_FILE" + rm "$TO_PROVER_IMAGE_SERVICE_CONFIG_FILE" + + + + echo "D O W N G R A D E D: C O N F I R M I N G R U N N I N G A G G L A Y E R W I T H T A R G E T D O W N G R A D E V E R S I O N: $TO_TAG " + echo "==========================================================================================================================================" + kurtosis service inspect cdk agglayer --output json + echo "==========================================================================================================================================" + + + echo '╔════════════════════════════════════════════════════════════════════════════════════════════════════════════╗' + echo '║ D O W N G R A D I N G A G G L A Y E R S U C C E S S F U L L ║' + echo '╚════════════════════════════════════════════════════════════════════════════════════════════════════════════╝' + + echo " Running Updating Agglayer with Rollup ERIGON ROLLUP RPC NODE" + add_rollup_rpc_to_agglayer + +else + echo '╔═══════════════════════════════════════════════════════════════╗' + echo '║ A T T A C H I N G C D K E R I G O N V A L I D I U M ║' + echo '╚═══════════════════════════════════════════════════════════════╝' + + + kurtosis run \ + --enclave "$KURTOSIS_ENCLAVE_NAME" \ + --args-file ./initial-cdk-erigon-validium.yml \ + "github.com/0xPolygon/kurtosis-cdk@$KURTOSIS_HASH" + + + echo '╔══════════════════════════════════════════════════════════════════════════════════════════════╗' + echo '║ A T T A C H I N G C D K E R I G O N V A L I D I U M S U C C E S S F U L L ║' + echo '╚══════════════════════════════════════════════════════════════════════════════════════════════╝' + + + + echo '╔══════════════════════════════════════════════════════════════════════════════════════════════════╗' + echo '║ R U N N I N G U P G R A D E F O R A G G L A Y E R F R O M S U P L I E D T A G ║' + echo '╚══════════════════════════════════════════════════════════════════════════════════════════════════╝' + + + + echo "==================== R U N N I N G K U R T O S I S W I T H A G G L A Y E R F R O M I M A G E: $FROM_IMAGE ============" + # 1. Create a temporary file to hold the config json of the current kurtosis base image + FROM_IMAGE_SERVICE_CONFIG_FILE=$(mktemp) + + # 2. Dump the inspected JSON, update the image, and save to the temp file + kurtosis service inspect cdk agglayer --output json \ + | jq --arg img "$FROM_IMAGE" '.image = $img' > "$FROM_IMAGE_SERVICE_CONFIG_FILE" + + echo "$FROM_IMAGE_SERVICE_CONFIG_FILE" + cat "$FROM_IMAGE_SERVICE_CONFIG_FILE" + + kurtosis service rm "$KURTOSIS_ENCLAVE_NAME" agglayer + kurtosis service add cdk agglayer --json-service-config "$FROM_IMAGE_SERVICE_CONFIG_FILE" + + rm "$FROM_IMAGE_SERVICE_CONFIG_FILE" + + + + FROM_PROVER_IMAGE_SERVICE_CONFIG_FILE=$(mktemp) + echo "AGGLAYER - PROVER CONFIG JSON" + kurtosis service inspect cdk agglayer-prover --output json \ + | jq --arg img "$FROM_IMAGE" '.image = $img' > "$FROM_PROVER_IMAGE_SERVICE_CONFIG_FILE" + kurtosis service add cdk agglayer-prover --json-service-config "$FROM_PROVER_IMAGE_SERVICE_CONFIG_FILE" + rm "$FROM_PROVER_IMAGE_SERVICE_CONFIG_FILE" + + + + echo "==================== R U N N I N G K U R T O S I S W I T H A G G L A Y E R T O I M A G E: $TO_IMAGE =================" + # 1. Create a temporary file to hold the config json of the current service + TO_IMAGE_SERVICE_CONFIG_FILE=$(mktemp) + + # 2. Dump the inspected JSON, update the image, and save to the temp file + kurtosis service inspect cdk agglayer --output json \ + | jq --arg img "$TO_IMAGE" '.image = $img' > "$TO_IMAGE_SERVICE_CONFIG_FILE" + + echo "$TO_IMAGE_SERVICE_CONFIG_FILE" + cat "$TO_IMAGE_SERVICE_CONFIG_FILE" + + kurtosis service rm "$KURTOSIS_ENCLAVE_NAME" agglayer + kurtosis service add cdk agglayer --json-service-config "$TO_IMAGE_SERVICE_CONFIG_FILE" + + rm "$TO_IMAGE_SERVICE_CONFIG_FILE" + + + TO_PROVER_IMAGE_SERVICE_CONFIG_FILE=$(mktemp) + kurtosis service inspect cdk agglayer-prover --output json \ + | jq --arg img "$TO_IMAGE" '.image = $img' > "$TO_PROVER_IMAGE_SERVICE_CONFIG_FILE" + kurtosis service add cdk agglayer-prover --json-service-config "$TO_PROVER_IMAGE_SERVICE_CONFIG_FILE" + rm "$TO_PROVER_IMAGE_SERVICE_CONFIG_FILE" + + + + echo "C O N F I R M I N G R U N N I N G A G G L A Y E R F R O M S U P P L I E D B A S E V E R S I O N: $TO_TAG " + echo "========================================================================================================================" + kurtosis service inspect cdk agglayer --output json + echo "========================================================================================================================" + + + + echo '╔══════════════════════════════════════════════════════════════════════════════════════════════════════════╗' + echo '║ U P G R A D I N G A G G L A Y E R T O T A R G E T V E R S I O N S U C C E S S F U L L ║' + echo '╚══════════════════════════════════════════════════════════════════════════════════════════════════════════╝' + + + + + + echo '╔═════════════════════════════════════════════════════════════════════════╗' + echo '║ A T T A C H I N G C D K E R I G O N R O L L U P T W O ║' + echo '╚═════════════════════════════════════════════════════════════════════════╝' + + + kurtosis run \ + --enclave "$KURTOSIS_ENCLAVE_NAME" \ + --args-file ./initial-cdk-erigon-rollup.yml \ + "github.com/0xPolygon/kurtosis-cdk@$KURTOSIS_HASH" + + + + echo '╔═════════════════════════════════════════════════════════════════════════════════════════╗' + echo '║ A T T A C H I N G C D K E R I G O N R O L L U P S U C C E S S F U L L ║' + echo '╚═════════════════════════════════════════════════════════════════════════════════════════╝' + + + + echo '╔═════════════════════════════════════════════════════════════════════════════╗' + echo '║ A T T A C H I N G C D K E R I G O N R O L L U P T H R E E ║' + echo '╚═════════════════════════════════════════════════════════════════════════════╝' + + + kurtosis run \ + --enclave "$KURTOSIS_ENCLAVE_NAME" \ + --args-file ./initial-cdk-erigon-rollup-003.yml \ + "github.com/0xPolygon/kurtosis-cdk@$KURTOSIS_HASH" + + + + echo '╔═══════════════════════════════════════════════════════════════════════════════════════════════════════╗' + echo '║ A T T A C H I N G C D K E R I G O N R O L L U P T H R E E S U C C E S S F U L L ║' + echo '╚═══════════════════════════════════════════════════════════════════════════════════════════════════════╝' + + + + echo "Modifying agglayer configuration to include new rollup" + add_rollup_rpc_to_agglayer + + + + # live countdown for 3 minutes + for ((s=180; s>0; s--)); do + printf "\rWaiting 3 min to verify deployment - will execute VerifyBatchesTrustedAggregator event… %02d:%02d" $((s/60)) $((s%60)) + sleep 1 + done + printf "\r✓ done. \n" + + for n in 001 002 003; do + run_verification_in_container "contracts-$n" || true + done +fi + + +