@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
package/README.md ADDED
@@ -0,0 +1,125 @@
1
+ # @zeroexcore/trader
2
+
3
+ Solana trading CLI — tokens, prediction markets, perpetuals, NFTs.
4
+
5
+ ## Setup
6
+
7
+ ```bash
8
+ git clone https://github.com/zeroexcore/trader
9
+ cd trader
10
+ npm install
11
+ npm run dev -- <command>
12
+ ```
13
+
14
+ ### Environment
15
+
16
+ ```bash
17
+ HELIUS_API_KEY=xxx # required - RPC + DAS API (free at dev.helius.xyz)
18
+ WALLET_PASSWORD=xxx # required - wallet encryption password
19
+ JUPITER_API_KEY=xxx # for swaps + predictions (free at portal.jup.ag)
20
+ USE_HELIUS_SENDER=true # optional - low-latency tx submission
21
+ RPC_URL=xxx # optional - override RPC endpoint
22
+ ```
23
+
24
+ ```bash
25
+ trader wallet generate # one-time wallet creation
26
+ trader diagnose # verify everything works
27
+ ```
28
+
29
+ ## Commands
30
+
31
+ ```
32
+ trader
33
+ ├── wallet # wallet management
34
+ │ ├── address # public address (safe to share)
35
+ │ ├── generate # create encrypted wallet (one time)
36
+ │ └── export # export private key for backup
37
+
38
+ ├── tokens # token registry, market data, swaps
39
+ │ ├── list # saved token addresses
40
+ │ ├── add <TICKER> <addr> # save a token
41
+ │ ├── remove <TICKER> # remove a token
42
+ │ ├── browse # discover trending tokens [verified]
43
+ │ ├── search <query> # search by name/symbol [verified]
44
+ │ ├── info <token> # detailed market data
45
+ │ ├── quote <in> <out> <amt> # get swap quote
46
+ │ ├── swap <in> <out> <amt> # execute swap (--note, --force)
47
+ │ └── positions # on-chain token holdings
48
+
49
+ ├── portfolio # aggregate view: tokens + predictions + PnL
50
+
51
+ ├── predict # prediction markets (Jupiter)
52
+ │ ├── browse # discover popular markets (-c category)
53
+ │ ├── search <query> # search events
54
+ │ ├── show <market-id> # odds + details
55
+ │ ├── buy <id> <side> <amt> # buy contracts (--note)
56
+ │ ├── sell <id> <side> <n> # sell contracts (--note)
57
+ │ ├── close <id> # close entire position (--note)
58
+ │ ├── claim <id> # claim winnings (--note)
59
+ │ └── positions # my prediction bets + PnL
60
+
61
+ ├── perps # perpetual futures (Jupiter)
62
+ │ ├── show [market] # market info + fees
63
+ │ ├── positions # open perp positions
64
+ │ └── pool # JLP pool AUM
65
+
66
+ ├── nfts # NFT market data (Magic Eden)
67
+ │ ├── floor <collection> # floor price
68
+ │ ├── listings <collection> # browse listings
69
+ │ ├── popular # trending collections
70
+ │ ├── search <query> # search collections
71
+ │ └── positions # my NFT holdings
72
+
73
+ └── diagnose # check env, connectivity, wallet, balance
74
+ ```
75
+
76
+ ### Output
77
+
78
+ JSON by default (for agent consumption). Use `--md` for human-readable markdown.
79
+
80
+ ```bash
81
+ trader --md portfolio # human-readable
82
+ trader portfolio # JSON (default)
83
+ ```
84
+
85
+ ### Safety
86
+
87
+ - **SOL gas reserve:** `tokens swap` blocks selling SOL below 0.05 SOL reserve. Use `--force` to override.
88
+ - **Trade journaling:** All mutation commands accept `--note "reason"` for automatic position tracking.
89
+ - Positions auto-tracked in `~/.openclaw/trader-positions.json`
90
+
91
+ ### Token Shortcuts
92
+
93
+ Built-in: `SOL`, `USDC`, `USDT`, `WBTC`, `WETH`, `JUP`, `JupUSD`, `GLDx`, `RAY`
94
+
95
+ Add more: `trader tokens add BONK DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263`
96
+
97
+ ### Prediction Markets
98
+
99
+ Requires `JUPITER_API_KEY`. Geo-blocked in US/South Korea.
100
+
101
+ **Pricing:** $0.85 = 85% implied probability. Win $1/contract if correct.
102
+
103
+ ```bash
104
+ trader predict search "NBA" # find events
105
+ trader predict show POLY-566140 # check odds
106
+ trader predict buy POLY-566140 yes 2 # bet $2
107
+ trader predict positions # monitor bets
108
+ trader predict claim POLY-566140 # collect winnings
109
+ ```
110
+
111
+ ## Security
112
+
113
+ All sensitive data in `~/.openclaw/` with restrictive permissions:
114
+ - `trader-wallet.enc` — encrypted wallet (AES-256-GCM, `0600`)
115
+ - `trader-positions.json` — trade journal (`0600`)
116
+ - `trader-tokens.json` — token registry (`0600`)
117
+
118
+ Never share your password or private key. Public address is safe to share.
119
+
120
+ ## Agent Integration
121
+
122
+ This CLI is designed for use by [OpenClaw](https://openclaw.ai) agents.
123
+
124
+ - `SKILL.md` — OpenCode skill definition
125
+ - `openclaw-skill.md` — ClawHub skill definition
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import dotenv from 'dotenv';
4
+ import { setRootProgram } from './commands/shared.js';
5
+ import { walletCommand } from './commands/wallet.js';
6
+ import { tokensCommand } from './commands/tokens/index.js';
7
+ import { portfolioCommand } from './commands/portfolio.js';
8
+ import { predictCommand } from './commands/predict/index.js';
9
+ import { perpsCommand } from './commands/perps/index.js';
10
+ import { nftsCommand } from './commands/nfts/index.js';
11
+ import { diagnoseCommand } from './commands/diagnose.js';
12
+ dotenv.config();
13
+ const program = new Command();
14
+ program
15
+ .name('trader')
16
+ .description('Solana trading CLI')
17
+ .version('1.0.0')
18
+ .option('--md', 'Output as markdown (default is JSON)');
19
+ setRootProgram(program);
20
+ program.addCommand(walletCommand);
21
+ program.addCommand(tokensCommand);
22
+ program.addCommand(portfolioCommand);
23
+ program.addCommand(predictCommand);
24
+ program.addCommand(perpsCommand);
25
+ program.addCommand(nftsCommand);
26
+ program.addCommand(diagnoseCommand);
27
+ program.parse(process.argv);
28
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,oBAAoB,CAAC;KACjC,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,MAAM,EAAE,sCAAsC,CAAC,CAAC;AAE1D,cAAc,CAAC,OAAO,CAAC,CAAC;AAExB,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;AACrC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AAEpC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const bookCommand: Command;
3
+ //# sourceMappingURL=book.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"book.d.ts","sourceRoot":"","sources":["../../src/commands/book.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,WAAW,SAA+D,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { Command } from 'commander';
2
+ import { loadTokenBook, saveTokenBook } from '../utils/token-book.js';
3
+ import { output, error } from './shared.js';
4
+ export const bookCommand = new Command('book').description('Manage token address book');
5
+ bookCommand
6
+ .command('list')
7
+ .description('List all tokens in address book')
8
+ .action(() => {
9
+ const tokens = loadTokenBook();
10
+ const entries = Object.entries(tokens).map(([ticker, address]) => ({ ticker, address }));
11
+ output({ tokens: entries }, () => {
12
+ if (entries.length === 0)
13
+ return 'Token address book is empty';
14
+ const rows = entries.map((e) => `| ${e.ticker} | ${e.address} |`).join('\n');
15
+ return `## Token Address Book\n\n| Ticker | Address |\n|--------|---------||\n${rows}`;
16
+ });
17
+ });
18
+ bookCommand
19
+ .command('add <ticker> <address>')
20
+ .description('Add token to address book')
21
+ .action((ticker, address) => {
22
+ const tokens = loadTokenBook();
23
+ const upperTicker = ticker.toUpperCase();
24
+ if (address.length < 32)
25
+ error('Invalid address', { address });
26
+ tokens[upperTicker] = address;
27
+ saveTokenBook(tokens);
28
+ output({ success: true, ticker: upperTicker, address }, () => `Added **${upperTicker}** → \`${address}\``);
29
+ });
30
+ bookCommand
31
+ .command('remove <ticker>')
32
+ .description('Remove token from address book')
33
+ .action((ticker) => {
34
+ const tokens = loadTokenBook();
35
+ const upperTicker = ticker.toUpperCase();
36
+ if (!tokens[upperTicker]) {
37
+ error('Token not found', { ticker: upperTicker });
38
+ }
39
+ const address = tokens[upperTicker];
40
+ delete tokens[upperTicker];
41
+ saveTokenBook(tokens);
42
+ output({ success: true, ticker: upperTicker, removed: address }, () => `Removed **${upperTicker}** (\`${address}\`)`);
43
+ });
44
+ //# sourceMappingURL=book.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"book.js","sourceRoot":"","sources":["../../src/commands/book.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,2BAA2B,CAAC,CAAC;AAExF,WAAW;KACR,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,iCAAiC,CAAC;KAC9C,MAAM,CAAC,GAAG,EAAE;IACX,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACzF,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE;QAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,6BAA6B,CAAC;QAC/D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7E,OAAO,yEAAyE,IAAI,EAAE,CAAC;IACzF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,WAAW;KACR,OAAO,CAAC,wBAAwB,CAAC;KACjC,WAAW,CAAC,2BAA2B,CAAC;KACxC,MAAM,CAAC,CAAC,MAAc,EAAE,OAAe,EAAE,EAAE;IAC1C,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAEzC,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE;QAAE,KAAK,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAE/D,MAAM,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC;IAC9B,aAAa,CAAC,MAAM,CAAC,CAAC;IAEtB,MAAM,CACJ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,EAC/C,GAAG,EAAE,CAAC,WAAW,WAAW,UAAU,OAAO,IAAI,CAClD,CAAC;AACJ,CAAC,CAAC,CAAC;AAEL,WAAW;KACR,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,CAAC,MAAc,EAAE,EAAE;IACzB,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAEzC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;IACpC,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC;IAC3B,aAAa,CAAC,MAAM,CAAC,CAAC;IAEtB,MAAM,CACJ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,EACxD,GAAG,EAAE,CAAC,aAAa,WAAW,SAAS,OAAO,KAAK,CACpD,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const diagnoseCommand: Command;
3
+ //# sourceMappingURL=diagnose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnose.d.ts","sourceRoot":"","sources":["../../src/commands/diagnose.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8IpC,eAAO,MAAM,eAAe,SAsBxB,CAAC"}
@@ -0,0 +1,148 @@
1
+ import { Command } from 'commander';
2
+ import { Connection, PublicKey } from '@solana/web3.js';
3
+ import fs from 'fs';
4
+ import { output } from './shared.js';
5
+ import { env, paths, apis, getRpcUrl } from '../config.js';
6
+ import { getWalletAddress } from '../utils/wallet.js';
7
+ // Individual check helpers - each returns a Check
8
+ async function checkWalletPassword() {
9
+ const password = env.walletPassword();
10
+ return password
11
+ ? { name: 'WALLET_PASSWORD', status: 'ok', message: 'Set' }
12
+ : { name: 'WALLET_PASSWORD', status: 'fail', message: 'Not set - required for wallet operations' };
13
+ }
14
+ async function checkHeliusKey() {
15
+ const key = env.heliusApiKey();
16
+ return key
17
+ ? { name: 'HELIUS_API_KEY', status: 'ok', message: 'Set' }
18
+ : { name: 'HELIUS_API_KEY', status: 'fail', message: 'Not set - get free key at https://dev.helius.xyz' };
19
+ }
20
+ async function checkJupiterKey() {
21
+ const key = env.jupiterApiKey();
22
+ return key
23
+ ? { name: 'JUPITER_API_KEY', status: 'ok', message: 'Set' }
24
+ : { name: 'JUPITER_API_KEY', status: 'warn', message: 'Not set - needed for predictions' };
25
+ }
26
+ async function checkWalletFile() {
27
+ const walletPath = paths.walletFile();
28
+ return fs.existsSync(walletPath)
29
+ ? { name: 'Wallet file', status: 'ok', message: walletPath }
30
+ : { name: 'Wallet file', status: 'fail', message: 'Not found - run: trader wallet generate' };
31
+ }
32
+ async function checkWalletDecryption() {
33
+ const password = env.walletPassword();
34
+ const walletPath = paths.walletFile();
35
+ if (!password || !fs.existsSync(walletPath)) {
36
+ return { name: 'Wallet decryption', status: 'warn', message: 'Skipped - missing password or wallet' };
37
+ }
38
+ try {
39
+ const address = getWalletAddress(password);
40
+ return { name: 'Wallet decryption', status: 'ok', message: address, address };
41
+ }
42
+ catch (e) {
43
+ return { name: 'Wallet decryption', status: 'fail', message: e.message };
44
+ }
45
+ }
46
+ async function checkRpcConnection() {
47
+ if (!env.heliusApiKey()) {
48
+ return { name: 'Helius RPC', status: 'warn', message: 'Skipped - no API key' };
49
+ }
50
+ try {
51
+ const connection = new Connection(getRpcUrl());
52
+ const blockHeight = await connection.getBlockHeight();
53
+ return { name: 'Helius RPC', status: 'ok', message: `Connected (block ${blockHeight})` };
54
+ }
55
+ catch (e) {
56
+ return { name: 'Helius RPC', status: 'fail', message: e.message };
57
+ }
58
+ }
59
+ async function checkSolBalance(walletAddress) {
60
+ if (!walletAddress || !env.heliusApiKey()) {
61
+ return { name: 'SOL balance', status: 'warn', message: 'Skipped - missing wallet or API key' };
62
+ }
63
+ try {
64
+ const connection = new Connection(getRpcUrl());
65
+ const balance = await connection.getBalance(new PublicKey(walletAddress));
66
+ const sol = balance / 1e9;
67
+ if (sol >= 0.01)
68
+ return { name: 'SOL balance', status: 'ok', message: `${sol.toFixed(4)} SOL` };
69
+ if (sol > 0)
70
+ return { name: 'SOL balance', status: 'warn', message: `${sol.toFixed(4)} SOL - low` };
71
+ return { name: 'SOL balance', status: 'fail', message: '0 SOL - fund wallet' };
72
+ }
73
+ catch (e) {
74
+ return { name: 'SOL balance', status: 'fail', message: e.message };
75
+ }
76
+ }
77
+ async function checkJupiterApi() {
78
+ const key = env.jupiterApiKey();
79
+ if (!key) {
80
+ return { name: 'Jupiter API', status: 'warn', message: 'Skipped - no API key' };
81
+ }
82
+ try {
83
+ const res = await fetch(`${apis.jupiterPrediction}/events?limit=1`, {
84
+ headers: { 'x-api-key': key }
85
+ });
86
+ if (res.ok)
87
+ return { name: 'Jupiter API', status: 'ok', message: 'Connected' };
88
+ if (res.status === 401)
89
+ return { name: 'Jupiter API', status: 'fail', message: 'Invalid API key' };
90
+ if (res.status === 403)
91
+ return { name: 'Jupiter API', status: 'fail', message: 'Geo-blocked' };
92
+ return { name: 'Jupiter API', status: 'warn', message: `HTTP ${res.status}` };
93
+ }
94
+ catch (e) {
95
+ return { name: 'Jupiter API', status: 'fail', message: e.message };
96
+ }
97
+ }
98
+ // Run all checks and aggregate results
99
+ async function runDiagnostics() {
100
+ // Run independent checks in parallel
101
+ // Run independent checks in parallel
102
+ const [walletPassword, heliusKey, jupiterKey, walletFile] = await Promise.all([
103
+ checkWalletPassword(),
104
+ checkHeliusKey(),
105
+ checkJupiterKey(),
106
+ checkWalletFile(),
107
+ ]);
108
+ const heliusSender = {
109
+ name: 'Helius Sender',
110
+ status: env.useHeliusSender() ? 'ok' : 'ok',
111
+ message: env.useHeliusSender() ? 'Enabled' : 'Disabled'
112
+ };
113
+ // Sequential checks that depend on previous results
114
+ const walletDecrypt = await checkWalletDecryption();
115
+ const rpc = await checkRpcConnection();
116
+ const solBalance = await checkSolBalance(walletDecrypt.address);
117
+ const jupiterApi = await checkJupiterApi();
118
+ const checks = [walletPassword, heliusKey, jupiterKey, walletFile, heliusSender, walletDecrypt, rpc, solBalance, jupiterApi];
119
+ const failures = checks.filter(c => c.status === 'fail').length;
120
+ const warnings = checks.filter(c => c.status === 'warn').length;
121
+ return {
122
+ checks,
123
+ summary: { total: checks.length, ok: checks.length - failures - warnings, warnings, failures }
124
+ };
125
+ }
126
+ export const diagnoseCommand = new Command('diagnose')
127
+ .description('Check environment, connectivity, and wallet status')
128
+ .action(async () => {
129
+ const result = await runDiagnostics();
130
+ output(result, () => {
131
+ const lines = result.checks.map(c => {
132
+ const tag = c.status === 'ok' ? '[OK]' : c.status === 'warn' ? '[WARN]' : '[FAIL]';
133
+ return `${tag} ${c.name}: ${c.message}`;
134
+ });
135
+ lines.push('');
136
+ if (result.summary.failures === 0 && result.summary.warnings === 0) {
137
+ lines.push('All checks passed');
138
+ }
139
+ else if (result.summary.failures === 0) {
140
+ lines.push(`${result.summary.warnings} warning(s)`);
141
+ }
142
+ else {
143
+ lines.push(`${result.summary.failures} failure(s)`);
144
+ }
145
+ return lines.join('\n');
146
+ });
147
+ });
148
+ //# sourceMappingURL=diagnose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnose.js","sourceRoot":"","sources":["../../src/commands/diagnose.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const floorCommand: Command;
3
+ //# sourceMappingURL=floor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floor.d.ts","sourceRoot":"","sources":["../../../src/commands/nft/floor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,YAAY,SA4BrB,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { Command } from 'commander';
2
+ import { getCollectionStats, formatSol, solToUsd } from '../../utils/nft.js';
3
+ import { output, error } from '../shared.js';
4
+ export const floorCommand = new Command('floor')
5
+ .argument('<collection>', 'Collection symbol')
6
+ .description('Get floor price for a collection')
7
+ .action(async (collection) => {
8
+ try {
9
+ const stats = await getCollectionStats(collection);
10
+ const usd = solToUsd(stats.floorPrice);
11
+ output({
12
+ collection: stats.symbol,
13
+ name: stats.name,
14
+ floorPrice: stats.floorPrice.toNumber(),
15
+ floorPriceUsd: usd.toNumber(),
16
+ listedCount: stats.listedCount,
17
+ volumeAll: stats.volumeAll.toNumber(),
18
+ }, () => {
19
+ let md = `# ${stats.name}\n\n`;
20
+ md += `**Floor:** ${formatSol(stats.floorPrice)} (~$${usd.toFixed(0)})\n`;
21
+ md += `**Listed:** ${stats.listedCount}\n`;
22
+ md += `**Volume:** ${formatSol(stats.volumeAll)}\n`;
23
+ return md;
24
+ });
25
+ }
26
+ catch (e) {
27
+ error(e.message);
28
+ }
29
+ });
30
+ //# sourceMappingURL=floor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floor.js","sourceRoot":"","sources":["../../../src/commands/nft/floor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,QAAQ,CAAC,cAAc,EAAE,mBAAmB,CAAC;KAC7C,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE;IAC3B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAEvC,MAAM,CACJ;YACE,UAAU,EAAE,KAAK,CAAC,MAAM;YACxB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE;YACvC,aAAa,EAAE,GAAG,CAAC,QAAQ,EAAE;YAC7B,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE;SACtC,EACD,GAAG,EAAE;YACH,IAAI,EAAE,GAAG,KAAK,KAAK,CAAC,IAAI,MAAM,CAAC;YAC/B,EAAE,IAAI,cAAc,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;YAC1E,EAAE,IAAI,eAAe,KAAK,CAAC,WAAW,IAAI,CAAC;YAC3C,EAAE,IAAI,eAAe,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC;YACpD,OAAO,EAAE,CAAC;QACZ,CAAC,CACF,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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const nftCommand: Command;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/nft/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,UAAU,SACqB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { Command } from 'commander';
2
+ import { floorCommand } from './floor.js';
3
+ import { listingsCommand } from './listings.js';
4
+ import { popularCommand } from './popular.js';
5
+ import { searchCommand } from './search.js';
6
+ import { portfolioCommand } from './portfolio.js';
7
+ export const nftCommand = new Command('nft')
8
+ .description('NFT trading via Magic Eden');
9
+ nftCommand.addCommand(floorCommand);
10
+ nftCommand.addCommand(listingsCommand);
11
+ nftCommand.addCommand(popularCommand);
12
+ nftCommand.addCommand(searchCommand);
13
+ nftCommand.addCommand(portfolioCommand);
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/nft/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC;KACzC,WAAW,CAAC,4BAA4B,CAAC,CAAC;AAE7C,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACpC,UAAU,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AACvC,UAAU,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACtC,UAAU,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AACrC,UAAU,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const listingsCommand: Command;
3
+ //# sourceMappingURL=listings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listings.d.ts","sourceRoot":"","sources":["../../../src/commands/nft/listings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,eAAe,SAqCxB,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { Command } from 'commander';
2
+ import { getListings, solToUsd, formatSol } from '../../utils/nft.js';
3
+ import { output, error } from '../shared.js';
4
+ export const listingsCommand = new Command('listings')
5
+ .argument('<collection>', 'Collection symbol')
6
+ .description('Browse listings for a collection')
7
+ .option('-l, --limit <number>', 'Number of listings', '10')
8
+ .action(async (collection, options) => {
9
+ try {
10
+ const listings = await getListings(collection, parseInt(options.limit));
11
+ if (listings.length === 0) {
12
+ output({ collection, listings: [] }, () => 'No listings found');
13
+ return;
14
+ }
15
+ const listingsData = listings.map((l) => ({
16
+ mint: l.mint,
17
+ name: l.name,
18
+ price: l.price.toNumber(),
19
+ priceUsd: solToUsd(l.price).toNumber(),
20
+ seller: l.seller,
21
+ }));
22
+ output({ collection, count: listings.length, listings: listingsData }, () => {
23
+ let md = `# ${collection} Listings\n\n`;
24
+ for (const l of listings) {
25
+ const usd = solToUsd(l.price);
26
+ md += `**${l.name.slice(0, 50)}**\n`;
27
+ md += ` ${formatSol(l.price)} (~$${usd.toFixed(0)}) | ${l.mint.slice(0, 8)}...\n\n`;
28
+ }
29
+ md += `Showing ${listings.length} listings`;
30
+ return md;
31
+ });
32
+ }
33
+ catch (e) {
34
+ error(e.message);
35
+ }
36
+ });
37
+ //# sourceMappingURL=listings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listings.js","sourceRoot":"","sources":["../../../src/commands/nft/listings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;KACnD,QAAQ,CAAC,cAAc,EAAE,mBAAmB,CAAC;KAC7C,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,sBAAsB,EAAE,oBAAoB,EAAE,IAAI,CAAC;KAC1D,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE;IACpC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAExE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,CAAC;YAChE,OAAO;QACT,CAAC;QAED,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxC,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE;YACzB,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;YACtC,MAAM,EAAE,CAAC,CAAC,MAAM;SACjB,CAAC,CAAC,CAAC;QAEJ,MAAM,CACJ,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,EAC9D,GAAG,EAAE;YACH,IAAI,EAAE,GAAG,KAAK,UAAU,eAAe,CAAC;YACxC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBAC9B,EAAE,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC;gBACrC,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC;YACvF,CAAC;YACD,EAAE,IAAI,WAAW,QAAQ,CAAC,MAAM,WAAW,CAAC;YAC5C,OAAO,EAAE,CAAC;QACZ,CAAC,CACF,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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const popularCommand: Command;
3
+ //# sourceMappingURL=popular.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popular.d.ts","sourceRoot":"","sources":["../../../src/commands/nft/popular.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,cAAc,SA+BvB,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { Command } from 'commander';
2
+ import { getPopularCollections, solToUsd, formatSol } from '../../utils/nft.js';
3
+ import { output, error } from '../shared.js';
4
+ export const popularCommand = new Command('popular')
5
+ .description('Show popular NFT collections')
6
+ .option('-l, --limit <number>', 'Number of collections', '15')
7
+ .action(async (options) => {
8
+ try {
9
+ const collections = await getPopularCollections(50);
10
+ const limited = collections.slice(0, parseInt(options.limit));
11
+ const collectionsData = limited.map((c) => ({
12
+ symbol: c.symbol,
13
+ name: c.name,
14
+ floorPrice: c.floorPrice.toNumber(),
15
+ floorPriceUsd: solToUsd(c.floorPrice).toNumber(),
16
+ listedCount: c.listedCount,
17
+ }));
18
+ output({ count: limited.length, collections: collectionsData }, () => {
19
+ let md = `# Popular Collections (24h)\n\n`;
20
+ for (const c of limited) {
21
+ const usd = solToUsd(c.floorPrice);
22
+ md += `**${c.name}**\n`;
23
+ md += ` Floor: ${formatSol(c.floorPrice)} (~$${usd.toFixed(0)}) | Listed: ${c.listedCount}\n\n`;
24
+ }
25
+ return md;
26
+ });
27
+ }
28
+ catch (e) {
29
+ error(e.message);
30
+ }
31
+ });
32
+ //# sourceMappingURL=popular.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popular.js","sourceRoot":"","sources":["../../../src/commands/nft/popular.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,8BAA8B,CAAC;KAC3C,MAAM,CAAC,sBAAsB,EAAE,uBAAuB,EAAE,IAAI,CAAC;KAC7D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,qBAAqB,CAAC,EAAE,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAE9D,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1C,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE;YACnC,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE;YAChD,WAAW,EAAE,CAAC,CAAC,WAAW;SAC3B,CAAC,CAAC,CAAC;QAEJ,MAAM,CACJ,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,EACvD,GAAG,EAAE;YACH,IAAI,EAAE,GAAG,iCAAiC,CAAC;YAC3C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;gBACnC,EAAE,IAAI,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC;gBACxB,EAAE,IAAI,YAAY,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,WAAW,MAAM,CAAC;YACnG,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC,CACF,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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const portfolioCommand: Command;
3
+ //# sourceMappingURL=portfolio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portfolio.d.ts","sourceRoot":"","sources":["../../../src/commands/nft/portfolio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,gBAAgB,SA0CzB,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { Command } from 'commander';
2
+ import { getWalletNFTs } from '../../utils/nft.js';
3
+ import { output, error, requirePassword } from '../shared.js';
4
+ import { getWalletAddress } from '../../utils/wallet.js';
5
+ export const portfolioCommand = new Command('portfolio')
6
+ .description('View your NFT holdings')
7
+ .action(async () => {
8
+ const password = requirePassword();
9
+ try {
10
+ const address = getWalletAddress(password);
11
+ const nfts = await getWalletNFTs(address);
12
+ if (nfts.length === 0) {
13
+ output({ address, nfts: [] }, () => 'No NFTs found');
14
+ return;
15
+ }
16
+ const nftsData = nfts.map((n) => ({
17
+ mint: n.mintAddress,
18
+ name: n.name || 'Unknown',
19
+ collection: n.collection || 'Unknown',
20
+ listStatus: n.listStatus,
21
+ price: n.price || null,
22
+ }));
23
+ output({ address, count: nfts.length, nfts: nftsData }, () => {
24
+ let md = `# NFT Portfolio\n\nAddress: ${address}\n\n`;
25
+ for (const n of nfts) {
26
+ const listed = n.listStatus === 'listed' ? ' [LISTED]' : '';
27
+ md += `**${n.name || 'Unknown'}**${listed}\n`;
28
+ md += ` Collection: ${n.collection || 'Unknown'}\n`;
29
+ md += ` Mint: ${n.mintAddress}\n`;
30
+ if (n.price) {
31
+ md += ` Price: ${n.price} SOL\n`;
32
+ }
33
+ md += '\n';
34
+ }
35
+ md += `Total: ${nfts.length} NFTs`;
36
+ return md;
37
+ });
38
+ }
39
+ catch (e) {
40
+ error(e.message);
41
+ }
42
+ });
43
+ //# sourceMappingURL=portfolio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portfolio.js","sourceRoot":"","sources":["../../../src/commands/nft/portfolio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC;KACrD,WAAW,CAAC,wBAAwB,CAAC;KACrC,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,IAAI,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;QAE1C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAChC,IAAI,EAAE,CAAC,CAAC,WAAW;YACnB,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,SAAS;YACzB,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,SAAS;YACrC,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI;SACvB,CAAC,CAAC,CAAC;QAEJ,MAAM,CACJ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,EAC/C,GAAG,EAAE;YACH,IAAI,EAAE,GAAG,+BAA+B,OAAO,MAAM,CAAC;YACtD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBACrB,MAAM,MAAM,GAAG,CAAC,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5D,EAAE,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,SAAS,KAAK,MAAM,IAAI,CAAC;gBAC9C,EAAE,IAAI,iBAAiB,CAAC,CAAC,UAAU,IAAI,SAAS,IAAI,CAAC;gBACrD,EAAE,IAAI,WAAW,CAAC,CAAC,WAAW,IAAI,CAAC;gBACnC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;oBACZ,EAAE,IAAI,YAAY,CAAC,CAAC,KAAK,QAAQ,CAAC;gBACpC,CAAC;gBACD,EAAE,IAAI,IAAI,CAAC;YACb,CAAC;YACD,EAAE,IAAI,UAAU,IAAI,CAAC,MAAM,OAAO,CAAC;YACnC,OAAO,EAAE,CAAC;QACZ,CAAC,CACF,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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const searchCommand: Command;
3
+ //# sourceMappingURL=search.d.ts.map