pmxtjs 2.48.6 → 2.49.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/README.md +72 -10
  2. package/dist/esm/generated/src/models/Balance.d.ts +6 -0
  3. package/dist/esm/generated/src/models/Balance.js +2 -0
  4. package/dist/esm/generated/src/models/BuiltOrder.d.ts +6 -0
  5. package/dist/esm/generated/src/models/BuiltOrder.js +2 -0
  6. package/dist/esm/generated/src/models/ErrorDetail.d.ts +58 -2
  7. package/dist/esm/generated/src/models/ErrorDetail.js +37 -0
  8. package/dist/esm/generated/src/models/ExchangeOptions.d.ts +70 -0
  9. package/dist/esm/generated/src/models/ExchangeOptions.js +53 -0
  10. package/dist/esm/generated/src/models/MatchedMarketPair.d.ts +1 -1
  11. package/dist/esm/generated/src/models/Order.d.ts +18 -0
  12. package/dist/esm/generated/src/models/Order.js +6 -0
  13. package/dist/esm/generated/src/models/OrderLevel.d.ts +6 -0
  14. package/dist/esm/generated/src/models/OrderLevel.js +2 -0
  15. package/dist/esm/generated/src/models/Position.d.ts +33 -9
  16. package/dist/esm/generated/src/models/Position.js +12 -12
  17. package/dist/esm/generated/src/models/UnifiedSeries.d.ts +4 -4
  18. package/dist/esm/generated/src/models/UserTrade.d.ts +18 -0
  19. package/dist/esm/generated/src/models/UserTrade.js +6 -0
  20. package/dist/esm/generated/src/models/index.d.ts +1 -0
  21. package/dist/esm/generated/src/models/index.js +1 -0
  22. package/dist/esm/index.d.ts +2 -0
  23. package/dist/esm/index.js +1 -0
  24. package/dist/esm/pmxt/client.d.ts +106 -5
  25. package/dist/esm/pmxt/client.js +400 -6
  26. package/dist/esm/pmxt/constants.d.ts +11 -0
  27. package/dist/esm/pmxt/constants.js +13 -0
  28. package/dist/esm/pmxt/errors.d.ts +3 -0
  29. package/dist/esm/pmxt/errors.js +9 -0
  30. package/dist/esm/pmxt/escrow.d.ts +39 -0
  31. package/dist/esm/pmxt/escrow.js +78 -0
  32. package/dist/esm/pmxt/feed-client.d.ts +3 -0
  33. package/dist/esm/pmxt/feed-client.js +11 -2
  34. package/dist/esm/pmxt/hosted-errors.d.ts +84 -0
  35. package/dist/esm/pmxt/hosted-errors.js +186 -0
  36. package/dist/esm/pmxt/hosted-mappers.d.ts +45 -0
  37. package/dist/esm/pmxt/hosted-mappers.js +291 -0
  38. package/dist/esm/pmxt/hosted-routing.d.ts +69 -0
  39. package/dist/esm/pmxt/hosted-routing.js +119 -0
  40. package/dist/esm/pmxt/hosted-typed-data.d.ts +36 -0
  41. package/dist/esm/pmxt/hosted-typed-data.js +580 -0
  42. package/dist/esm/pmxt/models.d.ts +46 -8
  43. package/dist/esm/pmxt/server-manager.d.ts +4 -0
  44. package/dist/esm/pmxt/server-manager.js +6 -0
  45. package/dist/esm/pmxt/signers.d.ts +57 -0
  46. package/dist/esm/pmxt/signers.js +50 -0
  47. package/dist/esm/pmxt/ws-client.js +2 -1
  48. package/dist/generated/src/models/Balance.d.ts +6 -0
  49. package/dist/generated/src/models/Balance.js +2 -0
  50. package/dist/generated/src/models/BuiltOrder.d.ts +6 -0
  51. package/dist/generated/src/models/BuiltOrder.js +2 -0
  52. package/dist/generated/src/models/ErrorDetail.d.ts +58 -2
  53. package/dist/generated/src/models/ErrorDetail.js +38 -0
  54. package/dist/generated/src/models/ExchangeOptions.d.ts +70 -0
  55. package/dist/generated/src/models/ExchangeOptions.js +60 -0
  56. package/dist/generated/src/models/MatchedMarketPair.d.ts +1 -1
  57. package/dist/generated/src/models/Order.d.ts +18 -0
  58. package/dist/generated/src/models/Order.js +6 -0
  59. package/dist/generated/src/models/OrderLevel.d.ts +6 -0
  60. package/dist/generated/src/models/OrderLevel.js +2 -0
  61. package/dist/generated/src/models/Position.d.ts +33 -9
  62. package/dist/generated/src/models/Position.js +12 -12
  63. package/dist/generated/src/models/UnifiedSeries.d.ts +4 -4
  64. package/dist/generated/src/models/UserTrade.d.ts +18 -0
  65. package/dist/generated/src/models/UserTrade.js +6 -0
  66. package/dist/generated/src/models/index.d.ts +1 -0
  67. package/dist/generated/src/models/index.js +1 -0
  68. package/dist/index.d.ts +2 -0
  69. package/dist/index.js +1 -0
  70. package/dist/pmxt/client.d.ts +106 -5
  71. package/dist/pmxt/client.js +399 -5
  72. package/dist/pmxt/constants.d.ts +11 -0
  73. package/dist/pmxt/constants.js +14 -1
  74. package/dist/pmxt/errors.d.ts +3 -0
  75. package/dist/pmxt/errors.js +11 -1
  76. package/dist/pmxt/escrow.d.ts +39 -0
  77. package/dist/pmxt/escrow.js +82 -0
  78. package/dist/pmxt/feed-client.d.ts +3 -0
  79. package/dist/pmxt/feed-client.js +11 -2
  80. package/dist/pmxt/hosted-errors.d.ts +84 -0
  81. package/dist/pmxt/hosted-errors.js +201 -0
  82. package/dist/pmxt/hosted-mappers.d.ts +45 -0
  83. package/dist/pmxt/hosted-mappers.js +302 -0
  84. package/dist/pmxt/hosted-routing.d.ts +69 -0
  85. package/dist/pmxt/hosted-routing.js +126 -0
  86. package/dist/pmxt/hosted-typed-data.d.ts +36 -0
  87. package/dist/pmxt/hosted-typed-data.js +619 -0
  88. package/dist/pmxt/models.d.ts +46 -8
  89. package/dist/pmxt/server-manager.d.ts +4 -0
  90. package/dist/pmxt/server-manager.js +6 -0
  91. package/dist/pmxt/signers.d.ts +57 -0
  92. package/dist/pmxt/signers.js +55 -0
  93. package/dist/pmxt/ws-client.js +2 -1
  94. package/generated/.openapi-generator/FILES +2 -0
  95. package/generated/docs/Balance.md +2 -0
  96. package/generated/docs/BuiltOrder.md +2 -0
  97. package/generated/docs/ErrorDetail.md +9 -0
  98. package/generated/docs/ExchangeOptions.md +47 -0
  99. package/generated/docs/Order.md +6 -0
  100. package/generated/docs/OrderLevel.md +2 -0
  101. package/generated/docs/Position.md +9 -0
  102. package/generated/docs/UserTrade.md +6 -0
  103. package/generated/package.json +1 -1
  104. package/generated/src/models/Balance.ts +8 -0
  105. package/generated/src/models/BuiltOrder.ts +8 -0
  106. package/generated/src/models/ErrorDetail.ts +67 -2
  107. package/generated/src/models/ExchangeOptions.ts +115 -0
  108. package/generated/src/models/MatchedMarketPair.ts +1 -1
  109. package/generated/src/models/Order.ts +24 -0
  110. package/generated/src/models/OrderLevel.ts +8 -0
  111. package/generated/src/models/Position.ts +45 -17
  112. package/generated/src/models/UnifiedSeries.ts +4 -4
  113. package/generated/src/models/UserTrade.ts +24 -0
  114. package/generated/src/models/index.ts +1 -0
  115. package/index.ts +1 -0
  116. package/package.json +11 -2
  117. package/pmxt/client.ts +495 -9
  118. package/pmxt/constants.ts +15 -0
  119. package/pmxt/errors.ts +11 -0
  120. package/pmxt/escrow.ts +93 -0
  121. package/pmxt/feed-client.ts +14 -2
  122. package/pmxt/hosted-errors.ts +216 -0
  123. package/pmxt/hosted-mappers.ts +312 -0
  124. package/pmxt/hosted-routing.ts +165 -0
  125. package/pmxt/hosted-typed-data.ts +767 -0
  126. package/pmxt/models.ts +65 -8
  127. package/pmxt/server-manager.ts +7 -0
  128. package/pmxt/signers.ts +86 -0
  129. package/pmxt/ws-client.ts +2 -1
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Hosted-mode HTTP routing for the pmxt TypeScript SDK.
3
+ *
4
+ * When a client is configured with a `pmxtApiKey`, supported method calls are
5
+ * dispatched to the pmxt-hosted trading API instead of the venue's native
6
+ * client. This module owns:
7
+ *
8
+ * - the static route table mapping SDK method names to hosted endpoints,
9
+ * - the venue allowlist for hosted trading,
10
+ * - wallet address resolution for user-scoped reads/trades, and
11
+ * - the low-level `_tradingRequest` HTTP helper.
12
+ *
13
+ * Mirrors `sdks/python/pmxt/_hosted_routing.py`.
14
+ */
15
+
16
+ import { NotSupported } from "./errors";
17
+ import { MissingWalletAddress, raiseFromResponse } from "./hosted-errors";
18
+
19
+ export type HttpMethod = "GET" | "POST" | "PUT" | "DELETE";
20
+ export type HostedBase = "catalog" | "trading";
21
+
22
+ export const HOSTED_CATALOG_BASE_URL = "https://api.pmxt.dev";
23
+ export const HOSTED_TRADING_BASE_URL = "https://trade.pmxt.dev";
24
+ export const HOSTED_TRADING_VENUES: ReadonlySet<string> = new Set([
25
+ "polymarket",
26
+ "opinion",
27
+ ]);
28
+
29
+ export interface HostedRoute {
30
+ method: HttpMethod;
31
+ path: string;
32
+ base: HostedBase;
33
+ requiresWalletAddress?: boolean;
34
+ }
35
+
36
+ export const HOSTED_METHOD_ROUTES: ReadonlyMap<string, HostedRoute> = new Map([
37
+ ["createOrder", { method: "POST", path: "/v0/trade/build-order", base: "trading" }],
38
+ ["buildOrder", { method: "POST", path: "/v0/trade/build-order", base: "trading" }],
39
+ ["submitOrder", { method: "POST", path: "/v0/trade/submit-order", base: "trading" }],
40
+ ["cancelOrderBuild", { method: "POST", path: "/v0/orders/cancel/build", base: "trading" }],
41
+ ["cancelOrder", { method: "POST", path: "/v0/orders/cancel", base: "trading" }],
42
+ ["fetchOrder", { method: "GET", path: "/v0/orders/{order_id}", base: "trading" }],
43
+ ["fetchOpenOrders", { method: "GET", path: "/v0/orders/open", base: "trading", requiresWalletAddress: true }],
44
+ ["fetchMyTrades", { method: "GET", path: "/v0/user/{address}/trades", base: "trading", requiresWalletAddress: true }],
45
+ ["fetchBalance", { method: "GET", path: "/v0/user/{address}/balances", base: "trading", requiresWalletAddress: true }],
46
+ ["fetchPositions", { method: "GET", path: "/v0/user/{address}/positions", base: "trading", requiresWalletAddress: true }],
47
+ ["escrowApproveTx", { method: "POST", path: "/v0/escrow/approve", base: "trading" }],
48
+ ["escrowDepositTx", { method: "POST", path: "/v0/escrow/deposit", base: "trading" }],
49
+ ["escrowWithdrawTx", { method: "POST", path: "/v0/escrow/withdraw", base: "trading" }],
50
+ ["escrowWithdrawals", { method: "GET", path: "/v0/escrow/{address}/withdrawals", base: "trading", requiresWalletAddress: true }],
51
+ ]);
52
+
53
+ /**
54
+ * Minimal duck-typed view of a venue client used by hosted-mode helpers.
55
+ *
56
+ * Defining this as a structural interface keeps `hosted-routing` decoupled
57
+ * from the concrete `Exchange` class and makes unit testing trivial.
58
+ */
59
+ export interface HostedClientLike {
60
+ pmxtApiKey?: string;
61
+ exchangeName: string;
62
+ walletAddress?: string;
63
+ }
64
+
65
+ /**
66
+ * Throw {@link NotSupported} if the client is in hosted mode (i.e. has a
67
+ * `pmxtApiKey`) but targets a venue outside the hosted trading allowlist.
68
+ * No-op for non-hosted clients.
69
+ */
70
+ export function ensureHostedTradingSupported(client: HostedClientLike): void {
71
+ if (!client.pmxtApiKey) return;
72
+ if (!HOSTED_TRADING_VENUES.has(client.exchangeName)) {
73
+ throw new NotSupported(
74
+ `Hosted trading is only supported for Polymarket and Opinion; ${client.exchangeName} is not supported with pmxtApiKey.`,
75
+ );
76
+ }
77
+ }
78
+
79
+ /**
80
+ * Resolve the wallet address to use for a user-scoped hosted call, preferring
81
+ * an explicit per-call override over the client default. Throws
82
+ * {@link MissingWalletAddress} when neither is set.
83
+ */
84
+ export function resolveWalletAddress(client: HostedClientLike, override?: string): string {
85
+ if (override) return override;
86
+ if (client.walletAddress) return client.walletAddress;
87
+ throw new MissingWalletAddress(
88
+ "walletAddress is required for hosted-mode reads and trades; pass it to the exchange constructor or as an override.",
89
+ );
90
+ }
91
+
92
+ /**
93
+ * Substitute `{name}` placeholders in a route path with URL-encoded values
94
+ * from `params`. Throws if a referenced parameter is missing.
95
+ */
96
+ export function formatRoutePath(
97
+ route: HostedRoute,
98
+ params: Record<string, string | number | undefined>,
99
+ ): string {
100
+ return route.path.replace(/\{(\w+)\}/g, (_, key) => {
101
+ const value = params[key];
102
+ if (value === undefined || value === null) {
103
+ throw new Error(`path parameter cannot be undefined: ${key}`);
104
+ }
105
+ return encodeURIComponent(String(value));
106
+ });
107
+ }
108
+
109
+ export interface TradingRequestOptions {
110
+ method: HttpMethod;
111
+ path: string;
112
+ body?: unknown;
113
+ params?: Record<string, string | number | boolean | undefined>;
114
+ }
115
+
116
+ /**
117
+ * Issue a request against the hosted trading API.
118
+ *
119
+ * NOTE: writes (POST/PUT/DELETE) are NEVER retried. `built_order_id` and
120
+ * `cancel_id` are single-use server-side, so replaying a lost response would
121
+ * 404 even though the original write succeeded. Callers needing retry logic
122
+ * must layer it on top with awareness of this invariant.
123
+ */
124
+ export async function _tradingRequest(
125
+ client: HostedClientLike,
126
+ opts: TradingRequestOptions,
127
+ ): Promise<unknown> {
128
+ if (!client.pmxtApiKey) {
129
+ throw new Error("hosted request requires pmxtApiKey");
130
+ }
131
+
132
+ const base = HOSTED_TRADING_BASE_URL.replace(/\/$/, "");
133
+ const path = opts.path.startsWith("/") ? opts.path : `/${opts.path}`;
134
+ let url = base + path;
135
+
136
+ if (opts.params) {
137
+ const qs = new URLSearchParams();
138
+ for (const [k, v] of Object.entries(opts.params)) {
139
+ if (v !== undefined) qs.append(k, String(v));
140
+ }
141
+ const q = qs.toString();
142
+ if (q) url += `?${q}`;
143
+ }
144
+
145
+ const headers: Record<string, string> = {
146
+ Authorization: `Bearer ${client.pmxtApiKey}`,
147
+ };
148
+ if (opts.body !== undefined) {
149
+ headers["Content-Type"] = "application/json";
150
+ }
151
+
152
+ const resp = await fetch(url, {
153
+ method: opts.method,
154
+ headers,
155
+ body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined,
156
+ });
157
+
158
+ if (!resp.ok) {
159
+ await raiseFromResponse(resp);
160
+ }
161
+
162
+ const text = await resp.text();
163
+ if (!text) return null;
164
+ return JSON.parse(text);
165
+ }