Skip to content

Every intent is represented on-chain by an IntentOrder struct. It contains exactly 12 fields. The EIP-712 primary type signed by the owner is the flat Order type on IntentSettlerV3’s own domain.

The IntentOrder struct contains the following fields:

# Field Type Meaning
1 owner address The owner of the proxy; 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. 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 owner’s proxy nonce.

The owner signs all 12 fields in the flat Order struct. The signature is passed through the auth envelope to the owner’s proxy.

The order’s unique identifier (the order hash) is computed as keccak256(abi.encode(order)). Clients read it from the chain via eth_call.

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.

The IntentOrder struct is frozen at deployment.

The IntentSettlerV3 contract is immutable, and the flat Order signature binds this exact struct shape. Consequently, no field can be added, removed, or reordered.