httpcat-cli 0.2.13 → 0.3.0-rc.10

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 (209) hide show
  1. package/.github/workflows/release.yml +96 -0
  2. package/.github/workflows/sync-version.yml +31 -2
  3. package/README.md +191 -68
  4. package/additions.txt +3 -0
  5. package/bun.lock +205 -1265
  6. package/dist/agent/autonomous-trader.d.ts.map +1 -0
  7. package/dist/agent/autonomous-trader.js +362 -0
  8. package/dist/agent/autonomous-trader.js.map +1 -0
  9. package/dist/agent/ax-agent.d.ts.map +1 -1
  10. package/dist/agent/ax-agent.js +293 -18
  11. package/dist/agent/ax-agent.js.map +1 -1
  12. package/dist/agent/event-client.d.ts.map +1 -0
  13. package/dist/agent/event-client.js +82 -0
  14. package/dist/agent/event-client.js.map +1 -0
  15. package/dist/agent/log-stream.d.ts.map +1 -0
  16. package/dist/agent/log-stream.js +95 -0
  17. package/dist/agent/log-stream.js.map +1 -0
  18. package/dist/agent/memory/conversation-session.d.ts.map +1 -0
  19. package/dist/agent/memory/conversation-session.js +232 -0
  20. package/dist/agent/memory/conversation-session.js.map +1 -0
  21. package/dist/agent/memory/conversation-store.d.ts.map +1 -0
  22. package/dist/agent/memory/conversation-store.js +214 -0
  23. package/dist/agent/memory/conversation-store.js.map +1 -0
  24. package/dist/agent/memory/database-schema.d.ts.map +1 -0
  25. package/dist/agent/memory/database-schema.js +355 -0
  26. package/dist/agent/memory/database-schema.js.map +1 -0
  27. package/dist/agent/memory/decision-tracker.d.ts.map +1 -0
  28. package/dist/agent/memory/decision-tracker.js +274 -0
  29. package/dist/agent/memory/decision-tracker.js.map +1 -0
  30. package/dist/agent/memory/memory-manager.d.ts.map +1 -0
  31. package/dist/agent/memory/memory-manager.js +187 -0
  32. package/dist/agent/memory/memory-manager.js.map +1 -0
  33. package/dist/agent/memory/types.d.ts.map +1 -0
  34. package/dist/agent/memory/types.js +5 -0
  35. package/dist/agent/memory/types.js.map +1 -0
  36. package/dist/agent/message-formatter.d.ts.map +1 -0
  37. package/dist/agent/message-formatter.js +76 -0
  38. package/dist/agent/message-formatter.js.map +1 -0
  39. package/dist/agent/position-db.d.ts.map +1 -0
  40. package/dist/agent/position-db.js +154 -0
  41. package/dist/agent/position-db.js.map +1 -0
  42. package/dist/agent/simple-chat-ui-static.d.ts.map +1 -0
  43. package/dist/agent/simple-chat-ui-static.js +129 -0
  44. package/dist/agent/simple-chat-ui-static.js.map +1 -0
  45. package/dist/agent/simple-chat-ui.d.ts.map +1 -0
  46. package/dist/agent/simple-chat-ui.js +90 -0
  47. package/dist/agent/simple-chat-ui.js.map +1 -0
  48. package/dist/agent/tools.d.ts.map +1 -1
  49. package/dist/agent/tools.js +280 -5
  50. package/dist/agent/tools.js.map +1 -1
  51. package/dist/agent/ui.d.ts.map +1 -0
  52. package/dist/agent/ui.js +84 -0
  53. package/dist/agent/ui.js.map +1 -0
  54. package/dist/agent/unified-runtime.d.ts.map +1 -0
  55. package/dist/agent/unified-runtime.js +397 -0
  56. package/dist/agent/unified-runtime.js.map +1 -0
  57. package/dist/client.d.ts.map +1 -1
  58. package/dist/client.js +410 -49
  59. package/dist/client.js.map +1 -1
  60. package/dist/commands/account.d.ts.map +1 -1
  61. package/dist/commands/account.js +163 -28
  62. package/dist/commands/account.js.map +1 -1
  63. package/dist/commands/agent.d.ts.map +1 -0
  64. package/dist/commands/agent.js +258 -0
  65. package/dist/commands/agent.js.map +1 -0
  66. package/dist/commands/balances.d.ts.map +1 -1
  67. package/dist/commands/balances.js +229 -74
  68. package/dist/commands/balances.js.map +1 -1
  69. package/dist/commands/buy.d.ts.map +1 -1
  70. package/dist/commands/buy.js +88 -44
  71. package/dist/commands/buy.js.map +1 -1
  72. package/dist/commands/chat.d.ts.map +1 -1
  73. package/dist/commands/chat.js +203 -432
  74. package/dist/commands/chat.js.map +1 -1
  75. package/dist/commands/claim.d.ts.map +1 -1
  76. package/dist/commands/claim.js +86 -29
  77. package/dist/commands/claim.js.map +1 -1
  78. package/dist/commands/create.d.ts.map +1 -1
  79. package/dist/commands/create.js +65 -42
  80. package/dist/commands/create.js.map +1 -1
  81. package/dist/commands/health.d.ts.map +1 -1
  82. package/dist/commands/health.js +7 -5
  83. package/dist/commands/health.js.map +1 -1
  84. package/dist/commands/info.d.ts.map +1 -1
  85. package/dist/commands/info.js +136 -49
  86. package/dist/commands/info.js.map +1 -1
  87. package/dist/commands/list.d.ts.map +1 -1
  88. package/dist/commands/list.js +57 -23
  89. package/dist/commands/list.js.map +1 -1
  90. package/dist/commands/perps.d.ts.map +1 -0
  91. package/dist/commands/perps.js +192 -0
  92. package/dist/commands/perps.js.map +1 -0
  93. package/dist/commands/positions.d.ts.map +1 -1
  94. package/dist/commands/positions.js +77 -48
  95. package/dist/commands/positions.js.map +1 -1
  96. package/dist/commands/predict.d.ts.map +1 -0
  97. package/dist/commands/predict.js +280 -0
  98. package/dist/commands/predict.js.map +1 -0
  99. package/dist/commands/sell.d.ts.map +1 -1
  100. package/dist/commands/sell.js +79 -39
  101. package/dist/commands/sell.js.map +1 -1
  102. package/dist/commands/swap.d.ts.map +1 -0
  103. package/dist/commands/swap.js +541 -0
  104. package/dist/commands/swap.js.map +1 -0
  105. package/dist/commands/transactions.d.ts.map +1 -1
  106. package/dist/commands/transactions.js +28 -16
  107. package/dist/commands/transactions.js.map +1 -1
  108. package/dist/config.d.ts.map +1 -1
  109. package/dist/config.js +330 -34
  110. package/dist/config.js.map +1 -1
  111. package/dist/index.js +1219 -167
  112. package/dist/index.js.map +1 -1
  113. package/dist/interactive/art.d.ts.map +1 -1
  114. package/dist/interactive/art.js +38 -1
  115. package/dist/interactive/art.js.map +1 -1
  116. package/dist/interactive/shell.d.ts.map +1 -1
  117. package/dist/interactive/shell.js +398 -2259
  118. package/dist/interactive/shell.js.map +1 -1
  119. package/dist/mcp/chat-state.d.ts.map +1 -1
  120. package/dist/mcp/chat-state.js +2 -1
  121. package/dist/mcp/chat-state.js.map +1 -1
  122. package/dist/mcp/server.js +1 -1
  123. package/dist/mcp/tools.d.ts.map +1 -1
  124. package/dist/mcp/tools.js +108 -1
  125. package/dist/mcp/tools.js.map +1 -1
  126. package/dist/mcp/types.d.ts.map +1 -1
  127. package/dist/types/agent-info.d.ts.map +1 -0
  128. package/dist/types/agent-info.js +11 -0
  129. package/dist/types/agent-info.js.map +1 -0
  130. package/dist/ui/components/ScrollableList.d.ts.map +1 -0
  131. package/dist/ui/components/ScrollableList.js +72 -0
  132. package/dist/ui/components/ScrollableList.js.map +1 -0
  133. package/dist/ui/components/ThemeProvider.d.ts.map +1 -0
  134. package/dist/ui/components/ThemeProvider.js +87 -0
  135. package/dist/ui/components/ThemeProvider.js.map +1 -0
  136. package/dist/ui/components/ThemedBox.d.ts.map +1 -0
  137. package/dist/ui/components/ThemedBox.js +24 -0
  138. package/dist/ui/components/ThemedBox.js.map +1 -0
  139. package/dist/ui/components/agent/ChatHeader.d.ts.map +1 -0
  140. package/dist/ui/components/agent/ChatHeader.js +39 -0
  141. package/dist/ui/components/agent/ChatHeader.js.map +1 -0
  142. package/dist/ui/components/agent/Header.d.ts.map +1 -0
  143. package/dist/ui/components/agent/Header.js +14 -0
  144. package/dist/ui/components/agent/Header.js.map +1 -0
  145. package/dist/ui/components/agent/Input.d.ts.map +1 -0
  146. package/dist/ui/components/agent/Input.js +23 -0
  147. package/dist/ui/components/agent/Input.js.map +1 -0
  148. package/dist/ui/components/agent/Output.d.ts.map +1 -0
  149. package/dist/ui/components/agent/Output.js +23 -0
  150. package/dist/ui/components/agent/Output.js.map +1 -0
  151. package/dist/ui/components/chat/TokenChatUI.d.ts.map +1 -0
  152. package/dist/ui/components/chat/TokenChatUI.js +133 -0
  153. package/dist/ui/components/chat/TokenChatUI.js.map +1 -0
  154. package/dist/ui/components/shell/ShellHeader.d.ts.map +1 -0
  155. package/dist/ui/components/shell/ShellHeader.js +31 -0
  156. package/dist/ui/components/shell/ShellHeader.js.map +1 -0
  157. package/dist/ui/components/shell/ShellInput.d.ts.map +1 -0
  158. package/dist/ui/components/shell/ShellInput.js +147 -0
  159. package/dist/ui/components/shell/ShellInput.js.map +1 -0
  160. package/dist/ui/components/shell/ShellOutput.d.ts.map +1 -0
  161. package/dist/ui/components/shell/ShellOutput.js +8 -0
  162. package/dist/ui/components/shell/ShellOutput.js.map +1 -0
  163. package/dist/ui/hooks/useChatWebSocket.d.ts.map +1 -0
  164. package/dist/ui/hooks/useChatWebSocket.js +76 -0
  165. package/dist/ui/hooks/useChatWebSocket.js.map +1 -0
  166. package/dist/ui/hooks/useCommandHistory.d.ts.map +1 -0
  167. package/dist/ui/hooks/useCommandHistory.js +70 -0
  168. package/dist/ui/hooks/useCommandHistory.js.map +1 -0
  169. package/dist/ui/hooks/useDebounce.d.ts.map +1 -0
  170. package/dist/ui/hooks/useDebounce.js +17 -0
  171. package/dist/ui/hooks/useDebounce.js.map +1 -0
  172. package/dist/ui/hooks/useLogStream.d.ts.map +1 -0
  173. package/dist/ui/hooks/useLogStream.js +20 -0
  174. package/dist/ui/hooks/useLogStream.js.map +1 -0
  175. package/dist/ui/hooks/useVirtualScroll.d.ts.map +1 -0
  176. package/dist/ui/hooks/useVirtualScroll.js +70 -0
  177. package/dist/ui/hooks/useVirtualScroll.js.map +1 -0
  178. package/dist/utils/constants.d.ts.map +1 -1
  179. package/dist/utils/constants.js +44 -2
  180. package/dist/utils/constants.js.map +1 -1
  181. package/dist/utils/errors.d.ts.map +1 -1
  182. package/dist/utils/errors.js +3 -3
  183. package/dist/utils/errors.js.map +1 -1
  184. package/dist/utils/formatting.d.ts.map +1 -1
  185. package/dist/utils/formatting.js +37 -6
  186. package/dist/utils/formatting.js.map +1 -1
  187. package/dist/utils/loading.d.ts.map +1 -1
  188. package/dist/utils/loading.js +25 -3
  189. package/dist/utils/loading.js.map +1 -1
  190. package/dist/utils/privateKeyPrompt.d.ts.map +1 -1
  191. package/dist/utils/privateKeyPrompt.js +48 -13
  192. package/dist/utils/privateKeyPrompt.js.map +1 -1
  193. package/dist/utils/rpc-helpers.d.ts.map +1 -0
  194. package/dist/utils/rpc-helpers.js +70 -0
  195. package/dist/utils/rpc-helpers.js.map +1 -0
  196. package/dist/utils/rpc-transport.d.ts.map +1 -0
  197. package/dist/utils/rpc-transport.js +87 -0
  198. package/dist/utils/rpc-transport.js.map +1 -0
  199. package/dist/utils/status.d.ts.map +1 -0
  200. package/dist/utils/status.js +96 -0
  201. package/dist/utils/status.js.map +1 -0
  202. package/dist/utils/token-resolver.d.ts.map +1 -1
  203. package/dist/utils/token-resolver.js +45 -8
  204. package/dist/utils/token-resolver.js.map +1 -1
  205. package/issues.txt +2 -0
  206. package/package.json +17 -7
  207. package/swap.logs +61 -0
  208. package/swapping.txt +108 -0
  209. package/Screenshot 2025-12-21 at 8.56.02/342/200/257PM.png +0 -0
@@ -0,0 +1,280 @@
1
+ import chalk from "chalk";
2
+ import { printBox, formatCurrency } from "../utils/formatting.js";
3
+ /**
4
+ * Get prediction markets
5
+ */
6
+ export async function getPredictionMarkets(client, venue, category, limit = 50, silent = false) {
7
+ const input = { limit };
8
+ if (venue)
9
+ input.venue = venue;
10
+ if (category)
11
+ input.category = category;
12
+ const { data } = await client.invoke("predictions/markets", input);
13
+ return data;
14
+ }
15
+ /**
16
+ * Search prediction markets
17
+ */
18
+ export async function searchPredictions(client, query, venue, silent = false) {
19
+ const input = { query };
20
+ if (venue)
21
+ input.venue = venue;
22
+ const { data } = await client.invoke("predictions/search", input);
23
+ return data;
24
+ }
25
+ /**
26
+ * Place a bet on a prediction market
27
+ */
28
+ export async function placeBet(client, marketId, outcomeId, amount, venue, silent = false) {
29
+ const input = { marketId, outcomeId, amount };
30
+ if (venue)
31
+ input.venue = venue;
32
+ const { data } = await client.invoke("predictions/bet", input);
33
+ return data;
34
+ }
35
+ /**
36
+ * Detect arbitrage opportunities
37
+ */
38
+ export async function detectArbs(client, minProfit = 1.0, venues, silent = false) {
39
+ const input = { min_profit_pct: minProfit };
40
+ if (venues && venues.length > 0)
41
+ input.venues = venues;
42
+ const { data } = await client.invoke("predictions/detect_arbs", input);
43
+ return data;
44
+ }
45
+ /**
46
+ * Execute an arbitrage opportunity
47
+ */
48
+ export async function executeArb(client, arbId, amount, autoExecute = false, silent = false) {
49
+ const input = { arb_id: arbId, amount, auto_execute: autoExecute };
50
+ const { data } = await client.invoke("predictions/execute_arb", input);
51
+ return data;
52
+ }
53
+ /**
54
+ * Get market correlations
55
+ */
56
+ export async function getCorrelations(client, topMarkets = 50, period = "days_7", minCorrelation = 0.5, silent = false) {
57
+ const input = {
58
+ top_markets: topMarkets,
59
+ period,
60
+ min_correlation: minCorrelation,
61
+ };
62
+ const { data } = await client.invoke("predictions/correlations", input);
63
+ return data;
64
+ }
65
+ /**
66
+ * Detect insider trading
67
+ */
68
+ export async function detectInsiders(client, marketId, silent = false) {
69
+ const input = { market_id: marketId };
70
+ const { data } = await client.invoke("predictions/detect_insiders", input);
71
+ return data;
72
+ }
73
+ // Display functions
74
+ export function displayPredictionMarkets(result) {
75
+ console.log();
76
+ console.log(chalk.cyan.bold("Prediction Markets"));
77
+ if (result.venue) {
78
+ console.log(chalk.dim(`Venue: ${result.venue}`));
79
+ }
80
+ console.log();
81
+ if (result.markets.length === 0) {
82
+ console.log(chalk.yellow("No markets found"));
83
+ return;
84
+ }
85
+ for (const market of result.markets) {
86
+ console.log(chalk.white.bold(truncate(market.question, 70)));
87
+ console.log(chalk.dim(` ID: ${market.id.substring(0, 20)}... | Venue: ${market.venue} | Category: ${market.category || "N/A"}`));
88
+ // Show outcomes with prices
89
+ const outcomeStrs = market.outcomes.map((o) => {
90
+ const priceColor = o.price > 0.5 ? chalk.green : chalk.red;
91
+ return `${o.name}: ${priceColor((o.price * 100).toFixed(1) + "%")}`;
92
+ });
93
+ console.log(chalk.dim(` Outcomes: `) + outcomeStrs.join(" | "));
94
+ if (market.volume) {
95
+ console.log(chalk.dim(` Volume: ${formatCurrency(market.volume)}`));
96
+ }
97
+ console.log();
98
+ }
99
+ console.log(chalk.dim(`Showing ${result.markets.length} of ${result.total} markets`));
100
+ console.log();
101
+ }
102
+ export function displaySearchResults(result) {
103
+ console.log();
104
+ console.log(chalk.cyan.bold(`Search Results for "${result.query}"`));
105
+ console.log();
106
+ if (result.markets.length === 0) {
107
+ console.log(chalk.yellow("No markets found matching your query"));
108
+ return;
109
+ }
110
+ for (const market of result.markets) {
111
+ console.log(chalk.white.bold(truncate(market.question, 70)));
112
+ console.log(chalk.dim(` Venue: ${market.venue} | ID: ${market.id.substring(0, 20)}...`));
113
+ const outcomeStrs = market.outcomes.map((o) => {
114
+ const priceColor = o.price > 0.5 ? chalk.green : chalk.red;
115
+ return `${o.name}: ${priceColor((o.price * 100).toFixed(1) + "%")}`;
116
+ });
117
+ console.log(chalk.dim(` `) + outcomeStrs.join(" | "));
118
+ console.log();
119
+ }
120
+ console.log(chalk.dim(`Found ${result.total} matching markets`));
121
+ console.log();
122
+ }
123
+ export function displayBetResult(result) {
124
+ console.log();
125
+ console.log(chalk.green.bold("Bet Placed Successfully!"));
126
+ console.log();
127
+ const boxContent = {
128
+ Venue: chalk.cyan(result.venue),
129
+ "Market ID": chalk.dim(result.marketId.substring(0, 30) + "..."),
130
+ Amount: chalk.yellow(formatCurrency(result.amount)),
131
+ "Avg Price": chalk.green((parseFloat(result.avgPrice) * 100).toFixed(1) + "%"),
132
+ "Tokens Received": chalk.magenta(result.tokensReceived),
133
+ Status: chalk.green(result.status),
134
+ };
135
+ if (result.txHash) {
136
+ boxContent["Transaction"] = chalk.dim(result.txHash);
137
+ }
138
+ printBox("Bet Details", boxContent);
139
+ console.log();
140
+ }
141
+ export function displayArbs(result) {
142
+ console.log();
143
+ console.log(chalk.cyan.bold("Arbitrage Opportunities"));
144
+ console.log(chalk.dim(`Scanned ${result.total_scanned} market pairs in ${result.analysis_time_ms}ms`));
145
+ console.log();
146
+ if (result.opportunities.length === 0) {
147
+ console.log(chalk.yellow("No arbitrage opportunities found"));
148
+ console.log(chalk.dim("Try lowering --min-profit or check back later"));
149
+ console.log();
150
+ return;
151
+ }
152
+ for (const arb of result.opportunities) {
153
+ const profitColor = arb.expected_profit_pct > 5 ? chalk.green.bold : chalk.green;
154
+ console.log(chalk.white.bold(`Arb #${arb.id}`));
155
+ console.log(` ${chalk.cyan("Profit:")} ${profitColor(`+${arb.expected_profit_pct.toFixed(2)}%`)} | Spread: ${arb.spread_pct.toFixed(2)}% | Confidence: ${(arb.confidence * 100).toFixed(0)}%`);
156
+ console.log();
157
+ console.log(chalk.dim(" Leg A (BUY):"));
158
+ console.log(` ${chalk.yellow(arb.market_a.venue)}: ${truncate(arb.market_a.question, 50)}`);
159
+ console.log(` ${arb.market_a.outcome} @ ${chalk.green((arb.market_a.price * 100).toFixed(1) + "%")}`);
160
+ console.log(chalk.dim(" Leg B (SELL):"));
161
+ console.log(` ${chalk.yellow(arb.market_b.venue)}: ${truncate(arb.market_b.question, 50)}`);
162
+ console.log(` ${arb.market_b.outcome} @ ${chalk.red((arb.market_b.price * 100).toFixed(1) + "%")}`);
163
+ if (arb.verified) {
164
+ console.log(chalk.green(" LLM Verified"));
165
+ }
166
+ else {
167
+ console.log(chalk.yellow(" Unverified - check manually"));
168
+ }
169
+ console.log();
170
+ }
171
+ console.log(chalk.dim(`To execute: httpcat predict execute-arb <arb_id> <amount>`));
172
+ console.log();
173
+ }
174
+ export function displayArbExecution(result) {
175
+ console.log();
176
+ if (result.status === "success") {
177
+ console.log(chalk.green.bold("Arbitrage Executed Successfully!"));
178
+ }
179
+ else {
180
+ console.log(chalk.yellow.bold(`Arbitrage Status: ${result.status}`));
181
+ }
182
+ console.log();
183
+ const boxContent = {
184
+ "Arb ID": chalk.cyan(result.arb_id),
185
+ Status: result.status === "success" ? chalk.green(result.status) : chalk.yellow(result.status),
186
+ "Total Spent": chalk.yellow(formatCurrency(result.total_spent)),
187
+ "Expected Profit": chalk.green(formatCurrency(result.expected_profit)),
188
+ };
189
+ if (result.actual_profit) {
190
+ const actualColor = parseFloat(result.actual_profit) >= 0 ? chalk.green : chalk.red;
191
+ boxContent["Actual Profit"] = actualColor(formatCurrency(result.actual_profit));
192
+ }
193
+ if (result.leg_a_tx) {
194
+ boxContent["Leg A Tx"] = chalk.dim(result.leg_a_tx);
195
+ }
196
+ if (result.leg_b_tx) {
197
+ boxContent["Leg B Tx"] = chalk.dim(result.leg_b_tx);
198
+ }
199
+ printBox("Arbitrage Execution", boxContent);
200
+ console.log();
201
+ }
202
+ export function displayCorrelations(result) {
203
+ console.log();
204
+ console.log(chalk.cyan.bold("Market Correlations"));
205
+ console.log(chalk.dim(`Period: ${result.period} | Pairs analyzed: ${result.pairs_analyzed} | Matches: ${result.pairs_matched}`));
206
+ console.log();
207
+ if (result.pairs.length === 0) {
208
+ console.log(chalk.yellow("No significant correlations found"));
209
+ console.log(chalk.dim("Try lowering --min-correlation or using a longer period"));
210
+ console.log();
211
+ return;
212
+ }
213
+ // Correlated pairs
214
+ console.log(chalk.white.bold("Top Correlated Pairs:"));
215
+ console.log();
216
+ for (const pair of result.pairs.slice(0, 10)) {
217
+ const corrColor = pair.correlation > 0 ? chalk.green : chalk.red;
218
+ const strengthEmoji = pair.strength === "strong" ? "" : pair.strength === "moderate" ? "" : "";
219
+ console.log(`${strengthEmoji} ${corrColor(`r=${pair.correlation.toFixed(2)}`)} (${pair.strength})`);
220
+ console.log(chalk.dim(` A: `) + truncate(pair.market_a.name, 60));
221
+ console.log(chalk.dim(` B: `) + truncate(pair.market_b.name, 60));
222
+ if (pair.lag_seconds) {
223
+ const lagMinutes = Math.abs(pair.lag_seconds) / 60;
224
+ const lagDir = pair.lag_seconds > 0 ? "A leads B" : "B leads A";
225
+ console.log(chalk.dim(` Lag: ${lagMinutes.toFixed(0)} min (${lagDir})`));
226
+ }
227
+ if (pair.divergence_pct) {
228
+ const divColor = Math.abs(pair.divergence_pct) > 5 ? chalk.yellow : chalk.dim;
229
+ console.log(divColor(` Current Divergence: ${pair.divergence_pct.toFixed(1)}%`));
230
+ }
231
+ if (pair.signal) {
232
+ const actionColor = pair.signal.action === "buy" ? chalk.green : chalk.red;
233
+ console.log(actionColor(` Signal: ${pair.signal.action.toUpperCase()} ${pair.signal.market}`));
234
+ console.log(chalk.dim(` Reason: ${pair.signal.reason}`));
235
+ }
236
+ console.log();
237
+ }
238
+ // Divergence opportunities
239
+ if (result.divergence_opportunities.length > 0) {
240
+ console.log(chalk.yellow.bold("Divergence Opportunities (correlated pairs that have separated):"));
241
+ console.log();
242
+ for (const opp of result.divergence_opportunities.slice(0, 5)) {
243
+ console.log(`Divergence: ${chalk.yellow(`${Math.abs(opp.divergence_pct || 0).toFixed(1)}%`)} | Correlation: ${chalk.cyan(`r=${opp.correlation.toFixed(2)}`)}`);
244
+ console.log(chalk.dim(` A: `) + truncate(opp.market_a.name, 50));
245
+ console.log(chalk.dim(` B: `) + truncate(opp.market_b.name, 50));
246
+ if (opp.signal) {
247
+ const actionColor = opp.signal.action === "buy" ? chalk.green : chalk.red;
248
+ console.log(actionColor(` ${opp.signal.action.toUpperCase()} ${opp.signal.market}`));
249
+ }
250
+ console.log();
251
+ }
252
+ }
253
+ console.log(chalk.dim(`Analysis completed at: ${result.analyzed_at}`));
254
+ console.log();
255
+ }
256
+ export function displayInsiders(result) {
257
+ console.log();
258
+ console.log(chalk.cyan.bold("Insider Trading Detection"));
259
+ console.log(chalk.dim(`Market: ${result.market_id} | Period: ${result.analysis_period}`));
260
+ console.log(chalk.dim(`Analyzed ${result.total_trades_analyzed} trades`));
261
+ console.log();
262
+ if (result.suspicious_trades.length === 0) {
263
+ console.log(chalk.green("No suspicious trading activity detected"));
264
+ console.log();
265
+ return;
266
+ }
267
+ console.log(chalk.red.bold(`Found ${result.suspicious_trades.length} suspicious trades:`));
268
+ console.log();
269
+ for (const trade of result.suspicious_trades) {
270
+ console.log(chalk.yellow(` Trade: ${JSON.stringify(trade, null, 2)}`));
271
+ }
272
+ console.log();
273
+ }
274
+ // Helper
275
+ function truncate(str, maxLen) {
276
+ if (str.length <= maxLen)
277
+ return str;
278
+ return str.substring(0, maxLen - 3) + "...";
279
+ }
280
+ //# sourceMappingURL=predict.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predict.js","sourceRoot":"","sources":["../../src/commands/predict.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sell.d.ts","sourceRoot":"","sources":["../../src/commands/sell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAW7C,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB;AAuCD,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,eAAe,GAAG,YAAY,CAAC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAorBD,wBAAsB,SAAS,CAC7B,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,MAAM,EAAE,mCAAmC;AACvD,WAAW,EAAE,MAAM,EACnB,MAAM,UAAQ,EAAE,+CAA+C;AAC/D,UAAU,CAAC,EAAE,KAAK,MAAM,EAAE,GACzB,OAAO,CAAC,eAAe,CAAC,CAiK1B;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAiF/D;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,MAAM,GACrB,MAAM,CAgCR"}
1
+ {"version":3,"file":"sell.d.ts","sourceRoot":"","sources":["../../src/commands/sell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAY7C,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB;AAuCD,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,eAAe,GAAG,YAAY,CAAC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA8rBD,wBAAsB,SAAS,CAC7B,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,MAAM,EAAE,mCAAmC;AACvD,WAAW,EAAE,MAAM,EACnB,MAAM,UAAQ,EAAE,+CAA+C;AAC/D,UAAU,CAAC,EAAE,KAAK,MAAM,EAAE,GACzB,OAAO,CAAC,eAAe,CAAC,CA6K1B;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,eAAe,EAAE,WAAW,GAAE,OAAe,GAAG,IAAI,CA4G7F;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,MAAM,GACrB,MAAM,CAgCR"}
@@ -1,12 +1,13 @@
1
1
  import { validateTokenId } from '../utils/validation.js';
2
2
  import { printBox, formatTokenAmount, formatCurrency, formatAddress } from '../utils/formatting.js';
3
- import { printSuccess, printGraduationProgress } from '../interactive/art.js';
3
+ import { printSuccess, printGraduationProgress, printGraduationInProgress } from '../interactive/art.js';
4
4
  import { resolveTokenId } from '../utils/token-resolver.js';
5
5
  import { getTokenInfo } from './info.js';
6
6
  import { createPublicClient, createWalletClient, http, parseAbi, formatUnits, decodeAbiParameters, decodeFunctionData, decodeEventLog } from 'viem';
7
7
  import { privateKeyToAccount } from 'viem/accounts';
8
- import { baseSepolia } from 'viem/chains';
9
8
  import chalk from 'chalk';
9
+ import { config } from '../config.js';
10
+ import { createRpcTransport } from '../utils/rpc-transport.js';
10
11
  async function simulateAndExplainUniversalRouterRevert(args) {
11
12
  try {
12
13
  await args.publicClient.call({
@@ -41,15 +42,15 @@ const ERC20_ABI = parseAbi([
41
42
  'function allowance(address owner, address spender) view returns (uint256)',
42
43
  'function balanceOf(address owner) view returns (uint256)',
43
44
  ]);
44
- const USDC_ADDRESS = '0x036CbD53842c5426634e7929541eC2318f3dCF7e';
45
+ import { getUSDCAddress, getNetworkConfig } from '../utils/constants.js';
45
46
  /**
46
47
  * Get actual on-chain token balance for a wallet and cap the requested amount
47
48
  * to prevent PERMIT2_TRANSFER_FROM failures when selling more than available
48
49
  */
49
50
  async function getActualSellAmount(args) {
50
51
  const publicClient = createPublicClient({
51
- chain: baseSepolia,
52
- transport: http(),
52
+ chain: args.chain,
53
+ transport: http(config.getRpcUrl()),
53
54
  });
54
55
  // Get actual on-chain balance
55
56
  const actualBalance = await publicClient.readContract({
@@ -374,18 +375,24 @@ async function checkPriceImpact(priceImpact, silent) {
374
375
  // Will add proper confirmation in future refactor
375
376
  return;
376
377
  }
377
- async function executeUniswapSell(swapData, privateKey, silent) {
378
+ async function executeUniswapSell(usdcAddress, swapData, privateKey, chain, silent, httpcatClient) {
378
379
  const account = privateKeyToAccount(privateKey);
379
380
  const userAddress = account.address;
380
381
  // Create clients
381
382
  const publicClient = createPublicClient({
382
- chain: baseSepolia,
383
- transport: http(),
383
+ chain,
384
+ transport: createRpcTransport({
385
+ chainId: chain.id,
386
+ httpcatClient,
387
+ }),
384
388
  });
385
389
  const walletClient = createWalletClient({
386
390
  account,
387
- chain: baseSepolia,
388
- transport: http(),
391
+ chain,
392
+ transport: createRpcTransport({
393
+ chainId: chain.id,
394
+ httpcatClient,
395
+ }),
389
396
  });
390
397
  // Approve tokens if needed
391
398
  for (const approval of swapData.approvals) {
@@ -422,7 +429,7 @@ async function executeUniswapSell(swapData, privateKey, silent) {
422
429
  }
423
430
  const tokenInAddress = swapData.tokenAddress;
424
431
  const usdcBefore = (await publicClient.readContract({
425
- address: USDC_ADDRESS,
432
+ address: usdcAddress,
426
433
  abi: ERC20_ABI,
427
434
  functionName: 'balanceOf',
428
435
  args: [userAddress],
@@ -546,7 +553,7 @@ async function executeUniswapSell(swapData, privateKey, silent) {
546
553
  }
547
554
  const usdcDeltaFromLogs = getErc20NetDeltaFromReceipt({
548
555
  receipt,
549
- token: USDC_ADDRESS,
556
+ token: usdcAddress,
550
557
  user: userAddress,
551
558
  });
552
559
  const tokenDeltaFromLogs = getErc20NetDeltaFromReceipt({
@@ -560,7 +567,7 @@ async function executeUniswapSell(swapData, privateKey, silent) {
560
567
  if (usdcDelta === 0n || tokenDelta === 0n) {
561
568
  try {
562
569
  const usdcAfter = (await publicClient.readContract({
563
- address: USDC_ADDRESS,
570
+ address: usdcAddress,
564
571
  abi: ERC20_ABI,
565
572
  functionName: 'balanceOf',
566
573
  args: [userAddress],
@@ -597,6 +604,11 @@ export async function sellToken(client, identifier, // Can be token ID, name, or
597
604
  tokenAmount, silent = false, // Suppress resolver output for quiet/JSON mode
598
605
  privateKey // Private key for executing Uniswap swaps
599
606
  ) {
607
+ // Get USDC address for the current network
608
+ const network = client.getNetwork();
609
+ const USDC_ADDRESS = getUSDCAddress(network);
610
+ // Get network config (chain for viem)
611
+ const { chain } = await getNetworkConfig(network);
600
612
  // Resolve identifier to token ID (or contract address for external tokens)
601
613
  const tokenId = await resolveTokenId(identifier, client, silent);
602
614
  // Validate that we got a tokenId
@@ -622,18 +634,19 @@ privateKey // Private key for executing Uniswap swaps
622
634
  tokenAddress: tokenId,
623
635
  userAddress,
624
636
  requestedAmount: tokenAmount,
637
+ chain,
625
638
  silent,
626
639
  });
627
640
  // Get transaction data from backend using universal swap
628
641
  // Pass userAddress so backend knows where to send USDC
629
642
  const input = { tokenIdentifier: tokenId, tokenAmount: actualAmount, slippage: 0.5, userAddress };
630
- const { data } = await client.invoke('token_sell_universal', input);
643
+ const { data } = await client.invoke('tokens/sell-universal', input);
631
644
  // Check price impact (confirmation disabled for now)
632
645
  if (data.priceImpact) {
633
646
  await checkPriceImpact(data.priceImpact, silent);
634
647
  }
635
648
  // Execute the swap on-chain
636
- const txHash = await executeUniswapSell(data, privateKey, silent);
649
+ const txHash = await executeUniswapSell(USDC_ADDRESS, data, privateKey, chain, silent, client);
637
650
  return {
638
651
  tokenId: data.tokenId,
639
652
  tokenAddress: data.tokenAddress,
@@ -654,6 +667,9 @@ privateKey // Private key for executing Uniswap swaps
654
667
  const tokenInfo = await getTokenInfo(client, tokenId, undefined, silent);
655
668
  // Check token status and route accordingly
656
669
  if (tokenInfo.status === 'graduating') {
670
+ if (!silent) {
671
+ printGraduationInProgress(tokenInfo.name);
672
+ }
657
673
  throw new Error('Token is currently graduating. Please wait for graduation to complete.');
658
674
  }
659
675
  if (tokenInfo.status === 'graduated') {
@@ -671,12 +687,13 @@ privateKey // Private key for executing Uniswap swaps
671
687
  tokenAddress: graduatedTokenAddress,
672
688
  userAddress: graduatedUserAddress,
673
689
  requestedAmount: tokenAmount,
690
+ chain,
674
691
  silent,
675
692
  });
676
693
  // Get transaction data from backend using universal swap
677
694
  // Pass userAddress so backend knows where to send USDC
678
695
  const input = { tokenIdentifier: tokenId, tokenAmount: graduatedActualAmount, slippage: 0.5, userAddress: graduatedUserAddress };
679
- const { data } = await client.invoke('token_sell_universal', input);
696
+ const { data } = await client.invoke('tokens/sell-universal', input);
680
697
  // Check price impact (confirmation disabled for now)
681
698
  if (data.priceImpact) {
682
699
  await checkPriceImpact(data.priceImpact, silent);
@@ -693,7 +710,7 @@ privateKey // Private key for executing Uniswap swaps
693
710
  console.log(`Expected USDC: ${formatUnits(BigInt(data.expectedUsdc), 6)}`);
694
711
  }
695
712
  // Execute the swap on-chain
696
- const txHash = await executeUniswapSell(data, privateKey, silent);
713
+ const txHash = await executeUniswapSell(USDC_ADDRESS, data, privateKey, chain, silent, client);
697
714
  return {
698
715
  tokenId: data.tokenId,
699
716
  tokenAddress: data.tokenAddress,
@@ -713,7 +730,7 @@ privateKey // Private key for executing Uniswap swaps
713
730
  // Active token - use bonding curve (existing logic)
714
731
  const input = { tokenIdentifier: tokenId, tokenAmount };
715
732
  // Make request
716
- const { data } = await client.invoke('token_sell', input);
733
+ const { data } = await client.invoke('tokens/sell', input);
717
734
  // Add token info and source to result
718
735
  return {
719
736
  ...data,
@@ -723,25 +740,32 @@ privateKey // Private key for executing Uniswap swaps
723
740
  source: 'bonding_curve',
724
741
  };
725
742
  }
726
- export function displaySellResult(result) {
743
+ export function displaySellResult(result, interactive = false) {
727
744
  printSuccess('Tokens sold successfully!', 'money');
745
+ console.log();
728
746
  if (result.source === 'uniswap_v2') {
729
747
  // Graduated token - Uniswap V2 display
748
+ console.log(chalk.magenta.bold('💸 Sale Summary'));
749
+ console.log();
730
750
  const boxContent = {
731
- 'Token': `${result.tokenName} (${result.tokenSymbol})`,
732
- 'Contract': formatAddress(result.tokenAddress || ''),
733
- 'Source': result.route ?? 'Uniswap',
734
- 'Tokens Sold': formatTokenAmount(result.tokensSold),
735
- 'USDC Received': formatCurrency(result.usdcReceived, 6),
736
- 'Price': formatCurrency(result.newPrice),
751
+ 'Token': chalk.blue(result.tokenName) + ` ${chalk.yellow.bold(`(${result.tokenSymbol})`)}`,
752
+ 'Contract': chalk.cyan(formatAddress(result.tokenAddress || '')),
753
+ 'Source': chalk.yellow(result.route ?? 'Uniswap'),
754
+ 'Tokens Sold': chalk.green.bold(formatTokenAmount(result.tokensSold)),
755
+ 'USDC Received': chalk.green.bold(formatCurrency(result.usdcReceived, 6)),
756
+ 'Price': chalk.cyan(formatCurrency(result.newPrice)),
737
757
  };
738
758
  if (result.slippage !== undefined) {
739
- boxContent['Slippage'] = `${result.slippage}%`;
759
+ boxContent['Slippage'] = chalk.magenta(`${result.slippage}%`);
740
760
  }
761
+ printBox('Sale Details', boxContent);
762
+ // Display transaction hash with block explorer link
741
763
  if (result.txHash) {
742
- boxContent['Transaction'] = result.txHash;
764
+ console.log();
765
+ console.log(chalk.green.bold(` ✅ Transaction Hash:`));
766
+ console.log(chalk.cyan(` ${result.txHash}`));
767
+ console.log(chalk.dim(` https://sepolia.basescan.org/tx/${result.txHash}`));
743
768
  }
744
- printBox('💸 Sale Summary', boxContent);
745
769
  // Display price impact warning
746
770
  if (result.priceImpact !== undefined) {
747
771
  console.log();
@@ -765,35 +789,51 @@ export function displaySellResult(result) {
765
789
  const feePercent = result.routeFee ? (result.routeFee / 10000).toFixed(2) : 'N/A';
766
790
  console.log(chalk.cyan(` Route: ${result.route} (${feePercent}% fee)`));
767
791
  }
792
+ // Quick commands
793
+ const prefix = interactive ? "" : "httpcat ";
794
+ console.log();
795
+ console.log(chalk.magenta.bold('⚡ Quick commands:'));
796
+ console.log(` ${chalk.cyan.bold(`💰 ${prefix}buy`)} ${chalk.yellow.bold(result.tokenSymbol)} ${chalk.dim('<amount>')}`);
797
+ console.log(` ${chalk.cyan.bold(`â„šī¸ ${prefix}info`)} ${chalk.yellow.bold(result.tokenSymbol)}`);
798
+ console.log();
768
799
  }
769
800
  else {
770
801
  // Active token - Bonding curve display
802
+ console.log(chalk.magenta.bold('💸 Sale Summary'));
803
+ console.log();
771
804
  const boxContent = {
772
- 'Token': `${result.tokenName} (${result.tokenSymbol})`,
773
- 'Contract': formatAddress(result.tokenAddress || ''),
774
- 'Source': 'Bonding Curve',
775
- 'Tokens Sold': formatTokenAmount(result.tokensSold),
776
- 'USDC Received': formatCurrency(result.usdcReceived, 6),
805
+ 'Token': chalk.blue(result.tokenName) + ` ${chalk.yellow.bold(`(${result.tokenSymbol})`)}`,
806
+ 'Contract': chalk.cyan(formatAddress(result.tokenAddress || '')),
807
+ 'Source': chalk.yellow('Bonding Curve'),
808
+ 'Tokens Sold': chalk.green.bold(formatTokenAmount(result.tokensSold)),
809
+ 'USDC Received': chalk.green.bold(formatCurrency(result.usdcReceived, 6)),
777
810
  };
778
811
  if (result.fee) {
779
- boxContent['Fee (1%)'] = formatCurrency(result.fee, 6);
812
+ boxContent['Fee (1%)'] = chalk.dim(formatCurrency(result.fee, 6));
780
813
  }
781
- boxContent['New Price'] = formatCurrency(result.newPrice);
814
+ boxContent['New Price'] = chalk.cyan(formatCurrency(result.newPrice));
782
815
  if (result.newMcap) {
783
- boxContent['New Market Cap'] = formatCurrency(result.newMcap);
816
+ boxContent['New Market Cap'] = chalk.green(formatCurrency(result.newMcap));
784
817
  }
785
818
  if (result.graduationProgress !== undefined) {
786
- boxContent['Graduation'] = `${result.graduationProgress.toFixed(2)}%`;
819
+ boxContent['Graduation'] = chalk.magenta(`${result.graduationProgress.toFixed(2)}%`);
787
820
  }
788
- printBox('💸 Sale Summary', boxContent);
821
+ printBox('Sale Details', boxContent);
789
822
  if (result.usdcTransferTx) {
790
823
  console.log();
791
- console.log('Transaction:', result.usdcTransferTx);
824
+ console.log(chalk.cyan('Transaction:'), chalk.blue(result.usdcTransferTx));
792
825
  }
793
826
  console.log();
794
827
  if (result.graduationProgress !== undefined) {
795
828
  printGraduationProgress(result.graduationProgress);
796
829
  }
830
+ // Quick commands
831
+ const prefix = interactive ? "" : "httpcat ";
832
+ console.log();
833
+ console.log(chalk.magenta.bold('⚡ Quick commands:'));
834
+ console.log(` ${chalk.cyan.bold(`💰 ${prefix}buy`)} ${chalk.yellow.bold(result.tokenSymbol)} ${chalk.dim('<amount>')}`);
835
+ console.log(` ${chalk.cyan.bold(`â„šī¸ ${prefix}info`)} ${chalk.yellow.bold(result.tokenSymbol)}`);
836
+ console.log();
797
837
  }
798
838
  }
799
839
  /**