@catalyst-team/poly-sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env +0 -0
- package/README.md +803 -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/dist/core/types.d.ts +314 -0
- 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 +94 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +258 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/errors.d.ts +33 -0
- package/dist/mcp/errors.d.ts.map +1 -0
- package/dist/mcp/errors.js +86 -0
- package/dist/mcp/errors.js.map +1 -0
- package/dist/mcp/index.d.ts +62 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +173 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +17 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +155 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/guide.d.ts +12 -0
- package/dist/mcp/tools/guide.d.ts.map +1 -0
- package/dist/mcp/tools/guide.js +801 -0
- package/dist/mcp/tools/guide.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +11 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +27 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/market.d.ts +11 -0
- package/dist/mcp/tools/market.d.ts.map +1 -0
- package/dist/mcp/tools/market.js +314 -0
- package/dist/mcp/tools/market.js.map +1 -0
- package/dist/mcp/tools/order.d.ts +10 -0
- package/dist/mcp/tools/order.d.ts.map +1 -0
- package/dist/mcp/tools/order.js +258 -0
- package/dist/mcp/tools/order.js.map +1 -0
- package/dist/mcp/tools/trade.d.ts +38 -0
- package/dist/mcp/tools/trade.d.ts.map +1 -0
- package/dist/mcp/tools/trade.js +314 -0
- package/dist/mcp/tools/trade.js.map +1 -0
- package/dist/mcp/tools/trader.d.ts +11 -0
- package/dist/mcp/tools/trader.d.ts.map +1 -0
- package/dist/mcp/tools/trader.js +277 -0
- package/dist/mcp/tools/trader.js.map +1 -0
- package/dist/mcp/tools/wallet.d.ts +274 -0
- package/dist/mcp/tools/wallet.d.ts.map +1 -0
- package/dist/mcp/tools/wallet.js +579 -0
- package/dist/mcp/tools/wallet.js.map +1 -0
- package/dist/mcp/types.d.ts +413 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +5 -0
- package/dist/mcp/types.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/docs/00-design.md +760 -0
- package/docs/01-mcp.md +2041 -0
- package/docs/02-API.md +1148 -0
- package/docs/e2e/01-trader-tools.md +159 -0
- package/docs/e2e/02-market-tools.md +180 -0
- package/docs/e2e/03-order-tools.md +166 -0
- package/docs/e2e/04-wallet-tools.md +224 -0
- package/docs/e2e/05-trading-tools.md +327 -0
- package/docs/e2e/06-integration-scenarios.md +481 -0
- package/docs/e2e/coordinator.md +376 -0
- package/examples/01-basic-usage.ts +68 -0
- package/examples/02-smart-money.ts +95 -0
- package/examples/03-market-analysis.ts +108 -0
- package/examples/04-kline-aggregation.ts +158 -0
- package/examples/05-follow-wallet-strategy.ts +156 -0
- package/examples/06-services-demo.ts +124 -0
- package/examples/07-realtime-websocket.ts +117 -0
- package/examples/08-trading-orders.ts +278 -0
- package/examples/09-rewards-tracking.ts +187 -0
- package/examples/10-ctf-operations.ts +336 -0
- package/examples/11-live-arbitrage-scan.ts +221 -0
- package/examples/12-trending-arb-monitor.ts +406 -0
- package/examples/README.md +179 -0
- package/package.json +62 -0
- package/scripts/README.md +163 -0
- package/scripts/approvals/approve-erc1155.ts +129 -0
- package/scripts/approvals/approve-neg-risk-erc1155.ts +149 -0
- package/scripts/approvals/approve-neg-risk.ts +102 -0
- package/scripts/approvals/check-all-allowances.ts +150 -0
- package/scripts/approvals/check-allowance.ts +129 -0
- package/scripts/approvals/check-ctf-approval.ts +158 -0
- package/scripts/datas/001-report.md +486 -0
- package/scripts/datas/clone-modal-screenshot.png +0 -0
- package/scripts/deposit/deposit-native-usdc.ts +179 -0
- package/scripts/deposit/deposit-usdc.ts +155 -0
- package/scripts/deposit/swap-usdc-to-usdce.ts +375 -0
- package/scripts/research/research-markets.ts +166 -0
- package/scripts/trading/check-orders.ts +50 -0
- package/scripts/trading/sell-nvidia-positions.ts +206 -0
- package/scripts/trading/test-order.ts +172 -0
- package/scripts/truth.md +440 -0
- package/scripts/verify/test-approve-trading.ts +98 -0
- package/scripts/verify/test-provider-fix.ts +43 -0
- package/scripts/verify/test-search-mcp.ts +113 -0
- package/scripts/verify/verify-all-apis.ts +160 -0
- package/scripts/wallet/check-wallet-balances.ts +75 -0
- package/scripts/wallet/test-wallet-operations.ts +191 -0
- package/scripts/wallet/verify-wallet-tools.ts +124 -0
- package/src/__tests__/clob-api.test.ts +301 -0
- package/src/__tests__/integration/bridge-client.integration.test.ts +314 -0
- package/src/__tests__/integration/clob-api.integration.test.ts +218 -0
- package/src/__tests__/integration/ctf-client.integration.test.ts +331 -0
- package/src/__tests__/integration/data-api.integration.test.ts +194 -0
- package/src/__tests__/integration/gamma-api.integration.test.ts +206 -0
- package/src/__tests__/test-utils.ts +170 -0
- package/src/clients/bridge-client.ts +841 -0
- package/src/clients/clob-api.ts +629 -0
- package/src/clients/ctf-client.ts +1216 -0
- package/src/clients/data-api.ts +469 -0
- package/src/clients/gamma-api.ts +597 -0
- package/src/clients/trading-client.ts +749 -0
- package/src/clients/websocket-manager.ts +267 -0
- package/src/core/cache-adapter-bridge.ts +94 -0
- package/src/core/cache.ts +85 -0
- package/src/core/errors.ts +117 -0
- package/src/core/rate-limiter.ts +74 -0
- package/src/core/types.ts +360 -0
- package/src/core/unified-cache.ts +153 -0
- package/src/index.ts +455 -0
- package/src/mcp/README.md +380 -0
- package/src/mcp/errors.ts +124 -0
- package/src/mcp/index.ts +309 -0
- package/src/mcp/server.ts +183 -0
- package/src/mcp/tools/guide.ts +821 -0
- package/src/mcp/tools/index.ts +73 -0
- package/src/mcp/tools/market.ts +363 -0
- package/src/mcp/tools/order.ts +326 -0
- package/src/mcp/tools/trade.ts +417 -0
- package/src/mcp/tools/trader.ts +322 -0
- package/src/mcp/tools/wallet.ts +683 -0
- package/src/mcp/types.ts +472 -0
- package/src/services/authorization-service.ts +357 -0
- package/src/services/market-service.ts +544 -0
- package/src/services/realtime-service.ts +196 -0
- package/src/services/swap-service.ts +896 -0
- package/src/services/wallet-service.ts +259 -0
- package/src/utils/price-utils.ts +307 -0
- package/tsconfig.json +8 -0
- package/vitest.config.ts +19 -0
- package/vitest.integration.config.ts +18 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
# Trader Tools E2E Test
|
|
2
|
+
|
|
3
|
+
> 交易者分析工具端到端测试
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 工具清单
|
|
8
|
+
|
|
9
|
+
| 工具 | 功能 | 认证 | 优先级 |
|
|
10
|
+
|------|------|------|--------|
|
|
11
|
+
| `get_leaderboard` | 获取 PnL 排行榜 | 无 | P1 |
|
|
12
|
+
| `get_trader_profile` | 获取交易者资料 | 无 | P1 |
|
|
13
|
+
| `get_trader_positions` | 获取持仓和 PnL | 无 | P0 |
|
|
14
|
+
| `get_trader_trades` | 获取交易历史 | 无 | P1 |
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Test Case 1: get_leaderboard
|
|
19
|
+
|
|
20
|
+
### 1.1 默认参数
|
|
21
|
+
```
|
|
22
|
+
调用: get_leaderboard()
|
|
23
|
+
预期: 返回 10 个交易者,按 PnL 排序
|
|
24
|
+
验证:
|
|
25
|
+
- traders 数组长度 = 10
|
|
26
|
+
- 每个 trader 有 rank, address, pnl, volume
|
|
27
|
+
- rank 从 1 开始递增
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### 1.2 自定义 limit
|
|
31
|
+
```
|
|
32
|
+
调用: get_leaderboard(limit=5)
|
|
33
|
+
预期: 返回 5 个交易者
|
|
34
|
+
验证:
|
|
35
|
+
- traders 数组长度 = 5
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### 1.3 分页测试
|
|
39
|
+
```
|
|
40
|
+
调用: get_leaderboard(limit=5, offset=5)
|
|
41
|
+
预期: 返回第 6-10 名交易者
|
|
42
|
+
验证:
|
|
43
|
+
- 第一个 trader 的 rank = 6
|
|
44
|
+
- 与 offset=0 的结果不重叠
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Test Case 2: get_trader_profile
|
|
50
|
+
|
|
51
|
+
### 2.1 有效地址
|
|
52
|
+
```
|
|
53
|
+
前置: 从 leaderboard 获取一个地址
|
|
54
|
+
调用: get_trader_profile(address=<top_trader>)
|
|
55
|
+
预期: 返回完整的交易者资料
|
|
56
|
+
验证:
|
|
57
|
+
- trader.address 匹配
|
|
58
|
+
- ranking.rank 存在
|
|
59
|
+
- performance.officialPnl 存在
|
|
60
|
+
- stats.positionCount >= 0
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### 2.2 无效地址
|
|
64
|
+
```
|
|
65
|
+
调用: get_trader_profile(address="0x0000000000000000000000000000000000000000")
|
|
66
|
+
预期: 返回空数据或错误
|
|
67
|
+
验证:
|
|
68
|
+
- 错误信息清晰
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Test Case 3: get_trader_positions
|
|
74
|
+
|
|
75
|
+
### 3.1 有持仓的交易者
|
|
76
|
+
```
|
|
77
|
+
前置: 从 leaderboard 获取顶级交易者
|
|
78
|
+
调用: get_trader_positions(address=<top_trader>)
|
|
79
|
+
预期: 返回持仓列表和汇总
|
|
80
|
+
验证:
|
|
81
|
+
- positions 是数组
|
|
82
|
+
- 每个 position 有 market, holding, pnl
|
|
83
|
+
- summary.totalPositions 匹配 positions.length
|
|
84
|
+
- unrealizedPnl 和 realizedPnl 有值
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### 3.2 无持仓的地址
|
|
88
|
+
```
|
|
89
|
+
调用: get_trader_positions(address=<new_address>)
|
|
90
|
+
预期: 返回空持仓列表
|
|
91
|
+
验证:
|
|
92
|
+
- positions = []
|
|
93
|
+
- summary.totalPositions = 0
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Test Case 4: get_trader_trades
|
|
99
|
+
|
|
100
|
+
### 4.1 默认参数
|
|
101
|
+
```
|
|
102
|
+
前置: 从 leaderboard 获取活跃交易者
|
|
103
|
+
调用: get_trader_trades(address=<active_trader>)
|
|
104
|
+
预期: 返回最近 20 笔交易
|
|
105
|
+
验证:
|
|
106
|
+
- trades 数组长度 <= 20
|
|
107
|
+
- 每笔交易有 side, outcome, size, price, timestamp
|
|
108
|
+
- 按时间倒序排列
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### 4.2 过滤 BUY
|
|
112
|
+
```
|
|
113
|
+
调用: get_trader_trades(address=<trader>, side="BUY")
|
|
114
|
+
预期: 只返回买入交易
|
|
115
|
+
验证:
|
|
116
|
+
- 所有 trade.side = "BUY"
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### 4.3 过滤 SELL
|
|
120
|
+
```
|
|
121
|
+
调用: get_trader_trades(address=<trader>, side="SELL")
|
|
122
|
+
预期: 只返回卖出交易
|
|
123
|
+
验证:
|
|
124
|
+
- 所有 trade.side = "SELL"
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### 4.4 自定义 limit
|
|
128
|
+
```
|
|
129
|
+
调用: get_trader_trades(address=<trader>, limit=5)
|
|
130
|
+
预期: 返回 5 笔交易
|
|
131
|
+
验证:
|
|
132
|
+
- trades.length <= 5
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## 执行记录
|
|
138
|
+
|
|
139
|
+
| Test Case | 状态 | 结果 | 备注 |
|
|
140
|
+
|-----------|------|------|------|
|
|
141
|
+
| 1.1 get_leaderboard 默认 | - | - | - |
|
|
142
|
+
| 1.2 get_leaderboard limit | - | - | - |
|
|
143
|
+
| 1.3 get_leaderboard 分页 | - | - | - |
|
|
144
|
+
| 2.1 get_trader_profile 有效 | - | - | - |
|
|
145
|
+
| 2.2 get_trader_profile 无效 | - | - | - |
|
|
146
|
+
| 3.1 get_trader_positions 有持仓 | - | - | - |
|
|
147
|
+
| 3.2 get_trader_positions 无持仓 | - | - | - |
|
|
148
|
+
| 4.1 get_trader_trades 默认 | - | - | - |
|
|
149
|
+
| 4.2 get_trader_trades BUY | - | - | - |
|
|
150
|
+
| 4.3 get_trader_trades SELL | - | - | - |
|
|
151
|
+
| 4.4 get_trader_trades limit | - | - | - |
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## 发现的问题
|
|
156
|
+
|
|
157
|
+
| ID | 问题描述 | 严重性 | 状态 |
|
|
158
|
+
|----|---------|--------|------|
|
|
159
|
+
| - | - | - | - |
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
# Market Tools E2E Test
|
|
2
|
+
|
|
3
|
+
> 市场查询工具端到端测试
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 工具清单
|
|
8
|
+
|
|
9
|
+
| 工具 | 功能 | 认证 | 优先级 |
|
|
10
|
+
|------|------|------|--------|
|
|
11
|
+
| `search_markets` | 搜索市场 | 无 | P1 |
|
|
12
|
+
| `get_trending_markets` | 趋势市场 | 无 | P3 |
|
|
13
|
+
| `get_market` | 市场详情 | 无 | P0 |
|
|
14
|
+
| `get_market_trades` | 市场成交 | 无 | P1 |
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Test Case 1: search_markets
|
|
19
|
+
|
|
20
|
+
### 1.1 热门关键词搜索
|
|
21
|
+
```
|
|
22
|
+
调用: search_markets(query="Trump")
|
|
23
|
+
预期: 返回与 Trump 相关的市场
|
|
24
|
+
验证:
|
|
25
|
+
- markets 是数组
|
|
26
|
+
- 每个市场的 question 或 slug 包含搜索词
|
|
27
|
+
- 按 volume 排序
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### 1.2 技术关键词搜索
|
|
31
|
+
```
|
|
32
|
+
调用: search_markets(query="Bitcoin")
|
|
33
|
+
预期: 返回加密货币相关市场
|
|
34
|
+
验证:
|
|
35
|
+
- 结果与 Bitcoin/BTC 价格预测相关
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### 1.3 active 过滤
|
|
39
|
+
```
|
|
40
|
+
调用: search_markets(query="2024", active=false)
|
|
41
|
+
预期: 包含已结束的市场
|
|
42
|
+
验证:
|
|
43
|
+
- 可能返回已关闭的 2024 年市场
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### 1.4 limit 参数
|
|
47
|
+
```
|
|
48
|
+
调用: search_markets(query="election", limit=3)
|
|
49
|
+
预期: 最多返回 3 个市场
|
|
50
|
+
验证:
|
|
51
|
+
- markets.length <= 3
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Test Case 2: get_trending_markets
|
|
57
|
+
|
|
58
|
+
### 2.1 按交易量排序
|
|
59
|
+
```
|
|
60
|
+
调用: get_trending_markets(sortBy="volume")
|
|
61
|
+
预期: 返回高交易量市场
|
|
62
|
+
验证:
|
|
63
|
+
- markets 按 volume24h 降序排列
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 2.2 按流动性排序
|
|
67
|
+
```
|
|
68
|
+
调用: get_trending_markets(sortBy="liquidity")
|
|
69
|
+
预期: 返回高流动性市场
|
|
70
|
+
验证:
|
|
71
|
+
- 返回的市场流动性较高
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### 2.3 最新市场
|
|
75
|
+
```
|
|
76
|
+
调用: get_trending_markets(sortBy="newest")
|
|
77
|
+
预期: 返回最近创建的市场
|
|
78
|
+
验证:
|
|
79
|
+
- 按创建时间排序
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### 2.4 自定义数量
|
|
83
|
+
```
|
|
84
|
+
调用: get_trending_markets(limit=5)
|
|
85
|
+
预期: 返回 5 个市场
|
|
86
|
+
验证:
|
|
87
|
+
- markets.length = 5
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Test Case 3: get_market
|
|
93
|
+
|
|
94
|
+
### 3.1 使用 slug
|
|
95
|
+
```
|
|
96
|
+
调用: get_market(identifier="presidential-election-winner-2024")
|
|
97
|
+
预期: 返回完整市场信息
|
|
98
|
+
验证:
|
|
99
|
+
- market.slug 匹配
|
|
100
|
+
- prices.yes + prices.no ≈ 1.0
|
|
101
|
+
- tokens.yes 和 tokens.no 都有 tokenId
|
|
102
|
+
- status 字段存在
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### 3.2 使用 conditionId
|
|
106
|
+
```
|
|
107
|
+
前置: 从 search_markets 获取一个 conditionId
|
|
108
|
+
调用: get_market(identifier=<conditionId>)
|
|
109
|
+
预期: 返回同样的市场信息
|
|
110
|
+
验证:
|
|
111
|
+
- 与使用 slug 返回的数据一致
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### 3.3 无效标识符
|
|
115
|
+
```
|
|
116
|
+
调用: get_market(identifier="invalid-slug-12345")
|
|
117
|
+
预期: 返回错误
|
|
118
|
+
验证:
|
|
119
|
+
- 错误信息清晰说明市场不存在
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Test Case 4: get_market_trades
|
|
125
|
+
|
|
126
|
+
### 4.1 热门市场成交
|
|
127
|
+
```
|
|
128
|
+
前置: 获取一个高交易量市场的 conditionId
|
|
129
|
+
调用: get_market_trades(conditionId=<id>)
|
|
130
|
+
预期: 返回最近成交
|
|
131
|
+
验证:
|
|
132
|
+
- trades 是数组
|
|
133
|
+
- 每笔交易有 trader, side, outcome, size, price, timestamp
|
|
134
|
+
- 按时间倒序
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### 4.2 自定义数量
|
|
138
|
+
```
|
|
139
|
+
调用: get_market_trades(conditionId=<id>, limit=5)
|
|
140
|
+
预期: 返回 5 笔成交
|
|
141
|
+
验证:
|
|
142
|
+
- trades.length <= 5
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### 4.3 冷门市场
|
|
146
|
+
```
|
|
147
|
+
调用: get_market_trades(conditionId=<low_volume_market>)
|
|
148
|
+
预期: 返回较少或空的成交
|
|
149
|
+
验证:
|
|
150
|
+
- 即使没有成交也不报错
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## 执行记录
|
|
156
|
+
|
|
157
|
+
| Test Case | 状态 | 结果 | 备注 |
|
|
158
|
+
|-----------|------|------|------|
|
|
159
|
+
| 1.1 search_markets Trump | - | - | - |
|
|
160
|
+
| 1.2 search_markets Bitcoin | - | - | - |
|
|
161
|
+
| 1.3 search_markets active=false | - | - | - |
|
|
162
|
+
| 1.4 search_markets limit | - | - | - |
|
|
163
|
+
| 2.1 trending volume | - | - | - |
|
|
164
|
+
| 2.2 trending liquidity | - | - | - |
|
|
165
|
+
| 2.3 trending newest | - | - | - |
|
|
166
|
+
| 2.4 trending limit | - | - | - |
|
|
167
|
+
| 3.1 get_market slug | - | - | - |
|
|
168
|
+
| 3.2 get_market conditionId | - | - | - |
|
|
169
|
+
| 3.3 get_market invalid | - | - | - |
|
|
170
|
+
| 4.1 market_trades 热门 | - | - | - |
|
|
171
|
+
| 4.2 market_trades limit | - | - | - |
|
|
172
|
+
| 4.3 market_trades 冷门 | - | - | - |
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## 发现的问题
|
|
177
|
+
|
|
178
|
+
| ID | 问题描述 | 严重性 | 状态 |
|
|
179
|
+
|----|---------|--------|------|
|
|
180
|
+
| - | - | - | - |
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
# Order Tools E2E Test
|
|
2
|
+
|
|
3
|
+
> 订单簿分析工具端到端测试
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 工具清单
|
|
8
|
+
|
|
9
|
+
| 工具 | 功能 | 认证 | 优先级 |
|
|
10
|
+
|------|------|------|--------|
|
|
11
|
+
| `get_orderbook` | 获取订单簿深度 | 无 | P0 |
|
|
12
|
+
| `get_best_prices` | 获取最优价格 | 无 | P1 |
|
|
13
|
+
| `estimate_execution` | 估算执行成本 | 无 | P3 |
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Test Case 1: get_orderbook
|
|
18
|
+
|
|
19
|
+
### 1.1 Yes 方向订单簿
|
|
20
|
+
```
|
|
21
|
+
前置: 获取一个活跃市场的 conditionId
|
|
22
|
+
调用: get_orderbook(conditionId=<id>, outcome="Yes")
|
|
23
|
+
预期: 返回 Yes 方向的订单簿
|
|
24
|
+
验证:
|
|
25
|
+
- orderbook.bids 存在且是数组
|
|
26
|
+
- orderbook.asks 存在且是数组
|
|
27
|
+
- 每个价格级有 price, size, total
|
|
28
|
+
- bids 按价格降序,asks 按价格升序
|
|
29
|
+
- summary.bestBid <= summary.bestAsk
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### 1.2 No 方向订单簿
|
|
33
|
+
```
|
|
34
|
+
调用: get_orderbook(conditionId=<id>, outcome="No")
|
|
35
|
+
预期: 返回 No 方向的订单簿
|
|
36
|
+
验证:
|
|
37
|
+
- 数据结构与 Yes 方向一致
|
|
38
|
+
- Yes.bestBid + No.bestBid ≈ 1.0 (套利检查)
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### 1.3 自定义深度
|
|
42
|
+
```
|
|
43
|
+
调用: get_orderbook(conditionId=<id>, outcome="Yes", depth=5)
|
|
44
|
+
预期: 返回 5 个价格级
|
|
45
|
+
验证:
|
|
46
|
+
- bids.length <= 5
|
|
47
|
+
- asks.length <= 5
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### 1.4 深度 = 20
|
|
51
|
+
```
|
|
52
|
+
调用: get_orderbook(conditionId=<id>, outcome="Yes", depth=20)
|
|
53
|
+
预期: 返回更多价格级
|
|
54
|
+
验证:
|
|
55
|
+
- 如果市场流动性足够,返回更多级别
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Test Case 2: get_best_prices
|
|
61
|
+
|
|
62
|
+
### 2.1 双向最优价格
|
|
63
|
+
```
|
|
64
|
+
前置: 获取一个活跃市场的 conditionId
|
|
65
|
+
调用: get_best_prices(conditionId=<id>)
|
|
66
|
+
预期: 返回 Yes 和 No 的最优价格
|
|
67
|
+
验证:
|
|
68
|
+
- yes.bestBid, yes.bestAsk 存在
|
|
69
|
+
- no.bestBid, no.bestAsk 存在
|
|
70
|
+
- yes.spread = yes.bestAsk - yes.bestBid
|
|
71
|
+
- no.spread = no.bestAsk - no.bestBid
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### 2.2 价格一致性验证
|
|
75
|
+
```
|
|
76
|
+
前置: 同时调用 get_orderbook(Yes) 和 get_best_prices
|
|
77
|
+
验证:
|
|
78
|
+
- get_best_prices.yes.bestBid = get_orderbook(Yes).summary.bestBid
|
|
79
|
+
- get_best_prices.yes.bestAsk = get_orderbook(Yes).summary.bestAsk
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### 2.3 套利空间检查
|
|
83
|
+
```
|
|
84
|
+
验证:
|
|
85
|
+
- yes.bestBid + no.bestAsk 是否 > 1.0 (卖出套利)
|
|
86
|
+
- yes.bestAsk + no.bestBid 是否 < 1.0 (买入套利)
|
|
87
|
+
- 记录发现的套利机会
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Test Case 3: estimate_execution
|
|
93
|
+
|
|
94
|
+
### 3.1 小额买入估算
|
|
95
|
+
```
|
|
96
|
+
前置: 获取一个活跃市场
|
|
97
|
+
调用: estimate_execution(conditionId=<id>, outcome="Yes", side="BUY", amount=100)
|
|
98
|
+
预期: 估算 $100 买入 Yes 的成本
|
|
99
|
+
验证:
|
|
100
|
+
- estimate.avgPrice 存在
|
|
101
|
+
- estimate.sharesReceived 存在
|
|
102
|
+
- estimate.priceImpact 较小 (< 1%)
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### 3.2 大额买入估算
|
|
106
|
+
```
|
|
107
|
+
调用: estimate_execution(conditionId=<id>, outcome="Yes", side="BUY", amount=1000)
|
|
108
|
+
预期: 估算 $1000 买入的成本
|
|
109
|
+
验证:
|
|
110
|
+
- priceImpact 比小额大
|
|
111
|
+
- avgPrice 比小额高
|
|
112
|
+
- 可能有 warning 字段
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### 3.3 超大额买入
|
|
116
|
+
```
|
|
117
|
+
调用: estimate_execution(conditionId=<id>, outcome="Yes", side="BUY", amount=10000)
|
|
118
|
+
预期: 显示高滑点警告
|
|
119
|
+
验证:
|
|
120
|
+
- priceImpact > 5%
|
|
121
|
+
- warning 字段存在
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### 3.4 卖出估算
|
|
125
|
+
```
|
|
126
|
+
调用: estimate_execution(conditionId=<id>, outcome="Yes", side="SELL", amount=500)
|
|
127
|
+
预期: 估算卖出成本
|
|
128
|
+
验证:
|
|
129
|
+
- avgPrice 存在
|
|
130
|
+
- 卖出价格通常低于买入价格
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### 3.5 No 方向估算
|
|
134
|
+
```
|
|
135
|
+
调用: estimate_execution(conditionId=<id>, outcome="No", side="BUY", amount=500)
|
|
136
|
+
预期: 估算 No 方向买入
|
|
137
|
+
验证:
|
|
138
|
+
- 数据结构一致
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## 执行记录
|
|
144
|
+
|
|
145
|
+
| Test Case | 状态 | 结果 | 备注 |
|
|
146
|
+
|-----------|------|------|------|
|
|
147
|
+
| 1.1 orderbook Yes | - | - | - |
|
|
148
|
+
| 1.2 orderbook No | - | - | - |
|
|
149
|
+
| 1.3 orderbook depth=5 | - | - | - |
|
|
150
|
+
| 1.4 orderbook depth=20 | - | - | - |
|
|
151
|
+
| 2.1 best_prices 双向 | - | - | - |
|
|
152
|
+
| 2.2 best_prices 一致性 | - | - | - |
|
|
153
|
+
| 2.3 套利空间检查 | - | - | - |
|
|
154
|
+
| 3.1 estimate 小额 | - | - | - |
|
|
155
|
+
| 3.2 estimate 大额 | - | - | - |
|
|
156
|
+
| 3.3 estimate 超大额 | - | - | - |
|
|
157
|
+
| 3.4 estimate 卖出 | - | - | - |
|
|
158
|
+
| 3.5 estimate No | - | - | - |
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## 发现的问题
|
|
163
|
+
|
|
164
|
+
| ID | 问题描述 | 严重性 | 状态 |
|
|
165
|
+
|----|---------|--------|------|
|
|
166
|
+
| - | - | - | - |
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
# Wallet Tools E2E Test
|
|
2
|
+
|
|
3
|
+
> 钱包管理工具端到端测试
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 工具清单
|
|
8
|
+
|
|
9
|
+
| 工具 | 功能 | 认证 | 优先级 |
|
|
10
|
+
|------|------|------|--------|
|
|
11
|
+
| `get_supported_deposit_assets` | 支持的充值资产 | 无 | P1 |
|
|
12
|
+
| `get_wallet_balances` | 查询任意钱包余额 | 无 | P1 |
|
|
13
|
+
| `get_deposit_addresses` | 获取充值地址 | 私钥 | P1 |
|
|
14
|
+
| `get_token_balances` | 获取自己的余额 | 私钥 | P1 |
|
|
15
|
+
| `check_allowances` | 检查授权状态 | 私钥 | P1 |
|
|
16
|
+
| `approve_trading` | 授权交易合约 | 私钥 | P2 |
|
|
17
|
+
| `swap` | 代币交换 | 私钥 | P2 |
|
|
18
|
+
| `swap_and_deposit` | 交换并充值 | 私钥 | P2 |
|
|
19
|
+
| `deposit_usdc` | 充值 USDC | 私钥 | P2 |
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Phase A: 只读工具 (无需认证)
|
|
24
|
+
|
|
25
|
+
### Test Case 1: get_supported_deposit_assets
|
|
26
|
+
|
|
27
|
+
#### 1.1 列出所有资产
|
|
28
|
+
```
|
|
29
|
+
调用: get_supported_deposit_assets()
|
|
30
|
+
预期: 返回所有支持的链和资产
|
|
31
|
+
验证:
|
|
32
|
+
- assets 是数组
|
|
33
|
+
- 包含多个链 (Ethereum, Polygon, Arbitrum, Base, Solana, Bitcoin)
|
|
34
|
+
- 每个资产有 chainId, chainName, tokenSymbol, minDeposit
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
#### 1.2 按链过滤
|
|
38
|
+
```
|
|
39
|
+
调用: get_supported_deposit_assets(chainId=137)
|
|
40
|
+
预期: 只返回 Polygon 链的资产
|
|
41
|
+
验证:
|
|
42
|
+
- 所有资产的 chainId = 137
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
### Test Case 2: get_wallet_balances
|
|
48
|
+
|
|
49
|
+
#### 2.1 查询主钱包
|
|
50
|
+
```
|
|
51
|
+
调用: get_wallet_balances(address="0x0F5988a267303f46b50912f176450491DF10476f")
|
|
52
|
+
预期: 返回钱包的代币余额
|
|
53
|
+
验证:
|
|
54
|
+
- balances 包含 MATIC, USDC, USDC_E 等
|
|
55
|
+
- nonZeroBalances 只包含有余额的代币
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
#### 2.2 查询顶级交易者钱包
|
|
59
|
+
```
|
|
60
|
+
前置: 从 leaderboard 获取一个地址
|
|
61
|
+
调用: get_wallet_balances(address=<top_trader>)
|
|
62
|
+
预期: 返回该钱包的余额
|
|
63
|
+
验证:
|
|
64
|
+
- 数据结构一致
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
#### 2.3 空钱包
|
|
68
|
+
```
|
|
69
|
+
调用: get_wallet_balances(address="0x0000000000000000000000000000000000000001")
|
|
70
|
+
预期: 返回全零余额
|
|
71
|
+
验证:
|
|
72
|
+
- 所有余额 = 0
|
|
73
|
+
- nonZeroBalances = []
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Phase B: 需要私钥的工具
|
|
79
|
+
|
|
80
|
+
> 注意: 如果环境未配置私钥,这些测试将被跳过
|
|
81
|
+
|
|
82
|
+
### Test Case 3: get_deposit_addresses
|
|
83
|
+
|
|
84
|
+
#### 3.1 获取充值地址
|
|
85
|
+
```
|
|
86
|
+
调用: get_deposit_addresses()
|
|
87
|
+
预期: 返回所有链的充值地址
|
|
88
|
+
验证:
|
|
89
|
+
- addresses.evm 是有效的以太坊地址
|
|
90
|
+
- addresses.solana 是有效的 Solana 地址 (如果支持)
|
|
91
|
+
- addresses.bitcoin 是有效的 BTC 地址 (如果支持)
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
### Test Case 4: get_token_balances
|
|
97
|
+
|
|
98
|
+
#### 4.1 获取自己的余额
|
|
99
|
+
```
|
|
100
|
+
调用: get_token_balances()
|
|
101
|
+
预期: 返回配置钱包的余额
|
|
102
|
+
验证:
|
|
103
|
+
- wallet 地址与配置一致
|
|
104
|
+
- balances 包含所有支持的代币
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
### Test Case 5: check_allowances
|
|
110
|
+
|
|
111
|
+
#### 5.1 检查授权状态
|
|
112
|
+
```
|
|
113
|
+
调用: check_allowances()
|
|
114
|
+
预期: 返回所有合约的授权状态
|
|
115
|
+
验证:
|
|
116
|
+
- erc20Allowances 包含 CTF Exchange, Neg Risk Exchange 等
|
|
117
|
+
- erc1155Approvals 包含 Conditional Tokens
|
|
118
|
+
- tradingReady 表示是否可以交易
|
|
119
|
+
- issues 列出未授权的合约
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
### Test Case 6: approve_trading (危险操作)
|
|
125
|
+
|
|
126
|
+
> 警告: 此测试会产生链上交易,消耗 Gas
|
|
127
|
+
|
|
128
|
+
#### 6.1 授权所有合约
|
|
129
|
+
```
|
|
130
|
+
前置条件:
|
|
131
|
+
- 确认钱包有足够的 MATIC 支付 Gas
|
|
132
|
+
- 确认这是测试环境或用户明确同意
|
|
133
|
+
|
|
134
|
+
调用: approve_trading()
|
|
135
|
+
预期: 授权所有必要的合约
|
|
136
|
+
验证:
|
|
137
|
+
- 所有授权交易成功
|
|
138
|
+
- check_allowances 显示 tradingReady = true
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
### Test Case 7: swap (危险操作)
|
|
144
|
+
|
|
145
|
+
> 警告: 此测试会产生链上交易
|
|
146
|
+
|
|
147
|
+
#### 7.1 MATIC -> USDC 小额交换
|
|
148
|
+
```
|
|
149
|
+
前置: 确认钱包有足够 MATIC
|
|
150
|
+
调用: swap(tokenIn="MATIC", tokenOut="USDC", amount="0.1")
|
|
151
|
+
预期: 成功交换
|
|
152
|
+
验证:
|
|
153
|
+
- txHash 存在
|
|
154
|
+
- amountOut > 0
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
### Test Case 8: swap_and_deposit (危险操作)
|
|
160
|
+
|
|
161
|
+
> 此测试通常跳过,除非明确需要测试
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
### Test Case 9: deposit_usdc (危险操作)
|
|
166
|
+
|
|
167
|
+
> 此测试通常跳过,除非明确需要测试
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## 执行记录
|
|
172
|
+
|
|
173
|
+
### Phase A (只读) - 2025-12-23
|
|
174
|
+
|
|
175
|
+
| Test Case | 状态 | 结果 | 备注 |
|
|
176
|
+
|-----------|------|------|------|
|
|
177
|
+
| 1.1 supported_assets 全部 | ✅ PASS | 返回 6 链 47 资产 | 包含 Ethereum, Polygon, Base, Arbitrum, Optimism, Solana |
|
|
178
|
+
| 1.2 supported_assets 按链 | ✅ PASS | Polygon: 7 资产 | chainId=137 过滤正常 |
|
|
179
|
+
| 2.1 wallet_balances 主钱包 | ✅ PASS | 返回所有代币余额 | 0x0F5988... 查询成功 |
|
|
180
|
+
| 2.2 wallet_balances 交易者 | ✅ PASS | Top trader 余额正常 | 从 leaderboard 获取地址 |
|
|
181
|
+
| 2.3 wallet_balances 空钱包 | ✅ PASS | 全零余额 | nonZeroBalances = [] |
|
|
182
|
+
|
|
183
|
+
### Phase B (需要私钥) - 2025-12-23
|
|
184
|
+
|
|
185
|
+
| Test Case | 状态 | 结果 | 备注 |
|
|
186
|
+
|-----------|------|------|------|
|
|
187
|
+
| 3.1 deposit_addresses | ⚠️ SKIPPED | - | AUTH_REQUIRED (需要私钥) |
|
|
188
|
+
| 4.1 token_balances | ⚠️ SKIPPED | - | AUTH_REQUIRED (需要私钥) |
|
|
189
|
+
| 5.1 check_allowances | ✅ PASS | 7 项缺失授权 | 钱包 0xed1050... |
|
|
190
|
+
| 6.1 approve_trading | ✅ PASS | 7 项授权成功 | 全部 ERC20+ERC1155 |
|
|
191
|
+
| 7.1 swap MATIC→USDC | ✅ PASS | 20 MATIC → 7.5 USDC | QuickSwap V3 |
|
|
192
|
+
| 7.2 swap WMATIC→USDC_E | ❌ FAIL | 无直接池 | 需用 deposit 替代 |
|
|
193
|
+
| 8.x swap_and_deposit | ⚠️ SKIPPED | 用分步替代 | - |
|
|
194
|
+
| 9.x deposit_usdc | ✅ PASS | 7 USDC → 6.99 USDC.e | Bridge 1-5分钟 |
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## 发现的问题
|
|
199
|
+
|
|
200
|
+
| ID | 问题描述 | 严重性 | 状态 |
|
|
201
|
+
|----|---------|--------|------|
|
|
202
|
+
| 5 | approve_trading: signer.provider 为 null | High | ✅ FIXED |
|
|
203
|
+
| 6 | swap/get_token_balances: signer.provider 为 null | High | ✅ FIXED |
|
|
204
|
+
|
|
205
|
+
### 问题修复详情 (2025-12-23)
|
|
206
|
+
|
|
207
|
+
**Issue #5 & #6 - Provider 未初始化**
|
|
208
|
+
|
|
209
|
+
- **问题**: SDK 返回的 signer 没有 provider 属性,导致 SwapService 和 AuthorizationService 无法执行链上查询
|
|
210
|
+
- **根因**: `getSignerFromSdk()` 直接返回 signer,未检查是否有 provider 连接
|
|
211
|
+
- **修复**:
|
|
212
|
+
1. `swap-service.ts`: 添加 provider 回退逻辑
|
|
213
|
+
```typescript
|
|
214
|
+
this.provider = signer.provider || new ethers.providers.JsonRpcProvider('https://polygon-rpc.com');
|
|
215
|
+
this.signer = signer.provider ? signer : signer.connect(this.provider);
|
|
216
|
+
```
|
|
217
|
+
2. `wallet.ts`: 在 `getSignerFromSdk()` 中确保 signer 连接到 provider
|
|
218
|
+
```typescript
|
|
219
|
+
if (!signer.provider) {
|
|
220
|
+
const provider = new ethers.providers.JsonRpcProvider(POLYGON_RPC);
|
|
221
|
+
return signer.connect(provider);
|
|
222
|
+
}
|
|
223
|
+
```
|
|
224
|
+
- **验证**: 需要重启 MCP Server 以加载新代码
|