@catalyst-team/poly-sdk 0.1.0 → 0.1.1

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 (194) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +354 -78
  3. package/docs/00-design.md +1 -1
  4. package/docs/02-API.md +21 -21
  5. package/docs/arbitrage.md +754 -0
  6. package/docs/reports/smart-money-analysis-2025-12-23-cn.md +840 -0
  7. package/examples/13-arbitrage-service.ts +211 -0
  8. package/examples/README.md +1 -1
  9. package/package.json +19 -19
  10. package/scripts/arb/faze-bo3-arb.ts +385 -0
  11. package/scripts/arb/settle-position.ts +190 -0
  12. package/scripts/arb/token-rebalancer.ts +420 -0
  13. package/scripts/verify/verify-all-apis.ts +1 -1
  14. package/src/clients/clob-api.ts +1 -1
  15. package/src/clients/gamma-api.ts +1 -1
  16. package/src/core/cache-adapter-bridge.ts +1 -1
  17. package/src/core/types.ts +3 -3
  18. package/src/core/unified-cache.ts +1 -1
  19. package/src/index.ts +25 -19
  20. package/src/services/arbitrage-service.ts +1807 -0
  21. package/.env +0 -0
  22. package/dist/__tests__/clob-api.test.d.ts +0 -5
  23. package/dist/__tests__/clob-api.test.d.ts.map +0 -1
  24. package/dist/__tests__/clob-api.test.js +0 -240
  25. package/dist/__tests__/clob-api.test.js.map +0 -1
  26. package/dist/__tests__/integration/bridge-client.integration.test.d.ts +0 -11
  27. package/dist/__tests__/integration/bridge-client.integration.test.d.ts.map +0 -1
  28. package/dist/__tests__/integration/bridge-client.integration.test.js +0 -260
  29. package/dist/__tests__/integration/bridge-client.integration.test.js.map +0 -1
  30. package/dist/__tests__/integration/clob-api.integration.test.d.ts +0 -13
  31. package/dist/__tests__/integration/clob-api.integration.test.d.ts.map +0 -1
  32. package/dist/__tests__/integration/clob-api.integration.test.js +0 -170
  33. package/dist/__tests__/integration/clob-api.integration.test.js.map +0 -1
  34. package/dist/__tests__/integration/ctf-client.integration.test.d.ts +0 -17
  35. package/dist/__tests__/integration/ctf-client.integration.test.d.ts.map +0 -1
  36. package/dist/__tests__/integration/ctf-client.integration.test.js +0 -234
  37. package/dist/__tests__/integration/ctf-client.integration.test.js.map +0 -1
  38. package/dist/__tests__/integration/data-api.integration.test.d.ts +0 -9
  39. package/dist/__tests__/integration/data-api.integration.test.d.ts.map +0 -1
  40. package/dist/__tests__/integration/data-api.integration.test.js +0 -161
  41. package/dist/__tests__/integration/data-api.integration.test.js.map +0 -1
  42. package/dist/__tests__/integration/gamma-api.integration.test.d.ts +0 -9
  43. package/dist/__tests__/integration/gamma-api.integration.test.d.ts.map +0 -1
  44. package/dist/__tests__/integration/gamma-api.integration.test.js +0 -170
  45. package/dist/__tests__/integration/gamma-api.integration.test.js.map +0 -1
  46. package/dist/__tests__/test-utils.d.ts +0 -92
  47. package/dist/__tests__/test-utils.d.ts.map +0 -1
  48. package/dist/__tests__/test-utils.js +0 -143
  49. package/dist/__tests__/test-utils.js.map +0 -1
  50. package/dist/clients/bridge-client.d.ts +0 -388
  51. package/dist/clients/bridge-client.d.ts.map +0 -1
  52. package/dist/clients/bridge-client.js +0 -587
  53. package/dist/clients/bridge-client.js.map +0 -1
  54. package/dist/clients/clob-api.d.ts +0 -318
  55. package/dist/clients/clob-api.d.ts.map +0 -1
  56. package/dist/clients/clob-api.js +0 -388
  57. package/dist/clients/clob-api.js.map +0 -1
  58. package/dist/clients/ctf-client.d.ts +0 -473
  59. package/dist/clients/ctf-client.d.ts.map +0 -1
  60. package/dist/clients/ctf-client.js +0 -915
  61. package/dist/clients/ctf-client.js.map +0 -1
  62. package/dist/clients/data-api.d.ts +0 -134
  63. package/dist/clients/data-api.d.ts.map +0 -1
  64. package/dist/clients/data-api.js +0 -265
  65. package/dist/clients/data-api.js.map +0 -1
  66. package/dist/clients/gamma-api.d.ts +0 -401
  67. package/dist/clients/gamma-api.d.ts.map +0 -1
  68. package/dist/clients/gamma-api.js +0 -352
  69. package/dist/clients/gamma-api.js.map +0 -1
  70. package/dist/clients/trading-client.d.ts +0 -252
  71. package/dist/clients/trading-client.d.ts.map +0 -1
  72. package/dist/clients/trading-client.js +0 -543
  73. package/dist/clients/trading-client.js.map +0 -1
  74. package/dist/clients/websocket-manager.d.ts +0 -100
  75. package/dist/clients/websocket-manager.d.ts.map +0 -1
  76. package/dist/clients/websocket-manager.js +0 -193
  77. package/dist/clients/websocket-manager.js.map +0 -1
  78. package/dist/core/cache-adapter-bridge.d.ts +0 -36
  79. package/dist/core/cache-adapter-bridge.d.ts.map +0 -1
  80. package/dist/core/cache-adapter-bridge.js +0 -81
  81. package/dist/core/cache-adapter-bridge.js.map +0 -1
  82. package/dist/core/cache.d.ts +0 -40
  83. package/dist/core/cache.d.ts.map +0 -1
  84. package/dist/core/cache.js +0 -71
  85. package/dist/core/cache.js.map +0 -1
  86. package/dist/core/errors.d.ts +0 -38
  87. package/dist/core/errors.d.ts.map +0 -1
  88. package/dist/core/errors.js +0 -84
  89. package/dist/core/errors.js.map +0 -1
  90. package/dist/core/rate-limiter.d.ts +0 -31
  91. package/dist/core/rate-limiter.d.ts.map +0 -1
  92. package/dist/core/rate-limiter.js +0 -70
  93. package/dist/core/rate-limiter.js.map +0 -1
  94. package/dist/core/types.d.ts +0 -314
  95. package/dist/core/types.d.ts.map +0 -1
  96. package/dist/core/types.js +0 -19
  97. package/dist/core/types.js.map +0 -1
  98. package/dist/core/unified-cache.d.ts +0 -63
  99. package/dist/core/unified-cache.d.ts.map +0 -1
  100. package/dist/core/unified-cache.js +0 -114
  101. package/dist/core/unified-cache.js.map +0 -1
  102. package/dist/index.d.ts +0 -94
  103. package/dist/index.d.ts.map +0 -1
  104. package/dist/index.js +0 -258
  105. package/dist/index.js.map +0 -1
  106. package/dist/mcp/errors.d.ts +0 -33
  107. package/dist/mcp/errors.d.ts.map +0 -1
  108. package/dist/mcp/errors.js +0 -86
  109. package/dist/mcp/errors.js.map +0 -1
  110. package/dist/mcp/index.d.ts +0 -62
  111. package/dist/mcp/index.d.ts.map +0 -1
  112. package/dist/mcp/index.js +0 -173
  113. package/dist/mcp/index.js.map +0 -1
  114. package/dist/mcp/server.d.ts +0 -17
  115. package/dist/mcp/server.d.ts.map +0 -1
  116. package/dist/mcp/server.js +0 -155
  117. package/dist/mcp/server.js.map +0 -1
  118. package/dist/mcp/tools/guide.d.ts +0 -12
  119. package/dist/mcp/tools/guide.d.ts.map +0 -1
  120. package/dist/mcp/tools/guide.js +0 -801
  121. package/dist/mcp/tools/guide.js.map +0 -1
  122. package/dist/mcp/tools/index.d.ts +0 -11
  123. package/dist/mcp/tools/index.d.ts.map +0 -1
  124. package/dist/mcp/tools/index.js +0 -27
  125. package/dist/mcp/tools/index.js.map +0 -1
  126. package/dist/mcp/tools/market.d.ts +0 -11
  127. package/dist/mcp/tools/market.d.ts.map +0 -1
  128. package/dist/mcp/tools/market.js +0 -314
  129. package/dist/mcp/tools/market.js.map +0 -1
  130. package/dist/mcp/tools/order.d.ts +0 -10
  131. package/dist/mcp/tools/order.d.ts.map +0 -1
  132. package/dist/mcp/tools/order.js +0 -258
  133. package/dist/mcp/tools/order.js.map +0 -1
  134. package/dist/mcp/tools/trade.d.ts +0 -38
  135. package/dist/mcp/tools/trade.d.ts.map +0 -1
  136. package/dist/mcp/tools/trade.js +0 -314
  137. package/dist/mcp/tools/trade.js.map +0 -1
  138. package/dist/mcp/tools/trader.d.ts +0 -11
  139. package/dist/mcp/tools/trader.d.ts.map +0 -1
  140. package/dist/mcp/tools/trader.js +0 -277
  141. package/dist/mcp/tools/trader.js.map +0 -1
  142. package/dist/mcp/tools/wallet.d.ts +0 -274
  143. package/dist/mcp/tools/wallet.d.ts.map +0 -1
  144. package/dist/mcp/tools/wallet.js +0 -579
  145. package/dist/mcp/tools/wallet.js.map +0 -1
  146. package/dist/mcp/types.d.ts +0 -413
  147. package/dist/mcp/types.d.ts.map +0 -1
  148. package/dist/mcp/types.js +0 -5
  149. package/dist/mcp/types.js.map +0 -1
  150. package/dist/services/authorization-service.d.ts +0 -97
  151. package/dist/services/authorization-service.d.ts.map +0 -1
  152. package/dist/services/authorization-service.js +0 -279
  153. package/dist/services/authorization-service.js.map +0 -1
  154. package/dist/services/market-service.d.ts +0 -108
  155. package/dist/services/market-service.d.ts.map +0 -1
  156. package/dist/services/market-service.js +0 -458
  157. package/dist/services/market-service.js.map +0 -1
  158. package/dist/services/realtime-service.d.ts +0 -82
  159. package/dist/services/realtime-service.d.ts.map +0 -1
  160. package/dist/services/realtime-service.js +0 -150
  161. package/dist/services/realtime-service.js.map +0 -1
  162. package/dist/services/swap-service.d.ts +0 -217
  163. package/dist/services/swap-service.d.ts.map +0 -1
  164. package/dist/services/swap-service.js +0 -695
  165. package/dist/services/swap-service.js.map +0 -1
  166. package/dist/services/wallet-service.d.ts +0 -94
  167. package/dist/services/wallet-service.d.ts.map +0 -1
  168. package/dist/services/wallet-service.js +0 -173
  169. package/dist/services/wallet-service.js.map +0 -1
  170. package/dist/utils/price-utils.d.ts +0 -153
  171. package/dist/utils/price-utils.d.ts.map +0 -1
  172. package/dist/utils/price-utils.js +0 -236
  173. package/dist/utils/price-utils.js.map +0 -1
  174. package/docs/01-mcp.md +0 -2041
  175. package/docs/e2e/01-trader-tools.md +0 -159
  176. package/docs/e2e/02-market-tools.md +0 -180
  177. package/docs/e2e/03-order-tools.md +0 -166
  178. package/docs/e2e/04-wallet-tools.md +0 -224
  179. package/docs/e2e/05-trading-tools.md +0 -327
  180. package/docs/e2e/06-integration-scenarios.md +0 -481
  181. package/docs/e2e/coordinator.md +0 -376
  182. package/scripts/truth.md +0 -440
  183. package/src/mcp/README.md +0 -380
  184. package/src/mcp/errors.ts +0 -124
  185. package/src/mcp/index.ts +0 -309
  186. package/src/mcp/server.ts +0 -183
  187. package/src/mcp/tools/guide.ts +0 -821
  188. package/src/mcp/tools/index.ts +0 -73
  189. package/src/mcp/tools/market.ts +0 -363
  190. package/src/mcp/tools/order.ts +0 -326
  191. package/src/mcp/tools/trade.ts +0 -417
  192. package/src/mcp/tools/trader.ts +0 -322
  193. package/src/mcp/tools/wallet.ts +0 -683
  194. package/src/mcp/types.ts +0 -472
@@ -1,73 +0,0 @@
1
- /**
2
- * MCP Tools Index
3
- */
4
-
5
- // Re-export all tool definitions and handlers
6
- export {
7
- guideToolDefinitions,
8
- createGuideHandlers,
9
- } from './guide.js';
10
-
11
- export {
12
- traderToolDefinitions,
13
- handleGetTraderPositions,
14
- handleGetTraderTrades,
15
- handleGetTraderProfile,
16
- handleGetLeaderboard,
17
- } from './trader.js';
18
-
19
- export {
20
- marketToolDefinitions,
21
- handleGetMarket,
22
- handleSearchMarkets,
23
- handleGetTrendingMarkets,
24
- handleGetMarketTrades,
25
- } from './market.js';
26
-
27
- export {
28
- orderToolDefinitions,
29
- handleGetOrderbook,
30
- handleGetBestPrices,
31
- handleEstimateExecution,
32
- } from './order.js';
33
-
34
- export {
35
- tradeToolDefinitions,
36
- handlePlaceLimitOrder,
37
- handlePlaceMarketOrder,
38
- handleCancelOrder,
39
- handleGetMyOrders,
40
- } from './trade.js';
41
-
42
- export {
43
- walletToolDefinitions,
44
- handleGetSupportedAssets,
45
- handleGetDepositAddresses,
46
- handleDepositUsdc,
47
- handleCheckAllowances,
48
- handleApproveTrading,
49
- handleSwap,
50
- handleSwapAndDeposit,
51
- handleGetTokenBalances,
52
- handleGetWalletBalances,
53
- handleGetSwapQuote,
54
- handleGetAvailablePools,
55
- } from './wallet.js';
56
-
57
- // Combined tool definitions
58
- import { guideToolDefinitions } from './guide.js';
59
- import { traderToolDefinitions } from './trader.js';
60
- import { marketToolDefinitions } from './market.js';
61
- import { orderToolDefinitions } from './order.js';
62
- import { tradeToolDefinitions } from './trade.js';
63
- import { walletToolDefinitions } from './wallet.js';
64
-
65
- // Guide tool FIRST so AI sees it prominently
66
- export const allToolDefinitions = [
67
- ...guideToolDefinitions,
68
- ...traderToolDefinitions,
69
- ...marketToolDefinitions,
70
- ...orderToolDefinitions,
71
- ...tradeToolDefinitions,
72
- ...walletToolDefinitions,
73
- ];
@@ -1,363 +0,0 @@
1
- /**
2
- * Market Tools - MCP tools for market discovery and analysis
3
- */
4
-
5
- import type { PolymarketSDK } from '../../index.js';
6
- import type {
7
- ToolDefinition,
8
- GetMarketInput,
9
- GetMarketOutput,
10
- SearchMarketsInput,
11
- SearchMarketsOutput,
12
- GetTrendingMarketsInput,
13
- GetTrendingMarketsOutput,
14
- GetMarketTradesInput,
15
- GetMarketTradesOutput,
16
- } from '../types.js';
17
- import { validateConditionId, wrapError, McpToolError, ErrorCode } from '../errors.js';
18
-
19
- export const marketToolDefinitions: ToolDefinition[] = [
20
- {
21
- name: 'get_market',
22
- description: 'Get market details including prices, volume, and status',
23
- inputSchema: {
24
- type: 'object',
25
- properties: {
26
- identifier: {
27
- type: 'string',
28
- description: "Market slug (e.g., 'us-recession-in-2025') or conditionId (0x...)",
29
- },
30
- },
31
- required: ['identifier'],
32
- },
33
- },
34
- {
35
- name: 'search_markets',
36
- description:
37
- 'Search for markets by keyword. Searches in question text and slug. Returns markets sorted by 24h volume.',
38
- inputSchema: {
39
- type: 'object',
40
- properties: {
41
- query: {
42
- type: 'string',
43
- description:
44
- 'Search keyword (e.g., "Trump", "Bitcoin", "recession"). Multi-word queries match any word.',
45
- },
46
- active: {
47
- type: 'boolean',
48
- description: 'Only return active markets',
49
- default: true,
50
- },
51
- limit: {
52
- type: 'number',
53
- description: 'Maximum results',
54
- default: 10,
55
- },
56
- },
57
- required: ['query'],
58
- },
59
- },
60
- {
61
- name: 'get_trending_markets',
62
- description: 'Get trending markets sorted by volume or liquidity',
63
- inputSchema: {
64
- type: 'object',
65
- properties: {
66
- limit: {
67
- type: 'number',
68
- default: 10,
69
- },
70
- sortBy: {
71
- type: 'string',
72
- enum: ['volume', 'liquidity', 'newest'],
73
- default: 'volume',
74
- },
75
- },
76
- },
77
- },
78
- {
79
- name: 'get_market_trades',
80
- description: 'Get recent trades for a specific market',
81
- inputSchema: {
82
- type: 'object',
83
- properties: {
84
- conditionId: {
85
- type: 'string',
86
- description: 'Market condition ID',
87
- },
88
- limit: {
89
- type: 'number',
90
- default: 20,
91
- },
92
- },
93
- required: ['conditionId'],
94
- },
95
- },
96
- ];
97
-
98
- export async function handleGetMarket(
99
- sdk: PolymarketSDK,
100
- input: GetMarketInput
101
- ): Promise<GetMarketOutput> {
102
- if (!input.identifier) {
103
- throw new McpToolError(ErrorCode.INVALID_INPUT, 'Market identifier is required');
104
- }
105
-
106
- try {
107
- const market = await sdk.getMarket(input.identifier);
108
-
109
- return {
110
- market: {
111
- conditionId: market.conditionId,
112
- question: market.question,
113
- slug: market.slug,
114
- description: market.description,
115
- },
116
- prices: {
117
- yes: market.tokens.yes.price,
118
- no: market.tokens.no.price,
119
- spread: market.spread,
120
- },
121
- tokens: {
122
- yes: {
123
- tokenId: market.tokens.yes.tokenId,
124
- price: market.tokens.yes.price,
125
- },
126
- no: {
127
- tokenId: market.tokens.no.tokenId,
128
- price: market.tokens.no.price,
129
- },
130
- },
131
- stats: {
132
- volume: market.volume,
133
- liquidity: market.liquidity,
134
- },
135
- status: {
136
- active: market.active,
137
- closed: market.closed,
138
- acceptingOrders: market.acceptingOrders,
139
- endDate: market.endDate?.toISOString(),
140
- },
141
- trading: {
142
- minTickSize: undefined, // From CLOB if needed
143
- minOrderSize: undefined,
144
- },
145
- };
146
- } catch (err) {
147
- throw wrapError(err);
148
- }
149
- }
150
-
151
- export async function handleSearchMarkets(
152
- sdk: PolymarketSDK,
153
- input: SearchMarketsInput
154
- ): Promise<SearchMarketsOutput> {
155
- if (!input.query) {
156
- throw new McpToolError(ErrorCode.INVALID_INPUT, 'Search query is required');
157
- }
158
-
159
- try {
160
- // Fetch active markets sorted by 24h volume for better relevance
161
- // Note: Gamma API doesn't support server-side text search,
162
- // so we fetch a larger set and filter client-side
163
- const allMarkets = await sdk.gammaApi.getMarkets({
164
- active: input.active !== false,
165
- closed: false,
166
- order: 'volume24hr',
167
- ascending: false,
168
- limit: 500, // Fetch more markets for comprehensive search
169
- });
170
-
171
- const queryLower = input.query.toLowerCase();
172
- const queryWords = queryLower.split(/\s+/).filter((w) => w.length > 0);
173
-
174
- // Filter by query - match any word in question or slug
175
- const filtered = allMarkets.filter((m) => {
176
- const questionLower = m.question.toLowerCase();
177
- const slugLower = m.slug.toLowerCase();
178
-
179
- // Match if any query word is found in question or slug
180
- return queryWords.some(
181
- (word) => questionLower.includes(word) || slugLower.includes(word)
182
- );
183
- });
184
-
185
- // Sort by relevance: prioritize exact phrase matches, then by volume
186
- filtered.sort((a, b) => {
187
- const aQuestion = a.question.toLowerCase();
188
- const bQuestion = b.question.toLowerCase();
189
- const aExact = aQuestion.includes(queryLower);
190
- const bExact = bQuestion.includes(queryLower);
191
-
192
- // Exact phrase matches first
193
- if (aExact && !bExact) return -1;
194
- if (!aExact && bExact) return 1;
195
-
196
- // Then by 24h volume
197
- return (b.volume24hr || 0) - (a.volume24hr || 0);
198
- });
199
-
200
- // Apply limit
201
- const results = filtered.slice(0, input.limit || 10);
202
-
203
- return {
204
- markets: results.map((m) => {
205
- // Safely handle endDate - it may be invalid
206
- let endDateStr: string | undefined;
207
- try {
208
- if (m.endDate && !isNaN(m.endDate.getTime())) {
209
- endDateStr = m.endDate.toISOString();
210
- }
211
- } catch {
212
- // Ignore invalid date
213
- }
214
-
215
- return {
216
- conditionId: m.conditionId,
217
- question: m.question,
218
- slug: m.slug,
219
- prices: {
220
- yes: m.outcomePrices[0] || 0.5,
221
- no: m.outcomePrices[1] || 0.5,
222
- },
223
- volume: m.volume,
224
- volume24h: m.volume24hr,
225
- endDate: endDateStr,
226
- };
227
- }),
228
- total: filtered.length,
229
- };
230
- } catch (err) {
231
- throw wrapError(err);
232
- }
233
- }
234
-
235
- export async function handleGetTrendingMarkets(
236
- sdk: PolymarketSDK,
237
- input: GetTrendingMarketsInput
238
- ): Promise<GetTrendingMarketsOutput> {
239
- try {
240
- const sortBy = input.sortBy || 'volume';
241
- let orderBy: string;
242
- const ascending = false;
243
-
244
- switch (sortBy) {
245
- case 'volume':
246
- orderBy = 'volume24hr';
247
- break;
248
- case 'liquidity':
249
- orderBy = 'liquidity';
250
- break;
251
- case 'newest':
252
- orderBy = 'startDate';
253
- break;
254
- default:
255
- orderBy = 'volume24hr';
256
- }
257
-
258
- // Fetch more markets than requested to allow filtering
259
- const requestedLimit = input.limit || 10;
260
- const markets = await sdk.gammaApi.getMarkets({
261
- active: true,
262
- closed: false, // Explicitly exclude closed markets
263
- limit: requestedLimit * 2, // Fetch extra in case some need filtering
264
- order: orderBy,
265
- ascending,
266
- });
267
-
268
- // Filter out markets that are closed or not accepting orders
269
- // This handles edge cases where API returns recently-settled markets
270
- const activeMarkets = markets.filter((m) => {
271
- // Skip if explicitly marked as closed
272
- if (m.closed) return false;
273
- // Skip if market has ended (endDate in past)
274
- if (m.endDate) {
275
- const endTime = m.endDate instanceof Date ? m.endDate.getTime() : new Date(m.endDate).getTime();
276
- if (!isNaN(endTime) && endTime < Date.now()) return false;
277
- }
278
- return true;
279
- });
280
-
281
- // Take only the requested number after filtering
282
- const finalMarkets = activeMarkets.slice(0, requestedLimit);
283
-
284
- return {
285
- markets: finalMarkets.map((m) => ({
286
- conditionId: m.conditionId,
287
- question: m.question,
288
- slug: m.slug,
289
- volume24h: m.volume24hr,
290
- priceChange24h: m.oneDayPriceChange,
291
- prices: {
292
- yes: m.outcomePrices[0] || 0.5,
293
- no: m.outcomePrices[1] || 0.5,
294
- },
295
- // Add status fields for transparency
296
- status: {
297
- active: m.active,
298
- closed: m.closed,
299
- endDate: m.endDate ? (m.endDate instanceof Date ? m.endDate.toISOString() : String(m.endDate)) : undefined,
300
- },
301
- })),
302
- };
303
- } catch (err) {
304
- throw wrapError(err);
305
- }
306
- }
307
-
308
- export async function handleGetMarketTrades(
309
- sdk: PolymarketSDK,
310
- input: GetMarketTradesInput
311
- ): Promise<GetMarketTradesOutput> {
312
- validateConditionId(input.conditionId);
313
-
314
- try {
315
- const trades = await sdk.dataApi.getTradesByMarket(
316
- input.conditionId,
317
- input.limit || 20
318
- );
319
-
320
- // Get market info for the title
321
- let marketTitle = '';
322
- try {
323
- const market = await sdk.getMarket(input.conditionId);
324
- marketTitle = market.question;
325
- } catch {
326
- // Use conditionId as fallback
327
- marketTitle = input.conditionId;
328
- }
329
-
330
- const now = Date.now();
331
- const oneDayAgo = now - 24 * 60 * 60 * 1000;
332
-
333
- const recentTrades = trades.filter((t) => t.timestamp >= oneDayAgo);
334
- const buyTrades = recentTrades.filter((t) => t.side === 'BUY');
335
- const sellTrades = recentTrades.filter((t) => t.side === 'SELL');
336
-
337
- const buyVolume24h = buyTrades.reduce((sum, t) => sum + t.size * t.price, 0);
338
- const sellVolume24h = sellTrades.reduce((sum, t) => sum + t.size * t.price, 0);
339
-
340
- return {
341
- market: {
342
- conditionId: input.conditionId,
343
- title: marketTitle,
344
- },
345
- trades: trades.slice(0, input.limit || 20).map((t) => ({
346
- trader: t.proxyWallet || '',
347
- traderName: t.name,
348
- side: t.side,
349
- outcome: t.outcome,
350
- size: t.size,
351
- price: t.price,
352
- timestamp: new Date(t.timestamp).toISOString(),
353
- })),
354
- summary: {
355
- buyVolume24h,
356
- sellVolume24h,
357
- netFlow: buyVolume24h - sellVolume24h,
358
- },
359
- };
360
- } catch (err) {
361
- throw wrapError(err);
362
- }
363
- }