@catalyst-team/poly-sdk 0.1.0

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 (244) hide show
  1. package/.env +0 -0
  2. package/README.md +803 -0
  3. package/dist/__tests__/clob-api.test.d.ts +5 -0
  4. package/dist/__tests__/clob-api.test.d.ts.map +1 -0
  5. package/dist/__tests__/clob-api.test.js +240 -0
  6. package/dist/__tests__/clob-api.test.js.map +1 -0
  7. package/dist/__tests__/integration/bridge-client.integration.test.d.ts +11 -0
  8. package/dist/__tests__/integration/bridge-client.integration.test.d.ts.map +1 -0
  9. package/dist/__tests__/integration/bridge-client.integration.test.js +260 -0
  10. package/dist/__tests__/integration/bridge-client.integration.test.js.map +1 -0
  11. package/dist/__tests__/integration/clob-api.integration.test.d.ts +13 -0
  12. package/dist/__tests__/integration/clob-api.integration.test.d.ts.map +1 -0
  13. package/dist/__tests__/integration/clob-api.integration.test.js +170 -0
  14. package/dist/__tests__/integration/clob-api.integration.test.js.map +1 -0
  15. package/dist/__tests__/integration/ctf-client.integration.test.d.ts +17 -0
  16. package/dist/__tests__/integration/ctf-client.integration.test.d.ts.map +1 -0
  17. package/dist/__tests__/integration/ctf-client.integration.test.js +234 -0
  18. package/dist/__tests__/integration/ctf-client.integration.test.js.map +1 -0
  19. package/dist/__tests__/integration/data-api.integration.test.d.ts +9 -0
  20. package/dist/__tests__/integration/data-api.integration.test.d.ts.map +1 -0
  21. package/dist/__tests__/integration/data-api.integration.test.js +161 -0
  22. package/dist/__tests__/integration/data-api.integration.test.js.map +1 -0
  23. package/dist/__tests__/integration/gamma-api.integration.test.d.ts +9 -0
  24. package/dist/__tests__/integration/gamma-api.integration.test.d.ts.map +1 -0
  25. package/dist/__tests__/integration/gamma-api.integration.test.js +170 -0
  26. package/dist/__tests__/integration/gamma-api.integration.test.js.map +1 -0
  27. package/dist/__tests__/test-utils.d.ts +92 -0
  28. package/dist/__tests__/test-utils.d.ts.map +1 -0
  29. package/dist/__tests__/test-utils.js +143 -0
  30. package/dist/__tests__/test-utils.js.map +1 -0
  31. package/dist/clients/bridge-client.d.ts +388 -0
  32. package/dist/clients/bridge-client.d.ts.map +1 -0
  33. package/dist/clients/bridge-client.js +587 -0
  34. package/dist/clients/bridge-client.js.map +1 -0
  35. package/dist/clients/clob-api.d.ts +318 -0
  36. package/dist/clients/clob-api.d.ts.map +1 -0
  37. package/dist/clients/clob-api.js +388 -0
  38. package/dist/clients/clob-api.js.map +1 -0
  39. package/dist/clients/ctf-client.d.ts +473 -0
  40. package/dist/clients/ctf-client.d.ts.map +1 -0
  41. package/dist/clients/ctf-client.js +915 -0
  42. package/dist/clients/ctf-client.js.map +1 -0
  43. package/dist/clients/data-api.d.ts +134 -0
  44. package/dist/clients/data-api.d.ts.map +1 -0
  45. package/dist/clients/data-api.js +265 -0
  46. package/dist/clients/data-api.js.map +1 -0
  47. package/dist/clients/gamma-api.d.ts +401 -0
  48. package/dist/clients/gamma-api.d.ts.map +1 -0
  49. package/dist/clients/gamma-api.js +352 -0
  50. package/dist/clients/gamma-api.js.map +1 -0
  51. package/dist/clients/trading-client.d.ts +252 -0
  52. package/dist/clients/trading-client.d.ts.map +1 -0
  53. package/dist/clients/trading-client.js +543 -0
  54. package/dist/clients/trading-client.js.map +1 -0
  55. package/dist/clients/websocket-manager.d.ts +100 -0
  56. package/dist/clients/websocket-manager.d.ts.map +1 -0
  57. package/dist/clients/websocket-manager.js +193 -0
  58. package/dist/clients/websocket-manager.js.map +1 -0
  59. package/dist/core/cache-adapter-bridge.d.ts +36 -0
  60. package/dist/core/cache-adapter-bridge.d.ts.map +1 -0
  61. package/dist/core/cache-adapter-bridge.js +81 -0
  62. package/dist/core/cache-adapter-bridge.js.map +1 -0
  63. package/dist/core/cache.d.ts +40 -0
  64. package/dist/core/cache.d.ts.map +1 -0
  65. package/dist/core/cache.js +71 -0
  66. package/dist/core/cache.js.map +1 -0
  67. package/dist/core/errors.d.ts +38 -0
  68. package/dist/core/errors.d.ts.map +1 -0
  69. package/dist/core/errors.js +84 -0
  70. package/dist/core/errors.js.map +1 -0
  71. package/dist/core/rate-limiter.d.ts +31 -0
  72. package/dist/core/rate-limiter.d.ts.map +1 -0
  73. package/dist/core/rate-limiter.js +70 -0
  74. package/dist/core/rate-limiter.js.map +1 -0
  75. package/dist/core/types.d.ts +314 -0
  76. package/dist/core/types.d.ts.map +1 -0
  77. package/dist/core/types.js +19 -0
  78. package/dist/core/types.js.map +1 -0
  79. package/dist/core/unified-cache.d.ts +63 -0
  80. package/dist/core/unified-cache.d.ts.map +1 -0
  81. package/dist/core/unified-cache.js +114 -0
  82. package/dist/core/unified-cache.js.map +1 -0
  83. package/dist/index.d.ts +94 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +258 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/mcp/errors.d.ts +33 -0
  88. package/dist/mcp/errors.d.ts.map +1 -0
  89. package/dist/mcp/errors.js +86 -0
  90. package/dist/mcp/errors.js.map +1 -0
  91. package/dist/mcp/index.d.ts +62 -0
  92. package/dist/mcp/index.d.ts.map +1 -0
  93. package/dist/mcp/index.js +173 -0
  94. package/dist/mcp/index.js.map +1 -0
  95. package/dist/mcp/server.d.ts +17 -0
  96. package/dist/mcp/server.d.ts.map +1 -0
  97. package/dist/mcp/server.js +155 -0
  98. package/dist/mcp/server.js.map +1 -0
  99. package/dist/mcp/tools/guide.d.ts +12 -0
  100. package/dist/mcp/tools/guide.d.ts.map +1 -0
  101. package/dist/mcp/tools/guide.js +801 -0
  102. package/dist/mcp/tools/guide.js.map +1 -0
  103. package/dist/mcp/tools/index.d.ts +11 -0
  104. package/dist/mcp/tools/index.d.ts.map +1 -0
  105. package/dist/mcp/tools/index.js +27 -0
  106. package/dist/mcp/tools/index.js.map +1 -0
  107. package/dist/mcp/tools/market.d.ts +11 -0
  108. package/dist/mcp/tools/market.d.ts.map +1 -0
  109. package/dist/mcp/tools/market.js +314 -0
  110. package/dist/mcp/tools/market.js.map +1 -0
  111. package/dist/mcp/tools/order.d.ts +10 -0
  112. package/dist/mcp/tools/order.d.ts.map +1 -0
  113. package/dist/mcp/tools/order.js +258 -0
  114. package/dist/mcp/tools/order.js.map +1 -0
  115. package/dist/mcp/tools/trade.d.ts +38 -0
  116. package/dist/mcp/tools/trade.d.ts.map +1 -0
  117. package/dist/mcp/tools/trade.js +314 -0
  118. package/dist/mcp/tools/trade.js.map +1 -0
  119. package/dist/mcp/tools/trader.d.ts +11 -0
  120. package/dist/mcp/tools/trader.d.ts.map +1 -0
  121. package/dist/mcp/tools/trader.js +277 -0
  122. package/dist/mcp/tools/trader.js.map +1 -0
  123. package/dist/mcp/tools/wallet.d.ts +274 -0
  124. package/dist/mcp/tools/wallet.d.ts.map +1 -0
  125. package/dist/mcp/tools/wallet.js +579 -0
  126. package/dist/mcp/tools/wallet.js.map +1 -0
  127. package/dist/mcp/types.d.ts +413 -0
  128. package/dist/mcp/types.d.ts.map +1 -0
  129. package/dist/mcp/types.js +5 -0
  130. package/dist/mcp/types.js.map +1 -0
  131. package/dist/services/authorization-service.d.ts +97 -0
  132. package/dist/services/authorization-service.d.ts.map +1 -0
  133. package/dist/services/authorization-service.js +279 -0
  134. package/dist/services/authorization-service.js.map +1 -0
  135. package/dist/services/market-service.d.ts +108 -0
  136. package/dist/services/market-service.d.ts.map +1 -0
  137. package/dist/services/market-service.js +458 -0
  138. package/dist/services/market-service.js.map +1 -0
  139. package/dist/services/realtime-service.d.ts +82 -0
  140. package/dist/services/realtime-service.d.ts.map +1 -0
  141. package/dist/services/realtime-service.js +150 -0
  142. package/dist/services/realtime-service.js.map +1 -0
  143. package/dist/services/swap-service.d.ts +217 -0
  144. package/dist/services/swap-service.d.ts.map +1 -0
  145. package/dist/services/swap-service.js +695 -0
  146. package/dist/services/swap-service.js.map +1 -0
  147. package/dist/services/wallet-service.d.ts +94 -0
  148. package/dist/services/wallet-service.d.ts.map +1 -0
  149. package/dist/services/wallet-service.js +173 -0
  150. package/dist/services/wallet-service.js.map +1 -0
  151. package/dist/utils/price-utils.d.ts +153 -0
  152. package/dist/utils/price-utils.d.ts.map +1 -0
  153. package/dist/utils/price-utils.js +236 -0
  154. package/dist/utils/price-utils.js.map +1 -0
  155. package/docs/00-design.md +760 -0
  156. package/docs/01-mcp.md +2041 -0
  157. package/docs/02-API.md +1148 -0
  158. package/docs/e2e/01-trader-tools.md +159 -0
  159. package/docs/e2e/02-market-tools.md +180 -0
  160. package/docs/e2e/03-order-tools.md +166 -0
  161. package/docs/e2e/04-wallet-tools.md +224 -0
  162. package/docs/e2e/05-trading-tools.md +327 -0
  163. package/docs/e2e/06-integration-scenarios.md +481 -0
  164. package/docs/e2e/coordinator.md +376 -0
  165. package/examples/01-basic-usage.ts +68 -0
  166. package/examples/02-smart-money.ts +95 -0
  167. package/examples/03-market-analysis.ts +108 -0
  168. package/examples/04-kline-aggregation.ts +158 -0
  169. package/examples/05-follow-wallet-strategy.ts +156 -0
  170. package/examples/06-services-demo.ts +124 -0
  171. package/examples/07-realtime-websocket.ts +117 -0
  172. package/examples/08-trading-orders.ts +278 -0
  173. package/examples/09-rewards-tracking.ts +187 -0
  174. package/examples/10-ctf-operations.ts +336 -0
  175. package/examples/11-live-arbitrage-scan.ts +221 -0
  176. package/examples/12-trending-arb-monitor.ts +406 -0
  177. package/examples/README.md +179 -0
  178. package/package.json +62 -0
  179. package/scripts/README.md +163 -0
  180. package/scripts/approvals/approve-erc1155.ts +129 -0
  181. package/scripts/approvals/approve-neg-risk-erc1155.ts +149 -0
  182. package/scripts/approvals/approve-neg-risk.ts +102 -0
  183. package/scripts/approvals/check-all-allowances.ts +150 -0
  184. package/scripts/approvals/check-allowance.ts +129 -0
  185. package/scripts/approvals/check-ctf-approval.ts +158 -0
  186. package/scripts/datas/001-report.md +486 -0
  187. package/scripts/datas/clone-modal-screenshot.png +0 -0
  188. package/scripts/deposit/deposit-native-usdc.ts +179 -0
  189. package/scripts/deposit/deposit-usdc.ts +155 -0
  190. package/scripts/deposit/swap-usdc-to-usdce.ts +375 -0
  191. package/scripts/research/research-markets.ts +166 -0
  192. package/scripts/trading/check-orders.ts +50 -0
  193. package/scripts/trading/sell-nvidia-positions.ts +206 -0
  194. package/scripts/trading/test-order.ts +172 -0
  195. package/scripts/truth.md +440 -0
  196. package/scripts/verify/test-approve-trading.ts +98 -0
  197. package/scripts/verify/test-provider-fix.ts +43 -0
  198. package/scripts/verify/test-search-mcp.ts +113 -0
  199. package/scripts/verify/verify-all-apis.ts +160 -0
  200. package/scripts/wallet/check-wallet-balances.ts +75 -0
  201. package/scripts/wallet/test-wallet-operations.ts +191 -0
  202. package/scripts/wallet/verify-wallet-tools.ts +124 -0
  203. package/src/__tests__/clob-api.test.ts +301 -0
  204. package/src/__tests__/integration/bridge-client.integration.test.ts +314 -0
  205. package/src/__tests__/integration/clob-api.integration.test.ts +218 -0
  206. package/src/__tests__/integration/ctf-client.integration.test.ts +331 -0
  207. package/src/__tests__/integration/data-api.integration.test.ts +194 -0
  208. package/src/__tests__/integration/gamma-api.integration.test.ts +206 -0
  209. package/src/__tests__/test-utils.ts +170 -0
  210. package/src/clients/bridge-client.ts +841 -0
  211. package/src/clients/clob-api.ts +629 -0
  212. package/src/clients/ctf-client.ts +1216 -0
  213. package/src/clients/data-api.ts +469 -0
  214. package/src/clients/gamma-api.ts +597 -0
  215. package/src/clients/trading-client.ts +749 -0
  216. package/src/clients/websocket-manager.ts +267 -0
  217. package/src/core/cache-adapter-bridge.ts +94 -0
  218. package/src/core/cache.ts +85 -0
  219. package/src/core/errors.ts +117 -0
  220. package/src/core/rate-limiter.ts +74 -0
  221. package/src/core/types.ts +360 -0
  222. package/src/core/unified-cache.ts +153 -0
  223. package/src/index.ts +455 -0
  224. package/src/mcp/README.md +380 -0
  225. package/src/mcp/errors.ts +124 -0
  226. package/src/mcp/index.ts +309 -0
  227. package/src/mcp/server.ts +183 -0
  228. package/src/mcp/tools/guide.ts +821 -0
  229. package/src/mcp/tools/index.ts +73 -0
  230. package/src/mcp/tools/market.ts +363 -0
  231. package/src/mcp/tools/order.ts +326 -0
  232. package/src/mcp/tools/trade.ts +417 -0
  233. package/src/mcp/tools/trader.ts +322 -0
  234. package/src/mcp/tools/wallet.ts +683 -0
  235. package/src/mcp/types.ts +472 -0
  236. package/src/services/authorization-service.ts +357 -0
  237. package/src/services/market-service.ts +544 -0
  238. package/src/services/realtime-service.ts +196 -0
  239. package/src/services/swap-service.ts +896 -0
  240. package/src/services/wallet-service.ts +259 -0
  241. package/src/utils/price-utils.ts +307 -0
  242. package/tsconfig.json +8 -0
  243. package/vitest.config.ts +19 -0
  244. package/vitest.integration.config.ts +18 -0
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Rate Limiter for Polymarket APIs
3
+ * - Data API: 100ms minimum interval
4
+ * - Gamma API: 10 req/s
5
+ * - CLOB API: 10 req/s
6
+ */
7
+ import Bottleneck from 'bottleneck';
8
+ export var ApiType;
9
+ (function (ApiType) {
10
+ ApiType["DATA_API"] = "data-api";
11
+ ApiType["GAMMA_API"] = "gamma-api";
12
+ ApiType["CLOB_API"] = "clob-api";
13
+ })(ApiType || (ApiType = {}));
14
+ const API_LIMITS = {
15
+ [ApiType.DATA_API]: {
16
+ minTime: 100, // 100ms minimum interval
17
+ maxConcurrent: 5,
18
+ },
19
+ [ApiType.GAMMA_API]: {
20
+ reservoir: 10,
21
+ reservoirRefreshAmount: 10,
22
+ reservoirRefreshInterval: 1000,
23
+ },
24
+ [ApiType.CLOB_API]: {
25
+ reservoir: 10,
26
+ reservoirRefreshAmount: 10,
27
+ reservoirRefreshInterval: 1000,
28
+ },
29
+ };
30
+ export class RateLimiter {
31
+ limiters = new Map();
32
+ constructor() {
33
+ for (const [type, config] of Object.entries(API_LIMITS)) {
34
+ this.limiters.set(type, new Bottleneck(config));
35
+ }
36
+ }
37
+ /**
38
+ * Execute a function with rate limiting
39
+ */
40
+ async execute(api, fn) {
41
+ const limiter = this.limiters.get(api);
42
+ if (!limiter)
43
+ throw new Error(`Unknown API type: ${api}`);
44
+ return limiter.schedule(fn);
45
+ }
46
+ /**
47
+ * Execute multiple functions in order with rate limiting
48
+ */
49
+ async executeBatch(api, fns) {
50
+ const results = [];
51
+ for (const fn of fns) {
52
+ results.push(await this.execute(api, fn));
53
+ }
54
+ return results;
55
+ }
56
+ /**
57
+ * Get current limiter statistics
58
+ */
59
+ getStats(api) {
60
+ const limiter = this.limiters.get(api);
61
+ if (!limiter)
62
+ return null;
63
+ const counts = limiter.counts();
64
+ return {
65
+ running: counts.RUNNING,
66
+ queued: counts.QUEUED,
67
+ };
68
+ }
69
+ }
70
+ //# sourceMappingURL=rate-limiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/core/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,MAAM,CAAN,IAAY,OAIX;AAJD,WAAY,OAAO;IACjB,gCAAqB,CAAA;IACrB,kCAAuB,CAAA;IACvB,gCAAqB,CAAA;AACvB,CAAC,EAJW,OAAO,KAAP,OAAO,QAIlB;AAED,MAAM,UAAU,GAAmD;IACjE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;QAClB,OAAO,EAAE,GAAG,EAAE,yBAAyB;QACvC,aAAa,EAAE,CAAC;KACjB;IACD,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;QACnB,SAAS,EAAE,EAAE;QACb,sBAAsB,EAAE,EAAE;QAC1B,wBAAwB,EAAE,IAAI;KAC/B;IACD,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;QAClB,SAAS,EAAE,EAAE;QACb,sBAAsB,EAAE,EAAE;QAC1B,wBAAwB,EAAE,IAAI;KAC/B;CACF,CAAC;AAEF,MAAM,OAAO,WAAW;IACd,QAAQ,GAA6B,IAAI,GAAG,EAAE,CAAC;IAEvD;QACE,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACxD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAe,EAAE,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAI,GAAY,EAAE,EAAoB;QACjD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;QAC1D,OAAO,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAI,GAAY,EAAE,GAAyB;QAC3D,MAAM,OAAO,GAAQ,EAAE,CAAC;QACxB,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,GAAY;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAChC,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,314 @@
1
+ /**
2
+ * Common types used across the SDK
3
+ */
4
+ import type { CacheAdapter } from '@prediction-router/cache';
5
+ /**
6
+ * SDK Configuration Options
7
+ *
8
+ * Allows dependency injection of cache adapters for API response caching.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * import { createMemoryCache } from '@prediction-router/cache';
13
+ * import { PolymarketSDK } from '@prediction-router/poly-sdk';
14
+ *
15
+ * // Use external cache adapter
16
+ * const cache = createMemoryCache({ defaultTTL: 120 });
17
+ * const sdk = new PolymarketSDK({ cache });
18
+ *
19
+ * // Or use default internal cache
20
+ * const sdk2 = new PolymarketSDK();
21
+ * ```
22
+ */
23
+ export interface PolySDKOptions {
24
+ /**
25
+ * Optional external cache adapter for API response caching.
26
+ * If not provided, the SDK will use its internal memory cache.
27
+ *
28
+ * Benefits of external cache:
29
+ * - Can use Redis for multi-instance cache sharing
30
+ * - Can configure custom TTL settings
31
+ * - Can track cache hit/miss statistics
32
+ */
33
+ cache?: CacheAdapter;
34
+ /**
35
+ * Blockchain chain ID (default: 137 for Polygon mainnet)
36
+ */
37
+ chainId?: number;
38
+ /**
39
+ * Ethereum signer for trading operations
40
+ */
41
+ signer?: unknown;
42
+ /**
43
+ * API credentials for trading
44
+ */
45
+ creds?: {
46
+ key: string;
47
+ secret: string;
48
+ passphrase: string;
49
+ };
50
+ }
51
+ export type KLineInterval = '30s' | '1m' | '5m' | '15m' | '30m' | '1h' | '4h' | '12h' | '1d';
52
+ export interface KLineCandle {
53
+ timestamp: number;
54
+ open: number;
55
+ high: number;
56
+ low: number;
57
+ close: number;
58
+ volume: number;
59
+ tradeCount: number;
60
+ buyVolume: number;
61
+ sellVolume: number;
62
+ }
63
+ /**
64
+ * ============================================================================
65
+ * Spread Analysis Types - Two Different Approaches
66
+ * ============================================================================
67
+ *
68
+ * Polymarket 双代币模型:YES + NO = 1 USDC
69
+ * 理想状态下,YES_price + NO_price = 1.0
70
+ * 偏离 1.0 时可能存在套利机会
71
+ *
72
+ * 我们提供两种 Spread 分析方式,各有优劣:
73
+ *
74
+ * ┌─────────────────────────────────────────────────────────────────────────┐
75
+ * │ SpreadDataPoint (历史分析) │ RealtimeSpreadAnalysis (实时分析) │
76
+ * ├─────────────────────────────────────────────────────────────────────────┤
77
+ * │ 数据源: 成交记录的收盘价 │ 数据源: 订单簿的最优 bid/ask │
78
+ * │ YES_close + NO_close │ YES_ask + NO_ask (买入成本) │
79
+ * │ │ YES_bid + NO_bid (卖出收入) │
80
+ * ├─────────────────────────────────────────────────────────────────────────┤
81
+ * │ ✅ 可构建历史曲线 │ ❌ 无法构建历史曲线* │
82
+ * │ ✅ Polymarket 保留成交历史 │ ❌ Polymarket 不保留盘口历史 │
83
+ * │ ✅ 适合回测、模式识别 │ ✅ 适合实盘交易、套利执行 │
84
+ * │ ⚠️ 反映已成交价格,非当前可成交价 │ ✅ 反映当前可立即成交的价格 │
85
+ * │ ⚠️ 套利信号仅供参考 │ ✅ 套利利润计算准确 │
86
+ * └─────────────────────────────────────────────────────────────────────────┘
87
+ *
88
+ * * 如需构建实时 Spread 的历史曲线,必须自行存储盘口快照数据
89
+ * 参考: apps/api/src/services/spread-sampler.ts
90
+ *
91
+ * 核心区别说明:
92
+ *
93
+ * 1. 成交价 vs 盘口价
94
+ * - 成交价 (close): 过去某时刻实际成交的价格
95
+ * - 盘口价 (bid/ask): 当前市场上的最优挂单价格
96
+ * - 例: YES 最后成交 0.52,但当前 bid=0.50, ask=0.54
97
+ *
98
+ * 2. 为什么套利计算用盘口价更准确?
99
+ * - 套利需要同时买入 YES 和 NO
100
+ * - 必须用 ask 价(卖方挂单)计算买入成本
101
+ * - 成交价可能是 bid 方成交,不代表你能以该价买入
102
+ *
103
+ * 3. 为什么历史分析只能用成交价?
104
+ * - Polymarket CLOB API 不保存历史盘口数据
105
+ * - 只有成交记录 (trades) 有历史
106
+ * - 除非你自己运行 spread-sampler 持续采样盘口
107
+ */
108
+ /**
109
+ * 历史 Spread 分析(基于成交收盘价)
110
+ *
111
+ * 用途:
112
+ * - 历史趋势分析、回测
113
+ * - 识别价格偏离模式
114
+ * - 当盘口数据不可用时的替代方案
115
+ *
116
+ * 局限:
117
+ * - priceSpread 仅反映成交价偏离,非实际可套利空间
118
+ * - arbOpportunity 仅为参考信号,实际套利需查看盘口
119
+ *
120
+ * 数据来源:Polymarket Data API /trades 历史成交记录
121
+ */
122
+ export interface SpreadDataPoint {
123
+ timestamp: number;
124
+ yesPrice: number;
125
+ noPrice: number;
126
+ priceSum: number;
127
+ priceSpread: number;
128
+ arbOpportunity: 'LONG' | 'SHORT' | '';
129
+ }
130
+ /**
131
+ * 实时 Spread 分析(基于订单簿 bid/ask)
132
+ *
133
+ * 用途:
134
+ * - 实盘套利决策
135
+ * - 精确计算套利利润
136
+ * - 监控当前市场状态
137
+ *
138
+ * 局限:
139
+ * - ❌ 无法构建历史曲线 - Polymarket 不保存盘口历史
140
+ * - 如需历史数据,必须自行运行采样服务持续存储盘口快照
141
+ * 参考实现: apps/api/src/services/spread-sampler.ts
142
+ *
143
+ * 数据来源:Polymarket CLOB API /book 实时订单簿
144
+ *
145
+ * 套利逻辑:
146
+ * - Long Arb (多头套利): askSum < 1 时,买入 YES + NO 成本 < 1 USDC
147
+ * 利润 = 1 - askSum,因为最终一方会 resolve 为 1 USDC
148
+ *
149
+ * - Short Arb (空头套利): bidSum > 1 时,卖出 YES + NO 收入 > 1 USDC
150
+ * 利润 = bidSum - 1,需要先铸造代币对(成本 1 USDC)
151
+ */
152
+ export interface RealtimeSpreadAnalysis {
153
+ timestamp: number;
154
+ yesBid: number;
155
+ yesAsk: number;
156
+ noBid: number;
157
+ noAsk: number;
158
+ askSum: number;
159
+ bidSum: number;
160
+ askSpread: number;
161
+ bidSpread: number;
162
+ longArbProfit: number;
163
+ shortArbProfit: number;
164
+ arbOpportunity: 'LONG' | 'SHORT' | '';
165
+ arbProfitPercent: number;
166
+ }
167
+ /**
168
+ * 双代币 K 线数据(YES + NO)
169
+ *
170
+ * 包含两种 Spread 分析:
171
+ * - spreadAnalysis: 历史曲线(基于成交价),可回溯
172
+ * - realtimeSpread: 实时快照(基于盘口),仅当前时刻
173
+ */
174
+ export interface DualKLineData {
175
+ conditionId: string;
176
+ interval: KLineInterval;
177
+ market?: UnifiedMarket;
178
+ yes: KLineCandle[];
179
+ no: KLineCandle[];
180
+ /**
181
+ * 历史 Spread 分析(SpreadDataPoint[])
182
+ *
183
+ * ✅ 可构建历史曲线 - 每个 K 线周期一个数据点
184
+ * ⚠️ 基于成交价,套利信号仅供参考
185
+ *
186
+ * 用于:图表展示、趋势分析、回测
187
+ */
188
+ spreadAnalysis?: SpreadDataPoint[];
189
+ /**
190
+ * 实时 Spread 分析(RealtimeSpreadAnalysis)
191
+ *
192
+ * ✅ 套利计算准确 - 基于当前盘口 bid/ask
193
+ * ❌ 仅当前时刻快照,无法构建历史曲线
194
+ *
195
+ * 如需实时 Spread 历史曲线,必须:
196
+ * 1. 运行 spread-sampler 服务持续采样盘口
197
+ * 2. 将快照存储到数据库
198
+ * 3. 从数据库读取构建曲线
199
+ *
200
+ * 用于:实盘套利决策、当前市场状态展示
201
+ */
202
+ realtimeSpread?: RealtimeSpreadAnalysis;
203
+ /** 完整订单簿数据(如需更多细节) */
204
+ currentOrderbook?: ProcessedOrderbook;
205
+ }
206
+ /**
207
+ * 有效价格(考虑镜像订单)
208
+ *
209
+ * Polymarket 的关键特性:买 YES @ P = 卖 NO @ (1-P)
210
+ * 因此同一订单会在两个订单簿中出现
211
+ *
212
+ * 有效价格是考虑镜像后的最优价格:
213
+ * - effectiveBuyYes = min(YES.ask, 1 - NO.bid)
214
+ * - effectiveBuyNo = min(NO.ask, 1 - YES.bid)
215
+ * - effectiveSellYes = max(YES.bid, 1 - NO.ask)
216
+ * - effectiveSellNo = max(NO.bid, 1 - YES.ask)
217
+ */
218
+ export interface EffectivePrices {
219
+ effectiveBuyYes: number;
220
+ effectiveBuyNo: number;
221
+ effectiveSellYes: number;
222
+ effectiveSellNo: number;
223
+ }
224
+ export interface ProcessedOrderbook {
225
+ yes: {
226
+ bid: number;
227
+ ask: number;
228
+ bidSize: number;
229
+ askSize: number;
230
+ bidDepth: number;
231
+ askDepth: number;
232
+ spread: number;
233
+ tokenId?: string;
234
+ };
235
+ no: {
236
+ bid: number;
237
+ ask: number;
238
+ bidSize: number;
239
+ askSize: number;
240
+ bidDepth: number;
241
+ askDepth: number;
242
+ spread: number;
243
+ tokenId?: string;
244
+ };
245
+ summary: {
246
+ askSum: number;
247
+ bidSum: number;
248
+ effectivePrices: EffectivePrices;
249
+ effectiveLongCost: number;
250
+ effectiveShortRevenue: number;
251
+ longArbProfit: number;
252
+ shortArbProfit: number;
253
+ totalBidDepth: number;
254
+ totalAskDepth: number;
255
+ imbalanceRatio: number;
256
+ yesSpread: number;
257
+ };
258
+ }
259
+ export interface ArbitrageOpportunity {
260
+ type: 'long' | 'short';
261
+ profit: number;
262
+ action: string;
263
+ expectedProfit: number;
264
+ }
265
+ export interface PriceUpdate {
266
+ assetId: string;
267
+ price: number;
268
+ midpoint: number;
269
+ spread: number;
270
+ timestamp: number;
271
+ }
272
+ export interface BookUpdate {
273
+ assetId: string;
274
+ bids: Array<{
275
+ price: number;
276
+ size: number;
277
+ }>;
278
+ asks: Array<{
279
+ price: number;
280
+ size: number;
281
+ }>;
282
+ timestamp: number;
283
+ }
284
+ export interface UnifiedMarket {
285
+ conditionId: string;
286
+ slug: string;
287
+ question: string;
288
+ description?: string;
289
+ tokens: {
290
+ yes: {
291
+ tokenId: string;
292
+ price: number;
293
+ };
294
+ no: {
295
+ tokenId: string;
296
+ price: number;
297
+ };
298
+ };
299
+ volume: number;
300
+ volume24hr?: number;
301
+ liquidity: number;
302
+ spread?: number;
303
+ /** 1-day price change (from Gamma API) */
304
+ oneDayPriceChange?: number;
305
+ /** 1-week price change (from Gamma API) */
306
+ oneWeekPriceChange?: number;
307
+ active: boolean;
308
+ closed: boolean;
309
+ acceptingOrders: boolean;
310
+ endDate: Date;
311
+ source: 'gamma' | 'clob' | 'merged';
312
+ }
313
+ export declare function getIntervalMs(interval: KLineInterval): number;
314
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Common types used across the SDK
3
+ */
4
+ // Helper to convert interval to milliseconds
5
+ export function getIntervalMs(interval) {
6
+ const map = {
7
+ '30s': 30 * 1000,
8
+ '1m': 60 * 1000,
9
+ '5m': 5 * 60 * 1000,
10
+ '15m': 15 * 60 * 1000,
11
+ '30m': 30 * 60 * 1000,
12
+ '1h': 60 * 60 * 1000,
13
+ '4h': 4 * 60 * 60 * 1000,
14
+ '12h': 12 * 60 * 60 * 1000,
15
+ '1d': 24 * 60 * 60 * 1000,
16
+ };
17
+ return map[interval];
18
+ }
19
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuVH,6CAA6C;AAC7C,MAAM,UAAU,aAAa,CAAC,QAAuB;IACnD,MAAM,GAAG,GAAkC;QACzC,KAAK,EAAE,EAAE,GAAG,IAAI;QAChB,IAAI,EAAE,EAAE,GAAG,IAAI;QACf,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI;QACnB,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;QACrB,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;QACrB,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;QACpB,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;QACxB,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;QAC1B,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;KAC1B,CAAC;IACF,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Unified cache interface for poly-sdk
3
+ *
4
+ * Bridges between:
5
+ * 1. Legacy internal Cache (synchronous get/set with millisecond TTL)
6
+ * 2. New CacheAdapter interface (async with second TTL)
7
+ *
8
+ * This allows the SDK to accept external cache adapters while maintaining
9
+ * backward compatibility with existing code.
10
+ */
11
+ import type { CacheAdapter } from '@prediction-router/cache';
12
+ import { Cache, CACHE_TTL } from './cache.js';
13
+ /**
14
+ * Unified cache interface that works with both legacy Cache and CacheAdapter
15
+ *
16
+ * Key features:
17
+ * - Async API (compatible with CacheAdapter)
18
+ * - Millisecond TTL (compatible with existing SDK code)
19
+ * - getOrSet helper for cache-aside pattern
20
+ */
21
+ export interface UnifiedCache {
22
+ get<T>(key: string): Promise<T | undefined>;
23
+ set<T>(key: string, value: T, ttlMs: number): Promise<void>;
24
+ getOrSet<T>(key: string, ttlMs: number, factory: () => Promise<T>): Promise<T>;
25
+ invalidate(pattern: string): Promise<void>;
26
+ clear(): void;
27
+ }
28
+ /**
29
+ * Wraps the legacy Cache class to provide async interface
30
+ */
31
+ export declare class LegacyCacheWrapper implements UnifiedCache {
32
+ private cache;
33
+ constructor(cache: Cache);
34
+ get<T>(key: string): Promise<T | undefined>;
35
+ set<T>(key: string, value: T, ttlMs: number): Promise<void>;
36
+ getOrSet<T>(key: string, ttlMs: number, factory: () => Promise<T>): Promise<T>;
37
+ invalidate(pattern: string): Promise<void>;
38
+ clear(): void;
39
+ }
40
+ /**
41
+ * Wraps a CacheAdapter to provide legacy-compatible interface
42
+ *
43
+ * Main differences:
44
+ * - Converts milliseconds to seconds for TTL
45
+ * - Returns undefined instead of null for missing keys
46
+ * - Implements getOrSet helper
47
+ * - Implements pattern-based invalidation (limited support)
48
+ */
49
+ export declare class CacheAdapterWrapper implements UnifiedCache {
50
+ private adapter;
51
+ constructor(adapter: CacheAdapter);
52
+ get<T>(key: string): Promise<T | undefined>;
53
+ set<T>(key: string, value: T, ttlMs: number): Promise<void>;
54
+ getOrSet<T>(key: string, ttlMs: number, factory: () => Promise<T>): Promise<T>;
55
+ invalidate(pattern: string): Promise<void>;
56
+ clear(): void;
57
+ }
58
+ /**
59
+ * Create a UnifiedCache from either legacy Cache or CacheAdapter
60
+ */
61
+ export declare function createUnifiedCache(cache?: CacheAdapter | Cache): UnifiedCache;
62
+ export { CACHE_TTL };
63
+ //# sourceMappingURL=unified-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unified-cache.d.ts","sourceRoot":"","sources":["../../src/core/unified-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAC5C,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC/E,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;GAEG;AACH,qBAAa,kBAAmB,YAAW,YAAY;IACzC,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,KAAK;IAE1B,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAI3C,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3D,QAAQ,CAAC,CAAC,EACd,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACxB,OAAO,CAAC,CAAC,CAAC;IAIP,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,KAAK,IAAI,IAAI;CAGd;AAED;;;;;;;;GAQG;AACH,qBAAa,mBAAoB,YAAW,YAAY;IAC1C,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,YAAY;IAEnC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAK3C,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc3D,QAAQ,CAAC,CAAC,EACd,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACxB,OAAO,CAAC,CAAC,CAAC;IAkBP,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQhD,KAAK,IAAI,IAAI;CAGd;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,CAAC,EAAE,YAAY,GAAG,KAAK,GAC3B,YAAY,CAiBd;AAGD,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Unified cache interface for poly-sdk
3
+ *
4
+ * Bridges between:
5
+ * 1. Legacy internal Cache (synchronous get/set with millisecond TTL)
6
+ * 2. New CacheAdapter interface (async with second TTL)
7
+ *
8
+ * This allows the SDK to accept external cache adapters while maintaining
9
+ * backward compatibility with existing code.
10
+ */
11
+ import { Cache, CACHE_TTL } from './cache.js';
12
+ /**
13
+ * Wraps the legacy Cache class to provide async interface
14
+ */
15
+ export class LegacyCacheWrapper {
16
+ cache;
17
+ constructor(cache) {
18
+ this.cache = cache;
19
+ }
20
+ async get(key) {
21
+ return this.cache.get(key);
22
+ }
23
+ async set(key, value, ttlMs) {
24
+ this.cache.set(key, value, ttlMs);
25
+ }
26
+ async getOrSet(key, ttlMs, factory) {
27
+ return this.cache.getOrSet(key, ttlMs, factory);
28
+ }
29
+ async invalidate(pattern) {
30
+ this.cache.invalidate(pattern);
31
+ }
32
+ clear() {
33
+ this.cache.clear();
34
+ }
35
+ }
36
+ /**
37
+ * Wraps a CacheAdapter to provide legacy-compatible interface
38
+ *
39
+ * Main differences:
40
+ * - Converts milliseconds to seconds for TTL
41
+ * - Returns undefined instead of null for missing keys
42
+ * - Implements getOrSet helper
43
+ * - Implements pattern-based invalidation (limited support)
44
+ */
45
+ export class CacheAdapterWrapper {
46
+ adapter;
47
+ constructor(adapter) {
48
+ this.adapter = adapter;
49
+ }
50
+ async get(key) {
51
+ const value = await this.adapter.get(key);
52
+ return value ?? undefined;
53
+ }
54
+ async set(key, value, ttlMs) {
55
+ // Convert milliseconds to seconds
56
+ const ttlSeconds = Math.ceil(ttlMs / 1000);
57
+ // Check if this is a CacheManager (has getStats method)
58
+ if ('getStats' in this.adapter) {
59
+ // This is a CacheManager - use CacheSetOptions signature
60
+ await this.adapter.set(key, value, { ttl: ttlSeconds });
61
+ }
62
+ else {
63
+ // This is a regular CacheAdapter - use simple signature
64
+ await this.adapter.set(key, value, ttlSeconds);
65
+ }
66
+ }
67
+ async getOrSet(key, ttlMs, factory) {
68
+ const cached = await this.adapter.get(key);
69
+ if (cached !== null)
70
+ return cached;
71
+ const value = await factory();
72
+ const ttlSeconds = Math.ceil(ttlMs / 1000);
73
+ // Check if this is a CacheManager
74
+ if ('getStats' in this.adapter) {
75
+ // This is a CacheManager
76
+ await this.adapter.set(key, value, { ttl: ttlSeconds });
77
+ }
78
+ else {
79
+ // This is a regular CacheAdapter
80
+ await this.adapter.set(key, value, ttlSeconds);
81
+ }
82
+ return value;
83
+ }
84
+ async invalidate(pattern) {
85
+ // CacheAdapter doesn't have pattern matching
86
+ // Best we can do is warn - this is a limitation
87
+ console.warn(`invalidate(pattern="${pattern}") not fully supported with external cache adapter`);
88
+ }
89
+ clear() {
90
+ void this.adapter.clear?.();
91
+ }
92
+ }
93
+ /**
94
+ * Create a UnifiedCache from either legacy Cache or CacheAdapter
95
+ */
96
+ export function createUnifiedCache(cache) {
97
+ if (!cache) {
98
+ // No cache provided, create default legacy cache
99
+ return new LegacyCacheWrapper(new Cache());
100
+ }
101
+ // Check if it's a CacheAdapter (has async get method)
102
+ if ('get' in cache && typeof cache.get === 'function') {
103
+ const testResult = cache.get('test');
104
+ if (testResult instanceof Promise) {
105
+ // It's a CacheAdapter
106
+ return new CacheAdapterWrapper(cache);
107
+ }
108
+ }
109
+ // It's a legacy Cache
110
+ return new LegacyCacheWrapper(cache);
111
+ }
112
+ // Re-export CACHE_TTL for convenience
113
+ export { CACHE_TTL };
114
+ //# sourceMappingURL=unified-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unified-cache.js","sourceRoot":"","sources":["../../src/core/unified-cache.ts"],"names":[],"mappings":"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"}