feat: Support new transfer logic in all executors

TODO:
- Fix failing tests
- Remove permit2 from initialization of contracts
This commit is contained in:
TAMARA LIPOWSKI
2025-05-14 20:42:19 -04:00
parent 0f9af65846
commit 27dfde3118
22 changed files with 378 additions and 462 deletions

View File

@@ -8,25 +8,21 @@ import "./executors/UniswapV4Utils.sol";
import {SafeCallback} from "@uniswap/v4-periphery/src/base/SafeCallback.sol";
contract TychoRouterSequentialSwapTest is TychoRouterTestSetup {
function _getSequentialSwaps(bool permit2)
internal
view
returns (bytes[] memory)
{
function _getSequentialSwaps() internal view returns (bytes[] memory) {
// Trade 1 WETH for USDC through DAI with 2 swaps on Uniswap V2
// 1 WETH -> DAI -> USDC
// (univ2) (univ2)
TokenTransfer.TransferType transferType = permit2
? TokenTransfer.TransferType.TRANSFER_PERMIT2_TO_PROTOCOL
: TokenTransfer.TransferType.TRANSFER_FROM_TO_PROTOCOL;
bytes[] memory swaps = new bytes[](2);
// WETH -> DAI
swaps[0] = encodeSequentialSwap(
address(usv2Executor),
encodeUniswapV2Swap(
WETH_ADDR, WETH_DAI_POOL, tychoRouterAddr, false, transferType
WETH_ADDR,
WETH_DAI_POOL,
DAI_USDC_POOL, // receiver (direct to next pool)
false,
false // transfer to protocol from router
)
);
@@ -38,7 +34,7 @@ contract TychoRouterSequentialSwapTest is TychoRouterTestSetup {
DAI_USDC_POOL,
ALICE,
true,
TokenTransfer.TransferType.TRANSFER_TO_PROTOCOL
false // transfer to protocol from router
)
);
return swaps;
@@ -55,7 +51,7 @@ contract TychoRouterSequentialSwapTest is TychoRouterTestSetup {
bytes memory signature
) = handlePermit2Approval(WETH_ADDR, tychoRouterAddr, amountIn);
bytes[] memory swaps = _getSequentialSwaps(true);
bytes[] memory swaps = _getSequentialSwaps();
tychoRouter.sequentialSwapPermit2(
amountIn,
WETH_ADDR,
@@ -66,6 +62,8 @@ contract TychoRouterSequentialSwapTest is TychoRouterTestSetup {
ALICE,
permitSingle,
signature,
true,
WETH_DAI_POOL,
pleEncode(swaps)
);
@@ -82,7 +80,7 @@ contract TychoRouterSequentialSwapTest is TychoRouterTestSetup {
vm.startPrank(ALICE);
IERC20(WETH_ADDR).approve(tychoRouterAddr, amountIn);
bytes[] memory swaps = _getSequentialSwaps(false);
bytes[] memory swaps = _getSequentialSwaps();
tychoRouter.sequentialSwap(
amountIn,
WETH_ADDR,
@@ -91,6 +89,8 @@ contract TychoRouterSequentialSwapTest is TychoRouterTestSetup {
false,
false,
ALICE,
true,
WETH_DAI_POOL,
pleEncode(swaps)
);
@@ -107,7 +107,7 @@ contract TychoRouterSequentialSwapTest is TychoRouterTestSetup {
vm.startPrank(ALICE);
IERC20(WETH_ADDR).approve(tychoRouterAddr, amountIn);
bytes[] memory swaps = _getSequentialSwaps(false);
bytes[] memory swaps = _getSequentialSwaps();
vm.expectRevert(TychoRouter__UndefinedMinAmountOut.selector);
tychoRouter.sequentialSwap(
amountIn,
@@ -117,6 +117,8 @@ contract TychoRouterSequentialSwapTest is TychoRouterTestSetup {
false,
false,
ALICE,
true,
WETH_DAI_POOL,
pleEncode(swaps)
);
}
@@ -129,7 +131,7 @@ contract TychoRouterSequentialSwapTest is TychoRouterTestSetup {
vm.startPrank(ALICE);
IERC20(WETH_ADDR).approve(tychoRouterAddr, amountIn - 1);
bytes[] memory swaps = _getSequentialSwaps(false);
bytes[] memory swaps = _getSequentialSwaps();
vm.expectRevert();
tychoRouter.sequentialSwap(
amountIn,
@@ -139,6 +141,8 @@ contract TychoRouterSequentialSwapTest is TychoRouterTestSetup {
false,
false,
ALICE,
true,
WETH_DAI_POOL,
pleEncode(swaps)
);
}
@@ -154,7 +158,7 @@ contract TychoRouterSequentialSwapTest is TychoRouterTestSetup {
bytes memory signature
) = handlePermit2Approval(WETH_ADDR, tychoRouterAddr, amountIn);
bytes[] memory swaps = _getSequentialSwaps(true);
bytes[] memory swaps = _getSequentialSwaps();
uint256 minAmountOut = 3000 * 1e18;
@@ -175,6 +179,8 @@ contract TychoRouterSequentialSwapTest is TychoRouterTestSetup {
ALICE,
permitSingle,
signature,
true,
WETH_DAI_POOL,
pleEncode(swaps)
);
vm.stopPrank();
@@ -202,24 +208,14 @@ contract TychoRouterSequentialSwapTest is TychoRouterTestSetup {
swaps[0] = encodeSequentialSwap(
address(usv2Executor),
encodeUniswapV2Swap(
WETH_ADDR,
WETH_DAI_POOL,
tychoRouterAddr,
false,
TokenTransfer.TransferType.TRANSFER_TO_PROTOCOL
WETH_ADDR, WETH_DAI_POOL, tychoRouterAddr, false, true
)
);
// DAI -> USDC
swaps[1] = encodeSequentialSwap(
address(usv2Executor),
encodeUniswapV2Swap(
DAI_ADDR,
DAI_USDC_POOL,
ALICE,
true,
TokenTransfer.TransferType.TRANSFER_TO_PROTOCOL
)
encodeUniswapV2Swap(DAI_ADDR, DAI_USDC_POOL, ALICE, true, true)
);
uint256 amountOut = tychoRouter.sequentialSwapPermit2{value: amountIn}(
@@ -232,6 +228,8 @@ contract TychoRouterSequentialSwapTest is TychoRouterTestSetup {
ALICE,
emptyPermitSingle,
"",
true,
tychoRouterAddr,
pleEncode(swaps)
);
uint256 expectedAmount = 2005810530;
@@ -262,11 +260,7 @@ contract TychoRouterSequentialSwapTest is TychoRouterTestSetup {
swaps[0] = encodeSequentialSwap(
address(usv2Executor),
encodeUniswapV2Swap(
USDC_ADDR,
DAI_USDC_POOL,
tychoRouterAddr,
false,
TokenTransfer.TransferType.TRANSFER_PERMIT2_TO_PROTOCOL
USDC_ADDR, DAI_USDC_POOL, tychoRouterAddr, false, false
)
);
@@ -274,11 +268,7 @@ contract TychoRouterSequentialSwapTest is TychoRouterTestSetup {
swaps[1] = encodeSequentialSwap(
address(usv2Executor),
encodeUniswapV2Swap(
DAI_ADDR,
WETH_DAI_POOL,
tychoRouterAddr,
true,
TokenTransfer.TransferType.TRANSFER_TO_PROTOCOL
DAI_ADDR, WETH_DAI_POOL, tychoRouterAddr, true, true
)
);
@@ -292,6 +282,8 @@ contract TychoRouterSequentialSwapTest is TychoRouterTestSetup {
ALICE,
permitSingle,
signature,
true,
DAI_USDC_POOL,
pleEncode(swaps)
);
@@ -315,7 +307,8 @@ contract TychoRouterSequentialSwapTest is TychoRouterTestSetup {
tychoRouterAddr,
USDC_WETH_USV3,
true,
TokenTransfer.TransferType.TRANSFER_TO_PROTOCOL
false,
true
);
bytes memory usdcWethV3Pool2OneZeroData = encodeUniswapV3Swap(
@@ -324,7 +317,8 @@ contract TychoRouterSequentialSwapTest is TychoRouterTestSetup {
tychoRouterAddr,
USDC_WETH_USV3_2,
false,
TokenTransfer.TransferType.TRANSFER_TO_PROTOCOL
false, // permit2 transferFrom to protocol
true // transfer to protocol
);
bytes[] memory swaps = new bytes[](2);