The venue layer

Six venues. One order surface. No rounding up.

multi aggregates six perpetual venues, and the six integrations are not identical. This page states what each one settles on, what its adapter can actually do, and where the code stops — because a routing layer you cannot audit is only a claim.
Implemented

The code path exists end to end and is reachable from a route or the router. That is a statement about the integration, not a promise about liquidity.

Partial

Most of the surface works and a named piece does not. The gap is written out under the venue rather than rounded up.

Not implemented

There is no code for it. A venue name the API accepts but no adapter backs still counts as not implemented.

At a glance

Three of six take a routed order.

Hyperliquid, Aster and Lighter can be executed on by the smart-order router today. Pear takes pair intents through its own path, Pacifica trades through its own endpoints, and Avantis is read-only.

VenueSettles onMarket dataOrder placementPositions & historyRouted orders
HyperliquidHyperliquid L1, bridged from ArbitrumREST + websocketFullFullYes
AsterDeposits from Ethereum, Arbitrum, BNB, SolanaREST + websocketFullBroker services onlyYes
LighterLighter zk rollup, deposits on Ethereum + ArbitrumREST + websocketFullAll but funding historyYes
PacificaSolanaREST + websocketFull, own endpointsFullNo
PearHyperliquid, via PearWebsocket + REST pollPair positions onlyPair positionsNo — pair endpoints
AvantisBaseSocket API + Pyth pricesNoneFullNo

Routed orders means the smart-order router can build an adapter for the venue and send it the order it recommends. The aggregated orderbook merges depth from five sources; the executable set is smaller, and this table is the executable set.

Venue 01

Hyperliquid

Orderbook perps on a purpose-built L1

The most complete adapter in the repo. Orders are signed with the account's own key, placed against the live book, and every account read — positions, balances, open and historical orders, fills, funding — comes back through the same class.

Settles on the Hyperliquid L1. Margin arrives through the bridge contract on Arbitrum One (chain 42161).

What multi routes to it for

Everything. A smart order that resolves to Hyperliquid is placed, tracked, cancelled and reconciled through this adapter, and pair trades default to executing their legs here.

Market data

Implemented

REST info endpoint plus the public websocket. Tickers and books are served from a cached asset-context snapshot with rate-limit-aware exponential backoff; candles and trades have their own ingestion subscribers; the market universe is discovered from the meta endpoint.

Order placement

Implemented

Market and limit orders, GTC / IOC / post-only, reduce-only, client order ids, tick and size rounding taken from the asset metadata, plus cancel and single-order status. Retries on rate limits without duplicating an order.

Positions & history

Implemented

Clearinghouse positions with leverage mode and unrealised PnL, withdrawable balance, open orders, the full historical order set, user fills and funding history.

Smart-order routing

Implemented

One of the three venues the dynamic adapter factory can build on demand, so the router can actually send the order it recommends.

Read in
  • backend/src/services/exchanges/hyperliquid/hyperliquidAdapterService.ts
  • backend/src/services/exchanges/hyperliquid/hyperliquid-market-wss.service.ts
  • backend/src/services/discovery/exchanges/hyperliquidDiscovery.ts
Venue 02

Aster

Binance-compatible perp exchange

Aster is integrated twice, on purpose. A thin per-request adapter exists for the router — it holds no state and signs each call with HMAC-SHA256 — and a fuller set of broker services handles keys, deposits, transfers and account reads.

Margin is deposited through contracts on Ethereum, Arbitrum One and BNB Chain, plus a Solana program for USDC and USDT.

What multi routes to it for

Execution and leverage. Reads are served by the broker services rather than the execution adapter, so treat the two as one venue with two doors.

Market data

Implemented

Exchange info, 24h tickers, prices and depth through the broker market-data service, a Binance-compatible websocket client for streaming, and candle plus trade subscribers in the ingestion pipeline.

Order placement

Implemented

The router adapter places and cancels orders and sets leverage before sizing. The broker service covers the wider order-type set — stop, stop-market, take-profit, trailing stop — with reduce-only and close-position flags.

Positions & history

Partial

Reads work, but not from the router adapter. That class deliberately stubs positions, balances, open orders and the history calls to empty results and throws on ticker and orderbook; the broker services and the ingestion pipeline serve those instead.

Smart-order routing

Implemented

Routable. The adapter factory builds an Aster adapter from an encrypted key pair and wallet address, and the router sets leverage before it sends the order.

What this integration does not do
  • The per-request router adapter is execution-only by design — its read methods are explicit stubs, and code that expects an orderbook from it will throw.
Read in
  • backend/src/services/exchanges/aster-trading-adapter.ts
  • backend/src/services/exchanges/aster/aster-broker-perp-trading.service.ts
  • backend/src/services/exchanges/aster/aster-broker-market-data.service.ts
Venue 03

Lighter

Orderbook perps on a zk rollup

The second-deepest adapter. Orders are signed with an ed25519 API key bound to an account index and a key index, nonces are fetched and serialised per account, and market metadata — tick size, size decimals, minimum order — is loaded before anything is sent.

Settles on the Lighter zk rollup. The deposit contract is deployed at the same address on Ethereum mainnet and Arbitrum One.

What multi routes to it for

Execution, book reads and account state. It is also the alternate execution venue for pair trades, with its own rate-limit budget separate from Hyperliquid's.

Market data

Implemented

Tickers and full orderbooks from the mainnet REST API, a streaming websocket client, market discovery from the explorer API, and candle plus trade subscribers.

Order placement

Implemented

Place and cancel, either against stored encrypted credentials or with a key passed in directly. Requests are queued so nonces never collide, and the key format is validated before a signature is attempted.

Positions & history

Partial

Open positions, open orders, per-order status, historical orders, user trades and an account-info read used by the balances endpoint. Funding history is the one gap.

Smart-order routing

Implemented

Routable. The adapter factory validates the 40-byte key, the account index and the key index, then builds the adapter on demand.

What this integration does not do
  • Funding history returns an empty array — the adapter notes that per-user funding history is not readily exposed, so multi does not claim it.
Read in
  • backend/src/services/exchanges/lighter/lighterAdapterService.ts
  • backend/src/services/exchanges/lighter/lighter-market-wss.service.ts
  • backend/src/config/lighter-contracts.ts
Venue 04

Pacifica

Orderbook perps, Solana-native

A complete standalone integration that is not wired into the smart-order router. Market data, account state and execution all work — they just live behind their own endpoints rather than the routed order path.

Settles on Solana. Collateral is USDC on Solana, and orders are signed with a Solana keypair.

What multi routes to it for

Quotes and depth for the aggregated book. Trading Pacifica means calling its own trading endpoints, not the routed order path.

Market data

Implemented

Tickers, symbols, prices and market stats over REST, plus a websocket client with an orderbook manager that coalesces book updates on a 100ms tick. Pacifica is also one of the sources the aggregated orderbook merges.

Order placement

Implemented

Market and limit orders, cancel, cancel-all and close-position, all signed with the account's Solana key and bounded by the venue's minimum order size and slippage limits.

Positions & history

Implemented

Account info, balance, positions in both raw and normalised shapes, open orders, an account summary, trading limits, and trade history with per-symbol PnL.

Smart-order routing

Not implemented

Not routable today. The API accepts pacifica as a preferred venue and the aggregator reads its book, but the dynamic adapter factory only builds Hyperliquid, Aster and Lighter adapters, so a routed order preferring Pacifica is rejected at credential validation.

What this integration does not do
  • Absent from the dynamic adapter factory, so the smart-order router cannot execute on it even though the API validates the venue name.
Read in
  • backend/src/services/exchanges/pacifica/trading.ts
  • backend/src/services/exchanges/pacifica/account.ts
  • backend/src/services/trading/dynamicAdapterFactory.ts
Venue 05

Pear

Pair trading — one long leg, one short leg, one position

Pear is the one venue multi can reach two ways. It can hand the pair to Pear's own API, or it can build the same spread itself and place each leg directly on Hyperliquid or Lighter.

Positions land on Hyperliquid. The client documents Pear as a non-custodial Hyperliquid wrapper that routes paired orders through builder codes.

What multi routes to it for

Pair discovery, ratio history and pair execution. Single-symbol smart orders never resolve to Pear.

Market data

Implemented

A dedicated connection pool holds one websocket to Pear's market-data channel — the whole market set arrives as a single snapshot — with a 30-second REST poll as a fallback so ratio history keeps accumulating if the socket drops. Ratio history has its own service and route.

Order placement

Implemented

Through Pear: EIP-712 login for a JWT, then create, close, adjust and re-leverage positions across sync, market, trigger, TWAP, ladder, take-profit and stop-loss execution types. Through multi: the pair engine sizes each leg from its weight, places the legs with per-venue rate limiting and retries, and reports open, partial or failed.

Positions & history

Implemented

Processed open positions and an account summary from Pear, and locally-executed pair positions tracked with their entry ratio and per-leg fills.

Smart-order routing

Not implemented

Pair intents do not go through the single-symbol router. They have their own endpoints, and the pair engine picks Hyperliquid by default or Lighter on request.

What this integration does not do
  • No maker or taker fee constants are recorded for Pear in the symbol registry, so multi does not display a Pear fee.
Read in
  • backend/src/services/exchanges/pear/pearTradingService.ts
  • backend/src/services/exchanges/pear/pairTradeEngine.ts
  • backend/src/services/ingestion/connection-pools/PearConnectionPool.ts
Venue 06

Avantis

Oracle-priced perps, no central orderbook

Read-only. Avantis is fully wired for data and portfolio reads and has no execution path in this repo at all — there is no Avantis trading adapter to build, and the trade controller says so in as many words.

Settles on Base. Collateral is USDC on Base.

What multi routes to it for

Prices, open interest and your existing positions. multi reports Avantis exposure in the portfolio view; it does not place Avantis trades.

Market data

Partial

Pair listings, open interest, leverage bounds and per-pair fees from the public socket API, with prices polled from Pyth every two seconds and pair data every thirty. There is no orderbook, because Avantis does not have one.

Order placement

Not implemented

Nothing. No adapter, no signing path, no order route. Opening or closing an Avantis position is done at Avantis.

Positions & history

Implemented

Open positions decoded from the user-data API with entry price, liquidation price, leverage and rollover fee, plus limit orders, paged trade history, and deployed collateral netted out of the Base USDC balance.

Smart-order routing

Not implemented

Not routable. Avantis appears in the aggregated orderbook's source list and is an accepted venue name in the API, but no adapter exists for the router to execute against.

What this integration does not do
  • No order placement anywhere in the backend — the trade controller marks the integration as a direct API call with no trading adapter.
  • No aggregated orderbook depth, because the venue is oracle-priced rather than book-driven.
Read in
  • backend/src/services/exchanges/avantis/avantis-data.service.ts
  • backend/src/services/ingestion/connection-pools/AvantisConnectionPool.ts
  • backend/src/services/discovery/exchanges/avantisDiscovery.ts
One order surface

Quote all six. Execute where it fills.

The terminal shows the aggregated book and the routing decision behind every fill. The agent layer exposes the same decision as a tool call.