From 9e2f228a470d163b71cac22a0f95116716490772 Mon Sep 17 00:00:00 2001 From: TAMARA LIPOWSKI Date: Wed, 9 Jul 2025 14:32:43 -0400 Subject: [PATCH] fix: use encodePacked to encode if approval needed - Also approve max amount for the tycho router to use (to save on gas) --- foundry/src/uniswap_x/UniswapXFiller.sol | 10 ++++------ foundry/test/uniswap_x/UniswapXFiller.t.sol | 5 +++-- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/foundry/src/uniswap_x/UniswapXFiller.sol b/foundry/src/uniswap_x/UniswapXFiller.sol index 0904ef8..7826e3c 100644 --- a/foundry/src/uniswap_x/UniswapXFiller.sol +++ b/foundry/src/uniswap_x/UniswapXFiller.sol @@ -67,17 +67,15 @@ contract UniswapXFiller is AccessControl, IReactorCallback { ResolvedOrder memory order = resolvedOrders[0]; - ( - bool tokenInApprovalNeeded, - bool tokenOutApprovalNeeded, - bytes memory tychoCalldata - ) = abi.decode(callbackData, (bool, bool, bytes)); + bool tokenInApprovalNeeded = bool(uint8(callbackData[0]) == 1); + bool tokenOutApprovalNeeded = bool(uint8(callbackData[1]) == 1); + bytes calldata tychoCalldata = bytes(callbackData[2:]); // The TychoRouter will take the input tokens from the filler if (tokenInApprovalNeeded) { // Native ETH input is not supported by UniswapX IERC20(order.input.token).forceApprove( - tychoRouter, order.input.maxAmount + tychoRouter, type(uint256).max ); } diff --git a/foundry/test/uniswap_x/UniswapXFiller.t.sol b/foundry/test/uniswap_x/UniswapXFiller.t.sol index 9ac004c..5128339 100644 --- a/foundry/test/uniswap_x/UniswapXFiller.t.sol +++ b/foundry/test/uniswap_x/UniswapXFiller.t.sol @@ -68,7 +68,8 @@ contract UniswapXFillerTest is Test, TychoRouterTestSetup { swap ); - bytes memory callbackData = abi.encode(true, true, tychoRouterData); + bytes memory callbackData = + abi.encodePacked(true, true, tychoRouterData); deal(WETH_ADDR, address(filler), amountIn); vm.startPrank(address(filler)); @@ -153,7 +154,7 @@ contract UniswapXFillerTest is Test, TychoRouterTestSetup { swap ); - bytes memory callbackData = abi.encode( + bytes memory callbackData = abi.encodePacked( true, // tokenIn approval needed true, // tokenOut approval needed tychoRouterData