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.
Files changed (195) hide show
  1. package/.github/workflows/release.yml +96 -0
  2. package/.github/workflows/sync-version.yml +31 -2
  3. package/README.md +185 -62
  4. package/additions.txt +3 -0
  5. package/bun.lock +180 -1276
  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 +274 -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 +406 -46
  59. package/dist/client.js.map +1 -1
  60. package/dist/commands/account.d.ts.map +1 -1
  61. package/dist/commands/account.js +51 -22
  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 +122 -68
  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 +73 -36
  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 +200 -429
  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 +84 -27
  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 +125 -46
  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 +56 -22
  89. package/dist/commands/list.js.map +1 -1
  90. package/dist/commands/positions.d.ts.map +1 -1
  91. package/dist/commands/positions.js +76 -47
  92. package/dist/commands/positions.js.map +1 -1
  93. package/dist/commands/sell.d.ts.map +1 -1
  94. package/dist/commands/sell.js +62 -32
  95. package/dist/commands/sell.js.map +1 -1
  96. package/dist/commands/swap.d.ts.map +1 -0
  97. package/dist/commands/swap.js +392 -0
  98. package/dist/commands/swap.js.map +1 -0
  99. package/dist/commands/transactions.d.ts.map +1 -1
  100. package/dist/commands/transactions.js +28 -16
  101. package/dist/commands/transactions.js.map +1 -1
  102. package/dist/config.d.ts.map +1 -1
  103. package/dist/config.js +132 -11
  104. package/dist/config.js.map +1 -1
  105. package/dist/index.js +453 -145
  106. package/dist/index.js.map +1 -1
  107. package/dist/interactive/art.d.ts.map +1 -1
  108. package/dist/interactive/art.js +38 -1
  109. package/dist/interactive/art.js.map +1 -1
  110. package/dist/interactive/shell.d.ts.map +1 -1
  111. package/dist/interactive/shell.js +398 -2259
  112. package/dist/interactive/shell.js.map +1 -1
  113. package/dist/mcp/chat-state.d.ts.map +1 -1
  114. package/dist/mcp/chat-state.js +2 -1
  115. package/dist/mcp/chat-state.js.map +1 -1
  116. package/dist/mcp/server.js +1 -1
  117. package/dist/mcp/tools.d.ts.map +1 -1
  118. package/dist/mcp/tools.js +108 -1
  119. package/dist/mcp/tools.js.map +1 -1
  120. package/dist/mcp/types.d.ts.map +1 -1
  121. package/dist/types/agent-info.d.ts.map +1 -0
  122. package/dist/types/agent-info.js +11 -0
  123. package/dist/types/agent-info.js.map +1 -0
  124. package/dist/ui/components/ScrollableList.d.ts.map +1 -0
  125. package/dist/ui/components/ScrollableList.js +72 -0
  126. package/dist/ui/components/ScrollableList.js.map +1 -0
  127. package/dist/ui/components/ThemeProvider.d.ts.map +1 -0
  128. package/dist/ui/components/ThemeProvider.js +87 -0
  129. package/dist/ui/components/ThemeProvider.js.map +1 -0
  130. package/dist/ui/components/ThemedBox.d.ts.map +1 -0
  131. package/dist/ui/components/ThemedBox.js +24 -0
  132. package/dist/ui/components/ThemedBox.js.map +1 -0
  133. package/dist/ui/components/agent/ChatHeader.d.ts.map +1 -0
  134. package/dist/ui/components/agent/ChatHeader.js +39 -0
  135. package/dist/ui/components/agent/ChatHeader.js.map +1 -0
  136. package/dist/ui/components/agent/Header.d.ts.map +1 -0
  137. package/dist/ui/components/agent/Header.js +14 -0
  138. package/dist/ui/components/agent/Header.js.map +1 -0
  139. package/dist/ui/components/agent/Input.d.ts.map +1 -0
  140. package/dist/ui/components/agent/Input.js +23 -0
  141. package/dist/ui/components/agent/Input.js.map +1 -0
  142. package/dist/ui/components/agent/Output.d.ts.map +1 -0
  143. package/dist/ui/components/agent/Output.js +23 -0
  144. package/dist/ui/components/agent/Output.js.map +1 -0
  145. package/dist/ui/components/chat/TokenChatUI.d.ts.map +1 -0
  146. package/dist/ui/components/chat/TokenChatUI.js +133 -0
  147. package/dist/ui/components/chat/TokenChatUI.js.map +1 -0
  148. package/dist/ui/components/shell/ShellHeader.d.ts.map +1 -0
  149. package/dist/ui/components/shell/ShellHeader.js +31 -0
  150. package/dist/ui/components/shell/ShellHeader.js.map +1 -0
  151. package/dist/ui/components/shell/ShellInput.d.ts.map +1 -0
  152. package/dist/ui/components/shell/ShellInput.js +147 -0
  153. package/dist/ui/components/shell/ShellInput.js.map +1 -0
  154. package/dist/ui/components/shell/ShellOutput.d.ts.map +1 -0
  155. package/dist/ui/components/shell/ShellOutput.js +8 -0
  156. package/dist/ui/components/shell/ShellOutput.js.map +1 -0
  157. package/dist/ui/hooks/useChatWebSocket.d.ts.map +1 -0
  158. package/dist/ui/hooks/useChatWebSocket.js +76 -0
  159. package/dist/ui/hooks/useChatWebSocket.js.map +1 -0
  160. package/dist/ui/hooks/useCommandHistory.d.ts.map +1 -0
  161. package/dist/ui/hooks/useCommandHistory.js +70 -0
  162. package/dist/ui/hooks/useCommandHistory.js.map +1 -0
  163. package/dist/ui/hooks/useDebounce.d.ts.map +1 -0
  164. package/dist/ui/hooks/useDebounce.js +17 -0
  165. package/dist/ui/hooks/useDebounce.js.map +1 -0
  166. package/dist/ui/hooks/useLogStream.d.ts.map +1 -0
  167. package/dist/ui/hooks/useLogStream.js +20 -0
  168. package/dist/ui/hooks/useLogStream.js.map +1 -0
  169. package/dist/ui/hooks/useVirtualScroll.d.ts.map +1 -0
  170. package/dist/ui/hooks/useVirtualScroll.js +70 -0
  171. package/dist/ui/hooks/useVirtualScroll.js.map +1 -0
  172. package/dist/utils/constants.d.ts.map +1 -1
  173. package/dist/utils/constants.js +44 -2
  174. package/dist/utils/constants.js.map +1 -1
  175. package/dist/utils/errors.d.ts.map +1 -1
  176. package/dist/utils/errors.js +3 -3
  177. package/dist/utils/errors.js.map +1 -1
  178. package/dist/utils/formatting.d.ts.map +1 -1
  179. package/dist/utils/formatting.js +37 -6
  180. package/dist/utils/formatting.js.map +1 -1
  181. package/dist/utils/loading.d.ts.map +1 -1
  182. package/dist/utils/loading.js +23 -2
  183. package/dist/utils/loading.js.map +1 -1
  184. package/dist/utils/privateKeyPrompt.d.ts.map +1 -1
  185. package/dist/utils/privateKeyPrompt.js +31 -7
  186. package/dist/utils/privateKeyPrompt.js.map +1 -1
  187. package/dist/utils/status.d.ts.map +1 -0
  188. package/dist/utils/status.js +96 -0
  189. package/dist/utils/status.js.map +1 -0
  190. package/dist/utils/token-resolver.d.ts.map +1 -1
  191. package/dist/utils/token-resolver.js +17 -7
  192. package/dist/utils/token-resolver.js.map +1 -1
  193. package/issues.txt +2 -0
  194. package/package.json +16 -6
  195. 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, formatUnits } from "viem";
4
- import { getUSDCBalance } from "x402/shared/evm";
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
- // Create signer to check balances
46
- const signer = evm.createSignerSepolia(pk);
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 signer.getBalance({ address });
55
+ const ethBalance = await publicClient.getBalance({ address });
49
56
  const ethFormatted = formatEther(ethBalance);
50
- // Check USDC balance
51
- const usdcBalance = await getUSDCBalance(signer, address);
52
- const usdcFormatted = (Number(usdcBalance) / 10 ** 6).toFixed(2);
53
- // Fetch 402CAT token address from agent info
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
- const agentUrl = config.getAgentUrl();
59
- const agentInfoResponse = await fetch(`${agentUrl}/api/agent/info`);
60
- if (agentInfoResponse.ok) {
61
- const agentInfo = await agentInfoResponse.json();
62
- const catTokenAddress = agentInfo.catTokenAddress;
63
- if (catTokenAddress) {
64
- // Get 402CAT balance using ERC20 balanceOf
65
- const { createPublicClient, http, parseAbi } = await import("viem");
66
- const { baseSepolia } = await import("viem/chains");
67
- const publicClient = createPublicClient({
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.cyan("💰 Wallet Balances"));
107
- console.log(chalk.dim("─".repeat(50)));
136
+ console.log(chalk.magenta.bold("💰 Wallet Balances"));
137
+ console.log(chalk.dim("─".repeat(80)));
108
138
  console.log();
109
- // Format ETH with consistent alignment
110
- const ethLabel = "ETH:".padEnd(8);
111
- console.log(` ${chalk.dim(ethLabel)}${chalk.yellow(ethFormatted.padStart(25))} ${chalk.dim("ETH")}`);
112
- // Format USDC with consistent alignment
113
- const usdcLabel = "USDC:".padEnd(8);
114
- console.log(` ${chalk.dim(usdcLabel)}${chalk.green(`$${usdcFormatted}`.padStart(25))} ${chalk.dim("USDC")}`);
115
- // Format 402CAT if fetched
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: 4,
172
+ maximumFractionDigits: 2,
121
173
  minimumFractionDigits: 0
122
174
  });
123
- console.log(` ${chalk.dim(catLabel)}${chalk.cyan(catFormattedClean.padStart(25))} ${chalk.dim("CAT")}`);
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(` Wallet: ${formatAddress(address, 12)}`));
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
- printWarning("Low ETH balance - you may not have enough for gas fees");
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
- printWarning("Low USDC balance - you may not have enough for trades");
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":"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"}
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;AA8D7C,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,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;AA2iBjD,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,CAoNzB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CA8E7D;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,cAAc,EACtB,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI,CAkBN"}
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"}
@@ -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
- const USDC_ADDRESS = '0x036CbD53842c5426634e7929541eC2318f3dCF7e';
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: USDC_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: USDC_ADDRESS,
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: USDC_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: `${result.tokenName} (${result.tokenSymbol})`,
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
- boxContent["Transaction"] = result.txHash;
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: `${result.tokenName} (${result.tokenSymbol})`,
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("💰 Purchase Summary", boxContent);
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) {