@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,332 @@
1
+ import { apis, explorers, requireHeliusKey } from '../config.js';
2
+ import { resolveToken } from './token-book.js';
3
+ /**
4
+ * Get token info from Helius DAS API
5
+ */
6
+ async function getHeliusTokenInfo(mintAddress) {
7
+ const heliusApiKey = requireHeliusKey();
8
+ const url = apis.heliusRpc(heliusApiKey);
9
+ try {
10
+ const response = await fetch(url, {
11
+ method: 'POST',
12
+ headers: { 'Content-Type': 'application/json' },
13
+ body: JSON.stringify({
14
+ jsonrpc: '2.0',
15
+ id: 'token-info',
16
+ method: 'getAsset',
17
+ params: { id: mintAddress },
18
+ }),
19
+ });
20
+ const { result } = await response.json();
21
+ if (!result)
22
+ return {};
23
+ return {
24
+ address: mintAddress,
25
+ symbol: result.content?.metadata?.symbol || '???',
26
+ name: result.content?.metadata?.name || 'Unknown',
27
+ decimals: result.token_info?.decimals || 0,
28
+ price: result.token_info?.price_info?.price_per_token,
29
+ supply: result.token_info?.supply,
30
+ logoUri: result.content?.links?.image,
31
+ verified: result.token_info?.price_info !== undefined,
32
+ verifiedSource: 'helius',
33
+ freezeAuthority: result.authorities?.find((a) => a.type === 'freeze')?.address,
34
+ mintAuthority: result.authorities?.find((a) => a.type === 'mint')?.address,
35
+ };
36
+ }
37
+ catch (error) {
38
+ console.error('Helius error:', error);
39
+ return {};
40
+ }
41
+ }
42
+ /**
43
+ * Get token holders count via Helius
44
+ */
45
+ async function getTokenHolders(mintAddress) {
46
+ const heliusApiKey = requireHeliusKey();
47
+ const url = apis.heliusRpc(heliusApiKey);
48
+ try {
49
+ // Get largest token accounts (top 20)
50
+ const response = await fetch(url, {
51
+ method: 'POST',
52
+ headers: { 'Content-Type': 'application/json' },
53
+ body: JSON.stringify({
54
+ jsonrpc: '2.0',
55
+ id: 'holders',
56
+ method: 'getTokenLargestAccounts',
57
+ params: [mintAddress],
58
+ }),
59
+ });
60
+ const { result } = await response.json();
61
+ // This returns top 20, but doesn't give us total count
62
+ // Would need getProgramAccounts for full count (expensive)
63
+ return result?.value?.length;
64
+ }
65
+ catch (error) {
66
+ return undefined;
67
+ }
68
+ }
69
+ /**
70
+ * Get token info from Jupiter
71
+ */
72
+ async function getJupiterTokenInfo(mintAddress) {
73
+ try {
74
+ // Check if token is in verified list
75
+ const verifiedResponse = await fetch('https://tokens.jup.ag/tokens?tags=verified');
76
+ const verifiedTokens = await verifiedResponse.json();
77
+ const verifiedToken = verifiedTokens.find((t) => t.address === mintAddress);
78
+ if (verifiedToken) {
79
+ return {
80
+ symbol: verifiedToken.symbol,
81
+ name: verifiedToken.name,
82
+ decimals: verifiedToken.decimals,
83
+ logoUri: verifiedToken.logoURI,
84
+ verified: true,
85
+ verifiedSource: 'jupiter',
86
+ };
87
+ }
88
+ // Check strict list
89
+ const strictResponse = await fetch('https://tokens.jup.ag/tokens?tags=strict');
90
+ const strictTokens = await strictResponse.json();
91
+ const strictToken = strictTokens.find((t) => t.address === mintAddress);
92
+ if (strictToken) {
93
+ return {
94
+ symbol: strictToken.symbol,
95
+ name: strictToken.name,
96
+ decimals: strictToken.decimals,
97
+ logoUri: strictToken.logoURI,
98
+ verified: true,
99
+ verifiedSource: 'jupiter-strict',
100
+ };
101
+ }
102
+ // Check all tokens
103
+ const allResponse = await fetch('https://tokens.jup.ag/tokens');
104
+ const allTokens = await allResponse.json();
105
+ const token = allTokens.find((t) => t.address === mintAddress);
106
+ if (token) {
107
+ return {
108
+ symbol: token.symbol,
109
+ name: token.name,
110
+ decimals: token.decimals,
111
+ logoUri: token.logoURI,
112
+ verified: false,
113
+ };
114
+ }
115
+ return {};
116
+ }
117
+ catch (error) {
118
+ console.error('Jupiter error:', error);
119
+ return {};
120
+ }
121
+ }
122
+ /**
123
+ * Get market data from DexScreener
124
+ */
125
+ async function getDexScreenerInfo(mintAddress) {
126
+ try {
127
+ const response = await fetch(`https://api.dexscreener.com/latest/dex/tokens/${mintAddress}`);
128
+ const data = await response.json();
129
+ if (!data.pairs || data.pairs.length === 0) {
130
+ return {};
131
+ }
132
+ // Get the most liquid pair
133
+ const mainPair = data.pairs.reduce((prev, current) => (current.liquidity?.usd || 0) > (prev.liquidity?.usd || 0) ? current : prev);
134
+ return {
135
+ symbol: mainPair.baseToken?.symbol || mainPair.quoteToken?.symbol,
136
+ name: mainPair.baseToken?.name || mainPair.quoteToken?.name,
137
+ price: parseFloat(mainPair.priceUsd),
138
+ priceChange24h: mainPair.priceChange?.h24,
139
+ volume24h: mainPair.volume?.h24,
140
+ liquidity: mainPair.liquidity?.usd,
141
+ marketCap: mainPair.marketCap,
142
+ fdv: mainPair.fdv,
143
+ markets: data.pairs.slice(0, 5).map((p) => ({
144
+ dex: p.dexId,
145
+ pair: p.pairAddress,
146
+ liquidity: p.liquidity?.usd || 0,
147
+ })),
148
+ website: mainPair.info?.websites?.[0]?.url || mainPair.info?.websites?.[0],
149
+ twitter: mainPair.info?.socials?.find((s) => s.type === 'twitter')?.url,
150
+ telegram: mainPair.info?.socials?.find((s) => s.type === 'telegram')?.url,
151
+ discord: mainPair.info?.socials?.find((s) => s.type === 'discord')?.url,
152
+ };
153
+ }
154
+ catch (error) {
155
+ console.error('DexScreener error:', error);
156
+ return {};
157
+ }
158
+ }
159
+ /**
160
+ * Get additional analytics from Birdeye
161
+ */
162
+ async function getBirdeyeInfo(mintAddress) {
163
+ // Note: Birdeye requires API key for most endpoints
164
+ // Using public endpoints only
165
+ try {
166
+ const response = await fetch(`https://public-api.birdeye.so/public/token_overview?address=${mintAddress}`, {
167
+ headers: {
168
+ 'X-API-KEY': process.env.BIRDEYE_API_KEY || '',
169
+ },
170
+ });
171
+ if (!response.ok)
172
+ return {};
173
+ const data = await response.json();
174
+ if (!data.success || !data.data)
175
+ return {};
176
+ return {
177
+ price: data.data.price,
178
+ priceChange24h: data.data.priceChange24h,
179
+ volume24h: data.data.volume24h,
180
+ volumeChange24h: data.data.volume24hChange,
181
+ liquidity: data.data.liquidity,
182
+ marketCap: data.data.mc,
183
+ holders: data.data.holder,
184
+ };
185
+ }
186
+ catch (error) {
187
+ // Fail silently if no API key
188
+ return {};
189
+ }
190
+ }
191
+ /**
192
+ * Aggregate token info from all sources
193
+ * Simplified to use only Helius + DexScreener (most reliable)
194
+ */
195
+ export async function getTokenInfo(mintOrSymbol) {
196
+ const mintAddress = resolveToken(mintOrSymbol);
197
+ if (mintAddress.length < 32) {
198
+ throw new Error(`Token symbol '${mintOrSymbol}' not found in token book. Use address or add to book with: trader book add ${mintOrSymbol.toUpperCase()} <address>`);
199
+ }
200
+ console.log(`šŸ” Fetching token info from Helius + DexScreener...`);
201
+ // Fetch from working sources only (skip Jupiter tokens API due to Node fetch issues)
202
+ const [helius, dexscreener, holders] = await Promise.all([
203
+ getHeliusTokenInfo(mintAddress),
204
+ getDexScreenerInfo(mintAddress),
205
+ getTokenHolders(mintAddress),
206
+ ]);
207
+ // Merge data with priority: Helius > DexScreener
208
+ const merged = {
209
+ address: mintAddress,
210
+ symbol: helius.symbol || dexscreener.symbol || '???',
211
+ name: helius.name || dexscreener.name || 'Unknown',
212
+ decimals: helius.decimals || 9,
213
+ // Market data - prefer DexScreener for real-time prices
214
+ price: dexscreener.price || helius.price,
215
+ priceChange24h: dexscreener.priceChange24h,
216
+ volume24h: dexscreener.volume24h,
217
+ liquidity: dexscreener.liquidity,
218
+ marketCap: dexscreener.marketCap,
219
+ fdv: dexscreener.fdv,
220
+ // Supply
221
+ supply: helius.supply,
222
+ // Verification (from Helius only since we're not calling Jupiter API)
223
+ verified: helius.verified || false,
224
+ verifiedSource: helius.verifiedSource,
225
+ freezeAuthority: helius.freezeAuthority,
226
+ mintAuthority: helius.mintAuthority,
227
+ // Holders
228
+ holders: holders,
229
+ // Links
230
+ logoUri: helius.logoUri,
231
+ description: helius.description,
232
+ website: dexscreener.website,
233
+ twitter: dexscreener.twitter,
234
+ telegram: dexscreener.telegram,
235
+ discord: dexscreener.discord,
236
+ // Markets
237
+ markets: dexscreener.markets,
238
+ // Source tracking
239
+ sources: [
240
+ helius.symbol ? 'helius' : '',
241
+ dexscreener.price ? 'dexscreener' : '',
242
+ ].filter(Boolean),
243
+ };
244
+ return merged;
245
+ }
246
+ /**
247
+ * Format token info for display
248
+ */
249
+ export function formatTokenInfo(info) {
250
+ const sections = [];
251
+ // Header
252
+ sections.push(`
253
+ ╔════════════════════════════════════════════════════════════
254
+ ā•‘ ${info.name} (${info.symbol})
255
+ ā•‘ ${info.address}
256
+ ā•šā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•
257
+ `);
258
+ // Verification
259
+ const verificationEmoji = info.verified ? 'āœ…' : 'āŒ';
260
+ sections.push(`
261
+ šŸ“œ VERIFICATION
262
+ Status: ${verificationEmoji} ${info.verified ? 'Verified' : 'Not Verified'}${info.verifiedSource ? ` (${info.verifiedSource})` : ''}
263
+ Mint Authority: ${info.mintAuthority || 'None (immutable)'}
264
+ Freeze Authority: ${info.freezeAuthority || 'None'}
265
+ `);
266
+ // Market Data
267
+ if (info.price !== undefined) {
268
+ const priceChange = info.priceChange24h
269
+ ? `${info.priceChange24h > 0 ? 'šŸ“ˆ' : 'šŸ“‰'} ${info.priceChange24h.toFixed(2)}%`
270
+ : 'N/A';
271
+ sections.push(`
272
+ šŸ’° MARKET DATA
273
+ Price: $${info.price.toFixed(info.price < 1 ? 6 : 2)}
274
+ 24h Change: ${priceChange}
275
+ Market Cap: ${info.marketCap ? `$${(info.marketCap / 1e6).toFixed(2)}M` : 'N/A'}
276
+ FDV: ${info.fdv ? `$${(info.fdv / 1e6).toFixed(2)}M` : 'N/A'}
277
+ `);
278
+ }
279
+ // Volume & Liquidity
280
+ if (info.volume24h !== undefined || info.liquidity !== undefined) {
281
+ sections.push(`
282
+ šŸ“Š LIQUIDITY & VOLUME
283
+ 24h Volume: ${info.volume24h ? `$${(info.volume24h / 1e3).toFixed(1)}K` : 'N/A'}
284
+ Liquidity: ${info.liquidity ? `$${(info.liquidity / 1e3).toFixed(1)}K` : 'N/A'}
285
+ `);
286
+ }
287
+ // Supply & Holders
288
+ sections.push(`
289
+ šŸŖ™ SUPPLY & HOLDERS
290
+ Total Supply: ${info.supply ? info.supply.toLocaleString() : 'N/A'}
291
+ Holders: ${info.holders ? info.holders.toLocaleString() : 'N/A'}
292
+ Decimals: ${info.decimals}
293
+ `);
294
+ // Links
295
+ const links = [];
296
+ if (info.website)
297
+ links.push(`Website: ${info.website}`);
298
+ if (info.twitter)
299
+ links.push(`Twitter: ${info.twitter}`);
300
+ if (info.telegram)
301
+ links.push(`Telegram: ${info.telegram}`);
302
+ if (info.discord)
303
+ links.push(`Discord: ${info.discord}`);
304
+ if (links.length > 0) {
305
+ sections.push(`
306
+ šŸ”— LINKS
307
+ ${links.join('\n ')}
308
+ `);
309
+ }
310
+ // Explorers
311
+ sections.push(`
312
+ šŸŒ EXPLORERS
313
+ Solscan: ${explorers.solscanToken(info.address)}
314
+ Solana Explorer: ${explorers.solanaExplorer(info.address)}
315
+ `);
316
+ if (info.markets && info.markets.length > 0) {
317
+ sections.push(` DexScreener: ${explorers.dexscreener(info.markets[0].pair)}\n`);
318
+ }
319
+ // Markets
320
+ if (info.markets && info.markets.length > 0) {
321
+ sections.push(`
322
+ šŸŖ TOP MARKETS
323
+ ${info.markets.map(m => ` ${m.dex.toUpperCase()}: $${(m.liquidity / 1e3).toFixed(1)}K liquidity`).join('\n')}
324
+ `);
325
+ }
326
+ // Footer
327
+ sections.push(`
328
+ šŸ“” Data Sources: ${info.sources.join(', ')}
329
+ `);
330
+ return sections.join('');
331
+ }
332
+ //# sourceMappingURL=token-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-info.js","sourceRoot":"","sources":["../../src/utils/token-info.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { Keypair, PublicKey } from '@solana/web3.js';
2
+ /**
3
+ * Generate a new Solana keypair and securely store it
4
+ * SECURITY: Wallet is encrypted at rest. Agent should NEVER disclose the private key.
5
+ * NOTE: This can be run by agent (one-time operation). Export requires manual confirmation.
6
+ */
7
+ export declare function generateWallet(password: string): PublicKey;
8
+ /**
9
+ * Load existing wallet and return public key only
10
+ */
11
+ export declare function loadWallet(password: string): PublicKey;
12
+ /**
13
+ * Load keypair for signing transactions (internal use only)
14
+ */
15
+ export declare function loadKeypairForSigning(password: string): Keypair;
16
+ /**
17
+ * Get wallet address without exposing private key
18
+ */
19
+ export declare function getWalletAddress(password: string): string;
20
+ /**
21
+ * Require user to type a confirmation phrase
22
+ * This prevents automated extraction via agents/bots
23
+ */
24
+ export declare function requireManualConfirmation(action: string): Promise<void>;
25
+ /**
26
+ * Export private key as base58 string for backup
27
+ * WARNING: Only use this for secure backup. Never share.
28
+ * SECURITY: Requires manual confirmation - cannot be automated via agent/remote.
29
+ */
30
+ export declare function exportPrivateKey(password: string): Promise<string>;
31
+ //# sourceMappingURL=wallet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/utils/wallet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAOrD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAyB1D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAUtD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAQ/D;AAoCD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGzD;AAwBD;;;GAGG;AACH,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+C7E;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA+BxE"}
@@ -0,0 +1,181 @@
1
+ import { Keypair } from '@solana/web3.js';
2
+ import fs from 'fs';
3
+ import crypto from 'crypto';
4
+ import { paths } from '../config.js';
5
+ const ALGORITHM = 'aes-256-gcm';
6
+ /**
7
+ * Generate a new Solana keypair and securely store it
8
+ * SECURITY: Wallet is encrypted at rest. Agent should NEVER disclose the private key.
9
+ * NOTE: This can be run by agent (one-time operation). Export requires manual confirmation.
10
+ */
11
+ export function generateWallet(password) {
12
+ const walletDir = paths.openclawDir();
13
+ const walletPath = paths.walletFile();
14
+ // Create .openclaw directory if it doesn't exist
15
+ if (!fs.existsSync(walletDir)) {
16
+ fs.mkdirSync(walletDir, { mode: 0o700, recursive: true });
17
+ }
18
+ // Check if wallet already exists
19
+ if (fs.existsSync(walletPath)) {
20
+ throw new Error('Wallet already exists. Use load-wallet to retrieve address.');
21
+ }
22
+ // Generate new keypair
23
+ const keypair = Keypair.generate();
24
+ // Encrypt and save
25
+ const encrypted = encryptKeypair(keypair, password);
26
+ fs.writeFileSync(walletPath, JSON.stringify(encrypted), { mode: 0o600 });
27
+ console.log('āš ļø SECURITY NOTICE: Wallet generated and encrypted at:', walletPath);
28
+ console.log('āš ļø DO NOT share private key or password with anyone');
29
+ return keypair.publicKey;
30
+ }
31
+ /**
32
+ * Load existing wallet and return public key only
33
+ */
34
+ export function loadWallet(password) {
35
+ const walletPath = paths.walletFile();
36
+ if (!fs.existsSync(walletPath)) {
37
+ throw new Error('No wallet found. Use generate-wallet first.');
38
+ }
39
+ const encrypted = JSON.parse(fs.readFileSync(walletPath, 'utf-8'));
40
+ const keypair = decryptKeypair(encrypted, password);
41
+ return keypair.publicKey;
42
+ }
43
+ /**
44
+ * Load keypair for signing transactions (internal use only)
45
+ */
46
+ export function loadKeypairForSigning(password) {
47
+ const walletPath = paths.walletFile();
48
+ if (!fs.existsSync(walletPath)) {
49
+ throw new Error('No wallet found. Use generate-wallet first.');
50
+ }
51
+ const encrypted = JSON.parse(fs.readFileSync(walletPath, 'utf-8'));
52
+ return decryptKeypair(encrypted, password);
53
+ }
54
+ function encryptKeypair(keypair, password) {
55
+ const key = crypto.scryptSync(password, 'salt', 32);
56
+ const iv = crypto.randomBytes(16);
57
+ const cipher = crypto.createCipheriv(ALGORITHM, key, iv);
58
+ const secretKey = Buffer.from(keypair.secretKey);
59
+ let encrypted = cipher.update(secretKey);
60
+ encrypted = Buffer.concat([encrypted, cipher.final()]);
61
+ const authTag = cipher.getAuthTag();
62
+ return {
63
+ iv: iv.toString('hex'),
64
+ authTag: authTag.toString('hex'),
65
+ encrypted: encrypted.toString('hex')
66
+ };
67
+ }
68
+ function decryptKeypair(encrypted, password) {
69
+ const key = crypto.scryptSync(password, 'salt', 32);
70
+ const decipher = crypto.createDecipheriv(ALGORITHM, key, Buffer.from(encrypted.iv, 'hex'));
71
+ decipher.setAuthTag(Buffer.from(encrypted.authTag, 'hex'));
72
+ let decrypted = decipher.update(Buffer.from(encrypted.encrypted, 'hex'));
73
+ decrypted = Buffer.concat([decrypted, decipher.final()]);
74
+ return Keypair.fromSecretKey(decrypted);
75
+ }
76
+ /**
77
+ * Get wallet address without exposing private key
78
+ */
79
+ export function getWalletAddress(password) {
80
+ const publicKey = loadWallet(password);
81
+ return publicKey.toBase58();
82
+ }
83
+ import * as readline from 'readline';
84
+ // Word list for generating confirmation phrases
85
+ const CONFIRM_WORDS = [
86
+ 'alpha', 'bravo', 'charlie', 'delta', 'echo', 'foxtrot', 'golf', 'hotel',
87
+ 'india', 'juliet', 'kilo', 'lima', 'mike', 'november', 'oscar', 'papa',
88
+ 'quebec', 'romeo', 'sierra', 'tango', 'uniform', 'victor', 'whiskey', 'xray',
89
+ 'yankee', 'zulu', 'red', 'blue', 'green', 'orange', 'purple', 'yellow'
90
+ ];
91
+ /**
92
+ * Generate a random confirmation phrase
93
+ */
94
+ function generateConfirmPhrase() {
95
+ const words = [];
96
+ for (let i = 0; i < 3; i++) {
97
+ const idx = Math.floor(Math.random() * CONFIRM_WORDS.length);
98
+ words.push(CONFIRM_WORDS[idx]);
99
+ }
100
+ return words.join('-');
101
+ }
102
+ /**
103
+ * Require user to type a confirmation phrase
104
+ * This prevents automated extraction via agents/bots
105
+ */
106
+ export async function requireManualConfirmation(action) {
107
+ // Check for agent environment - hard block
108
+ const agentIndicators = [
109
+ 'OPENCLAW_SESSION',
110
+ 'OPENCLAW_AGENT',
111
+ 'OPENCLAW_CHANNEL',
112
+ 'TELEGRAM_BOT_TOKEN',
113
+ 'DISCORD_TOKEN',
114
+ 'SLACK_BOT_TOKEN',
115
+ ];
116
+ if (agentIndicators.some(env => process.env[env])) {
117
+ throw new Error('šŸ”’ SECURITY: This command cannot be run via agent/bot.\n' +
118
+ 'SSH into your server and run directly: trader wallet export');
119
+ }
120
+ const phrase = generateConfirmPhrase();
121
+ console.log('\nšŸ”’ SECURITY CONFIRMATION REQUIRED');
122
+ console.log(` Action: ${action}`);
123
+ console.log(`\n To confirm, type this phrase exactly: ${phrase}\n`);
124
+ const rl = readline.createInterface({
125
+ input: process.stdin,
126
+ output: process.stdout,
127
+ });
128
+ return new Promise((resolve, reject) => {
129
+ // Timeout after 30 seconds
130
+ const timeout = setTimeout(() => {
131
+ rl.close();
132
+ reject(new Error('Confirmation timed out. Please try again.'));
133
+ }, 30000);
134
+ rl.question(' Confirm: ', (answer) => {
135
+ clearTimeout(timeout);
136
+ rl.close();
137
+ if (answer.trim().toLowerCase() === phrase.toLowerCase()) {
138
+ resolve();
139
+ }
140
+ else {
141
+ reject(new Error('Confirmation phrase did not match. Aborting for security.'));
142
+ }
143
+ });
144
+ });
145
+ }
146
+ /**
147
+ * Export private key as base58 string for backup
148
+ * WARNING: Only use this for secure backup. Never share.
149
+ * SECURITY: Requires manual confirmation - cannot be automated via agent/remote.
150
+ */
151
+ export async function exportPrivateKey(password) {
152
+ // Security check: require manual confirmation
153
+ await requireManualConfirmation('Export wallet private key');
154
+ const keypair = loadKeypairForSigning(password);
155
+ // Convert secret key (Uint8Array) to base58 for Phantom/Solflare import
156
+ const bs58Chars = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
157
+ let result = '';
158
+ let bytes = Array.from(keypair.secretKey);
159
+ while (bytes.length) {
160
+ let carry = 0;
161
+ const newBytes = [];
162
+ for (const byte of bytes) {
163
+ carry = carry * 256 + byte;
164
+ if (newBytes.length || carry >= 58) {
165
+ newBytes.push(Math.floor(carry / 58));
166
+ carry %= 58;
167
+ }
168
+ }
169
+ result = bs58Chars[carry] + result;
170
+ bytes = newBytes;
171
+ }
172
+ // Add leading '1's for leading zero bytes
173
+ for (const byte of keypair.secretKey) {
174
+ if (byte === 0)
175
+ result = '1' + result;
176
+ else
177
+ break;
178
+ }
179
+ return result;
180
+ }
181
+ //# sourceMappingURL=wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/utils/wallet.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@zeroexcore/trader",
3
+ "version": "1.0.0",
4
+ "description": "Solana trading CLI - Trade tokens, track portfolio, bet on prediction markets",
5
+ "type": "module",
6
+ "main": "./dist/cli.js",
7
+ "bin": {
8
+ "trader": "./dist/cli.js"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "publishConfig": {
14
+ "access": "public"
15
+ },
16
+ "scripts": {
17
+ "build": "tsc",
18
+ "dev": "tsx src/cli.ts",
19
+ "start": "node dist/cli.js",
20
+ "prepublishOnly": "npm run build"
21
+ },
22
+ "keywords": [
23
+ "solana",
24
+ "trading",
25
+ "cli",
26
+ "openclaw",
27
+ "rwa",
28
+ "defi"
29
+ ],
30
+ "author": "",
31
+ "license": "ISC",
32
+ "dependencies": {
33
+ "@coral-xyz/anchor": "0.29.0",
34
+ "@solana/spl-token": "0.4.14",
35
+ "@solana/web3.js": "1.98.4",
36
+ "big.js": "7.0.1",
37
+ "commander": "12.1.0",
38
+ "dotenv": "16.6.1",
39
+ "tsx": "4.21.0"
40
+ },
41
+ "devDependencies": {
42
+ "@types/big.js": "6.2.2",
43
+ "@types/node": "25.3.2",
44
+ "typescript": "5.9.3"
45
+ }
46
+ }