Order Manager (gRPC)
Every Order Manager operation is served over gRPC as well as HTTP, backed by
the same Service wrapping Arc<OrderManagerImpl>.
Address: CLOB_GRPC_ADDR, default 127.0.0.1:50051.
Definition: packages/order-manager/proto/order_manager.proto, code
generated via build.rs.
clob.OrderManagerService
Section titled “clob.OrderManagerService”| RPC | Request | Response |
|---|---|---|
InsertOrder | NewOrderRequest | OrderResponse |
CancelOrder | CancelOrderRequest | CancelOrdersResponse |
CancelOrders | CancelOrdersRequest | CancelOrdersResponse |
CancelAll | CancelAllRequest | CancelOrdersResponse |
CancelOrdersForMarket | CancelOrdersForMarketRequest | CancelOrdersResponse |
OrderSizeUpdate | UpdateOrderSize | OrderSizeUpdateResponse |
GetOrderbookOrders | FilterParams | OrderbookOrdersResponse |
GetOrdersByValueRange | FilterParams | OrderbookOrdersResponse |
GetOrder | GetOrderRequest | OrderView |
GetTrades | TradeParams | TradesResponse |
GetLastTrade | FilterParams | TradeSummary |
GetOpenOrders | OpenOrderParams | OpenOrdersResponse |
GetOpenOrder | OpenOrderParams | OpenOrder |
GetOrderBookSummary | GetOrderBookRequest | OrderBookSummary |
GetMarkets | Empty | MarketsResponse |
GetTokens | Empty | TokensResponse |
GetMarketDetails | GetMarketDetailsRequest | MarketDetails |
GetMarketDetailsByQuestionId | GetMarketDetailsRequest | MarketDetails |
IsOrderManagerReady | Empty | ReadyResponse |
Message field semantics match the HTTP shapes.
Each handler runs the synchronous manager call on the tokio runtime via
block_in_place.
In-process surfaces
Section titled “In-process surfaces”Rust callers embedding the crate have two direct entry points.
EventLoop
Section titled “EventLoop”Channel-driven ingestion and the background listeners.
| Operation | Signature |
|---|---|
new | EventLoop::new(manager, market_updates_fetch_interval) -> EventLoop |
start | EventLoop::start() -> bool — idempotent; a second call returns false |
send_new_order | EventLoop::send_new_order(NewOrder) -> Receiver<OrderResponse> |
manager | EventLoop::manager() -> &OrderManagerImpl |
shutdown | EventLoop::shutdown() — graceful, idempotent |
start wires the pending-service callbacks, builds the books from the
markets service, spawns three listen threads, and marks the manager ready.
Three background threads, not external endpoints:
- New orders — consumes
NewOrderTasks, runsInsertOrder, replies on the task’s channel. - Market updates — pulls the catalogue every fetch interval, creating, updating and deleting books.
- Game starts — consumes condition ids from the markets service and ejects pre-start orders.
OrderManager trait
Section titled “OrderManager trait”Synchronous, run inline — what the network handlers call.
Lifecycle
Section titled “Lifecycle”| Operation | Signature | Response |
|---|---|---|
| Insert | insert_order(&NewOrder) | OrderResponse |
| Cancel | cancel_order(key, order_hash) | CancelOrdersResponse |
| Cancel several | cancel_orders(key, hashes) | CancelOrdersResponse |
| Cancel all | cancel_all(key) | CancelOrdersResponse |
| Cancel for market | cancel_orders_for_market(key, params) | CancelOrdersResponse |
| Internal cancel | internal_cancel_orders(hashes) | — (no owner check) |
| Size update | order_size_update(&UpdateOrderSize) | Result<(), ClobError> |
| Game-start eject | delete_orders_on_game_start(condition_id) | — |
Queries
Section titled “Queries”| Operation | Response |
|---|---|
get_orderbook_orders(Option<&FilterParams>) | Vec<ProcessedOrder> |
get_orders_by_value_range(&FilterParams) | Vec<ProcessedOrder> |
get_trades(&TradeParams) | Result<Vec<TradeSummary>, ClobError> |
get_last_trade(&FilterParams) | Result<TradeSummary, ClobError> |
get_open_orders(&OpenOrderParams) | Result<Vec<OpenOrder>, ClobError> |
get_open_order(&OpenOrderParams) | Result<OpenOrder, ClobError> |
get_order(order_id) | Result<ProcessedOrder, ClobError> — book only |
get_order_book(condition_id) | Option<Arc<dyn Book>> |
get_order_book_by_token_id(token_id) | Option<Arc<dyn Book>> |
markets() | Vec<String> |
sampling_markets() | Vec<String> |
tokens() | Vec<String> |
get_market_details(condition_id) | Option<MarketDetails> |
get_market_details_by_question_id(question_id) | Option<MarketDetails> |
is_order_manager_ready() | bool |
Other gRPC services
Section titled “Other gRPC services”clob.LedgerService
Section titled “clob.LedgerService”packages/ledger/proto/clob.proto. Default http://localhost:5000.
CreateOrder,UpdateOrder— validity-gated upsertsGetOrder,GetOrderBook,GetOrderBookByAssetsGetOpenOrders,GetOpenOrderPostTrade,UpdateTradeGetTrades,GetLastTrade,OrderExistsGetMarketsByEpoch,GetRewardEpochSamples
clob.ExecutorService
Section titled “clob.ExecutorService”packages/executor/proto/clob.proto. Default http://localhost:6000.
Execute— validate → build → sign → send; returns the transaction signature.
Service boundaries
Section titled “Service boundaries”| Channel | Protocol | Purpose |
|---|---|---|
| order-manager → ledger | gRPC | Order/trade persistence and queries |
| order-manager → executor | gRPC | Match execution (Execute) |
| executor → ledger | gRPC | Trade status (UpdateTrade) |
| executor → order-manager | gRPC | Failure reconciliation (OrderSizeUpdate) |
| order-manager → markets-api | REST | Catalogue pulls, token → mint |
| executor → markets-api | REST | (market_id, outcome_mint) per trade |
| ledger → Redis | stream XADD | The notifications stream |