Skip to content

Commit c0343e8

Browse files
committed
release: 2.50.7 — Limitless hosted writes documented + SDK error string fixed + operator multisig wording
1 parent 2028af1 commit c0343e8

9 files changed

Lines changed: 39 additions & 15 deletions

File tree

changelog.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,29 @@
22

33
All notable changes to this project will be documented in this file.
44

5+
## [2.50.7] - 2026-06-18
6+
7+
### Fixed
8+
9+
- **`sdks/typescript/pmxt/hosted-routing.ts`** + **`sdks/python/pmxt/_hosted_routing.py`**: `HOSTED_TRADING_VENUES` includes `limitless` (since 2.50.3 wired the `limitless_buy` / `limitless_sell_polygon` / `limitless_sell_base_pull` / `cancel_limitless_*` schemas), but the `NotSupported` error message thrown to callers attempting hosted trading on an unsupported venue still said "Hosted trading is only supported for Polymarket and Opinion". A caller who hit the error would believe Limitless was unsupported even though it would have worked, and anyone reading the SDK source to figure out which venues are hosted-tradable saw a directly contradictory pair (the set says yes, the error string says no). Updated both SDKs to "Polymarket, Opinion, and Limitless".
10+
11+
### Docs
12+
13+
- **Limitless hosted writes documented across the docs surface.** The 2.50.3 release wired Limitless through the hosted trading path but no doc page reflected it, so the docs collectively asserted Limitless was read-only / self-hosted-writes-only. Updated nine claim sites across six files:
14+
- `docs/trading-quickstart.mdx:9` — "Hosted writes today: Polymarket, Opinion, and Limitless."
15+
- `docs/authentication.mdx:83` — same.
16+
- `docs/security.mdx:54` — "Hosted (Polymarket, Opinion, Limitless): PMXT never sees the venue private key."
17+
- `docs/guides/escrow-lifecycle.mdx:9` — escrow funding line now lists Polymarket, Opinion, and Limitless as the "today" set.
18+
- `docs/guides/escrow-lifecycle.mdx:20` — "Hosted exchange clients (Polymarket, Opinion, Limitless) expose an `escrow` namespace."
19+
- `docs/guides/self-hosted.mdx:15` — hosted-writes list updated; Limitless removed from the self-hosted-only list of venues.
20+
- `docs/guides/self-hosted.mdx:20` — "consumer app against Polymarket, Opinion, or Limitless".
21+
- `docs/concepts/hosted-trading.mdx:9` — "trade Polymarket, Opinion, and Limitless" in the funding-once paragraph.
22+
- `docs/concepts/hosted-trading.mdx:18` — "trading across Polymarket, Opinion, and Limitless".
23+
- `docs/concepts/hosted-trading.mdx:51` — added a Limitless settlement sentence: "buys are settled on Polygon directly from escrow; sells use a Base-side pull leg that draws against the user's Polygon escrow" (the Polymarket and Opinion settlement descriptions were already there).
24+
- `docs/concepts/hosted-trading.mdx:119` — Hosted-vs-self-hosted comparison table: "Trading venues | Polymarket, Opinion, Limitless".
25+
- `docs/concepts/hosted-trading.mdx:131` — "What's supported today" table: added a Limitless row (Yes / Yes / "Polygon buy leg, Base pull-sell leg") and removed Limitless from the Kalshi/Smarkets/etc. read-only row.
26+
- **`docs/concepts/hosted-trading.mdx:89` — operator multisig wording.** The previous wording said "A multisig replacement is planned but not yet deployed" on one line while line 93 said `operator` is `immutable`. Read straight through, that reads like an in-place rotation that the contract design forbids. Rewrote to "Because `operator` is `immutable` on the deployed contracts, switching to a multisig would mean deploying new escrow contracts and migrating user balances — not an in-place rotation." Same facts, no contradiction.
27+
528
## [2.50.6] - 2026-06-18
629

730
### Docs

docs/authentication.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ deposit_tx = client.escrow.deposit_tx(amount=10.0)
8080

8181
See [Trading quickstart](/trading-quickstart) for the full 60-second flow
8282
and [Escrow lifecycle](/guides/escrow-lifecycle) for the approve / deposit /
83-
withdraw mechanics. Hosted writes today: Polymarket and Opinion.
83+
withdraw mechanics. Hosted writes today: Polymarket, Opinion, and Limitless.
8484

8585
### Self-hosted / direct venue credentials (advanced)
8686

docs/concepts/hosted-trading.mdx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ description: "The hosted-default execution path — how PMXT routes orders, the
66
Hosted trading is PMXT's default execution path. You provide an API key and a wallet; your [USDC](/concepts/prediction-markets-101#usdc) sits in a non-custodial [`PreFundedEscrow`](/concepts/prediction-markets-101#prefundedescrow) smart contract on [Polygon](/concepts/prediction-markets-101#polygon) that can only move funds against an EIP-712 signature from your wallet; orders are built server-side, signed in your browser/server with your private key, and submitted by PMXT to the underlying venue. You never run a local server, never integrate with venue-specific signature schemes, and never expose your private key over the wire.
77

88
<Info>
9-
**One chain to fund: Polygon.** All hosted trading uses a single Polygon-based `PreFundedEscrow` contract for every supported venue. Fund USDC on Polygon once and your same wallet and key trade Polymarket *and* Opinion (and future venues). For non-Polygon venues like Opinion (on BSC), PMXT handles cross-chain settlement transparently — you never sign anything on a chain other than Polygon. Pass any EVM-compatible private key.
9+
**One chain to fund: Polygon.** All hosted trading uses a single Polygon-based `PreFundedEscrow` contract for every supported venue. Fund USDC on Polygon once and your same wallet and key trade Polymarket, Opinion, *and* Limitless (and future venues). For non-Polygon venues like Opinion (on BSC), PMXT handles cross-chain settlement transparently — you never sign anything on a chain other than Polygon. Pass any EVM-compatible private key.
1010
</Info>
1111

1212
## When hosted mode is right
@@ -15,7 +15,7 @@ Hosted is the right default for:
1515

1616
- **Web and mobile apps** — your backend holds the `pmxt_api_key`; users keep their own private keys on their devices.
1717
- **Trading bots that don't need sub-100ms latency** — typical hosted round-trip is ~150–300ms including the venue submit.
18-
- **Multi-venue strategies** — you stay on one HTTP surface even when you're trading across Polymarket and Opinion.
18+
- **Multi-venue strategies** — you stay on one HTTP surface even when you're trading across Polymarket, Opinion, and Limitless.
1919
- **Anyone who doesn't want to operate infrastructure.**
2020

2121
A hosted trade has three actors: **your client** (holding the `pmxt_api_key` and, for writes, the user's `private_key`), **`trade.pmxt.dev`** (PMXT's hosted trading API — routes orders, operates against the escrow contract under user-signed authorization, talks to the venue), and **the venue** (Polymarket's CLOB, Opinion's matching engine, etc. — sees PMXT as the submitter).
@@ -48,7 +48,7 @@ Step-by-step:
4848
1. **Build.** The SDK calls `POST /v0/trade/build-order` with the catalog UUIDs (`market_id`, `outcome_id`), side, and amount. The server resolves the venue-native fields (token IDs, salt, expiry, fees), packages them into the venue's EIP-712 typed-data shape, and returns a `built_order_id` plus the payload to sign.
4949
2. **Sign.** The SDK signs the typed-data payload locally with your `private_key`. This step never leaves your process. See [Signing](/guides/signing) for the exact shape.
5050
3. **Submit.** The SDK calls `POST /v0/trade/submit-order` with the `built_order_id` and the signature. The server attaches the signature to the prepared order and submits to the venue.
51-
4. **Settle.** The venue matches the order. On Polymarket, fills come from the CLOB and are settled on Polygon via the CTF exchange. On Opinion, settlement uses a dual-signature cross-chain flow.
51+
4. **Settle.** The venue matches the order. On Polymarket, fills come from the CLOB and are settled on Polygon via the CTF exchange. On Opinion, settlement uses a dual-signature cross-chain flow into a BSC-side `VenueEscrow`. On Limitless, buys are settled on Polygon directly from escrow; sells use a Base-side pull leg that draws against the user's Polygon escrow.
5252

5353
`create_order` is a convenience wrapper that chains build → sign → submit in one call. `build_order` and `submit_order` are the lower-level primitives if you want to inspect or modify the typed-data before signing.
5454

@@ -86,7 +86,7 @@ Current operator addresses (immutable on the deployed contracts above):
8686
- BSC `VenueEscrow.operator`: `0x84194eae9c63C1e3A769976bb762506d3443156d`
8787
- Polygon `PreFundedEscrow.settlementOracle`: `0x8aD93c0D15bC655b460dD700B1E25C86D1a728EE`
8888

89-
The operator address is currently an EOA controlled by PMXT. A multisig replacement is planned but not yet deployed; this page will be updated when it lands.
89+
The operator address is an EOA controlled by PMXT. Because `operator` is `immutable` on the deployed contracts, switching to a multisig would mean deploying new escrow contracts and migrating user balances — not an in-place rotation.
9090

9191
### Trust model
9292

@@ -116,7 +116,7 @@ Self-hosted runs `pmxt-core` on your own machine; the SDK talks to `localhost`.
116116
| **Writes** | `trade.pmxt.dev/v0/trade/{build,submit}-order` | Direct to the venue API |
117117
| **Custody** | Non-custodial: USDC in `PreFundedEscrow`, movable only against your EIP-712 signature | You retain venue-native custody |
118118
| **Latency** | ~150–300ms round-trip | Limited by venue + your network |
119-
| **Trading venues** | Polymarket, Opinion | Every venue PMXT supports |
119+
| **Trading venues** | Polymarket, Opinion, Limitless | Every venue PMXT supports |
120120
| **Read-only venues** | All catalog venues via Router | All catalog venues via Router |
121121
| **Infra to run** | None | One local process |
122122
| **Regulatory posture** | Non-custodial escrow; user retains beneficial ownership and unilateral withdrawal | You as direct counterparty to the venue |
@@ -129,7 +129,8 @@ Choose self-hosted when you need **sub-100ms latency**, want to use **raw venue
129129
| ----- | ------------- | ------------ | ----- |
130130
| Polymarket | Yes | Yes | Polygon escrow, CLOB exchange |
131131
| Opinion | Yes | Yes | Cross-chain (BSC settlement, dual-signature) |
132-
| Kalshi, Limitless, Smarkets, Probable, Myriad, Metaculus, etc. | No | Read-only via catalog | Use [self-hosted](/guides/self-hosted) for writes |
132+
| Limitless | Yes | Yes | Polygon buy leg, Base pull-sell leg |
133+
| Kalshi, Smarkets, Probable, Myriad, Metaculus, etc. | No | Read-only via catalog | Use [self-hosted](/guides/self-hosted) for writes |
133134

134135
If a venue you need isn't here, run pmxt-core locally and pass raw venue credentials — see [Self-hosted](/guides/self-hosted).
135136

docs/guides/escrow-lifecycle.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ description: "Deposit, trade, withdraw — how USDC moves through PMXT's non-cus
66
Hosted trading on PMXT settles through a non-custodial `PreFundedEscrow` smart contract on **Polygon** (chainId 137). USDC sits in the escrow under your wallet's beneficial ownership; PMXT cannot move funds without an EIP-712 signature from your wallet. This page walks through the full lifecycle: approve, deposit, trade, withdraw.
77

88
<Info>
9-
**You fund Polygon only.** USDC always sits in the Polygon `PreFundedEscrow` — the single funding location for *every* hosted venue (Polymarket today, Opinion today, more coming). For venues that don't live on Polygon (e.g. Opinion on BSC), PMXT operates an internal cross-chain leg that holds outcome tokens on the venue's chain; you neither fund nor sign anything on that side. Pass any EVM-compatible private key — the same key handles every venue.
9+
**You fund Polygon only.** USDC always sits in the Polygon `PreFundedEscrow` — the single funding location for *every* hosted venue (Polymarket, Opinion, and Limitless today; more coming). For venues that don't live on Polygon (e.g. Opinion on BSC), PMXT operates an internal cross-chain leg that holds outcome tokens on the venue's chain; you neither fund nor sign anything on that side. Pass any EVM-compatible private key — the same key handles every venue.
1010
</Info>
1111

1212
## Why escrow at all?
@@ -17,7 +17,7 @@ For Opinion, the same Polygon escrow balance funds a cross-chain settlement leg
1717

1818
## The `client.escrow` namespace
1919

20-
Hosted exchange clients (Polymarket, Opinion) expose an `escrow` namespace. Every method **builds an unsigned transaction**. Your wallet — MetaMask, ethers `Wallet`, viem, web3.py, etc. — is responsible for signing and broadcasting it. PMXT never holds your private key.
20+
Hosted exchange clients (Polymarket, Opinion, Limitless) expose an `escrow` namespace. Every method **builds an unsigned transaction**. Your wallet — MetaMask, ethers `Wallet`, viem, web3.py, etc. — is responsible for signing and broadcasting it. PMXT never holds your private key.
2121

2222
| Method (Python / TypeScript) | Description |
2323
| ---------------------------- | ----------- |

docs/guides/self-hosted.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@ Pick self-hosted if **any** of these apply:
1212
- **Sub-100ms latency** — local submission removes a network hop. Matters for latency-sensitive arb / market-making.
1313
- **Raw venue credentials** — Polymarket L2 API keys, Kalshi RSA, Smarkets session cookies. Hosted mode doesn't accept these.
1414
- **Regulatory custody** — you must be the direct counterparty with no intermediary in the custody path.
15-
- **Venues hosted mode can't write to yet** — hosted writes are Polymarket + Opinion. Self-hosted writes work on every venue PMXT supports (Kalshi, Limitless, Smarkets, Probable, Myriad, Metaculus, etc.).
15+
- **Venues hosted mode can't write to yet** — hosted writes are Polymarket, Opinion, and Limitless. Self-hosted writes work on every venue PMXT supports (Kalshi, Smarkets, Probable, Myriad, Metaculus, etc.).
1616
- **OSS contribution** — you're hacking on `pmxt-core` itself.
1717

1818
## When hosted is still the better choice
1919

20-
Everyone else. [Hosted](/concepts/hosted-trading) is simpler to deploy (no local process), gives you on-chain custody you control via the timelock, and PMXT's server never sees a private key. If you're building a consumer app, a research notebook, or any non-latency-critical service against Polymarket or Opinion, stop here and use hosted.
20+
Everyone else. [Hosted](/concepts/hosted-trading) is simpler to deploy (no local process), gives you on-chain custody you control via the timelock, and PMXT's server never sees a private key. If you're building a consumer app, a research notebook, or any non-latency-critical service against Polymarket, Opinion, or Limitless, stop here and use hosted.
2121

2222
## 1. Install pmxt-core
2323

docs/security.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ For on-chain venues (Polymarket, Limitless, Probable, Opinion, Baozi), "venue cr
5151

5252
Credential type is a property of the venue, not of PMXT. See [Supported Venues](/concepts/venues) for the full credential matrix. The difference between modes is **where the credential lives**:
5353

54-
- **Hosted (Polymarket, Opinion):** PMXT never sees the venue private key. You sign EIP-712 locally against the `PreFundedEscrow` domain; PMXT's operator submits with its own key for gas. See [Hosted trading](/concepts/hosted-trading).
54+
- **Hosted (Polymarket, Opinion, Limitless):** PMXT never sees the venue private key. You sign EIP-712 locally against the `PreFundedEscrow` domain; PMXT's operator submits with its own key for gas. See [Hosted trading](/concepts/hosted-trading).
5555
- **Self-hosted (any venue):** the venue credential lives on your machine, in your `pmxt-core` process.
5656

5757
## Recommendations

docs/trading-quickstart.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ description: "Place your first hosted trade in 60 seconds — API key, escrow de
66
From a fresh `pmxt_api_key` to a confirmed position on Polymarket in under a minute. For the full hosted model, see [Hosted trading](/concepts/hosted-trading).
77

88
<Info>
9-
Hosted writes today: **Polymarket** and **Opinion**. Other venues are read-only via the hosted catalog; use [self-hosted](/guides/self-hosted) to trade them.
9+
Hosted writes today: **Polymarket**, **Opinion**, and **Limitless**. Other venues are read-only via the hosted catalog; use [self-hosted](/guides/self-hosted) to trade them.
1010
</Info>
1111

1212
## 1. Get an API key

sdks/python/pmxt/_hosted_routing.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ def ensure_hosted_trading_supported(client: Any) -> None:
261261
if venue not in HOSTED_TRADING_VENUES:
262262
venue_label = venue or "unknown"
263263
raise NotSupported(
264-
"Hosted trading is only supported for Polymarket and Opinion; "
264+
"Hosted trading is only supported for Polymarket, Opinion, and Limitless; "
265265
f"{venue_label} is not supported with pmxt_api_key."
266266
)
267267

sdks/typescript/pmxt/hosted-routing.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ export function ensureHostedTradingSupported(client: HostedClientLike): void {
7272
if (!client.pmxtApiKey) return;
7373
if (!HOSTED_TRADING_VENUES.has(client.exchangeName)) {
7474
throw new NotSupported(
75-
`Hosted trading is only supported for Polymarket and Opinion; ${client.exchangeName} is not supported with pmxtApiKey.`,
75+
`Hosted trading is only supported for Polymarket, Opinion, and Limitless; ${client.exchangeName} is not supported with pmxtApiKey.`,
7676
);
7777
}
7878
}

0 commit comments

Comments
 (0)