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.
- package/.github/workflows/ci.yml +3 -0
- package/.github/workflows/rc-publish.yml +6 -0
- package/.github/workflows/release.yml +6 -0
- package/README.md +1306 -130
- package/bun.lock +2 -2
- package/dist/agent/ax-agent.d.ts.map +1 -1
- package/dist/agent/ax-agent.js +64 -1
- package/dist/agent/ax-agent.js.map +1 -1
- package/dist/agent/tools.d.ts.map +1 -1
- package/dist/agent/tools.js +107 -7
- package/dist/agent/tools.js.map +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +258 -11
- package/dist/client.js.map +1 -1
- package/dist/commands/account.d.ts.map +1 -1
- package/dist/commands/account.js +34 -14
- package/dist/commands/account.js.map +1 -1
- package/dist/commands/agent.d.ts.map +1 -1
- package/dist/commands/agent.js +114 -247
- package/dist/commands/agent.js.map +1 -1
- package/dist/commands/approve.d.ts.map +1 -0
- package/dist/commands/approve.js +505 -0
- package/dist/commands/approve.js.map +1 -0
- package/dist/commands/automation.d.ts.map +1 -0
- package/dist/commands/automation.js +346 -0
- package/dist/commands/automation.js.map +1 -0
- package/dist/commands/balances.d.ts.map +1 -1
- package/dist/commands/balances.js +31 -8
- package/dist/commands/balances.js.map +1 -1
- package/dist/commands/buy.d.ts.map +1 -1
- package/dist/commands/buy.js +88 -115
- package/dist/commands/buy.js.map +1 -1
- package/dist/commands/call.d.ts.map +1 -0
- package/dist/commands/call.js +51 -0
- package/dist/commands/call.js.map +1 -0
- package/dist/commands/cex.d.ts.map +1 -0
- package/dist/commands/cex.js +958 -0
- package/dist/commands/cex.js.map +1 -0
- package/dist/commands/claim.d.ts.map +1 -1
- package/dist/commands/claim.js +231 -4
- package/dist/commands/claim.js.map +1 -1
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +88 -3
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/gasless-swap.d.ts.map +1 -0
- package/dist/commands/gasless-swap.js +232 -0
- package/dist/commands/gasless-swap.js.map +1 -0
- package/dist/commands/health.d.ts.map +1 -1
- package/dist/commands/health.js +58 -4
- package/dist/commands/health.js.map +1 -1
- package/dist/commands/info.js +1 -1
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/launchpad.d.ts.map +1 -0
- package/dist/commands/launchpad.js +708 -0
- package/dist/commands/launchpad.js.map +1 -0
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +1 -1
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/market.d.ts.map +1 -0
- package/dist/commands/market.js +960 -0
- package/dist/commands/market.js.map +1 -0
- package/dist/commands/mcp-install.d.ts.map +1 -0
- package/dist/commands/mcp-install.js +387 -0
- package/dist/commands/mcp-install.js.map +1 -0
- package/dist/commands/opps.d.ts.map +1 -0
- package/dist/commands/opps.js +409 -0
- package/dist/commands/opps.js.map +1 -0
- package/dist/commands/perps.d.ts.map +1 -0
- package/dist/commands/perps.js +248 -0
- package/dist/commands/perps.js.map +1 -0
- package/dist/commands/portfolio.d.ts.map +1 -0
- package/dist/commands/portfolio.js +679 -0
- package/dist/commands/portfolio.js.map +1 -0
- package/dist/commands/positions.js +1 -1
- package/dist/commands/positions.js.map +1 -1
- package/dist/commands/predict.d.ts.map +1 -0
- package/dist/commands/predict.js +280 -0
- package/dist/commands/predict.js.map +1 -0
- package/dist/commands/predictions.d.ts.map +1 -0
- package/dist/commands/predictions.js +486 -0
- package/dist/commands/predictions.js.map +1 -0
- package/dist/commands/risk.d.ts.map +1 -0
- package/dist/commands/risk.js +225 -0
- package/dist/commands/risk.js.map +1 -0
- package/dist/commands/security.d.ts.map +1 -0
- package/dist/commands/security.js +244 -0
- package/dist/commands/security.js.map +1 -0
- package/dist/commands/sell.js +3 -3
- package/dist/commands/sell.js.map +1 -1
- package/dist/commands/send.d.ts.map +1 -0
- package/dist/commands/send.js +733 -0
- package/dist/commands/send.js.map +1 -0
- package/dist/commands/sign.d.ts.map +1 -0
- package/dist/commands/sign.js +1048 -0
- package/dist/commands/sign.js.map +1 -0
- package/dist/commands/swap.d.ts.map +1 -1
- package/dist/commands/swap.js +245 -2
- package/dist/commands/swap.js.map +1 -1
- package/dist/commands/system.d.ts.map +1 -0
- package/dist/commands/system.js +417 -0
- package/dist/commands/system.js.map +1 -0
- package/dist/commands/tools/index.d.ts.map +1 -0
- package/dist/commands/tools/index.js +2040 -0
- package/dist/commands/tools/index.js.map +1 -0
- package/dist/commands/trade.d.ts.map +1 -0
- package/dist/commands/trade.js +237 -0
- package/dist/commands/trade.js.map +1 -0
- package/dist/commands/transactions.js +1 -1
- package/dist/commands/transactions.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +429 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +91 -9
- package/dist/config.js.map +1 -1
- package/dist/index.js +4409 -1050
- package/dist/index.js.map +1 -1
- package/dist/interactive/art.d.ts.map +1 -1
- package/dist/interactive/art.js +33 -0
- package/dist/interactive/art.js.map +1 -1
- package/dist/interactive/shell.d.ts.map +1 -1
- package/dist/interactive/shell.js +81 -5
- package/dist/interactive/shell.js.map +1 -1
- package/dist/mcp/context.d.ts.map +1 -0
- package/dist/mcp/context.js +211 -0
- package/dist/mcp/context.js.map +1 -0
- package/dist/mcp/onboarding.d.ts.map +1 -0
- package/dist/mcp/onboarding.js +266 -0
- package/dist/mcp/onboarding.js.map +1 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +222 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +51 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +4119 -169
- package/dist/mcp/tools.js.map +1 -1
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/ui/components/shell/ShellInput.d.ts.map +1 -1
- package/dist/ui/components/shell/ShellInput.js +4 -0
- package/dist/ui/components/shell/ShellInput.js.map +1 -1
- package/dist/utils/admin.d.ts.map +1 -0
- package/dist/utils/admin.js +144 -0
- package/dist/utils/admin.js.map +1 -0
- package/dist/utils/autoSetup.d.ts.map +1 -0
- package/dist/utils/autoSetup.js +252 -0
- package/dist/utils/autoSetup.js.map +1 -0
- package/dist/utils/build-constants.d.ts.map +1 -0
- package/dist/utils/build-constants.js +10 -0
- package/dist/utils/build-constants.js.map +1 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +10 -1
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/formatting.d.ts.map +1 -1
- package/dist/utils/formatting.js +9 -3
- package/dist/utils/formatting.js.map +1 -1
- package/dist/utils/llm-cli-config.d.ts.map +1 -0
- package/dist/utils/llm-cli-config.js +963 -0
- package/dist/utils/llm-cli-config.js.map +1 -0
- package/dist/utils/llm-cli-detector.d.ts.map +1 -0
- package/dist/utils/llm-cli-detector.js +202 -0
- package/dist/utils/llm-cli-detector.js.map +1 -0
- package/dist/utils/maintenance.d.ts.map +1 -0
- package/dist/utils/maintenance.js +17 -0
- package/dist/utils/maintenance.js.map +1 -0
- package/dist/utils/mcp-config.d.ts.map +1 -0
- package/dist/utils/mcp-config.js +77 -0
- package/dist/utils/mcp-config.js.map +1 -0
- package/dist/utils/privateKeyPrompt.d.ts.map +1 -1
- package/dist/utils/privateKeyPrompt.js +287 -119
- package/dist/utils/privateKeyPrompt.js.map +1 -1
- package/dist/utils/process-cleanup.d.ts.map +1 -0
- package/dist/utils/process-cleanup.js +136 -0
- package/dist/utils/process-cleanup.js.map +1 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +56 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/shell-setup.d.ts.map +1 -0
- package/dist/utils/shell-setup.js +531 -0
- package/dist/utils/shell-setup.js.map +1 -0
- package/dist/utils/token-resolver.d.ts.map +1 -1
- package/dist/utils/token-resolver.js +42 -0
- package/dist/utils/token-resolver.js.map +1 -1
- package/dist/utils/x402-caller.d.ts.map +1 -0
- package/dist/utils/x402-caller.js +17 -0
- package/dist/utils/x402-caller.js.map +1 -0
- package/docs/README.md +28 -0
- package/docs/agent/README.md +18 -0
- package/docs/api/README.md +41 -0
- package/docs/cli/README.md +42 -0
- package/docs/guides/README.md +26 -0
- package/docs/implementation/README.md +18 -0
- package/docs/planning/README.md +19 -0
- package/docs/testing/README.md +15 -0
- package/docs/ux/README.md +16 -0
- package/package.json +9 -3
- package/scripts/cat-spin.sh +417 -0
- package/scripts/deprecate-rc-versions.js +58 -0
- package/scripts/inject-build-constants.js +43 -0
- package/scripts/monitor-foobar.js +117 -0
- package/test.txt +12 -0
- 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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"}
|
package/dist/commands/sell.js
CHANGED
|
@@ -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('
|
|
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('
|
|
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('
|
|
733
|
+
const { data } = await client.invoke('launchpad/sell', input);
|
|
734
734
|
// Add token info and source to result
|
|
735
735
|
return {
|
|
736
736
|
...data,
|