Skip to content

Commit 2a84cfe

Browse files
authored
Merge pull request #4 from icon-project/permit2-fix
fix: Fix encoding for permit2
2 parents a34804a + 038016f commit 2a84cfe

File tree

4 files changed

+45
-50
lines changed

4 files changed

+45
-50
lines changed

contracts/evm/contracts/Intents/Intents.sol

+3-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import "./Types.sol";
1010
import "./Encoding.sol";
1111
import "./GeneralizedConnection.sol";
1212
import "./Permit2OrderLib.sol";
13+
import "./IPermit2.sol";
1314

1415
import {console} from "forge-std/console.sol";
1516

@@ -90,10 +91,10 @@ contract Intents is GeneralizedConnection {
9091
function swapPermit2(
9192
Types.SwapOrder memory order,
9293
bytes memory signature,
93-
uint32 deadline
94+
IPermit2.PermitTransferFrom calldata _permit
9495
) public {
9596
order.id = 0;
96-
Permit2OrderLib._processPermit2Order(permit2, order, signature, deadline);
97+
Permit2OrderLib._processPermit2Order(permit2, order, signature, _permit);
9798
_swap(order);
9899
}
99100

contracts/evm/contracts/Intents/Permit2OrderLib.sol

+35-41
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,15 @@ import "@iconfoundation/xcall-solidity-library/utils/ParseAddress.sol";
44

55
import "./Types.sol";
66
import "./IPermit2.sol";
7+
import {console} from "forge-std/console.sol";
78

8-
/**
9-
* @notice Permit2OrderLib knows how to process a particular type of external Permit2Order so that it can be used in Across.
10-
* @dev This library is responsible for validating the order and communicating with Permit2 to pull the tokens in.
11-
* This is a library to allow it to be pulled directly into the SpokePool in a future version.
12-
*/
139
library Permit2OrderLib {
1410
using ParseAddress for string;
1511

16-
// Type strings and hashes
17-
bytes private constant OUTPUT_TOKEN_TYPE =
18-
"OutputToken(address recipient,address token,uint256 amount,uint256 chainId)";
19-
bytes32 private constant OUTPUT_TOKEN_TYPE_HASH = keccak256(OUTPUT_TOKEN_TYPE);
20-
2112
bytes internal constant ORDER_TYPE =
2213
abi.encodePacked(
2314
"SwapOrder(",
15+
"uint256 id,",
2416
"string emitter,",
2517
"string srcNID,",
2618
"string dstNID,",
@@ -30,55 +22,57 @@ library Permit2OrderLib {
3022
"uint256 amount,",
3123
"string toToken,",
3224
"uint256 toAmount,",
33-
"bytes data,"
25+
"bytes data)"
3426
);
3527
bytes32 internal constant ORDER_TYPE_HASH = keccak256(ORDER_TYPE);
36-
string private constant TOKEN_PERMISSIONS_TYPE = "TokenPermissions(address token,uint256 amount)";
28+
string private constant TOKEN_PERMISSIONS_TYPE =
29+
"TokenPermissions(address token,uint256 amount)";
3730
string internal constant PERMIT2_ORDER_TYPE =
38-
string(abi.encodePacked("SwapOrder witness)", ORDER_TYPE, TOKEN_PERMISSIONS_TYPE));
39-
31+
string(
32+
abi.encodePacked(
33+
"SwapOrder witness)",
34+
ORDER_TYPE,
35+
TOKEN_PERMISSIONS_TYPE
36+
)
37+
);
4038
// Hashes an order to get an order hash. Needed for permit2.
41-
function _hashOrder(Types.SwapOrder memory order) internal pure returns (bytes32) {
39+
function _hashOrder(
40+
Types.SwapOrder memory order
41+
) internal pure returns (bytes32) {
4242
bytes memory orderData = abi.encode(
4343
ORDER_TYPE_HASH,
44-
order.emitter,
45-
order.srcNID,
46-
order.dstNID,
47-
order.creator,
48-
order.destinationAddress,
49-
order.token,
44+
order.id,
45+
keccak256(abi.encodePacked(order.emitter)),
46+
keccak256(abi.encodePacked(order.srcNID)),
47+
keccak256(abi.encodePacked(order.dstNID)),
48+
keccak256(abi.encodePacked(order.creator)),
49+
keccak256(abi.encodePacked(order.destinationAddress)),
50+
keccak256(abi.encodePacked(order.token)),
5051
order.amount,
51-
order.toToken,
52+
keccak256(abi.encodePacked(order.toToken)),
5253
order.toAmount,
53-
order.data
54+
keccak256(order.data)
5455
);
5556

5657
return keccak256(orderData);
5758
}
5859

59-
function _processPermit2Order(IPermit2 permit2, Types.SwapOrder memory order, bytes memory signature, uint32 deadline)
60-
internal
61-
{
62-
address token = order.token.parseAddress("IllegalArgument");
63-
IPermit2.PermitTransferFrom memory permit = IPermit2.PermitTransferFrom({
64-
permitted: IPermit2.TokenPermissions({ token: token , amount: order.amount }),
65-
nonce: order.id,
66-
deadline: deadline
67-
});
68-
69-
IPermit2.SignatureTransferDetails memory signatureTransferDetails = IPermit2.SignatureTransferDetails({
70-
to: address(this),
71-
requestedAmount: order.amount
72-
});
73-
74-
// Pull user funds.
60+
function _processPermit2Order(
61+
IPermit2 permit2,
62+
Types.SwapOrder memory order,
63+
bytes memory signature,
64+
IPermit2.PermitTransferFrom memory permit
65+
) internal {
7566
permit2.permitWitnessTransferFrom(
7667
permit,
77-
signatureTransferDetails,
68+
IPermit2.SignatureTransferDetails({
69+
to: address(this),
70+
requestedAmount: order.amount
71+
}),
7872
order.creator.parseAddress("IllegalArgument"),
7973
_hashOrder(order),
8074
PERMIT2_ORDER_TYPE,
8175
signature
8276
);
8377
}
84-
}
78+
}

contracts/evm/test/Intents/Encoding.t.sol

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
pragma solidity ^0.8.17;
33

44
import "forge-std/Test.sol";
5-
import "@xcall/contracts/Intents/Intents.sol";
6-
import "@xcall/contracts/Intents/Types.sol";
7-
import "@xcall/contracts/Intents/Encoding.sol";
5+
import "@intents/contracts/Intents/Intents.sol";
6+
import "@intents/contracts/Intents/Types.sol";
7+
import "@intents/contracts/Intents/Encoding.sol";
88
import {console} from "forge-std/console.sol";
99

1010
contract EncodingTest is Test {

contracts/evm/test/Intents/Intents.t.sol

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
pragma solidity ^0.8.22;
33

44
import "forge-std/Test.sol";
5-
import "@xcall/contracts/Intents/GeneralizedConnection.sol";
6-
import "@xcall/contracts/Intents/Intents.sol";
7-
import "@xcall/contracts/Intents/Types.sol";
8-
import "@xcall/contracts/Intents/Encoding.sol";
5+
import "@intents/contracts/Intents/GeneralizedConnection.sol";
6+
import "@intents/contracts/Intents/Intents.sol";
7+
import "@intents/contracts/Intents/Types.sol";
8+
import "@intents/contracts/Intents/Encoding.sol";
99
import "@iconfoundation/xcall-solidity-library/utils/ParseAddress.sol";
1010
import "openzeppelin-contracts/contracts/token/ERC20/ERC20.sol";
1111
import "openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Burnable.sol";

0 commit comments

Comments
 (0)