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.
- package/.github/workflows/release.yml +96 -0
- package/.github/workflows/sync-version.yml +31 -2
- package/README.md +191 -68
- package/additions.txt +3 -0
- package/bun.lock +205 -1265
- package/dist/agent/autonomous-trader.d.ts.map +1 -0
- package/dist/agent/autonomous-trader.js +362 -0
- package/dist/agent/autonomous-trader.js.map +1 -0
- package/dist/agent/ax-agent.d.ts.map +1 -1
- package/dist/agent/ax-agent.js +293 -18
- package/dist/agent/ax-agent.js.map +1 -1
- package/dist/agent/event-client.d.ts.map +1 -0
- package/dist/agent/event-client.js +82 -0
- package/dist/agent/event-client.js.map +1 -0
- package/dist/agent/log-stream.d.ts.map +1 -0
- package/dist/agent/log-stream.js +95 -0
- package/dist/agent/log-stream.js.map +1 -0
- package/dist/agent/memory/conversation-session.d.ts.map +1 -0
- package/dist/agent/memory/conversation-session.js +232 -0
- package/dist/agent/memory/conversation-session.js.map +1 -0
- package/dist/agent/memory/conversation-store.d.ts.map +1 -0
- package/dist/agent/memory/conversation-store.js +214 -0
- package/dist/agent/memory/conversation-store.js.map +1 -0
- package/dist/agent/memory/database-schema.d.ts.map +1 -0
- package/dist/agent/memory/database-schema.js +355 -0
- package/dist/agent/memory/database-schema.js.map +1 -0
- package/dist/agent/memory/decision-tracker.d.ts.map +1 -0
- package/dist/agent/memory/decision-tracker.js +274 -0
- package/dist/agent/memory/decision-tracker.js.map +1 -0
- package/dist/agent/memory/memory-manager.d.ts.map +1 -0
- package/dist/agent/memory/memory-manager.js +187 -0
- package/dist/agent/memory/memory-manager.js.map +1 -0
- package/dist/agent/memory/types.d.ts.map +1 -0
- package/dist/agent/memory/types.js +5 -0
- package/dist/agent/memory/types.js.map +1 -0
- package/dist/agent/message-formatter.d.ts.map +1 -0
- package/dist/agent/message-formatter.js +76 -0
- package/dist/agent/message-formatter.js.map +1 -0
- package/dist/agent/position-db.d.ts.map +1 -0
- package/dist/agent/position-db.js +154 -0
- package/dist/agent/position-db.js.map +1 -0
- package/dist/agent/simple-chat-ui-static.d.ts.map +1 -0
- package/dist/agent/simple-chat-ui-static.js +129 -0
- package/dist/agent/simple-chat-ui-static.js.map +1 -0
- package/dist/agent/simple-chat-ui.d.ts.map +1 -0
- package/dist/agent/simple-chat-ui.js +90 -0
- package/dist/agent/simple-chat-ui.js.map +1 -0
- package/dist/agent/tools.d.ts.map +1 -1
- package/dist/agent/tools.js +280 -5
- package/dist/agent/tools.js.map +1 -1
- package/dist/agent/ui.d.ts.map +1 -0
- package/dist/agent/ui.js +84 -0
- package/dist/agent/ui.js.map +1 -0
- package/dist/agent/unified-runtime.d.ts.map +1 -0
- package/dist/agent/unified-runtime.js +397 -0
- package/dist/agent/unified-runtime.js.map +1 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +410 -49
- package/dist/client.js.map +1 -1
- package/dist/commands/account.d.ts.map +1 -1
- package/dist/commands/account.js +163 -28
- package/dist/commands/account.js.map +1 -1
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +258 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/balances.d.ts.map +1 -1
- package/dist/commands/balances.js +229 -74
- package/dist/commands/balances.js.map +1 -1
- package/dist/commands/buy.d.ts.map +1 -1
- package/dist/commands/buy.js +88 -44
- package/dist/commands/buy.js.map +1 -1
- package/dist/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +203 -432
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/claim.d.ts.map +1 -1
- package/dist/commands/claim.js +86 -29
- package/dist/commands/claim.js.map +1 -1
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +65 -42
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/health.d.ts.map +1 -1
- package/dist/commands/health.js +7 -5
- package/dist/commands/health.js.map +1 -1
- package/dist/commands/info.d.ts.map +1 -1
- package/dist/commands/info.js +136 -49
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +57 -23
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/perps.d.ts.map +1 -0
- package/dist/commands/perps.js +192 -0
- package/dist/commands/perps.js.map +1 -0
- package/dist/commands/positions.d.ts.map +1 -1
- package/dist/commands/positions.js +77 -48
- package/dist/commands/positions.js.map +1 -1
- package/dist/commands/predict.d.ts.map +1 -0
- package/dist/commands/predict.js +280 -0
- package/dist/commands/predict.js.map +1 -0
- package/dist/commands/sell.d.ts.map +1 -1
- package/dist/commands/sell.js +79 -39
- package/dist/commands/sell.js.map +1 -1
- package/dist/commands/swap.d.ts.map +1 -0
- package/dist/commands/swap.js +541 -0
- package/dist/commands/swap.js.map +1 -0
- package/dist/commands/transactions.d.ts.map +1 -1
- package/dist/commands/transactions.js +28 -16
- package/dist/commands/transactions.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +330 -34
- package/dist/config.js.map +1 -1
- package/dist/index.js +1219 -167
- package/dist/index.js.map +1 -1
- package/dist/interactive/art.d.ts.map +1 -1
- package/dist/interactive/art.js +38 -1
- package/dist/interactive/art.js.map +1 -1
- package/dist/interactive/shell.d.ts.map +1 -1
- package/dist/interactive/shell.js +398 -2259
- package/dist/interactive/shell.js.map +1 -1
- package/dist/mcp/chat-state.d.ts.map +1 -1
- package/dist/mcp/chat-state.js +2 -1
- package/dist/mcp/chat-state.js.map +1 -1
- package/dist/mcp/server.js +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +108 -1
- package/dist/mcp/tools.js.map +1 -1
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/types/agent-info.d.ts.map +1 -0
- package/dist/types/agent-info.js +11 -0
- package/dist/types/agent-info.js.map +1 -0
- package/dist/ui/components/ScrollableList.d.ts.map +1 -0
- package/dist/ui/components/ScrollableList.js +72 -0
- package/dist/ui/components/ScrollableList.js.map +1 -0
- package/dist/ui/components/ThemeProvider.d.ts.map +1 -0
- package/dist/ui/components/ThemeProvider.js +87 -0
- package/dist/ui/components/ThemeProvider.js.map +1 -0
- package/dist/ui/components/ThemedBox.d.ts.map +1 -0
- package/dist/ui/components/ThemedBox.js +24 -0
- package/dist/ui/components/ThemedBox.js.map +1 -0
- package/dist/ui/components/agent/ChatHeader.d.ts.map +1 -0
- package/dist/ui/components/agent/ChatHeader.js +39 -0
- package/dist/ui/components/agent/ChatHeader.js.map +1 -0
- package/dist/ui/components/agent/Header.d.ts.map +1 -0
- package/dist/ui/components/agent/Header.js +14 -0
- package/dist/ui/components/agent/Header.js.map +1 -0
- package/dist/ui/components/agent/Input.d.ts.map +1 -0
- package/dist/ui/components/agent/Input.js +23 -0
- package/dist/ui/components/agent/Input.js.map +1 -0
- package/dist/ui/components/agent/Output.d.ts.map +1 -0
- package/dist/ui/components/agent/Output.js +23 -0
- package/dist/ui/components/agent/Output.js.map +1 -0
- package/dist/ui/components/chat/TokenChatUI.d.ts.map +1 -0
- package/dist/ui/components/chat/TokenChatUI.js +133 -0
- package/dist/ui/components/chat/TokenChatUI.js.map +1 -0
- package/dist/ui/components/shell/ShellHeader.d.ts.map +1 -0
- package/dist/ui/components/shell/ShellHeader.js +31 -0
- package/dist/ui/components/shell/ShellHeader.js.map +1 -0
- package/dist/ui/components/shell/ShellInput.d.ts.map +1 -0
- package/dist/ui/components/shell/ShellInput.js +147 -0
- package/dist/ui/components/shell/ShellInput.js.map +1 -0
- package/dist/ui/components/shell/ShellOutput.d.ts.map +1 -0
- package/dist/ui/components/shell/ShellOutput.js +8 -0
- package/dist/ui/components/shell/ShellOutput.js.map +1 -0
- package/dist/ui/hooks/useChatWebSocket.d.ts.map +1 -0
- package/dist/ui/hooks/useChatWebSocket.js +76 -0
- package/dist/ui/hooks/useChatWebSocket.js.map +1 -0
- package/dist/ui/hooks/useCommandHistory.d.ts.map +1 -0
- package/dist/ui/hooks/useCommandHistory.js +70 -0
- package/dist/ui/hooks/useCommandHistory.js.map +1 -0
- package/dist/ui/hooks/useDebounce.d.ts.map +1 -0
- package/dist/ui/hooks/useDebounce.js +17 -0
- package/dist/ui/hooks/useDebounce.js.map +1 -0
- package/dist/ui/hooks/useLogStream.d.ts.map +1 -0
- package/dist/ui/hooks/useLogStream.js +20 -0
- package/dist/ui/hooks/useLogStream.js.map +1 -0
- package/dist/ui/hooks/useVirtualScroll.d.ts.map +1 -0
- package/dist/ui/hooks/useVirtualScroll.js +70 -0
- package/dist/ui/hooks/useVirtualScroll.js.map +1 -0
- package/dist/utils/constants.d.ts.map +1 -1
- package/dist/utils/constants.js +44 -2
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +3 -3
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/formatting.d.ts.map +1 -1
- package/dist/utils/formatting.js +37 -6
- package/dist/utils/formatting.js.map +1 -1
- package/dist/utils/loading.d.ts.map +1 -1
- package/dist/utils/loading.js +25 -3
- package/dist/utils/loading.js.map +1 -1
- package/dist/utils/privateKeyPrompt.d.ts.map +1 -1
- package/dist/utils/privateKeyPrompt.js +48 -13
- package/dist/utils/privateKeyPrompt.js.map +1 -1
- package/dist/utils/rpc-helpers.d.ts.map +1 -0
- package/dist/utils/rpc-helpers.js +70 -0
- package/dist/utils/rpc-helpers.js.map +1 -0
- package/dist/utils/rpc-transport.d.ts.map +1 -0
- package/dist/utils/rpc-transport.js +87 -0
- package/dist/utils/rpc-transport.js.map +1 -0
- package/dist/utils/status.d.ts.map +1 -0
- package/dist/utils/status.js +96 -0
- package/dist/utils/status.js.map +1 -0
- package/dist/utils/token-resolver.d.ts.map +1 -1
- package/dist/utils/token-resolver.js +45 -8
- package/dist/utils/token-resolver.js.map +1 -1
- package/issues.txt +2 -0
- package/package.json +17 -7
- package/swap.logs +61 -0
- package/swapping.txt +108 -0
- 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;
|
|
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"}
|
package/dist/commands/sell.js
CHANGED
|
@@ -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
|
-
|
|
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:
|
|
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
|
|
383
|
-
transport:
|
|
383
|
+
chain,
|
|
384
|
+
transport: createRpcTransport({
|
|
385
|
+
chainId: chain.id,
|
|
386
|
+
httpcatClient,
|
|
387
|
+
}),
|
|
384
388
|
});
|
|
385
389
|
const walletClient = createWalletClient({
|
|
386
390
|
account,
|
|
387
|
-
chain
|
|
388
|
-
transport:
|
|
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:
|
|
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:
|
|
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:
|
|
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('
|
|
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('
|
|
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('
|
|
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':
|
|
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
|
-
|
|
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':
|
|
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('
|
|
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
|
/**
|