@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.
- package/dist/src/core/order-status.d.ts +159 -0
- package/dist/src/core/order-status.d.ts.map +1 -0
- package/dist/src/core/order-status.js +254 -0
- package/dist/src/core/order-status.js.map +1 -0
- package/dist/src/core/types.d.ts +124 -0
- package/dist/src/core/types.d.ts.map +1 -1
- package/dist/src/core/types.js +120 -0
- package/dist/src/core/types.js.map +1 -1
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +6 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/services/ctf-detector.d.ts +215 -0
- package/dist/src/services/ctf-detector.d.ts.map +1 -0
- package/dist/src/services/ctf-detector.js +420 -0
- package/dist/src/services/ctf-detector.js.map +1 -0
- package/dist/src/services/ctf-manager.d.ts +202 -0
- package/dist/src/services/ctf-manager.d.ts.map +1 -0
- package/dist/src/services/ctf-manager.js +542 -0
- package/dist/src/services/ctf-manager.js.map +1 -0
- package/dist/src/services/order-manager.d.ts +281 -0
- package/dist/src/services/order-manager.d.ts.map +1 -0
- package/dist/src/services/order-manager.js +641 -0
- package/dist/src/services/order-manager.js.map +1 -0
- package/dist/src/services/order-manager.test.d.ts +8 -0
- package/dist/src/services/order-manager.test.d.ts.map +1 -0
- package/dist/src/services/order-manager.test.js +477 -0
- package/dist/src/services/order-manager.test.js.map +1 -0
- package/dist/src/services/trading-service.d.ts +89 -1
- package/dist/src/services/trading-service.d.ts.map +1 -1
- package/dist/src/services/trading-service.js +227 -1
- package/dist/src/services/trading-service.js.map +1 -1
- 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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,cAAc,EAAuD,MAAM,sBAAsB,CAAC;AAE3G,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAA0B,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAC5G,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AA8J/D,+EAA+E;AAC/E,8BAA8B;AAC9B,+EAA+E;AAE/E,MAAM,OAAO,YAAa,SAAQ,YAAY;IAC5C,wDAAwD;IAChD,cAAc,CAAiB;IAC/B,eAAe,GAA6B,IAAI,CAAC;IACjD,eAAe,GAAqC,IAAI,CAAC;IAEjE,sCAAsC;IAC9B,MAAM,CAA+B;IACrC,WAAW,GAAG,KAAK,CAAC;IAE5B,yCAAyC;IACjC,aAAa,GAA8B,IAAI,GAAG,EAAE,CAAC;IACrD,eAAe,GAAgB,IAAI,GAAG,EAAE,CAAC;IACzC,IAAI,CAAqC;IAEjD,oEAAoE;IAC5D,WAAW,GAAgC,IAAI,GAAG,EAAE,CAAC;IAE7D,YAAY,MAA0B;QACpC,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,MAAM,GAAG;YACZ,GAAG,MAAM;YACT,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,GAAG;YAC9B,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,QAAQ;YAC7B,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,IAAI;YAC/C,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,yBAAyB;SACjE,CAAC;QAEF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QAE7B,uDAAuD;QACvD,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,IAAI,WAAW,EAAE,CAAC;QAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,kBAAkB,EAAE,CAAC;QAEnD,4CAA4C;QAC5C,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CACtC,WAAW,EACX,KAAK,EACL;YACE,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;SAC7B,CACF,CAAC;IACJ,CAAC;IAED,+EAA+E;IAC/E,uBAAuB;IACvB,+EAA+E;IAE/E;;;;;OAKG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAE7B,4BAA4B;QAC5B,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC;QAEvC,sDAAsD;QACtD,+DAA+D;QAC/D,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YAC9B,IAAI,CAAC,eAAe,GAAG,IAAI,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACzF,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACH,IAAI;QACF,mBAAmB;QACnB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC;YAClD,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;gBAC9B,aAAa,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,uBAAuB;QACvB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,CAAC;YAClC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAEzB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;IAED,+EAA+E;IAC/E,gCAAgC;IAChC,+EAA+E;IAE/E;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,WAAW,CACf,MAAwB,EACxB,QAAwB;QAExB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,8CAA8C;QAC9C,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,WAAW,GAAgB;gBAC/B,MAAM;gBACN,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC9D,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC;YACF,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;YAEzC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,WAAW,CAAC,MAAM;aAC7B,CAAC;QACJ,CAAC;QAED,kCAAkC;QAClC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAElE,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACrC,uBAAuB;YACvB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAE1C,2BAA2B;YAC3B,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;gBACzB,EAAE,EAAE,MAAM,CAAC,OAAO;gBAClB,MAAM,EAAE,WAAW,CAAC,OAAO;gBAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,YAAY,EAAE,MAAM,CAAC,IAAI;gBACzB,UAAU,EAAE,CAAC;gBACb,aAAa,EAAE,MAAM,CAAC,IAAI;gBAC1B,eAAe,EAAE,EAAE;gBACnB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACb,CAAC,CAAC;QACd,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,OAAe;QAC/B,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAE9D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,8CAA8C;YAC9C,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ,CAAC,OAAe;QAC5B,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,iBAAiB,CACrB,MAA0B,EAC1B,QAAwB;QAExB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAEnE,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtC,gCAAgC;YAChC,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACtC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,+EAA+E;IAC/E,gCAAgC;IAChC,+EAA+E;IAE/E;;;;;;OAMG;IACH,UAAU,CAAC,OAAe,EAAE,QAAwB;QAClD,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,mBAAmB;QAC7B,CAAC;QAED,+BAA+B;QAC/B,MAAM,OAAO,GAAiB;YAC5B,OAAO;YACP,KAAK,EAAE;gBACL,EAAE,EAAE,OAAO;gBACX,MAAM,EAAE,WAAW,CAAC,OAAO;gBAC3B,OAAO,EAAE,EAAE;gBACX,IAAI,EAAE,KAAK;gBACX,KAAK,EAAE,CAAC;gBACR,YAAY,EAAE,CAAC;gBACf,UAAU,EAAE,CAAC;gBACb,aAAa,EAAE,CAAC;gBAChB,eAAe,EAAE,EAAE;gBACnB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB;YACD,QAAQ;YACR,UAAU,EAAE,WAAW,CAAC,OAAO;SAChC,CAAC;QAEF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEzC,iCAAiC;QACjC,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACxD,6DAA6D;YAC7D,IAAI,CAAC,wBAAwB,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;gBAC1C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,CAAC,6CAA6C,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC5F,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtD,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,OAAe;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,yBAAyB;QACzB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;YAC9B,aAAa,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACrE,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,OAAe;QAC7B,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC;IAChD,CAAC;IAED,+EAA+E;IAC/E,mDAAmD;IACnD,+EAA+E;IAE/E;;;OAGG;IACK,KAAK,CAAC,aAAa,CAAC,MAAwB;QAClD,6CAA6C;QAC7C,4DAA4D;QAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,sCAAsC;QAC7D,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,OAAO,EAAE,CAAC;YAC1D,MAAM,IAAI,eAAe,CACvB,SAAS,CAAC,cAAc,EACxB,iDAAiD,MAAM,CAAC,KAAK,GAAG,CACjE,CAAC;QACJ,CAAC;QAED,oDAAoD;QACpD,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,eAAe,CACvB,SAAS,CAAC,cAAc,EACxB,uCAAuC,MAAM,CAAC,IAAI,GAAG,CACtD,CAAC;QACJ,CAAC;QAED,+CAA+C;QAC/C,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;QAC9C,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACnB,MAAM,IAAI,eAAe,CACvB,SAAS,CAAC,cAAc,EACxB,yCAAyC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAClE,CAAC;QACJ,CAAC;QAED,sFAAsF;QACtF,gDAAgD;IAClD,CAAC;IAED,+EAA+E;IAC/E,uDAAuD;IACvD,+EAA+E;IAE/E;;;OAGG;IACK,KAAK,CAAC,wBAAwB;QACpC,IAAI,IAAI,CAAC,eAAe;YAAE,OAAO;QAEjC,0CAA0C;QAC1C,yDAAyD;QACzD,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;QACvE,IAAI,CAAC,eAAe,GAAG,IAAI,iBAAiB,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtE,uBAAuB;QACvB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;QACjC,CAAC;QAED,kDAAkD;QAClD,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;QACzD,IAAI,WAAW,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACxC,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAAC,WAAW,EAAE;gBACpD,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;gBACxC,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;aACzC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,eAAe,CAAC,SAAoB;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC1D,IAAI,CAAC,OAAO;YAAE,OAAO,CAAC,0BAA0B;QAEhD,qBAAqB;QACrB,MAAM,QAAQ,GAAG,SAAS,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;QAC5F,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO;QAC/C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEnC,qBAAqB;QACrB,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;QACtC,OAAO,CAAC,KAAK,CAAC,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC;QACpD,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC,WAAW,CAAC;QACjD,OAAO,CAAC,KAAK,CAAC,aAAa,GAAG,SAAS,CAAC,YAAY,GAAG,SAAS,CAAC,WAAW,CAAC;QAE7E,mBAAmB;QACnB,IAAI,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;QAEnC,IAAI,SAAS,CAAC,SAAS,KAAK,WAAW,EAAE,CAAC;YACxC,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC;QAC/B,CAAC;aAAM,IAAI,SAAS,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC5C,IAAI,SAAS,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;gBAC9B,SAAS;oBACP,SAAS,CAAC,WAAW,IAAI,SAAS,CAAC,YAAY;wBAC7C,CAAC,CAAC,WAAW,CAAC,MAAM;wBACpB,CAAC,CAAC,WAAW,CAAC,gBAAgB,CAAC;YACrC,CAAC;QACH,CAAC;aAAM,IAAI,SAAS,CAAC,SAAS,KAAK,cAAc,EAAE,CAAC;YAClD,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC;QACpC,CAAC;QAED,gCAAgC;QAChC,IAAI,SAAS,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC;YACrC,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,eAAe,CAAC,SAAoB;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,qBAAqB;QACrB,MAAM,QAAQ,GAAG,SAAS,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;QACzF,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO;QAC/C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEnC,kBAAkB;QAClB,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC;QAE/F,MAAM,SAAS,GAAc;YAC3B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,IAAI,EAAE;gBACJ,OAAO,EAAE,SAAS,CAAC,OAAO;gBAC1B,IAAI,EAAE,SAAS,CAAC,IAAI;gBACpB,KAAK,EAAE,SAAS,CAAC,KAAK;gBACtB,GAAG,EAAE,CAAC,EAAE,4BAA4B;gBACpC,SAAS,EAAE,SAAS,CAAC,SAAS;gBAC9B,eAAe,EAAE,SAAS,CAAC,eAAe;aAC3C;YACD,gBAAgB,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC,IAAI;YAC3D,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC;YACvF,cAAc;SACf,CAAC;QAEF,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAC;QACjD,CAAC;QAED,wDAAwD;QACxD,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAqB;gBAChC,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,OAAO,EAAE,SAAS,CAAC,OAAO;gBAC1B,eAAe,EAAE,SAAS,CAAC,eAAe;gBAC1C,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC;YACF,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC;YAE5C,uCAAuC;YACvC,IAAI,SAAS,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBACrC,MAAM,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,eAAe,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YAC5F,CAAC;QACH,CAAC;IACH,CAAC;IAED,+EAA+E;IAC/E,+BAA+B;IAC/B,+EAA+E;IAE/E;;;OAGG;IACK,YAAY,CAAC,OAAe;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,iBAAiB;YAAE,OAAO;QAElD,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;YACtB,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC1D,IAAI,KAAK,EAAE,CAAC;oBACV,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBAC1C,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,CAAC,qBAAqB,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC,CAAC;QAEF,eAAe;QACf,IAAI,EAAE,CAAC;QAEP,kBAAkB;QAClB,OAAO,CAAC,iBAAiB,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAC7E,CAAC;IAED;;;OAGG;IACK,kBAAkB,CAAC,OAAe,EAAE,UAAiB;QAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC;QAC/C,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC;QACpC,MAAM,aAAa,GAAG,UAAU,CAAC,UAAU,CAAC;QAE5C,uCAAuC;QACvC,wEAAwE;QACxE,IAAI,aAAa,GAAG,aAAa,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;YACxD,MAAM,SAAS,GAAG,aAAa,GAAG,aAAa,CAAC;YAChD,MAAM,cAAc,GAAG,UAAU,CAAC,aAAa,KAAK,CAAC,CAAC;YAEtD,iDAAiD;YACjD,MAAM,QAAQ,GAAG,QAAQ,OAAO,IAAI,aAAa,EAAE,CAAC;YACpD,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACxC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAEnC,6DAA6D;gBAC7D,+EAA+E;gBAC/E,MAAM,cAAc,GAAG,UAAU,CAAC,KAAK,CAAC;gBAExC,MAAM,SAAS,GAAc;oBAC3B,OAAO;oBACP,KAAK,EAAE,UAAU;oBACjB,IAAI,EAAE;wBACJ,OAAO,EAAE,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,WAAW,IAAI,CAAC,GAAG,EAAE,EAAE;wBACrG,IAAI,EAAE,SAAS;wBACf,KAAK,EAAE,cAAc;wBACrB,GAAG,EAAE,CAAC,EAAE,oCAAoC;wBAC5C,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;qBACtB;oBACD,gBAAgB,EAAE,aAAa;oBAC/B,aAAa,EAAE,UAAU,CAAC,aAAa;oBACvC,cAAc;iBACf,CAAC;gBAEF,IAAI,cAAc,EAAE,CAAC;oBACnB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;gBACvC,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC;QACH,CAAC;QAED,eAAe;QACf,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC;QAE3B,gCAAgC;QAChC,6CAA6C;QAC7C,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,GAAG,aAAa,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IAED,+EAA+E;IAC/E,mCAAmC;IACnC,+EAA+E;IAE/E;;;OAGG;IACK,gBAAgB,CACtB,OAAqB,EACrB,SAAsB,EACtB,MAA+B,EAC/B,kBAAkB,GAAG,KAAK;QAE1B,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;QAErC,sBAAsB;QACtB,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC,IAAI,CACP,OAAO,EACP,IAAI,KAAK,CAAC,8BAA8B,SAAS,MAAM,SAAS,QAAQ,OAAO,CAAC,OAAO,EAAE,CAAC,CAC3F,CAAC;YACF,OAAO;QACT,CAAC;QAED,gBAAgB;QAChB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAErC,mCAAmC;QACnC,MAAM,WAAW,GAA2B;YAC1C,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,IAAI,EAAE,SAAS;YACf,EAAE,EAAE,SAAS;YACb,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,MAAM,EAAE,MAAM;SACf,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;QAExC,uBAAuB;QACvB,IAAI,SAAS,KAAK,WAAW,CAAC,IAAI,EAAE,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;aAAM,IAAI,SAAS,KAAK,WAAW,CAAC,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACnE,4EAA4E;YAC5E,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;gBACxB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,IAAI,EAAE;oBACJ,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE;oBACtF,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU;oBAC9B,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK;oBAC1B,GAAG,EAAE,CAAC;oBACN,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;iBACtB;gBACD,gBAAgB,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU;gBAC1C,aAAa,EAAE,CAAC;gBAChB,cAAc,EAAE,IAAI;aACR,CAAC,CAAC;QAClB,CAAC;aAAM,IAAI,SAAS,KAAK,WAAW,CAAC,SAAS,EAAE,CAAC;YAC/C,MAAM,WAAW,GAAgB;gBAC/B,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU;gBACpC,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,aAAa;gBAC1C,MAAM,EAAE,MAAM;gBACd,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC;YACF,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;QAC5C,CAAC;aAAM,IAAI,SAAS,KAAK,WAAW,CAAC,OAAO,EAAE,CAAC;YAC7C,MAAM,WAAW,GAAgB;gBAC/B,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU;gBACpC,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,aAAa;gBACxC,cAAc,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC;gBAC7C,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC;YACF,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;QAC1C,CAAC;QAED,+BAA+B;QAC/B,IAAI,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,+EAA+E;IAC/E,4DAA4D;IAC5D,+EAA+E;IAE/E;;;OAGG;IACK,KAAK,CAAC,eAAe,CAC3B,OAAe,EACf,eAAuB,EACvB,OAAe;QAEf,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,OAAO,CAAC,yBAAyB;QACnC,CAAC;QAED,IAAI,CAAC;YACH,0BAA0B;YAC1B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;YAElF,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,eAAe,GAAoB;oBACvC,OAAO;oBACP,OAAO;oBACP,eAAe;oBACf,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE;oBACnC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;iBACtB,CAAC;gBAEF,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,eAAe,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CACP,OAAO,EACP,IAAI,KAAK,CAAC,kCAAkC,eAAe,KAAK,KAAK,EAAE,CAAC,CACzE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,+EAA+E;IAC/E,sBAAsB;IACtB,+EAA+E;IAEvE,iBAAiB;QACvB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,eAAe,CACvB,SAAS,CAAC,YAAY,EACtB,mDAAmD,CACpD,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"order-manager.test.d.ts","sourceRoot":"","sources":["../../../src/services/order-manager.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|