Skip to content

Python SDK exposes watch_prices, watch_user_positions, watch_user_transactions on base Exchange class — these methods only exist on LimitlessExchange in core #862

@realfishsam

Description

@realfishsam

Gap

In core, watchPrices, watchUserPositions, and watchUserTransactions are implemented exclusively on LimitlessExchange. The Python SDK incorrectly adds all three methods to the base Exchange class, meaning every exchange subclass (Kalshi, Polymarket, Myriad, etc.) inherits them. Calling these methods on any non-Limitless exchange via the Python SDK will produce a runtime error because the sidecar will attempt to call a method that doesn't exist on those exchange instances.

Core

core/src/exchanges/limitless/index.ts:495watchPrices exists ONLY on LimitlessExchange
core/src/exchanges/limitless/index.ts:506watchUserPositions exists ONLY on LimitlessExchange
core/src/exchanges/limitless/index.ts:517watchUserTransactions exists ONLY on LimitlessExchange

No other exchange class (KalshiExchange, PolymarketExchange, etc.) implements these methods. They are not on PredictionMarketExchange (base class).

TypeScript SDK

Missing entirely — tracked in issue #841.

Python SDK

sdks/python/pmxt/client.py:2180

def watch_prices(self, market_address: str, callback=None) -> Dict[str, Any]:
    ...  # on Exchange base class — inherited by ALL subclasses

sdks/python/pmxt/client.py:2216

def watch_user_positions(self, callback=None) -> List[Position]:
    ...  # on Exchange base class

sdks/python/pmxt/client.py:2253

def watch_user_transactions(self, callback=None) -> Dict[str, Any]:
    ...  # on Exchange base class

All three methods are defined on Exchange (the abstract base) rather than on the Limitless subclass. Every exchange inherits them. Calling Kalshi().watch_prices(...) will route to the sidecar which calls kalshi.watchPrices(...) — a method that doesn't exist — resulting in a runtime error with no static warning.

Evidence

watchPrices, watchUserPositions, watchUserTransactions appear at limitless/index.ts:495,506,517 and nowhere else in any other exchange's index.ts. The base class BaseExchange.ts does not define them. The Python SDK adds them to the base Exchange class at client.py:2180,2216,2253 — confirmed by searching for these method names.

Impact

  • Kalshi().watch_prices(...), Polymarket().watch_user_positions(...), etc. appear valid to static analysis and IDEs but fail at runtime.
  • These methods should be on a Limitless-specific class or guarded with a capability check.
  • Users writing generic code that iterates exchange instances may unknowingly call these on unsupported exchanges.
  • No type-level signal distinguishes Limitless from other exchanges for these capabilities.

Found by automated Core-to-SDK surface coverage audit

Metadata

Metadata

Assignees

No one assigned

    Labels

    P1: highbugSomething isn't workingcore-sdk-gapCore engine capabilities not exposed in SDKseffort: mediumpythonPython SDK specificsdk-parityConsistency between SDKs

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions