diff --git a/.gitignore b/.gitignore index af50f2cd..fd72a6d3 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,5 @@ yarn-error.log .gitmodules .DS_Store + +.vscode \ No newline at end of file diff --git a/sepolia/2024-07-09-migrate-bridge-ownership/.env b/sepolia/2024-07-09-migrate-bridge-ownership/.env new file mode 100644 index 00000000..126af95c --- /dev/null +++ b/sepolia/2024-07-09-migrate-bridge-ownership/.env @@ -0,0 +1,10 @@ +OP_COMMIT=029fb1ccaffedd3e860deb157f752bbb1942f7c4 +BASE_CONTRACTS_COMMIT=c14278a67d6eb029d3b9b505eea67d2b2ea637af + +ANCHOR_STATE_REGISTRY_PROXY="0xfb17A817168BD4DFd48Fb6C9fd07B4409501e3E0" +DELAYED_WETH_PROXY="0x9dc3d8500c295e95D5C4EBDeD3222a74fF19e524" +DISPUTE_GAME_FACTORY_PROXY="0xe545eDE9d1FaDaD12984c31467F56405884b9398" +FAULT_DISPUTE_GAME="0x1E06BAADA3F0a89741B1e9A573d8F8cA9814af01" +PERMISSIONED_DISPUTE_GAME="0x50406f516C767f903677DD0875217B410F334540" + +SEPOLIA_RPC_URL="https://sepolia.gateway.tenderly.co" diff --git a/sepolia/2024-07-09-migrate-bridge-ownership/Makefile b/sepolia/2024-07-09-migrate-bridge-ownership/Makefile new file mode 100644 index 00000000..ed22cdce --- /dev/null +++ b/sepolia/2024-07-09-migrate-bridge-ownership/Makefile @@ -0,0 +1,10 @@ +include ../../Makefile +include ../.env +include .env + +## +# Foundry commands +## +.PHONY: verify +verify: + forge script --rpc-url $(SEPOLIA_RPC_URL) VerifyContractState diff --git a/sepolia/2024-07-09-migrate-bridge-ownership/foundry.toml b/sepolia/2024-07-09-migrate-bridge-ownership/foundry.toml new file mode 100644 index 00000000..0be0575a --- /dev/null +++ b/sepolia/2024-07-09-migrate-bridge-ownership/foundry.toml @@ -0,0 +1,20 @@ +[profile.default] +src = 'src' +out = 'out' +libs = ['lib'] +broadcast = 'records' +fs_permissions = [ {access = "read-write", path = "./"} ] +optimizer = true +optimizer_runs = 999999 +solc_version = "0.8.15" +via-ir = true +remappings = [ + '@eth-optimism-bedrock/=lib/optimism/packages/contracts-bedrock/', + '@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts', + '@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts', + '@rari-capital/solmate/=lib/solmate/', + '@base-contracts/=lib/base-contracts', + 'solady/=lib/solady/src/' +] + +# See more config options https://github.com/foundry-rs/foundry/tree/master/config \ No newline at end of file diff --git a/sepolia/2024-07-09-migrate-bridge-ownership/script/VerifyContractState.s.sol b/sepolia/2024-07-09-migrate-bridge-ownership/script/VerifyContractState.s.sol new file mode 100644 index 00000000..11a8ca7f --- /dev/null +++ b/sepolia/2024-07-09-migrate-bridge-ownership/script/VerifyContractState.s.sol @@ -0,0 +1,78 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import "forge-std/Script.sol"; +import "forge-std/console.sol"; + +import "@eth-optimism-bedrock/src/dispute/AnchorStateRegistry.sol"; +import "@eth-optimism-bedrock/src/dispute/weth/DelayedWETH.sol"; +import {Constants} from "@eth-optimism-bedrock/src/libraries/Constants.sol"; + +contract VerifyContractState is Script { + + function run() public { + verifyAnchorStateRegistry(); + verifyDelayedWETH(); + verifyDisputeGameFactory(); + verifyFaultDisputeGame(); + verifyPermissionedDisputeGame(); + } + + function verifyAnchorStateRegistry() internal view { + address addr = vm.envAddress("ANCHOR_STATE_REGISTRY_PROXY"); + + address impl = bytes32ToAddress(vm.load(addr, Constants.PROXY_IMPLEMENTATION_ADDRESS)); + + AnchorStateRegistry anchorStateRegistry = AnchorStateRegistry(addr); + + string memory version = anchorStateRegistry.version(); + address disputeGameFactoryAddr = address(anchorStateRegistry.disputeGameFactory()); + + // Note that Hash is a custom type around bytes32 + (Hash rootCannon, uint256 l2BlockNumberCannon) = anchorStateRegistry.anchors(GameType.wrap(0)); + (Hash rootPermissionedCannon, uint256 l2BlockNumberPermissionedCannon) = anchorStateRegistry.anchors(GameType.wrap(1)); + + console.log("AnchorStateRegistry: %s", addr); + console.log("- Implementation address: %s", impl); + console.log("- Version: %s", version); + console.log("- DisputeGameFactory address: %s", disputeGameFactoryAddr); + console.log("- Anchor for GameType.CANNON: %s, %s", vm.toString(Hash.unwrap(rootCannon)), l2BlockNumberCannon); + console.log("- Anchor for GameType.PERMISSIONED_CANNON: %s, %s", vm.toString(Hash.unwrap(rootPermissionedCannon)), l2BlockNumberPermissionedCannon); + console.log("==================\n"); + } + + function verifyDelayedWETH() internal { + address addr = vm.envAddress("DELAYED_WETH_PROXY"); + + address impl = bytes32ToAddress(vm.load(addr, Constants.PROXY_IMPLEMENTATION_ADDRESS)); + + DelayedWETH delayedWeth = DelayedWETH(payable(addr)); + + string memory version = delayedWeth.version(); + address owner = delayedWeth.owner(); + address config = address(delayedWeth.config()); + + console.log("DelayedWETH: %s", addr); + console.log("- Implementation address: %s", impl); + console.log("- Version: %s", version); + console.log("- Owner: %s", owner); + console.log("- SuperchainConfig address: %s", config); + console.log("==================\n"); + } + + function verifyDisputeGameFactory() internal { + // TODO: Implement + } + + function verifyFaultDisputeGame() internal { + // TODO: Implement + } + + function verifyPermissionedDisputeGame() internal { + // TODO: Implement + } + + function bytes32ToAddress(bytes32 _bytes32) internal pure returns (address) { + return address(uint160(uint256(_bytes32))); + } +}