diff --git a/contracts/evm/contracts/Intents/Intents.sol b/contracts/evm/contracts/Intents/Intents.sol index f0ae73e7..5e7e220b 100644 --- a/contracts/evm/contracts/Intents/Intents.sol +++ b/contracts/evm/contracts/Intents/Intents.sol @@ -10,6 +10,7 @@ import "./Types.sol"; import "./Encoding.sol"; import "./GeneralizedConnection.sol"; import "./Permit2OrderLib.sol"; +import "./IPermit2.sol"; import {console} from "forge-std/console.sol"; @@ -90,10 +91,10 @@ contract Intents is GeneralizedConnection { function swapPermit2( Types.SwapOrder memory order, bytes memory signature, - uint32 deadline + IPermit2.PermitTransferFrom calldata _permit ) public { order.id = 0; - Permit2OrderLib._processPermit2Order(permit2, order, signature, deadline); + Permit2OrderLib._processPermit2Order(permit2, order, signature, _permit); _swap(order); } diff --git a/contracts/evm/contracts/Intents/Permit2OrderLib.sol b/contracts/evm/contracts/Intents/Permit2OrderLib.sol index 3f9a542f..3ec84806 100644 --- a/contracts/evm/contracts/Intents/Permit2OrderLib.sol +++ b/contracts/evm/contracts/Intents/Permit2OrderLib.sol @@ -4,23 +4,15 @@ import "@iconfoundation/xcall-solidity-library/utils/ParseAddress.sol"; import "./Types.sol"; import "./IPermit2.sol"; +import {console} from "forge-std/console.sol"; -/** - * @notice Permit2OrderLib knows how to process a particular type of external Permit2Order so that it can be used in Across. - * @dev This library is responsible for validating the order and communicating with Permit2 to pull the tokens in. - * This is a library to allow it to be pulled directly into the SpokePool in a future version. - */ library Permit2OrderLib { using ParseAddress for string; - // Type strings and hashes - bytes private constant OUTPUT_TOKEN_TYPE = - "OutputToken(address recipient,address token,uint256 amount,uint256 chainId)"; - bytes32 private constant OUTPUT_TOKEN_TYPE_HASH = keccak256(OUTPUT_TOKEN_TYPE); - bytes internal constant ORDER_TYPE = abi.encodePacked( "SwapOrder(", + "uint256 id,", "string emitter,", "string srcNID,", "string dstNID,", @@ -30,55 +22,57 @@ library Permit2OrderLib { "uint256 amount,", "string toToken,", "uint256 toAmount,", - "bytes data," + "bytes data)" ); bytes32 internal constant ORDER_TYPE_HASH = keccak256(ORDER_TYPE); - string private constant TOKEN_PERMISSIONS_TYPE = "TokenPermissions(address token,uint256 amount)"; + string private constant TOKEN_PERMISSIONS_TYPE = + "TokenPermissions(address token,uint256 amount)"; string internal constant PERMIT2_ORDER_TYPE = - string(abi.encodePacked("SwapOrder witness)", ORDER_TYPE, TOKEN_PERMISSIONS_TYPE)); - + string( + abi.encodePacked( + "SwapOrder witness)", + ORDER_TYPE, + TOKEN_PERMISSIONS_TYPE + ) + ); // Hashes an order to get an order hash. Needed for permit2. - function _hashOrder(Types.SwapOrder memory order) internal pure returns (bytes32) { + function _hashOrder( + Types.SwapOrder memory order + ) internal pure returns (bytes32) { bytes memory orderData = abi.encode( ORDER_TYPE_HASH, - order.emitter, - order.srcNID, - order.dstNID, - order.creator, - order.destinationAddress, - order.token, + order.id, + keccak256(abi.encodePacked(order.emitter)), + keccak256(abi.encodePacked(order.srcNID)), + keccak256(abi.encodePacked(order.dstNID)), + keccak256(abi.encodePacked(order.creator)), + keccak256(abi.encodePacked(order.destinationAddress)), + keccak256(abi.encodePacked(order.token)), order.amount, - order.toToken, + keccak256(abi.encodePacked(order.toToken)), order.toAmount, - order.data + keccak256(order.data) ); return keccak256(orderData); } - function _processPermit2Order(IPermit2 permit2, Types.SwapOrder memory order, bytes memory signature, uint32 deadline) - internal - { - address token = order.token.parseAddress("IllegalArgument"); - IPermit2.PermitTransferFrom memory permit = IPermit2.PermitTransferFrom({ - permitted: IPermit2.TokenPermissions({ token: token , amount: order.amount }), - nonce: order.id, - deadline: deadline - }); - - IPermit2.SignatureTransferDetails memory signatureTransferDetails = IPermit2.SignatureTransferDetails({ - to: address(this), - requestedAmount: order.amount - }); - - // Pull user funds. + function _processPermit2Order( + IPermit2 permit2, + Types.SwapOrder memory order, + bytes memory signature, + IPermit2.PermitTransferFrom memory permit + ) internal { permit2.permitWitnessTransferFrom( permit, - signatureTransferDetails, + IPermit2.SignatureTransferDetails({ + to: address(this), + requestedAmount: order.amount + }), order.creator.parseAddress("IllegalArgument"), _hashOrder(order), PERMIT2_ORDER_TYPE, signature ); } -} \ No newline at end of file +} diff --git a/contracts/evm/test/Intents/Encoding.t.sol b/contracts/evm/test/Intents/Encoding.t.sol index 01ee0b93..c4f3cefa 100644 --- a/contracts/evm/test/Intents/Encoding.t.sol +++ b/contracts/evm/test/Intents/Encoding.t.sol @@ -2,9 +2,9 @@ pragma solidity ^0.8.17; import "forge-std/Test.sol"; -import "@xcall/contracts/Intents/Intents.sol"; -import "@xcall/contracts/Intents/Types.sol"; -import "@xcall/contracts/Intents/Encoding.sol"; +import "@intents/contracts/Intents/Intents.sol"; +import "@intents/contracts/Intents/Types.sol"; +import "@intents/contracts/Intents/Encoding.sol"; import {console} from "forge-std/console.sol"; contract EncodingTest is Test { diff --git a/contracts/evm/test/Intents/Intents.t.sol b/contracts/evm/test/Intents/Intents.t.sol index f85447b3..d06a81ed 100644 --- a/contracts/evm/test/Intents/Intents.t.sol +++ b/contracts/evm/test/Intents/Intents.t.sol @@ -2,10 +2,10 @@ pragma solidity ^0.8.22; import "forge-std/Test.sol"; -import "@xcall/contracts/Intents/GeneralizedConnection.sol"; -import "@xcall/contracts/Intents/Intents.sol"; -import "@xcall/contracts/Intents/Types.sol"; -import "@xcall/contracts/Intents/Encoding.sol"; +import "@intents/contracts/Intents/GeneralizedConnection.sol"; +import "@intents/contracts/Intents/Intents.sol"; +import "@intents/contracts/Intents/Types.sol"; +import "@intents/contracts/Intents/Encoding.sol"; import "@iconfoundation/xcall-solidity-library/utils/ParseAddress.sol"; import "openzeppelin-contracts/contracts/token/ERC20/ERC20.sol"; import "openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Burnable.sol";