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,505 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { printBox, formatAddress, } from "../utils/formatting.js";
|
|
3
|
+
import { printSuccess } from "../interactive/art.js";
|
|
4
|
+
import { resolveTokenId } from "../utils/token-resolver.js";
|
|
5
|
+
import { createPublicClient, createWalletClient, parseAbi, formatUnits, parseUnits, formatEther, isAddress, getAddress, encodeFunctionData, } from "viem";
|
|
6
|
+
import { privateKeyToAccount } from "viem/accounts";
|
|
7
|
+
import { config } from "../config.js";
|
|
8
|
+
import { createRpcTransport } from "../utils/rpc-transport.js";
|
|
9
|
+
import { getNetworkConfig } from "../utils/constants.js";
|
|
10
|
+
import inquirer from "inquirer";
|
|
11
|
+
// ERC20 ABI for token operations
|
|
12
|
+
const ERC20_ABI = parseAbi([
|
|
13
|
+
"function approve(address spender, uint256 amount) returns (bool)",
|
|
14
|
+
"function allowance(address owner, address spender) view returns (uint256)",
|
|
15
|
+
"function balanceOf(address owner) view returns (uint256)",
|
|
16
|
+
"function decimals() view returns (uint8)",
|
|
17
|
+
"function symbol() view returns (string)",
|
|
18
|
+
"function name() view returns (string)",
|
|
19
|
+
]);
|
|
20
|
+
// Permit2 address (Uniswap Universal Router)
|
|
21
|
+
const PERMIT2_ADDRESS = "0x000000000022D473030F116dDEE9F6B43aC78BA3";
|
|
22
|
+
// Permit2 ABI
|
|
23
|
+
const PERMIT2_ABI = parseAbi([
|
|
24
|
+
"function allowance(address owner, address token, address spender) view returns (uint160 amount, uint48 expiration, uint48 nonce)",
|
|
25
|
+
"function approve(address token, address spender, uint160 amount, uint48 expiration)",
|
|
26
|
+
]);
|
|
27
|
+
/**
|
|
28
|
+
* Validate and checksum an Ethereum address
|
|
29
|
+
*/
|
|
30
|
+
function validateAddress(address) {
|
|
31
|
+
if (!isAddress(address)) {
|
|
32
|
+
throw new Error(`Invalid address format: ${address}`);
|
|
33
|
+
}
|
|
34
|
+
return getAddress(address);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Resolve recipient (account index or address) - helper
|
|
38
|
+
*/
|
|
39
|
+
function resolveRecipient(to) {
|
|
40
|
+
// Check if it's a number (account index)
|
|
41
|
+
const accountIndex = parseInt(to, 10);
|
|
42
|
+
if (!isNaN(accountIndex) && to.trim() === accountIndex.toString()) {
|
|
43
|
+
// It's a number - try to resolve to account address
|
|
44
|
+
const accounts = config.getAllAccounts();
|
|
45
|
+
const account = accounts.find((acc) => acc.index === accountIndex);
|
|
46
|
+
if (!account) {
|
|
47
|
+
throw new Error(`Account at index ${accountIndex} not found. Use "httpcat account list" to see available accounts.`);
|
|
48
|
+
}
|
|
49
|
+
return account.address;
|
|
50
|
+
}
|
|
51
|
+
// Not a number - treat as address
|
|
52
|
+
return to;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get gas configuration
|
|
56
|
+
*/
|
|
57
|
+
async function getGasConfig(publicClient, options) {
|
|
58
|
+
const gasConfig = {};
|
|
59
|
+
if (options.gasPrice) {
|
|
60
|
+
gasConfig.gasPrice = BigInt(parseFloat(options.gasPrice) * 1e9);
|
|
61
|
+
}
|
|
62
|
+
if (options.maxFeePerGas) {
|
|
63
|
+
gasConfig.maxFeePerGas = BigInt(parseFloat(options.maxFeePerGas) * 1e9);
|
|
64
|
+
}
|
|
65
|
+
if (options.maxPriorityFeePerGas) {
|
|
66
|
+
gasConfig.maxPriorityFeePerGas = BigInt(parseFloat(options.maxPriorityFeePerGas) * 1e9);
|
|
67
|
+
}
|
|
68
|
+
if (options.gasLimit) {
|
|
69
|
+
gasConfig.gas = options.gasLimit;
|
|
70
|
+
}
|
|
71
|
+
// If no gas config provided, try to get from network
|
|
72
|
+
if (!gasConfig.gasPrice && !gasConfig.maxFeePerGas) {
|
|
73
|
+
try {
|
|
74
|
+
const feeData = await publicClient.estimateFeesPerGas();
|
|
75
|
+
if (feeData) {
|
|
76
|
+
gasConfig.maxFeePerGas = feeData.maxFeePerGas;
|
|
77
|
+
gasConfig.maxPriorityFeePerGas =
|
|
78
|
+
feeData.maxPriorityFeePerGas || feeData.maxFeePerGas / 2n;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Fallback to default if estimation fails
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return gasConfig;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Prompt for confirmation
|
|
89
|
+
*/
|
|
90
|
+
async function promptConfirmation(summary, options) {
|
|
91
|
+
if (options.noConfirm) {
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
if (options.confirm || !options.silent) {
|
|
95
|
+
const message = options.permit2
|
|
96
|
+
? `Approve ${summary.tokenSymbol || summary.token} to Permit2 (${summary.spender})?\n Amount: ${summary.amountFormatted}`
|
|
97
|
+
: `Approve ${summary.amountFormatted} ${summary.tokenSymbol || summary.token} to ${summary.spender}?`;
|
|
98
|
+
const answers = await inquirer.prompt([
|
|
99
|
+
{
|
|
100
|
+
type: "confirm",
|
|
101
|
+
name: "confirm",
|
|
102
|
+
message,
|
|
103
|
+
default: false,
|
|
104
|
+
},
|
|
105
|
+
]);
|
|
106
|
+
return answers.confirm;
|
|
107
|
+
}
|
|
108
|
+
// Default: show summary but don't require confirmation in non-interactive mode
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Approve ERC20 token
|
|
113
|
+
*/
|
|
114
|
+
export async function approveToken(client, tokenIdentifier, spender, amount, privateKey, options = {}) {
|
|
115
|
+
const account = privateKeyToAccount(privateKey);
|
|
116
|
+
const from = account.address;
|
|
117
|
+
const network = client.getNetwork();
|
|
118
|
+
const { chain } = await getNetworkConfig(network);
|
|
119
|
+
const publicClient = createPublicClient({
|
|
120
|
+
chain,
|
|
121
|
+
transport: createRpcTransport({
|
|
122
|
+
chainId: chain.id,
|
|
123
|
+
httpcatClient: client,
|
|
124
|
+
}),
|
|
125
|
+
});
|
|
126
|
+
const walletClient = createWalletClient({
|
|
127
|
+
account,
|
|
128
|
+
chain,
|
|
129
|
+
transport: createRpcTransport({
|
|
130
|
+
chainId: chain.id,
|
|
131
|
+
httpcatClient: client,
|
|
132
|
+
}),
|
|
133
|
+
});
|
|
134
|
+
// Resolve spender (account index or address)
|
|
135
|
+
const spenderAddress = validateAddress(resolveRecipient(spender));
|
|
136
|
+
// Resolve token identifier to address
|
|
137
|
+
let tokenAddress;
|
|
138
|
+
try {
|
|
139
|
+
const resolved = await resolveTokenId(tokenIdentifier, client, options.silent);
|
|
140
|
+
tokenAddress = validateAddress(resolved);
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
// If resolution fails, try treating it as an address directly
|
|
144
|
+
if (isAddress(tokenIdentifier)) {
|
|
145
|
+
tokenAddress = getAddress(tokenIdentifier);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
throw new Error(`Failed to resolve token "${tokenIdentifier}": ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Get token metadata
|
|
152
|
+
let tokenDecimals = options.decimals;
|
|
153
|
+
let tokenSymbol = "TOKEN";
|
|
154
|
+
let tokenName = "Token";
|
|
155
|
+
try {
|
|
156
|
+
if (!tokenDecimals) {
|
|
157
|
+
tokenDecimals = (await publicClient.readContract({
|
|
158
|
+
address: tokenAddress,
|
|
159
|
+
abi: ERC20_ABI,
|
|
160
|
+
functionName: "decimals",
|
|
161
|
+
}));
|
|
162
|
+
}
|
|
163
|
+
tokenSymbol = (await publicClient.readContract({
|
|
164
|
+
address: tokenAddress,
|
|
165
|
+
abi: ERC20_ABI,
|
|
166
|
+
functionName: "symbol",
|
|
167
|
+
}));
|
|
168
|
+
tokenName = (await publicClient.readContract({
|
|
169
|
+
address: tokenAddress,
|
|
170
|
+
abi: ERC20_ABI,
|
|
171
|
+
functionName: "name",
|
|
172
|
+
}));
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
if (!tokenDecimals) {
|
|
176
|
+
throw new Error(`Failed to get token decimals. Use --decimals flag or ensure token contract is valid. ${error instanceof Error ? error.message : ""}`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Check current allowance
|
|
180
|
+
const currentAllowance = (await publicClient.readContract({
|
|
181
|
+
address: tokenAddress,
|
|
182
|
+
abi: ERC20_ABI,
|
|
183
|
+
functionName: "allowance",
|
|
184
|
+
args: [from, spenderAddress],
|
|
185
|
+
}));
|
|
186
|
+
const currentAllowanceFormatted = formatUnits(currentAllowance, tokenDecimals || 18);
|
|
187
|
+
// Determine approval amount
|
|
188
|
+
let approvalAmount;
|
|
189
|
+
let amountFormatted;
|
|
190
|
+
if (amount === "unlimited" || amount === "max") {
|
|
191
|
+
approvalAmount =
|
|
192
|
+
BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
|
193
|
+
amountFormatted = "Unlimited";
|
|
194
|
+
}
|
|
195
|
+
else if (amount === "revoke" || amount === "0") {
|
|
196
|
+
approvalAmount = 0n;
|
|
197
|
+
amountFormatted = "0";
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
approvalAmount = parseUnits(amount, tokenDecimals || 18);
|
|
201
|
+
amountFormatted = amount;
|
|
202
|
+
}
|
|
203
|
+
// Show summary
|
|
204
|
+
if (!options.silent) {
|
|
205
|
+
console.log(chalk.cyan(`\n🔐 Token Approval`));
|
|
206
|
+
console.log(chalk.dim(`Token: ${tokenName} (${tokenSymbol})`));
|
|
207
|
+
console.log(chalk.dim(`Token Address: ${formatAddress(tokenAddress)}`));
|
|
208
|
+
console.log(chalk.dim(`Spender: ${formatAddress(spenderAddress)}`));
|
|
209
|
+
console.log(chalk.dim(`Current Allowance: ${currentAllowanceFormatted} ${tokenSymbol}`));
|
|
210
|
+
console.log(chalk.dim(`New Allowance: ${amountFormatted} ${tokenSymbol}`));
|
|
211
|
+
}
|
|
212
|
+
// Prompt for confirmation
|
|
213
|
+
const confirmed = await promptConfirmation({
|
|
214
|
+
token: tokenAddress,
|
|
215
|
+
tokenSymbol,
|
|
216
|
+
spender: spenderAddress,
|
|
217
|
+
amount: approvalAmount.toString(),
|
|
218
|
+
amountFormatted,
|
|
219
|
+
currentAllowance: currentAllowance.toString(),
|
|
220
|
+
currentAllowanceFormatted,
|
|
221
|
+
type: options.permit2 ? "permit2" : "erc20",
|
|
222
|
+
}, options);
|
|
223
|
+
if (!confirmed) {
|
|
224
|
+
throw new Error("Approval cancelled by user");
|
|
225
|
+
}
|
|
226
|
+
// Dry run mode
|
|
227
|
+
if (options.dryRun) {
|
|
228
|
+
if (!options.silent) {
|
|
229
|
+
console.log(chalk.yellow("\n🔍 Dry Run Mode - Transaction not broadcast\n"));
|
|
230
|
+
}
|
|
231
|
+
return {
|
|
232
|
+
success: true,
|
|
233
|
+
type: options.permit2 ? "permit2" : "erc20",
|
|
234
|
+
tokenAddress,
|
|
235
|
+
tokenSymbol,
|
|
236
|
+
spender: spenderAddress,
|
|
237
|
+
amount: approvalAmount.toString(),
|
|
238
|
+
amountFormatted,
|
|
239
|
+
currentAllowance: currentAllowance.toString(),
|
|
240
|
+
currentAllowanceFormatted,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
// Get gas configuration
|
|
244
|
+
const gasConfig = await getGasConfig(publicClient, options);
|
|
245
|
+
// Estimate gas
|
|
246
|
+
let estimatedGas;
|
|
247
|
+
try {
|
|
248
|
+
if (options.permit2) {
|
|
249
|
+
// Permit2 approval - estimate via Permit2 contract
|
|
250
|
+
const expiration = Math.floor(Date.now() / 1000) + 365 * 24 * 60 * 60; // 1 year expiration (uint48)
|
|
251
|
+
estimatedGas = await publicClient.estimateGas({
|
|
252
|
+
account: from,
|
|
253
|
+
to: PERMIT2_ADDRESS,
|
|
254
|
+
data: encodeFunctionData({
|
|
255
|
+
abi: PERMIT2_ABI,
|
|
256
|
+
functionName: "approve",
|
|
257
|
+
args: [
|
|
258
|
+
tokenAddress,
|
|
259
|
+
spenderAddress,
|
|
260
|
+
approvalAmount ===
|
|
261
|
+
BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")
|
|
262
|
+
? (BigInt(2 ** 160) - 1n) // MAX_UINT160 for Permit2
|
|
263
|
+
: approvalAmount,
|
|
264
|
+
expiration,
|
|
265
|
+
],
|
|
266
|
+
}),
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
// Direct ERC20 approval
|
|
271
|
+
estimatedGas = await publicClient.estimateGas({
|
|
272
|
+
account: from,
|
|
273
|
+
to: tokenAddress,
|
|
274
|
+
data: encodeFunctionData({
|
|
275
|
+
abi: ERC20_ABI,
|
|
276
|
+
functionName: "approve",
|
|
277
|
+
args: [spenderAddress, approvalAmount],
|
|
278
|
+
}),
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
catch (error) {
|
|
283
|
+
throw new Error(`Failed to estimate gas: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
284
|
+
}
|
|
285
|
+
// Check ETH balance for gas
|
|
286
|
+
const ethBalance = await publicClient.getBalance({ address: from });
|
|
287
|
+
const estimatedGasCost = (gasConfig.gas || estimatedGas) *
|
|
288
|
+
(gasConfig.gasPrice || gasConfig.maxFeePerGas || 0n);
|
|
289
|
+
if (ethBalance < estimatedGasCost) {
|
|
290
|
+
throw new Error(`Insufficient ETH for gas. Need ${formatEther(estimatedGasCost)} ETH`);
|
|
291
|
+
}
|
|
292
|
+
// Build transaction
|
|
293
|
+
let txHash;
|
|
294
|
+
if (options.permit2) {
|
|
295
|
+
// Permit2 approval
|
|
296
|
+
if (!options.silent) {
|
|
297
|
+
console.log(chalk.cyan(`\n📤 Approving via Permit2 to ${spenderAddress}...`));
|
|
298
|
+
}
|
|
299
|
+
const maxUint160 = BigInt(2 ** 160) - 1n;
|
|
300
|
+
const expiration = Math.floor(Date.now() / 1000) + 365 * 24 * 60 * 60; // 1 year expiration (uint48)
|
|
301
|
+
const permit2TxRequest = {
|
|
302
|
+
address: PERMIT2_ADDRESS,
|
|
303
|
+
abi: PERMIT2_ABI,
|
|
304
|
+
functionName: "approve",
|
|
305
|
+
args: [
|
|
306
|
+
tokenAddress,
|
|
307
|
+
spenderAddress,
|
|
308
|
+
approvalAmount ===
|
|
309
|
+
BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")
|
|
310
|
+
? maxUint160
|
|
311
|
+
: approvalAmount,
|
|
312
|
+
expiration,
|
|
313
|
+
],
|
|
314
|
+
gas: gasConfig.gas || estimatedGas,
|
|
315
|
+
};
|
|
316
|
+
// Only include gas config fields if they're defined
|
|
317
|
+
if (gasConfig.maxFeePerGas)
|
|
318
|
+
permit2TxRequest.maxFeePerGas = gasConfig.maxFeePerGas;
|
|
319
|
+
if (gasConfig.maxPriorityFeePerGas)
|
|
320
|
+
permit2TxRequest.maxPriorityFeePerGas = gasConfig.maxPriorityFeePerGas;
|
|
321
|
+
if (gasConfig.gasPrice)
|
|
322
|
+
permit2TxRequest.gasPrice = gasConfig.gasPrice;
|
|
323
|
+
txHash = await walletClient.writeContract(permit2TxRequest);
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
// Direct ERC20 approval
|
|
327
|
+
if (!options.silent) {
|
|
328
|
+
console.log(chalk.cyan(`\n📤 Approving ${amountFormatted} ${tokenSymbol}...`));
|
|
329
|
+
}
|
|
330
|
+
const erc20TxRequest = {
|
|
331
|
+
address: tokenAddress,
|
|
332
|
+
abi: ERC20_ABI,
|
|
333
|
+
functionName: "approve",
|
|
334
|
+
args: [spenderAddress, approvalAmount],
|
|
335
|
+
gas: gasConfig.gas || estimatedGas,
|
|
336
|
+
};
|
|
337
|
+
// Only include gas config fields if they're defined
|
|
338
|
+
if (gasConfig.maxFeePerGas)
|
|
339
|
+
erc20TxRequest.maxFeePerGas = gasConfig.maxFeePerGas;
|
|
340
|
+
if (gasConfig.maxPriorityFeePerGas)
|
|
341
|
+
erc20TxRequest.maxPriorityFeePerGas = gasConfig.maxPriorityFeePerGas;
|
|
342
|
+
if (gasConfig.gasPrice)
|
|
343
|
+
erc20TxRequest.gasPrice = gasConfig.gasPrice;
|
|
344
|
+
txHash = await walletClient.writeContract(erc20TxRequest);
|
|
345
|
+
}
|
|
346
|
+
let result = {
|
|
347
|
+
success: true,
|
|
348
|
+
type: options.permit2 ? "permit2" : "erc20",
|
|
349
|
+
txHash,
|
|
350
|
+
tokenAddress,
|
|
351
|
+
tokenSymbol,
|
|
352
|
+
spender: spenderAddress,
|
|
353
|
+
amount: approvalAmount.toString(),
|
|
354
|
+
amountFormatted,
|
|
355
|
+
currentAllowance: currentAllowance.toString(),
|
|
356
|
+
currentAllowanceFormatted,
|
|
357
|
+
};
|
|
358
|
+
// Wait for confirmation if requested
|
|
359
|
+
if (options.wait) {
|
|
360
|
+
if (!options.silent) {
|
|
361
|
+
console.log(chalk.cyan(`⏳ Waiting for confirmation...`));
|
|
362
|
+
}
|
|
363
|
+
const receipt = await publicClient.waitForTransactionReceipt({
|
|
364
|
+
hash: txHash,
|
|
365
|
+
timeout: (options.timeout || 300) * 1000,
|
|
366
|
+
});
|
|
367
|
+
result.gasUsed = receipt.gasUsed;
|
|
368
|
+
result.blockNumber = receipt.blockNumber;
|
|
369
|
+
if (!options.silent) {
|
|
370
|
+
console.log(chalk.green(`✅ Approval confirmed in block ${receipt.blockNumber.toString()}`));
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
return result;
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Check current allowance
|
|
377
|
+
*/
|
|
378
|
+
export async function checkAllowance(client, tokenIdentifier, spender, privateKey, options = {}) {
|
|
379
|
+
const account = privateKeyToAccount(privateKey);
|
|
380
|
+
const from = account.address;
|
|
381
|
+
const network = client.getNetwork();
|
|
382
|
+
const { chain } = await getNetworkConfig(network);
|
|
383
|
+
const publicClient = createPublicClient({
|
|
384
|
+
chain,
|
|
385
|
+
transport: createRpcTransport({
|
|
386
|
+
chainId: chain.id,
|
|
387
|
+
httpcatClient: client,
|
|
388
|
+
}),
|
|
389
|
+
});
|
|
390
|
+
// Resolve spender (account index or address)
|
|
391
|
+
const spenderAddress = validateAddress(resolveRecipient(spender));
|
|
392
|
+
// Resolve token identifier to address
|
|
393
|
+
let tokenAddress;
|
|
394
|
+
try {
|
|
395
|
+
const resolved = await resolveTokenId(tokenIdentifier, client, options.silent);
|
|
396
|
+
tokenAddress = validateAddress(resolved);
|
|
397
|
+
}
|
|
398
|
+
catch (error) {
|
|
399
|
+
// If resolution fails, try treating it as an address directly
|
|
400
|
+
if (isAddress(tokenIdentifier)) {
|
|
401
|
+
tokenAddress = getAddress(tokenIdentifier);
|
|
402
|
+
}
|
|
403
|
+
else {
|
|
404
|
+
throw new Error(`Failed to resolve token "${tokenIdentifier}": ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
// Get token metadata
|
|
408
|
+
let tokenDecimals = options.decimals;
|
|
409
|
+
let tokenSymbol = "TOKEN";
|
|
410
|
+
try {
|
|
411
|
+
if (!tokenDecimals) {
|
|
412
|
+
tokenDecimals = (await publicClient.readContract({
|
|
413
|
+
address: tokenAddress,
|
|
414
|
+
abi: ERC20_ABI,
|
|
415
|
+
functionName: "decimals",
|
|
416
|
+
}));
|
|
417
|
+
}
|
|
418
|
+
tokenSymbol = (await publicClient.readContract({
|
|
419
|
+
address: tokenAddress,
|
|
420
|
+
abi: ERC20_ABI,
|
|
421
|
+
functionName: "symbol",
|
|
422
|
+
}));
|
|
423
|
+
}
|
|
424
|
+
catch (error) {
|
|
425
|
+
if (!tokenDecimals) {
|
|
426
|
+
throw new Error(`Failed to get token decimals. Use --decimals flag or ensure token contract is valid. ${error instanceof Error ? error.message : ""}`);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
// Check allowance
|
|
430
|
+
let allowance;
|
|
431
|
+
if (options.permit2) {
|
|
432
|
+
// Check Permit2 allowance
|
|
433
|
+
const permit2Allowance = await publicClient.readContract({
|
|
434
|
+
address: PERMIT2_ADDRESS,
|
|
435
|
+
abi: PERMIT2_ABI,
|
|
436
|
+
functionName: "allowance",
|
|
437
|
+
args: [from, tokenAddress, spenderAddress],
|
|
438
|
+
});
|
|
439
|
+
// Permit2 returns [amount: bigint, expiration: bigint, nonce: bigint]
|
|
440
|
+
allowance = permit2Allowance[0]; // amount
|
|
441
|
+
}
|
|
442
|
+
else {
|
|
443
|
+
// Check direct ERC20 allowance
|
|
444
|
+
allowance = (await publicClient.readContract({
|
|
445
|
+
address: tokenAddress,
|
|
446
|
+
abi: ERC20_ABI,
|
|
447
|
+
functionName: "allowance",
|
|
448
|
+
args: [from, spenderAddress],
|
|
449
|
+
}));
|
|
450
|
+
}
|
|
451
|
+
const allowanceFormatted = formatUnits(allowance, tokenDecimals || 18);
|
|
452
|
+
return {
|
|
453
|
+
tokenAddress,
|
|
454
|
+
tokenSymbol,
|
|
455
|
+
spender: spenderAddress,
|
|
456
|
+
allowance: allowance.toString(),
|
|
457
|
+
allowanceFormatted,
|
|
458
|
+
type: options.permit2 ? "permit2" : "erc20",
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* Display approve result for interactive mode
|
|
463
|
+
*/
|
|
464
|
+
export function displayApproveResult(result) {
|
|
465
|
+
console.log();
|
|
466
|
+
printSuccess(result.success ? "Approval successful!" : "Approval failed");
|
|
467
|
+
const boxData = {
|
|
468
|
+
Type: chalk.cyan(result.type.toUpperCase()),
|
|
469
|
+
Token: formatAddress(result.tokenAddress) + (result.tokenSymbol ? ` (${result.tokenSymbol})` : ""),
|
|
470
|
+
Spender: formatAddress(result.spender),
|
|
471
|
+
"New Allowance": chalk.green(result.amountFormatted + (result.tokenSymbol ? ` ${result.tokenSymbol}` : "")),
|
|
472
|
+
};
|
|
473
|
+
if (result.currentAllowanceFormatted) {
|
|
474
|
+
boxData["Previous Allowance"] = chalk.dim(result.currentAllowanceFormatted + (result.tokenSymbol ? ` ${result.tokenSymbol}` : ""));
|
|
475
|
+
}
|
|
476
|
+
if (result.txHash) {
|
|
477
|
+
boxData["Transaction"] = chalk.blue(result.txHash);
|
|
478
|
+
}
|
|
479
|
+
if (result.gasUsed) {
|
|
480
|
+
boxData["Gas Used"] = result.gasUsed.toString();
|
|
481
|
+
}
|
|
482
|
+
if (result.blockNumber) {
|
|
483
|
+
boxData["Block"] = result.blockNumber.toString();
|
|
484
|
+
}
|
|
485
|
+
if (result.error) {
|
|
486
|
+
boxData["Error"] = chalk.red(result.error);
|
|
487
|
+
}
|
|
488
|
+
printBox("Approval Result", boxData);
|
|
489
|
+
console.log();
|
|
490
|
+
}
|
|
491
|
+
/**
|
|
492
|
+
* Display allowance check result
|
|
493
|
+
*/
|
|
494
|
+
export function displayAllowanceResult(result) {
|
|
495
|
+
console.log();
|
|
496
|
+
const boxData = {
|
|
497
|
+
Type: chalk.cyan(result.type.toUpperCase()),
|
|
498
|
+
Token: formatAddress(result.tokenAddress) + (result.tokenSymbol ? ` (${result.tokenSymbol})` : ""),
|
|
499
|
+
Spender: formatAddress(result.spender),
|
|
500
|
+
Allowance: chalk.green(result.allowanceFormatted + (result.tokenSymbol ? ` ${result.tokenSymbol}` : "")),
|
|
501
|
+
};
|
|
502
|
+
printBox("Current Allowance", boxData);
|
|
503
|
+
console.log();
|
|
504
|
+
}
|
|
505
|
+
//# sourceMappingURL=approve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approve.js","sourceRoot":"","sources":["../../src/commands/approve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"automation.d.ts","sourceRoot":"","sources":["../../src/commands/automation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2CpC,wBAAgB,uBAAuB,IAAI,OAAO,CA2SjD"}
|