Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 29 additions & 43 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ clean:
forge clean

#
# High-level deployment targets
# Deployment targets
#

deploy-on-anvil:
Expand Down Expand Up @@ -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 \
Expand All @@ -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) \
Expand All @@ -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 \
Expand Down
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -229,15 +229,15 @@ 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

Execute upgrades on live networks:

```bash
make upgrade-on-mainnets
make upgrade-bridge-on-mainnets
```

### Upgrade Safety Features
Expand Down Expand Up @@ -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.).
Expand Down
8 changes: 4 additions & 4 deletions docs/soldoc/src/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -229,15 +229,15 @@ 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

Execute upgrades on live networks:

```bash
make upgrade-on-mainnets
make upgrade-bridge-on-mainnets
```

### Upgrade Safety Features
Expand Down Expand Up @@ -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.).
Expand Down
6 changes: 6 additions & 0 deletions script/RLCCrosschainToken.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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!");
}
}
15 changes: 2 additions & 13 deletions script/RLCLiquidityUnifier.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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!");
}
}
4 changes: 2 additions & 2 deletions script/SendFromArbitrumToEthereum.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
4 changes: 2 additions & 2 deletions script/SendFromEthereumToArbitrum.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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
/**
Expand Down
20 changes: 2 additions & 18 deletions script/bridges/layerZero/IexecLayerZeroBridge.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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!");
}
}
2 changes: 1 addition & 1 deletion test/units/RLCLiquidityUnifierUpgrade.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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 *;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down