@catalyst-team/poly-sdk 0.4.0 → 0.4.5

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 (288) hide show
  1. package/README.md +8 -1
  2. package/README.zh-CN.md +2 -0
  3. package/dist/src/__tests__/integration/data-api.integration.test.js +21 -18
  4. package/dist/src/__tests__/integration/data-api.integration.test.js.map +1 -1
  5. package/dist/src/catalyst/catalyst-query-service.d.ts +109 -0
  6. package/dist/src/catalyst/catalyst-query-service.d.ts.map +1 -0
  7. package/dist/src/catalyst/catalyst-query-service.js +141 -0
  8. package/dist/src/catalyst/catalyst-query-service.js.map +1 -0
  9. package/dist/src/catalyst/catalyst-realtime-service.d.ts +40 -0
  10. package/dist/src/catalyst/catalyst-realtime-service.d.ts.map +1 -0
  11. package/dist/src/catalyst/catalyst-realtime-service.js +125 -0
  12. package/dist/src/catalyst/catalyst-realtime-service.js.map +1 -0
  13. package/dist/src/catalyst/index.d.ts +4 -0
  14. package/dist/src/catalyst/index.d.ts.map +1 -0
  15. package/dist/src/catalyst/index.js +4 -0
  16. package/dist/src/catalyst/index.js.map +1 -0
  17. package/dist/src/catalyst/types.d.ts +178 -0
  18. package/dist/src/catalyst/types.d.ts.map +1 -0
  19. package/dist/src/catalyst/types.js +2 -0
  20. package/dist/src/catalyst/types.js.map +1 -0
  21. package/dist/src/clients/data-api.d.ts +75 -14
  22. package/dist/src/clients/data-api.d.ts.map +1 -1
  23. package/dist/src/clients/data-api.js +40 -18
  24. package/dist/src/clients/data-api.js.map +1 -1
  25. package/dist/src/clients/gamma-api.d.ts +54 -0
  26. package/dist/src/clients/gamma-api.d.ts.map +1 -1
  27. package/dist/src/clients/gamma-api.js.map +1 -1
  28. package/dist/src/core/order-status.d.ts +159 -0
  29. package/dist/src/core/order-status.d.ts.map +1 -0
  30. package/dist/src/core/order-status.js +254 -0
  31. package/dist/src/core/order-status.js.map +1 -0
  32. package/dist/src/core/types.d.ts +124 -0
  33. package/dist/src/core/types.d.ts.map +1 -1
  34. package/dist/src/core/types.js +120 -0
  35. package/dist/src/core/types.js.map +1 -1
  36. package/dist/src/index.d.ts +20 -4
  37. package/dist/src/index.d.ts.map +1 -1
  38. package/dist/src/index.js +28 -2
  39. package/dist/src/index.js.map +1 -1
  40. package/dist/src/insider-scan/index.d.ts +3 -0
  41. package/dist/src/insider-scan/index.d.ts.map +1 -0
  42. package/dist/src/insider-scan/index.js +3 -0
  43. package/dist/src/insider-scan/index.js.map +1 -0
  44. package/dist/src/insider-scan/insider-scan-service.d.ts +63 -0
  45. package/dist/src/insider-scan/insider-scan-service.d.ts.map +1 -0
  46. package/dist/src/insider-scan/insider-scan-service.js +153 -0
  47. package/dist/src/insider-scan/insider-scan-service.js.map +1 -0
  48. package/dist/src/insider-scan/types.d.ts +205 -0
  49. package/dist/src/insider-scan/types.d.ts.map +1 -0
  50. package/dist/src/insider-scan/types.js +7 -0
  51. package/dist/src/insider-scan/types.js.map +1 -0
  52. package/dist/src/services/ctf-detector.d.ts +215 -0
  53. package/dist/src/services/ctf-detector.d.ts.map +1 -0
  54. package/dist/src/services/ctf-detector.js +420 -0
  55. package/dist/src/services/ctf-detector.js.map +1 -0
  56. package/dist/src/services/ctf-manager.d.ts +202 -0
  57. package/dist/src/services/ctf-manager.d.ts.map +1 -0
  58. package/dist/src/services/ctf-manager.js +542 -0
  59. package/dist/src/services/ctf-manager.js.map +1 -0
  60. package/dist/src/services/market-service.d.ts +61 -0
  61. package/dist/src/services/market-service.d.ts.map +1 -1
  62. package/dist/src/services/market-service.js +58 -0
  63. package/dist/src/services/market-service.js.map +1 -1
  64. package/dist/src/services/onchain-service.d.ts +10 -2
  65. package/dist/src/services/onchain-service.d.ts.map +1 -1
  66. package/dist/src/services/onchain-service.js +8 -0
  67. package/dist/src/services/onchain-service.js.map +1 -1
  68. package/dist/src/services/order-manager.d.ts +281 -0
  69. package/dist/src/services/order-manager.d.ts.map +1 -0
  70. package/dist/src/services/order-manager.js +641 -0
  71. package/dist/src/services/order-manager.js.map +1 -0
  72. package/dist/src/services/order-manager.test.d.ts +8 -0
  73. package/dist/src/services/order-manager.test.d.ts.map +1 -0
  74. package/dist/src/services/order-manager.test.js +477 -0
  75. package/dist/src/services/order-manager.test.js.map +1 -0
  76. package/dist/src/services/smart-money-service.d.ts +420 -3
  77. package/dist/src/services/smart-money-service.d.ts.map +1 -1
  78. package/dist/src/services/smart-money-service.js +869 -3
  79. package/dist/src/services/smart-money-service.js.map +1 -1
  80. package/dist/src/services/trading-service.d.ts +94 -1
  81. package/dist/src/services/trading-service.d.ts.map +1 -1
  82. package/dist/src/services/trading-service.js +232 -1
  83. package/dist/src/services/trading-service.js.map +1 -1
  84. package/dist/src/services/wallet-service.d.ts +38 -2
  85. package/dist/src/services/wallet-service.d.ts.map +1 -1
  86. package/dist/src/services/wallet-service.js +72 -5
  87. package/dist/src/services/wallet-service.js.map +1 -1
  88. package/dist/src/signal/index.d.ts +8 -0
  89. package/dist/src/signal/index.d.ts.map +1 -0
  90. package/dist/src/signal/index.js +7 -0
  91. package/dist/src/signal/index.js.map +1 -0
  92. package/dist/src/signal/signal-service.d.ts +89 -0
  93. package/dist/src/signal/signal-service.d.ts.map +1 -0
  94. package/dist/src/signal/signal-service.js +226 -0
  95. package/dist/src/signal/signal-service.js.map +1 -0
  96. package/dist/src/signal/types.d.ts +280 -0
  97. package/dist/src/signal/types.d.ts.map +1 -0
  98. package/dist/src/signal/types.js +7 -0
  99. package/dist/src/signal/types.js.map +1 -0
  100. package/dist/src/wallet-report/index.d.ts +3 -0
  101. package/dist/src/wallet-report/index.d.ts.map +1 -0
  102. package/dist/src/wallet-report/index.js +3 -0
  103. package/dist/src/wallet-report/index.js.map +1 -0
  104. package/dist/src/wallet-report/types.d.ts +187 -0
  105. package/dist/src/wallet-report/types.d.ts.map +1 -0
  106. package/dist/src/wallet-report/types.js +7 -0
  107. package/dist/src/wallet-report/types.js.map +1 -0
  108. package/dist/src/wallet-report/wallet-report-service.d.ts +91 -0
  109. package/dist/src/wallet-report/wallet-report-service.d.ts.map +1 -0
  110. package/dist/src/wallet-report/wallet-report-service.js +208 -0
  111. package/dist/src/wallet-report/wallet-report-service.js.map +1 -0
  112. package/dist/src/wallets/hot-wallet-service.d.ts +162 -0
  113. package/dist/src/wallets/hot-wallet-service.d.ts.map +1 -0
  114. package/dist/src/wallets/hot-wallet-service.js +251 -0
  115. package/dist/src/wallets/hot-wallet-service.js.map +1 -0
  116. package/dist/src/wallets/index.d.ts +15 -0
  117. package/dist/src/wallets/index.d.ts.map +1 -0
  118. package/dist/src/wallets/index.js +26 -0
  119. package/dist/src/wallets/index.js.map +1 -0
  120. package/package.json +5 -5
  121. package/dist/__tests__/clob-api.test.d.ts +0 -5
  122. package/dist/__tests__/clob-api.test.d.ts.map +0 -1
  123. package/dist/__tests__/clob-api.test.js +0 -240
  124. package/dist/__tests__/clob-api.test.js.map +0 -1
  125. package/dist/__tests__/integration/arbitrage-service.integration.test.d.ts +0 -12
  126. package/dist/__tests__/integration/arbitrage-service.integration.test.d.ts.map +0 -1
  127. package/dist/__tests__/integration/arbitrage-service.integration.test.js +0 -267
  128. package/dist/__tests__/integration/arbitrage-service.integration.test.js.map +0 -1
  129. package/dist/__tests__/integration/bridge-client.integration.test.d.ts +0 -11
  130. package/dist/__tests__/integration/bridge-client.integration.test.d.ts.map +0 -1
  131. package/dist/__tests__/integration/bridge-client.integration.test.js +0 -260
  132. package/dist/__tests__/integration/bridge-client.integration.test.js.map +0 -1
  133. package/dist/__tests__/integration/clob-api.integration.test.d.ts +0 -13
  134. package/dist/__tests__/integration/clob-api.integration.test.d.ts.map +0 -1
  135. package/dist/__tests__/integration/clob-api.integration.test.js +0 -170
  136. package/dist/__tests__/integration/clob-api.integration.test.js.map +0 -1
  137. package/dist/__tests__/integration/ctf-client.integration.test.d.ts +0 -17
  138. package/dist/__tests__/integration/ctf-client.integration.test.d.ts.map +0 -1
  139. package/dist/__tests__/integration/ctf-client.integration.test.js +0 -234
  140. package/dist/__tests__/integration/ctf-client.integration.test.js.map +0 -1
  141. package/dist/__tests__/integration/data-api.integration.test.d.ts +0 -9
  142. package/dist/__tests__/integration/data-api.integration.test.d.ts.map +0 -1
  143. package/dist/__tests__/integration/data-api.integration.test.js +0 -164
  144. package/dist/__tests__/integration/data-api.integration.test.js.map +0 -1
  145. package/dist/__tests__/integration/gamma-api.integration.test.d.ts +0 -9
  146. package/dist/__tests__/integration/gamma-api.integration.test.d.ts.map +0 -1
  147. package/dist/__tests__/integration/gamma-api.integration.test.js +0 -170
  148. package/dist/__tests__/integration/gamma-api.integration.test.js.map +0 -1
  149. package/dist/__tests__/integration/market-service.integration.test.d.ts +0 -10
  150. package/dist/__tests__/integration/market-service.integration.test.d.ts.map +0 -1
  151. package/dist/__tests__/integration/market-service.integration.test.js +0 -173
  152. package/dist/__tests__/integration/market-service.integration.test.js.map +0 -1
  153. package/dist/__tests__/integration/realtime-service-v2.integration.test.d.ts +0 -10
  154. package/dist/__tests__/integration/realtime-service-v2.integration.test.d.ts.map +0 -1
  155. package/dist/__tests__/integration/realtime-service-v2.integration.test.js +0 -307
  156. package/dist/__tests__/integration/realtime-service-v2.integration.test.js.map +0 -1
  157. package/dist/__tests__/integration/trading-service.integration.test.d.ts +0 -10
  158. package/dist/__tests__/integration/trading-service.integration.test.d.ts.map +0 -1
  159. package/dist/__tests__/integration/trading-service.integration.test.js +0 -58
  160. package/dist/__tests__/integration/trading-service.integration.test.js.map +0 -1
  161. package/dist/__tests__/test-utils.d.ts +0 -92
  162. package/dist/__tests__/test-utils.d.ts.map +0 -1
  163. package/dist/__tests__/test-utils.js +0 -143
  164. package/dist/__tests__/test-utils.js.map +0 -1
  165. package/dist/clients/bridge-client.d.ts +0 -388
  166. package/dist/clients/bridge-client.d.ts.map +0 -1
  167. package/dist/clients/bridge-client.js +0 -587
  168. package/dist/clients/bridge-client.js.map +0 -1
  169. package/dist/clients/clob-api.d.ts +0 -391
  170. package/dist/clients/clob-api.d.ts.map +0 -1
  171. package/dist/clients/clob-api.js +0 -448
  172. package/dist/clients/clob-api.js.map +0 -1
  173. package/dist/clients/ctf-client.d.ts +0 -475
  174. package/dist/clients/ctf-client.d.ts.map +0 -1
  175. package/dist/clients/ctf-client.js +0 -915
  176. package/dist/clients/ctf-client.js.map +0 -1
  177. package/dist/clients/data-api.d.ts +0 -452
  178. package/dist/clients/data-api.d.ts.map +0 -1
  179. package/dist/clients/data-api.js +0 -637
  180. package/dist/clients/data-api.js.map +0 -1
  181. package/dist/clients/gamma-api.d.ts +0 -406
  182. package/dist/clients/gamma-api.d.ts.map +0 -1
  183. package/dist/clients/gamma-api.js +0 -354
  184. package/dist/clients/gamma-api.js.map +0 -1
  185. package/dist/clients/subgraph.d.ts +0 -196
  186. package/dist/clients/subgraph.d.ts.map +0 -1
  187. package/dist/clients/subgraph.js +0 -332
  188. package/dist/clients/subgraph.js.map +0 -1
  189. package/dist/clients/trading-client.d.ts +0 -252
  190. package/dist/clients/trading-client.d.ts.map +0 -1
  191. package/dist/clients/trading-client.js +0 -543
  192. package/dist/clients/trading-client.js.map +0 -1
  193. package/dist/clients/websocket-manager.d.ts +0 -103
  194. package/dist/clients/websocket-manager.d.ts.map +0 -1
  195. package/dist/clients/websocket-manager.js +0 -200
  196. package/dist/clients/websocket-manager.js.map +0 -1
  197. package/dist/core/cache-adapter-bridge.d.ts +0 -36
  198. package/dist/core/cache-adapter-bridge.d.ts.map +0 -1
  199. package/dist/core/cache-adapter-bridge.js +0 -81
  200. package/dist/core/cache-adapter-bridge.js.map +0 -1
  201. package/dist/core/cache.d.ts +0 -43
  202. package/dist/core/cache.d.ts.map +0 -1
  203. package/dist/core/cache.js +0 -76
  204. package/dist/core/cache.js.map +0 -1
  205. package/dist/core/errors.d.ts +0 -39
  206. package/dist/core/errors.d.ts.map +0 -1
  207. package/dist/core/errors.js +0 -86
  208. package/dist/core/errors.js.map +0 -1
  209. package/dist/core/rate-limiter.d.ts +0 -33
  210. package/dist/core/rate-limiter.d.ts.map +0 -1
  211. package/dist/core/rate-limiter.js +0 -82
  212. package/dist/core/rate-limiter.js.map +0 -1
  213. package/dist/core/types.d.ts +0 -506
  214. package/dist/core/types.d.ts.map +0 -1
  215. package/dist/core/types.js +0 -49
  216. package/dist/core/types.js.map +0 -1
  217. package/dist/core/types.test.d.ts +0 -7
  218. package/dist/core/types.test.d.ts.map +0 -1
  219. package/dist/core/types.test.js +0 -122
  220. package/dist/core/types.test.js.map +0 -1
  221. package/dist/core/unified-cache.d.ts +0 -63
  222. package/dist/core/unified-cache.d.ts.map +0 -1
  223. package/dist/core/unified-cache.js +0 -114
  224. package/dist/core/unified-cache.js.map +0 -1
  225. package/dist/index.d.ts +0 -159
  226. package/dist/index.d.ts.map +0 -1
  227. package/dist/index.js +0 -262
  228. package/dist/index.js.map +0 -1
  229. package/dist/services/arbitrage-service.d.ts +0 -409
  230. package/dist/services/arbitrage-service.d.ts.map +0 -1
  231. package/dist/services/arbitrage-service.js +0 -1450
  232. package/dist/services/arbitrage-service.js.map +0 -1
  233. package/dist/services/authorization-service.d.ts +0 -97
  234. package/dist/services/authorization-service.d.ts.map +0 -1
  235. package/dist/services/authorization-service.js +0 -279
  236. package/dist/services/authorization-service.js.map +0 -1
  237. package/dist/services/binance-service.d.ts +0 -154
  238. package/dist/services/binance-service.d.ts.map +0 -1
  239. package/dist/services/binance-service.js +0 -266
  240. package/dist/services/binance-service.js.map +0 -1
  241. package/dist/services/dip-arb-service.d.ts +0 -209
  242. package/dist/services/dip-arb-service.d.ts.map +0 -1
  243. package/dist/services/dip-arb-service.js +0 -1602
  244. package/dist/services/dip-arb-service.js.map +0 -1
  245. package/dist/services/dip-arb-types.d.ts +0 -553
  246. package/dist/services/dip-arb-types.d.ts.map +0 -1
  247. package/dist/services/dip-arb-types.js +0 -164
  248. package/dist/services/dip-arb-types.js.map +0 -1
  249. package/dist/services/market-service.d.ts +0 -367
  250. package/dist/services/market-service.d.ts.map +0 -1
  251. package/dist/services/market-service.js +0 -1187
  252. package/dist/services/market-service.js.map +0 -1
  253. package/dist/services/onchain-service.d.ts +0 -309
  254. package/dist/services/onchain-service.d.ts.map +0 -1
  255. package/dist/services/onchain-service.js +0 -417
  256. package/dist/services/onchain-service.js.map +0 -1
  257. package/dist/services/realtime-service-v2.d.ts +0 -362
  258. package/dist/services/realtime-service-v2.d.ts.map +0 -1
  259. package/dist/services/realtime-service-v2.js +0 -858
  260. package/dist/services/realtime-service-v2.js.map +0 -1
  261. package/dist/services/realtime-service.d.ts +0 -82
  262. package/dist/services/realtime-service.d.ts.map +0 -1
  263. package/dist/services/realtime-service.js +0 -182
  264. package/dist/services/realtime-service.js.map +0 -1
  265. package/dist/services/smart-money-service.d.ts +0 -352
  266. package/dist/services/smart-money-service.d.ts.map +0 -1
  267. package/dist/services/smart-money-service.js +0 -582
  268. package/dist/services/smart-money-service.js.map +0 -1
  269. package/dist/services/swap-service.d.ts +0 -217
  270. package/dist/services/swap-service.d.ts.map +0 -1
  271. package/dist/services/swap-service.js +0 -695
  272. package/dist/services/swap-service.js.map +0 -1
  273. package/dist/services/trading-service.d.ts +0 -177
  274. package/dist/services/trading-service.d.ts.map +0 -1
  275. package/dist/services/trading-service.js +0 -422
  276. package/dist/services/trading-service.js.map +0 -1
  277. package/dist/services/wallet-service.d.ts +0 -316
  278. package/dist/services/wallet-service.d.ts.map +0 -1
  279. package/dist/services/wallet-service.js +0 -681
  280. package/dist/services/wallet-service.js.map +0 -1
  281. package/dist/utils/price-utils.d.ts +0 -153
  282. package/dist/utils/price-utils.d.ts.map +0 -1
  283. package/dist/utils/price-utils.js +0 -236
  284. package/dist/utils/price-utils.js.map +0 -1
  285. package/dist/utils/price-utils.test.d.ts +0 -5
  286. package/dist/utils/price-utils.test.d.ts.map +0 -1
  287. package/dist/utils/price-utils.test.js +0 -192
  288. package/dist/utils/price-utils.test.js.map +0 -1
@@ -0,0 +1,251 @@
1
+ /**
2
+ * HotWalletService - 自管 Hot Wallet 服务
3
+ *
4
+ * 为每个用户创建专用的 hot wallet,私钥加密存储在服务端。
5
+ * 策略引擎可以完全自动执行所有链上操作。
6
+ *
7
+ * 安全措施:
8
+ * 1. 私钥使用 AES-256-GCM 加密存储
9
+ * 2. 加密密钥从环境变量读取(生产环境应使用 KMS)
10
+ * 3. 私钥解密后仅在内存中短暂存在
11
+ * 4. 操作完成后立即清除内存中的私钥
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const hotWalletService = new HotWalletService({
16
+ * encryptionKey: process.env.WALLET_ENCRYPTION_KEY!,
17
+ * store: new UserStore(), // 实现 IWalletStore 接口
18
+ * });
19
+ *
20
+ * // 创建新钱包
21
+ * const { address, encryptedKey } = await hotWalletService.createWallet();
22
+ *
23
+ * // 执行操作
24
+ * await hotWalletService.executeWithWallet(userId, async (wallet) => {
25
+ * await wallet.sendTransaction({ to: '0x...', data: '0x...' });
26
+ * });
27
+ * ```
28
+ */
29
+ import { ethers } from 'ethers';
30
+ import * as crypto from 'crypto';
31
+ // ===== HotWalletService =====
32
+ export class HotWalletService {
33
+ config;
34
+ provider;
35
+ constructor(config) {
36
+ // Validate encryption key
37
+ if (!config.encryptionKey || config.encryptionKey.length !== 64) {
38
+ throw new Error('Invalid encryption key. Must be a 32-byte hex string (64 characters).');
39
+ }
40
+ this.config = {
41
+ rpcUrl: 'https://polygon-rpc.com',
42
+ chainId: 137,
43
+ ...config,
44
+ };
45
+ this.provider = new ethers.providers.JsonRpcProvider(this.config.rpcUrl, this.config.chainId);
46
+ }
47
+ // ===== Wallet Management =====
48
+ /**
49
+ * 创建新的 Hot Wallet
50
+ *
51
+ * @returns 钱包地址和加密后的私钥
52
+ */
53
+ async createWallet() {
54
+ // 生成新钱包
55
+ const wallet = ethers.Wallet.createRandom();
56
+ // 加密私钥
57
+ const encryptedKey = this.encryptPrivateKey(wallet.privateKey);
58
+ return {
59
+ address: wallet.address,
60
+ encryptedKey: JSON.stringify(encryptedKey),
61
+ };
62
+ }
63
+ /**
64
+ * 为用户创建并存储钱包
65
+ *
66
+ * @param userId - 用户 ID
67
+ * @returns 钱包地址
68
+ */
69
+ async createWalletForUser(userId) {
70
+ // 检查是否已有钱包
71
+ if (await this.config.store.hasWallet(userId)) {
72
+ const existingAddress = await this.config.store.getWalletAddress(userId);
73
+ if (existingAddress) {
74
+ return existingAddress;
75
+ }
76
+ }
77
+ // 创建新钱包
78
+ const { address, encryptedKey } = await this.createWallet();
79
+ // 存储
80
+ await this.config.store.setEncryptedKey(userId, encryptedKey, address);
81
+ return address;
82
+ }
83
+ /**
84
+ * 获取用户的钱包地址
85
+ *
86
+ * @param userId - 用户 ID
87
+ * @returns 钱包地址,如果没有则返回 null
88
+ */
89
+ async getWalletAddress(userId) {
90
+ return this.config.store.getWalletAddress(userId);
91
+ }
92
+ /**
93
+ * 检查用户是否有钱包
94
+ *
95
+ * @param userId - 用户 ID
96
+ */
97
+ async hasWallet(userId) {
98
+ return this.config.store.hasWallet(userId);
99
+ }
100
+ // ===== Wallet Operations =====
101
+ /**
102
+ * 使用用户钱包执行操作
103
+ *
104
+ * 私钥仅在回调执行期间存在于内存中,执行完毕后立即清除。
105
+ *
106
+ * @param userId - 用户 ID
107
+ * @param callback - 使用钱包执行的操作
108
+ * @returns 回调的返回值
109
+ */
110
+ async executeWithWallet(userId, callback) {
111
+ // 获取加密私钥
112
+ const encryptedKey = await this.config.store.getEncryptedKey(userId);
113
+ if (!encryptedKey) {
114
+ throw new Error(`No wallet found for user: ${userId}`);
115
+ }
116
+ // 解密私钥
117
+ let privateKey = null;
118
+ let wallet = null;
119
+ try {
120
+ const encrypted = JSON.parse(encryptedKey);
121
+ privateKey = this.decryptPrivateKey(encrypted);
122
+ // 创建钱包实例
123
+ wallet = new ethers.Wallet(privateKey, this.provider);
124
+ // 执行回调
125
+ return await callback(wallet);
126
+ }
127
+ finally {
128
+ // 清除内存中的敏感数据
129
+ if (privateKey) {
130
+ // 覆盖字符串内存(JavaScript 中的最佳努力)
131
+ privateKey = '0'.repeat(privateKey.length);
132
+ }
133
+ privateKey = null;
134
+ wallet = null;
135
+ }
136
+ }
137
+ /**
138
+ * 获取用户钱包的私钥(危险操作,仅用于初始化 SDK)
139
+ *
140
+ * 调用者必须负责安全处理私钥!
141
+ *
142
+ * @param userId - 用户 ID
143
+ * @returns 私钥
144
+ */
145
+ async getPrivateKey(userId) {
146
+ const encryptedKey = await this.config.store.getEncryptedKey(userId);
147
+ if (!encryptedKey) {
148
+ throw new Error(`No wallet found for user: ${userId}`);
149
+ }
150
+ const encrypted = JSON.parse(encryptedKey);
151
+ return this.decryptPrivateKey(encrypted);
152
+ }
153
+ // ===== Convenience Methods =====
154
+ /**
155
+ * 获取用户钱包余额
156
+ *
157
+ * @param userId - 用户 ID
158
+ */
159
+ async getBalance(userId) {
160
+ const address = await this.config.store.getWalletAddress(userId);
161
+ if (!address) {
162
+ throw new Error(`No wallet found for user: ${userId}`);
163
+ }
164
+ const balance = await this.provider.getBalance(address);
165
+ return {
166
+ matic: ethers.utils.formatEther(balance),
167
+ maticWei: balance.toString(),
168
+ };
169
+ }
170
+ /**
171
+ * 发送交易
172
+ *
173
+ * @param userId - 用户 ID
174
+ * @param tx - 交易参数
175
+ */
176
+ async sendTransaction(userId, tx) {
177
+ return this.executeWithWallet(userId, async (wallet) => {
178
+ return wallet.sendTransaction(tx);
179
+ });
180
+ }
181
+ /**
182
+ * 签名消息
183
+ *
184
+ * @param userId - 用户 ID
185
+ * @param message - 消息
186
+ */
187
+ async signMessage(userId, message) {
188
+ return this.executeWithWallet(userId, async (wallet) => {
189
+ return wallet.signMessage(message);
190
+ });
191
+ }
192
+ /**
193
+ * 签名 EIP-712 类型数据
194
+ *
195
+ * @param userId - 用户 ID
196
+ * @param domain - EIP-712 domain
197
+ * @param types - EIP-712 types
198
+ * @param value - 要签名的数据
199
+ */
200
+ async signTypedData(userId, domain, types, value) {
201
+ return this.executeWithWallet(userId, async (wallet) => {
202
+ return wallet._signTypedData(domain, types, value);
203
+ });
204
+ }
205
+ // ===== Encryption/Decryption =====
206
+ /**
207
+ * 加密私钥
208
+ */
209
+ encryptPrivateKey(privateKey) {
210
+ const key = Buffer.from(this.config.encryptionKey, 'hex');
211
+ const iv = crypto.randomBytes(16);
212
+ const cipher = crypto.createCipheriv('aes-256-gcm', key, iv);
213
+ let encrypted = cipher.update(privateKey, 'utf8', 'hex');
214
+ encrypted += cipher.final('hex');
215
+ const authTag = cipher.getAuthTag();
216
+ return {
217
+ iv: iv.toString('hex'),
218
+ authTag: authTag.toString('hex'),
219
+ data: encrypted,
220
+ };
221
+ }
222
+ /**
223
+ * 解密私钥
224
+ */
225
+ decryptPrivateKey(encrypted) {
226
+ const key = Buffer.from(this.config.encryptionKey, 'hex');
227
+ const iv = Buffer.from(encrypted.iv, 'hex');
228
+ const authTag = Buffer.from(encrypted.authTag, 'hex');
229
+ const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv);
230
+ decipher.setAuthTag(authTag);
231
+ let decrypted = decipher.update(encrypted.data, 'hex', 'utf8');
232
+ decrypted += decipher.final('utf8');
233
+ return decrypted;
234
+ }
235
+ // ===== Static Helpers =====
236
+ /**
237
+ * 生成加密密钥
238
+ *
239
+ * 用于首次设置时生成 WALLET_ENCRYPTION_KEY
240
+ */
241
+ static generateEncryptionKey() {
242
+ return crypto.randomBytes(32).toString('hex');
243
+ }
244
+ /**
245
+ * 验证加密密钥格式
246
+ */
247
+ static validateEncryptionKey(key) {
248
+ return /^[a-f0-9]{64}$/i.test(key);
249
+ }
250
+ }
251
+ //# sourceMappingURL=hot-wallet-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hot-wallet-service.js","sourceRoot":"","sources":["../../../src/wallets/hot-wallet-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Wallet Management Module
3
+ *
4
+ * Provides different wallet strategies for automated trading:
5
+ *
6
+ * 1. HotWalletService - Self-managed hot wallets with encrypted private keys
7
+ * - Best for: Full automation, strategy execution
8
+ * - Security: AES-256-GCM encryption, we manage keys
9
+ *
10
+ * 2. PrivyWallet - Privy Delegated Actions (future implementation)
11
+ * - Best for: When users prefer Privy key custody
12
+ * - Security: Privy manages keys with TEE + key sharding
13
+ */
14
+ export { HotWalletService, type HotWalletServiceConfig, type IWalletStore, type WalletInfo, type EncryptedData, } from './hot-wallet-service.js';
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/wallets/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,gBAAgB,EAChB,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,aAAa,GACnB,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Wallet Management Module
3
+ *
4
+ * Provides different wallet strategies for automated trading:
5
+ *
6
+ * 1. HotWalletService - Self-managed hot wallets with encrypted private keys
7
+ * - Best for: Full automation, strategy execution
8
+ * - Security: AES-256-GCM encryption, we manage keys
9
+ *
10
+ * 2. PrivyWallet - Privy Delegated Actions (future implementation)
11
+ * - Best for: When users prefer Privy key custody
12
+ * - Security: Privy manages keys with TEE + key sharding
13
+ */
14
+ export { HotWalletService, } from './hot-wallet-service.js';
15
+ // PrivyWallet is optional - only available if @privy-io/server-auth is installed
16
+ // Temporarily disabled due to missing @privy-io/server-auth dependency
17
+ // export {
18
+ // PrivyWallet,
19
+ // type PrivyWalletConfig,
20
+ // type TransactionRequest,
21
+ // type TransactionResult,
22
+ // type SignatureResult,
23
+ // type TypedDataDomain,
24
+ // type TypedDataTypes,
25
+ // } from './privy-wallet.js';
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/wallets/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,gBAAgB,GAKjB,MAAM,yBAAyB,CAAC;AAEjC,iFAAiF;AACjF,uEAAuE;AACvE,WAAW;AACX,iBAAiB;AACjB,4BAA4B;AAC5B,6BAA6B;AAC7B,4BAA4B;AAC5B,0BAA0B;AAC1B,0BAA0B;AAC1B,yBAAyB;AACzB,8BAA8B"}
package/package.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "@catalyst-team/poly-sdk",
3
- "version": "0.4.0",
3
+ "version": "0.4.5",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "description": "TypeScript SDK for Polymarket - prediction markets trading, smart money analysis, and market data",
7
7
  "type": "module",
8
- "main": "./dist/index.js",
9
- "types": "./dist/index.d.ts",
8
+ "main": "./dist/src/index.js",
9
+ "types": "./dist/src/index.d.ts",
10
10
  "exports": {
11
11
  ".": {
12
- "types": "./dist/index.d.ts",
13
- "import": "./dist/index.js"
12
+ "types": "./dist/src/index.d.ts",
13
+ "import": "./dist/src/index.js"
14
14
  }
15
15
  },
16
16
  "keywords": [
@@ -1,5 +0,0 @@
1
- /**
2
- * CLOB API Client Unit Tests
3
- */
4
- export {};
5
- //# sourceMappingURL=clob-api.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clob-api.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/clob-api.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -1,240 +0,0 @@
1
- /**
2
- * CLOB API Client Unit Tests
3
- */
4
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
5
- import { ClobApiClient } from '../clients/clob-api.js';
6
- import { MockRateLimiter, MockCache, mockClobMarket, expectOrderbookSorted, } from './test-utils.js';
7
- describe('ClobApiClient', () => {
8
- let client;
9
- let mockFetch;
10
- beforeEach(() => {
11
- mockFetch = vi.fn();
12
- global.fetch = mockFetch;
13
- client = new ClobApiClient(new MockRateLimiter(), new MockCache());
14
- });
15
- afterEach(() => {
16
- vi.restoreAllMocks();
17
- });
18
- describe('getMarket', () => {
19
- it('should fetch and normalize market data', async () => {
20
- mockFetch.mockResolvedValueOnce({
21
- ok: true,
22
- json: async () => ({
23
- condition_id: mockClobMarket.conditionId,
24
- question: mockClobMarket.question,
25
- description: mockClobMarket.description,
26
- market_slug: mockClobMarket.marketSlug,
27
- tokens: mockClobMarket.tokens.map((t) => ({
28
- token_id: t.tokenId,
29
- outcome: t.outcome,
30
- price: t.price,
31
- })),
32
- accepting_orders: true,
33
- end_date_iso: mockClobMarket.endDateIso,
34
- active: true,
35
- closed: false,
36
- }),
37
- });
38
- const market = await client.getMarket(mockClobMarket.conditionId);
39
- expect(market.conditionId).toBe(mockClobMarket.conditionId);
40
- expect(market.question).toBe(mockClobMarket.question);
41
- expect(market.tokens).toHaveLength(2);
42
- expect(market.tokens[0].tokenId).toBe(mockClobMarket.tokens[0].tokenId);
43
- expect(market.acceptingOrders).toBe(true);
44
- });
45
- it('should throw error for non-existent market', async () => {
46
- mockFetch.mockResolvedValueOnce({
47
- ok: false,
48
- status: 404,
49
- json: async () => ({ error: 'Market not found' }),
50
- });
51
- await expect(client.getMarket('invalid-id')).rejects.toThrow();
52
- });
53
- it('should cache market data', async () => {
54
- mockFetch.mockResolvedValue({
55
- ok: true,
56
- json: async () => ({
57
- condition_id: mockClobMarket.conditionId,
58
- question: mockClobMarket.question,
59
- tokens: [],
60
- accepting_orders: true,
61
- active: true,
62
- closed: false,
63
- }),
64
- });
65
- // First call
66
- await client.getMarket(mockClobMarket.conditionId);
67
- // Second call should use cache
68
- await client.getMarket(mockClobMarket.conditionId);
69
- // Should only fetch once due to caching
70
- expect(mockFetch).toHaveBeenCalledTimes(1);
71
- });
72
- });
73
- describe('getOrderbook', () => {
74
- it('should fetch and sort orderbook correctly', async () => {
75
- // Return unsorted data to test sorting
76
- mockFetch.mockResolvedValueOnce({
77
- ok: true,
78
- json: async () => ({
79
- bids: [
80
- { price: '0.53', size: '750' },
81
- { price: '0.55', size: '1000' },
82
- { price: '0.54', size: '500' },
83
- ],
84
- asks: [
85
- { price: '0.58', size: '600' },
86
- { price: '0.57', size: '800' },
87
- { price: '0.59', size: '400' },
88
- ],
89
- }),
90
- });
91
- const orderbook = await client.getOrderbook('test-token-id');
92
- // Check bids are sorted descending
93
- expect(orderbook.bids[0].price).toBe(0.55);
94
- expect(orderbook.bids[1].price).toBe(0.54);
95
- expect(orderbook.bids[2].price).toBe(0.53);
96
- // Check asks are sorted ascending
97
- expect(orderbook.asks[0].price).toBe(0.57);
98
- expect(orderbook.asks[1].price).toBe(0.58);
99
- expect(orderbook.asks[2].price).toBe(0.59);
100
- expectOrderbookSorted(orderbook);
101
- });
102
- it('should handle empty orderbook', async () => {
103
- mockFetch.mockResolvedValueOnce({
104
- ok: true,
105
- json: async () => ({ bids: [], asks: [] }),
106
- });
107
- const orderbook = await client.getOrderbook('test-token-id');
108
- expect(orderbook.bids).toHaveLength(0);
109
- expect(orderbook.asks).toHaveLength(0);
110
- expect(orderbook.timestamp).toBeGreaterThan(0);
111
- });
112
- it('should convert string prices to numbers', async () => {
113
- mockFetch.mockResolvedValueOnce({
114
- ok: true,
115
- json: async () => ({
116
- bids: [{ price: '0.55', size: '1000.5' }],
117
- asks: [{ price: '0.57', size: '800.25' }],
118
- }),
119
- });
120
- const orderbook = await client.getOrderbook('test-token-id');
121
- expect(typeof orderbook.bids[0].price).toBe('number');
122
- expect(typeof orderbook.bids[0].size).toBe('number');
123
- expect(orderbook.bids[0].price).toBe(0.55);
124
- expect(orderbook.bids[0].size).toBe(1000.5);
125
- });
126
- });
127
- describe('getProcessedOrderbook', () => {
128
- it('should calculate effective prices correctly', async () => {
129
- // First call: getMarket
130
- mockFetch.mockResolvedValueOnce({
131
- ok: true,
132
- json: async () => ({
133
- condition_id: mockClobMarket.conditionId,
134
- tokens: [
135
- { token_id: 'yes-token', outcome: 'Yes', price: 0.55 },
136
- { token_id: 'no-token', outcome: 'No', price: 0.45 },
137
- ],
138
- accepting_orders: true,
139
- active: true,
140
- closed: false,
141
- }),
142
- });
143
- // Second call: getOrderbook for YES
144
- mockFetch.mockResolvedValueOnce({
145
- ok: true,
146
- json: async () => ({
147
- bids: [{ price: '0.55', size: '1000' }],
148
- asks: [{ price: '0.57', size: '800' }],
149
- }),
150
- });
151
- // Third call: getOrderbook for NO
152
- mockFetch.mockResolvedValueOnce({
153
- ok: true,
154
- json: async () => ({
155
- bids: [{ price: '0.43', size: '900' }],
156
- asks: [{ price: '0.45', size: '700' }],
157
- }),
158
- });
159
- const processed = await client.getProcessedOrderbook(mockClobMarket.conditionId);
160
- // Check YES orderbook
161
- expect(processed.yes.bid).toBe(0.55);
162
- expect(processed.yes.ask).toBe(0.57);
163
- // Check NO orderbook
164
- expect(processed.no.bid).toBe(0.43);
165
- expect(processed.no.ask).toBe(0.45);
166
- // Check effective prices
167
- // effectiveBuyYes = min(YES.ask, 1 - NO.bid) = min(0.57, 0.57) = 0.57
168
- expect(processed.summary.effectivePrices.effectiveBuyYes).toBeCloseTo(0.57, 6);
169
- // effectiveBuyNo = min(NO.ask, 1 - YES.bid) = min(0.45, 0.45) = 0.45
170
- expect(processed.summary.effectivePrices.effectiveBuyNo).toBeCloseTo(0.45, 6);
171
- // Long cost = effectiveBuyYes + effectiveBuyNo = 0.57 + 0.45 = 1.02
172
- expect(processed.summary.effectiveLongCost).toBeCloseTo(1.02, 2);
173
- // Long arb profit = 1 - longCost = -0.02 (no opportunity)
174
- expect(processed.summary.longArbProfit).toBeCloseTo(-0.02, 2);
175
- });
176
- it('should detect long arbitrage opportunity', async () => {
177
- mockFetch.mockResolvedValueOnce({
178
- ok: true,
179
- json: async () => ({
180
- condition_id: mockClobMarket.conditionId,
181
- tokens: [
182
- { token_id: 'yes-token', outcome: 'Yes', price: 0.50 },
183
- { token_id: 'no-token', outcome: 'No', price: 0.50 },
184
- ],
185
- accepting_orders: true,
186
- active: true,
187
- closed: false,
188
- }),
189
- });
190
- // YES orderbook with low ask
191
- mockFetch.mockResolvedValueOnce({
192
- ok: true,
193
- json: async () => ({
194
- bids: [{ price: '0.48', size: '1000' }],
195
- asks: [{ price: '0.49', size: '800' }], // Low ask
196
- }),
197
- });
198
- // NO orderbook with low ask
199
- mockFetch.mockResolvedValueOnce({
200
- ok: true,
201
- json: async () => ({
202
- bids: [{ price: '0.48', size: '900' }],
203
- asks: [{ price: '0.49', size: '700' }], // Low ask
204
- }),
205
- });
206
- const processed = await client.getProcessedOrderbook(mockClobMarket.conditionId);
207
- // Long cost = 0.49 + 0.49 = 0.98 < 1.00
208
- // Long arb profit = 1 - 0.98 = 0.02 (2% opportunity!)
209
- expect(processed.summary.longArbProfit).toBeGreaterThan(0);
210
- expect(processed.summary.longArbProfit).toBeCloseTo(0.02, 2);
211
- });
212
- it('should throw error if tokens are missing', async () => {
213
- mockFetch.mockResolvedValueOnce({
214
- ok: true,
215
- json: async () => ({
216
- condition_id: mockClobMarket.conditionId,
217
- tokens: [], // No tokens
218
- accepting_orders: true,
219
- active: true,
220
- closed: false,
221
- }),
222
- });
223
- await expect(client.getProcessedOrderbook(mockClobMarket.conditionId)).rejects.toThrow('Missing tokens');
224
- });
225
- });
226
- describe('hasTradingCapabilities', () => {
227
- it('should return false without config', () => {
228
- expect(client.hasTradingCapabilities()).toBe(false);
229
- });
230
- it('should return true with signer', () => {
231
- const clientWithSigner = new ClobApiClient(new MockRateLimiter(), new MockCache(), { signer: {} });
232
- expect(clientWithSigner.hasTradingCapabilities()).toBe(true);
233
- });
234
- it('should return true with credentials', () => {
235
- const clientWithCreds = new ClobApiClient(new MockRateLimiter(), new MockCache(), { creds: { key: 'k', secret: 's', passphrase: 'p' } });
236
- expect(clientWithCreds.hasTradingCapabilities()).toBe(true);
237
- });
238
- });
239
- });
240
- //# sourceMappingURL=clob-api.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clob-api.test.js","sourceRoot":"","sources":["../../src/__tests__/clob-api.test.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- /**
2
- * ArbitrageService Integration Tests
3
- *
4
- * Tests the ArbitrageService market scanning and opportunity detection.
5
- * These tests make REAL API calls to Polymarket.
6
- *
7
- * Note: Trading tests are skipped without a real private key.
8
- *
9
- * Run with: pnpm test:integration
10
- */
11
- export {};
12
- //# sourceMappingURL=arbitrage-service.integration.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"arbitrage-service.integration.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/integration/arbitrage-service.integration.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}