From 0ec477c598f8e5d9052c8717aef79284490974d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20FP=20Mar=C3=ADa=20Franco=20P=C3=A9rez?= Date: Fri, 26 Dec 2025 10:58:19 +0000 Subject: [PATCH 1/3] Add ArbOS 51 upgrade instructions --- README.md | 6 +++ .../rollup/SetWasmModuleRootAction.sol | 36 +++++++++++++++++ .../set-wasm-module-root/.env.example | 8 ++++ .../DeploySetWasmModuleRootAction.s.sol | 30 ++++++++++++++ .../set-wasm-module-root/README.md | 39 +++++++++++++++++++ test/signatures/SetWasmModuleRootAction | 11 ++++++ test/storage/SetWasmModuleRootAction | 6 +++ 7 files changed, 136 insertions(+) create mode 100644 contracts/parent-chain/rollup/SetWasmModuleRootAction.sol create mode 100644 scripts/foundry/arbos-upgrades/set-wasm-module-root/.env.example create mode 100644 scripts/foundry/arbos-upgrades/set-wasm-module-root/DeploySetWasmModuleRootAction.s.sol create mode 100644 scripts/foundry/arbos-upgrades/set-wasm-module-root/README.md create mode 100644 test/signatures/SetWasmModuleRootAction create mode 100644 test/storage/SetWasmModuleRootAction diff --git a/README.md b/README.md index 19be6454..16c90758 100644 --- a/README.md +++ b/README.md @@ -92,6 +92,12 @@ This action schedule an upgrade of the ArbOS to a specific version at a specific Here is a list of common upgrade paths that can be used to upgrade the Orbit chains, beginning with the most recent upgrade. These instructions are duplicated from the docs on [How to upgrade ArbOS on your Orbit chain](https://docs.arbitrum.io/launch-orbit-chain/how-tos/arbos-upgrade), specifically Steps 1 through 3. Step 4 is mentioned below under "Other Actions". +### [ArbOS 51 Dia](https://docs.arbitrum.io/run-arbitrum-node/arbos-releases/arbos51) + +1. Upgrade your Nitro node(s) to [Nitro v3.9.3](https://github.com/OffchainLabs/nitro/releases/tag/v3.9.3) or higher +1. Update the wasm module root on the Rollup contract in the parent chain using [Set wasmModuleRoot action](scripts/foundry/arbos-upgrades/set-wasm-module-root) +1. Schedule the ArbOS 51 Dia upgrade using [ArbOS upgrade at timestamp action](scripts/foundry/arbos-upgrades/at-timestamp) + ### [ArbOS 40 Callisto](https://docs.arbitrum.io/run-arbitrum-node/arbos-releases/arbos40) 1. Upgrade your Nitro node(s) to [Nitro v3.6.5](https://github.com/OffchainLabs/nitro/releases/tag/v3.6.5) or higher diff --git a/contracts/parent-chain/rollup/SetWasmModuleRootAction.sol b/contracts/parent-chain/rollup/SetWasmModuleRootAction.sol new file mode 100644 index 00000000..ecc0b0aa --- /dev/null +++ b/contracts/parent-chain/rollup/SetWasmModuleRootAction.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.16; + +import "@arbitrum/nitro-contracts-1.2.1/src/bridge/IInbox.sol"; +import "@arbitrum/nitro-contracts-1.2.1/src/rollup/IRollupAdmin.sol"; +import "@arbitrum/nitro-contracts-1.2.1/src/rollup/IRollupCore.sol"; + +/// @dev Modified from +/// https://github.com/ArbitrumFoundation/governance/blob/dcb85dc0ac0e6e5d72dd94b721c3655bec3b7639/src/gov-action-contracts/arbos-upgrade/SetWasmModuleRootAction.sol +contract SetWasmModuleRootAction { + bytes32 public immutable previousWasmModuleRoot; + bytes32 public immutable newWasmModuleRoot; + + constructor(bytes32 _previousWasmModuleRoot, bytes32 _newWasmModuleRoot) { + previousWasmModuleRoot = _previousWasmModuleRoot; + newWasmModuleRoot = _newWasmModuleRoot; + } + + function perform(address inbox) external { + address rollup = address(IInbox(inbox).bridge().rollup()); + + // verify previous wasm module root + require( + IRollupCore(rollup).wasmModuleRoot() == previousWasmModuleRoot, + "SetWasmModuleRootAction: unexpected previous wasm module root" + ); + + IRollupAdmin(rollup).setWasmModuleRoot(newWasmModuleRoot); + + // verify: + require( + IRollupCore(rollup).wasmModuleRoot() == newWasmModuleRoot, + "SetWasmModuleRootAction: wasm module root not set" + ); + } +} diff --git a/scripts/foundry/arbos-upgrades/set-wasm-module-root/.env.example b/scripts/foundry/arbos-upgrades/set-wasm-module-root/.env.example new file mode 100644 index 00000000..7fd1fadc --- /dev/null +++ b/scripts/foundry/arbos-upgrades/set-wasm-module-root/.env.example @@ -0,0 +1,8 @@ +# Deploy action +PREVIOUS_WASM_MODULE_ROOT= +NEW_WASM_MODULE_ROOT= + +# Execute action +UPGRADE_ACTION_ADDRESS="0x217788c286797D56Cd59aF5e493f3699C39cbbe8" +PARENT_UPGRADE_EXECUTOR_ADDRESS="0x6A17B0D4EA37c4F519caCf776450cb42199Df0A4" +INBOX= diff --git a/scripts/foundry/arbos-upgrades/set-wasm-module-root/DeploySetWasmModuleRootAction.s.sol b/scripts/foundry/arbos-upgrades/set-wasm-module-root/DeploySetWasmModuleRootAction.s.sol new file mode 100644 index 00000000..dc25b3bb --- /dev/null +++ b/scripts/foundry/arbos-upgrades/set-wasm-module-root/DeploySetWasmModuleRootAction.s.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.16; + +import "forge-std/Script.sol"; +import {SetWasmModuleRootAction} from "../../../../contracts/parent-chain/rollup/SetWasmModuleRootAction.sol"; + +/** + * @title DeploySetWasmModuleRootActionScript + * @notice This script deploys SetWasmModuleRootAction + */ +contract DeploySetWasmModuleRootActionScript is Script { + function run() public { + bytes32 previousWasmModuleRoot = vm.envBytes32("PREVIOUS_WASM_MODULE_ROOT"); + bytes32 newWasmModuleRoot = vm.envBytes32("NEW_WASM_MODULE_ROOT"); + + if (previousWasmModuleRoot == bytes32(0) || newWasmModuleRoot == bytes32(0)) { + revert("PREVIOUS_WASM_MODULE_ROOT and NEW_WASM_MODULE_ROOT must be set"); + } + + vm.startBroadcast(); + + // finally deploy upgrade action + new SetWasmModuleRootAction({ + _previousWasmModuleRoot: previousWasmModuleRoot, + _newWasmModuleRoot: newWasmModuleRoot + }); + + vm.stopBroadcast(); + } +} diff --git a/scripts/foundry/arbos-upgrades/set-wasm-module-root/README.md b/scripts/foundry/arbos-upgrades/set-wasm-module-root/README.md new file mode 100644 index 00000000..43e4bb00 --- /dev/null +++ b/scripts/foundry/arbos-upgrades/set-wasm-module-root/README.md @@ -0,0 +1,39 @@ +# Set WasmModuleRoot + +This script empowers `SetWasmModuleRootAction` contract which updates the wasmModuleRoot for existing Arbitrum chains, on the Rollup contract deployed on their parent chain. + +## How to use it + +1. Setup .env according to the example files, make sure you have the correct previous and new wasmModuleRoot. The previous wasmModuleRoot should identify the wasmModuleRoot from which you're upgrading your chain. + +`DeploySetWasmModuleRootActionScript.s.sol` script deploys `SetWasmModuleRootAction` contract. It can be executed in this directory like this: + +```shell +forge script --sender $DEPLOYER --rpc-url $PARENT_CHAIN_RPC --broadcast --slow ./DeploySetWasmModuleRootActionScript.s.sol -vvv --verify +# use --account XXX / --private-key XXX / --interactive / --ledger to set the account to send the transaction from +``` + +This will deploy the upgrade action. Update your .env file with the address of the upgrade action. + +> [!CAUTION] +> The .env file must be in project root. + +2. Next step is to execute the action. Assumption is that there is an EOA which has executor rights on the parent chain UpgradeExecutor. The upgrade can be executed using `cast` CLI command (part of Foundry installation), using the account with executor rights on the parent chain UpgradeExecutor to send the transaction: + +```shell +(export $(cat .env | xargs) && cast send $PARENT_UPGRADE_EXECUTOR_ADDRESS "execute(address, bytes)" $UPGRADE_ACTION_ADDRESS $(cast calldata "perform(address)" $INBOX) --rpc-url $PARENT_CHAIN_RPC) +# use --account XXX / --private-key XXX / --interactive / --ledger to set the account to send the transaction from +``` + +If you have a multisig as the executor, you can use the following command to create the payload for calling into the `PARENT_UPGRADE_EXECUTOR_ADDRESS`: + +```shell +(export $(cat .env | xargs) && cast calldata "execute(address, bytes)" $UPGRADE_ACTION_ADDRESS $(cast calldata "perform(address)" $INBOX)) +``` + +3. That's it, the wasm module root should be updated. You can make sure it has successfully executed by checking: + +```shell +# Check the current wasm module root (should be the new wasm module root) +cast call --rpc-url $PARENT_CHAIN_RPC $ROLLUP_ADDRESS "wasmModuleRoot()(bytes32)" +``` diff --git a/test/signatures/SetWasmModuleRootAction b/test/signatures/SetWasmModuleRootAction new file mode 100644 index 00000000..126529f7 --- /dev/null +++ b/test/signatures/SetWasmModuleRootAction @@ -0,0 +1,11 @@ + +╭--------------------------+------------╮ +| Method | Identifier | ++=======================================+ +| newWasmModuleRoot() | 6741148c | +|--------------------------+------------| +| perform(address) | b38ed43b | +|--------------------------+------------| +| previousWasmModuleRoot() | 66254991 | +╰--------------------------+------------╯ + diff --git a/test/storage/SetWasmModuleRootAction b/test/storage/SetWasmModuleRootAction new file mode 100644 index 00000000..1ec5dc07 --- /dev/null +++ b/test/storage/SetWasmModuleRootAction @@ -0,0 +1,6 @@ + +╭------+------+------+--------+-------+----------╮ +| Name | Type | Slot | Offset | Bytes | Contract | ++================================================+ +╰------+------+------+--------+-------+----------╯ + From ade08aeb1c3b8f562ebccb110fef3090469cfa95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20FP=20Mar=C3=ADa=20Franco=20P=C3=A9rez?= Date: Mon, 29 Dec 2025 15:56:28 +0000 Subject: [PATCH 2/3] Use executeCall instead of an action to set the wasmModuleRoot --- README.md | 2 +- .../rollup/SetWasmModuleRootAction.sol | 36 ----------------- .../set-wasm-module-root/README.md | 35 +++++++++++++++++ .../set-wasm-module-root/.env.example | 8 ---- .../DeploySetWasmModuleRootAction.s.sol | 30 -------------- .../set-wasm-module-root/README.md | 39 ------------------- test/signatures/SetWasmModuleRootAction | 11 ------ test/storage/SetWasmModuleRootAction | 6 --- 8 files changed, 36 insertions(+), 131 deletions(-) delete mode 100644 contracts/parent-chain/rollup/SetWasmModuleRootAction.sol create mode 100644 docs/arbos-upgrades/set-wasm-module-root/README.md delete mode 100644 scripts/foundry/arbos-upgrades/set-wasm-module-root/.env.example delete mode 100644 scripts/foundry/arbos-upgrades/set-wasm-module-root/DeploySetWasmModuleRootAction.s.sol delete mode 100644 scripts/foundry/arbos-upgrades/set-wasm-module-root/README.md delete mode 100644 test/signatures/SetWasmModuleRootAction delete mode 100644 test/storage/SetWasmModuleRootAction diff --git a/README.md b/README.md index 16c90758..926956a6 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,7 @@ Here is a list of common upgrade paths that can be used to upgrade the Orbit cha ### [ArbOS 51 Dia](https://docs.arbitrum.io/run-arbitrum-node/arbos-releases/arbos51) 1. Upgrade your Nitro node(s) to [Nitro v3.9.3](https://github.com/OffchainLabs/nitro/releases/tag/v3.9.3) or higher -1. Update the wasm module root on the Rollup contract in the parent chain using [Set wasmModuleRoot action](scripts/foundry/arbos-upgrades/set-wasm-module-root) +1. Update the wasm module root on the Rollup contract in the parent chain following the instructions in [Set wasmModuleRoot](docs/arbos-upgrades/set-wasm-module-root/README.md) 1. Schedule the ArbOS 51 Dia upgrade using [ArbOS upgrade at timestamp action](scripts/foundry/arbos-upgrades/at-timestamp) ### [ArbOS 40 Callisto](https://docs.arbitrum.io/run-arbitrum-node/arbos-releases/arbos40) diff --git a/contracts/parent-chain/rollup/SetWasmModuleRootAction.sol b/contracts/parent-chain/rollup/SetWasmModuleRootAction.sol deleted file mode 100644 index ecc0b0aa..00000000 --- a/contracts/parent-chain/rollup/SetWasmModuleRootAction.sol +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity 0.8.16; - -import "@arbitrum/nitro-contracts-1.2.1/src/bridge/IInbox.sol"; -import "@arbitrum/nitro-contracts-1.2.1/src/rollup/IRollupAdmin.sol"; -import "@arbitrum/nitro-contracts-1.2.1/src/rollup/IRollupCore.sol"; - -/// @dev Modified from -/// https://github.com/ArbitrumFoundation/governance/blob/dcb85dc0ac0e6e5d72dd94b721c3655bec3b7639/src/gov-action-contracts/arbos-upgrade/SetWasmModuleRootAction.sol -contract SetWasmModuleRootAction { - bytes32 public immutable previousWasmModuleRoot; - bytes32 public immutable newWasmModuleRoot; - - constructor(bytes32 _previousWasmModuleRoot, bytes32 _newWasmModuleRoot) { - previousWasmModuleRoot = _previousWasmModuleRoot; - newWasmModuleRoot = _newWasmModuleRoot; - } - - function perform(address inbox) external { - address rollup = address(IInbox(inbox).bridge().rollup()); - - // verify previous wasm module root - require( - IRollupCore(rollup).wasmModuleRoot() == previousWasmModuleRoot, - "SetWasmModuleRootAction: unexpected previous wasm module root" - ); - - IRollupAdmin(rollup).setWasmModuleRoot(newWasmModuleRoot); - - // verify: - require( - IRollupCore(rollup).wasmModuleRoot() == newWasmModuleRoot, - "SetWasmModuleRootAction: wasm module root not set" - ); - } -} diff --git a/docs/arbos-upgrades/set-wasm-module-root/README.md b/docs/arbos-upgrades/set-wasm-module-root/README.md new file mode 100644 index 00000000..54826439 --- /dev/null +++ b/docs/arbos-upgrades/set-wasm-module-root/README.md @@ -0,0 +1,35 @@ +# Set WasmModuleRoot + +This document shows how to update the wasmModuleRoot for existing Arbitrum chains, on the Rollup contract deployed on their parent chain, by using the `executeCall` method of the [UpgradeExecutor](https://github.com/OffchainLabs/upgrade-executor/blob/v1.1.1/src/UpgradeExecutor.sol#L73). + +## How to update the WasmModuleRoot of a chain + +1. Add the following env variables to a .env file placed in the project root: + + - `ROLLUP_ADDRESS`: address of the rollup contract of your chain + - `WASM_MODULE_ROOT`: new wasmModuleRoot to update the chain to + - `PARENT_UPGRADE_EXECUTOR_ADDRESS`: address of the UpgradeExecutor on the parent chain + - `PARENT_CHAIN_RPC`: RPC of the parent chain + +> [!CAUTION] +> The .env file must be in project root. + +2. Call the Rollup contract to update the wasmModuleRoot. In this case, we assume that there is an EOA which has executor rights on the parent chain's UpgradeExecutor. The upgrade can be executed using the `cast` CLI command (part of Foundry installation), using the account with executor rights on the parent chain UpgradeExecutor to send the transaction: + +```shell +(export $(cat .env | xargs) && cast send $PARENT_UPGRADE_EXECUTOR_ADDRESS "executeCall(address, bytes)" $ROLLUP_ADDRESS $(cast calldata "setWasmModuleRoot(bytes32)" $WASM_MODULE_ROOT) --rpc-url $PARENT_CHAIN_RPC) +# use --account XXX / --private-key XXX / --interactive / --ledger to set the account to send the transaction from +``` + +If you have a multisig as the executor, you can use the following command to create the payload for calling into the `PARENT_UPGRADE_EXECUTOR_ADDRESS`: + +```shell +(export $(cat .env | xargs) && cast calldata "executeCall(address, bytes)" $ROLLUP_ADDRESS $(cast calldata "setWasmModuleRoot(bytes32)" $WASM_MODULE_ROOT)) +``` + +3. That's it, the wasm module root should be updated. You can make sure it has successfully executed by checking: + +```shell +# Check the current wasm module root (should be the new wasm module root) +cast call --rpc-url $PARENT_CHAIN_RPC $ROLLUP_ADDRESS "wasmModuleRoot()(bytes32)" +``` diff --git a/scripts/foundry/arbos-upgrades/set-wasm-module-root/.env.example b/scripts/foundry/arbos-upgrades/set-wasm-module-root/.env.example deleted file mode 100644 index 7fd1fadc..00000000 --- a/scripts/foundry/arbos-upgrades/set-wasm-module-root/.env.example +++ /dev/null @@ -1,8 +0,0 @@ -# Deploy action -PREVIOUS_WASM_MODULE_ROOT= -NEW_WASM_MODULE_ROOT= - -# Execute action -UPGRADE_ACTION_ADDRESS="0x217788c286797D56Cd59aF5e493f3699C39cbbe8" -PARENT_UPGRADE_EXECUTOR_ADDRESS="0x6A17B0D4EA37c4F519caCf776450cb42199Df0A4" -INBOX= diff --git a/scripts/foundry/arbos-upgrades/set-wasm-module-root/DeploySetWasmModuleRootAction.s.sol b/scripts/foundry/arbos-upgrades/set-wasm-module-root/DeploySetWasmModuleRootAction.s.sol deleted file mode 100644 index dc25b3bb..00000000 --- a/scripts/foundry/arbos-upgrades/set-wasm-module-root/DeploySetWasmModuleRootAction.s.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity 0.8.16; - -import "forge-std/Script.sol"; -import {SetWasmModuleRootAction} from "../../../../contracts/parent-chain/rollup/SetWasmModuleRootAction.sol"; - -/** - * @title DeploySetWasmModuleRootActionScript - * @notice This script deploys SetWasmModuleRootAction - */ -contract DeploySetWasmModuleRootActionScript is Script { - function run() public { - bytes32 previousWasmModuleRoot = vm.envBytes32("PREVIOUS_WASM_MODULE_ROOT"); - bytes32 newWasmModuleRoot = vm.envBytes32("NEW_WASM_MODULE_ROOT"); - - if (previousWasmModuleRoot == bytes32(0) || newWasmModuleRoot == bytes32(0)) { - revert("PREVIOUS_WASM_MODULE_ROOT and NEW_WASM_MODULE_ROOT must be set"); - } - - vm.startBroadcast(); - - // finally deploy upgrade action - new SetWasmModuleRootAction({ - _previousWasmModuleRoot: previousWasmModuleRoot, - _newWasmModuleRoot: newWasmModuleRoot - }); - - vm.stopBroadcast(); - } -} diff --git a/scripts/foundry/arbos-upgrades/set-wasm-module-root/README.md b/scripts/foundry/arbos-upgrades/set-wasm-module-root/README.md deleted file mode 100644 index 43e4bb00..00000000 --- a/scripts/foundry/arbos-upgrades/set-wasm-module-root/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# Set WasmModuleRoot - -This script empowers `SetWasmModuleRootAction` contract which updates the wasmModuleRoot for existing Arbitrum chains, on the Rollup contract deployed on their parent chain. - -## How to use it - -1. Setup .env according to the example files, make sure you have the correct previous and new wasmModuleRoot. The previous wasmModuleRoot should identify the wasmModuleRoot from which you're upgrading your chain. - -`DeploySetWasmModuleRootActionScript.s.sol` script deploys `SetWasmModuleRootAction` contract. It can be executed in this directory like this: - -```shell -forge script --sender $DEPLOYER --rpc-url $PARENT_CHAIN_RPC --broadcast --slow ./DeploySetWasmModuleRootActionScript.s.sol -vvv --verify -# use --account XXX / --private-key XXX / --interactive / --ledger to set the account to send the transaction from -``` - -This will deploy the upgrade action. Update your .env file with the address of the upgrade action. - -> [!CAUTION] -> The .env file must be in project root. - -2. Next step is to execute the action. Assumption is that there is an EOA which has executor rights on the parent chain UpgradeExecutor. The upgrade can be executed using `cast` CLI command (part of Foundry installation), using the account with executor rights on the parent chain UpgradeExecutor to send the transaction: - -```shell -(export $(cat .env | xargs) && cast send $PARENT_UPGRADE_EXECUTOR_ADDRESS "execute(address, bytes)" $UPGRADE_ACTION_ADDRESS $(cast calldata "perform(address)" $INBOX) --rpc-url $PARENT_CHAIN_RPC) -# use --account XXX / --private-key XXX / --interactive / --ledger to set the account to send the transaction from -``` - -If you have a multisig as the executor, you can use the following command to create the payload for calling into the `PARENT_UPGRADE_EXECUTOR_ADDRESS`: - -```shell -(export $(cat .env | xargs) && cast calldata "execute(address, bytes)" $UPGRADE_ACTION_ADDRESS $(cast calldata "perform(address)" $INBOX)) -``` - -3. That's it, the wasm module root should be updated. You can make sure it has successfully executed by checking: - -```shell -# Check the current wasm module root (should be the new wasm module root) -cast call --rpc-url $PARENT_CHAIN_RPC $ROLLUP_ADDRESS "wasmModuleRoot()(bytes32)" -``` diff --git a/test/signatures/SetWasmModuleRootAction b/test/signatures/SetWasmModuleRootAction deleted file mode 100644 index 126529f7..00000000 --- a/test/signatures/SetWasmModuleRootAction +++ /dev/null @@ -1,11 +0,0 @@ - -╭--------------------------+------------╮ -| Method | Identifier | -+=======================================+ -| newWasmModuleRoot() | 6741148c | -|--------------------------+------------| -| perform(address) | b38ed43b | -|--------------------------+------------| -| previousWasmModuleRoot() | 66254991 | -╰--------------------------+------------╯ - diff --git a/test/storage/SetWasmModuleRootAction b/test/storage/SetWasmModuleRootAction deleted file mode 100644 index 1ec5dc07..00000000 --- a/test/storage/SetWasmModuleRootAction +++ /dev/null @@ -1,6 +0,0 @@ - -╭------+------+------+--------+-------+----------╮ -| Name | Type | Slot | Offset | Bytes | Contract | -+================================================+ -╰------+------+------+--------+-------+----------╯ - From 1d3eb0d1af1e6070431cf5fe315d7f128e7ef727 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20FP=20Mar=C3=ADa=20Franco=20P=C3=A9rez?= Date: Mon, 29 Dec 2025 16:22:56 +0000 Subject: [PATCH 3/3] Add wasmModuleRoot to readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 926956a6..bf5fe027 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,7 @@ Here is a list of common upgrade paths that can be used to upgrade the Orbit cha ### [ArbOS 51 Dia](https://docs.arbitrum.io/run-arbitrum-node/arbos-releases/arbos51) 1. Upgrade your Nitro node(s) to [Nitro v3.9.3](https://github.com/OffchainLabs/nitro/releases/tag/v3.9.3) or higher -1. Update the wasm module root on the Rollup contract in the parent chain following the instructions in [Set wasmModuleRoot](docs/arbos-upgrades/set-wasm-module-root/README.md) +1. Update the wasm module root on the Rollup contract in the parent chain to `0x8a7513bf7bb3e3db04b0d982d0e973bcf57bf8b88aef7c6d03dba3a81a56a499`, following the instructions in [Set wasmModuleRoot](docs/arbos-upgrades/set-wasm-module-root/README.md) 1. Schedule the ArbOS 51 Dia upgrade using [ArbOS upgrade at timestamp action](scripts/foundry/arbos-upgrades/at-timestamp) ### [ArbOS 40 Callisto](https://docs.arbitrum.io/run-arbitrum-node/arbos-releases/arbos40)