Gap
SmarketsExchange has no websocket.ts file at all — the only one of the nine batch-2-audited exchanges (mock, myriad, opinion, polymarket, polymarket_us, probable, rain, smarkets, suibets) missing one entirely, and unlike SuiBetsExchange (which explicitly declares watchOrderBook: false/watchTrades: false in capabilityOverrides as a deliberate "not supported" statement), Smarkets declares nothing — watchOrderBook, watchOrderBooks, unwatchOrderBook, watchTrades, watchAddress, unwatchAddress all silently fall through to BaseExchange's throwing stubs. This mirrors the already-filed Hyperliquid gap (#2076) for a second venue.
Core
core/src/exchanges/smarkets/ — file listing confirms no websocket.ts exists (every other exchange except polymarket_us-via-vendor-SDK and suibets/baozi's minimal cases has one; Smarkets has none whatsoever).
core/src/exchanges/smarkets/index.ts:37-40 — capabilityOverrides declares only fetchPositions: 'emulated' and fetchSeries: false; no watchOrderBook/watchTrades/etc. entries, so these aren't marked as a deliberate exclusion.
core/src/exchanges/smarkets/index.ts:366 — close() is overridden as an explicit no-op with the comment "No WebSocket or persistent connections to clean up" — confirming (from the implementer's own comment) that streaming was never built for this venue, not merely mis-wired.
core/src/BaseExchange.ts:1585 (watchOrderBook), :1640 (watchTrades), :1622 (unwatchOrderBook) — base stubs, throw "not supported by Smarkets" when unoverridden.
TypeScript SDK
N/A at the SDK layer — sdks/typescript/pmxt/client.ts:2077 (watchOrderBook)/:2247 (watchTrades) are generic Exchange passthroughs that call core over the /ws WebSocket transport; for exchangeName: 'smarkets' these will always fail because core has no handler.
Python SDK
N/A at the SDK layer — same generic passthroughs (sdks/python/pmxt/client.py:2597 watch_order_book, :2749 watch_trades), same failure mode for Smarkets.
Evidence
Read every file in core/src/exchanges/smarkets/ (api.ts, auth.ts, config.ts, errors.ts, fetcher.ts, index.ts, normalizer.ts, price.ts) — confirmed no websocket.ts file and no WS-related imports anywhere in index.ts. Smarkets' own api.ts OpenAPI spec (10,695 lines, the largest in the repo) contains 21 documented REST operations but zero WebSocket/streaming operations, suggesting the raw Smarkets API itself may not expose a WS feed the current implementation is built against — worth core-side triage to confirm whether this is "not yet implemented" or "the venue has no realtime API to wrap," but as it stands the capability is silently absent rather than explicitly declared unsupported like SuiBets.
Impact
Any SDK caller expecting real-time order-book/trade updates for Smarkets (following the same watchOrderBook/watchTrades pattern that works for Polymarket, Kalshi, Limitless, Opinion, Myriad, GeminiTitan, Rain, PolymarketUS) gets an opaque "not supported" throw with no capability-map signal distinguishing it from a temporarily-missing feature versus a venue that fundamentally cannot stream.
Found by automated Core-to-SDK surface coverage audit
Gap
SmarketsExchangehas nowebsocket.tsfile at all — the only one of the nine batch-2-audited exchanges (mock, myriad, opinion, polymarket, polymarket_us, probable, rain, smarkets, suibets) missing one entirely, and unlikeSuiBetsExchange(which explicitly declareswatchOrderBook: false/watchTrades: falseincapabilityOverridesas a deliberate "not supported" statement), Smarkets declares nothing —watchOrderBook,watchOrderBooks,unwatchOrderBook,watchTrades,watchAddress,unwatchAddressall silently fall through toBaseExchange's throwing stubs. This mirrors the already-filed Hyperliquid gap (#2076) for a second venue.Core
core/src/exchanges/smarkets/— file listing confirms nowebsocket.tsexists (every other exchange exceptpolymarket_us-via-vendor-SDK andsuibets/baozi's minimal cases has one; Smarkets has none whatsoever).core/src/exchanges/smarkets/index.ts:37-40—capabilityOverridesdeclares onlyfetchPositions: 'emulated'andfetchSeries: false; nowatchOrderBook/watchTrades/etc. entries, so these aren't marked as a deliberate exclusion.core/src/exchanges/smarkets/index.ts:366—close()is overridden as an explicit no-op with the comment "No WebSocket or persistent connections to clean up" — confirming (from the implementer's own comment) that streaming was never built for this venue, not merely mis-wired.core/src/BaseExchange.ts:1585(watchOrderBook),:1640(watchTrades),:1622(unwatchOrderBook) — base stubs, throw "not supported by Smarkets" when unoverridden.TypeScript SDK
N/A at the SDK layer —
sdks/typescript/pmxt/client.ts:2077(watchOrderBook)/:2247(watchTrades) are genericExchangepassthroughs that call core over the/wsWebSocket transport; forexchangeName: 'smarkets'these will always fail because core has no handler.Python SDK
N/A at the SDK layer — same generic passthroughs (
sdks/python/pmxt/client.py:2597watch_order_book,:2749watch_trades), same failure mode for Smarkets.Evidence
Read every file in
core/src/exchanges/smarkets/(api.ts,auth.ts,config.ts,errors.ts,fetcher.ts,index.ts,normalizer.ts,price.ts) — confirmed nowebsocket.tsfile and no WS-related imports anywhere inindex.ts. Smarkets' ownapi.tsOpenAPI spec (10,695 lines, the largest in the repo) contains 21 documented REST operations but zero WebSocket/streaming operations, suggesting the raw Smarkets API itself may not expose a WS feed the current implementation is built against — worth core-side triage to confirm whether this is "not yet implemented" or "the venue has no realtime API to wrap," but as it stands the capability is silently absent rather than explicitly declared unsupported like SuiBets.Impact
Any SDK caller expecting real-time order-book/trade updates for Smarkets (following the same
watchOrderBook/watchTradespattern that works for Polymarket, Kalshi, Limitless, Opinion, Myriad, GeminiTitan, Rain, PolymarketUS) gets an opaque "not supported" throw with no capability-map signal distinguishing it from a temporarily-missing feature versus a venue that fundamentally cannot stream.Found by automated Core-to-SDK surface coverage audit