Skip to content

Commit

Permalink
fix: Fix encoding for permit2
Browse files Browse the repository at this point in the history
  • Loading branch information
AntonAndell committed Oct 17, 2024
1 parent 4062573 commit b5afae1
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 50 deletions.
5 changes: 3 additions & 2 deletions contracts/evm/contracts/Intents/Intents.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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";

Expand Down Expand Up @@ -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);
}

Expand Down
76 changes: 35 additions & 41 deletions contracts/evm/contracts/Intents/Permit2OrderLib.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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,",
Expand All @@ -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
);
}
}
}
6 changes: 3 additions & 3 deletions contracts/evm/test/Intents/Encoding.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
8 changes: 4 additions & 4 deletions contracts/evm/test/Intents/Intents.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down

0 comments on commit b5afae1

Please sign in to comment.