@catalyst-team/poly-sdk 0.2.1 → 0.4.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 (277) hide show
  1. package/README.md +665 -807
  2. package/README.zh-CN.md +645 -342
  3. package/dist/__tests__/integration/arbitrage-service.integration.test.d.ts +12 -0
  4. package/dist/__tests__/integration/arbitrage-service.integration.test.d.ts.map +1 -0
  5. package/dist/__tests__/integration/arbitrage-service.integration.test.js +267 -0
  6. package/dist/__tests__/integration/arbitrage-service.integration.test.js.map +1 -0
  7. package/dist/__tests__/integration/data-api.integration.test.js +6 -3
  8. package/dist/__tests__/integration/data-api.integration.test.js.map +1 -1
  9. package/dist/__tests__/integration/market-service.integration.test.d.ts +10 -0
  10. package/dist/__tests__/integration/market-service.integration.test.d.ts.map +1 -0
  11. package/dist/__tests__/integration/market-service.integration.test.js +173 -0
  12. package/dist/__tests__/integration/market-service.integration.test.js.map +1 -0
  13. package/dist/__tests__/integration/realtime-service-v2.integration.test.d.ts +10 -0
  14. package/dist/__tests__/integration/realtime-service-v2.integration.test.d.ts.map +1 -0
  15. package/dist/__tests__/integration/realtime-service-v2.integration.test.js +307 -0
  16. package/dist/__tests__/integration/realtime-service-v2.integration.test.js.map +1 -0
  17. package/dist/__tests__/integration/trading-service.integration.test.d.ts +10 -0
  18. package/dist/__tests__/integration/trading-service.integration.test.d.ts.map +1 -0
  19. package/dist/__tests__/integration/trading-service.integration.test.js +58 -0
  20. package/dist/__tests__/integration/trading-service.integration.test.js.map +1 -0
  21. package/dist/clients/clob-api.d.ts +73 -0
  22. package/dist/clients/clob-api.d.ts.map +1 -1
  23. package/dist/clients/clob-api.js +60 -0
  24. package/dist/clients/clob-api.js.map +1 -1
  25. package/dist/clients/ctf-client.d.ts +6 -4
  26. package/dist/clients/ctf-client.d.ts.map +1 -1
  27. package/dist/clients/ctf-client.js.map +1 -1
  28. package/dist/clients/data-api.d.ts +333 -15
  29. package/dist/clients/data-api.d.ts.map +1 -1
  30. package/dist/clients/data-api.js +398 -26
  31. package/dist/clients/data-api.js.map +1 -1
  32. package/dist/clients/gamma-api.d.ts +5 -0
  33. package/dist/clients/gamma-api.d.ts.map +1 -1
  34. package/dist/clients/gamma-api.js +2 -0
  35. package/dist/clients/gamma-api.js.map +1 -1
  36. package/dist/clients/subgraph.d.ts +196 -0
  37. package/dist/clients/subgraph.d.ts.map +1 -0
  38. package/dist/clients/subgraph.js +332 -0
  39. package/dist/clients/subgraph.js.map +1 -0
  40. package/dist/clients/websocket-manager.d.ts +3 -0
  41. package/dist/clients/websocket-manager.d.ts.map +1 -1
  42. package/dist/clients/websocket-manager.js +10 -3
  43. package/dist/clients/websocket-manager.js.map +1 -1
  44. package/dist/core/cache.d.ts +3 -0
  45. package/dist/core/cache.d.ts.map +1 -1
  46. package/dist/core/cache.js +5 -0
  47. package/dist/core/cache.js.map +1 -1
  48. package/dist/core/errors.d.ts +2 -1
  49. package/dist/core/errors.d.ts.map +1 -1
  50. package/dist/core/errors.js +2 -0
  51. package/dist/core/errors.js.map +1 -1
  52. package/dist/core/rate-limiter.d.ts +3 -1
  53. package/dist/core/rate-limiter.d.ts.map +1 -1
  54. package/dist/core/rate-limiter.js +12 -0
  55. package/dist/core/rate-limiter.js.map +1 -1
  56. package/dist/core/types.d.ts +205 -13
  57. package/dist/core/types.d.ts.map +1 -1
  58. package/dist/core/types.js +30 -0
  59. package/dist/core/types.js.map +1 -1
  60. package/dist/core/types.test.d.ts +7 -0
  61. package/dist/core/types.test.d.ts.map +1 -0
  62. package/dist/core/types.test.js +122 -0
  63. package/dist/core/types.test.js.map +1 -0
  64. package/dist/index.d.ts +84 -18
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +139 -132
  67. package/dist/index.js.map +1 -1
  68. package/dist/scripts/dip-arb/auto-trade.d.ts +20 -0
  69. package/dist/scripts/dip-arb/auto-trade.d.ts.map +1 -0
  70. package/dist/scripts/dip-arb/auto-trade.js +373 -0
  71. package/dist/scripts/dip-arb/auto-trade.js.map +1 -0
  72. package/dist/scripts/dip-arb/example-basic.d.ts +30 -0
  73. package/dist/scripts/dip-arb/example-basic.d.ts.map +1 -0
  74. package/dist/scripts/dip-arb/example-basic.js +222 -0
  75. package/dist/scripts/dip-arb/example-basic.js.map +1 -0
  76. package/dist/scripts/dip-arb/redeem-positions.d.ts +11 -0
  77. package/dist/scripts/dip-arb/redeem-positions.d.ts.map +1 -0
  78. package/dist/scripts/dip-arb/redeem-positions.js +201 -0
  79. package/dist/scripts/dip-arb/redeem-positions.js.map +1 -0
  80. package/dist/scripts/dip-arb/scan-markets.d.ts +6 -0
  81. package/dist/scripts/dip-arb/scan-markets.d.ts.map +1 -0
  82. package/dist/scripts/dip-arb/scan-markets.js +73 -0
  83. package/dist/scripts/dip-arb/scan-markets.js.map +1 -0
  84. package/dist/services/arbitrage-service.d.ts +3 -2
  85. package/dist/services/arbitrage-service.d.ts.map +1 -1
  86. package/dist/services/arbitrage-service.js +71 -43
  87. package/dist/services/arbitrage-service.js.map +1 -1
  88. package/dist/services/binance-service.d.ts +154 -0
  89. package/dist/services/binance-service.d.ts.map +1 -0
  90. package/dist/services/binance-service.js +266 -0
  91. package/dist/services/binance-service.js.map +1 -0
  92. package/dist/services/dip-arb-service.d.ts +209 -0
  93. package/dist/services/dip-arb-service.d.ts.map +1 -0
  94. package/dist/services/dip-arb-service.js +1602 -0
  95. package/dist/services/dip-arb-service.js.map +1 -0
  96. package/dist/services/dip-arb-types.d.ts +553 -0
  97. package/dist/services/dip-arb-types.d.ts.map +1 -0
  98. package/dist/services/dip-arb-types.js +164 -0
  99. package/dist/services/dip-arb-types.js.map +1 -0
  100. package/dist/services/market-service.d.ts +267 -8
  101. package/dist/services/market-service.d.ts.map +1 -1
  102. package/dist/services/market-service.js +771 -42
  103. package/dist/services/market-service.js.map +1 -1
  104. package/dist/services/onchain-service.d.ts +309 -0
  105. package/dist/services/onchain-service.d.ts.map +1 -0
  106. package/dist/services/onchain-service.js +417 -0
  107. package/dist/services/onchain-service.js.map +1 -0
  108. package/dist/services/realtime-service-v2.d.ts +362 -0
  109. package/dist/services/realtime-service-v2.d.ts.map +1 -0
  110. package/dist/services/realtime-service-v2.js +858 -0
  111. package/dist/services/realtime-service-v2.js.map +1 -0
  112. package/dist/services/realtime-service.d.ts +17 -17
  113. package/dist/services/realtime-service.d.ts.map +1 -1
  114. package/dist/services/realtime-service.js +91 -59
  115. package/dist/services/realtime-service.js.map +1 -1
  116. package/dist/services/smart-money-service.d.ts +352 -0
  117. package/dist/services/smart-money-service.d.ts.map +1 -0
  118. package/dist/services/smart-money-service.js +582 -0
  119. package/dist/services/smart-money-service.js.map +1 -0
  120. package/dist/services/trading-service.d.ts +177 -0
  121. package/dist/services/trading-service.d.ts.map +1 -0
  122. package/dist/services/trading-service.js +422 -0
  123. package/dist/services/trading-service.js.map +1 -0
  124. package/dist/services/wallet-service.d.ts +225 -3
  125. package/dist/services/wallet-service.d.ts.map +1 -1
  126. package/dist/services/wallet-service.js +511 -3
  127. package/dist/services/wallet-service.js.map +1 -1
  128. package/dist/src/__tests__/integration/arbitrage-service.integration.test.d.ts +12 -0
  129. package/dist/src/__tests__/integration/arbitrage-service.integration.test.d.ts.map +1 -0
  130. package/dist/src/__tests__/integration/arbitrage-service.integration.test.js +267 -0
  131. package/dist/src/__tests__/integration/arbitrage-service.integration.test.js.map +1 -0
  132. package/dist/src/__tests__/integration/bridge-client.integration.test.d.ts +11 -0
  133. package/dist/src/__tests__/integration/bridge-client.integration.test.d.ts.map +1 -0
  134. package/dist/src/__tests__/integration/bridge-client.integration.test.js +260 -0
  135. package/dist/src/__tests__/integration/bridge-client.integration.test.js.map +1 -0
  136. package/dist/src/__tests__/integration/ctf-client.integration.test.d.ts +17 -0
  137. package/dist/src/__tests__/integration/ctf-client.integration.test.d.ts.map +1 -0
  138. package/dist/src/__tests__/integration/ctf-client.integration.test.js +234 -0
  139. package/dist/src/__tests__/integration/ctf-client.integration.test.js.map +1 -0
  140. package/dist/src/__tests__/integration/data-api.integration.test.d.ts +9 -0
  141. package/dist/src/__tests__/integration/data-api.integration.test.d.ts.map +1 -0
  142. package/dist/src/__tests__/integration/data-api.integration.test.js +164 -0
  143. package/dist/src/__tests__/integration/data-api.integration.test.js.map +1 -0
  144. package/dist/src/__tests__/integration/gamma-api.integration.test.d.ts +9 -0
  145. package/dist/src/__tests__/integration/gamma-api.integration.test.d.ts.map +1 -0
  146. package/dist/src/__tests__/integration/gamma-api.integration.test.js +170 -0
  147. package/dist/src/__tests__/integration/gamma-api.integration.test.js.map +1 -0
  148. package/dist/src/__tests__/integration/market-service.integration.test.d.ts +10 -0
  149. package/dist/src/__tests__/integration/market-service.integration.test.d.ts.map +1 -0
  150. package/dist/src/__tests__/integration/market-service.integration.test.js +180 -0
  151. package/dist/src/__tests__/integration/market-service.integration.test.js.map +1 -0
  152. package/dist/src/__tests__/integration/realtime-service-v2.integration.test.d.ts +10 -0
  153. package/dist/src/__tests__/integration/realtime-service-v2.integration.test.d.ts.map +1 -0
  154. package/dist/src/__tests__/integration/realtime-service-v2.integration.test.js +307 -0
  155. package/dist/src/__tests__/integration/realtime-service-v2.integration.test.js.map +1 -0
  156. package/dist/src/__tests__/integration/trading-service.integration.test.d.ts +10 -0
  157. package/dist/src/__tests__/integration/trading-service.integration.test.d.ts.map +1 -0
  158. package/dist/src/__tests__/integration/trading-service.integration.test.js +58 -0
  159. package/dist/src/__tests__/integration/trading-service.integration.test.js.map +1 -0
  160. package/dist/src/__tests__/test-utils.d.ts +92 -0
  161. package/dist/src/__tests__/test-utils.d.ts.map +1 -0
  162. package/dist/src/__tests__/test-utils.js +143 -0
  163. package/dist/src/__tests__/test-utils.js.map +1 -0
  164. package/dist/src/clients/bridge-client.d.ts +388 -0
  165. package/dist/src/clients/bridge-client.d.ts.map +1 -0
  166. package/dist/src/clients/bridge-client.js +587 -0
  167. package/dist/src/clients/bridge-client.js.map +1 -0
  168. package/dist/src/clients/ctf-client.d.ts +475 -0
  169. package/dist/src/clients/ctf-client.d.ts.map +1 -0
  170. package/dist/src/clients/ctf-client.js +915 -0
  171. package/dist/src/clients/ctf-client.js.map +1 -0
  172. package/dist/src/clients/data-api.d.ts +452 -0
  173. package/dist/src/clients/data-api.d.ts.map +1 -0
  174. package/dist/src/clients/data-api.js +637 -0
  175. package/dist/src/clients/data-api.js.map +1 -0
  176. package/dist/src/clients/gamma-api.d.ts +421 -0
  177. package/dist/src/clients/gamma-api.d.ts.map +1 -0
  178. package/dist/src/clients/gamma-api.js +359 -0
  179. package/dist/src/clients/gamma-api.js.map +1 -0
  180. package/dist/src/clients/subgraph.d.ts +196 -0
  181. package/dist/src/clients/subgraph.d.ts.map +1 -0
  182. package/dist/src/clients/subgraph.js +332 -0
  183. package/dist/src/clients/subgraph.js.map +1 -0
  184. package/dist/src/core/cache-adapter-bridge.d.ts +36 -0
  185. package/dist/src/core/cache-adapter-bridge.d.ts.map +1 -0
  186. package/dist/src/core/cache-adapter-bridge.js +81 -0
  187. package/dist/src/core/cache-adapter-bridge.js.map +1 -0
  188. package/dist/src/core/cache.d.ts +43 -0
  189. package/dist/src/core/cache.d.ts.map +1 -0
  190. package/dist/src/core/cache.js +76 -0
  191. package/dist/src/core/cache.js.map +1 -0
  192. package/dist/src/core/errors.d.ts +39 -0
  193. package/dist/src/core/errors.d.ts.map +1 -0
  194. package/dist/src/core/errors.js +86 -0
  195. package/dist/src/core/errors.js.map +1 -0
  196. package/dist/src/core/rate-limiter.d.ts +33 -0
  197. package/dist/src/core/rate-limiter.d.ts.map +1 -0
  198. package/dist/src/core/rate-limiter.js +82 -0
  199. package/dist/src/core/rate-limiter.js.map +1 -0
  200. package/dist/src/core/types.d.ts +506 -0
  201. package/dist/src/core/types.d.ts.map +1 -0
  202. package/dist/src/core/types.js +49 -0
  203. package/dist/src/core/types.js.map +1 -0
  204. package/dist/src/core/types.test.d.ts +7 -0
  205. package/dist/src/core/types.test.d.ts.map +1 -0
  206. package/dist/src/core/types.test.js +122 -0
  207. package/dist/src/core/types.test.js.map +1 -0
  208. package/dist/src/core/unified-cache.d.ts +63 -0
  209. package/dist/src/core/unified-cache.d.ts.map +1 -0
  210. package/dist/src/core/unified-cache.js +114 -0
  211. package/dist/src/core/unified-cache.js.map +1 -0
  212. package/dist/src/index.d.ts +159 -0
  213. package/dist/src/index.d.ts.map +1 -0
  214. package/dist/src/index.js +262 -0
  215. package/dist/src/index.js.map +1 -0
  216. package/dist/src/services/arbitrage-service.d.ts +409 -0
  217. package/dist/src/services/arbitrage-service.d.ts.map +1 -0
  218. package/dist/src/services/arbitrage-service.js +1450 -0
  219. package/dist/src/services/arbitrage-service.js.map +1 -0
  220. package/dist/src/services/authorization-service.d.ts +97 -0
  221. package/dist/src/services/authorization-service.d.ts.map +1 -0
  222. package/dist/src/services/authorization-service.js +279 -0
  223. package/dist/src/services/authorization-service.js.map +1 -0
  224. package/dist/src/services/binance-service.d.ts +154 -0
  225. package/dist/src/services/binance-service.d.ts.map +1 -0
  226. package/dist/src/services/binance-service.js +266 -0
  227. package/dist/src/services/binance-service.js.map +1 -0
  228. package/dist/src/services/dip-arb-service.d.ts +245 -0
  229. package/dist/src/services/dip-arb-service.d.ts.map +1 -0
  230. package/dist/src/services/dip-arb-service.js +1865 -0
  231. package/dist/src/services/dip-arb-service.js.map +1 -0
  232. package/dist/src/services/dip-arb-types.d.ts +553 -0
  233. package/dist/src/services/dip-arb-types.d.ts.map +1 -0
  234. package/dist/src/services/dip-arb-types.js +164 -0
  235. package/dist/src/services/dip-arb-types.js.map +1 -0
  236. package/dist/src/services/market-service.d.ts +370 -0
  237. package/dist/src/services/market-service.d.ts.map +1 -0
  238. package/dist/src/services/market-service.js +1200 -0
  239. package/dist/src/services/market-service.js.map +1 -0
  240. package/dist/src/services/onchain-service.d.ts +309 -0
  241. package/dist/src/services/onchain-service.d.ts.map +1 -0
  242. package/dist/src/services/onchain-service.js +417 -0
  243. package/dist/src/services/onchain-service.js.map +1 -0
  244. package/dist/src/services/realtime-service-v2.d.ts +367 -0
  245. package/dist/src/services/realtime-service-v2.d.ts.map +1 -0
  246. package/dist/src/services/realtime-service-v2.js +876 -0
  247. package/dist/src/services/realtime-service-v2.js.map +1 -0
  248. package/dist/src/services/smart-money-service.d.ts +352 -0
  249. package/dist/src/services/smart-money-service.d.ts.map +1 -0
  250. package/dist/src/services/smart-money-service.js +582 -0
  251. package/dist/src/services/smart-money-service.js.map +1 -0
  252. package/dist/src/services/swap-service.d.ts +217 -0
  253. package/dist/src/services/swap-service.d.ts.map +1 -0
  254. package/dist/src/services/swap-service.js +695 -0
  255. package/dist/src/services/swap-service.js.map +1 -0
  256. package/dist/src/services/trading-service.d.ts +177 -0
  257. package/dist/src/services/trading-service.d.ts.map +1 -0
  258. package/dist/src/services/trading-service.js +422 -0
  259. package/dist/src/services/trading-service.js.map +1 -0
  260. package/dist/src/services/wallet-service.d.ts +316 -0
  261. package/dist/src/services/wallet-service.d.ts.map +1 -0
  262. package/dist/src/services/wallet-service.js +681 -0
  263. package/dist/src/services/wallet-service.js.map +1 -0
  264. package/dist/src/utils/price-utils.d.ts +153 -0
  265. package/dist/src/utils/price-utils.d.ts.map +1 -0
  266. package/dist/src/utils/price-utils.js +236 -0
  267. package/dist/src/utils/price-utils.js.map +1 -0
  268. package/dist/src/utils/price-utils.test.d.ts +5 -0
  269. package/dist/src/utils/price-utils.test.d.ts.map +1 -0
  270. package/dist/src/utils/price-utils.test.js +192 -0
  271. package/dist/src/utils/price-utils.test.js.map +1 -0
  272. package/dist/utils/price-utils.test.d.ts +5 -0
  273. package/dist/utils/price-utils.test.d.ts.map +1 -0
  274. package/dist/utils/price-utils.test.js +192 -0
  275. package/dist/utils/price-utils.test.js.map +1 -0
  276. package/package.json +6 -5
  277. package/README.en.md +0 -502
@@ -0,0 +1,582 @@
1
+ /**
2
+ * SmartMoneyService
3
+ *
4
+ * 聪明钱监控和自动跟单服务
5
+ *
6
+ * 核心功能:
7
+ * 1. 监听指定地址的交易 - subscribeSmartMoneyTrades()
8
+ * 2. 自动跟单 - startAutoCopyTrading()
9
+ * 3. 聪明钱信息获取 - getSmartMoneyList(), getSmartMoneyInfo()
10
+ *
11
+ * ============================================================================
12
+ * 设计决策
13
+ * ============================================================================
14
+ *
15
+ * ## 监控方式
16
+ * 使用 Activity WebSocket,延迟 < 100ms,实测验证有效。
17
+ *
18
+ * ## 下单方式
19
+ * | 方式 | 使用场景 | 特点 |
20
+ * |------|---------|------|
21
+ * | FOK | 小额跟单 | 全部成交或取消 |
22
+ * | FAK | 大额跟单 | 部分成交也接受 |
23
+ *
24
+ * ## 重要限制
25
+ * ⚠️ Activity WebSocket 不会广播用户自己的交易!
26
+ * 验证跟单结果请使用 TradingService.getTrades()
27
+ */
28
+ // ============================================================================
29
+ // SmartMoneyService
30
+ // ============================================================================
31
+ export class SmartMoneyService {
32
+ walletService;
33
+ realtimeService;
34
+ tradingService;
35
+ config;
36
+ smartMoneyCache = new Map();
37
+ smartMoneySet = new Set();
38
+ cacheTimestamp = 0;
39
+ activeSubscription = null;
40
+ tradeHandlers = new Set();
41
+ constructor(walletService, realtimeService, tradingService, config = {}) {
42
+ this.walletService = walletService;
43
+ this.realtimeService = realtimeService;
44
+ this.tradingService = tradingService;
45
+ this.config = {
46
+ minPnl: config.minPnl ?? 1000,
47
+ cacheTtl: config.cacheTtl ?? 300000,
48
+ };
49
+ }
50
+ // ============================================================================
51
+ // Smart Money Info
52
+ // ============================================================================
53
+ /**
54
+ * Get list of Smart Money wallets from leaderboard
55
+ */
56
+ async getSmartMoneyList(limit = 100) {
57
+ if (this.isCacheValid()) {
58
+ return Array.from(this.smartMoneyCache.values());
59
+ }
60
+ const leaderboardPage = await this.walletService.getLeaderboard(0, limit);
61
+ const entries = leaderboardPage.entries;
62
+ const smartMoneyList = [];
63
+ for (let i = 0; i < entries.length; i++) {
64
+ const trader = entries[i];
65
+ if (trader.pnl < this.config.minPnl)
66
+ continue;
67
+ const wallet = {
68
+ address: trader.address.toLowerCase(),
69
+ name: trader.userName,
70
+ pnl: trader.pnl,
71
+ volume: trader.volume,
72
+ score: Math.min(100, Math.round((trader.pnl / 100000) * 50 + (trader.volume / 1000000) * 50)),
73
+ rank: trader.rank ?? i + 1,
74
+ };
75
+ smartMoneyList.push(wallet);
76
+ this.smartMoneyCache.set(wallet.address, wallet);
77
+ this.smartMoneySet.add(wallet.address);
78
+ }
79
+ this.cacheTimestamp = Date.now();
80
+ return smartMoneyList;
81
+ }
82
+ /**
83
+ * Check if an address is Smart Money
84
+ */
85
+ async isSmartMoney(address) {
86
+ const normalized = address.toLowerCase();
87
+ if (this.isCacheValid()) {
88
+ return this.smartMoneySet.has(normalized);
89
+ }
90
+ await this.getSmartMoneyList();
91
+ return this.smartMoneySet.has(normalized);
92
+ }
93
+ /**
94
+ * Get Smart Money info for an address
95
+ */
96
+ async getSmartMoneyInfo(address) {
97
+ const normalized = address.toLowerCase();
98
+ if (this.isCacheValid() && this.smartMoneyCache.has(normalized)) {
99
+ return this.smartMoneyCache.get(normalized);
100
+ }
101
+ await this.getSmartMoneyList();
102
+ return this.smartMoneyCache.get(normalized) || null;
103
+ }
104
+ // ============================================================================
105
+ // Trade Subscription - 监听交易
106
+ // ============================================================================
107
+ /**
108
+ * Subscribe to trades from specific addresses
109
+ *
110
+ * @example
111
+ * ```typescript
112
+ * const sub = smartMoneyService.subscribeSmartMoneyTrades(
113
+ * (trade) => {
114
+ * console.log(`${trade.traderName} ${trade.side} ${trade.size} @ ${trade.price}`);
115
+ * },
116
+ * { filterAddresses: ['0x1234...', '0x5678...'] }
117
+ * );
118
+ *
119
+ * // Stop listening
120
+ * sub.unsubscribe();
121
+ * ```
122
+ */
123
+ subscribeSmartMoneyTrades(onTrade, options = {}) {
124
+ this.tradeHandlers.add(onTrade);
125
+ // Ensure cache is populated
126
+ this.getSmartMoneyList().catch(() => { });
127
+ // Start subscription if not active
128
+ if (!this.activeSubscription) {
129
+ this.activeSubscription = this.realtimeService.subscribeAllActivity({
130
+ onTrade: (activityTrade) => {
131
+ this.handleActivityTrade(activityTrade, options);
132
+ },
133
+ onError: (error) => {
134
+ console.error('[SmartMoneyService] Subscription error:', error);
135
+ },
136
+ });
137
+ }
138
+ return {
139
+ id: `smart_money_${Date.now()}`,
140
+ unsubscribe: () => {
141
+ this.tradeHandlers.delete(onTrade);
142
+ if (this.tradeHandlers.size === 0 && this.activeSubscription) {
143
+ this.activeSubscription.unsubscribe();
144
+ this.activeSubscription = null;
145
+ }
146
+ },
147
+ };
148
+ }
149
+ async handleActivityTrade(trade, options) {
150
+ const rawAddress = trade.trader?.address;
151
+ if (!rawAddress)
152
+ return;
153
+ const traderAddress = rawAddress.toLowerCase();
154
+ // Address filter
155
+ if (options.filterAddresses && options.filterAddresses.length > 0) {
156
+ const normalized = options.filterAddresses.map(a => a.toLowerCase());
157
+ if (!normalized.includes(traderAddress))
158
+ return;
159
+ }
160
+ // Size filter
161
+ if (options.minSize && trade.size < options.minSize)
162
+ return;
163
+ // Smart Money filter
164
+ const isSmartMoney = this.smartMoneySet.has(traderAddress);
165
+ if (options.smartMoneyOnly && !isSmartMoney)
166
+ return;
167
+ const smartMoneyTrade = {
168
+ traderAddress,
169
+ traderName: trade.trader?.name,
170
+ conditionId: trade.conditionId,
171
+ marketSlug: trade.marketSlug,
172
+ side: trade.side,
173
+ size: trade.size,
174
+ price: trade.price,
175
+ tokenId: trade.asset,
176
+ outcome: trade.outcome,
177
+ txHash: trade.transactionHash,
178
+ timestamp: trade.timestamp,
179
+ isSmartMoney,
180
+ smartMoneyInfo: this.smartMoneyCache.get(traderAddress),
181
+ };
182
+ for (const handler of this.tradeHandlers) {
183
+ try {
184
+ handler(smartMoneyTrade);
185
+ }
186
+ catch (error) {
187
+ console.error('[SmartMoneyService] Handler error:', error);
188
+ }
189
+ }
190
+ }
191
+ // ============================================================================
192
+ // Auto Copy Trading - 自动跟单
193
+ // ============================================================================
194
+ /**
195
+ * Start auto copy trading - 自动跟单
196
+ *
197
+ * @example
198
+ * ```typescript
199
+ * const sub = await smartMoneyService.startAutoCopyTrading({
200
+ * targetAddresses: ['0x1234...'],
201
+ * // 或者跟踪排行榜前N名
202
+ * topN: 10,
203
+ *
204
+ * sizeScale: 0.1, // 10%
205
+ * maxSizePerTrade: 50, // $50
206
+ * maxSlippage: 0.03, // 3%
207
+ * orderType: 'FOK',
208
+ *
209
+ * dryRun: true, // 测试模式
210
+ *
211
+ * onTrade: (trade, result) => console.log(result),
212
+ * });
213
+ *
214
+ * // 停止
215
+ * sub.stop();
216
+ * ```
217
+ */
218
+ async startAutoCopyTrading(options) {
219
+ const startTime = Date.now();
220
+ // Build target list
221
+ let targetAddresses = [];
222
+ if (options.targetAddresses?.length) {
223
+ targetAddresses = options.targetAddresses.map(a => a.toLowerCase());
224
+ }
225
+ if (options.topN && options.topN > 0) {
226
+ const smartMoneyList = await this.getSmartMoneyList(options.topN);
227
+ const topAddresses = smartMoneyList.map(w => w.address);
228
+ targetAddresses = [...new Set([...targetAddresses, ...topAddresses])];
229
+ }
230
+ if (targetAddresses.length === 0) {
231
+ throw new Error('No target addresses. Use targetAddresses or topN.');
232
+ }
233
+ // Stats
234
+ const stats = {
235
+ startTime,
236
+ tradesDetected: 0,
237
+ tradesExecuted: 0,
238
+ tradesSkipped: 0,
239
+ tradesFailed: 0,
240
+ totalUsdcSpent: 0,
241
+ };
242
+ // Config
243
+ const sizeScale = options.sizeScale ?? 0.1;
244
+ const maxSizePerTrade = options.maxSizePerTrade ?? 50;
245
+ const maxSlippage = options.maxSlippage ?? 0.03;
246
+ const orderType = options.orderType ?? 'FOK';
247
+ const minTradeSize = options.minTradeSize ?? 10;
248
+ const sideFilter = options.sideFilter;
249
+ const delay = options.delay ?? 0;
250
+ const dryRun = options.dryRun ?? false;
251
+ // Subscribe
252
+ const subscription = this.subscribeSmartMoneyTrades(async (trade) => {
253
+ stats.tradesDetected++;
254
+ try {
255
+ // Check target
256
+ if (!targetAddresses.includes(trade.traderAddress.toLowerCase())) {
257
+ return;
258
+ }
259
+ // Filters
260
+ const tradeValue = trade.size * trade.price;
261
+ if (tradeValue < minTradeSize) {
262
+ stats.tradesSkipped++;
263
+ return;
264
+ }
265
+ if (sideFilter && trade.side !== sideFilter) {
266
+ stats.tradesSkipped++;
267
+ return;
268
+ }
269
+ // Calculate size
270
+ let copySize = trade.size * sizeScale;
271
+ let copyValue = copySize * trade.price;
272
+ // Enforce max size
273
+ if (copyValue > maxSizePerTrade) {
274
+ copySize = maxSizePerTrade / trade.price;
275
+ copyValue = maxSizePerTrade;
276
+ }
277
+ // Polymarket minimum order is $1
278
+ const MIN_ORDER_SIZE = 1;
279
+ if (copyValue < MIN_ORDER_SIZE) {
280
+ stats.tradesSkipped++;
281
+ return;
282
+ }
283
+ // Delay
284
+ if (delay > 0) {
285
+ await new Promise(resolve => setTimeout(resolve, delay));
286
+ }
287
+ // Token
288
+ const tokenId = trade.tokenId;
289
+ if (!tokenId) {
290
+ stats.tradesSkipped++;
291
+ return;
292
+ }
293
+ // Price with slippage
294
+ const slippagePrice = trade.side === 'BUY'
295
+ ? trade.price * (1 + maxSlippage)
296
+ : trade.price * (1 - maxSlippage);
297
+ const usdcAmount = copyValue; // Already calculated above
298
+ // Execute
299
+ let result;
300
+ if (dryRun) {
301
+ result = { success: true, orderId: `dry_run_${Date.now()}` };
302
+ console.log('[DRY RUN]', {
303
+ trader: trade.traderAddress.slice(0, 10),
304
+ side: trade.side,
305
+ market: trade.marketSlug,
306
+ copy: { size: copySize.toFixed(2), usdc: usdcAmount.toFixed(2) },
307
+ });
308
+ }
309
+ else {
310
+ result = await this.tradingService.createMarketOrder({
311
+ tokenId,
312
+ side: trade.side,
313
+ amount: usdcAmount,
314
+ price: slippagePrice,
315
+ orderType,
316
+ });
317
+ }
318
+ if (result.success) {
319
+ stats.tradesExecuted++;
320
+ stats.totalUsdcSpent += usdcAmount;
321
+ }
322
+ else {
323
+ stats.tradesFailed++;
324
+ }
325
+ options.onTrade?.(trade, result);
326
+ }
327
+ catch (error) {
328
+ stats.tradesFailed++;
329
+ options.onError?.(error instanceof Error ? error : new Error(String(error)));
330
+ }
331
+ }, { filterAddresses: targetAddresses, minSize: minTradeSize });
332
+ return {
333
+ id: subscription.id,
334
+ targetAddresses,
335
+ startTime,
336
+ isActive: true,
337
+ stats,
338
+ stop: () => subscription.unsubscribe(),
339
+ getStats: () => ({ ...stats }),
340
+ };
341
+ }
342
+ // ============================================================================
343
+ // Leaderboard - 排行榜
344
+ // ============================================================================
345
+ /**
346
+ * Get leaderboard by time period
347
+ *
348
+ * @example
349
+ * ```typescript
350
+ * // Get weekly top 100 by PnL
351
+ * const leaderboard = await sdk.smartMoney.getLeaderboard({
352
+ * period: 'week',
353
+ * limit: 100,
354
+ * sortBy: 'pnl'
355
+ * });
356
+ * ```
357
+ */
358
+ async getLeaderboard(options = {}) {
359
+ const period = options.period ?? 'week';
360
+ const limit = Math.min(options.limit ?? 50, 500);
361
+ const sortBy = options.sortBy ?? 'pnl';
362
+ const offset = Math.min(options.offset ?? 0, 10000);
363
+ const entries = await this.walletService.getLeaderboardByPeriod(period, limit, sortBy, 'OVERALL', offset);
364
+ return entries.map(e => ({
365
+ address: e.address,
366
+ rank: e.rank,
367
+ pnl: e.pnl,
368
+ volume: e.volume,
369
+ tradeCount: e.tradeCount,
370
+ userName: e.userName,
371
+ profileImage: e.profileImage,
372
+ }));
373
+ }
374
+ // ============================================================================
375
+ // Wallet Report - 钱包报告
376
+ // ============================================================================
377
+ /**
378
+ * Generate comprehensive wallet report
379
+ *
380
+ * @example
381
+ * ```typescript
382
+ * const report = await sdk.smartMoney.getWalletReport('0x...');
383
+ * console.log(report.overview.totalPnL);
384
+ * console.log(report.rankings.weekly?.rank);
385
+ * ```
386
+ */
387
+ async getWalletReport(address) {
388
+ // Fetch all data in parallel
389
+ const [profile, positions, activitySummary, dailyPnl, weeklyPnl, monthlyPnl, allTimePnl,] = await Promise.all([
390
+ this.walletService.getWalletProfile(address),
391
+ this.walletService.getWalletPositions(address),
392
+ this.walletService.getWalletActivity(address, 100),
393
+ this.walletService.getUserPeriodPnl(address, 'day').catch(() => null),
394
+ this.walletService.getUserPeriodPnl(address, 'week').catch(() => null),
395
+ this.walletService.getUserPeriodPnl(address, 'month').catch(() => null),
396
+ this.walletService.getUserPeriodPnl(address, 'all').catch(() => null),
397
+ ]);
398
+ // Calculate performance metrics
399
+ const winningPositions = positions.filter(p => (p.cashPnl ?? 0) > 0);
400
+ const losingPositions = positions.filter(p => (p.cashPnl ?? 0) < 0);
401
+ // Use initialValue (cost basis) instead of currentValue (which is 0 for settled markets)
402
+ const avgPositionSize = positions.length > 0
403
+ ? positions.reduce((sum, p) => sum + (p.initialValue ?? (p.size * p.avgPrice)), 0) / positions.length
404
+ : 0;
405
+ const avgWinAmount = winningPositions.length > 0
406
+ ? winningPositions.reduce((sum, p) => sum + (p.cashPnl ?? 0), 0) / winningPositions.length
407
+ : 0;
408
+ const avgLossAmount = losingPositions.length > 0
409
+ ? Math.abs(losingPositions.reduce((sum, p) => sum + (p.cashPnl ?? 0), 0) / losingPositions.length)
410
+ : 0;
411
+ const uniqueMarkets = new Set(positions.map(p => p.conditionId)).size;
412
+ // Category analysis
413
+ const categoryStats = this.analyzeCategories(positions);
414
+ // Recent trades
415
+ const trades = activitySummary.activities.filter(a => a.type === 'TRADE');
416
+ const recentTrades = trades.slice(0, 10);
417
+ // Build rankings
418
+ const toRanking = (entry) => {
419
+ if (!entry)
420
+ return null;
421
+ return { rank: entry.rank, pnl: entry.pnl, volume: entry.volume };
422
+ };
423
+ return {
424
+ address,
425
+ generatedAt: new Date(),
426
+ overview: {
427
+ totalPnL: profile.totalPnL,
428
+ realizedPnL: profile.realizedPnL,
429
+ unrealizedPnL: profile.unrealizedPnL,
430
+ positionCount: positions.length,
431
+ tradeCount: profile.tradeCount,
432
+ smartScore: profile.smartScore,
433
+ lastActiveAt: profile.lastActiveAt,
434
+ },
435
+ rankings: {
436
+ daily: toRanking(dailyPnl),
437
+ weekly: toRanking(weeklyPnl),
438
+ monthly: toRanking(monthlyPnl),
439
+ allTime: toRanking(allTimePnl),
440
+ },
441
+ performance: {
442
+ winRate: positions.length > 0 ? (winningPositions.length / positions.length) * 100 : 0,
443
+ winCount: winningPositions.length,
444
+ lossCount: losingPositions.length,
445
+ avgPositionSize,
446
+ avgWinAmount,
447
+ avgLossAmount,
448
+ uniqueMarkets,
449
+ },
450
+ categoryBreakdown: categoryStats,
451
+ topPositions: positions
452
+ .sort((a, b) => Math.abs(b.cashPnl ?? 0) - Math.abs(a.cashPnl ?? 0))
453
+ .slice(0, 10)
454
+ .map(p => ({
455
+ market: p.title,
456
+ slug: p.slug,
457
+ outcome: p.outcome,
458
+ size: p.size,
459
+ avgPrice: p.avgPrice,
460
+ currentPrice: p.curPrice,
461
+ pnl: p.cashPnl ?? 0,
462
+ percentPnl: p.percentPnl,
463
+ })),
464
+ recentTrades: recentTrades.map(t => ({
465
+ timestamp: t.timestamp,
466
+ side: t.side,
467
+ size: t.size,
468
+ price: t.price,
469
+ usdcSize: t.usdcSize,
470
+ // Include market info for display
471
+ title: t.title,
472
+ slug: t.slug,
473
+ outcome: t.outcome,
474
+ conditionId: t.conditionId,
475
+ })),
476
+ activitySummary: {
477
+ totalBuys: activitySummary.summary.totalBuys,
478
+ totalSells: activitySummary.summary.totalSells,
479
+ buyVolume: activitySummary.summary.buyVolume,
480
+ sellVolume: activitySummary.summary.sellVolume,
481
+ activeMarketsCount: activitySummary.summary.activeMarkets.length,
482
+ },
483
+ };
484
+ }
485
+ /**
486
+ * Analyze position categories based on title keywords
487
+ */
488
+ analyzeCategories(positions) {
489
+ const categoryStats = {};
490
+ for (const pos of positions) {
491
+ const title = (pos.title || '').toLowerCase();
492
+ let category = 'other';
493
+ if (title.includes('trump') || title.includes('biden') || title.includes('election') || title.includes('president') || title.includes('congress')) {
494
+ category = 'politics';
495
+ }
496
+ else if (title.includes('bitcoin') || title.includes('btc') || title.includes('eth') || title.includes('crypto') || title.includes('solana')) {
497
+ category = 'crypto';
498
+ }
499
+ else if (title.includes('nba') || title.includes('nfl') || title.includes('soccer') || title.includes('football') || title.includes('ufc') || title.includes('mlb')) {
500
+ category = 'sports';
501
+ }
502
+ else if (title.includes('fed') || title.includes('inflation') || title.includes('gdp') || title.includes('interest rate') || title.includes('unemployment')) {
503
+ category = 'economy';
504
+ }
505
+ else if (title.includes('ai') || title.includes('openai') || title.includes('google') || title.includes('apple') || title.includes('tesla')) {
506
+ category = 'tech';
507
+ }
508
+ if (!categoryStats[category]) {
509
+ categoryStats[category] = { count: 0, totalPnl: 0 };
510
+ }
511
+ categoryStats[category].count++;
512
+ categoryStats[category].totalPnl += (pos.cashPnl ?? 0);
513
+ }
514
+ return Object.entries(categoryStats)
515
+ .map(([category, stats]) => ({
516
+ category,
517
+ positionCount: stats.count,
518
+ totalPnl: stats.totalPnl,
519
+ }))
520
+ .sort((a, b) => b.positionCount - a.positionCount);
521
+ }
522
+ // ============================================================================
523
+ // Wallet Comparison - 钱包对比
524
+ // ============================================================================
525
+ /**
526
+ * Compare multiple wallets
527
+ *
528
+ * @example
529
+ * ```typescript
530
+ * const comparison = await sdk.smartMoney.compareWallets(
531
+ * ['0x111...', '0x222...', '0x333...'],
532
+ * { period: 'week' }
533
+ * );
534
+ * ```
535
+ */
536
+ async compareWallets(addresses, options = {}) {
537
+ const period = options.period ?? 'week';
538
+ // Fetch data for all wallets in parallel
539
+ const results = await Promise.all(addresses.map(async (address) => {
540
+ const [periodPnl, positions] = await Promise.all([
541
+ this.walletService.getUserPeriodPnl(address, period).catch(() => null),
542
+ this.walletService.getWalletPositions(address).catch(() => []),
543
+ ]);
544
+ const winningPositions = positions.filter(p => (p.cashPnl ?? 0) > 0);
545
+ const winRate = positions.length > 0
546
+ ? (winningPositions.length / positions.length) * 100
547
+ : 0;
548
+ return {
549
+ address,
550
+ userName: periodPnl?.userName,
551
+ rank: periodPnl?.rank ?? null,
552
+ pnl: periodPnl?.pnl ?? 0,
553
+ volume: periodPnl?.volume ?? 0,
554
+ positionCount: positions.length,
555
+ winRate,
556
+ };
557
+ }));
558
+ // Sort by PnL descending
559
+ results.sort((a, b) => b.pnl - a.pnl);
560
+ return {
561
+ period,
562
+ generatedAt: new Date(),
563
+ wallets: results,
564
+ };
565
+ }
566
+ // ============================================================================
567
+ // Utilities
568
+ // ============================================================================
569
+ isCacheValid() {
570
+ return Date.now() - this.cacheTimestamp < this.config.cacheTtl && this.smartMoneyCache.size > 0;
571
+ }
572
+ disconnect() {
573
+ if (this.activeSubscription) {
574
+ this.activeSubscription.unsubscribe();
575
+ this.activeSubscription = null;
576
+ }
577
+ this.tradeHandlers.clear();
578
+ this.smartMoneyCache.clear();
579
+ this.smartMoneySet.clear();
580
+ }
581
+ }
582
+ //# sourceMappingURL=smart-money-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-money-service.js","sourceRoot":"","sources":["../../../src/services/smart-money-service.ts"],"names":[],"mappings":"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"}