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,91 @@
1
+ /**
2
+ * 配置管理命令组
3
+ *
4
+ * forgex config init | set | get | list
5
+ */
6
+ import { initConfig, loadConfig, setConfigValue, getConfigValue, CONFIG_FILE, } from '../../config.js';
7
+ import { output, success, error } from '../../output.js';
8
+ export function registerConfigCommands(program) {
9
+ const configCmd = program
10
+ .command('config')
11
+ .description('配置管理');
12
+ // forgex config init
13
+ configCmd
14
+ .command('init')
15
+ .description('初始化配置文件')
16
+ .option('--rpc-url <url>', 'Solana RPC 节点 URL')
17
+ .option('--codex-api-key <key>', 'Codex API Key')
18
+ .option('--network <network>', '网络类型: mainnet | devnet | testnet')
19
+ .action((options) => {
20
+ try {
21
+ const overrides = {};
22
+ if (options.rpcUrl)
23
+ overrides.rpcUrl = options.rpcUrl;
24
+ if (options.codexApiKey)
25
+ overrides.codexApiKey = options.codexApiKey;
26
+ if (options.network)
27
+ overrides.network = options.network;
28
+ const config = initConfig(overrides);
29
+ output({ success: true, configFile: CONFIG_FILE, config });
30
+ success(`配置文件已创建: ${CONFIG_FILE}`);
31
+ }
32
+ catch (e) {
33
+ error('初始化配置失败', e.message);
34
+ process.exit(1);
35
+ }
36
+ });
37
+ // forgex config set <key> <value>
38
+ configCmd
39
+ .command('set <key> <value>')
40
+ .description('设置配置项')
41
+ .action((key, value) => {
42
+ try {
43
+ setConfigValue(key, value);
44
+ output({ success: true, key, value: getConfigValue(key) });
45
+ success(`配置已更新: ${key} = ${value}`);
46
+ }
47
+ catch (e) {
48
+ error('设置配置失败', e.message);
49
+ process.exit(1);
50
+ }
51
+ });
52
+ // forgex config get [key]
53
+ configCmd
54
+ .command('get [key]')
55
+ .description('查看配置项')
56
+ .action((key) => {
57
+ try {
58
+ if (key) {
59
+ const value = getConfigValue(key);
60
+ if (value === undefined) {
61
+ error(`配置项不存在: ${key}`);
62
+ process.exit(1);
63
+ }
64
+ output({ key, value });
65
+ }
66
+ else {
67
+ const config = loadConfig();
68
+ output(config);
69
+ }
70
+ }
71
+ catch (e) {
72
+ error('读取配置失败', e.message);
73
+ process.exit(1);
74
+ }
75
+ });
76
+ // forgex config list
77
+ configCmd
78
+ .command('list')
79
+ .description('列出所有配置')
80
+ .action(() => {
81
+ try {
82
+ const config = loadConfig();
83
+ output(config);
84
+ }
85
+ catch (e) {
86
+ error('读取配置失败', e.message);
87
+ process.exit(1);
88
+ }
89
+ });
90
+ }
91
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/config/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 查询命令组
3
+ *
4
+ * forgex query balance | price | kline | transactions | monitor
5
+ *
6
+ * 数据源: DataSource 统一门面 (3.0g 迁移)
7
+ */
8
+ import { Command } from 'commander';
9
+ export declare function registerQueryCommands(program: Command): void;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/query/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6BpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyX5D"}
@@ -0,0 +1,376 @@
1
+ /**
2
+ * 查询命令组
3
+ *
4
+ * forgex query balance | price | kline | transactions | monitor
5
+ *
6
+ * 数据源: DataSource 统一门面 (3.0g 迁移)
7
+ */
8
+ import { PublicKey } from '@solana/web3.js';
9
+ import { getDataSource } from '../../data-source.js';
10
+ import { output, error, warn } from '../../output.js';
11
+ // ============================================================
12
+ // 输入验证辅助函数
13
+ // ============================================================
14
+ /** 验证 Solana 公钥地址格式 */
15
+ function validatePublicKey(address, label) {
16
+ try {
17
+ new PublicKey(address);
18
+ }
19
+ catch {
20
+ error(`无效的${label}格式: ${address}`);
21
+ process.exit(1);
22
+ }
23
+ }
24
+ /** 验证正整数 */
25
+ function validatePositiveInt(value, label) {
26
+ const num = Number(value);
27
+ if (!Number.isInteger(num) || num <= 0) {
28
+ error(`${label} 必须是正整数,收到: ${value}`);
29
+ process.exit(1);
30
+ }
31
+ return num;
32
+ }
33
+ export function registerQueryCommands(program) {
34
+ const queryCmd = program
35
+ .command('query')
36
+ .description('查询操作');
37
+ // ============================================================
38
+ // forgex query balance
39
+ // ============================================================
40
+ queryCmd
41
+ .command('balance')
42
+ .description('查询钱包余额')
43
+ .requiredOption('--address <addr>', '钱包地址')
44
+ .option('--token <ca>', '代币合约地址(不填则查 SOL)')
45
+ .action(async (options) => {
46
+ try {
47
+ // P1 fix #5: 验证 --address 是有效 Solana 公钥
48
+ validatePublicKey(options.address, '钱包地址');
49
+ // P1 fix #6: 验证 --token 地址(当提供时)
50
+ if (options.token) {
51
+ validatePublicKey(options.token, '代币合约地址');
52
+ }
53
+ const ds = getDataSource();
54
+ if (!options.token) {
55
+ // 查询 SOL 余额 -- 通过 DataSource -> RpcAdapter
56
+ const balance = await ds.getSolBalance(options.address);
57
+ output({
58
+ address: options.address,
59
+ token: 'SOL',
60
+ balance,
61
+ lamports: Math.round(balance * 1e9),
62
+ });
63
+ }
64
+ else {
65
+ // 查询代币余额 -- 通过 DataSource -> RpcAdapter
66
+ const tokenBalance = await ds.getTokenBalance(options.address, options.token);
67
+ // 尝试获取代币符号信息
68
+ let symbol;
69
+ let decimals;
70
+ try {
71
+ const tokenInfo = await ds.getTokenInfo(options.token);
72
+ symbol = tokenInfo.symbol;
73
+ decimals = tokenInfo.decimals;
74
+ }
75
+ catch {
76
+ // 代币信息获取失败不影响余额显示
77
+ }
78
+ if (tokenBalance > 0) {
79
+ output({
80
+ address: options.address,
81
+ token: options.token,
82
+ symbol,
83
+ balance: tokenBalance,
84
+ decimals,
85
+ });
86
+ }
87
+ else {
88
+ output({
89
+ address: options.address,
90
+ token: options.token,
91
+ balance: 0,
92
+ message: '未持有该代币',
93
+ });
94
+ }
95
+ }
96
+ }
97
+ catch (e) {
98
+ error('查询余额失败', e.message);
99
+ process.exit(1);
100
+ }
101
+ });
102
+ // ============================================================
103
+ // forgex query price
104
+ // ============================================================
105
+ queryCmd
106
+ .command('price')
107
+ .description('查询代币价格')
108
+ .requiredOption('--token <ca>', '代币合约地址')
109
+ .action(async (options) => {
110
+ try {
111
+ // P2 fix: 验证 --token 是有效 Solana 公钥
112
+ validatePublicKey(options.token, '代币合约地址');
113
+ const ds = getDataSource();
114
+ // 并行获取代币信息和价格 -- 通过 DataSource -> CodexAdapter
115
+ const [tokenInfo, priceData, pairsData] = await Promise.all([
116
+ ds.getTokenInfo(options.token),
117
+ ds.getTokenPrice(options.token),
118
+ ds.getPairsForToken(options.token, 5).catch(() => []),
119
+ ]);
120
+ // 格式化交易对信息
121
+ const formattedPairs = pairsData.map((p) => ({
122
+ exchange: p.exchangeName,
123
+ pairAddress: p.pairAddress,
124
+ liquidity: p.liquidity,
125
+ volume: p.volume24h,
126
+ }));
127
+ output({
128
+ token: options.token,
129
+ symbol: tokenInfo.symbol,
130
+ name: tokenInfo.name,
131
+ priceSol: priceData.priceSol,
132
+ priceUsd: priceData.priceUsd,
133
+ pairs: formattedPairs,
134
+ });
135
+ }
136
+ catch (e) {
137
+ error('查询价格失败', e.message);
138
+ process.exit(1);
139
+ }
140
+ });
141
+ // ============================================================
142
+ // forgex query kline
143
+ // ============================================================
144
+ queryCmd
145
+ .command('kline')
146
+ .description('查询 K 线数据')
147
+ .requiredOption('--token <ca>', '代币合约地址')
148
+ .option('--interval <interval>', '周期: 1m | 5m | 15m | 1h | 4h | 1d', '1h')
149
+ .option('--count <n>', '数据条数', '100')
150
+ .action(async (options) => {
151
+ try {
152
+ // P2 fix: 验证 --token 是有效 Solana 公钥
153
+ validatePublicKey(options.token, '代币合约地址');
154
+ // P1 fix #1: 验证 --interval 必须是有效值
155
+ const validIntervals = ['1m', '5m', '15m', '1h', '4h', '1d'];
156
+ if (!validIntervals.includes(options.interval)) {
157
+ error(`--interval 必须是以下之一: ${validIntervals.join(', ')},收到: ${options.interval}`);
158
+ process.exit(1);
159
+ }
160
+ // P1 fix #2: 验证 --count 是正整数,非 NaN
161
+ const count = Number(options.count);
162
+ if (!Number.isInteger(count) || count <= 0) {
163
+ error(`--count 必须是正整数,收到: ${options.count}`);
164
+ process.exit(1);
165
+ }
166
+ const ds = getDataSource();
167
+ const now = Math.floor(Date.now() / 1000);
168
+ const intervalSeconds = {
169
+ '1m': 60,
170
+ '5m': 300,
171
+ '15m': 900,
172
+ '1h': 3600,
173
+ '4h': 14400,
174
+ '1d': 86400,
175
+ };
176
+ // Codex API 使用不同的 resolution 格式
177
+ const resolutionMap = {
178
+ '1m': '1',
179
+ '5m': '5',
180
+ '15m': '15',
181
+ '1h': '60',
182
+ '4h': '240',
183
+ '1d': '1D',
184
+ };
185
+ const seconds = intervalSeconds[options.interval];
186
+ const from = now - seconds * count;
187
+ const codexResolution = resolutionMap[options.interval] || '60';
188
+ // 先获取代币的 pairAddress 用于 K线查询
189
+ let pairAddress;
190
+ try {
191
+ const tokenInfo = await ds.getTokenInfo(options.token);
192
+ pairAddress = tokenInfo.pairAddress;
193
+ }
194
+ catch {
195
+ // 如果获取不到 pairAddress,使用 token 地址
196
+ }
197
+ // 通过 DataSource -> CodexAdapter 获取 K线数据
198
+ const klineData = await ds.getKlineData({
199
+ tokenAddress: options.token,
200
+ pairAddress: pairAddress || undefined,
201
+ resolution: codexResolution,
202
+ from,
203
+ to: now,
204
+ countback: count,
205
+ });
206
+ output(klineData);
207
+ }
208
+ catch (e) {
209
+ error('查询 K 线数据失败', e.message);
210
+ process.exit(1);
211
+ }
212
+ });
213
+ // ============================================================
214
+ // forgex query transactions
215
+ // ============================================================
216
+ queryCmd
217
+ .command('transactions')
218
+ .description('查询交易记录')
219
+ .requiredOption('--group <id>', '钱包组 ID')
220
+ .option('--token <ca>', '按代币过滤')
221
+ .option('--page <n>', '页码', '1')
222
+ .option('--page-size <n>', '每页数量', '20')
223
+ .action(async (options) => {
224
+ try {
225
+ // P1 fix #3: 验证 --group, --page, --page-size 是有效正整数
226
+ const groupId = validatePositiveInt(options.group, '--group');
227
+ const page = validatePositiveInt(options.page, '--page');
228
+ const pageSize = validatePositiveInt(options.pageSize, '--page-size');
229
+ const ds = getDataSource();
230
+ if (options.token) {
231
+ // 按代币过滤: 从 DataStore 读取本地交易记录
232
+ validatePublicKey(options.token, '代币合约地址');
233
+ const txFile = ds.getTransactions(options.token, groupId);
234
+ const allTxs = txFile?.transactions || [];
235
+ // 手动分页
236
+ const start = (page - 1) * pageSize;
237
+ const pagedTxs = allTxs.slice(start, start + pageSize);
238
+ if (pagedTxs.length === 0) {
239
+ warn('暂无交易记录');
240
+ }
241
+ output(pagedTxs, {
242
+ columns: [
243
+ { key: 'txHash', header: '交易哈希' },
244
+ { key: 'txType', header: '类型' },
245
+ { key: 'walletAddress', header: '钱包' },
246
+ { key: 'amountSol', header: 'SOL 数量' },
247
+ { key: 'amountToken', header: 'Token 数量' },
248
+ { key: 'blockTime', header: '时间' },
249
+ ],
250
+ });
251
+ }
252
+ else {
253
+ // 无代币过滤: 汇总所有代币的交易记录
254
+ const allTokens = ds.listTokens();
255
+ const allTxs = [];
256
+ for (const ca of allTokens) {
257
+ const txFile = ds.getTransactions(ca, groupId);
258
+ if (txFile?.transactions) {
259
+ allTxs.push(...txFile.transactions);
260
+ }
261
+ }
262
+ // 按时间倒序排列
263
+ allTxs.sort((a, b) => (b.blockTime || 0) - (a.blockTime || 0));
264
+ // 手动分页
265
+ const start = (page - 1) * pageSize;
266
+ const pagedTxs = allTxs.slice(start, start + pageSize);
267
+ if (pagedTxs.length === 0) {
268
+ warn('暂无交易记录');
269
+ }
270
+ output(pagedTxs, {
271
+ columns: [
272
+ { key: 'txHash', header: '交易哈希' },
273
+ { key: 'txType', header: '类型' },
274
+ { key: 'walletAddress', header: '钱包' },
275
+ { key: 'amountSol', header: 'SOL 数量' },
276
+ { key: 'amountToken', header: 'Token 数量' },
277
+ { key: 'blockTime', header: '时间' },
278
+ ],
279
+ });
280
+ }
281
+ }
282
+ catch (e) {
283
+ error('查询交易记录失败', e.message);
284
+ process.exit(1);
285
+ }
286
+ });
287
+ // ============================================================
288
+ // forgex query monitor
289
+ // ============================================================
290
+ queryCmd
291
+ .command('monitor')
292
+ .description('查询监控数据')
293
+ .requiredOption('--group <id>', '钱包组 ID')
294
+ .option('--token <ca>', '代币合约地址')
295
+ .action(async (options) => {
296
+ try {
297
+ // P1 fix #4: 验证 --group 是有效正整数
298
+ const groupId = validatePositiveInt(options.group, '--group');
299
+ // P2 fix: 验证 --token 地址(当提供时)
300
+ if (options.token) {
301
+ validatePublicKey(options.token, '代币合约地址');
302
+ }
303
+ const ds = getDataSource();
304
+ if (options.token) {
305
+ // 指定代币: 从 DataStore 读取持仓 + 获取实时价格
306
+ const [holdings, priceData] = await Promise.all([
307
+ Promise.resolve(ds.getHoldings(options.token, groupId)),
308
+ ds.getTokenPrice(options.token).catch(() => ({ priceSol: 0, priceUsd: 0 })),
309
+ ]);
310
+ const walletHoldings = holdings?.wallets || [];
311
+ // 计算未实现盈亏
312
+ const enrichedHoldings = walletHoldings.map((w) => ({
313
+ walletAddress: w.walletAddress,
314
+ tokenBalance: w.tokenBalance,
315
+ avgBuyPrice: w.avgBuyPrice,
316
+ totalCostSol: w.totalCostSol,
317
+ totalRevenueSol: w.totalRevenueSol,
318
+ realizedPnl: w.realizedPnl,
319
+ unrealizedPnl: w.tokenBalance * priceData.priceSol - w.tokenBalance * w.avgBuyPrice,
320
+ currentPriceSol: priceData.priceSol,
321
+ currentPriceUsd: priceData.priceUsd,
322
+ }));
323
+ output({
324
+ groupId,
325
+ token: options.token,
326
+ priceSol: priceData.priceSol,
327
+ priceUsd: priceData.priceUsd,
328
+ wallets: enrichedHoldings,
329
+ totalRealizedPnl: enrichedHoldings.reduce((sum, w) => sum + w.realizedPnl, 0),
330
+ totalUnrealizedPnl: enrichedHoldings.reduce((sum, w) => sum + w.unrealizedPnl, 0),
331
+ });
332
+ }
333
+ else {
334
+ // 无指定代币: 汇总所有代币的持仓数据
335
+ const allTokens = ds.listTokens();
336
+ const tokenSummaries = [];
337
+ for (const ca of allTokens) {
338
+ const holdings = ds.getHoldings(ca, groupId);
339
+ if (!holdings || holdings.wallets.length === 0)
340
+ continue;
341
+ let priceData = { priceSol: 0, priceUsd: 0 };
342
+ try {
343
+ priceData = await ds.getTokenPrice(ca);
344
+ }
345
+ catch {
346
+ // 价格获取失败,使用默认值
347
+ }
348
+ const totalTokenBalance = holdings.wallets.reduce((sum, w) => sum + w.tokenBalance, 0);
349
+ const totalRealizedPnl = holdings.wallets.reduce((sum, w) => sum + w.realizedPnl, 0);
350
+ const totalUnrealizedPnl = holdings.wallets.reduce((sum, w) => sum + (w.tokenBalance * priceData.priceSol - w.tokenBalance * w.avgBuyPrice), 0);
351
+ tokenSummaries.push({
352
+ token: ca,
353
+ priceSol: priceData.priceSol,
354
+ priceUsd: priceData.priceUsd,
355
+ totalTokenBalance,
356
+ walletCount: holdings.wallets.length,
357
+ totalRealizedPnl,
358
+ totalUnrealizedPnl,
359
+ });
360
+ }
361
+ if (tokenSummaries.length === 0) {
362
+ warn('暂无持仓数据');
363
+ }
364
+ output({
365
+ groupId,
366
+ tokens: tokenSummaries,
367
+ });
368
+ }
369
+ }
370
+ catch (e) {
371
+ error('查询监控数据失败', e.message);
372
+ process.exit(1);
373
+ }
374
+ });
375
+ }
376
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/query/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
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 { Command } from 'commander';
15
+ export declare function registerSniperCommands(program: Command): void;
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/sniper/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2DpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmQ7D"}