Skip to content

Commit bad56b8

Browse files
committed
support native eth in swapAndTransfer
1 parent 3453e10 commit bad56b8

File tree

5 files changed

+297
-46
lines changed

5 files changed

+297
-46
lines changed

EurekaHandler/broadcast/Upgrade.s.sol/1/run-1744276806.json

Lines changed: 112 additions & 0 deletions
Large diffs are not rendered by default.

EurekaHandler/broadcast/Upgrade.s.sol/1/run-1744276827.json

Lines changed: 112 additions & 0 deletions
Large diffs are not rendered by default.

EurekaHandler/broadcast/Upgrade.s.sol/1/run-latest.json

Lines changed: 42 additions & 42 deletions
Large diffs are not rendered by default.

EurekaHandler/src/EurekaHandler.sol

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,12 +72,20 @@ contract EurekaHandler is IEurekaHandler, Initializable, UUPSUpgradeable, Ownabl
7272
bytes memory swapCalldata,
7373
TransferParams memory transferParams,
7474
Fees memory fees
75-
) external {
75+
) external payable {
7676
require(block.timestamp < fees.quoteExpiry, "Fee quote expired");
7777

78-
IERC20(swapInputToken).safeTransferFrom(msg.sender, address(this), swapInputAmount);
78+
uint256 amountOut;
79+
if (swapInputToken == address(0)) {
80+
require(msg.value == swapInputAmount, "Insufficient native token");
81+
82+
amountOut = _swapNative(transferParams.token, swapInputAmount, swapCalldata);
83+
} else {
84+
IERC20(swapInputToken).safeTransferFrom(msg.sender, address(this), swapInputAmount);
85+
86+
amountOut = _swap(swapInputToken, transferParams.token, swapInputAmount, swapCalldata);
87+
}
7988

80-
uint256 amountOut = _swap(swapInputToken, transferParams.token, swapInputAmount, swapCalldata);
8189

8290
if (amountOut <= _totalFees(fees)) {
8391
revert("Insufficient amount out to cover fees");
@@ -178,6 +186,25 @@ contract EurekaHandler is IEurekaHandler, Initializable, UUPSUpgradeable, Ownabl
178186
return amountOut;
179187
}
180188

189+
function _swapNative(address tokenOut, uint256 amountIn, bytes memory swapCalldata)
190+
internal
191+
returns (uint256 amountOut)
192+
{
193+
uint256 tokenOutBalanceBefore = IERC20(tokenOut).balanceOf(address(this));
194+
195+
(bool success,) = swapRouter.call{value: amountIn}(swapCalldata);
196+
if (!success) {
197+
assembly {
198+
returndatacopy(0, 0, returndatasize())
199+
revert(0, returndatasize())
200+
}
201+
}
202+
203+
amountOut = IERC20(tokenOut).balanceOf(address(this)) - tokenOutBalanceBefore;
204+
205+
return amountOut;
206+
}
207+
181208
function _totalFees(Fees memory fees) internal pure returns (uint256) {
182209
return fees.relayFee;
183210
}

EurekaHandler/src/interfaces/IEurekaHandler.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ interface IEurekaHandler {
2525
bytes memory swapCalldata,
2626
TransferParams memory transferParams,
2727
Fees memory fees
28-
) external;
28+
) external payable;
2929

3030
function lombardTransfer(
3131
uint256 amount,

0 commit comments

Comments
 (0)