pmxtjs 2.48.6 → 2.49.0

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 (74) hide show
  1. package/dist/esm/generated/src/models/OrderLevel.d.ts +6 -0
  2. package/dist/esm/generated/src/models/OrderLevel.js +2 -0
  3. package/dist/esm/index.d.ts +2 -0
  4. package/dist/esm/index.js +1 -0
  5. package/dist/esm/pmxt/client.d.ts +106 -5
  6. package/dist/esm/pmxt/client.js +400 -6
  7. package/dist/esm/pmxt/constants.d.ts +11 -0
  8. package/dist/esm/pmxt/constants.js +13 -0
  9. package/dist/esm/pmxt/errors.d.ts +3 -0
  10. package/dist/esm/pmxt/errors.js +9 -0
  11. package/dist/esm/pmxt/escrow.d.ts +39 -0
  12. package/dist/esm/pmxt/escrow.js +78 -0
  13. package/dist/esm/pmxt/feed-client.d.ts +3 -0
  14. package/dist/esm/pmxt/feed-client.js +11 -2
  15. package/dist/esm/pmxt/hosted-errors.d.ts +84 -0
  16. package/dist/esm/pmxt/hosted-errors.js +186 -0
  17. package/dist/esm/pmxt/hosted-mappers.d.ts +45 -0
  18. package/dist/esm/pmxt/hosted-mappers.js +291 -0
  19. package/dist/esm/pmxt/hosted-routing.d.ts +69 -0
  20. package/dist/esm/pmxt/hosted-routing.js +119 -0
  21. package/dist/esm/pmxt/hosted-typed-data.d.ts +36 -0
  22. package/dist/esm/pmxt/hosted-typed-data.js +580 -0
  23. package/dist/esm/pmxt/models.d.ts +46 -8
  24. package/dist/esm/pmxt/server-manager.d.ts +4 -0
  25. package/dist/esm/pmxt/server-manager.js +6 -0
  26. package/dist/esm/pmxt/signers.d.ts +57 -0
  27. package/dist/esm/pmxt/signers.js +50 -0
  28. package/dist/esm/pmxt/ws-client.js +2 -1
  29. package/dist/generated/src/models/OrderLevel.d.ts +6 -0
  30. package/dist/generated/src/models/OrderLevel.js +2 -0
  31. package/dist/index.d.ts +2 -0
  32. package/dist/index.js +1 -0
  33. package/dist/pmxt/client.d.ts +106 -5
  34. package/dist/pmxt/client.js +399 -5
  35. package/dist/pmxt/constants.d.ts +11 -0
  36. package/dist/pmxt/constants.js +14 -1
  37. package/dist/pmxt/errors.d.ts +3 -0
  38. package/dist/pmxt/errors.js +11 -1
  39. package/dist/pmxt/escrow.d.ts +39 -0
  40. package/dist/pmxt/escrow.js +82 -0
  41. package/dist/pmxt/feed-client.d.ts +3 -0
  42. package/dist/pmxt/feed-client.js +11 -2
  43. package/dist/pmxt/hosted-errors.d.ts +84 -0
  44. package/dist/pmxt/hosted-errors.js +201 -0
  45. package/dist/pmxt/hosted-mappers.d.ts +45 -0
  46. package/dist/pmxt/hosted-mappers.js +302 -0
  47. package/dist/pmxt/hosted-routing.d.ts +69 -0
  48. package/dist/pmxt/hosted-routing.js +126 -0
  49. package/dist/pmxt/hosted-typed-data.d.ts +36 -0
  50. package/dist/pmxt/hosted-typed-data.js +619 -0
  51. package/dist/pmxt/models.d.ts +46 -8
  52. package/dist/pmxt/server-manager.d.ts +4 -0
  53. package/dist/pmxt/server-manager.js +6 -0
  54. package/dist/pmxt/signers.d.ts +57 -0
  55. package/dist/pmxt/signers.js +55 -0
  56. package/dist/pmxt/ws-client.js +2 -1
  57. package/generated/docs/OrderLevel.md +2 -0
  58. package/generated/package.json +1 -1
  59. package/generated/src/models/OrderLevel.ts +8 -0
  60. package/index.ts +1 -0
  61. package/package.json +11 -2
  62. package/pmxt/client.ts +495 -9
  63. package/pmxt/constants.ts +15 -0
  64. package/pmxt/errors.ts +11 -0
  65. package/pmxt/escrow.ts +93 -0
  66. package/pmxt/feed-client.ts +14 -2
  67. package/pmxt/hosted-errors.ts +216 -0
  68. package/pmxt/hosted-mappers.ts +312 -0
  69. package/pmxt/hosted-routing.ts +165 -0
  70. package/pmxt/hosted-typed-data.ts +767 -0
  71. package/pmxt/models.ts +65 -8
  72. package/pmxt/server-manager.ts +7 -0
  73. package/pmxt/signers.ts +86 -0
  74. package/pmxt/ws-client.ts +2 -1
@@ -36,6 +36,10 @@ export declare class ServerManager {
36
36
  * Check if the server is running.
37
37
  */
38
38
  isServerRunning(): Promise<boolean>;
39
+ /**
40
+ * Backwards-compatible alias for `isServerRunning()`.
41
+ */
42
+ isServerAlive(): Promise<boolean>;
39
43
  /**
40
44
  * Wait for the server to be ready.
41
45
  * Requires a lock file to be present to avoid falsely matching an unrelated
@@ -98,6 +98,12 @@ export class ServerManager {
98
98
  return false;
99
99
  }
100
100
  }
101
+ /**
102
+ * Backwards-compatible alias for `isServerRunning()`.
103
+ */
104
+ async isServerAlive() {
105
+ return this.isServerRunning();
106
+ }
101
107
  /**
102
108
  * Wait for the server to be ready.
103
109
  * Requires a lock file to be present to avoid falsely matching an unrelated
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Signer helpers for hosted PMXT trading.
3
+ *
4
+ * `ethers` is an optional peer dependency — read-only SDK users do not need it
5
+ * installed. Hosted-mode signing imports it lazily via `require()` and throws
6
+ * a clear install hint when it's missing.
7
+ *
8
+ * Mirrors `sdks/python/pmxt/signers.py`.
9
+ */
10
+ /**
11
+ * EIP-712 typed data payload as accepted by ethers v6 / Web3 wallets.
12
+ * `EIP712Domain` is allowed inside `types` (and is the standard) but ethers
13
+ * strips it before signing — see {@link EthersSigner.signTypedData}.
14
+ */
15
+ export interface TypedData {
16
+ types: Record<string, Array<{
17
+ name: string;
18
+ type: string;
19
+ }>>;
20
+ primaryType: string;
21
+ domain: {
22
+ name: string;
23
+ version: string;
24
+ chainId: number;
25
+ verifyingContract: string;
26
+ };
27
+ message: Record<string, unknown>;
28
+ }
29
+ /**
30
+ * Pluggable signer abstraction. Implement this to integrate hardware wallets
31
+ * or remote signing services. {@link EthersSigner} is the built-in
32
+ * private-key implementation.
33
+ */
34
+ export interface Signer {
35
+ readonly address: string;
36
+ signTypedData(typedData: TypedData): Promise<string>;
37
+ }
38
+ /**
39
+ * Built-in signer backed by an ethers `Wallet`.
40
+ *
41
+ * `ethers` is imported lazily — a clear, install-hint-bearing error is thrown
42
+ * if the peer dependency is missing.
43
+ */
44
+ export declare class EthersSigner implements Signer {
45
+ private readonly _wallet;
46
+ readonly address: string;
47
+ constructor(privateKey: string);
48
+ signTypedData(typedData: TypedData): Promise<string>;
49
+ }
50
+ /**
51
+ * Convenience factory: build a {@link Signer} from a raw private key.
52
+ *
53
+ * Currently always returns an {@link EthersSigner}. Async for forward
54
+ * compatibility with key-loaders that may need to await (e.g. keystore
55
+ * decryption).
56
+ */
57
+ export declare function signerFromPrivateKey(privateKey: string): Promise<Signer>;
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Signer helpers for hosted PMXT trading.
3
+ *
4
+ * `ethers` is an optional peer dependency — read-only SDK users do not need it
5
+ * installed. Hosted-mode signing imports it lazily via `require()` and throws
6
+ * a clear install hint when it's missing.
7
+ *
8
+ * Mirrors `sdks/python/pmxt/signers.py`.
9
+ */
10
+ const ETHERS_INSTALL_HINT = "hosted trading requires the optional 'ethers' peer dependency. Install with: npm install ethers";
11
+ /**
12
+ * Built-in signer backed by an ethers `Wallet`.
13
+ *
14
+ * `ethers` is imported lazily — a clear, install-hint-bearing error is thrown
15
+ * if the peer dependency is missing.
16
+ */
17
+ export class EthersSigner {
18
+ _wallet; // ethers.Wallet
19
+ address;
20
+ constructor(privateKey) {
21
+ let ethers;
22
+ try {
23
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
24
+ ethers = require("ethers");
25
+ }
26
+ catch {
27
+ throw new Error(ETHERS_INSTALL_HINT);
28
+ }
29
+ this._wallet = new ethers.Wallet(privateKey);
30
+ this.address = this._wallet.address;
31
+ }
32
+ async signTypedData(typedData) {
33
+ // ethers expects `types` WITHOUT the EIP712Domain entry — it derives
34
+ // the domain hash from the `domain` argument.
35
+ const types = { ...typedData.types };
36
+ delete types["EIP712Domain"];
37
+ const sig = await this._wallet.signTypedData(typedData.domain, types, typedData.message);
38
+ return sig.startsWith("0x") ? sig : "0x" + sig;
39
+ }
40
+ }
41
+ /**
42
+ * Convenience factory: build a {@link Signer} from a raw private key.
43
+ *
44
+ * Currently always returns an {@link EthersSigner}. Async for forward
45
+ * compatibility with key-loaders that may need to await (e.g. keystore
46
+ * decryption).
47
+ */
48
+ export async function signerFromPrivateKey(privateKey) {
49
+ return new EthersSigner(privateKey);
50
+ }
@@ -7,6 +7,7 @@
7
7
  * does not support the /ws endpoint.
8
8
  */
9
9
  import { PmxtError } from "./errors.js";
10
+ import { logger } from "./logger.js";
10
11
  const MAX_QUEUED_MESSAGES_PER_SUBSCRIPTION = 100_000;
11
12
  /**
12
13
  * Multiplexed WebSocket client for the pmxt sidecar.
@@ -117,7 +118,7 @@ export class SidecarWsClient {
117
118
  }
118
119
  catch (err) {
119
120
  // Dispatch bug -- log and continue; don't kill the connection.
120
- console.error('[SidecarWsClient] dispatch error:', err);
121
+ logger.error('[SidecarWsClient] dispatch error:', { err });
121
122
  }
122
123
  };
123
124
  });
@@ -27,6 +27,12 @@ export interface OrderLevel {
27
27
  * @memberof OrderLevel
28
28
  */
29
29
  size: number;
30
+ /**
31
+ *
32
+ * @type {number}
33
+ * @memberof OrderLevel
34
+ */
35
+ orderCount?: number;
30
36
  }
31
37
  /**
32
38
  * Check if a given object implements the OrderLevel interface.
@@ -38,6 +38,7 @@ function OrderLevelFromJSONTyped(json, ignoreDiscriminator) {
38
38
  return {
39
39
  'price': json['price'],
40
40
  'size': json['size'],
41
+ 'orderCount': json['orderCount'] == null ? undefined : json['orderCount'],
41
42
  };
42
43
  }
43
44
  function OrderLevelToJSON(json) {
@@ -50,5 +51,6 @@ function OrderLevelToJSONTyped(value, ignoreDiscriminator = false) {
50
51
  return {
51
52
  'price': value['price'],
52
53
  'size': value['size'],
54
+ 'orderCount': value['orderCount'],
53
55
  };
54
56
  }
package/dist/index.d.ts CHANGED
@@ -33,6 +33,7 @@ export { MarketList } from "./pmxt/models.js";
33
33
  export type { UnifiedSeries } from "./pmxt/models.js";
34
34
  export type * from "./pmxt/models.js";
35
35
  export * from "./pmxt/errors.js";
36
+ export * from "./pmxt/hosted-errors.js";
36
37
  declare function stopServer(): Promise<void>;
37
38
  declare function restartServer(): Promise<void>;
38
39
  /**
@@ -77,6 +78,7 @@ declare const pmxt: {
77
78
  ValidationError: typeof errors.ValidationError;
78
79
  NetworkError: typeof errors.NetworkError;
79
80
  ExchangeNotAvailable: typeof errors.ExchangeNotAvailable;
81
+ NotSupported: typeof errors.NotSupported;
80
82
  MarketList: typeof models.MarketList;
81
83
  Exchange: typeof Exchange;
82
84
  Polymarket: typeof Polymarket;
package/dist/index.js CHANGED
@@ -93,6 +93,7 @@ Object.defineProperty(exports, "resolvePmxtBaseUrl", { enumerable: true, get: fu
93
93
  var models_js_1 = require("./pmxt/models.js");
94
94
  Object.defineProperty(exports, "MarketList", { enumerable: true, get: function () { return models_js_1.MarketList; } });
95
95
  __exportStar(require("./pmxt/errors.js"), exports);
96
+ __exportStar(require("./pmxt/hosted-errors.js"), exports);
96
97
  const defaultManager = new server_manager_js_1.ServerManager();
97
98
  // Flat aliases for the namespaced server commands. Kept as permanent,
98
99
  // fully-supported shorthand — `pmxt.server.stop()` and `pmxt.stopServer()`
@@ -7,6 +7,8 @@
7
7
  import { Configuration, DefaultApi, ExchangeCredentials } from "../generated/src/index.js";
8
8
  import { Balance, BuiltOrder, CreateOrderParams, EventFetchParams, EventFilterCriteria, EventFilterFunction, ExecutionPriceResult, FetchOrderBookParams, MarketFetchParams, MarketFilterCriteria, MarketFilterFunction, MarketOutcome, MyTradesParams, Order, OrderBook, OrderHistoryParams, PaginatedMarketsResult, Position, SeriesFetchParams, PriceCandle, SubscribedAddressSnapshot, SubscriptionOption, Trade, UnifiedEvent, UnifiedMarket, UnifiedSeries, UserTrade, FirehoseEvent } from "./models.js";
9
9
  import { ServerManager } from "./server-manager.js";
10
+ import type { Signer } from "./signers.js";
11
+ import { Escrow } from "./escrow.js";
10
12
  /**
11
13
  * Base exchange client options.
12
14
  */
@@ -49,6 +51,18 @@ export interface ExchangeOptions {
49
51
  proxyAddress?: string;
50
52
  /** Optional signature type (0=EOA, 1=Proxy) */
51
53
  signatureType?: number;
54
+ /**
55
+ * EVM wallet address used for hosted reads/writes. Required for hosted
56
+ * endpoints that operate on a wallet (balances, positions, trades, open
57
+ * orders). When omitted, hosted reads raise {@link MissingWalletAddress}.
58
+ */
59
+ walletAddress?: string;
60
+ /**
61
+ * External signer used for hosted writes. When `privateKey` is supplied
62
+ * without `signer` in hosted mode, an internal {@link EthersSigner} is
63
+ * built from it lazily.
64
+ */
65
+ signer?: Signer;
52
66
  }
53
67
  /**
54
68
  * Base class for prediction market exchanges.
@@ -58,10 +72,10 @@ export interface ExchangeOptions {
58
72
  */
59
73
  export declare abstract class Exchange {
60
74
  private static readonly OBDATA_WATCH_ALL_SOURCES;
61
- protected exchangeName: string;
75
+ exchangeName: string;
76
+ pmxtApiKey?: string;
62
77
  protected apiKey?: string;
63
78
  protected privateKey?: string;
64
- protected pmxtApiKey?: string;
65
79
  protected proxyAddress?: string;
66
80
  protected signatureType?: number;
67
81
  protected api: DefaultApi;
@@ -69,6 +83,12 @@ export declare abstract class Exchange {
69
83
  protected serverManager: ServerManager;
70
84
  protected initPromise: Promise<void>;
71
85
  protected isHosted: boolean;
86
+ /** Wallet address used for hosted endpoints that operate on a wallet. */
87
+ walletAddress?: string;
88
+ /** External signer used for hosted writes. */
89
+ signer?: Signer;
90
+ /** Escrow namespace — populated in hosted mode for trading-allowlisted venues. */
91
+ escrow?: Escrow;
72
92
  private _hostedAccount?;
73
93
  private _accountDiscoveryPromise?;
74
94
  /**
@@ -87,6 +107,18 @@ export declare abstract class Exchange {
87
107
  protected handleResponse(response: any): any;
88
108
  protected getCredentials(): ExchangeCredentials | undefined;
89
109
  protected getAuthHeaders(): Record<string, string>;
110
+ /**
111
+ * Returns true when this client should dispatch trading methods through
112
+ * the hosted PMXT trading API (`pmxtApiKey` set AND venue is on the
113
+ * hosted-trading allowlist). Used to gate every Group A method.
114
+ */
115
+ protected isHostedTradingMode(): boolean;
116
+ /**
117
+ * Require a configured signer for a hosted write. Returns the signer or
118
+ * throws {@link MissingWalletAddress} (consistent with the error class
119
+ * surfaced for missing wallet wiring on hosted writes).
120
+ */
121
+ protected requireHostedSigner(): Signer;
90
122
  /**
91
123
  * Resolve the current sidecar base URL.
92
124
  *
@@ -184,14 +216,37 @@ export declare abstract class Exchange {
184
216
  fetchOrderBook(outcomeId: string | MarketOutcome, limit?: number, params?: FetchOrderBookParams): Promise<OrderBook | OrderBook[]>;
185
217
  fetchOrderBooks(outcomeIds: (string | MarketOutcome)[]): Promise<Record<string, OrderBook>>;
186
218
  submitOrder(built: BuiltOrder): Promise<Order>;
219
+ /**
220
+ * Hosted-mode submitOrder: validate the stored build response, sign the
221
+ * typed_data (and pull_typed_data for Opinion cross-chain sells), then
222
+ * POST to `/v0/trade/submit-order`.
223
+ */
224
+ private _hostedSubmitOrder;
225
+ /**
226
+ * Resolve the per-(venue, side, pull) typed-data schema route used by
227
+ * `validateTypedData` / `validateEconomics`. Returns undefined for the
228
+ * pull leg when a venue/side combo doesn't have one.
229
+ */
230
+ private _hostedTypedDataRoute;
231
+ private _hostedCancelTypedDataRoute;
187
232
  cancelOrder(orderId: string): Promise<Order>;
233
+ /**
234
+ * Hosted-mode cancelOrder: build the cancel typed_data on the server,
235
+ * validate + sign (dual-sign for Opinion cross-chain), then submit.
236
+ */
237
+ private _hostedCancelOrder;
188
238
  fetchOrder(orderId: string): Promise<Order>;
239
+ private _hostedFetchOrder;
189
240
  fetchOpenOrders(marketId?: string): Promise<Order[]>;
241
+ private _hostedFetchOpenOrders;
190
242
  fetchMyTrades(params?: MyTradesParams): Promise<UserTrade[]>;
243
+ private _hostedFetchMyTrades;
191
244
  fetchClosedOrders(params?: OrderHistoryParams): Promise<Order[]>;
192
245
  fetchAllOrders(params?: OrderHistoryParams): Promise<Order[]>;
193
246
  fetchPositions(address?: string): Promise<Position[]>;
247
+ private _hostedFetchPositions;
194
248
  fetchBalance(address?: string): Promise<Balance[]>;
249
+ private _hostedFetchBalance;
195
250
  unwatchOrderBook(outcomeId: string | MarketOutcome): Promise<void>;
196
251
  unwatchAddress(address: string): Promise<void>;
197
252
  close(): Promise<void>;
@@ -388,6 +443,23 @@ export declare abstract class Exchange {
388
443
  }): Promise<BuiltOrder>;
389
444
  private _discoverHostedAccount;
390
445
  private _executeSorOrder;
446
+ /**
447
+ * Hosted-mode buildOrder: validate inputs locally, then POST to the
448
+ * trading service's `build-order` endpoint and return a BuiltOrder
449
+ * that carries the original build_request for Layer-2 economic checks
450
+ * at submit time.
451
+ */
452
+ private _hostedBuildOrder;
453
+ /**
454
+ * Hosted-mode createOrder: build → sign → submit single-call wrapper.
455
+ */
456
+ private _hostedCreateOrder;
457
+ /**
458
+ * Construct the hosted build-order request body and validate inputs
459
+ * locally per the v0 contract (denom/side compatibility, > 6-decimal
460
+ * precision rejected via {@link to6dec}).
461
+ */
462
+ private _hostedBuildOrderBody;
391
463
  /**
392
464
  * @example
393
465
  * ```typescript
@@ -401,7 +473,9 @@ export declare abstract class Exchange {
401
473
  * });
402
474
  * ```
403
475
  */
404
- createOrder(params: any): Promise<Order>;
476
+ createOrder(params: CreateOrderParams & {
477
+ outcome?: MarketOutcome;
478
+ }): Promise<Order>;
405
479
  /**
406
480
  * Calculate the average execution price for a given amount by walking the order book.
407
481
  * Uses the sidecar server for calculation to ensure consistency.
@@ -721,17 +795,44 @@ export declare class GeminiTitan extends Exchange {
721
795
  export declare class Hyperliquid extends Exchange {
722
796
  constructor(options?: ExchangeOptions);
723
797
  }
798
+ /**
799
+ * Options for the SuiBets exchange client.
800
+ */
801
+ export interface SuiBetsOptions extends ExchangeOptions {
802
+ /**
803
+ * Sui wallet address (0x + 64 hex chars).
804
+ * Required for fetchPositions(). Can also be set via the
805
+ * SUIBETS_WALLET_ADDRESS environment variable on the sidecar.
806
+ */
807
+ walletAddress?: string;
808
+ }
724
809
  /**
725
810
  * SuiBets exchange client.
726
811
  *
812
+ * SuiBets is a decentralised P2P sports betting exchange on Sui mainnet.
813
+ * No house edge. 2% platform fee.
814
+ * Contract: 0xd51fe151bec66a15b086a67c1cfce9b05759ddac1d73fcd3e14324ad202b2e59
815
+ *
727
816
  * @example
728
817
  * ```typescript
729
818
  * const suibets = new SuiBets();
730
- * const markets = await suibets.fetchMarkets();
819
+ * const markets = await suibets.fetchMarkets({ limit: 20 });
820
+ *
821
+ * // With wallet for fetchPositions()
822
+ * const me = new SuiBets({ walletAddress: '0xabc...' });
823
+ * const positions = await me.fetchPositions();
731
824
  * ```
732
825
  */
733
826
  export declare class SuiBets extends Exchange {
734
- constructor(options?: ExchangeOptions);
827
+ private readonly _walletAddress?;
828
+ constructor(options?: SuiBetsOptions);
829
+ /**
830
+ * Includes walletAddress in the credentials sent to the sidecar so
831
+ * that fetchPositions() can reach the /api/p2p/my endpoint.
832
+ * Falls back to SUIBETS_WALLET_ADDRESS env var on the sidecar side
833
+ * when walletAddress is not set here.
834
+ */
835
+ protected getCredentials(): ExchangeCredentials | undefined;
735
836
  }
736
837
  /**
737
838
  * Mock exchange client.