The Intent Order
Every intent is represented by an IntentOrder struct. The structure consists of exactly 12 fields and defines everything necessary to settle the swap.
The Fields
Section titled “The Fields”The IntentOrder struct contains the following fields:
| # | Field | Type | Meaning |
|---|---|---|---|
| 1 | owner |
address |
The Permit2 signer; the only account whose funds move. |
| 2 | recipient |
address |
Where output is delivered — not necessarily the owner. |
| 3 | tokenIn |
address |
The input ERC-20 token address. |
| 4 | amountIn |
uint256 |
The exact amount of tokenIn to be pulled from the owner. |
| 5 | tokenOut |
address |
The output ERC-20 token address. |
| 6 | startAmountOut |
uint256 |
The minimum output required at startTime. |
| 7 | endAmountOut |
uint256 |
The absolute minimum output floor. |
| 8 | startTime |
uint256 |
The timestamp when curve decay begins. |
| 9 | decayEndTime |
uint256 |
The timestamp when the required output reaches endAmountOut and begins to rest. |
| 10 | endTime |
uint256 |
The last timestamp at which the order can still be filled; also the Permit2 deadline. fill rejects only when block.timestamp > endTime, so the order is still live at endTime. |
| 11 | appData |
bytes32 |
An opaque attribution tag, bound by the signature, ignored by the settlement logic. |
| 12 | nonce |
uint256 |
The Permit2 unordered nonce. |
The Permit2 witness binds 11 of these fields directly. The nonce is omitted from the witness because Permit2 signs it natively as part of its own wrapper. The (order, permit2Sig) pair is therefore completely self-describing.
The order’s unique identifier (the order hash) is computed as keccak256(abi.encode(order)). Clients read it from the chain via eth_call.
Order Types
Section titled “Order Types”The relationship between startAmountOut and endAmountOut defines the nature of the order:
- A fixed-price limit order is encoded by setting
startAmountOut == endAmountOut. - A descending Dutch auction is encoded by setting
startAmountOut > endAmountOut.
Frozen at Deploy
Section titled “Frozen at Deploy”The IntentOrder struct is frozen at deploy.
The IntentSettlerV1 contract is immutable, and the Permit2 witness binds this exact struct shape into every signature. Consequently, no field can be added, removed, or reordered. Any change to the order shape would invalidate all existing signatures and require shipping a new IntentSettlerV2 contract at a new address.