httpcat-cli 0.2.13 â 0.3.0-rc.2
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 +185 -62
- package/additions.txt +3 -0
- package/bun.lock +180 -1276
- 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 +274 -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 +406 -46
- package/dist/client.js.map +1 -1
- package/dist/commands/account.d.ts.map +1 -1
- package/dist/commands/account.js +51 -22
- 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 +122 -68
- package/dist/commands/balances.js.map +1 -1
- package/dist/commands/buy.d.ts.map +1 -1
- package/dist/commands/buy.js +73 -36
- package/dist/commands/buy.js.map +1 -1
- package/dist/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +200 -429
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/claim.d.ts.map +1 -1
- package/dist/commands/claim.js +84 -27
- 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 +125 -46
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +56 -22
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/positions.d.ts.map +1 -1
- package/dist/commands/positions.js +76 -47
- package/dist/commands/positions.js.map +1 -1
- package/dist/commands/sell.d.ts.map +1 -1
- package/dist/commands/sell.js +62 -32
- package/dist/commands/sell.js.map +1 -1
- package/dist/commands/swap.d.ts.map +1 -0
- package/dist/commands/swap.js +392 -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 +132 -11
- package/dist/config.js.map +1 -1
- package/dist/index.js +453 -145
- 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 +23 -2
- package/dist/utils/loading.js.map +1 -1
- package/dist/utils/privateKeyPrompt.d.ts.map +1 -1
- package/dist/utils/privateKeyPrompt.js +31 -7
- package/dist/utils/privateKeyPrompt.js.map +1 -1
- 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 +17 -7
- package/dist/utils/token-resolver.js.map +1 -1
- package/issues.txt +2 -0
- package/package.json +16 -6
- package/Screenshot 2025-12-21 at 8.56.02/342/200/257PM.png +0 -0
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import chalk from "chalk";
|
|
2
2
|
import { privateKeyToAccount } from "viem/accounts";
|
|
3
|
-
import { formatEther
|
|
4
|
-
|
|
5
|
-
import { evm } from "x402/types";
|
|
3
|
+
import { formatEther } from "viem";
|
|
4
|
+
// USDC balance checking using viem directly
|
|
6
5
|
import { printCat } from "../interactive/art.js";
|
|
7
|
-
import { formatAddress, printWarning } from "../utils/formatting.js";
|
|
8
6
|
import inquirer from "inquirer";
|
|
9
7
|
import { config } from "../config.js";
|
|
8
|
+
import { getNetworkConfig } from "../utils/constants.js";
|
|
9
|
+
import Table from 'cli-table3';
|
|
10
10
|
/**
|
|
11
11
|
* Checks and displays wallet balances for a given private key.
|
|
12
12
|
* This mimics the behavior of promptForPrivateKey but without saving to config.
|
|
@@ -42,55 +42,85 @@ export async function checkBalance(privateKey, silent = false) {
|
|
|
42
42
|
const account = privateKeyToAccount(pk);
|
|
43
43
|
const address = account.address;
|
|
44
44
|
try {
|
|
45
|
-
//
|
|
46
|
-
const
|
|
45
|
+
// Get network configuration
|
|
46
|
+
const network = config.get("network");
|
|
47
|
+
const { chain, usdcAddress } = await getNetworkConfig(network);
|
|
48
|
+
// Create signer using viem for balance checks
|
|
49
|
+
const { createPublicClient, http, parseAbi, formatUnits } = await import("viem");
|
|
50
|
+
const publicClient = createPublicClient({
|
|
51
|
+
chain,
|
|
52
|
+
transport: http(),
|
|
53
|
+
});
|
|
47
54
|
// Check ETH balance
|
|
48
|
-
const ethBalance = await
|
|
55
|
+
const ethBalance = await publicClient.getBalance({ address });
|
|
49
56
|
const ethFormatted = formatEther(ethBalance);
|
|
50
|
-
// Check USDC balance
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
57
|
+
// Check USDC balance using ERC20 token contract
|
|
58
|
+
const ERC20_ABI = parseAbi([
|
|
59
|
+
"function balanceOf(address owner) view returns (uint256)",
|
|
60
|
+
"function decimals() view returns (uint8)",
|
|
61
|
+
]);
|
|
62
|
+
const [usdcBalance, decimals] = await Promise.all([
|
|
63
|
+
publicClient.readContract({
|
|
64
|
+
address: usdcAddress,
|
|
65
|
+
abi: ERC20_ABI,
|
|
66
|
+
functionName: "balanceOf",
|
|
67
|
+
args: [address],
|
|
68
|
+
}).catch(() => BigInt(0)),
|
|
69
|
+
publicClient.readContract({
|
|
70
|
+
address: usdcAddress,
|
|
71
|
+
abi: ERC20_ABI,
|
|
72
|
+
functionName: "decimals",
|
|
73
|
+
}).catch(() => 6), // Default to 6 decimals for USDC
|
|
74
|
+
]);
|
|
75
|
+
const usdcFormatted = formatUnits(usdcBalance, decimals);
|
|
76
|
+
// Fetch 402CAT token address from environment variable or agent info
|
|
54
77
|
let cat402Balance = BigInt(0);
|
|
55
78
|
let cat402Formatted = "0.00";
|
|
56
79
|
let cat402Fetched = false;
|
|
57
80
|
try {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
if
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
chain: baseSepolia,
|
|
69
|
-
transport: http(),
|
|
70
|
-
});
|
|
71
|
-
const ERC20_ABI = parseAbi([
|
|
72
|
-
"function balanceOf(address owner) view returns (uint256)",
|
|
73
|
-
"function decimals() view returns (uint8)",
|
|
74
|
-
]);
|
|
75
|
-
// Get balance and decimals
|
|
76
|
-
const [balance, decimals] = await Promise.all([
|
|
77
|
-
publicClient.readContract({
|
|
78
|
-
address: catTokenAddress,
|
|
79
|
-
abi: ERC20_ABI,
|
|
80
|
-
functionName: "balanceOf",
|
|
81
|
-
args: [address],
|
|
82
|
-
}),
|
|
83
|
-
publicClient.readContract({
|
|
84
|
-
address: catTokenAddress,
|
|
85
|
-
abi: ERC20_ABI,
|
|
86
|
-
functionName: "decimals",
|
|
87
|
-
}).catch(() => 18), // Default to 18 decimals if call fails
|
|
88
|
-
]);
|
|
89
|
-
cat402Balance = balance;
|
|
90
|
-
cat402Formatted = formatUnits(balance, decimals);
|
|
91
|
-
cat402Fetched = true;
|
|
81
|
+
// Priority 1: Environment variable
|
|
82
|
+
let catTokenAddress = config.getPlatformTokenAddress();
|
|
83
|
+
// Priority 2: Fetch from agent /info endpoint if not in env var
|
|
84
|
+
if (!catTokenAddress) {
|
|
85
|
+
try {
|
|
86
|
+
const agentInfo = await config.getAgentInfo();
|
|
87
|
+
catTokenAddress = agentInfo.platform.platformAddress;
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
// Silently fail - will just not show CAT balance
|
|
92
91
|
}
|
|
93
92
|
}
|
|
93
|
+
if (catTokenAddress) {
|
|
94
|
+
// Get 402CAT balance using ERC20 balanceOf
|
|
95
|
+
const { createPublicClient, http, parseAbi } = await import("viem");
|
|
96
|
+
const network = config.get("network");
|
|
97
|
+
const { chain } = await getNetworkConfig(network);
|
|
98
|
+
const publicClient = createPublicClient({
|
|
99
|
+
chain,
|
|
100
|
+
transport: http(config.getRpcUrl()),
|
|
101
|
+
});
|
|
102
|
+
const ERC20_ABI = parseAbi([
|
|
103
|
+
"function balanceOf(address owner) view returns (uint256)",
|
|
104
|
+
"function decimals() view returns (uint8)",
|
|
105
|
+
]);
|
|
106
|
+
// Get balance and decimals
|
|
107
|
+
const [balance, decimals] = await Promise.all([
|
|
108
|
+
publicClient.readContract({
|
|
109
|
+
address: catTokenAddress,
|
|
110
|
+
abi: ERC20_ABI,
|
|
111
|
+
functionName: "balanceOf",
|
|
112
|
+
args: [address],
|
|
113
|
+
}),
|
|
114
|
+
publicClient.readContract({
|
|
115
|
+
address: catTokenAddress,
|
|
116
|
+
abi: ERC20_ABI,
|
|
117
|
+
functionName: "decimals",
|
|
118
|
+
}).catch(() => 18), // Default to 18 decimals if call fails
|
|
119
|
+
]);
|
|
120
|
+
cat402Balance = balance;
|
|
121
|
+
cat402Formatted = formatUnits(balance, decimals);
|
|
122
|
+
cat402Fetched = true;
|
|
123
|
+
}
|
|
94
124
|
}
|
|
95
125
|
catch (error) {
|
|
96
126
|
// If we can't fetch 402CAT balance, just continue without it
|
|
@@ -103,46 +133,70 @@ export async function checkBalance(privateKey, silent = false) {
|
|
|
103
133
|
if (!silent) {
|
|
104
134
|
console.log();
|
|
105
135
|
printCat("wizard");
|
|
106
|
-
console.log(chalk.bold
|
|
107
|
-
console.log(chalk.dim("â".repeat(
|
|
136
|
+
console.log(chalk.magenta.bold("đ° Wallet Balances"));
|
|
137
|
+
console.log(chalk.dim("â".repeat(80)));
|
|
108
138
|
console.log();
|
|
109
|
-
//
|
|
110
|
-
const
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
139
|
+
// Create colorful balances table
|
|
140
|
+
const balancesTable = new Table({
|
|
141
|
+
head: [
|
|
142
|
+
chalk.blue.bold('Asset'),
|
|
143
|
+
chalk.green.bold('Balance'),
|
|
144
|
+
chalk.cyan.bold('Symbol')
|
|
145
|
+
],
|
|
146
|
+
colAligns: ['left', 'right', 'left'],
|
|
147
|
+
style: {
|
|
148
|
+
head: [],
|
|
149
|
+
border: ['dim'],
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
// ETH balance row
|
|
153
|
+
const ethNum = Number(ethFormatted);
|
|
154
|
+
const ethIcon = ethNum < 0.001 ? 'â ī¸ ' : '⥠';
|
|
155
|
+
balancesTable.push([
|
|
156
|
+
chalk.yellow(ethIcon + 'Ethereum'),
|
|
157
|
+
ethNum < 0.001 ? chalk.red.bold(ethFormatted) : chalk.green(ethFormatted),
|
|
158
|
+
chalk.dim('ETH')
|
|
159
|
+
]);
|
|
160
|
+
// USDC balance row
|
|
161
|
+
const usdcNum = Number(usdcFormatted);
|
|
162
|
+
const usdcDisplay = usdcNum.toFixed(2);
|
|
163
|
+
const usdcIcon = usdcNum < 1 ? 'â ī¸ ' : 'đĩ ';
|
|
164
|
+
balancesTable.push([
|
|
165
|
+
chalk.green(usdcIcon + 'USD Coin'),
|
|
166
|
+
usdcNum < 1 ? chalk.red.bold('$' + usdcDisplay) : chalk.green('$' + usdcDisplay),
|
|
167
|
+
chalk.dim('USDC')
|
|
168
|
+
]);
|
|
169
|
+
// CAT balance row (if fetched)
|
|
116
170
|
if (cat402Fetched) {
|
|
117
|
-
const catLabel = "CAT:".padEnd(8);
|
|
118
|
-
// Format the 402CAT amount to a reasonable precision
|
|
119
171
|
const catFormattedClean = parseFloat(cat402Formatted).toLocaleString('en-US', {
|
|
120
|
-
maximumFractionDigits:
|
|
172
|
+
maximumFractionDigits: 2,
|
|
121
173
|
minimumFractionDigits: 0
|
|
122
174
|
});
|
|
123
|
-
|
|
175
|
+
balancesTable.push([
|
|
176
|
+
chalk.cyan('đą 402.CAT'),
|
|
177
|
+
chalk.magenta(catFormattedClean),
|
|
178
|
+
chalk.dim('CAT')
|
|
179
|
+
]);
|
|
124
180
|
}
|
|
181
|
+
console.log(balancesTable.toString());
|
|
125
182
|
console.log();
|
|
126
|
-
console.log(chalk.dim(`
|
|
183
|
+
console.log(chalk.dim(`Wallet: ${address}`));
|
|
127
184
|
console.log();
|
|
128
185
|
// Show warnings if balances are low
|
|
129
|
-
const ethNum = Number(ethFormatted);
|
|
130
|
-
const usdcNum = Number(usdcFormatted);
|
|
131
186
|
if (ethNum < 0.001 && usdcNum < 1) {
|
|
132
|
-
console.log();
|
|
133
|
-
printWarning("Low balances detected!");
|
|
187
|
+
console.log(chalk.yellow.bold("â ī¸ Low balances detected!"));
|
|
134
188
|
console.log(chalk.dim(" You need Base Sepolia ETH for gas fees"));
|
|
135
189
|
console.log(chalk.dim(" You need Base Sepolia USDC for trading"));
|
|
136
190
|
console.log();
|
|
137
191
|
}
|
|
138
192
|
else if (ethNum < 0.001) {
|
|
139
|
-
console.log();
|
|
140
|
-
|
|
193
|
+
console.log(chalk.yellow.bold("â ī¸ Low ETH balance"));
|
|
194
|
+
console.log(chalk.dim(" You may not have enough for gas fees"));
|
|
141
195
|
console.log();
|
|
142
196
|
}
|
|
143
197
|
else if (usdcNum < 1) {
|
|
144
|
-
console.log();
|
|
145
|
-
|
|
198
|
+
console.log(chalk.yellow.bold("â ī¸ Low USDC balance"));
|
|
199
|
+
console.log(chalk.dim(" You may not have enough for trades"));
|
|
146
200
|
console.log();
|
|
147
201
|
}
|
|
148
202
|
}
|
|
@@ -152,7 +206,7 @@ export async function checkBalance(privateKey, silent = false) {
|
|
|
152
206
|
usdcBalance: usdcBalance.toString(),
|
|
153
207
|
cat402Balance: cat402Balance.toString(),
|
|
154
208
|
ethFormatted,
|
|
155
|
-
usdcFormatted,
|
|
209
|
+
usdcFormatted: parseFloat(usdcFormatted).toFixed(2),
|
|
156
210
|
cat402Formatted,
|
|
157
211
|
};
|
|
158
212
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"balances.js","sourceRoot":"","sources":["../../src/commands/balances.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"balances.js","sourceRoot":"","sources":["../../src/commands/balances.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buy.d.ts","sourceRoot":"","sources":["../../src/commands/buy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"buy.d.ts","sourceRoot":"","sources":["../../src/commands/buy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AA+D7C,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,MAAM,CAAC,EAAE,eAAe,GAAG,YAAY,CAAC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAqCD,eAAO,MAAM,YAAY,UAA2B,CAAC;AACrD,eAAO,MAAM,YAAY,UAAuB,CAAC;AA4iBjD,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,MAAM,EAAE,mCAAmC;AACvD,MAAM,EAAE,MAAM,EACd,UAAU,UAAO,EACjB,MAAM,UAAQ,EAAE,+CAA+C;AAC/D,UAAU,CAAC,EAAE,KAAK,MAAM,EAAE,GACzB,OAAO,CAAC,cAAc,CAAC,CAkOzB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,EAAE,WAAW,GAAE,OAAe,GAAG,IAAI,CAyG3F;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,cAAc,EACtB,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI,CAkBN"}
|
package/dist/commands/buy.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import chalk from "chalk";
|
|
2
2
|
import { validateTokenId, validateAmount } from "../utils/validation.js";
|
|
3
3
|
import { printBox, formatTokenAmount, formatCurrency, formatAddress, } from "../utils/formatting.js";
|
|
4
|
-
import { printSuccess, printGraduationProgress } from "../interactive/art.js";
|
|
4
|
+
import { printSuccess, printGraduationProgress, printGraduationInProgress } from "../interactive/art.js";
|
|
5
5
|
import { resolveTokenId } from "../utils/token-resolver.js";
|
|
6
6
|
import { getTokenInfo } from "./info.js";
|
|
7
7
|
import { createPublicClient, createWalletClient, http, parseAbi, formatUnits, decodeAbiParameters, decodeFunctionData, decodeEventLog, } from "viem";
|
|
8
8
|
import { privateKeyToAccount } from "viem/accounts";
|
|
9
9
|
import { baseSepolia } from "viem/chains";
|
|
10
|
+
import { config } from "../config.js";
|
|
10
11
|
async function simulateAndExplainUniversalRouterRevert(args) {
|
|
11
12
|
try {
|
|
12
13
|
await args.publicClient.call({
|
|
@@ -44,7 +45,7 @@ const ERC20_ABI = parseAbi([
|
|
|
44
45
|
"function balanceOf(address owner) view returns (uint256)",
|
|
45
46
|
"function decimals() view returns (uint8)",
|
|
46
47
|
]);
|
|
47
|
-
|
|
48
|
+
import { getUSDCAddress } from '../utils/constants.js';
|
|
48
49
|
const PERMIT2_ADDRESS = '0x000000000022D473030F116dDEE9F6B43aC78BA3';
|
|
49
50
|
const PERMIT2_ABI = parseAbi([
|
|
50
51
|
'function allowance(address owner, address token, address spender) view returns (uint160 amount, uint48 expiration, uint48 nonce)',
|
|
@@ -279,18 +280,18 @@ async function checkPriceImpact(priceImpact, silent) {
|
|
|
279
280
|
// Will add proper confirmation in future refactor
|
|
280
281
|
return;
|
|
281
282
|
}
|
|
282
|
-
async function executeUniswapBuy(swapData, privateKey, silent) {
|
|
283
|
+
async function executeUniswapBuy(swapData, privateKey, silent, usdcAddress) {
|
|
283
284
|
const account = privateKeyToAccount(privateKey);
|
|
284
285
|
const userAddress = account.address;
|
|
285
286
|
// Create clients
|
|
286
287
|
const publicClient = createPublicClient({
|
|
287
288
|
chain: baseSepolia,
|
|
288
|
-
transport: http(),
|
|
289
|
+
transport: http(config.getRpcUrl()),
|
|
289
290
|
});
|
|
290
291
|
const walletClient = createWalletClient({
|
|
291
292
|
account,
|
|
292
293
|
chain: baseSepolia,
|
|
293
|
-
transport: http(),
|
|
294
|
+
transport: http(config.getRpcUrl()),
|
|
294
295
|
});
|
|
295
296
|
// Approve tokens if needed
|
|
296
297
|
for (const approval of swapData.approvals) {
|
|
@@ -326,7 +327,7 @@ async function executeUniswapBuy(swapData, privateKey, silent) {
|
|
|
326
327
|
console.log(chalk.cyan(` Executing swap via ${swapData.route}...`));
|
|
327
328
|
}
|
|
328
329
|
const usdcBefore = (await publicClient.readContract({
|
|
329
|
-
address:
|
|
330
|
+
address: usdcAddress,
|
|
330
331
|
abi: ERC20_ABI,
|
|
331
332
|
functionName: 'balanceOf',
|
|
332
333
|
args: [userAddress],
|
|
@@ -450,7 +451,7 @@ async function executeUniswapBuy(swapData, privateKey, silent) {
|
|
|
450
451
|
try {
|
|
451
452
|
const usdcDeltaFromLogs = getErc20NetDeltaFromReceipt({
|
|
452
453
|
receipt,
|
|
453
|
-
token:
|
|
454
|
+
token: usdcAddress,
|
|
454
455
|
user: userAddress,
|
|
455
456
|
});
|
|
456
457
|
const tokenDeltaFromLogs = getErc20NetDeltaFromReceipt({
|
|
@@ -467,7 +468,7 @@ async function executeUniswapBuy(swapData, privateKey, silent) {
|
|
|
467
468
|
if (usdcDelta === 0n || tokenDelta === 0n) {
|
|
468
469
|
try {
|
|
469
470
|
const usdcAfter = (await publicClient.readContract({
|
|
470
|
-
address:
|
|
471
|
+
address: usdcAddress,
|
|
471
472
|
abi: ERC20_ABI,
|
|
472
473
|
functionName: 'balanceOf',
|
|
473
474
|
args: [userAddress],
|
|
@@ -511,6 +512,9 @@ export async function buyToken(client, identifier, // Can be token ID, name, or
|
|
|
511
512
|
amount, isTestMode = true, silent = false, // Suppress resolver output for quiet/JSON mode
|
|
512
513
|
privateKey // Private key for executing Uniswap swaps
|
|
513
514
|
) {
|
|
515
|
+
// Get USDC address for the current network
|
|
516
|
+
const network = client.getNetwork();
|
|
517
|
+
const USDC_ADDRESS = getUSDCAddress(network);
|
|
514
518
|
// Resolve identifier to token ID (or contract address for external tokens)
|
|
515
519
|
const tokenId = await resolveTokenId(identifier, client, silent);
|
|
516
520
|
// Validate input
|
|
@@ -526,6 +530,9 @@ privateKey // Private key for executing Uniswap swaps
|
|
|
526
530
|
const tokenInfo = await getTokenInfo(client, tokenId, undefined, silent);
|
|
527
531
|
// It's one of our tokens! Continue with normal flow based on status
|
|
528
532
|
if (tokenInfo.status === "graduating") {
|
|
533
|
+
if (!silent) {
|
|
534
|
+
printGraduationInProgress(tokenInfo.name);
|
|
535
|
+
}
|
|
529
536
|
throw new Error("Token is currently graduating. Please wait for graduation to complete.");
|
|
530
537
|
}
|
|
531
538
|
if (tokenInfo.status === "graduated") {
|
|
@@ -542,13 +549,13 @@ privateKey // Private key for executing Uniswap swaps
|
|
|
542
549
|
const userAddress = account.address;
|
|
543
550
|
// Get transaction data from backend using universal swap
|
|
544
551
|
const input = { tokenIdentifier: tokenId, amount, slippage: 0.5, recipient: userAddress };
|
|
545
|
-
const { data } = await client.invoke("token_buy_universal", input);
|
|
552
|
+
const { data, payment } = await client.invoke("token_buy_universal", input);
|
|
546
553
|
// Check price impact (confirmation disabled for now)
|
|
547
554
|
if (data.priceImpact) {
|
|
548
555
|
await checkPriceImpact(data.priceImpact, silent);
|
|
549
556
|
}
|
|
550
557
|
// Execute the swap on-chain
|
|
551
|
-
const txHash = await executeUniswapBuy(data, privateKey, silent);
|
|
558
|
+
const txHash = await executeUniswapBuy(data, privateKey, silent, USDC_ADDRESS);
|
|
552
559
|
return {
|
|
553
560
|
tokenId: data.tokenId,
|
|
554
561
|
tokenAddress: data.tokenAddress,
|
|
@@ -559,6 +566,7 @@ privateKey // Private key for executing Uniswap swaps
|
|
|
559
566
|
newPrice: data.pricePerToken,
|
|
560
567
|
source: "uniswap_v2",
|
|
561
568
|
txHash,
|
|
569
|
+
paymentTxHash: payment?.txHash,
|
|
562
570
|
slippage: data.slippage,
|
|
563
571
|
priceImpact: data.priceImpact,
|
|
564
572
|
route: data.route,
|
|
@@ -583,13 +591,13 @@ privateKey // Private key for executing Uniswap swaps
|
|
|
583
591
|
const userAddress = account.address;
|
|
584
592
|
// Get transaction data from backend using universal swap
|
|
585
593
|
const input = { tokenIdentifier: tokenId, amount, slippage: 0.5, recipient: userAddress };
|
|
586
|
-
const { data } = await client.invoke("token_buy_universal", input);
|
|
594
|
+
const { data, payment } = await client.invoke("token_buy_universal", input);
|
|
587
595
|
// Check price impact (confirmation disabled for now)
|
|
588
596
|
if (data.priceImpact) {
|
|
589
597
|
await checkPriceImpact(data.priceImpact, silent);
|
|
590
598
|
}
|
|
591
599
|
// Execute the swap on-chain
|
|
592
|
-
const txHash = await executeUniswapBuy(data, privateKey, silent);
|
|
600
|
+
const txHash = await executeUniswapBuy(data, privateKey, silent, USDC_ADDRESS);
|
|
593
601
|
return {
|
|
594
602
|
tokenId: data.tokenId,
|
|
595
603
|
tokenAddress: data.tokenAddress,
|
|
@@ -600,6 +608,7 @@ privateKey // Private key for executing Uniswap swaps
|
|
|
600
608
|
newPrice: data.pricePerToken,
|
|
601
609
|
source: "uniswap_v2",
|
|
602
610
|
txHash,
|
|
611
|
+
paymentTxHash: payment?.txHash,
|
|
603
612
|
slippage: data.slippage,
|
|
604
613
|
priceImpact: data.priceImpact,
|
|
605
614
|
route: data.route,
|
|
@@ -618,6 +627,9 @@ privateKey // Private key for executing Uniswap swaps
|
|
|
618
627
|
: await getTokenInfo(client, tokenId, undefined, silent);
|
|
619
628
|
// Check token status and route accordingly
|
|
620
629
|
if (tokenInfo.status === "graduating") {
|
|
630
|
+
if (!silent) {
|
|
631
|
+
printGraduationInProgress(tokenInfo.name);
|
|
632
|
+
}
|
|
621
633
|
throw new Error("Token is currently graduating. Please wait for graduation to complete.");
|
|
622
634
|
}
|
|
623
635
|
if (tokenInfo.status === "graduated") {
|
|
@@ -631,13 +643,13 @@ privateKey // Private key for executing Uniswap swaps
|
|
|
631
643
|
}
|
|
632
644
|
// Get transaction data from backend using universal swap
|
|
633
645
|
const input = { tokenIdentifier: tokenId, amount, slippage: 0.5 };
|
|
634
|
-
const { data } = await client.invoke("token_buy_universal", input);
|
|
646
|
+
const { data, payment } = await client.invoke("token_buy_universal", input);
|
|
635
647
|
// Check price impact (confirmation disabled for now)
|
|
636
648
|
if (data.priceImpact) {
|
|
637
649
|
await checkPriceImpact(data.priceImpact, silent);
|
|
638
650
|
}
|
|
639
651
|
// Execute the swap on-chain
|
|
640
|
-
const txHash = await executeUniswapBuy(data, privateKey, silent);
|
|
652
|
+
const txHash = await executeUniswapBuy(data, privateKey, silent, USDC_ADDRESS);
|
|
641
653
|
return {
|
|
642
654
|
tokenId: data.tokenId,
|
|
643
655
|
tokenAddress: data.tokenAddress,
|
|
@@ -648,6 +660,7 @@ privateKey // Private key for executing Uniswap swaps
|
|
|
648
660
|
newPrice: data.pricePerToken,
|
|
649
661
|
source: "uniswap_v2",
|
|
650
662
|
txHash,
|
|
663
|
+
paymentTxHash: payment?.txHash,
|
|
651
664
|
slippage: data.slippage,
|
|
652
665
|
priceImpact: data.priceImpact,
|
|
653
666
|
route: data.route,
|
|
@@ -668,7 +681,7 @@ privateKey // Private key for executing Uniswap swaps
|
|
|
668
681
|
? `token_buy_${normalizedAmount.replace(".", "_")}`
|
|
669
682
|
: "token_buy";
|
|
670
683
|
// Make request
|
|
671
|
-
const { data } = await client.invoke(entrypoint, input);
|
|
684
|
+
const { data, payment } = await client.invoke(entrypoint, input);
|
|
672
685
|
// Add token info and source to result
|
|
673
686
|
return {
|
|
674
687
|
...data,
|
|
@@ -676,27 +689,35 @@ privateKey // Private key for executing Uniswap swaps
|
|
|
676
689
|
tokenName: tokenInfo.name,
|
|
677
690
|
tokenSymbol: tokenInfo.symbol,
|
|
678
691
|
source: "bonding_curve",
|
|
692
|
+
paymentTxHash: payment?.txHash,
|
|
679
693
|
};
|
|
680
694
|
}
|
|
681
|
-
export function displayBuyResult(result) {
|
|
695
|
+
export function displayBuyResult(result, interactive = false) {
|
|
682
696
|
printSuccess("Tokens purchased successfully!", "money");
|
|
697
|
+
console.log();
|
|
683
698
|
if (result.source === "uniswap_v2") {
|
|
684
699
|
// Graduated token - Uniswap V2 display
|
|
700
|
+
console.log(chalk.magenta.bold("đ° Purchase Summary"));
|
|
701
|
+
console.log();
|
|
685
702
|
const boxContent = {
|
|
686
|
-
Token:
|
|
687
|
-
Contract: formatAddress(result.tokenAddress || ""),
|
|
688
|
-
Source: result.route ?? "Uniswap",
|
|
689
|
-
"Tokens Received": formatTokenAmount(result.tokensReceived),
|
|
690
|
-
"Amount Spent": formatCurrency(result.amountSpent, 6),
|
|
691
|
-
Price: formatCurrency(result.newPrice),
|
|
703
|
+
Token: chalk.blue(result.tokenName) + ` ${chalk.yellow.bold(`(${result.tokenSymbol})`)}`,
|
|
704
|
+
Contract: chalk.cyan(formatAddress(result.tokenAddress || "")),
|
|
705
|
+
Source: chalk.yellow(result.route ?? "Uniswap"),
|
|
706
|
+
"Tokens Received": chalk.green.bold(formatTokenAmount(result.tokensReceived)),
|
|
707
|
+
"Amount Spent": chalk.cyan(formatCurrency(result.amountSpent, 6)),
|
|
708
|
+
Price: chalk.cyan(formatCurrency(result.newPrice)),
|
|
692
709
|
};
|
|
693
710
|
if (result.slippage !== undefined) {
|
|
694
|
-
boxContent["Slippage"] = `${result.slippage}
|
|
711
|
+
boxContent["Slippage"] = chalk.magenta(`${result.slippage}%`);
|
|
695
712
|
}
|
|
713
|
+
printBox("Purchase Details", boxContent);
|
|
714
|
+
// Display transaction hash with block explorer link
|
|
696
715
|
if (result.txHash) {
|
|
697
|
-
|
|
716
|
+
console.log();
|
|
717
|
+
console.log(chalk.green.bold(` â
Transaction Hash:`));
|
|
718
|
+
console.log(chalk.cyan(` ${result.txHash}`));
|
|
719
|
+
console.log(chalk.dim(` https://sepolia.basescan.org/tx/${result.txHash}`));
|
|
698
720
|
}
|
|
699
|
-
printBox("đ° Purchase Summary", boxContent);
|
|
700
721
|
// Display price impact warning
|
|
701
722
|
if (result.priceImpact !== undefined) {
|
|
702
723
|
console.log();
|
|
@@ -720,32 +741,48 @@ export function displayBuyResult(result) {
|
|
|
720
741
|
const feePercent = result.routeFee ? (result.routeFee / 10000).toFixed(2) : 'N/A';
|
|
721
742
|
console.log(chalk.cyan(` Route: ${result.route} (${feePercent}% fee)`));
|
|
722
743
|
}
|
|
744
|
+
// Quick commands
|
|
745
|
+
const prefix = interactive ? "" : "httpcat ";
|
|
746
|
+
console.log();
|
|
747
|
+
console.log(chalk.magenta.bold("⥠Quick commands:"));
|
|
748
|
+
console.log(` ${chalk.cyan.bold(`đ¸ ${prefix}sell`)} ${chalk.yellow.bold(result.tokenSymbol)} ${chalk.dim("<amount>")}`);
|
|
749
|
+
console.log(` ${chalk.cyan.bold(`âšī¸ ${prefix}info`)} ${chalk.yellow.bold(result.tokenSymbol)}`);
|
|
750
|
+
console.log();
|
|
723
751
|
}
|
|
724
752
|
else {
|
|
725
753
|
// Active token - Bonding curve display
|
|
754
|
+
console.log(chalk.magenta.bold("đ° Purchase Summary"));
|
|
755
|
+
console.log();
|
|
726
756
|
const graduationStatus = result.graduationReached
|
|
727
|
-
? "â
GRADUATED!"
|
|
728
|
-
: `${(result.graduationProgress || 0).toFixed(2)}
|
|
757
|
+
? chalk.green.bold("â
GRADUATED!")
|
|
758
|
+
: chalk.magenta(`${(result.graduationProgress || 0).toFixed(2)}%`);
|
|
729
759
|
const boxContent = {
|
|
730
|
-
Token:
|
|
731
|
-
Contract: formatAddress(result.tokenAddress || ""),
|
|
732
|
-
Source: "Bonding Curve",
|
|
733
|
-
"Tokens Received": formatTokenAmount(result.tokensReceived),
|
|
734
|
-
"Amount Spent": formatCurrency(result.amountSpent, 6),
|
|
760
|
+
Token: chalk.blue(result.tokenName) + ` ${chalk.yellow.bold(`(${result.tokenSymbol})`)}`,
|
|
761
|
+
Contract: chalk.cyan(formatAddress(result.tokenAddress || "")),
|
|
762
|
+
Source: chalk.yellow("Bonding Curve"),
|
|
763
|
+
"Tokens Received": chalk.green.bold(formatTokenAmount(result.tokensReceived)),
|
|
764
|
+
"Amount Spent": chalk.cyan(formatCurrency(result.amountSpent, 6)),
|
|
735
765
|
};
|
|
736
766
|
if (result.fee) {
|
|
737
|
-
boxContent["Fee (1%)"] = formatCurrency(result.fee, 6);
|
|
767
|
+
boxContent["Fee (1%)"] = chalk.dim(formatCurrency(result.fee, 6));
|
|
738
768
|
}
|
|
739
|
-
boxContent["New Price"] = formatCurrency(result.newPrice);
|
|
769
|
+
boxContent["New Price"] = chalk.cyan(formatCurrency(result.newPrice));
|
|
740
770
|
if (result.newMcap) {
|
|
741
|
-
boxContent["New Market Cap"] = formatCurrency(result.newMcap);
|
|
771
|
+
boxContent["New Market Cap"] = chalk.green(formatCurrency(result.newMcap));
|
|
742
772
|
}
|
|
743
773
|
boxContent["Graduation"] = graduationStatus;
|
|
744
|
-
printBox("
|
|
774
|
+
printBox("Purchase Details", boxContent);
|
|
745
775
|
console.log();
|
|
746
776
|
if (result.graduationProgress !== undefined) {
|
|
747
777
|
printGraduationProgress(result.graduationProgress);
|
|
748
778
|
}
|
|
779
|
+
// Quick commands
|
|
780
|
+
const prefix = interactive ? "" : "httpcat ";
|
|
781
|
+
console.log();
|
|
782
|
+
console.log(chalk.magenta.bold("⥠Quick commands:"));
|
|
783
|
+
console.log(` ${chalk.cyan.bold(`đ¸ ${prefix}sell`)} ${chalk.yellow.bold(result.tokenSymbol)} ${chalk.dim("<amount>")}`);
|
|
784
|
+
console.log(` ${chalk.cyan.bold(`âšī¸ ${prefix}info`)} ${chalk.yellow.bold(result.tokenSymbol)}`);
|
|
785
|
+
console.log();
|
|
749
786
|
}
|
|
750
787
|
}
|
|
751
788
|
export function displayBuyResultCompact(result, buyNumber, totalBuys) {
|