@catalyst-team/poly-sdk 0.4.0 → 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 (288) hide show
  1. package/README.md +8 -1
  2. package/README.zh-CN.md +2 -0
  3. package/dist/src/__tests__/integration/data-api.integration.test.js +21 -18
  4. package/dist/src/__tests__/integration/data-api.integration.test.js.map +1 -1
  5. package/dist/src/catalyst/catalyst-query-service.d.ts +109 -0
  6. package/dist/src/catalyst/catalyst-query-service.d.ts.map +1 -0
  7. package/dist/src/catalyst/catalyst-query-service.js +141 -0
  8. package/dist/src/catalyst/catalyst-query-service.js.map +1 -0
  9. package/dist/src/catalyst/catalyst-realtime-service.d.ts +40 -0
  10. package/dist/src/catalyst/catalyst-realtime-service.d.ts.map +1 -0
  11. package/dist/src/catalyst/catalyst-realtime-service.js +125 -0
  12. package/dist/src/catalyst/catalyst-realtime-service.js.map +1 -0
  13. package/dist/src/catalyst/index.d.ts +4 -0
  14. package/dist/src/catalyst/index.d.ts.map +1 -0
  15. package/dist/src/catalyst/index.js +4 -0
  16. package/dist/src/catalyst/index.js.map +1 -0
  17. package/dist/src/catalyst/types.d.ts +178 -0
  18. package/dist/src/catalyst/types.d.ts.map +1 -0
  19. package/dist/src/catalyst/types.js +2 -0
  20. package/dist/src/catalyst/types.js.map +1 -0
  21. package/dist/src/clients/data-api.d.ts +75 -14
  22. package/dist/src/clients/data-api.d.ts.map +1 -1
  23. package/dist/src/clients/data-api.js +40 -18
  24. package/dist/src/clients/data-api.js.map +1 -1
  25. package/dist/src/clients/gamma-api.d.ts +54 -0
  26. package/dist/src/clients/gamma-api.d.ts.map +1 -1
  27. package/dist/src/clients/gamma-api.js.map +1 -1
  28. package/dist/src/core/order-status.d.ts +159 -0
  29. package/dist/src/core/order-status.d.ts.map +1 -0
  30. package/dist/src/core/order-status.js +254 -0
  31. package/dist/src/core/order-status.js.map +1 -0
  32. package/dist/src/core/types.d.ts +124 -0
  33. package/dist/src/core/types.d.ts.map +1 -1
  34. package/dist/src/core/types.js +120 -0
  35. package/dist/src/core/types.js.map +1 -1
  36. package/dist/src/index.d.ts +20 -4
  37. package/dist/src/index.d.ts.map +1 -1
  38. package/dist/src/index.js +28 -2
  39. package/dist/src/index.js.map +1 -1
  40. package/dist/src/insider-scan/index.d.ts +3 -0
  41. package/dist/src/insider-scan/index.d.ts.map +1 -0
  42. package/dist/src/insider-scan/index.js +3 -0
  43. package/dist/src/insider-scan/index.js.map +1 -0
  44. package/dist/src/insider-scan/insider-scan-service.d.ts +63 -0
  45. package/dist/src/insider-scan/insider-scan-service.d.ts.map +1 -0
  46. package/dist/src/insider-scan/insider-scan-service.js +153 -0
  47. package/dist/src/insider-scan/insider-scan-service.js.map +1 -0
  48. package/dist/src/insider-scan/types.d.ts +205 -0
  49. package/dist/src/insider-scan/types.d.ts.map +1 -0
  50. package/dist/src/insider-scan/types.js +7 -0
  51. package/dist/src/insider-scan/types.js.map +1 -0
  52. package/dist/src/services/ctf-detector.d.ts +215 -0
  53. package/dist/src/services/ctf-detector.d.ts.map +1 -0
  54. package/dist/src/services/ctf-detector.js +420 -0
  55. package/dist/src/services/ctf-detector.js.map +1 -0
  56. package/dist/src/services/ctf-manager.d.ts +202 -0
  57. package/dist/src/services/ctf-manager.d.ts.map +1 -0
  58. package/dist/src/services/ctf-manager.js +542 -0
  59. package/dist/src/services/ctf-manager.js.map +1 -0
  60. package/dist/src/services/market-service.d.ts +61 -0
  61. package/dist/src/services/market-service.d.ts.map +1 -1
  62. package/dist/src/services/market-service.js +58 -0
  63. package/dist/src/services/market-service.js.map +1 -1
  64. package/dist/src/services/onchain-service.d.ts +10 -2
  65. package/dist/src/services/onchain-service.d.ts.map +1 -1
  66. package/dist/src/services/onchain-service.js +8 -0
  67. package/dist/src/services/onchain-service.js.map +1 -1
  68. package/dist/src/services/order-manager.d.ts +281 -0
  69. package/dist/src/services/order-manager.d.ts.map +1 -0
  70. package/dist/src/services/order-manager.js +641 -0
  71. package/dist/src/services/order-manager.js.map +1 -0
  72. package/dist/src/services/order-manager.test.d.ts +8 -0
  73. package/dist/src/services/order-manager.test.d.ts.map +1 -0
  74. package/dist/src/services/order-manager.test.js +477 -0
  75. package/dist/src/services/order-manager.test.js.map +1 -0
  76. package/dist/src/services/smart-money-service.d.ts +420 -3
  77. package/dist/src/services/smart-money-service.d.ts.map +1 -1
  78. package/dist/src/services/smart-money-service.js +869 -3
  79. package/dist/src/services/smart-money-service.js.map +1 -1
  80. package/dist/src/services/trading-service.d.ts +94 -1
  81. package/dist/src/services/trading-service.d.ts.map +1 -1
  82. package/dist/src/services/trading-service.js +232 -1
  83. package/dist/src/services/trading-service.js.map +1 -1
  84. package/dist/src/services/wallet-service.d.ts +38 -2
  85. package/dist/src/services/wallet-service.d.ts.map +1 -1
  86. package/dist/src/services/wallet-service.js +72 -5
  87. package/dist/src/services/wallet-service.js.map +1 -1
  88. package/dist/src/signal/index.d.ts +8 -0
  89. package/dist/src/signal/index.d.ts.map +1 -0
  90. package/dist/src/signal/index.js +7 -0
  91. package/dist/src/signal/index.js.map +1 -0
  92. package/dist/src/signal/signal-service.d.ts +89 -0
  93. package/dist/src/signal/signal-service.d.ts.map +1 -0
  94. package/dist/src/signal/signal-service.js +226 -0
  95. package/dist/src/signal/signal-service.js.map +1 -0
  96. package/dist/src/signal/types.d.ts +280 -0
  97. package/dist/src/signal/types.d.ts.map +1 -0
  98. package/dist/src/signal/types.js +7 -0
  99. package/dist/src/signal/types.js.map +1 -0
  100. package/dist/src/wallet-report/index.d.ts +3 -0
  101. package/dist/src/wallet-report/index.d.ts.map +1 -0
  102. package/dist/src/wallet-report/index.js +3 -0
  103. package/dist/src/wallet-report/index.js.map +1 -0
  104. package/dist/src/wallet-report/types.d.ts +187 -0
  105. package/dist/src/wallet-report/types.d.ts.map +1 -0
  106. package/dist/src/wallet-report/types.js +7 -0
  107. package/dist/src/wallet-report/types.js.map +1 -0
  108. package/dist/src/wallet-report/wallet-report-service.d.ts +91 -0
  109. package/dist/src/wallet-report/wallet-report-service.d.ts.map +1 -0
  110. package/dist/src/wallet-report/wallet-report-service.js +208 -0
  111. package/dist/src/wallet-report/wallet-report-service.js.map +1 -0
  112. package/dist/src/wallets/hot-wallet-service.d.ts +162 -0
  113. package/dist/src/wallets/hot-wallet-service.d.ts.map +1 -0
  114. package/dist/src/wallets/hot-wallet-service.js +251 -0
  115. package/dist/src/wallets/hot-wallet-service.js.map +1 -0
  116. package/dist/src/wallets/index.d.ts +15 -0
  117. package/dist/src/wallets/index.d.ts.map +1 -0
  118. package/dist/src/wallets/index.js +26 -0
  119. package/dist/src/wallets/index.js.map +1 -0
  120. package/package.json +5 -5
  121. package/dist/__tests__/clob-api.test.d.ts +0 -5
  122. package/dist/__tests__/clob-api.test.d.ts.map +0 -1
  123. package/dist/__tests__/clob-api.test.js +0 -240
  124. package/dist/__tests__/clob-api.test.js.map +0 -1
  125. package/dist/__tests__/integration/arbitrage-service.integration.test.d.ts +0 -12
  126. package/dist/__tests__/integration/arbitrage-service.integration.test.d.ts.map +0 -1
  127. package/dist/__tests__/integration/arbitrage-service.integration.test.js +0 -267
  128. package/dist/__tests__/integration/arbitrage-service.integration.test.js.map +0 -1
  129. package/dist/__tests__/integration/bridge-client.integration.test.d.ts +0 -11
  130. package/dist/__tests__/integration/bridge-client.integration.test.d.ts.map +0 -1
  131. package/dist/__tests__/integration/bridge-client.integration.test.js +0 -260
  132. package/dist/__tests__/integration/bridge-client.integration.test.js.map +0 -1
  133. package/dist/__tests__/integration/clob-api.integration.test.d.ts +0 -13
  134. package/dist/__tests__/integration/clob-api.integration.test.d.ts.map +0 -1
  135. package/dist/__tests__/integration/clob-api.integration.test.js +0 -170
  136. package/dist/__tests__/integration/clob-api.integration.test.js.map +0 -1
  137. package/dist/__tests__/integration/ctf-client.integration.test.d.ts +0 -17
  138. package/dist/__tests__/integration/ctf-client.integration.test.d.ts.map +0 -1
  139. package/dist/__tests__/integration/ctf-client.integration.test.js +0 -234
  140. package/dist/__tests__/integration/ctf-client.integration.test.js.map +0 -1
  141. package/dist/__tests__/integration/data-api.integration.test.d.ts +0 -9
  142. package/dist/__tests__/integration/data-api.integration.test.d.ts.map +0 -1
  143. package/dist/__tests__/integration/data-api.integration.test.js +0 -164
  144. package/dist/__tests__/integration/data-api.integration.test.js.map +0 -1
  145. package/dist/__tests__/integration/gamma-api.integration.test.d.ts +0 -9
  146. package/dist/__tests__/integration/gamma-api.integration.test.d.ts.map +0 -1
  147. package/dist/__tests__/integration/gamma-api.integration.test.js +0 -170
  148. package/dist/__tests__/integration/gamma-api.integration.test.js.map +0 -1
  149. package/dist/__tests__/integration/market-service.integration.test.d.ts +0 -10
  150. package/dist/__tests__/integration/market-service.integration.test.d.ts.map +0 -1
  151. package/dist/__tests__/integration/market-service.integration.test.js +0 -173
  152. package/dist/__tests__/integration/market-service.integration.test.js.map +0 -1
  153. package/dist/__tests__/integration/realtime-service-v2.integration.test.d.ts +0 -10
  154. package/dist/__tests__/integration/realtime-service-v2.integration.test.d.ts.map +0 -1
  155. package/dist/__tests__/integration/realtime-service-v2.integration.test.js +0 -307
  156. package/dist/__tests__/integration/realtime-service-v2.integration.test.js.map +0 -1
  157. package/dist/__tests__/integration/trading-service.integration.test.d.ts +0 -10
  158. package/dist/__tests__/integration/trading-service.integration.test.d.ts.map +0 -1
  159. package/dist/__tests__/integration/trading-service.integration.test.js +0 -58
  160. package/dist/__tests__/integration/trading-service.integration.test.js.map +0 -1
  161. package/dist/__tests__/test-utils.d.ts +0 -92
  162. package/dist/__tests__/test-utils.d.ts.map +0 -1
  163. package/dist/__tests__/test-utils.js +0 -143
  164. package/dist/__tests__/test-utils.js.map +0 -1
  165. package/dist/clients/bridge-client.d.ts +0 -388
  166. package/dist/clients/bridge-client.d.ts.map +0 -1
  167. package/dist/clients/bridge-client.js +0 -587
  168. package/dist/clients/bridge-client.js.map +0 -1
  169. package/dist/clients/clob-api.d.ts +0 -391
  170. package/dist/clients/clob-api.d.ts.map +0 -1
  171. package/dist/clients/clob-api.js +0 -448
  172. package/dist/clients/clob-api.js.map +0 -1
  173. package/dist/clients/ctf-client.d.ts +0 -475
  174. package/dist/clients/ctf-client.d.ts.map +0 -1
  175. package/dist/clients/ctf-client.js +0 -915
  176. package/dist/clients/ctf-client.js.map +0 -1
  177. package/dist/clients/data-api.d.ts +0 -452
  178. package/dist/clients/data-api.d.ts.map +0 -1
  179. package/dist/clients/data-api.js +0 -637
  180. package/dist/clients/data-api.js.map +0 -1
  181. package/dist/clients/gamma-api.d.ts +0 -406
  182. package/dist/clients/gamma-api.d.ts.map +0 -1
  183. package/dist/clients/gamma-api.js +0 -354
  184. package/dist/clients/gamma-api.js.map +0 -1
  185. package/dist/clients/subgraph.d.ts +0 -196
  186. package/dist/clients/subgraph.d.ts.map +0 -1
  187. package/dist/clients/subgraph.js +0 -332
  188. package/dist/clients/subgraph.js.map +0 -1
  189. package/dist/clients/trading-client.d.ts +0 -252
  190. package/dist/clients/trading-client.d.ts.map +0 -1
  191. package/dist/clients/trading-client.js +0 -543
  192. package/dist/clients/trading-client.js.map +0 -1
  193. package/dist/clients/websocket-manager.d.ts +0 -103
  194. package/dist/clients/websocket-manager.d.ts.map +0 -1
  195. package/dist/clients/websocket-manager.js +0 -200
  196. package/dist/clients/websocket-manager.js.map +0 -1
  197. package/dist/core/cache-adapter-bridge.d.ts +0 -36
  198. package/dist/core/cache-adapter-bridge.d.ts.map +0 -1
  199. package/dist/core/cache-adapter-bridge.js +0 -81
  200. package/dist/core/cache-adapter-bridge.js.map +0 -1
  201. package/dist/core/cache.d.ts +0 -43
  202. package/dist/core/cache.d.ts.map +0 -1
  203. package/dist/core/cache.js +0 -76
  204. package/dist/core/cache.js.map +0 -1
  205. package/dist/core/errors.d.ts +0 -39
  206. package/dist/core/errors.d.ts.map +0 -1
  207. package/dist/core/errors.js +0 -86
  208. package/dist/core/errors.js.map +0 -1
  209. package/dist/core/rate-limiter.d.ts +0 -33
  210. package/dist/core/rate-limiter.d.ts.map +0 -1
  211. package/dist/core/rate-limiter.js +0 -82
  212. package/dist/core/rate-limiter.js.map +0 -1
  213. package/dist/core/types.d.ts +0 -506
  214. package/dist/core/types.d.ts.map +0 -1
  215. package/dist/core/types.js +0 -49
  216. package/dist/core/types.js.map +0 -1
  217. package/dist/core/types.test.d.ts +0 -7
  218. package/dist/core/types.test.d.ts.map +0 -1
  219. package/dist/core/types.test.js +0 -122
  220. package/dist/core/types.test.js.map +0 -1
  221. package/dist/core/unified-cache.d.ts +0 -63
  222. package/dist/core/unified-cache.d.ts.map +0 -1
  223. package/dist/core/unified-cache.js +0 -114
  224. package/dist/core/unified-cache.js.map +0 -1
  225. package/dist/index.d.ts +0 -159
  226. package/dist/index.d.ts.map +0 -1
  227. package/dist/index.js +0 -262
  228. package/dist/index.js.map +0 -1
  229. package/dist/services/arbitrage-service.d.ts +0 -409
  230. package/dist/services/arbitrage-service.d.ts.map +0 -1
  231. package/dist/services/arbitrage-service.js +0 -1450
  232. package/dist/services/arbitrage-service.js.map +0 -1
  233. package/dist/services/authorization-service.d.ts +0 -97
  234. package/dist/services/authorization-service.d.ts.map +0 -1
  235. package/dist/services/authorization-service.js +0 -279
  236. package/dist/services/authorization-service.js.map +0 -1
  237. package/dist/services/binance-service.d.ts +0 -154
  238. package/dist/services/binance-service.d.ts.map +0 -1
  239. package/dist/services/binance-service.js +0 -266
  240. package/dist/services/binance-service.js.map +0 -1
  241. package/dist/services/dip-arb-service.d.ts +0 -209
  242. package/dist/services/dip-arb-service.d.ts.map +0 -1
  243. package/dist/services/dip-arb-service.js +0 -1602
  244. package/dist/services/dip-arb-service.js.map +0 -1
  245. package/dist/services/dip-arb-types.d.ts +0 -553
  246. package/dist/services/dip-arb-types.d.ts.map +0 -1
  247. package/dist/services/dip-arb-types.js +0 -164
  248. package/dist/services/dip-arb-types.js.map +0 -1
  249. package/dist/services/market-service.d.ts +0 -367
  250. package/dist/services/market-service.d.ts.map +0 -1
  251. package/dist/services/market-service.js +0 -1187
  252. package/dist/services/market-service.js.map +0 -1
  253. package/dist/services/onchain-service.d.ts +0 -309
  254. package/dist/services/onchain-service.d.ts.map +0 -1
  255. package/dist/services/onchain-service.js +0 -417
  256. package/dist/services/onchain-service.js.map +0 -1
  257. package/dist/services/realtime-service-v2.d.ts +0 -362
  258. package/dist/services/realtime-service-v2.d.ts.map +0 -1
  259. package/dist/services/realtime-service-v2.js +0 -858
  260. package/dist/services/realtime-service-v2.js.map +0 -1
  261. package/dist/services/realtime-service.d.ts +0 -82
  262. package/dist/services/realtime-service.d.ts.map +0 -1
  263. package/dist/services/realtime-service.js +0 -182
  264. package/dist/services/realtime-service.js.map +0 -1
  265. package/dist/services/smart-money-service.d.ts +0 -352
  266. package/dist/services/smart-money-service.d.ts.map +0 -1
  267. package/dist/services/smart-money-service.js +0 -582
  268. package/dist/services/smart-money-service.js.map +0 -1
  269. package/dist/services/swap-service.d.ts +0 -217
  270. package/dist/services/swap-service.d.ts.map +0 -1
  271. package/dist/services/swap-service.js +0 -695
  272. package/dist/services/swap-service.js.map +0 -1
  273. package/dist/services/trading-service.d.ts +0 -177
  274. package/dist/services/trading-service.d.ts.map +0 -1
  275. package/dist/services/trading-service.js +0 -422
  276. package/dist/services/trading-service.js.map +0 -1
  277. package/dist/services/wallet-service.d.ts +0 -316
  278. package/dist/services/wallet-service.d.ts.map +0 -1
  279. package/dist/services/wallet-service.js +0 -681
  280. package/dist/services/wallet-service.js.map +0 -1
  281. package/dist/utils/price-utils.d.ts +0 -153
  282. package/dist/utils/price-utils.d.ts.map +0 -1
  283. package/dist/utils/price-utils.js +0 -236
  284. package/dist/utils/price-utils.js.map +0 -1
  285. package/dist/utils/price-utils.test.d.ts +0 -5
  286. package/dist/utils/price-utils.test.d.ts.map +0 -1
  287. package/dist/utils/price-utils.test.js +0 -192
  288. package/dist/utils/price-utils.test.js.map +0 -1
@@ -0,0 +1,477 @@
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
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
8
+ import { OrderManager } from './order-manager.js';
9
+ import { OrderStatus } from '../core/types.js';
10
+ import { MockRateLimiter, MockCache, waitFor } from '../__tests__/test-utils.js';
11
+ // ============================================================================
12
+ // Mock Dependencies
13
+ // ============================================================================
14
+ class MockTradingService {
15
+ orders = new Map();
16
+ async initialize() { }
17
+ async getOrder(orderId) {
18
+ return this.orders.get(orderId) || null;
19
+ }
20
+ // Test helper: update order state
21
+ updateOrder(orderId, updates) {
22
+ const existing = this.orders.get(orderId);
23
+ if (existing) {
24
+ this.orders.set(orderId, { ...existing, ...updates });
25
+ }
26
+ else {
27
+ this.orders.set(orderId, {
28
+ id: orderId,
29
+ status: OrderStatus.OPEN,
30
+ tokenId: 'token123',
31
+ side: 'BUY',
32
+ price: 0.52,
33
+ originalSize: 100,
34
+ filledSize: 0,
35
+ remainingSize: 100,
36
+ associateTrades: [],
37
+ createdAt: Date.now(),
38
+ ...updates,
39
+ });
40
+ }
41
+ }
42
+ getCredentials() {
43
+ return null;
44
+ }
45
+ }
46
+ // ============================================================================
47
+ // Test Fixtures
48
+ // ============================================================================
49
+ const createTestOrder = (overrides) => ({
50
+ id: 'test-order-1',
51
+ status: OrderStatus.OPEN,
52
+ tokenId: 'token123',
53
+ side: 'BUY',
54
+ price: 0.52,
55
+ originalSize: 100,
56
+ filledSize: 0,
57
+ remainingSize: 100,
58
+ associateTrades: [],
59
+ createdAt: Date.now(),
60
+ ...overrides,
61
+ });
62
+ // ============================================================================
63
+ // Tests
64
+ // ============================================================================
65
+ describe('OrderManager - Polling Fill Detection', () => {
66
+ let orderManager;
67
+ let mockTradingService;
68
+ let rateLimiter;
69
+ let cache;
70
+ beforeEach(async () => {
71
+ rateLimiter = new MockRateLimiter();
72
+ cache = new MockCache();
73
+ mockTradingService = new MockTradingService();
74
+ orderManager = new OrderManager({
75
+ privateKey: '0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef',
76
+ rateLimiter: rateLimiter,
77
+ cache: cache,
78
+ mode: 'polling',
79
+ pollingInterval: 100, // Fast polling for tests
80
+ });
81
+ // Inject mock trading service
82
+ orderManager.tradingService = mockTradingService;
83
+ await orderManager.start();
84
+ });
85
+ afterEach(() => {
86
+ orderManager.stop();
87
+ });
88
+ describe('Fill Detection', () => {
89
+ it('should emit order_partially_filled when filledSize increases', async () => {
90
+ const orderId = 'order-1';
91
+ const initialOrder = createTestOrder({
92
+ id: orderId,
93
+ filledSize: 0,
94
+ remainingSize: 100,
95
+ });
96
+ // Set initial state
97
+ mockTradingService.updateOrder(orderId, initialOrder);
98
+ // Start watching
99
+ orderManager.watchOrder(orderId);
100
+ // Setup event listener
101
+ const fillEvents = [];
102
+ orderManager.on('order_partially_filled', (event) => {
103
+ fillEvents.push(event);
104
+ });
105
+ // Wait for initial poll
106
+ await waitFor(150);
107
+ // Simulate partial fill (50 shares filled)
108
+ mockTradingService.updateOrder(orderId, {
109
+ filledSize: 50,
110
+ remainingSize: 50,
111
+ status: OrderStatus.PARTIALLY_FILLED,
112
+ associateTrades: ['trade-1'],
113
+ });
114
+ // Wait for next poll
115
+ await waitFor(150);
116
+ // Verify fill event emitted
117
+ expect(fillEvents).toHaveLength(1);
118
+ expect(fillEvents[0]).toMatchObject({
119
+ orderId,
120
+ fill: {
121
+ size: 50, // Delta from 0 to 50
122
+ price: 0.52, // Order price
123
+ },
124
+ cumulativeFilled: 50,
125
+ remainingSize: 50,
126
+ isCompleteFill: false,
127
+ });
128
+ });
129
+ it('should emit order_filled when order completely filled', async () => {
130
+ const orderId = 'order-2';
131
+ // Set initial state with partial fill
132
+ mockTradingService.updateOrder(orderId, {
133
+ id: orderId,
134
+ filledSize: 50,
135
+ remainingSize: 50,
136
+ status: OrderStatus.PARTIALLY_FILLED,
137
+ associateTrades: ['trade-1'],
138
+ });
139
+ // Start watching (this will poll and set initial state)
140
+ orderManager.watchOrder(orderId);
141
+ // Setup event listener AFTER first poll
142
+ await waitFor(150);
143
+ const fillEvents = [];
144
+ orderManager.on('order_filled', (event) => {
145
+ fillEvents.push(event);
146
+ });
147
+ // Simulate complete fill
148
+ mockTradingService.updateOrder(orderId, {
149
+ filledSize: 100,
150
+ remainingSize: 0,
151
+ status: OrderStatus.FILLED,
152
+ associateTrades: ['trade-1', 'trade-2'],
153
+ });
154
+ // Wait for next poll
155
+ await waitFor(150);
156
+ // Verify fill event emitted
157
+ expect(fillEvents).toHaveLength(1);
158
+ expect(fillEvents[0]).toMatchObject({
159
+ orderId,
160
+ fill: {
161
+ size: 50, // Delta from 50 to 100
162
+ price: 0.52,
163
+ },
164
+ cumulativeFilled: 100,
165
+ remainingSize: 0,
166
+ isCompleteFill: true,
167
+ });
168
+ });
169
+ it('should emit multiple partial fill events correctly', async () => {
170
+ const orderId = 'order-3';
171
+ // Set initial state
172
+ mockTradingService.updateOrder(orderId, {
173
+ id: orderId,
174
+ filledSize: 0,
175
+ remainingSize: 100,
176
+ });
177
+ // Start watching and wait for initial state
178
+ orderManager.watchOrder(orderId);
179
+ await waitFor(150);
180
+ // Setup event listener AFTER initial poll
181
+ const partialFillEvents = [];
182
+ const completeFillEvents = [];
183
+ orderManager.on('order_partially_filled', (event) => {
184
+ partialFillEvents.push(event);
185
+ });
186
+ orderManager.on('order_filled', (event) => {
187
+ completeFillEvents.push(event);
188
+ });
189
+ // First fill: 30 shares
190
+ mockTradingService.updateOrder(orderId, {
191
+ filledSize: 30,
192
+ remainingSize: 70,
193
+ status: OrderStatus.PARTIALLY_FILLED,
194
+ associateTrades: ['trade-1'],
195
+ });
196
+ await waitFor(150);
197
+ // Second fill: 40 more shares (total 70)
198
+ mockTradingService.updateOrder(orderId, {
199
+ filledSize: 70,
200
+ remainingSize: 30,
201
+ status: OrderStatus.PARTIALLY_FILLED,
202
+ associateTrades: ['trade-1', 'trade-2'],
203
+ });
204
+ await waitFor(150);
205
+ // Final fill: 30 more shares (total 100, complete)
206
+ mockTradingService.updateOrder(orderId, {
207
+ filledSize: 100,
208
+ remainingSize: 0,
209
+ status: OrderStatus.FILLED,
210
+ associateTrades: ['trade-1', 'trade-2', 'trade-3'],
211
+ });
212
+ await waitFor(150);
213
+ // Verify partial fills
214
+ expect(partialFillEvents).toHaveLength(2);
215
+ expect(partialFillEvents[0].fill.size).toBe(30);
216
+ expect(partialFillEvents[1].fill.size).toBe(40);
217
+ // Verify complete fill
218
+ expect(completeFillEvents).toHaveLength(1);
219
+ expect(completeFillEvents[0].fill.size).toBe(30);
220
+ expect(completeFillEvents[0].isCompleteFill).toBe(true);
221
+ });
222
+ it('should not emit duplicate fill events', async () => {
223
+ const orderId = 'order-4';
224
+ // Set initial state
225
+ mockTradingService.updateOrder(orderId, {
226
+ id: orderId,
227
+ filledSize: 0,
228
+ remainingSize: 100,
229
+ });
230
+ // Start watching
231
+ orderManager.watchOrder(orderId);
232
+ // Setup event listener
233
+ const fillEvents = [];
234
+ orderManager.on('order_partially_filled', (event) => {
235
+ fillEvents.push(event);
236
+ });
237
+ // Wait for initial poll
238
+ await waitFor(150);
239
+ // Simulate fill
240
+ mockTradingService.updateOrder(orderId, {
241
+ filledSize: 50,
242
+ remainingSize: 50,
243
+ status: OrderStatus.PARTIALLY_FILLED,
244
+ });
245
+ // Wait for multiple polls
246
+ await waitFor(150);
247
+ await waitFor(150);
248
+ await waitFor(150);
249
+ // Should only emit once (deduplication works)
250
+ expect(fillEvents).toHaveLength(1);
251
+ });
252
+ it('should include correct fill details', async () => {
253
+ const orderId = 'order-5';
254
+ // Set initial state
255
+ mockTradingService.updateOrder(orderId, {
256
+ id: orderId,
257
+ price: 0.65,
258
+ originalSize: 200,
259
+ filledSize: 0,
260
+ remainingSize: 200,
261
+ associateTrades: [],
262
+ });
263
+ // Start watching
264
+ orderManager.watchOrder(orderId);
265
+ // Setup event listener
266
+ let capturedEvent = null;
267
+ orderManager.on('order_partially_filled', (event) => {
268
+ capturedEvent = event;
269
+ });
270
+ // Wait for initial poll
271
+ await waitFor(150);
272
+ // Simulate fill
273
+ mockTradingService.updateOrder(orderId, {
274
+ filledSize: 100,
275
+ remainingSize: 100,
276
+ status: OrderStatus.PARTIALLY_FILLED,
277
+ associateTrades: ['trade-abc'],
278
+ });
279
+ // Wait for poll
280
+ await waitFor(150);
281
+ // Verify fill details
282
+ expect(capturedEvent).not.toBeNull();
283
+ expect(capturedEvent).toMatchObject({
284
+ orderId,
285
+ fill: {
286
+ tradeId: 'trade-abc',
287
+ size: 100,
288
+ price: 0.65,
289
+ fee: 0, // Polling doesn't have fee info
290
+ },
291
+ cumulativeFilled: 100,
292
+ remainingSize: 100,
293
+ isCompleteFill: false,
294
+ });
295
+ // Verify order reference
296
+ expect(capturedEvent.order.id).toBe(orderId);
297
+ expect(capturedEvent.order.filledSize).toBe(100);
298
+ });
299
+ });
300
+ describe('Status Change Events', () => {
301
+ it('should emit both fill event and status change event', async () => {
302
+ const orderId = 'order-6';
303
+ // Set initial state
304
+ mockTradingService.updateOrder(orderId, {
305
+ id: orderId,
306
+ filledSize: 0,
307
+ remainingSize: 100,
308
+ status: OrderStatus.OPEN,
309
+ });
310
+ // Start watching and wait for initial state
311
+ orderManager.watchOrder(orderId);
312
+ await waitFor(150);
313
+ // Setup event listeners AFTER initial poll
314
+ const fillEvents = [];
315
+ const statusChanges = [];
316
+ orderManager.on('order_partially_filled', (event) => {
317
+ fillEvents.push(event);
318
+ });
319
+ orderManager.on('status_change', (event) => {
320
+ statusChanges.push(event);
321
+ });
322
+ // Simulate fill with status change
323
+ mockTradingService.updateOrder(orderId, {
324
+ filledSize: 50,
325
+ remainingSize: 50,
326
+ status: OrderStatus.PARTIALLY_FILLED,
327
+ });
328
+ // Wait for poll
329
+ await waitFor(150);
330
+ // Both events should be emitted
331
+ expect(fillEvents).toHaveLength(1);
332
+ expect(statusChanges).toHaveLength(1);
333
+ expect(statusChanges[0].to).toBe(OrderStatus.PARTIALLY_FILLED);
334
+ });
335
+ });
336
+ describe('Edge Cases', () => {
337
+ it('should handle filledSize staying the same (no fill)', async () => {
338
+ const orderId = 'order-7';
339
+ // Set initial state with existing fill
340
+ mockTradingService.updateOrder(orderId, {
341
+ id: orderId,
342
+ filledSize: 50,
343
+ remainingSize: 50,
344
+ status: OrderStatus.PARTIALLY_FILLED,
345
+ });
346
+ // Start watching and wait for initial state
347
+ orderManager.watchOrder(orderId);
348
+ await waitFor(150);
349
+ // Setup event listener AFTER initial poll
350
+ const fillEvents = [];
351
+ orderManager.on('order_partially_filled', (event) => {
352
+ fillEvents.push(event);
353
+ });
354
+ // Wait for multiple polls (no fill change)
355
+ await waitFor(150);
356
+ await waitFor(150);
357
+ // No fill events should be emitted
358
+ expect(fillEvents).toHaveLength(0);
359
+ });
360
+ it('should handle order with no associateTrades', async () => {
361
+ const orderId = 'order-8';
362
+ // Set initial state
363
+ mockTradingService.updateOrder(orderId, {
364
+ id: orderId,
365
+ filledSize: 0,
366
+ remainingSize: 100,
367
+ associateTrades: [],
368
+ });
369
+ // Start watching
370
+ orderManager.watchOrder(orderId);
371
+ // Setup event listener
372
+ let capturedEvent = null;
373
+ orderManager.on('order_partially_filled', (event) => {
374
+ capturedEvent = event;
375
+ });
376
+ // Wait for initial poll
377
+ await waitFor(150);
378
+ // Simulate fill with no trade ID
379
+ mockTradingService.updateOrder(orderId, {
380
+ filledSize: 50,
381
+ remainingSize: 50,
382
+ status: OrderStatus.PARTIALLY_FILLED,
383
+ associateTrades: [], // Empty array
384
+ });
385
+ // Wait for poll
386
+ await waitFor(150);
387
+ // Should generate synthetic tradeId
388
+ expect(capturedEvent).not.toBeNull();
389
+ expect(capturedEvent.fill.tradeId).toMatch(/^polling_\d+$/);
390
+ });
391
+ it('should handle order going directly from OPEN to FILLED', async () => {
392
+ const orderId = 'order-9';
393
+ // Set initial state
394
+ mockTradingService.updateOrder(orderId, {
395
+ id: orderId,
396
+ filledSize: 0,
397
+ remainingSize: 100,
398
+ status: OrderStatus.OPEN,
399
+ });
400
+ // Start watching and wait for initial state
401
+ orderManager.watchOrder(orderId);
402
+ await waitFor(150);
403
+ // Setup event listeners AFTER initial poll
404
+ const partialFillEvents = [];
405
+ const completeFillEvents = [];
406
+ orderManager.on('order_partially_filled', (event) => {
407
+ partialFillEvents.push(event);
408
+ });
409
+ orderManager.on('order_filled', (event) => {
410
+ completeFillEvents.push(event);
411
+ });
412
+ // Simulate instant complete fill (market order scenario)
413
+ mockTradingService.updateOrder(orderId, {
414
+ filledSize: 100,
415
+ remainingSize: 0,
416
+ status: OrderStatus.FILLED,
417
+ associateTrades: ['trade-1'],
418
+ });
419
+ // Wait for poll
420
+ await waitFor(150);
421
+ // Should emit complete fill only
422
+ expect(partialFillEvents).toHaveLength(0);
423
+ expect(completeFillEvents).toHaveLength(1);
424
+ expect(completeFillEvents[0].fill.size).toBe(100);
425
+ });
426
+ });
427
+ });
428
+ describe('OrderManager - WebSocket + Polling Deduplication', () => {
429
+ let orderManager;
430
+ let mockTradingService;
431
+ beforeEach(async () => {
432
+ mockTradingService = new MockTradingService();
433
+ orderManager = new OrderManager({
434
+ privateKey: '0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef',
435
+ rateLimiter: new MockRateLimiter(),
436
+ cache: new MockCache(),
437
+ mode: 'hybrid', // Both WebSocket and Polling
438
+ pollingInterval: 100,
439
+ });
440
+ // Inject mock trading service
441
+ orderManager.tradingService = mockTradingService;
442
+ await orderManager.start();
443
+ });
444
+ afterEach(() => {
445
+ orderManager.stop();
446
+ });
447
+ it('should not emit duplicate fills when both WebSocket and Polling detect same fill', async () => {
448
+ const orderId = 'order-10';
449
+ // Set initial state
450
+ mockTradingService.updateOrder(orderId, {
451
+ id: orderId,
452
+ filledSize: 0,
453
+ remainingSize: 100,
454
+ });
455
+ // Start watching
456
+ orderManager.watchOrder(orderId);
457
+ // Setup event listener
458
+ const fillEvents = [];
459
+ orderManager.on('order_partially_filled', (event) => {
460
+ fillEvents.push(event);
461
+ });
462
+ // Wait for initial poll
463
+ await waitFor(150);
464
+ // Update order state
465
+ mockTradingService.updateOrder(orderId, {
466
+ filledSize: 50,
467
+ remainingSize: 50,
468
+ status: OrderStatus.PARTIALLY_FILLED,
469
+ });
470
+ // Wait for multiple polls
471
+ await waitFor(150);
472
+ await waitFor(150);
473
+ // Deduplication should prevent multiple emissions
474
+ expect(fillEvents).toHaveLength(1);
475
+ });
476
+ });
477
+ //# sourceMappingURL=order-manager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"order-manager.test.js","sourceRoot":"","sources":["../../../src/services/order-manager.test.ts"],"names":[],"mappings":"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"}