diff --git a/Makefile b/Makefile index e4af1767..b936df0a 100644 --- a/Makefile +++ b/Makefile @@ -77,32 +77,6 @@ deploy-all: # SOURCE_CHAIN, SOURCE_RPC, TARGET_CHAIN, TARGET_RPC, OPTIONS @echo "⚠️ Please authorize bridges on RLCLiquidityUnifier and RLCCrosschainToken contracts." # TODO verify contracts after deployment. -# -# High-level upgrade targets -# - -upgrade-on-anvil: - $(MAKE) upgrade-all \ - SOURCE_CHAIN=sepolia SOURCE_RPC=$(ANVIL_SEPOLIA_RPC_URL) \ - TARGET_CHAIN=arbitrum_sepolia TARGET_RPC=$(ANVIL_ARBITRUM_SEPOLIA_RPC_URL) - -upgrade-on-mainnets: - $(MAKE) upgrade-all \ - SOURCE_CHAIN=ethereum SOURCE_RPC=$(ETHEREUM_RPC_URL) \ - TARGET_CHAIN=arbitrum TARGET_RPC=$(ARBITRUM_RPC_URL) \ - OPTIONS=--verify - -# TODO : RLCMultichain and RLCLiquidityUnifier upgrades -upgrade-on-testnets: - $(MAKE) upgrade-all \ - SOURCE_CHAIN=sepolia SOURCE_RPC=$(SEPOLIA_RPC_URL) \ - TARGET_CHAIN=arbitrum_sepolia TARGET_RPC=$(ARBITRUM_SEPOLIA_RPC_URL) \ - OPTIONS=--verify - -upgrade-all: # SOURCE_CHAIN, SOURCE_RPC, TARGET_CHAIN, TARGET_RPC, OPTIONS - $(MAKE) upgrade-contract CONTRACT=bridges/layerZero/IexecLayerZeroBridge CHAIN=$(SOURCE_CHAIN) RPC_URL=$(SOURCE_RPC) OPTIONS=$(OPTIONS) - $(MAKE) upgrade-contract CONTRACT=bridges/layerZero/IexecLayerZeroBridge CHAIN=$(TARGET_CHAIN) RPC_URL=$(TARGET_RPC) OPTIONS=$(OPTIONS) - # # Generic deployment targets # @@ -116,19 +90,6 @@ deploy-contract: # CONTRACT, CHAIN, RPC_URL, OPTIONS --broadcast \ -vvv -# -# Generic upgrade targets -# - -upgrade-contract: # CONTRACT, CHAIN, RPC_URL, OPTIONS - @echo "Upgrading $(CONTRACT) on $(CHAIN) with options: $(OPTIONS)" - CHAIN=$(CHAIN) forge script script/$(CONTRACT).s.sol:Upgrade \ - --rpc-url $(RPC_URL) \ - --account $(ACCOUNT) \ - --broadcast \ - $(OPTIONS) \ - -vvv - # # Generic configuration targets # @@ -142,13 +103,6 @@ configure-bridge: # SOURCE_CHAIN, TARGET_CHAIN, RPC_URL --broadcast \ -vvv -# -# Individual upgrade targets -# - -upgrade-layerzero-bridge: # CHAIN, RPC_URL - $(MAKE) upgrade-contract CONTRACT=bridges/layerZero/IexecLayerZeroBridge CHAIN=$(CHAIN) RPC_URL=$(RPC_URL) - # # Bridge operations. # diff --git a/script/RLCCrosschainToken.s.sol b/script/RLCCrosschainToken.s.sol index 07076e8f..505c4aa0 100644 --- a/script/RLCCrosschainToken.s.sol +++ b/script/RLCCrosschainToken.s.sol @@ -4,9 +4,9 @@ pragma solidity ^0.8.22; import {Script} from "forge-std/Script.sol"; -import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol"; +import {Options} from "openzeppelin-foundry-upgrades/Upgrades.sol"; import {RLCCrosschainToken} from "../src/RLCCrosschainToken.sol"; -import {UUPSProxyDeployer} from "./lib/UUPSProxyDeployer.sol"; +import {UUPSProxyUtils} from "./lib/UUPSProxyUtils.sol"; import {ConfigLib} from "./lib/ConfigLib.sol"; /** @@ -58,6 +58,31 @@ contract Deploy is Script { ) public returns (address) { bytes memory initData = abi.encodeWithSelector(RLCCrosschainToken.initialize.selector, name, symbol, initialAdmin, initialUpgrader); - return UUPSProxyDeployer.deployUsingCreateX("RLCCrosschainToken", "", initData, createxFactory, createxSalt); + return UUPSProxyUtils.deployUsingCreateX("RLCCrosschainToken", "", initData, createxFactory, createxSalt); + } +} + +contract Upgrade is Script { + function run() external { + vm.startBroadcast(); + upgrade({ + proxyAddress: address(0), // Replace with the actual proxy address + contractName: "", // e.g., "ContractV2.sol:ContractV2" + constructorData: new bytes(0), // Replace with the actual constructor data + initData: new bytes(0) // Replace with the actual initialization data + }); + vm.stopBroadcast(); + } + + // TODO add tests in `RLCCrosschainTokenUpgrade.t.sol`. + function upgrade( + address proxyAddress, + string memory contractName, + bytes memory constructorData, + bytes memory initData + ) public { + Options memory opts; + opts.constructorData = constructorData; + UUPSProxyUtils.executeUpgrade(proxyAddress, contractName, initData, opts); } } diff --git a/script/RLCLiquidityUnifier.s.sol b/script/RLCLiquidityUnifier.s.sol index bb5a6147..8ac11d33 100644 --- a/script/RLCLiquidityUnifier.s.sol +++ b/script/RLCLiquidityUnifier.s.sol @@ -4,11 +4,10 @@ pragma solidity ^0.8.22; import {Script} from "forge-std/Script.sol"; -import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol"; +import {Options} from "openzeppelin-foundry-upgrades/Upgrades.sol"; import {RLCLiquidityUnifier} from "../src/RLCLiquidityUnifier.sol"; -import {UUPSProxyDeployer} from "./lib/UUPSProxyDeployer.sol"; +import {UUPSProxyUtils} from "./lib/UUPSProxyUtils.sol"; import {ConfigLib} from "./lib/ConfigLib.sol"; -import {UpgradeUtils} from "./lib/UpgradeUtils.sol"; /** * Deployment script for the RLCLiquidityUnifier contract. * It reads configuration from a JSON file and deploys the contract using CreateX. @@ -57,7 +56,7 @@ contract Deploy is Script { bytes memory constructorData = abi.encode(rlcToken); bytes memory initData = abi.encodeWithSelector(RLCLiquidityUnifier.initialize.selector, initialAdmin, initialUpgrader); - return UUPSProxyDeployer.deployUsingCreateX( + return UUPSProxyUtils.deployUsingCreateX( "RLCLiquidityUnifier", constructorData, initData, createxFactory, createxSalt ); } @@ -65,17 +64,24 @@ contract Deploy is Script { contract Upgrade is Script { function run() external { - string memory chain = vm.envString("CHAIN"); - ConfigLib.CommonConfigParams memory commonParams = ConfigLib.readCommonConfig(chain); - vm.startBroadcast(); - UpgradeUtils.UpgradeParams memory params = UpgradeUtils.UpgradeParams({ - proxyAddress: commonParams.rlcLiquidityUnifierAddress, - constructorData: abi.encode(commonParams.rlcToken), - contractName: "RLCLiquidityUnifierV2Mock.sol:RLCLiquidityUnifierV2", // Would be production contract in real deployment - newStateVariable: 1000000 * 10 ** 9 + upgrade({ + proxyAddress: address(0), // Replace with the actual proxy address + contractName: "", // e.g., "ContractV2.sol:ContractV2" + constructorData: new bytes(0), // Replace with the actual constructor data + initData: new bytes(0) // Replace with the actual initialization data }); - UpgradeUtils.executeUpgrade(params); vm.stopBroadcast(); } + + function upgrade( + address proxyAddress, + string memory contractName, + bytes memory constructorData, + bytes memory initData + ) public { + Options memory opts; + opts.constructorData = constructorData; + UUPSProxyUtils.executeUpgrade(proxyAddress, contractName, initData, opts); + } } diff --git a/script/bridges/layerZero/IexecLayerZeroBridge.s.sol b/script/bridges/layerZero/IexecLayerZeroBridge.s.sol index d6541999..52f1774d 100644 --- a/script/bridges/layerZero/IexecLayerZeroBridge.s.sol +++ b/script/bridges/layerZero/IexecLayerZeroBridge.s.sol @@ -3,15 +3,14 @@ pragma solidity ^0.8.22; import {Script} from "forge-std/Script.sol"; -import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol"; +import {Options} from "openzeppelin-foundry-upgrades/Upgrades.sol"; import {EnforcedOptionParam} from "@layerzerolabs/oapp-evm/contracts/oapp/libs/OAppOptionsType3.sol"; import {OptionsBuilder} from "@layerzerolabs/oapp-evm/contracts/oapp/libs/OptionsBuilder.sol"; import {ConfigLib} from "./../../lib/ConfigLib.sol"; import {IexecLayerZeroBridge} from "../../../src/bridges/layerZero/IexecLayerZeroBridge.sol"; import {RLCLiquidityUnifier} from "../../../src/RLCLiquidityUnifier.sol"; import {RLCCrosschainToken} from "../../../src/RLCCrosschainToken.sol"; -import {UUPSProxyDeployer} from "../../lib/UUPSProxyDeployer.sol"; -import {UpgradeUtils} from "../../lib/UpgradeUtils.sol"; +import {UUPSProxyUtils} from "../../lib/UUPSProxyUtils.sol"; contract Deploy is Script { /** @@ -53,12 +52,19 @@ contract Deploy is Script { bytes memory initializeData = abi.encodeWithSelector( IexecLayerZeroBridge.initialize.selector, initialAdmin, initialUpgrader, initialPauser ); - return UUPSProxyDeployer.deployUsingCreateX( + return UUPSProxyUtils.deployUsingCreateX( "IexecLayerZeroBridge", constructorData, initializeData, createxFactory, createxSalt ); } } +/** + * This script is used to configure the IexecLayerZeroBridge contract on both source + * and target chains. + * It sets required LayerZero bridge config: peer address and enforced options. + * It also grants the bridge the necessary roles in the RLCCrosschainToken contract + * or RLCLiquidityUnifier contract, depending on the configuration. + */ contract Configure is Script { using OptionsBuilder for bytes; @@ -93,22 +99,30 @@ contract Configure is Script { contract Upgrade is Script { function run() external { - string memory chain = vm.envString("CHAIN"); - ConfigLib.CommonConfigParams memory commonParams = ConfigLib.readCommonConfig(chain); - - // For testing purpose - uint256 newStateVariable = 1000000 * 10 ** 9; - address bridgeableToken = commonParams.approvalRequired - ? commonParams.rlcLiquidityUnifierAddress - : commonParams.rlcCrosschainTokenAddress; vm.startBroadcast(); - UpgradeUtils.UpgradeParams memory params = UpgradeUtils.UpgradeParams({ - proxyAddress: commonParams.iexecLayerZeroBridgeAddress, - constructorData: abi.encode(commonParams.approvalRequired, bridgeableToken, commonParams.lzEndpoint), - contractName: "IexecLayerZeroBridgeV2Mock.sol:IexecLayerZeroBridgeV2", // Would be production contract in real deployment - newStateVariable: newStateVariable + upgrade({ + proxyAddress: address(0), // Replace with the actual proxy address + contractName: "", // e.g., "ContractV2.sol:ContractV2" + constructorData: new bytes(0), // Replace with the actual constructor data + initData: new bytes(0) // Replace with the actual initialization data }); - UpgradeUtils.executeUpgrade(params); vm.stopBroadcast(); } + + function upgrade( + address proxyAddress, + string memory contractName, + bytes memory constructorData, + bytes memory initData + ) public { + Options memory opts; + opts.constructorData = constructorData; + // Ignore checks related to LayerZero contracts: + // - OAppSenderUpgradeable + // - OAppReceiverUpgradeable + // - OFTCoreUpgradeable + // - OAppCoreUpgradeable + opts.unsafeAllow = "constructor,state-variable-immutable,missing-initializer-call"; + UUPSProxyUtils.executeUpgrade(proxyAddress, contractName, initData, opts); + } } diff --git a/script/lib/UUPSProxyDeployer.sol b/script/lib/UUPSProxyUtils.sol similarity index 73% rename from script/lib/UUPSProxyDeployer.sol rename to script/lib/UUPSProxyUtils.sol index 9dfeb5b8..5c9d063b 100644 --- a/script/lib/UUPSProxyDeployer.sol +++ b/script/lib/UUPSProxyUtils.sol @@ -7,12 +7,13 @@ import {Vm} from "forge-std/Vm.sol"; import {StdConstants} from "forge-std/StdConstants.sol"; import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; import {ICreateX} from "@createx/contracts/ICreateX.sol"; +import {Upgrades, Options} from "openzeppelin-foundry-upgrades/Upgrades.sol"; /** * @notice Utility library for deploying UUPS proxy contracts and their implementations * using the CreateX Factory. */ -library UUPSProxyDeployer { +library UUPSProxyUtils { /// @dev Reference to the VM cheat codes from forge-std Vm private constant vm = StdConstants.VM; @@ -64,4 +65,24 @@ library UUPSProxyDeployer { console.log("Implementation deployed at:", implementation); return implementation; } + + /** + * Upgrades a UUPS proxy contract to a new implementation. + * @param proxyAddress address of the UUPS proxy contract to upgrade + * @param contractName name of the contract to upgrade (e.g. "ContractV2.sol:ContractV2") + * @param opts options for the upgrade, such as unsafeAllow and others. + * @param initData initialization data for the proxy contract after upgrade + * @return newImplementation address of the new implementation contract + */ + function executeUpgrade( + address proxyAddress, + string memory contractName, + bytes memory initData, + Options memory opts + ) internal returns (address newImplementation) { + Upgrades.upgradeProxy(proxyAddress, contractName, initData, opts); + newImplementation = Upgrades.getImplementationAddress(proxyAddress); + console.log("Upgraded", contractName, " proxy to new implementation", newImplementation); + return newImplementation; + } } diff --git a/script/lib/UpgradeUtils.sol b/script/lib/UpgradeUtils.sol deleted file mode 100644 index 2eca2edc..00000000 --- a/script/lib/UpgradeUtils.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-FileCopyrightText: 2025 IEXEC BLOCKCHAIN TECH -// SPDX-License-Identifier: Apache-2.0 -pragma solidity ^0.8.22; - -import {Upgrades, Options} from "openzeppelin-foundry-upgrades/Upgrades.sol"; - -/** - * @title UpgradeUtils - * @notice Utility library for handling UUPS upgrades in a parameterized way - */ -library UpgradeUtils { - struct UpgradeParams { - address proxyAddress; - string contractName; - bytes constructorData; - uint256 newStateVariable; // For initialization - } - - // Event for upgrade tracking - event UpgradeExecuted(string contractName, address indexed proxy, address indexed newImplementation); - - /** - * @notice Executes an Adapter upgrade with V2 initialization - * @param params Upgrade parameters (rlcToken field is required for ADAPTER) - * @return newImplementationAddress Address of the new implementation - */ - function executeUpgrade(UpgradeParams memory params) internal returns (address) { - Options memory opts = _buildOptions(params); - bytes memory initData = abi.encodeWithSignature("initializeV2(uint256)", params.newStateVariable); - - Upgrades.upgradeProxy(params.proxyAddress, params.contractName, initData, opts); - address newImplementation = Upgrades.getImplementationAddress(params.proxyAddress); - emit UpgradeExecuted(params.contractName, params.proxyAddress, newImplementation); - - return newImplementation; - } - - /** - * @notice Builds Options struct for upgrades - * @param params Upgrade parameters - * @return opts Configured Options struct - */ - function _buildOptions(UpgradeParams memory params) private pure returns (Options memory opts) { - opts.constructorData = params.constructorData; - // Ignore check related to LayerZero contracts: - // - OAppSenderUpgradeable - // - OAppReceiverUpgradeable - // - OFTCoreUpgradeable - // - OAppCoreUpgradeable - opts.unsafeAllow = "constructor,state-variable-immutable,missing-initializer-call"; - } -} diff --git a/test/units/RLCLiquidityUnifierUpgrade.t.sol b/test/units/RLCLiquidityUnifierUpgrade.t.sol index ffa3412d..056a847b 100644 --- a/test/units/RLCLiquidityUnifierUpgrade.t.sol +++ b/test/units/RLCLiquidityUnifierUpgrade.t.sol @@ -3,12 +3,14 @@ pragma solidity ^0.8.22; import {TestHelperOz5} from "@layerzerolabs/test-devtools-evm-foundry/contracts/TestHelperOz5.sol"; -import {RLCLiquidityUnifierV2} from "../../src/mocks/RLCLiquidityUnifierV2Mock.sol"; import {RLCLiquidityUnifier} from "../../src/RLCLiquidityUnifier.sol"; import {TestUtils} from "./utils/TestUtils.sol"; -import {UpgradeUtils} from "../../script/lib/UpgradeUtils.sol"; +import {UUPSProxyUtils} from "../../script/lib/UUPSProxyUtils.sol"; import {RLCMock} from "./mocks/RLCMock.sol"; +import {RLCLiquidityUnifierV2} from "./mocks/RLCLiquidityUnifierV2Mock.sol"; +import {Upgrade as RLCLiquidityUnifierUpgradeScript} from "../../script/RLCLiquidityUnifier.s.sol"; +// TODO remove useless LZ setup (endpoint, ...). contract RLCLiquidityUnifierUpgradeTest is TestHelperOz5 { using TestUtils for *; @@ -55,18 +57,14 @@ contract RLCLiquidityUnifierUpgradeTest is TestHelperOz5 { assertTrue(rlcLiquidityUnifierV1.hasRole(rlcLiquidityUnifierV1.DEFAULT_ADMIN_ROLE(), admin)); assertTrue(rlcLiquidityUnifierV1.hasRole(rlcLiquidityUnifierV1.UPGRADER_ROLE(), upgrader)); - // 3. Perform upgrade using UpgradeUtils directly + // 3. Perform upgrade vm.startPrank(upgrader); - - UpgradeUtils.UpgradeParams memory params = UpgradeUtils.UpgradeParams({ + new RLCLiquidityUnifierUpgradeScript().upgrade({ proxyAddress: proxyAddress, + contractName: "RLCLiquidityUnifierV2Mock.sol:RLCLiquidityUnifierV2", constructorData: abi.encode(rlcToken), - contractName: "RLCLiquidityUnifierV2Mock.sol:RLCLiquidityUnifierV2", - newStateVariable: NEW_STATE_VARIABLE + initData: abi.encodeWithSignature("initializeV2(uint256)", NEW_STATE_VARIABLE) }); - - UpgradeUtils.executeUpgrade(params); - vm.stopPrank(); rlcLiquidityUnifierV2 = RLCLiquidityUnifierV2(proxyAddress); diff --git a/test/units/bridges/layerZero/IexecLayerZeroBridgeUpgrade.t.sol b/test/units/bridges/layerZero/IexecLayerZeroBridgeUpgrade.t.sol index ceec7cac..216911e0 100644 --- a/test/units/bridges/layerZero/IexecLayerZeroBridgeUpgrade.t.sol +++ b/test/units/bridges/layerZero/IexecLayerZeroBridgeUpgrade.t.sol @@ -3,11 +3,12 @@ pragma solidity ^0.8.22; import {TestHelperOz5} from "@layerzerolabs/test-devtools-evm-foundry/contracts/TestHelperOz5.sol"; -import {IexecLayerZeroBridgeV2} from "../../../../src/mocks/IexecLayerZeroBridgeV2Mock.sol"; +import {IexecLayerZeroBridgeV2} from "../../mocks/IexecLayerZeroBridgeV2Mock.sol"; import {TestUtils} from "./../../utils/TestUtils.sol"; -import {UpgradeUtils} from "../../../../script/lib/UpgradeUtils.sol"; +import {UUPSProxyUtils} from "../../../../script/lib/UUPSProxyUtils.sol"; import {IexecLayerZeroBridge} from "../../../../src/bridges/layerZero/IexecLayerZeroBridge.sol"; import {RLCCrosschainToken} from "../../../../src/RLCCrosschainToken.sol"; +import {Upgrade as IexecLayerZeroBridgeUpgradeScript} from "../../../../script/bridges/layerZero/IexecLayerZeroBridge.s.sol"; contract IexecLayerZeroBridgeUpgradeTest is TestHelperOz5 { using TestUtils for *; @@ -51,17 +52,14 @@ contract IexecLayerZeroBridgeUpgradeTest is TestHelperOz5 { assertTrue(iexecLayerZeroBridgeV1.hasRole(iexecLayerZeroBridgeV1.UPGRADER_ROLE(), upgrader)); assertTrue(iexecLayerZeroBridgeV1.hasRole(iexecLayerZeroBridgeV1.PAUSER_ROLE(), pauser)); - // 3. Perform upgrade using UpgradeUtils directly + // 3. Perform upgrade vm.startPrank(upgrader); - UpgradeUtils.UpgradeParams memory params = UpgradeUtils.UpgradeParams({ + new IexecLayerZeroBridgeUpgradeScript().upgrade({ proxyAddress: proxyAddress, + contractName: "IexecLayerZeroBridgeV2Mock.sol:IexecLayerZeroBridgeV2", constructorData: abi.encode(false, rlcCrosschainToken, mockEndpoint), - contractName: "IexecLayerZeroBridgeV2Mock.sol:IexecLayerZeroBridgeV2", - newStateVariable: NEW_STATE_VARIABLE + initData: abi.encodeWithSignature("initializeV2(uint256)", NEW_STATE_VARIABLE) }); - - UpgradeUtils.executeUpgrade(params); - vm.stopPrank(); iexecLayerZeroBridgeV2 = IexecLayerZeroBridgeV2(proxyAddress); diff --git a/src/mocks/IexecLayerZeroBridgeV2Mock.sol b/test/units/mocks/IexecLayerZeroBridgeV2Mock.sol similarity index 92% rename from src/mocks/IexecLayerZeroBridgeV2Mock.sol rename to test/units/mocks/IexecLayerZeroBridgeV2Mock.sol index 6ee77705..019d1f56 100644 --- a/src/mocks/IexecLayerZeroBridgeV2Mock.sol +++ b/test/units/mocks/IexecLayerZeroBridgeV2Mock.sol @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.22; -import {IexecLayerZeroBridge} from "../bridges/layerZero/IexecLayerZeroBridge.sol"; +import {IexecLayerZeroBridge} from "../../../src/bridges/layerZero/IexecLayerZeroBridge.sol"; /** * @title IexecLayerZeroBridgeV2 - V2 implementation with additional features diff --git a/src/mocks/RLCLiquidityUnifierV2Mock.sol b/test/units/mocks/RLCLiquidityUnifierV2Mock.sol similarity index 93% rename from src/mocks/RLCLiquidityUnifierV2Mock.sol rename to test/units/mocks/RLCLiquidityUnifierV2Mock.sol index 90644e20..2814bf5b 100644 --- a/src/mocks/RLCLiquidityUnifierV2Mock.sol +++ b/test/units/mocks/RLCLiquidityUnifierV2Mock.sol @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.22; -import {RLCLiquidityUnifier} from "../RLCLiquidityUnifier.sol"; +import {RLCLiquidityUnifier} from "../../../src/RLCLiquidityUnifier.sol"; /** * @title RLCLiquidityUnifierV2 - V2 implementation with additional features diff --git a/test/units/utils/TestUtils.sol b/test/units/utils/TestUtils.sol index 88671f8b..ddda46e1 100644 --- a/test/units/utils/TestUtils.sol +++ b/test/units/utils/TestUtils.sol @@ -6,7 +6,7 @@ import {CreateX} from "@createx/contracts/CreateX.sol"; import {OptionsBuilder} from "@layerzerolabs/oapp-evm/contracts/oapp/libs/OptionsBuilder.sol"; import {MessagingFee, SendParam} from "@layerzerolabs/oft-evm/contracts/interfaces/IOFT.sol"; import {IOFT} from "@layerzerolabs/oft-evm/contracts/interfaces/IOFT.sol"; -import {UUPSProxyDeployer} from "../../../script/lib/UUPSProxyDeployer.sol"; +import {UUPSProxyUtils} from "../../../script/lib/UUPSProxyUtils.sol"; import {RLCMock} from "../mocks/RLCMock.sol"; import {IexecLayerZeroBridge} from "../../../src/bridges/layerZero/IexecLayerZeroBridge.sol"; import {RLCLiquidityUnifier} from "../../../src/RLCLiquidityUnifier.sol"; @@ -45,7 +45,7 @@ library TestUtils { // Deploy Liquidity Unifier rlcLiquidityUnifier = RLCLiquidityUnifier( - UUPSProxyDeployer.deployUsingCreateX( + UUPSProxyUtils.deployUsingCreateX( "RLCLiquidityUnifier", abi.encode(rlcToken), abi.encodeWithSelector(RLCLiquidityUnifier.initialize.selector, initialAdmin, initialUpgrader), @@ -56,7 +56,7 @@ library TestUtils { // Deploy IexecLayerZeroBridgeAdapter iexecLayerZeroBridgeChainA = IexecLayerZeroBridge( - UUPSProxyDeployer.deployUsingCreateX( + UUPSProxyUtils.deployUsingCreateX( "IexecLayerZeroBridge", abi.encode(true, rlcLiquidityUnifier, lzEndpointSource), abi.encodeWithSelector( @@ -75,7 +75,7 @@ library TestUtils { ); // Deploy IexecLayerZeroBridge iexecLayerZeroBridgeChainB = IexecLayerZeroBridge( - UUPSProxyDeployer.deployUsingCreateX( + UUPSProxyUtils.deployUsingCreateX( "IexecLayerZeroBridge", abi.encode(false, rlcCrosschainToken, lzEndpointDestination), abi.encodeWithSelector(