@@ -10,6 +10,9 @@ import {ISwapper} from "../../src/Swaps/ISwapper.sol";
1010import {Swapper} from "../../src/Swaps/Swapper.sol " ;
1111import {SwapVerifier} from "../../src/Swaps/SwapVerifier.sol " ;
1212
13+ import {Permit2ECDSASigner} from "evk-test/mocks/Permit2ECDSASigner.sol " ;
14+ import {IAllowanceTransfer} from "permit2/src/interfaces/IAllowanceTransfer.sol " ;
15+
1316import "./Payloads.sol " ;
1417
1518import "forge-std/Test.sol " ;
@@ -25,6 +28,7 @@ contract Swaps1Inch is EVaultTestBase {
2528 address constant uniswapRouterV2 = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ;
2629 address constant uniswapRouterV3 = 0xE592427A0AEce92De3Edee1F18E0157C05861564 ;
2730 address constant uniswapRouter02 = 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45 ;
31+ address constant permit2Address = 0x000000000022D473030F116dDEE9F6B43aC78BA3 ;
2832
2933 address constant GRT = 0xc944E90C64B2c07662A292be6244BDf05Cda44a7 ;
3034 address constant USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 ;
@@ -53,7 +57,7 @@ contract Swaps1Inch is EVaultTestBase {
5357 user2 = makeAddr ("user2 " );
5458
5559 swapper = new Swapper (uniswapRouterV2, uniswapRouterV3);
56- swapVerifier = new SwapVerifier (address (1 ), address ( 1 ) );
60+ swapVerifier = new SwapVerifier (address (evc ), permit2Address );
5761
5862 if (bytes (FORK_RPC_URL).length != 0 ) {
5963 mainnetFork = vm.createSelectFork (FORK_RPC_URL);
@@ -1453,4 +1457,75 @@ contract Swaps1Inch is EVaultTestBase {
14531457 assertEq (eTST.debtOf (user2), 0 );
14541458 assertEq (eTST.balanceOf (user2), 2e18 );
14551459 }
1460+
1461+ function test_transferFromSender_allowance () external {
1462+ assetTST.mint (user, 1e18 );
1463+ assertEq (assetTST.balanceOf (address (swapper)), 0 );
1464+
1465+ startHoax (user);
1466+ vm.expectRevert (); // no approvals
1467+ swapVerifier.transferFromSender (address (assetTST), 1e18 , address (swapper));
1468+
1469+ assetTST.approve (address (swapVerifier), 2e18 );
1470+
1471+ startHoax (user2);
1472+ vm.expectRevert (); // other users can't pull
1473+ swapVerifier.transferFromSender (address (assetTST), 1e18 , address (swapper));
1474+
1475+ startHoax (user);
1476+ swapVerifier.transferFromSender (address (assetTST), 1e18 , address (swapper));
1477+
1478+ assertEq (assetTST.balanceOf (address (swapper)), 1e18 );
1479+ }
1480+
1481+ function test_transferFromSender_permit2 () external {
1482+ assertEq (assetTST.balanceOf (address (swapper)), 0 );
1483+
1484+ Permit2ECDSASigner permit2Signer = new Permit2ECDSASigner (address (permit2));
1485+
1486+ uint256 userPK = 0x123400 ;
1487+ address signer = vm.addr (userPK);
1488+
1489+ assetTST.mint (signer, 1e18 );
1490+
1491+ startHoax (signer);
1492+ vm.expectRevert (); // no approvals
1493+ swapVerifier.transferFromSender (address (assetTST), 1e18 , address (swapper));
1494+
1495+
1496+ // approve permit2 contract to spend the tokens
1497+ assetTST.approve (permit2, type (uint160 ).max);
1498+
1499+ // build permit2 object
1500+ IAllowanceTransfer.PermitSingle memory permitSingle = IAllowanceTransfer.PermitSingle ({
1501+ details: IAllowanceTransfer.PermitDetails ({
1502+ token: address (assetTST),
1503+ amount: type (uint160 ).max,
1504+ expiration: type (uint48 ).max,
1505+ nonce: 0
1506+ }),
1507+ spender: address (swapVerifier),
1508+ sigDeadline: type (uint256 ).max
1509+ });
1510+
1511+ IEVC.BatchItem[] memory items = new IEVC.BatchItem [](2 );
1512+ items[0 ].onBehalfOfAccount = signer;
1513+ items[0 ].targetContract = permit2;
1514+ items[0 ].value = 0 ;
1515+ items[0 ].data = abi.encodeWithSignature (
1516+ "permit(address,((address,uint160,uint48,uint48),address,uint256),bytes) " ,
1517+ signer,
1518+ permitSingle,
1519+ permit2Signer.signPermitSingle (userPK, permitSingle)
1520+ );
1521+
1522+ items[1 ].onBehalfOfAccount = signer;
1523+ items[1 ].targetContract = address (swapVerifier);
1524+ items[1 ].value = 0 ;
1525+ items[1 ].data = abi.encodeCall (swapVerifier.transferFromSender, (address (assetTST), 1e18 , address (swapper)));
1526+
1527+ evc.batch (items);
1528+
1529+ assertEq (assetTST.balanceOf (address (swapper)), 1e18 );
1530+ }
14561531}
0 commit comments