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,524 @@
1
+ /**
2
+ * ForgeX CLI Codex API 数据源适配器
3
+ *
4
+ * 通过 Codex GraphQL API 获取代币信息、价格、K线等市场数据,
5
+ * 替代原有对 forgex.online/api 的依赖。
6
+ *
7
+ * Codex API 文档: https://docs.codex.io
8
+ * GraphQL 端点: https://graph.codex.io/graphql
9
+ *
10
+ * 设计参考: ARCH-DESIGN-v2.md Section 2.3
11
+ */
12
+ import axios, { AxiosError } from 'axios';
13
+ import { loadConfig } from '../config.js';
14
+ // ============================================================
15
+ // 常量
16
+ // ============================================================
17
+ /** Codex GraphQL 端点 */
18
+ const CODEX_GRAPHQL_URL = 'https://graph.codex.io/graphql';
19
+ /** Solana 在 Codex 中的 networkId */
20
+ const SOLANA_NETWORK_ID = 1399811149;
21
+ /** SOL 原生代币 Wrapped 地址 (Codex 不支持原生代币直接查询, 需使用 Wrapped SOL) */
22
+ const WRAPPED_SOL_MINT = 'So11111111111111111111111111111111111111112';
23
+ /** 默认重试次数 */
24
+ const DEFAULT_MAX_RETRIES = 3;
25
+ /** 初始重试延迟 (ms) */
26
+ const INITIAL_RETRY_DELAY_MS = 500;
27
+ /** getTokenPrices 每次最大批量 */
28
+ const TOKEN_PRICES_BATCH_SIZE = 25;
29
+ /** 默认缓存 TTL (ms) -- 价格等实时数据 30 秒 */
30
+ const PRICE_CACHE_TTL_MS = 30_000;
31
+ /** 代币信息缓存 TTL (ms) -- 10 分钟 */
32
+ const TOKEN_INFO_CACHE_TTL_MS = 600_000;
33
+ // ============================================================
34
+ // GraphQL 查询
35
+ // ============================================================
36
+ const GQL_GET_TOKEN_PRICES = `
37
+ query GetTokenPrices($inputs: [GetPriceInput!]!) {
38
+ getTokenPrices(inputs: $inputs) {
39
+ address
40
+ networkId
41
+ priceUsd
42
+ timestamp
43
+ }
44
+ }
45
+ `;
46
+ const GQL_FILTER_TOKENS = `
47
+ query FilterTokens($tokens: [String!], $networkFilter: [Int!], $limit: Int) {
48
+ filterTokens(
49
+ tokens: $tokens
50
+ filters: { network: $networkFilter }
51
+ limit: $limit
52
+ ) {
53
+ results {
54
+ token {
55
+ address
56
+ symbol
57
+ name
58
+ decimals
59
+ totalSupply
60
+ info {
61
+ imageThumbUrl
62
+ }
63
+ }
64
+ priceUSD
65
+ liquidity
66
+ marketCap
67
+ holders
68
+ buyCount24
69
+ sellCount24
70
+ txnCount24
71
+ volume24
72
+ change24
73
+ createdAt
74
+ pair {
75
+ address
76
+ }
77
+ }
78
+ }
79
+ }
80
+ `;
81
+ const GQL_GET_BARS = `
82
+ query GetBars($symbol: String!, $from: Int!, $to: Int!, $resolution: String!, $countback: Int) {
83
+ getBars(
84
+ symbol: $symbol
85
+ from: $from
86
+ to: $to
87
+ resolution: $resolution
88
+ countback: $countback
89
+ ) {
90
+ t
91
+ o
92
+ h
93
+ l
94
+ c
95
+ v
96
+ }
97
+ }
98
+ `;
99
+ const GQL_FILTER_PAIRS = `
100
+ query FilterPairs($phrase: String, $networkFilter: [Int!], $limit: Int) {
101
+ filterPairs(
102
+ phrase: $phrase
103
+ filters: { network: $networkFilter }
104
+ limit: $limit
105
+ rankings: { attribute: liquidity, direction: DESC }
106
+ ) {
107
+ results {
108
+ pair {
109
+ address
110
+ token0
111
+ token1
112
+ createdAt
113
+ }
114
+ exchange {
115
+ name
116
+ }
117
+ liquidity
118
+ price
119
+ volume24
120
+ txnCount24
121
+ }
122
+ }
123
+ }
124
+ `;
125
+ // ============================================================
126
+ // CodexAdapter 实现
127
+ // ============================================================
128
+ export class CodexAdapter {
129
+ client;
130
+ maxRetries;
131
+ priceCache;
132
+ tokenInfoCache;
133
+ constructor(config) {
134
+ const cliConfig = loadConfig();
135
+ const apiKey = config?.apiKey || cliConfig.codexApiKey;
136
+ const baseUrl = config?.baseUrl || CODEX_GRAPHQL_URL;
137
+ this.maxRetries = config?.maxRetries ?? DEFAULT_MAX_RETRIES;
138
+ if (!apiKey) {
139
+ throw new Error('缺少 Codex API Key,请运行: forgex config set codexApiKey <your-key>\n' +
140
+ '或设置环境变量: export FORGEX_CODEX_API_KEY=<your-key>\n' +
141
+ '获取 API Key: https://www.codex.io');
142
+ }
143
+ this.client = axios.create({
144
+ baseURL: baseUrl,
145
+ timeout: 30_000,
146
+ headers: {
147
+ 'Content-Type': 'application/json',
148
+ 'Authorization': apiKey,
149
+ },
150
+ });
151
+ this.priceCache = new Map();
152
+ this.tokenInfoCache = new Map();
153
+ }
154
+ // ============================================================
155
+ // 重试和错误处理
156
+ // ============================================================
157
+ /**
158
+ * 带指数退避重试的 GraphQL 请求执行器
159
+ */
160
+ async executeQuery(query, variables, operationName) {
161
+ let lastError = null;
162
+ for (let attempt = 0; attempt < this.maxRetries; attempt++) {
163
+ try {
164
+ const response = await this.client.post('', { query, variables });
165
+ // GraphQL 层面的错误
166
+ if (response.data?.errors && response.data.errors.length > 0) {
167
+ const gqlErrors = response.data.errors;
168
+ const messages = gqlErrors.map((e) => e.message).join('; ');
169
+ throw new Error(`Codex GraphQL error [${operationName}]: ${messages}`);
170
+ }
171
+ return response.data?.data;
172
+ }
173
+ catch (err) {
174
+ lastError = err;
175
+ if (!this.isRetryableError(err)) {
176
+ throw err;
177
+ }
178
+ // 指数退避等待
179
+ if (attempt < this.maxRetries - 1) {
180
+ const delay = INITIAL_RETRY_DELAY_MS * Math.pow(2, attempt);
181
+ await sleep(delay);
182
+ }
183
+ }
184
+ }
185
+ throw lastError || new Error(`${operationName}: 所有重试均失败`);
186
+ }
187
+ /** 判断错误是否可重试 */
188
+ isRetryableError(err) {
189
+ // GraphQL 业务错误不重试
190
+ if (err.message?.includes('Codex GraphQL error')) {
191
+ return false;
192
+ }
193
+ // axios 错误
194
+ if (err instanceof AxiosError) {
195
+ const status = err.response?.status;
196
+ // 429 (rate limit), 502, 503, 504 可重试
197
+ if (status && [429, 502, 503, 504].includes(status)) {
198
+ return true;
199
+ }
200
+ // 网络错误
201
+ if (!err.response && err.code) {
202
+ return ['ECONNREFUSED', 'ECONNRESET', 'ETIMEDOUT', 'ENOTFOUND'].includes(err.code);
203
+ }
204
+ }
205
+ const message = (err?.message || '').toLowerCase();
206
+ if (message.includes('timeout') || message.includes('rate limit') || message.includes('too many requests')) {
207
+ return true;
208
+ }
209
+ return false;
210
+ }
211
+ // ============================================================
212
+ // 缓存管理
213
+ // ============================================================
214
+ /** 获取缓存值 (未过期则返回数据, 否则返回 null) */
215
+ getCached(cache, key) {
216
+ const entry = cache.get(key);
217
+ if (!entry)
218
+ return null;
219
+ if (Date.now() > entry.expiresAt) {
220
+ cache.delete(key);
221
+ return null;
222
+ }
223
+ return entry.data;
224
+ }
225
+ /** 设置缓存 */
226
+ setCache(cache, key, data, ttlMs) {
227
+ cache.set(key, { data, expiresAt: Date.now() + ttlMs });
228
+ }
229
+ /** 清除所有缓存 */
230
+ clearCache() {
231
+ this.priceCache.clear();
232
+ this.tokenInfoCache.clear();
233
+ }
234
+ // ============================================================
235
+ // 代币信息查询
236
+ // ============================================================
237
+ /**
238
+ * 获取代币详细市场数据 (使用 filterTokens)
239
+ * 包含价格、流动性、市值、持有者、交易量等
240
+ */
241
+ async getTokenMarketData(ca) {
242
+ // 检查缓存
243
+ const cached = this.getCached(this.tokenInfoCache, ca);
244
+ if (cached)
245
+ return cached;
246
+ const data = await this.executeQuery(GQL_FILTER_TOKENS, {
247
+ tokens: [ca],
248
+ networkFilter: [SOLANA_NETWORK_ID],
249
+ limit: 1,
250
+ }, 'getTokenMarketData');
251
+ const results = data.filterTokens?.results;
252
+ if (!results || results.length === 0) {
253
+ throw new Error(`代币 ${ca} 未找到 (Codex 上无数据)`);
254
+ }
255
+ const r = results[0];
256
+ const tokenData = {
257
+ address: r.token.address,
258
+ symbol: r.token.symbol || 'UNKNOWN',
259
+ name: r.token.name || 'Unknown Token',
260
+ decimals: r.token.decimals ?? 9,
261
+ priceUsd: parseFloat(r.priceUSD || '0'),
262
+ volume24h: parseFloat(r.volume24 || '0'),
263
+ priceChange24h: parseFloat(r.change24 || '0'),
264
+ liquidity: parseFloat(r.liquidity || '0'),
265
+ marketCap: parseFloat(r.marketCap || '0'),
266
+ holders: r.holders ?? 0,
267
+ buyCount24h: r.buyCount24 ?? 0,
268
+ sellCount24h: r.sellCount24 ?? 0,
269
+ txnCount24h: r.txnCount24 ?? 0,
270
+ topPairAddress: r.pair?.address || null,
271
+ createdAt: r.createdAt ?? null,
272
+ };
273
+ // 缓存
274
+ this.setCache(this.tokenInfoCache, ca, tokenData, TOKEN_INFO_CACHE_TTL_MS);
275
+ return tokenData;
276
+ }
277
+ /**
278
+ * 获取代币基本信息 (精简版, 从 filterTokens 提取)
279
+ */
280
+ async getTokenInfo(ca) {
281
+ const marketData = await this.getTokenMarketData(ca);
282
+ return {
283
+ address: marketData.address,
284
+ symbol: marketData.symbol,
285
+ name: marketData.name,
286
+ decimals: marketData.decimals,
287
+ totalSupply: '0', // filterTokens 返回的 totalSupply 可能不准, 链上查询更可靠
288
+ imageUrl: null,
289
+ createdAt: marketData.createdAt,
290
+ networkId: SOLANA_NETWORK_ID,
291
+ };
292
+ }
293
+ // ============================================================
294
+ // 价格查询
295
+ // ============================================================
296
+ /**
297
+ * 获取单个代币的实时价格 (USD)
298
+ */
299
+ async getTokenPrice(ca) {
300
+ // 检查缓存
301
+ const cached = this.getCached(this.priceCache, ca);
302
+ if (cached)
303
+ return cached;
304
+ const data = await this.executeQuery(GQL_GET_TOKEN_PRICES, {
305
+ inputs: [{ address: ca, networkId: SOLANA_NETWORK_ID }],
306
+ }, 'getTokenPrice');
307
+ const prices = data.getTokenPrices;
308
+ if (!prices || prices.length === 0) {
309
+ throw new Error(`代币 ${ca} 价格未找到`);
310
+ }
311
+ const price = {
312
+ address: prices[0].address,
313
+ networkId: prices[0].networkId,
314
+ priceUsd: prices[0].priceUsd ?? 0,
315
+ timestamp: prices[0].timestamp ?? null,
316
+ };
317
+ // 缓存
318
+ this.setCache(this.priceCache, ca, price, PRICE_CACHE_TTL_MS);
319
+ return price;
320
+ }
321
+ /**
322
+ * 批量获取代币价格
323
+ * Codex 限制每次最多 25 个输入
324
+ */
325
+ async getTokenPrices(addresses) {
326
+ if (addresses.length === 0)
327
+ return [];
328
+ const allPrices = [];
329
+ // 分批查询
330
+ for (let i = 0; i < addresses.length; i += TOKEN_PRICES_BATCH_SIZE) {
331
+ const batch = addresses.slice(i, i + TOKEN_PRICES_BATCH_SIZE);
332
+ const inputs = batch.map(address => ({
333
+ address,
334
+ networkId: SOLANA_NETWORK_ID,
335
+ }));
336
+ const data = await this.executeQuery(GQL_GET_TOKEN_PRICES, { inputs }, 'getTokenPrices');
337
+ if (data.getTokenPrices) {
338
+ for (const p of data.getTokenPrices) {
339
+ const price = {
340
+ address: p.address,
341
+ networkId: p.networkId,
342
+ priceUsd: p.priceUsd ?? 0,
343
+ timestamp: p.timestamp ?? null,
344
+ };
345
+ allPrices.push(price);
346
+ // 缓存每个价格
347
+ this.setCache(this.priceCache, p.address, price, PRICE_CACHE_TTL_MS);
348
+ }
349
+ }
350
+ }
351
+ return allPrices;
352
+ }
353
+ /**
354
+ * 获取 SOL 价格 (USD)
355
+ * 使用 Wrapped SOL 地址查询
356
+ */
357
+ async getSolPrice() {
358
+ const price = await this.getTokenPrice(WRAPPED_SOL_MINT);
359
+ return price.priceUsd;
360
+ }
361
+ // ============================================================
362
+ // K线数据
363
+ // ============================================================
364
+ /**
365
+ * 获取 K线 (OHLCV) 数据
366
+ *
367
+ * getBars 的 symbol 格式: tokenAddress:pairAddress (如无 pairAddress 则用默认交易对)
368
+ */
369
+ async getBars(params) {
370
+ // 构建 symbol: Codex getBars 需要 "tokenAddress:networkId" 或 "pairAddress:networkId" 格式
371
+ const symbolBase = params.pairAddress || params.tokenAddress;
372
+ const symbol = `${symbolBase}:${SOLANA_NETWORK_ID}`;
373
+ const data = await this.executeQuery(GQL_GET_BARS, {
374
+ symbol,
375
+ from: params.from,
376
+ to: params.to,
377
+ resolution: params.resolution,
378
+ countback: params.countback,
379
+ }, 'getBars');
380
+ if (!data.getBars)
381
+ return [];
382
+ return data.getBars.map(bar => ({
383
+ t: bar.t,
384
+ o: bar.o,
385
+ h: bar.h,
386
+ l: bar.l,
387
+ c: bar.c,
388
+ v: bar.v,
389
+ }));
390
+ }
391
+ // ============================================================
392
+ // 交易对/流动性池查询
393
+ // ============================================================
394
+ /**
395
+ * 查找代币的交易对列表 (按流动性降序排列)
396
+ */
397
+ async getPairsForToken(ca, limit = 10) {
398
+ // filterPairs 的 phrase 支持代币地址搜索
399
+ const data = await this.executeQuery(GQL_FILTER_PAIRS, {
400
+ phrase: `${ca}:${SOLANA_NETWORK_ID}`,
401
+ networkFilter: [SOLANA_NETWORK_ID],
402
+ limit,
403
+ }, 'getPairsForToken');
404
+ const results = data.filterPairs?.results;
405
+ if (!results)
406
+ return [];
407
+ return results.map(r => ({
408
+ pairAddress: r.pair.address,
409
+ exchangeName: r.exchange?.name || 'Unknown',
410
+ liquidity: parseFloat(r.liquidity || '0'),
411
+ token0Address: r.pair.token0,
412
+ token1Address: r.pair.token1,
413
+ priceUsd: parseFloat(r.price || '0'),
414
+ volume24h: parseFloat(r.volume24 || '0'),
415
+ txnCount24h: r.txnCount24 ?? 0,
416
+ createdAt: r.pair.createdAt ?? null,
417
+ }));
418
+ }
419
+ /**
420
+ * 获取代币的顶部 (最高流动性) 交易对
421
+ */
422
+ async getTopPair(ca) {
423
+ const pairs = await this.getPairsForToken(ca, 1);
424
+ return pairs.length > 0 ? pairs[0] : null;
425
+ }
426
+ // ============================================================
427
+ // 便捷组合方法 -- 与 ARCH-DESIGN-v2.md 中接口对齐
428
+ // ============================================================
429
+ /**
430
+ * 获取代币价格 (SOL 和 USD)
431
+ * 同时获取代币的 USD 价格和 SOL 价格
432
+ */
433
+ async getTokenPriceInSolAndUsd(ca) {
434
+ const [tokenPrice, solPrice] = await Promise.all([
435
+ this.getTokenPrice(ca),
436
+ this.getSolPrice(),
437
+ ]);
438
+ const priceUsd = tokenPrice.priceUsd;
439
+ const priceSol = solPrice > 0 ? priceUsd / solPrice : 0;
440
+ return { priceSol, priceUsd };
441
+ }
442
+ /**
443
+ * 获取池信息 (与 ARCH-DESIGN-v2.md PoolInfoFile 格式对齐)
444
+ * 综合 Codex 价格和交易对数据
445
+ */
446
+ async getPoolInfo(ca) {
447
+ const [marketData, solPrice] = await Promise.all([
448
+ this.getTokenMarketData(ca),
449
+ this.getSolPrice(),
450
+ ]);
451
+ const priceUsd = marketData.priceUsd;
452
+ const priceSol = solPrice > 0 ? priceUsd / solPrice : 0;
453
+ // 流动性近似拆分: Codex 返回 USD 总流动性, 粗略按 50/50 估算 SOL 一侧
454
+ const liquidityUsd = marketData.liquidity;
455
+ const liquiditySolSide = solPrice > 0 ? (liquidityUsd / 2) / solPrice : 0;
456
+ const liquidityTokenSide = priceSol > 0 ? (liquidityUsd / 2) / priceUsd : 0;
457
+ return {
458
+ ca,
459
+ pairAddress: marketData.topPairAddress || '',
460
+ dex: 'unknown', // Codex filterTokens 不直接返回 DEX 名, 可通过 getPairsForToken 查
461
+ liquidity: {
462
+ sol: liquiditySolSide,
463
+ token: liquidityTokenSide,
464
+ },
465
+ priceSol,
466
+ priceUsd,
467
+ updatedAt: Date.now(),
468
+ };
469
+ }
470
+ // ============================================================
471
+ // 健康检查
472
+ // ============================================================
473
+ /**
474
+ * 验证 Codex API Key 和连接是否可用
475
+ */
476
+ async healthCheck() {
477
+ try {
478
+ const solPrice = await this.getSolPrice();
479
+ return {
480
+ healthy: true,
481
+ endpoint: CODEX_GRAPHQL_URL,
482
+ solPriceUsd: solPrice,
483
+ };
484
+ }
485
+ catch (err) {
486
+ return {
487
+ healthy: false,
488
+ endpoint: CODEX_GRAPHQL_URL,
489
+ error: err.message,
490
+ };
491
+ }
492
+ }
493
+ }
494
+ // ============================================================
495
+ // 单例管理
496
+ // ============================================================
497
+ let _instance = null;
498
+ /**
499
+ * 获取 CodexAdapter 单例
500
+ * 首次调用时从 config 读取 Codex API Key 创建实例
501
+ */
502
+ export function getCodexAdapter() {
503
+ if (!_instance) {
504
+ _instance = new CodexAdapter();
505
+ }
506
+ return _instance;
507
+ }
508
+ /**
509
+ * 重置单例 (配置变更后重新初始化)
510
+ */
511
+ export function resetCodexAdapter() {
512
+ _instance = null;
513
+ }
514
+ // ============================================================
515
+ // 导出常量 (供其他模块使用)
516
+ // ============================================================
517
+ export { SOLANA_NETWORK_ID, WRAPPED_SOL_MINT };
518
+ // ============================================================
519
+ // 工具函数
520
+ // ============================================================
521
+ function sleep(ms) {
522
+ return new Promise((resolve) => setTimeout(resolve, ms));
523
+ }
524
+ //# sourceMappingURL=codex-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-adapter.js","sourceRoot":"","sources":["../../../src/adapters/codex-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * ForgeX CLI Solana 连接适配器
3
+ *
4
+ * 替代前端的 useConnection hook,提供直接的 Connection 创建。
5
+ */
6
+ import { Connection, Commitment } from '@solana/web3.js';
7
+ /**
8
+ * 获取 Solana Connection
9
+ * 缓存实例,仅在 RPC URL 变化时重建
10
+ */
11
+ export declare function getConnection(commitment?: Commitment): Connection;
12
+ /**
13
+ * 创建新的 Connection(不使用缓存)
14
+ */
15
+ export declare function createConnection(rpcUrl?: string, commitment?: Commitment): Connection;
16
+ /**
17
+ * 重置连接缓存
18
+ */
19
+ export declare function resetConnection(): void;
20
+ //# sourceMappingURL=connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../src/adapters/connection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAMzD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,UAAU,GAAE,UAAwB,GAAG,UAAU,CAc9E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,CAAC,EAAE,MAAM,EACf,UAAU,GAAE,UAAwB,GACnC,UAAU,CAMZ;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAGtC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * ForgeX CLI Solana 连接适配器
3
+ *
4
+ * 替代前端的 useConnection hook,提供直接的 Connection 创建。
5
+ */
6
+ import { Connection } from '@solana/web3.js';
7
+ import { loadConfig } from '../config.js';
8
+ let _connection = null;
9
+ let _currentRpcUrl = '';
10
+ /**
11
+ * 获取 Solana Connection
12
+ * 缓存实例,仅在 RPC URL 变化时重建
13
+ */
14
+ export function getConnection(commitment = 'confirmed') {
15
+ const config = loadConfig();
16
+ const rpcUrl = config.rpcUrl;
17
+ if (!rpcUrl) {
18
+ throw new Error('未配置 RPC URL,请运行: forgex config set rpcUrl <your-rpc-url>');
19
+ }
20
+ if (!_connection || _currentRpcUrl !== rpcUrl) {
21
+ _connection = new Connection(rpcUrl, commitment);
22
+ _currentRpcUrl = rpcUrl;
23
+ }
24
+ return _connection;
25
+ }
26
+ /**
27
+ * 创建新的 Connection(不使用缓存)
28
+ */
29
+ export function createConnection(rpcUrl, commitment = 'confirmed') {
30
+ const url = rpcUrl || loadConfig().rpcUrl;
31
+ if (!url) {
32
+ throw new Error('未配置 RPC URL');
33
+ }
34
+ return new Connection(url, commitment);
35
+ }
36
+ /**
37
+ * 重置连接缓存
38
+ */
39
+ export function resetConnection() {
40
+ _connection = null;
41
+ _currentRpcUrl = '';
42
+ }
43
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../src/adapters/connection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAc,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,IAAI,WAAW,GAAsB,IAAI,CAAC;AAC1C,IAAI,cAAc,GAAG,EAAE,CAAC;AAExB;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,aAAyB,WAAW;IAChE,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAE7B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,CAAC,WAAW,IAAI,cAAc,KAAK,MAAM,EAAE,CAAC;QAC9C,WAAW,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACjD,cAAc,GAAG,MAAM,CAAC;IAC1B,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAe,EACf,aAAyB,WAAW;IAEpC,MAAM,GAAG,GAAG,MAAM,IAAI,UAAU,EAAE,CAAC,MAAM,CAAC;IAC1C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,IAAI,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,WAAW,GAAG,IAAI,CAAC;IACnB,cAAc,GAAG,EAAE,CAAC;AACtB,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * IPFS 上传适配器
3
+ *
4
+ * 直连 pump.fun/api/ipfs 上传代币元数据。
5
+ */
6
+ /**
7
+ * 上传代币元数据到 IPFS (直连 pump.fun/api/ipfs)
8
+ */
9
+ export declare const uploadToIpfs: (filePath: string, metadata?: {
10
+ name: string;
11
+ symbol: string;
12
+ description: string;
13
+ twitter?: string;
14
+ telegram?: string;
15
+ website?: string;
16
+ }) => Promise<any>;
17
+ //# sourceMappingURL=ipfs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipfs.d.ts","sourceRoot":"","sources":["../../../src/adapters/ipfs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH;;GAEG;AACH,eAAO,MAAM,YAAY,GAAU,UAAU,MAAM,EAAE,WAAW;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,iBAkBA,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * IPFS 上传适配器
3
+ *
4
+ * 直连 pump.fun/api/ipfs 上传代币元数据。
5
+ */
6
+ import fs from 'fs';
7
+ import axios from 'axios';
8
+ import FormData from 'form-data';
9
+ /**
10
+ * 上传代币元数据到 IPFS (直连 pump.fun/api/ipfs)
11
+ */
12
+ export const uploadToIpfs = async (filePath, metadata) => {
13
+ const formData = new FormData();
14
+ formData.append('file', fs.createReadStream(filePath));
15
+ if (metadata) {
16
+ formData.append('name', metadata.name);
17
+ formData.append('symbol', metadata.symbol);
18
+ formData.append('description', metadata.description);
19
+ formData.append('twitter', metadata.twitter || '');
20
+ formData.append('telegram', metadata.telegram || '');
21
+ formData.append('website', metadata.website || '');
22
+ formData.append('showName', 'true');
23
+ }
24
+ const response = await axios.post('https://pump.fun/api/ipfs', formData, {
25
+ headers: formData.getHeaders(),
26
+ timeout: 30000,
27
+ });
28
+ return response.data;
29
+ };
30
+ //# sourceMappingURL=ipfs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipfs.js","sourceRoot":"","sources":["../../../src/adapters/ipfs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,WAAW,CAAC;AAEjC;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,QAAgB,EAAE,QAOpD,EAAE,EAAE;IACH,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;IAChC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvD,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QACvC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC3C,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;QACrD,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACnD,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QACrD,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACnD,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,2BAA2B,EAAE,QAAQ,EAAE;QACvE,OAAO,EAAE,QAAQ,CAAC,UAAU,EAAE;QAC9B,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC,IAAI,CAAC;AACvB,CAAC,CAAC"}