Skip to main content
Arcus settles spot trades through a request-for-quote (RFQ) flow rather than a continuous order book. A taker asks for a price, professional makers respond with firm quotes, and the server bundles the best quotes into a single atomic settlement transaction. Takers sign an intent that caps their downside; makers sign quotes that bind their terms; nothing settles unless every leg is satisfied at once.
This page explains the model and the message flow. It is conceptual — for the wire formats and endpoints, see the API reference.

Why RFQ

Spot markets for tokenized assets are often thin and fragmented. RFQ lets the exchange source liquidity from many makers on demand and pick the best combination per trade, instead of requiring makers to post resting depth. The taker gets one signed, slippage-bounded outcome; the maker only commits capital when its quote is actually selected.

Roles

TermMeaning
TakerThe party requesting to trade — typically the end user or their wallet.
MakerA liquidity provider that prices and fulfills the RFQ.
ServerRelays messages between the taker and makers, and submits the settlement transaction on-chain.
SettlementThe on-chain contract that finalizes the trade atomically.
Indicative liquidityNon-binding price/size information from a maker; used to build the intent.
IntentThe trade the taker commits to, including minBuyAmount; signed by the taker.
Firm quoteA binding price and terms with an expiry — distinct from indicative liquidity.

The flow

1

Quote

The taker sends quote parameters. The server requests indicative liquidity from makers and builds an intent, deriving minBuyAmount from slippageBps when present.
2

Sign intent

The taker signs the intent (EIP-712 typed data) and returns it to the server.
3

Firm quote

The server forwards the intent to makers without minBuyAmount, so makers cannot price against the taker’s limit. Makers return firm quotes; the server combines the best ones to cover the full sellAmount while still meeting minBuyAmount.
4

Submit

The server bundles the signed taker intent with the selected firm quotes and submits one transaction to the settlement contract. Every leg is atomic — all fill or none do.

Quote parameters

What the taker sends to request a quote. The server forwards the same shape to each maker.
ParamTypeRequiredDescription
chainIdpositive integerYesChain where settlement will occur.
sellTokenaddressYesToken the taker is selling.
buyTokenaddressYesToken the taker is buying.
sellAmountpositive integer stringYesAmount of sellToken in base units (fixed sell size).
takeraddressYesTaker wallet address; included in the intent and signatures.
slippageBpsinteger 0..10000NoUsed by the server to derive minBuyAmount on the intent.

Intent

The server builds the intent from maker indicative liquidity and returns it to the taker for signing.
FieldPurpose
takerIntentId32-byte hex id correlating price, intent, firm quotes, and status. Sent to makers.
chainIdTarget chain for settlement.
sellToken / buyTokenAsset addresses.
sellAmountAmount of sellToken in base units.
minBuyAmountMinimum buyToken the taker will accept — never sent to makers.
takerTaker wallet address.
validUntilUnix timestamp or block after which the intent is void.
toSignEIP-712 typed data (and/or permit structure) the taker must sign.
minBuyAmount is the taker’s protection against bad fills. Because it stays server-side, makers price the trade on its own merits and the server enforces the limit when assembling the fill plan.

Firm quote

A firm quote is a maker’s binding response. The server may take all or part of each quote when building the fill plan.
FieldPurpose
takerIntentIdEchoes the intent id; correlates intent, firm-quote round, and status.
makerMaker signer address; the server recovers signature and checks it matches.
signedPayloadEIP-712 typed data the maker signed (a Permit2 PermitWitnessTransferFrom with an RfqOrder witness).
signatureThe maker’s EIP-712 signature over signedPayload.
Trade terms are bound inside signedPayload.message.witness:
Witness fieldPurpose
takerIntentIdMust match the intent and request.
takerTaker wallet from the intent.
makerMust match the envelope maker and the signature.
sellToken / buyTokenAsset addresses (taker’s view: taker sells sellToken, buys buyToken).
sellAmount / buyAmountSizes in base units. v1 is fixed-sell: sellAmount from the intent, buyAmount from the maker.
expiryUnix seconds after which the quote is void.
chainId lives in signedPayload.domain.chainId. The Permit2 message.deadline must stay valid through settlement — makers enforce a minimum time-to-live so the server can submit before it lapses.

Settlement guarantees

  • Atomic. The signed intent and the selected firm quotes settle in one transaction. If any leg fails, the whole trade reverts.
  • Slippage-bounded. The server only submits a fill plan whose aggregate output meets the taker’s minBuyAmount.
  • Non-custodial. Token movements are authorized by the taker’s intent signature and each maker’s Permit2 signature — no party pre-deposits funds with the exchange.