httpcat-cli 0.3.0-rc.9 → 0.3.1

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 (203) hide show
  1. package/.github/workflows/ci.yml +3 -0
  2. package/.github/workflows/rc-publish.yml +6 -0
  3. package/.github/workflows/release.yml +6 -0
  4. package/README.md +1306 -130
  5. package/bun.lock +2 -2
  6. package/dist/agent/ax-agent.d.ts.map +1 -1
  7. package/dist/agent/ax-agent.js +64 -1
  8. package/dist/agent/ax-agent.js.map +1 -1
  9. package/dist/agent/tools.d.ts.map +1 -1
  10. package/dist/agent/tools.js +107 -7
  11. package/dist/agent/tools.js.map +1 -1
  12. package/dist/client.d.ts.map +1 -1
  13. package/dist/client.js +258 -11
  14. package/dist/client.js.map +1 -1
  15. package/dist/commands/account.d.ts.map +1 -1
  16. package/dist/commands/account.js +34 -14
  17. package/dist/commands/account.js.map +1 -1
  18. package/dist/commands/agent.d.ts.map +1 -1
  19. package/dist/commands/agent.js +114 -247
  20. package/dist/commands/agent.js.map +1 -1
  21. package/dist/commands/approve.d.ts.map +1 -0
  22. package/dist/commands/approve.js +505 -0
  23. package/dist/commands/approve.js.map +1 -0
  24. package/dist/commands/automation.d.ts.map +1 -0
  25. package/dist/commands/automation.js +346 -0
  26. package/dist/commands/automation.js.map +1 -0
  27. package/dist/commands/balances.d.ts.map +1 -1
  28. package/dist/commands/balances.js +31 -8
  29. package/dist/commands/balances.js.map +1 -1
  30. package/dist/commands/buy.d.ts.map +1 -1
  31. package/dist/commands/buy.js +88 -115
  32. package/dist/commands/buy.js.map +1 -1
  33. package/dist/commands/call.d.ts.map +1 -0
  34. package/dist/commands/call.js +51 -0
  35. package/dist/commands/call.js.map +1 -0
  36. package/dist/commands/cex.d.ts.map +1 -0
  37. package/dist/commands/cex.js +958 -0
  38. package/dist/commands/cex.js.map +1 -0
  39. package/dist/commands/claim.d.ts.map +1 -1
  40. package/dist/commands/claim.js +231 -4
  41. package/dist/commands/claim.js.map +1 -1
  42. package/dist/commands/create.d.ts.map +1 -1
  43. package/dist/commands/create.js +88 -3
  44. package/dist/commands/create.js.map +1 -1
  45. package/dist/commands/gasless-swap.d.ts.map +1 -0
  46. package/dist/commands/gasless-swap.js +232 -0
  47. package/dist/commands/gasless-swap.js.map +1 -0
  48. package/dist/commands/health.d.ts.map +1 -1
  49. package/dist/commands/health.js +58 -4
  50. package/dist/commands/health.js.map +1 -1
  51. package/dist/commands/info.js +1 -1
  52. package/dist/commands/info.js.map +1 -1
  53. package/dist/commands/launchpad.d.ts.map +1 -0
  54. package/dist/commands/launchpad.js +708 -0
  55. package/dist/commands/launchpad.js.map +1 -0
  56. package/dist/commands/list.d.ts.map +1 -1
  57. package/dist/commands/list.js +1 -1
  58. package/dist/commands/list.js.map +1 -1
  59. package/dist/commands/market.d.ts.map +1 -0
  60. package/dist/commands/market.js +960 -0
  61. package/dist/commands/market.js.map +1 -0
  62. package/dist/commands/mcp-install.d.ts.map +1 -0
  63. package/dist/commands/mcp-install.js +387 -0
  64. package/dist/commands/mcp-install.js.map +1 -0
  65. package/dist/commands/opps.d.ts.map +1 -0
  66. package/dist/commands/opps.js +409 -0
  67. package/dist/commands/opps.js.map +1 -0
  68. package/dist/commands/perps.d.ts.map +1 -0
  69. package/dist/commands/perps.js +248 -0
  70. package/dist/commands/perps.js.map +1 -0
  71. package/dist/commands/portfolio.d.ts.map +1 -0
  72. package/dist/commands/portfolio.js +679 -0
  73. package/dist/commands/portfolio.js.map +1 -0
  74. package/dist/commands/positions.js +1 -1
  75. package/dist/commands/positions.js.map +1 -1
  76. package/dist/commands/predict.d.ts.map +1 -0
  77. package/dist/commands/predict.js +280 -0
  78. package/dist/commands/predict.js.map +1 -0
  79. package/dist/commands/predictions.d.ts.map +1 -0
  80. package/dist/commands/predictions.js +486 -0
  81. package/dist/commands/predictions.js.map +1 -0
  82. package/dist/commands/risk.d.ts.map +1 -0
  83. package/dist/commands/risk.js +225 -0
  84. package/dist/commands/risk.js.map +1 -0
  85. package/dist/commands/security.d.ts.map +1 -0
  86. package/dist/commands/security.js +244 -0
  87. package/dist/commands/security.js.map +1 -0
  88. package/dist/commands/sell.js +3 -3
  89. package/dist/commands/sell.js.map +1 -1
  90. package/dist/commands/send.d.ts.map +1 -0
  91. package/dist/commands/send.js +733 -0
  92. package/dist/commands/send.js.map +1 -0
  93. package/dist/commands/sign.d.ts.map +1 -0
  94. package/dist/commands/sign.js +1048 -0
  95. package/dist/commands/sign.js.map +1 -0
  96. package/dist/commands/swap.d.ts.map +1 -1
  97. package/dist/commands/swap.js +245 -2
  98. package/dist/commands/swap.js.map +1 -1
  99. package/dist/commands/system.d.ts.map +1 -0
  100. package/dist/commands/system.js +417 -0
  101. package/dist/commands/system.js.map +1 -0
  102. package/dist/commands/tools/index.d.ts.map +1 -0
  103. package/dist/commands/tools/index.js +2040 -0
  104. package/dist/commands/tools/index.js.map +1 -0
  105. package/dist/commands/trade.d.ts.map +1 -0
  106. package/dist/commands/trade.js +237 -0
  107. package/dist/commands/trade.js.map +1 -0
  108. package/dist/commands/transactions.js +1 -1
  109. package/dist/commands/transactions.js.map +1 -1
  110. package/dist/commands/update.d.ts.map +1 -0
  111. package/dist/commands/update.js +429 -0
  112. package/dist/commands/update.js.map +1 -0
  113. package/dist/config.d.ts.map +1 -1
  114. package/dist/config.js +91 -9
  115. package/dist/config.js.map +1 -1
  116. package/dist/index.js +4409 -1050
  117. package/dist/index.js.map +1 -1
  118. package/dist/interactive/art.d.ts.map +1 -1
  119. package/dist/interactive/art.js +33 -0
  120. package/dist/interactive/art.js.map +1 -1
  121. package/dist/interactive/shell.d.ts.map +1 -1
  122. package/dist/interactive/shell.js +81 -5
  123. package/dist/interactive/shell.js.map +1 -1
  124. package/dist/mcp/context.d.ts.map +1 -0
  125. package/dist/mcp/context.js +211 -0
  126. package/dist/mcp/context.js.map +1 -0
  127. package/dist/mcp/onboarding.d.ts.map +1 -0
  128. package/dist/mcp/onboarding.js +266 -0
  129. package/dist/mcp/onboarding.js.map +1 -0
  130. package/dist/mcp/resources.d.ts.map +1 -0
  131. package/dist/mcp/resources.js +222 -0
  132. package/dist/mcp/resources.js.map +1 -0
  133. package/dist/mcp/server.d.ts.map +1 -1
  134. package/dist/mcp/server.js +51 -1
  135. package/dist/mcp/server.js.map +1 -1
  136. package/dist/mcp/tools.d.ts.map +1 -1
  137. package/dist/mcp/tools.js +4119 -169
  138. package/dist/mcp/tools.js.map +1 -1
  139. package/dist/mcp/types.d.ts.map +1 -1
  140. package/dist/ui/components/shell/ShellInput.d.ts.map +1 -1
  141. package/dist/ui/components/shell/ShellInput.js +4 -0
  142. package/dist/ui/components/shell/ShellInput.js.map +1 -1
  143. package/dist/utils/admin.d.ts.map +1 -0
  144. package/dist/utils/admin.js +144 -0
  145. package/dist/utils/admin.js.map +1 -0
  146. package/dist/utils/autoSetup.d.ts.map +1 -0
  147. package/dist/utils/autoSetup.js +252 -0
  148. package/dist/utils/autoSetup.js.map +1 -0
  149. package/dist/utils/build-constants.d.ts.map +1 -0
  150. package/dist/utils/build-constants.js +10 -0
  151. package/dist/utils/build-constants.js.map +1 -0
  152. package/dist/utils/errors.d.ts.map +1 -1
  153. package/dist/utils/errors.js +10 -1
  154. package/dist/utils/errors.js.map +1 -1
  155. package/dist/utils/formatting.d.ts.map +1 -1
  156. package/dist/utils/formatting.js +9 -3
  157. package/dist/utils/formatting.js.map +1 -1
  158. package/dist/utils/llm-cli-config.d.ts.map +1 -0
  159. package/dist/utils/llm-cli-config.js +963 -0
  160. package/dist/utils/llm-cli-config.js.map +1 -0
  161. package/dist/utils/llm-cli-detector.d.ts.map +1 -0
  162. package/dist/utils/llm-cli-detector.js +202 -0
  163. package/dist/utils/llm-cli-detector.js.map +1 -0
  164. package/dist/utils/maintenance.d.ts.map +1 -0
  165. package/dist/utils/maintenance.js +17 -0
  166. package/dist/utils/maintenance.js.map +1 -0
  167. package/dist/utils/mcp-config.d.ts.map +1 -0
  168. package/dist/utils/mcp-config.js +77 -0
  169. package/dist/utils/mcp-config.js.map +1 -0
  170. package/dist/utils/privateKeyPrompt.d.ts.map +1 -1
  171. package/dist/utils/privateKeyPrompt.js +287 -119
  172. package/dist/utils/privateKeyPrompt.js.map +1 -1
  173. package/dist/utils/process-cleanup.d.ts.map +1 -0
  174. package/dist/utils/process-cleanup.js +136 -0
  175. package/dist/utils/process-cleanup.js.map +1 -0
  176. package/dist/utils/retry.d.ts.map +1 -0
  177. package/dist/utils/retry.js +56 -0
  178. package/dist/utils/retry.js.map +1 -0
  179. package/dist/utils/shell-setup.d.ts.map +1 -0
  180. package/dist/utils/shell-setup.js +531 -0
  181. package/dist/utils/shell-setup.js.map +1 -0
  182. package/dist/utils/token-resolver.d.ts.map +1 -1
  183. package/dist/utils/token-resolver.js +42 -0
  184. package/dist/utils/token-resolver.js.map +1 -1
  185. package/dist/utils/x402-caller.d.ts.map +1 -0
  186. package/dist/utils/x402-caller.js +17 -0
  187. package/dist/utils/x402-caller.js.map +1 -0
  188. package/docs/README.md +28 -0
  189. package/docs/agent/README.md +18 -0
  190. package/docs/api/README.md +41 -0
  191. package/docs/cli/README.md +42 -0
  192. package/docs/guides/README.md +26 -0
  193. package/docs/implementation/README.md +18 -0
  194. package/docs/planning/README.md +19 -0
  195. package/docs/testing/README.md +15 -0
  196. package/docs/ux/README.md +16 -0
  197. package/package.json +9 -3
  198. package/scripts/cat-spin.sh +417 -0
  199. package/scripts/deprecate-rc-versions.js +58 -0
  200. package/scripts/inject-build-constants.js +43 -0
  201. package/scripts/monitor-foobar.js +117 -0
  202. package/test.txt +12 -0
  203. package/tests/fixtures/test-data.json +16 -0
@@ -0,0 +1,225 @@
1
+ import { Command } from "commander";
2
+ import { HttpcatClient } from "../client.js";
3
+ import { config } from "../config.js";
4
+ import chalk from "chalk";
5
+ import { printBox, formatAddress } from "../utils/formatting.js";
6
+ import { withLoading } from "../utils/loading.js";
7
+ import { outputJson, outputError } from "../headless/json-output.js";
8
+ import { handleError, getExitCode } from "../utils/errors.js";
9
+ import { promptForPrivateKey } from "../utils/privateKeyPrompt.js";
10
+ import { privateKeyToAccount } from "viem/accounts";
11
+ function getPrivateKey(cliPrivateKey, accountIndex) {
12
+ if (cliPrivateKey)
13
+ return cliPrivateKey;
14
+ const envKey = process.env.HTTPCAT_PRIVATE_KEY;
15
+ if (envKey)
16
+ return envKey;
17
+ try {
18
+ const index = accountIndex !== undefined ? accountIndex : config.getActiveAccountIndex();
19
+ return config.getAccountPrivateKey(index);
20
+ }
21
+ catch {
22
+ return config.get("privateKey");
23
+ }
24
+ }
25
+ function isConfigured(cliPrivateKey) {
26
+ if (cliPrivateKey)
27
+ return true;
28
+ return config.isConfigured();
29
+ }
30
+ async function ensureWalletUnlocked() {
31
+ const password = config.getPassword();
32
+ if (!password) {
33
+ config.ensureSessionValid();
34
+ return;
35
+ }
36
+ if (!config.isSessionValid()) {
37
+ const inquirer = (await import("inquirer")).default;
38
+ const answers = await inquirer.prompt([
39
+ { type: "password", name: "password", message: "Enter password to unlock wallet:", mask: "•" },
40
+ ]);
41
+ await config.unlockSession(answers.password);
42
+ }
43
+ }
44
+ export function createRiskCommand() {
45
+ const riskCommand = new Command("risk")
46
+ .description("Risk management & policy")
47
+ .addHelpText("after", `Examples:\n httpcat risk policy --wallet 0x...\n httpcat risk evaluate <wallet> <trade-json>`);
48
+ riskCommand
49
+ .command("policy")
50
+ .description("Get or set risk policy for a wallet ($0.001)")
51
+ .option("--wallet <address>", "Wallet address (defaults to active account)")
52
+ .option("--set <json>", "Set policy (JSON string or file path)")
53
+ .action(async (options, command) => {
54
+ try {
55
+ const globalOpts = command.parent?.parent?.opts() || {};
56
+ const accountIndex = globalOpts.account;
57
+ await ensureWalletUnlocked();
58
+ let privateKey = getPrivateKey(globalOpts.privateKey, accountIndex);
59
+ if (!isConfigured(globalOpts.privateKey)) {
60
+ if (globalOpts.json) {
61
+ console.error('❌ Not configured. Run "httpcat config" first or use --private-key flag.');
62
+ process.exit(2);
63
+ }
64
+ privateKey = await promptForPrivateKey();
65
+ }
66
+ const client = await HttpcatClient.create(privateKey);
67
+ let walletAddress = options.wallet;
68
+ if (!walletAddress) {
69
+ const account = privateKeyToAccount(privateKey);
70
+ walletAddress = account.address;
71
+ }
72
+ const result = await withLoading(async () => {
73
+ if (options.set) {
74
+ // POST - Set policy
75
+ let policyData;
76
+ try {
77
+ policyData = JSON.parse(options.set);
78
+ }
79
+ catch {
80
+ const fs = await import("fs");
81
+ if (fs.existsSync(options.set)) {
82
+ policyData = JSON.parse(fs.readFileSync(options.set, "utf-8"));
83
+ }
84
+ else {
85
+ throw new Error("Invalid policy JSON: must be JSON string or file path");
86
+ }
87
+ }
88
+ const { data } = await client.invoke("risk/policy", {
89
+ wallet: walletAddress,
90
+ ...policyData,
91
+ });
92
+ return data;
93
+ }
94
+ else {
95
+ // GET - Get policy
96
+ const params = new URLSearchParams({ wallet: walletAddress });
97
+ try {
98
+ const data = await client.get(`/risk/policy?${params.toString()}`);
99
+ return data.output || data;
100
+ }
101
+ catch {
102
+ const { data } = await client.invoke("risk/policy", { wallet: walletAddress });
103
+ return data;
104
+ }
105
+ }
106
+ }, {
107
+ message: options.set ? "Setting risk policy..." : "Fetching risk policy...",
108
+ json: globalOpts.json,
109
+ quiet: globalOpts.quiet,
110
+ spinner: "cat",
111
+ clearOnSuccess: true,
112
+ });
113
+ if (globalOpts.json) {
114
+ outputJson("risk_policy", result);
115
+ }
116
+ else if (!globalOpts.quiet) {
117
+ console.log();
118
+ console.log(chalk.magenta.bold("🛡️ Risk Policy"));
119
+ console.log();
120
+ if (result.policy) {
121
+ printBox("Policy", {
122
+ Wallet: formatAddress(result.wallet || walletAddress, 12),
123
+ "Max Position Size": result.policy.maxPositionSize || "N/A",
124
+ "Max Leverage": result.policy.maxLeverage?.toString() || "N/A",
125
+ "Allowed Tokens": result.policy.allowedTokens?.length?.toString() || "0",
126
+ "Blocked Tokens": result.policy.blockedTokens?.length?.toString() || "0",
127
+ });
128
+ }
129
+ else {
130
+ console.log(chalk.dim("No policy set."));
131
+ }
132
+ console.log();
133
+ }
134
+ process.exit(0);
135
+ }
136
+ catch (error) {
137
+ const globalOpts = command.parent?.parent?.opts() || {};
138
+ if (globalOpts.json) {
139
+ outputError("risk_policy", error, getExitCode(error));
140
+ }
141
+ else {
142
+ handleError(error, globalOpts.verbose);
143
+ }
144
+ process.exit(getExitCode(error));
145
+ }
146
+ });
147
+ riskCommand
148
+ .command("evaluate")
149
+ .description("Evaluate risk policy against a proposed trade ($0.001)")
150
+ .argument("<wallet>", "Wallet address (0x format)")
151
+ .requiredOption("--trade <json>", "Trade JSON (as string or file path)")
152
+ .action(async (wallet, options, command) => {
153
+ try {
154
+ const globalOpts = command.parent?.parent?.opts() || {};
155
+ const accountIndex = globalOpts.account;
156
+ await ensureWalletUnlocked();
157
+ let privateKey = getPrivateKey(globalOpts.privateKey, accountIndex);
158
+ if (!isConfigured(globalOpts.privateKey)) {
159
+ if (globalOpts.json) {
160
+ console.error('❌ Not configured. Run "httpcat config" first or use --private-key flag.');
161
+ process.exit(2);
162
+ }
163
+ privateKey = await promptForPrivateKey();
164
+ }
165
+ const client = await HttpcatClient.create(privateKey);
166
+ // Parse trade JSON
167
+ let trade;
168
+ try {
169
+ trade = JSON.parse(options.trade);
170
+ }
171
+ catch {
172
+ const fs = await import("fs");
173
+ if (fs.existsSync(options.trade)) {
174
+ trade = JSON.parse(fs.readFileSync(options.trade, "utf-8"));
175
+ }
176
+ else {
177
+ throw new Error("Invalid trade JSON: must be JSON string or file path");
178
+ }
179
+ }
180
+ const result = await withLoading(async () => {
181
+ const { data } = await client.invoke("risk/evaluate", {
182
+ wallet,
183
+ trade,
184
+ });
185
+ return data;
186
+ }, {
187
+ message: "Evaluating risk...",
188
+ json: globalOpts.json,
189
+ quiet: globalOpts.quiet,
190
+ spinner: "cat",
191
+ clearOnSuccess: true,
192
+ });
193
+ if (globalOpts.json) {
194
+ outputJson("risk_evaluate", result);
195
+ }
196
+ else if (!globalOpts.quiet) {
197
+ console.log();
198
+ console.log(chalk.magenta.bold("⚖️ Risk Evaluation"));
199
+ console.log();
200
+ const riskScore = parseFloat(result.riskScore?.toString() || "0");
201
+ const riskColor = riskScore < 30 ? chalk.green : riskScore < 70 ? chalk.yellow : chalk.red;
202
+ const allowedColor = result.allowed ? chalk.green : chalk.red;
203
+ printBox("Evaluation Result", {
204
+ Allowed: allowedColor.bold(result.allowed ? "Yes" : "No"),
205
+ "Risk Score": riskColor(`${riskScore}/100`),
206
+ Reason: chalk.yellow(result.reason || "N/A"),
207
+ });
208
+ console.log();
209
+ }
210
+ process.exit(0);
211
+ }
212
+ catch (error) {
213
+ const globalOpts = command.parent?.parent?.opts() || {};
214
+ if (globalOpts.json) {
215
+ outputError("risk_evaluate", error, getExitCode(error));
216
+ }
217
+ else {
218
+ handleError(error, globalOpts.verbose);
219
+ }
220
+ process.exit(getExitCode(error));
221
+ }
222
+ });
223
+ return riskCommand;
224
+ }
225
+ //# sourceMappingURL=risk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk.js","sourceRoot":"","sources":["../../src/commands/risk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/commands/security.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2CpC,wBAAgB,qBAAqB,IAAI,OAAO,CAuM/C"}
@@ -0,0 +1,244 @@
1
+ import { Command } from "commander";
2
+ import { HttpcatClient } from "../client.js";
3
+ import { config } from "../config.js";
4
+ import chalk from "chalk";
5
+ import { printBox, formatAddress, formatTokenAmount } from "../utils/formatting.js";
6
+ import { withLoading } from "../utils/loading.js";
7
+ import { outputJson, outputError } from "../headless/json-output.js";
8
+ import { handleError, getExitCode } from "../utils/errors.js";
9
+ import { promptForPrivateKey } from "../utils/privateKeyPrompt.js";
10
+ import { privateKeyToAccount } from "viem/accounts";
11
+ function getPrivateKey(cliPrivateKey, accountIndex) {
12
+ if (cliPrivateKey)
13
+ return cliPrivateKey;
14
+ const envKey = process.env.HTTPCAT_PRIVATE_KEY;
15
+ if (envKey)
16
+ return envKey;
17
+ try {
18
+ const index = accountIndex !== undefined ? accountIndex : config.getActiveAccountIndex();
19
+ return config.getAccountPrivateKey(index);
20
+ }
21
+ catch {
22
+ return config.get("privateKey");
23
+ }
24
+ }
25
+ function isConfigured(cliPrivateKey) {
26
+ if (cliPrivateKey)
27
+ return true;
28
+ return config.isConfigured();
29
+ }
30
+ async function ensureWalletUnlocked() {
31
+ const password = config.getPassword();
32
+ if (!password) {
33
+ config.ensureSessionValid();
34
+ return;
35
+ }
36
+ if (!config.isSessionValid()) {
37
+ const inquirer = (await import("inquirer")).default;
38
+ const answers = await inquirer.prompt([
39
+ { type: "password", name: "password", message: "Enter password to unlock wallet:", mask: "•" },
40
+ ]);
41
+ await config.unlockSession(answers.password);
42
+ }
43
+ }
44
+ export function createSecurityCommand() {
45
+ const securityCommand = new Command("security")
46
+ .description("Security & safety analysis")
47
+ .addHelpText("after", `Examples:\n httpcat security token-scan <address>\n httpcat security allowances <wallet> <token>`);
48
+ securityCommand
49
+ .command("token-scan")
50
+ .description("Comprehensive token safety scan ($0.01)")
51
+ .argument("<tokenAddress>", "Token address (0x format)")
52
+ .action(async (tokenAddress, options, command) => {
53
+ try {
54
+ const globalOpts = command.parent?.parent?.opts() || {};
55
+ const accountIndex = globalOpts.account;
56
+ await ensureWalletUnlocked();
57
+ let privateKey = getPrivateKey(globalOpts.privateKey, accountIndex);
58
+ if (!isConfigured(globalOpts.privateKey)) {
59
+ if (globalOpts.json) {
60
+ console.error('❌ Not configured. Run "httpcat config" first or use --private-key flag.');
61
+ process.exit(2);
62
+ }
63
+ privateKey = await promptForPrivateKey();
64
+ }
65
+ const client = await HttpcatClient.create(privateKey);
66
+ const params = new URLSearchParams({ tokenAddress });
67
+ const result = await withLoading(async () => {
68
+ try {
69
+ const data = await client.get(`/security/token-scan?${params.toString()}`);
70
+ return data.output || data;
71
+ }
72
+ catch {
73
+ const { data } = await client.invoke("security/token-scan", { tokenAddress });
74
+ return data;
75
+ }
76
+ }, { message: "Scanning token...", json: globalOpts.json, quiet: globalOpts.quiet, spinner: "cat", clearOnSuccess: true });
77
+ if (globalOpts.json) {
78
+ outputJson("security_token_scan", result);
79
+ }
80
+ else if (!globalOpts.quiet) {
81
+ console.log();
82
+ console.log(chalk.magenta.bold("🔒 Token Security Scan"));
83
+ console.log();
84
+ const riskScore = parseFloat(result.riskScore?.toString() || "0");
85
+ const riskColor = riskScore < 30 ? chalk.green : riskScore < 70 ? chalk.yellow : chalk.red;
86
+ printBox("Security Scan", {
87
+ Address: chalk.cyan(tokenAddress),
88
+ "Risk Score": riskColor(`${riskScore}/100`),
89
+ Recommendation: chalk.yellow(result.recommendation || "N/A"),
90
+ });
91
+ if (result.warnings && result.warnings.length > 0) {
92
+ console.log();
93
+ console.log(chalk.red.bold("⚠️ Warnings:"));
94
+ for (const warning of result.warnings) {
95
+ console.log(chalk.yellow(` • ${warning}`));
96
+ }
97
+ }
98
+ console.log();
99
+ }
100
+ process.exit(0);
101
+ }
102
+ catch (error) {
103
+ const globalOpts = command.parent?.parent?.opts() || {};
104
+ if (globalOpts.json) {
105
+ outputError("security_token_scan", error, getExitCode(error));
106
+ }
107
+ else {
108
+ handleError(error, globalOpts.verbose);
109
+ }
110
+ process.exit(getExitCode(error));
111
+ }
112
+ });
113
+ securityCommand
114
+ .command("allowances")
115
+ .description("Check token allowances for a wallet ($0.001)")
116
+ .argument("<wallet>", "Wallet address (0x format)")
117
+ .argument("<token>", "Token address (0x format)")
118
+ .option("--spender <address>", "Spender address (optional)")
119
+ .action(async (wallet, token, options, command) => {
120
+ try {
121
+ const globalOpts = command.parent?.parent?.opts() || {};
122
+ const accountIndex = globalOpts.account;
123
+ await ensureWalletUnlocked();
124
+ let privateKey = getPrivateKey(globalOpts.privateKey, accountIndex);
125
+ if (!isConfigured(globalOpts.privateKey)) {
126
+ if (globalOpts.json) {
127
+ console.error('❌ Not configured. Run "httpcat config" first or use --private-key flag.');
128
+ process.exit(2);
129
+ }
130
+ privateKey = await promptForPrivateKey();
131
+ }
132
+ const client = await HttpcatClient.create(privateKey);
133
+ const params = new URLSearchParams({ wallet, token });
134
+ if (options.spender)
135
+ params.append("spender", options.spender);
136
+ const result = await withLoading(async () => {
137
+ try {
138
+ const data = await client.get(`/security/allowances?${params.toString()}`);
139
+ return data.output || data;
140
+ }
141
+ catch {
142
+ const { data } = await client.invoke("security/allowances", { wallet, token, spender: options.spender });
143
+ return data;
144
+ }
145
+ }, { message: "Fetching allowances...", json: globalOpts.json, quiet: globalOpts.quiet, spinner: "cat", clearOnSuccess: true });
146
+ if (globalOpts.json) {
147
+ outputJson("security_allowances", result);
148
+ }
149
+ else if (!globalOpts.quiet) {
150
+ console.log();
151
+ console.log(chalk.magenta.bold(`🔐 Token Allowances (${result.allowances?.length || 0})`));
152
+ console.log();
153
+ if (result.allowances && result.allowances.length > 0) {
154
+ for (const allowance of result.allowances) {
155
+ printBox("Allowance", {
156
+ Token: formatAddress(allowance.token, 12),
157
+ Spender: formatAddress(allowance.spender, 12),
158
+ Amount: chalk.yellow(allowance.amountFormatted || formatTokenAmount(allowance.amount)),
159
+ });
160
+ }
161
+ }
162
+ else {
163
+ console.log(chalk.dim("No allowances found."));
164
+ }
165
+ console.log();
166
+ }
167
+ process.exit(0);
168
+ }
169
+ catch (error) {
170
+ const globalOpts = command.parent?.parent?.opts() || {};
171
+ if (globalOpts.json) {
172
+ outputError("security_allowances", error, getExitCode(error));
173
+ }
174
+ else {
175
+ handleError(error, globalOpts.verbose);
176
+ }
177
+ process.exit(getExitCode(error));
178
+ }
179
+ });
180
+ securityCommand
181
+ .command("revoke-allowance")
182
+ .description("Generate revoke allowance transaction ($0.001)")
183
+ .requiredOption("--token <address>", "Token address (0x format)")
184
+ .requiredOption("--spender <address>", "Spender address (0x format)")
185
+ .option("--wallet <address>", "Wallet address (defaults to active account)")
186
+ .option("--execute", "Execute the transaction")
187
+ .action(async (options, command) => {
188
+ try {
189
+ const globalOpts = command.parent?.parent?.opts() || {};
190
+ const accountIndex = globalOpts.account;
191
+ await ensureWalletUnlocked();
192
+ let privateKey = getPrivateKey(globalOpts.privateKey, accountIndex);
193
+ if (!isConfigured(globalOpts.privateKey)) {
194
+ if (globalOpts.json) {
195
+ console.error('❌ Not configured. Run "httpcat config" first or use --private-key flag.');
196
+ process.exit(2);
197
+ }
198
+ privateKey = await promptForPrivateKey();
199
+ }
200
+ const client = await HttpcatClient.create(privateKey);
201
+ let walletAddress = options.wallet;
202
+ if (!walletAddress) {
203
+ const account = privateKeyToAccount(privateKey);
204
+ walletAddress = account.address;
205
+ }
206
+ const result = await withLoading(async () => {
207
+ const { data } = await client.invoke("security/revoke-allowance", {
208
+ token: options.token,
209
+ spender: options.spender,
210
+ wallet: walletAddress,
211
+ });
212
+ return data;
213
+ }, { message: "Generating revoke transaction...", json: globalOpts.json, quiet: globalOpts.quiet, spinner: "cat", clearOnSuccess: true });
214
+ if (globalOpts.json) {
215
+ outputJson("security_revoke_allowance", result);
216
+ }
217
+ else if (!globalOpts.quiet) {
218
+ console.log();
219
+ console.log(chalk.magenta.bold("🚫 Revoke Allowance"));
220
+ console.log();
221
+ if (result.transaction) {
222
+ console.log(JSON.stringify(result.transaction, null, 2));
223
+ if (options.execute) {
224
+ console.log(chalk.yellow("⚠️ Transaction execution not yet implemented. Use the transaction data to execute manually."));
225
+ }
226
+ }
227
+ console.log();
228
+ }
229
+ process.exit(0);
230
+ }
231
+ catch (error) {
232
+ const globalOpts = command.parent?.parent?.opts() || {};
233
+ if (globalOpts.json) {
234
+ outputError("security_revoke_allowance", error, getExitCode(error));
235
+ }
236
+ else {
237
+ handleError(error, globalOpts.verbose);
238
+ }
239
+ process.exit(getExitCode(error));
240
+ }
241
+ });
242
+ return securityCommand;
243
+ }
244
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/commands/security.ts"],"names":[],"mappings":"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"}
@@ -640,7 +640,7 @@ privateKey // Private key for executing Uniswap swaps
640
640
  // Get transaction data from backend using universal swap
641
641
  // Pass userAddress so backend knows where to send USDC
642
642
  const input = { tokenIdentifier: tokenId, tokenAmount: actualAmount, slippage: 0.5, userAddress };
643
- const { data } = await client.invoke('tokens/sell-universal', input);
643
+ const { data } = await client.invoke('launchpad/sell', input);
644
644
  // Check price impact (confirmation disabled for now)
645
645
  if (data.priceImpact) {
646
646
  await checkPriceImpact(data.priceImpact, silent);
@@ -693,7 +693,7 @@ privateKey // Private key for executing Uniswap swaps
693
693
  // Get transaction data from backend using universal swap
694
694
  // Pass userAddress so backend knows where to send USDC
695
695
  const input = { tokenIdentifier: tokenId, tokenAmount: graduatedActualAmount, slippage: 0.5, userAddress: graduatedUserAddress };
696
- const { data } = await client.invoke('tokens/sell-universal', input);
696
+ const { data } = await client.invoke('launchpad/sell', input);
697
697
  // Check price impact (confirmation disabled for now)
698
698
  if (data.priceImpact) {
699
699
  await checkPriceImpact(data.priceImpact, silent);
@@ -730,7 +730,7 @@ privateKey // Private key for executing Uniswap swaps
730
730
  // Active token - use bonding curve (existing logic)
731
731
  const input = { tokenIdentifier: tokenId, tokenAmount };
732
732
  // Make request
733
- const { data } = await client.invoke('tokens/sell', input);
733
+ const { data } = await client.invoke('launchpad/sell', input);
734
734
  // Add token info and source to result
735
735
  return {
736
736
  ...data,