@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.
Files changed (244) hide show
  1. package/.env +0 -0
  2. package/README.md +803 -0
  3. package/dist/__tests__/clob-api.test.d.ts +5 -0
  4. package/dist/__tests__/clob-api.test.d.ts.map +1 -0
  5. package/dist/__tests__/clob-api.test.js +240 -0
  6. package/dist/__tests__/clob-api.test.js.map +1 -0
  7. package/dist/__tests__/integration/bridge-client.integration.test.d.ts +11 -0
  8. package/dist/__tests__/integration/bridge-client.integration.test.d.ts.map +1 -0
  9. package/dist/__tests__/integration/bridge-client.integration.test.js +260 -0
  10. package/dist/__tests__/integration/bridge-client.integration.test.js.map +1 -0
  11. package/dist/__tests__/integration/clob-api.integration.test.d.ts +13 -0
  12. package/dist/__tests__/integration/clob-api.integration.test.d.ts.map +1 -0
  13. package/dist/__tests__/integration/clob-api.integration.test.js +170 -0
  14. package/dist/__tests__/integration/clob-api.integration.test.js.map +1 -0
  15. package/dist/__tests__/integration/ctf-client.integration.test.d.ts +17 -0
  16. package/dist/__tests__/integration/ctf-client.integration.test.d.ts.map +1 -0
  17. package/dist/__tests__/integration/ctf-client.integration.test.js +234 -0
  18. package/dist/__tests__/integration/ctf-client.integration.test.js.map +1 -0
  19. package/dist/__tests__/integration/data-api.integration.test.d.ts +9 -0
  20. package/dist/__tests__/integration/data-api.integration.test.d.ts.map +1 -0
  21. package/dist/__tests__/integration/data-api.integration.test.js +161 -0
  22. package/dist/__tests__/integration/data-api.integration.test.js.map +1 -0
  23. package/dist/__tests__/integration/gamma-api.integration.test.d.ts +9 -0
  24. package/dist/__tests__/integration/gamma-api.integration.test.d.ts.map +1 -0
  25. package/dist/__tests__/integration/gamma-api.integration.test.js +170 -0
  26. package/dist/__tests__/integration/gamma-api.integration.test.js.map +1 -0
  27. package/dist/__tests__/test-utils.d.ts +92 -0
  28. package/dist/__tests__/test-utils.d.ts.map +1 -0
  29. package/dist/__tests__/test-utils.js +143 -0
  30. package/dist/__tests__/test-utils.js.map +1 -0
  31. package/dist/clients/bridge-client.d.ts +388 -0
  32. package/dist/clients/bridge-client.d.ts.map +1 -0
  33. package/dist/clients/bridge-client.js +587 -0
  34. package/dist/clients/bridge-client.js.map +1 -0
  35. package/dist/clients/clob-api.d.ts +318 -0
  36. package/dist/clients/clob-api.d.ts.map +1 -0
  37. package/dist/clients/clob-api.js +388 -0
  38. package/dist/clients/clob-api.js.map +1 -0
  39. package/dist/clients/ctf-client.d.ts +473 -0
  40. package/dist/clients/ctf-client.d.ts.map +1 -0
  41. package/dist/clients/ctf-client.js +915 -0
  42. package/dist/clients/ctf-client.js.map +1 -0
  43. package/dist/clients/data-api.d.ts +134 -0
  44. package/dist/clients/data-api.d.ts.map +1 -0
  45. package/dist/clients/data-api.js +265 -0
  46. package/dist/clients/data-api.js.map +1 -0
  47. package/dist/clients/gamma-api.d.ts +401 -0
  48. package/dist/clients/gamma-api.d.ts.map +1 -0
  49. package/dist/clients/gamma-api.js +352 -0
  50. package/dist/clients/gamma-api.js.map +1 -0
  51. package/dist/clients/trading-client.d.ts +252 -0
  52. package/dist/clients/trading-client.d.ts.map +1 -0
  53. package/dist/clients/trading-client.js +543 -0
  54. package/dist/clients/trading-client.js.map +1 -0
  55. package/dist/clients/websocket-manager.d.ts +100 -0
  56. package/dist/clients/websocket-manager.d.ts.map +1 -0
  57. package/dist/clients/websocket-manager.js +193 -0
  58. package/dist/clients/websocket-manager.js.map +1 -0
  59. package/dist/core/cache-adapter-bridge.d.ts +36 -0
  60. package/dist/core/cache-adapter-bridge.d.ts.map +1 -0
  61. package/dist/core/cache-adapter-bridge.js +81 -0
  62. package/dist/core/cache-adapter-bridge.js.map +1 -0
  63. package/dist/core/cache.d.ts +40 -0
  64. package/dist/core/cache.d.ts.map +1 -0
  65. package/dist/core/cache.js +71 -0
  66. package/dist/core/cache.js.map +1 -0
  67. package/dist/core/errors.d.ts +38 -0
  68. package/dist/core/errors.d.ts.map +1 -0
  69. package/dist/core/errors.js +84 -0
  70. package/dist/core/errors.js.map +1 -0
  71. package/dist/core/rate-limiter.d.ts +31 -0
  72. package/dist/core/rate-limiter.d.ts.map +1 -0
  73. package/dist/core/rate-limiter.js +70 -0
  74. package/dist/core/rate-limiter.js.map +1 -0
  75. package/dist/core/types.d.ts +314 -0
  76. package/dist/core/types.d.ts.map +1 -0
  77. package/dist/core/types.js +19 -0
  78. package/dist/core/types.js.map +1 -0
  79. package/dist/core/unified-cache.d.ts +63 -0
  80. package/dist/core/unified-cache.d.ts.map +1 -0
  81. package/dist/core/unified-cache.js +114 -0
  82. package/dist/core/unified-cache.js.map +1 -0
  83. package/dist/index.d.ts +94 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +258 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/mcp/errors.d.ts +33 -0
  88. package/dist/mcp/errors.d.ts.map +1 -0
  89. package/dist/mcp/errors.js +86 -0
  90. package/dist/mcp/errors.js.map +1 -0
  91. package/dist/mcp/index.d.ts +62 -0
  92. package/dist/mcp/index.d.ts.map +1 -0
  93. package/dist/mcp/index.js +173 -0
  94. package/dist/mcp/index.js.map +1 -0
  95. package/dist/mcp/server.d.ts +17 -0
  96. package/dist/mcp/server.d.ts.map +1 -0
  97. package/dist/mcp/server.js +155 -0
  98. package/dist/mcp/server.js.map +1 -0
  99. package/dist/mcp/tools/guide.d.ts +12 -0
  100. package/dist/mcp/tools/guide.d.ts.map +1 -0
  101. package/dist/mcp/tools/guide.js +801 -0
  102. package/dist/mcp/tools/guide.js.map +1 -0
  103. package/dist/mcp/tools/index.d.ts +11 -0
  104. package/dist/mcp/tools/index.d.ts.map +1 -0
  105. package/dist/mcp/tools/index.js +27 -0
  106. package/dist/mcp/tools/index.js.map +1 -0
  107. package/dist/mcp/tools/market.d.ts +11 -0
  108. package/dist/mcp/tools/market.d.ts.map +1 -0
  109. package/dist/mcp/tools/market.js +314 -0
  110. package/dist/mcp/tools/market.js.map +1 -0
  111. package/dist/mcp/tools/order.d.ts +10 -0
  112. package/dist/mcp/tools/order.d.ts.map +1 -0
  113. package/dist/mcp/tools/order.js +258 -0
  114. package/dist/mcp/tools/order.js.map +1 -0
  115. package/dist/mcp/tools/trade.d.ts +38 -0
  116. package/dist/mcp/tools/trade.d.ts.map +1 -0
  117. package/dist/mcp/tools/trade.js +314 -0
  118. package/dist/mcp/tools/trade.js.map +1 -0
  119. package/dist/mcp/tools/trader.d.ts +11 -0
  120. package/dist/mcp/tools/trader.d.ts.map +1 -0
  121. package/dist/mcp/tools/trader.js +277 -0
  122. package/dist/mcp/tools/trader.js.map +1 -0
  123. package/dist/mcp/tools/wallet.d.ts +274 -0
  124. package/dist/mcp/tools/wallet.d.ts.map +1 -0
  125. package/dist/mcp/tools/wallet.js +579 -0
  126. package/dist/mcp/tools/wallet.js.map +1 -0
  127. package/dist/mcp/types.d.ts +413 -0
  128. package/dist/mcp/types.d.ts.map +1 -0
  129. package/dist/mcp/types.js +5 -0
  130. package/dist/mcp/types.js.map +1 -0
  131. package/dist/services/authorization-service.d.ts +97 -0
  132. package/dist/services/authorization-service.d.ts.map +1 -0
  133. package/dist/services/authorization-service.js +279 -0
  134. package/dist/services/authorization-service.js.map +1 -0
  135. package/dist/services/market-service.d.ts +108 -0
  136. package/dist/services/market-service.d.ts.map +1 -0
  137. package/dist/services/market-service.js +458 -0
  138. package/dist/services/market-service.js.map +1 -0
  139. package/dist/services/realtime-service.d.ts +82 -0
  140. package/dist/services/realtime-service.d.ts.map +1 -0
  141. package/dist/services/realtime-service.js +150 -0
  142. package/dist/services/realtime-service.js.map +1 -0
  143. package/dist/services/swap-service.d.ts +217 -0
  144. package/dist/services/swap-service.d.ts.map +1 -0
  145. package/dist/services/swap-service.js +695 -0
  146. package/dist/services/swap-service.js.map +1 -0
  147. package/dist/services/wallet-service.d.ts +94 -0
  148. package/dist/services/wallet-service.d.ts.map +1 -0
  149. package/dist/services/wallet-service.js +173 -0
  150. package/dist/services/wallet-service.js.map +1 -0
  151. package/dist/utils/price-utils.d.ts +153 -0
  152. package/dist/utils/price-utils.d.ts.map +1 -0
  153. package/dist/utils/price-utils.js +236 -0
  154. package/dist/utils/price-utils.js.map +1 -0
  155. package/docs/00-design.md +760 -0
  156. package/docs/01-mcp.md +2041 -0
  157. package/docs/02-API.md +1148 -0
  158. package/docs/e2e/01-trader-tools.md +159 -0
  159. package/docs/e2e/02-market-tools.md +180 -0
  160. package/docs/e2e/03-order-tools.md +166 -0
  161. package/docs/e2e/04-wallet-tools.md +224 -0
  162. package/docs/e2e/05-trading-tools.md +327 -0
  163. package/docs/e2e/06-integration-scenarios.md +481 -0
  164. package/docs/e2e/coordinator.md +376 -0
  165. package/examples/01-basic-usage.ts +68 -0
  166. package/examples/02-smart-money.ts +95 -0
  167. package/examples/03-market-analysis.ts +108 -0
  168. package/examples/04-kline-aggregation.ts +158 -0
  169. package/examples/05-follow-wallet-strategy.ts +156 -0
  170. package/examples/06-services-demo.ts +124 -0
  171. package/examples/07-realtime-websocket.ts +117 -0
  172. package/examples/08-trading-orders.ts +278 -0
  173. package/examples/09-rewards-tracking.ts +187 -0
  174. package/examples/10-ctf-operations.ts +336 -0
  175. package/examples/11-live-arbitrage-scan.ts +221 -0
  176. package/examples/12-trending-arb-monitor.ts +406 -0
  177. package/examples/README.md +179 -0
  178. package/package.json +62 -0
  179. package/scripts/README.md +163 -0
  180. package/scripts/approvals/approve-erc1155.ts +129 -0
  181. package/scripts/approvals/approve-neg-risk-erc1155.ts +149 -0
  182. package/scripts/approvals/approve-neg-risk.ts +102 -0
  183. package/scripts/approvals/check-all-allowances.ts +150 -0
  184. package/scripts/approvals/check-allowance.ts +129 -0
  185. package/scripts/approvals/check-ctf-approval.ts +158 -0
  186. package/scripts/datas/001-report.md +486 -0
  187. package/scripts/datas/clone-modal-screenshot.png +0 -0
  188. package/scripts/deposit/deposit-native-usdc.ts +179 -0
  189. package/scripts/deposit/deposit-usdc.ts +155 -0
  190. package/scripts/deposit/swap-usdc-to-usdce.ts +375 -0
  191. package/scripts/research/research-markets.ts +166 -0
  192. package/scripts/trading/check-orders.ts +50 -0
  193. package/scripts/trading/sell-nvidia-positions.ts +206 -0
  194. package/scripts/trading/test-order.ts +172 -0
  195. package/scripts/truth.md +440 -0
  196. package/scripts/verify/test-approve-trading.ts +98 -0
  197. package/scripts/verify/test-provider-fix.ts +43 -0
  198. package/scripts/verify/test-search-mcp.ts +113 -0
  199. package/scripts/verify/verify-all-apis.ts +160 -0
  200. package/scripts/wallet/check-wallet-balances.ts +75 -0
  201. package/scripts/wallet/test-wallet-operations.ts +191 -0
  202. package/scripts/wallet/verify-wallet-tools.ts +124 -0
  203. package/src/__tests__/clob-api.test.ts +301 -0
  204. package/src/__tests__/integration/bridge-client.integration.test.ts +314 -0
  205. package/src/__tests__/integration/clob-api.integration.test.ts +218 -0
  206. package/src/__tests__/integration/ctf-client.integration.test.ts +331 -0
  207. package/src/__tests__/integration/data-api.integration.test.ts +194 -0
  208. package/src/__tests__/integration/gamma-api.integration.test.ts +206 -0
  209. package/src/__tests__/test-utils.ts +170 -0
  210. package/src/clients/bridge-client.ts +841 -0
  211. package/src/clients/clob-api.ts +629 -0
  212. package/src/clients/ctf-client.ts +1216 -0
  213. package/src/clients/data-api.ts +469 -0
  214. package/src/clients/gamma-api.ts +597 -0
  215. package/src/clients/trading-client.ts +749 -0
  216. package/src/clients/websocket-manager.ts +267 -0
  217. package/src/core/cache-adapter-bridge.ts +94 -0
  218. package/src/core/cache.ts +85 -0
  219. package/src/core/errors.ts +117 -0
  220. package/src/core/rate-limiter.ts +74 -0
  221. package/src/core/types.ts +360 -0
  222. package/src/core/unified-cache.ts +153 -0
  223. package/src/index.ts +455 -0
  224. package/src/mcp/README.md +380 -0
  225. package/src/mcp/errors.ts +124 -0
  226. package/src/mcp/index.ts +309 -0
  227. package/src/mcp/server.ts +183 -0
  228. package/src/mcp/tools/guide.ts +821 -0
  229. package/src/mcp/tools/index.ts +73 -0
  230. package/src/mcp/tools/market.ts +363 -0
  231. package/src/mcp/tools/order.ts +326 -0
  232. package/src/mcp/tools/trade.ts +417 -0
  233. package/src/mcp/tools/trader.ts +322 -0
  234. package/src/mcp/tools/wallet.ts +683 -0
  235. package/src/mcp/types.ts +472 -0
  236. package/src/services/authorization-service.ts +357 -0
  237. package/src/services/market-service.ts +544 -0
  238. package/src/services/realtime-service.ts +196 -0
  239. package/src/services/swap-service.ts +896 -0
  240. package/src/services/wallet-service.ts +259 -0
  241. package/src/utils/price-utils.ts +307 -0
  242. package/tsconfig.json +8 -0
  243. package/vitest.config.ts +19 -0
  244. 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 以加载新代码