Six venues. One order surface. No rounding up.
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.
Most of the surface works and a named piece does not. The gap is written out under the venue rather than rounded up.
There is no code for it. A venue name the API accepts but no adapter backs still counts as not implemented.
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.
| Venue | Settles on | Market data | Order placement | Positions & history | Routed orders |
|---|---|---|---|---|---|
| Hyperliquid | Hyperliquid L1, bridged from Arbitrum | REST + websocket | Full | Full | Yes |
| Aster | Deposits from Ethereum, Arbitrum, BNB, Solana | REST + websocket | Full | Broker services only | Yes |
| Lighter | Lighter zk rollup, deposits on Ethereum + Arbitrum | REST + websocket | Full | All but funding history | Yes |
| Pacifica | Solana | REST + websocket | Full, own endpoints | Full | No |
| Pear | Hyperliquid, via Pear | Websocket + REST poll | Pair positions only | Pair positions | No — pair endpoints |
| Avantis | Base | Socket API + Pyth prices | None | Full | No |
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.
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).
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
ImplementedREST 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
ImplementedMarket 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
ImplementedClearinghouse positions with leverage mode and unrealised PnL, withdrawable balance, open orders, the full historical order set, user fills and funding history.
Smart-order routing
ImplementedOne of the three venues the dynamic adapter factory can build on demand, so the router can actually send the order it recommends.
- backend/src/services/exchanges/hyperliquid/hyperliquidAdapterService.ts
- backend/src/services/exchanges/hyperliquid/hyperliquid-market-wss.service.ts
- backend/src/services/discovery/exchanges/hyperliquidDiscovery.ts
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.
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
ImplementedExchange 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
ImplementedThe 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
PartialReads 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
ImplementedRoutable. 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.
- 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.
- 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
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.
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
ImplementedTickers 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
ImplementedPlace 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
PartialOpen 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
ImplementedRoutable. The adapter factory validates the 40-byte key, the account index and the key index, then builds the adapter on demand.
- Funding history returns an empty array — the adapter notes that per-user funding history is not readily exposed, so multi does not claim it.
- backend/src/services/exchanges/lighter/lighterAdapterService.ts
- backend/src/services/exchanges/lighter/lighter-market-wss.service.ts
- backend/src/config/lighter-contracts.ts
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.
Quotes and depth for the aggregated book. Trading Pacifica means calling its own trading endpoints, not the routed order path.
Market data
ImplementedTickers, 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
ImplementedMarket 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
ImplementedAccount 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 implementedNot 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.
- Absent from the dynamic adapter factory, so the smart-order router cannot execute on it even though the API validates the venue name.
- backend/src/services/exchanges/pacifica/trading.ts
- backend/src/services/exchanges/pacifica/account.ts
- backend/src/services/trading/dynamicAdapterFactory.ts
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.
Pair discovery, ratio history and pair execution. Single-symbol smart orders never resolve to Pear.
Market data
ImplementedA 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
ImplementedThrough 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
ImplementedProcessed 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 implementedPair 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.
- No maker or taker fee constants are recorded for Pear in the symbol registry, so multi does not display a Pear fee.
- backend/src/services/exchanges/pear/pearTradingService.ts
- backend/src/services/exchanges/pear/pairTradeEngine.ts
- backend/src/services/ingestion/connection-pools/PearConnectionPool.ts
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.
Prices, open interest and your existing positions. multi reports Avantis exposure in the portfolio view; it does not place Avantis trades.
Market data
PartialPair 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 implementedNothing. No adapter, no signing path, no order route. Opening or closing an Avantis position is done at Avantis.
Positions & history
ImplementedOpen 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 implementedNot 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.
- 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.
- backend/src/services/exchanges/avantis/avantis-data.service.ts
- backend/src/services/ingestion/connection-pools/AvantisConnectionPool.ts
- backend/src/services/discovery/exchanges/avantisDiscovery.ts
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.