@catalyst-team/poly-sdk 0.4.3 → 0.4.5

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 (33) hide show
  1. package/dist/src/core/order-status.d.ts +159 -0
  2. package/dist/src/core/order-status.d.ts.map +1 -0
  3. package/dist/src/core/order-status.js +254 -0
  4. package/dist/src/core/order-status.js.map +1 -0
  5. package/dist/src/core/types.d.ts +124 -0
  6. package/dist/src/core/types.d.ts.map +1 -1
  7. package/dist/src/core/types.js +120 -0
  8. package/dist/src/core/types.js.map +1 -1
  9. package/dist/src/index.d.ts +5 -0
  10. package/dist/src/index.d.ts.map +1 -1
  11. package/dist/src/index.js +6 -0
  12. package/dist/src/index.js.map +1 -1
  13. package/dist/src/services/ctf-detector.d.ts +215 -0
  14. package/dist/src/services/ctf-detector.d.ts.map +1 -0
  15. package/dist/src/services/ctf-detector.js +420 -0
  16. package/dist/src/services/ctf-detector.js.map +1 -0
  17. package/dist/src/services/ctf-manager.d.ts +202 -0
  18. package/dist/src/services/ctf-manager.d.ts.map +1 -0
  19. package/dist/src/services/ctf-manager.js +542 -0
  20. package/dist/src/services/ctf-manager.js.map +1 -0
  21. package/dist/src/services/order-manager.d.ts +281 -0
  22. package/dist/src/services/order-manager.d.ts.map +1 -0
  23. package/dist/src/services/order-manager.js +641 -0
  24. package/dist/src/services/order-manager.js.map +1 -0
  25. package/dist/src/services/order-manager.test.d.ts +8 -0
  26. package/dist/src/services/order-manager.test.d.ts.map +1 -0
  27. package/dist/src/services/order-manager.test.js +477 -0
  28. package/dist/src/services/order-manager.test.js.map +1 -0
  29. package/dist/src/services/trading-service.d.ts +89 -1
  30. package/dist/src/services/trading-service.d.ts.map +1 -1
  31. package/dist/src/services/trading-service.js +227 -1
  32. package/dist/src/services/trading-service.js.map +1 -1
  33. package/package.json +1 -1
@@ -0,0 +1,641 @@
1
+ /**
2
+ * OrderManager - Unified Order Creation and Monitoring
3
+ *
4
+ * Core Design Philosophy:
5
+ * - Unifies order creation + lifecycle monitoring in one component
6
+ * - Encapsulates all Polymarket-specific details (USDC.e, tick size, tokenId, CTF, Polygon)
7
+ * - Provides complete lifecycle events (CLOB match → tx submit → on-chain confirm)
8
+ * - Auto-validates orders before submission (market state, balance, precision)
9
+ * - Auto-watches orders after creation
10
+ *
11
+ * Platform-Specific Implementation:
12
+ * This is a Polymarket-specific implementation. The design allows future extraction
13
+ * to interfaces if supporting multiple prediction markets, but for now we focus on
14
+ * clean encapsulation with Polymarket details in private methods.
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * const orderMgr = new OrderManager({
19
+ * privateKey: '0x...',
20
+ * rateLimiter,
21
+ * cache,
22
+ * });
23
+ *
24
+ * await orderMgr.start();
25
+ *
26
+ * // Listen to complete lifecycle
27
+ * orderMgr.on('order_opened', (order) => {
28
+ * console.log('Order live in orderbook');
29
+ * });
30
+ *
31
+ * orderMgr.on('order_filled', (event) => {
32
+ * console.log(`Filled: ${event.fill.size} @ ${event.fill.price}`);
33
+ * });
34
+ *
35
+ * orderMgr.on('transaction_confirmed', (event) => {
36
+ * console.log(`On-chain settled: ${event.transactionHash}`);
37
+ * });
38
+ *
39
+ * // Create order (auto-validates + auto-watches)
40
+ * const result = await orderMgr.createOrder({
41
+ * tokenId: '0x...',
42
+ * side: 'BUY',
43
+ * price: 0.52,
44
+ * size: 100,
45
+ * });
46
+ * ```
47
+ */
48
+ import { EventEmitter } from 'events';
49
+ import { ethers } from 'ethers';
50
+ import { TradingService } from './trading-service.js';
51
+ import { RateLimiter } from '../core/rate-limiter.js';
52
+ import { createUnifiedCache } from '../core/unified-cache.js';
53
+ import { OrderStatus } from '../core/types.js';
54
+ import { isTerminalStatus, isValidStatusTransition } from '../core/order-status.js';
55
+ import { PolymarketError, ErrorCode } from '../core/errors.js';
56
+ // ============================================================================
57
+ // OrderManager Implementation
58
+ // ============================================================================
59
+ export class OrderManager extends EventEmitter {
60
+ // ========== Polymarket Service Dependencies ==========
61
+ tradingService;
62
+ realtimeService = null;
63
+ polygonProvider = null;
64
+ // ========== Configuration ==========
65
+ config;
66
+ initialized = false;
67
+ // ========== Monitoring State ==========
68
+ watchedOrders = new Map();
69
+ processedEvents = new Set();
70
+ mode;
71
+ // ========== Market Metadata Cache (Polymarket-specific) ==========
72
+ marketCache = new Map();
73
+ constructor(config) {
74
+ super();
75
+ this.config = {
76
+ ...config,
77
+ chainId: config.chainId ?? 137,
78
+ mode: config.mode ?? 'hybrid',
79
+ pollingInterval: config.pollingInterval ?? 5000,
80
+ polygonRpcUrl: config.polygonRpcUrl ?? 'https://polygon-rpc.com',
81
+ };
82
+ this.mode = this.config.mode;
83
+ // Create default RateLimiter and Cache if not provided
84
+ const rateLimiter = config.rateLimiter || new RateLimiter();
85
+ const cache = config.cache || createUnifiedCache();
86
+ // Initialize TradingService (always needed)
87
+ this.tradingService = new TradingService(rateLimiter, cache, {
88
+ privateKey: config.privateKey,
89
+ chainId: this.config.chainId,
90
+ });
91
+ }
92
+ // ============================================================================
93
+ // Lifecycle Management
94
+ // ============================================================================
95
+ /**
96
+ * Initialize OrderManager
97
+ * - Initializes TradingService
98
+ * - Optionally initializes RealtimeService (for WebSocket mode)
99
+ * - Optionally initializes Polygon provider (for settlement tracking)
100
+ */
101
+ async start() {
102
+ if (this.initialized)
103
+ return;
104
+ // Initialize TradingService
105
+ await this.tradingService.initialize();
106
+ // Initialize Polygon provider for settlement tracking
107
+ // (Polymarket-specific: tracks CTF token transfers on Polygon)
108
+ if (this.config.polygonRpcUrl) {
109
+ this.polygonProvider = new ethers.providers.JsonRpcProvider(this.config.polygonRpcUrl);
110
+ }
111
+ this.initialized = true;
112
+ this.emit('initialized');
113
+ }
114
+ /**
115
+ * Stop OrderManager
116
+ * - Unwatch all orders
117
+ * - Disconnect WebSocket (if connected)
118
+ */
119
+ stop() {
120
+ // Stop all polling
121
+ for (const watched of this.watchedOrders.values()) {
122
+ if (watched.pollingIntervalId) {
123
+ clearInterval(watched.pollingIntervalId);
124
+ }
125
+ }
126
+ // Disconnect WebSocket
127
+ if (this.realtimeService) {
128
+ this.realtimeService.disconnect();
129
+ this.realtimeService = null;
130
+ }
131
+ this.watchedOrders.clear();
132
+ this.processedEvents.clear();
133
+ this.initialized = false;
134
+ this.emit('stopped');
135
+ }
136
+ // ============================================================================
137
+ // Public API - Order Operations
138
+ // ============================================================================
139
+ /**
140
+ * Create and submit a limit order
141
+ *
142
+ * Auto-validates (Polymarket-specific):
143
+ * - Market state (active, not closed)
144
+ * - USDC.e balance
145
+ * - Tick size (0.01)
146
+ * - Minimum size (5 shares)
147
+ * - Minimum value ($1)
148
+ *
149
+ * Auto-watches: Starts monitoring immediately after creation
150
+ *
151
+ * @param params Order parameters
152
+ * @param metadata Optional metadata for tracking
153
+ * @returns Order result with orderId or error
154
+ */
155
+ async createOrder(params, metadata) {
156
+ this.ensureInitialized();
157
+ // Validate order (Polymarket-specific checks)
158
+ try {
159
+ await this.validateOrder(params);
160
+ }
161
+ catch (error) {
162
+ const rejectEvent = {
163
+ params,
164
+ reason: error instanceof Error ? error.message : String(error),
165
+ timestamp: Date.now(),
166
+ };
167
+ this.emit('order_rejected', rejectEvent);
168
+ return {
169
+ success: false,
170
+ errorMsg: rejectEvent.reason,
171
+ };
172
+ }
173
+ // Submit order via TradingService
174
+ const result = await this.tradingService.createLimitOrder(params);
175
+ if (result.success && result.orderId) {
176
+ // Auto-watch the order
177
+ this.watchOrder(result.orderId, metadata);
178
+ // Emit order_created event
179
+ this.emit('order_created', {
180
+ id: result.orderId,
181
+ status: OrderStatus.PENDING,
182
+ tokenId: params.tokenId,
183
+ side: params.side,
184
+ price: params.price,
185
+ originalSize: params.size,
186
+ filledSize: 0,
187
+ remainingSize: params.size,
188
+ associateTrades: [],
189
+ createdAt: Date.now(),
190
+ });
191
+ }
192
+ return result;
193
+ }
194
+ /**
195
+ * Cancel an order
196
+ * Auto-unwatches after cancellation
197
+ */
198
+ async cancelOrder(orderId) {
199
+ this.ensureInitialized();
200
+ const result = await this.tradingService.cancelOrder(orderId);
201
+ if (result.success) {
202
+ // Unwatch order (will stop polling/listening)
203
+ this.unwatchOrder(orderId);
204
+ }
205
+ return result;
206
+ }
207
+ /**
208
+ * Get order details
209
+ * Fetches from TradingService (CLOB API)
210
+ */
211
+ async getOrder(orderId) {
212
+ this.ensureInitialized();
213
+ return this.tradingService.getOrder(orderId);
214
+ }
215
+ /**
216
+ * Create multiple orders in batch
217
+ * Auto-watches all successfully created orders
218
+ */
219
+ async createBatchOrders(orders, metadata) {
220
+ this.ensureInitialized();
221
+ const result = await this.tradingService.createBatchOrders(orders);
222
+ if (result.success && result.orderIds) {
223
+ // Auto-watch all created orders
224
+ for (const orderId of result.orderIds) {
225
+ this.watchOrder(orderId, metadata);
226
+ }
227
+ }
228
+ return result;
229
+ }
230
+ // ============================================================================
231
+ // Public API - Order Monitoring
232
+ // ============================================================================
233
+ /**
234
+ * Manually watch an order
235
+ * Used for monitoring externally-created orders
236
+ *
237
+ * @param orderId Order ID to watch
238
+ * @param metadata Optional metadata
239
+ */
240
+ watchOrder(orderId, metadata) {
241
+ if (this.watchedOrders.has(orderId)) {
242
+ return; // Already watching
243
+ }
244
+ // Create initial watched state
245
+ const watched = {
246
+ orderId,
247
+ order: {
248
+ id: orderId,
249
+ status: OrderStatus.PENDING,
250
+ tokenId: '',
251
+ side: 'BUY',
252
+ price: 0,
253
+ originalSize: 0,
254
+ filledSize: 0,
255
+ remainingSize: 0,
256
+ associateTrades: [],
257
+ createdAt: Date.now(),
258
+ },
259
+ metadata,
260
+ lastStatus: OrderStatus.PENDING,
261
+ };
262
+ this.watchedOrders.set(orderId, watched);
263
+ // Start monitoring based on mode
264
+ if (this.mode === 'websocket' || this.mode === 'hybrid') {
265
+ // Fire and forget - WebSocket connection is lazy initialized
266
+ this.ensureWebSocketConnected().catch(err => {
267
+ this.emit('error', new Error(`Failed to establish WebSocket connection: ${err.message}`));
268
+ });
269
+ }
270
+ if (this.mode === 'polling' || this.mode === 'hybrid') {
271
+ this.startPolling(orderId);
272
+ }
273
+ this.emit('watch_started', orderId);
274
+ }
275
+ /**
276
+ * Stop watching an order
277
+ */
278
+ unwatchOrder(orderId) {
279
+ const watched = this.watchedOrders.get(orderId);
280
+ if (!watched)
281
+ return;
282
+ // Stop polling if active
283
+ if (watched.pollingIntervalId) {
284
+ clearInterval(watched.pollingIntervalId);
285
+ }
286
+ this.watchedOrders.delete(orderId);
287
+ this.emit('watch_stopped', orderId);
288
+ }
289
+ /**
290
+ * Get all watched orders
291
+ */
292
+ getWatchedOrders() {
293
+ return Array.from(this.watchedOrders.values()).map((w) => w.order);
294
+ }
295
+ /**
296
+ * Get watched order by ID
297
+ */
298
+ getWatchedOrder(orderId) {
299
+ return this.watchedOrders.get(orderId)?.order;
300
+ }
301
+ // ============================================================================
302
+ // Private - Order Validation (Polymarket-specific)
303
+ // ============================================================================
304
+ /**
305
+ * Validate order parameters before submission
306
+ * All checks here are Polymarket-specific
307
+ */
308
+ async validateOrder(params) {
309
+ // 1. Tick size validation (Polymarket: 0.01)
310
+ // Use integer math to avoid floating point precision issues
311
+ const priceInCents = Math.round(params.price * 100);
312
+ const epsilon = 0.001; // Tolerance for floating point errors
313
+ if (Math.abs(priceInCents - params.price * 100) > epsilon) {
314
+ throw new PolymarketError(ErrorCode.ORDER_REJECTED, `Price must be multiple of 0.01 tick size (got ${params.price})`);
315
+ }
316
+ // 2. Minimum size validation (Polymarket: 5 shares)
317
+ if (params.size < 5) {
318
+ throw new PolymarketError(ErrorCode.ORDER_REJECTED, `Size must be at least 5 shares (got ${params.size})`);
319
+ }
320
+ // 3. Minimum value validation (Polymarket: $1)
321
+ const orderValue = params.price * params.size;
322
+ if (orderValue < 1) {
323
+ throw new PolymarketError(ErrorCode.ORDER_REJECTED, `Order value must be at least $1 (got $${orderValue.toFixed(2)})`);
324
+ }
325
+ // Note: Balance and market state checks would require additional service dependencies
326
+ // For now, we rely on TradingService validation
327
+ }
328
+ // ============================================================================
329
+ // Private - WebSocket Monitoring (Polymarket-specific)
330
+ // ============================================================================
331
+ /**
332
+ * Ensure WebSocket connection is established
333
+ * Lazy initialization of RealtimeService
334
+ */
335
+ async ensureWebSocketConnected() {
336
+ if (this.realtimeService)
337
+ return;
338
+ // Import and initialize RealtimeServiceV2
339
+ // (We use dynamic import to avoid circular dependencies)
340
+ const { RealtimeServiceV2 } = await import('./realtime-service-v2.js');
341
+ this.realtimeService = new RealtimeServiceV2({ autoReconnect: true });
342
+ // Connect to WebSocket
343
+ if (this.realtimeService) {
344
+ this.realtimeService.connect();
345
+ }
346
+ // Subscribe to user events (requires credentials)
347
+ const credentials = this.tradingService.getCredentials();
348
+ if (credentials && this.realtimeService) {
349
+ this.realtimeService.subscribeUserEvents(credentials, {
350
+ onOrder: this.handleUserOrder.bind(this),
351
+ onTrade: this.handleUserTrade.bind(this),
352
+ });
353
+ }
354
+ }
355
+ /**
356
+ * Handle USER_ORDER WebSocket event (Polymarket-specific)
357
+ * Triggered on: PLACEMENT, UPDATE, CANCELLATION
358
+ */
359
+ handleUserOrder(userOrder) {
360
+ const watched = this.watchedOrders.get(userOrder.orderId);
361
+ if (!watched)
362
+ return; // Not watching this order
363
+ // Deduplicate events
364
+ const eventKey = `order_${userOrder.orderId}_${userOrder.timestamp}_${userOrder.eventType}`;
365
+ if (this.processedEvents.has(eventKey))
366
+ return;
367
+ this.processedEvents.add(eventKey);
368
+ // Update order state
369
+ watched.order.price = userOrder.price;
370
+ watched.order.originalSize = userOrder.originalSize;
371
+ watched.order.filledSize = userOrder.matchedSize;
372
+ watched.order.remainingSize = userOrder.originalSize - userOrder.matchedSize;
373
+ // Infer new status
374
+ let newStatus = watched.lastStatus;
375
+ if (userOrder.eventType === 'PLACEMENT') {
376
+ newStatus = OrderStatus.OPEN;
377
+ }
378
+ else if (userOrder.eventType === 'UPDATE') {
379
+ if (userOrder.matchedSize > 0) {
380
+ newStatus =
381
+ userOrder.matchedSize >= userOrder.originalSize
382
+ ? OrderStatus.FILLED
383
+ : OrderStatus.PARTIALLY_FILLED;
384
+ }
385
+ }
386
+ else if (userOrder.eventType === 'CANCELLATION') {
387
+ newStatus = OrderStatus.CANCELLED;
388
+ }
389
+ // Emit status change if changed
390
+ if (newStatus !== watched.lastStatus) {
391
+ this.emitStatusChange(watched, newStatus, 'websocket');
392
+ }
393
+ }
394
+ /**
395
+ * Handle USER_TRADE WebSocket event (Polymarket-specific)
396
+ * Triggered when: MATCHED, MINED, CONFIRMED
397
+ */
398
+ async handleUserTrade(userTrade) {
399
+ const watched = this.watchedOrders.get(userTrade.market);
400
+ if (!watched)
401
+ return;
402
+ // Deduplicate events
403
+ const eventKey = `trade_${userTrade.tradeId}_${userTrade.status}_${userTrade.timestamp}`;
404
+ if (this.processedEvents.has(eventKey))
405
+ return;
406
+ this.processedEvents.add(eventKey);
407
+ // Emit fill event
408
+ const isCompleteFill = watched.order.filledSize + userTrade.size >= watched.order.originalSize;
409
+ const fillEvent = {
410
+ orderId: watched.orderId,
411
+ order: watched.order,
412
+ fill: {
413
+ tradeId: userTrade.tradeId,
414
+ size: userTrade.size,
415
+ price: userTrade.price,
416
+ fee: 0, // Fee info not in UserTrade
417
+ timestamp: userTrade.timestamp,
418
+ transactionHash: userTrade.transactionHash,
419
+ },
420
+ cumulativeFilled: watched.order.filledSize + userTrade.size,
421
+ remainingSize: watched.order.originalSize - (watched.order.filledSize + userTrade.size),
422
+ isCompleteFill,
423
+ };
424
+ if (isCompleteFill) {
425
+ this.emit('order_filled', fillEvent);
426
+ }
427
+ else {
428
+ this.emit('order_partially_filled', fillEvent);
429
+ }
430
+ // If trade has transaction hash, emit transaction event
431
+ if (userTrade.transactionHash) {
432
+ const txEvent = {
433
+ orderId: watched.orderId,
434
+ tradeId: userTrade.tradeId,
435
+ transactionHash: userTrade.transactionHash,
436
+ timestamp: Date.now(),
437
+ };
438
+ this.emit('transaction_submitted', txEvent);
439
+ // Start tracking settlement on Polygon
440
+ if (userTrade.status === 'CONFIRMED') {
441
+ await this.trackSettlement(userTrade.tradeId, userTrade.transactionHash, watched.orderId);
442
+ }
443
+ }
444
+ }
445
+ // ============================================================================
446
+ // Private - Polling Monitoring
447
+ // ============================================================================
448
+ /**
449
+ * Start polling for order status
450
+ * Fallback mechanism when WebSocket is unavailable
451
+ */
452
+ startPolling(orderId) {
453
+ const watched = this.watchedOrders.get(orderId);
454
+ if (!watched || watched.pollingIntervalId)
455
+ return;
456
+ const poll = async () => {
457
+ try {
458
+ const order = await this.tradingService.getOrder(orderId);
459
+ if (order) {
460
+ this.updateWatchedOrder(orderId, order);
461
+ }
462
+ }
463
+ catch (error) {
464
+ this.emit('error', new Error(`Polling error for ${orderId}: ${error}`));
465
+ }
466
+ };
467
+ // Initial poll
468
+ poll();
469
+ // Set up interval
470
+ watched.pollingIntervalId = setInterval(poll, this.config.pollingInterval);
471
+ }
472
+ /**
473
+ * Update watched order from polling result
474
+ * Detects both status changes and fill changes
475
+ */
476
+ updateWatchedOrder(orderId, freshOrder) {
477
+ const watched = this.watchedOrders.get(orderId);
478
+ if (!watched)
479
+ return;
480
+ const oldStatus = watched.lastStatus;
481
+ const oldFilledSize = watched.order.filledSize;
482
+ const newStatus = freshOrder.status;
483
+ const newFilledSize = freshOrder.filledSize;
484
+ // Detect fill changes (size increased)
485
+ // Only emit if this is an actual increase from a previously known state
486
+ if (newFilledSize > oldFilledSize && oldFilledSize >= 0) {
487
+ const fillDelta = newFilledSize - oldFilledSize;
488
+ const isCompleteFill = freshOrder.remainingSize === 0;
489
+ // Deduplicate fill events using fill size as key
490
+ const eventKey = `fill_${orderId}_${newFilledSize}`;
491
+ if (!this.processedEvents.has(eventKey)) {
492
+ this.processedEvents.add(eventKey);
493
+ // Estimate fill price from order price or calculate from avg
494
+ // Note: OpenOrder doesn't have avgFillPrice, so we use order.price as estimate
495
+ const estimatedPrice = freshOrder.price;
496
+ const fillEvent = {
497
+ orderId,
498
+ order: freshOrder,
499
+ fill: {
500
+ tradeId: freshOrder.associateTrades[freshOrder.associateTrades.length - 1] || `polling_${Date.now()}`,
501
+ size: fillDelta,
502
+ price: estimatedPrice,
503
+ fee: 0, // Fee info not available in polling
504
+ timestamp: Date.now(),
505
+ },
506
+ cumulativeFilled: newFilledSize,
507
+ remainingSize: freshOrder.remainingSize,
508
+ isCompleteFill,
509
+ };
510
+ if (isCompleteFill) {
511
+ this.emit('order_filled', fillEvent);
512
+ }
513
+ else {
514
+ this.emit('order_partially_filled', fillEvent);
515
+ }
516
+ }
517
+ }
518
+ // Update order
519
+ watched.order = freshOrder;
520
+ // Emit status change if changed
521
+ // Pass flag to prevent duplicate fill events
522
+ if (newStatus !== oldStatus) {
523
+ this.emitStatusChange(watched, newStatus, 'polling', newFilledSize > oldFilledSize);
524
+ }
525
+ }
526
+ // ============================================================================
527
+ // Private - Status Change Emission
528
+ // ============================================================================
529
+ /**
530
+ * Emit status change event with appropriate specific events
531
+ * @param fillAlreadyEmitted - Set to true if fill event was already emitted (to prevent duplicates)
532
+ */
533
+ emitStatusChange(watched, newStatus, source, fillAlreadyEmitted = false) {
534
+ const oldStatus = watched.lastStatus;
535
+ // Validate transition
536
+ if (!isValidStatusTransition(oldStatus, newStatus)) {
537
+ this.emit('error', new Error(`Invalid status transition: ${oldStatus} → ${newStatus} for ${watched.orderId}`));
538
+ return;
539
+ }
540
+ // Update status
541
+ watched.lastStatus = newStatus;
542
+ watched.order.status = newStatus;
543
+ watched.order.updatedAt = Date.now();
544
+ // Emit generic status_change event
545
+ const changeEvent = {
546
+ orderId: watched.orderId,
547
+ from: oldStatus,
548
+ to: newStatus,
549
+ order: watched.order,
550
+ timestamp: Date.now(),
551
+ reason: source,
552
+ };
553
+ this.emit('status_change', changeEvent);
554
+ // Emit specific events
555
+ if (newStatus === OrderStatus.OPEN) {
556
+ this.emit('order_opened', watched.order);
557
+ }
558
+ else if (newStatus === OrderStatus.FILLED && !fillAlreadyEmitted) {
559
+ // Only emit fill event if not already emitted (from polling fill detection)
560
+ this.emit('order_filled', {
561
+ orderId: watched.orderId,
562
+ order: watched.order,
563
+ fill: {
564
+ tradeId: watched.order.associateTrades[watched.order.associateTrades.length - 1] || '',
565
+ size: watched.order.filledSize,
566
+ price: watched.order.price,
567
+ fee: 0,
568
+ timestamp: Date.now(),
569
+ },
570
+ cumulativeFilled: watched.order.filledSize,
571
+ remainingSize: 0,
572
+ isCompleteFill: true,
573
+ });
574
+ }
575
+ else if (newStatus === OrderStatus.CANCELLED) {
576
+ const cancelEvent = {
577
+ orderId: watched.orderId,
578
+ order: watched.order,
579
+ filledSize: watched.order.filledSize,
580
+ cancelledSize: watched.order.remainingSize,
581
+ reason: 'user',
582
+ timestamp: Date.now(),
583
+ };
584
+ this.emit('order_cancelled', cancelEvent);
585
+ }
586
+ else if (newStatus === OrderStatus.EXPIRED) {
587
+ const expireEvent = {
588
+ orderId: watched.orderId,
589
+ order: watched.order,
590
+ filledSize: watched.order.filledSize,
591
+ expiredSize: watched.order.remainingSize,
592
+ expirationTime: watched.order.expiration || 0,
593
+ timestamp: Date.now(),
594
+ };
595
+ this.emit('order_expired', expireEvent);
596
+ }
597
+ // Auto-unwatch terminal states
598
+ if (isTerminalStatus(newStatus)) {
599
+ this.unwatchOrder(watched.orderId);
600
+ }
601
+ }
602
+ // ============================================================================
603
+ // Private - Chain Settlement Tracking (Polymarket-specific)
604
+ // ============================================================================
605
+ /**
606
+ * Track transaction settlement on Polygon blockchain
607
+ * Waits for on-chain confirmation and emits transaction_confirmed event
608
+ */
609
+ async trackSettlement(tradeId, transactionHash, orderId) {
610
+ if (!this.polygonProvider) {
611
+ return; // No provider configured
612
+ }
613
+ try {
614
+ // Wait for 1 confirmation
615
+ const receipt = await this.polygonProvider.waitForTransaction(transactionHash, 1);
616
+ if (receipt) {
617
+ const settlementEvent = {
618
+ orderId,
619
+ tradeId,
620
+ transactionHash,
621
+ blockNumber: receipt.blockNumber,
622
+ gasUsed: receipt.gasUsed.toString(),
623
+ timestamp: Date.now(),
624
+ };
625
+ this.emit('transaction_confirmed', settlementEvent);
626
+ }
627
+ }
628
+ catch (error) {
629
+ this.emit('error', new Error(`Settlement tracking failed for ${transactionHash}: ${error}`));
630
+ }
631
+ }
632
+ // ============================================================================
633
+ // Private - Utilities
634
+ // ============================================================================
635
+ ensureInitialized() {
636
+ if (!this.initialized) {
637
+ throw new PolymarketError(ErrorCode.ORDER_FAILED, 'OrderManager not initialized. Call start() first.');
638
+ }
639
+ }
640
+ }
641
+ //# sourceMappingURL=order-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"order-manager.js","sourceRoot":"","sources":["../../../src/services/order-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * OrderManager Unit Tests
3
+ *
4
+ * Focus: Fill event generation in polling mode
5
+ * Issue #7: Polling mode doesn't emit fill events, only status changes
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=order-manager.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"order-manager.test.d.ts","sourceRoot":"","sources":["../../../src/services/order-manager.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}