From d6ad736afab5b04bce26eba6e7aae0b42fa7559d Mon Sep 17 00:00:00 2001 From: Pierrick Turelier Date: Thu, 10 Oct 2024 15:50:09 -0500 Subject: [PATCH] feat(script): add portal uggrade script --- Makefile | 12 +++++ script/deploy/interfaces/ICreateXLike.sol | 6 +++ script/helpers/Utils.sol | 4 ++ script/upgrade/UpgradeBase.sol | 36 +++++++++++-- script/upgrade/dev/UpgradePortalDev.s.sol | 51 +++++++++++++++++++ .../dev/UpgradeWormholeTransceiverDev.s.sol | 6 +-- 6 files changed, 109 insertions(+), 6 deletions(-) create mode 100644 script/upgrade/dev/UpgradePortalDev.s.sol diff --git a/Makefile b/Makefile index 18facae..c46913e 100644 --- a/Makefile +++ b/Makefile @@ -47,6 +47,18 @@ upgrade-transceiver-dev-base-sepolia: upgrade-transceiver-dev-optimism-sepolia: FOUNDRY_PROFILE=production forge script script/upgrade/dev/UpgradeWormholeTransceiverDev.s.sol:UpgradeWormholeTransceiverDev --private-key $(DEV_PRIVATE_KEY) --rpc-url $(OPTIMISM_SEPOLIA_RPC_URL) --skip test --broadcast --slow -v +upgrade-portal-local: + FOUNDRY_PROFILE=production forge script script/upgrade/dev/UpgradePortalDev.s.sol:UpgradePortalDev --private-key $(DEV_PRIVATE_KEY) --rpc-url localhost --skip test --broadcast -v + +upgrade-portal-dev-sepolia: + FOUNDRY_PROFILE=production forge script script/upgrade/dev/UpgradePortalDev.s.sol:UpgradePortalDev --private-key $(DEV_PRIVATE_KEY) --rpc-url $(SEPOLIA_RPC_URL) --skip test --broadcast --slow -v + +upgrade-portal-dev-base-sepolia: + FOUNDRY_PROFILE=production forge script script/upgrade/dev/UpgradePortalDev.s.sol:UpgradePortalDev --private-key $(DEV_PRIVATE_KEY) --rpc-url $(BASE_SEPOLIA_RPC_URL) --skip test --broadcast --slow -v + +upgrade-portal-dev-optimism-sepolia: + FOUNDRY_PROFILE=production forge script script/upgrade/dev/UpgradePortalDev.s.sol:UpgradePortalDev --private-key $(DEV_PRIVATE_KEY) --rpc-url $(OPTIMISM_SEPOLIA_RPC_URL) --skip test --broadcast --slow -v + # Run slither slither :; FOUNDRY_PROFILE=production forge build --build-info --skip '*/test/**' --skip '*/script/**' --force && slither --compile-force-framework foundry --ignore-compile --sarif results.sarif --config-file slither.config.json . diff --git a/script/deploy/interfaces/ICreateXLike.sol b/script/deploy/interfaces/ICreateXLike.sol index 31bc058..a06e93b 100644 --- a/script/deploy/interfaces/ICreateXLike.sol +++ b/script/deploy/interfaces/ICreateXLike.sol @@ -17,6 +17,12 @@ interface ICreateXLike { uint256 initCallAmount; } + /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ + /* CREATE */ + /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ + + function computeCreateAddress(address deployer, uint256 nonce) external view returns (address computedAddress); + /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CREATE3 */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ diff --git a/script/helpers/Utils.sol b/script/helpers/Utils.sol index 318befb..c130585 100644 --- a/script/helpers/Utils.sol +++ b/script/helpers/Utils.sol @@ -86,6 +86,10 @@ contract Utils { } } + function _getCreateAddress(address deployer_, uint256 nonce_) internal view virtual returns (address) { + return ICreateXLike(_CREATE_X_FACTORY).computeCreateAddress(deployer_, nonce_); + } + function _getCreate3Address(address deployer_, bytes32 salt_) internal view virtual returns (address) { return ICreateXLike(_CREATE_X_FACTORY).computeCreate3Address(_computeGuardedSalt(deployer_, salt_)); } diff --git a/script/upgrade/UpgradeBase.sol b/script/upgrade/UpgradeBase.sol index 3f6c13b..5817f18 100644 --- a/script/upgrade/UpgradeBase.sol +++ b/script/upgrade/UpgradeBase.sol @@ -5,14 +5,24 @@ pragma solidity 0.8.26; import { Script, console2 } from "../../lib/forge-std/src/Script.sol"; import { ITransceiver } from "../../lib/example-native-token-transfers/evm/src/interfaces/ITransceiver.sol"; +import { IManagerBase } from "../../lib/example-native-token-transfers/evm/src/interfaces/IManagerBase.sol"; import { WormholeTransceiver } from "../../lib/example-native-token-transfers/evm/src/Transceiver/WormholeTransceiver/WormholeTransceiver.sol"; +import { HubPortal } from "../../src/HubPortal.sol"; +import { SpokePortal } from "../../src/SpokePortal.sol"; + import { Utils } from "../helpers/Utils.sol"; contract UpgradeBase is Script, Utils { - struct UpgradeParams { + struct PortalUpgradeParams { + address mToken; + address registrar; + uint16 wormholeChainId; + } + + struct WormholeTransceiverUpgradeParams { uint16 wormholeChainId; address wormholeCoreBridge; address wormholeRelayerAddr; @@ -21,7 +31,7 @@ contract UpgradeBase is Script, Utils { uint256 gasLimit; } - function _upgradeWormholeTransceiver(address deployer_, UpgradeParams memory params_) internal { + function _upgradeWormholeTransceiver(address deployer_, WormholeTransceiverUpgradeParams memory params_) internal { WormholeTransceiver implementation_ = new WormholeTransceiver( _getCreate3Address(deployer_, _computeSalt(deployer_, "Portal")), params_.wormholeCoreBridge, @@ -31,10 +41,30 @@ contract UpgradeBase is Script, Utils { params_.gasLimit ); - console2.log("WormholeTransceiver Implementation deployed at: ", address(implementation_)); + console2.log("WormholeTransceiver implementation deployed at: ", address(implementation_)); ITransceiver(_getCreate3Address(deployer_, _computeSalt(deployer_, "WormholeTransceiver"))).upgrade( address(implementation_) ); } + + function _upgradeHubPortal(address deployer_, PortalUpgradeParams memory params_) internal { + HubPortal implementation_ = new HubPortal(params_.mToken, params_.registrar, params_.wormholeChainId); + + console2.log("HubPortal implementation deployed at: ", address(implementation_)); + + IManagerBase(_getCreate3Address(deployer_, _computeSalt(deployer_, "Portal"))).upgrade( + address(implementation_) + ); + } + + function _upgradeSpokePortal(address deployer_, PortalUpgradeParams memory params_) internal { + SpokePortal implementation_ = new SpokePortal(params_.mToken, params_.registrar, params_.wormholeChainId); + + console2.log("SpokePortal implementation deployed at: ", address(implementation_)); + + IManagerBase(_getCreate3Address(deployer_, _computeSalt(deployer_, "Portal"))).upgrade( + address(implementation_) + ); + } } diff --git a/script/upgrade/dev/UpgradePortalDev.s.sol b/script/upgrade/dev/UpgradePortalDev.s.sol new file mode 100644 index 0000000..b1a4136 --- /dev/null +++ b/script/upgrade/dev/UpgradePortalDev.s.sol @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: UNLICENSED + +pragma solidity 0.8.26; + +import { UpgradeBase } from "../UpgradeBase.sol"; + +contract UpgradePortalDev is UpgradeBase { + function run() public { + address deployer_ = vm.rememberKey(vm.envUint("DEV_PRIVATE_KEY")); + + if (block.chainid == _SEPOLIA_CHAIN_ID) { + vm.startBroadcast(); + + _upgradeHubPortal( + deployer_, + PortalUpgradeParams({ + mToken: _SEPOLIA_M_TOKEN, + registrar: _SEPOLIA_REGISTRAR, + wormholeChainId: _SEPOLIA_WORMHOLE_CHAIN_ID + }) + ); + + vm.stopBroadcast(); + } else if (block.chainid == _BASE_SEPOLIA_CHAIN_ID) { + vm.startBroadcast(); + _upgradeSpokePortal( + deployer_, + PortalUpgradeParams({ + mToken: _getCreateAddress(deployer_, _SPOKE_M_TOKEN_NONCE), + registrar: _getCreateAddress(deployer_, _SPOKE_REGISTRAR_NONCE), + wormholeChainId: _BASE_SEPOLIA_WORMHOLE_CHAIN_ID + }) + ); + + vm.stopBroadcast(); + } else if (block.chainid == _OPTIMISM_SEPOLIA_CHAIN_ID) { + vm.startBroadcast(); + + _upgradeSpokePortal( + deployer_, + PortalUpgradeParams({ + mToken: _getCreateAddress(deployer_, _SPOKE_M_TOKEN_NONCE), + registrar: _getCreateAddress(deployer_, _SPOKE_REGISTRAR_NONCE), + wormholeChainId: _OPTIMISM_SEPOLIA_WORMHOLE_CHAIN_ID + }) + ); + + vm.stopBroadcast(); + } + } +} diff --git a/script/upgrade/dev/UpgradeWormholeTransceiverDev.s.sol b/script/upgrade/dev/UpgradeWormholeTransceiverDev.s.sol index ab95b92..0e0ea4e 100644 --- a/script/upgrade/dev/UpgradeWormholeTransceiverDev.s.sol +++ b/script/upgrade/dev/UpgradeWormholeTransceiverDev.s.sol @@ -13,7 +13,7 @@ contract UpgradeWormholeTransceiverDev is UpgradeBase { _upgradeWormholeTransceiver( deployer_, - UpgradeParams({ + WormholeTransceiverUpgradeParams({ wormholeChainId: _SEPOLIA_WORMHOLE_CHAIN_ID, wormholeCoreBridge: _SEPOLIA_WORMHOLE_CORE_BRIDGE, wormholeRelayerAddr: _SEPOLIA_WORMHOLE_RELAYER, @@ -29,7 +29,7 @@ contract UpgradeWormholeTransceiverDev is UpgradeBase { _upgradeWormholeTransceiver( deployer_, - UpgradeParams({ + WormholeTransceiverUpgradeParams({ wormholeChainId: _BASE_SEPOLIA_WORMHOLE_CHAIN_ID, wormholeCoreBridge: _BASE_SEPOLIA_WORMHOLE_CORE_BRIDGE, wormholeRelayerAddr: _BASE_SEPOLIA_WORMHOLE_RELAYER, @@ -45,7 +45,7 @@ contract UpgradeWormholeTransceiverDev is UpgradeBase { _upgradeWormholeTransceiver( deployer_, - UpgradeParams({ + WormholeTransceiverUpgradeParams({ wormholeChainId: _OPTIMISM_SEPOLIA_WORMHOLE_CHAIN_ID, wormholeCoreBridge: _OPTIMISM_SEPOLIA_WORMHOLE_CORE_BRIDGE, wormholeRelayerAddr: _OPTIMISM_SEPOLIA_WORMHOLE_RELAYER,