@zeroexcore/trader 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 (323) hide show
  1. package/README.md +125 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +28 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/book.d.ts +3 -0
  7. package/dist/commands/book.d.ts.map +1 -0
  8. package/dist/commands/book.js +44 -0
  9. package/dist/commands/book.js.map +1 -0
  10. package/dist/commands/diagnose.d.ts +3 -0
  11. package/dist/commands/diagnose.d.ts.map +1 -0
  12. package/dist/commands/diagnose.js +148 -0
  13. package/dist/commands/diagnose.js.map +1 -0
  14. package/dist/commands/nft/floor.d.ts +3 -0
  15. package/dist/commands/nft/floor.d.ts.map +1 -0
  16. package/dist/commands/nft/floor.js +30 -0
  17. package/dist/commands/nft/floor.js.map +1 -0
  18. package/dist/commands/nft/index.d.ts +3 -0
  19. package/dist/commands/nft/index.d.ts.map +1 -0
  20. package/dist/commands/nft/index.js +14 -0
  21. package/dist/commands/nft/index.js.map +1 -0
  22. package/dist/commands/nft/listings.d.ts +3 -0
  23. package/dist/commands/nft/listings.d.ts.map +1 -0
  24. package/dist/commands/nft/listings.js +37 -0
  25. package/dist/commands/nft/listings.js.map +1 -0
  26. package/dist/commands/nft/popular.d.ts +3 -0
  27. package/dist/commands/nft/popular.d.ts.map +1 -0
  28. package/dist/commands/nft/popular.js +32 -0
  29. package/dist/commands/nft/popular.js.map +1 -0
  30. package/dist/commands/nft/portfolio.d.ts +3 -0
  31. package/dist/commands/nft/portfolio.d.ts.map +1 -0
  32. package/dist/commands/nft/portfolio.js +43 -0
  33. package/dist/commands/nft/portfolio.js.map +1 -0
  34. package/dist/commands/nft/search.d.ts +3 -0
  35. package/dist/commands/nft/search.d.ts.map +1 -0
  36. package/dist/commands/nft/search.js +36 -0
  37. package/dist/commands/nft/search.js.map +1 -0
  38. package/dist/commands/nft.d.ts +3 -0
  39. package/dist/commands/nft.d.ts.map +1 -0
  40. package/dist/commands/nft.js +165 -0
  41. package/dist/commands/nft.js.map +1 -0
  42. package/dist/commands/nfts/floor.d.ts +3 -0
  43. package/dist/commands/nfts/floor.d.ts.map +1 -0
  44. package/dist/commands/nfts/floor.js +30 -0
  45. package/dist/commands/nfts/floor.js.map +1 -0
  46. package/dist/commands/nfts/index.d.ts +3 -0
  47. package/dist/commands/nfts/index.d.ts.map +1 -0
  48. package/dist/commands/nfts/index.js +14 -0
  49. package/dist/commands/nfts/index.js.map +1 -0
  50. package/dist/commands/nfts/listings.d.ts +3 -0
  51. package/dist/commands/nfts/listings.d.ts.map +1 -0
  52. package/dist/commands/nfts/listings.js +37 -0
  53. package/dist/commands/nfts/listings.js.map +1 -0
  54. package/dist/commands/nfts/popular.d.ts +3 -0
  55. package/dist/commands/nfts/popular.d.ts.map +1 -0
  56. package/dist/commands/nfts/popular.js +32 -0
  57. package/dist/commands/nfts/popular.js.map +1 -0
  58. package/dist/commands/nfts/positions.d.ts +3 -0
  59. package/dist/commands/nfts/positions.d.ts.map +1 -0
  60. package/dist/commands/nfts/positions.js +23 -0
  61. package/dist/commands/nfts/positions.js.map +1 -0
  62. package/dist/commands/nfts/search.d.ts +3 -0
  63. package/dist/commands/nfts/search.d.ts.map +1 -0
  64. package/dist/commands/nfts/search.js +36 -0
  65. package/dist/commands/nfts/search.js.map +1 -0
  66. package/dist/commands/perps/index.d.ts +3 -0
  67. package/dist/commands/perps/index.d.ts.map +1 -0
  68. package/dist/commands/perps/index.js +10 -0
  69. package/dist/commands/perps/index.js.map +1 -0
  70. package/dist/commands/perps/info.d.ts +3 -0
  71. package/dist/commands/perps/info.d.ts.map +1 -0
  72. package/dist/commands/perps/info.js +51 -0
  73. package/dist/commands/perps/info.js.map +1 -0
  74. package/dist/commands/perps/markets.d.ts +3 -0
  75. package/dist/commands/perps/markets.d.ts.map +1 -0
  76. package/dist/commands/perps/markets.js +43 -0
  77. package/dist/commands/perps/markets.js.map +1 -0
  78. package/dist/commands/perps/pool.d.ts +3 -0
  79. package/dist/commands/perps/pool.d.ts.map +1 -0
  80. package/dist/commands/perps/pool.js +33 -0
  81. package/dist/commands/perps/pool.js.map +1 -0
  82. package/dist/commands/perps/positions.d.ts +3 -0
  83. package/dist/commands/perps/positions.d.ts.map +1 -0
  84. package/dist/commands/perps/positions.js +68 -0
  85. package/dist/commands/perps/positions.js.map +1 -0
  86. package/dist/commands/perps/show.d.ts +3 -0
  87. package/dist/commands/perps/show.d.ts.map +1 -0
  88. package/dist/commands/perps/show.js +37 -0
  89. package/dist/commands/perps/show.js.map +1 -0
  90. package/dist/commands/perps.d.ts +3 -0
  91. package/dist/commands/perps.d.ts.map +1 -0
  92. package/dist/commands/perps.js +186 -0
  93. package/dist/commands/perps.js.map +1 -0
  94. package/dist/commands/portfolio.d.ts +3 -0
  95. package/dist/commands/portfolio.d.ts.map +1 -0
  96. package/dist/commands/portfolio.js +89 -0
  97. package/dist/commands/portfolio.js.map +1 -0
  98. package/dist/commands/positions/close.d.ts +3 -0
  99. package/dist/commands/positions/close.d.ts.map +1 -0
  100. package/dist/commands/positions/close.js +31 -0
  101. package/dist/commands/positions/close.js.map +1 -0
  102. package/dist/commands/positions/filter.d.ts +3 -0
  103. package/dist/commands/positions/filter.d.ts.map +1 -0
  104. package/dist/commands/positions/filter.js +20 -0
  105. package/dist/commands/positions/filter.js.map +1 -0
  106. package/dist/commands/positions/index.d.ts +3 -0
  107. package/dist/commands/positions/index.d.ts.map +1 -0
  108. package/dist/commands/positions/index.js +22 -0
  109. package/dist/commands/positions/index.js.map +1 -0
  110. package/dist/commands/positions/list.d.ts +3 -0
  111. package/dist/commands/positions/list.d.ts.map +1 -0
  112. package/dist/commands/positions/list.js +38 -0
  113. package/dist/commands/positions/list.js.map +1 -0
  114. package/dist/commands/positions/note.d.ts +3 -0
  115. package/dist/commands/positions/note.d.ts.map +1 -0
  116. package/dist/commands/positions/note.js +19 -0
  117. package/dist/commands/positions/note.js.map +1 -0
  118. package/dist/commands/positions/open.d.ts +3 -0
  119. package/dist/commands/positions/open.d.ts.map +1 -0
  120. package/dist/commands/positions/open.js +47 -0
  121. package/dist/commands/positions/open.js.map +1 -0
  122. package/dist/commands/positions/show.d.ts +3 -0
  123. package/dist/commands/positions/show.d.ts.map +1 -0
  124. package/dist/commands/positions/show.js +46 -0
  125. package/dist/commands/positions/show.js.map +1 -0
  126. package/dist/commands/positions/stats.d.ts +3 -0
  127. package/dist/commands/positions/stats.d.ts.map +1 -0
  128. package/dist/commands/positions/stats.js +27 -0
  129. package/dist/commands/positions/stats.js.map +1 -0
  130. package/dist/commands/positions/tag.d.ts +3 -0
  131. package/dist/commands/positions/tag.d.ts.map +1 -0
  132. package/dist/commands/positions/tag.js +19 -0
  133. package/dist/commands/positions/tag.js.map +1 -0
  134. package/dist/commands/positions/update.d.ts +3 -0
  135. package/dist/commands/positions/update.d.ts.map +1 -0
  136. package/dist/commands/positions/update.js +35 -0
  137. package/dist/commands/positions/update.js.map +1 -0
  138. package/dist/commands/positions.d.ts +3 -0
  139. package/dist/commands/positions.d.ts.map +1 -0
  140. package/dist/commands/positions.js +247 -0
  141. package/dist/commands/positions.js.map +1 -0
  142. package/dist/commands/predict/browse.d.ts +3 -0
  143. package/dist/commands/predict/browse.d.ts.map +1 -0
  144. package/dist/commands/predict/browse.js +46 -0
  145. package/dist/commands/predict/browse.js.map +1 -0
  146. package/dist/commands/predict/buy.d.ts +3 -0
  147. package/dist/commands/predict/buy.d.ts.map +1 -0
  148. package/dist/commands/predict/buy.js +79 -0
  149. package/dist/commands/predict/buy.js.map +1 -0
  150. package/dist/commands/predict/claim.d.ts +3 -0
  151. package/dist/commands/predict/claim.d.ts.map +1 -0
  152. package/dist/commands/predict/claim.js +58 -0
  153. package/dist/commands/predict/claim.js.map +1 -0
  154. package/dist/commands/predict/close.d.ts +3 -0
  155. package/dist/commands/predict/close.d.ts.map +1 -0
  156. package/dist/commands/predict/close.js +56 -0
  157. package/dist/commands/predict/close.js.map +1 -0
  158. package/dist/commands/predict/index.d.ts +3 -0
  159. package/dist/commands/predict/index.d.ts.map +1 -0
  160. package/dist/commands/predict/index.js +20 -0
  161. package/dist/commands/predict/index.js.map +1 -0
  162. package/dist/commands/predict/list.d.ts +3 -0
  163. package/dist/commands/predict/list.d.ts.map +1 -0
  164. package/dist/commands/predict/list.js +46 -0
  165. package/dist/commands/predict/list.js.map +1 -0
  166. package/dist/commands/predict/market.d.ts +3 -0
  167. package/dist/commands/predict/market.d.ts.map +1 -0
  168. package/dist/commands/predict/market.js +37 -0
  169. package/dist/commands/predict/market.js.map +1 -0
  170. package/dist/commands/predict/positions.d.ts +3 -0
  171. package/dist/commands/predict/positions.d.ts.map +1 -0
  172. package/dist/commands/predict/positions.js +71 -0
  173. package/dist/commands/predict/positions.js.map +1 -0
  174. package/dist/commands/predict/search.d.ts +3 -0
  175. package/dist/commands/predict/search.d.ts.map +1 -0
  176. package/dist/commands/predict/search.js +32 -0
  177. package/dist/commands/predict/search.js.map +1 -0
  178. package/dist/commands/predict/sell.d.ts +3 -0
  179. package/dist/commands/predict/sell.d.ts.map +1 -0
  180. package/dist/commands/predict/sell.js +65 -0
  181. package/dist/commands/predict/sell.js.map +1 -0
  182. package/dist/commands/predict/show.d.ts +3 -0
  183. package/dist/commands/predict/show.d.ts.map +1 -0
  184. package/dist/commands/predict/show.js +37 -0
  185. package/dist/commands/predict/show.js.map +1 -0
  186. package/dist/commands/predict/watch.d.ts +3 -0
  187. package/dist/commands/predict/watch.d.ts.map +1 -0
  188. package/dist/commands/predict/watch.js +73 -0
  189. package/dist/commands/predict/watch.js.map +1 -0
  190. package/dist/commands/predict.d.ts +3 -0
  191. package/dist/commands/predict.d.ts.map +1 -0
  192. package/dist/commands/predict.js +484 -0
  193. package/dist/commands/predict.js.map +1 -0
  194. package/dist/commands/shared.d.ts +18 -0
  195. package/dist/commands/shared.d.ts.map +1 -0
  196. package/dist/commands/shared.js +51 -0
  197. package/dist/commands/shared.js.map +1 -0
  198. package/dist/commands/tokens/add.d.ts +3 -0
  199. package/dist/commands/tokens/add.d.ts.map +1 -0
  200. package/dist/commands/tokens/add.js +17 -0
  201. package/dist/commands/tokens/add.js.map +1 -0
  202. package/dist/commands/tokens/browse.d.ts +3 -0
  203. package/dist/commands/tokens/browse.d.ts.map +1 -0
  204. package/dist/commands/tokens/browse.js +19 -0
  205. package/dist/commands/tokens/browse.js.map +1 -0
  206. package/dist/commands/tokens/index.d.ts +3 -0
  207. package/dist/commands/tokens/index.d.ts.map +1 -0
  208. package/dist/commands/tokens/index.js +22 -0
  209. package/dist/commands/tokens/index.js.map +1 -0
  210. package/dist/commands/tokens/info.d.ts +3 -0
  211. package/dist/commands/tokens/info.d.ts.map +1 -0
  212. package/dist/commands/tokens/info.js +13 -0
  213. package/dist/commands/tokens/info.js.map +1 -0
  214. package/dist/commands/tokens/list.d.ts +3 -0
  215. package/dist/commands/tokens/list.d.ts.map +1 -0
  216. package/dist/commands/tokens/list.js +16 -0
  217. package/dist/commands/tokens/list.js.map +1 -0
  218. package/dist/commands/tokens/positions.d.ts +3 -0
  219. package/dist/commands/tokens/positions.d.ts.map +1 -0
  220. package/dist/commands/tokens/positions.js +25 -0
  221. package/dist/commands/tokens/positions.js.map +1 -0
  222. package/dist/commands/tokens/quote.d.ts +3 -0
  223. package/dist/commands/tokens/quote.d.ts.map +1 -0
  224. package/dist/commands/tokens/quote.js +50 -0
  225. package/dist/commands/tokens/quote.js.map +1 -0
  226. package/dist/commands/tokens/remove.d.ts +3 -0
  227. package/dist/commands/tokens/remove.d.ts.map +1 -0
  228. package/dist/commands/tokens/remove.js +17 -0
  229. package/dist/commands/tokens/remove.js.map +1 -0
  230. package/dist/commands/tokens/search.d.ts +3 -0
  231. package/dist/commands/tokens/search.d.ts.map +1 -0
  232. package/dist/commands/tokens/search.js +19 -0
  233. package/dist/commands/tokens/search.js.map +1 -0
  234. package/dist/commands/tokens/swap.d.ts +3 -0
  235. package/dist/commands/tokens/swap.d.ts.map +1 -0
  236. package/dist/commands/tokens/swap.js +88 -0
  237. package/dist/commands/tokens/swap.js.map +1 -0
  238. package/dist/commands/trade/index.d.ts +3 -0
  239. package/dist/commands/trade/index.d.ts.map +1 -0
  240. package/dist/commands/trade/index.js +8 -0
  241. package/dist/commands/trade/index.js.map +1 -0
  242. package/dist/commands/trade/info.d.ts +3 -0
  243. package/dist/commands/trade/info.d.ts.map +1 -0
  244. package/dist/commands/trade/info.js +37 -0
  245. package/dist/commands/trade/info.js.map +1 -0
  246. package/dist/commands/trade/quote.d.ts +3 -0
  247. package/dist/commands/trade/quote.d.ts.map +1 -0
  248. package/dist/commands/trade/quote.js +56 -0
  249. package/dist/commands/trade/quote.js.map +1 -0
  250. package/dist/commands/trade/search.d.ts +3 -0
  251. package/dist/commands/trade/search.d.ts.map +1 -0
  252. package/dist/commands/trade/search.js +22 -0
  253. package/dist/commands/trade/search.js.map +1 -0
  254. package/dist/commands/trade/swap.d.ts +3 -0
  255. package/dist/commands/trade/swap.d.ts.map +1 -0
  256. package/dist/commands/trade/swap.js +70 -0
  257. package/dist/commands/trade/swap.js.map +1 -0
  258. package/dist/commands/trade.d.ts +5 -0
  259. package/dist/commands/trade.d.ts.map +1 -0
  260. package/dist/commands/trade.js +167 -0
  261. package/dist/commands/trade.js.map +1 -0
  262. package/dist/commands/wallet.d.ts +3 -0
  263. package/dist/commands/wallet.d.ts.map +1 -0
  264. package/dist/commands/wallet.js +45 -0
  265. package/dist/commands/wallet.js.map +1 -0
  266. package/dist/config.d.ts +86 -0
  267. package/dist/config.d.ts.map +1 -0
  268. package/dist/config.js +169 -0
  269. package/dist/config.js.map +1 -0
  270. package/dist/utils/amounts.d.ts +40 -0
  271. package/dist/utils/amounts.d.ts.map +1 -0
  272. package/dist/utils/amounts.js +113 -0
  273. package/dist/utils/amounts.js.map +1 -0
  274. package/dist/utils/helius.d.ts +39 -0
  275. package/dist/utils/helius.d.ts.map +1 -0
  276. package/dist/utils/helius.js +253 -0
  277. package/dist/utils/helius.js.map +1 -0
  278. package/dist/utils/jupiter.d.ts +42 -0
  279. package/dist/utils/jupiter.d.ts.map +1 -0
  280. package/dist/utils/jupiter.js +106 -0
  281. package/dist/utils/jupiter.js.map +1 -0
  282. package/dist/utils/nft.d.ts +75 -0
  283. package/dist/utils/nft.d.ts.map +1 -0
  284. package/dist/utils/nft.js +168 -0
  285. package/dist/utils/nft.js.map +1 -0
  286. package/dist/utils/perps/doves-idl.d.ts +380 -0
  287. package/dist/utils/perps/doves-idl.d.ts.map +1 -0
  288. package/dist/utils/perps/doves-idl.js +379 -0
  289. package/dist/utils/perps/doves-idl.js.map +1 -0
  290. package/dist/utils/perps/idl.json +7241 -0
  291. package/dist/utils/perps/index.d.ts +45 -0
  292. package/dist/utils/perps/index.d.ts.map +1 -0
  293. package/dist/utils/perps/index.js +102 -0
  294. package/dist/utils/perps/index.js.map +1 -0
  295. package/dist/utils/perps/jupiter-perpetuals-idl.d.ts +7243 -0
  296. package/dist/utils/perps/jupiter-perpetuals-idl.d.ts.map +1 -0
  297. package/dist/utils/perps/jupiter-perpetuals-idl.js +7242 -0
  298. package/dist/utils/perps/jupiter-perpetuals-idl.js.map +1 -0
  299. package/dist/utils/positions.d.ts +198 -0
  300. package/dist/utils/positions.d.ts.map +1 -0
  301. package/dist/utils/positions.js +595 -0
  302. package/dist/utils/positions.js.map +1 -0
  303. package/dist/utils/prediction.d.ts +196 -0
  304. package/dist/utils/prediction.d.ts.map +1 -0
  305. package/dist/utils/prediction.js +187 -0
  306. package/dist/utils/prediction.js.map +1 -0
  307. package/dist/utils/solana.d.ts +9 -0
  308. package/dist/utils/solana.d.ts.map +1 -0
  309. package/dist/utils/solana.js +45 -0
  310. package/dist/utils/solana.js.map +1 -0
  311. package/dist/utils/token-book.d.ts +9 -0
  312. package/dist/utils/token-book.d.ts.map +1 -0
  313. package/dist/utils/token-book.js +69 -0
  314. package/dist/utils/token-book.js.map +1 -0
  315. package/dist/utils/token-info.d.ts +48 -0
  316. package/dist/utils/token-info.d.ts.map +1 -0
  317. package/dist/utils/token-info.js +332 -0
  318. package/dist/utils/token-info.js.map +1 -0
  319. package/dist/utils/wallet.d.ts +31 -0
  320. package/dist/utils/wallet.d.ts.map +1 -0
  321. package/dist/utils/wallet.js +181 -0
  322. package/dist/utils/wallet.js.map +1 -0
  323. package/package.json +46 -0
@@ -0,0 +1,70 @@
1
+ import { Connection } from '@solana/web3.js';
2
+ import { Command } from 'commander';
3
+ import Big from 'big.js';
4
+ import { getTokenDecimals, toSmallestUnit } from '../../utils/amounts.js';
5
+ import { executeSwap, getSwapQuote } from '../../utils/jupiter.js';
6
+ import { resolveToken } from '../../utils/token-book.js';
7
+ import { loadKeypairForSigning } from '../../utils/wallet.js';
8
+ import { output, error, requirePassword, getRpcUrl } from '../shared.js';
9
+ export const swapCommand = new Command('swap')
10
+ .argument('<input-mint>', 'Input token symbol or address')
11
+ .argument('<output-mint>', 'Output token symbol or address')
12
+ .argument('<amount>', 'Amount in human-readable format')
13
+ .description('Execute swap')
14
+ .option('-s, --slippage <bps>', 'Slippage in basis points', '50')
15
+ .option('--priority-fee <lamports>', 'Priority fee in lamports')
16
+ .action(async (inputMintOrTicker, outputMintOrTicker, amount, options) => {
17
+ const inputMint = resolveToken(inputMintOrTicker);
18
+ const outputMint = resolveToken(outputMintOrTicker);
19
+ const password = requirePassword();
20
+ try {
21
+ const rpcUrl = getRpcUrl();
22
+ const connection = new Connection(rpcUrl, 'confirmed');
23
+ const keypair = loadKeypairForSigning(password);
24
+ const decimals = await getTokenDecimals(inputMint);
25
+ const amountInSmallestUnit = toSmallestUnit(parseFloat(amount), decimals);
26
+ const quote = await getSwapQuote({
27
+ inputMint,
28
+ outputMint,
29
+ amount: parseInt(amountInSmallestUnit),
30
+ slippageBps: parseInt(options.slippage),
31
+ taker: keypair.publicKey.toBase58(),
32
+ });
33
+ const outputDecimals = await getTokenDecimals(outputMint);
34
+ const outputAmount = parseFloat(quote.outAmount) / Math.pow(10, outputDecimals);
35
+ const price = parseFloat(amount) / outputAmount;
36
+ const priceImpact = typeof quote.priceImpactPct === 'string'
37
+ ? new Big(quote.priceImpactPct).times(100)
38
+ : new Big(quote.priceImpactPct).times(100);
39
+ const impactNum = parseFloat(priceImpact.toFixed(3));
40
+ const signature = await executeSwap(connection, keypair, quote, options.priorityFee ? parseInt(options.priorityFee) : undefined);
41
+ output({
42
+ success: true,
43
+ inputToken: inputMintOrTicker.toUpperCase(),
44
+ inputAmount: amount,
45
+ outputToken: outputMintOrTicker.toUpperCase(),
46
+ outputAmount: outputAmount.toFixed(6),
47
+ price: price.toFixed(6),
48
+ priceImpactPct: impactNum,
49
+ signature,
50
+ explorer: `https://solscan.io/tx/${signature}`,
51
+ }, () => {
52
+ const impactEmoji = impactNum < 0 ? '⚠️' : '✅';
53
+ return [
54
+ '🔄 Swap Executed:',
55
+ ` You paid: ${amount} ${inputMintOrTicker.toUpperCase()}`,
56
+ ` You got: ~${outputAmount.toFixed(4)} ${outputMintOrTicker.toUpperCase()}`,
57
+ ` Price: ${price.toFixed(6)} ${inputMintOrTicker.toUpperCase()} per ${outputMintOrTicker.toUpperCase()}`,
58
+ ` Price Impact: ${impactEmoji} ${impactNum.toFixed(3)}%`,
59
+ '',
60
+ '✅ Swap successful!',
61
+ `📝 Signature: ${signature}`,
62
+ `🔗 View on Solscan: https://solscan.io/tx/${signature}`,
63
+ ].join('\n');
64
+ });
65
+ }
66
+ catch (e) {
67
+ error('Swap failed', e.message);
68
+ }
69
+ });
70
+ //# sourceMappingURL=swap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swap.js","sourceRoot":"","sources":["../../../src/commands/trade/swap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { Command } from 'commander';
2
+ export declare const tradeCommand: Command;
3
+ export declare const searchCommand: Command;
4
+ export declare const infoCommand: Command;
5
+ //# sourceMappingURL=trade.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trade.d.ts","sourceRoot":"","sources":["../../src/commands/trade.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,eAAO,MAAM,YAAY,SAAiE,CAAC;AAgI3F,eAAO,MAAM,aAAa,SAoBtB,CAAC;AAEL,eAAO,MAAM,WAAW,SAkCpB,CAAC"}
@@ -0,0 +1,167 @@
1
+ import { Connection } from '@solana/web3.js';
2
+ import { Command } from 'commander';
3
+ import Big from 'big.js';
4
+ import { getTokenDecimals, toSmallestUnit, fromSmallestUnit } from '../utils/amounts.js';
5
+ import { executeSwap, getSwapQuote, searchToken } from '../utils/jupiter.js';
6
+ import { resolveToken } from '../utils/token-book.js';
7
+ import { formatTokenInfo, getTokenInfo } from '../utils/token-info.js';
8
+ import { loadKeypairForSigning } from '../utils/wallet.js';
9
+ import { output, error, requirePassword, getRpcUrl } from './shared.js';
10
+ export const tradeCommand = new Command('trade').description('Execute trades via Jupiter');
11
+ tradeCommand
12
+ .command('quote <input-mint> <output-mint> <amount>')
13
+ .description('Get swap quote (amount in human-readable format, e.g., 400 for 400 USDC)')
14
+ .option('-s, --slippage <bps>', 'Slippage in basis points', '50')
15
+ .action(async (inputMintOrTicker, outputMintOrTicker, amount, options) => {
16
+ const inputMint = resolveToken(inputMintOrTicker);
17
+ const outputMint = resolveToken(outputMintOrTicker);
18
+ try {
19
+ const decimals = await getTokenDecimals(inputMint);
20
+ const amountInSmallestUnit = toSmallestUnit(amount, decimals);
21
+ const quote = await getSwapQuote({
22
+ inputMint,
23
+ outputMint,
24
+ amount: parseInt(amountInSmallestUnit),
25
+ slippageBps: parseInt(options.slippage),
26
+ });
27
+ const outputDecimals = await getTokenDecimals(outputMint);
28
+ const outputAmount = fromSmallestUnit(quote.outAmount, outputDecimals);
29
+ const price = new Big(amount).div(new Big(outputAmount));
30
+ const priceImpact = typeof quote.priceImpactPct === 'string'
31
+ ? new Big(quote.priceImpactPct).times(100)
32
+ : new Big(quote.priceImpactPct).times(100);
33
+ const impactNum = parseFloat(priceImpact.toFixed(3));
34
+ output({
35
+ inputToken: inputMintOrTicker.toUpperCase(),
36
+ inputAmount: amount,
37
+ outputToken: outputMintOrTicker.toUpperCase(),
38
+ outputAmount: new Big(outputAmount).toFixed(6),
39
+ price: price.toFixed(6),
40
+ priceImpactPct: impactNum,
41
+ slippageBps: parseInt(options.slippage),
42
+ }, () => {
43
+ const impactEmoji = impactNum < 0 ? '⚠️' : '✅';
44
+ return [
45
+ '📊 Swap Quote:',
46
+ ` You pay: ${amount} ${inputMintOrTicker.toUpperCase()}`,
47
+ ` You get: ~${new Big(outputAmount).toFixed(4)} ${outputMintOrTicker.toUpperCase()}`,
48
+ ` Price: ${price.toFixed(6)} ${inputMintOrTicker.toUpperCase()} per ${outputMintOrTicker.toUpperCase()}`,
49
+ ` Price Impact: ${impactEmoji} ${impactNum.toFixed(3)}% (${impactNum < 0 ? 'you lose value' : 'you gain value'})`,
50
+ ` Slippage Tolerance: ${new Big(options.slippage).div(100).toFixed(2)}%`,
51
+ ].join('\n');
52
+ });
53
+ }
54
+ catch (e) {
55
+ error('Failed to get quote', e.message);
56
+ }
57
+ });
58
+ tradeCommand
59
+ .command('swap <input-mint> <output-mint> <amount>')
60
+ .description('Execute swap (amount in human-readable format, e.g., 400 for 400 USDC)')
61
+ .option('-s, --slippage <bps>', 'Slippage in basis points', '50')
62
+ .option('--priority-fee <lamports>', 'Priority fee in lamports')
63
+ .action(async (inputMintOrTicker, outputMintOrTicker, amount, options) => {
64
+ const inputMint = resolveToken(inputMintOrTicker);
65
+ const outputMint = resolveToken(outputMintOrTicker);
66
+ const password = requirePassword();
67
+ try {
68
+ const rpcUrl = getRpcUrl();
69
+ const connection = new Connection(rpcUrl, 'confirmed');
70
+ const keypair = loadKeypairForSigning(password);
71
+ const decimals = await getTokenDecimals(inputMint);
72
+ const amountInSmallestUnit = toSmallestUnit(parseFloat(amount), decimals);
73
+ const quote = await getSwapQuote({
74
+ inputMint,
75
+ outputMint,
76
+ amount: parseInt(amountInSmallestUnit),
77
+ slippageBps: parseInt(options.slippage),
78
+ taker: keypair.publicKey.toBase58(),
79
+ });
80
+ const outputDecimals = await getTokenDecimals(outputMint);
81
+ const outputAmount = parseFloat(quote.outAmount) / Math.pow(10, outputDecimals);
82
+ const price = parseFloat(amount) / outputAmount;
83
+ const priceImpact = typeof quote.priceImpactPct === 'string'
84
+ ? new Big(quote.priceImpactPct).times(100)
85
+ : new Big(quote.priceImpactPct).times(100);
86
+ const impactNum = parseFloat(priceImpact.toFixed(3));
87
+ const signature = await executeSwap(connection, keypair, quote, options.priorityFee ? parseInt(options.priorityFee) : undefined);
88
+ output({
89
+ success: true,
90
+ inputToken: inputMintOrTicker.toUpperCase(),
91
+ inputAmount: amount,
92
+ outputToken: outputMintOrTicker.toUpperCase(),
93
+ outputAmount: outputAmount.toFixed(6),
94
+ price: price.toFixed(6),
95
+ priceImpactPct: impactNum,
96
+ signature,
97
+ explorer: `https://solscan.io/tx/${signature}`,
98
+ }, () => {
99
+ const impactEmoji = impactNum < 0 ? '⚠️' : '✅';
100
+ return [
101
+ '🔄 Swap Executed:',
102
+ ` You paid: ${amount} ${inputMintOrTicker.toUpperCase()}`,
103
+ ` You got: ~${outputAmount.toFixed(4)} ${outputMintOrTicker.toUpperCase()}`,
104
+ ` Price: ${price.toFixed(6)} ${inputMintOrTicker.toUpperCase()} per ${outputMintOrTicker.toUpperCase()}`,
105
+ ` Price Impact: ${impactEmoji} ${impactNum.toFixed(3)}%`,
106
+ '',
107
+ '✅ Swap successful!',
108
+ `📝 Signature: ${signature}`,
109
+ `🔗 View on Solscan: https://solscan.io/tx/${signature}`,
110
+ ].join('\n');
111
+ });
112
+ }
113
+ catch (e) {
114
+ error('Swap failed', e.message);
115
+ }
116
+ });
117
+ export const searchCommand = new Command('search')
118
+ .argument('<query>', 'Token name or symbol')
119
+ .description('Search for token by name or symbol')
120
+ .action(async (query) => {
121
+ try {
122
+ const tokens = await searchToken(query);
123
+ output({ query, results: tokens.map((t) => ({ symbol: t.symbol, name: t.name, address: t.address })) }, () => {
124
+ const lines = ['🔍 Search Results:', ''];
125
+ for (const t of tokens) {
126
+ lines.push(` ${t.symbol.padEnd(10)} ${t.name.slice(0, 30).padEnd(32)} ${t.address}`);
127
+ }
128
+ return lines.join('\n');
129
+ });
130
+ }
131
+ catch (e) {
132
+ error('Search failed', e.message);
133
+ }
134
+ });
135
+ export const infoCommand = new Command('info')
136
+ .argument('<token>', 'Token symbol or address')
137
+ .description('Get detailed token information by symbol or address')
138
+ .action(async (tokenOrTicker) => {
139
+ try {
140
+ const tokenAddress = resolveToken(tokenOrTicker);
141
+ const info = await getTokenInfo(tokenAddress);
142
+ output({
143
+ ...info,
144
+ explorers: {
145
+ solscan: `https://solscan.io/token/${info.address}`,
146
+ solanaExplorer: `https://explorer.solana.com/address/${info.address}`,
147
+ dexscreener: info.markets?.[0]?.pair ? `https://dexscreener.com/solana/${info.markets[0].pair}` : null,
148
+ },
149
+ }, () => {
150
+ const formatted = formatTokenInfo(info);
151
+ const links = [
152
+ '',
153
+ '🔗 EXPLORERS',
154
+ ` Solscan: https://solscan.io/token/${info.address}`,
155
+ ` Solana Explorer: https://explorer.solana.com/address/${info.address}`,
156
+ ];
157
+ if (info.markets && info.markets.length > 0) {
158
+ links.push(` DexScreener: https://dexscreener.com/solana/${info.markets[0].pair}`);
159
+ }
160
+ return formatted + links.join('\n');
161
+ });
162
+ }
163
+ catch (e) {
164
+ error('Failed to get token info', e.message);
165
+ }
166
+ });
167
+ //# sourceMappingURL=trade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trade.js","sourceRoot":"","sources":["../../src/commands/trade.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const walletCommand: Command;
3
+ //# sourceMappingURL=wallet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/commands/wallet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,aAAa,SAAkE,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { Command } from 'commander';
2
+ import { generateWallet, getWalletAddress, exportPrivateKey, } from '../utils/wallet.js';
3
+ import { output, error, requirePassword } from './shared.js';
4
+ export const walletCommand = new Command('wallet').description('Wallet management commands');
5
+ walletCommand
6
+ .command('generate')
7
+ .description('Generate a new encrypted wallet (ONE TIME ONLY)')
8
+ .action(async () => {
9
+ const password = requirePassword();
10
+ try {
11
+ const publicKey = generateWallet(password);
12
+ const address = publicKey.toBase58();
13
+ output({ success: true, address, warning: 'Backup private key with: trader wallet export (run on server only)' }, () => `Wallet generated: ${address}\n\nIMPORTANT: Run \`trader wallet export\` on server to backup private key.`);
14
+ }
15
+ catch (e) {
16
+ error(e.message);
17
+ }
18
+ });
19
+ walletCommand
20
+ .command('address')
21
+ .description('Get wallet address (safe to share)')
22
+ .action(async () => {
23
+ const password = requirePassword();
24
+ try {
25
+ const address = getWalletAddress(password);
26
+ output({ address }, () => address);
27
+ }
28
+ catch (e) {
29
+ error(e.message);
30
+ }
31
+ });
32
+ walletCommand
33
+ .command('export')
34
+ .description('Export private key for backup (KEEP SECRET!)')
35
+ .action(async () => {
36
+ const password = requirePassword();
37
+ try {
38
+ const privateKey = await exportPrivateKey(password);
39
+ output({ privateKey, warning: 'NEVER SHARE - import into Phantom/Solflare for recovery' }, () => `Private Key (base58):\n${privateKey}\n\nImport into Phantom/Solflare for recovery.`);
40
+ }
41
+ catch (e) {
42
+ error(e.message);
43
+ }
44
+ });
45
+ //# sourceMappingURL=wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/commands/wallet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE7D,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,4BAA4B,CAAC,CAAC;AAE7F,aAAa;KACV,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,iDAAiD,CAAC;KAC9D,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;QACrC,MAAM,CACJ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,oEAAoE,EAAE,EACzG,GAAG,EAAE,CAAC,qBAAqB,OAAO,8EAA8E,CACjH,CAAC;IACJ,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,aAAa;KACV,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC3C,MAAM,CAAC,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,aAAa;KACV,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,8CAA8C,CAAC;KAC3D,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACpD,MAAM,CACJ,EAAE,UAAU,EAAE,OAAO,EAAE,yDAAyD,EAAE,EAClF,GAAG,EAAE,CAAC,0BAA0B,UAAU,gDAAgD,CAC3F,CAAC;IACJ,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Centralized configuration for trader CLI
3
+ * All env vars, API endpoints, and constants in one place
4
+ */
5
+ export declare const env: {
6
+ /** Helius API key for RPC and DAS API (free at https://dev.helius.xyz) */
7
+ heliusApiKey: () => string | undefined;
8
+ /** Jupiter API key for swaps and predictions (free at https://portal.jup.ag) */
9
+ jupiterApiKey: () => string | undefined;
10
+ /** Wallet encryption password */
11
+ walletPassword: () => string | undefined;
12
+ /** Optional: Override RPC URL */
13
+ rpcUrl: () => string | undefined;
14
+ /** Use Helius Sender for ultra-low latency transaction submission */
15
+ useHeliusSender: () => boolean;
16
+ /** Home directory */
17
+ home: () => string;
18
+ };
19
+ export declare const paths: {
20
+ /** OpenClaw data directory */
21
+ openclawDir: () => string;
22
+ /** Encrypted wallet file */
23
+ walletFile: () => string;
24
+ /** Position tracking file */
25
+ positionsFile: () => string;
26
+ /** Token address book */
27
+ tokenBook: () => string;
28
+ };
29
+ export declare const apis: {
30
+ heliusRpc: (apiKey: string) => string;
31
+ heliusTransactions: (address: string, apiKey: string) => string;
32
+ jupiterUltra: string;
33
+ jupiterQuote: string;
34
+ jupiterTokenSearch: string;
35
+ jupiterTokenTag: string;
36
+ jupiterTokenTop: string;
37
+ jupiterPrediction: string;
38
+ jupiterPerps: string;
39
+ solanaMainnet: string;
40
+ };
41
+ export declare const tokens: {
42
+ SOL: string;
43
+ USDC: string;
44
+ USDT: string;
45
+ WBTC: string;
46
+ WETH: string;
47
+ JUP: string;
48
+ JupUSD: string;
49
+ GLDx: string;
50
+ RAY: string;
51
+ };
52
+ export declare const defaultTokenBook: Record<string, string>;
53
+ export declare const safety: {
54
+ /** Minimum SOL to keep in wallet for gas fees. Swaps selling SOL will be rejected if balance would drop below this. */
55
+ minSolReserve: number;
56
+ };
57
+ export declare const tokenDecimals: Record<string, number>;
58
+ export declare const perps: {
59
+ programId: string;
60
+ poolAccount: string;
61
+ custody: {
62
+ SOL: string;
63
+ ETH: string;
64
+ BTC: string;
65
+ USDC: string;
66
+ USDT: string;
67
+ };
68
+ };
69
+ export declare const explorers: {
70
+ solscanTx: (sig: string) => string;
71
+ solscanToken: (mint: string) => string;
72
+ solanaExplorer: (address: string) => string;
73
+ dexscreener: (pair: string) => string;
74
+ jupPerps: string;
75
+ };
76
+ /** Get RPC URL - prefers HELIUS_API_KEY, falls back to RPC_URL or public */
77
+ export declare function getRpcUrl(): string;
78
+ /** Require Helius API key or throw */
79
+ export declare function requireHeliusKey(): string;
80
+ /** Require Jupiter API key or throw */
81
+ export declare function requireJupiterKey(): string;
82
+ /** Require wallet password or throw */
83
+ export declare function requirePassword(): string;
84
+ /** Get token decimals from cache or default to 9 */
85
+ export declare function getDecimalsFromCache(mint: string): number | undefined;
86
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,eAAO,MAAM,GAAG;IACd,0EAA0E;;IAG1E,gFAAgF;;IAGhF,iCAAiC;;IAGjC,iCAAiC;;IAGjC,qEAAqE;;IAGrE,qBAAqB;;CAEtB,CAAC;AAMF,eAAO,MAAM,KAAK;IAChB,8BAA8B;;IAG9B,4BAA4B;;IAG5B,6BAA6B;;IAG7B,yBAAyB;;CAE1B,CAAC;AAMF,eAAO,MAAM,IAAI;wBAEK,MAAM;kCACI,MAAM,UAAU,MAAM;;;;;;;;;CAcrD,CAAC;AAMF,eAAO,MAAM,MAAM;;;;;;;;;;CAmBlB,CAAC;AAGF,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAUnD,CAAC;AAMF,eAAO,MAAM,MAAM;IACjB,uHAAuH;;CAExH,CAAC;AAGF,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAUhD,CAAC;AAMF,eAAO,MAAM,KAAK;;;;;;;;;;CAWjB,CAAC;AAMF,eAAO,MAAM,SAAS;qBACH,MAAM;yBACF,MAAM;8BACD,MAAM;wBACZ,MAAM;;CAE3B,CAAC;AAMF,4EAA4E;AAC5E,wBAAgB,SAAS,IAAI,MAAM,CAQlC;AAED,sCAAsC;AACtC,wBAAgB,gBAAgB,IAAI,MAAM,CAMzC;AAED,uCAAuC;AACvC,wBAAgB,iBAAiB,IAAI,MAAM,CAM1C;AAED,uCAAuC;AACvC,wBAAgB,eAAe,IAAI,MAAM,CAMxC;AAED,oDAAoD;AACpD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAErE"}
package/dist/config.js ADDED
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Centralized configuration for trader CLI
3
+ * All env vars, API endpoints, and constants in one place
4
+ */
5
+ import path from 'path';
6
+ // ============================================================================
7
+ // Environment Variables
8
+ // ============================================================================
9
+ export const env = {
10
+ /** Helius API key for RPC and DAS API (free at https://dev.helius.xyz) */
11
+ heliusApiKey: () => process.env.HELIUS_API_KEY,
12
+ /** Jupiter API key for swaps and predictions (free at https://portal.jup.ag) */
13
+ jupiterApiKey: () => process.env.JUPITER_API_KEY,
14
+ /** Wallet encryption password */
15
+ walletPassword: () => process.env.WALLET_PASSWORD,
16
+ /** Optional: Override RPC URL */
17
+ rpcUrl: () => process.env.RPC_URL,
18
+ /** Use Helius Sender for ultra-low latency transaction submission */
19
+ useHeliusSender: () => process.env.USE_HELIUS_SENDER === 'true',
20
+ /** Home directory */
21
+ home: () => process.env.HOME || '',
22
+ };
23
+ // ============================================================================
24
+ // Directories & Paths
25
+ // ============================================================================
26
+ export const paths = {
27
+ /** OpenClaw data directory */
28
+ openclawDir: () => path.join(env.home(), '.openclaw'),
29
+ /** Encrypted wallet file */
30
+ walletFile: () => path.join(env.home(), '.openclaw', 'trader-wallet.enc'),
31
+ /** Position tracking file */
32
+ positionsFile: () => path.join(env.home(), '.openclaw', 'trader-positions.json'),
33
+ /** Token address book */
34
+ tokenBook: () => path.join(env.home(), '.openclaw', 'trader-tokens.json'),
35
+ };
36
+ // ============================================================================
37
+ // API Endpoints
38
+ // ============================================================================
39
+ export const apis = {
40
+ // Helius
41
+ heliusRpc: (apiKey) => `https://mainnet.helius-rpc.com/?api-key=${apiKey}`,
42
+ heliusTransactions: (address, apiKey) => `https://api.helius.xyz/v0/addresses/${address}/transactions?api-key=${apiKey}`,
43
+ // Jupiter
44
+ jupiterUltra: 'https://api.jup.ag/ultra/v1',
45
+ jupiterQuote: 'https://quote-api.jup.ag/v6/quote',
46
+ jupiterTokenSearch: 'https://api.jup.ag/tokens/v2/search',
47
+ jupiterTokenTag: 'https://api.jup.ag/tokens/v2/tag',
48
+ jupiterTokenTop: 'https://api.jup.ag/tokens/v2/toporganicscore/24h',
49
+ jupiterPrediction: 'https://api.jup.ag/prediction/v1',
50
+ jupiterPerps: 'https://perps-api.jup.ag/v1',
51
+ // Solana public RPC (fallback)
52
+ solanaMainnet: 'https://api.mainnet-beta.solana.com',
53
+ };
54
+ // ============================================================================
55
+ // Token Addresses (Mainnet)
56
+ // ============================================================================
57
+ export const tokens = {
58
+ // Native
59
+ SOL: 'So11111111111111111111111111111111111111112',
60
+ // Stablecoins
61
+ USDC: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
62
+ USDT: 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB',
63
+ // Wrapped
64
+ WBTC: '3NZ9JMVBmGAqocybic2c7LQCJScmgsAZ6vQqTDzcqmJh',
65
+ WETH: '7vfCXTUXx5WJV5JADk17DUJ4ksgau7utNKj4b963voxs',
66
+ // Jupiter
67
+ JUP: 'JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN',
68
+ JupUSD: 'JuprjznTrTSp2UFa3ZBUFgwdAmtZCq4MQCwysN55USD',
69
+ // Other
70
+ GLDx: 'Xsv9hRk1z5ystj9MhnA7Lq4vjSsLwzL2nxrwmwtD3re',
71
+ RAY: '4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R',
72
+ };
73
+ // Default token book entries
74
+ export const defaultTokenBook = {
75
+ SOL: tokens.SOL,
76
+ USDC: tokens.USDC,
77
+ USDT: tokens.USDT,
78
+ WBTC: tokens.WBTC,
79
+ WETH: tokens.WETH,
80
+ JUP: tokens.JUP,
81
+ JupUSD: tokens.JupUSD,
82
+ GLDx: tokens.GLDx,
83
+ RAY: tokens.RAY,
84
+ };
85
+ // ============================================================================
86
+ // Safety Limits
87
+ // ============================================================================
88
+ export const safety = {
89
+ /** Minimum SOL to keep in wallet for gas fees. Swaps selling SOL will be rejected if balance would drop below this. */
90
+ minSolReserve: 0.05,
91
+ };
92
+ // Token decimals cache
93
+ export const tokenDecimals = {
94
+ [tokens.SOL]: 9,
95
+ [tokens.USDC]: 6,
96
+ [tokens.USDT]: 6,
97
+ [tokens.WBTC]: 8,
98
+ [tokens.WETH]: 8,
99
+ [tokens.JUP]: 6,
100
+ [tokens.JupUSD]: 6,
101
+ [tokens.GLDx]: 8,
102
+ [tokens.RAY]: 6,
103
+ };
104
+ // ============================================================================
105
+ // Jupiter Perpetuals
106
+ // ============================================================================
107
+ export const perps = {
108
+ programId: 'PERPHjGBqRHArX4DySjwM6UJHiR3sWAatqfdBS2qQJu',
109
+ poolAccount: '5BUwFW4nRbftYTDMbgxykoFWqWHPzahFSNAaaaJtVKsq',
110
+ custody: {
111
+ SOL: '7xS2gz2bTp3fwCC7knJvUWTEU9Tycczu6VhJYKgi1wdz',
112
+ ETH: 'AQCGyheWPLeo6Qp9WpYS9m3Qj479t7R636N9ey1rEjEn',
113
+ BTC: '5Pv3gM9JrFFH883SWAhvJC9RPYmo8UNxuFtv5bMMALkm',
114
+ USDC: 'G18jKKXQwBbrHeiK3C9MRXhkHsLHf7XgCSisykV46EZa',
115
+ USDT: '4vkNeXiYEUizLdrpdPS1eC2mccyM4NUPRtERrk6ZETkk',
116
+ },
117
+ };
118
+ // ============================================================================
119
+ // Explorer URLs
120
+ // ============================================================================
121
+ export const explorers = {
122
+ solscanTx: (sig) => `https://solscan.io/tx/${sig}`,
123
+ solscanToken: (mint) => `https://solscan.io/token/${mint}`,
124
+ solanaExplorer: (address) => `https://explorer.solana.com/address/${address}`,
125
+ dexscreener: (pair) => `https://dexscreener.com/solana/${pair}`,
126
+ jupPerps: 'https://jup.ag/perps',
127
+ };
128
+ // ============================================================================
129
+ // Helpers
130
+ // ============================================================================
131
+ /** Get RPC URL - prefers HELIUS_API_KEY, falls back to RPC_URL or public */
132
+ export function getRpcUrl() {
133
+ const rpcUrl = env.rpcUrl();
134
+ if (rpcUrl)
135
+ return rpcUrl;
136
+ const heliusKey = env.heliusApiKey();
137
+ if (heliusKey)
138
+ return apis.heliusRpc(heliusKey);
139
+ return apis.solanaMainnet;
140
+ }
141
+ /** Require Helius API key or throw */
142
+ export function requireHeliusKey() {
143
+ const key = env.heliusApiKey();
144
+ if (!key) {
145
+ throw new Error('HELIUS_API_KEY not set. Get free key at https://dev.helius.xyz');
146
+ }
147
+ return key;
148
+ }
149
+ /** Require Jupiter API key or throw */
150
+ export function requireJupiterKey() {
151
+ const key = env.jupiterApiKey();
152
+ if (!key) {
153
+ throw new Error('JUPITER_API_KEY not set. Get free key at https://portal.jup.ag');
154
+ }
155
+ return key;
156
+ }
157
+ /** Require wallet password or throw */
158
+ export function requirePassword() {
159
+ const password = env.walletPassword();
160
+ if (!password) {
161
+ throw new Error('WALLET_PASSWORD environment variable required');
162
+ }
163
+ return password;
164
+ }
165
+ /** Get token decimals from cache or default to 9 */
166
+ export function getDecimalsFromCache(mint) {
167
+ return tokenDecimals[mint];
168
+ }
169
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Convert human-readable amount to smallest unit (with decimals)
3
+ * Uses Big.js for precision - safe for large numbers and financial calculations
4
+ *
5
+ * Examples:
6
+ * toSmallestUnit(1, 9) = "1000000000" (1 SOL)
7
+ * toSmallestUnit(100, 6) = "100000000" (100 USDC)
8
+ * toSmallestUnit(0.000001, 9) = "1000" (0.000001 SOL)
9
+ */
10
+ export declare function toSmallestUnit(amount: number | string, decimals: number): string;
11
+ /**
12
+ * Convert smallest unit to human-readable amount
13
+ * Uses Big.js for precision
14
+ *
15
+ * Examples:
16
+ * fromSmallestUnit('1000000000', 9) = "1" (1 SOL)
17
+ * fromSmallestUnit('100000000', 6) = "100" (100 USDC)
18
+ */
19
+ export declare function fromSmallestUnit(amount: string, decimals: number): string;
20
+ /**
21
+ * Safe multiplication for token amounts
22
+ */
23
+ export declare function multiplyAmounts(amount1: string | number, amount2: string | number): string;
24
+ /**
25
+ * Safe division for token amounts
26
+ */
27
+ export declare function divideAmounts(amount1: string | number, amount2: string | number): string;
28
+ /**
29
+ * Safe addition for token amounts
30
+ */
31
+ export declare function addAmounts(amount1: string | number, amount2: string | number): string;
32
+ /**
33
+ * Safe subtraction for token amounts
34
+ */
35
+ export declare function subtractAmounts(amount1: string | number, amount2: string | number): string;
36
+ /**
37
+ * Get token decimals from Helius or cache
38
+ */
39
+ export declare function getTokenDecimals(mintAddress: string): Promise<number>;
40
+ //# sourceMappingURL=amounts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"amounts.d.ts","sourceRoot":"","sources":["../../src/utils/amounts.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAWhF;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAUzE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAI1F;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAIxF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAIrF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAI1F;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAuC3E"}