@catalyst-team/poly-sdk 0.2.1 → 0.3.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 (97) hide show
  1. package/README.md +545 -812
  2. package/README.zh-CN.md +645 -342
  3. package/dist/__tests__/integration/arbitrage-service.integration.test.d.ts +12 -0
  4. package/dist/__tests__/integration/arbitrage-service.integration.test.d.ts.map +1 -0
  5. package/dist/__tests__/integration/arbitrage-service.integration.test.js +267 -0
  6. package/dist/__tests__/integration/arbitrage-service.integration.test.js.map +1 -0
  7. package/dist/__tests__/integration/data-api.integration.test.js +6 -3
  8. package/dist/__tests__/integration/data-api.integration.test.js.map +1 -1
  9. package/dist/__tests__/integration/market-service.integration.test.d.ts +10 -0
  10. package/dist/__tests__/integration/market-service.integration.test.d.ts.map +1 -0
  11. package/dist/__tests__/integration/market-service.integration.test.js +173 -0
  12. package/dist/__tests__/integration/market-service.integration.test.js.map +1 -0
  13. package/dist/__tests__/integration/realtime-service-v2.integration.test.d.ts +10 -0
  14. package/dist/__tests__/integration/realtime-service-v2.integration.test.d.ts.map +1 -0
  15. package/dist/__tests__/integration/realtime-service-v2.integration.test.js +307 -0
  16. package/dist/__tests__/integration/realtime-service-v2.integration.test.js.map +1 -0
  17. package/dist/__tests__/integration/trading-service.integration.test.d.ts +10 -0
  18. package/dist/__tests__/integration/trading-service.integration.test.d.ts.map +1 -0
  19. package/dist/__tests__/integration/trading-service.integration.test.js +58 -0
  20. package/dist/__tests__/integration/trading-service.integration.test.js.map +1 -0
  21. package/dist/clients/clob-api.d.ts +73 -0
  22. package/dist/clients/clob-api.d.ts.map +1 -1
  23. package/dist/clients/clob-api.js +60 -0
  24. package/dist/clients/clob-api.js.map +1 -1
  25. package/dist/clients/data-api.d.ts +319 -14
  26. package/dist/clients/data-api.d.ts.map +1 -1
  27. package/dist/clients/data-api.js +342 -15
  28. package/dist/clients/data-api.js.map +1 -1
  29. package/dist/clients/subgraph.d.ts +196 -0
  30. package/dist/clients/subgraph.d.ts.map +1 -0
  31. package/dist/clients/subgraph.js +332 -0
  32. package/dist/clients/subgraph.js.map +1 -0
  33. package/dist/clients/websocket-manager.d.ts +3 -0
  34. package/dist/clients/websocket-manager.d.ts.map +1 -1
  35. package/dist/clients/websocket-manager.js +10 -3
  36. package/dist/clients/websocket-manager.js.map +1 -1
  37. package/dist/core/cache.d.ts +1 -0
  38. package/dist/core/cache.d.ts.map +1 -1
  39. package/dist/core/cache.js +1 -0
  40. package/dist/core/cache.js.map +1 -1
  41. package/dist/core/errors.d.ts +2 -1
  42. package/dist/core/errors.d.ts.map +1 -1
  43. package/dist/core/errors.js +2 -0
  44. package/dist/core/errors.js.map +1 -1
  45. package/dist/core/rate-limiter.d.ts +2 -1
  46. package/dist/core/rate-limiter.d.ts.map +1 -1
  47. package/dist/core/rate-limiter.js +5 -0
  48. package/dist/core/rate-limiter.js.map +1 -1
  49. package/dist/core/types.d.ts +100 -12
  50. package/dist/core/types.d.ts.map +1 -1
  51. package/dist/core/types.js.map +1 -1
  52. package/dist/core/types.test.d.ts +7 -0
  53. package/dist/core/types.test.d.ts.map +1 -0
  54. package/dist/core/types.test.js +122 -0
  55. package/dist/core/types.test.js.map +1 -0
  56. package/dist/index.d.ts +76 -18
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +125 -132
  59. package/dist/index.js.map +1 -1
  60. package/dist/services/arbitrage-service.d.ts +3 -2
  61. package/dist/services/arbitrage-service.d.ts.map +1 -1
  62. package/dist/services/arbitrage-service.js +58 -40
  63. package/dist/services/arbitrage-service.js.map +1 -1
  64. package/dist/services/market-service.d.ts +108 -8
  65. package/dist/services/market-service.d.ts.map +1 -1
  66. package/dist/services/market-service.js +352 -36
  67. package/dist/services/market-service.js.map +1 -1
  68. package/dist/services/onchain-service.d.ts +309 -0
  69. package/dist/services/onchain-service.d.ts.map +1 -0
  70. package/dist/services/onchain-service.js +417 -0
  71. package/dist/services/onchain-service.js.map +1 -0
  72. package/dist/services/realtime-service-v2.d.ts +361 -0
  73. package/dist/services/realtime-service-v2.d.ts.map +1 -0
  74. package/dist/services/realtime-service-v2.js +840 -0
  75. package/dist/services/realtime-service-v2.js.map +1 -0
  76. package/dist/services/realtime-service.d.ts +17 -17
  77. package/dist/services/realtime-service.d.ts.map +1 -1
  78. package/dist/services/realtime-service.js +91 -59
  79. package/dist/services/realtime-service.js.map +1 -1
  80. package/dist/services/smart-money-service.d.ts +196 -0
  81. package/dist/services/smart-money-service.d.ts.map +1 -0
  82. package/dist/services/smart-money-service.js +358 -0
  83. package/dist/services/smart-money-service.js.map +1 -0
  84. package/dist/services/trading-service.d.ts +156 -0
  85. package/dist/services/trading-service.d.ts.map +1 -0
  86. package/dist/services/trading-service.js +356 -0
  87. package/dist/services/trading-service.js.map +1 -0
  88. package/dist/services/wallet-service.d.ts +183 -2
  89. package/dist/services/wallet-service.d.ts.map +1 -1
  90. package/dist/services/wallet-service.js +458 -1
  91. package/dist/services/wallet-service.js.map +1 -1
  92. package/dist/utils/price-utils.test.d.ts +5 -0
  93. package/dist/utils/price-utils.test.d.ts.map +1 -0
  94. package/dist/utils/price-utils.test.js +192 -0
  95. package/dist/utils/price-utils.test.js.map +1 -0
  96. package/package.json +4 -3
  97. package/README.en.md +0 -502
package/README.zh-CN.md CHANGED
@@ -1,236 +1,283 @@
1
1
  # @catalyst-team/poly-sdk
2
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)
3
+ [![npm version](https://img.shields.io/npm/v/@catalyst-team/poly-sdk.svg)](https://www.npmjs.com/package/@catalyst-team/poly-sdk)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
5
 
8
- Polymarket 统一 TypeScript SDK - 预测市场交易、套利检测、聪明钱分析和完整市场数据。
6
+ **Polymarket 统一 TypeScript SDK** - 交易、市场数据、聪明钱分析和链上操作。
9
7
 
10
8
  **开发者**: [@hhhx402](https://x.com/hhhx402) | **项目**: [Catalyst.fun](https://x.com/catalystdotfun)
11
9
 
12
- ## 核心功能
10
+ [English](README.md)
13
11
 
14
- - 🔄 **实时套利检测**: WebSocket 监控 + 自动执行
15
- - 📊 **聪明钱分析**: 追踪顶级交易者及其策略
16
- - 💱 **交易集成**: 支持 GTC/GTD/FOK/FAK 订单类型
17
- - 🔐 **链上操作**: Split、Merge、Redeem CTF 代币
18
- - 🌉 **跨链桥接**: 从 Ethereum、Solana、Bitcoin 充值
19
- - 💰 **DEX 交换**: 使用 QuickSwap V3 在 Polygon 上兑换代币
20
- - 📈 **市场分析**: K 线、信号、成交量分析
12
+ ---
21
13
 
22
- ## 安装
14
+ ## 目录
23
15
 
24
- ```bash
25
- pnpm add @catalyst-team/poly-sdk
26
- ```
16
+ - [概览](#概览)
17
+ - [安装](#安装)
18
+ - [架构](#架构)
19
+ - [快速开始](#快速开始)
20
+ - [服务指南](#服务指南)
21
+ - [PolymarketSDK (入口)](#polymarketsdk-入口)
22
+ - [TradingService](#tradingservice)
23
+ - [MarketService](#marketservice)
24
+ - [OnchainService](#onchainservice)
25
+ - [RealtimeServiceV2](#realtimeservicev2)
26
+ - [WalletService](#walletservice)
27
+ - [SmartMoneyService](#smartmoneyservice)
28
+ - [ArbitrageService](#arbitrageservice)
29
+ - [底层客户端](#底层客户端)
30
+ - [破坏性变更 (v0.3.0)](#破坏性变更-v030)
31
+ - [示例](#示例)
32
+ - [API 参考](#api-参考)
33
+ - [许可证](#许可证)
27
34
 
28
- ## 快速开始
35
+ ---
29
36
 
30
- ```typescript
31
- import { PolymarketSDK } from '@catalyst-team/poly-sdk';
37
+ ## 概览
32
38
 
33
- const sdk = new PolymarketSDK();
39
+ `@catalyst-team/poly-sdk` 是一个全面的 TypeScript SDK,提供:
34
40
 
35
- // 通过 slug condition ID 获取市场
36
- const market = await sdk.getMarket('will-trump-win-2024');
37
- console.log(market.tokens.yes.price); // 0.65
41
+ - **交易** - 下限价单/市价单 (GTC, GTD, FOK, FAK)
42
+ - **市场数据** - 实时价格、订单簿、K线、历史成交
43
+ - **聪明钱分析** - 追踪顶级交易者、计算聪明分数、跟单策略
44
+ - **链上操作** - CTF (split/merge/redeem)、授权、DEX 交换
45
+ - **套利检测** - 实时套利扫描和执行
46
+ - **WebSocket 推送** - 实时价格和订单簿更新
38
47
 
39
- // 获取处理后的订单簿(包含分析数据)
40
- const orderbook = await sdk.getOrderbook(market.conditionId);
41
- console.log(orderbook.summary.longArbProfit); // 套利机会
48
+ ### 核心功能
42
49
 
43
- // 检测套利
44
- const arb = await sdk.detectArbitrage(market.conditionId);
45
- if (arb) {
46
- console.log(`${arb.type} 套利: ${arb.profit * 100}% 利润`);
47
- }
50
+ | 功能 | 描述 |
51
+ |------|------|
52
+ | **统一 API** | 单一 SDK 访问所有 Polymarket API |
53
+ | **类型安全** | 完整的 TypeScript 支持和类型定义 |
54
+ | **速率限制** | 按 API 端点内置速率限制 |
55
+ | **缓存** | 基于 TTL 的缓存,支持可插拔适配器 |
56
+ | **错误处理** | 结构化错误和自动重试 |
57
+
58
+ ---
59
+
60
+ ## 安装
61
+
62
+ ```bash
63
+ pnpm add @catalyst-team/poly-sdk
64
+
65
+ # 或
66
+ npm install @catalyst-team/poly-sdk
67
+
68
+ # 或
69
+ yarn add @catalyst-team/poly-sdk
48
70
  ```
49
71
 
72
+ ---
73
+
50
74
  ## 架构
51
75
 
76
+ SDK 分为三层:
77
+
52
78
  ```
79
+ poly-sdk 架构
80
+ ================================================================================
81
+
53
82
  ┌──────────────────────────────────────────────────────────────────────────────┐
54
- PolymarketSDK
83
+ PolymarketSDK
84
+ │ (入口点) │
55
85
  ├──────────────────────────────────────────────────────────────────────────────┤
56
- 第三层: 服务层
57
- ┌─────────────┐ ┌─────────────┐ ┌───────────────┐ ┌─────────────────────────┐│
58
- │钱包服务 │市场服务 │ │实时服务 │ │ 授权服务 ││
59
- - 用户画像 │ - K 线 │ │- 订阅管理 │ │ - ERC20 授权 ││
60
- │ │ - 卖出检测 │ │ - 信号 │- 价格缓存 │ - ERC1155 授权 ││
61
- └─────────────┘ └─────────────┘ └───────────────┘ └─────────────────────────┘│
62
- ┌─────────────────────────────────────────────────────────────────────────┐
63
- │ │ 套利服务: 实时套利检测、自动再平衡、智能清仓 │ │
64
- └─────────────────────────────────────────────────────────────────────────┘
65
- ┌─────────────────────────────────────────────────────────────────────────┐
66
- 交换服务: Polygon 上的 DEX 交换 (QuickSwap V3, USDC/USDC.e 转换)
67
- └─────────────────────────────────────────────────────────────────────────┘
86
+
87
+ 第三层: 高级服务 (推荐使用) │
88
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
89
+ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
90
+ │ │ TradingService MarketService │ │ OnchainService
91
+ │ ────────────── │ ────────────── │ │ ────────────── │ │
92
+ • 限价单 │ • K线 │ │ • Split/Merge │ │
93
+ │ │ 市价单 │• 订单簿 │ • Redeem │ │
94
+ • 订单管理 │ • 价格历史 │ │ • 授权 │ │
95
+ • 奖励 │ • 套利检测 │ │ • 交换 │ │
96
+ └─────────────────┘ └─────────────────┘ └─────────────────┘
97
+
98
+ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
99
+ │ │RealtimeServiceV2│ │ WalletService │ │SmartMoneyService│ │
100
+ │ │ ────────────── │ │ ────────────── │ │ ────────────── │ │
101
+ │ │ • WebSocket │ │ • 用户画像 │ │ • 顶级交易者 │ │
102
+ │ │ • 价格推送 │ │ • 聪明分数 │ │ • 跟单交易 │ │
103
+ │ │ • 订单簿更新 │ │ • 卖出检测 │ │ • 信号检测 │ │
104
+ │ │ • 用户事件 │ │ • PnL 计算 │ │ • 排行榜 │ │
105
+ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
106
+ │ │
107
+ │ ┌─────────────────────────────────────────────────────────────────────────┐ │
108
+ │ │ ArbitrageService │ │
109
+ │ │ ───────────────────────────────────────────────────────────────────── │ │
110
+ │ │ • 市场扫描 • 自动执行 • 再平衡器 • 智能清仓 │ │
111
+ │ └─────────────────────────────────────────────────────────────────────────┘ │
112
+ │ │
68
113
  ├──────────────────────────────────────────────────────────────────────────────┤
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
- └──────────────────────────────────────┘ └────────────────────────────────┘
114
+
115
+ 第二层: 底层客户端 (高级用户 / 原始 API 访问)
116
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
117
+ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐
118
+ │ │GammaApiClnt│ │DataApiClnt │ │SubgraphClnt│CTFClient │ │BridgeClient
119
+ ────────── ────────── │ ────────── │ │ ────────── │ │ ────────── │ │
120
+ • 市场 │ • 持仓 │ │ • 链上数据 │ │ • Split │ │ • 跨链 │ │
121
+ │ │ 事件 │ │ 交易 │ • PnL │ • Merge │ │ 充值 │ │
122
+ │ │ 搜索 │• 活动 OI │ Redeem
123
+ └────────────┘ └────────────┘ └────────────┘ └────────────┘ └────────────┘
124
+ │ │
125
+ │ 使用官方 Polymarket 客户端: │
126
+ │ • @polymarket/clob-client - 交易、订单簿、市场数据 │
127
+ │ • @polymarket/real-time-data-client - WebSocket 实时更新 │
128
+ │ │
79
129
  ├──────────────────────────────────────────────────────────────────────────────┤
80
- 第一层: 基础设施
81
- ┌────────────┐ ┌─────────┐ ┌──────────┐ ┌────────────┐ ┌──────────────┐
82
- │速率限制器 │ 缓存 │ │ 错误 │ │ 类型 │ │ 价格工具 │ │
83
- │按 API 限制 │ │TTL 机制 │ 重试机制 │ │ 统一定义 │ │ 套利检测 │ │
84
- └────────────┘ └─────────┘ └──────────┘ └────────────┘ └──────────────┘
130
+
131
+ 第一层: 核心基础设施
132
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
133
+ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐
134
+ │ 速率限制器 │ │ 缓存 │ │ 错误 │ │ 类型 │ │ 价格工具
135
+ │ │ ────────── │ │ ────────── │ │ ────────── │ │ ────────── │ │ ────────── │ │
136
+ │ │ • 按 API │ │ • 基于 TTL │ │ • 重试 │ │ • 统一 │ │ • 套利计算 │ │
137
+ │ │ • Bottleneck│ │ • 可插拔 │ │ • 错误码 │ │ • K线 │ │ • 舍入 │ │
138
+ │ └────────────┘ └────────────┘ └────────────┘ └────────────┘ └────────────┘ │
139
+ │ │
85
140
  └──────────────────────────────────────────────────────────────────────────────┘
86
141
  ```
87
142
 
88
- ## 核心概念
143
+ ### 服务职责
89
144
 
90
- ### 理解 Polymarket 的镜像订单簿
145
+ | 服务 | 职责 |
146
+ |------|------|
147
+ | **PolymarketSDK** | 入口点,整合所有服务 |
148
+ | **TradingService** | 订单管理(下单/撤单/查询)|
149
+ | **MarketService** | 市场数据(订单簿/K线/搜索)|
150
+ | **OnchainService** | 链上操作(split/merge/redeem/授权/交换)|
151
+ | **RealtimeServiceV2** | WebSocket 实时数据 |
152
+ | **WalletService** | 钱包/交易者分析 |
153
+ | **SmartMoneyService** | 聪明钱跟踪 |
154
+ | **ArbitrageService** | 套利检测与执行 |
91
155
 
92
- ⚠️ **关键:Polymarket 订单簿有一个容易被忽略的镜像特性**
156
+ ---
93
157
 
94
- ```
95
- 买 YES @ P = 卖 NO @ (1-P)
96
- ```
158
+ ## 快速开始
97
159
 
98
- 这意味着**同一订单会出现在两个订单簿中**。例如,一个 "卖 NO @ 0.50" 订单会同时作为 "买 YES @ 0.50" 出现在 YES 订单簿中。
160
+ ### 基础用法(只读)
99
161
 
100
- **常见错误:**
101
162
  ```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
- ```
163
+ import { PolymarketSDK } from '@catalyst-team/poly-sdk';
106
164
 
107
- **正确做法:使用有效价格**
108
- ```typescript
109
- import { getEffectivePrices, checkArbitrage } from '@catalyst-team/poly-sdk';
165
+ // 只读操作无需认证
166
+ const sdk = new PolymarketSDK();
110
167
 
111
- // 计算考虑镜像后的最优价格
112
- const effective = getEffectivePrices(yesAsk, yesBid, noAsk, noBid);
168
+ // 通过 slug 或 condition ID 获取市场
169
+ const market = await sdk.getMarket('will-trump-win-2024');
170
+ console.log(`${market.question}`);
171
+ console.log(`YES: ${market.tokens.find(t => t.outcome === 'Yes')?.price}`);
172
+ console.log(`NO: ${market.tokens.find(t => t.outcome === 'No')?.price}`);
113
173
 
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)
174
+ // 获取处理后的订单簿(含分析数据)
175
+ const orderbook = await sdk.getOrderbook(market.conditionId);
176
+ console.log(`多头套利利润: ${orderbook.summary.longArbProfit}`);
177
+ console.log(`空头套利利润: ${orderbook.summary.shortArbProfit}`);
118
178
 
119
- // 使用有效价格检测套利
120
- const arb = checkArbitrage(yesAsk, noAsk, yesBid, noBid);
179
+ // 检测套利机会
180
+ const arb = await sdk.detectArbitrage(market.conditionId);
121
181
  if (arb) {
122
- console.log(`${arb.type} 套利: ${(arb.profit * 100).toFixed(2)}% 利润`);
123
- console.log(arb.description);
182
+ console.log(`${arb.type.toUpperCase()} 套利: ${(arb.profit * 100).toFixed(2)}% 利润`);
183
+ console.log(arb.action);
124
184
  }
125
185
  ```
126
186
 
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
- **完整工作流:**
187
+ ### 带认证(交易)
158
188
 
159
189
  ```typescript
160
- import { ArbitrageService } from '@catalyst-team/poly-sdk';
190
+ import { PolymarketSDK } from '@catalyst-team/poly-sdk';
161
191
 
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, // 如果一侧失败自动卖出多余部分
192
+ // 推荐: 使用静态工厂方法(一行代码启动)
193
+ const sdk = await PolymarketSDK.create({
194
+ privateKey: process.env.POLYMARKET_PRIVATE_KEY!,
181
195
  });
196
+ // 准备好交易 - SDK 已初始化并连接 WebSocket
182
197
 
183
- // 监听事件
184
- arbService.on('opportunity', (opp) => {
185
- console.log(`${opp.type.toUpperCase()} 套利: ${opp.profitPercent.toFixed(2)}%`);
198
+ // 下限价单
199
+ const order = await sdk.tradingService.createLimitOrder({
200
+ tokenId: yesTokenId,
201
+ side: 'BUY',
202
+ price: 0.45,
203
+ size: 10,
204
+ orderType: 'GTC',
186
205
  });
206
+ console.log(`订单已下: ${order.id}`);
187
207
 
188
- arbService.on('execution', (result) => {
189
- if (result.success) {
190
- console.log(`✅ 已执行: $${result.profit.toFixed(2)} 利润`);
191
- }
192
- });
208
+ // 获取未成交订单
209
+ const openOrders = await sdk.tradingService.getOpenOrders();
210
+ console.log(`未成交订单: ${openOrders.length}`);
193
211
 
194
- // ========== 步骤 1: 扫描市场 ==========
195
- const results = await arbService.scanMarkets({ minVolume24h: 5000 }, 0.005);
196
- console.log(`找到 ${results.filter(r => r.arbType !== 'none').length} 个机会`);
212
+ // 完成后清理
213
+ sdk.stop();
214
+ ```
197
215
 
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)}%)`);
216
+ ---
205
217
 
206
- // ========== 步骤 2: 运行套利 ==========
207
- // 服务现在自动监控并执行套利...
208
- await new Promise(resolve => setTimeout(resolve, 60 * 60 * 1000)); // 1 小时
218
+ ## 服务指南
209
219
 
210
- // ========== 步骤 3: 停止并清仓 ==========
211
- await arbService.stop();
212
- console.log('统计数据:', arbService.getStats());
220
+ ### PolymarketSDK (入口)
213
221
 
214
- // 智能清仓: 活跃市场 merge+sell, 已结算市场 redeem
215
- const clearResult = await arbService.clearPositions(best.market, true);
216
- console.log(`✅ 已回收: $${clearResult.totalUsdcRecovered.toFixed(2)}`);
222
+ 整合所有服务的主 SDK 类。
223
+
224
+ ```typescript
225
+ import { PolymarketSDK } from '@catalyst-team/poly-sdk';
226
+
227
+ // ===== 方式 1: 静态工厂方法(推荐)=====
228
+ // 一行搞定: new + initialize + connect + waitForConnection
229
+ const sdk = await PolymarketSDK.create({
230
+ privateKey: '0x...', // 可选: 用于交易
231
+ chainId: 137, // 可选: Polygon 主网(默认)
232
+ });
233
+
234
+ // ===== 方式 2: 使用 start() =====
235
+ // const sdk = new PolymarketSDK({ privateKey: '0x...' });
236
+ // await sdk.start(); // initialize + connect + waitForConnection
237
+
238
+ // ===== 方式 3: 手动分步(完全控制)=====
239
+ // const sdk = new PolymarketSDK({ privateKey: '0x...' });
240
+ // await sdk.initialize(); // 初始化交易服务
241
+ // sdk.connect(); // 连接 WebSocket
242
+ // await sdk.waitForConnection(); // 等待连接完成
243
+
244
+ // 访问服务
245
+ sdk.tradingService // 交易操作
246
+ sdk.markets // 市场数据
247
+ sdk.wallets // 钱包分析
248
+ sdk.realtime // WebSocket 实时数据
249
+ sdk.smartMoney // 聪明钱跟踪和跟单交易
250
+ sdk.dataApi // 直接访问 Data API
251
+ sdk.gammaApi // 直接访问 Gamma API
252
+ sdk.subgraph // 通过 Goldsky 访问链上数据
253
+
254
+ // 便捷方法
255
+ await sdk.getMarket(identifier); // 获取统一市场
256
+ await sdk.getOrderbook(conditionId); // 获取处理后的订单簿
257
+ await sdk.detectArbitrage(conditionId); // 检测套利机会
258
+
259
+ // 清理
260
+ sdk.stop(); // 断开所有服务
217
261
  ```
218
262
 
219
- ## API 客户端
263
+ ---
264
+
265
+ ### TradingService
220
266
 
221
- ### TradingClient - 订单执行
267
+ 使用 `@polymarket/clob-client` 进行订单管理。
222
268
 
223
269
  ```typescript
224
- import { TradingClient, RateLimiter } from '@catalyst-team/poly-sdk';
270
+ import { TradingService } from '@catalyst-team/poly-sdk';
225
271
 
226
- const tradingClient = new TradingClient(new RateLimiter(), {
272
+ const trading = new TradingService(rateLimiter, cache, {
227
273
  privateKey: process.env.POLYMARKET_PRIVATE_KEY!,
228
274
  });
275
+ await trading.initialize();
229
276
 
230
- await tradingClient.initialize();
277
+ // ===== 限价单 =====
231
278
 
232
- // GTC 限价单(保持有效直到成交或取消)
233
- const order = await tradingClient.createOrder({
279
+ // GTC: 一直有效直到取消
280
+ const gtcOrder = await trading.createLimitOrder({
234
281
  tokenId: yesTokenId,
235
282
  side: 'BUY',
236
283
  price: 0.45,
@@ -238,93 +285,199 @@ const order = await tradingClient.createOrder({
238
285
  orderType: 'GTC',
239
286
  });
240
287
 
241
- // FOK 市价单(完全成交或取消)
242
- const marketOrder = await tradingClient.createMarketOrder({
288
+ // GTD: 有效期至指定时间
289
+ const gtdOrder = await trading.createLimitOrder({
290
+ tokenId: yesTokenId,
291
+ side: 'BUY',
292
+ price: 0.45,
293
+ size: 10,
294
+ orderType: 'GTD',
295
+ expiration: Math.floor(Date.now() / 1000) + 3600, // 1 小时
296
+ });
297
+
298
+ // ===== 市价单 =====
299
+
300
+ // FOK: 全部成交或取消
301
+ const fokOrder = await trading.createMarketOrder({
243
302
  tokenId: yesTokenId,
244
303
  side: 'BUY',
245
304
  amount: 10, // $10 USDC
246
305
  orderType: 'FOK',
247
306
  });
248
307
 
249
- // 订单管理
250
- const openOrders = await tradingClient.getOpenOrders();
251
- await tradingClient.cancelOrder(orderId);
308
+ // FAK: 部分成交也可以
309
+ const fakOrder = await trading.createMarketOrder({
310
+ tokenId: yesTokenId,
311
+ side: 'SELL',
312
+ amount: 10, // 10 份额
313
+ orderType: 'FAK',
314
+ });
315
+
316
+ // ===== 订单管理 =====
317
+ const openOrders = await trading.getOpenOrders();
318
+ await trading.cancelOrder(orderId);
319
+ await trading.cancelAllOrders();
320
+
321
+ // ===== 奖励(做市激励)=====
322
+ const isScoring = await trading.isOrderScoring(orderId);
323
+ const rewards = await trading.getCurrentRewards();
324
+ const earnings = await trading.getEarnings('2024-12-07');
325
+ ```
326
+
327
+ ---
328
+
329
+ ### MarketService
330
+
331
+ 市场数据、K线、订单簿分析。
332
+
333
+ ```typescript
334
+ import { MarketService } from '@catalyst-team/poly-sdk';
335
+
336
+ // 获取统一市场
337
+ const market = await sdk.markets.getMarket('btc-100k-2024');
338
+
339
+ // 获取 K 线
340
+ const klines = await sdk.markets.getKLines(conditionId, '1h', { limit: 100 });
341
+
342
+ // 获取双 K 线(YES + NO)含价差分析
343
+ const dual = await sdk.markets.getDualKLines(conditionId, '1h');
344
+ console.log(dual.yes); // YES 代币蜡烛图
345
+ console.log(dual.no); // NO 代币蜡烛图
346
+ console.log(dual.spreadAnalysis); // 历史价差(成交价)
347
+ console.log(dual.realtimeSpread); // 实时价差(订单簿)
348
+
349
+ // 获取处理后的订单簿
350
+ const orderbook = await sdk.markets.getProcessedOrderbook(conditionId);
351
+
352
+ // 快速实时价差检查
353
+ const spread = await sdk.markets.getRealtimeSpread(conditionId);
354
+ if (spread.longArbProfit > 0.005) {
355
+ console.log(`多头套利: 买 YES@${spread.yesAsk} + NO@${spread.noAsk}`);
356
+ }
357
+
358
+ // 检测市场信号
359
+ const signals = await sdk.markets.detectMarketSignals(conditionId);
252
360
  ```
253
361
 
254
- ### CTFClient - 链上代币操作
362
+ #### 理解 Polymarket 订单簿
255
363
 
256
- CTF (Conditional Token Framework) 客户端支持 Polymarket 条件代币的链上操作。
364
+ **重要**: Polymarket 订单簿有镜像特性:
257
365
 
258
366
  ```
259
- ┌─────────────────────────────────────────────────────────────────────────────┐
260
- │ CTF 操作快速参考 │
261
- ├─────────────────────────────────────────────────────────────────────────────┤
262
- │ 操作 │ 功能 │ 典型用例 │
263
- ├────────────┼─────────────────────┼────────────────────────────────────────────┤
264
- │ Split │ USDC → YES + NO │ 做市:创建代币库存 │
265
- │ Merge │ YES + NO → USDC │ 套利:买入双边后合并 │
266
- │ Redeem │ 获胜代币 → USDC │ 结算:领取获胜代币 │
267
- └─────────────────────────────────────────────────────────────────────────────┘
367
+ 买 YES @ P = 卖 NO @ (1-P)
268
368
  ```
269
369
 
370
+ 这意味着**同一订单会出现在两个订单簿中**。简单相加会导致重复计算:
371
+
270
372
  ```typescript
271
- import { CTFClient } from '@catalyst-team/poly-sdk';
373
+ // 错误: 重复计算镜像订单
374
+ const askSum = YES.ask + NO.ask; // ~1.998, 而非 ~1.0
272
375
 
273
- const ctf = new CTFClient({
376
+ // 正确: 使用有效价格
377
+ import { getEffectivePrices, checkArbitrage } from '@catalyst-team/poly-sdk';
378
+
379
+ const effective = getEffectivePrices(yesAsk, yesBid, noAsk, noBid);
380
+ // effective.effectiveBuyYes = min(YES.ask, 1 - NO.bid)
381
+ // effective.effectiveBuyNo = min(NO.ask, 1 - YES.bid)
382
+
383
+ const arb = checkArbitrage(yesAsk, noAsk, yesBid, noBid);
384
+ if (arb) {
385
+ console.log(`${arb.type} 套利: ${(arb.profit * 100).toFixed(2)}% 利润`);
386
+ }
387
+ ```
388
+
389
+ ---
390
+
391
+ ### OnchainService
392
+
393
+ 链上操作的统一接口:CTF + 授权 + 交换。
394
+
395
+ ```typescript
396
+ import { OnchainService } from '@catalyst-team/poly-sdk';
397
+
398
+ const onchain = new OnchainService({
274
399
  privateKey: process.env.POLYMARKET_PRIVATE_KEY!,
275
- rpcUrl: 'https://polygon-rpc.com',
400
+ rpcUrl: 'https://polygon-rpc.com', // 可选
276
401
  });
277
402
 
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
- ```
403
+ // 检查是否准备好进行 CTF 交易
404
+ const status = await onchain.checkReadyForCTF('100');
405
+ if (!status.ready) {
406
+ console.log('问题:', status.issues);
407
+ await onchain.approveAll();
408
+ }
409
+
410
+ // ===== CTF 操作 =====
411
+
412
+ // Split: USDC -> YES + NO 代币
413
+ const splitResult = await onchain.split(conditionId, '100');
414
+
415
+ // Merge: YES + NO -> USDC(用于套利)
416
+ const mergeResult = await onchain.mergeByTokenIds(conditionId, tokenIds, '100');
294
417
 
295
- ⚠️ **重要:对 Polymarket 市场使用 `mergeByTokenIds()` 和 `redeemByTokenIds()`**
418
+ // Redeem: 获胜代币 -> USDC(结算后)
419
+ const redeemResult = await onchain.redeemByTokenIds(conditionId, tokenIds);
296
420
 
297
- Polymarket 使用的自定义 token ID 与标准 CTF position ID 不同。始终使用 `*ByTokenIds` 方法配合 CLOB API 返回的 token ID。
421
+ // ===== DEX 交换 (QuickSwap V3) =====
422
+
423
+ // 将 MATIC 交换为 USDC.e(CTF 需要)
424
+ await onchain.swap('MATIC', 'USDC_E', '50');
425
+
426
+ // 获取余额
427
+ const balances = await onchain.getBalances();
428
+ console.log(`USDC.e: ${balances.usdcE}`);
429
+ ```
298
430
 
299
- ### SwapService - Polygon 上的 DEX 交换
431
+ **注意**: Polymarket CTF 需要 **USDC.e** (0x2791...),不是原生 USDC。
300
432
 
301
- 使用 QuickSwap V3 在 Polygon 上交换代币。对于 CTF 操作,转换为 USDC.e 是必需的。
433
+ ---
302
434
 
303
- ⚠️ **Polymarket CTF 的 USDC vs USDC.e**
435
+ ### RealtimeServiceV2
304
436
 
305
- | 代币 | 地址 | Polymarket CTF |
306
- |------|------|---------------|
307
- | USDC.e | `0x2791...` | ✅ **必需** |
308
- | USDC (原生) | `0x3c49...` | ❌ 不接受 |
437
+ 使用 `@polymarket/real-time-data-client` WebSocket 实时数据。
309
438
 
310
439
  ```typescript
311
- import { SwapService, POLYGON_TOKENS } from '@catalyst-team/poly-sdk';
440
+ import { RealtimeServiceV2 } from '@catalyst-team/poly-sdk';
312
441
 
313
- const swapService = new SwapService(signer);
442
+ const realtime = new RealtimeServiceV2({
443
+ autoReconnect: true,
444
+ pingInterval: 5000,
445
+ });
446
+
447
+ // 连接并订阅
448
+ realtime.connect();
449
+ realtime.subscribeMarket([yesTokenId, noTokenId]);
450
+
451
+ // 事件 API
452
+ realtime.on('priceUpdate', (update) => {
453
+ console.log(`${update.assetId}: ${update.price}`);
454
+ console.log(`中间价: ${update.midpoint}, 价差: ${update.spread}`);
455
+ });
314
456
 
315
- // 将原生 USDC 交换为 USDC.e 用于 CTF 操作
316
- const swapResult = await swapService.swap('USDC', 'USDC_E', '100');
317
- console.log(`已交换: ${swapResult.amountOut} USDC.e`);
457
+ realtime.on('bookUpdate', (update) => {
458
+ // 订单簿自动规范化:
459
+ // bids: 降序(最佳在前), asks: 升序(最佳在前)
460
+ console.log(`最佳买价: ${update.bids[0]?.price}`);
461
+ console.log(`最佳卖价: ${update.asks[0]?.price}`);
462
+ });
463
+
464
+ realtime.on('lastTrade', (trade) => {
465
+ console.log(`成交: ${trade.side} ${trade.size} @ ${trade.price}`);
466
+ });
318
467
 
319
- // 将 MATIC 交换为 USDC.e
320
- const maticSwap = await swapService.swap('MATIC', 'USDC_E', '50');
468
+ // 获取缓存价格
469
+ const price = realtime.getPrice(yesTokenId);
470
+ const book = realtime.getBook(yesTokenId);
321
471
 
322
- // 交换前获取报价
323
- const quote = await swapService.getQuote('WETH', 'USDC_E', '0.1');
324
- console.log(`预期输出: ${quote.estimatedAmountOut} USDC.e`);
472
+ // 清理
473
+ realtime.disconnect();
325
474
  ```
326
475
 
327
- ### WalletService - 聪明钱分析
476
+ ---
477
+
478
+ ### WalletService
479
+
480
+ 钱包分析和聪明钱评分。
328
481
 
329
482
  ```typescript
330
483
  // 获取顶级交易者
@@ -332,171 +485,321 @@ const traders = await sdk.wallets.getTopTraders(10);
332
485
 
333
486
  // 获取钱包画像(含聪明分数)
334
487
  const profile = await sdk.wallets.getWalletProfile('0x...');
335
- console.log(profile.smartScore); // 0-100
488
+ console.log(`聪明分数: ${profile.smartScore}/100`);
489
+ console.log(`胜率: ${profile.winRate}%`);
490
+ console.log(`总 PnL: $${profile.totalPnL}`);
336
491
 
337
492
  // 检测卖出活动(用于跟单策略)
338
493
  const sellResult = await sdk.wallets.detectSellActivity(
339
494
  '0x...',
340
495
  conditionId,
341
- Date.now() - 24 * 60 * 60 * 1000
496
+ Date.now() - 24 * 60 * 60 * 1000 // 24小时前
342
497
  );
343
498
  if (sellResult.isSelling) {
344
499
  console.log(`已卖出 ${sellResult.percentageSold}%`);
345
500
  }
501
+
502
+ // 跟踪群体卖出比例
503
+ const groupSell = await sdk.wallets.trackGroupSellRatio(
504
+ ['0x...', '0x...'],
505
+ conditionId,
506
+ peakValue,
507
+ sinceTimestamp
508
+ );
346
509
  ```
347
510
 
348
- ### MarketService - K 线和信号
511
+ ---
512
+
513
+ ### SmartMoneyService
514
+
515
+ 聪明钱检测和**实时自动跟单交易**。
349
516
 
350
517
  ```typescript
351
- // 获取 K 线蜡烛图
352
- const klines = await sdk.markets.getKLines(conditionId, '1h', { limit: 100 });
518
+ import { PolymarketSDK } from '@catalyst-team/poly-sdk';
353
519
 
354
- // 获取双 K 线(YES + NO)含价差分析
355
- const dual = await sdk.markets.getDualKLines(conditionId, '1h');
520
+ // 一行代码启动(推荐)
521
+ const sdk = await PolymarketSDK.create({ privateKey: '0x...' });
356
522
 
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
- }
523
+ // ===== 自动跟单交易 =====
524
+ // 实时跟单 - 聪明钱一旦交易,立即跟单
364
525
 
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
- ```
526
+ const subscription = await sdk.smartMoney.startAutoCopyTrading({
527
+ // 目标选择
528
+ topN: 50, // 跟踪排行榜前 50 名
529
+ // targetAddresses: ['0x...'], // 或直接指定地址
373
530
 
374
- #### 价差分析 - 两种方法
531
+ // 订单设置
532
+ sizeScale: 0.1, // 跟单 10% 的交易量
533
+ maxSizePerTrade: 10, // 每笔最多 $10
534
+ maxSlippage: 0.03, // 3% 滑点容忍度
535
+ orderType: 'FOK', // FOK 或 FAK
375
536
 
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
537
+ // 过滤
538
+ minTradeSize: 5, // 只跟单 > $5 的交易
539
+ sideFilter: 'BUY', // 只跟单买入(可选)
540
+
541
+ // 测试模式
542
+ dryRun: true, // 设为 false 执行真实交易
543
+
544
+ // 回调
545
+ onTrade: (trade, result) => {
546
+ console.log(`跟单 ${trade.traderName}: ${result.success ? '' : '❌'}`);
547
+ },
548
+ onError: (error) => console.error(error),
549
+ });
550
+ // 停止
551
+ subscription.stop();
552
+ sdk.stop();
553
+
554
+ console.log(`正在跟踪 ${subscription.targetAddresses.length} 个钱包`);
555
+
556
+ // 获取统计
557
+ const stats = subscription.getStats();
558
+ console.log(`检测: ${stats.tradesDetected}, 执行: ${stats.tradesExecuted}`);
559
+
560
+ // 停止
561
+ subscription.stop();
562
+ sdk.stop();
391
563
  ```
392
564
 
393
- ### RealtimeService - WebSocket 订阅
565
+ > **注意**: Polymarket 最小订单金额为 **$1**。低于 $1 的订单会被自动跳过。
394
566
 
395
- ⚠️ **重要:订单簿自动排序**
567
+ 📁 **完整示例**: 查看 [scripts/smart-money/](scripts/smart-money/) 获取完整可运行的脚本:
568
+ - `04-auto-copy-trading.ts` - 完整功能的自动跟单
569
+ - `05-auto-copy-simple.ts` - 简化的 SDK 用法
570
+ - `06-real-copy-test.ts` - 真实交易测试
396
571
 
397
- Polymarket CLOB API 返回的订单簿顺序与标准预期相反:
398
- - **bids**: 升序(最低价在前 = 最差价)
399
- - **asks**: 降序(最高价在前 = 最差价)
572
+ ---
400
573
 
401
- 我们的 SDK **自动规范化**订单簿数据:
402
- - **bids**: 降序(最高价在前 = 最佳买价)
403
- - **asks**: 升序(最低价在前 = 最佳卖价)
574
+ ### ArbitrageService
404
575
 
405
- 这意味着你可以安全地使用 `bids[0]` 和 `asks[0]` 获取最优价格:
576
+ 实时套利检测、执行和仓位管理。
406
577
 
407
578
  ```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; // ✅ 已排序
579
+ import { ArbitrageService } from '@catalyst-team/poly-sdk';
580
+
581
+ const arbService = new ArbitrageService({
582
+ privateKey: process.env.POLY_PRIVKEY,
583
+ profitThreshold: 0.005, // 最小 0.5% 利润
584
+ minTradeSize: 5, // 最小 $5
585
+ maxTradeSize: 100, // 最大 $100
586
+ autoExecute: true, // 自动执行机会
587
+
588
+ // 再平衡器: 自动维持 USDC/代币比例
589
+ enableRebalancer: true,
590
+ minUsdcRatio: 0.2, // 最小 20% USDC
591
+ maxUsdcRatio: 0.8, // 最大 80% USDC
592
+ targetUsdcRatio: 0.5, // 再平衡目标
593
+
594
+ // 执行安全
595
+ sizeSafetyFactor: 0.8, // 使用 80% 订单簿深度
596
+ autoFixImbalance: true, // 自动修复部分成交
597
+ });
598
+
599
+ // 监听事件
600
+ arbService.on('opportunity', (opp) => {
601
+ console.log(`${opp.type.toUpperCase()} 套利: ${opp.profitPercent.toFixed(2)}%`);
602
+ });
603
+
604
+ arbService.on('execution', (result) => {
605
+ if (result.success) {
606
+ console.log(`已执行: $${result.profit.toFixed(2)} 利润`);
607
+ }
416
608
  });
609
+
610
+ // ===== 工作流程 =====
611
+
612
+ // 1. 扫描市场寻找机会
613
+ const results = await arbService.scanMarkets({ minVolume24h: 5000 }, 0.005);
614
+
615
+ // 2. 开始监控最佳市场
616
+ const best = await arbService.findAndStart(0.005);
617
+ console.log(`已启动: ${best.market.name} (+${best.profitPercent.toFixed(2)}%)`);
618
+
619
+ // 3. 运行一段时间...
620
+ await new Promise(r => setTimeout(r, 60 * 60 * 1000)); // 1 小时
621
+
622
+ // 4. 停止并清仓
623
+ await arbService.stop();
624
+ const clearResult = await arbService.clearPositions(best.market, true);
625
+ console.log(`已回收: $${clearResult.totalUsdcRecovered.toFixed(2)}`);
417
626
  ```
418
627
 
419
- ## 示例
628
+ ---
629
+
630
+ ## 底层客户端
420
631
 
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
- ## 错误处理
632
+ 高级用户可直接访问 API:
436
633
 
437
634
  ```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
- }
635
+ import {
636
+ DataApiClient, // 持仓、交易、排行榜
637
+ GammaApiClient, // 市场、事件、搜索
638
+ SubgraphClient, // 通过 Goldsky 访问链上数据
639
+ CTFClient, // CTF 合约操作
640
+ BridgeClient, // 跨链充值
641
+ SwapService, // Polygon DEX 交换
642
+ } from '@catalyst-team/poly-sdk';
643
+
644
+ // Data API
645
+ const positions = await sdk.dataApi.getPositions('0x...');
646
+ const trades = await sdk.dataApi.getTrades('0x...');
647
+ const leaderboard = await sdk.dataApi.getLeaderboard();
648
+
649
+ // Gamma API
650
+ const markets = await sdk.gammaApi.searchMarkets({ query: 'bitcoin' });
651
+ const trending = await sdk.gammaApi.getTrendingMarkets(10);
652
+ const events = await sdk.gammaApi.getEvents({ limit: 20 });
653
+
654
+ // Subgraph(链上数据)
655
+ const userPositions = await sdk.subgraph.getUserPositions(address);
656
+ const isResolved = await sdk.subgraph.isConditionResolved(conditionId);
657
+ const globalOI = await sdk.subgraph.getGlobalOpenInterest();
658
+ ```
451
659
 
452
- // 自动重试(指数退避)
453
- const result = await withRetry(() => sdk.getMarket(slug), {
454
- maxRetries: 3,
455
- baseDelay: 1000,
456
- });
660
+ ---
661
+
662
+ ## 破坏性变更 (v0.3.0)
663
+
664
+ ### `UnifiedMarket.tokens` 现在是数组
665
+
666
+ **之前 (v0.2.x)**:
667
+ ```typescript
668
+ // 带 yes/no 属性的对象
669
+ const yesPrice = market.tokens.yes.price;
670
+ const noPrice = market.tokens.no.price;
457
671
  ```
458
672
 
459
- ## 速率限制
673
+ **之后 (v0.3.0)**:
674
+ ```typescript
675
+ // MarketToken 对象数组
676
+ const yesToken = market.tokens.find(t => t.outcome === 'Yes');
677
+ const noToken = market.tokens.find(t => t.outcome === 'No');
678
+
679
+ const yesPrice = yesToken?.price;
680
+ const noPrice = noToken?.price;
681
+ ```
460
682
 
461
- 内置按 API 类型的速率限制:
462
- - Data API: 10 请求/秒
463
- - Gamma API: 10 请求/秒
464
- - CLOB API: 5 请求/秒
683
+ ### 迁移指南
465
684
 
466
685
  ```typescript
467
- import { RateLimiter, ApiType } from '@catalyst-team/poly-sdk';
686
+ // 迁移辅助函数
687
+ function getTokenPrice(market: UnifiedMarket, outcome: 'Yes' | 'No'): number {
688
+ return market.tokens.find(t => t.outcome === outcome)?.price ?? 0;
689
+ }
468
690
 
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
- });
691
+ // 使用
692
+ const yesPrice = getTokenPrice(market, 'Yes');
693
+ const noPrice = getTokenPrice(market, 'No');
475
694
  ```
476
695
 
477
- ## 文档
696
+ **为什么改变?** 数组格式更好地支持多结果市场,并且与 Polymarket API 响应格式更一致。
478
697
 
479
- - [订单簿与套利指南](docs/01-polymarket-orderbook-arbitrage.md) - 理解镜像订单
698
+ ---
480
699
 
481
- ## 依赖
700
+ ## 示例
482
701
 
483
- - `@nevuamarkets/poly-websockets` - WebSocket 客户端
484
- - `bottleneck` - 速率限制
485
- - `ethers` - 区块链交互
702
+ 运行示例:
703
+
704
+ ```bash
705
+ pnpm example:basic # 基础用法
706
+ pnpm example:smart-money # 聪明钱分析
707
+ pnpm example:trading # 交易订单
708
+ pnpm example:realtime # WebSocket 推送
709
+ pnpm example:arb-service # 套利服务
710
+ ```
486
711
 
487
- ## 许可
712
+ | 示例 | 描述 |
713
+ |------|------|
714
+ | [01-basic-usage.ts](examples/01-basic-usage.ts) | 获取市场、订单簿、检测套利 |
715
+ | [02-smart-money.ts](examples/02-smart-money.ts) | 顶级交易者、钱包画像、聪明分数 |
716
+ | [03-market-analysis.ts](examples/03-market-analysis.ts) | 市场信号、成交量分析 |
717
+ | [04-kline-aggregation.ts](examples/04-kline-aggregation.ts) | 从成交构建 OHLCV 蜡烛图 |
718
+ | [05-follow-wallet-strategy.ts](examples/05-follow-wallet-strategy.ts) | 跟踪聪明钱、检测退出 |
719
+ | [06-services-demo.ts](examples/06-services-demo.ts) | 所有 SDK 服务实战 |
720
+ | [07-realtime-websocket.ts](examples/07-realtime-websocket.ts) | 实时价格推送、订单簿更新 |
721
+ | [08-trading-orders.ts](examples/08-trading-orders.ts) | GTC、GTD、FOK、FAK 订单类型 |
722
+ | [09-rewards-tracking.ts](examples/09-rewards-tracking.ts) | 做市激励、收益 |
723
+ | [10-ctf-operations.ts](examples/10-ctf-operations.ts) | Split、merge、redeem 代币 |
724
+ | [11-live-arbitrage-scan.ts](examples/11-live-arbitrage-scan.ts) | 扫描市场寻找机会 |
725
+ | [12-trending-arb-monitor.ts](examples/12-trending-arb-monitor.ts) | 实时热门监控 |
726
+ | [13-arbitrage-service.ts](examples/13-arbitrage-service.ts) | 完整套利工作流程 |
488
727
 
489
- MIT
728
+ ---
729
+
730
+ ## API 参考
731
+
732
+ 详细 API 文档见:
733
+
734
+ - [docs/00-design.md](docs/00-design.md) - 架构设计
735
+ - [docs/02-API.md](docs/02-API.md) - 完整 API 参考
736
+ - [docs/01-polymarket-orderbook-arbitrage.md](docs/01-polymarket-orderbook-arbitrage.md) - 订单簿镜像与套利
737
+
738
+ ### 类型导出
490
739
 
491
- ## 更新日志
740
+ ```typescript
741
+ import type {
742
+ // 核心类型
743
+ UnifiedMarket,
744
+ MarketToken,
745
+ ProcessedOrderbook,
746
+ ArbitrageOpportunity,
747
+ EffectivePrices,
748
+
749
+ // 交易
750
+ Side,
751
+ OrderType,
752
+ Order,
753
+ OrderResult,
754
+ LimitOrderParams,
755
+ MarketOrderParams,
756
+
757
+ // K 线
758
+ KLineInterval,
759
+ KLineCandle,
760
+ DualKLineData,
761
+ SpreadDataPoint,
762
+
763
+ // WebSocket
764
+ PriceUpdate,
765
+ BookUpdate,
766
+ OrderbookSnapshot,
767
+
768
+ // 钱包
769
+ WalletProfile,
770
+ SellActivityResult,
771
+
772
+ // 聪明钱
773
+ SmartMoneyWallet,
774
+ SmartMoneyTrade,
775
+ AutoCopyTradingOptions,
776
+ AutoCopyTradingStats,
777
+ AutoCopyTradingSubscription,
778
+
779
+ // CTF
780
+ SplitResult,
781
+ MergeResult,
782
+ RedeemResult,
783
+
784
+ // 套利
785
+ ArbitrageMarketConfig,
786
+ ArbitrageServiceConfig,
787
+ ScanResult,
788
+ ClearPositionResult,
789
+ } from '@catalyst-team/poly-sdk';
790
+ ```
492
791
 
493
- ### v0.2.0 (2024-12-24)
792
+ ---
494
793
 
495
- - 📊 基于成交量和订单簿深度的智能市场选择
496
- - 🔧 ArbitrageService 验证和完善
794
+ ## 依赖
497
795
 
498
- ### v0.1.1
796
+ - `@polymarket/clob-client` - 官方 CLOB 交易客户端
797
+ - `@polymarket/real-time-data-client` - 官方 WebSocket 客户端
798
+ - `ethers@5` - 区块链交互
799
+ - `bottleneck` - 速率限制
499
800
 
500
- - 初始套利服务实现
501
- - CTF 操作支持
502
- - 实时 WebSocket 监控
801
+ ---
802
+
803
+ ## 许可证
804
+
805
+ MIT