Limit Order (First come, First serve)
LI.FI intent limit orders are simple: single price, first execution. That means the amount set inMandateOutput is final and will be what you are paying. The output can be filled once per orderId (the output is hashed and stored in a map with orderId).
The winner of an order is the first solver to call fill(...) and set their identifier for the output.
You can identify Limit Orders by output.context of either 0x or the order type 0x00.
Exclusive Limit Order
Exclusive limit orders work like limit orders — single price, first execution — with one difference: the context embeds a cutoff timestamp, and until that time only one named solver may fill the order. This type of intent is often used in conjunction with the LI.FI order Server Reputation to eliminate wasted gas on failed transactions. You can identify Exclusive Limit Orders by their order type0xe0. The context is encoded as: bytes1(0xe0) | bytes32(exclusiveFor) | bytes4(startTime), with startTime being the time when anyone can fill the order.
Intent issuers should usually set the exclusivity period to 30–60 seconds, though it can be shorter or longer.
Dutch Auction
LI.FI intent Dutch auctions are capped dutch auctions. They are fixed in price before and after certain timestamps. The slope, startTime, and stopTime are encoded inoutput.context.
The winner of an order is the first solver to call fill(...) and set their identifier for the output. Winning works the same as a limit order, except that the earlier you fill, the more you pay.
You can identify Dutch Auctions by the order type: 0x01. The context is encoded as: bytes1(0x01) | uint32(startTime) | uint32(stopTime) | uint256(slope), with the final amount being computed as:
amount + (stopTime - startTime) * slope.
You can find the on-chain implementation here.
Exclusive Dutch Auction
LI.FI intent exclusive dutch auctions are very similar to LI.FI intent dutch auctions. However, before the auction slope begins the order is exclusive to a specific solver like Exclusive Limit Order. You can identify Exclusive Dutch Auctions by their order type0xe1. The context is encoded as bytes1(0xe1) | bytes32(exclusiveFor) | uint32(startTime) | uint32(stopTime) | uint256(slope).
The exclusivity window sits before the Dutch slope begins, so an exclusive solver who fills during it pays the auction’s maximum price.
Solana Encoding Notes
Solana’soutput_settler_simple supports the same four order types with the same type bytes (0x00, 0x01, 0xe0, 0xe1) and the same payload layouts, with all integers big-endian. The exact context sizes are tabulated in Solana programs.
Three Solana error names to know: an unknown type byte fails with NotImplemented, a wrong payload length with InvalidContextDataLength, and a fill during someone else’s exclusivity window with ExclusiveTo.
Solana
u64 limit on slope and the resolved amount. Although slope is encoded as 32 bytes (matching the EVM uint256 field), the Solana settler narrows it to a u64: the upper 24 bytes must be zero. The computed output amount must also fit in a u64 — SPL token amounts are u64.This differs from the EVM settler, which treats slope as a full uint256 and returns the minimum amount once stopTime has passed regardless of slope size. A Dutch (or Exclusive Dutch) order signed with slope > u64::MAX — or whose resolved amount exceeds u64::MAX — is rejected when parsed on Solana and can never be filled, even after the auction bottoms out. When constructing cross-chain Dutch orders destined for Solana, keep both slope and the maximum resolved amount within the u64 range.
