From e775788549d0b2ec964141b2d646e67b3fe6bde8 Mon Sep 17 00:00:00 2001 From: sanchaymittal Date: Tue, 2 May 2023 19:01:45 +0900 Subject: [PATCH 1/4] add: transaction asset relayerfee option --- .../optimism/connectors/connext/helpers.sol | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/contracts/optimism/connectors/connext/helpers.sol b/contracts/optimism/connectors/connext/helpers.sol index 4196c05c..7b4586a8 100644 --- a/contracts/optimism/connectors/connext/helpers.sol +++ b/contracts/optimism/connectors/connext/helpers.sol @@ -22,6 +22,7 @@ contract Helpers is DSMath, Basic { * @param slippage Maximum amount of slippage the user will accept in BPS. * @param relayerFee Relayer fee paid in origin native asset. * @param callData Encoded calldata to send. + * @param nativeRelayerFee booleam choice for relayer fee asset selection. */ struct XCallParams { uint32 destination; @@ -32,9 +33,10 @@ contract Helpers is DSMath, Basic { uint256 slippage; uint256 relayerFee; bytes callData; + bool nativeRelayerFee; } - function _xcall(XCallParams memory params) internal { + function _xcallFeeNativeAsset(XCallParams memory params) internal { connext.xcall{ value: params.relayerFee }( params.destination, params.to, @@ -45,4 +47,17 @@ contract Helpers is DSMath, Basic { params.callData ); } + + function _xcallFeeTransactingAsseet(XCallParams memory params) internal { + connext.xcall( + params.destination, + params.to, + params.asset, + params.delegate, + params.amount - params.relayerFee, + params.slippage, + params.callData, + params.relayerFee + ); + } } From 90e60093f1dc0cdf661fe4c9621cd4c74e9fbf42 Mon Sep 17 00:00:00 2001 From: sanchaymittal Date: Tue, 2 May 2023 19:01:55 +0900 Subject: [PATCH 2/4] update: interface --- .../optimism/connectors/connext/interface.sol | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/contracts/optimism/connectors/connext/interface.sol b/contracts/optimism/connectors/connext/interface.sol index 55b4b62f..d99ccf6b 100644 --- a/contracts/optimism/connectors/connext/interface.sol +++ b/contracts/optimism/connectors/connext/interface.sol @@ -2,13 +2,26 @@ pragma solidity ^0.7.0; interface IConnext { - function xcall( - uint32 _destination, - address _to, - address _asset, - address _delegate, - uint256 _amount, - uint256 _slippage, - bytes calldata _callData - ) external payable returns (bytes32); + // ============ BRIDGE ============== + + function xcall( + uint32 _destination, + address _to, + address _asset, + address _delegate, + uint256 _amount, + uint256 _slippage, + bytes calldata _callData + ) external payable returns (bytes32); + + function xcall( + uint32 _destination, + address _to, + address _asset, + address _delegate, + uint256 _amount, + uint256 _slippage, + bytes calldata _callData, + uint256 _relayerFee + ) external returns (bytes32); } From cc86425ff164754847e656a5cb99595d63b6a960 Mon Sep 17 00:00:00 2001 From: sanchaymittal Date: Tue, 2 May 2023 19:02:18 +0900 Subject: [PATCH 3/4] add: conditional statement for selection --- contracts/optimism/connectors/connext/main.sol | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/contracts/optimism/connectors/connext/main.sol b/contracts/optimism/connectors/connext/main.sol index 0f76a7e0..e93103f8 100644 --- a/contracts/optimism/connectors/connext/main.sol +++ b/contracts/optimism/connectors/connext/main.sol @@ -45,7 +45,14 @@ abstract contract ConnextResolver is Helpers { params.amount = _amount; approve(tokenContract, connextAddr, _amount); - _xcall(params); + + /// check if user provided relayerFee under native asset or transacting asset + if(params.nativeRelayerFee){ + _xcallFeeNativeAsset(params); + } + else{ + _xcallFeeTransactingAsseet(params); + } setUint(setId, _amount); _eventName = "LogXCall(uint32,address,address,address,uint256,uint256,uint256,uint256)"; From 312a19d9f6b07d449818755ab2382742fa14d7c2 Mon Sep 17 00:00:00 2001 From: sanchaymittal Date: Tue, 2 May 2023 19:02:30 +0900 Subject: [PATCH 4/4] update: unit test --- test/optimism/connext/connext.test.ts | 40 +++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/test/optimism/connext/connext.test.ts b/test/optimism/connext/connext.test.ts index ff856943..a846d1dc 100644 --- a/test/optimism/connext/connext.test.ts +++ b/test/optimism/connext/connext.test.ts @@ -97,6 +97,7 @@ describe("Connext Connector [Optimism]", () => { const slippage = 10000; const relayerFee = ethers.utils.parseEther("1"); const callData = "0x"; + const nativeRelayerFee = true; const xcallParams: any = [ domainId, @@ -106,7 +107,8 @@ describe("Connext Connector [Optimism]", () => { amount, slippage, relayerFee, - callData + callData, + nativeRelayerFee ]; const spells = [ @@ -127,6 +129,7 @@ describe("Connext Connector [Optimism]", () => { const slippage = 10000; const relayerFee = ethers.utils.parseEther("1"); const callData = "0x"; + const nativeRelayerFee = true; const xcallParams: any = [ domainId, @@ -136,7 +139,40 @@ describe("Connext Connector [Optimism]", () => { amount, slippage, relayerFee, - callData + callData, + nativeRelayerFee + ]; + + const spells = [ + { + connector: connectorName, + method: "xcall", + args: [xcallParams, 0, 0] + } + ]; + + const tx = await dsaWallet0.connect(wallet0).cast(...encodeSpells(spells), wallet1.address); + const receipt = await tx.wait(); + }); + + it("should xcall with usdc, relayerfee using transacting asset", async () => { + const amount = ethers.utils.parseUnits("5", 6); + const domainId = 6648936; + const slippage = 10000; + const relayerFee = ethers.utils.parseEther("1"); + const callData = "0x"; + const nativeRelayerFee = false; + + const xcallParams: any = [ + domainId, + wallet1.address, + usdcAddr, + wallet1.address, + amount, + slippage, + relayerFee, + callData, + nativeRelayerFee ]; const spells = [