System overview
Numo’s orderbook is split across four layers:markets-service
Public REST API for market discovery, orderbook reads, trades, order entry, and cancellation.
execution-service
Backend executor that validates crossed-order payloads and submits
verifyAndMatch(...).execution-contracts
Onchain matching and action-verification contracts used by the trusted backend executor.
risk-core
Margin engine, subaccounts, cash asset accounting, manager hooks, settlement, and liquidation.
End-to-end flow
1
1. Market discovery
Clients call
GET /v1/markets on markets-service to discover enabled instruments and retrieve the canonical asset_address and sub_id.2
2. Orderbook reads
Clients poll
GET /v1/book and GET /v1/trades on markets-service for top-of-book state, recent prints, and 24h stats.3
3. Signed order submission
Clients submit signed order payloads to
POST /v1/orders. The service validates that order metadata matches the embedded action payload before persisting the order.4
4. Matching
The matcher loop in
markets-service scans for crossed orders, computes fill amounts, and builds an executor payload for the market.5
5. Onchain execution
execution-service validates the payload, ABI-encodes TradeModule.OrderData, simulates Matching.verifyAndMatch(...), and broadcasts the transaction through execution-contracts.6
6. Risk and settlement
risk-core validates account state through manager and asset hooks, updates margin state, and handles cash settlement, funding, and liquidation behavior.USDC/cNGN market
The USDC/cNGN market exposed by the backend is:market:USDCcNGN-SPOTcontract_type:spotsettlement_type:spotdisplay_name:USDC/cNGN Spot
Spot-style orderbook market on Base. Trades exchange WRAPPED_CNGN against internal USDC cash using the existing single quote-asset rail.
What each repo is responsible for
markets-service
- stores active orders and trade fills
- exposes
GET /v1/markets,GET /v1/book,GET /v1/trades - accepts
POST /v1/ordersandPOST /v1/orders/cancel - resolves market metadata from exact
(asset_address, sub_id)
execution-service
- accepts
POST /execute - requires
actions.length === signatures.length - requires
actions[0].subaccount_id === order_data.taker_account - requires every
action.module === module_address
execution-contracts
- verifies signed actions
- owns the trusted
Matchingexecution path - executes matched transfers against the core account system
risk-core
- stores balances in
SubAccounts - lets managers validate final account state
- lets assets track transfer semantics and settlement inputs
- provides
CashAssetandPerpAssetprimitives used by managers during settlement

