httpcat-cli 0.2.12 → 0.2.13-rc.10
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/README.md +355 -22
- package/Screenshot 2025-12-21 at 8.56.02/342/200/257PM.png +0 -0
- package/bun.lock +15 -1305
- package/cat-spin.sh +417 -0
- package/dist/agent/ax-agent.d.ts.map +1 -0
- package/dist/agent/ax-agent.js +459 -0
- package/dist/agent/ax-agent.js.map +1 -0
- package/dist/agent/llm-factory.d.ts.map +1 -0
- package/dist/agent/llm-factory.js +82 -0
- package/dist/agent/llm-factory.js.map +1 -0
- package/dist/agent/setup-wizard.d.ts.map +1 -0
- package/dist/agent/setup-wizard.js +114 -0
- package/dist/agent/setup-wizard.js.map +1 -0
- package/dist/agent/tools.d.ts.map +1 -0
- package/dist/agent/tools.js +394 -0
- package/dist/agent/tools.js.map +1 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +403 -46
- package/dist/client.js.map +1 -1
- package/dist/commands/account.d.ts.map +1 -1
- package/dist/commands/account.js +1 -0
- package/dist/commands/account.js.map +1 -1
- package/dist/commands/balances.d.ts.map +1 -1
- package/dist/commands/balances.js +39 -14
- package/dist/commands/balances.js.map +1 -1
- package/dist/commands/buy.d.ts.map +1 -1
- package/dist/commands/buy.js +29 -15
- package/dist/commands/buy.js.map +1 -1
- package/dist/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +86 -63
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +133 -5
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/info.d.ts.map +1 -1
- package/dist/commands/info.js +12 -9
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/positions.d.ts.map +1 -1
- package/dist/commands/positions.js +55 -58
- package/dist/commands/positions.js.map +1 -1
- package/dist/commands/sell.d.ts.map +1 -1
- package/dist/commands/sell.js +18 -11
- package/dist/commands/sell.js.map +1 -1
- package/dist/commands/swap.d.ts.map +1 -0
- package/dist/commands/swap.js +374 -0
- package/dist/commands/swap.js.map +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +160 -10
- package/dist/config.js.map +1 -1
- package/dist/index.js +668 -81
- package/dist/index.js.map +1 -1
- package/dist/interactive/art.d.ts.map +1 -1
- package/dist/interactive/art.js +38 -0
- package/dist/interactive/art.js.map +1 -1
- package/dist/interactive/cat-spin.d.ts.map +1 -0
- package/dist/interactive/cat-spin.js +448 -0
- package/dist/interactive/cat-spin.js.map +1 -0
- package/dist/interactive/shell.d.ts.map +1 -1
- package/dist/interactive/shell.js +1700 -166
- package/dist/interactive/shell.js.map +1 -1
- package/dist/mcp/chat-state.d.ts.map +1 -1
- package/dist/mcp/chat-state.js +2 -1
- package/dist/mcp/chat-state.js.map +1 -1
- package/dist/mcp/server.js +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +109 -7
- package/dist/mcp/tools.js.map +1 -1
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/utils/constants.d.ts.map +1 -1
- package/dist/utils/constants.js +44 -2
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +3 -3
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/loading.d.ts.map +1 -1
- package/dist/utils/loading.js +30 -0
- package/dist/utils/loading.js.map +1 -1
- package/dist/utils/privateKeyPrompt.d.ts.map +1 -1
- package/dist/utils/privateKeyPrompt.js +31 -7
- package/dist/utils/privateKeyPrompt.js.map +1 -1
- package/dist/utils/status.d.ts.map +1 -0
- package/dist/utils/status.js +67 -0
- package/dist/utils/status.js.map +1 -0
- package/dist/utils/token-resolver.d.ts.map +1 -1
- package/dist/utils/token-resolver.js +41 -0
- package/dist/utils/token-resolver.js.map +1 -1
- package/package.json +5 -3
package/dist/commands/create.js
CHANGED
|
@@ -1,18 +1,146 @@
|
|
|
1
1
|
import { validateTokenName, validateTokenSymbol, validateUrl } from '../utils/validation.js';
|
|
2
2
|
import { printBox, formatAddress } from '../utils/formatting.js';
|
|
3
3
|
import { printSuccess } from '../interactive/art.js';
|
|
4
|
+
import { readFileSync, statSync } from 'fs';
|
|
5
|
+
import { existsSync } from 'fs';
|
|
6
|
+
import { homedir } from 'os';
|
|
7
|
+
import { extname, join } from 'path';
|
|
8
|
+
const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB
|
|
9
|
+
const SUPPORTED_EXTENSIONS = ['jpg', 'jpeg', 'png', 'gif', 'webp'];
|
|
10
|
+
const MIME_TYPES = {
|
|
11
|
+
'jpg': 'image/jpeg',
|
|
12
|
+
'jpeg': 'image/jpeg',
|
|
13
|
+
'png': 'image/png',
|
|
14
|
+
'gif': 'image/gif',
|
|
15
|
+
'webp': 'image/webp',
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Check if a string looks like a file path
|
|
19
|
+
*/
|
|
20
|
+
function looksLikePath(input) {
|
|
21
|
+
// Don't treat URLs as paths
|
|
22
|
+
if (input.startsWith('http://') || input.startsWith('https://')) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
// Check for path separators or home directory indicator
|
|
26
|
+
return (input.startsWith('/') || // Absolute path
|
|
27
|
+
input.startsWith('./') || // Relative path
|
|
28
|
+
input.startsWith('../') || // Parent directory
|
|
29
|
+
input.startsWith('~') || // Home directory
|
|
30
|
+
input.includes('\\') || // Windows path separator
|
|
31
|
+
(input.length > 1 && input[1] === ':') // Windows drive letter (C:)
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Expand home directory in path
|
|
36
|
+
*/
|
|
37
|
+
function expandPath(input) {
|
|
38
|
+
if (input.startsWith('~')) {
|
|
39
|
+
const rest = input.slice(1);
|
|
40
|
+
// If rest starts with /, it's ~/path - join with home dir (removing the leading /)
|
|
41
|
+
if (rest.startsWith('/')) {
|
|
42
|
+
return join(homedir(), rest.slice(1));
|
|
43
|
+
}
|
|
44
|
+
else if (rest === '') {
|
|
45
|
+
return homedir();
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
// ~path (without slash) - treat as relative to home
|
|
49
|
+
return join(homedir(), rest);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return input;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Process photoUrl input - can be URL, file path, or already base64
|
|
56
|
+
* If file path, read file and convert to base64 data URL
|
|
57
|
+
*/
|
|
58
|
+
export function processPhotoUrl(photoUrl) {
|
|
59
|
+
// If it's already a URL or base64, return as-is
|
|
60
|
+
if (photoUrl.startsWith('http://') || photoUrl.startsWith('https://') || photoUrl.startsWith('data:image/')) {
|
|
61
|
+
return photoUrl;
|
|
62
|
+
}
|
|
63
|
+
// Expand home directory if present
|
|
64
|
+
const expandedPath = expandPath(photoUrl);
|
|
65
|
+
// Check if it looks like a path
|
|
66
|
+
const isPathLike = looksLikePath(photoUrl);
|
|
67
|
+
// Check if it's a file path that exists
|
|
68
|
+
if (existsSync(expandedPath)) {
|
|
69
|
+
try {
|
|
70
|
+
// Check file size
|
|
71
|
+
const stats = statSync(expandedPath);
|
|
72
|
+
if (stats.size > MAX_FILE_SIZE) {
|
|
73
|
+
throw new Error(`Image file is too large: ${(stats.size / 1024 / 1024).toFixed(2)}MB. Maximum size is ${MAX_FILE_SIZE / 1024 / 1024}MB`);
|
|
74
|
+
}
|
|
75
|
+
if (stats.size === 0) {
|
|
76
|
+
throw new Error('Image file is empty');
|
|
77
|
+
}
|
|
78
|
+
// Validate file extension
|
|
79
|
+
const ext = extname(expandedPath).toLowerCase().slice(1); // Remove the dot
|
|
80
|
+
if (!ext || !SUPPORTED_EXTENSIONS.includes(ext)) {
|
|
81
|
+
throw new Error(`Unsupported image format: ${ext || 'unknown'}. Supported formats: ${SUPPORTED_EXTENSIONS.join(', ')}`);
|
|
82
|
+
}
|
|
83
|
+
const fileBuffer = readFileSync(expandedPath);
|
|
84
|
+
const mimeType = MIME_TYPES[ext] || 'image/jpeg';
|
|
85
|
+
const base64 = fileBuffer.toString('base64');
|
|
86
|
+
return `data:${mimeType};base64,${base64}`;
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
if (error instanceof Error && error.message.includes('too large')) {
|
|
90
|
+
throw error;
|
|
91
|
+
}
|
|
92
|
+
if (error instanceof Error && error.message.includes('Unsupported image format')) {
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
if (error instanceof Error && error.message.includes('empty')) {
|
|
96
|
+
throw error;
|
|
97
|
+
}
|
|
98
|
+
throw new Error(`Failed to read image file: ${error instanceof Error ? error.message : String(error)}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// If it looks like a path but file doesn't exist, throw file-not-found error
|
|
102
|
+
if (isPathLike) {
|
|
103
|
+
throw new Error(`Image file not found: ${photoUrl}`);
|
|
104
|
+
}
|
|
105
|
+
// Try to validate as URL
|
|
106
|
+
validateUrl(photoUrl);
|
|
107
|
+
return photoUrl;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Check if a photoUrl looks like a file path that needs processing
|
|
111
|
+
*/
|
|
112
|
+
export function isFilePath(photoUrl) {
|
|
113
|
+
// If it's already a URL or base64, it's not a file path
|
|
114
|
+
if (photoUrl.startsWith('http://') || photoUrl.startsWith('https://') || photoUrl.startsWith('data:image/')) {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
// If it looks like a path, it's a file path
|
|
118
|
+
return looksLikePath(photoUrl);
|
|
119
|
+
}
|
|
4
120
|
export async function createToken(client, input) {
|
|
5
121
|
// Validate input
|
|
6
122
|
validateTokenName(input.name);
|
|
7
123
|
validateTokenSymbol(input.symbol);
|
|
8
|
-
if (
|
|
9
|
-
|
|
10
|
-
if (input.
|
|
11
|
-
|
|
124
|
+
// Process photoUrl if provided (should already be processed if it was a file path)
|
|
125
|
+
let processedInput = { ...input };
|
|
126
|
+
if (input.photoUrl) {
|
|
127
|
+
// Only process if it's not already a data URL (file paths should be pre-processed)
|
|
128
|
+
// URLs still need validation
|
|
129
|
+
if (!input.photoUrl.startsWith('data:image/')) {
|
|
130
|
+
if (input.photoUrl.startsWith('http://') || input.photoUrl.startsWith('https://')) {
|
|
131
|
+
// Validate URL
|
|
132
|
+
validateUrl(input.photoUrl);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
// Process file path or validate as URL
|
|
136
|
+
processedInput.photoUrl = processPhotoUrl(input.photoUrl);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
12
140
|
if (input.websiteUrl)
|
|
13
141
|
validateUrl(input.websiteUrl);
|
|
14
142
|
// Make request
|
|
15
|
-
const { data, payment } = await client.invoke('create_token',
|
|
143
|
+
const { data, payment } = await client.invoke('create_token', processedInput);
|
|
16
144
|
return data;
|
|
17
145
|
}
|
|
18
146
|
export function displayCreateResult(result) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC7F,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAa7C,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,MAAM,EAAE,mCAAmC;AACvD,WAAW,CAAC,EAAE,MAAM,EACpB,MAAM,UAAQ,GACb,OAAO,CAAC,eAAe,CAAC,CAgE1B;AAqFD,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,eAAe,EACrB,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAyEf"}
|
package/dist/commands/info.js
CHANGED
|
@@ -3,6 +3,7 @@ import { printBox, formatAddress, formatTokenAmount, formatCurrency, } from "../
|
|
|
3
3
|
import { printGraduationProgress } from "../interactive/art.js";
|
|
4
4
|
import { resolveTokenId } from "../utils/token-resolver.js";
|
|
5
5
|
import chalk from "chalk";
|
|
6
|
+
import { config } from "../config.js";
|
|
6
7
|
export async function getTokenInfo(client, identifier, // Can be token ID, name, or symbol
|
|
7
8
|
userAddress, silent = false // Suppress resolver output for quiet/JSON mode
|
|
8
9
|
) {
|
|
@@ -51,7 +52,7 @@ async function fetchOnChainBalance(tokenAddress, userAddress) {
|
|
|
51
52
|
const { baseSepolia } = await import("viem/chains");
|
|
52
53
|
const publicClient = createPublicClient({
|
|
53
54
|
chain: baseSepolia,
|
|
54
|
-
transport: http(),
|
|
55
|
+
transport: http(config.getRpcUrl()),
|
|
55
56
|
});
|
|
56
57
|
const ERC20_ABI = parseAbi([
|
|
57
58
|
"function balanceOf(address owner) view returns (uint256)",
|
|
@@ -69,19 +70,20 @@ async function fetchOnChainBalance(tokenAddress, userAddress) {
|
|
|
69
70
|
return null;
|
|
70
71
|
}
|
|
71
72
|
}
|
|
72
|
-
async function fetchLpPrice(tokenAddress) {
|
|
73
|
+
async function fetchLpPrice(tokenAddress, network) {
|
|
73
74
|
try {
|
|
74
75
|
// Query Uniswap pool directly on-chain (free, no cost)
|
|
75
76
|
const { createPublicClient, http, parseAbi, formatUnits } = await import("viem");
|
|
76
|
-
const {
|
|
77
|
-
const { UNISWAP_V2_ROUTER,
|
|
77
|
+
const { getNetworkConfig } = await import("../utils/constants.js");
|
|
78
|
+
const { UNISWAP_V2_ROUTER, UNISWAP_V2_ROUTER_ABI } = await import("../utils/constants.js");
|
|
79
|
+
const { chain, usdcAddress } = await getNetworkConfig(network);
|
|
78
80
|
const publicClient = createPublicClient({
|
|
79
|
-
chain
|
|
80
|
-
transport: http(),
|
|
81
|
+
chain,
|
|
82
|
+
transport: http(config.getRpcUrl()),
|
|
81
83
|
});
|
|
82
84
|
// Use 1 USDC (1e6 in raw units) to get price quote
|
|
83
85
|
const oneUsdc = BigInt(10 ** 6); // 1 USDC in raw units (6 decimals)
|
|
84
|
-
const path = [
|
|
86
|
+
const path = [usdcAddress, tokenAddress];
|
|
85
87
|
const amounts = await publicClient.readContract({
|
|
86
88
|
address: UNISWAP_V2_ROUTER,
|
|
87
89
|
abi: UNISWAP_V2_ROUTER_ABI,
|
|
@@ -105,13 +107,14 @@ async function fetchLpPrice(tokenAddress) {
|
|
|
105
107
|
return null;
|
|
106
108
|
}
|
|
107
109
|
}
|
|
108
|
-
export async function displayTokenInfo(info, userAddress) {
|
|
110
|
+
export async function displayTokenInfo(info, userAddress, network) {
|
|
109
111
|
console.log();
|
|
110
112
|
// For graduated tokens, fetch LP price from on-chain (free)
|
|
111
113
|
let lpPrice = null;
|
|
112
114
|
let lpMcap = null;
|
|
113
115
|
if (info.status === "graduated") {
|
|
114
|
-
|
|
116
|
+
const networkToUse = network || config.get("network");
|
|
117
|
+
lpPrice = await fetchLpPrice(info.address, networkToUse);
|
|
115
118
|
if (lpPrice) {
|
|
116
119
|
// Calculate market cap: price * total supply
|
|
117
120
|
// totalSupply is in wei format (18 decimals), need to convert to human-readable
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EACL,QAAQ,EACR,aAAa,EACb,iBAAiB,EACjB,cAAc,GACf,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"positions.d.ts","sourceRoot":"","sources":["../../src/commands/positions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"positions.d.ts","sourceRoot":"","sources":["../../src/commands/positions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAU7C,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,WAAW,CAAC,EAAE;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE;QACR,cAAc,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,kBAAkB,EAAE,MAAM,CAAC;KAC5B,CAAC;CACH;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,aAAa,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,eAAe,CAAC,CAU1B;AAsFD,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,eAAe,EACvB,MAAM,GAAE,KAAK,GAAG,QAAQ,GAAG,WAAmB,GAC7C,IAAI,CA4LN"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createTable, formatAddress, formatCurrency, formatTokenAmount, } from "../utils/formatting.js";
|
|
2
2
|
import chalk from "chalk";
|
|
3
|
+
import Table from "cli-table3";
|
|
3
4
|
export async function getPositions(client, userAddress) {
|
|
4
5
|
const input = { userAddress };
|
|
5
6
|
// Make request
|
|
@@ -7,7 +8,6 @@ export async function getPositions(client, userAddress) {
|
|
|
7
8
|
return data;
|
|
8
9
|
}
|
|
9
10
|
function displayPosition(position, index, isGraduated) {
|
|
10
|
-
// Position header
|
|
11
11
|
const graduationIcon = position.token.status === "graduated"
|
|
12
12
|
? "🎓"
|
|
13
13
|
: position.token.graduationProgress >= 90
|
|
@@ -15,65 +15,62 @@ function displayPosition(position, index, isGraduated) {
|
|
|
15
15
|
: position.token.graduationProgress >= 50
|
|
16
16
|
? "📈"
|
|
17
17
|
: "🌱";
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
// Create a compact two-row table for each position
|
|
19
|
+
// Using a table with no headers for a cleaner look
|
|
20
|
+
const positionTable = new Table({
|
|
21
|
+
style: {
|
|
22
|
+
head: [],
|
|
23
|
+
border: ["dim"],
|
|
24
|
+
},
|
|
25
|
+
});
|
|
22
26
|
if (isGraduated) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
//
|
|
31
|
-
|
|
27
|
+
// Row 1: Token info and graduation status
|
|
28
|
+
positionTable.push([
|
|
29
|
+
chalk.bold(`${index + 1}. ${position.token.name} (${position.token.symbol}) ${graduationIcon}`),
|
|
30
|
+
chalk.dim(`Graduated`),
|
|
31
|
+
chalk.dim(`Tokens: ${formatTokenAmount(position.tokensOwned)}`),
|
|
32
|
+
"",
|
|
33
|
+
]);
|
|
34
|
+
// Row 2: Investment info
|
|
35
|
+
positionTable.push([
|
|
36
|
+
chalk.dim(formatAddress(position.token.address, 12)),
|
|
37
|
+
chalk.dim(`Invested: ${formatCurrency(position.usdcInvested)}`),
|
|
38
|
+
chalk.dim(`Historical Position`),
|
|
39
|
+
"",
|
|
40
|
+
]);
|
|
32
41
|
}
|
|
33
42
|
else {
|
|
34
|
-
//
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
43
|
+
// Row 1: Token info, price, market cap, graduation progress
|
|
44
|
+
positionTable.push([
|
|
45
|
+
chalk.bold(`${index + 1}. ${position.token.name} (${position.token.symbol}) ${graduationIcon}`),
|
|
46
|
+
`Price: ${formatCurrency(position.token.price)}`,
|
|
47
|
+
`MCap: ${formatCurrency(position.token.mcap)}`,
|
|
48
|
+
`Grad: ${position.token.graduationProgress.toFixed(1)}%`,
|
|
49
|
+
]);
|
|
50
|
+
// Row 2: Position details and P/L
|
|
51
|
+
const tokensOwned = formatTokenAmount(position.tokensOwned);
|
|
52
|
+
const invested = formatCurrency(position.usdcInvested);
|
|
53
|
+
const currentValue = position.currentValue !== undefined
|
|
54
|
+
? formatCurrency(position.currentValue)
|
|
55
|
+
: "N/A";
|
|
56
|
+
let pnlText = "";
|
|
57
|
+
if (position.pnl !== undefined &&
|
|
58
|
+
position.pnlPercentage !== undefined) {
|
|
59
|
+
const pnl = parseFloat(position.pnl) / 1e6;
|
|
60
|
+
const pnlColor = pnl >= 0 ? chalk.green : chalk.red;
|
|
61
|
+
const pnlSign = pnl >= 0 ? "+" : "";
|
|
62
|
+
const pnlIcon = pnl >= 0 ? "🟢" : "🔴";
|
|
63
|
+
pnlText = `${pnlIcon} ${pnlColor(`${pnlSign}${formatCurrency(position.pnl)}`)} (${pnlColor(`${pnlSign}${position.pnlPercentage.toFixed(2)}%`)})`;
|
|
48
64
|
}
|
|
65
|
+
positionTable.push([
|
|
66
|
+
chalk.dim(`Tokens: ${tokensOwned}`),
|
|
67
|
+
`Invested: ${invested}`,
|
|
68
|
+
`Value: ${currentValue}`,
|
|
69
|
+
pnlText || chalk.dim("P/L: N/A"),
|
|
70
|
+
]);
|
|
49
71
|
}
|
|
50
|
-
console.log(
|
|
72
|
+
console.log(positionTable.toString());
|
|
51
73
|
console.log();
|
|
52
|
-
// Performance section (only for active positions)
|
|
53
|
-
if (!isGraduated &&
|
|
54
|
-
position.pnl !== undefined &&
|
|
55
|
-
position.pnlPercentage !== undefined) {
|
|
56
|
-
const pnl = parseFloat(position.pnl) / 1e6;
|
|
57
|
-
const pnlColor = pnl >= 0 ? chalk.green : chalk.red;
|
|
58
|
-
const pnlSign = pnl >= 0 ? "+" : "";
|
|
59
|
-
const pnlIcon = pnl >= 0 ? "🟢" : "🔴";
|
|
60
|
-
console.log(chalk.bold("📈 Performance:"));
|
|
61
|
-
console.log(` ${pnlIcon} P/L: ${pnlColor(`${pnlSign}${formatCurrency(position.pnl)}`)} (${pnlColor(`${pnlSign}${position.pnlPercentage.toFixed(2)}%`)})`);
|
|
62
|
-
console.log();
|
|
63
|
-
}
|
|
64
|
-
// Transaction history (if available)
|
|
65
|
-
if (position.transactionCount !== undefined) {
|
|
66
|
-
console.log(chalk.bold("📝 Transaction History:"));
|
|
67
|
-
console.log(` Total Transactions: ${position.transactionCount}`);
|
|
68
|
-
if (position.lastTransactionDate) {
|
|
69
|
-
const lastTxDate = new Date(position.lastTransactionDate);
|
|
70
|
-
console.log(` Last Transaction: ${lastTxDate.toLocaleString()}`);
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
console.log(` Last Transaction: N/A`);
|
|
74
|
-
}
|
|
75
|
-
console.log();
|
|
76
|
-
}
|
|
77
74
|
}
|
|
78
75
|
export function displayPositions(result, filter = "all") {
|
|
79
76
|
// Separate positions into active and graduated
|
|
@@ -156,18 +153,18 @@ export function displayPositions(result, filter = "all") {
|
|
|
156
153
|
]);
|
|
157
154
|
activeSummaryTable.push([
|
|
158
155
|
"Total Invested",
|
|
159
|
-
formatCurrency(activeTotalInvested
|
|
156
|
+
formatCurrency(activeTotalInvested),
|
|
160
157
|
]);
|
|
161
158
|
activeSummaryTable.push([
|
|
162
159
|
"Total Value",
|
|
163
|
-
formatCurrency(activeTotalValue
|
|
160
|
+
formatCurrency(activeTotalValue),
|
|
164
161
|
]);
|
|
165
162
|
const activePnlColor = activeTotalPnl >= 0 ? chalk.green : chalk.red;
|
|
166
163
|
const activePnlSign = activeTotalPnl >= 0 ? "+" : "";
|
|
167
164
|
const activePnlIcon = activeTotalPnl >= 0 ? "🟢" : "🔴";
|
|
168
165
|
activeSummaryTable.push([
|
|
169
166
|
"Total P/L",
|
|
170
|
-
`${activePnlIcon} ${activePnlColor(`${activePnlSign}${formatCurrency(activeTotalPnl
|
|
167
|
+
`${activePnlIcon} ${activePnlColor(`${activePnlSign}${formatCurrency(activeTotalPnl)}`)} (${activePnlColor(`${activePnlSign}${activeTotalPnlPercentage.toFixed(2)}%`)})`,
|
|
171
168
|
]);
|
|
172
169
|
console.log(activeSummaryTable.toString());
|
|
173
170
|
console.log();
|
|
@@ -186,7 +183,7 @@ export function displayPositions(result, filter = "all") {
|
|
|
186
183
|
]);
|
|
187
184
|
graduatedSummaryTable.push([
|
|
188
185
|
"Total Invested (Original)",
|
|
189
|
-
formatCurrency(graduatedTotalInvested
|
|
186
|
+
formatCurrency(graduatedTotalInvested),
|
|
190
187
|
]);
|
|
191
188
|
console.log(graduatedSummaryTable.toString());
|
|
192
189
|
console.log(chalk.dim(" ℹ️ Note: These are historical positions. Tokens were airdropped after graduation."));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"positions.js","sourceRoot":"","sources":["../../src/commands/positions.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,aAAa,EACb,cAAc,EACd,iBAAiB,GAClB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"positions.js","sourceRoot":"","sources":["../../src/commands/positions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sell.d.ts","sourceRoot":"","sources":["../../src/commands/sell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"sell.d.ts","sourceRoot":"","sources":["../../src/commands/sell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAY7C,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB;AAuCD,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,eAAe,GAAG,YAAY,CAAC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAqrBD,wBAAsB,SAAS,CAC7B,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,MAAM,EAAE,mCAAmC;AACvD,WAAW,EAAE,MAAM,EACnB,MAAM,UAAQ,EAAE,+CAA+C;AAC/D,UAAU,CAAC,EAAE,KAAK,MAAM,EAAE,GACzB,OAAO,CAAC,eAAe,CAAC,CAwK1B;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAiF/D;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,MAAM,GACrB,MAAM,CAgCR"}
|
package/dist/commands/sell.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { validateTokenId } from '../utils/validation.js';
|
|
2
2
|
import { printBox, formatTokenAmount, formatCurrency, formatAddress } from '../utils/formatting.js';
|
|
3
|
-
import { printSuccess, printGraduationProgress } from '../interactive/art.js';
|
|
3
|
+
import { printSuccess, printGraduationProgress, printGraduationInProgress } from '../interactive/art.js';
|
|
4
4
|
import { resolveTokenId } from '../utils/token-resolver.js';
|
|
5
5
|
import { getTokenInfo } from './info.js';
|
|
6
6
|
import { createPublicClient, createWalletClient, http, parseAbi, formatUnits, decodeAbiParameters, decodeFunctionData, decodeEventLog } from 'viem';
|
|
7
7
|
import { privateKeyToAccount } from 'viem/accounts';
|
|
8
8
|
import { baseSepolia } from 'viem/chains';
|
|
9
9
|
import chalk from 'chalk';
|
|
10
|
+
import { config } from '../config.js';
|
|
10
11
|
async function simulateAndExplainUniversalRouterRevert(args) {
|
|
11
12
|
try {
|
|
12
13
|
await args.publicClient.call({
|
|
@@ -41,7 +42,7 @@ const ERC20_ABI = parseAbi([
|
|
|
41
42
|
'function allowance(address owner, address spender) view returns (uint256)',
|
|
42
43
|
'function balanceOf(address owner) view returns (uint256)',
|
|
43
44
|
]);
|
|
44
|
-
|
|
45
|
+
import { getUSDCAddress } from '../utils/constants.js';
|
|
45
46
|
/**
|
|
46
47
|
* Get actual on-chain token balance for a wallet and cap the requested amount
|
|
47
48
|
* to prevent PERMIT2_TRANSFER_FROM failures when selling more than available
|
|
@@ -49,7 +50,7 @@ const USDC_ADDRESS = '0x036CbD53842c5426634e7929541eC2318f3dCF7e';
|
|
|
49
50
|
async function getActualSellAmount(args) {
|
|
50
51
|
const publicClient = createPublicClient({
|
|
51
52
|
chain: baseSepolia,
|
|
52
|
-
transport: http(),
|
|
53
|
+
transport: http(config.getRpcUrl()),
|
|
53
54
|
});
|
|
54
55
|
// Get actual on-chain balance
|
|
55
56
|
const actualBalance = await publicClient.readContract({
|
|
@@ -374,18 +375,18 @@ async function checkPriceImpact(priceImpact, silent) {
|
|
|
374
375
|
// Will add proper confirmation in future refactor
|
|
375
376
|
return;
|
|
376
377
|
}
|
|
377
|
-
async function executeUniswapSell(swapData, privateKey, silent) {
|
|
378
|
+
async function executeUniswapSell(usdcAddress, swapData, privateKey, silent) {
|
|
378
379
|
const account = privateKeyToAccount(privateKey);
|
|
379
380
|
const userAddress = account.address;
|
|
380
381
|
// Create clients
|
|
381
382
|
const publicClient = createPublicClient({
|
|
382
383
|
chain: baseSepolia,
|
|
383
|
-
transport: http(),
|
|
384
|
+
transport: http(config.getRpcUrl()),
|
|
384
385
|
});
|
|
385
386
|
const walletClient = createWalletClient({
|
|
386
387
|
account,
|
|
387
388
|
chain: baseSepolia,
|
|
388
|
-
transport: http(),
|
|
389
|
+
transport: http(config.getRpcUrl()),
|
|
389
390
|
});
|
|
390
391
|
// Approve tokens if needed
|
|
391
392
|
for (const approval of swapData.approvals) {
|
|
@@ -422,7 +423,7 @@ async function executeUniswapSell(swapData, privateKey, silent) {
|
|
|
422
423
|
}
|
|
423
424
|
const tokenInAddress = swapData.tokenAddress;
|
|
424
425
|
const usdcBefore = (await publicClient.readContract({
|
|
425
|
-
address:
|
|
426
|
+
address: usdcAddress,
|
|
426
427
|
abi: ERC20_ABI,
|
|
427
428
|
functionName: 'balanceOf',
|
|
428
429
|
args: [userAddress],
|
|
@@ -546,7 +547,7 @@ async function executeUniswapSell(swapData, privateKey, silent) {
|
|
|
546
547
|
}
|
|
547
548
|
const usdcDeltaFromLogs = getErc20NetDeltaFromReceipt({
|
|
548
549
|
receipt,
|
|
549
|
-
token:
|
|
550
|
+
token: usdcAddress,
|
|
550
551
|
user: userAddress,
|
|
551
552
|
});
|
|
552
553
|
const tokenDeltaFromLogs = getErc20NetDeltaFromReceipt({
|
|
@@ -560,7 +561,7 @@ async function executeUniswapSell(swapData, privateKey, silent) {
|
|
|
560
561
|
if (usdcDelta === 0n || tokenDelta === 0n) {
|
|
561
562
|
try {
|
|
562
563
|
const usdcAfter = (await publicClient.readContract({
|
|
563
|
-
address:
|
|
564
|
+
address: usdcAddress,
|
|
564
565
|
abi: ERC20_ABI,
|
|
565
566
|
functionName: 'balanceOf',
|
|
566
567
|
args: [userAddress],
|
|
@@ -597,6 +598,9 @@ export async function sellToken(client, identifier, // Can be token ID, name, or
|
|
|
597
598
|
tokenAmount, silent = false, // Suppress resolver output for quiet/JSON mode
|
|
598
599
|
privateKey // Private key for executing Uniswap swaps
|
|
599
600
|
) {
|
|
601
|
+
// Get USDC address for the current network
|
|
602
|
+
const network = client.getNetwork();
|
|
603
|
+
const USDC_ADDRESS = getUSDCAddress(network);
|
|
600
604
|
// Resolve identifier to token ID (or contract address for external tokens)
|
|
601
605
|
const tokenId = await resolveTokenId(identifier, client, silent);
|
|
602
606
|
// Validate that we got a tokenId
|
|
@@ -633,7 +637,7 @@ privateKey // Private key for executing Uniswap swaps
|
|
|
633
637
|
await checkPriceImpact(data.priceImpact, silent);
|
|
634
638
|
}
|
|
635
639
|
// Execute the swap on-chain
|
|
636
|
-
const txHash = await executeUniswapSell(data, privateKey, silent);
|
|
640
|
+
const txHash = await executeUniswapSell(USDC_ADDRESS, data, privateKey, silent);
|
|
637
641
|
return {
|
|
638
642
|
tokenId: data.tokenId,
|
|
639
643
|
tokenAddress: data.tokenAddress,
|
|
@@ -654,6 +658,9 @@ privateKey // Private key for executing Uniswap swaps
|
|
|
654
658
|
const tokenInfo = await getTokenInfo(client, tokenId, undefined, silent);
|
|
655
659
|
// Check token status and route accordingly
|
|
656
660
|
if (tokenInfo.status === 'graduating') {
|
|
661
|
+
if (!silent) {
|
|
662
|
+
printGraduationInProgress(tokenInfo.name);
|
|
663
|
+
}
|
|
657
664
|
throw new Error('Token is currently graduating. Please wait for graduation to complete.');
|
|
658
665
|
}
|
|
659
666
|
if (tokenInfo.status === 'graduated') {
|
|
@@ -693,7 +700,7 @@ privateKey // Private key for executing Uniswap swaps
|
|
|
693
700
|
console.log(`Expected USDC: ${formatUnits(BigInt(data.expectedUsdc), 6)}`);
|
|
694
701
|
}
|
|
695
702
|
// Execute the swap on-chain
|
|
696
|
-
const txHash = await executeUniswapSell(data, privateKey, silent);
|
|
703
|
+
const txHash = await executeUniswapSell(USDC_ADDRESS, data, privateKey, silent);
|
|
697
704
|
return {
|
|
698
705
|
tokenId: data.tokenId,
|
|
699
706
|
tokenAddress: data.tokenAddress,
|