diff --git a/Makefile b/Makefile index 713cabb0..47793fff 100644 --- a/Makefile +++ b/Makefile @@ -45,7 +45,7 @@ clean: forge clean # -# High-level deployment targets +# Deployment targets # deploy-on-anvil: @@ -78,51 +78,38 @@ deploy-all: # SOURCE_CHAIN, SOURCE_RPC, TARGET_CHAIN, TARGET_RPC @echo "⚠️ Run 'make configure-all' to configure bridges." @echo "⚠️ Please configure the bridges. Do not forget to authorize the RLCLiquidityUnifier and RLCCrosschainToken contracts on the bridges." -configure-all: # SOURCE_CHAIN, TARGET_CHAIN, SOURCE_RPC, TARGET_RPC - $(MAKE) configure-bridge SOURCE_CHAIN=$(SOURCE_CHAIN) TARGET_CHAIN=$(TARGET_CHAIN) RPC_URL=$(SOURCE_RPC) - $(MAKE) configure-bridge SOURCE_CHAIN=$(TARGET_CHAIN) TARGET_CHAIN=$(SOURCE_CHAIN) RPC_URL=$(TARGET_RPC) - @echo "Bridge configuration completed." +deploy-contract: # CONTRACT, CHAIN, RPC_URL + @echo "Deploying $(CONTRACT) on $(CHAIN)" + CHAIN=$(CHAIN) forge script script/$(CONTRACT).s.sol:Deploy \ + --rpc-url $(RPC_URL) \ + $$(if [ "$(CI)" = "true" ]; then echo "--private-key $(DEPLOYER_PRIVATE_KEY)"; else echo "--account $(ACCOUNT)"; fi) \ + --broadcast \ + -vvv # -# High-level upgrade targets +# Upgrade targets # -upgrade-on-anvil: - $(MAKE) upgrade-all \ +upgrade-bridge-on-anvil: + $(MAKE) upgrade-bridge \ 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 \ +upgrade-bridge-on-mainnets: + $(MAKE) upgrade-bridge \ SOURCE_CHAIN=ethereum SOURCE_RPC=$(ETHEREUM_RPC_URL) \ TARGET_CHAIN=arbitrum TARGET_RPC=$(ARBITRUM_RPC_URL) \ # TODO : RLCMultichain and RLCLiquidityUnifier upgrades -upgrade-on-testnets: - $(MAKE) upgrade-all \ +upgrade-bridge-on-testnets: + $(MAKE) upgrade-bridge \ SOURCE_CHAIN=sepolia SOURCE_RPC=$(SEPOLIA_RPC_URL) \ TARGET_CHAIN=arbitrum_sepolia TARGET_RPC=$(ARBITRUM_SEPOLIA_RPC_URL) \ -upgrade-all: # SOURCE_CHAIN, SOURCE_RPC, TARGET_CHAIN, TARGET_RPC +upgrade-bridge: # SOURCE_CHAIN, SOURCE_RPC, TARGET_CHAIN, TARGET_RPC $(MAKE) upgrade-contract CONTRACT=bridges/layerZero/IexecLayerZeroBridge CHAIN=$(SOURCE_CHAIN) RPC_URL=$(SOURCE_RPC) $(MAKE) upgrade-contract CONTRACT=bridges/layerZero/IexecLayerZeroBridge CHAIN=$(TARGET_CHAIN) RPC_URL=$(TARGET_RPC) -# -# Generic deployment targets -# - -deploy-contract: # CONTRACT, CHAIN, RPC_URL - @echo "Deploying $(CONTRACT) on $(CHAIN)" - CHAIN=$(CHAIN) forge script script/$(CONTRACT).s.sol:Deploy \ - --rpc-url $(RPC_URL) \ - $$(if [ "$(CI)" = "true" ]; then echo "--private-key $(DEPLOYER_PRIVATE_KEY)"; else echo "--account $(ACCOUNT)"; fi) \ - --broadcast \ - -vvv - -# -# Generic upgrade targets -# - upgrade-contract: # CONTRACT, CHAIN, RPC_URL @echo "Upgrading $(CONTRACT) on $(CHAIN)" CHAIN=$(CHAIN) forge script script/$(CONTRACT).s.sol:Upgrade \ @@ -132,9 +119,14 @@ upgrade-contract: # CONTRACT, CHAIN, RPC_URL -vvv # -# Generic configuration targets +# Configuration targets # +configure-all: # SOURCE_CHAIN, TARGET_CHAIN, SOURCE_RPC, TARGET_RPC + $(MAKE) configure-bridge SOURCE_CHAIN=$(SOURCE_CHAIN) TARGET_CHAIN=$(TARGET_CHAIN) RPC_URL=$(SOURCE_RPC) + $(MAKE) configure-bridge SOURCE_CHAIN=$(TARGET_CHAIN) TARGET_CHAIN=$(SOURCE_CHAIN) RPC_URL=$(TARGET_RPC) + @echo "Bridge configuration completed." + configure-bridge: # SOURCE_CHAIN, TARGET_CHAIN, RPC_URL @echo "Configuring LayerZero Bridge $(SOURCE_CHAIN) -> $(TARGET_CHAIN)" SOURCE_CHAIN=$(SOURCE_CHAIN) TARGET_CHAIN=$(TARGET_CHAIN) \ @@ -145,37 +137,31 @@ configure-bridge: # SOURCE_CHAIN, TARGET_CHAIN, RPC_URL -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. -# - # Testnet bridge operations +# send-tokens-to-arbitrum-sepolia: @echo "Sending tokens cross-chain... from SEPOLIA to Arbitrum SEPOLIA" SOURCE_CHAIN=sepolia TARGET_CHAIN=arbitrum_sepolia \ - forge script script/SendFromEthereumToArbitrum.s.sol:SendTokensFromEthereumToArbitrum \ + forge script script/SendFromEthereumToArbitrum.s.sol:SendFromEthereumToArbitrum \ --rpc-url $(SEPOLIA_RPC_URL) \ --account $(ACCOUNT) \ --broadcast \ -vvv -send-tokens-to-sepolia: +send-tokens-to-ethereum-sepolia: @echo "Sending tokens cross-chain... from Arbitrum SEPOLIA to SEPOLIA" SOURCE_CHAIN=arbitrum_sepolia TARGET_CHAIN=sepolia \ - forge script script/SendFromArbitrumToEthereum.s.sol:SendTokensFromArbitrumToEthereum \ + forge script script/SendFromArbitrumToEthereum.s.sol:SendFromArbitrumToEthereum \ --rpc-url $(ARBITRUM_SEPOLIA_RPC_URL) \ --account $(ACCOUNT) \ --broadcast \ -vvv +# # Mainnet bridge operations +# + send-tokens-to-arbitrum-mainnet: @echo "Sending tokens cross-chain... from ETHEREUM to Arbitrum MAINNET" SOURCE_CHAIN=ethereum TARGET_CHAIN=arbitrum \ diff --git a/README.md b/README.md index 3d2ed4b1..a56b1dc6 100644 --- a/README.md +++ b/README.md @@ -149,7 +149,7 @@ This will: B. To send RLC tokens from Arbitrum Sepolia back to Ethereum Sepolia: ```bash -make send-tokens-to-sepolia +make send-tokens-to-ethereum-sepolia ``` This will: @@ -229,7 +229,7 @@ Test upgrades locally before deploying to live networks: ```bash # Test upgrade process on local forks -make upgrade-on-anvil +make upgrade-bridge-on-anvil ``` #### 2. Live Network Upgrades @@ -237,7 +237,7 @@ make upgrade-on-anvil Execute upgrades on live networks: ```bash -make upgrade-on-mainnets +make upgrade-bridge-on-mainnets ``` ### Upgrade Safety Features @@ -310,7 +310,7 @@ Contracts are automatically verified on block explorers during deployment: make deploy-on-mainnets # Upgrades and verifies contracts on mainnet -make upgrade-on-mainnets +make upgrade-bridge-on-mainnets ``` The verification is handled by Foundry's built-in `--verify` flag, which submits the source code and constructor arguments to the respective block explorers (Etherscan, Arbiscan, etc.). diff --git a/docs/soldoc/src/README.md b/docs/soldoc/src/README.md index 3d2ed4b1..a56b1dc6 100644 --- a/docs/soldoc/src/README.md +++ b/docs/soldoc/src/README.md @@ -149,7 +149,7 @@ This will: B. To send RLC tokens from Arbitrum Sepolia back to Ethereum Sepolia: ```bash -make send-tokens-to-sepolia +make send-tokens-to-ethereum-sepolia ``` This will: @@ -229,7 +229,7 @@ Test upgrades locally before deploying to live networks: ```bash # Test upgrade process on local forks -make upgrade-on-anvil +make upgrade-bridge-on-anvil ``` #### 2. Live Network Upgrades @@ -237,7 +237,7 @@ make upgrade-on-anvil Execute upgrades on live networks: ```bash -make upgrade-on-mainnets +make upgrade-bridge-on-mainnets ``` ### Upgrade Safety Features @@ -310,7 +310,7 @@ Contracts are automatically verified on block explorers during deployment: make deploy-on-mainnets # Upgrades and verifies contracts on mainnet -make upgrade-on-mainnets +make upgrade-bridge-on-mainnets ``` The verification is handled by Foundry's built-in `--verify` flag, which submits the source code and constructor arguments to the respective block explorers (Etherscan, Arbiscan, etc.). diff --git a/script/RLCCrosschainToken.s.sol b/script/RLCCrosschainToken.s.sol index 07076e8f..dbc30659 100644 --- a/script/RLCCrosschainToken.s.sol +++ b/script/RLCCrosschainToken.s.sol @@ -61,3 +61,9 @@ contract Deploy is Script { return UUPSProxyDeployer.deployUsingCreateX("RLCCrosschainToken", "", initData, createxFactory, createxSalt); } } + +contract Upgrade is Script { + function run() external pure { + revert("Not implemented!"); + } +} diff --git a/script/RLCLiquidityUnifier.s.sol b/script/RLCLiquidityUnifier.s.sol index bb5a6147..dd0b6c8b 100644 --- a/script/RLCLiquidityUnifier.s.sol +++ b/script/RLCLiquidityUnifier.s.sol @@ -64,18 +64,7 @@ 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 - }); - UpgradeUtils.executeUpgrade(params); - vm.stopBroadcast(); + function run() external pure { + revert("Not implemented!"); } } diff --git a/script/SendFromArbitrumToEthereum.s.sol b/script/SendFromArbitrumToEthereum.s.sol index 6d7bea13..1039eb23 100644 --- a/script/SendFromArbitrumToEthereum.s.sol +++ b/script/SendFromArbitrumToEthereum.s.sol @@ -10,10 +10,10 @@ import {SendParam} from "@layerzerolabs/oft-evm/contracts/interfaces/IOFT.sol"; import {MessagingFee} from "@layerzerolabs/oapp-evm/contracts/oapp/OApp.sol"; /** - * Script to send tokens from Arbitrum Mainnet to Ethereum Mainnet. + * Script to send tokens from Arbitrum Mainnet/Testnet to Ethereum Mainnet/Testnet. * This script demonstrates cross-chain token transfers using LayerZero bridge. */ -// TODO: fusion SendTokensFromArbitrumToEthereum and SendTokensFromEthereumToArbitrum into a single script with dynamic chain handling +// TODO merge SendFromArbitrumToEthereum and SendFromEthereumToArbitrum into a single script. contract SendFromArbitrumToEthereum is Script { uint256 private constant TRANSFER_AMOUNT = 1 * 10 ** 9; // 1 RLC token with 9 decimals diff --git a/script/SendFromEthereumToArbitrum.s.sol b/script/SendFromEthereumToArbitrum.s.sol index f2026fd2..ac707272 100644 --- a/script/SendFromEthereumToArbitrum.s.sol +++ b/script/SendFromEthereumToArbitrum.s.sol @@ -10,10 +10,10 @@ import {SendParam} from "@layerzerolabs/oft-evm/contracts/interfaces/IOFT.sol"; import {MessagingFee} from "@layerzerolabs/oapp-evm/contracts/oapp/OApp.sol"; /** - * Script to send tokens from Ethereum Mainnet to Arbitrum Mainnet. + * Script to send tokens from Ethereum Mainnet/Testnet to Arbitrum Mainnet/Testnet. * This script demonstrates cross-chain token transfers using LayerZero bridge. */ -// TODO: fusion SendTokensFromArbitrumToEthereum and SendTokensFromEthereumToArbitrum into a single script with dynamic chain handling +// TODO merge SendFromArbitrumToEthereum and SendFromEthereumToArbitrum into a single script. contract SendFromEthereumToArbitrum is Script { uint256 private constant TRANSFER_AMOUNT = 1 * 10 ** 9; // 1 RLC token with 9 decimals /** diff --git a/script/bridges/layerZero/IexecLayerZeroBridge.s.sol b/script/bridges/layerZero/IexecLayerZeroBridge.s.sol index c1a856e2..7d539a3f 100644 --- a/script/bridges/layerZero/IexecLayerZeroBridge.s.sol +++ b/script/bridges/layerZero/IexecLayerZeroBridge.s.sol @@ -194,23 +194,7 @@ contract Configure is Script { * A script to upgrade the IexecLayerZeroBridge contract. */ 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 - }); - UpgradeUtils.executeUpgrade(params); - vm.stopBroadcast(); + function run() external pure { + revert("Not implemented!"); } } diff --git a/test/units/RLCLiquidityUnifierUpgrade.t.sol b/test/units/RLCLiquidityUnifierUpgrade.t.sol index cdb858c4..d10090d4 100644 --- a/test/units/RLCLiquidityUnifierUpgrade.t.sol +++ b/test/units/RLCLiquidityUnifierUpgrade.t.sol @@ -3,11 +3,11 @@ 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 {RLCMock} from "./mocks/RLCMock.sol"; +import {RLCLiquidityUnifierV2} from "./mocks/RLCLiquidityUnifierV2Mock.sol"; contract RLCLiquidityUnifierUpgradeTest is TestHelperOz5 { using TestUtils for *; diff --git a/test/units/bridges/layerZero/IexecLayerZeroBridgeUpgradeScript.t.sol b/test/units/bridges/layerZero/IexecLayerZeroBridgeUpgradeScript.t.sol index def6ef3a..7f8cc8b8 100644 --- a/test/units/bridges/layerZero/IexecLayerZeroBridgeUpgradeScript.t.sol +++ b/test/units/bridges/layerZero/IexecLayerZeroBridgeUpgradeScript.t.sol @@ -3,7 +3,7 @@ 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 {IexecLayerZeroBridge} from "../../../../src/bridges/layerZero/IexecLayerZeroBridge.sol"; 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