@catalyst-team/poly-sdk 0.1.1 → 0.2.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 (191) hide show
  1. package/LICENSE +1 -1
  2. package/README.en.md +502 -0
  3. package/README.md +6 -1
  4. package/README.zh-CN.md +502 -0
  5. package/dist/__tests__/clob-api.test.d.ts +5 -0
  6. package/dist/__tests__/clob-api.test.d.ts.map +1 -0
  7. package/dist/__tests__/clob-api.test.js +240 -0
  8. package/dist/__tests__/clob-api.test.js.map +1 -0
  9. package/dist/__tests__/integration/bridge-client.integration.test.d.ts +11 -0
  10. package/dist/__tests__/integration/bridge-client.integration.test.d.ts.map +1 -0
  11. package/dist/__tests__/integration/bridge-client.integration.test.js +260 -0
  12. package/dist/__tests__/integration/bridge-client.integration.test.js.map +1 -0
  13. package/dist/__tests__/integration/clob-api.integration.test.d.ts +13 -0
  14. package/dist/__tests__/integration/clob-api.integration.test.d.ts.map +1 -0
  15. package/dist/__tests__/integration/clob-api.integration.test.js +170 -0
  16. package/dist/__tests__/integration/clob-api.integration.test.js.map +1 -0
  17. package/dist/__tests__/integration/ctf-client.integration.test.d.ts +17 -0
  18. package/dist/__tests__/integration/ctf-client.integration.test.d.ts.map +1 -0
  19. package/dist/__tests__/integration/ctf-client.integration.test.js +234 -0
  20. package/dist/__tests__/integration/ctf-client.integration.test.js.map +1 -0
  21. package/dist/__tests__/integration/data-api.integration.test.d.ts +9 -0
  22. package/dist/__tests__/integration/data-api.integration.test.d.ts.map +1 -0
  23. package/dist/__tests__/integration/data-api.integration.test.js +161 -0
  24. package/dist/__tests__/integration/data-api.integration.test.js.map +1 -0
  25. package/dist/__tests__/integration/gamma-api.integration.test.d.ts +9 -0
  26. package/dist/__tests__/integration/gamma-api.integration.test.d.ts.map +1 -0
  27. package/dist/__tests__/integration/gamma-api.integration.test.js +170 -0
  28. package/dist/__tests__/integration/gamma-api.integration.test.js.map +1 -0
  29. package/dist/__tests__/test-utils.d.ts +92 -0
  30. package/dist/__tests__/test-utils.d.ts.map +1 -0
  31. package/dist/__tests__/test-utils.js +143 -0
  32. package/dist/__tests__/test-utils.js.map +1 -0
  33. package/dist/clients/bridge-client.d.ts +388 -0
  34. package/dist/clients/bridge-client.d.ts.map +1 -0
  35. package/dist/clients/bridge-client.js +587 -0
  36. package/dist/clients/bridge-client.js.map +1 -0
  37. package/dist/clients/clob-api.d.ts +318 -0
  38. package/dist/clients/clob-api.d.ts.map +1 -0
  39. package/dist/clients/clob-api.js +388 -0
  40. package/dist/clients/clob-api.js.map +1 -0
  41. package/dist/clients/ctf-client.d.ts +473 -0
  42. package/dist/clients/ctf-client.d.ts.map +1 -0
  43. package/dist/clients/ctf-client.js +915 -0
  44. package/dist/clients/ctf-client.js.map +1 -0
  45. package/dist/clients/data-api.d.ts +134 -0
  46. package/dist/clients/data-api.d.ts.map +1 -0
  47. package/dist/clients/data-api.js +265 -0
  48. package/dist/clients/data-api.js.map +1 -0
  49. package/dist/clients/gamma-api.d.ts +401 -0
  50. package/dist/clients/gamma-api.d.ts.map +1 -0
  51. package/dist/clients/gamma-api.js +352 -0
  52. package/dist/clients/gamma-api.js.map +1 -0
  53. package/dist/clients/trading-client.d.ts +252 -0
  54. package/dist/clients/trading-client.d.ts.map +1 -0
  55. package/dist/clients/trading-client.js +543 -0
  56. package/dist/clients/trading-client.js.map +1 -0
  57. package/dist/clients/websocket-manager.d.ts +100 -0
  58. package/dist/clients/websocket-manager.d.ts.map +1 -0
  59. package/dist/clients/websocket-manager.js +193 -0
  60. package/dist/clients/websocket-manager.js.map +1 -0
  61. package/dist/core/cache-adapter-bridge.d.ts +36 -0
  62. package/dist/core/cache-adapter-bridge.d.ts.map +1 -0
  63. package/dist/core/cache-adapter-bridge.js +81 -0
  64. package/dist/core/cache-adapter-bridge.js.map +1 -0
  65. package/dist/core/cache.d.ts +40 -0
  66. package/dist/core/cache.d.ts.map +1 -0
  67. package/dist/core/cache.js +71 -0
  68. package/dist/core/cache.js.map +1 -0
  69. package/dist/core/errors.d.ts +38 -0
  70. package/dist/core/errors.d.ts.map +1 -0
  71. package/dist/core/errors.js +84 -0
  72. package/dist/core/errors.js.map +1 -0
  73. package/dist/core/rate-limiter.d.ts +31 -0
  74. package/dist/core/rate-limiter.d.ts.map +1 -0
  75. package/dist/core/rate-limiter.js +70 -0
  76. package/dist/core/rate-limiter.js.map +1 -0
  77. package/{src/core/types.ts → dist/core/types.d.ts} +169 -215
  78. package/dist/core/types.d.ts.map +1 -0
  79. package/dist/core/types.js +19 -0
  80. package/dist/core/types.js.map +1 -0
  81. package/dist/core/unified-cache.d.ts +63 -0
  82. package/dist/core/unified-cache.d.ts.map +1 -0
  83. package/dist/core/unified-cache.js +114 -0
  84. package/dist/core/unified-cache.js.map +1 -0
  85. package/dist/index.d.ts +93 -0
  86. package/dist/index.d.ts.map +1 -0
  87. package/dist/index.js +255 -0
  88. package/dist/index.js.map +1 -0
  89. package/dist/services/arbitrage-service.d.ts +408 -0
  90. package/dist/services/arbitrage-service.d.ts.map +1 -0
  91. package/dist/services/arbitrage-service.js +1422 -0
  92. package/dist/services/arbitrage-service.js.map +1 -0
  93. package/dist/services/authorization-service.d.ts +97 -0
  94. package/dist/services/authorization-service.d.ts.map +1 -0
  95. package/dist/services/authorization-service.js +279 -0
  96. package/dist/services/authorization-service.js.map +1 -0
  97. package/dist/services/market-service.d.ts +108 -0
  98. package/dist/services/market-service.d.ts.map +1 -0
  99. package/dist/services/market-service.js +458 -0
  100. package/dist/services/market-service.js.map +1 -0
  101. package/dist/services/realtime-service.d.ts +82 -0
  102. package/dist/services/realtime-service.d.ts.map +1 -0
  103. package/dist/services/realtime-service.js +150 -0
  104. package/dist/services/realtime-service.js.map +1 -0
  105. package/dist/services/swap-service.d.ts +217 -0
  106. package/dist/services/swap-service.d.ts.map +1 -0
  107. package/dist/services/swap-service.js +695 -0
  108. package/dist/services/swap-service.js.map +1 -0
  109. package/dist/services/wallet-service.d.ts +94 -0
  110. package/dist/services/wallet-service.d.ts.map +1 -0
  111. package/dist/services/wallet-service.js +173 -0
  112. package/dist/services/wallet-service.js.map +1 -0
  113. package/dist/utils/price-utils.d.ts +153 -0
  114. package/dist/utils/price-utils.d.ts.map +1 -0
  115. package/dist/utils/price-utils.js +236 -0
  116. package/dist/utils/price-utils.js.map +1 -0
  117. package/package.json +7 -2
  118. package/docs/00-design.md +0 -760
  119. package/docs/02-API.md +0 -1148
  120. package/docs/arbitrage.md +0 -754
  121. package/docs/reports/smart-money-analysis-2025-12-23-cn.md +0 -840
  122. package/examples/01-basic-usage.ts +0 -68
  123. package/examples/02-smart-money.ts +0 -95
  124. package/examples/03-market-analysis.ts +0 -108
  125. package/examples/04-kline-aggregation.ts +0 -158
  126. package/examples/05-follow-wallet-strategy.ts +0 -156
  127. package/examples/06-services-demo.ts +0 -124
  128. package/examples/07-realtime-websocket.ts +0 -117
  129. package/examples/08-trading-orders.ts +0 -278
  130. package/examples/09-rewards-tracking.ts +0 -187
  131. package/examples/10-ctf-operations.ts +0 -336
  132. package/examples/11-live-arbitrage-scan.ts +0 -221
  133. package/examples/12-trending-arb-monitor.ts +0 -406
  134. package/examples/13-arbitrage-service.ts +0 -211
  135. package/examples/README.md +0 -179
  136. package/scripts/README.md +0 -163
  137. package/scripts/approvals/approve-erc1155.ts +0 -129
  138. package/scripts/approvals/approve-neg-risk-erc1155.ts +0 -149
  139. package/scripts/approvals/approve-neg-risk.ts +0 -102
  140. package/scripts/approvals/check-all-allowances.ts +0 -150
  141. package/scripts/approvals/check-allowance.ts +0 -129
  142. package/scripts/approvals/check-ctf-approval.ts +0 -158
  143. package/scripts/arb/faze-bo3-arb.ts +0 -385
  144. package/scripts/arb/settle-position.ts +0 -190
  145. package/scripts/arb/token-rebalancer.ts +0 -420
  146. package/scripts/datas/001-report.md +0 -486
  147. package/scripts/datas/clone-modal-screenshot.png +0 -0
  148. package/scripts/deposit/deposit-native-usdc.ts +0 -179
  149. package/scripts/deposit/deposit-usdc.ts +0 -155
  150. package/scripts/deposit/swap-usdc-to-usdce.ts +0 -375
  151. package/scripts/research/research-markets.ts +0 -166
  152. package/scripts/trading/check-orders.ts +0 -50
  153. package/scripts/trading/sell-nvidia-positions.ts +0 -206
  154. package/scripts/trading/test-order.ts +0 -172
  155. package/scripts/verify/test-approve-trading.ts +0 -98
  156. package/scripts/verify/test-provider-fix.ts +0 -43
  157. package/scripts/verify/test-search-mcp.ts +0 -113
  158. package/scripts/verify/verify-all-apis.ts +0 -160
  159. package/scripts/wallet/check-wallet-balances.ts +0 -75
  160. package/scripts/wallet/test-wallet-operations.ts +0 -191
  161. package/scripts/wallet/verify-wallet-tools.ts +0 -124
  162. package/src/__tests__/clob-api.test.ts +0 -301
  163. package/src/__tests__/integration/bridge-client.integration.test.ts +0 -314
  164. package/src/__tests__/integration/clob-api.integration.test.ts +0 -218
  165. package/src/__tests__/integration/ctf-client.integration.test.ts +0 -331
  166. package/src/__tests__/integration/data-api.integration.test.ts +0 -194
  167. package/src/__tests__/integration/gamma-api.integration.test.ts +0 -206
  168. package/src/__tests__/test-utils.ts +0 -170
  169. package/src/clients/bridge-client.ts +0 -841
  170. package/src/clients/clob-api.ts +0 -629
  171. package/src/clients/ctf-client.ts +0 -1216
  172. package/src/clients/data-api.ts +0 -469
  173. package/src/clients/gamma-api.ts +0 -597
  174. package/src/clients/trading-client.ts +0 -749
  175. package/src/clients/websocket-manager.ts +0 -267
  176. package/src/core/cache-adapter-bridge.ts +0 -94
  177. package/src/core/cache.ts +0 -85
  178. package/src/core/errors.ts +0 -117
  179. package/src/core/rate-limiter.ts +0 -74
  180. package/src/core/unified-cache.ts +0 -153
  181. package/src/index.ts +0 -461
  182. package/src/services/arbitrage-service.ts +0 -1807
  183. package/src/services/authorization-service.ts +0 -357
  184. package/src/services/market-service.ts +0 -544
  185. package/src/services/realtime-service.ts +0 -196
  186. package/src/services/swap-service.ts +0 -896
  187. package/src/services/wallet-service.ts +0 -259
  188. package/src/utils/price-utils.ts +0 -307
  189. package/tsconfig.json +0 -8
  190. package/vitest.config.ts +0 -19
  191. package/vitest.integration.config.ts +0 -18
@@ -0,0 +1,502 @@
1
+ # @catalyst-team/poly-sdk
2
+
3
+ [![English](https://img.shields.io/badge/lang-English-blue.svg)](README.en.md)
4
+ [![中文](https://img.shields.io/badge/语言-中文-red.svg)](README.zh-CN.md)
5
+ [![版本](https://img.shields.io/badge/版本-0.2.0-blue.svg)](package.json)
6
+ [![许可](https://img.shields.io/badge/许可-MIT-green.svg)](LICENSE)
7
+
8
+ Polymarket 统一 TypeScript SDK - 预测市场交易、套利检测、聪明钱分析和完整市场数据。
9
+
10
+ **开发者**: [@hhhx402](https://x.com/hhhx402) | **项目**: [Catalyst.fun](https://x.com/catalystdotfun)
11
+
12
+ ## 核心功能
13
+
14
+ - 🔄 **实时套利检测**: WebSocket 监控 + 自动执行
15
+ - 📊 **聪明钱分析**: 追踪顶级交易者及其策略
16
+ - 💱 **交易集成**: 支持 GTC/GTD/FOK/FAK 订单类型
17
+ - 🔐 **链上操作**: Split、Merge、Redeem CTF 代币
18
+ - 🌉 **跨链桥接**: 从 Ethereum、Solana、Bitcoin 充值
19
+ - 💰 **DEX 交换**: 使用 QuickSwap V3 在 Polygon 上兑换代币
20
+ - 📈 **市场分析**: K 线、信号、成交量分析
21
+
22
+ ## 安装
23
+
24
+ ```bash
25
+ pnpm add @catalyst-team/poly-sdk
26
+ ```
27
+
28
+ ## 快速开始
29
+
30
+ ```typescript
31
+ import { PolymarketSDK } from '@catalyst-team/poly-sdk';
32
+
33
+ const sdk = new PolymarketSDK();
34
+
35
+ // 通过 slug 或 condition ID 获取市场
36
+ const market = await sdk.getMarket('will-trump-win-2024');
37
+ console.log(market.tokens.yes.price); // 0.65
38
+
39
+ // 获取处理后的订单簿(包含分析数据)
40
+ const orderbook = await sdk.getOrderbook(market.conditionId);
41
+ console.log(orderbook.summary.longArbProfit); // 套利机会
42
+
43
+ // 检测套利
44
+ const arb = await sdk.detectArbitrage(market.conditionId);
45
+ if (arb) {
46
+ console.log(`${arb.type} 套利: ${arb.profit * 100}% 利润`);
47
+ }
48
+ ```
49
+
50
+ ## 架构
51
+
52
+ ```
53
+ ┌──────────────────────────────────────────────────────────────────────────────┐
54
+ │ PolymarketSDK │
55
+ ├──────────────────────────────────────────────────────────────────────────────┤
56
+ │ 第三层: 服务层 │
57
+ │ ┌─────────────┐ ┌─────────────┐ ┌───────────────┐ ┌─────────────────────────┐│
58
+ │ │钱包服务 │ │市场服务 │ │实时服务 │ │ 授权服务 ││
59
+ │ │ - 用户画像 │ │ - K 线 │ │- 订阅管理 │ │ - ERC20 授权 ││
60
+ │ │ - 卖出检测 │ │ - 信号 │ │- 价格缓存 │ │ - ERC1155 授权 ││
61
+ │ └─────────────┘ └─────────────┘ └───────────────┘ └─────────────────────────┘│
62
+ │ ┌─────────────────────────────────────────────────────────────────────────┐ │
63
+ │ │ 套利服务: 实时套利检测、自动再平衡、智能清仓 │ │
64
+ │ └─────────────────────────────────────────────────────────────────────────┘ │
65
+ │ ┌─────────────────────────────────────────────────────────────────────────┐ │
66
+ │ │ 交换服务: Polygon 上的 DEX 交换 (QuickSwap V3, USDC/USDC.e 转换) │ │
67
+ │ └─────────────────────────────────────────────────────────────────────────┘ │
68
+ ├──────────────────────────────────────────────────────────────────────────────┤
69
+ │ 第二层: API 客户端 │
70
+ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌───────────┐ ┌────────────────────┐ │
71
+ │ │ Data API │ │Gamma API │ │ CLOB API │ │ WebSocket │ │ 跨链桥 │ │
72
+ │ │持仓数据 │ │ 市场数据 │ │ 订单簿 │ │ 实时价格 │ │ 跨链充值 │ │
73
+ │ │交易记录 │ │ 事件数据 │ │ 交易 │ │ 价格推送 │ │ 多链支持 │ │
74
+ │ └──────────┘ └──────────┘ └──────────┘ └───────────┘ └────────────────────┘ │
75
+ │ ┌──────────────────────────────────────┐ ┌────────────────────────────────┐ │
76
+ │ │ 交易客户端: 订单执行 │ │ CTF 客户端: 链上操作 │ │
77
+ │ │ GTC/GTD/FOK/FAK, 奖励, 余额查询 │ │ Split / Merge / Redeem 代币 │ │
78
+ │ └──────────────────────────────────────┘ └────────────────────────────────┘ │
79
+ ├──────────────────────────────────────────────────────────────────────────────┤
80
+ │ 第一层: 基础设施 │
81
+ │ ┌────────────┐ ┌─────────┐ ┌──────────┐ ┌────────────┐ ┌──────────────┐ │
82
+ │ │速率限制器 │ │ 缓存 │ │ 错误 │ │ 类型 │ │ 价格工具 │ │
83
+ │ │按 API 限制 │ │TTL 机制 │ │ 重试机制 │ │ 统一定义 │ │ 套利检测 │ │
84
+ │ └────────────┘ └─────────┘ └──────────┘ └────────────┘ └──────────────┘ │
85
+ └──────────────────────────────────────────────────────────────────────────────┘
86
+ ```
87
+
88
+ ## 核心概念
89
+
90
+ ### 理解 Polymarket 的镜像订单簿
91
+
92
+ ⚠️ **关键:Polymarket 订单簿有一个容易被忽略的镜像特性**
93
+
94
+ ```
95
+ 买 YES @ P = 卖 NO @ (1-P)
96
+ ```
97
+
98
+ 这意味着**同一订单会出现在两个订单簿中**。例如,一个 "卖 NO @ 0.50" 订单会同时作为 "买 YES @ 0.50" 出现在 YES 订单簿中。
99
+
100
+ **常见错误:**
101
+ ```typescript
102
+ // ❌ 错误: 简单相加会重复计算镜像订单
103
+ const askSum = YES.ask + NO.ask; // ≈ 1.998-1.999,而非 ≈ 1.0
104
+ const bidSum = YES.bid + NO.bid; // ≈ 0.001-0.002,而非 ≈ 1.0
105
+ ```
106
+
107
+ **正确做法:使用有效价格**
108
+ ```typescript
109
+ import { getEffectivePrices, checkArbitrage } from '@catalyst-team/poly-sdk';
110
+
111
+ // 计算考虑镜像后的最优价格
112
+ const effective = getEffectivePrices(yesAsk, yesBid, noAsk, noBid);
113
+
114
+ // effective.effectiveBuyYes = min(YES.ask, 1 - NO.bid)
115
+ // effective.effectiveBuyNo = min(NO.ask, 1 - YES.bid)
116
+ // effective.effectiveSellYes = max(YES.bid, 1 - NO.ask)
117
+ // effective.effectiveSellNo = max(NO.bid, 1 - YES.ask)
118
+
119
+ // 使用有效价格检测套利
120
+ const arb = checkArbitrage(yesAsk, noAsk, yesBid, noBid);
121
+ if (arb) {
122
+ console.log(`${arb.type} 套利: ${(arb.profit * 100).toFixed(2)}% 利润`);
123
+ console.log(arb.description);
124
+ }
125
+ ```
126
+
127
+ 详细文档见: [docs/01-polymarket-orderbook-arbitrage.md](docs/01-polymarket-orderbook-arbitrage.md)
128
+
129
+ ### ArbitrageService - 自动化交易
130
+
131
+ 实时套利检测和执行,支持市场扫描、自动再平衡和智能清仓。
132
+
133
+ ```
134
+ ┌─────────────────────────────────────────────────────────────────────────────┐
135
+ │ 核心功能 │
136
+ ├─────────────────────────────────────────────────────────────────────────────┤
137
+ │ • scanMarkets() - 扫描市场找套利机会 │
138
+ │ • start(market) - 启动实时监控 + 自动执行 │
139
+ │ • clearPositions() - 智能清仓 (活跃市场卖出, 已结算市场 redeem) │
140
+ ├─────────────────────────────────────────────────────────────────────────────┤
141
+ │ 自动再平衡器 │
142
+ ├─────────────────────────────────────────────────────────────────────────────┤
143
+ │ 套利需要 USDC + YES/NO 代币,再平衡器自动维持最佳组合: │
144
+ │ • USDC < 20% → 自动 Merge (YES+NO → USDC) │
145
+ │ • USDC > 80% → 自动 Split (USDC → YES+NO) │
146
+ │ • 冷却机制:操作间隔 30 秒,检测间隔 10 秒 │
147
+ ├─────────────────────────────────────────────────────────────────────────────┤
148
+ │ 部分成交保护 │
149
+ ├─────────────────────────────────────────────────────────────────────────────┤
150
+ │ 套利需要同时买入 YES 和 NO,但订单可能部分成交: │
151
+ │ • sizeSafetyFactor=0.8 → 仅使用 80% 的订单簿深度 │
152
+ │ • autoFixImbalance=true → 如果只成交一侧,自动卖出多余的代币 │
153
+ │ • imbalanceThreshold=5 → YES-NO 差额超过 $5 时触发修复 │
154
+ └─────────────────────────────────────────────────────────────────────────────┘
155
+ ```
156
+
157
+ **完整工作流:**
158
+
159
+ ```typescript
160
+ import { ArbitrageService } from '@catalyst-team/poly-sdk';
161
+
162
+ const arbService = new ArbitrageService({
163
+ privateKey: process.env.POLY_PRIVKEY,
164
+ profitThreshold: 0.005, // 最小 0.5% 利润
165
+ minTradeSize: 5, // 最小 $5
166
+ maxTradeSize: 100, // 最大 $100
167
+ autoExecute: true, // 自动执行套利机会
168
+
169
+ // 再平衡配置
170
+ enableRebalancer: true, // 启用自动再平衡
171
+ minUsdcRatio: 0.2, // 最小 20% USDC (低于则 Split)
172
+ maxUsdcRatio: 0.8, // 最大 80% USDC (高于则 Merge)
173
+ targetUsdcRatio: 0.5, // 再平衡目标 50%
174
+ imbalanceThreshold: 5, // 修复前的最大 YES-NO 差额
175
+ rebalanceInterval: 10000, // 每 10 秒检查一次
176
+ rebalanceCooldown: 30000, // 操作间隔最小 30 秒
177
+
178
+ // 执行安全(防止部分成交导致 YES ≠ NO)
179
+ sizeSafetyFactor: 0.8, // 使用 80% 的订单簿深度
180
+ autoFixImbalance: true, // 如果一侧失败自动卖出多余部分
181
+ });
182
+
183
+ // 监听事件
184
+ arbService.on('opportunity', (opp) => {
185
+ console.log(`${opp.type.toUpperCase()} 套利: ${opp.profitPercent.toFixed(2)}%`);
186
+ });
187
+
188
+ arbService.on('execution', (result) => {
189
+ if (result.success) {
190
+ console.log(`✅ 已执行: $${result.profit.toFixed(2)} 利润`);
191
+ }
192
+ });
193
+
194
+ // ========== 步骤 1: 扫描市场 ==========
195
+ const results = await arbService.scanMarkets({ minVolume24h: 5000 }, 0.005);
196
+ console.log(`找到 ${results.filter(r => r.arbType !== 'none').length} 个机会`);
197
+
198
+ // 或者一键扫描 + 启动最佳市场
199
+ const best = await arbService.findAndStart(0.005);
200
+ if (!best) {
201
+ console.log('未找到套利机会');
202
+ process.exit(0);
203
+ }
204
+ console.log(`🎯 已启动: ${best.market.name} (+${best.profitPercent.toFixed(2)}%)`);
205
+
206
+ // ========== 步骤 2: 运行套利 ==========
207
+ // 服务现在自动监控并执行套利...
208
+ await new Promise(resolve => setTimeout(resolve, 60 * 60 * 1000)); // 1 小时
209
+
210
+ // ========== 步骤 3: 停止并清仓 ==========
211
+ await arbService.stop();
212
+ console.log('统计数据:', arbService.getStats());
213
+
214
+ // 智能清仓: 活跃市场 merge+sell, 已结算市场 redeem
215
+ const clearResult = await arbService.clearPositions(best.market, true);
216
+ console.log(`✅ 已回收: $${clearResult.totalUsdcRecovered.toFixed(2)}`);
217
+ ```
218
+
219
+ ## API 客户端
220
+
221
+ ### TradingClient - 订单执行
222
+
223
+ ```typescript
224
+ import { TradingClient, RateLimiter } from '@catalyst-team/poly-sdk';
225
+
226
+ const tradingClient = new TradingClient(new RateLimiter(), {
227
+ privateKey: process.env.POLYMARKET_PRIVATE_KEY!,
228
+ });
229
+
230
+ await tradingClient.initialize();
231
+
232
+ // GTC 限价单(保持有效直到成交或取消)
233
+ const order = await tradingClient.createOrder({
234
+ tokenId: yesTokenId,
235
+ side: 'BUY',
236
+ price: 0.45,
237
+ size: 10,
238
+ orderType: 'GTC',
239
+ });
240
+
241
+ // FOK 市价单(完全成交或取消)
242
+ const marketOrder = await tradingClient.createMarketOrder({
243
+ tokenId: yesTokenId,
244
+ side: 'BUY',
245
+ amount: 10, // $10 USDC
246
+ orderType: 'FOK',
247
+ });
248
+
249
+ // 订单管理
250
+ const openOrders = await tradingClient.getOpenOrders();
251
+ await tradingClient.cancelOrder(orderId);
252
+ ```
253
+
254
+ ### CTFClient - 链上代币操作
255
+
256
+ CTF (Conditional Token Framework) 客户端支持 Polymarket 条件代币的链上操作。
257
+
258
+ ```
259
+ ┌─────────────────────────────────────────────────────────────────────────────┐
260
+ │ CTF 操作快速参考 │
261
+ ├─────────────────────────────────────────────────────────────────────────────┤
262
+ │ 操作 │ 功能 │ 典型用例 │
263
+ ├────────────┼─────────────────────┼────────────────────────────────────────────┤
264
+ │ Split │ USDC → YES + NO │ 做市:创建代币库存 │
265
+ │ Merge │ YES + NO → USDC │ 套利:买入双边后合并 │
266
+ │ Redeem │ 获胜代币 → USDC │ 结算:领取获胜代币 │
267
+ └─────────────────────────────────────────────────────────────────────────────┘
268
+ ```
269
+
270
+ ```typescript
271
+ import { CTFClient } from '@catalyst-team/poly-sdk';
272
+
273
+ const ctf = new CTFClient({
274
+ privateKey: process.env.POLYMARKET_PRIVATE_KEY!,
275
+ rpcUrl: 'https://polygon-rpc.com',
276
+ });
277
+
278
+ // Split: USDC → YES + NO 代币
279
+ const splitResult = await ctf.split(conditionId, '100');
280
+ console.log(`创建了 ${splitResult.yesTokens} YES + ${splitResult.noTokens} NO`);
281
+
282
+ // Merge: YES + NO → USDC
283
+ const tokenIds = {
284
+ yesTokenId: market.tokens[0].tokenId,
285
+ noTokenId: market.tokens[1].tokenId,
286
+ };
287
+ const mergeResult = await ctf.mergeByTokenIds(conditionId, tokenIds, '100');
288
+ console.log(`收到 ${mergeResult.usdcReceived} USDC`);
289
+
290
+ // Redeem: 获胜代币 → USDC
291
+ const redeemResult = await ctf.redeemByTokenIds(conditionId, tokenIds);
292
+ console.log(`兑换了 ${redeemResult.tokensRedeemed} 个代币`);
293
+ ```
294
+
295
+ ⚠️ **重要:对 Polymarket 市场使用 `mergeByTokenIds()` 和 `redeemByTokenIds()`**
296
+
297
+ Polymarket 使用的自定义 token ID 与标准 CTF position ID 不同。始终使用 `*ByTokenIds` 方法配合 CLOB API 返回的 token ID。
298
+
299
+ ### SwapService - Polygon 上的 DEX 交换
300
+
301
+ 使用 QuickSwap V3 在 Polygon 上交换代币。对于 CTF 操作,转换为 USDC.e 是必需的。
302
+
303
+ ⚠️ **Polymarket CTF 的 USDC vs USDC.e**
304
+
305
+ | 代币 | 地址 | Polymarket CTF |
306
+ |------|------|---------------|
307
+ | USDC.e | `0x2791...` | ✅ **必需** |
308
+ | USDC (原生) | `0x3c49...` | ❌ 不接受 |
309
+
310
+ ```typescript
311
+ import { SwapService, POLYGON_TOKENS } from '@catalyst-team/poly-sdk';
312
+
313
+ const swapService = new SwapService(signer);
314
+
315
+ // 将原生 USDC 交换为 USDC.e 用于 CTF 操作
316
+ const swapResult = await swapService.swap('USDC', 'USDC_E', '100');
317
+ console.log(`已交换: ${swapResult.amountOut} USDC.e`);
318
+
319
+ // 将 MATIC 交换为 USDC.e
320
+ const maticSwap = await swapService.swap('MATIC', 'USDC_E', '50');
321
+
322
+ // 交换前获取报价
323
+ const quote = await swapService.getQuote('WETH', 'USDC_E', '0.1');
324
+ console.log(`预期输出: ${quote.estimatedAmountOut} USDC.e`);
325
+ ```
326
+
327
+ ### WalletService - 聪明钱分析
328
+
329
+ ```typescript
330
+ // 获取顶级交易者
331
+ const traders = await sdk.wallets.getTopTraders(10);
332
+
333
+ // 获取钱包画像(含聪明分数)
334
+ const profile = await sdk.wallets.getWalletProfile('0x...');
335
+ console.log(profile.smartScore); // 0-100
336
+
337
+ // 检测卖出活动(用于跟单策略)
338
+ const sellResult = await sdk.wallets.detectSellActivity(
339
+ '0x...',
340
+ conditionId,
341
+ Date.now() - 24 * 60 * 60 * 1000
342
+ );
343
+ if (sellResult.isSelling) {
344
+ console.log(`已卖出 ${sellResult.percentageSold}%`);
345
+ }
346
+ ```
347
+
348
+ ### MarketService - K 线和信号
349
+
350
+ ```typescript
351
+ // 获取 K 线蜡烛图
352
+ const klines = await sdk.markets.getKLines(conditionId, '1h', { limit: 100 });
353
+
354
+ // 获取双 K 线(YES + NO)含价差分析
355
+ const dual = await sdk.markets.getDualKLines(conditionId, '1h');
356
+
357
+ // 历史价差(来自成交收盘价)- 用于回测
358
+ for (const point of dual.spreadAnalysis) {
359
+ console.log(`${point.timestamp}: 总和=${point.priceSum}, 价差=${point.priceSpread}`);
360
+ if (point.arbOpportunity) {
361
+ console.log(` 历史 ${point.arbOpportunity} 信号`);
362
+ }
363
+ }
364
+
365
+ // 实时价差(来自订单簿)- 用于实盘交易
366
+ if (dual.realtimeSpread) {
367
+ const rt = dual.realtimeSpread;
368
+ if (rt.arbOpportunity) {
369
+ console.log(`🎯 ${rt.arbOpportunity} 套利: ${rt.arbProfitPercent.toFixed(2)}%`);
370
+ }
371
+ }
372
+ ```
373
+
374
+ #### 价差分析 - 两种方法
375
+
376
+ ```
377
+ ┌─────────────────────────────────────────────────────────────────────────┐
378
+ │ spreadAnalysis (历史分析) │ realtimeSpread (实时交易) │
379
+ ├─────────────────────────────────────────────────────────────────────────┤
380
+ │ 数据源: 成交收盘价 │ 数据源: 订单簿 bid/ask │
381
+ │ YES_close + NO_close │ 使用有效价格(考虑镜像) │
382
+ ├─────────────────────────────────────────────────────────────────────────┤
383
+ │ ✅ 可构建历史图表 │ ❌ 无历史数据* │
384
+ │ ✅ Polymarket 保留成交历史 │ ❌ Polymarket 不保留快照 │
385
+ │ ✅ 适合回测 │ ✅ 适合实盘交易 │
386
+ │ ⚠️ 套利信号仅供参考 │ ✅ 套利利润计算准确 │
387
+ └─────────────────────────────────────────────────────────────────────────┘
388
+
389
+ * 要构建历史实时价差,必须自己存储订单簿快照
390
+ 参考: apps/api/src/services/spread-sampler.ts
391
+ ```
392
+
393
+ ### RealtimeService - WebSocket 订阅
394
+
395
+ ⚠️ **重要:订单簿自动排序**
396
+
397
+ Polymarket CLOB API 返回的订单簿顺序与标准预期相反:
398
+ - **bids**: 升序(最低价在前 = 最差价)
399
+ - **asks**: 降序(最高价在前 = 最差价)
400
+
401
+ 我们的 SDK **自动规范化**订单簿数据:
402
+ - **bids**: 降序(最高价在前 = 最佳买价)
403
+ - **asks**: 升序(最低价在前 = 最佳卖价)
404
+
405
+ 这意味着你可以安全地使用 `bids[0]` 和 `asks[0]` 获取最优价格:
406
+
407
+ ```typescript
408
+ const book = await sdk.clobApi.getOrderbook(conditionId);
409
+ const bestBid = book.bids[0]?.price; // ✅ 最高买价(最佳)
410
+ const bestAsk = book.asks[0]?.price; // ✅ 最低卖价(最佳)
411
+
412
+ // WebSocket 更新同样自动排序
413
+ wsManager.on('bookUpdate', (update) => {
414
+ const bestBid = update.bids[0]?.price; // ✅ 已排序
415
+ const bestAsk = update.asks[0]?.price; // ✅ 已排序
416
+ });
417
+ ```
418
+
419
+ ## 示例
420
+
421
+ | 示例 | 说明 | 命令 |
422
+ |------|------|------|
423
+ | [基础用法](examples/01-basic-usage.ts) | 获取市场、订单簿、检测套利 | `pnpm example:basic` |
424
+ | [聪明钱](examples/02-smart-money.ts) | 顶级交易者、钱包画像、聪明分数 | `pnpm example:smart-money` |
425
+ | [市场分析](examples/03-market-analysis.ts) | 市场信号、成交量分析 | `pnpm example:market-analysis` |
426
+ | [K 线聚合](examples/04-kline-aggregation.ts) | 从成交记录构建 OHLCV 蜡烛图 | `pnpm example:kline` |
427
+ | [跟单策略](examples/05-follow-wallet-strategy.ts) | 追踪聪明钱持仓、检测退出 | `pnpm example:follow-wallet` |
428
+ | [服务演示](examples/06-services-demo.ts) | 所有 SDK 服务实战 | `pnpm example:services` |
429
+ | [实时 WebSocket](examples/07-realtime-websocket.ts) | 实时价格推送、订单簿更新 | `pnpm example:realtime` |
430
+ | [交易订单](examples/08-trading-orders.ts) | GTC、GTD、FOK、FAK 订单类型 | `pnpm example:trading` |
431
+ | [奖励追踪](examples/09-rewards-tracking.ts) | 做市激励、收益 | `pnpm example:rewards` |
432
+ | [CTF 操作](examples/10-ctf-operations.ts) | Split、merge、redeem 代币 | `pnpm example:ctf` |
433
+ | [实时套利扫描](examples/11-live-arbitrage-scan.ts) | 扫描真实市场寻找机会 | `pnpm example:live-arb` |
434
+
435
+ ## 错误处理
436
+
437
+ ```typescript
438
+ import { PolymarketError, ErrorCode, withRetry } from '@catalyst-team/poly-sdk';
439
+
440
+ try {
441
+ const market = await sdk.getMarket('invalid-slug');
442
+ } catch (error) {
443
+ if (error instanceof PolymarketError) {
444
+ if (error.code === ErrorCode.MARKET_NOT_FOUND) {
445
+ console.log('市场未找到');
446
+ } else if (error.code === ErrorCode.RATE_LIMITED) {
447
+ console.log('速率限制,稍后重试');
448
+ }
449
+ }
450
+ }
451
+
452
+ // 自动重试(指数退避)
453
+ const result = await withRetry(() => sdk.getMarket(slug), {
454
+ maxRetries: 3,
455
+ baseDelay: 1000,
456
+ });
457
+ ```
458
+
459
+ ## 速率限制
460
+
461
+ 内置按 API 类型的速率限制:
462
+ - Data API: 10 请求/秒
463
+ - Gamma API: 10 请求/秒
464
+ - CLOB API: 5 请求/秒
465
+
466
+ ```typescript
467
+ import { RateLimiter, ApiType } from '@catalyst-team/poly-sdk';
468
+
469
+ // 自定义速率限制器
470
+ const limiter = new RateLimiter({
471
+ [ApiType.DATA]: { maxConcurrent: 5, minTime: 200 },
472
+ [ApiType.GAMMA]: { maxConcurrent: 5, minTime: 200 },
473
+ [ApiType.CLOB]: { maxConcurrent: 2, minTime: 500 },
474
+ });
475
+ ```
476
+
477
+ ## 文档
478
+
479
+ - [订单簿与套利指南](docs/01-polymarket-orderbook-arbitrage.md) - 理解镜像订单
480
+
481
+ ## 依赖
482
+
483
+ - `@nevuamarkets/poly-websockets` - WebSocket 客户端
484
+ - `bottleneck` - 速率限制
485
+ - `ethers` - 区块链交互
486
+
487
+ ## 许可
488
+
489
+ MIT
490
+
491
+ ## 更新日志
492
+
493
+ ### v0.2.0 (2024-12-24)
494
+
495
+ - 📊 基于成交量和订单簿深度的智能市场选择
496
+ - 🔧 ArbitrageService 验证和完善
497
+
498
+ ### v0.1.1
499
+
500
+ - 初始套利服务实现
501
+ - CTF 操作支持
502
+ - 实时 WebSocket 监控
@@ -0,0 +1,5 @@
1
+ /**
2
+ * CLOB API Client Unit Tests
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=clob-api.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clob-api.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/clob-api.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}