executeQuote runs each of these flows in one call: see
Executing orders.
Gasless openFor
Quote, signsignPayload verbatim (EVM: eth_signTypedData_v4 + 0x00; external gasless: raw 65
bytes; Solana: the 97-byte base64 envelope), POST /order/openfor, poll
GET /order/{orderId}/status. Per-family signing and the reasons:
Step execution.
Proxy lanes
The user sendsexecutionTx themselves, then registers with an unsigned
POST /order/openfor at once, well before expiresAt: the hub keeps the quote
registrable for 20 minutes, but the aggregator refuses a registration after expiresAt
(known issue). Once the transaction is out, never re-quote.
What the steps are and what a refused registration does to the deposit:
Step execution,
Refunds.
Open flow
The user sendsapprovals then steps, personal_signs signIntent, and records acceptance with
POST /order before expiresAt — once the transaction is out, never
re-quote; follow it on GET /status/{orderId}. POST /order is for create
winners only: it refuses
every OIF-lane quote with EIN0007 (known issue).
Step execution.
The TypeScript SDK names which of these applies as the quote’s lane: evm-permit2,
solana-escrow or evm-3009 (signed openFor), wrap-native or swap-token (proxy lanes),
open-flow, or informational (a solver-swap or transfer winner, which discloses neither
signPayload nor executionTx). See
Step execution — which step applies.
Preview then prepare
Browse withPOST /quote/preview, then
POST /quote/prepare under one preparationId per signing attempt; a retry
with the same id returns the same quote and expiry.
Step execution.
Status polling
openFor orders onGET /order/{orderId}/status every 2–3 s until
finalized, failed or refunded (settled is not final: finalized can follow), with a stall
rule, since an order can stop at executed (known issue);
open-flow orders on GET /status/{orderId}; history of openFor orders on
GET /orders. Which view answers what:
Order lifecycle.
Lost-ack recovery
DerivehubOrderId from quoteId, read the status, and re-post the identical request if needed —
never re-quote. Handling errors.
Withdraw (refund)
TakeonchainOrderId from GET /orders and pass it exactly as the
hub serves it (0x + 64 lowercase hex: on-chain ids are matched, not validated). Confirm the order
exists on GET /onchain/{orderId}/order before offering a withdraw, apply the dating rule on
GET /onchain/{id}/fill, fetch the tuple from
GET /onchain/{id}/order, send refund(order) to the settler. The
steps are for EVM-origin orders only: a non-EVM origin has no tuple
(known issue). A Solana-origin order refunds
through GET /onchain/{id}/refund instead: the hub builds the
unsigned transaction, and the order’s user signs and sends it.
Refunds.
Auctions
When the winner’s order carries a pricing context the quote carriesauction: {kind, exclusiveFor?, startTime, stopTime, slope, floor, ceiling} — a decaying Dutch
auction, or a limit / exclusiveLimit winner that doesn’t decay (slope "0", ceiling =
floor). A firm winner has no auction:
amountOut is the floor; what the settler pays at fill time and how auctioned winners are ranked
against firm ones: Trade types.
See also
- SDK: Executing orders — the same flows, run by
executeQuote - Quickstart
- Step execution
- Trade types
- Order lifecycle
- Handling errors
- Refunds