@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,281 @@
|
|
|
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 { type LimitOrderParams, type Order, type OrderResult } from './trading-service.js';
|
|
50
|
+
import { RateLimiter } from '../core/rate-limiter.js';
|
|
51
|
+
import type { UnifiedCache } from '../core/unified-cache.js';
|
|
52
|
+
import { OrderStatus } from '../core/types.js';
|
|
53
|
+
export interface OrderManagerConfig {
|
|
54
|
+
/** Private key for signing transactions */
|
|
55
|
+
privateKey: string;
|
|
56
|
+
/** Rate limiter for API calls */
|
|
57
|
+
rateLimiter: RateLimiter;
|
|
58
|
+
/** Cache for market metadata */
|
|
59
|
+
cache: UnifiedCache;
|
|
60
|
+
/** Chain ID (default: 137 Polygon mainnet) */
|
|
61
|
+
chainId?: number;
|
|
62
|
+
/** Detection mode for order status tracking */
|
|
63
|
+
mode?: 'websocket' | 'polling' | 'hybrid';
|
|
64
|
+
/** Polling interval in ms (default: 5000) */
|
|
65
|
+
pollingInterval?: number;
|
|
66
|
+
/** RPC URL for Polygon provider (for settlement tracking) */
|
|
67
|
+
polygonRpcUrl?: string;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Optional metadata for order tracking
|
|
71
|
+
* Can be used by strategies to attach context
|
|
72
|
+
*/
|
|
73
|
+
export interface OrderMetadata {
|
|
74
|
+
strategyId?: string;
|
|
75
|
+
marketSlug?: string;
|
|
76
|
+
notes?: string;
|
|
77
|
+
[key: string]: unknown;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Order status change event
|
|
81
|
+
* Emitted whenever an order transitions between states
|
|
82
|
+
*/
|
|
83
|
+
export interface OrderStatusChangeEvent {
|
|
84
|
+
orderId: string;
|
|
85
|
+
from: OrderStatus;
|
|
86
|
+
to: OrderStatus;
|
|
87
|
+
order: Order;
|
|
88
|
+
timestamp: number;
|
|
89
|
+
reason?: string;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Fill event
|
|
93
|
+
* Emitted when an order receives a fill (partial or complete)
|
|
94
|
+
*/
|
|
95
|
+
export interface FillEvent {
|
|
96
|
+
orderId: string;
|
|
97
|
+
order: Order;
|
|
98
|
+
fill: {
|
|
99
|
+
tradeId: string;
|
|
100
|
+
size: number;
|
|
101
|
+
price: number;
|
|
102
|
+
fee: number;
|
|
103
|
+
timestamp: number;
|
|
104
|
+
transactionHash?: string;
|
|
105
|
+
};
|
|
106
|
+
cumulativeFilled: number;
|
|
107
|
+
remainingSize: number;
|
|
108
|
+
isCompleteFill: boolean;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Transaction submitted event (Polymarket-specific)
|
|
112
|
+
* Emitted when a trade has a transaction hash
|
|
113
|
+
*/
|
|
114
|
+
export interface TransactionEvent {
|
|
115
|
+
orderId: string;
|
|
116
|
+
tradeId: string;
|
|
117
|
+
transactionHash: string;
|
|
118
|
+
timestamp: number;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* On-chain settlement event (Polymarket-specific)
|
|
122
|
+
* Emitted when transaction is confirmed on Polygon
|
|
123
|
+
*/
|
|
124
|
+
export interface SettlementEvent {
|
|
125
|
+
orderId: string;
|
|
126
|
+
tradeId: string;
|
|
127
|
+
transactionHash: string;
|
|
128
|
+
blockNumber: number;
|
|
129
|
+
gasUsed: string;
|
|
130
|
+
timestamp: number;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Cancellation event
|
|
134
|
+
*/
|
|
135
|
+
export interface CancelEvent {
|
|
136
|
+
orderId: string;
|
|
137
|
+
order: Order;
|
|
138
|
+
filledSize: number;
|
|
139
|
+
cancelledSize: number;
|
|
140
|
+
reason: 'user' | 'system';
|
|
141
|
+
timestamp: number;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Expiration event (for GTD orders)
|
|
145
|
+
*/
|
|
146
|
+
export interface ExpireEvent {
|
|
147
|
+
orderId: string;
|
|
148
|
+
order: Order;
|
|
149
|
+
filledSize: number;
|
|
150
|
+
expiredSize: number;
|
|
151
|
+
expirationTime: number;
|
|
152
|
+
timestamp: number;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Rejection event (order failed validation)
|
|
156
|
+
*/
|
|
157
|
+
export interface RejectEvent {
|
|
158
|
+
orderId?: string;
|
|
159
|
+
params: LimitOrderParams;
|
|
160
|
+
reason: string;
|
|
161
|
+
timestamp: number;
|
|
162
|
+
}
|
|
163
|
+
export declare class OrderManager extends EventEmitter {
|
|
164
|
+
private tradingService;
|
|
165
|
+
private realtimeService;
|
|
166
|
+
private polygonProvider;
|
|
167
|
+
private config;
|
|
168
|
+
private initialized;
|
|
169
|
+
private watchedOrders;
|
|
170
|
+
private processedEvents;
|
|
171
|
+
private mode;
|
|
172
|
+
private marketCache;
|
|
173
|
+
constructor(config: OrderManagerConfig);
|
|
174
|
+
/**
|
|
175
|
+
* Initialize OrderManager
|
|
176
|
+
* - Initializes TradingService
|
|
177
|
+
* - Optionally initializes RealtimeService (for WebSocket mode)
|
|
178
|
+
* - Optionally initializes Polygon provider (for settlement tracking)
|
|
179
|
+
*/
|
|
180
|
+
start(): Promise<void>;
|
|
181
|
+
/**
|
|
182
|
+
* Stop OrderManager
|
|
183
|
+
* - Unwatch all orders
|
|
184
|
+
* - Disconnect WebSocket (if connected)
|
|
185
|
+
*/
|
|
186
|
+
stop(): void;
|
|
187
|
+
/**
|
|
188
|
+
* Create and submit a limit order
|
|
189
|
+
*
|
|
190
|
+
* Auto-validates (Polymarket-specific):
|
|
191
|
+
* - Market state (active, not closed)
|
|
192
|
+
* - USDC.e balance
|
|
193
|
+
* - Tick size (0.01)
|
|
194
|
+
* - Minimum size (5 shares)
|
|
195
|
+
* - Minimum value ($1)
|
|
196
|
+
*
|
|
197
|
+
* Auto-watches: Starts monitoring immediately after creation
|
|
198
|
+
*
|
|
199
|
+
* @param params Order parameters
|
|
200
|
+
* @param metadata Optional metadata for tracking
|
|
201
|
+
* @returns Order result with orderId or error
|
|
202
|
+
*/
|
|
203
|
+
createOrder(params: LimitOrderParams, metadata?: OrderMetadata): Promise<OrderResult>;
|
|
204
|
+
/**
|
|
205
|
+
* Cancel an order
|
|
206
|
+
* Auto-unwatches after cancellation
|
|
207
|
+
*/
|
|
208
|
+
cancelOrder(orderId: string): Promise<OrderResult>;
|
|
209
|
+
/**
|
|
210
|
+
* Get order details
|
|
211
|
+
* Fetches from TradingService (CLOB API)
|
|
212
|
+
*/
|
|
213
|
+
getOrder(orderId: string): Promise<Order | null>;
|
|
214
|
+
/**
|
|
215
|
+
* Create multiple orders in batch
|
|
216
|
+
* Auto-watches all successfully created orders
|
|
217
|
+
*/
|
|
218
|
+
createBatchOrders(orders: LimitOrderParams[], metadata?: OrderMetadata): Promise<OrderResult>;
|
|
219
|
+
/**
|
|
220
|
+
* Manually watch an order
|
|
221
|
+
* Used for monitoring externally-created orders
|
|
222
|
+
*
|
|
223
|
+
* @param orderId Order ID to watch
|
|
224
|
+
* @param metadata Optional metadata
|
|
225
|
+
*/
|
|
226
|
+
watchOrder(orderId: string, metadata?: OrderMetadata): void;
|
|
227
|
+
/**
|
|
228
|
+
* Stop watching an order
|
|
229
|
+
*/
|
|
230
|
+
unwatchOrder(orderId: string): void;
|
|
231
|
+
/**
|
|
232
|
+
* Get all watched orders
|
|
233
|
+
*/
|
|
234
|
+
getWatchedOrders(): Order[];
|
|
235
|
+
/**
|
|
236
|
+
* Get watched order by ID
|
|
237
|
+
*/
|
|
238
|
+
getWatchedOrder(orderId: string): Order | undefined;
|
|
239
|
+
/**
|
|
240
|
+
* Validate order parameters before submission
|
|
241
|
+
* All checks here are Polymarket-specific
|
|
242
|
+
*/
|
|
243
|
+
private validateOrder;
|
|
244
|
+
/**
|
|
245
|
+
* Ensure WebSocket connection is established
|
|
246
|
+
* Lazy initialization of RealtimeService
|
|
247
|
+
*/
|
|
248
|
+
private ensureWebSocketConnected;
|
|
249
|
+
/**
|
|
250
|
+
* Handle USER_ORDER WebSocket event (Polymarket-specific)
|
|
251
|
+
* Triggered on: PLACEMENT, UPDATE, CANCELLATION
|
|
252
|
+
*/
|
|
253
|
+
private handleUserOrder;
|
|
254
|
+
/**
|
|
255
|
+
* Handle USER_TRADE WebSocket event (Polymarket-specific)
|
|
256
|
+
* Triggered when: MATCHED, MINED, CONFIRMED
|
|
257
|
+
*/
|
|
258
|
+
private handleUserTrade;
|
|
259
|
+
/**
|
|
260
|
+
* Start polling for order status
|
|
261
|
+
* Fallback mechanism when WebSocket is unavailable
|
|
262
|
+
*/
|
|
263
|
+
private startPolling;
|
|
264
|
+
/**
|
|
265
|
+
* Update watched order from polling result
|
|
266
|
+
* Detects both status changes and fill changes
|
|
267
|
+
*/
|
|
268
|
+
private updateWatchedOrder;
|
|
269
|
+
/**
|
|
270
|
+
* Emit status change event with appropriate specific events
|
|
271
|
+
* @param fillAlreadyEmitted - Set to true if fill event was already emitted (to prevent duplicates)
|
|
272
|
+
*/
|
|
273
|
+
private emitStatusChange;
|
|
274
|
+
/**
|
|
275
|
+
* Track transaction settlement on Polygon blockchain
|
|
276
|
+
* Waits for on-chain confirmation and emits transaction_confirmed event
|
|
277
|
+
*/
|
|
278
|
+
private trackSettlement;
|
|
279
|
+
private ensureInitialized;
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=order-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"order-manager.d.ts","sourceRoot":"","sources":["../../../src/services/order-manager.ts"],"names":[],"mappings":"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"}
|