pmxt-core 2.20.1 → 2.20.3

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 (111) hide show
  1. package/dist/exchanges/baozi/fetcher.d.ts +40 -0
  2. package/dist/exchanges/baozi/fetcher.js +155 -0
  3. package/dist/exchanges/baozi/index.d.ts +2 -0
  4. package/dist/exchanges/baozi/index.js +60 -131
  5. package/dist/exchanges/baozi/normalizer.d.ts +14 -0
  6. package/dist/exchanges/baozi/normalizer.js +208 -0
  7. package/dist/exchanges/interfaces.d.ts +28 -0
  8. package/dist/exchanges/interfaces.js +2 -0
  9. package/dist/exchanges/kalshi/api.d.ts +1 -1
  10. package/dist/exchanges/kalshi/api.js +1 -1
  11. package/dist/exchanges/kalshi/fetcher.d.ts +136 -0
  12. package/dist/exchanges/kalshi/fetcher.js +313 -0
  13. package/dist/exchanges/kalshi/index.d.ts +6 -6
  14. package/dist/exchanges/kalshi/index.js +119 -202
  15. package/dist/exchanges/kalshi/normalizer.d.ts +25 -0
  16. package/dist/exchanges/kalshi/normalizer.js +313 -0
  17. package/dist/exchanges/limitless/api.d.ts +1 -1
  18. package/dist/exchanges/limitless/api.js +1 -1
  19. package/dist/exchanges/limitless/fetcher.d.ts +81 -0
  20. package/dist/exchanges/limitless/fetcher.js +238 -0
  21. package/dist/exchanges/limitless/index.d.ts +6 -9
  22. package/dist/exchanges/limitless/index.js +81 -79
  23. package/dist/exchanges/limitless/normalizer.d.ts +14 -0
  24. package/dist/exchanges/limitless/normalizer.js +117 -0
  25. package/dist/exchanges/limitless/websocket.d.ts +3 -0
  26. package/dist/exchanges/limitless/websocket.js +5 -4
  27. package/dist/exchanges/myriad/api.d.ts +1 -1
  28. package/dist/exchanges/myriad/api.js +1 -1
  29. package/dist/exchanges/myriad/fetcher.d.ts +73 -0
  30. package/dist/exchanges/myriad/fetcher.js +217 -0
  31. package/dist/exchanges/myriad/index.d.ts +2 -0
  32. package/dist/exchanges/myriad/index.js +40 -97
  33. package/dist/exchanges/myriad/normalizer.d.ts +14 -0
  34. package/dist/exchanges/myriad/normalizer.js +167 -0
  35. package/dist/exchanges/myriad/websocket.d.ts +3 -1
  36. package/dist/exchanges/myriad/websocket.js +4 -3
  37. package/dist/exchanges/polymarket/api-clob.d.ts +1 -1
  38. package/dist/exchanges/polymarket/api-clob.js +1 -1
  39. package/dist/exchanges/polymarket/api-data.d.ts +1 -1
  40. package/dist/exchanges/polymarket/api-data.js +1 -1
  41. package/dist/exchanges/polymarket/api-gamma.d.ts +1 -1
  42. package/dist/exchanges/polymarket/api-gamma.js +1 -1
  43. package/dist/exchanges/polymarket/fetcher.d.ts +99 -0
  44. package/dist/exchanges/polymarket/fetcher.js +335 -0
  45. package/dist/exchanges/polymarket/index.d.ts +2 -0
  46. package/dist/exchanges/polymarket/index.js +80 -66
  47. package/dist/exchanges/polymarket/normalizer.d.ts +18 -0
  48. package/dist/exchanges/polymarket/normalizer.js +126 -0
  49. package/dist/exchanges/probable/api.d.ts +1 -1
  50. package/dist/exchanges/probable/api.js +1 -1
  51. package/dist/exchanges/probable/fetcher.d.ts +106 -0
  52. package/dist/exchanges/probable/fetcher.js +357 -0
  53. package/dist/exchanges/probable/index.d.ts +3 -1
  54. package/dist/exchanges/probable/index.js +73 -105
  55. package/dist/exchanges/probable/normalizer.d.ts +14 -0
  56. package/dist/exchanges/probable/normalizer.js +109 -0
  57. package/package.json +3 -3
  58. package/dist/exchanges/baozi/fetchEvents.d.ts +0 -8
  59. package/dist/exchanges/baozi/fetchEvents.js +0 -39
  60. package/dist/exchanges/baozi/fetchMarkets.d.ts +0 -5
  61. package/dist/exchanges/baozi/fetchMarkets.js +0 -160
  62. package/dist/exchanges/baozi/fetchOHLCV.d.ts +0 -6
  63. package/dist/exchanges/baozi/fetchOHLCV.js +0 -10
  64. package/dist/exchanges/baozi/fetchOrderBook.d.ts +0 -12
  65. package/dist/exchanges/baozi/fetchOrderBook.js +0 -36
  66. package/dist/exchanges/baozi/fetchTrades.d.ts +0 -6
  67. package/dist/exchanges/baozi/fetchTrades.js +0 -10
  68. package/dist/exchanges/kalshi/fetchEvents.d.ts +0 -5
  69. package/dist/exchanges/kalshi/fetchEvents.js +0 -196
  70. package/dist/exchanges/kalshi/fetchMarkets.d.ts +0 -6
  71. package/dist/exchanges/kalshi/fetchMarkets.js +0 -247
  72. package/dist/exchanges/kalshi/fetchOHLCV.d.ts +0 -3
  73. package/dist/exchanges/kalshi/fetchOHLCV.js +0 -97
  74. package/dist/exchanges/kalshi/fetchOrderBook.d.ts +0 -2
  75. package/dist/exchanges/kalshi/fetchOrderBook.js +0 -60
  76. package/dist/exchanges/kalshi/fetchTrades.d.ts +0 -3
  77. package/dist/exchanges/kalshi/fetchTrades.js +0 -33
  78. package/dist/exchanges/limitless/fetchEvents.d.ts +0 -4
  79. package/dist/exchanges/limitless/fetchEvents.js +0 -173
  80. package/dist/exchanges/limitless/fetchMarkets.d.ts +0 -3
  81. package/dist/exchanges/limitless/fetchMarkets.js +0 -152
  82. package/dist/exchanges/limitless/fetchOHLCV.d.ts +0 -7
  83. package/dist/exchanges/limitless/fetchOHLCV.js +0 -49
  84. package/dist/exchanges/limitless/fetchOrderBook.d.ts +0 -6
  85. package/dist/exchanges/limitless/fetchOrderBook.js +0 -41
  86. package/dist/exchanges/limitless/fetchTrades.d.ts +0 -8
  87. package/dist/exchanges/limitless/fetchTrades.js +0 -27
  88. package/dist/exchanges/myriad/fetchEvents.d.ts +0 -4
  89. package/dist/exchanges/myriad/fetchEvents.js +0 -48
  90. package/dist/exchanges/myriad/fetchMarkets.d.ts +0 -4
  91. package/dist/exchanges/myriad/fetchMarkets.js +0 -102
  92. package/dist/exchanges/myriad/fetchOHLCV.d.ts +0 -3
  93. package/dist/exchanges/myriad/fetchOHLCV.js +0 -83
  94. package/dist/exchanges/myriad/fetchOrderBook.d.ts +0 -2
  95. package/dist/exchanges/myriad/fetchOrderBook.js +0 -39
  96. package/dist/exchanges/polymarket/fetchEvents.d.ts +0 -4
  97. package/dist/exchanges/polymarket/fetchEvents.js +0 -135
  98. package/dist/exchanges/polymarket/fetchMarkets.d.ts +0 -4
  99. package/dist/exchanges/polymarket/fetchMarkets.js +0 -214
  100. package/dist/exchanges/polymarket/fetchOHLCV.d.ts +0 -7
  101. package/dist/exchanges/polymarket/fetchOHLCV.js +0 -98
  102. package/dist/exchanges/polymarket/fetchOrderBook.d.ts +0 -6
  103. package/dist/exchanges/polymarket/fetchOrderBook.js +0 -33
  104. package/dist/exchanges/polymarket/fetchTrades.d.ts +0 -9
  105. package/dist/exchanges/polymarket/fetchTrades.js +0 -43
  106. package/dist/exchanges/probable/fetchEvents.d.ts +0 -6
  107. package/dist/exchanges/probable/fetchEvents.js +0 -151
  108. package/dist/exchanges/probable/fetchMarkets.d.ts +0 -4
  109. package/dist/exchanges/probable/fetchMarkets.js +0 -239
  110. package/dist/exchanges/probable/fetchTrades.d.ts +0 -10
  111. package/dist/exchanges/probable/fetchTrades.js +0 -40
@@ -0,0 +1,313 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KalshiFetcher = void 0;
4
+ const errors_1 = require("./errors");
5
+ const validation_1 = require("../../utils/validation");
6
+ const utils_1 = require("./utils");
7
+ // ----------------------------------------------------------------------------
8
+ // Fetcher
9
+ // ----------------------------------------------------------------------------
10
+ const BATCH_SIZE = 200;
11
+ const MAX_PAGES = 1000;
12
+ const CACHE_TTL = 5 * 60 * 1000;
13
+ class KalshiFetcher {
14
+ ctx;
15
+ // Instance-level cache (moved from module-level)
16
+ cachedEvents = null;
17
+ cachedSeriesMap = null;
18
+ lastCacheTime = 0;
19
+ constructor(ctx) {
20
+ this.ctx = ctx;
21
+ }
22
+ resetCache() {
23
+ this.cachedEvents = null;
24
+ this.cachedSeriesMap = null;
25
+ this.lastCacheTime = 0;
26
+ }
27
+ // -- Markets (returns raw events containing nested markets) ----------------
28
+ async fetchRawMarkets(params) {
29
+ try {
30
+ if (params?.marketId) {
31
+ return this.fetchRawEventByTicker(params.marketId);
32
+ }
33
+ if (params?.slug) {
34
+ return this.fetchRawEventByTicker(params.slug);
35
+ }
36
+ if (params?.outcomeId) {
37
+ const ticker = params.outcomeId.replace(/-NO$/, '');
38
+ return this.fetchRawEventByTicker(ticker);
39
+ }
40
+ if (params?.eventId) {
41
+ return this.fetchRawEventByTicker(params.eventId);
42
+ }
43
+ // Default + query cases: fetch all events, caller does filtering
44
+ return this.fetchRawEventsDefault(params);
45
+ }
46
+ catch (error) {
47
+ throw errors_1.kalshiErrorMapper.mapError(error);
48
+ }
49
+ }
50
+ // -- Events ---------------------------------------------------------------
51
+ async fetchRawEvents(params) {
52
+ try {
53
+ if (params.eventId) {
54
+ return this.fetchRawEventByTicker(params.eventId);
55
+ }
56
+ if (params.slug) {
57
+ return this.fetchRawEventByTicker(params.slug);
58
+ }
59
+ const status = params?.status || 'active';
60
+ if (status === 'all') {
61
+ const [openEvents, closedEvents, settledEvents] = await Promise.all([
62
+ this.fetchAllWithStatus('open'),
63
+ this.fetchAllWithStatus('closed'),
64
+ this.fetchAllWithStatus('settled'),
65
+ ]);
66
+ return [...openEvents, ...closedEvents, ...settledEvents];
67
+ }
68
+ else if (status === 'closed' || status === 'inactive') {
69
+ const [closedEvents, settledEvents] = await Promise.all([
70
+ this.fetchAllWithStatus('closed'),
71
+ this.fetchAllWithStatus('settled'),
72
+ ]);
73
+ return [...closedEvents, ...settledEvents];
74
+ }
75
+ return this.fetchAllWithStatus('open');
76
+ }
77
+ catch (error) {
78
+ throw errors_1.kalshiErrorMapper.mapError(error);
79
+ }
80
+ }
81
+ // -- OHLCV ----------------------------------------------------------------
82
+ async fetchRawOHLCV(id, params) {
83
+ (0, validation_1.validateIdFormat)(id, 'OHLCV');
84
+ if (!params.resolution) {
85
+ throw new Error('fetchOHLCV requires a resolution parameter.');
86
+ }
87
+ try {
88
+ const cleanedId = id.replace(/-NO$/, '');
89
+ const normalizedId = cleanedId.toUpperCase();
90
+ const interval = (0, utils_1.mapIntervalToKalshi)(params.resolution);
91
+ const parts = normalizedId.split('-');
92
+ if (parts.length < 2) {
93
+ throw new Error(`Invalid Kalshi Ticker format: "${id}". Expected format like "FED-25JAN29-B4.75".`);
94
+ }
95
+ const seriesTicker = parts.slice(0, -1).join('-');
96
+ const now = Math.floor(Date.now() / 1000);
97
+ let startTs = now - 24 * 60 * 60;
98
+ let endTs = now;
99
+ const ensureDate = (d) => {
100
+ if (typeof d === 'string') {
101
+ if (!d.endsWith('Z') && !d.match(/[+-]\d{2}:\d{2}$/)) {
102
+ return new Date(d + 'Z');
103
+ }
104
+ return new Date(d);
105
+ }
106
+ return d;
107
+ };
108
+ const pStart = params.start ? ensureDate(params.start) : undefined;
109
+ const pEnd = params.end ? ensureDate(params.end) : undefined;
110
+ if (pStart)
111
+ startTs = Math.floor(pStart.getTime() / 1000);
112
+ if (pEnd) {
113
+ endTs = Math.floor(pEnd.getTime() / 1000);
114
+ if (!pStart)
115
+ startTs = endTs - 24 * 60 * 60;
116
+ }
117
+ const data = await this.ctx.callApi('GetMarketCandlesticks', {
118
+ series_ticker: seriesTicker,
119
+ ticker: normalizedId,
120
+ period_interval: interval,
121
+ start_ts: startTs,
122
+ end_ts: endTs,
123
+ });
124
+ return data.candlesticks || [];
125
+ }
126
+ catch (error) {
127
+ throw errors_1.kalshiErrorMapper.mapError(error);
128
+ }
129
+ }
130
+ // -- OrderBook -------------------------------------------------------------
131
+ async fetchRawOrderBook(id) {
132
+ (0, validation_1.validateIdFormat)(id, 'OrderBook');
133
+ const ticker = id.replace(/-NO$/, '');
134
+ const data = await this.ctx.callApi('GetMarketOrderbook', { ticker });
135
+ return data;
136
+ }
137
+ // -- Trades ----------------------------------------------------------------
138
+ async fetchRawTrades(id, params) {
139
+ const ticker = id.replace(/-NO$/, '');
140
+ const data = await this.ctx.callApi('GetTrades', {
141
+ ticker,
142
+ limit: params.limit || 100,
143
+ });
144
+ return data.trades || [];
145
+ }
146
+ // -- User data -------------------------------------------------------------
147
+ async fetchRawMyTrades(params) {
148
+ const queryParams = {};
149
+ if (params?.outcomeId || params?.marketId) {
150
+ queryParams.ticker = (params.outcomeId || params.marketId).replace(/-NO$/, '');
151
+ }
152
+ if (params?.since)
153
+ queryParams.min_ts = Math.floor(params.since.getTime() / 1000);
154
+ if (params?.until)
155
+ queryParams.max_ts = Math.floor(params.until.getTime() / 1000);
156
+ if (params?.limit)
157
+ queryParams.limit = params.limit;
158
+ if (params?.cursor)
159
+ queryParams.cursor = params.cursor;
160
+ const data = await this.ctx.callApi('GetFills', queryParams);
161
+ return data.fills || [];
162
+ }
163
+ async fetchRawPositions() {
164
+ const data = await this.ctx.callApi('GetPositions');
165
+ return data.market_positions || [];
166
+ }
167
+ async fetchRawBalance() {
168
+ return this.ctx.callApi('GetBalance');
169
+ }
170
+ async fetchRawOrders(queryParams) {
171
+ const data = await this.ctx.callApi('GetOrders', queryParams);
172
+ return data.orders || [];
173
+ }
174
+ async fetchRawHistoricalOrders(queryParams) {
175
+ const data = await this.ctx.callApi('GetHistoricalOrders', queryParams);
176
+ return data.orders || [];
177
+ }
178
+ async fetchRawSeriesMap() {
179
+ try {
180
+ const data = await this.ctx.callApi('GetSeriesList');
181
+ const seriesList = data.series || [];
182
+ const map = new Map();
183
+ for (const series of seriesList) {
184
+ if (series.tags && series.tags.length > 0) {
185
+ map.set(series.ticker, series.tags);
186
+ }
187
+ }
188
+ return map;
189
+ }
190
+ catch (e) {
191
+ throw errors_1.kalshiErrorMapper.mapError(e);
192
+ }
193
+ }
194
+ // -- Private helpers -------------------------------------------------------
195
+ async fetchRawEventByTicker(eventTicker) {
196
+ const normalizedTicker = eventTicker.toUpperCase();
197
+ const data = await this.ctx.callApi('GetEvent', {
198
+ event_ticker: normalizedTicker,
199
+ with_nested_markets: true,
200
+ });
201
+ const event = data.event;
202
+ if (!event)
203
+ return [];
204
+ // Enrich with series tags
205
+ if (event.series_ticker) {
206
+ try {
207
+ const seriesData = await this.ctx.callApi('GetSeries', {
208
+ series_ticker: event.series_ticker,
209
+ });
210
+ const series = seriesData.series;
211
+ if (series?.tags?.length > 0 && (!event.tags || event.tags.length === 0)) {
212
+ event.tags = series.tags;
213
+ }
214
+ }
215
+ catch {
216
+ // Non-critical
217
+ }
218
+ }
219
+ return [event];
220
+ }
221
+ async fetchRawEventsDefault(params) {
222
+ const limit = params?.limit || 250000;
223
+ const now = Date.now();
224
+ const status = params?.status || 'active';
225
+ let apiStatus = 'open';
226
+ if (status === 'closed' || status === 'inactive')
227
+ apiStatus = 'closed';
228
+ const useCache = status === 'active' || !params?.status;
229
+ if (useCache && this.cachedEvents && this.cachedSeriesMap && now - this.lastCacheTime < CACHE_TTL) {
230
+ return this.cachedEvents;
231
+ }
232
+ const isSorted = params?.sort && (params.sort === 'volume' || params.sort === 'liquidity');
233
+ const fetchLimit = isSorted ? 1000 : limit;
234
+ const [allEvents, fetchedSeriesMap] = await Promise.all([
235
+ this.fetchActiveEvents(fetchLimit, apiStatus),
236
+ this.fetchRawSeriesMap(),
237
+ ]);
238
+ // Enrich events with series tags
239
+ for (const event of allEvents) {
240
+ if (event.series_ticker && fetchedSeriesMap.has(event.series_ticker)) {
241
+ if (!event.tags || event.tags.length === 0) {
242
+ event.tags = fetchedSeriesMap.get(event.series_ticker);
243
+ }
244
+ }
245
+ }
246
+ if (fetchLimit >= 1000 && useCache) {
247
+ this.cachedEvents = allEvents;
248
+ this.cachedSeriesMap = fetchedSeriesMap;
249
+ this.lastCacheTime = now;
250
+ }
251
+ return allEvents;
252
+ }
253
+ async fetchActiveEvents(targetMarketCount, status = 'open') {
254
+ let allEvents = [];
255
+ let totalMarketCount = 0;
256
+ let cursor = null;
257
+ let page = 0;
258
+ do {
259
+ try {
260
+ const queryParams = {
261
+ limit: BATCH_SIZE,
262
+ with_nested_markets: true,
263
+ status,
264
+ };
265
+ if (cursor)
266
+ queryParams.cursor = cursor;
267
+ const data = await this.ctx.callApi('GetEvents', queryParams);
268
+ const events = data.events || [];
269
+ if (events.length === 0)
270
+ break;
271
+ allEvents = allEvents.concat(events);
272
+ if (targetMarketCount) {
273
+ for (const event of events) {
274
+ totalMarketCount += (event.markets || []).length;
275
+ }
276
+ if (totalMarketCount >= targetMarketCount * 1.5)
277
+ break;
278
+ }
279
+ cursor = data.cursor;
280
+ page++;
281
+ if (!targetMarketCount && page >= 10)
282
+ break;
283
+ }
284
+ catch (e) {
285
+ throw errors_1.kalshiErrorMapper.mapError(e);
286
+ }
287
+ } while (cursor && page < MAX_PAGES);
288
+ return allEvents;
289
+ }
290
+ async fetchAllWithStatus(apiStatus) {
291
+ let allEvents = [];
292
+ let cursor = null;
293
+ let page = 0;
294
+ do {
295
+ const queryParams = {
296
+ limit: BATCH_SIZE,
297
+ with_nested_markets: true,
298
+ status: apiStatus,
299
+ };
300
+ if (cursor)
301
+ queryParams.cursor = cursor;
302
+ const data = await this.ctx.callApi('GetEvents', queryParams);
303
+ const events = data.events || [];
304
+ if (events.length === 0)
305
+ break;
306
+ allEvents = allEvents.concat(events);
307
+ cursor = data.cursor;
308
+ page++;
309
+ } while (cursor && page < MAX_PAGES);
310
+ return allEvents;
311
+ }
312
+ }
313
+ exports.KalshiFetcher = KalshiFetcher;
@@ -36,6 +36,8 @@ export declare class KalshiExchange extends PredictionMarketExchange {
36
36
  private auth?;
37
37
  private wsConfig?;
38
38
  private config;
39
+ private readonly fetcher;
40
+ private readonly normalizer;
39
41
  constructor(options?: ExchangeCredentials | KalshiExchangeOptions);
40
42
  get name(): string;
41
43
  protected sign(method: string, path: string, _params: Record<string, any>): Record<string, string>;
@@ -47,18 +49,16 @@ export declare class KalshiExchange extends PredictionMarketExchange {
47
49
  fetchOrderBook(id: string): Promise<OrderBook>;
48
50
  fetchTrades(id: string, params: TradesParams | HistoryFilterParams): Promise<Trade[]>;
49
51
  fetchBalance(): Promise<Balance[]>;
52
+ fetchMyTrades(params?: MyTradesParams): Promise<UserTrade[]>;
53
+ fetchPositions(): Promise<Position[]>;
54
+ fetchClosedOrders(params?: OrderHistoryParams): Promise<Order[]>;
55
+ fetchAllOrders(params?: OrderHistoryParams): Promise<Order[]>;
50
56
  buildOrder(params: CreateOrderParams): Promise<BuiltOrder>;
51
57
  submitOrder(built: BuiltOrder): Promise<Order>;
52
58
  createOrder(params: CreateOrderParams): Promise<Order>;
53
59
  cancelOrder(orderId: string): Promise<Order>;
54
60
  fetchOrder(orderId: string): Promise<Order>;
55
61
  fetchOpenOrders(marketId?: string): Promise<Order[]>;
56
- fetchMyTrades(params?: MyTradesParams): Promise<UserTrade[]>;
57
- fetchClosedOrders(params?: OrderHistoryParams): Promise<Order[]>;
58
- fetchAllOrders(params?: OrderHistoryParams): Promise<Order[]>;
59
- fetchPositions(): Promise<Position[]>;
60
- private mapKalshiOrder;
61
- private mapKalshiOrderStatus;
62
62
  private ws?;
63
63
  watchOrderBook(id: string, limit?: number): Promise<OrderBook>;
64
64
  watchTrades(id: string, address?: string, since?: number, limit?: number): Promise<Trade[]>;