From 57fc26f2ae9e0e480eeba2bdf3e95723417c75d9 Mon Sep 17 00:00:00 2001 From: gfournieriExec Date: Tue, 8 Jul 2025 11:34:30 +0200 Subject: [PATCH 1/8] refactor: Update deployment scripts and configuration for cross-chain functionality --- Makefile | 10 +++---- config/config.json | 14 +++++----- script/SendFromEthereumToArbitrum.s.sol | 9 ++++-- .../layerZero/IexecLayerZeroBridge.s.sol | 28 +++++++++---------- 4 files changed, 33 insertions(+), 28 deletions(-) diff --git a/Makefile b/Makefile index 485799e3..0f9a8908 100644 --- a/Makefile +++ b/Makefile @@ -67,10 +67,10 @@ deploy-on-testnets: OPTIONS="--verify --verifier etherscan --verifier-api-key $(ETHERSCAN_API_KEY) --verifier-url $(ETHERSCAN_API_URL)" deploy-all: # SOURCE_CHAIN, SOURCE_RPC, TARGET_CHAIN, TARGET_RPC, OPTIONS - $(MAKE) deploy-contract CONTRACT=RLCLiquidityUnifier CHAIN=$(SOURCE_CHAIN) RPC_URL=$(SOURCE_RPC) OPTIONS=$(OPTIONS) || true - $(MAKE) deploy-contract CONTRACT=bridges/layerZero/IexecLayerZeroBridge CHAIN=$(SOURCE_CHAIN) RPC_URL=$(SOURCE_RPC) OPTIONS=$(OPTIONS) || true - $(MAKE) deploy-contract CONTRACT=RLCCrosschainToken CHAIN=$(TARGET_CHAIN) RPC_URL=$(TARGET_RPC) OPTIONS=$(OPTIONS) || true - $(MAKE) deploy-contract CONTRACT=bridges/layerZero/IexecLayerZeroBridge CHAIN=$(TARGET_CHAIN) RPC_URL=$(TARGET_RPC) OPTIONS=$(OPTIONS) || true +# $(MAKE) deploy-contract CONTRACT=RLCLiquidityUnifier CHAIN=$(SOURCE_CHAIN) RPC_URL=$(SOURCE_RPC) OPTIONS=$(OPTIONS) || true +# $(MAKE) deploy-contract CONTRACT=bridges/layerZero/IexecLayerZeroBridge CHAIN=$(SOURCE_CHAIN) RPC_URL=$(SOURCE_RPC) OPTIONS=$(OPTIONS) || true +# $(MAKE) deploy-contract CONTRACT=RLCCrosschainToken CHAIN=$(TARGET_CHAIN) RPC_URL=$(TARGET_RPC) OPTIONS=$(OPTIONS) || true +# $(MAKE) deploy-contract CONTRACT=bridges/layerZero/IexecLayerZeroBridge CHAIN=$(TARGET_CHAIN) RPC_URL=$(TARGET_RPC) OPTIONS=$(OPTIONS) || true $(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 "Deployment completed." @@ -160,7 +160,7 @@ send-tokens-to-arbitrum-sepolia: --rpc-url $(SEPOLIA_RPC_URL) \ --account $(ACCOUNT) \ --broadcast \ - -vvv + -vvvvv send-tokens-to-sepolia: @echo "Sending tokens cross-chain... from Arbitrum SEPOLIA to SEPOLIA" diff --git a/config/config.json b/config/config.json index 74df7495..cb232b44 100644 --- a/config/config.json +++ b/config/config.json @@ -1,24 +1,24 @@ { "createxFactory": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed", - "initialAdmin": "0x29d9Fb59587Af02AE3Bee909BabdD0aC75580009", - "initialUpgrader": "0x29d9Fb59587Af02AE3Bee909BabdD0aC75580009", - "initialPauser": "0x29d9Fb59587Af02AE3Bee909BabdD0aC75580009", + "initialAdmin": "0x9990cfb1Feb7f47297F54bef4d4EbeDf6c5463a3", + "initialUpgrader": "0x9990cfb1Feb7f47297F54bef4d4EbeDf6c5463a3", + "initialPauser": "0x9990cfb1Feb7f47297F54bef4d4EbeDf6c5463a3", "chains": { "sepolia": { "approvalRequired": true, "rlcAddress": "0x26A738b6D33EF4D94FF084D3552961b8f00639Cd", - "rlcLiquidityUnifierAddress": "0x6B4147eb1f2b30eF13758cB803A706286443d959", + "rlcLiquidityUnifierAddress": "0x7C84A73D0eBb7b2Db5160d34D812DC8632eE99DA", "rlcLiquidityUnifierCreatexSalt": "0x0000000000d33f5439d011d58213072dc8bd99dd22f7c6bd85ea442e75371c80", - "iexecLayerZeroBridgeAddress": "0x68cc55914CBC2630C2C60F49531E4b70b33399fF", + "iexecLayerZeroBridgeAddress": "0xcF9A304C10bCfB7f00b290B6B6efa7DB071b4d0F", "iexecLayerZeroBridgeCreatexSalt": "0x0000000000d33f5439d011d58213072dc8bd99dd22f7c6bd85ea442e75371c80", "lzEndpointAddress": "0x6EDCE65403992e310A62460808c4b910D972f10f", "lzChainId": 40161 }, "arbitrum_sepolia": { "approvalRequired": false, - "rlcCrosschainTokenAddress": "0xE377Ac9b7075421997ebaf0267813090b0277B39", + "rlcCrosschainTokenAddress": "0x84391E46F519131c66719dddF9be48a0a7808116", "rlcCrosschainTokenCreatexSalt": "0x0000000000d33f5439d011d58213072dc8bd99dd22f7c6bd85ea442e75371c80", - "iexecLayerZeroBridgeAddress": "0x62Fa14C85638Eb81Ef38121591DCB8E4E12ce9Fc", + "iexecLayerZeroBridgeAddress": "0x4FcE023890F5c9aCdb04645b2801fF89793DD84e", "iexecLayerZeroBridgeCreatexSalt": "0x0000000000d33f5439d011d58213072dc8bd99dd22f7c6bd85ea442e75371c80", "lzEndpointAddress": "0x6EDCE65403992e310A62460808c4b910D972f10f", "lzChainId": 40231 diff --git a/script/SendFromEthereumToArbitrum.s.sol b/script/SendFromEthereumToArbitrum.s.sol index a08ad71f..850c12c8 100644 --- a/script/SendFromEthereumToArbitrum.s.sol +++ b/script/SendFromEthereumToArbitrum.s.sol @@ -6,11 +6,12 @@ import {Script, console} from "forge-std/Script.sol"; import {IexecLayerZeroBridge} from "../src/bridges/layerZero/IexecLayerZeroBridge.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {SendParam} from "@layerzerolabs/oft-evm/contracts/interfaces/IOFT.sol"; -// import { OptionsBuilder } from "@layerzerolabs/oapp-evm/contracts/oapp/libs/OptionsBuilder.sol"; +import {OptionsBuilder} from "@layerzerolabs/oapp-evm/contracts/oapp/libs/OptionsBuilder.sol"; import {MessagingFee} from "@layerzerolabs/oapp-evm/contracts/oapp/OApp.sol"; import {ConfigLib} from "./lib/ConfigLib.sol"; contract SendTokensFromEthereumToArbitrum is Script { + using OptionsBuilder for bytes; /** * @dev Converts an address to bytes32. * @param _addr The address to convert. @@ -47,12 +48,16 @@ contract SendTokensFromEthereumToArbitrum is Script { console.log("Sending %s RLC to Arbitrum Sepolia", amount / 10 ** 9); console.log("Recipient: %s", recipientAddress); + // Build options with gas limit for the receiving chain + // bytes memory extraOptions = OptionsBuilder.newOptions().addExecutorLzReceiveOption(80_000, 0); + bytes memory extraOptions = OptionsBuilder.newOptions().addExecutorLzComposeOption(0, 90_000, 0); + SendParam memory sendParam = SendParam( destinationChainId, // Destination endpoint ID. addressToBytes32(recipientAddress), // Recipient address. amount, // Amount to send in local decimals. amount * 99 / 100, // Minimum amount to send in local decimals (allowing 1% slippage). - "", // Extra options, not used in this case, already setup using `setEnforcedOptions` + extraOptions, // Extra options with gas limit for the destination chain "", // Composed message for the send() operation, unused in this context. "" // OFT command to be executed, unused in default OFT implementations. ); diff --git a/script/bridges/layerZero/IexecLayerZeroBridge.s.sol b/script/bridges/layerZero/IexecLayerZeroBridge.s.sol index 1d9a514d..544a8c31 100644 --- a/script/bridges/layerZero/IexecLayerZeroBridge.s.sol +++ b/script/bridges/layerZero/IexecLayerZeroBridge.s.sol @@ -69,23 +69,23 @@ contract Configure is Script { ConfigLib.CommonConfigParams memory targetParams = ConfigLib.readCommonConfig(targetChain); IexecLayerZeroBridge sourceBridge = IexecLayerZeroBridge(sourceParams.iexecLayerZeroBridgeAddress); vm.startBroadcast(); - sourceBridge.setPeer( - targetParams.lzChainId, bytes32(uint256(uint160(targetParams.iexecLayerZeroBridgeAddress))) - ); + // sourceBridge.setPeer( + // targetParams.lzChainId, bytes32(uint256(uint160(targetParams.iexecLayerZeroBridgeAddress))) + // ); EnforcedOptionParam[] memory enforcedOptions = new EnforcedOptionParam[](1); bytes memory _extraOptions = OptionsBuilder.newOptions().addExecutorLzReceiveOption(70_000, 0); // 70_000 gas limit for the receiving executor and 0 for the executor's value - enforcedOptions[0] = EnforcedOptionParam(targetParams.lzChainId, 2, _extraOptions); + enforcedOptions[0] = EnforcedOptionParam(targetParams.lzChainId, 1, _extraOptions); sourceBridge.setEnforcedOptions(enforcedOptions); - // Authorize bridge in the relevant contract. - if (sourceParams.approvalRequired) { - RLCLiquidityUnifier rlcLiquidityUnifier = RLCLiquidityUnifier(sourceParams.rlcLiquidityUnifierAddress); - bytes32 bridgeTokenRoleId = rlcLiquidityUnifier.TOKEN_BRIDGE_ROLE(); - rlcLiquidityUnifier.grantRole(bridgeTokenRoleId, address(sourceBridge)); - } else { - RLCCrosschainToken rlcCrosschainToken = RLCCrosschainToken(sourceParams.rlcCrosschainTokenAddress); - bytes32 bridgeTokenRoleId = rlcCrosschainToken.TOKEN_BRIDGE_ROLE(); - rlcCrosschainToken.grantRole(bridgeTokenRoleId, address(sourceBridge)); - } + // // Authorize bridge in the relevant contract. + // if (sourceParams.approvalRequired) { + // RLCLiquidityUnifier rlcLiquidityUnifier = RLCLiquidityUnifier(sourceParams.rlcLiquidityUnifierAddress); + // bytes32 bridgeTokenRoleId = rlcLiquidityUnifier.TOKEN_BRIDGE_ROLE(); + // rlcLiquidityUnifier.grantRole(bridgeTokenRoleId, address(sourceBridge)); + // } else { + // RLCCrosschainToken rlcCrosschainToken = RLCCrosschainToken(sourceParams.rlcCrosschainTokenAddress); + // bytes32 bridgeTokenRoleId = rlcCrosschainToken.TOKEN_BRIDGE_ROLE(); + // rlcCrosschainToken.grantRole(bridgeTokenRoleId, address(sourceBridge)); + // } vm.stopBroadcast(); } From 3afe93326024d8a3b17fefcf8f7245fb935b6cc5 Mon Sep 17 00:00:00 2001 From: gfournieriExec Date: Tue, 8 Jul 2025 12:31:24 +0200 Subject: [PATCH 2/8] fix: Remove unused extra options in cross-chain token transfer --- script/SendFromEthereumToArbitrum.s.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/SendFromEthereumToArbitrum.s.sol b/script/SendFromEthereumToArbitrum.s.sol index 850c12c8..88901e1d 100644 --- a/script/SendFromEthereumToArbitrum.s.sol +++ b/script/SendFromEthereumToArbitrum.s.sol @@ -57,7 +57,7 @@ contract SendTokensFromEthereumToArbitrum is Script { addressToBytes32(recipientAddress), // Recipient address. amount, // Amount to send in local decimals. amount * 99 / 100, // Minimum amount to send in local decimals (allowing 1% slippage). - extraOptions, // Extra options with gas limit for the destination chain + "", // Extra options with gas limit for the destination chain "", // Composed message for the send() operation, unused in this context. "" // OFT command to be executed, unused in default OFT implementations. ); From f16222e2b34c53285bcfa03dff1997479e4059a9 Mon Sep 17 00:00:00 2001 From: gfournieriExec Date: Tue, 8 Jul 2025 14:09:48 +0200 Subject: [PATCH 3/8] refactor: Update cross-chain token transfer options for improved gas management --- script/SendFromEthereumToArbitrum.s.sol | 2 -- 1 file changed, 2 deletions(-) diff --git a/script/SendFromEthereumToArbitrum.s.sol b/script/SendFromEthereumToArbitrum.s.sol index 88901e1d..1b17bed2 100644 --- a/script/SendFromEthereumToArbitrum.s.sol +++ b/script/SendFromEthereumToArbitrum.s.sol @@ -49,8 +49,6 @@ contract SendTokensFromEthereumToArbitrum is Script { console.log("Recipient: %s", recipientAddress); // Build options with gas limit for the receiving chain - // bytes memory extraOptions = OptionsBuilder.newOptions().addExecutorLzReceiveOption(80_000, 0); - bytes memory extraOptions = OptionsBuilder.newOptions().addExecutorLzComposeOption(0, 90_000, 0); SendParam memory sendParam = SendParam( destinationChainId, // Destination endpoint ID. From 4eaaf25e313e8eb30454dc97ccacbbe24c65aaa0 Mon Sep 17 00:00:00 2001 From: gfournieriExec Date: Tue, 8 Jul 2025 14:21:15 +0200 Subject: [PATCH 4/8] fix: Ensure broadcasting starts before executing cross-chain transfer --- script/SendFromArbitrumToEthereum.s.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/SendFromArbitrumToEthereum.s.sol b/script/SendFromArbitrumToEthereum.s.sol index 5da49e3e..92daa76b 100644 --- a/script/SendFromArbitrumToEthereum.s.sol +++ b/script/SendFromArbitrumToEthereum.s.sol @@ -52,7 +52,7 @@ contract SendTokensFromArbitrumToEthereum is Script { // Get the fee for the transfer MessagingFee memory fee = iexecLayerZeroBridge.quoteSend(sendParam, false); console.log("Fee amount: ", fee.nativeFee); - + vm.startBroadcast(); // Execute the cross-chain transfer iexecLayerZeroBridge.send{value: fee.nativeFee}(sendParam, fee, msg.sender); From 88c614838e9bb8538d2fca4a8a54c71617b9c227 Mon Sep 17 00:00:00 2001 From: gfournieriExec Date: Tue, 8 Jul 2025 14:22:31 +0200 Subject: [PATCH 5/8] refactor: Remove commented-out deploy commands and adjust verbosity for token sending --- Makefile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 0f9a8908..e4af1767 100644 --- a/Makefile +++ b/Makefile @@ -67,10 +67,10 @@ deploy-on-testnets: OPTIONS="--verify --verifier etherscan --verifier-api-key $(ETHERSCAN_API_KEY) --verifier-url $(ETHERSCAN_API_URL)" deploy-all: # SOURCE_CHAIN, SOURCE_RPC, TARGET_CHAIN, TARGET_RPC, OPTIONS -# $(MAKE) deploy-contract CONTRACT=RLCLiquidityUnifier CHAIN=$(SOURCE_CHAIN) RPC_URL=$(SOURCE_RPC) OPTIONS=$(OPTIONS) || true -# $(MAKE) deploy-contract CONTRACT=bridges/layerZero/IexecLayerZeroBridge CHAIN=$(SOURCE_CHAIN) RPC_URL=$(SOURCE_RPC) OPTIONS=$(OPTIONS) || true -# $(MAKE) deploy-contract CONTRACT=RLCCrosschainToken CHAIN=$(TARGET_CHAIN) RPC_URL=$(TARGET_RPC) OPTIONS=$(OPTIONS) || true -# $(MAKE) deploy-contract CONTRACT=bridges/layerZero/IexecLayerZeroBridge CHAIN=$(TARGET_CHAIN) RPC_URL=$(TARGET_RPC) OPTIONS=$(OPTIONS) || true + $(MAKE) deploy-contract CONTRACT=RLCLiquidityUnifier CHAIN=$(SOURCE_CHAIN) RPC_URL=$(SOURCE_RPC) OPTIONS="$(OPTIONS)" + $(MAKE) deploy-contract CONTRACT=bridges/layerZero/IexecLayerZeroBridge CHAIN=$(SOURCE_CHAIN) RPC_URL=$(SOURCE_RPC) OPTIONS="$(OPTIONS)" + $(MAKE) deploy-contract CONTRACT=RLCCrosschainToken CHAIN=$(TARGET_CHAIN) RPC_URL=$(TARGET_RPC) OPTIONS="$(OPTIONS)" + $(MAKE) deploy-contract CONTRACT=bridges/layerZero/IexecLayerZeroBridge CHAIN=$(TARGET_CHAIN) RPC_URL=$(TARGET_RPC) OPTIONS="$(OPTIONS)" $(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 "Deployment completed." @@ -160,7 +160,7 @@ send-tokens-to-arbitrum-sepolia: --rpc-url $(SEPOLIA_RPC_URL) \ --account $(ACCOUNT) \ --broadcast \ - -vvvvv + -vvv send-tokens-to-sepolia: @echo "Sending tokens cross-chain... from Arbitrum SEPOLIA to SEPOLIA" From d047c264d5ccb286008887c28315bd849097cfb3 Mon Sep 17 00:00:00 2001 From: gfournieriExec Date: Tue, 8 Jul 2025 14:25:02 +0200 Subject: [PATCH 6/8] refactor: Clean up commented-out code and adjust enforced options for cross-chain bridge configuration --- script/SendFromEthereumToArbitrum.s.sol | 7 ++--- .../layerZero/IexecLayerZeroBridge.s.sol | 28 +++++++++---------- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/script/SendFromEthereumToArbitrum.s.sol b/script/SendFromEthereumToArbitrum.s.sol index 1b17bed2..a08ad71f 100644 --- a/script/SendFromEthereumToArbitrum.s.sol +++ b/script/SendFromEthereumToArbitrum.s.sol @@ -6,12 +6,11 @@ import {Script, console} from "forge-std/Script.sol"; import {IexecLayerZeroBridge} from "../src/bridges/layerZero/IexecLayerZeroBridge.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {SendParam} from "@layerzerolabs/oft-evm/contracts/interfaces/IOFT.sol"; -import {OptionsBuilder} from "@layerzerolabs/oapp-evm/contracts/oapp/libs/OptionsBuilder.sol"; +// import { OptionsBuilder } from "@layerzerolabs/oapp-evm/contracts/oapp/libs/OptionsBuilder.sol"; import {MessagingFee} from "@layerzerolabs/oapp-evm/contracts/oapp/OApp.sol"; import {ConfigLib} from "./lib/ConfigLib.sol"; contract SendTokensFromEthereumToArbitrum is Script { - using OptionsBuilder for bytes; /** * @dev Converts an address to bytes32. * @param _addr The address to convert. @@ -48,14 +47,12 @@ contract SendTokensFromEthereumToArbitrum is Script { console.log("Sending %s RLC to Arbitrum Sepolia", amount / 10 ** 9); console.log("Recipient: %s", recipientAddress); - // Build options with gas limit for the receiving chain - SendParam memory sendParam = SendParam( destinationChainId, // Destination endpoint ID. addressToBytes32(recipientAddress), // Recipient address. amount, // Amount to send in local decimals. amount * 99 / 100, // Minimum amount to send in local decimals (allowing 1% slippage). - "", // Extra options with gas limit for the destination chain + "", // Extra options, not used in this case, already setup using `setEnforcedOptions` "", // Composed message for the send() operation, unused in this context. "" // OFT command to be executed, unused in default OFT implementations. ); diff --git a/script/bridges/layerZero/IexecLayerZeroBridge.s.sol b/script/bridges/layerZero/IexecLayerZeroBridge.s.sol index 0b69ccb7..d6541999 100644 --- a/script/bridges/layerZero/IexecLayerZeroBridge.s.sol +++ b/script/bridges/layerZero/IexecLayerZeroBridge.s.sol @@ -69,23 +69,23 @@ contract Configure is Script { ConfigLib.CommonConfigParams memory targetParams = ConfigLib.readCommonConfig(targetChain); IexecLayerZeroBridge sourceBridge = IexecLayerZeroBridge(sourceParams.iexecLayerZeroBridgeAddress); vm.startBroadcast(); - // sourceBridge.setPeer( - // targetParams.lzChainId, bytes32(uint256(uint160(targetParams.iexecLayerZeroBridgeAddress))) - // ); + sourceBridge.setPeer( + targetParams.lzChainId, bytes32(uint256(uint160(targetParams.iexecLayerZeroBridgeAddress))) + ); EnforcedOptionParam[] memory enforcedOptions = new EnforcedOptionParam[](1); bytes memory _extraOptions = OptionsBuilder.newOptions().addExecutorLzReceiveOption(70_000, 0); // 70_000 gas limit for the receiving executor and 0 for the executor's value - enforcedOptions[0] = EnforcedOptionParam(targetParams.lzChainId, 1, _extraOptions); + enforcedOptions[0] = EnforcedOptionParam(targetParams.lzChainId, 2, _extraOptions); sourceBridge.setEnforcedOptions(enforcedOptions); - // // Authorize bridge in the relevant contract. - // if (sourceParams.approvalRequired) { - // RLCLiquidityUnifier rlcLiquidityUnifier = RLCLiquidityUnifier(sourceParams.rlcLiquidityUnifierAddress); - // bytes32 bridgeTokenRoleId = rlcLiquidityUnifier.TOKEN_BRIDGE_ROLE(); - // rlcLiquidityUnifier.grantRole(bridgeTokenRoleId, address(sourceBridge)); - // } else { - // RLCCrosschainToken rlcCrosschainToken = RLCCrosschainToken(sourceParams.rlcCrosschainTokenAddress); - // bytes32 bridgeTokenRoleId = rlcCrosschainToken.TOKEN_BRIDGE_ROLE(); - // rlcCrosschainToken.grantRole(bridgeTokenRoleId, address(sourceBridge)); - // } + // Authorize bridge in the relevant contract. + if (sourceParams.approvalRequired) { + RLCLiquidityUnifier rlcLiquidityUnifier = RLCLiquidityUnifier(sourceParams.rlcLiquidityUnifierAddress); + bytes32 bridgeTokenRoleId = rlcLiquidityUnifier.TOKEN_BRIDGE_ROLE(); + rlcLiquidityUnifier.grantRole(bridgeTokenRoleId, address(sourceBridge)); + } else { + RLCCrosschainToken rlcCrosschainToken = RLCCrosschainToken(sourceParams.rlcCrosschainTokenAddress); + bytes32 bridgeTokenRoleId = rlcCrosschainToken.TOKEN_BRIDGE_ROLE(); + rlcCrosschainToken.grantRole(bridgeTokenRoleId, address(sourceBridge)); + } vm.stopBroadcast(); } From a01dd2a951ab4dcdf1683a8d77f518048badde5d Mon Sep 17 00:00:00 2001 From: gfournieriExec Date: Tue, 8 Jul 2025 14:37:53 +0200 Subject: [PATCH 7/8] fix: Update enforced options for source bridge configuration to support multiple parameters --- script/bridges/layerZero/IexecLayerZeroBridge.s.sol | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/script/bridges/layerZero/IexecLayerZeroBridge.s.sol b/script/bridges/layerZero/IexecLayerZeroBridge.s.sol index d6541999..3172c7ec 100644 --- a/script/bridges/layerZero/IexecLayerZeroBridge.s.sol +++ b/script/bridges/layerZero/IexecLayerZeroBridge.s.sol @@ -72,9 +72,10 @@ contract Configure is Script { sourceBridge.setPeer( targetParams.lzChainId, bytes32(uint256(uint160(targetParams.iexecLayerZeroBridgeAddress))) ); - EnforcedOptionParam[] memory enforcedOptions = new EnforcedOptionParam[](1); + EnforcedOptionParam[] memory enforcedOptions = new EnforcedOptionParam[](2); bytes memory _extraOptions = OptionsBuilder.newOptions().addExecutorLzReceiveOption(70_000, 0); // 70_000 gas limit for the receiving executor and 0 for the executor's value - enforcedOptions[0] = EnforcedOptionParam(targetParams.lzChainId, 2, _extraOptions); + enforcedOptions[0] = EnforcedOptionParam(targetParams.lzChainId, 1, _extraOptions); + enforcedOptions[1] = EnforcedOptionParam(targetParams.lzChainId, 2, _extraOptions); sourceBridge.setEnforcedOptions(enforcedOptions); // Authorize bridge in the relevant contract. if (sourceParams.approvalRequired) { From 0790644789ffc54d25411a938842cf512ab6a862 Mon Sep 17 00:00:00 2001 From: gfournieriExec <100280020+gfournieriExec@users.noreply.github.com> Date: Tue, 8 Jul 2025 15:02:44 +0200 Subject: [PATCH 8/8] Update script/bridges/layerZero/IexecLayerZeroBridge.s.sol Co-authored-by: Zied Guesmi <26070035+zguesmi@users.noreply.github.com> --- script/bridges/layerZero/IexecLayerZeroBridge.s.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/script/bridges/layerZero/IexecLayerZeroBridge.s.sol b/script/bridges/layerZero/IexecLayerZeroBridge.s.sol index 3172c7ec..769d3c86 100644 --- a/script/bridges/layerZero/IexecLayerZeroBridge.s.sol +++ b/script/bridges/layerZero/IexecLayerZeroBridge.s.sol @@ -74,8 +74,8 @@ contract Configure is Script { ); EnforcedOptionParam[] memory enforcedOptions = new EnforcedOptionParam[](2); bytes memory _extraOptions = OptionsBuilder.newOptions().addExecutorLzReceiveOption(70_000, 0); // 70_000 gas limit for the receiving executor and 0 for the executor's value - enforcedOptions[0] = EnforcedOptionParam(targetParams.lzChainId, 1, _extraOptions); - enforcedOptions[1] = EnforcedOptionParam(targetParams.lzChainId, 2, _extraOptions); + enforcedOptions[0] = EnforcedOptionParam(targetParams.lzChainId, 1, _extraOptions); // lzReceive + enforcedOptions[1] = EnforcedOptionParam(targetParams.lzChainId, 2, _extraOptions); // lzCompose sourceBridge.setEnforcedOptions(enforcedOptions); // Authorize bridge in the relevant contract. if (sourceParams.approvalRequired) {