From 4e16a5ee8019b787c86cebd3db53e168424fba46 Mon Sep 17 00:00:00 2001 From: Luiz Date: Tue, 16 Dec 2025 12:14:44 -0300 Subject: [PATCH 01/19] add scripts --- .env.example | 36 +++++- deployments/arbitrum-sepolia.json | 13 ++ deployments/ethereum-sepolia.json | 24 ++++ deployments/linea-sepolia.json | 13 ++ deployments/optimism-sepolia.json | 12 ++ deployments/scroll-sepolia.json | 14 +++ foundry.toml | 2 + scripts/deployment/DeployBase.s.sol | 119 ++++++++++++++++++ scripts/deployment/DeployProtocol.s.sol | 23 ++++ scripts/deployment/deploy-protocol.sh | 7 ++ scripts/deployment/deploy.sh | 58 +++++++++ .../provers/DeployArbitrumParentToChild.s.sol | 53 ++++++++ .../provers/DeployLineaParentToChild.s.sol | 52 ++++++++ .../provers/DeployOptimismParentToChild.s.sol | 52 ++++++++ .../provers/DeployScrollParentToChild.s.sol | 50 ++++++++ .../provers/deploy-parent-provers.sh | 49 ++++++++ 16 files changed, 573 insertions(+), 4 deletions(-) create mode 100644 deployments/arbitrum-sepolia.json create mode 100644 deployments/ethereum-sepolia.json create mode 100644 deployments/linea-sepolia.json create mode 100644 deployments/optimism-sepolia.json create mode 100644 deployments/scroll-sepolia.json create mode 100644 scripts/deployment/DeployBase.s.sol create mode 100644 scripts/deployment/DeployProtocol.s.sol create mode 100755 scripts/deployment/deploy-protocol.sh create mode 100644 scripts/deployment/deploy.sh create mode 100644 scripts/deployment/provers/DeployArbitrumParentToChild.s.sol create mode 100644 scripts/deployment/provers/DeployLineaParentToChild.s.sol create mode 100644 scripts/deployment/provers/DeployOptimismParentToChild.s.sol create mode 100644 scripts/deployment/provers/DeployScrollParentToChild.s.sol create mode 100755 scripts/deployment/provers/deploy-parent-provers.sh diff --git a/.env.example b/.env.example index 8c82c68..bc1fde4 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,32 @@ -ARBITRUM_RPC_URL= # Arbitrum Sepolia URL -ETHEREUM_RPC_URL= # Ethereum Sepolia URL -OPTIMISM_RPC_URL= -LINEA_SEPOLIA= # Ethereum Sepolia URL \ No newline at end of file +ARBITRUM_SEPOLIA_RPC_URL= +ETHEREUM_SEPOLIA_RPC_URL= +ZKSYNC_SEPOLIA_RPC_URL= +OPTIMISM_SEPOLIA_RPC_URL= +LINEA_SEPOLIA_RPC_URL= +SCROLL_SEPOLIA_RPC_URL= + +ONWER=0x9a56fFd72F4B526c523C733F1F74197A51c495E1 + +DEPLOYER_PRIVATE_KEY= + +ETHEREUM_SEPOLIA_CHAIN_ID=11155111 + + +# Arbitrum Envs +ARBITRUM_SEPOLIA_CHAIN_ID=421614 +ARBITRUM_SEPOLIA_OUTBOX=0x65f07C7D521164a4d5DaC6eB8Fac8DA067A3B78F +ARBITRUM_SEPOLIA_ROOTS_SLOT=3 + +#Linea Envs +LINEA_SEPOLIA_CHAIN_ID=59141 +LINEA_SEPOLIA_ROLLUP=0xB218f8A4Bc926cF1cA7b3423c154a0D627Bdb7E5 +LINEA_SEPOLIA_STATE_ROOT_HASHES_SLOT=282 + +# Scroll Envs +SCROLL_SEPOLIA_CHAIN_ID=534351 +SCROLL_CHAIN_SEPOLIA=0x2D567EcE699Eabe5afCd141eDB7A4f2D0D6ce8a0 +SCROLL_SEPOLIA_FINALIZED_STATE_ROOT_SLOT=158 + +# Optimism Envs +OPTIMISM_SEPOLIA_CHAIN_ID=11155420 +OPTIMISM_SEPOLIA_ANCHOR_STATE_REGISTRY=0xa1Cec548926eb5d69aa3B7B57d371EdBdD03e64b \ No newline at end of file diff --git a/deployments/arbitrum-sepolia.json b/deployments/arbitrum-sepolia.json new file mode 100644 index 0000000..b457c25 --- /dev/null +++ b/deployments/arbitrum-sepolia.json @@ -0,0 +1,13 @@ +{ + "contracts": { + "broadcaster": "0x4309FcAA812F729A2c6Fc9b67094296389eC919c", + "receiver": "0xDa3b7126De1b003CF3817b00F6Bfa7C852CF4C6c" + }, + "copies": { + "ethereum-sepolia": { + "linea-sepolia": "0x98C620F2A70B85ce5E6e10744737e91D05072469", + "optimism-sepolia": "0xDb881503E4942265b9e5c39Dbb73c37F6b973a24", + "scroll-sepolia": "0x12432DeEEEBFF3aBF63549206dE28FA4Dec04638" + } + } +} \ No newline at end of file diff --git a/deployments/ethereum-sepolia.json b/deployments/ethereum-sepolia.json new file mode 100644 index 0000000..e884d9c --- /dev/null +++ b/deployments/ethereum-sepolia.json @@ -0,0 +1,24 @@ +{ + "contracts": { + "broadcaster": "0xC5CeBD005B1F43A8995D655BC4043cc9f13e60cc", + "receiver": "0x6688Bb0e09eE79c607f14DfAAdF0Ad4E177606a0" + }, + "provers": { + "arbitrum-sepolia": { + "pointer": "0x78c6E9d58e1ED1517379FE25d1B24976E5C94225", + "prover": "0x87dbDc08F3152bE7A4B7676582BCcCAB07cfAA7A" + }, + "linea-sepolia": { + "pointer": "0x8a52bA2FCc6Fd4C81dE3719Eb6CF4AbD38885d03", + "prover": "0xe19B2b1Abe26cE00C32ECc7357DD3936E83e3e33" + }, + "optimism-sepolia": { + "pointer": "0x63019c84C180D6f1C251aAF53CA235053E4F9dc4", + "prover": "0xF5dD2286E67A92E9Ae296429a035C5d72a32f47c" + }, + "scroll-sepolia": { + "pointer": "0x40fdB1E3b853AbE267353D7026A1D8fEA617F1Aa", + "prover": "0x0c9C4fAce0878eC45C8bcCB2e680119581796D10" + } + } +} \ No newline at end of file diff --git a/deployments/linea-sepolia.json b/deployments/linea-sepolia.json new file mode 100644 index 0000000..7071827 --- /dev/null +++ b/deployments/linea-sepolia.json @@ -0,0 +1,13 @@ +{ + "contracts": { + "broadcaster": "0x9EAb562d4BEfc698AE011132B4d71c29486125d0", + "receiver": "0x8E07B6d67BA876c081Ee37dff5c81D0762b04D2a" + }, + "copies": { + "ethereum-sepolia": { + "arbitrum-sepolia": "0x4309FcAA812F729A2c6Fc9b67094296389eC919c", + "optimism-sepolia": "0x98C620F2A70B85ce5E6e10744737e91D05072469", + "scroll-sepolia": "0xDa3b7126De1b003CF3817b00F6Bfa7C852CF4C6c" + } + } +} \ No newline at end of file diff --git a/deployments/optimism-sepolia.json b/deployments/optimism-sepolia.json new file mode 100644 index 0000000..bcbf97a --- /dev/null +++ b/deployments/optimism-sepolia.json @@ -0,0 +1,12 @@ +{ + "copies": { + "ethereum-sepolia": { + "arbitrum-sepolia": "0x1846Ce62736A4f9dB0F9CEC59BCE80Da2dF7e2FB", + "linea-sepolia": "0x09BF3ABf872b6613c50b989714F68D73C3310B03" + } + }, + "contracts": { + "broadcaster": "0x42a2076b90a207CD3D67140DdfBF76868bbF1dC8", + "receiver": "0x6421F5C54a3f235def5055bA377993b948B5cF72" + } +} \ No newline at end of file diff --git a/deployments/scroll-sepolia.json b/deployments/scroll-sepolia.json new file mode 100644 index 0000000..b8aa684 --- /dev/null +++ b/deployments/scroll-sepolia.json @@ -0,0 +1,14 @@ +{ + "copies": { + "ethereum-sepolia": { + "arbitrum-sepolia": "0x3F91bF074fff67f1EB12bA029982c29eBd26c08a", + "linea-sepolia": "0xDC444Ec0675b7c1a4BEa5C9A6AaB6AEeF51265FD", + "optimism-sepolia": "0x9d81549ceF77FeAE7190045E3994c24ED631A080", + "scroll-sepolia": "0xc0Ec75f14eA1a6142B5223EAd5D2AfE9AfAcB9eE" + } + }, + "contracts": { + "broadcaster": "0xf0a41Df7879F0585Fad55bda91Fc7d02a4eEe186", + "receiver": "0xF6F1dE9DE71107Ff83e464AfadDccCA0Cd0a33ed" + } +} \ No newline at end of file diff --git a/foundry.toml b/foundry.toml index fb41b9e..b03cc3b 100644 --- a/foundry.toml +++ b/foundry.toml @@ -14,6 +14,8 @@ fs_permissions = [ { access = 'read', path = './test/payloads/taiko' }, { access = 'read', path = './test/payloads/linea' }, { access = 'read', path = './test/payloads/scroll' }, + + { access = "read-write", path = "./deployments" }, { access = 'read', path = './out' }, ] diff --git a/scripts/deployment/DeployBase.s.sol b/scripts/deployment/DeployBase.s.sol new file mode 100644 index 0000000..d0113dd --- /dev/null +++ b/scripts/deployment/DeployBase.s.sol @@ -0,0 +1,119 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.28; + +import {Script} from "forge-std/Script.sol"; +import {console2} from "forge-std/console2.sol"; + +contract DeployBase is Script { + error InvalidChainId(uint256 chainId); + + function _chainName(uint256 chainId) internal view returns (string memory) { + if (chainId == vm.envUint("ETHEREUM_SEPOLIA_CHAIN_ID")) return "ethereum-sepolia"; + if (chainId == vm.envUint("ARBITRUM_SEPOLIA_CHAIN_ID")) return "arbitrum-sepolia"; + if (chainId == vm.envUint("LINEA_SEPOLIA_CHAIN_ID")) return "linea-sepolia"; + if (chainId == vm.envUint("SCROLL_SEPOLIA_CHAIN_ID")) return "scroll-sepolia"; + if (chainId == vm.envUint("OPTIMISM_SEPOLIA_CHAIN_ID")) return "optimism-sepolia"; + revert InvalidChainId(chainId); + } + + function _deploymentsDir() internal view returns (string memory) { + return string.concat(vm.projectRoot(), "/deployments"); + } + + function _path() internal view returns (string memory) { + return string.concat(_deploymentsDir(), "/", _chainName(block.chainid), ".json"); + } + + function _jsonString(string memory s) internal pure returns (string memory) { + return string.concat('"', s, '"'); + } + + function _ensureDeploymentsDir() internal { + vm.createDir(_deploymentsDir(), true); + } + + function _ensureFile(string memory path) internal { + _ensureDeploymentsDir(); + if (!vm.exists(path)) { + // start as an empty object; we’ll add objects below + vm.writeFile(path, "{}"); + } else { + string memory content = vm.readFile(path); + if (bytes(content).length == 0) vm.writeFile(path, "{}"); + } + } + + /// Ensures that `jsonPath` exists and is an object. If missing, creates `{}` there. + function _ensureObjectAt(string memory path, string memory jsonPath) internal { + string memory content = vm.readFile(path); + try vm.parseJson(content, jsonPath) returns (bytes memory) { + // exists (and is parseable), do nothing + } catch { + vm.writeJson("{}", path, jsonPath); + } + } + + function _ensureObjectAtPtr(string memory path, string memory ptr) internal { + // Ensure an object exists at JSON Pointer `ptr` (e.g. "/provers/arbitrum-sepolia") + string memory content = vm.readFile(path); + try vm.parseJson(content, ptr) returns (bytes memory) { + // exists + } catch { + vm.writeJson("{}", path, ptr); + } + } + + function _ensureRootScaffold(string memory path) internal { + _ensureFile(path); + _ensureObjectAt(path, ".contracts"); + _ensureObjectAt(path, ".provers"); + _ensureObjectAt(path, ".copies"); + } + + // ------------------------- + // Writes + // ------------------------- + + function _writeContract(string memory name, address addr) internal { + string memory path = _path(); + _ensureRootScaffold(path); + + vm.writeJson( + _jsonString(vm.toString(addr)), + path, + string.concat(".contracts.", name) + ); + } + + /// Adds/updates `.provers["chainKey"].pointer` and `.provers["chainKey"].prover` + function _writeProver(string memory chainKey, address pointer, address prover) internal { + string memory path = _path(); + _ensureRootScaffold(path); + + // Ensure `.provers.` exists as an object + string memory objPath = string.concat(".provers.", chainKey); + _ensureObjectAt(path, objPath); + + // Write the pointer and prover addresses + vm.writeJson(_jsonString(vm.toString(pointer)), path, string.concat(objPath, ".pointer")); + vm.writeJson(_jsonString(vm.toString(prover)), path, string.concat(objPath, ".prover")); + } + + + + /// Adds/updates `.copies["src"]["dst"] = "0x..."` + function _writeCopy(string memory homeChain, string memory targetChain, address copyAddr) internal { + string memory path = _path(); + _ensureRootScaffold(path); + + // Ensure `.copies.` exists as an object + string memory homeObjPath = string.concat(".copies.", homeChain); + _ensureObjectAt(path, homeObjPath); + + // Set `.copies.. = "0x..."` + string memory leafPath = string.concat(homeObjPath, ".", targetChain); + vm.writeJson(_jsonString(vm.toString(copyAddr)), path, leafPath); + } + + +} diff --git a/scripts/deployment/DeployProtocol.s.sol b/scripts/deployment/DeployProtocol.s.sol new file mode 100644 index 0000000..0f92035 --- /dev/null +++ b/scripts/deployment/DeployProtocol.s.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.28; + +import { DeployBase } from "./DeployBase.s.sol"; + + +import { console } from "forge-std/console.sol"; +import { Broadcaster } from "src/contracts/Broadcaster.sol"; +import { Receiver } from "src/contracts/Receiver.sol"; + + +contract Deploy is DeployBase { + function run() public { + vm.startBroadcast(); + Broadcaster broadcaster = new Broadcaster(); + Receiver receiver = new Receiver(); + vm.stopBroadcast(); + + _writeContract("broadcaster", address(broadcaster)); + _writeContract("receiver", address(receiver)); + + } +} \ No newline at end of file diff --git a/scripts/deployment/deploy-protocol.sh b/scripts/deployment/deploy-protocol.sh new file mode 100755 index 0000000..42acae7 --- /dev/null +++ b/scripts/deployment/deploy-protocol.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +forge script scripts/deployment/DeployProtocol.s.sol \ + --rpc-url "$RPC_URL" \ + --private-key "$DEPLOYER_PRIVATE_KEY" \ + --broadcast + \ No newline at end of file diff --git a/scripts/deployment/deploy.sh b/scripts/deployment/deploy.sh new file mode 100644 index 0000000..c4e747e --- /dev/null +++ b/scripts/deployment/deploy.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash + +set -a +source .env +set +a + + +# ======================================================================================== +# Deploy Broadcaster and Receiver contracts +# ======================================================================================== +chmod +x scripts/deployment/deploy-protocol.sh + +echo "Deploying Broadcaster and Receiver contracts on Ethereum Sepolia..." +RPC_URL="$ETHEREUM_SEPOLIA_RPC_URL" \ +./scripts/deployment/deploy-protocol.sh + +echo "Deploying Broadcaster and Receiver contracts on Arbitrum Sepolia..." +RPC_URL="$ARBITRUM_SEPOLIA_RPC_URL" \ +./scripts/deployment/deploy-protocol.sh + +echo "Deploying Broadcaster and Receiver contracts on Linea Sepolia..." +RPC_URL="$LINEA_SEPOLIA_RPC_URL" \ +./scripts/deployment/deploy-protocol.sh + +echo "Deploying Broadcaster and Receiver contracts on Scroll Sepolia..." +RPC_URL="$SCROLL_SEPOLIA_RPC_URL" \ +./scripts/deployment/deploy-protocol.sh + + +echo "Deploying Broadcaster and Receiver contracts on Optimism Sepolia..." +RPC_URL="$OPTIMISM_SEPOLIA_RPC_URL" \ +./scripts/deployment/deploy-protocol.sh + + +# ======================================================================================== +# Deploy ParentToChildProver contracts +# ======================================================================================== +chmod +x scripts/deployment/provers/deploy-parent-provers.sh + +# Ethereum Sepolia +echo "Deploying ParentToChildProver contracts on Ethereum Sepolia..." +RPC_URL="$ETHEREUM_SEPOLIA_RPC_URL" ./scripts/deployment/provers/deploy-parent-provers.sh + +# Arbitrum Sepolia +echo "Deploying ParentToChildProver contracts on Arbitrum Sepolia..." +RPC_URL="$ARBITRUM_SEPOLIA_RPC_URL" ./scripts/deployment/provers/deploy-parent-provers.sh + +# Linea Sepolia +echo "Deploying ParentToChildProver contracts on Linea Sepolia..." +RPC_URL="$LINEA_SEPOLIA_RPC_URL" ./scripts/deployment/provers/deploy-parent-provers.sh + +# Scroll Sepolia +echo "Deploying ParentToChildProver contracts on Scroll Sepolia..." +RPC_URL="$SCROLL_SEPOLIA_RPC_URL" ./scripts/deployment/provers/deploy-parent-provers.sh + +# Optimism Sepolia +echo "Deploying ParentToChildProver contracts on Optimism Sepolia..." +RPC_URL="$OPTIMISM_SEPOLIA_RPC_URL" ./scripts/deployment/provers/deploy-parent-provers.sh diff --git a/scripts/deployment/provers/DeployArbitrumParentToChild.s.sol b/scripts/deployment/provers/DeployArbitrumParentToChild.s.sol new file mode 100644 index 0000000..a9004d1 --- /dev/null +++ b/scripts/deployment/provers/DeployArbitrumParentToChild.s.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.28; + +import { DeployBase } from "../DeployBase.s.sol"; + + +import { console } from "forge-std/console.sol"; +import { ParentToChildProver } from "src/contracts/provers/arbitrum/ParentToChildProver.sol"; +import { BlockHashProverPointer } from "src/contracts/BlockHashProverPointer.sol"; + + +contract DeployArbitrumParentToChild is DeployBase { + + function run() public { + + + address outbox = vm.envAddress("OUTBOX"); + uint256 rootsSlot = vm.envUint("ROOTS_SLOT"); + address owner = vm.envAddress("OWNER"); + + uint256 homeChainId = vm.envUint("HOME_CHAIN_ID"); + uint256 targetChainId = vm.envUint("TARGET_CHAIN_ID"); + + address prover; + address pointer; + if(block.chainid == targetChainId){ + return; + } + vm.startBroadcast(); + prover = address(new ParentToChildProver(outbox, rootsSlot)); + + // Only deploy the pointer on the "canonical" chain, i.e., the chain where the pointer will be called from the receiver directly. + // The other prover deployments are copies. + if(block.chainid == homeChainId){ + pointer = address(new BlockHashProverPointer(owner)); + + // This will only work if `msg.sender` is the owner of the pointer. + BlockHashProverPointer(pointer).setImplementationAddress(address(prover)); + } + vm.stopBroadcast(); + + if(pointer == address(0)){ + // If the pointer is not deployed, it means that this is a copy of the prover deployed in a different chain. + _writeCopy(_chainName(homeChainId), _chainName(targetChainId), address(prover)); + + } + + else { + _writeProver(_chainName(targetChainId), address(pointer), address(prover)); + } + + } +} \ No newline at end of file diff --git a/scripts/deployment/provers/DeployLineaParentToChild.s.sol b/scripts/deployment/provers/DeployLineaParentToChild.s.sol new file mode 100644 index 0000000..b24f27f --- /dev/null +++ b/scripts/deployment/provers/DeployLineaParentToChild.s.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.28; + +import { DeployBase } from "../DeployBase.s.sol"; + + +import { console } from "forge-std/console.sol"; +import { ParentToChildProver } from "src/contracts/provers/linea/ParentToChildProver.sol"; +import { BlockHashProverPointer } from "src/contracts/BlockHashProverPointer.sol"; + + +contract DeployArbitrumParentToChild is DeployBase { + + function run() public { + + + address rollup = vm.envAddress("ROLLUP"); + uint256 stateRootHashesSlot = vm.envUint("STATE_ROOT_HASHES_SLOT"); + address owner = vm.envAddress("OWNER"); + + uint256 homeChainId = vm.envUint("HOME_CHAIN_ID"); + uint256 targetChainId = vm.envUint("TARGET_CHAIN_ID"); + + address prover; + address pointer; + if(block.chainid == targetChainId){ + return; + } + vm.startBroadcast(); + prover = address(new ParentToChildProver(rollup, stateRootHashesSlot, homeChainId)); + + // Only deploy the pointer on the "canonical" chain, i.e., the chain where the pointer will be called from the receiver directly. + // The other prover deployments are copies. + if(block.chainid == homeChainId){ + pointer = address(new BlockHashProverPointer(owner)); + + // This will only work if `msg.sender` is the owner of the pointer. + BlockHashProverPointer(pointer).setImplementationAddress(address(prover)); + } + vm.stopBroadcast(); + + if(pointer == address(0)){ + _writeCopy(_chainName(homeChainId), _chainName(targetChainId), address(prover)); + + } + + else { + _writeProver(_chainName(targetChainId), address(pointer), address(prover)); + } + + } +} \ No newline at end of file diff --git a/scripts/deployment/provers/DeployOptimismParentToChild.s.sol b/scripts/deployment/provers/DeployOptimismParentToChild.s.sol new file mode 100644 index 0000000..4331154 --- /dev/null +++ b/scripts/deployment/provers/DeployOptimismParentToChild.s.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.28; + +import { DeployBase } from "../DeployBase.s.sol"; + + +import { console } from "forge-std/console.sol"; +import { ParentToChildProver } from "src/contracts/provers/optimism/ParentToChildProver.sol"; +import { BlockHashProverPointer } from "src/contracts/BlockHashProverPointer.sol"; + + +contract DeployArbitrumParentToChild is DeployBase { + + function run() public { + + + address anchorStateRegistry = vm.envAddress("ANCHOR_STATE_REGISTRY"); + address owner = vm.envAddress("OWNER"); + + uint256 homeChainId = vm.envUint("HOME_CHAIN_ID"); + uint256 targetChainId = vm.envUint("TARGET_CHAIN_ID"); + + address prover; + address pointer; + if(block.chainid == targetChainId){ + return; + } + vm.startBroadcast(); + prover = address(new ParentToChildProver(anchorStateRegistry)); + + // Only deploy the pointer on the "canonical" chain, i.e., the chain where the pointer will be called from the receiver directly. + // The other prover deployments are copies. + if(block.chainid == homeChainId){ + pointer = address(new BlockHashProverPointer(owner)); + + // This will only work if `msg.sender` is the owner of the pointer. + BlockHashProverPointer(pointer).setImplementationAddress(address(prover)); + } + vm.stopBroadcast(); + + if(pointer == address(0)){ + // If the pointer is not deployed, it means that this is a copy of the prover deployed in a different chain. + _writeCopy(_chainName(homeChainId), _chainName(targetChainId), address(prover)); + + } + + else { + _writeProver(_chainName(targetChainId), address(pointer), address(prover)); + } + + } +} \ No newline at end of file diff --git a/scripts/deployment/provers/DeployScrollParentToChild.s.sol b/scripts/deployment/provers/DeployScrollParentToChild.s.sol new file mode 100644 index 0000000..173a089 --- /dev/null +++ b/scripts/deployment/provers/DeployScrollParentToChild.s.sol @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.28; + +import { DeployBase } from "../DeployBase.s.sol"; + + +import { console } from "forge-std/console.sol"; +import { ParentToChildProver } from "src/contracts/provers/scroll/ParentToChildProver.sol"; +import { BlockHashProverPointer } from "src/contracts/BlockHashProverPointer.sol"; + + +contract DeployArbitrumParentToChild is DeployBase { + + function run() public { + + + address scrollChain = vm.envAddress("SCROLL_CHAIN"); + uint256 finalizedStateRootsSlot = vm.envUint("FINALIZED_STATE_ROOTS_SLOT"); + address owner = vm.envAddress("OWNER"); + + uint256 homeChainId = vm.envUint("HOME_CHAIN_ID"); + uint256 targetChainId = vm.envUint("TARGET_CHAIN_ID"); + + address prover; + address pointer; + vm.startBroadcast(); + prover = address(new ParentToChildProver(scrollChain, finalizedStateRootsSlot, homeChainId)); + + // Only deploy the pointer on the "canonical" chain, i.e., the chain where the pointer will be called from the receiver directly. + // The other prover deployments are copies. + if(block.chainid == homeChainId){ + pointer = address(new BlockHashProverPointer(owner)); + + // This will only work if `msg.sender` is the owner of the pointer. + BlockHashProverPointer(pointer).setImplementationAddress(address(prover)); + } + vm.stopBroadcast(); + + if(pointer == address(0)){ + // If the pointer is not deployed, it means that this is a copy of the prover deployed in a different chain. + _writeCopy(_chainName(homeChainId), _chainName(targetChainId), address(prover)); + + } + + else { + _writeProver(_chainName(targetChainId), address(pointer), address(prover)); + } + + } +} \ No newline at end of file diff --git a/scripts/deployment/provers/deploy-parent-provers.sh b/scripts/deployment/provers/deploy-parent-provers.sh new file mode 100755 index 0000000..3866e07 --- /dev/null +++ b/scripts/deployment/provers/deploy-parent-provers.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash + +OUTBOX=$ARBITRUM_SEPOLIA_OUTBOX \ +ROOTS_SLOT=$ARBITRUM_SEPOLIA_ROOTS_SLOT \ +HOME_CHAIN_ID=$ETHEREUM_SEPOLIA_CHAIN_ID \ +TARGET_CHAIN_ID=$ARBITRUM_SEPOLIA_CHAIN_ID \ +forge script scripts/deployment/provers/DeployArbitrumParentToChild.s.sol \ + --rpc-url "$RPC_URL" \ + --private-key "$DEPLOYER_PRIVATE_KEY" \ + --broadcast + + +ROLLUP=$LINEA_SEPOLIA_ROLLUP \ +STATE_ROOT_HASHES_SLOT=$LINEA_SEPOLIA_STATE_ROOT_HASHES_SLOT \ +HOME_CHAIN_ID=$ETHEREUM_SEPOLIA_CHAIN_ID \ +TARGET_CHAIN_ID=$LINEA_SEPOLIA_CHAIN_ID \ +forge script scripts/deployment/provers/DeployLineaParentToChild.s.sol \ + --rpc-url "$RPC_URL" \ + --private-key "$DEPLOYER_PRIVATE_KEY" \ + --broadcast + + +SCROLL_CHAIN=$SCROLL_CHAIN_SEPOLIA \ +FINALIZED_STATE_ROOTS_SLOT=$SCROLL_SEPOLIA_FINALIZED_STATE_ROOT_SLOT \ +HOME_CHAIN_ID=$ETHEREUM_SEPOLIA_CHAIN_ID \ +TARGET_CHAIN_ID=$SCROLL_SEPOLIA_CHAIN_ID \ +forge script scripts/deployment/provers/DeployScrollParentToChild.s.sol \ + --rpc-url "$RPC_URL" \ + --private-key "$DEPLOYER_PRIVATE_KEY" \ + --broadcast + + +ANCHOR_STATE_REGISTRY=$OPTIMISM_SEPOLIA_ANCHOR_STATE_REGISTRY \ +HOME_CHAIN_ID=$ETHEREUM_SEPOLIA_CHAIN_ID \ +TARGET_CHAIN_ID=$OPTIMISM_SEPOLIA_CHAIN_ID \ +forge script scripts/deployment/provers/DeployOptimismParentToChild.s.sol \ + --rpc-url "$RPC_URL" \ + --private-key "$DEPLOYER_PRIVATE_KEY" \ + --broadcast + + + + + + + + + + From b5fa8814ca6c2bd70a924b91a8ec29a1952817bf Mon Sep 17 00:00:00 2001 From: Luiz Date: Thu, 8 Jan 2026 12:19:39 -0300 Subject: [PATCH 02/19] up --- scripts/deployment/DeployProtocol.s.sol | 18 +++++++++++++++++- scripts/deployment/deploy-protocol.sh | 2 +- scripts/deployment/deploy.sh | 11 ++++++++++- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/scripts/deployment/DeployProtocol.s.sol b/scripts/deployment/DeployProtocol.s.sol index 0f92035..2e62bfa 100644 --- a/scripts/deployment/DeployProtocol.s.sol +++ b/scripts/deployment/DeployProtocol.s.sol @@ -6,13 +6,29 @@ import { DeployBase } from "./DeployBase.s.sol"; import { console } from "forge-std/console.sol"; import { Broadcaster } from "src/contracts/Broadcaster.sol"; +import { ZkSyncBroadcaster } from "src/contracts/ZkSyncBroadcaster.sol"; import { Receiver } from "src/contracts/Receiver.sol"; contract Deploy is DeployBase { function run() public { + + + string memory chainType = vm.envString("CHAIN_TYPE"); + + address broadcasterAddress; + + vm.startBroadcast(); - Broadcaster broadcaster = new Broadcaster(); + + if(chainType == "zksync") { + address l1Messenger = 0x0000000000000000000000000000000000008008; + + broadcasterAddress = new ZkSyncBroadcaster(l1Messenger); + + } + + broadcasterAddress = address(new Broadcaster()); Receiver receiver = new Receiver(); vm.stopBroadcast(); diff --git a/scripts/deployment/deploy-protocol.sh b/scripts/deployment/deploy-protocol.sh index 42acae7..01ae3ef 100755 --- a/scripts/deployment/deploy-protocol.sh +++ b/scripts/deployment/deploy-protocol.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -forge script scripts/deployment/DeployProtocol.s.sol \ +CHAIN_TYPE=$CHAIN_TYPE forge script scripts/deployment/DeployProtocol.s.sol \ --rpc-url "$RPC_URL" \ --private-key "$DEPLOYER_PRIVATE_KEY" \ --broadcast diff --git a/scripts/deployment/deploy.sh b/scripts/deployment/deploy.sh index c4e747e..2e8c4f3 100644 --- a/scripts/deployment/deploy.sh +++ b/scripts/deployment/deploy.sh @@ -11,26 +11,35 @@ set +a chmod +x scripts/deployment/deploy-protocol.sh echo "Deploying Broadcaster and Receiver contracts on Ethereum Sepolia..." +CHAIN_TYPE="ethereum" \ RPC_URL="$ETHEREUM_SEPOLIA_RPC_URL" \ ./scripts/deployment/deploy-protocol.sh echo "Deploying Broadcaster and Receiver contracts on Arbitrum Sepolia..." +CHAIN_TYPE="arbitrum" \ RPC_URL="$ARBITRUM_SEPOLIA_RPC_URL" \ ./scripts/deployment/deploy-protocol.sh echo "Deploying Broadcaster and Receiver contracts on Linea Sepolia..." +CHAIN_TYPE="linea" \ RPC_URL="$LINEA_SEPOLIA_RPC_URL" \ ./scripts/deployment/deploy-protocol.sh echo "Deploying Broadcaster and Receiver contracts on Scroll Sepolia..." +CHAIN_TYPE="scroll" \ RPC_URL="$SCROLL_SEPOLIA_RPC_URL" \ ./scripts/deployment/deploy-protocol.sh - echo "Deploying Broadcaster and Receiver contracts on Optimism Sepolia..." +CHAIN_TYPE="optimism" \ RPC_URL="$OPTIMISM_SEPOLIA_RPC_URL" \ ./scripts/deployment/deploy-protocol.sh +echo "Deploying Broadcaster and Receiver contracts on ZkSync Sepolia..." +CHAIN_TYPE="zksync" \ +RPC_URL="$ZKSYNC_SEPOLIA_RPC_URL" \ +./scripts/deployment/deploy-protocol.sh + # ======================================================================================== # Deploy ParentToChildProver contracts From 47bbd111ff408d496aedb93fe72945dee2127a0d Mon Sep 17 00:00:00 2001 From: Luiz Date: Tue, 27 Jan 2026 12:42:54 -0300 Subject: [PATCH 03/19] update naming --- .../deployment/provers/DeployArbitrumParentToChild.s.sol | 6 +++--- scripts/deployment/provers/DeployLineaParentToChild.s.sol | 6 +++--- .../deployment/provers/DeployOptimismParentToChild.s.sol | 6 +++--- scripts/deployment/provers/DeployScrollParentToChild.s.sol | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/scripts/deployment/provers/DeployArbitrumParentToChild.s.sol b/scripts/deployment/provers/DeployArbitrumParentToChild.s.sol index a9004d1..20ec599 100644 --- a/scripts/deployment/provers/DeployArbitrumParentToChild.s.sol +++ b/scripts/deployment/provers/DeployArbitrumParentToChild.s.sol @@ -6,7 +6,7 @@ import { DeployBase } from "../DeployBase.s.sol"; import { console } from "forge-std/console.sol"; import { ParentToChildProver } from "src/contracts/provers/arbitrum/ParentToChildProver.sol"; -import { BlockHashProverPointer } from "src/contracts/BlockHashProverPointer.sol"; +import { StateProverPointer } from "src/contracts/StateProverPointer.sol"; contract DeployArbitrumParentToChild is DeployBase { @@ -32,10 +32,10 @@ contract DeployArbitrumParentToChild is DeployBase { // Only deploy the pointer on the "canonical" chain, i.e., the chain where the pointer will be called from the receiver directly. // The other prover deployments are copies. if(block.chainid == homeChainId){ - pointer = address(new BlockHashProverPointer(owner)); + pointer = address(new StateProverPointer(owner)); // This will only work if `msg.sender` is the owner of the pointer. - BlockHashProverPointer(pointer).setImplementationAddress(address(prover)); + StateProverPointer(pointer).setImplementationAddress(address(prover)); } vm.stopBroadcast(); diff --git a/scripts/deployment/provers/DeployLineaParentToChild.s.sol b/scripts/deployment/provers/DeployLineaParentToChild.s.sol index b24f27f..49a4ddf 100644 --- a/scripts/deployment/provers/DeployLineaParentToChild.s.sol +++ b/scripts/deployment/provers/DeployLineaParentToChild.s.sol @@ -6,7 +6,7 @@ import { DeployBase } from "../DeployBase.s.sol"; import { console } from "forge-std/console.sol"; import { ParentToChildProver } from "src/contracts/provers/linea/ParentToChildProver.sol"; -import { BlockHashProverPointer } from "src/contracts/BlockHashProverPointer.sol"; +import { StateProverPointer } from "src/contracts/StateProverPointer.sol"; contract DeployArbitrumParentToChild is DeployBase { @@ -32,10 +32,10 @@ contract DeployArbitrumParentToChild is DeployBase { // Only deploy the pointer on the "canonical" chain, i.e., the chain where the pointer will be called from the receiver directly. // The other prover deployments are copies. if(block.chainid == homeChainId){ - pointer = address(new BlockHashProverPointer(owner)); + pointer = address(new StateProverPointer(owner)); // This will only work if `msg.sender` is the owner of the pointer. - BlockHashProverPointer(pointer).setImplementationAddress(address(prover)); + StateProverPointer(pointer).setImplementationAddress(address(prover)); } vm.stopBroadcast(); diff --git a/scripts/deployment/provers/DeployOptimismParentToChild.s.sol b/scripts/deployment/provers/DeployOptimismParentToChild.s.sol index 4331154..8f66b49 100644 --- a/scripts/deployment/provers/DeployOptimismParentToChild.s.sol +++ b/scripts/deployment/provers/DeployOptimismParentToChild.s.sol @@ -6,7 +6,7 @@ import { DeployBase } from "../DeployBase.s.sol"; import { console } from "forge-std/console.sol"; import { ParentToChildProver } from "src/contracts/provers/optimism/ParentToChildProver.sol"; -import { BlockHashProverPointer } from "src/contracts/BlockHashProverPointer.sol"; +import { StateProverPointer } from "src/contracts/StateProverPointer.sol"; contract DeployArbitrumParentToChild is DeployBase { @@ -31,10 +31,10 @@ contract DeployArbitrumParentToChild is DeployBase { // Only deploy the pointer on the "canonical" chain, i.e., the chain where the pointer will be called from the receiver directly. // The other prover deployments are copies. if(block.chainid == homeChainId){ - pointer = address(new BlockHashProverPointer(owner)); + pointer = address(new StateProverPointer(owner)); // This will only work if `msg.sender` is the owner of the pointer. - BlockHashProverPointer(pointer).setImplementationAddress(address(prover)); + StateProverPointer(pointer).setImplementationAddress(address(prover)); } vm.stopBroadcast(); diff --git a/scripts/deployment/provers/DeployScrollParentToChild.s.sol b/scripts/deployment/provers/DeployScrollParentToChild.s.sol index 173a089..f28478b 100644 --- a/scripts/deployment/provers/DeployScrollParentToChild.s.sol +++ b/scripts/deployment/provers/DeployScrollParentToChild.s.sol @@ -6,7 +6,7 @@ import { DeployBase } from "../DeployBase.s.sol"; import { console } from "forge-std/console.sol"; import { ParentToChildProver } from "src/contracts/provers/scroll/ParentToChildProver.sol"; -import { BlockHashProverPointer } from "src/contracts/BlockHashProverPointer.sol"; +import { StateProverPointer } from "src/contracts/StateProverPointer.sol"; contract DeployArbitrumParentToChild is DeployBase { @@ -29,10 +29,10 @@ contract DeployArbitrumParentToChild is DeployBase { // Only deploy the pointer on the "canonical" chain, i.e., the chain where the pointer will be called from the receiver directly. // The other prover deployments are copies. if(block.chainid == homeChainId){ - pointer = address(new BlockHashProverPointer(owner)); + pointer = address(new StateProverPointer(owner)); // This will only work if `msg.sender` is the owner of the pointer. - BlockHashProverPointer(pointer).setImplementationAddress(address(prover)); + StateProverPointer(pointer).setImplementationAddress(address(prover)); } vm.stopBroadcast(); From 30ce5a6bd3512f3fdf14ea7983793e1920e54f7f Mon Sep 17 00:00:00 2001 From: Luiz Date: Tue, 27 Jan 2026 14:34:08 -0300 Subject: [PATCH 04/19] update pragma version --- hardhat.config.ts | 2 +- scripts/deployment/DeployBase.s.sol | 2 +- scripts/deployment/DeployProtocol.s.sol | 2 +- scripts/deployment/provers/DeployArbitrumParentToChild.s.sol | 2 +- scripts/deployment/provers/DeployLineaParentToChild.s.sol | 2 +- scripts/deployment/provers/DeployOptimismParentToChild.s.sol | 2 +- scripts/deployment/provers/DeployScrollParentToChild.s.sol | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/hardhat.config.ts b/hardhat.config.ts index b02015a..6dc10ec 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -5,7 +5,7 @@ import '@nomicfoundation/hardhat-toolbox-viem' const config: HardhatUserConfig = { solidity: { - version: '0.8.28', + version: '0.8.30', settings: { evmVersion: 'cancun', optimizer: { diff --git a/scripts/deployment/DeployBase.s.sol b/scripts/deployment/DeployBase.s.sol index d0113dd..c5a0641 100644 --- a/scripts/deployment/DeployBase.s.sol +++ b/scripts/deployment/DeployBase.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.28; +pragma solidity 0.8.30; import {Script} from "forge-std/Script.sol"; import {console2} from "forge-std/console2.sol"; diff --git a/scripts/deployment/DeployProtocol.s.sol b/scripts/deployment/DeployProtocol.s.sol index 2e62bfa..a0eb427 100644 --- a/scripts/deployment/DeployProtocol.s.sol +++ b/scripts/deployment/DeployProtocol.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.28; +pragma solidity 0.8.30; import { DeployBase } from "./DeployBase.s.sol"; diff --git a/scripts/deployment/provers/DeployArbitrumParentToChild.s.sol b/scripts/deployment/provers/DeployArbitrumParentToChild.s.sol index 20ec599..4ba6fdc 100644 --- a/scripts/deployment/provers/DeployArbitrumParentToChild.s.sol +++ b/scripts/deployment/provers/DeployArbitrumParentToChild.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.28; +pragma solidity 0.8.30; import { DeployBase } from "../DeployBase.s.sol"; diff --git a/scripts/deployment/provers/DeployLineaParentToChild.s.sol b/scripts/deployment/provers/DeployLineaParentToChild.s.sol index 49a4ddf..9d7c726 100644 --- a/scripts/deployment/provers/DeployLineaParentToChild.s.sol +++ b/scripts/deployment/provers/DeployLineaParentToChild.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.28; +pragma solidity 0.8.30; import { DeployBase } from "../DeployBase.s.sol"; diff --git a/scripts/deployment/provers/DeployOptimismParentToChild.s.sol b/scripts/deployment/provers/DeployOptimismParentToChild.s.sol index 8f66b49..aa2f701 100644 --- a/scripts/deployment/provers/DeployOptimismParentToChild.s.sol +++ b/scripts/deployment/provers/DeployOptimismParentToChild.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.28; +pragma solidity 0.8.30; import { DeployBase } from "../DeployBase.s.sol"; diff --git a/scripts/deployment/provers/DeployScrollParentToChild.s.sol b/scripts/deployment/provers/DeployScrollParentToChild.s.sol index f28478b..ba3b245 100644 --- a/scripts/deployment/provers/DeployScrollParentToChild.s.sol +++ b/scripts/deployment/provers/DeployScrollParentToChild.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.28; +pragma solidity 0.8.30; import { DeployBase } from "../DeployBase.s.sol"; From fb1df279e838649b1867fbc937f8a5ca18bf3060 Mon Sep 17 00:00:00 2001 From: Luiz Date: Tue, 27 Jan 2026 14:36:40 -0300 Subject: [PATCH 05/19] update script --- scripts/deployment/DeployProtocol.s.sol | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/scripts/deployment/DeployProtocol.s.sol b/scripts/deployment/DeployProtocol.s.sol index a0eb427..4b7e044 100644 --- a/scripts/deployment/DeployProtocol.s.sol +++ b/scripts/deployment/DeployProtocol.s.sol @@ -18,13 +18,12 @@ contract Deploy is DeployBase { address broadcasterAddress; - vm.startBroadcast(); if(chainType == "zksync") { address l1Messenger = 0x0000000000000000000000000000000000008008; - broadcasterAddress = new ZkSyncBroadcaster(l1Messenger); + broadcasterAddress = address(new ZkSyncBroadcaster(l1Messenger)); } @@ -32,7 +31,7 @@ contract Deploy is DeployBase { Receiver receiver = new Receiver(); vm.stopBroadcast(); - _writeContract("broadcaster", address(broadcaster)); + _writeContract("broadcaster", broadcasterAddress); _writeContract("receiver", address(receiver)); } From 378075b905ba43926c671f298f7c7fd2e9709760 Mon Sep 17 00:00:00 2001 From: Luiz Date: Tue, 27 Jan 2026 17:24:46 -0300 Subject: [PATCH 06/19] up --- scripts/deployment/DeployBase.s.sol | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/deployment/DeployBase.s.sol b/scripts/deployment/DeployBase.s.sol index c5a0641..b5ec1ea 100644 --- a/scripts/deployment/DeployBase.s.sol +++ b/scripts/deployment/DeployBase.s.sol @@ -8,11 +8,11 @@ contract DeployBase is Script { error InvalidChainId(uint256 chainId); function _chainName(uint256 chainId) internal view returns (string memory) { - if (chainId == vm.envUint("ETHEREUM_SEPOLIA_CHAIN_ID")) return "ethereum-sepolia"; - if (chainId == vm.envUint("ARBITRUM_SEPOLIA_CHAIN_ID")) return "arbitrum-sepolia"; - if (chainId == vm.envUint("LINEA_SEPOLIA_CHAIN_ID")) return "linea-sepolia"; - if (chainId == vm.envUint("SCROLL_SEPOLIA_CHAIN_ID")) return "scroll-sepolia"; - if (chainId == vm.envUint("OPTIMISM_SEPOLIA_CHAIN_ID")) return "optimism-sepolia"; + if (chainId == 11155111) return "ethereum-sepolia"; + if (chainId == 421614) return "arbitrum-sepolia"; + if (chainId == 59141) return "linea-sepolia"; + if (chainId == 534351) return "scroll-sepolia"; + if (chainId == 11155420) return "optimism-sepolia"; revert InvalidChainId(chainId); } From 0f1fddd2af7a8d524c427ab8b020a679b5b94f3c Mon Sep 17 00:00:00 2001 From: Luiz Date: Tue, 27 Jan 2026 18:05:42 -0300 Subject: [PATCH 07/19] up --- scripts/deployment/DeployProtocol.s.sol | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/scripts/deployment/DeployProtocol.s.sol b/scripts/deployment/DeployProtocol.s.sol index 4b7e044..92f8211 100644 --- a/scripts/deployment/DeployProtocol.s.sol +++ b/scripts/deployment/DeployProtocol.s.sol @@ -3,14 +3,22 @@ pragma solidity 0.8.30; import { DeployBase } from "./DeployBase.s.sol"; - import { console } from "forge-std/console.sol"; import { Broadcaster } from "src/contracts/Broadcaster.sol"; import { ZkSyncBroadcaster } from "src/contracts/ZkSyncBroadcaster.sol"; import { Receiver } from "src/contracts/Receiver.sol"; +import {Create2} from "@openzeppelin/contracts/utils/Create2.sol"; contract Deploy is DeployBase { + + // See https://github.com/Arachnid/deterministic-deployment-proxy + // According to this research: https://ethereum-magicians.org/t/eip-7997-deterministic-factory-predeploy/24998/15 + // the Arachnid deployment proxy is the widest proxy available and its adoption suggests that a + // more effect approach to support deterministic addresses is to enshrine it as a predeployed contract + // through proposals like [RIP-7740](https://github.com/ethereum/RIPs/blob/master/RIPS/rip-7740.md). + address public constant DEPLOYMENT_PROXY = 0x4e59b44847b379578588920cA78FbF26c0B4956C; + function run() public { From ca0527099747c2c936348b48ee16e5cb56662e88 Mon Sep 17 00:00:00 2001 From: Luiz Date: Thu, 26 Feb 2026 12:32:35 -0300 Subject: [PATCH 08/19] broadcaster and receiver addresses --- deployments/arbitrum-sepolia.json | 11 ++--------- deployments/ethereum-sepolia.json | 22 ++-------------------- deployments/linea-sepolia.json | 11 ++--------- deployments/optimism-sepolia.json | 10 ++-------- deployments/scroll-sepolia.json | 12 ++---------- 5 files changed, 10 insertions(+), 56 deletions(-) diff --git a/deployments/arbitrum-sepolia.json b/deployments/arbitrum-sepolia.json index b457c25..da49a06 100644 --- a/deployments/arbitrum-sepolia.json +++ b/deployments/arbitrum-sepolia.json @@ -1,13 +1,6 @@ { "contracts": { - "broadcaster": "0x4309FcAA812F729A2c6Fc9b67094296389eC919c", - "receiver": "0xDa3b7126De1b003CF3817b00F6Bfa7C852CF4C6c" - }, - "copies": { - "ethereum-sepolia": { - "linea-sepolia": "0x98C620F2A70B85ce5E6e10744737e91D05072469", - "optimism-sepolia": "0xDb881503E4942265b9e5c39Dbb73c37F6b973a24", - "scroll-sepolia": "0x12432DeEEEBFF3aBF63549206dE28FA4Dec04638" - } + "broadcaster": "0x2e6f2Cb4bf4E4D2166F83958442a180825B94248", + "receiver": "0x712535fE2e24df51917DB5438EB3dA90437F70AF" } } \ No newline at end of file diff --git a/deployments/ethereum-sepolia.json b/deployments/ethereum-sepolia.json index e884d9c..da49a06 100644 --- a/deployments/ethereum-sepolia.json +++ b/deployments/ethereum-sepolia.json @@ -1,24 +1,6 @@ { "contracts": { - "broadcaster": "0xC5CeBD005B1F43A8995D655BC4043cc9f13e60cc", - "receiver": "0x6688Bb0e09eE79c607f14DfAAdF0Ad4E177606a0" - }, - "provers": { - "arbitrum-sepolia": { - "pointer": "0x78c6E9d58e1ED1517379FE25d1B24976E5C94225", - "prover": "0x87dbDc08F3152bE7A4B7676582BCcCAB07cfAA7A" - }, - "linea-sepolia": { - "pointer": "0x8a52bA2FCc6Fd4C81dE3719Eb6CF4AbD38885d03", - "prover": "0xe19B2b1Abe26cE00C32ECc7357DD3936E83e3e33" - }, - "optimism-sepolia": { - "pointer": "0x63019c84C180D6f1C251aAF53CA235053E4F9dc4", - "prover": "0xF5dD2286E67A92E9Ae296429a035C5d72a32f47c" - }, - "scroll-sepolia": { - "pointer": "0x40fdB1E3b853AbE267353D7026A1D8fEA617F1Aa", - "prover": "0x0c9C4fAce0878eC45C8bcCB2e680119581796D10" - } + "broadcaster": "0x2e6f2Cb4bf4E4D2166F83958442a180825B94248", + "receiver": "0x712535fE2e24df51917DB5438EB3dA90437F70AF" } } \ No newline at end of file diff --git a/deployments/linea-sepolia.json b/deployments/linea-sepolia.json index 7071827..da49a06 100644 --- a/deployments/linea-sepolia.json +++ b/deployments/linea-sepolia.json @@ -1,13 +1,6 @@ { "contracts": { - "broadcaster": "0x9EAb562d4BEfc698AE011132B4d71c29486125d0", - "receiver": "0x8E07B6d67BA876c081Ee37dff5c81D0762b04D2a" - }, - "copies": { - "ethereum-sepolia": { - "arbitrum-sepolia": "0x4309FcAA812F729A2c6Fc9b67094296389eC919c", - "optimism-sepolia": "0x98C620F2A70B85ce5E6e10744737e91D05072469", - "scroll-sepolia": "0xDa3b7126De1b003CF3817b00F6Bfa7C852CF4C6c" - } + "broadcaster": "0x2e6f2Cb4bf4E4D2166F83958442a180825B94248", + "receiver": "0x712535fE2e24df51917DB5438EB3dA90437F70AF" } } \ No newline at end of file diff --git a/deployments/optimism-sepolia.json b/deployments/optimism-sepolia.json index bcbf97a..da49a06 100644 --- a/deployments/optimism-sepolia.json +++ b/deployments/optimism-sepolia.json @@ -1,12 +1,6 @@ { - "copies": { - "ethereum-sepolia": { - "arbitrum-sepolia": "0x1846Ce62736A4f9dB0F9CEC59BCE80Da2dF7e2FB", - "linea-sepolia": "0x09BF3ABf872b6613c50b989714F68D73C3310B03" - } - }, "contracts": { - "broadcaster": "0x42a2076b90a207CD3D67140DdfBF76868bbF1dC8", - "receiver": "0x6421F5C54a3f235def5055bA377993b948B5cF72" + "broadcaster": "0x2e6f2Cb4bf4E4D2166F83958442a180825B94248", + "receiver": "0x712535fE2e24df51917DB5438EB3dA90437F70AF" } } \ No newline at end of file diff --git a/deployments/scroll-sepolia.json b/deployments/scroll-sepolia.json index b8aa684..da49a06 100644 --- a/deployments/scroll-sepolia.json +++ b/deployments/scroll-sepolia.json @@ -1,14 +1,6 @@ { - "copies": { - "ethereum-sepolia": { - "arbitrum-sepolia": "0x3F91bF074fff67f1EB12bA029982c29eBd26c08a", - "linea-sepolia": "0xDC444Ec0675b7c1a4BEa5C9A6AaB6AEeF51265FD", - "optimism-sepolia": "0x9d81549ceF77FeAE7190045E3994c24ED631A080", - "scroll-sepolia": "0xc0Ec75f14eA1a6142B5223EAd5D2AfE9AfAcB9eE" - } - }, "contracts": { - "broadcaster": "0xf0a41Df7879F0585Fad55bda91Fc7d02a4eEe186", - "receiver": "0xF6F1dE9DE71107Ff83e464AfadDccCA0Cd0a33ed" + "broadcaster": "0x2e6f2Cb4bf4E4D2166F83958442a180825B94248", + "receiver": "0x712535fE2e24df51917DB5438EB3dA90437F70AF" } } \ No newline at end of file From 4923e58e2411908c99fc868bdb28b06bb99f8b1d Mon Sep 17 00:00:00 2001 From: Luiz Date: Thu, 26 Feb 2026 16:47:30 -0300 Subject: [PATCH 09/19] contracts --- deployments/arbitrum-sepolia.json | 7 +++++++ deployments/ethereum-sepolia.json | 24 ++++++++++++++++++++++++ deployments/linea-sepolia.json | 7 +++++++ deployments/optimism-sepolia.json | 7 +++++++ deployments/scroll-sepolia.json | 7 +++++++ deployments/zksync-sepolia.json | 14 ++++++++++++++ 6 files changed, 66 insertions(+) create mode 100644 deployments/zksync-sepolia.json diff --git a/deployments/arbitrum-sepolia.json b/deployments/arbitrum-sepolia.json index da49a06..af2f491 100644 --- a/deployments/arbitrum-sepolia.json +++ b/deployments/arbitrum-sepolia.json @@ -2,5 +2,12 @@ "contracts": { "broadcaster": "0x2e6f2Cb4bf4E4D2166F83958442a180825B94248", "receiver": "0x712535fE2e24df51917DB5438EB3dA90437F70AF" + }, + "copies": { + "ethereum-sepolia": { + "linea-sepolia": "0x0F6977Ae14E8855cE209c73331A009Ba0cF98D1f", + "scroll-sepolia": "0x6A039cC5cd26F2303f599DEb3155605E63a72a05", + "optimism-sepolia": "0x3176E35e6FBaB9775D3A56364BECf17228B9c1f2" + } } } \ No newline at end of file diff --git a/deployments/ethereum-sepolia.json b/deployments/ethereum-sepolia.json index da49a06..4696d60 100644 --- a/deployments/ethereum-sepolia.json +++ b/deployments/ethereum-sepolia.json @@ -2,5 +2,29 @@ "contracts": { "broadcaster": "0x2e6f2Cb4bf4E4D2166F83958442a180825B94248", "receiver": "0x712535fE2e24df51917DB5438EB3dA90437F70AF" + }, + "provers": { + "arbitrum-sepolia": { + "prover": "0xA7CC6C0A839f3ceF7471D666598068E988AC1D7e", + "pointer": "0x038F368256136B6fd03E3ec9d8cEE62ccdd4234f" + }, + "linea-sepolia": { + "prover": "0x0F6977Ae14E8855cE209c73331A009Ba0cF98D1f", + "pointer": "0x8749C82757f24042ac3ee40F0917Bf0B6679CBC5" + }, + "scroll-sepolia": { + "prover": "0x6A039cC5cd26F2303f599DEb3155605E63a72a05", + "pointer": "0xe530187F767c1A15D89126aF3c0782f3aE81af3f" + }, + "optimism-sepolia": { + "prover": "0x3176E35e6FBaB9775D3A56364BECf17228B9c1f2", + "pointer": "0x885b1a670443004cb36E9F2d85b15d0fc78Db930" + } + }, + "pushers": { + "linea-sepolia": "0x2aC21Fcfd6905eF13FA9bc0F874f3524029cB443", + "scroll-sepolia": "0xF99b4E792aCaBa74cb2d1A5D3fDBDFfe630C0a8e", + "zksync-sepolia": "0xc69281Edb758A5dDD7A13e12b4F3d81b14Bd983B", + "optimism-sepolia": "0x2c4ded0d5883646AEAD86a6C748c871afa819125" } } \ No newline at end of file diff --git a/deployments/linea-sepolia.json b/deployments/linea-sepolia.json index da49a06..9c4ec22 100644 --- a/deployments/linea-sepolia.json +++ b/deployments/linea-sepolia.json @@ -2,5 +2,12 @@ "contracts": { "broadcaster": "0x2e6f2Cb4bf4E4D2166F83958442a180825B94248", "receiver": "0x712535fE2e24df51917DB5438EB3dA90437F70AF" + }, + "copies": { + "ethereum-sepolia": { + "arbitrum-sepolia": "0xA7CC6C0A839f3ceF7471D666598068E988AC1D7e", + "scroll-sepolia": "0x6A039cC5cd26F2303f599DEb3155605E63a72a05", + "optimism-sepolia": "0x3176E35e6FBaB9775D3A56364BECf17228B9c1f2" + } } } \ No newline at end of file diff --git a/deployments/optimism-sepolia.json b/deployments/optimism-sepolia.json index da49a06..29dab42 100644 --- a/deployments/optimism-sepolia.json +++ b/deployments/optimism-sepolia.json @@ -2,5 +2,12 @@ "contracts": { "broadcaster": "0x2e6f2Cb4bf4E4D2166F83958442a180825B94248", "receiver": "0x712535fE2e24df51917DB5438EB3dA90437F70AF" + }, + "copies": { + "ethereum-sepolia": { + "arbitrum-sepolia": "0xA7CC6C0A839f3ceF7471D666598068E988AC1D7e", + "linea-sepolia": "0x0F6977Ae14E8855cE209c73331A009Ba0cF98D1f", + "scroll-sepolia": "0x6A039cC5cd26F2303f599DEb3155605E63a72a05" + } } } \ No newline at end of file diff --git a/deployments/scroll-sepolia.json b/deployments/scroll-sepolia.json index da49a06..1bea15e 100644 --- a/deployments/scroll-sepolia.json +++ b/deployments/scroll-sepolia.json @@ -2,5 +2,12 @@ "contracts": { "broadcaster": "0x2e6f2Cb4bf4E4D2166F83958442a180825B94248", "receiver": "0x712535fE2e24df51917DB5438EB3dA90437F70AF" + }, + "copies": { + "ethereum-sepolia": { + "arbitrum-sepolia": "0xA7CC6C0A839f3ceF7471D666598068E988AC1D7e", + "linea-sepolia": "0x0F6977Ae14E8855cE209c73331A009Ba0cF98D1f", + "optimism-sepolia": "0x3176E35e6FBaB9775D3A56364BECf17228B9c1f2" + } } } \ No newline at end of file diff --git a/deployments/zksync-sepolia.json b/deployments/zksync-sepolia.json new file mode 100644 index 0000000..d737f44 --- /dev/null +++ b/deployments/zksync-sepolia.json @@ -0,0 +1,14 @@ +{ + "contracts": { + "broadcaster": "0x5483634580acDB4f0134E09025732DF9784e46e3", + "receiver": "0x712535fE2e24df51917DB5438EB3dA90437F70AF" + }, + "copies": { + "ethereum-sepolia": { + "arbitrum-sepolia": "0xA7CC6C0A839f3ceF7471D666598068E988AC1D7e", + "linea-sepolia": "0x0F6977Ae14E8855cE209c73331A009Ba0cF98D1f", + "scroll-sepolia": "0x6A039cC5cd26F2303f599DEb3155605E63a72a05", + "optimism-sepolia": "0x3176E35e6FBaB9775D3A56364BECf17228B9c1f2" + } + } +} \ No newline at end of file From 01a695feb9648a0350d5aa4e7d53e0db5d13f7e9 Mon Sep 17 00:00:00 2001 From: Luiz Date: Mon, 2 Mar 2026 12:19:36 -0300 Subject: [PATCH 10/19] update contracts --- deployments/arbitrum-sepolia.json | 6 ++++++ deployments/linea-sepolia.json | 9 ++++++++- deployments/optimism-sepolia.json | 9 ++++++++- deployments/scroll-sepolia.json | 9 ++++++++- deployments/zksync-sepolia.json | 3 ++- 5 files changed, 32 insertions(+), 4 deletions(-) diff --git a/deployments/arbitrum-sepolia.json b/deployments/arbitrum-sepolia.json index af2f491..c9bcd86 100644 --- a/deployments/arbitrum-sepolia.json +++ b/deployments/arbitrum-sepolia.json @@ -9,5 +9,11 @@ "scroll-sepolia": "0x6A039cC5cd26F2303f599DEb3155605E63a72a05", "optimism-sepolia": "0x3176E35e6FBaB9775D3A56364BECf17228B9c1f2" } + }, + "provers": { + "ethereum-sepolia": { + "pointer": "0xb01db227b4BAb7a0A053A6a7ff610d8D201E4760", + "prover": "0x2a3b34adB9b856679518687399930FA5481F577F" + } } } \ No newline at end of file diff --git a/deployments/linea-sepolia.json b/deployments/linea-sepolia.json index 9c4ec22..2606f78 100644 --- a/deployments/linea-sepolia.json +++ b/deployments/linea-sepolia.json @@ -1,7 +1,8 @@ { "contracts": { "broadcaster": "0x2e6f2Cb4bf4E4D2166F83958442a180825B94248", - "receiver": "0x712535fE2e24df51917DB5438EB3dA90437F70AF" + "receiver": "0x712535fE2e24df51917DB5438EB3dA90437F70AF", + "buffer": "0xCd455Df9F48Af8C86427fE3F86787D95330F65AA" }, "copies": { "ethereum-sepolia": { @@ -9,5 +10,11 @@ "scroll-sepolia": "0x6A039cC5cd26F2303f599DEb3155605E63a72a05", "optimism-sepolia": "0x3176E35e6FBaB9775D3A56364BECf17228B9c1f2" } + }, + "provers": { + "ethereum-sepolia": { + "pointer": "0xb01db227b4BAb7a0A053A6a7ff610d8D201E4760", + "prover": "0xFeA9cAb4910942249Dac3742d8825036De7cCD7B" + } } } \ No newline at end of file diff --git a/deployments/optimism-sepolia.json b/deployments/optimism-sepolia.json index 29dab42..725a94e 100644 --- a/deployments/optimism-sepolia.json +++ b/deployments/optimism-sepolia.json @@ -1,7 +1,8 @@ { "contracts": { "broadcaster": "0x2e6f2Cb4bf4E4D2166F83958442a180825B94248", - "receiver": "0x712535fE2e24df51917DB5438EB3dA90437F70AF" + "receiver": "0x712535fE2e24df51917DB5438EB3dA90437F70AF", + "buffer": "0xaC0a6EB6407b9C13c3B374219B2f91fda4DF47C5" }, "copies": { "ethereum-sepolia": { @@ -9,5 +10,11 @@ "linea-sepolia": "0x0F6977Ae14E8855cE209c73331A009Ba0cF98D1f", "scroll-sepolia": "0x6A039cC5cd26F2303f599DEb3155605E63a72a05" } + }, + "provers": { + "ethereum-sepolia": { + "pointer": "0xb01db227b4BAb7a0A053A6a7ff610d8D201E4760", + "prover": "0xfB896638254EeB15ac5530c63c98d9575c4194E2" + } } } \ No newline at end of file diff --git a/deployments/scroll-sepolia.json b/deployments/scroll-sepolia.json index 1bea15e..dd9da25 100644 --- a/deployments/scroll-sepolia.json +++ b/deployments/scroll-sepolia.json @@ -1,7 +1,8 @@ { "contracts": { "broadcaster": "0x2e6f2Cb4bf4E4D2166F83958442a180825B94248", - "receiver": "0x712535fE2e24df51917DB5438EB3dA90437F70AF" + "receiver": "0x712535fE2e24df51917DB5438EB3dA90437F70AF", + "buffer": "0x12e91f63cC0F43434141396AC0E9f5b1A0e103D6" }, "copies": { "ethereum-sepolia": { @@ -9,5 +10,11 @@ "linea-sepolia": "0x0F6977Ae14E8855cE209c73331A009Ba0cF98D1f", "optimism-sepolia": "0x3176E35e6FBaB9775D3A56364BECf17228B9c1f2" } + }, + "provers": { + "ethereum-sepolia": { + "pointer": "0xb01db227b4BAb7a0A053A6a7ff610d8D201E4760", + "prover": "0x9CE8264cEbA3c9D5C527d20A002c019Fa14e4CC4" + } } } \ No newline at end of file diff --git a/deployments/zksync-sepolia.json b/deployments/zksync-sepolia.json index d737f44..94ac55d 100644 --- a/deployments/zksync-sepolia.json +++ b/deployments/zksync-sepolia.json @@ -1,7 +1,8 @@ { "contracts": { "broadcaster": "0x5483634580acDB4f0134E09025732DF9784e46e3", - "receiver": "0x712535fE2e24df51917DB5438EB3dA90437F70AF" + "receiver": "0x712535fE2e24df51917DB5438EB3dA90437F70AF", + "buffer": "0x4309FcAA812F729A2c6Fc9b67094296389eC919c" }, "copies": { "ethereum-sepolia": { From 1f738138b91a58c909b4f9d9b9b3a314f6c4c8d5 Mon Sep 17 00:00:00 2001 From: Luiz Date: Mon, 2 Mar 2026 12:23:21 -0300 Subject: [PATCH 11/19] forge fmt --- foundry.toml | 3 +- scripts/deployment/DeployBase.s.sol | 109 ++++++++++++++++-- scripts/deployment/DeployProtocol.s.sol | 58 +++++----- .../block-hash-pusher/DeployBuffers.s.sol | 55 +++++++++ .../block-hash-pusher/DeployPushers.s.sol | 38 ++++++ .../block-hash-pusher/deploy-buffers.sh | 11 ++ .../block-hash-pusher/deploy-pushers.sh | 11 ++ scripts/deployment/deploy.sh | 66 +++++++++++ .../provers/DeployArbitrumChildToParent.s.sol | 65 +++++++++++ .../provers/DeployArbitrumParentToChild.s.sol | 63 ++++++---- .../provers/DeployLineaChildToParent.s.sol | 64 ++++++++++ .../provers/DeployLineaParentToChild.s.sol | 66 ++++++----- .../provers/DeployOptimismChildToParent.s.sol | 64 ++++++++++ .../provers/DeployOptimismParentToChild.s.sol | 63 ++++++---- .../provers/DeployScrollChildToParent.s.sol | 64 ++++++++++ .../provers/DeployScrollParentToChild.s.sol | 63 ++++++---- .../provers/deploy-child-provers.sh | 29 +++++ .../provers/deploy-parent-provers.sh | 1 + scripts/taiko/broadcast-l1.s.sol | 8 +- scripts/taiko/broadcast-l2.s.sol | 8 +- scripts/taiko/deploy-all.s.sol | 16 +-- scripts/taiko/provers-l2.s.sol | 23 ++-- scripts/taiko/provers.s.sol | 25 ++-- scripts/taiko/verify-message.s.sol | 31 ++--- scripts/taiko/verify-on-chain.s.sol | 28 ++--- 25 files changed, 813 insertions(+), 219 deletions(-) create mode 100644 scripts/deployment/block-hash-pusher/DeployBuffers.s.sol create mode 100644 scripts/deployment/block-hash-pusher/DeployPushers.s.sol create mode 100755 scripts/deployment/block-hash-pusher/deploy-buffers.sh create mode 100755 scripts/deployment/block-hash-pusher/deploy-pushers.sh create mode 100644 scripts/deployment/provers/DeployArbitrumChildToParent.s.sol create mode 100644 scripts/deployment/provers/DeployLineaChildToParent.s.sol create mode 100644 scripts/deployment/provers/DeployOptimismChildToParent.s.sol create mode 100644 scripts/deployment/provers/DeployScrollChildToParent.s.sol create mode 100755 scripts/deployment/provers/deploy-child-provers.sh diff --git a/foundry.toml b/foundry.toml index 56fefc7..f341665 100644 --- a/foundry.toml +++ b/foundry.toml @@ -3,6 +3,7 @@ src = "src/contracts" out = "out" libs = ["lib"] solc = "0.8.30" +script = "scripts" via_ir = true @@ -19,4 +20,4 @@ fs_permissions = [ { access = 'read', path = './out' }, ] -# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options +# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options \ No newline at end of file diff --git a/scripts/deployment/DeployBase.s.sol b/scripts/deployment/DeployBase.s.sol index b5ec1ea..9e1bc74 100644 --- a/scripts/deployment/DeployBase.s.sol +++ b/scripts/deployment/DeployBase.s.sol @@ -3,9 +3,21 @@ pragma solidity 0.8.30; import {Script} from "forge-std/Script.sol"; import {console2} from "forge-std/console2.sol"; +import {LowLevelCall} from "@openzeppelin/contracts/utils/LowLevelCall.sol"; +import {Create2} from "@openzeppelin/contracts/utils/Create2.sol"; contract DeployBase is Script { error InvalidChainId(uint256 chainId); + error DeploymentFailed(); + error InvalidPusherAddress(); + error InvalidBufferAddress(); + + // See https://github.com/Arachnid/deterministic-deployment-proxy + // According to this research: https://ethereum-magicians.org/t/eip-7997-deterministic-factory-predeploy/24998/15 + // the Arachnid deployment proxy is the widest proxy available and its adoption suggests that a + // more effect approach to support deterministic addresses is to enshrine it as a predeployed contract + // through proposals like [RIP-7740](https://github.com/ethereum/RIPs/blob/master/RIPS/rip-7740.md). + address public constant DEPLOYMENT_PROXY = 0x4e59b44847b379578588920cA78FbF26c0B4956C; function _chainName(uint256 chainId) internal view returns (string memory) { if (chainId == 11155111) return "ethereum-sepolia"; @@ -13,6 +25,7 @@ contract DeployBase is Script { if (chainId == 59141) return "linea-sepolia"; if (chainId == 534351) return "scroll-sepolia"; if (chainId == 11155420) return "optimism-sepolia"; + if (chainId == 300) return "zksync-sepolia"; revert InvalidChainId(chainId); } @@ -46,9 +59,12 @@ contract DeployBase is Script { /// Ensures that `jsonPath` exists and is an object. If missing, creates `{}` there. function _ensureObjectAt(string memory path, string memory jsonPath) internal { string memory content = vm.readFile(path); - try vm.parseJson(content, jsonPath) returns (bytes memory) { - // exists (and is parseable), do nothing - } catch { + try vm.parseJson(content, jsonPath) returns ( + bytes memory + ) { + // exists (and is parseable), do nothing + } + catch { vm.writeJson("{}", path, jsonPath); } } @@ -56,9 +72,12 @@ contract DeployBase is Script { function _ensureObjectAtPtr(string memory path, string memory ptr) internal { // Ensure an object exists at JSON Pointer `ptr` (e.g. "/provers/arbitrum-sepolia") string memory content = vm.readFile(path); - try vm.parseJson(content, ptr) returns (bytes memory) { - // exists - } catch { + try vm.parseJson(content, ptr) returns ( + bytes memory + ) { + // exists + } + catch { vm.writeJson("{}", path, ptr); } } @@ -70,19 +89,68 @@ contract DeployBase is Script { _ensureObjectAt(path, ".copies"); } + function _getPusherAddress(string memory parentChain, string memory childChain) internal returns (address) { + string memory path = string.concat(_deploymentsDir(), "/", parentChain, ".json"); + string memory json = vm.readFile(path); + if (!vm.keyExistsJson(json, string.concat(".pushers.", childChain))) { + revert InvalidPusherAddress(); + } + return vm.parseJsonAddress(json, string.concat(".pushers.", childChain)); + } + + function _getBufferAddress(string memory childChain) internal returns (address) { + string memory path = string.concat(_deploymentsDir(), "/", childChain, ".json"); + string memory json = vm.readFile(path); + if (!vm.keyExistsJson(json, string.concat(".contracts.", "buffer"))) { + revert InvalidBufferAddress(); + } + return vm.parseJsonAddress(json, string.concat(".contracts.", "buffer")); + } + // ------------------------- // Writes // ------------------------- + function _isContractDeployed(string memory name) internal returns (bool) { + string memory path = _path(); + _ensureRootScaffold(path); + string memory json = vm.readFile(path); + return vm.keyExistsJson(json, string.concat(".contracts.", name)); + } + + function _isProverDeployed(string memory chainKey) internal returns (bool) { + string memory path = _path(); + _ensureRootScaffold(path); + string memory json = vm.readFile(path); + return vm.keyExistsJson(json, string.concat(".provers.", chainKey)); + } + + function _isCopyDeployed(string memory homeChain, string memory targetChain) internal returns (bool) { + string memory path = _path(); + _ensureRootScaffold(path); + string memory json = vm.readFile(path); + return vm.keyExistsJson(json, string.concat(".copies.", homeChain, ".", targetChain)); + } + + function _isPusherDeployed(string memory chainKey) internal returns (bool) { + string memory path = _path(); + _ensureRootScaffold(path); + string memory json = vm.readFile(path); + return vm.keyExistsJson(json, string.concat(".pushers.", chainKey)); + } + + function _isBufferDeployed(string memory chainKey) internal returns (bool) { + string memory path = _path(); + _ensureRootScaffold(path); + string memory json = vm.readFile(path); + return vm.keyExistsJson(json, string.concat(".buffers.", chainKey)); + } + function _writeContract(string memory name, address addr) internal { string memory path = _path(); _ensureRootScaffold(path); - vm.writeJson( - _jsonString(vm.toString(addr)), - path, - string.concat(".contracts.", name) - ); + vm.writeJson(_jsonString(vm.toString(addr)), path, string.concat(".contracts.", name)); } /// Adds/updates `.provers["chainKey"].pointer` and `.provers["chainKey"].prover` @@ -96,10 +164,21 @@ contract DeployBase is Script { // Write the pointer and prover addresses vm.writeJson(_jsonString(vm.toString(pointer)), path, string.concat(objPath, ".pointer")); - vm.writeJson(_jsonString(vm.toString(prover)), path, string.concat(objPath, ".prover")); + vm.writeJson(_jsonString(vm.toString(prover)), path, string.concat(objPath, ".prover")); } + /// Adds/updates `.pushers["chainKey"]` + function _writePusher(string memory chainKey, address pusher) internal { + string memory path = _path(); + _ensureRootScaffold(path); + // Ensure `.pushers.` exists as an object + string memory objPath = string.concat(".pushers.", chainKey); + _ensureObjectAt(path, objPath); + + // Write the pusher address + vm.writeJson(_jsonString(vm.toString(pusher)), path, objPath); + } /// Adds/updates `.copies["src"]["dst"] = "0x..."` function _writeCopy(string memory homeChain, string memory targetChain, address copyAddr) internal { @@ -115,5 +194,11 @@ contract DeployBase is Script { vm.writeJson(_jsonString(vm.toString(copyAddr)), path, leafPath); } + function _deploy(bytes memory creationCode, bytes32 salt) internal returns (address) { + address predictedAddress = Create2.computeAddress(salt, keccak256(creationCode), DEPLOYMENT_PROXY); + bool success = LowLevelCall.callNoReturn(DEPLOYMENT_PROXY, abi.encodePacked(salt, creationCode)); + + return predictedAddress; + } } diff --git a/scripts/deployment/DeployProtocol.s.sol b/scripts/deployment/DeployProtocol.s.sol index 92f8211..c6f47e9 100644 --- a/scripts/deployment/DeployProtocol.s.sol +++ b/scripts/deployment/DeployProtocol.s.sol @@ -1,46 +1,50 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.30; -import { DeployBase } from "./DeployBase.s.sol"; +import {DeployBase} from "./DeployBase.s.sol"; -import { console } from "forge-std/console.sol"; -import { Broadcaster } from "src/contracts/Broadcaster.sol"; -import { ZkSyncBroadcaster } from "src/contracts/ZkSyncBroadcaster.sol"; -import { Receiver } from "src/contracts/Receiver.sol"; +import {console} from "forge-std/console.sol"; +import {Broadcaster} from "src/contracts/Broadcaster.sol"; +import {ZkSyncBroadcaster} from "src/contracts/ZkSyncBroadcaster.sol"; +import {Receiver} from "src/contracts/Receiver.sol"; import {Create2} from "@openzeppelin/contracts/utils/Create2.sol"; - contract Deploy is DeployBase { - - // See https://github.com/Arachnid/deterministic-deployment-proxy - // According to this research: https://ethereum-magicians.org/t/eip-7997-deterministic-factory-predeploy/24998/15 - // the Arachnid deployment proxy is the widest proxy available and its adoption suggests that a - // more effect approach to support deterministic addresses is to enshrine it as a predeployed contract - // through proposals like [RIP-7740](https://github.com/ethereum/RIPs/blob/master/RIPS/rip-7740.md). - address public constant DEPLOYMENT_PROXY = 0x4e59b44847b379578588920cA78FbF26c0B4956C; - function run() public { - - string memory chainType = vm.envString("CHAIN_TYPE"); address broadcasterAddress; vm.startBroadcast(); - if(chainType == "zksync") { - address l1Messenger = 0x0000000000000000000000000000000000008008; - - broadcasterAddress = address(new ZkSyncBroadcaster(l1Messenger)); + if (!_isContractDeployed("broadcaster")) { + if (keccak256(bytes(chainType)) == keccak256(bytes("zksync"))) { + address l1Messenger = 0x0000000000000000000000000000000000008008; + bytes memory creationCode = + abi.encodePacked(type(ZkSyncBroadcaster).creationCode, abi.encode(l1Messenger)); + broadcasterAddress = _deploy(creationCode, bytes32(0)); + } else { + bytes memory creationCode = type(Broadcaster).creationCode; + broadcasterAddress = _deploy(creationCode, bytes32(0)); + } + + if (broadcasterAddress == address(0)) { + console.log("Failed to deploy broadcaster on chain ", _chainName(block.chainid)); + } else { + _writeContract("broadcaster", broadcasterAddress); + } + } + if (!_isContractDeployed("receiver")) { + bytes memory creationCode = type(Receiver).creationCode; + address receiverAddress = _deploy(creationCode, bytes32(0)); + if (receiverAddress == address(0)) { + console.log("Failed to deploy receiver on chain ", _chainName(block.chainid)); + } else { + _writeContract("receiver", receiverAddress); + } } - broadcasterAddress = address(new Broadcaster()); - Receiver receiver = new Receiver(); vm.stopBroadcast(); - - _writeContract("broadcaster", broadcasterAddress); - _writeContract("receiver", address(receiver)); - } -} \ No newline at end of file +} diff --git a/scripts/deployment/block-hash-pusher/DeployBuffers.s.sol b/scripts/deployment/block-hash-pusher/DeployBuffers.s.sol new file mode 100644 index 0000000..2301e23 --- /dev/null +++ b/scripts/deployment/block-hash-pusher/DeployBuffers.s.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.30; + +import {Script} from "forge-std/Script.sol"; +import {console} from "forge-std/console.sol"; +import {LineaBuffer} from "src/contracts/block-hash-pusher/linea/LineaBuffer.sol"; +import {ScrollBuffer} from "src/contracts/block-hash-pusher/scroll/ScrollBuffer.sol"; +import {ZkSyncBuffer} from "src/contracts/block-hash-pusher/zksync/ZkSyncBuffer.sol"; +import {OptimismBuffer} from "src/contracts/block-hash-pusher/optimism/OptimismBuffer.sol"; +import {DeployBase} from "../DeployBase.s.sol"; + +contract DeployBuffers is DeployBase { + function run() public { + string memory chainType = vm.envString("CHAIN_TYPE"); + string memory parentChain = vm.envString("PARENT_CHAIN"); + string memory childChain = vm.envString("CHILD_CHAIN"); + + address pusherAddress = _getPusherAddress(parentChain, childChain); + if (pusherAddress == address(0)) { + revert InvalidPusherAddress(); + } + + address messenger; + address buffer; + + vm.startBroadcast(); + if (_isContractDeployed("buffer")) { + console.log("Buffer already deployed on chain ", _chainName(block.chainid)); + return; + } + + if (keccak256(bytes(chainType)) == keccak256(bytes("zksync"))) { + buffer = address(new ZkSyncBuffer(pusherAddress)); + } else { + messenger = vm.envAddress("MESSENGER"); + + if (keccak256(bytes(chainType)) == keccak256(bytes("linea"))) { + buffer = address(new LineaBuffer(messenger, pusherAddress)); + } else if (keccak256(bytes(chainType)) == keccak256(bytes("scroll"))) { + buffer = address(new ScrollBuffer(messenger, pusherAddress)); + } else if (keccak256(bytes(chainType)) == keccak256(bytes("optimism"))) { + buffer = address(new OptimismBuffer(messenger, pusherAddress)); + } else { + revert("Invalid chain type"); + } + } + vm.stopBroadcast(); + + if (buffer != address(0)) { + _writeContract("buffer", buffer); + } else { + console.log("Failed to deploy buffer on chain ", _chainName(block.chainid)); + } + } +} diff --git a/scripts/deployment/block-hash-pusher/DeployPushers.s.sol b/scripts/deployment/block-hash-pusher/DeployPushers.s.sol new file mode 100644 index 0000000..8aa88a9 --- /dev/null +++ b/scripts/deployment/block-hash-pusher/DeployPushers.s.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.30; + +import {Script} from "forge-std/Script.sol"; +import {console} from "forge-std/console.sol"; +import {LineaPusher} from "src/contracts/block-hash-pusher/linea/LineaPusher.sol"; +import {ScrollPusher} from "src/contracts/block-hash-pusher/scroll/ScrollPusher.sol"; +import {ZkSyncPusher} from "src/contracts/block-hash-pusher/zksync/ZkSyncPusher.sol"; +import {OptimismPusher} from "src/contracts/block-hash-pusher/optimism/OptimismPusher.sol"; +import {DeployBase} from "../DeployBase.s.sol"; + +contract DeployPushers is DeployBase { + function run() public { + address lineaRollup = vm.envAddress("LINEA_ROLLUP"); + address l1ScrollMessenger = vm.envAddress("L1_SCROLL_MESSENGER"); + address zkSyncDiamond = vm.envAddress("ZKSYNC_DIAMOND"); + address opL1CrossDomainMessengerProxy = vm.envAddress("OP_L1_CROSS_DOMAIN_MESSENGER_PROXY"); + + vm.startBroadcast(); + if (!_isPusherDeployed("linea-sepolia")) { + LineaPusher lineaPusher = new LineaPusher(lineaRollup); + _writePusher("linea-sepolia", address(lineaPusher)); + } + if (!_isPusherDeployed("scroll-sepolia")) { + ScrollPusher scrollPusher = new ScrollPusher(l1ScrollMessenger); + _writePusher("scroll-sepolia", address(scrollPusher)); + } + if (!_isPusherDeployed("zksync-sepolia")) { + ZkSyncPusher zksyncPusher = new ZkSyncPusher(zkSyncDiamond); + _writePusher("zksync-sepolia", address(zksyncPusher)); + } + if (!_isPusherDeployed("optimism-sepolia")) { + OptimismPusher optimismPusher = new OptimismPusher(opL1CrossDomainMessengerProxy); + _writePusher("optimism-sepolia", address(optimismPusher)); + } + vm.stopBroadcast(); + } +} diff --git a/scripts/deployment/block-hash-pusher/deploy-buffers.sh b/scripts/deployment/block-hash-pusher/deploy-buffers.sh new file mode 100755 index 0000000..4a98855 --- /dev/null +++ b/scripts/deployment/block-hash-pusher/deploy-buffers.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +CHAIN_TYPE=$CHAIN_TYPE \ +PUSHER_CHAIN=$PUSHER_CHAIN \ +BUFFER_CHAIN=$BUFFER_CHAIN \ +MESSENGER=$MESSENGER \ +forge script scripts/deployment/block-hash-pusher/DeployBuffers.s.sol \ + --rpc-url "$RPC_URL" \ + --private-key "$DEPLOYER_PRIVATE_KEY" \ + --broadcast + \ No newline at end of file diff --git a/scripts/deployment/block-hash-pusher/deploy-pushers.sh b/scripts/deployment/block-hash-pusher/deploy-pushers.sh new file mode 100755 index 0000000..016a156 --- /dev/null +++ b/scripts/deployment/block-hash-pusher/deploy-pushers.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +LINEA_ROLLUP=$LINEA_ROLLUP \ +L1_SCROLL_MESSENGER=$L1_SCROLL_MESSENGER \ +ZKSYNC_DIAMOND=$ZKSYNC_DIAMOND \ +OP_L1_CROSS_DOMAIN_MESSENGER_PROXY=$OP_L1_CROSS_DOMAIN_MESSENGER_PROXY \ +forge script scripts/deployment/block-hash-pusher/DeployPushers.s.sol \ + --rpc-url "$RPC_URL" \ + --private-key "$DEPLOYER_PRIVATE_KEY" \ + --broadcast + \ No newline at end of file diff --git a/scripts/deployment/deploy.sh b/scripts/deployment/deploy.sh index 2e8c4f3..1e68010 100644 --- a/scripts/deployment/deploy.sh +++ b/scripts/deployment/deploy.sh @@ -65,3 +65,69 @@ RPC_URL="$SCROLL_SEPOLIA_RPC_URL" ./scripts/deployment/provers/deploy-parent-pro # Optimism Sepolia echo "Deploying ParentToChildProver contracts on Optimism Sepolia..." RPC_URL="$OPTIMISM_SEPOLIA_RPC_URL" ./scripts/deployment/provers/deploy-parent-provers.sh + +# ZkSync Sepolia +echo "Deploying ParentToChildProver contracts on ZkSync Sepolia..." +RPC_URL="$ZKSYNC_SEPOLIA_RPC_URL" ./scripts/deployment/provers/deploy-parent-provers.sh + + +# ======================================================================================== +# Deploy Pushers contracts +# ======================================================================================== +chmod +x scripts/deployment/block-hash-pusher/deploy-pushers.sh + +# Ethereum Sepolia +echo "Deploying Pushers contracts on Ethereum Sepolia..." +LINEA_ROLLUP="$LINEA_SEPOLIA_ROLLUP" \ +L1_SCROLL_MESSENGER="$SCROLL_SEPOLIA_L1_SCROLL_MESSENGER" \ +ZKSYNC_DIAMOND="$ZKSYNC_SEPOLIA_DIAMOND" \ +OP_L1_CROSS_DOMAIN_MESSENGER_PROXY="$OPTIMISM_SEPOLIA_L1_CROSS_DOMAIN_MESSENGER_PROXY" \ +RPC_URL="$ETHEREUM_SEPOLIA_RPC_URL" ./scripts/deployment/block-hash-pusher/deploy-pushers.sh + +# ======================================================================================== +# Deploy Buffers contracts +# ======================================================================================== +chmod +x scripts/deployment/block-hash-pusher/deploy-buffers.sh + +# Ethereum Sepolia + +# Linea Sepolia +echo "Deploying Buffer contract for Linea Sepolia..." +CHAIN_TYPE="linea" \ +PARENT_CHAIN="ethereum-sepolia" \ +CHILD_CHAIN="linea-sepolia" \ +MESSENGER="$LINEA_SEPOLIA_L2_MESSAGE_SERVICE" \ +RPC_URL="$LINEA_SEPOLIA_RPC_URL" ./scripts/deployment/block-hash-pusher/deploy-buffers.sh + +# Scroll Sepolia +echo "Deploying Buffer contract for Scroll Sepolia..." +CHAIN_TYPE="scroll" \ +PARENT_CHAIN="ethereum-sepolia" \ +CHILD_CHAIN="scroll-sepolia" \ +MESSENGER="$SCROLL_SEPOLIA_L2_SCROLL_MESSENGER" \ +RPC_URL="$SCROLL_SEPOLIA_RPC_URL" ./scripts/deployment/block-hash-pusher/deploy-buffers.sh + +# ZkSync Sepolia +echo "Deploying Buffer contract for ZkSync Sepolia..." +CHAIN_TYPE="zksync" \ +PARENT_CHAIN="ethereum-sepolia" \ +CHILD_CHAIN="zksync-sepolia" \ +MESSENGER=0x0000000000000000000000000000000000000000 \ +RPC_URL="$ZKSYNC_SEPOLIA_RPC_URL" ./scripts/deployment/block-hash-pusher/deploy-buffers.sh + +# Optimism Sepolia +echo "Deploying Buffer contract for Optimism Sepolia..." +CHAIN_TYPE="optimism" \ +PARENT_CHAIN="ethereum-sepolia" \ +CHILD_CHAIN="optimism-sepolia" \ +MESSENGER="$OPTIMISM_SEPOLIA_L2_CROSS_DOMAIN_MESSENGER" \ +RPC_URL="$OPTIMISM_SEPOLIA_RPC_URL" ./scripts/deployment/block-hash-pusher/deploy-buffers.sh + +# ======================================================================================== +# Deploy ChildToParentProver contracts +# ======================================================================================== +chmod +x scripts/deployment/provers/deploy-child-provers.sh + +# Ethereum Sepolia +echo "Deploying ChildToParentProver contracts ..." +./scripts/deployment/provers/deploy-child-provers.sh diff --git a/scripts/deployment/provers/DeployArbitrumChildToParent.s.sol b/scripts/deployment/provers/DeployArbitrumChildToParent.s.sol new file mode 100644 index 0000000..019d281 --- /dev/null +++ b/scripts/deployment/provers/DeployArbitrumChildToParent.s.sol @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.30; + +import {DeployBase} from "../DeployBase.s.sol"; + +import {console} from "forge-std/console.sol"; +import {ChildToParentProver} from "src/contracts/provers/arbitrum/ChildToParentProver.sol"; +import {StateProverPointer} from "src/contracts/StateProverPointer.sol"; + +contract DeployArbitrumChildToParent is DeployBase { + function run() public { + uint256 homeChainId = vm.envUint("HOME_CHAIN_ID"); + uint256 targetChainId = vm.envUint("TARGET_CHAIN_ID"); + address owner = vm.envAddress("OWNER"); + + address prover; + address pointer; + if (block.chainid == targetChainId) { + return; + } + vm.startBroadcast(); + + if ( + (block.chainid == homeChainId && _isProverDeployed(_chainName(targetChainId))) + || (block.chainid != homeChainId && _isCopyDeployed(_chainName(homeChainId), _chainName(targetChainId))) + ) { + vm.stopBroadcast(); + console.log("Prover or copy already deployed on chain ", _chainName(block.chainid)); + return; + } + + bytes memory proverCreationCode = + abi.encodePacked(type(ChildToParentProver).creationCode, abi.encode(homeChainId)); + prover = _deploy(proverCreationCode, bytes32(0)); + + if (prover == address(0)) { + console.log("Failed to deploy prover on chain ", _chainName(block.chainid)); + vm.stopBroadcast(); + revert DeploymentFailed(); + } + + // Only deploy the pointer on the "canonical" chain, i.e., the chain where the pointer will be called from the receiver directly. + // The other prover deployments are copies. + if (block.chainid == homeChainId) { + bytes memory pointerCreationCode = + abi.encodePacked(type(StateProverPointer).creationCode, abi.encode(owner)); + pointer = _deploy(pointerCreationCode, bytes32(targetChainId)); + + if (pointer != address(0)) { + if (StateProverPointer(pointer).implementationAddress() == address(0)) { + // This will only work if `msg.sender` is the owner of the pointer. + StateProverPointer(pointer).setImplementationAddress(address(prover)); + } + } + } + vm.stopBroadcast(); + + if (pointer == address(0)) { + // If the pointer is not deployed, it means that this is a copy of the prover deployed in a different chain. + _writeCopy(_chainName(homeChainId), _chainName(targetChainId), prover); + }else { + _writeProver(_chainName(targetChainId), address(pointer), address(prover)); + } + } +} diff --git a/scripts/deployment/provers/DeployArbitrumParentToChild.s.sol b/scripts/deployment/provers/DeployArbitrumParentToChild.s.sol index 4ba6fdc..5361bbc 100644 --- a/scripts/deployment/provers/DeployArbitrumParentToChild.s.sol +++ b/scripts/deployment/provers/DeployArbitrumParentToChild.s.sol @@ -1,19 +1,14 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.30; -import { DeployBase } from "../DeployBase.s.sol"; - - -import { console } from "forge-std/console.sol"; -import { ParentToChildProver } from "src/contracts/provers/arbitrum/ParentToChildProver.sol"; -import { StateProverPointer } from "src/contracts/StateProverPointer.sol"; +import {DeployBase} from "../DeployBase.s.sol"; +import {console} from "forge-std/console.sol"; +import {ParentToChildProver} from "src/contracts/provers/arbitrum/ParentToChildProver.sol"; +import {StateProverPointer} from "src/contracts/StateProverPointer.sol"; contract DeployArbitrumParentToChild is DeployBase { - function run() public { - - address outbox = vm.envAddress("OUTBOX"); uint256 rootsSlot = vm.envUint("ROOTS_SLOT"); address owner = vm.envAddress("OWNER"); @@ -23,31 +18,51 @@ contract DeployArbitrumParentToChild is DeployBase { address prover; address pointer; - if(block.chainid == targetChainId){ + if (block.chainid == targetChainId) { return; } vm.startBroadcast(); - prover = address(new ParentToChildProver(outbox, rootsSlot)); - // Only deploy the pointer on the "canonical" chain, i.e., the chain where the pointer will be called from the receiver directly. - // The other prover deployments are copies. - if(block.chainid == homeChainId){ - pointer = address(new StateProverPointer(owner)); + if ( + (block.chainid == homeChainId && _isProverDeployed(_chainName(targetChainId))) + || (block.chainid != homeChainId && _isCopyDeployed(_chainName(homeChainId), _chainName(targetChainId))) + ) { + vm.stopBroadcast(); + console.log("Prover or copy already deployed on chain ", _chainName(block.chainid)); + return; + } + + bytes memory proverCreationCode = + abi.encodePacked(type(ParentToChildProver).creationCode, abi.encode(outbox, rootsSlot, homeChainId)); + prover = _deploy(proverCreationCode, bytes32(0)); - // This will only work if `msg.sender` is the owner of the pointer. - StateProverPointer(pointer).setImplementationAddress(address(prover)); + if (prover == address(0)) { + console.log("Failed to deploy prover on chain ", _chainName(block.chainid)); + vm.stopBroadcast(); + revert DeploymentFailed(); } - vm.stopBroadcast(); - if(pointer == address(0)){ - // If the pointer is not deployed, it means that this is a copy of the prover deployed in a different chain. - _writeCopy(_chainName(homeChainId), _chainName(targetChainId), address(prover)); + // Only deploy the pointer on the "canonical" chain, i.e., the chain where the pointer will be called from the receiver directly. + // The other prover deployments are copies. + if (block.chainid == homeChainId) { + bytes memory pointerCreationCode = + abi.encodePacked(type(StateProverPointer).creationCode, abi.encode(owner)); + pointer = _deploy(pointerCreationCode, bytes32(targetChainId)); + if (pointer != address(0)) { + if (StateProverPointer(pointer).implementationAddress() == address(0)) { + // This will only work if `msg.sender` is the owner of the pointer. + StateProverPointer(pointer).setImplementationAddress(address(prover)); + } + } } + vm.stopBroadcast(); - else { + if (pointer == address(0)) { + // If the pointer is not deployed, it means that this is a copy of the prover deployed in a different chain. + _writeCopy(_chainName(homeChainId), _chainName(targetChainId), prover); + }else { _writeProver(_chainName(targetChainId), address(pointer), address(prover)); } - } -} \ No newline at end of file +} diff --git a/scripts/deployment/provers/DeployLineaChildToParent.s.sol b/scripts/deployment/provers/DeployLineaChildToParent.s.sol new file mode 100644 index 0000000..3c5f719 --- /dev/null +++ b/scripts/deployment/provers/DeployLineaChildToParent.s.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.30; + +import {DeployBase} from "../DeployBase.s.sol"; + +import {console} from "forge-std/console.sol"; +import {ChildToParentProver} from "src/contracts/provers/linea/ChildToParentProver.sol"; +import {StateProverPointer} from "src/contracts/StateProverPointer.sol"; + +contract DeployLineaChildToParent is DeployBase { + function run() public { + uint256 homeChainId = vm.envUint("HOME_CHAIN_ID"); + uint256 targetChainId = vm.envUint("TARGET_CHAIN_ID"); + address owner = vm.envAddress("OWNER"); + + address prover; + address pointer; + if (block.chainid == targetChainId) { + return; + } + vm.startBroadcast(); + if ( + (block.chainid == homeChainId && _isProverDeployed(_chainName(targetChainId))) + || (block.chainid != homeChainId && _isCopyDeployed(_chainName(homeChainId), _chainName(targetChainId))) + ) { + vm.stopBroadcast(); + console.log("Prover or copy already deployed on chain ", _chainName(block.chainid)); + return; + } + address buffer = _getBufferAddress(_chainName(homeChainId)); + if (buffer == address(0)) { + revert InvalidBufferAddress(); + } + bytes memory proverCreationCode = + abi.encodePacked(type(ChildToParentProver).creationCode, abi.encode(buffer, homeChainId)); + prover = _deploy(proverCreationCode, bytes32(0)); + if (prover == address(0)) { + console.log("Failed to deploy prover on chain ", _chainName(block.chainid)); + vm.stopBroadcast(); + revert DeploymentFailed(); + } + + // Only deploy the pointer on the "canonical" chain, i.e., the chain where the pointer will be called from the receiver directly. + // The other prover deployments are copies. + if (block.chainid == homeChainId) { + bytes memory pointerCreationCode = + abi.encodePacked(type(StateProverPointer).creationCode, abi.encode(owner)); + pointer = _deploy(pointerCreationCode, bytes32(targetChainId)); + if (pointer != address(0)) { + if (StateProverPointer(pointer).implementationAddress() == address(0)) { + // This will only work if `msg.sender` is the owner of the pointer. + StateProverPointer(pointer).setImplementationAddress(address(prover)); + } + } + } + vm.stopBroadcast(); + + if (pointer == address(0)) { + _writeCopy(_chainName(homeChainId), _chainName(targetChainId), prover); + }else { + _writeProver(_chainName(targetChainId), address(pointer), prover); + } + } +} diff --git a/scripts/deployment/provers/DeployLineaParentToChild.s.sol b/scripts/deployment/provers/DeployLineaParentToChild.s.sol index 9d7c726..8151324 100644 --- a/scripts/deployment/provers/DeployLineaParentToChild.s.sol +++ b/scripts/deployment/provers/DeployLineaParentToChild.s.sol @@ -1,19 +1,14 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.30; -import { DeployBase } from "../DeployBase.s.sol"; +import {DeployBase} from "../DeployBase.s.sol"; +import {console} from "forge-std/console.sol"; +import {ParentToChildProver} from "src/contracts/provers/linea/ParentToChildProver.sol"; +import {StateProverPointer} from "src/contracts/StateProverPointer.sol"; -import { console } from "forge-std/console.sol"; -import { ParentToChildProver } from "src/contracts/provers/linea/ParentToChildProver.sol"; -import { StateProverPointer } from "src/contracts/StateProverPointer.sol"; - - -contract DeployArbitrumParentToChild is DeployBase { - +contract DeployLineaParentToChild is DeployBase { function run() public { - - address rollup = vm.envAddress("ROLLUP"); uint256 stateRootHashesSlot = vm.envUint("STATE_ROOT_HASHES_SLOT"); address owner = vm.envAddress("OWNER"); @@ -23,30 +18,47 @@ contract DeployArbitrumParentToChild is DeployBase { address prover; address pointer; - if(block.chainid == targetChainId){ + if (block.chainid == targetChainId) { return; } vm.startBroadcast(); - prover = address(new ParentToChildProver(rollup, stateRootHashesSlot, homeChainId)); + if ( + (block.chainid == homeChainId && _isProverDeployed(_chainName(targetChainId))) + || (block.chainid != homeChainId && _isCopyDeployed(_chainName(homeChainId), _chainName(targetChainId))) + ) { + vm.stopBroadcast(); + console.log("Prover or copy already deployed on chain ", _chainName(block.chainid)); + return; + } + bytes memory proverCreationCode = abi.encodePacked( + type(ParentToChildProver).creationCode, abi.encode(rollup, stateRootHashesSlot, homeChainId) + ); + prover = _deploy(proverCreationCode, bytes32(0)); + if (prover == address(0)) { + console.log("Failed to deploy prover on chain ", _chainName(block.chainid)); + vm.stopBroadcast(); + revert DeploymentFailed(); + } - // Only deploy the pointer on the "canonical" chain, i.e., the chain where the pointer will be called from the receiver directly. + // Only deploy the pointer on the "canonical" chain, i.e., the chain where the pointer will be called from the receiver directly. // The other prover deployments are copies. - if(block.chainid == homeChainId){ - pointer = address(new StateProverPointer(owner)); - - // This will only work if `msg.sender` is the owner of the pointer. - StateProverPointer(pointer).setImplementationAddress(address(prover)); + if (block.chainid == homeChainId) { + bytes memory pointerCreationCode = + abi.encodePacked(type(StateProverPointer).creationCode, abi.encode(owner)); + pointer = _deploy(pointerCreationCode, bytes32(targetChainId)); + if (pointer != address(0)) { + if (StateProverPointer(pointer).implementationAddress() == address(0)) { + // This will only work if `msg.sender` is the owner of the pointer. + StateProverPointer(pointer).setImplementationAddress(address(prover)); + } + } } vm.stopBroadcast(); - if(pointer == address(0)){ - _writeCopy(_chainName(homeChainId), _chainName(targetChainId), address(prover)); - - } - - else { - _writeProver(_chainName(targetChainId), address(pointer), address(prover)); + if (pointer == address(0)) { + _writeCopy(_chainName(homeChainId), _chainName(targetChainId), prover); + }else { + _writeProver(_chainName(targetChainId), address(pointer), prover); } - } -} \ No newline at end of file +} diff --git a/scripts/deployment/provers/DeployOptimismChildToParent.s.sol b/scripts/deployment/provers/DeployOptimismChildToParent.s.sol new file mode 100644 index 0000000..9e8bafb --- /dev/null +++ b/scripts/deployment/provers/DeployOptimismChildToParent.s.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.30; + +import {DeployBase} from "../DeployBase.s.sol"; + +import {console} from "forge-std/console.sol"; +import {ChildToParentProver} from "src/contracts/provers/optimism/ChildToParentProver.sol"; +import {StateProverPointer} from "src/contracts/StateProverPointer.sol"; + +contract DeployOptimismChildToParent is DeployBase { + function run() public { + uint256 homeChainId = vm.envUint("HOME_CHAIN_ID"); + uint256 targetChainId = vm.envUint("TARGET_CHAIN_ID"); + address owner = vm.envAddress("OWNER"); + + address prover; + address pointer; + if (block.chainid == targetChainId) { + return; + } + vm.startBroadcast(); + if ( + (block.chainid == homeChainId && _isProverDeployed(_chainName(targetChainId))) + || (block.chainid != homeChainId && _isCopyDeployed(_chainName(homeChainId), _chainName(targetChainId))) + ) { + vm.stopBroadcast(); + console.log("Prover or copy already deployed on chain ", _chainName(block.chainid)); + return; + } + address buffer = _getBufferAddress(_chainName(homeChainId)); + if (buffer == address(0)) { + revert InvalidBufferAddress(); + } + bytes memory proverCreationCode = + abi.encodePacked(type(ChildToParentProver).creationCode, abi.encode(buffer, homeChainId)); + prover = _deploy(proverCreationCode, bytes32(0)); + if (prover == address(0)) { + console.log("Failed to deploy prover on chain ", _chainName(block.chainid)); + vm.stopBroadcast(); + revert DeploymentFailed(); + } + + // Only deploy the pointer on the "canonical" chain, i.e., the chain where the pointer will be called from the receiver directly. + // The other prover deployments are copies. + if (block.chainid == homeChainId) { + bytes memory pointerCreationCode = + abi.encodePacked(type(StateProverPointer).creationCode, abi.encode(owner)); + pointer = _deploy(pointerCreationCode, bytes32(targetChainId)); + if (pointer != address(0)) { + if (StateProverPointer(pointer).implementationAddress() == address(0)) { + // This will only work if `msg.sender` is the owner of the pointer. + StateProverPointer(pointer).setImplementationAddress(address(prover)); + } + } + } + vm.stopBroadcast(); + + if (pointer == address(0)) { + _writeCopy(_chainName(homeChainId), _chainName(targetChainId), prover); + }else { + _writeProver(_chainName(targetChainId), address(pointer), prover); + } + } +} diff --git a/scripts/deployment/provers/DeployOptimismParentToChild.s.sol b/scripts/deployment/provers/DeployOptimismParentToChild.s.sol index aa2f701..39b2f02 100644 --- a/scripts/deployment/provers/DeployOptimismParentToChild.s.sol +++ b/scripts/deployment/provers/DeployOptimismParentToChild.s.sol @@ -1,20 +1,16 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.30; -import { DeployBase } from "../DeployBase.s.sol"; - - -import { console } from "forge-std/console.sol"; -import { ParentToChildProver } from "src/contracts/provers/optimism/ParentToChildProver.sol"; -import { StateProverPointer } from "src/contracts/StateProverPointer.sol"; +import {DeployBase} from "../DeployBase.s.sol"; +import {console} from "forge-std/console.sol"; +import {ParentToChildProver} from "src/contracts/provers/optimism/ParentToChildProver.sol"; +import {StateProverPointer} from "src/contracts/StateProverPointer.sol"; contract DeployArbitrumParentToChild is DeployBase { - function run() public { - - address anchorStateRegistry = vm.envAddress("ANCHOR_STATE_REGISTRY"); + uint256 anchorGameSlot = vm.envUint("ANCHOR_GAME_SLOT"); address owner = vm.envAddress("OWNER"); uint256 homeChainId = vm.envUint("HOME_CHAIN_ID"); @@ -22,31 +18,50 @@ contract DeployArbitrumParentToChild is DeployBase { address prover; address pointer; - if(block.chainid == targetChainId){ + if (block.chainid == targetChainId) { return; } vm.startBroadcast(); - prover = address(new ParentToChildProver(anchorStateRegistry)); - // Only deploy the pointer on the "canonical" chain, i.e., the chain where the pointer will be called from the receiver directly. - // The other prover deployments are copies. - if(block.chainid == homeChainId){ - pointer = address(new StateProverPointer(owner)); + if ( + (block.chainid == homeChainId && _isProverDeployed(_chainName(targetChainId))) + || (block.chainid != homeChainId && _isCopyDeployed(_chainName(homeChainId), _chainName(targetChainId))) + ) { + vm.stopBroadcast(); + console.log("Prover or copy already deployed on chain ", _chainName(block.chainid)); + return; + } + + bytes memory proverCreationCode = abi.encodePacked( + type(ParentToChildProver).creationCode, abi.encode(anchorStateRegistry, anchorGameSlot, homeChainId) + ); + prover = _deploy(proverCreationCode, bytes32(0)); + if (prover == address(0)) { + console.log("Failed to deploy prover on chain ", _chainName(block.chainid)); + vm.stopBroadcast(); + revert DeploymentFailed(); + } - // This will only work if `msg.sender` is the owner of the pointer. - StateProverPointer(pointer).setImplementationAddress(address(prover)); + // Only deploy the pointer on the "canonical" chain, i.e., the chain where the pointer will be called from the receiver directly. + // The other prover deployments are copies. + if (block.chainid == homeChainId) { + bytes memory pointerCreationCode = + abi.encodePacked(type(StateProverPointer).creationCode, abi.encode(owner)); + pointer = _deploy(pointerCreationCode, bytes32(targetChainId)); + if (pointer != address(0)) { + if (StateProverPointer(pointer).implementationAddress() == address(0)) { + // This will only work if `msg.sender` is the owner of the pointer. + StateProverPointer(pointer).setImplementationAddress(address(prover)); + } + } } vm.stopBroadcast(); - if(pointer == address(0)){ + if (pointer == address(0)) { // If the pointer is not deployed, it means that this is a copy of the prover deployed in a different chain. _writeCopy(_chainName(homeChainId), _chainName(targetChainId), address(prover)); - - } - - else { + }else { _writeProver(_chainName(targetChainId), address(pointer), address(prover)); } - } -} \ No newline at end of file +} diff --git a/scripts/deployment/provers/DeployScrollChildToParent.s.sol b/scripts/deployment/provers/DeployScrollChildToParent.s.sol new file mode 100644 index 0000000..5bd2b1b --- /dev/null +++ b/scripts/deployment/provers/DeployScrollChildToParent.s.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.30; + +import {DeployBase} from "../DeployBase.s.sol"; + +import {console} from "forge-std/console.sol"; +import {ChildToParentProver} from "src/contracts/provers/scroll/ChildToParentProver.sol"; +import {StateProverPointer} from "src/contracts/StateProverPointer.sol"; + +contract DeployScrollChildToParent is DeployBase { + function run() public { + uint256 homeChainId = vm.envUint("HOME_CHAIN_ID"); + uint256 targetChainId = vm.envUint("TARGET_CHAIN_ID"); + address owner = vm.envAddress("OWNER"); + + address prover; + address pointer; + if (block.chainid == targetChainId) { + return; + } + vm.startBroadcast(); + if ( + (block.chainid == homeChainId && _isProverDeployed(_chainName(targetChainId))) + || (block.chainid != homeChainId && _isCopyDeployed(_chainName(homeChainId), _chainName(targetChainId))) + ) { + vm.stopBroadcast(); + console.log("Prover or copy already deployed on chain ", _chainName(block.chainid)); + return; + } + address buffer = _getBufferAddress(_chainName(homeChainId)); + if (buffer == address(0)) { + revert InvalidBufferAddress(); + } + bytes memory proverCreationCode = + abi.encodePacked(type(ChildToParentProver).creationCode, abi.encode(buffer, homeChainId)); + prover = _deploy(proverCreationCode, bytes32(0)); + if (prover == address(0)) { + console.log("Failed to deploy prover on chain ", _chainName(block.chainid)); + vm.stopBroadcast(); + revert DeploymentFailed(); + } + + // Only deploy the pointer on the "canonical" chain, i.e., the chain where the pointer will be called from the receiver directly. + // The other prover deployments are copies. + if (block.chainid == homeChainId) { + bytes memory pointerCreationCode = + abi.encodePacked(type(StateProverPointer).creationCode, abi.encode(owner)); + pointer = _deploy(pointerCreationCode, bytes32(targetChainId)); + if (pointer != address(0)) { + if (StateProverPointer(pointer).implementationAddress() == address(0)) { + // This will only work if `msg.sender` is the owner of the pointer. + StateProverPointer(pointer).setImplementationAddress(address(prover)); + } + } + } + vm.stopBroadcast(); + + if (pointer == address(0)) { + _writeCopy(_chainName(homeChainId), _chainName(targetChainId), prover); + }else { + _writeProver(_chainName(targetChainId), address(pointer), prover); + } + } +} diff --git a/scripts/deployment/provers/DeployScrollParentToChild.s.sol b/scripts/deployment/provers/DeployScrollParentToChild.s.sol index ba3b245..6aad178 100644 --- a/scripts/deployment/provers/DeployScrollParentToChild.s.sol +++ b/scripts/deployment/provers/DeployScrollParentToChild.s.sol @@ -1,19 +1,14 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.30; -import { DeployBase } from "../DeployBase.s.sol"; - - -import { console } from "forge-std/console.sol"; -import { ParentToChildProver } from "src/contracts/provers/scroll/ParentToChildProver.sol"; -import { StateProverPointer } from "src/contracts/StateProverPointer.sol"; +import {DeployBase} from "../DeployBase.s.sol"; +import {console} from "forge-std/console.sol"; +import {ParentToChildProver} from "src/contracts/provers/scroll/ParentToChildProver.sol"; +import {StateProverPointer} from "src/contracts/StateProverPointer.sol"; contract DeployArbitrumParentToChild is DeployBase { - function run() public { - - address scrollChain = vm.envAddress("SCROLL_CHAIN"); uint256 finalizedStateRootsSlot = vm.envUint("FINALIZED_STATE_ROOTS_SLOT"); address owner = vm.envAddress("OWNER"); @@ -23,28 +18,50 @@ contract DeployArbitrumParentToChild is DeployBase { address prover; address pointer; + if (block.chainid == targetChainId) { + return; + } vm.startBroadcast(); - prover = address(new ParentToChildProver(scrollChain, finalizedStateRootsSlot, homeChainId)); + if ( + (block.chainid == homeChainId && _isProverDeployed(_chainName(targetChainId))) + || (block.chainid != homeChainId && _isCopyDeployed(_chainName(homeChainId), _chainName(targetChainId))) + ) { + vm.stopBroadcast(); + console.log("Prover or copy already deployed on chain ", _chainName(block.chainid)); + return; + } - // Only deploy the pointer on the "canonical" chain, i.e., the chain where the pointer will be called from the receiver directly. - // The other prover deployments are copies. - if(block.chainid == homeChainId){ - pointer = address(new StateProverPointer(owner)); + bytes memory proverCreationCode = abi.encodePacked( + type(ParentToChildProver).creationCode, abi.encode(scrollChain, finalizedStateRootsSlot, homeChainId) + ); + prover = _deploy(proverCreationCode, bytes32(0)); + + if (prover == address(0)) { + console.log("Failed to deploy prover on chain ", _chainName(block.chainid)); + vm.stopBroadcast(); + revert DeploymentFailed(); + } - // This will only work if `msg.sender` is the owner of the pointer. - StateProverPointer(pointer).setImplementationAddress(address(prover)); + // Only deploy the pointer on the "canonical" chain, i.e., the chain where the pointer will be called from the receiver directly. + // The other prover deployments are copies. + if (block.chainid == homeChainId) { + bytes memory pointerCreationCode = + abi.encodePacked(type(StateProverPointer).creationCode, abi.encode(owner)); + pointer = _deploy(pointerCreationCode, bytes32(targetChainId)); + if (pointer != address(0)) { + if (StateProverPointer(pointer).implementationAddress() == address(0)) { + // This will only work if `msg.sender` is the owner of the pointer. + StateProverPointer(pointer).setImplementationAddress(address(prover)); + } + } } vm.stopBroadcast(); - if(pointer == address(0)){ + if (pointer == address(0)) { // If the pointer is not deployed, it means that this is a copy of the prover deployed in a different chain. _writeCopy(_chainName(homeChainId), _chainName(targetChainId), address(prover)); - - } - - else { + }else { _writeProver(_chainName(targetChainId), address(pointer), address(prover)); } - } -} \ No newline at end of file +} diff --git a/scripts/deployment/provers/deploy-child-provers.sh b/scripts/deployment/provers/deploy-child-provers.sh new file mode 100755 index 0000000..815c89e --- /dev/null +++ b/scripts/deployment/provers/deploy-child-provers.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash + +HOME_CHAIN_ID=$ARBITRUM_SEPOLIA_CHAIN_ID \ +TARGET_CHAIN_ID=$ETHEREUM_SEPOLIA_CHAIN_ID \ +forge script scripts/deployment/provers/DeployArbitrumChildToParent.s.sol \ + --rpc-url "$ARBITRUM_SEPOLIA_RPC_URL" \ + --private-key "$DEPLOYER_PRIVATE_KEY" \ + --broadcast + +HOME_CHAIN_ID=$LINEA_SEPOLIA_CHAIN_ID \ +TARGET_CHAIN_ID=$ETHEREUM_SEPOLIA_CHAIN_ID \ +forge script scripts/deployment/provers/DeployLineaChildToParent.s.sol \ + --rpc-url "$LINEA_SEPOLIA_RPC_URL" \ + --private-key "$DEPLOYER_PRIVATE_KEY" \ + --broadcast + +HOME_CHAIN_ID=$SCROLL_SEPOLIA_CHAIN_ID \ +TARGET_CHAIN_ID=$ETHEREUM_SEPOLIA_CHAIN_ID \ +forge script scripts/deployment/provers/DeployScrollChildToParent.s.sol \ + --rpc-url "$SCROLL_SEPOLIA_RPC_URL" \ + --private-key "$DEPLOYER_PRIVATE_KEY" \ + --broadcast + +HOME_CHAIN_ID=$OPTIMISM_SEPOLIA_CHAIN_ID \ +TARGET_CHAIN_ID=$ETHEREUM_SEPOLIA_CHAIN_ID \ +forge script scripts/deployment/provers/DeployOptimismChildToParent.s.sol \ + --rpc-url "$OPTIMISM_SEPOLIA_RPC_URL" \ + --private-key "$DEPLOYER_PRIVATE_KEY" \ + --broadcast \ No newline at end of file diff --git a/scripts/deployment/provers/deploy-parent-provers.sh b/scripts/deployment/provers/deploy-parent-provers.sh index 3866e07..c7f0e2e 100755 --- a/scripts/deployment/provers/deploy-parent-provers.sh +++ b/scripts/deployment/provers/deploy-parent-provers.sh @@ -31,6 +31,7 @@ forge script scripts/deployment/provers/DeployScrollParentToChild.s.sol \ ANCHOR_STATE_REGISTRY=$OPTIMISM_SEPOLIA_ANCHOR_STATE_REGISTRY \ +ANCHOR_GAME_SLOT=$OPTIMISM_SEPOLIA_ANCHOR_GAME_SLOT \ HOME_CHAIN_ID=$ETHEREUM_SEPOLIA_CHAIN_ID \ TARGET_CHAIN_ID=$OPTIMISM_SEPOLIA_CHAIN_ID \ forge script scripts/deployment/provers/DeployOptimismParentToChild.s.sol \ diff --git a/scripts/taiko/broadcast-l1.s.sol b/scripts/taiko/broadcast-l1.s.sol index e5302df..7e96e4e 100644 --- a/scripts/taiko/broadcast-l1.s.sol +++ b/scripts/taiko/broadcast-l1.s.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.27; -import { Script } from "forge-std/Script.sol"; -import { console } from "forge-std/console.sol"; -import { Broadcaster } from "../../src/contracts/Broadcaster.sol"; +import {Script} from "forge-std/Script.sol"; +import {console} from "forge-std/console.sol"; +import {Broadcaster} from "../../src/contracts/Broadcaster.sol"; /// @notice Broadcast a message on L1 (Taiko Parent Chain) /// @dev This script broadcasts a message using the Broadcaster contract on L1 @@ -11,7 +11,7 @@ contract BroadcastL1Message is Script { function run() public { address broadcasterAddress = vm.envAddress("L1_BROADCASTER"); bytes32 message = keccak256(abi.encodePacked("Message", block.timestamp, msg.sender)); - + vm.startBroadcast(); Broadcaster(broadcasterAddress).broadcastMessage(message); vm.stopBroadcast(); diff --git a/scripts/taiko/broadcast-l2.s.sol b/scripts/taiko/broadcast-l2.s.sol index d847f84..f09edd4 100644 --- a/scripts/taiko/broadcast-l2.s.sol +++ b/scripts/taiko/broadcast-l2.s.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.27; -import { Script } from "forge-std/Script.sol"; -import { console } from "forge-std/console.sol"; -import { Broadcaster } from "../../src/contracts/Broadcaster.sol"; +import {Script} from "forge-std/Script.sol"; +import {console} from "forge-std/console.sol"; +import {Broadcaster} from "../../src/contracts/Broadcaster.sol"; /// @notice Broadcast a message on L2 (Taiko Child Chain) /// @dev This script broadcasts a message using the Broadcaster contract on L2 @@ -11,7 +11,7 @@ contract BroadcastL2Message is Script { function run() public { address broadcasterAddress = vm.envAddress("L2_BROADCASTER"); bytes32 message = keccak256(abi.encodePacked("Message", block.timestamp, msg.sender)); - + vm.startBroadcast(); Broadcaster(broadcasterAddress).broadcastMessage(message); vm.stopBroadcast(); diff --git a/scripts/taiko/deploy-all.s.sol b/scripts/taiko/deploy-all.s.sol index a6d9725..12caea1 100644 --- a/scripts/taiko/deploy-all.s.sol +++ b/scripts/taiko/deploy-all.s.sol @@ -1,22 +1,22 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.27; -import { Script } from "forge-std/Script.sol"; -import { console } from "forge-std/console.sol"; -import { Broadcaster } from "../../src/contracts/Broadcaster.sol"; -import { Receiver } from "../../src/contracts/Receiver.sol"; -import { StateProverPointer } from "../../src/contracts/StateProverPointer.sol"; +import {Script} from "forge-std/Script.sol"; +import {console} from "forge-std/console.sol"; +import {Broadcaster} from "../../src/contracts/Broadcaster.sol"; +import {Receiver} from "../../src/contracts/Receiver.sol"; +import {StateProverPointer} from "../../src/contracts/StateProverPointer.sol"; contract DeployAll is Script { function run() public { address owner = vm.envAddress("TAIKO_DEPLOYER_ADDRESS"); - + vm.startBroadcast(); - + Broadcaster broadcaster = new Broadcaster(); Receiver receiver = new Receiver(); StateProverPointer pointer = new StateProverPointer(owner); - + vm.stopBroadcast(); console.log("Broadcaster:", address(broadcaster)); diff --git a/scripts/taiko/provers-l2.s.sol b/scripts/taiko/provers-l2.s.sol index d3d54a2..083676a 100644 --- a/scripts/taiko/provers-l2.s.sol +++ b/scripts/taiko/provers-l2.s.sol @@ -1,10 +1,12 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.27; -import { Script } from "forge-std/Script.sol"; -import { console } from "forge-std/console.sol"; -import { ChildToParentProver as TaikoChildToParentProver } from "../../src/contracts/provers/taiko/ChildToParentProver.sol"; -import { StateProverPointer } from "../../src/contracts/StateProverPointer.sol"; +import {Script} from "forge-std/Script.sol"; +import {console} from "forge-std/console.sol"; +import { + ChildToParentProver as TaikoChildToParentProver +} from "../../src/contracts/provers/taiko/ChildToParentProver.sol"; +import {StateProverPointer} from "../../src/contracts/StateProverPointer.sol"; /// @notice Deploy ChildToParentProver on L2 (Taiko Child Chain) /// @dev This script deploys the prover that allows reading L1 state from L2 @@ -17,16 +19,13 @@ contract DeployL2Prover is Script { address owner = vm.envAddress("TAIKO_DEPLOYER_ADDRESS"); vm.startBroadcast(); - - TaikoChildToParentProver childToParentProver = new TaikoChildToParentProver( - signalServiceL2, - checkpointsSlot, - homeChainId - ); - + + TaikoChildToParentProver childToParentProver = + new TaikoChildToParentProver(signalServiceL2, checkpointsSlot, homeChainId); + StateProverPointer stateProverPointer = new StateProverPointer(owner); stateProverPointer.setImplementationAddress(address(childToParentProver)); - + vm.stopBroadcast(); console.log("ChildToParentProver:", address(childToParentProver)); diff --git a/scripts/taiko/provers.s.sol b/scripts/taiko/provers.s.sol index 48b8aa3..af4dfa3 100644 --- a/scripts/taiko/provers.s.sol +++ b/scripts/taiko/provers.s.sol @@ -1,10 +1,12 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.27; -import { Script } from "forge-std/Script.sol"; -import { console } from "forge-std/console.sol"; -import { ParentToChildProver as TaikoParentToChildProver } from "../../src/contracts/provers/taiko/ParentToChildProver.sol"; -import { StateProverPointer } from "../../src/contracts/StateProverPointer.sol"; +import {Script} from "forge-std/Script.sol"; +import {console} from "forge-std/console.sol"; +import { + ParentToChildProver as TaikoParentToChildProver +} from "../../src/contracts/provers/taiko/ParentToChildProver.sol"; +import {StateProverPointer} from "../../src/contracts/StateProverPointer.sol"; /// @notice Deploy ParentToChildProver on L1 (Ethereum/Taiko Parent Chain) /// @dev This script deploys the prover that allows reading L2 state from L1 @@ -17,19 +19,16 @@ contract DeployL1Prover is Script { address owner = vm.envAddress("TAIKO_DEPLOYER_ADDRESS"); vm.startBroadcast(); - - TaikoParentToChildProver parentToChildProver = new TaikoParentToChildProver( - signalServiceL1, - checkpointsSlot, - homeChainId - ); - + + TaikoParentToChildProver parentToChildProver = + new TaikoParentToChildProver(signalServiceL1, checkpointsSlot, homeChainId); + StateProverPointer stateProverPointer = new StateProverPointer(owner); stateProverPointer.setImplementationAddress(address(parentToChildProver)); - + vm.stopBroadcast(); console.log("ParentToChildProver:", address(parentToChildProver)); console.log("L1ProverPointer:", address(stateProverPointer)); } -} \ No newline at end of file +} diff --git a/scripts/taiko/verify-message.s.sol b/scripts/taiko/verify-message.s.sol index 4fe84af..fbb3dd3 100644 --- a/scripts/taiko/verify-message.s.sol +++ b/scripts/taiko/verify-message.s.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.27; -import { Script } from "forge-std/Script.sol"; -import { console } from "forge-std/console.sol"; -import { stdJson } from "forge-std/StdJson.sol"; -import { Receiver } from "../../src/contracts/Receiver.sol"; -import { IReceiver } from "../../src/contracts/interfaces/IReceiver.sol"; +import {Script} from "forge-std/Script.sol"; +import {console} from "forge-std/console.sol"; +import {stdJson} from "forge-std/StdJson.sol"; +import {Receiver} from "../../src/contracts/Receiver.sol"; +import {IReceiver} from "../../src/contracts/interfaces/IReceiver.sol"; contract VerifyMessage is Script { using stdJson for string; @@ -13,7 +13,7 @@ contract VerifyMessage is Script { function run() public view { address receiverAddress = vm.envAddress("L1_RECEIVER"); address proverPointerAddress = vm.envAddress("L1_PROVER_POINTER"); - + string memory path = "test/payloads/taiko/taikoProofL2.json"; string memory json = vm.readFile(path); @@ -32,12 +32,9 @@ contract VerifyMessage is Script { bytes[] memory scpInputs = new bytes[](1); scpInputs[0] = abi.encode(uint48(blockNumber)); - IReceiver.RemoteReadArgs memory remoteReadArgs = IReceiver.RemoteReadArgs({ - route: route, - scpInputs: scpInputs, - proof: storageProofInput - }); - + IReceiver.RemoteReadArgs memory remoteReadArgs = + IReceiver.RemoteReadArgs({route: route, scpInputs: scpInputs, proof: storageProofInput}); + bytes32 message = 0xd9222d7d84eefb8570069f30ab4a850423ba57a374c593b67a224c430f9736df; address publisher = 0x1CBd3b2770909D4e10f157cABC84C7264073C9Ec; @@ -50,11 +47,8 @@ contract VerifyMessage is Script { console.logBytes32(message); console.log(""); - (bytes32 broadcasterId, uint256 timestamp) = Receiver(receiverAddress).verifyBroadcastMessage( - remoteReadArgs, - message, - publisher - ); + (bytes32 broadcasterId, uint256 timestamp) = + Receiver(receiverAddress).verifyBroadcastMessage(remoteReadArgs, message, publisher); console.log("=== Verification Success ==="); console.log("Broadcaster ID: ", vm.toString(broadcasterId)); @@ -62,6 +56,3 @@ contract VerifyMessage is Script { } } - - - diff --git a/scripts/taiko/verify-on-chain.s.sol b/scripts/taiko/verify-on-chain.s.sol index 1f26da4..5e57bac 100644 --- a/scripts/taiko/verify-on-chain.s.sol +++ b/scripts/taiko/verify-on-chain.s.sol @@ -60,18 +60,12 @@ contract VerifyOnChain is Script { bytes[] memory scpInputs = new bytes[](1); scpInputs[0] = abi.encode(uint48(blockNumber)); - IReceiver.RemoteReadArgs memory remoteReadArgs = IReceiver.RemoteReadArgs({ - route: route, - scpInputs: scpInputs, - proof: storageProofInput - }); + IReceiver.RemoteReadArgs memory remoteReadArgs = + IReceiver.RemoteReadArgs({route: route, scpInputs: scpInputs, proof: storageProofInput}); // Call the deployed Receiver contract - (bytes32 broadcasterId, uint256 timestamp) = IReceiver(getL2Receiver()).verifyBroadcastMessage( - remoteReadArgs, - message, - publisher - ); + (bytes32 broadcasterId, uint256 timestamp) = + IReceiver(getL2Receiver()).verifyBroadcastMessage(remoteReadArgs, message, publisher); console.log(""); console.log("=== VERIFICATION SUCCESSFUL ==="); @@ -112,18 +106,12 @@ contract VerifyOnChain is Script { bytes[] memory scpInputs = new bytes[](1); scpInputs[0] = abi.encode(uint48(blockNumber)); - IReceiver.RemoteReadArgs memory remoteReadArgs = IReceiver.RemoteReadArgs({ - route: route, - scpInputs: scpInputs, - proof: storageProofInput - }); + IReceiver.RemoteReadArgs memory remoteReadArgs = + IReceiver.RemoteReadArgs({route: route, scpInputs: scpInputs, proof: storageProofInput}); // Call the deployed Receiver contract - (bytes32 broadcasterId, uint256 timestamp) = IReceiver(getL1Receiver()).verifyBroadcastMessage( - remoteReadArgs, - message, - publisher - ); + (bytes32 broadcasterId, uint256 timestamp) = + IReceiver(getL1Receiver()).verifyBroadcastMessage(remoteReadArgs, message, publisher); console.log(""); console.log("=== VERIFICATION SUCCESSFUL ==="); From 912764c579711d9607c5b2c4d09c3f1a43fe4933 Mon Sep 17 00:00:00 2001 From: Luiz Date: Mon, 2 Mar 2026 12:25:12 -0300 Subject: [PATCH 12/19] simplify files --- scripts/Deploy.s.sol | 22 ---------------------- scripts/DeployBroadcaster.s.sol | 22 ---------------------- scripts/DeployZkSyncBroadcaster.s.sol | 22 ---------------------- 3 files changed, 66 deletions(-) delete mode 100644 scripts/Deploy.s.sol delete mode 100644 scripts/DeployBroadcaster.s.sol delete mode 100644 scripts/DeployZkSyncBroadcaster.s.sol diff --git a/scripts/Deploy.s.sol b/scripts/Deploy.s.sol deleted file mode 100644 index e164f15..0000000 --- a/scripts/Deploy.s.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import { Script } from "forge-std/Script.sol"; - - -import { console } from "forge-std/console.sol"; -import { Broadcaster } from "../src/contracts/Broadcaster.sol"; -import { Receiver } from "../src/contracts/Receiver.sol"; - - -contract Deploy is Script { - function run() public { - vm.startBroadcast(); - Broadcaster broadcaster = new Broadcaster(); - Receiver receiver = new Receiver(); - vm.stopBroadcast(); - - console.log("Broadcaster deployed to:", address(broadcaster)); - console.log("Receiver deployed to:", address(receiver)); - } -} \ No newline at end of file diff --git a/scripts/DeployBroadcaster.s.sol b/scripts/DeployBroadcaster.s.sol deleted file mode 100644 index 13cdbea..0000000 --- a/scripts/DeployBroadcaster.s.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.30; - -import { Script } from "forge-std/Script.sol"; - - -import { console } from "forge-std/console.sol"; -import { Broadcaster } from "../src/contracts/Broadcaster.sol"; -import { Receiver } from "../src/contracts/Receiver.sol"; - - -contract DeployBroadcaster is Script { - function run() public { - vm.startBroadcast(); - //Broadcaster broadcaster = new Broadcaster(); - Receiver receiver = new Receiver(); - vm.stopBroadcast(); - - //console.log("Broadcaster deployed to:", address(broadcaster)); - console.log("Receiver deployed to:", address(receiver)); - } -} \ No newline at end of file diff --git a/scripts/DeployZkSyncBroadcaster.s.sol b/scripts/DeployZkSyncBroadcaster.s.sol deleted file mode 100644 index 1ec1de4..0000000 --- a/scripts/DeployZkSyncBroadcaster.s.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.30; - -import { Script } from "forge-std/Script.sol"; - - -import { console } from "forge-std/console.sol"; -import { ZkSyncBroadcaster } from "../src/contracts/ZkSyncBroadcaster.sol"; -import { Receiver } from "../src/contracts/Receiver.sol"; - - -contract DeployBroadcaster is Script { - function run() public { - vm.startBroadcast(); - ZkSyncBroadcaster broadcaster = new ZkSyncBroadcaster(0x0000000000000000000000000000000000008008); - //Receiver receiver = new Receiver(); - vm.stopBroadcast(); - - console.log("ZkSyncBroadcaster deployed to:", address(broadcaster)); - //console.log("Receiver deployed to:", address(receiver)); - } -} \ No newline at end of file From 15b5ca4949deff66a5669ca90ef92bdf945f1e6e Mon Sep 17 00:00:00 2001 From: Luiz Date: Mon, 2 Mar 2026 12:28:21 -0300 Subject: [PATCH 13/19] forge fmt --- scripts/deployment/provers/DeployArbitrumChildToParent.s.sol | 2 +- scripts/deployment/provers/DeployArbitrumParentToChild.s.sol | 2 +- scripts/deployment/provers/DeployLineaChildToParent.s.sol | 2 +- scripts/deployment/provers/DeployLineaParentToChild.s.sol | 2 +- scripts/deployment/provers/DeployOptimismChildToParent.s.sol | 2 +- scripts/deployment/provers/DeployOptimismParentToChild.s.sol | 2 +- scripts/deployment/provers/DeployScrollChildToParent.s.sol | 2 +- scripts/deployment/provers/DeployScrollParentToChild.s.sol | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/scripts/deployment/provers/DeployArbitrumChildToParent.s.sol b/scripts/deployment/provers/DeployArbitrumChildToParent.s.sol index 019d281..4c0f064 100644 --- a/scripts/deployment/provers/DeployArbitrumChildToParent.s.sol +++ b/scripts/deployment/provers/DeployArbitrumChildToParent.s.sol @@ -58,7 +58,7 @@ contract DeployArbitrumChildToParent is DeployBase { if (pointer == address(0)) { // If the pointer is not deployed, it means that this is a copy of the prover deployed in a different chain. _writeCopy(_chainName(homeChainId), _chainName(targetChainId), prover); - }else { + } else { _writeProver(_chainName(targetChainId), address(pointer), address(prover)); } } diff --git a/scripts/deployment/provers/DeployArbitrumParentToChild.s.sol b/scripts/deployment/provers/DeployArbitrumParentToChild.s.sol index 5361bbc..83c9988 100644 --- a/scripts/deployment/provers/DeployArbitrumParentToChild.s.sol +++ b/scripts/deployment/provers/DeployArbitrumParentToChild.s.sol @@ -61,7 +61,7 @@ contract DeployArbitrumParentToChild is DeployBase { if (pointer == address(0)) { // If the pointer is not deployed, it means that this is a copy of the prover deployed in a different chain. _writeCopy(_chainName(homeChainId), _chainName(targetChainId), prover); - }else { + } else { _writeProver(_chainName(targetChainId), address(pointer), address(prover)); } } diff --git a/scripts/deployment/provers/DeployLineaChildToParent.s.sol b/scripts/deployment/provers/DeployLineaChildToParent.s.sol index 3c5f719..dfa6087 100644 --- a/scripts/deployment/provers/DeployLineaChildToParent.s.sol +++ b/scripts/deployment/provers/DeployLineaChildToParent.s.sol @@ -57,7 +57,7 @@ contract DeployLineaChildToParent is DeployBase { if (pointer == address(0)) { _writeCopy(_chainName(homeChainId), _chainName(targetChainId), prover); - }else { + } else { _writeProver(_chainName(targetChainId), address(pointer), prover); } } diff --git a/scripts/deployment/provers/DeployLineaParentToChild.s.sol b/scripts/deployment/provers/DeployLineaParentToChild.s.sol index 8151324..397f918 100644 --- a/scripts/deployment/provers/DeployLineaParentToChild.s.sol +++ b/scripts/deployment/provers/DeployLineaParentToChild.s.sol @@ -57,7 +57,7 @@ contract DeployLineaParentToChild is DeployBase { if (pointer == address(0)) { _writeCopy(_chainName(homeChainId), _chainName(targetChainId), prover); - }else { + } else { _writeProver(_chainName(targetChainId), address(pointer), prover); } } diff --git a/scripts/deployment/provers/DeployOptimismChildToParent.s.sol b/scripts/deployment/provers/DeployOptimismChildToParent.s.sol index 9e8bafb..26a6897 100644 --- a/scripts/deployment/provers/DeployOptimismChildToParent.s.sol +++ b/scripts/deployment/provers/DeployOptimismChildToParent.s.sol @@ -57,7 +57,7 @@ contract DeployOptimismChildToParent is DeployBase { if (pointer == address(0)) { _writeCopy(_chainName(homeChainId), _chainName(targetChainId), prover); - }else { + } else { _writeProver(_chainName(targetChainId), address(pointer), prover); } } diff --git a/scripts/deployment/provers/DeployOptimismParentToChild.s.sol b/scripts/deployment/provers/DeployOptimismParentToChild.s.sol index 39b2f02..c376b31 100644 --- a/scripts/deployment/provers/DeployOptimismParentToChild.s.sol +++ b/scripts/deployment/provers/DeployOptimismParentToChild.s.sol @@ -60,7 +60,7 @@ contract DeployArbitrumParentToChild is DeployBase { if (pointer == address(0)) { // If the pointer is not deployed, it means that this is a copy of the prover deployed in a different chain. _writeCopy(_chainName(homeChainId), _chainName(targetChainId), address(prover)); - }else { + } else { _writeProver(_chainName(targetChainId), address(pointer), address(prover)); } } diff --git a/scripts/deployment/provers/DeployScrollChildToParent.s.sol b/scripts/deployment/provers/DeployScrollChildToParent.s.sol index 5bd2b1b..0117818 100644 --- a/scripts/deployment/provers/DeployScrollChildToParent.s.sol +++ b/scripts/deployment/provers/DeployScrollChildToParent.s.sol @@ -57,7 +57,7 @@ contract DeployScrollChildToParent is DeployBase { if (pointer == address(0)) { _writeCopy(_chainName(homeChainId), _chainName(targetChainId), prover); - }else { + } else { _writeProver(_chainName(targetChainId), address(pointer), prover); } } diff --git a/scripts/deployment/provers/DeployScrollParentToChild.s.sol b/scripts/deployment/provers/DeployScrollParentToChild.s.sol index 6aad178..56078a4 100644 --- a/scripts/deployment/provers/DeployScrollParentToChild.s.sol +++ b/scripts/deployment/provers/DeployScrollParentToChild.s.sol @@ -60,7 +60,7 @@ contract DeployArbitrumParentToChild is DeployBase { if (pointer == address(0)) { // If the pointer is not deployed, it means that this is a copy of the prover deployed in a different chain. _writeCopy(_chainName(homeChainId), _chainName(targetChainId), address(prover)); - }else { + } else { _writeProver(_chainName(targetChainId), address(pointer), address(prover)); } } From 126bcc32c29bf24ce391389120b1084ab581bf06 Mon Sep 17 00:00:00 2001 From: Luiz Date: Mon, 2 Mar 2026 13:28:42 -0300 Subject: [PATCH 14/19] up --- scripts/deployment/block-hash-pusher/deploy-buffers.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/deployment/block-hash-pusher/deploy-buffers.sh b/scripts/deployment/block-hash-pusher/deploy-buffers.sh index 4a98855..957e6d2 100755 --- a/scripts/deployment/block-hash-pusher/deploy-buffers.sh +++ b/scripts/deployment/block-hash-pusher/deploy-buffers.sh @@ -1,8 +1,8 @@ #!/usr/bin/env bash CHAIN_TYPE=$CHAIN_TYPE \ -PUSHER_CHAIN=$PUSHER_CHAIN \ -BUFFER_CHAIN=$BUFFER_CHAIN \ +PARENT_CHAIN=$PARENT_CHAIN \ +CHILD_CHAIN=$CHILD_CHAIN \ MESSENGER=$MESSENGER \ forge script scripts/deployment/block-hash-pusher/DeployBuffers.s.sol \ --rpc-url "$RPC_URL" \ From 994c3c2f8e406135409a55371c48fa1d1995902a Mon Sep 17 00:00:00 2001 From: Luiz Date: Wed, 4 Mar 2026 10:41:13 -0300 Subject: [PATCH 15/19] update contracts --- deployments/arbitrum-sepolia.json | 11 +-- deployments/ethereum-sepolia.json | 32 +++++---- deployments/linea-sepolia.json | 11 +-- deployments/optimism-sepolia.json | 11 +-- deployments/scroll-sepolia.json | 11 +-- deployments/zksync-sepolia.json | 14 ++-- foundry.toml | 3 +- .../provers/DeployOptimismParentToChild.s.sol | 2 +- .../provers/DeployZkSyncChildToParent.s.sol | 64 +++++++++++++++++ .../provers/DeployZkSyncParentToChild.s.sol | 70 +++++++++++++++++++ .../provers/deploy-child-provers.sh | 7 ++ .../provers/deploy-parent-provers.sh | 11 +++ snapshots/verifyBroadcastMessage.json | 14 ++-- 13 files changed, 214 insertions(+), 47 deletions(-) create mode 100644 scripts/deployment/provers/DeployZkSyncChildToParent.s.sol create mode 100644 scripts/deployment/provers/DeployZkSyncParentToChild.s.sol diff --git a/deployments/arbitrum-sepolia.json b/deployments/arbitrum-sepolia.json index c9bcd86..6fd3ddb 100644 --- a/deployments/arbitrum-sepolia.json +++ b/deployments/arbitrum-sepolia.json @@ -5,15 +5,16 @@ }, "copies": { "ethereum-sepolia": { - "linea-sepolia": "0x0F6977Ae14E8855cE209c73331A009Ba0cF98D1f", - "scroll-sepolia": "0x6A039cC5cd26F2303f599DEb3155605E63a72a05", - "optimism-sepolia": "0x3176E35e6FBaB9775D3A56364BECf17228B9c1f2" + "linea-sepolia": "0x3E36338736c590753F071D90779b0449bD576834", + "scroll-sepolia": "0x2635119429AFE9ed4b5dC38f71D12f1A241231Ec", + "optimism-sepolia": "0x9B22f2bB9a5ECbEd10984f47c1A5FE8C551Fbf6a", + "zksync-sepolia": "0xf5e56d9d93267631f69dB9388d38e9c487830bD4" } }, "provers": { "ethereum-sepolia": { - "pointer": "0xb01db227b4BAb7a0A053A6a7ff610d8D201E4760", - "prover": "0x2a3b34adB9b856679518687399930FA5481F577F" + "pointer": "0x2B48c5BeE8A3C63bbD5f5Be10bFCcda2ab372BF0", + "prover": "0x9b7478a19530735ef5DC022c3f00Bf303acc6950" } } } \ No newline at end of file diff --git a/deployments/ethereum-sepolia.json b/deployments/ethereum-sepolia.json index 4696d60..fb46e37 100644 --- a/deployments/ethereum-sepolia.json +++ b/deployments/ethereum-sepolia.json @@ -3,28 +3,32 @@ "broadcaster": "0x2e6f2Cb4bf4E4D2166F83958442a180825B94248", "receiver": "0x712535fE2e24df51917DB5438EB3dA90437F70AF" }, + "pushers": { + "linea-sepolia": "0x2aC21Fcfd6905eF13FA9bc0F874f3524029cB443", + "scroll-sepolia": "0xF99b4E792aCaBa74cb2d1A5D3fDBDFfe630C0a8e", + "zksync-sepolia": "0xc69281Edb758A5dDD7A13e12b4F3d81b14Bd983B", + "optimism-sepolia": "0x2c4ded0d5883646AEAD86a6C748c871afa819125" + }, "provers": { "arbitrum-sepolia": { - "prover": "0xA7CC6C0A839f3ceF7471D666598068E988AC1D7e", - "pointer": "0x038F368256136B6fd03E3ec9d8cEE62ccdd4234f" + "pointer": "0x95D7Dd7F981ADFaA6a8C8446a2d026Bef16949d6", + "prover": "0x3ed2414D931f28Ef85D2E5e74e509d6FEDB812F6" }, "linea-sepolia": { - "prover": "0x0F6977Ae14E8855cE209c73331A009Ba0cF98D1f", - "pointer": "0x8749C82757f24042ac3ee40F0917Bf0B6679CBC5" + "pointer": "0x99ED6a6C9749D624b2D6aF881cdcaE5248Eb290b", + "prover": "0x3E36338736c590753F071D90779b0449bD576834" }, "scroll-sepolia": { - "prover": "0x6A039cC5cd26F2303f599DEb3155605E63a72a05", - "pointer": "0xe530187F767c1A15D89126aF3c0782f3aE81af3f" + "pointer": "0x3FAe4F166289B46122b8236e948268d7846edeB6", + "prover": "0x2635119429AFE9ed4b5dC38f71D12f1A241231Ec" }, "optimism-sepolia": { - "prover": "0x3176E35e6FBaB9775D3A56364BECf17228B9c1f2", - "pointer": "0x885b1a670443004cb36E9F2d85b15d0fc78Db930" + "pointer": "0xba8A90CE0DF7cCBFd2d8cC47D53BdA0303E4e24a", + "prover": "0x9B22f2bB9a5ECbEd10984f47c1A5FE8C551Fbf6a" + }, + "zksync-sepolia": { + "pointer": "0x7cac647e088b7361953f37C0C3BaA092748b8E7F", + "prover": "0xf5e56d9d93267631f69dB9388d38e9c487830bD4" } - }, - "pushers": { - "linea-sepolia": "0x2aC21Fcfd6905eF13FA9bc0F874f3524029cB443", - "scroll-sepolia": "0xF99b4E792aCaBa74cb2d1A5D3fDBDFfe630C0a8e", - "zksync-sepolia": "0xc69281Edb758A5dDD7A13e12b4F3d81b14Bd983B", - "optimism-sepolia": "0x2c4ded0d5883646AEAD86a6C748c871afa819125" } } \ No newline at end of file diff --git a/deployments/linea-sepolia.json b/deployments/linea-sepolia.json index 2606f78..23a8705 100644 --- a/deployments/linea-sepolia.json +++ b/deployments/linea-sepolia.json @@ -6,15 +6,16 @@ }, "copies": { "ethereum-sepolia": { - "arbitrum-sepolia": "0xA7CC6C0A839f3ceF7471D666598068E988AC1D7e", - "scroll-sepolia": "0x6A039cC5cd26F2303f599DEb3155605E63a72a05", - "optimism-sepolia": "0x3176E35e6FBaB9775D3A56364BECf17228B9c1f2" + "arbitrum-sepolia": "0x3ed2414D931f28Ef85D2E5e74e509d6FEDB812F6", + "scroll-sepolia": "0x2635119429AFE9ed4b5dC38f71D12f1A241231Ec", + "optimism-sepolia": "0x9B22f2bB9a5ECbEd10984f47c1A5FE8C551Fbf6a", + "zksync-sepolia": "0xf5e56d9d93267631f69dB9388d38e9c487830bD4" } }, "provers": { "ethereum-sepolia": { - "pointer": "0xb01db227b4BAb7a0A053A6a7ff610d8D201E4760", - "prover": "0xFeA9cAb4910942249Dac3742d8825036De7cCD7B" + "pointer": "0x2B48c5BeE8A3C63bbD5f5Be10bFCcda2ab372BF0", + "prover": "0xCde1e6b2Dc517838c1eD4544c588e177F83D64E1" } } } \ No newline at end of file diff --git a/deployments/optimism-sepolia.json b/deployments/optimism-sepolia.json index 725a94e..fbe5137 100644 --- a/deployments/optimism-sepolia.json +++ b/deployments/optimism-sepolia.json @@ -6,15 +6,16 @@ }, "copies": { "ethereum-sepolia": { - "arbitrum-sepolia": "0xA7CC6C0A839f3ceF7471D666598068E988AC1D7e", - "linea-sepolia": "0x0F6977Ae14E8855cE209c73331A009Ba0cF98D1f", - "scroll-sepolia": "0x6A039cC5cd26F2303f599DEb3155605E63a72a05" + "arbitrum-sepolia": "0x3ed2414D931f28Ef85D2E5e74e509d6FEDB812F6", + "linea-sepolia": "0x3E36338736c590753F071D90779b0449bD576834", + "scroll-sepolia": "0x2635119429AFE9ed4b5dC38f71D12f1A241231Ec", + "zksync-sepolia": "0xf5e56d9d93267631f69dB9388d38e9c487830bD4" } }, "provers": { "ethereum-sepolia": { - "pointer": "0xb01db227b4BAb7a0A053A6a7ff610d8D201E4760", - "prover": "0xfB896638254EeB15ac5530c63c98d9575c4194E2" + "pointer": "0x2B48c5BeE8A3C63bbD5f5Be10bFCcda2ab372BF0", + "prover": "0xBEFC80AD06A03f1e15c71e370D935a25820a7E19" } } } \ No newline at end of file diff --git a/deployments/scroll-sepolia.json b/deployments/scroll-sepolia.json index dd9da25..9162b8e 100644 --- a/deployments/scroll-sepolia.json +++ b/deployments/scroll-sepolia.json @@ -6,15 +6,16 @@ }, "copies": { "ethereum-sepolia": { - "arbitrum-sepolia": "0xA7CC6C0A839f3ceF7471D666598068E988AC1D7e", - "linea-sepolia": "0x0F6977Ae14E8855cE209c73331A009Ba0cF98D1f", - "optimism-sepolia": "0x3176E35e6FBaB9775D3A56364BECf17228B9c1f2" + "arbitrum-sepolia": "0x3ed2414D931f28Ef85D2E5e74e509d6FEDB812F6", + "linea-sepolia": "0x3E36338736c590753F071D90779b0449bD576834", + "optimism-sepolia": "0x9B22f2bB9a5ECbEd10984f47c1A5FE8C551Fbf6a", + "zksync-sepolia": "0xf5e56d9d93267631f69dB9388d38e9c487830bD4" } }, "provers": { "ethereum-sepolia": { - "pointer": "0xb01db227b4BAb7a0A053A6a7ff610d8D201E4760", - "prover": "0x9CE8264cEbA3c9D5C527d20A002c019Fa14e4CC4" + "pointer": "0x2B48c5BeE8A3C63bbD5f5Be10bFCcda2ab372BF0", + "prover": "0x852060961640ff9569946000E049c44c13bCEe98" } } } \ No newline at end of file diff --git a/deployments/zksync-sepolia.json b/deployments/zksync-sepolia.json index 94ac55d..0341321 100644 --- a/deployments/zksync-sepolia.json +++ b/deployments/zksync-sepolia.json @@ -6,10 +6,16 @@ }, "copies": { "ethereum-sepolia": { - "arbitrum-sepolia": "0xA7CC6C0A839f3ceF7471D666598068E988AC1D7e", - "linea-sepolia": "0x0F6977Ae14E8855cE209c73331A009Ba0cF98D1f", - "scroll-sepolia": "0x6A039cC5cd26F2303f599DEb3155605E63a72a05", - "optimism-sepolia": "0x3176E35e6FBaB9775D3A56364BECf17228B9c1f2" + "arbitrum-sepolia": "0x3ed2414D931f28Ef85D2E5e74e509d6FEDB812F6", + "linea-sepolia": "0x3E36338736c590753F071D90779b0449bD576834", + "scroll-sepolia": "0x2635119429AFE9ed4b5dC38f71D12f1A241231Ec", + "optimism-sepolia": "0x9B22f2bB9a5ECbEd10984f47c1A5FE8C551Fbf6a" + } + }, + "provers": { + "ethereum-sepolia": { + "pointer": "0x2B48c5BeE8A3C63bbD5f5Be10bFCcda2ab372BF0", + "prover": "0xAD72b787ECCEA11C97770207862BF0a3c35C138e" } } } \ No newline at end of file diff --git a/foundry.toml b/foundry.toml index f341665..a3750be 100644 --- a/foundry.toml +++ b/foundry.toml @@ -4,7 +4,8 @@ out = "out" libs = ["lib"] solc = "0.8.30" script = "scripts" - +optimizer = true +optimizer_runs = 200 via_ir = true fs_permissions = [ diff --git a/scripts/deployment/provers/DeployOptimismParentToChild.s.sol b/scripts/deployment/provers/DeployOptimismParentToChild.s.sol index c376b31..120b507 100644 --- a/scripts/deployment/provers/DeployOptimismParentToChild.s.sol +++ b/scripts/deployment/provers/DeployOptimismParentToChild.s.sol @@ -7,7 +7,7 @@ import {console} from "forge-std/console.sol"; import {ParentToChildProver} from "src/contracts/provers/optimism/ParentToChildProver.sol"; import {StateProverPointer} from "src/contracts/StateProverPointer.sol"; -contract DeployArbitrumParentToChild is DeployBase { +contract DeployOptimismParentToChild is DeployBase { function run() public { address anchorStateRegistry = vm.envAddress("ANCHOR_STATE_REGISTRY"); uint256 anchorGameSlot = vm.envUint("ANCHOR_GAME_SLOT"); diff --git a/scripts/deployment/provers/DeployZkSyncChildToParent.s.sol b/scripts/deployment/provers/DeployZkSyncChildToParent.s.sol new file mode 100644 index 0000000..b109455 --- /dev/null +++ b/scripts/deployment/provers/DeployZkSyncChildToParent.s.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.30; + +import {DeployBase} from "../DeployBase.s.sol"; + +import {console} from "forge-std/console.sol"; +import {ChildToParentProver} from "src/contracts/provers/zksync/ChildToParentProver.sol"; +import {StateProverPointer} from "src/contracts/StateProverPointer.sol"; + +contract DeployZkSyncChildToParent is DeployBase { + function run() public { + uint256 homeChainId = vm.envUint("HOME_CHAIN_ID"); + uint256 targetChainId = vm.envUint("TARGET_CHAIN_ID"); + address owner = vm.envAddress("OWNER"); + + address prover; + address pointer; + if (block.chainid == targetChainId) { + return; + } + vm.startBroadcast(); + if ( + (block.chainid == homeChainId && _isProverDeployed(_chainName(targetChainId))) + || (block.chainid != homeChainId && _isCopyDeployed(_chainName(homeChainId), _chainName(targetChainId))) + ) { + vm.stopBroadcast(); + console.log("Prover or copy already deployed on chain ", _chainName(block.chainid)); + return; + } + address buffer = _getBufferAddress(_chainName(homeChainId)); + if (buffer == address(0)) { + revert InvalidBufferAddress(); + } + bytes memory proverCreationCode = + abi.encodePacked(type(ChildToParentProver).creationCode, abi.encode(buffer, homeChainId)); + prover = _deploy(proverCreationCode, bytes32(0)); + if (prover == address(0)) { + console.log("Failed to deploy prover on chain ", _chainName(block.chainid)); + vm.stopBroadcast(); + revert DeploymentFailed(); + } + + // Only deploy the pointer on the "canonical" chain, i.e., the chain where the pointer will be called from the receiver directly. + // The other prover deployments are copies. + if (block.chainid == homeChainId) { + bytes memory pointerCreationCode = + abi.encodePacked(type(StateProverPointer).creationCode, abi.encode(owner)); + pointer = _deploy(pointerCreationCode, bytes32(targetChainId)); + if (pointer != address(0)) { + if (StateProverPointer(pointer).implementationAddress() == address(0)) { + // This will only work if `msg.sender` is the owner of the pointer. + StateProverPointer(pointer).setImplementationAddress(address(prover)); + } + } + } + vm.stopBroadcast(); + + if (pointer == address(0)) { + _writeCopy(_chainName(homeChainId), _chainName(targetChainId), prover); + } else { + _writeProver(_chainName(targetChainId), address(pointer), prover); + } + } +} diff --git a/scripts/deployment/provers/DeployZkSyncParentToChild.s.sol b/scripts/deployment/provers/DeployZkSyncParentToChild.s.sol new file mode 100644 index 0000000..6044a5c --- /dev/null +++ b/scripts/deployment/provers/DeployZkSyncParentToChild.s.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.30; + +import {DeployBase} from "../DeployBase.s.sol"; + +import {console} from "forge-std/console.sol"; +import {ParentToChildProver} from "src/contracts/provers/zksync/ParentToChildProver.sol"; +import {StateProverPointer} from "src/contracts/StateProverPointer.sol"; + +contract DeployZkSyncParentToChild is DeployBase { + function run() public { + address gatewayZkChain = vm.envAddress("GATEWAY_ZK_CHAIN"); + uint256 l2LogsRootHashSlot = vm.envUint("L2_LOGS_ROOT_HASH_SLOT"); + uint256 childChainId = vm.envUint("CHILD_CHAIN_ID"); + uint256 gatewayChainId = vm.envUint("GATEWAY_CHAIN_ID"); + address owner = vm.envAddress("OWNER"); + + uint256 homeChainId = vm.envUint("HOME_CHAIN_ID"); + uint256 targetChainId = vm.envUint("TARGET_CHAIN_ID"); + + address prover; + address pointer; + if (block.chainid == targetChainId) { + return; + } + vm.startBroadcast(); + if ( + (block.chainid == homeChainId && _isProverDeployed(_chainName(targetChainId))) + || (block.chainid != homeChainId && _isCopyDeployed(_chainName(homeChainId), _chainName(targetChainId))) + ) { + vm.stopBroadcast(); + console.log("Prover or copy already deployed on chain ", _chainName(block.chainid)); + return; + } + + bytes memory proverCreationCode = abi.encodePacked( + type(ParentToChildProver).creationCode, + abi.encode(gatewayZkChain, l2LogsRootHashSlot, childChainId, gatewayChainId, homeChainId) + ); + prover = _deploy(proverCreationCode, bytes32(0)); + + if (prover == address(0)) { + console.log("Failed to deploy prover on chain ", _chainName(block.chainid)); + vm.stopBroadcast(); + revert DeploymentFailed(); + } + + // Only deploy the pointer on the "canonical" chain, i.e., the chain where the pointer will be called from the receiver directly. + // The other prover deployments are copies. + if (block.chainid == homeChainId) { + bytes memory pointerCreationCode = + abi.encodePacked(type(StateProverPointer).creationCode, abi.encode(owner)); + pointer = _deploy(pointerCreationCode, bytes32(targetChainId)); + if (pointer != address(0)) { + if (StateProverPointer(pointer).implementationAddress() == address(0)) { + // This will only work if `msg.sender` is the owner of the pointer. + StateProverPointer(pointer).setImplementationAddress(address(prover)); + } + } + } + vm.stopBroadcast(); + + if (pointer == address(0)) { + // If the pointer is not deployed, it means that this is a copy of the prover deployed in a different chain. + _writeCopy(_chainName(homeChainId), _chainName(targetChainId), address(prover)); + } else { + _writeProver(_chainName(targetChainId), address(pointer), address(prover)); + } + } +} diff --git a/scripts/deployment/provers/deploy-child-provers.sh b/scripts/deployment/provers/deploy-child-provers.sh index 815c89e..0d952a1 100755 --- a/scripts/deployment/provers/deploy-child-provers.sh +++ b/scripts/deployment/provers/deploy-child-provers.sh @@ -26,4 +26,11 @@ TARGET_CHAIN_ID=$ETHEREUM_SEPOLIA_CHAIN_ID \ forge script scripts/deployment/provers/DeployOptimismChildToParent.s.sol \ --rpc-url "$OPTIMISM_SEPOLIA_RPC_URL" \ --private-key "$DEPLOYER_PRIVATE_KEY" \ + --broadcast + +HOME_CHAIN_ID=$ZKSYNC_SEPOLIA_CHAIN_ID \ +TARGET_CHAIN_ID=$ETHEREUM_SEPOLIA_CHAIN_ID \ +forge script scripts/deployment/provers/DeployZkSyncChildToParent.s.sol \ + --rpc-url "$ZKSYNC_SEPOLIA_RPC_URL" \ + --private-key "$DEPLOYER_PRIVATE_KEY" \ --broadcast \ No newline at end of file diff --git a/scripts/deployment/provers/deploy-parent-provers.sh b/scripts/deployment/provers/deploy-parent-provers.sh index c7f0e2e..8016189 100755 --- a/scripts/deployment/provers/deploy-parent-provers.sh +++ b/scripts/deployment/provers/deploy-parent-provers.sh @@ -39,6 +39,17 @@ forge script scripts/deployment/provers/DeployOptimismParentToChild.s.sol \ --private-key "$DEPLOYER_PRIVATE_KEY" \ --broadcast +GATEWAY_ZK_CHAIN=$ZKSYNC_SEPOLIA_GATEWAY_ZK_CHAIN \ +L2_LOGS_ROOT_HASH_SLOT=$ZKSYNC_SEPOLIA_L2_LOGS_ROOT_HASH_SLOT \ +CHILD_CHAIN_ID=$ZKSYNC_SEPOLIA_CHAIN_ID \ +GATEWAY_CHAIN_ID=$ZKSYNC_SEPOLIA_GATEWAY_CHAIN_ID \ +HOME_CHAIN_ID=$ETHEREUM_SEPOLIA_CHAIN_ID \ +TARGET_CHAIN_ID=$ZKSYNC_SEPOLIA_CHAIN_ID \ +forge script scripts/deployment/provers/DeployZkSyncParentToChild.s.sol \ + --rpc-url "$RPC_URL" \ + --private-key "$DEPLOYER_PRIVATE_KEY" \ + --broadcast + diff --git a/snapshots/verifyBroadcastMessage.json b/snapshots/verifyBroadcastMessage.json index 9082634..4979f65 100644 --- a/snapshots/verifyBroadcastMessage.json +++ b/snapshots/verifyBroadcastMessage.json @@ -1,9 +1,9 @@ { - "EthereumToOptimism": "1642699", - "EthereumToTaikoL2": "1052266", - "LineaL2ToEthereum": "2551828", - "ScrollL2ToEthereum": "1361992", - "ScrollToOptimism": "1352078", - "TaikoL2ToEthereum": "1022329", - "ZkSyncL2ToEthereum": "125715" + "EthereumToOptimism": "541852", + "EthereumToTaikoL2": "334900", + "LineaL2ToEthereum": "2310786", + "ScrollL2ToEthereum": "459836", + "ScrollToOptimism": "453497", + "TaikoL2ToEthereum": "329078", + "ZkSyncL2ToEthereum": "49117" } \ No newline at end of file From 1dcc2a4c90fd8d53544f54f2e1e6c10bcb568d48 Mon Sep 17 00:00:00 2001 From: Luiz Date: Wed, 11 Mar 2026 16:09:50 -0300 Subject: [PATCH 16/19] remove SEPOLIA from env variables --- .env.example | 55 ++++++++++++------- scripts/deployment/deploy.sh | 48 ++++++++-------- .../provers/deploy-child-provers.sh | 30 +++++----- .../provers/deploy-parent-provers.sh | 42 +++++++------- scripts/generate-optimism-test-payloads.ts | 2 +- 5 files changed, 96 insertions(+), 81 deletions(-) diff --git a/.env.example b/.env.example index bc1fde4..952bdfd 100644 --- a/.env.example +++ b/.env.example @@ -1,32 +1,47 @@ -ARBITRUM_SEPOLIA_RPC_URL= -ETHEREUM_SEPOLIA_RPC_URL= -ZKSYNC_SEPOLIA_RPC_URL= -OPTIMISM_SEPOLIA_RPC_URL= -LINEA_SEPOLIA_RPC_URL= -SCROLL_SEPOLIA_RPC_URL= +ARBITRUM_RPC_URL= +ETHEREUM_RPC_URL= +ZKSYNC_RPC_URL= +OPTIMISM_RPC_URL= +LINEA_RPC_URL= +SCROLL_RPC_URL= -ONWER=0x9a56fFd72F4B526c523C733F1F74197A51c495E1 +OWNER=0xCc2ACDd7eF3e9841d42E00199D4cF5bcdCa77a7e DEPLOYER_PRIVATE_KEY= -ETHEREUM_SEPOLIA_CHAIN_ID=11155111 - +ETHEREUM_CHAIN_ID= # Arbitrum Envs -ARBITRUM_SEPOLIA_CHAIN_ID=421614 -ARBITRUM_SEPOLIA_OUTBOX=0x65f07C7D521164a4d5DaC6eB8Fac8DA067A3B78F -ARBITRUM_SEPOLIA_ROOTS_SLOT=3 +ARBITRUM_CHAIN_ID= +ARBITRUM_OUTBOX= +ARBITRUM_ROOTS_SLOT= #Linea Envs -LINEA_SEPOLIA_CHAIN_ID=59141 -LINEA_SEPOLIA_ROLLUP=0xB218f8A4Bc926cF1cA7b3423c154a0D627Bdb7E5 -LINEA_SEPOLIA_STATE_ROOT_HASHES_SLOT=282 +LINEA_CHAIN_ID= +LINEA_ROLLUP= +LINEA_STATE_ROOT_HASHES_SLOT= +LINEA_L2_MESSAGE_SERVICE= # Scroll Envs -SCROLL_SEPOLIA_CHAIN_ID=534351 -SCROLL_CHAIN_SEPOLIA=0x2D567EcE699Eabe5afCd141eDB7A4f2D0D6ce8a0 -SCROLL_SEPOLIA_FINALIZED_STATE_ROOT_SLOT=158 +SCROLL_CHAIN_ID= +SCROLL_CHAIN_SEPOLIA= +SCROLL_FINALIZED_STATE_ROOT_SLOT= +SCROLL_L1_SCROLL_MESSENGER= +SCROLL_L2_SCROLL_MESSENGER= # Optimism Envs -OPTIMISM_SEPOLIA_CHAIN_ID=11155420 -OPTIMISM_SEPOLIA_ANCHOR_STATE_REGISTRY=0xa1Cec548926eb5d69aa3B7B57d371EdBdD03e64b \ No newline at end of file +OPTIMISM_CHAIN_ID= +OPTIMISM_ANCHOR_GAME_SLOT= +OPTIMISM_ANCHOR_STATE_REGISTRY= +OPTIMISM_L1_CROSS_DOMAIN_MESSENGER_PROXY= +OPTIMISM_L2_CROSS_DOMAIN_MESSENGER= + +# ZkSync Envs +ZKSYNC_CHAIN_ID= +ZKSYNC_DIAMOND= +ZKSYNC_GATEWAY_ZK_CHAIN= +ZKSYNC_L2_LOGS_ROOT_HASH_SLOT= +ZKSYNC_GATEWAY_CHAIN_ID= + + + diff --git a/scripts/deployment/deploy.sh b/scripts/deployment/deploy.sh index 1e68010..683b76f 100644 --- a/scripts/deployment/deploy.sh +++ b/scripts/deployment/deploy.sh @@ -12,32 +12,32 @@ chmod +x scripts/deployment/deploy-protocol.sh echo "Deploying Broadcaster and Receiver contracts on Ethereum Sepolia..." CHAIN_TYPE="ethereum" \ -RPC_URL="$ETHEREUM_SEPOLIA_RPC_URL" \ +RPC_URL="$ETHEREUM_RPC_URL" \ ./scripts/deployment/deploy-protocol.sh echo "Deploying Broadcaster and Receiver contracts on Arbitrum Sepolia..." CHAIN_TYPE="arbitrum" \ -RPC_URL="$ARBITRUM_SEPOLIA_RPC_URL" \ +RPC_URL="$ARBITRUM_RPC_URL" \ ./scripts/deployment/deploy-protocol.sh echo "Deploying Broadcaster and Receiver contracts on Linea Sepolia..." CHAIN_TYPE="linea" \ -RPC_URL="$LINEA_SEPOLIA_RPC_URL" \ +RPC_URL="$LINEA_RPC_URL" \ ./scripts/deployment/deploy-protocol.sh echo "Deploying Broadcaster and Receiver contracts on Scroll Sepolia..." CHAIN_TYPE="scroll" \ -RPC_URL="$SCROLL_SEPOLIA_RPC_URL" \ +RPC_URL="$SCROLL_RPC_URL" \ ./scripts/deployment/deploy-protocol.sh echo "Deploying Broadcaster and Receiver contracts on Optimism Sepolia..." CHAIN_TYPE="optimism" \ -RPC_URL="$OPTIMISM_SEPOLIA_RPC_URL" \ +RPC_URL="$OPTIMISM_RPC_URL" \ ./scripts/deployment/deploy-protocol.sh echo "Deploying Broadcaster and Receiver contracts on ZkSync Sepolia..." CHAIN_TYPE="zksync" \ -RPC_URL="$ZKSYNC_SEPOLIA_RPC_URL" \ +RPC_URL="$ZKSYNC_RPC_URL" \ ./scripts/deployment/deploy-protocol.sh @@ -48,27 +48,27 @@ chmod +x scripts/deployment/provers/deploy-parent-provers.sh # Ethereum Sepolia echo "Deploying ParentToChildProver contracts on Ethereum Sepolia..." -RPC_URL="$ETHEREUM_SEPOLIA_RPC_URL" ./scripts/deployment/provers/deploy-parent-provers.sh +RPC_URL="$ETHEREUM_RPC_URL" ./scripts/deployment/provers/deploy-parent-provers.sh # Arbitrum Sepolia echo "Deploying ParentToChildProver contracts on Arbitrum Sepolia..." -RPC_URL="$ARBITRUM_SEPOLIA_RPC_URL" ./scripts/deployment/provers/deploy-parent-provers.sh +RPC_URL="$ARBITRUM_RPC_URL" ./scripts/deployment/provers/deploy-parent-provers.sh # Linea Sepolia echo "Deploying ParentToChildProver contracts on Linea Sepolia..." -RPC_URL="$LINEA_SEPOLIA_RPC_URL" ./scripts/deployment/provers/deploy-parent-provers.sh +RPC_URL="$LINEA_RPC_URL" ./scripts/deployment/provers/deploy-parent-provers.sh # Scroll Sepolia echo "Deploying ParentToChildProver contracts on Scroll Sepolia..." -RPC_URL="$SCROLL_SEPOLIA_RPC_URL" ./scripts/deployment/provers/deploy-parent-provers.sh +RPC_URL="$SCROLL_RPC_URL" ./scripts/deployment/provers/deploy-parent-provers.sh # Optimism Sepolia echo "Deploying ParentToChildProver contracts on Optimism Sepolia..." -RPC_URL="$OPTIMISM_SEPOLIA_RPC_URL" ./scripts/deployment/provers/deploy-parent-provers.sh +RPC_URL="$OPTIMISM_RPC_URL" ./scripts/deployment/provers/deploy-parent-provers.sh # ZkSync Sepolia echo "Deploying ParentToChildProver contracts on ZkSync Sepolia..." -RPC_URL="$ZKSYNC_SEPOLIA_RPC_URL" ./scripts/deployment/provers/deploy-parent-provers.sh +RPC_URL="$ZKSYNC_RPC_URL" ./scripts/deployment/provers/deploy-parent-provers.sh # ======================================================================================== @@ -78,11 +78,11 @@ chmod +x scripts/deployment/block-hash-pusher/deploy-pushers.sh # Ethereum Sepolia echo "Deploying Pushers contracts on Ethereum Sepolia..." -LINEA_ROLLUP="$LINEA_SEPOLIA_ROLLUP" \ -L1_SCROLL_MESSENGER="$SCROLL_SEPOLIA_L1_SCROLL_MESSENGER" \ -ZKSYNC_DIAMOND="$ZKSYNC_SEPOLIA_DIAMOND" \ -OP_L1_CROSS_DOMAIN_MESSENGER_PROXY="$OPTIMISM_SEPOLIA_L1_CROSS_DOMAIN_MESSENGER_PROXY" \ -RPC_URL="$ETHEREUM_SEPOLIA_RPC_URL" ./scripts/deployment/block-hash-pusher/deploy-pushers.sh +LINEA_ROLLUP="$LINEA_ROLLUP" \ +L1_SCROLL_MESSENGER="$SCROLL_L1_SCROLL_MESSENGER" \ +ZKSYNC_DIAMOND="$ZKSYNC_DIAMOND" \ +OP_L1_CROSS_DOMAIN_MESSENGER_PROXY="$OPTIMISM_L1_CROSS_DOMAIN_MESSENGER_PROXY" \ +RPC_URL="$ETHEREUM_RPC_URL" ./scripts/deployment/block-hash-pusher/deploy-pushers.sh # ======================================================================================== # Deploy Buffers contracts @@ -96,16 +96,16 @@ echo "Deploying Buffer contract for Linea Sepolia..." CHAIN_TYPE="linea" \ PARENT_CHAIN="ethereum-sepolia" \ CHILD_CHAIN="linea-sepolia" \ -MESSENGER="$LINEA_SEPOLIA_L2_MESSAGE_SERVICE" \ -RPC_URL="$LINEA_SEPOLIA_RPC_URL" ./scripts/deployment/block-hash-pusher/deploy-buffers.sh +MESSENGER="$LINEA_L2_MESSAGE_SERVICE" \ +RPC_URL="$LINEA_RPC_URL" ./scripts/deployment/block-hash-pusher/deploy-buffers.sh # Scroll Sepolia echo "Deploying Buffer contract for Scroll Sepolia..." CHAIN_TYPE="scroll" \ PARENT_CHAIN="ethereum-sepolia" \ CHILD_CHAIN="scroll-sepolia" \ -MESSENGER="$SCROLL_SEPOLIA_L2_SCROLL_MESSENGER" \ -RPC_URL="$SCROLL_SEPOLIA_RPC_URL" ./scripts/deployment/block-hash-pusher/deploy-buffers.sh +MESSENGER="$SCROLL_L2_SCROLL_MESSENGER" \ +RPC_URL="$SCROLL_RPC_URL" ./scripts/deployment/block-hash-pusher/deploy-buffers.sh # ZkSync Sepolia echo "Deploying Buffer contract for ZkSync Sepolia..." @@ -113,15 +113,15 @@ CHAIN_TYPE="zksync" \ PARENT_CHAIN="ethereum-sepolia" \ CHILD_CHAIN="zksync-sepolia" \ MESSENGER=0x0000000000000000000000000000000000000000 \ -RPC_URL="$ZKSYNC_SEPOLIA_RPC_URL" ./scripts/deployment/block-hash-pusher/deploy-buffers.sh +RPC_URL="$ZKSYNC_RPC_URL" ./scripts/deployment/block-hash-pusher/deploy-buffers.sh # Optimism Sepolia echo "Deploying Buffer contract for Optimism Sepolia..." CHAIN_TYPE="optimism" \ PARENT_CHAIN="ethereum-sepolia" \ CHILD_CHAIN="optimism-sepolia" \ -MESSENGER="$OPTIMISM_SEPOLIA_L2_CROSS_DOMAIN_MESSENGER" \ -RPC_URL="$OPTIMISM_SEPOLIA_RPC_URL" ./scripts/deployment/block-hash-pusher/deploy-buffers.sh +MESSENGER="$OPTIMISM_L2_CROSS_DOMAIN_MESSENGER" \ +RPC_URL="$OPTIMISM_RPC_URL" ./scripts/deployment/block-hash-pusher/deploy-buffers.sh # ======================================================================================== # Deploy ChildToParentProver contracts diff --git a/scripts/deployment/provers/deploy-child-provers.sh b/scripts/deployment/provers/deploy-child-provers.sh index 0d952a1..2cb11ec 100755 --- a/scripts/deployment/provers/deploy-child-provers.sh +++ b/scripts/deployment/provers/deploy-child-provers.sh @@ -1,36 +1,36 @@ #!/usr/bin/env bash -HOME_CHAIN_ID=$ARBITRUM_SEPOLIA_CHAIN_ID \ -TARGET_CHAIN_ID=$ETHEREUM_SEPOLIA_CHAIN_ID \ +HOME_CHAIN_ID=$ARBITRUM_CHAIN_ID \ +TARGET_CHAIN_ID=$ETHEREUM_CHAIN_ID \ forge script scripts/deployment/provers/DeployArbitrumChildToParent.s.sol \ - --rpc-url "$ARBITRUM_SEPOLIA_RPC_URL" \ + --rpc-url "$ARBITRUM_RPC_URL" \ --private-key "$DEPLOYER_PRIVATE_KEY" \ --broadcast -HOME_CHAIN_ID=$LINEA_SEPOLIA_CHAIN_ID \ -TARGET_CHAIN_ID=$ETHEREUM_SEPOLIA_CHAIN_ID \ +HOME_CHAIN_ID=$LINEA_CHAIN_ID \ +TARGET_CHAIN_ID=$ETHEREUM_CHAIN_ID \ forge script scripts/deployment/provers/DeployLineaChildToParent.s.sol \ - --rpc-url "$LINEA_SEPOLIA_RPC_URL" \ + --rpc-url "$LINEA_RPC_URL" \ --private-key "$DEPLOYER_PRIVATE_KEY" \ --broadcast -HOME_CHAIN_ID=$SCROLL_SEPOLIA_CHAIN_ID \ -TARGET_CHAIN_ID=$ETHEREUM_SEPOLIA_CHAIN_ID \ +HOME_CHAIN_ID=$SCROLL_CHAIN_ID \ +TARGET_CHAIN_ID=$ETHEREUM_CHAIN_ID \ forge script scripts/deployment/provers/DeployScrollChildToParent.s.sol \ - --rpc-url "$SCROLL_SEPOLIA_RPC_URL" \ + --rpc-url "$SCROLL_RPC_URL" \ --private-key "$DEPLOYER_PRIVATE_KEY" \ --broadcast -HOME_CHAIN_ID=$OPTIMISM_SEPOLIA_CHAIN_ID \ -TARGET_CHAIN_ID=$ETHEREUM_SEPOLIA_CHAIN_ID \ +HOME_CHAIN_ID=$OPTIMISM_CHAIN_ID \ +TARGET_CHAIN_ID=$ETHEREUM_CHAIN_ID \ forge script scripts/deployment/provers/DeployOptimismChildToParent.s.sol \ - --rpc-url "$OPTIMISM_SEPOLIA_RPC_URL" \ + --rpc-url "$OPTIMISM_RPC_URL" \ --private-key "$DEPLOYER_PRIVATE_KEY" \ --broadcast -HOME_CHAIN_ID=$ZKSYNC_SEPOLIA_CHAIN_ID \ -TARGET_CHAIN_ID=$ETHEREUM_SEPOLIA_CHAIN_ID \ +HOME_CHAIN_ID=$ZKSYNC_CHAIN_ID \ +TARGET_CHAIN_ID=$ETHEREUM_CHAIN_ID \ forge script scripts/deployment/provers/DeployZkSyncChildToParent.s.sol \ - --rpc-url "$ZKSYNC_SEPOLIA_RPC_URL" \ + --rpc-url "$ZKSYNC_RPC_URL" \ --private-key "$DEPLOYER_PRIVATE_KEY" \ --broadcast \ No newline at end of file diff --git a/scripts/deployment/provers/deploy-parent-provers.sh b/scripts/deployment/provers/deploy-parent-provers.sh index 8016189..e553ead 100755 --- a/scripts/deployment/provers/deploy-parent-provers.sh +++ b/scripts/deployment/provers/deploy-parent-provers.sh @@ -1,19 +1,19 @@ #!/usr/bin/env bash -OUTBOX=$ARBITRUM_SEPOLIA_OUTBOX \ -ROOTS_SLOT=$ARBITRUM_SEPOLIA_ROOTS_SLOT \ -HOME_CHAIN_ID=$ETHEREUM_SEPOLIA_CHAIN_ID \ -TARGET_CHAIN_ID=$ARBITRUM_SEPOLIA_CHAIN_ID \ +OUTBOX=$ARBITRUM_OUTBOX \ +ROOTS_SLOT=$ARBITRUM_ROOTS_SLOT \ +HOME_CHAIN_ID=$ETHEREUM_CHAIN_ID \ +TARGET_CHAIN_ID=$ARBITRUM_CHAIN_ID \ forge script scripts/deployment/provers/DeployArbitrumParentToChild.s.sol \ --rpc-url "$RPC_URL" \ --private-key "$DEPLOYER_PRIVATE_KEY" \ --broadcast -ROLLUP=$LINEA_SEPOLIA_ROLLUP \ -STATE_ROOT_HASHES_SLOT=$LINEA_SEPOLIA_STATE_ROOT_HASHES_SLOT \ -HOME_CHAIN_ID=$ETHEREUM_SEPOLIA_CHAIN_ID \ -TARGET_CHAIN_ID=$LINEA_SEPOLIA_CHAIN_ID \ +ROLLUP=$LINEA_ROLLUP \ +STATE_ROOT_HASHES_SLOT=$LINEA_STATE_ROOT_HASHES_SLOT \ +HOME_CHAIN_ID=$ETHEREUM_CHAIN_ID \ +TARGET_CHAIN_ID=$LINEA_CHAIN_ID \ forge script scripts/deployment/provers/DeployLineaParentToChild.s.sol \ --rpc-url "$RPC_URL" \ --private-key "$DEPLOYER_PRIVATE_KEY" \ @@ -21,30 +21,30 @@ forge script scripts/deployment/provers/DeployLineaParentToChild.s.sol \ SCROLL_CHAIN=$SCROLL_CHAIN_SEPOLIA \ -FINALIZED_STATE_ROOTS_SLOT=$SCROLL_SEPOLIA_FINALIZED_STATE_ROOT_SLOT \ -HOME_CHAIN_ID=$ETHEREUM_SEPOLIA_CHAIN_ID \ -TARGET_CHAIN_ID=$SCROLL_SEPOLIA_CHAIN_ID \ +FINALIZED_STATE_ROOTS_SLOT=$SCROLL_FINALIZED_STATE_ROOT_SLOT \ +HOME_CHAIN_ID=$ETHEREUM_CHAIN_ID \ +TARGET_CHAIN_ID=$SCROLL_CHAIN_ID \ forge script scripts/deployment/provers/DeployScrollParentToChild.s.sol \ --rpc-url "$RPC_URL" \ --private-key "$DEPLOYER_PRIVATE_KEY" \ --broadcast -ANCHOR_STATE_REGISTRY=$OPTIMISM_SEPOLIA_ANCHOR_STATE_REGISTRY \ -ANCHOR_GAME_SLOT=$OPTIMISM_SEPOLIA_ANCHOR_GAME_SLOT \ -HOME_CHAIN_ID=$ETHEREUM_SEPOLIA_CHAIN_ID \ -TARGET_CHAIN_ID=$OPTIMISM_SEPOLIA_CHAIN_ID \ +ANCHOR_STATE_REGISTRY=$OPTIMISM_ANCHOR_STATE_REGISTRY \ +ANCHOR_GAME_SLOT=$OPTIMISM_ANCHOR_GAME_SLOT \ +HOME_CHAIN_ID=$ETHEREUM_CHAIN_ID \ +TARGET_CHAIN_ID=$OPTIMISM_CHAIN_ID \ forge script scripts/deployment/provers/DeployOptimismParentToChild.s.sol \ --rpc-url "$RPC_URL" \ --private-key "$DEPLOYER_PRIVATE_KEY" \ --broadcast -GATEWAY_ZK_CHAIN=$ZKSYNC_SEPOLIA_GATEWAY_ZK_CHAIN \ -L2_LOGS_ROOT_HASH_SLOT=$ZKSYNC_SEPOLIA_L2_LOGS_ROOT_HASH_SLOT \ -CHILD_CHAIN_ID=$ZKSYNC_SEPOLIA_CHAIN_ID \ -GATEWAY_CHAIN_ID=$ZKSYNC_SEPOLIA_GATEWAY_CHAIN_ID \ -HOME_CHAIN_ID=$ETHEREUM_SEPOLIA_CHAIN_ID \ -TARGET_CHAIN_ID=$ZKSYNC_SEPOLIA_CHAIN_ID \ +GATEWAY_ZK_CHAIN=$ZKSYNC_GATEWAY_ZK_CHAIN \ +L2_LOGS_ROOT_HASH_SLOT=$ZKSYNC_L2_LOGS_ROOT_HASH_SLOT \ +CHILD_CHAIN_ID=$ZKSYNC_CHAIN_ID \ +GATEWAY_CHAIN_ID=$ZKSYNC_GATEWAY_CHAIN_ID \ +HOME_CHAIN_ID=$ETHEREUM_CHAIN_ID \ +TARGET_CHAIN_ID=$ZKSYNC_CHAIN_ID \ forge script scripts/deployment/provers/DeployZkSyncParentToChild.s.sol \ --rpc-url "$RPC_URL" \ --private-key "$DEPLOYER_PRIVATE_KEY" \ diff --git a/scripts/generate-optimism-test-payloads.ts b/scripts/generate-optimism-test-payloads.ts index f94cc25..9518280 100644 --- a/scripts/generate-optimism-test-payloads.ts +++ b/scripts/generate-optimism-test-payloads.ts @@ -16,7 +16,7 @@ import { OptimismChildToParentProverHelper } from '../src/ts/optimism/ChildToPar import fs from 'fs' import path from 'path' -const OPTIMISM_SEPOLIA_RPC = process.env.OPTIMISM_SEPOLIA_RPC_URL || 'https://sepolia.optimism.io' +const OPTIMISM_SEPOLIA_RPC = process.env.OPTIMISM_RPC_URL || 'https://sepolia.optimism.io' const SEPOLIA_RPC = process.env.ETHEREUM_RPC_URL || 'https://ethereum-sepolia-rpc.publicnode.com' async function main() { From 1296dadbe77020295e2d2cb02c5eb70949302c17 Mon Sep 17 00:00:00 2001 From: Luiz Date: Wed, 11 Mar 2026 16:26:05 -0300 Subject: [PATCH 17/19] update addresses --- deployments/linea-sepolia.json | 3 +- deployments/optimism-sepolia.json | 3 +- deployments/scroll-sepolia.json | 3 +- deployments/zksync-sepolia.json | 3 +- scripts/deployment/DeployBase.s.sol | 7 ++ .../block-hash-pusher/DeployPushers.s.sol | 9 +++ .../block-hash-pusher/deploy-pushers.sh | 4 -- scripts/deployment/deploy.sh | 68 +++++++++---------- 8 files changed, 56 insertions(+), 44 deletions(-) diff --git a/deployments/linea-sepolia.json b/deployments/linea-sepolia.json index 23a8705..7040372 100644 --- a/deployments/linea-sepolia.json +++ b/deployments/linea-sepolia.json @@ -2,7 +2,8 @@ "contracts": { "broadcaster": "0x2e6f2Cb4bf4E4D2166F83958442a180825B94248", "receiver": "0x712535fE2e24df51917DB5438EB3dA90437F70AF", - "buffer": "0xCd455Df9F48Af8C86427fE3F86787D95330F65AA" + "buffer": "0xCd455Df9F48Af8C86427fE3F86787D95330F65AA", + "pusher": "0x2aC21Fcfd6905eF13FA9bc0F874f3524029cB443" }, "copies": { "ethereum-sepolia": { diff --git a/deployments/optimism-sepolia.json b/deployments/optimism-sepolia.json index fbe5137..b187d66 100644 --- a/deployments/optimism-sepolia.json +++ b/deployments/optimism-sepolia.json @@ -2,7 +2,8 @@ "contracts": { "broadcaster": "0x2e6f2Cb4bf4E4D2166F83958442a180825B94248", "receiver": "0x712535fE2e24df51917DB5438EB3dA90437F70AF", - "buffer": "0xaC0a6EB6407b9C13c3B374219B2f91fda4DF47C5" + "buffer": "0xaC0a6EB6407b9C13c3B374219B2f91fda4DF47C5", + "pusher": "0x2c4ded0d5883646AEAD86a6C748c871afa819125" }, "copies": { "ethereum-sepolia": { diff --git a/deployments/scroll-sepolia.json b/deployments/scroll-sepolia.json index 9162b8e..13ece6a 100644 --- a/deployments/scroll-sepolia.json +++ b/deployments/scroll-sepolia.json @@ -2,7 +2,8 @@ "contracts": { "broadcaster": "0x2e6f2Cb4bf4E4D2166F83958442a180825B94248", "receiver": "0x712535fE2e24df51917DB5438EB3dA90437F70AF", - "buffer": "0x12e91f63cC0F43434141396AC0E9f5b1A0e103D6" + "buffer": "0x12e91f63cC0F43434141396AC0E9f5b1A0e103D6", + "pusher": "0xF99b4E792aCaBa74cb2d1A5D3fDBDFfe630C0a8e" }, "copies": { "ethereum-sepolia": { diff --git a/deployments/zksync-sepolia.json b/deployments/zksync-sepolia.json index 0341321..4b1760d 100644 --- a/deployments/zksync-sepolia.json +++ b/deployments/zksync-sepolia.json @@ -2,7 +2,8 @@ "contracts": { "broadcaster": "0x5483634580acDB4f0134E09025732DF9784e46e3", "receiver": "0x712535fE2e24df51917DB5438EB3dA90437F70AF", - "buffer": "0x4309FcAA812F729A2c6Fc9b67094296389eC919c" + "buffer": "0x4309FcAA812F729A2c6Fc9b67094296389eC919c", + "pusher": "0xc69281Edb758A5dDD7A13e12b4F3d81b14Bd983B" }, "copies": { "ethereum-sepolia": { diff --git a/scripts/deployment/DeployBase.s.sol b/scripts/deployment/DeployBase.s.sol index 9e1bc74..3e76fb7 100644 --- a/scripts/deployment/DeployBase.s.sol +++ b/scripts/deployment/DeployBase.s.sol @@ -153,6 +153,13 @@ contract DeployBase is Script { vm.writeJson(_jsonString(vm.toString(addr)), path, string.concat(".contracts.", name)); } + function _writeContractAtChain(uint256 chainId, string memory name, address addr) internal { + string memory path = string.concat(_deploymentsDir(), "/", _chainName(chainId), ".json"); + _ensureRootScaffold(path); + + vm.writeJson(_jsonString(vm.toString(addr)), path, string.concat(".contracts.", name)); + } + /// Adds/updates `.provers["chainKey"].pointer` and `.provers["chainKey"].prover` function _writeProver(string memory chainKey, address pointer, address prover) internal { string memory path = _path(); diff --git a/scripts/deployment/block-hash-pusher/DeployPushers.s.sol b/scripts/deployment/block-hash-pusher/DeployPushers.s.sol index 8aa88a9..980ff2f 100644 --- a/scripts/deployment/block-hash-pusher/DeployPushers.s.sol +++ b/scripts/deployment/block-hash-pusher/DeployPushers.s.sol @@ -16,22 +16,31 @@ contract DeployPushers is DeployBase { address zkSyncDiamond = vm.envAddress("ZKSYNC_DIAMOND"); address opL1CrossDomainMessengerProxy = vm.envAddress("OP_L1_CROSS_DOMAIN_MESSENGER_PROXY"); + uint256 lineaChainId = vm.envUint("LINEA_CHAIN_ID"); + uint256 scrollChainId = vm.envUint("SCROLL_CHAIN_ID"); + uint256 zksyncChainId = vm.envUint("ZKSYNC_CHAIN_ID"); + uint256 optimismChainId = vm.envUint("OPTIMISM_CHAIN_ID"); + vm.startBroadcast(); if (!_isPusherDeployed("linea-sepolia")) { LineaPusher lineaPusher = new LineaPusher(lineaRollup); _writePusher("linea-sepolia", address(lineaPusher)); + _writeContractAtChain(lineaChainId, "pusher", address(lineaPusher)); } if (!_isPusherDeployed("scroll-sepolia")) { ScrollPusher scrollPusher = new ScrollPusher(l1ScrollMessenger); _writePusher("scroll-sepolia", address(scrollPusher)); + _writeContractAtChain(scrollChainId, "pusher", address(scrollPusher)); } if (!_isPusherDeployed("zksync-sepolia")) { ZkSyncPusher zksyncPusher = new ZkSyncPusher(zkSyncDiamond); _writePusher("zksync-sepolia", address(zksyncPusher)); + _writeContractAtChain(zksyncChainId, "pusher", address(zksyncPusher)); } if (!_isPusherDeployed("optimism-sepolia")) { OptimismPusher optimismPusher = new OptimismPusher(opL1CrossDomainMessengerProxy); _writePusher("optimism-sepolia", address(optimismPusher)); + _writeContractAtChain(optimismChainId, "pusher", address(optimismPusher)); } vm.stopBroadcast(); } diff --git a/scripts/deployment/block-hash-pusher/deploy-pushers.sh b/scripts/deployment/block-hash-pusher/deploy-pushers.sh index 016a156..6530217 100755 --- a/scripts/deployment/block-hash-pusher/deploy-pushers.sh +++ b/scripts/deployment/block-hash-pusher/deploy-pushers.sh @@ -1,9 +1,5 @@ #!/usr/bin/env bash -LINEA_ROLLUP=$LINEA_ROLLUP \ -L1_SCROLL_MESSENGER=$L1_SCROLL_MESSENGER \ -ZKSYNC_DIAMOND=$ZKSYNC_DIAMOND \ -OP_L1_CROSS_DOMAIN_MESSENGER_PROXY=$OP_L1_CROSS_DOMAIN_MESSENGER_PROXY \ forge script scripts/deployment/block-hash-pusher/DeployPushers.s.sol \ --rpc-url "$RPC_URL" \ --private-key "$DEPLOYER_PRIVATE_KEY" \ diff --git a/scripts/deployment/deploy.sh b/scripts/deployment/deploy.sh index 683b76f..031fec2 100644 --- a/scripts/deployment/deploy.sh +++ b/scripts/deployment/deploy.sh @@ -10,32 +10,32 @@ set +a # ======================================================================================== chmod +x scripts/deployment/deploy-protocol.sh -echo "Deploying Broadcaster and Receiver contracts on Ethereum Sepolia..." +echo "Deploying Broadcaster and Receiver contracts on Ethereum..." CHAIN_TYPE="ethereum" \ RPC_URL="$ETHEREUM_RPC_URL" \ ./scripts/deployment/deploy-protocol.sh -echo "Deploying Broadcaster and Receiver contracts on Arbitrum Sepolia..." +echo "Deploying Broadcaster and Receiver contracts on Arbitrum..." CHAIN_TYPE="arbitrum" \ RPC_URL="$ARBITRUM_RPC_URL" \ ./scripts/deployment/deploy-protocol.sh -echo "Deploying Broadcaster and Receiver contracts on Linea Sepolia..." +echo "Deploying Broadcaster and Receiver contracts on Linea..." CHAIN_TYPE="linea" \ RPC_URL="$LINEA_RPC_URL" \ ./scripts/deployment/deploy-protocol.sh -echo "Deploying Broadcaster and Receiver contracts on Scroll Sepolia..." +echo "Deploying Broadcaster and Receiver contracts on Scroll..." CHAIN_TYPE="scroll" \ RPC_URL="$SCROLL_RPC_URL" \ ./scripts/deployment/deploy-protocol.sh -echo "Deploying Broadcaster and Receiver contracts on Optimism Sepolia..." +echo "Deploying Broadcaster and Receiver contracts on Optimism..." CHAIN_TYPE="optimism" \ RPC_URL="$OPTIMISM_RPC_URL" \ ./scripts/deployment/deploy-protocol.sh -echo "Deploying Broadcaster and Receiver contracts on ZkSync Sepolia..." +echo "Deploying Broadcaster and Receiver contracts on ZkSync..." CHAIN_TYPE="zksync" \ RPC_URL="$ZKSYNC_RPC_URL" \ ./scripts/deployment/deploy-protocol.sh @@ -46,42 +46,38 @@ RPC_URL="$ZKSYNC_RPC_URL" \ # ======================================================================================== chmod +x scripts/deployment/provers/deploy-parent-provers.sh -# Ethereum Sepolia -echo "Deploying ParentToChildProver contracts on Ethereum Sepolia..." +# Ethereum +echo "Deploying ParentToChildProver contracts on Ethereum..." RPC_URL="$ETHEREUM_RPC_URL" ./scripts/deployment/provers/deploy-parent-provers.sh -# Arbitrum Sepolia -echo "Deploying ParentToChildProver contracts on Arbitrum Sepolia..." +# Arbitrum +echo "Deploying ParentToChildProver contracts on Arbitrum..." RPC_URL="$ARBITRUM_RPC_URL" ./scripts/deployment/provers/deploy-parent-provers.sh -# Linea Sepolia -echo "Deploying ParentToChildProver contracts on Linea Sepolia..." +# Linea +echo "Deploying ParentToChildProver contracts on Linea..." RPC_URL="$LINEA_RPC_URL" ./scripts/deployment/provers/deploy-parent-provers.sh -# Scroll Sepolia -echo "Deploying ParentToChildProver contracts on Scroll Sepolia..." +# Scroll +echo "Deploying ParentToChildProver contracts on Scroll..." RPC_URL="$SCROLL_RPC_URL" ./scripts/deployment/provers/deploy-parent-provers.sh -# Optimism Sepolia -echo "Deploying ParentToChildProver contracts on Optimism Sepolia..." +# Optimism +echo "Deploying ParentToChildProver contracts on Optimism..." RPC_URL="$OPTIMISM_RPC_URL" ./scripts/deployment/provers/deploy-parent-provers.sh -# ZkSync Sepolia -echo "Deploying ParentToChildProver contracts on ZkSync Sepolia..." +# ZkSync +echo "Deploying ParentToChildProver contracts on ZkSync..." RPC_URL="$ZKSYNC_RPC_URL" ./scripts/deployment/provers/deploy-parent-provers.sh # ======================================================================================== # Deploy Pushers contracts # ======================================================================================== -chmod +x scripts/deployment/block-hash-pusher/deploy-pushers.sh - -# Ethereum Sepolia -echo "Deploying Pushers contracts on Ethereum Sepolia..." -LINEA_ROLLUP="$LINEA_ROLLUP" \ -L1_SCROLL_MESSENGER="$SCROLL_L1_SCROLL_MESSENGER" \ -ZKSYNC_DIAMOND="$ZKSYNC_DIAMOND" \ -OP_L1_CROSS_DOMAIN_MESSENGER_PROXY="$OPTIMISM_L1_CROSS_DOMAIN_MESSENGER_PROXY" \ + +# Ethereum +echo "Deploying Pushers contracts on Ethereum..." + RPC_URL="$ETHEREUM_RPC_URL" ./scripts/deployment/block-hash-pusher/deploy-pushers.sh # ======================================================================================== @@ -89,34 +85,34 @@ RPC_URL="$ETHEREUM_RPC_URL" ./scripts/deployment/block-hash-pusher/deploy-pusher # ======================================================================================== chmod +x scripts/deployment/block-hash-pusher/deploy-buffers.sh -# Ethereum Sepolia +# Ethereum -# Linea Sepolia -echo "Deploying Buffer contract for Linea Sepolia..." +# Linea +echo "Deploying Buffer contract for Linea..." CHAIN_TYPE="linea" \ PARENT_CHAIN="ethereum-sepolia" \ CHILD_CHAIN="linea-sepolia" \ MESSENGER="$LINEA_L2_MESSAGE_SERVICE" \ RPC_URL="$LINEA_RPC_URL" ./scripts/deployment/block-hash-pusher/deploy-buffers.sh -# Scroll Sepolia -echo "Deploying Buffer contract for Scroll Sepolia..." +# Scroll +echo "Deploying Buffer contract for Scroll..." CHAIN_TYPE="scroll" \ PARENT_CHAIN="ethereum-sepolia" \ CHILD_CHAIN="scroll-sepolia" \ MESSENGER="$SCROLL_L2_SCROLL_MESSENGER" \ RPC_URL="$SCROLL_RPC_URL" ./scripts/deployment/block-hash-pusher/deploy-buffers.sh -# ZkSync Sepolia -echo "Deploying Buffer contract for ZkSync Sepolia..." +# ZkSync +echo "Deploying Buffer contract for ZkSync..." CHAIN_TYPE="zksync" \ PARENT_CHAIN="ethereum-sepolia" \ CHILD_CHAIN="zksync-sepolia" \ MESSENGER=0x0000000000000000000000000000000000000000 \ RPC_URL="$ZKSYNC_RPC_URL" ./scripts/deployment/block-hash-pusher/deploy-buffers.sh -# Optimism Sepolia -echo "Deploying Buffer contract for Optimism Sepolia..." +# Optimism +echo "Deploying Buffer contract for Optimism..." CHAIN_TYPE="optimism" \ PARENT_CHAIN="ethereum-sepolia" \ CHILD_CHAIN="optimism-sepolia" \ @@ -128,6 +124,6 @@ RPC_URL="$OPTIMISM_RPC_URL" ./scripts/deployment/block-hash-pusher/deploy-buffer # ======================================================================================== chmod +x scripts/deployment/provers/deploy-child-provers.sh -# Ethereum Sepolia +# Ethereum echo "Deploying ChildToParentProver contracts ..." ./scripts/deployment/provers/deploy-child-provers.sh From 283363cb4e8670edc71e59df2cb13a38801b6d70 Mon Sep 17 00:00:00 2001 From: Luiz Date: Wed, 11 Mar 2026 16:27:15 -0300 Subject: [PATCH 18/19] up --- deployments/arbitrum-sepolia.json | 4 +++- deployments/ethereum-sepolia.json | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/deployments/arbitrum-sepolia.json b/deployments/arbitrum-sepolia.json index 6fd3ddb..daffab6 100644 --- a/deployments/arbitrum-sepolia.json +++ b/deployments/arbitrum-sepolia.json @@ -1,7 +1,9 @@ { "contracts": { "broadcaster": "0x2e6f2Cb4bf4E4D2166F83958442a180825B94248", - "receiver": "0x712535fE2e24df51917DB5438EB3dA90437F70AF" + "receiver": "0x712535fE2e24df51917DB5438EB3dA90437F70AF", + "buffer": "0x0000000048C4Ed10cF14A02B9E0AbDDA5227b071", + "pusher": "0x5a5C4f3D0F0Efaeed2aEc9B59B67eC62a4666D88" }, "copies": { "ethereum-sepolia": { diff --git a/deployments/ethereum-sepolia.json b/deployments/ethereum-sepolia.json index fb46e37..4d46a91 100644 --- a/deployments/ethereum-sepolia.json +++ b/deployments/ethereum-sepolia.json @@ -4,6 +4,7 @@ "receiver": "0x712535fE2e24df51917DB5438EB3dA90437F70AF" }, "pushers": { + "arbitrum-sepolia": "0x5a5C4f3D0F0Efaeed2aEc9B59B67eC62a4666D88", "linea-sepolia": "0x2aC21Fcfd6905eF13FA9bc0F874f3524029cB443", "scroll-sepolia": "0xF99b4E792aCaBa74cb2d1A5D3fDBDFfe630C0a8e", "zksync-sepolia": "0xc69281Edb758A5dDD7A13e12b4F3d81b14Bd983B", From 64acb859445ca7188d804b708814a22c374a6017 Mon Sep 17 00:00:00 2001 From: Luiz Date: Wed, 11 Mar 2026 16:44:26 -0300 Subject: [PATCH 19/19] up --- .env.example | 4 ++-- scripts/deployment/block-hash-pusher/DeployPushers.s.sol | 2 +- scripts/deployment/deploy.sh | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.env.example b/.env.example index 952bdfd..ec03052 100644 --- a/.env.example +++ b/.env.example @@ -26,8 +26,8 @@ LINEA_L2_MESSAGE_SERVICE= SCROLL_CHAIN_ID= SCROLL_CHAIN_SEPOLIA= SCROLL_FINALIZED_STATE_ROOT_SLOT= -SCROLL_L1_SCROLL_MESSENGER= -SCROLL_L2_SCROLL_MESSENGER= +L1_SCROLL_MESSENGER= +L2_SCROLL_MESSENGER= # Optimism Envs OPTIMISM_CHAIN_ID= diff --git a/scripts/deployment/block-hash-pusher/DeployPushers.s.sol b/scripts/deployment/block-hash-pusher/DeployPushers.s.sol index 980ff2f..fe8fc44 100644 --- a/scripts/deployment/block-hash-pusher/DeployPushers.s.sol +++ b/scripts/deployment/block-hash-pusher/DeployPushers.s.sol @@ -14,7 +14,7 @@ contract DeployPushers is DeployBase { address lineaRollup = vm.envAddress("LINEA_ROLLUP"); address l1ScrollMessenger = vm.envAddress("L1_SCROLL_MESSENGER"); address zkSyncDiamond = vm.envAddress("ZKSYNC_DIAMOND"); - address opL1CrossDomainMessengerProxy = vm.envAddress("OP_L1_CROSS_DOMAIN_MESSENGER_PROXY"); + address opL1CrossDomainMessengerProxy = vm.envAddress("OPTIMISM_L1_CROSS_DOMAIN_MESSENGER_PROXY"); uint256 lineaChainId = vm.envUint("LINEA_CHAIN_ID"); uint256 scrollChainId = vm.envUint("SCROLL_CHAIN_ID"); diff --git a/scripts/deployment/deploy.sh b/scripts/deployment/deploy.sh index 031fec2..11fdb4d 100644 --- a/scripts/deployment/deploy.sh +++ b/scripts/deployment/deploy.sh @@ -100,7 +100,7 @@ echo "Deploying Buffer contract for Scroll..." CHAIN_TYPE="scroll" \ PARENT_CHAIN="ethereum-sepolia" \ CHILD_CHAIN="scroll-sepolia" \ -MESSENGER="$SCROLL_L2_SCROLL_MESSENGER" \ +MESSENGER="$L2_SCROLL_MESSENGER" \ RPC_URL="$SCROLL_RPC_URL" ./scripts/deployment/block-hash-pusher/deploy-buffers.sh # ZkSync