forgex-cli 1.0.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 (275) hide show
  1. package/README.md +479 -0
  2. package/dist/bin/forgex.d.ts +12 -0
  3. package/dist/bin/forgex.d.ts.map +1 -0
  4. package/dist/bin/forgex.js +23 -0
  5. package/dist/bin/forgex.js.map +1 -0
  6. package/dist/src/adapters/codex-adapter.d.ts +238 -0
  7. package/dist/src/adapters/codex-adapter.d.ts.map +1 -0
  8. package/dist/src/adapters/codex-adapter.js +524 -0
  9. package/dist/src/adapters/codex-adapter.js.map +1 -0
  10. package/dist/src/adapters/connection.d.ts +20 -0
  11. package/dist/src/adapters/connection.d.ts.map +1 -0
  12. package/dist/src/adapters/connection.js +43 -0
  13. package/dist/src/adapters/connection.js.map +1 -0
  14. package/dist/src/adapters/ipfs.d.ts +17 -0
  15. package/dist/src/adapters/ipfs.d.ts.map +1 -0
  16. package/dist/src/adapters/ipfs.js +30 -0
  17. package/dist/src/adapters/ipfs.js.map +1 -0
  18. package/dist/src/adapters/jito-adapter.d.ts +194 -0
  19. package/dist/src/adapters/jito-adapter.d.ts.map +1 -0
  20. package/dist/src/adapters/jito-adapter.js +474 -0
  21. package/dist/src/adapters/jito-adapter.js.map +1 -0
  22. package/dist/src/adapters/rpc-adapter.d.ts +148 -0
  23. package/dist/src/adapters/rpc-adapter.d.ts.map +1 -0
  24. package/dist/src/adapters/rpc-adapter.js +410 -0
  25. package/dist/src/adapters/rpc-adapter.js.map +1 -0
  26. package/dist/src/adapters/sdk-adapter.d.ts +148 -0
  27. package/dist/src/adapters/sdk-adapter.d.ts.map +1 -0
  28. package/dist/src/adapters/sdk-adapter.js +554 -0
  29. package/dist/src/adapters/sdk-adapter.js.map +1 -0
  30. package/dist/src/commands/config/index.d.ts +8 -0
  31. package/dist/src/commands/config/index.d.ts.map +1 -0
  32. package/dist/src/commands/config/index.js +91 -0
  33. package/dist/src/commands/config/index.js.map +1 -0
  34. package/dist/src/commands/query/index.d.ts +10 -0
  35. package/dist/src/commands/query/index.d.ts.map +1 -0
  36. package/dist/src/commands/query/index.js +376 -0
  37. package/dist/src/commands/query/index.js.map +1 -0
  38. package/dist/src/commands/sniper/index.d.ts +16 -0
  39. package/dist/src/commands/sniper/index.d.ts.map +1 -0
  40. package/dist/src/commands/sniper/index.js +292 -0
  41. package/dist/src/commands/sniper/index.js.map +1 -0
  42. package/dist/src/commands/token/index.d.ts +16 -0
  43. package/dist/src/commands/token/index.d.ts.map +1 -0
  44. package/dist/src/commands/token/index.js +295 -0
  45. package/dist/src/commands/token/index.js.map +1 -0
  46. package/dist/src/commands/tools/index.d.ts +17 -0
  47. package/dist/src/commands/tools/index.d.ts.map +1 -0
  48. package/dist/src/commands/tools/index.js +626 -0
  49. package/dist/src/commands/tools/index.js.map +1 -0
  50. package/dist/src/commands/trade/index.d.ts +8 -0
  51. package/dist/src/commands/trade/index.d.ts.map +1 -0
  52. package/dist/src/commands/trade/index.js +531 -0
  53. package/dist/src/commands/trade/index.js.map +1 -0
  54. package/dist/src/commands/transfer/index.d.ts +16 -0
  55. package/dist/src/commands/transfer/index.d.ts.map +1 -0
  56. package/dist/src/commands/transfer/index.js +509 -0
  57. package/dist/src/commands/transfer/index.js.map +1 -0
  58. package/dist/src/commands/wallet/index.d.ts +10 -0
  59. package/dist/src/commands/wallet/index.d.ts.map +1 -0
  60. package/dist/src/commands/wallet/index.js +828 -0
  61. package/dist/src/commands/wallet/index.js.map +1 -0
  62. package/dist/src/config.d.ts +74 -0
  63. package/dist/src/config.d.ts.map +1 -0
  64. package/dist/src/config.js +190 -0
  65. package/dist/src/config.js.map +1 -0
  66. package/dist/src/const/IDL/index.d.ts +4 -0
  67. package/dist/src/const/IDL/index.d.ts.map +1 -0
  68. package/dist/src/const/IDL/index.js +2 -0
  69. package/dist/src/const/IDL/index.js.map +1 -0
  70. package/dist/src/const/IDL/meteora-DLMM.d.ts +10249 -0
  71. package/dist/src/const/IDL/meteora-DLMM.d.ts.map +1 -0
  72. package/dist/src/const/IDL/meteora-DLMM.js +4177 -0
  73. package/dist/src/const/IDL/meteora-DLMM.js.map +1 -0
  74. package/dist/src/const/IDL/pump-fun.d.ts +4811 -0
  75. package/dist/src/const/IDL/pump-fun.d.ts.map +1 -0
  76. package/dist/src/const/IDL/pump-fun.js +2954 -0
  77. package/dist/src/const/IDL/pump-fun.js.map +1 -0
  78. package/dist/src/const/IDL/pump-swap-IDL.d.ts +3119 -0
  79. package/dist/src/const/IDL/pump-swap-IDL.d.ts.map +1 -0
  80. package/dist/src/const/IDL/pump-swap-IDL.js +2095 -0
  81. package/dist/src/const/IDL/pump-swap-IDL.js.map +1 -0
  82. package/dist/src/const/IDL/raydium-launchlab-IDL.d.ts +4031 -0
  83. package/dist/src/const/IDL/raydium-launchlab-IDL.d.ts.map +1 -0
  84. package/dist/src/const/IDL/raydium-launchlab-IDL.js +2110 -0
  85. package/dist/src/const/IDL/raydium-launchlab-IDL.js.map +1 -0
  86. package/dist/src/const/index.d.ts +40 -0
  87. package/dist/src/const/index.d.ts.map +1 -0
  88. package/dist/src/const/index.js +57 -0
  89. package/dist/src/const/index.js.map +1 -0
  90. package/dist/src/data-source.d.ts +270 -0
  91. package/dist/src/data-source.d.ts.map +1 -0
  92. package/dist/src/data-source.js +628 -0
  93. package/dist/src/data-source.js.map +1 -0
  94. package/dist/src/data-store/index.d.ts +87 -0
  95. package/dist/src/data-store/index.d.ts.map +1 -0
  96. package/dist/src/data-store/index.js +561 -0
  97. package/dist/src/data-store/index.js.map +1 -0
  98. package/dist/src/data-store/types.d.ts +91 -0
  99. package/dist/src/data-store/types.d.ts.map +1 -0
  100. package/dist/src/data-store/types.js +8 -0
  101. package/dist/src/data-store/types.js.map +1 -0
  102. package/dist/src/index.d.ts +8 -0
  103. package/dist/src/index.d.ts.map +1 -0
  104. package/dist/src/index.js +36 -0
  105. package/dist/src/index.js.map +1 -0
  106. package/dist/src/output.d.ts +52 -0
  107. package/dist/src/output.d.ts.map +1 -0
  108. package/dist/src/output.js +218 -0
  109. package/dist/src/output.js.map +1 -0
  110. package/dist/src/shims/store.d.ts +58 -0
  111. package/dist/src/shims/store.d.ts.map +1 -0
  112. package/dist/src/shims/store.js +55 -0
  113. package/dist/src/shims/store.js.map +1 -0
  114. package/dist/src/sol-sdk/account/index.d.ts +13 -0
  115. package/dist/src/sol-sdk/account/index.d.ts.map +1 -0
  116. package/dist/src/sol-sdk/account/index.js +174 -0
  117. package/dist/src/sol-sdk/account/index.js.map +1 -0
  118. package/dist/src/sol-sdk/account/lookupTable.d.ts +24 -0
  119. package/dist/src/sol-sdk/account/lookupTable.d.ts.map +1 -0
  120. package/dist/src/sol-sdk/account/lookupTable.js +103 -0
  121. package/dist/src/sol-sdk/account/lookupTable.js.map +1 -0
  122. package/dist/src/sol-sdk/batch/create.d.ts +23 -0
  123. package/dist/src/sol-sdk/batch/create.d.ts.map +1 -0
  124. package/dist/src/sol-sdk/batch/create.js +580 -0
  125. package/dist/src/sol-sdk/batch/create.js.map +1 -0
  126. package/dist/src/sol-sdk/batch/external-sniper.d.ts +31 -0
  127. package/dist/src/sol-sdk/batch/external-sniper.d.ts.map +1 -0
  128. package/dist/src/sol-sdk/batch/external-sniper.js +163 -0
  129. package/dist/src/sol-sdk/batch/external-sniper.js.map +1 -0
  130. package/dist/src/sol-sdk/batch/index.d.ts +144 -0
  131. package/dist/src/sol-sdk/batch/index.d.ts.map +1 -0
  132. package/dist/src/sol-sdk/batch/index.js +1573 -0
  133. package/dist/src/sol-sdk/batch/index.js.map +1 -0
  134. package/dist/src/sol-sdk/calc.d.ts +277 -0
  135. package/dist/src/sol-sdk/calc.d.ts.map +1 -0
  136. package/dist/src/sol-sdk/calc.js +590 -0
  137. package/dist/src/sol-sdk/calc.js.map +1 -0
  138. package/dist/src/sol-sdk/index.d.ts +1 -0
  139. package/dist/src/sol-sdk/index.d.ts.map +1 -0
  140. package/dist/src/sol-sdk/index.js +1 -0
  141. package/dist/src/sol-sdk/index.js.map +1 -0
  142. package/dist/src/sol-sdk/jito/index.d.ts +50 -0
  143. package/dist/src/sol-sdk/jito/index.d.ts.map +1 -0
  144. package/dist/src/sol-sdk/jito/index.js +225 -0
  145. package/dist/src/sol-sdk/jito/index.js.map +1 -0
  146. package/dist/src/sol-sdk/launchlab/index.d.ts +32 -0
  147. package/dist/src/sol-sdk/launchlab/index.d.ts.map +1 -0
  148. package/dist/src/sol-sdk/launchlab/index.js +78 -0
  149. package/dist/src/sol-sdk/launchlab/index.js.map +1 -0
  150. package/dist/src/sol-sdk/launchlab/instructions/buy.d.ts +27 -0
  151. package/dist/src/sol-sdk/launchlab/instructions/buy.d.ts.map +1 -0
  152. package/dist/src/sol-sdk/launchlab/instructions/buy.js +124 -0
  153. package/dist/src/sol-sdk/launchlab/instructions/buy.js.map +1 -0
  154. package/dist/src/sol-sdk/launchlab/instructions/create.d.ts +27 -0
  155. package/dist/src/sol-sdk/launchlab/instructions/create.d.ts.map +1 -0
  156. package/dist/src/sol-sdk/launchlab/instructions/create.js +125 -0
  157. package/dist/src/sol-sdk/launchlab/instructions/create.js.map +1 -0
  158. package/dist/src/sol-sdk/launchlab/instructions/sell.d.ts +15 -0
  159. package/dist/src/sol-sdk/launchlab/instructions/sell.d.ts.map +1 -0
  160. package/dist/src/sol-sdk/launchlab/instructions/sell.js +65 -0
  161. package/dist/src/sol-sdk/launchlab/instructions/sell.js.map +1 -0
  162. package/dist/src/sol-sdk/meteora/index.d.ts +32 -0
  163. package/dist/src/sol-sdk/meteora/index.d.ts.map +1 -0
  164. package/dist/src/sol-sdk/meteora/index.js +72 -0
  165. package/dist/src/sol-sdk/meteora/index.js.map +1 -0
  166. package/dist/src/sol-sdk/meteora/instructions/buy.d.ts +46 -0
  167. package/dist/src/sol-sdk/meteora/instructions/buy.d.ts.map +1 -0
  168. package/dist/src/sol-sdk/meteora/instructions/buy.js +153 -0
  169. package/dist/src/sol-sdk/meteora/instructions/buy.js.map +1 -0
  170. package/dist/src/sol-sdk/meteora/instructions/sell.d.ts +24 -0
  171. package/dist/src/sol-sdk/meteora/instructions/sell.d.ts.map +1 -0
  172. package/dist/src/sol-sdk/meteora/instructions/sell.js +98 -0
  173. package/dist/src/sol-sdk/meteora/instructions/sell.js.map +1 -0
  174. package/dist/src/sol-sdk/pump/index.d.ts +22 -0
  175. package/dist/src/sol-sdk/pump/index.d.ts.map +1 -0
  176. package/dist/src/sol-sdk/pump/index.js +101 -0
  177. package/dist/src/sol-sdk/pump/index.js.map +1 -0
  178. package/dist/src/sol-sdk/pump/instructions/buy.d.ts +29 -0
  179. package/dist/src/sol-sdk/pump/instructions/buy.d.ts.map +1 -0
  180. package/dist/src/sol-sdk/pump/instructions/buy.js +131 -0
  181. package/dist/src/sol-sdk/pump/instructions/buy.js.map +1 -0
  182. package/dist/src/sol-sdk/pump/instructions/createAndBuy.d.ts +36 -0
  183. package/dist/src/sol-sdk/pump/instructions/createAndBuy.d.ts.map +1 -0
  184. package/dist/src/sol-sdk/pump/instructions/createAndBuy.js +77 -0
  185. package/dist/src/sol-sdk/pump/instructions/createAndBuy.js.map +1 -0
  186. package/dist/src/sol-sdk/pump/instructions/sell.d.ts +7 -0
  187. package/dist/src/sol-sdk/pump/instructions/sell.d.ts.map +1 -0
  188. package/dist/src/sol-sdk/pump/instructions/sell.js +38 -0
  189. package/dist/src/sol-sdk/pump/instructions/sell.js.map +1 -0
  190. package/dist/src/sol-sdk/pumpswap/index.d.ts +9 -0
  191. package/dist/src/sol-sdk/pumpswap/index.d.ts.map +1 -0
  192. package/dist/src/sol-sdk/pumpswap/index.js +27 -0
  193. package/dist/src/sol-sdk/pumpswap/index.js.map +1 -0
  194. package/dist/src/sol-sdk/pumpswap/instructions/buy.d.ts +61 -0
  195. package/dist/src/sol-sdk/pumpswap/instructions/buy.d.ts.map +1 -0
  196. package/dist/src/sol-sdk/pumpswap/instructions/buy.js +215 -0
  197. package/dist/src/sol-sdk/pumpswap/instructions/buy.js.map +1 -0
  198. package/dist/src/sol-sdk/pumpswap/instructions/migrate.d.ts +3 -0
  199. package/dist/src/sol-sdk/pumpswap/instructions/migrate.d.ts.map +1 -0
  200. package/dist/src/sol-sdk/pumpswap/instructions/migrate.js +33 -0
  201. package/dist/src/sol-sdk/pumpswap/instructions/migrate.js.map +1 -0
  202. package/dist/src/sol-sdk/pumpswap/instructions/sell.d.ts +20 -0
  203. package/dist/src/sol-sdk/pumpswap/instructions/sell.d.ts.map +1 -0
  204. package/dist/src/sol-sdk/pumpswap/instructions/sell.js +107 -0
  205. package/dist/src/sol-sdk/pumpswap/instructions/sell.js.map +1 -0
  206. package/dist/src/sol-sdk/pumpswap/rpc/index.d.ts +28 -0
  207. package/dist/src/sol-sdk/pumpswap/rpc/index.d.ts.map +1 -0
  208. package/dist/src/sol-sdk/pumpswap/rpc/index.js +63 -0
  209. package/dist/src/sol-sdk/pumpswap/rpc/index.js.map +1 -0
  210. package/dist/src/sol-sdk/raydium/index.d.ts +16 -0
  211. package/dist/src/sol-sdk/raydium/index.d.ts.map +1 -0
  212. package/dist/src/sol-sdk/raydium/index.js +47 -0
  213. package/dist/src/sol-sdk/raydium/index.js.map +1 -0
  214. package/dist/src/sol-sdk/raydium/instructions/buy.d.ts +29 -0
  215. package/dist/src/sol-sdk/raydium/instructions/buy.d.ts.map +1 -0
  216. package/dist/src/sol-sdk/raydium/instructions/buy.js +106 -0
  217. package/dist/src/sol-sdk/raydium/instructions/buy.js.map +1 -0
  218. package/dist/src/sol-sdk/raydium/instructions/cpmmBuy.d.ts +29 -0
  219. package/dist/src/sol-sdk/raydium/instructions/cpmmBuy.d.ts.map +1 -0
  220. package/dist/src/sol-sdk/raydium/instructions/cpmmBuy.js +80 -0
  221. package/dist/src/sol-sdk/raydium/instructions/cpmmBuy.js.map +1 -0
  222. package/dist/src/sol-sdk/raydium/instructions/cpmmSell.d.ts +17 -0
  223. package/dist/src/sol-sdk/raydium/instructions/cpmmSell.d.ts.map +1 -0
  224. package/dist/src/sol-sdk/raydium/instructions/cpmmSell.js +56 -0
  225. package/dist/src/sol-sdk/raydium/instructions/cpmmSell.js.map +1 -0
  226. package/dist/src/sol-sdk/raydium/instructions/sell.d.ts +8558 -0
  227. package/dist/src/sol-sdk/raydium/instructions/sell.d.ts.map +1 -0
  228. package/dist/src/sol-sdk/raydium/instructions/sell.js +70 -0
  229. package/dist/src/sol-sdk/raydium/instructions/sell.js.map +1 -0
  230. package/dist/src/sol-sdk/raydium/rpc/index.d.ts +39 -0
  231. package/dist/src/sol-sdk/raydium/rpc/index.d.ts.map +1 -0
  232. package/dist/src/sol-sdk/raydium/rpc/index.js +82 -0
  233. package/dist/src/sol-sdk/raydium/rpc/index.js.map +1 -0
  234. package/dist/src/sol-sdk/raydium/rpc/raydium.d.ts +5 -0
  235. package/dist/src/sol-sdk/raydium/rpc/raydium.d.ts.map +1 -0
  236. package/dist/src/sol-sdk/raydium/rpc/raydium.js +18 -0
  237. package/dist/src/sol-sdk/raydium/rpc/raydium.js.map +1 -0
  238. package/dist/src/sol-sdk/rpc/index.d.ts +33 -0
  239. package/dist/src/sol-sdk/rpc/index.d.ts.map +1 -0
  240. package/dist/src/sol-sdk/rpc/index.js +128 -0
  241. package/dist/src/sol-sdk/rpc/index.js.map +1 -0
  242. package/dist/src/sol-sdk/transfer/index.d.ts +24 -0
  243. package/dist/src/sol-sdk/transfer/index.d.ts.map +1 -0
  244. package/dist/src/sol-sdk/transfer/index.js +65 -0
  245. package/dist/src/sol-sdk/transfer/index.js.map +1 -0
  246. package/dist/src/sol-sdk/turnover/index.d.ts +84 -0
  247. package/dist/src/sol-sdk/turnover/index.d.ts.map +1 -0
  248. package/dist/src/sol-sdk/turnover/index.js +569 -0
  249. package/dist/src/sol-sdk/turnover/index.js.map +1 -0
  250. package/dist/src/tx-tracker/detail-adapter.d.ts +100 -0
  251. package/dist/src/tx-tracker/detail-adapter.d.ts.map +1 -0
  252. package/dist/src/tx-tracker/detail-adapter.js +215 -0
  253. package/dist/src/tx-tracker/detail-adapter.js.map +1 -0
  254. package/dist/src/tx-tracker/index.d.ts +142 -0
  255. package/dist/src/tx-tracker/index.d.ts.map +1 -0
  256. package/dist/src/tx-tracker/index.js +447 -0
  257. package/dist/src/tx-tracker/index.js.map +1 -0
  258. package/dist/src/types/index.d.ts +76 -0
  259. package/dist/src/types/index.d.ts.map +1 -0
  260. package/dist/src/types/index.js +69 -0
  261. package/dist/src/types/index.js.map +1 -0
  262. package/dist/src/types/websocket.d.ts +15 -0
  263. package/dist/src/types/websocket.d.ts.map +1 -0
  264. package/dist/src/types/websocket.js +18 -0
  265. package/dist/src/types/websocket.js.map +1 -0
  266. package/dist/src/utils/index.d.ts +13 -0
  267. package/dist/src/utils/index.d.ts.map +1 -0
  268. package/dist/src/utils/index.js +174 -0
  269. package/dist/src/utils/index.js.map +1 -0
  270. package/dist/src/wallet-store.d.ts +124 -0
  271. package/dist/src/wallet-store.d.ts.map +1 -0
  272. package/dist/src/wallet-store.js +524 -0
  273. package/dist/src/wallet-store.js.map +1 -0
  274. package/package.json +86 -0
  275. package/scripts/postinstall.js +88 -0
@@ -0,0 +1,292 @@
1
+ /**
2
+ * 外盘抢筹命令组
3
+ *
4
+ * forgex sniper external | bonk
5
+ *
6
+ * Phase 3 升级:
7
+ * - 使用 DataSource 门面进行余额查询
8
+ * - 集成 TxTracker 自动追踪抢筹交易结果
9
+ * - 添加 ensurePasswordAndValidate 密码验证
10
+ * - 添加 suppressConsole/restoreConsole 防止 JSON 输出污染
11
+ * - 完善输入参数验证
12
+ * - 添加余额预检查
13
+ */
14
+ import { getGroup, ensurePasswordAndValidate } from '../../wallet-store.js';
15
+ import { loadConfig } from '../../config.js';
16
+ import { output, error, info, suppressConsole, restoreConsole, getOutputFormat } from '../../output.js';
17
+ import { getDataSource } from '../../data-source.js';
18
+ // ============================================================
19
+ // TxTracker 集成辅助函数
20
+ // ============================================================
21
+ /**
22
+ * 追踪抢筹交易结果并写入 DataStore。
23
+ */
24
+ async function trackSniperResult(result, tokenCA, groupId, walletAddresses, expectedAmountSol) {
25
+ if (!result.success)
26
+ return;
27
+ try {
28
+ const ds = getDataSource();
29
+ const trackingContext = {
30
+ ca: tokenCA,
31
+ groupId,
32
+ txType: 'buy',
33
+ wallets: walletAddresses,
34
+ expectedAmountSol,
35
+ };
36
+ if (result.bundleId) {
37
+ info('追踪 Bundle 交易结果...');
38
+ const trackResults = await ds.trackBundle(result.bundleId, result.txHashes || [], trackingContext, { onProgress: (status, tx) => info(`追踪: ${status} - ${tx.substring(0, 16)}...`) });
39
+ result.tracking = trackResults;
40
+ }
41
+ else if (result.txHashes && result.txHashes.length > 0) {
42
+ info('追踪交易结果...');
43
+ const entries = result.txHashes.map((txHash, i) => ({
44
+ txHash,
45
+ context: {
46
+ ...trackingContext,
47
+ wallets: [walletAddresses[i] || walletAddresses[0]],
48
+ },
49
+ }));
50
+ const trackResults = await ds.trackBatch(entries);
51
+ result.tracking = trackResults;
52
+ }
53
+ }
54
+ catch (trackErr) {
55
+ info(`交易追踪失败(不影响交易结果): ${trackErr.message}`);
56
+ }
57
+ }
58
+ export function registerSniperCommands(program) {
59
+ const sniperCmd = program
60
+ .command('sniper')
61
+ .description('外盘抢筹');
62
+ // ============================================================
63
+ // forgex sniper external (Pump 外盘抢筹)
64
+ // ============================================================
65
+ sniperCmd
66
+ .command('external')
67
+ .description('Pump.fun 外盘抢筹(Pump -> PumpSwap 迁移抢筹)')
68
+ .requiredOption('--launch-group <id>', '发射钱包组 ID')
69
+ .requiredOption('--sniper-group <id>', '抢筹钱包组 ID')
70
+ .requiredOption('--token <ca>', '代币合约地址')
71
+ .requiredOption('--amounts <amounts>', '抢筹金额(逗号分隔,对应每个狙击钱包)')
72
+ .option('--slippage <bps>', '滑点 (bps)', '500')
73
+ .option('--priority-fee <sol>', '优先费 (SOL)')
74
+ .option('--dry-run', '仅模拟,不实际执行', false)
75
+ .action(async (options) => {
76
+ try {
77
+ // 密码验证
78
+ await ensurePasswordAndValidate();
79
+ const config = loadConfig();
80
+ const launchGroupId = Number(options.launchGroup);
81
+ const sniperGroupId = Number(options.sniperGroup);
82
+ // 参数验证
83
+ if (isNaN(launchGroupId)) {
84
+ error('--launch-group 必须是有效数字');
85
+ process.exit(1);
86
+ }
87
+ if (isNaN(sniperGroupId)) {
88
+ error('--sniper-group 必须是有效数字');
89
+ process.exit(1);
90
+ }
91
+ const launchGroup = getGroup(launchGroupId);
92
+ const sniperGroup = getGroup(sniperGroupId);
93
+ if (!launchGroup) {
94
+ error(`发射钱包组 ${launchGroupId} 不存在`);
95
+ process.exit(1);
96
+ }
97
+ if (!sniperGroup) {
98
+ error(`抢筹钱包组 ${sniperGroupId} 不存在`);
99
+ process.exit(1);
100
+ }
101
+ if (launchGroup.wallets.length === 0) {
102
+ error('发射钱包组中没有钱包');
103
+ process.exit(1);
104
+ }
105
+ if (sniperGroup.wallets.length === 0) {
106
+ error('抢筹钱包组中没有钱包');
107
+ process.exit(1);
108
+ }
109
+ const amounts = options.amounts.split(',').map(Number);
110
+ if (amounts.some(isNaN)) {
111
+ error('--amounts 包含无效数字');
112
+ process.exit(1);
113
+ }
114
+ if (amounts.some((a) => a <= 0)) {
115
+ error('--amounts 中每个金额必须大于 0');
116
+ process.exit(1);
117
+ }
118
+ if (amounts.length !== sniperGroup.wallets.length) {
119
+ error(`金额数量 (${amounts.length}) 与狙击钱包数量 (${sniperGroup.wallets.length}) 不匹配`);
120
+ process.exit(1);
121
+ }
122
+ const slippageBps = Number(options.slippage);
123
+ if (isNaN(slippageBps) || slippageBps <= 0 || slippageBps > 5000) {
124
+ error('--slippage 必须是 1-5000 之间的数字 (bps, 5000 = 50%)');
125
+ process.exit(1);
126
+ }
127
+ const priorityFee = options.priorityFee
128
+ ? Number(options.priorityFee)
129
+ : config.defaultPriorityFee;
130
+ if (isNaN(priorityFee) || priorityFee < 0) {
131
+ error('--priority-fee 必须是非负数字');
132
+ process.exit(1);
133
+ }
134
+ // DataSource 余额预检查
135
+ const ds = getDataSource();
136
+ const sniperWalletAddresses = sniperGroup.wallets.map((w) => w.walletAddress);
137
+ const sniperParams = {
138
+ type: 'external',
139
+ launchGroup: launchGroupId,
140
+ sniperGroup: sniperGroupId,
141
+ token: options.token,
142
+ amounts,
143
+ slippage: slippageBps,
144
+ priorityFee,
145
+ launchWalletCount: launchGroup.wallets.length,
146
+ sniperWalletCount: sniperGroup.wallets.length,
147
+ dryRun: options.dryRun,
148
+ };
149
+ if (options.dryRun) {
150
+ // 余额预检查
151
+ const balances = [];
152
+ for (let i = 0; i < sniperGroup.wallets.length; i++) {
153
+ const bal = await ds.getSolBalance(sniperGroup.wallets[i].walletAddress);
154
+ balances.push({
155
+ address: sniperGroup.wallets[i].walletAddress,
156
+ balance: bal,
157
+ required: amounts[i] + priorityFee,
158
+ sufficient: bal >= amounts[i] + priorityFee,
159
+ });
160
+ }
161
+ const estimatedFee = config.feeConfig.launch_sniper_fee * amounts.length;
162
+ output({
163
+ dryRun: true,
164
+ params: sniperParams,
165
+ estimatedFee,
166
+ balances,
167
+ message: '模拟模式,未实际执行抢筹',
168
+ });
169
+ return;
170
+ }
171
+ // JSON 模式下抑制 SDK 的 console.log
172
+ if (getOutputFormat() === 'json')
173
+ suppressConsole();
174
+ // TODO: 实际 SDK 调用(当前输出参数)
175
+ restoreConsole();
176
+ output({
177
+ success: true,
178
+ ...sniperParams,
179
+ message: '外盘抢筹已提交,等待 Pump -> PumpSwap 迁移触发',
180
+ });
181
+ }
182
+ catch (e) {
183
+ restoreConsole();
184
+ error('外盘抢筹失败', e.message);
185
+ process.exit(1);
186
+ }
187
+ });
188
+ // ============================================================
189
+ // forgex sniper bonk (Bonk 外盘抢筹)
190
+ // ============================================================
191
+ sniperCmd
192
+ .command('bonk')
193
+ .description('Bonk 外盘抢筹(通过 Raydium CPMM)')
194
+ .requiredOption('--sniper-group <id>', '抢筹钱包组 ID')
195
+ .requiredOption('--token <ca>', '代币合约地址')
196
+ .requiredOption('--amounts <amounts>', '抢筹金额(逗号分隔)')
197
+ .option('--slippage <bps>', '滑点 (bps)', '500')
198
+ .option('--priority-fee <sol>', '优先费 (SOL)')
199
+ .option('--dry-run', '仅模拟,不实际执行', false)
200
+ .action(async (options) => {
201
+ try {
202
+ // 密码验证
203
+ await ensurePasswordAndValidate();
204
+ const config = loadConfig();
205
+ const sniperGroupId = Number(options.sniperGroup);
206
+ // 参数验证
207
+ if (isNaN(sniperGroupId)) {
208
+ error('--sniper-group 必须是有效数字');
209
+ process.exit(1);
210
+ }
211
+ const sniperGroup = getGroup(sniperGroupId);
212
+ if (!sniperGroup) {
213
+ error(`抢筹钱包组 ${sniperGroupId} 不存在`);
214
+ process.exit(1);
215
+ }
216
+ if (sniperGroup.wallets.length === 0) {
217
+ error('抢筹钱包组中没有钱包');
218
+ process.exit(1);
219
+ }
220
+ const amounts = options.amounts.split(',').map(Number);
221
+ if (amounts.some(isNaN)) {
222
+ error('--amounts 包含无效数字');
223
+ process.exit(1);
224
+ }
225
+ if (amounts.some((a) => a <= 0)) {
226
+ error('--amounts 中每个金额必须大于 0');
227
+ process.exit(1);
228
+ }
229
+ const slippageBps = Number(options.slippage);
230
+ if (isNaN(slippageBps) || slippageBps <= 0 || slippageBps > 5000) {
231
+ error('--slippage 必须是 1-5000 之间的数字 (bps, 5000 = 50%)');
232
+ process.exit(1);
233
+ }
234
+ const priorityFee = options.priorityFee
235
+ ? Number(options.priorityFee)
236
+ : config.defaultPriorityFee;
237
+ if (isNaN(priorityFee) || priorityFee < 0) {
238
+ error('--priority-fee 必须是非负数字');
239
+ process.exit(1);
240
+ }
241
+ // DataSource 余额预检查
242
+ const ds = getDataSource();
243
+ const sniperWalletAddresses = sniperGroup.wallets.map((w) => w.walletAddress);
244
+ const sniperParams = {
245
+ type: 'bonk',
246
+ sniperGroup: sniperGroupId,
247
+ token: options.token,
248
+ amounts,
249
+ slippage: slippageBps,
250
+ priorityFee,
251
+ sniperWalletCount: sniperGroup.wallets.length,
252
+ dryRun: options.dryRun,
253
+ };
254
+ if (options.dryRun) {
255
+ // 余额预检查
256
+ const balances = [];
257
+ for (let i = 0; i < sniperGroup.wallets.length; i++) {
258
+ const bal = await ds.getSolBalance(sniperGroup.wallets[i].walletAddress);
259
+ balances.push({
260
+ address: sniperGroup.wallets[i].walletAddress,
261
+ balance: bal,
262
+ required: amounts[i] + priorityFee,
263
+ sufficient: bal >= amounts[i] + priorityFee,
264
+ });
265
+ }
266
+ output({
267
+ dryRun: true,
268
+ params: sniperParams,
269
+ balances,
270
+ message: '模拟模式,未实际执行 Bonk 抢筹',
271
+ });
272
+ return;
273
+ }
274
+ // JSON 模式下抑制 SDK 的 console.log
275
+ if (getOutputFormat() === 'json')
276
+ suppressConsole();
277
+ // TODO: 实际 SDK 调用(当前输出参数)
278
+ restoreConsole();
279
+ output({
280
+ success: true,
281
+ ...sniperParams,
282
+ message: 'Bonk 外盘抢筹已提交',
283
+ });
284
+ }
285
+ catch (e) {
286
+ restoreConsole();
287
+ error('Bonk 抢筹失败', e.message);
288
+ process.exit(1);
289
+ }
290
+ });
291
+ }
292
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/sniper/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,QAAQ,EAA0B,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AACpG,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,+DAA+D;AAC/D,mBAAmB;AACnB,+DAA+D;AAE/D;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAC9B,MAAoF,EACpF,OAAe,EACf,OAAe,EACf,eAAyB,EACzB,iBAA0B;IAE1B,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO;IAE5B,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;QAC3B,MAAM,eAAe,GAAoB;YACvC,EAAE,EAAE,OAAO;YACX,OAAO;YACP,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,eAAe;YACxB,iBAAiB;SAClB,CAAC;QAEF,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAC1B,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,WAAW,CACvC,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,QAAQ,IAAI,EAAE,EACrB,eAAe,EACf,EAAE,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,MAAM,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAClF,CAAC;YACF,MAAM,CAAC,QAAQ,GAAG,YAAY,CAAC;QACjC,CAAC;aAAM,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzD,IAAI,CAAC,WAAW,CAAC,CAAC;YAClB,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAc,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC;gBAClE,MAAM;gBACN,OAAO,EAAE;oBACP,GAAG,eAAe;oBAClB,OAAO,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC;iBACpD;aACF,CAAC,CAAC,CAAC;YACJ,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAClD,MAAM,CAAC,QAAQ,GAAG,YAAY,CAAC;QACjC,CAAC;IACH,CAAC;IAAC,OAAO,QAAa,EAAE,CAAC;QACvB,IAAI,CAAC,oBAAoB,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,MAAM,SAAS,GAAG,OAAO;SACtB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,MAAM,CAAC,CAAC;IAEvB,+DAA+D;IAC/D,qCAAqC;IACrC,+DAA+D;IAC/D,SAAS;SACN,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,sCAAsC,CAAC;SACnD,cAAc,CAAC,qBAAqB,EAAE,UAAU,CAAC;SACjD,cAAc,CAAC,qBAAqB,EAAE,UAAU,CAAC;SACjD,cAAc,CAAC,cAAc,EAAE,QAAQ,CAAC;SACxC,cAAc,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;SAC5D,MAAM,CAAC,kBAAkB,EAAE,UAAU,EAAE,KAAK,CAAC;SAC7C,MAAM,CAAC,sBAAsB,EAAE,WAAW,CAAC;SAC3C,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC;SACvC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,OAAO;YACP,MAAM,yBAAyB,EAAE,CAAC;YAElC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAC5B,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAClD,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAElD,OAAO;YACP,IAAI,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;gBACzB,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;gBACzB,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;YAC5C,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;YAE5C,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,KAAK,CAAC,SAAS,aAAa,MAAM,CAAC,CAAC;gBACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,KAAK,CAAC,SAAS,aAAa,MAAM,CAAC,CAAC;gBACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrC,KAAK,CAAC,YAAY,CAAC,CAAC;gBACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrC,KAAK,CAAC,YAAY,CAAC,CAAC;gBACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACvD,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxB,KAAK,CAAC,kBAAkB,CAAC,CAAC;gBAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;gBACxC,KAAK,CAAC,uBAAuB,CAAC,CAAC;gBAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBAClD,KAAK,CAAC,SAAS,OAAO,CAAC,MAAM,cAAc,WAAW,CAAC,OAAO,CAAC,MAAM,OAAO,CAAC,CAAC;gBAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC7C,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,CAAC,IAAI,WAAW,GAAG,IAAI,EAAE,CAAC;gBACjE,KAAK,CAAC,+CAA+C,CAAC,CAAC;gBACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW;gBACrC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;gBAC7B,CAAC,CAAC,MAAM,CAAC,kBAAkB,CAAC;YAC9B,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;gBAC1C,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,mBAAmB;YACnB,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;YAC3B,MAAM,qBAAqB,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;YAEnF,MAAM,YAAY,GAAG;gBACnB,IAAI,EAAE,UAAU;gBAChB,WAAW,EAAE,aAAa;gBAC1B,WAAW,EAAE,aAAa;gBAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,OAAO;gBACP,QAAQ,EAAE,WAAW;gBACrB,WAAW;gBACX,iBAAiB,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM;gBAC7C,iBAAiB,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM;gBAC7C,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC;YAEF,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,QAAQ;gBACR,MAAM,QAAQ,GAAkF,EAAE,CAAC;gBACnG,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACpD,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;oBACzE,QAAQ,CAAC,IAAI,CAAC;wBACZ,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa;wBAC7C,OAAO,EAAE,GAAG;wBACZ,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,WAAW;wBAClC,UAAU,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,WAAW;qBAC5C,CAAC,CAAC;gBACL,CAAC;gBAED,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;gBACzE,MAAM,CAAC;oBACL,MAAM,EAAE,IAAI;oBACZ,MAAM,EAAE,YAAY;oBACpB,YAAY;oBACZ,QAAQ;oBACR,OAAO,EAAE,cAAc;iBACxB,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,+BAA+B;YAC/B,IAAI,eAAe,EAAE,KAAK,MAAM;gBAAE,eAAe,EAAE,CAAC;YAEpD,0BAA0B;YAC1B,cAAc,EAAE,CAAC;YAEjB,MAAM,CAAC;gBACL,OAAO,EAAE,IAAI;gBACb,GAAG,YAAY;gBACf,OAAO,EAAE,kCAAkC;aAC5C,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,cAAc,EAAE,CAAC;YACjB,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,+DAA+D;IAC/D,iCAAiC;IACjC,+DAA+D;IAC/D,SAAS;SACN,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,4BAA4B,CAAC;SACzC,cAAc,CAAC,qBAAqB,EAAE,UAAU,CAAC;SACjD,cAAc,CAAC,cAAc,EAAE,QAAQ,CAAC;SACxC,cAAc,CAAC,qBAAqB,EAAE,YAAY,CAAC;SACnD,MAAM,CAAC,kBAAkB,EAAE,UAAU,EAAE,KAAK,CAAC;SAC7C,MAAM,CAAC,sBAAsB,EAAE,WAAW,CAAC;SAC3C,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC;SACvC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,OAAO;YACP,MAAM,yBAAyB,EAAE,CAAC;YAElC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAC5B,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAElD,OAAO;YACP,IAAI,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;gBACzB,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;YAE5C,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,KAAK,CAAC,SAAS,aAAa,MAAM,CAAC,CAAC;gBACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrC,KAAK,CAAC,YAAY,CAAC,CAAC;gBACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACvD,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxB,KAAK,CAAC,kBAAkB,CAAC,CAAC;gBAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;gBACxC,KAAK,CAAC,uBAAuB,CAAC,CAAC;gBAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC7C,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,CAAC,IAAI,WAAW,GAAG,IAAI,EAAE,CAAC;gBACjE,KAAK,CAAC,+CAA+C,CAAC,CAAC;gBACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW;gBACrC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;gBAC7B,CAAC,CAAC,MAAM,CAAC,kBAAkB,CAAC;YAC9B,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;gBAC1C,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,mBAAmB;YACnB,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;YAC3B,MAAM,qBAAqB,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;YAEnF,MAAM,YAAY,GAAG;gBACnB,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,aAAa;gBAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,OAAO;gBACP,QAAQ,EAAE,WAAW;gBACrB,WAAW;gBACX,iBAAiB,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM;gBAC7C,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC;YAEF,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,QAAQ;gBACR,MAAM,QAAQ,GAAkF,EAAE,CAAC;gBACnG,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACpD,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;oBACzE,QAAQ,CAAC,IAAI,CAAC;wBACZ,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa;wBAC7C,OAAO,EAAE,GAAG;wBACZ,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,WAAW;wBAClC,UAAU,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,WAAW;qBAC5C,CAAC,CAAC;gBACL,CAAC;gBAED,MAAM,CAAC;oBACL,MAAM,EAAE,IAAI;oBACZ,MAAM,EAAE,YAAY;oBACpB,QAAQ;oBACR,OAAO,EAAE,oBAAoB;iBAC9B,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,+BAA+B;YAC/B,IAAI,eAAe,EAAE,KAAK,MAAM;gBAAE,eAAe,EAAE,CAAC;YAEpD,0BAA0B;YAC1B,cAAc,EAAE,CAAC;YAEjB,MAAM,CAAC;gBACL,OAAO,EAAE,IAAI;gBACb,GAAG,YAAY;gBACf,OAAO,EAAE,cAAc;aACxB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,cAAc,EAAE,CAAC;YACjB,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * 代币命令组
3
+ *
4
+ * forgex token create | info | pool
5
+ *
6
+ * Phase 3 升级:
7
+ * - 使用 DataSource 门面代替直接 API 调用(info/pool)
8
+ * - 集成 TxTracker 自动追踪代币创建交易结果
9
+ * - 添加 ensurePasswordAndValidate 密码验证
10
+ * - 添加 suppressConsole/restoreConsole 防止 JSON 输出污染
11
+ * - 完善输入参数验证
12
+ * - api 函数全部直连 (Jito / pump.fun / 本地靓号目录),不走远程代理
13
+ */
14
+ import { Command } from 'commander';
15
+ export declare function registerTokenCommands(program: Command): void;
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/token/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2DpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+P5D"}
@@ -0,0 +1,295 @@
1
+ /**
2
+ * 代币命令组
3
+ *
4
+ * forgex token create | info | pool
5
+ *
6
+ * Phase 3 升级:
7
+ * - 使用 DataSource 门面代替直接 API 调用(info/pool)
8
+ * - 集成 TxTracker 自动追踪代币创建交易结果
9
+ * - 添加 ensurePasswordAndValidate 密码验证
10
+ * - 添加 suppressConsole/restoreConsole 防止 JSON 输出污染
11
+ * - 完善输入参数验证
12
+ * - api 函数全部直连 (Jito / pump.fun / 本地靓号目录),不走远程代理
13
+ */
14
+ import fs from 'fs';
15
+ import { getGroup, ensurePasswordAndValidate } from '../../wallet-store.js';
16
+ import { loadConfig, getVanityAddress } from '../../config.js';
17
+ import { uploadToIpfs } from '../../adapters/ipfs.js';
18
+ import { getDataSource } from '../../data-source.js';
19
+ import { output, error, info, suppressConsole, restoreConsole, getOutputFormat } from '../../output.js';
20
+ // ============================================================
21
+ // TxTracker 集成辅助函数
22
+ // ============================================================
23
+ /**
24
+ * 追踪代币创建交易结果并写入 DataStore。
25
+ */
26
+ async function trackTokenCreateResult(result, tokenCA, groupId, walletAddresses) {
27
+ if (!result.success)
28
+ return;
29
+ try {
30
+ const ds = getDataSource();
31
+ const trackingContext = {
32
+ ca: tokenCA,
33
+ groupId,
34
+ txType: 'buy',
35
+ wallets: walletAddresses,
36
+ };
37
+ if (result.bundleId) {
38
+ info('追踪 Bundle 交易结果...');
39
+ const trackResults = await ds.trackBundle(result.bundleId, result.txHashes || [], trackingContext, { onProgress: (status, tx) => info(`追踪: ${status} - ${tx.substring(0, 16)}...`) });
40
+ result.tracking = trackResults;
41
+ }
42
+ else if (result.txHashes && result.txHashes.length > 0) {
43
+ info('追踪交易结果...');
44
+ const entries = result.txHashes.map((txHash, i) => ({
45
+ txHash,
46
+ context: {
47
+ ...trackingContext,
48
+ wallets: [walletAddresses[i] || walletAddresses[0]],
49
+ },
50
+ }));
51
+ const trackResults = await ds.trackBatch(entries);
52
+ result.tracking = trackResults;
53
+ }
54
+ }
55
+ catch (trackErr) {
56
+ info(`交易追踪失败(不影响交易结果): ${trackErr.message}`);
57
+ }
58
+ }
59
+ export function registerTokenCommands(program) {
60
+ const tokenCmd = program
61
+ .command('token')
62
+ .description('代币操作');
63
+ // ============================================================
64
+ // forgex token create
65
+ // ============================================================
66
+ tokenCmd
67
+ .command('create')
68
+ .description('创建代币')
69
+ .requiredOption('--dex <dex>', 'DEX 平台: pump | launchlab')
70
+ .requiredOption('--name <name>', '代币名称')
71
+ .requiredOption('--symbol <symbol>', '代币符号')
72
+ .requiredOption('--image <path>', '代币图片路径')
73
+ .option('--description <desc>', '代币描述', '')
74
+ .option('--twitter <url>', 'Twitter 链接')
75
+ .option('--website <url>', '网站链接')
76
+ .option('--telegram <url>', 'Telegram 链接')
77
+ .option('--dev-wallet <groupId>', '开发者钱包组 ID')
78
+ .option('--dev-buy <sol>', '开发者买入金额 (SOL)', '0')
79
+ .option('--snipers <groupId>', '狙击者钱包组 ID')
80
+ .option('--sniper-amounts <amounts>', '狙击者买入金额(逗号分隔)')
81
+ .option('--bundle-time <time>', 'Bundle 时间: T0 | T1_T5', 'T0')
82
+ .option('--priority-fee <sol>', '优先费 (SOL)')
83
+ .option('--use-suffix', '使用自定义后缀地址', false)
84
+ .option('--dry-run', '仅模拟,不实际执行', false)
85
+ .action(async (options) => {
86
+ try {
87
+ const config = loadConfig();
88
+ // --dex 校验
89
+ const validDexes = ['pump', 'launchlab'];
90
+ if (!validDexes.includes(options.dex)) {
91
+ error(`--dex 无效: "${options.dex}",必须是 pump | launchlab`);
92
+ process.exit(1);
93
+ }
94
+ // --bundle-time 校验
95
+ const validBundleTimes = ['T0', 'T1_T5'];
96
+ if (!validBundleTimes.includes(options.bundleTime)) {
97
+ error(`--bundle-time 无效: "${options.bundleTime}",必须是 T0 | T1_T5`);
98
+ process.exit(1);
99
+ }
100
+ // --dev-buy 数值校验
101
+ const devBuy = Number(options.devBuy);
102
+ if (isNaN(devBuy) || devBuy < 0) {
103
+ error('--dev-buy 必须是非负数字');
104
+ process.exit(1);
105
+ }
106
+ // --priority-fee 数值校验
107
+ const priorityFee = options.priorityFee
108
+ ? Number(options.priorityFee)
109
+ : config.defaultPriorityFee;
110
+ if (isNaN(priorityFee) || priorityFee < 0) {
111
+ error('--priority-fee 必须是非负数字');
112
+ process.exit(1);
113
+ }
114
+ // --dev-wallet 校验
115
+ let devGroup;
116
+ if (options.devWallet) {
117
+ const devGroupId = Number(options.devWallet);
118
+ if (isNaN(devGroupId)) {
119
+ error('--dev-wallet 必须是有效数字');
120
+ process.exit(1);
121
+ }
122
+ devGroup = getGroup(devGroupId);
123
+ if (!devGroup) {
124
+ error(`开发者钱包组 ${devGroupId} 不存在`);
125
+ process.exit(1);
126
+ }
127
+ }
128
+ // --snipers 校验
129
+ let sniperGroup;
130
+ if (options.snipers) {
131
+ const sniperGroupId = Number(options.snipers);
132
+ if (isNaN(sniperGroupId)) {
133
+ error('--snipers 必须是有效数字');
134
+ process.exit(1);
135
+ }
136
+ sniperGroup = getGroup(sniperGroupId);
137
+ if (!sniperGroup) {
138
+ error(`狙击者钱包组 ${sniperGroupId} 不存在`);
139
+ process.exit(1);
140
+ }
141
+ }
142
+ // --sniper-amounts 校验
143
+ let sniperAmounts = [];
144
+ if (options.sniperAmounts) {
145
+ sniperAmounts = options.sniperAmounts.split(',').map(Number);
146
+ if (sniperAmounts.some(isNaN)) {
147
+ error('--sniper-amounts 包含无效数字');
148
+ process.exit(1);
149
+ }
150
+ if (sniperAmounts.some(a => a <= 0)) {
151
+ error('--sniper-amounts 中每个金额必须大于 0');
152
+ process.exit(1);
153
+ }
154
+ }
155
+ // 如果使用钱包组,验证密码
156
+ if (options.devWallet || options.snipers) {
157
+ await ensurePasswordAndValidate();
158
+ }
159
+ // 验证图片文件
160
+ if (!fs.existsSync(options.image)) {
161
+ error(`图片文件不存在: ${options.image}`);
162
+ process.exit(1);
163
+ }
164
+ // 上传到 IPFS
165
+ info('上传代币元数据到 IPFS...');
166
+ // JSON 模式下抑制 SDK 的 console.log
167
+ if (getOutputFormat() === 'json')
168
+ suppressConsole();
169
+ const ipfsResult = await uploadToIpfs(options.image, {
170
+ name: options.name,
171
+ symbol: options.symbol,
172
+ description: options.description,
173
+ twitter: options.twitter,
174
+ telegram: options.telegram,
175
+ website: options.website,
176
+ });
177
+ restoreConsole();
178
+ const createParams = {
179
+ dex: options.dex,
180
+ name: options.name,
181
+ symbol: options.symbol,
182
+ description: options.description,
183
+ metadataUri: ipfsResult?.metadataUri,
184
+ twitter: options.twitter,
185
+ website: options.website,
186
+ telegram: options.telegram,
187
+ devWalletGroup: options.devWallet ? Number(options.devWallet) : undefined,
188
+ devBuyAmount: devBuy,
189
+ sniperGroup: options.snipers ? Number(options.snipers) : undefined,
190
+ sniperAmounts,
191
+ bundleTime: options.bundleTime,
192
+ priorityFee,
193
+ useSuffix: options.useSuffix,
194
+ dryRun: options.dryRun,
195
+ };
196
+ if (options.dryRun) {
197
+ output({
198
+ dryRun: true,
199
+ params: createParams,
200
+ message: '模拟模式,未实际创建代币',
201
+ });
202
+ return;
203
+ }
204
+ // 获取 suffix 地址(如果需要)
205
+ let suffixAddress;
206
+ if (options.useSuffix) {
207
+ info('获取自定义后缀地址...');
208
+ if (getOutputFormat() === 'json')
209
+ suppressConsole();
210
+ suffixAddress = getVanityAddress(options.dex === 'pump' ? 'pump' : 'bonk');
211
+ restoreConsole();
212
+ }
213
+ output({
214
+ success: true,
215
+ ...createParams,
216
+ suffixAddress: suffixAddress || undefined,
217
+ ipfsMetadata: ipfsResult,
218
+ message: '代币创建流程已启动',
219
+ });
220
+ }
221
+ catch (e) {
222
+ restoreConsole();
223
+ error('创建代币失败', e.message);
224
+ process.exit(1);
225
+ }
226
+ });
227
+ // ============================================================
228
+ // forgex token info
229
+ // ============================================================
230
+ tokenCmd
231
+ .command('info')
232
+ .description('查询代币信息')
233
+ .requiredOption('--ca <address>', '代币合约地址')
234
+ .action(async (options) => {
235
+ try {
236
+ if (!options.ca || options.ca.trim().length === 0) {
237
+ error('--ca 不能为空');
238
+ process.exit(1);
239
+ }
240
+ const ds = getDataSource();
241
+ // 通过 DataSource -> CodexAdapter 获取代币信息
242
+ const [tokenInfo, priceData, pairs] = await Promise.all([
243
+ ds.getTokenInfo(options.ca),
244
+ ds.getTokenPrice(options.ca).catch(() => ({ priceSol: 0, priceUsd: 0 })),
245
+ ds.getPairsForToken(options.ca, 10).catch(() => []),
246
+ ]);
247
+ output({
248
+ address: options.ca,
249
+ name: tokenInfo.name,
250
+ symbol: tokenInfo.symbol,
251
+ decimals: tokenInfo.decimals,
252
+ creator: tokenInfo.creatorAddress,
253
+ dex: tokenInfo.dex,
254
+ priceSol: priceData.priceSol,
255
+ priceUsd: priceData.priceUsd,
256
+ pairs: pairs.map((p) => ({
257
+ exchange: p.exchangeName,
258
+ pairAddress: p.pairAddress,
259
+ liquidity: p.liquidity,
260
+ volume: p.volume24h,
261
+ tokenA: p.token0Address,
262
+ tokenB: p.token1Address,
263
+ })),
264
+ });
265
+ }
266
+ catch (e) {
267
+ error('查询代币信息失败', e.message);
268
+ process.exit(1);
269
+ }
270
+ });
271
+ // ============================================================
272
+ // forgex token pool
273
+ // ============================================================
274
+ tokenCmd
275
+ .command('pool')
276
+ .description('查询代币池子信息')
277
+ .requiredOption('--ca <address>', '代币合约地址')
278
+ .action(async (options) => {
279
+ try {
280
+ if (!options.ca || options.ca.trim().length === 0) {
281
+ error('--ca 不能为空');
282
+ process.exit(1);
283
+ }
284
+ const ds = getDataSource();
285
+ // 通过 DataSource -> CodexAdapter 获取池信息
286
+ const poolInfo = await ds.getPoolInfo(options.ca);
287
+ output(poolInfo);
288
+ }
289
+ catch (e) {
290
+ error('查询池子信息失败', e.message);
291
+ process.exit(1);
292
+ }
293
+ });
294
+ }
295
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/token/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,QAAQ,EAA0B,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AACpG,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAExG,+DAA+D;AAC/D,mBAAmB;AACnB,+DAA+D;AAE/D;;GAEG;AACH,KAAK,UAAU,sBAAsB,CACnC,MAAoF,EACpF,OAAe,EACf,OAAe,EACf,eAAyB;IAEzB,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO;IAE5B,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;QAC3B,MAAM,eAAe,GAAoB;YACvC,EAAE,EAAE,OAAO;YACX,OAAO;YACP,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,eAAe;SACzB,CAAC;QAEF,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAC1B,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,WAAW,CACvC,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,QAAQ,IAAI,EAAE,EACrB,eAAe,EACf,EAAE,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,MAAM,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAClF,CAAC;YACF,MAAM,CAAC,QAAQ,GAAG,YAAY,CAAC;QACjC,CAAC;aAAM,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzD,IAAI,CAAC,WAAW,CAAC,CAAC;YAClB,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAc,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC;gBAClE,MAAM;gBACN,OAAO,EAAE;oBACP,GAAG,eAAe;oBAClB,OAAO,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC;iBACpD;aACF,CAAC,CAAC,CAAC;YACJ,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAClD,MAAM,CAAC,QAAQ,GAAG,YAAY,CAAC;QACjC,CAAC;IACH,CAAC;IAAC,OAAO,QAAa,EAAE,CAAC;QACvB,IAAI,CAAC,oBAAoB,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,QAAQ,GAAG,OAAO;SACrB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,MAAM,CAAC,CAAC;IAEvB,+DAA+D;IAC/D,sBAAsB;IACtB,+DAA+D;IAC/D,QAAQ;SACL,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,MAAM,CAAC;SACnB,cAAc,CAAC,aAAa,EAAE,0BAA0B,CAAC;SACzD,cAAc,CAAC,eAAe,EAAE,MAAM,CAAC;SACvC,cAAc,CAAC,mBAAmB,EAAE,MAAM,CAAC;SAC3C,cAAc,CAAC,gBAAgB,EAAE,QAAQ,CAAC;SAC1C,MAAM,CAAC,sBAAsB,EAAE,MAAM,EAAE,EAAE,CAAC;SAC1C,MAAM,CAAC,iBAAiB,EAAE,YAAY,CAAC;SACvC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC;SACjC,MAAM,CAAC,kBAAkB,EAAE,aAAa,CAAC;SACzC,MAAM,CAAC,wBAAwB,EAAE,WAAW,CAAC;SAC7C,MAAM,CAAC,iBAAiB,EAAE,eAAe,EAAE,GAAG,CAAC;SAC/C,MAAM,CAAC,qBAAqB,EAAE,WAAW,CAAC;SAC1C,MAAM,CAAC,4BAA4B,EAAE,eAAe,CAAC;SACrD,MAAM,CAAC,sBAAsB,EAAE,uBAAuB,EAAE,IAAI,CAAC;SAC7D,MAAM,CAAC,sBAAsB,EAAE,WAAW,CAAC;SAC3C,MAAM,CAAC,cAAc,EAAE,WAAW,EAAE,KAAK,CAAC;SAC1C,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC;SACvC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAE5B,WAAW;YACX,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YACzC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtC,KAAK,CAAC,cAAc,OAAO,CAAC,GAAG,wBAAwB,CAAC,CAAC;gBACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,mBAAmB;YACnB,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACzC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;gBACnD,KAAK,CAAC,sBAAsB,OAAO,CAAC,UAAU,kBAAkB,CAAC,CAAC;gBAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,iBAAiB;YACjB,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,sBAAsB;YACtB,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW;gBACrC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;gBAC7B,CAAC,CAAC,MAAM,CAAC,kBAAkB,CAAC;YAC9B,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;gBAC1C,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,kBAAkB;YAClB,IAAI,QAAQ,CAAC;YACb,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;gBACtB,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBAC7C,IAAI,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;oBACtB,KAAK,CAAC,sBAAsB,CAAC,CAAC;oBAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBACD,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAChC,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,KAAK,CAAC,UAAU,UAAU,MAAM,CAAC,CAAC;oBAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;YAED,eAAe;YACf,IAAI,WAAW,CAAC;YAChB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBAC9C,IAAI,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;oBACzB,KAAK,CAAC,mBAAmB,CAAC,CAAC;oBAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBACD,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;gBACtC,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,KAAK,CAAC,UAAU,aAAa,MAAM,CAAC,CAAC;oBACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;YAED,sBAAsB;YACtB,IAAI,aAAa,GAAa,EAAE,CAAC;YACjC,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;gBAC1B,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC7D,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC9B,KAAK,CAAC,yBAAyB,CAAC,CAAC;oBACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBACD,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;oBACpC,KAAK,CAAC,8BAA8B,CAAC,CAAC;oBACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;YAED,eAAe;YACf,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACzC,MAAM,yBAAyB,EAAE,CAAC;YACpC,CAAC;YAED,SAAS;YACT,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClC,KAAK,CAAC,YAAY,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;gBACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,WAAW;YACX,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAEzB,+BAA+B;YAC/B,IAAI,eAAe,EAAE,KAAK,MAAM;gBAAE,eAAe,EAAE,CAAC;YAEpD,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE;gBACnD,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;aACzB,CAAC,CAAC;YAEH,cAAc,EAAE,CAAC;YAEjB,MAAM,YAAY,GAAG;gBACnB,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,WAAW,EAAG,UAAkB,EAAE,WAAW;gBAC7C,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,cAAc,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;gBACzE,YAAY,EAAE,MAAM;gBACpB,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;gBAClE,aAAa;gBACb,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,WAAW;gBACX,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC;YAEF,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,MAAM,CAAC;oBACL,MAAM,EAAE,IAAI;oBACZ,MAAM,EAAE,YAAY;oBACpB,OAAO,EAAE,cAAc;iBACxB,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,qBAAqB;YACrB,IAAI,aAAa,CAAC;YAClB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;gBACtB,IAAI,CAAC,cAAc,CAAC,CAAC;gBACrB,IAAI,eAAe,EAAE,KAAK,MAAM;oBAAE,eAAe,EAAE,CAAC;gBACpD,aAAa,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBAC3E,cAAc,EAAE,CAAC;YACnB,CAAC;YAED,MAAM,CAAC;gBACL,OAAO,EAAE,IAAI;gBACb,GAAG,YAAY;gBACf,aAAa,EAAE,aAAa,IAAI,SAAS;gBACzC,YAAY,EAAE,UAAU;gBACxB,OAAO,EAAE,WAAW;aACrB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,cAAc,EAAE,CAAC;YACjB,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,+DAA+D;IAC/D,oBAAoB;IACpB,+DAA+D;IAC/D,QAAQ;SACL,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,QAAQ,CAAC;SACrB,cAAc,CAAC,gBAAgB,EAAE,QAAQ,CAAC;SAC1C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClD,KAAK,CAAC,WAAW,CAAC,CAAC;gBACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;YAE3B,uCAAuC;YACvC,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACtD,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;gBACxE,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;aACpD,CAAC,CAAC;YAEH,MAAM,CAAC;gBACL,OAAO,EAAE,OAAO,CAAC,EAAE;gBACnB,IAAI,EAAE,SAAS,CAAC,IAAI;gBACpB,MAAM,EAAE,SAAS,CAAC,MAAM;gBACxB,QAAQ,EAAE,SAAS,CAAC,QAAQ;gBAC5B,OAAO,EAAE,SAAS,CAAC,cAAc;gBACjC,GAAG,EAAE,SAAS,CAAC,GAAG;gBAClB,QAAQ,EAAE,SAAS,CAAC,QAAQ;gBAC5B,QAAQ,EAAE,SAAS,CAAC,QAAQ;gBAC5B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACvB,QAAQ,EAAE,CAAC,CAAC,YAAY;oBACxB,WAAW,EAAE,CAAC,CAAC,WAAW;oBAC1B,SAAS,EAAE,CAAC,CAAC,SAAS;oBACtB,MAAM,EAAE,CAAC,CAAC,SAAS;oBACnB,MAAM,EAAE,CAAC,CAAC,aAAa;oBACvB,MAAM,EAAE,CAAC,CAAC,aAAa;iBACxB,CAAC,CAAC;aACJ,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,+DAA+D;IAC/D,oBAAoB;IACpB,+DAA+D;IAC/D,QAAQ;SACL,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,UAAU,CAAC;SACvB,cAAc,CAAC,gBAAgB,EAAE,QAAQ,CAAC;SAC1C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClD,KAAK,CAAC,WAAW,CAAC,CAAC;gBACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;YAE3B,sCAAsC;YACtC,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAClD,MAAM,CAAC,QAAQ,CAAC,CAAC;QACnB,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * 做市工具命令组 - 真实交易执行
3
+ *
4
+ * forgex tools turnover | volume | robot-price
5
+ *
6
+ * Phase 3 升级:
7
+ * - 使用 DataSource 门面代替直接 sdk-adapter 余额查询
8
+ * - 集成 TxTracker 自动追踪交易结果
9
+ * - 添加 ensurePasswordAndValidate 密码验证
10
+ * - 添加 suppressConsole/restoreConsole 防止 JSON 输出污染
11
+ * - 完善输入参数验证
12
+ * - 完善 --daemon 模式支持
13
+ * - 修复 slippage bps -> 百分比转换
14
+ */
15
+ import { Command } from 'commander';
16
+ export declare function registerToolsCommands(program: Command): void;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmEpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8mB5D"}