@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.
- package/README.md +545 -812
- package/README.zh-CN.md +645 -342
- package/dist/__tests__/integration/arbitrage-service.integration.test.d.ts +12 -0
- package/dist/__tests__/integration/arbitrage-service.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/arbitrage-service.integration.test.js +267 -0
- package/dist/__tests__/integration/arbitrage-service.integration.test.js.map +1 -0
- package/dist/__tests__/integration/data-api.integration.test.js +6 -3
- package/dist/__tests__/integration/data-api.integration.test.js.map +1 -1
- package/dist/__tests__/integration/market-service.integration.test.d.ts +10 -0
- package/dist/__tests__/integration/market-service.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/market-service.integration.test.js +173 -0
- package/dist/__tests__/integration/market-service.integration.test.js.map +1 -0
- package/dist/__tests__/integration/realtime-service-v2.integration.test.d.ts +10 -0
- package/dist/__tests__/integration/realtime-service-v2.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/realtime-service-v2.integration.test.js +307 -0
- package/dist/__tests__/integration/realtime-service-v2.integration.test.js.map +1 -0
- package/dist/__tests__/integration/trading-service.integration.test.d.ts +10 -0
- package/dist/__tests__/integration/trading-service.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/trading-service.integration.test.js +58 -0
- package/dist/__tests__/integration/trading-service.integration.test.js.map +1 -0
- package/dist/clients/clob-api.d.ts +73 -0
- package/dist/clients/clob-api.d.ts.map +1 -1
- package/dist/clients/clob-api.js +60 -0
- package/dist/clients/clob-api.js.map +1 -1
- package/dist/clients/data-api.d.ts +319 -14
- package/dist/clients/data-api.d.ts.map +1 -1
- package/dist/clients/data-api.js +342 -15
- package/dist/clients/data-api.js.map +1 -1
- package/dist/clients/subgraph.d.ts +196 -0
- package/dist/clients/subgraph.d.ts.map +1 -0
- package/dist/clients/subgraph.js +332 -0
- package/dist/clients/subgraph.js.map +1 -0
- package/dist/clients/websocket-manager.d.ts +3 -0
- package/dist/clients/websocket-manager.d.ts.map +1 -1
- package/dist/clients/websocket-manager.js +10 -3
- package/dist/clients/websocket-manager.js.map +1 -1
- package/dist/core/cache.d.ts +1 -0
- package/dist/core/cache.d.ts.map +1 -1
- package/dist/core/cache.js +1 -0
- package/dist/core/cache.js.map +1 -1
- package/dist/core/errors.d.ts +2 -1
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +2 -0
- package/dist/core/errors.js.map +1 -1
- package/dist/core/rate-limiter.d.ts +2 -1
- package/dist/core/rate-limiter.d.ts.map +1 -1
- package/dist/core/rate-limiter.js +5 -0
- package/dist/core/rate-limiter.js.map +1 -1
- package/dist/core/types.d.ts +100 -12
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/types.test.d.ts +7 -0
- package/dist/core/types.test.d.ts.map +1 -0
- package/dist/core/types.test.js +122 -0
- package/dist/core/types.test.js.map +1 -0
- package/dist/index.d.ts +76 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +125 -132
- package/dist/index.js.map +1 -1
- package/dist/services/arbitrage-service.d.ts +3 -2
- package/dist/services/arbitrage-service.d.ts.map +1 -1
- package/dist/services/arbitrage-service.js +58 -40
- package/dist/services/arbitrage-service.js.map +1 -1
- package/dist/services/market-service.d.ts +108 -8
- package/dist/services/market-service.d.ts.map +1 -1
- package/dist/services/market-service.js +352 -36
- package/dist/services/market-service.js.map +1 -1
- package/dist/services/onchain-service.d.ts +309 -0
- package/dist/services/onchain-service.d.ts.map +1 -0
- package/dist/services/onchain-service.js +417 -0
- package/dist/services/onchain-service.js.map +1 -0
- package/dist/services/realtime-service-v2.d.ts +361 -0
- package/dist/services/realtime-service-v2.d.ts.map +1 -0
- package/dist/services/realtime-service-v2.js +840 -0
- package/dist/services/realtime-service-v2.js.map +1 -0
- package/dist/services/realtime-service.d.ts +17 -17
- package/dist/services/realtime-service.d.ts.map +1 -1
- package/dist/services/realtime-service.js +91 -59
- package/dist/services/realtime-service.js.map +1 -1
- package/dist/services/smart-money-service.d.ts +196 -0
- package/dist/services/smart-money-service.d.ts.map +1 -0
- package/dist/services/smart-money-service.js +358 -0
- package/dist/services/smart-money-service.js.map +1 -0
- package/dist/services/trading-service.d.ts +156 -0
- package/dist/services/trading-service.d.ts.map +1 -0
- package/dist/services/trading-service.js +356 -0
- package/dist/services/trading-service.js.map +1 -0
- package/dist/services/wallet-service.d.ts +183 -2
- package/dist/services/wallet-service.d.ts.map +1 -1
- package/dist/services/wallet-service.js +458 -1
- package/dist/services/wallet-service.js.map +1 -1
- package/dist/utils/price-utils.test.d.ts +5 -0
- package/dist/utils/price-utils.test.d.ts.map +1 -0
- package/dist/utils/price-utils.test.js +192 -0
- package/dist/utils/price-utils.test.js.map +1 -0
- package/package.json +4 -3
- 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
|
-
[](package.json)
|
|
6
|
-
[](LICENSE)
|
|
3
|
+
[](https://www.npmjs.com/package/@catalyst-team/poly-sdk)
|
|
4
|
+
[](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
|
-
|
|
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
|
-
|
|
25
|
-
|
|
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
|
-
|
|
31
|
-
import { PolymarketSDK } from '@catalyst-team/poly-sdk';
|
|
37
|
+
## 概览
|
|
32
38
|
|
|
33
|
-
|
|
39
|
+
`@catalyst-team/poly-sdk` 是一个全面的 TypeScript SDK,提供:
|
|
34
40
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
│
|
|
83
|
+
│ PolymarketSDK │
|
|
84
|
+
│ (入口点) │
|
|
55
85
|
├──────────────────────────────────────────────────────────────────────────────┤
|
|
56
|
-
│
|
|
57
|
-
│
|
|
58
|
-
│
|
|
59
|
-
│
|
|
60
|
-
│ │
|
|
61
|
-
│
|
|
62
|
-
│
|
|
63
|
-
│ │
|
|
64
|
-
│
|
|
65
|
-
│
|
|
66
|
-
│
|
|
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
|
-
│
|
|
70
|
-
│
|
|
71
|
-
│ │
|
|
72
|
-
│
|
|
73
|
-
│
|
|
74
|
-
│
|
|
75
|
-
│
|
|
76
|
-
│ │
|
|
77
|
-
│ │
|
|
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
|
-
│
|
|
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
|
-
|
|
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
|
-
|
|
156
|
+
---
|
|
93
157
|
|
|
94
|
-
|
|
95
|
-
买 YES @ P = 卖 NO @ (1-P)
|
|
96
|
-
```
|
|
158
|
+
## 快速开始
|
|
97
159
|
|
|
98
|
-
|
|
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
|
-
|
|
109
|
-
import { getEffectivePrices, checkArbitrage } from '@catalyst-team/poly-sdk';
|
|
165
|
+
// 只读操作无需认证
|
|
166
|
+
const sdk = new PolymarketSDK();
|
|
110
167
|
|
|
111
|
-
//
|
|
112
|
-
const
|
|
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
|
-
//
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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 =
|
|
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.
|
|
182
|
+
console.log(`${arb.type.toUpperCase()} 套利: ${(arb.profit * 100).toFixed(2)}% 利润`);
|
|
183
|
+
console.log(arb.action);
|
|
124
184
|
}
|
|
125
185
|
```
|
|
126
186
|
|
|
127
|
-
|
|
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 {
|
|
190
|
+
import { PolymarketSDK } from '@catalyst-team/poly-sdk';
|
|
161
191
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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
|
-
|
|
185
|
-
|
|
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
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
}
|
|
192
|
-
});
|
|
208
|
+
// 获取未成交订单
|
|
209
|
+
const openOrders = await sdk.tradingService.getOpenOrders();
|
|
210
|
+
console.log(`未成交订单: ${openOrders.length}`);
|
|
193
211
|
|
|
194
|
-
//
|
|
195
|
-
|
|
196
|
-
|
|
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
|
-
|
|
207
|
-
// 服务现在自动监控并执行套利...
|
|
208
|
-
await new Promise(resolve => setTimeout(resolve, 60 * 60 * 1000)); // 1 小时
|
|
218
|
+
## 服务指南
|
|
209
219
|
|
|
210
|
-
|
|
211
|
-
await arbService.stop();
|
|
212
|
-
console.log('统计数据:', arbService.getStats());
|
|
220
|
+
### PolymarketSDK (入口)
|
|
213
221
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
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
|
-
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
### TradingService
|
|
220
266
|
|
|
221
|
-
|
|
267
|
+
使用 `@polymarket/clob-client` 进行订单管理。
|
|
222
268
|
|
|
223
269
|
```typescript
|
|
224
|
-
import {
|
|
270
|
+
import { TradingService } from '@catalyst-team/poly-sdk';
|
|
225
271
|
|
|
226
|
-
const
|
|
272
|
+
const trading = new TradingService(rateLimiter, cache, {
|
|
227
273
|
privateKey: process.env.POLYMARKET_PRIVATE_KEY!,
|
|
228
274
|
});
|
|
275
|
+
await trading.initialize();
|
|
229
276
|
|
|
230
|
-
|
|
277
|
+
// ===== 限价单 =====
|
|
231
278
|
|
|
232
|
-
// GTC
|
|
233
|
-
const
|
|
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
|
-
//
|
|
242
|
-
const
|
|
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
|
|
251
|
-
|
|
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
|
-
|
|
362
|
+
#### 理解 Polymarket 订单簿
|
|
255
363
|
|
|
256
|
-
|
|
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
|
-
|
|
373
|
+
// 错误: 重复计算镜像订单
|
|
374
|
+
const askSum = YES.ask + NO.ask; // ~1.998, 而非 ~1.0
|
|
272
375
|
|
|
273
|
-
|
|
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
|
-
//
|
|
279
|
-
const
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
//
|
|
291
|
-
const
|
|
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
|
-
|
|
418
|
+
// Redeem: 获胜代币 -> USDC(结算后)
|
|
419
|
+
const redeemResult = await onchain.redeemByTokenIds(conditionId, tokenIds);
|
|
296
420
|
|
|
297
|
-
|
|
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
|
-
|
|
431
|
+
**注意**: Polymarket CTF 需要 **USDC.e** (0x2791...),不是原生 USDC。
|
|
300
432
|
|
|
301
|
-
|
|
433
|
+
---
|
|
302
434
|
|
|
303
|
-
|
|
435
|
+
### RealtimeServiceV2
|
|
304
436
|
|
|
305
|
-
|
|
306
|
-
|------|------|---------------|
|
|
307
|
-
| USDC.e | `0x2791...` | ✅ **必需** |
|
|
308
|
-
| USDC (原生) | `0x3c49...` | ❌ 不接受 |
|
|
437
|
+
使用 `@polymarket/real-time-data-client` 的 WebSocket 实时数据。
|
|
309
438
|
|
|
310
439
|
```typescript
|
|
311
|
-
import {
|
|
440
|
+
import { RealtimeServiceV2 } from '@catalyst-team/poly-sdk';
|
|
312
441
|
|
|
313
|
-
const
|
|
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
|
-
|
|
316
|
-
|
|
317
|
-
|
|
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
|
-
//
|
|
320
|
-
const
|
|
468
|
+
// 获取缓存价格
|
|
469
|
+
const price = realtime.getPrice(yesTokenId);
|
|
470
|
+
const book = realtime.getBook(yesTokenId);
|
|
321
471
|
|
|
322
|
-
//
|
|
323
|
-
|
|
324
|
-
console.log(`预期输出: ${quote.estimatedAmountOut} USDC.e`);
|
|
472
|
+
// 清理
|
|
473
|
+
realtime.disconnect();
|
|
325
474
|
```
|
|
326
475
|
|
|
327
|
-
|
|
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);
|
|
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
|
-
|
|
511
|
+
---
|
|
512
|
+
|
|
513
|
+
### SmartMoneyService
|
|
514
|
+
|
|
515
|
+
聪明钱检测和**实时自动跟单交易**。
|
|
349
516
|
|
|
350
517
|
```typescript
|
|
351
|
-
|
|
352
|
-
const klines = await sdk.markets.getKLines(conditionId, '1h', { limit: 100 });
|
|
518
|
+
import { PolymarketSDK } from '@catalyst-team/poly-sdk';
|
|
353
519
|
|
|
354
|
-
//
|
|
355
|
-
const
|
|
520
|
+
// 一行代码启动(推荐)
|
|
521
|
+
const sdk = await PolymarketSDK.create({ privateKey: '0x...' });
|
|
356
522
|
|
|
357
|
-
//
|
|
358
|
-
|
|
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
|
-
|
|
367
|
-
|
|
368
|
-
|
|
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
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
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
|
-
|
|
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
|
-
|
|
398
|
-
- **bids**: 升序(最低价在前 = 最差价)
|
|
399
|
-
- **asks**: 降序(最高价在前 = 最差价)
|
|
572
|
+
---
|
|
400
573
|
|
|
401
|
-
|
|
402
|
-
- **bids**: 降序(最高价在前 = 最佳买价)
|
|
403
|
-
- **asks**: 升序(最低价在前 = 最佳卖价)
|
|
574
|
+
### ArbitrageService
|
|
404
575
|
|
|
405
|
-
|
|
576
|
+
实时套利检测、执行和仓位管理。
|
|
406
577
|
|
|
407
578
|
```typescript
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
const
|
|
411
|
-
|
|
412
|
-
//
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
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 {
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
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
|
-
|
|
454
|
-
|
|
455
|
-
|
|
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
|
-
|
|
462
|
-
- Data API: 10 请求/秒
|
|
463
|
-
- Gamma API: 10 请求/秒
|
|
464
|
-
- CLOB API: 5 请求/秒
|
|
683
|
+
### 迁移指南
|
|
465
684
|
|
|
466
685
|
```typescript
|
|
467
|
-
|
|
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
|
|
471
|
-
|
|
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
|
-
|
|
698
|
+
---
|
|
480
699
|
|
|
481
|
-
##
|
|
700
|
+
## 示例
|
|
482
701
|
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
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
|
-
|
|
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
|
-
|
|
792
|
+
---
|
|
494
793
|
|
|
495
|
-
|
|
496
|
-
- 🔧 ArbitrageService 验证和完善
|
|
794
|
+
## 依赖
|
|
497
795
|
|
|
498
|
-
|
|
796
|
+
- `@polymarket/clob-client` - 官方 CLOB 交易客户端
|
|
797
|
+
- `@polymarket/real-time-data-client` - 官方 WebSocket 客户端
|
|
798
|
+
- `ethers@5` - 区块链交互
|
|
799
|
+
- `bottleneck` - 速率限制
|
|
499
800
|
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
801
|
+
---
|
|
802
|
+
|
|
803
|
+
## 许可证
|
|
804
|
+
|
|
805
|
+
MIT
|