@@ -7,6 +7,7 @@ import {Settler} from "../../Settler.sol";
77import {IERC20 } from "@forge-std/interfaces/IERC20.sol " ;
88import {ISignatureTransfer} from "@permit2/interfaces/ISignatureTransfer.sol " ;
99import {ISettlerActions} from "../../ISettlerActions.sol " ;
10+ import {FastLogic} from "../../utils/FastLogic.sol " ;
1011
1112// Solidity inheritance is stupid
1213import {SettlerAbstract} from "../../SettlerAbstract.sol " ;
@@ -16,6 +17,8 @@ import {AbstractContext} from "../../Context.sol";
1617
1718/// @custom:security-contact security@0x.org
1819contract KatanaSettler is Settler , KatanaMixin {
20+ using FastLogic for bool ;
21+
1922 constructor (bytes20 gitCommit ) SettlerBase (gitCommit) {}
2023
2124 function _dispatchVIP (uint256 action , bytes calldata data ) internal override DANGEROUS_freeMemory returns (bool ) {
@@ -27,6 +30,16 @@ contract KatanaSettler is Settler, KatanaMixin {
2730 (ISignatureTransfer.SignatureTransferDetails memory transferDetails ,) =
2831 _permitToTransferDetails (permit, recipient);
2932 _transferFrom (permit, transferDetails, sig);
33+ } else if (action == uint32 (ISettlerActions.TRANSFER_FROM_WITH_PERMIT.selector )) {
34+ (address recipient , ISignatureTransfer.PermitTransferFrom memory permit , bytes memory permitData ) =
35+ abi.decode (data, (address , ISignatureTransfer.PermitTransferFrom, bytes ));
36+ if (_isRestrictedTarget (permit.permitted.token).or (! _isForwarded ())) {
37+ revertConfusedDeputy ();
38+ }
39+ _dispatchPermit (permit.permitted.token, permitData);
40+ (ISignatureTransfer.SignatureTransferDetails memory transferDetails ,) =
41+ _permitToTransferDetails (permit, recipient);
42+ _transferFrom (permit, transferDetails, new bytes (0 ), true );
3043 } else {
3144 return false ;
3245 }
0 commit comments