Releases: pmxt-dev/pmxt
Release list
v2.54.0
Added
feat(probable): unified Web3 authentication lifecycle (#1614). AddsgetAuthNonce,loginWithSignature,logout,isSessionActive, andverifyL1/verifyL2to the Probable exchange, with in-memory session storage on the base class, exposed through both SDKs.
Security
- Session credentials are never exposed over the network. #1614 as submitted exposed
getSessionas an HTTP/RPC endpoint that returned the full session credential set (apiKey/apiSecret/passphrase) keyed by a public wallet address — on a shared/hosted deployment any caller could retrieve another user's trading secrets. Before landing,getSessionwas added toEXCLUDED_METHODSingenerate-openapi.js, so it is omitted frommethod-verbs.json, the OpenAPI spec, and the generated SDK clients; it remains an in-process helper only. The signature-gatedloginWithSignature(which returns the caller's own freshly minted credentials, only after they prove wallet ownership) and the booleanisSessionActiveremain available.
Installation
npm:
npm install pmxtjs@2.54.0
npm install -g @pmxt/cli@2.54.0PyPI:
pip install pmxt==2.54.0Links
Full Changelog: v2.53.1f...v2.54.0f
v2.53.1
Fixed
fix(core): typecompareMarketPriceswithCompareMarketPricesParams(#1419). Introduce a preciseCompareMarketPricesParamstype and use it for the basecompareMarketPricessignature instead of the looseFetchMatchesParams. Type-only refinement — the base method is a stub and the concreteRouter.tsbehavior is unchanged. Only the buildable core of #1419 was applied; its broken SDK-generator import and aprivate_key=wallet_addressbug were dropped.
Installation
npm:
npm install pmxtjs@2.53.1
npm install -g @pmxt/cli@2.53.1PyPI:
pip install pmxt==2.53.1Links
Full Changelog: v2.53.0f...v2.53.1f
v2.53.0
Second wave of community PR triage. Each of these was reworked before landing — the original branches carried stale reverts, file-encoding corruption, or compile errors, so only the intended net change was applied on top of current main, then re-verified. All Core (816), Python SDK (267), and TypeScript SDK (93) tests pass. Minor bump for the new opt-in Router and WebSocket capabilities.
Added
feat(sdk):Router.sql(query)(#1129). Both SDKs gain aRouter.sql()/Router.sql()method that POSTs a query to the server's existing/v0/sqlendpoint (read-only ClickHouse, error-scrubbed) with the SDK's normal auth headers, returning a typedSqlResult(SqlMeta/SqlColumn) exported from each package root. The original PR's UTF-16 file corruption and unrelated reverts were dropped.feat(sdk): cross-venueRouter.fetchOrderBook(outcomeId)(#1670). Both SDKs expose a Router-level order-book fetch that routes through the existing coreRouter.fetchOrderBooksurface and returns a single mergedOrderBook. Reimplemented as a properRouterclass method (the original defined it at module level, which gutted the PythonRouterclass).feat(sdk): expose WebSocket configuration for Polymarket and Kalshi (#1126). Awebsocketoptions object (reconnect interval, max reconnect attempts, ping interval, connect timeout) is threaded through the SDK exchange constructors into the WebSocket clients in both SDKs. Reconciled with the #1659 handshake-timeout/retry work already onmain, and the fast default reconnect backoff is preserved (no 5s-default regression).
Fixed
fix(baozi): correct program error-code mappings (#1118). Remap6018/6040/6020/6041→6013/6014/6023/6024to match the current on-chain IDL. Applied without the stale hosted-trading reverts the original branch carried.fix(limitless): paginate all markets (#1119). Replace fixed-page parallel fetching with sequential pagination driven bytotalMarketsCount(with a 50-page safety cap) plus a token-filter over-fetch factor, so largelimitrequests return the full set. Applied without the stale reverts.fix(ts-sdk): alignMatchResult/PriceComparisonnullable fields (#1578). Widenreasoning,bestBid,bestAsktoT | nullto matchopenapi.yaml(nullable: true). The half-wired parity CI from that PR was intentionally not included.
Not merged
- #1614 (
feat(probable)) was rejected: it exposed session credentials (apiKey/apiSecret/passphrase) over an HTTP endpoint keyed by a public wallet address. Held out pending a fix that stops returning secrets over the server surface. - #1419 (
replace any with proper types) was superseded: the remaininganyusages are raw wire-JSON in converter helpers with no genuine importable type to substitute; the public Router signatures are already typed.
Installation
npm:
npm install pmxtjs@2.53.0
npm install -g @pmxt/cli@2.53.0PyPI:
pip install pmxt==2.53.0Links
Full Changelog: v2.52.0f...v2.53.0f
v2.52.0
Maintenance release rolling up the community and internal fixes accumulated since 2.51.4, plus two additive venue capabilities. All Core (816), Python SDK (260), and TypeScript SDK (86) tests pass. Backward-compatible; minor bump for the new opt-in features.
Added
feat(rain):fetchOrderBooksbatch order-book fetch (#1693).RainExchangenow implements the batchfetchOrderBooks(outcomeIds)surface (emulated by fanning out to the existing single-outcomefetchOrderBook) and declares theemulatedcapability, so Rain participates in the cross-venue batch order-book path.feat(python): SuiBets wallet options (#1657). The Python SDK gains aSuiBetsOptionstyped dict and threadswallet_addressthrough theSuiBetsconstructor into the sidecar credential dict, matching the wallet-option pattern used by other venues.
Fixed
fix(hyperliquid): builder order attribution (#1658).createOrderaccepts optionalbuilder/builderFeeparams, appended to the signed payload in the correct key order (aftergrouping) with address/fee validation. Purely opt-in; existing order flows are unchanged.fix(typescript): WS client connection timeout and retry (#1659). The TS SDK WebSocket client now applies a 10s handshake timeout and a 3-attempt retry loop with backoff, bringing it to parity with the Python client.fix(limitless): wireunwatchOrderBookto WebSocket unsubscribe (#1692).unwatchOrderBooknow forwards toLimitlessWebSocket.unsubscribe, mirroring thewatchOrderBookoverride and the Polymarket pattern.fix(kalshi): expose event metadata endpoint (#1611); syncTradeschema with v2 API drift (#1187, #1282); OHLCV normalizer + docsoutcomeIdparam (#1429).fix(suibets): modelonchainStateto restore accurate order-book liquidity (#1583).fix(polymarket-us): prevent WebSocket connect hangs from a garbage-collected timeout (#1580).fix(limitless): throw onwatchOrderBookfailure instead of silently swallowing it (#1581).fix(gemini-titan): add terms-acceptance flow before order submission (#1326).fix(smarkets):resolutionDatefallback (#1367).fix(sdk): compute detailed execution prices locally (#1308); expose venue filters in fetch params (#1325); align order book field types (#1417).fix(ts-sdk): exportPolymarket_usalias (#1290); raise hosted embedded errors (#1307); require wallet for hosted build orders (#1314); forwardapiSecretcredentials (#1375); make hosted errors catchable by the base class (#1416); export public SDK option types (#1453); exportExchangeOptionsfrom the package root (#1493); add documented event helper methods (#1492); makePositionfields nullable to match Core (#1418); export version constant (#1579).fix(python-sdk): route order-book unwatch via HTTP (#1324); accept wallet address in the Hunch client (#1376); route Myriad wallet address correctly (#1452); typeapi_secretin exchange options (#1511); export filter function types (#1546).
Installation
npm:
npm install pmxtjs@2.52.0
npm install -g @pmxt/cli@2.52.0PyPI:
pip install pmxt==2.52.0Links
What's Changed
- fix(ts-sdk): raise hosted embedded errors by @realfishsam in #1307
- fix(ts-sdk): require wallet for hosted build orders by @realfishsam in #1314
- fix(sdk): compute detailed execution prices locally by @realfishsam in #1308
- fix(python-sdk): route order-book unwatch via HTTP by @realfishsam in #1324
- Fix Smarkets resolutionDate fallback by @jordansilly77-stack in #1367
- fix(gemini-titan): add terms acceptance flow before order submission by @AbhilashG12 in #1326
- fix(sdk): expose venue filters in fetch params by @realfishsam in #1325
- fix(ts-sdk): make hosted errors catchable by base class by @realfishsam in #1416
- fix(python-sdk): accept wallet address in Hunch client by @realfishsam in #1376
- fix(ts-sdk): forward apiSecret credentials by @realfishsam in #1375
- fix(kalshi): OHLCV normalizer + docs outcomeId param by @realfishsam in #1429
- fix(python-sdk): route Myriad wallet address correctly by @realfishsam in #1452
- fix(typescript): make Position fields nullable to match core by @AbhilashG12 in #1418
- fix(typescript): add documented event helper methods by @realfishsam in #1492
- fix(typescript): export public SDK option types by @realfishsam in #1453
- fix(sdks): align order book field types by @realfishsam in #1417
- fix(typescript): export ExchangeOptions from package root by @realfishsam in #1493
- fix(python-sdk): type api_secret in exchange options by @realfishsam in #1511
- fix(ts-sdk): export version constant by @realfishsam in #1579
- Export Python filter function type aliases from package root by @jordansilly77-stack in #1546
- docs(suibets): remove deprecated events endpoint by @AbhilashG12 in #1582
- fix(suibets): model onchainState to restore accurate order book liquidity by @AbhilashG12 in #1583
- fix(limitless): throw on watchOrderBook failure instead of silent swallow by @AbhilashG12 in #1581
- fix(polymarket-us): prevent websocket connect hangs with garbage-collected timeout by @AbhilashG12 in #1580
- fix(kalshi): expose event metadata endpoint by @realfishsam in #1611
- fix(kalshi): sync Trade schema with v2 API drift (#1187) by @AbhilashG12 in #1282
- fix(ts-sdk): export Polymarket_us alias by @DeepCogNeural in #1290
- docs(sdks): align prefunded escrow comments by @Bortlesboat in #1656
- feat(python): add SuiBets wallet options by @Bortlesboat in #1657
- fix(hyperliquid): support builder order attribution by @BridgeAISocial in #1658
- fix(typescript): add connection timeout and retry to WS client by @AbhilashG12 in #1659
- fix(limitless): wire unwatchOrderBook to WebSocket unsubscribe by @JSap0914 in #1692
- feat(rain): add fetchOrderBooks batch order-book fetch by @JSap0914 in #1693
New Contributors
- @jordansilly77-stack made their first contribution in #1367
- @BridgeAISocial made their first contribution in #1658
- @JSap0914 made their first contribution in #1692
Full Changelog: v2.51.4f...v2.52.0f
v2.51.4
Fixed
- Hyperliquid normalizer now extracts
resolutionDatefrom question prose when noexpiry:tag is present. Hyperliquid'soutcomeMetapayload exposes no structured end-time on either the Outcome or Question objects. Price-bracket markets get a cleanexpiry:YYYYMMDD-HHmmin the outcome description (parsed); everything else (World Cup teams/matches, Fed funds decisions, CPI prints) puts the deadline only in the question description's legalese, e.g. "by October 14, 2026 at 23:59 UTC". The normalizer now scans the question description for<Month> <DD>[,] <YYYY> [at HH:MM UTC]matches and takes the latest — which is always the resolution deadline (questions often mention an event date and a later cutoff). Defaults to 23:59 UTC when no time is given. Verified against all 28 live HL questions: 27 resolve to the correct deadline (World Cup matches → 2026-07-19, World Cup champion → 2026-10-14, Fed funds → 2026-09-16, CPI → 2026-08-12); the one miss is theRecurringprice-bracket parent, which still falls through to the existing outcome-levelexpiry:tag.
Installation
npm:
npm install pmxtjs@2.51.4
npm install -g @pmxt/cli@2.51.4PyPI:
pip install pmxt==2.51.4Links
Full Changelog: v2.51.3f...v2.51.4f
v2.51.3
Fixed
- Hyperliquid normalizer no longer stamps
resolutionDatewith the Unix epoch when expiry is unknown.core/src/exchanges/hyperliquid/normalizer.tsusedexpiryDate ?? new Date(0)for the Outcome Markets path, which caused HL markets without a parseableexpiry:YYYYMMDD-HHmmmetadata tag (e.g., World Cup team markets) to be serialized withresolutionDate = 1970-01-01T00:00:00Z. Downstream consumers that gate on "is this market still tradable?" viaresolutionDate <= now()(hosted-pmxt's ingest sweep is one) would then mass-close otherwise-live markets. The field is already optional inUnifiedMarket, so the fallback is now plainundefined— consumers decide policy.
Installation
npm:
npm install pmxtjs@2.51.3
npm install -g @pmxt/cli@2.51.3PyPI:
pip install pmxt==2.51.3Links
What's Changed
- fix(core): use Rain contract address for price history by @realfishsam in #1300
- fix(ts-sdk): expose Limitless watch helpers by @realfishsam in #1301
Full Changelog: v2.51.2f...v2.51.3f
v2.51.2
Fixed
- Hunch list ingestion now surfaces live binary prices instead of zero-priced markets. The Hunch list/catalog item now carries
raw.odds; the normalizer uses those YES/NO cents on the bare list path while still letting explicit detail/quote odds win. This unblocks Hunch markets from price-gated cross-venue features such as compare, arbitrage, hedge, and matched-prices. - Hunch
volume24hnow passes throughraw.volume24hUsd. The previous hard-zero made the recency/ranking signal unusable for Hunch even when the venue provided a trailing-24h figure. - Hunch category and tags now map into PMXT taxonomy. Native Hunch categories roll up to top-level PMXT categories (
Cryptoby default,event→Culture) and add granular tags such asMarket Cap,Price, and the token symbol so?category=filters and market matching work with higher confidence. - Hunch catalog crawls now follow
nextCursor.fetchRawMarkets()drains the full paginated catalogue when no explicit limit is supplied, with a 50-page safety backstop; explicit limit calls still fetch a single page. - Consumer SDK/generated surfaces were synced for Hunch. Added Hunch to the Python and TypeScript SDK exports and made the client-method generators preserve existing hosted-mode overrides while codegen catches up, so the generated-sync checks stay green without regressing hosted routing.
Installation
npm:
npm install pmxtjs@2.51.2
npm install -g @pmxt/cli@2.51.2PyPI:
pip install pmxt==2.51.2Links
What's Changed
- feat(hunch): surface live odds + 24h volume + Crypto taxonomy + cursor draining by @rajkaria in #1293
Full Changelog: v2.51.1f...v2.51.2f
v2.51.1
Followup to the Hunch venue ship in 2.51.0: the adapter was wired into the runtime (factory, registry, exports) but hunch was missing from the ExchangeParam enum in core/scripts/generate-openapi.js. That enum is the source of truth for docs/concepts/venues.mdx (auto-generated), the OpenAPI path enum, and COMPLIANCE.md, so Hunch was invisible on pmxt.dev/docs/concepts/venues and absent from the compliance matrix.
Fixed
core/scripts/generate-openapi.js— addedhunchto theExchangeParamenum. Regeneratedcore/src/server/openapi.yaml,docs/api-reference/openapi.json, anddocs/concepts/venues.mdx(now 18 venues).core/scripts/generate-compliance.js— addedhunchtoEXCHANGE_ORDER. Regeneratedcore/COMPLIANCE.md(Hunch: 15/20 methods supported).README.md— added Hunch to the supported-exchanges row.
Installation
npm:
npm install pmxtjs@2.51.1
npm install -g @pmxt/cli@2.51.1PyPI:
pip install pmxt==2.51.1Links
Full Changelog: v2.51.0f...v2.51.1f
v2.51.0
New venue: Hunch (parimutuel prediction market on Base, x402 settlement). And a full assertion-based audit of the Hyperliquid SDK surface (both Python + TS) caught ten silent bugs that prior "did the call throw?" smoke tests had hidden — several since the venue was added. Read paths now have behavioral assertions on shape AND values; trading paths are verified end-to-end against a live mainnet wallet. Final HL state: every no-creds method behaviorally green in both SDKs (43/43 assertions), credentialed reads cross-checked vs HL raw API (open orders: 7/7 exact match; user trades: 2000/2000 match; synthesized closed orders: 104/104 match), and the full createOrder → openOrders → cancelOrder → openOrders-empty lifecycle proven live.
Added — Hunch venue (#1150)
core/src/exchanges/hunch/— new adapter for playhunch.xyz, a parimutuel (pool-based, not CLOB/AMM) prediction market on Base settling in USDC via x402 / EIP-3009. Inventory is crypto-native: token market-cap ladders, up/down, launchpad, date-window markets. Modeled on the Myriad adapter — market-orders only,fetchOrderBook: 'emulated'(single level synthesized from implied price + pool),cancelOrder/ limit / sell unsupported.- Surface:
fetchMarkets/fetchEvents(single-market wrap — Hunch has no event tier) /fetchOHLCV(flat candles from the odds tape) /fetchOrderBook(emulated) /fetchTrades/fetchPositions/fetchBalance. Binary markets → YES/NO outcomes; N-way (mcap ladders, date windows) → one outcome per bucket key.outcomeIdencodes${marketId}:${side}and round-trips back to a Hunch trade side. createOrderruns Hunch's x402 loop:POST /trade→ 402 → sign EIP-3009TransferWithAuthorization(viem) → re-POST withX-PAYMENT→ 200 receipt. Orders > $10 fetch a price-locked quote first. Verified end-to-end against the live 402 challenge (no funds moved).- Registration:
core/src/index.ts(export + registry +Hunch),core/src/server/exchange-factory.ts(case "hunch"),core/src/server/openapi.yaml(ExchangeParamenum),COMPLIANCE.md. - Self-hosted creds:
HUNCH_PRIVATE_KEY/HUNCH_WALLET_ADDRESS(Base). Hosted-mode trading (Polygon escrow) is out of scope — Hunch settles on Base via x402 — so it lists as read-only hosted / tradeable self-hosted, like Kalshi. - Tests:
core/test/normalizers/hunch-normalizer.test.ts— 47 tests covering binary + N-way mapping, the money-criticaloutcomeId↔sideround-trip, position/balance/OHLCV/emulated-orderbook.tsc --noEmitclean. - Known gap:
volume24his0(Hunch reports no 24h split; totalvolumeis the pool size). Fast-follow on our side can add it.
Fixed — Hyperliquid
core/src/exchanges/hyperliquid/index.ts—fetchOHLCVparamswas typed as required but server dispatch passes a single merged object asargs[0], leavingargs[1]undefined. Result: any MCP/HTTP call to HLfetchOHLCVcrashed withCannot read properties of undefined (reading 'start'). Default to{ resolution: '1h' }so the type-check passes (resolution is required onOHLCVParams) and the call survives even without explicit params. (#1161, #1162)sdks/python/pmxt/client.py+sdks/typescript/pmxt/client.ts— SDKs sent?id=...for GET reads, but servermethod-verbs.jsonspec forfetchOHLCV/fetchTradesdeclares the first arg asoutcomeId. GET dispatcher (queryToArgsincore/src/server/app.ts) peels primitives by spec name, then bundles remaining query keys into the object arg — sooutcomeIdarrivedundefinedand the rawidended up insideparams. DownstreamfromMarketId(undefined)crashed withCannot read properties of undefined (reading 'match'). POST was unaffected (positional args). Fixed both SDKs. (#1162)core/src/exchanges/hyperliquid/normalizer.ts—volume24hwas hardcoded to0for every HL market and event. Fixed by pullingdayNtlVlmfromspotMetaAndAssetCtxs(outcome legs appear ascoin: '#NNNN'), summing Yes + No notional per outcome, and threading the map throughfetchRawMarkets/fetchEventsImpl. One extra batched call, no N+1; fallback to 0 ifspotMetaAndAssetCtxsis unreachable. (#1219)core/src/exchanges/hyperliquid/utils.ts—fromMarketIdonly matchedhl-outcome-{N}. Passing an actual outcome token (e.g.100002000, as returned byUnifiedMarket.outcomes[].outcomeId) threwInvalid Hyperliquid market ID. Now accepts either form viadecodeAssetId. AffectsfetchOrderBook/fetchOHLCV/fetchTrades. (#1252)core/src/exchanges/hyperliquid/fetcher.ts—fetchRawMarketsignoredparams.marketId, andfetchRawEventsignoredparams.eventId.fetchMarket(marketId=X)returned the first market in the venue list instead of X;fetchEvent(eventId=X)always returned the first question. Both filters now applied viafromMarketIdand direct id match. (#1254)core/src/exchanges/hyperliquid/fetcher.ts—fetchRawOHLCVandfetchRawTradesignoredparams.limit. OHLCV returned the entire window regardless; trades returned a fixed page. Now slices client-side after the venue call returns (HL'scandleSnapshot/recentTradeshave no native limit param). (#1254)core/src/exchanges/hyperliquid/normalizer.ts—normalizeUserTradeleftmarketId/outcomeId/feeundefined on every fill. Consumers couldn't tell which market a fill was on. Now populated via the existingcoinToMarketId/coinToOutcomeIdhelpers and the rawfeefield. WidenedUnifiedUserTradewith optionalmarketId,fee. Verified 2000/2000 trades fully populated on an active wallet. (#1255)core/src/exchanges/hyperliquid/normalizer.ts—normalizeBalancereadcrossMarginSummary(perp margin) and hardcoded the currency label as'USDH'. Outcome markets quote against USDC on the spot account, so users with deposited funds sawUSDH: 0and assumed empty. Now readsspotClearinghouseStatealongside the perp account; spot balances surface with their real coin label (USDC,USDH, etc.); funded perp surfaces asUSDC_PERPso callers can tell it apart. Verified $14.90 USDC deposit now correctly returnsUSDC: 14.9. (#1280)core/src/exchanges/hyperliquid/index.ts—submitOrdersilently swallowed HL rejections. When HL returnedstatuses[0].error(e.g."Order must have minimum value of 10 USDC"), the SDK reportedstatus='filled', id='unknown'— fake success with no way for the caller to know the order wasn't placed. Now raises a typedPmxtErrorcarrying HL's message; also correctly populatesprice/oidon thefilledbranch (was checked but never read). (#1281)core/src/exchanges/hyperliquid/index.ts—cancelOrderhardcodeda: 0(asset id). HL rejected every cancel withUser or API Wallet 0xfaf6... does not existbecause the action hash with the wrong asset recovers a different signer address. Now looks up the open order to derive the real asset id viaencodeAssetId. Throws a typed "Order not found" when the supplied oid isn't open. (#1281)core/src/exchanges/hyperliquid/auth.ts—msgpackrencoded positive BigInts as int64 (0xd3), HL's server (Pythonmsgpack) encodes the same values as uint64 (0xcf). Identical bit pattern, different type byte → action hash mismatch → signature recovers to wrong address. Only manifested on cancel because order actions don't carry BigInt fields; cancel does (oid). AddedfixInt64ToUint64post-processor: HL actions never carry negative ints (oids, nonces, asset ids are all ≥ 0), so flippingd3 → cfwhen the following byte is< 0x80is safe and produces byte-identical encoding to Python msgpack. (#1281)
Fixed — Python SDK (cross-venue)
sdks/python/pmxt/errors.py—NetworkError/ExchangeNotAvailablerejected thecode/retryablekwargs thatfrom_server_erroralways sets. Any 503 from Kalshi or another venue raisedTypeError: ExchangeNotAvailable.__init__() got an unexpected keyword argument 'code'instead of a typedPmxtError. Both classes now accept**kwargsand default-fill their hardcoded values. Caught by the cross-venue Trump search test where Kalshi briefly errored. (#1219)
Added — Hyperliquid
fetchEventsPaginatedwrappers in both SDKs.BaseExchange.fetchEventsPaginatedexisted but neitherclient.pynorclient.tsexposed it. Addedfetch_events_paginated/fetchEventsPaginatedmirroring the existingfetchMarketsPaginatedpattern. (#1252)fetchOrderBookson Hyperliquid. HL has no native batch order-book endpoint. Implemented asPromise.alloverfetchOrderBook; inherits the outcome-token-or-marketId resolution from the single-fetch path.has.fetchOrderBooksauto-flips becauseBaseExchange._deriveCapabilitiesintrospects overrides.ponytail:comment marks the unbounded concurrency for future capping. (#1253)fetchClosedOrders+fetchAllOrderson Hyperliquid. HL exposes no closed-orders endpoint. Synthesize by groupinguserFillsbyoidand excluding currently-open oids — VWAP price, summed size, summed fee, earliest fill time.fetchAllOrders = openOrders ∪ closedOrders.ponytail:comment marks the limitation: cancelled-with-no-fills orders aren't reconstructable from the public info API. Verified against an active wallet: 7 open + 104 derived closed = 111 all, exact-count match. (#1255)
Changed — types
core/src/types.ts—UnifiedUserTradewidened with optionalmarketIdandfeefields. Existing consumers continue to work unchanged. (#1255)
Fixed — Python SDK (test-suite rot caught at version cut)
Running the full npm test before tagging surfaced six pre-existing failures untouched by the HL audit. Two were the SDK silently broken since the 2.50.11–14 hosted-routing series; the rest were stale test fixtures from earlier intentional behavior changes.
- **`sdks/python/pmxt/client....
v2.50.16
Fixed
sdks/python/pmxt/client.py+sdks/typescript/pmxt/client.ts—fetch_open_orders/fetchOpenOrdersmissing hosted-mode routing branch. Same class of bug as the 2.50.11-14 fixes forfetch_balance/fetch_positions/fetch_order/fetch_my_trades/cancel_order: hosted callers receivedTrading operations require authentication. Initialize LimitlessExchange with credentials: ...because the SDK fell through to the sidecar/api/{exchange}/fetchOpenOrderspath instead of routing to the hostedGET /v0/orders/open?address=...endpoint. Added anis_hostedbranch in both SDKs that resolves the wallet address, calls_hosted_request("fetch_open_orders", params={"address": ...}), and maps the response throughorder_from_v0/orderFromV0. The self-hosted/sidecar branch is preserved unchanged. Verified live against hosted Limitless:fetch_open_orders()returns[]cleanly and no longer raises.
Installation
npm:
npm install pmxtjs@2.50.16
npm install -g @pmxt/cli@2.50.16PyPI:
pip install pmxt==2.50.16Links
Full Changelog: v2.50.15f...v2.50.16f