@catalyst-team/poly-sdk 0.2.0 → 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.
- package/LICENSE +1 -1
- package/README.en.md +8 -44
- package/README.md +5 -3
- package/README.zh-CN.md +502 -0
- package/dist/__tests__/clob-api.test.d.ts +5 -0
- package/dist/__tests__/clob-api.test.d.ts.map +1 -0
- package/dist/__tests__/clob-api.test.js +240 -0
- package/dist/__tests__/clob-api.test.js.map +1 -0
- package/dist/__tests__/integration/bridge-client.integration.test.d.ts +11 -0
- package/dist/__tests__/integration/bridge-client.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/bridge-client.integration.test.js +260 -0
- package/dist/__tests__/integration/bridge-client.integration.test.js.map +1 -0
- package/dist/__tests__/integration/clob-api.integration.test.d.ts +13 -0
- package/dist/__tests__/integration/clob-api.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/clob-api.integration.test.js +170 -0
- package/dist/__tests__/integration/clob-api.integration.test.js.map +1 -0
- package/dist/__tests__/integration/ctf-client.integration.test.d.ts +17 -0
- package/dist/__tests__/integration/ctf-client.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/ctf-client.integration.test.js +234 -0
- package/dist/__tests__/integration/ctf-client.integration.test.js.map +1 -0
- package/dist/__tests__/integration/data-api.integration.test.d.ts +9 -0
- package/dist/__tests__/integration/data-api.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/data-api.integration.test.js +161 -0
- package/dist/__tests__/integration/data-api.integration.test.js.map +1 -0
- package/dist/__tests__/integration/gamma-api.integration.test.d.ts +9 -0
- package/dist/__tests__/integration/gamma-api.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/gamma-api.integration.test.js +170 -0
- package/dist/__tests__/integration/gamma-api.integration.test.js.map +1 -0
- package/dist/__tests__/test-utils.d.ts +92 -0
- package/dist/__tests__/test-utils.d.ts.map +1 -0
- package/dist/__tests__/test-utils.js +143 -0
- package/dist/__tests__/test-utils.js.map +1 -0
- package/dist/clients/bridge-client.d.ts +388 -0
- package/dist/clients/bridge-client.d.ts.map +1 -0
- package/dist/clients/bridge-client.js +587 -0
- package/dist/clients/bridge-client.js.map +1 -0
- package/dist/clients/clob-api.d.ts +318 -0
- package/dist/clients/clob-api.d.ts.map +1 -0
- package/dist/clients/clob-api.js +388 -0
- package/dist/clients/clob-api.js.map +1 -0
- package/dist/clients/ctf-client.d.ts +473 -0
- package/dist/clients/ctf-client.d.ts.map +1 -0
- package/dist/clients/ctf-client.js +915 -0
- package/dist/clients/ctf-client.js.map +1 -0
- package/dist/clients/data-api.d.ts +134 -0
- package/dist/clients/data-api.d.ts.map +1 -0
- package/dist/clients/data-api.js +265 -0
- package/dist/clients/data-api.js.map +1 -0
- package/dist/clients/gamma-api.d.ts +401 -0
- package/dist/clients/gamma-api.d.ts.map +1 -0
- package/dist/clients/gamma-api.js +352 -0
- package/dist/clients/gamma-api.js.map +1 -0
- package/dist/clients/trading-client.d.ts +252 -0
- package/dist/clients/trading-client.d.ts.map +1 -0
- package/dist/clients/trading-client.js +543 -0
- package/dist/clients/trading-client.js.map +1 -0
- package/dist/clients/websocket-manager.d.ts +100 -0
- package/dist/clients/websocket-manager.d.ts.map +1 -0
- package/dist/clients/websocket-manager.js +193 -0
- package/dist/clients/websocket-manager.js.map +1 -0
- package/dist/core/cache-adapter-bridge.d.ts +36 -0
- package/dist/core/cache-adapter-bridge.d.ts.map +1 -0
- package/dist/core/cache-adapter-bridge.js +81 -0
- package/dist/core/cache-adapter-bridge.js.map +1 -0
- package/dist/core/cache.d.ts +40 -0
- package/dist/core/cache.d.ts.map +1 -0
- package/dist/core/cache.js +71 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/core/errors.d.ts +38 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +84 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/rate-limiter.d.ts +31 -0
- package/dist/core/rate-limiter.d.ts.map +1 -0
- package/dist/core/rate-limiter.js +70 -0
- package/dist/core/rate-limiter.js.map +1 -0
- package/{src/core/types.ts → dist/core/types.d.ts} +169 -215
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +19 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/unified-cache.d.ts +63 -0
- package/dist/core/unified-cache.d.ts.map +1 -0
- package/dist/core/unified-cache.js +114 -0
- package/dist/core/unified-cache.js.map +1 -0
- package/dist/index.d.ts +93 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +255 -0
- package/dist/index.js.map +1 -0
- package/dist/services/arbitrage-service.d.ts +408 -0
- package/dist/services/arbitrage-service.d.ts.map +1 -0
- package/dist/services/arbitrage-service.js +1422 -0
- package/dist/services/arbitrage-service.js.map +1 -0
- package/dist/services/authorization-service.d.ts +97 -0
- package/dist/services/authorization-service.d.ts.map +1 -0
- package/dist/services/authorization-service.js +279 -0
- package/dist/services/authorization-service.js.map +1 -0
- package/dist/services/market-service.d.ts +108 -0
- package/dist/services/market-service.d.ts.map +1 -0
- package/dist/services/market-service.js +458 -0
- package/dist/services/market-service.js.map +1 -0
- package/dist/services/realtime-service.d.ts +82 -0
- package/dist/services/realtime-service.d.ts.map +1 -0
- package/dist/services/realtime-service.js +150 -0
- package/dist/services/realtime-service.js.map +1 -0
- package/dist/services/swap-service.d.ts +217 -0
- package/dist/services/swap-service.d.ts.map +1 -0
- package/dist/services/swap-service.js +695 -0
- package/dist/services/swap-service.js.map +1 -0
- package/dist/services/wallet-service.d.ts +94 -0
- package/dist/services/wallet-service.d.ts.map +1 -0
- package/dist/services/wallet-service.js +173 -0
- package/dist/services/wallet-service.js.map +1 -0
- package/dist/utils/price-utils.d.ts +153 -0
- package/dist/utils/price-utils.d.ts.map +1 -0
- package/dist/utils/price-utils.js +236 -0
- package/dist/utils/price-utils.js.map +1 -0
- package/package.json +7 -2
- package/docs/00-design.md +0 -760
- package/docs/02-API.md +0 -1148
- package/docs/arb/test-plan.md +0 -387
- package/docs/arb/test-results.md +0 -336
- package/docs/arbitrage.md +0 -754
- package/docs/reports/smart-money-analysis-2025-12-23-cn.md +0 -840
- package/examples/01-basic-usage.ts +0 -68
- package/examples/02-smart-money.ts +0 -95
- package/examples/03-market-analysis.ts +0 -108
- package/examples/04-kline-aggregation.ts +0 -158
- package/examples/05-follow-wallet-strategy.ts +0 -156
- package/examples/06-services-demo.ts +0 -124
- package/examples/07-realtime-websocket.ts +0 -117
- package/examples/08-trading-orders.ts +0 -278
- package/examples/09-rewards-tracking.ts +0 -187
- package/examples/10-ctf-operations.ts +0 -336
- package/examples/11-live-arbitrage-scan.ts +0 -221
- package/examples/12-trending-arb-monitor.ts +0 -406
- package/examples/13-arbitrage-service.ts +0 -211
- package/examples/README.md +0 -179
- package/scripts/README.md +0 -163
- package/scripts/approvals/approve-erc1155.ts +0 -129
- package/scripts/approvals/approve-neg-risk-erc1155.ts +0 -149
- package/scripts/approvals/approve-neg-risk.ts +0 -102
- package/scripts/approvals/check-all-allowances.ts +0 -150
- package/scripts/approvals/check-allowance.ts +0 -129
- package/scripts/approvals/check-ctf-approval.ts +0 -158
- package/scripts/arb/faze-bo3-arb.ts +0 -385
- package/scripts/arb/settle-position.ts +0 -190
- package/scripts/arb/token-rebalancer.ts +0 -420
- package/scripts/arb-tests/01-unit-tests.ts +0 -495
- package/scripts/arb-tests/02-integration-tests.ts +0 -412
- package/scripts/arb-tests/03-e2e-tests.ts +0 -503
- package/scripts/arb-tests/README.md +0 -109
- package/scripts/datas/001-report.md +0 -486
- package/scripts/datas/clone-modal-screenshot.png +0 -0
- package/scripts/deposit/deposit-native-usdc.ts +0 -179
- package/scripts/deposit/deposit-usdc.ts +0 -155
- package/scripts/deposit/swap-usdc-to-usdce.ts +0 -375
- package/scripts/research/research-markets.ts +0 -166
- package/scripts/trading/check-orders.ts +0 -50
- package/scripts/trading/sell-nvidia-positions.ts +0 -206
- package/scripts/trading/test-order.ts +0 -172
- package/scripts/verify/test-approve-trading.ts +0 -98
- package/scripts/verify/test-provider-fix.ts +0 -43
- package/scripts/verify/test-search-mcp.ts +0 -113
- package/scripts/verify/verify-all-apis.ts +0 -160
- package/scripts/wallet/check-wallet-balances.ts +0 -75
- package/scripts/wallet/test-wallet-operations.ts +0 -191
- package/scripts/wallet/verify-wallet-tools.ts +0 -124
- package/src/__tests__/clob-api.test.ts +0 -301
- package/src/__tests__/integration/bridge-client.integration.test.ts +0 -314
- package/src/__tests__/integration/clob-api.integration.test.ts +0 -218
- package/src/__tests__/integration/ctf-client.integration.test.ts +0 -331
- package/src/__tests__/integration/data-api.integration.test.ts +0 -194
- package/src/__tests__/integration/gamma-api.integration.test.ts +0 -206
- package/src/__tests__/test-utils.ts +0 -170
- package/src/clients/bridge-client.ts +0 -841
- package/src/clients/clob-api.ts +0 -629
- package/src/clients/ctf-client.ts +0 -1216
- package/src/clients/data-api.ts +0 -469
- package/src/clients/gamma-api.ts +0 -597
- package/src/clients/trading-client.ts +0 -749
- package/src/clients/websocket-manager.ts +0 -267
- package/src/core/cache-adapter-bridge.ts +0 -94
- package/src/core/cache.ts +0 -85
- package/src/core/errors.ts +0 -117
- package/src/core/rate-limiter.ts +0 -74
- package/src/core/unified-cache.ts +0 -153
- package/src/index.ts +0 -461
- package/src/services/arbitrage-service.ts +0 -1807
- package/src/services/authorization-service.ts +0 -357
- package/src/services/market-service.ts +0 -544
- package/src/services/realtime-service.ts +0 -196
- package/src/services/swap-service.ts +0 -896
- package/src/services/wallet-service.ts +0 -259
- package/src/utils/price-utils.ts +0 -307
- package/tsconfig.json +0 -8
- package/vitest.config.ts +0 -19
- package/vitest.integration.config.ts +0 -18
package/LICENSE
CHANGED
package/README.en.md
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
# @catalyst-team/poly-sdk
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
[](README.en.md)
|
|
4
|
+
[](README.zh-CN.md)
|
|
5
5
|
[](package.json)
|
|
6
|
-
[](LICENSE)
|
|
7
|
+
|
|
8
|
+
Unified TypeScript SDK for Polymarket - prediction markets trading, arbitrage detection, smart money analysis, and comprehensive market data.
|
|
8
9
|
|
|
9
|
-
**Builder**: [@hhhx402](https://x.com/hhhx402)
|
|
10
|
-
**Project**: [Catalyst.fun](https://x.com/catalystdotfun)
|
|
10
|
+
**Builder**: [@hhhx402](https://x.com/hhhx402) | **Project**: [Catalyst.fun](https://x.com/catalystdotfun)
|
|
11
11
|
|
|
12
12
|
## Features
|
|
13
13
|
|
|
@@ -18,7 +18,6 @@ Unified TypeScript SDK for Polymarket - prediction markets trading, arbitrage de
|
|
|
18
18
|
- 🌉 **Cross-Chain Bridge**: Deposit from Ethereum, Solana, Bitcoin
|
|
19
19
|
- 💰 **DEX Swaps**: Convert tokens on Polygon using QuickSwap V3
|
|
20
20
|
- 📈 **Market Analytics**: K-lines, signals, and volume analysis
|
|
21
|
-
- ✅ **Comprehensive Testing**: 100% test coverage (43/43 tests passing)
|
|
22
21
|
|
|
23
22
|
## Installation
|
|
24
23
|
|
|
@@ -217,32 +216,6 @@ const clearResult = await arbService.clearPositions(best.market, true);
|
|
|
217
216
|
console.log(`✅ Recovered: $${clearResult.totalUsdcRecovered.toFixed(2)}`);
|
|
218
217
|
```
|
|
219
218
|
|
|
220
|
-
## Testing
|
|
221
|
-
|
|
222
|
-
This package includes comprehensive testing infrastructure with **100% test coverage**:
|
|
223
|
-
|
|
224
|
-
```bash
|
|
225
|
-
# Run all tests
|
|
226
|
-
pnpm test:unit # 27 unit tests
|
|
227
|
-
pnpm test:integration # 10 integration tests
|
|
228
|
-
pnpm test:e2e # 6 E2E tests (requires funded wallet)
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
### Test Coverage
|
|
232
|
-
|
|
233
|
-
| Test Level | Tests | Coverage | Description |
|
|
234
|
-
|------------|-------|----------|-------------|
|
|
235
|
-
| **Unit Tests** | 27/27 ✅ | Mirror orderbook calculations, arbitrage detection |
|
|
236
|
-
| **Integration Tests** | 10/10 ✅ | WebSocket real-time monitoring, market scanning |
|
|
237
|
-
| **E2E Tests** | 6/6 ✅ | On-chain CTF operations on Polygon mainnet |
|
|
238
|
-
|
|
239
|
-
All tests are located in `scripts/arb-tests/`:
|
|
240
|
-
- `01-unit-tests.ts` - Price utilities and arbitrage logic
|
|
241
|
-
- `02-integration-tests.ts` - API integration and WebSocket
|
|
242
|
-
- `03-e2e-tests.ts` - Real blockchain transactions (Split/Merge)
|
|
243
|
-
|
|
244
|
-
See [docs/arb/test-results.md](docs/arb/test-results.md) for detailed test reports.
|
|
245
|
-
|
|
246
219
|
## API Clients
|
|
247
220
|
|
|
248
221
|
### TradingClient - Order Execution
|
|
@@ -504,9 +477,6 @@ const limiter = new RateLimiter({
|
|
|
504
477
|
## Documentation
|
|
505
478
|
|
|
506
479
|
- [Orderbook & Arbitrage Guide](docs/01-polymarket-orderbook-arbitrage.md) - Understanding mirror orders
|
|
507
|
-
- [Test Plan](docs/arb/test-plan.md) - Testing strategy and approach
|
|
508
|
-
- [Test Results](docs/arb/test-results.md) - Detailed test coverage report
|
|
509
|
-
- [Test Scripts README](scripts/arb-tests/README.md) - Running tests
|
|
510
480
|
|
|
511
481
|
## Dependencies
|
|
512
482
|
|
|
@@ -516,20 +486,14 @@ const limiter = new RateLimiter({
|
|
|
516
486
|
|
|
517
487
|
## License
|
|
518
488
|
|
|
519
|
-
|
|
489
|
+
MIT
|
|
520
490
|
|
|
521
491
|
## Changelog
|
|
522
492
|
|
|
523
493
|
### v0.2.0 (2024-12-24)
|
|
524
494
|
|
|
525
|
-
- ✅ **Complete test coverage**: 43/43 tests passing (100%)
|
|
526
|
-
- 27 unit tests for arbitrage detection logic
|
|
527
|
-
- 10 integration tests for WebSocket and market scanning
|
|
528
|
-
- 6 E2E tests with real on-chain transactions
|
|
529
|
-
- 🐛 Fixed WebSocket integration tests (listen to `orderbookUpdate` events)
|
|
530
495
|
- 📊 Smart market selection based on volume and orderbook depth
|
|
531
|
-
-
|
|
532
|
-
- 🔧 Test infrastructure for ArbitrageService verification
|
|
496
|
+
- 🔧 ArbitrageService verification and refinement
|
|
533
497
|
|
|
534
498
|
### v0.1.1
|
|
535
499
|
|
package/README.md
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
# @catalyst-team/poly-sdk
|
|
2
2
|
|
|
3
|
+
[](README.en.md)
|
|
4
|
+
[](README.zh-CN.md)
|
|
5
|
+
|
|
3
6
|
Unified SDK for Polymarket APIs - Data API, Gamma API, CLOB API, and WebSocket real-time updates.
|
|
4
7
|
|
|
5
|
-
**Builder**: [@hhhx402](https://x.com/hhhx402)
|
|
6
|
-
**Project**: [Catalyst.fun](https://x.com/catalystdotfun)
|
|
8
|
+
**Builder**: [@hhhx402](https://x.com/hhhx402) | **Project**: [Catalyst.fun](https://x.com/catalystdotfun)
|
|
7
9
|
|
|
8
10
|
## Installation
|
|
9
11
|
|
|
@@ -1079,4 +1081,4 @@ pnpm example:trading
|
|
|
1079
1081
|
|
|
1080
1082
|
## License
|
|
1081
1083
|
|
|
1082
|
-
|
|
1084
|
+
MIT
|
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,502 @@
|
|
|
1
|
+
# @catalyst-team/poly-sdk
|
|
2
|
+
|
|
3
|
+
[](README.en.md)
|
|
4
|
+
[](README.zh-CN.md)
|
|
5
|
+
[](package.json)
|
|
6
|
+
[](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 @@
|
|
|
1
|
+
{"version":3,"file":"clob-api.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/clob-api.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|