moltlaunch 1.2.2 → 1.2.3
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/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -17,7 +17,7 @@ import { homedir } from "os";
|
|
|
17
17
|
// packages/shared/src/constants.ts
|
|
18
18
|
var REVENUE_MANAGER_ADDRESS = "0x3Bc08524d9DaaDEC9d1Af87818d809611F0fD669";
|
|
19
19
|
var MULTICALL3_ADDRESS = "0xcA11bde05977b3631167028862bE2a173976CA11";
|
|
20
|
-
var FLAUNCH_API_BASE = "https://web2-api.flaunch.gg";
|
|
20
|
+
var FLAUNCH_API_BASE = "https://dev-web2-api.flaunch.gg";
|
|
21
21
|
var FLAUNCH_DATA_API_BASE = "https://api.flayerlabs.xyz";
|
|
22
22
|
var FLAUNCH_DATA_API = `${FLAUNCH_DATA_API_BASE}/v1/base`;
|
|
23
23
|
var WORKER_API_URL = "https://moltlaunch-network.nikshepsvn-d85.workers.dev";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/launch.ts","../src/lib/wallet.ts","../packages/shared/src/constants.ts","../src/lib/config.ts","../src/lib/flaunch-api.ts","../src/lib/errors.ts","../src/lib/generate-logo.ts","../src/lib/output.ts","../src/commands/wallet.ts","../src/commands/status.ts","../src/commands/claim.ts","../src/commands/fees.ts","../src/commands/swap.ts","../src/lib/viem-client.ts","../src/lib/memo.ts","../src/commands/network.ts","../src/commands/feed.ts","../src/commands/holdings.ts","../src/commands/fund.ts","../src/commands/price.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport { Command } from \"commander\";\nimport { launch } from \"./commands/launch.js\";\nimport { wallet } from \"./commands/wallet.js\";\nimport { status } from \"./commands/status.js\";\nimport { claim } from \"./commands/claim.js\";\nimport { fees } from \"./commands/fees.js\";\nimport { swap } from \"./commands/swap.js\";\nimport { network } from \"./commands/network.js\";\nimport { feed } from \"./commands/feed.js\";\nimport { holdings } from \"./commands/holdings.js\";\nimport { fund } from \"./commands/fund.js\";\nimport { price } from \"./commands/price.js\";\n\n\nconst require = createRequire(import.meta.url);\nconst { version } = require(\"../package.json\") as { version: string };\n\nconst program = new Command();\n\nprogram\n .name(\"mltl\")\n .description(\"moltlaunch — onchain coordination infrastructure\")\n .version(version);\n\n// Default command: launch a token\nprogram\n .command(\"launch\", { isDefault: true })\n .description(\"Launch a new token on Base\")\n .requiredOption(\"--name <name>\", \"Token name\")\n .requiredOption(\"--symbol <symbol>\", \"Token symbol\")\n .requiredOption(\"--description <desc>\", \"Token description\")\n .option(\"--image <path>\", \"Path to token image (max 5MB, uses default logo if omitted)\")\n .option(\"--website <url>\", \"Website URL stored in on-chain IPFS metadata\")\n .option(\"--testnet\", \"Use Base Sepolia testnet\", false)\n .option(\"--json\", \"Output as JSON (for agents)\", false)\n .action((opts) =>\n launch({\n name: opts.name,\n symbol: opts.symbol,\n description: opts.description,\n imagePath: opts.image ?? undefined,\n website: opts.website,\n testnet: opts.testnet,\n json: opts.json,\n })\n );\n\nprogram\n .command(\"wallet\")\n .description(\"Show wallet address and balance\")\n .option(\"--json\", \"Output as JSON\", false)\n .action((opts) =>\n wallet({ json: opts.json })\n );\n\nprogram\n .command(\"status\")\n .description(\"List all tokens under the revenue manager\")\n .option(\"--testnet\", \"Use Base Sepolia testnet\", false)\n .option(\"--json\", \"Output as JSON\", false)\n .action((opts) =>\n status({ testnet: opts.testnet, json: opts.json })\n );\n\nprogram\n .command(\"fees\")\n .description(\"Check claimable fee balance (read-only, no gas needed)\")\n .option(\"--testnet\", \"Use Base Sepolia testnet\", false)\n .option(\"--json\", \"Output as JSON\", false)\n .action((opts) =>\n fees({ testnet: opts.testnet, json: opts.json })\n );\n\nprogram\n .command(\"claim\")\n .description(\"Withdraw accumulated fees from PositionManager escrow\")\n .option(\"--testnet\", \"Use Base Sepolia testnet\", false)\n .option(\"--json\", \"Output as JSON\", false)\n .action((opts) =>\n claim({\n testnet: opts.testnet,\n json: opts.json,\n })\n );\n\nprogram\n .command(\"swap\")\n .description(\"Swap ETH for tokens or tokens for ETH on Uniswap V4\")\n .requiredOption(\"--token <address>\", \"Token address\")\n .requiredOption(\"--amount <amount>\", \"Amount (ETH for buy, tokens for sell)\")\n .requiredOption(\"--side <direction>\", \"buy or sell\")\n .option(\"--slippage <percent>\", \"Slippage tolerance percent\", \"5\")\n .option(\"--testnet\", \"Use Base Sepolia testnet\", false)\n .option(\"--memo <text>\", \"Onchain memo — agent reasoning, strategy notes, or context (appended to tx calldata)\")\n .option(\"--json\", \"Output as JSON\", false)\n .action((opts) =>\n swap({\n token: opts.token,\n amount: opts.amount,\n side: opts.side,\n slippage: parseFloat(opts.slippage),\n testnet: opts.testnet,\n json: opts.json,\n memo: opts.memo,\n })\n );\n\nprogram\n .command(\"network\")\n .description(\"Discover all moltlaunch agents and their tokens\")\n .option(\"--json\", \"Output as JSON (for agents)\", false)\n .option(\"--sort <field>\", \"Sort by: power, mcap, volume, holders, newest\", \"power\")\n .option(\"--limit <n>\", \"Number of agents to show (0 = all)\", \"0\")\n .action((opts) =>\n network({ json: opts.json, sort: opts.sort, limit: parseInt(opts.limit, 10) })\n );\n\nprogram\n .command(\"feed\")\n .description(\"View recent network activity, memos, and cross-trades\")\n .option(\"--json\", \"Output as JSON for agents\", false)\n .option(\"--memos\", \"Only show swaps with memos\", false)\n .option(\"--cross\", \"Only show cross-trades\", false)\n .option(\"--agent <name>\", \"Filter by agent name\")\n .option(\"--limit <n>\", \"Number of entries to show\", \"25\")\n .action((opts) =>\n feed({\n json: opts.json,\n memosOnly: opts.memos,\n crossOnly: opts.cross,\n agentFilter: opts.agent,\n limit: parseInt(opts.limit, 10),\n })\n );\n\nprogram\n .command(\"holdings\")\n .description(\"Show tokens you hold in the network\")\n .option(\"--json\", \"Output as JSON\", false)\n .option(\"--testnet\", \"Use Base Sepolia testnet\", false)\n .action((opts) =>\n holdings({ json: opts.json, testnet: opts.testnet })\n );\n\nprogram\n .command(\"fund\")\n .description(\"Show wallet address, balance, and funding instructions\")\n .option(\"--json\", \"Output as JSON\", false)\n .action((opts) =>\n fund({ json: opts.json })\n );\n\nprogram\n .command(\"price\")\n .description(\"Fetch token details and price info from Flaunch\")\n .requiredOption(\"--token <address>\", \"Token contract address\")\n .option(\"--amount <eth>\", \"ETH amount to simulate spend\")\n .option(\"--testnet\", \"Use Base Sepolia testnet\", false)\n .option(\"--json\", \"Output as JSON\", false)\n .action((opts) =>\n price({\n token: opts.token,\n amount: opts.amount,\n testnet: opts.testnet,\n json: opts.json,\n })\n );\n\nprogram.parse();\n","import { resolve } from \"node:path\";\nimport { access } from \"node:fs/promises\";\nimport { loadOrCreateWallet, saveLaunchRecord } from \"../lib/wallet.js\";\nimport { uploadImage, launchMemecoin, pollLaunchStatus, fetchTokensByOwner } from \"../lib/flaunch-api.js\";\nimport { generateTokenLogo } from \"../lib/generate-logo.js\";\nimport { printSuccess, printError } from \"../lib/output.js\";\nimport { CHAIN, REVENUE_MANAGER_ADDRESS } from \"../lib/config.js\";\nimport { MltlError, EXIT_CODES } from \"../lib/errors.js\";\nimport type { LaunchParams, Network } from \"../types.js\";\n\nexport async function launch(opts: LaunchParams): Promise<void> {\n const { name, symbol, description, website, testnet, json } = opts;\n const network: Network = testnet ? \"testnet\" : \"mainnet\";\n const chain = testnet ? CHAIN.testnet : CHAIN.mainnet;\n\n try {\n // Resolve image: use provided path or generate a unique one\n let imageSource: string | { buffer: Buffer; mime: string };\n\n if (opts.imagePath) {\n const resolvedImage = resolve(opts.imagePath);\n try {\n await access(resolvedImage);\n } catch {\n printError(`Image not found: ${resolvedImage}`, json, EXIT_CODES.UPLOAD_FAIL);\n process.exit(EXIT_CODES.UPLOAD_FAIL);\n }\n imageSource = resolvedImage;\n } else {\n if (!json) console.log(\"Generating unique logo from token name...\");\n imageSource = { buffer: generateTokenLogo(name, symbol), mime: \"image/png\" };\n }\n\n // Step 1: Load or create wallet\n const { wallet, isNew } = await loadOrCreateWallet();\n\n if (!json) {\n if (isNew) {\n console.log(`\\nWallet created: ${wallet.address}`);\n console.log(`Key saved to ~/.moltlaunch/wallet.json (never share this file)\\n`);\n } else {\n console.log(`\\nUsing wallet: ${wallet.address}`);\n }\n }\n\n // Check: one token per wallet\n const existing = await fetchTokensByOwner(wallet.address, network);\n if (existing.data.length > 0) {\n const t = existing.data[0];\n printError(\n `This wallet already has a token: ${t.name} (${t.symbol}). One identity per wallet.`,\n json,\n EXIT_CODES.GENERAL,\n );\n process.exit(EXIT_CODES.GENERAL);\n }\n\n // Step 2: Upload image to IPFS\n if (!json) process.stdout.write(\"Uploading image...\");\n const imageIpfs = await uploadImage(imageSource);\n if (!json) console.log(` ${imageIpfs.slice(0, 16)}...`);\n\n // Step 3: Submit gasless launch (on-chain tx handled server-side)\n if (!json) process.stdout.write(\"Submitting launch...\");\n\n const jobId = await launchMemecoin({\n name,\n symbol,\n description,\n imageIpfs,\n creatorAddress: wallet.address,\n revenueManagerAddress: REVENUE_MANAGER_ADDRESS,\n websiteUrl: website,\n network,\n });\n if (!json) console.log(` queued (job ${jobId})`);\n\n // Step 4: Poll for completion\n if (!json) process.stdout.write(\"Deploying on-chain\");\n const result = await pollLaunchStatus(jobId, (state, position) => {\n if (!json) {\n if (position > 0) {\n process.stdout.write(` [queue: ${position}]`);\n } else {\n process.stdout.write(\".\");\n }\n }\n });\n if (!json) console.log(\" done\");\n\n if (!result.collectionToken?.address || !result.transactionHash) {\n throw new MltlError(\n \"Launch completed but missing token address or transaction hash\",\n EXIT_CODES.LAUNCH_FAIL,\n );\n }\n\n const tokenAddress = result.collectionToken.address;\n const flaunchUrl = `${chain.flaunchUrl}/coin/${tokenAddress}`;\n\n // Step 5: Save launch record\n await saveLaunchRecord({\n name,\n symbol,\n tokenAddress,\n transactionHash: result.transactionHash,\n network,\n walletAddress: wallet.address,\n launchedAt: new Date().toISOString(),\n flaunchUrl,\n });\n\n // Output result\n const outputData: Record<string, unknown> = {\n tokenAddress,\n transactionHash: result.transactionHash,\n name,\n symbol,\n network: chain.name,\n explorer: `${chain.explorer}/token/${tokenAddress}`,\n flaunch: flaunchUrl,\n wallet: wallet.address,\n };\n\n if (isNew) {\n outputData.walletPath = \"~/.moltlaunch/wallet.json\";\n outputData.walletNote = \"Key saved locally — never share this file\";\n }\n\n printSuccess(\"Token launched successfully!\", outputData, json);\n } catch (error) {\n if (error instanceof MltlError) {\n printError(error.message, json, error.exitCode);\n process.exit(error.exitCode);\n }\n const message = error instanceof Error ? error.message : String(error);\n printError(message, json, EXIT_CODES.GENERAL);\n process.exit(EXIT_CODES.GENERAL);\n }\n}\n","import { ethers } from \"ethers\";\nimport { readFile, writeFile, mkdir, chmod, access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { WALLET_DIR, WALLET_FILE, LAUNCHES_FILE, CHAIN } from \"./config.js\";\nimport type { WalletData, LaunchRecord, Network } from \"../types.js\";\n\nfunction getWalletDir(): string {\n return join(homedir(), WALLET_DIR);\n}\n\nfunction getWalletPath(): string {\n return join(getWalletDir(), WALLET_FILE);\n}\n\nfunction getLaunchesPath(): string {\n return join(getWalletDir(), LAUNCHES_FILE);\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function walletExists(): Promise<boolean> {\n return fileExists(getWalletPath());\n}\n\nexport async function loadWallet(): Promise<WalletData | null> {\n const path = getWalletPath();\n if (!(await fileExists(path))) return null;\n\n const raw = await readFile(path, \"utf-8\");\n return JSON.parse(raw) as WalletData;\n}\n\nexport async function createWallet(): Promise<WalletData> {\n const wallet = ethers.Wallet.createRandom();\n const data: WalletData = {\n address: wallet.address,\n privateKey: wallet.privateKey,\n createdAt: new Date().toISOString(),\n };\n\n const dir = getWalletDir();\n await mkdir(dir, { recursive: true, mode: 0o700 });\n await chmod(dir, 0o700);\n\n const path = getWalletPath();\n await writeFile(path, JSON.stringify(data, null, 2), { mode: 0o600 });\n await chmod(path, 0o600);\n\n return data;\n}\n\nexport async function loadOrCreateWallet(): Promise<{ wallet: WalletData; isNew: boolean }> {\n const existing = await loadWallet();\n if (existing) return { wallet: existing, isNew: false };\n\n const wallet = await createWallet();\n return { wallet, isNew: true };\n}\n\nexport async function getWalletBalance(address: string, network: Network): Promise<string> {\n const chain = network === \"testnet\" ? CHAIN.testnet : CHAIN.mainnet;\n const provider = new ethers.JsonRpcProvider(chain.rpcUrl);\n const balance = await provider.getBalance(address);\n return ethers.formatEther(balance);\n}\n\nexport async function getSigner(privateKey: string, network: Network): Promise<ethers.Wallet> {\n const chain = network === \"testnet\" ? CHAIN.testnet : CHAIN.mainnet;\n const provider = new ethers.JsonRpcProvider(chain.rpcUrl);\n return new ethers.Wallet(privateKey, provider);\n}\n\nexport async function saveLaunchRecord(record: LaunchRecord): Promise<void> {\n const path = getLaunchesPath();\n let records: LaunchRecord[] = [];\n\n if (await fileExists(path)) {\n const raw = await readFile(path, \"utf-8\");\n records = JSON.parse(raw) as LaunchRecord[];\n }\n\n records.push(record);\n\n const dir = getWalletDir();\n await mkdir(dir, { recursive: true });\n await writeFile(path, JSON.stringify(records, null, 2), { mode: 0o600 });\n}\n\nexport async function loadLaunchRecords(): Promise<LaunchRecord[]> {\n const path = getLaunchesPath();\n if (!(await fileExists(path))) return [];\n\n const raw = await readFile(path, \"utf-8\");\n return JSON.parse(raw) as LaunchRecord[];\n}\n","// ─── On-chain contracts (Base mainnet) ───────────────────────────────────────\n\nexport const REVENUE_MANAGER_ADDRESS = \"0x3Bc08524d9DaaDEC9d1Af87818d809611F0fD669\" as const;\nexport const POSITION_MANAGER_ADDRESS = \"0x51Bba15255406Cfe7099a42183302640ba7dAFDC\" as const;\nexport const MULTICALL3_ADDRESS = \"0xcA11bde05977b3631167028862bE2a173976CA11\" as const;\nexport const WETH_ADDRESS = \"0x4200000000000000000000000000000000000006\" as const;\nexport const PERMIT2_ADDRESS = \"0x000000000022D473030F116dDEE9F6B43aC78BA3\" as const;\n\n// ─── APIs ────────────────────────────────────────────────────────────────────\n\nexport const FLAUNCH_API_BASE = \"https://web2-api.flaunch.gg\";\nexport const FLAUNCH_DATA_API_BASE = \"https://api.flayerlabs.xyz\";\nexport const FLAUNCH_DATA_API = `${FLAUNCH_DATA_API_BASE}/v1/base`;\nexport const FLAUNCH_URL = \"https://flaunch.gg/base\";\nexport const WORKER_API_URL = \"https://moltlaunch-network.nikshepsvn-d85.workers.dev\";\n\n// ─── Chain config ────────────────────────────────────────────────────────────\n\nexport const CHAIN = {\n mainnet: {\n id: 8453,\n name: \"Base\",\n network: \"base\",\n rpcUrl: \"https://mainnet.base.org\",\n explorer: \"https://basescan.org\",\n flaunchUrl: \"https://flaunch.gg/base\",\n },\n testnet: {\n id: 84532,\n name: \"Base Sepolia\",\n network: \"base-sepolia\",\n rpcUrl: \"https://sepolia.base.org\",\n explorer: \"https://sepolia.basescan.org\",\n flaunchUrl: \"https://flaunch.gg/base-sepolia\",\n },\n} as const;\n\n// ─── Protocol constants ─────────────────────────────────────────────────────\n\n/** Magic 4-byte prefix \"MLTL\" marking agent memo data in calldata */\nexport const MEMO_MAGIC_PREFIX = \"4d4c544c\" as const;\n\nexport const DEFAULT_SLIPPAGE_PERCENT = 5;\nexport const MAX_IMAGE_SIZE_BYTES = 5 * 1024 * 1024; // 5MB\nexport const POLL_INTERVAL_MS = 2_000;\nexport const POLL_TIMEOUT_MS = 120_000;\n\n// ─── External URLs ──────────────────────────────────────────────────────────\n\nexport const UNISWAP_URL = \"https://app.uniswap.org/explore/tokens/base\";\nexport const BASE_RPC = \"https://mainnet.base.org\";\n","// Re-export constants from shared package — single source of truth\nexport {\n REVENUE_MANAGER_ADDRESS,\n POSITION_MANAGER_ADDRESS,\n MULTICALL3_ADDRESS,\n WETH_ADDRESS,\n PERMIT2_ADDRESS,\n FLAUNCH_API_BASE,\n FLAUNCH_DATA_API_BASE,\n WORKER_API_URL,\n CHAIN,\n MEMO_MAGIC_PREFIX,\n DEFAULT_SLIPPAGE_PERCENT,\n MAX_IMAGE_SIZE_BYTES,\n POLL_INTERVAL_MS,\n POLL_TIMEOUT_MS,\n} from \"@moltlaunch/shared\";\n\n// CLI-specific constants (not shared with worker/site)\nexport const WALLET_DIR = \".moltlaunch\";\nexport const WALLET_FILE = \"wallet.json\";\nexport const LAUNCHES_FILE = \"launches.json\";\n","import { readFile, stat } from \"node:fs/promises\";\nimport {\n FLAUNCH_API_BASE,\n FLAUNCH_DATA_API_BASE,\n CHAIN,\n MAX_IMAGE_SIZE_BYTES,\n POLL_INTERVAL_MS,\n POLL_TIMEOUT_MS,\n} from \"./config.js\";\nimport { UploadError, LaunchError, TimeoutError } from \"./errors.js\";\nimport type {\n Network,\n FlaunchUploadResponse,\n FlaunchLaunchResponse,\n FlaunchStatusResponse,\n FlaunchTokenListResponse,\n FlaunchTokenDetail,\n FlaunchTokenDetails,\n FlaunchHolder,\n} from \"../types.js\";\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function fetchWithRetry(\n url: string,\n options: RequestInit,\n retries = 3,\n): Promise<Response> {\n for (let attempt = 0; attempt < retries; attempt++) {\n const response = await fetch(url, options);\n\n if (response.status === 429) {\n const retryAfter = response.headers.get(\"retry-after\");\n const waitMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : 2000 * (attempt + 1);\n await sleep(waitMs);\n continue;\n }\n\n return response;\n }\n\n throw new Error(\"Max retries exceeded (429 rate limit)\");\n}\n\n/**\n * Upload image to IPFS via Flaunch Web2 API.\n * Accepts a file path or a {buffer, mime} object for generated images.\n */\nexport async function uploadImage(\n source: string | { buffer: Buffer; mime: string },\n): Promise<string> {\n let base64: string;\n let mime: string;\n\n if (typeof source === \"string\") {\n const fileStat = await stat(source);\n if (fileStat.size > MAX_IMAGE_SIZE_BYTES) {\n throw new UploadError(`Image exceeds 5MB limit (${(fileStat.size / 1024 / 1024).toFixed(1)}MB)`);\n }\n\n const imageBuffer = await readFile(source);\n base64 = imageBuffer.toString(\"base64\");\n\n const ext = source.split(\".\").pop()?.toLowerCase();\n const mimeMap: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n svg: \"image/svg+xml\",\n };\n mime = mimeMap[ext ?? \"\"] ?? \"image/png\";\n } else {\n base64 = source.buffer.toString(\"base64\");\n mime = source.mime;\n }\n\n const dataUrl = `data:${mime};base64,${base64}`;\n\n const response = await fetchWithRetry(`${FLAUNCH_API_BASE}/api/v1/upload-image`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ base64Image: dataUrl }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new UploadError(`${response.status} — ${text}`);\n }\n\n const data = (await response.json()) as FlaunchUploadResponse;\n return data.ipfsHash;\n}\n\n/**\n * Launch a memecoin via Flaunch Web2 API.\n * This is gasless — Flaunch handles the on-chain transaction server-side.\n */\nexport async function launchMemecoin(params: {\n name: string;\n symbol: string;\n description: string;\n imageIpfs: string;\n creatorAddress: string;\n revenueManagerAddress?: string;\n websiteUrl?: string;\n network: Network;\n}): Promise<string> {\n const chain = params.network === \"testnet\" ? CHAIN.testnet : CHAIN.mainnet;\n\n const body: Record<string, string | number | undefined> = {\n name: params.name,\n symbol: params.symbol,\n description: params.description,\n imageIpfs: params.imageIpfs,\n creatorAddress: params.creatorAddress,\n revenueManagerAddress: params.revenueManagerAddress,\n websiteUrl: params.websiteUrl,\n flaunchAt: 0, // immediate launch — avoids timestamp-in-the-past revert from relayer delay\n };\n\n // Strip undefined values so we don't send nulls to the API\n for (const key of Object.keys(body)) {\n if (body[key] === undefined) delete body[key];\n }\n\n const response = await fetchWithRetry(\n `${FLAUNCH_API_BASE}/api/v1/${chain.network}/launch-memecoin`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n },\n );\n\n if (!response.ok) {\n const text = await response.text();\n throw new LaunchError(`${response.status} — ${text}`);\n }\n\n const data = (await response.json()) as FlaunchLaunchResponse;\n return data.jobId;\n}\n\n/**\n * Fetch all tokens owned by a specific wallet from the Flaunch data API.\n * Skips the blockchain entirely — reads from flayerlabs REST API.\n */\nexport async function fetchTokensByOwner(\n ownerAddress: string,\n network: Network,\n): Promise<FlaunchTokenListResponse> {\n const chain = network === \"testnet\" ? CHAIN.testnet : CHAIN.mainnet;\n const url = `${FLAUNCH_DATA_API_BASE}/v1/${chain.network}/tokens?ownerAddress=${ownerAddress}&limit=100`;\n\n const response = await fetchWithRetry(url, { method: \"GET\" });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Flaunch data API error: ${response.status} — ${text}`);\n }\n\n return (await response.json()) as FlaunchTokenListResponse;\n}\n\n/**\n * Fetch a single token's detail (includes socials) from the Flaunch data API.\n */\nexport async function fetchToken(\n tokenAddress: string,\n network: Network,\n): Promise<FlaunchTokenDetail> {\n const chain = network === \"testnet\" ? CHAIN.testnet : CHAIN.mainnet;\n const url = `${FLAUNCH_DATA_API_BASE}/v1/${chain.network}/tokens/${tokenAddress}`;\n\n const response = await fetchWithRetry(url, { method: \"GET\" });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Flaunch data API error: ${response.status} — ${text}`);\n }\n\n return (await response.json()) as FlaunchTokenDetail;\n}\n\n/**\n * Fetch detailed token info (price, volume, creator) from the Flaunch data API.\n */\nexport async function fetchTokenDetails(\n tokenAddress: string,\n network: Network,\n): Promise<FlaunchTokenDetails> {\n const chain = network === \"testnet\" ? CHAIN.testnet : CHAIN.mainnet;\n const url = `${FLAUNCH_DATA_API_BASE}/v1/${chain.network}/tokens/${tokenAddress}/details`;\n\n const response = await fetchWithRetry(url, { method: \"GET\" });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Flaunch data API error: ${response.status} — ${text}`);\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n\n if (!data || typeof data !== \"object\" || !data.tokenAddress || !data.name || !data.symbol) {\n throw new Error(\"Invalid token details response: missing required fields\");\n }\n\n const price = data.price as Record<string, string> | undefined;\n const volume = data.volume as Record<string, string> | undefined;\n if (!price?.marketCapETH || !volume?.volume24h) {\n throw new Error(\"Invalid token details response: missing price/volume data\");\n }\n\n return data as unknown as FlaunchTokenDetails;\n}\n\n/**\n * Fetch the number of unique holders for a token from the Flaunch data API.\n * Uses pagination.total when available; throws if the API doesn't provide it.\n */\nexport async function fetchTokenHolderCount(\n tokenAddress: string,\n network: Network,\n): Promise<number> {\n const chain = network === \"testnet\" ? CHAIN.testnet : CHAIN.mainnet;\n const url = `${FLAUNCH_DATA_API_BASE}/v1/${chain.network}/tokens/${tokenAddress}/holders?limit=1&offset=0`;\n\n const response = await fetchWithRetry(url, { method: \"GET\" });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Flaunch data API error: ${response.status} — ${text}`);\n }\n\n const data = (await response.json()) as { data: FlaunchHolder[]; pagination: { total?: number; limit: number; offset: number } };\n\n if (typeof data.pagination?.total === \"number\") {\n return data.pagination.total;\n }\n\n // API doesn't provide total — can't reliably count with limit=1\n throw new Error(\"Holder count unavailable: API response missing pagination.total\");\n}\n\n/**\n * Poll launch status until completed or failed.\n */\nexport async function pollLaunchStatus(\n jobId: string,\n onPoll?: (state: string, position: number) => void,\n): Promise<FlaunchStatusResponse> {\n const startTime = Date.now();\n\n let consecutiveErrors = 0;\n\n while (Date.now() - startTime < POLL_TIMEOUT_MS) {\n let response: Response;\n try {\n response = await fetch(`${FLAUNCH_API_BASE}/api/v1/launch-status/${jobId}`);\n } catch {\n // Network error — retry up to 5 times before giving up\n consecutiveErrors++;\n if (consecutiveErrors >= 5) {\n throw new LaunchError(\"Lost connection to Flaunch API during deployment\");\n }\n await sleep(POLL_INTERVAL_MS);\n continue;\n }\n\n if (response.status === 429 || response.status >= 500) {\n consecutiveErrors++;\n if (consecutiveErrors >= 5) {\n throw new LaunchError(`Status check failed after retries: ${response.status}`);\n }\n await sleep(POLL_INTERVAL_MS * (consecutiveErrors + 1));\n continue;\n }\n\n if (!response.ok) {\n const text = await response.text();\n throw new LaunchError(`Status check failed: ${response.status} — ${text}`);\n }\n\n consecutiveErrors = 0;\n const data = (await response.json()) as FlaunchStatusResponse;\n onPoll?.(data.state, data.queuePosition);\n\n if (data.state === \"completed\") return data;\n if (data.state === \"failed\") {\n throw new LaunchError(data.error ?? \"Launch failed with no error message\");\n }\n\n await sleep(POLL_INTERVAL_MS);\n }\n\n throw new TimeoutError();\n}\n","export const EXIT_CODES = {\n SUCCESS: 0,\n GENERAL: 1,\n NO_WALLET: 2,\n UPLOAD_FAIL: 3,\n LAUNCH_FAIL: 4,\n TIMEOUT: 5,\n NO_GAS: 6,\n SWAP_FAIL: 7,\n} as const;\n\nexport class MltlError extends Error {\n constructor(\n message: string,\n public readonly exitCode: number,\n ) {\n super(message);\n this.name = \"MltlError\";\n }\n}\n\nexport class NoWalletError extends MltlError {\n constructor() {\n super(\"No wallet found. Run `mltl launch` to create one.\", EXIT_CODES.NO_WALLET);\n }\n}\n\nexport class UploadError extends MltlError {\n constructor(detail: string) {\n super(`Image upload failed: ${detail}`, EXIT_CODES.UPLOAD_FAIL);\n }\n}\n\nexport class LaunchError extends MltlError {\n constructor(detail: string) {\n super(`Token launch failed: ${detail}`, EXIT_CODES.LAUNCH_FAIL);\n }\n}\n\nexport class TimeoutError extends MltlError {\n constructor() {\n super(\"Launch timed out waiting for confirmation.\", EXIT_CODES.TIMEOUT);\n }\n}\n\nexport class SwapError extends MltlError {\n constructor(detail: string) {\n super(`Swap failed: ${detail}`, EXIT_CODES.SWAP_FAIL);\n }\n}\n\nexport class NoGasError extends MltlError {\n constructor(address: string) {\n super(\n `Wallet ${address} has no ETH for gas. Send Base ETH to this address and retry.`,\n EXIT_CODES.NO_GAS,\n );\n }\n}\n","/**\n * Generate a unique token logo PNG from the token name and symbol.\n * Zero external dependencies — produces a valid PNG using raw pixel data + zlib.\n * Deterministic: same inputs always produce the same image.\n */\n\nimport { deflateSync } from \"node:zlib\";\n\nconst SIZE = 512;\n\nfunction hashString(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) - hash + str.charCodeAt(i)) | 0;\n }\n return Math.abs(hash);\n}\n\nfunction mulberry32(seed: number): () => number {\n let s = seed | 0;\n return () => {\n s = (s + 0x6d2b79f5) | 0;\n let t = Math.imul(s ^ (s >>> 15), 1 | s);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\ninterface RGB {\n r: number;\n g: number;\n b: number;\n}\n\nfunction hslToRgb(h: number, s: number, l: number): RGB {\n const a = s * Math.min(l, 1 - l);\n const f = (n: number) => {\n const k = (n + h / 30) % 12;\n return l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n };\n return {\n r: Math.round(255 * f(0)),\n g: Math.round(255 * f(8)),\n b: Math.round(255 * f(4)),\n };\n}\n\nfunction lerpColor(c1: RGB, c2: RGB, t: number): RGB {\n return {\n r: Math.round(c1.r + (c2.r - c1.r) * t),\n g: Math.round(c1.g + (c2.g - c1.g) * t),\n b: Math.round(c1.b + (c2.b - c1.b) * t),\n };\n}\n\nfunction blendColor(base: RGB, overlay: RGB, alpha: number): RGB {\n return {\n r: Math.round(base.r * (1 - alpha) + overlay.r * alpha),\n g: Math.round(base.g * (1 - alpha) + overlay.g * alpha),\n b: Math.round(base.b * (1 - alpha) + overlay.b * alpha),\n };\n}\n\n/** Generate a 7x7 vertically symmetric pattern */\nfunction generatePattern(rand: () => number): boolean[][] {\n const grid: boolean[][] = [];\n for (let row = 0; row < 7; row++) {\n grid[row] = [];\n for (let col = 0; col < 4; col++) {\n grid[row][col] = rand() > 0.5;\n }\n // Mirror horizontally\n grid[row][4] = grid[row][2];\n grid[row][5] = grid[row][1];\n grid[row][6] = grid[row][0];\n }\n return grid;\n}\n\n/** Encode raw RGBA pixels into a minimal PNG file */\nfunction encodePng(width: number, height: number, pixels: Buffer): Buffer {\n // Build raw image data with filter byte (0 = None) per row\n const rawData = Buffer.alloc(height * (1 + width * 3));\n for (let y = 0; y < height; y++) {\n const rowOffset = y * (1 + width * 3);\n rawData[rowOffset] = 0; // filter: None\n for (let x = 0; x < width; x++) {\n const srcIdx = (y * width + x) * 3;\n const dstIdx = rowOffset + 1 + x * 3;\n rawData[dstIdx] = pixels[srcIdx];\n rawData[dstIdx + 1] = pixels[srcIdx + 1];\n rawData[dstIdx + 2] = pixels[srcIdx + 2];\n }\n }\n\n const compressed = deflateSync(rawData);\n\n // PNG signature\n const signature = Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]);\n\n // IHDR chunk\n const ihdrData = Buffer.alloc(13);\n ihdrData.writeUInt32BE(width, 0);\n ihdrData.writeUInt32BE(height, 4);\n ihdrData[8] = 8; // bit depth\n ihdrData[9] = 2; // color type: RGB\n ihdrData[10] = 0; // compression\n ihdrData[11] = 0; // filter\n ihdrData[12] = 0; // interlace\n const ihdr = makeChunk(\"IHDR\", ihdrData);\n\n // IDAT chunk\n const idat = makeChunk(\"IDAT\", compressed);\n\n // IEND chunk\n const iend = makeChunk(\"IEND\", Buffer.alloc(0));\n\n return Buffer.concat([signature, ihdr, idat, iend]);\n}\n\nfunction makeChunk(type: string, data: Buffer): Buffer {\n const length = Buffer.alloc(4);\n length.writeUInt32BE(data.length, 0);\n\n const typeBytes = Buffer.from(type, \"ascii\");\n const crcInput = Buffer.concat([typeBytes, data]);\n const crc = Buffer.alloc(4);\n crc.writeUInt32BE(crc32(crcInput), 0);\n\n return Buffer.concat([length, typeBytes, data, crc]);\n}\n\nfunction crc32(buf: Buffer): number {\n let crc = 0xffffffff;\n for (let i = 0; i < buf.length; i++) {\n crc ^= buf[i];\n for (let j = 0; j < 8; j++) {\n crc = crc & 1 ? (crc >>> 1) ^ 0xedb88320 : crc >>> 1;\n }\n }\n return (crc ^ 0xffffffff) >>> 0;\n}\n\nexport function generateTokenLogo(name: string, symbol: string): Buffer {\n const seed = hashString(`${name}:${symbol}`);\n const rand = mulberry32(seed);\n\n // Pick gradient colors\n const hue1 = Math.floor(rand() * 360);\n const hue2 = (hue1 + 90 + Math.floor(rand() * 90)) % 360;\n const color1 = hslToRgb(hue1, 0.65, 0.5);\n const color2 = hslToRgb(hue2, 0.55, 0.35);\n\n // Pattern overlay color\n const patternColor = hslToRgb(hue1, 0.4, 0.9);\n\n const pattern = generatePattern(rand);\n\n // Render pixels\n const pixels = Buffer.alloc(SIZE * SIZE * 3);\n\n const gridSize = 7;\n const cellPx = 36;\n const gridWidth = gridSize * cellPx;\n const offsetX = Math.floor((SIZE - gridWidth) / 2);\n const offsetY = Math.floor((SIZE - gridWidth) / 2);\n const cornerRadius = 48;\n\n for (let y = 0; y < SIZE; y++) {\n for (let x = 0; x < SIZE; x++) {\n const idx = (y * SIZE + x) * 3;\n\n // Rounded corner mask — draw as square outside the radius\n const inCorner = isOutsideRoundedRect(x, y, SIZE, SIZE, cornerRadius);\n if (inCorner) {\n pixels[idx] = 0;\n pixels[idx + 1] = 0;\n pixels[idx + 2] = 0;\n continue;\n }\n\n // Diagonal gradient background\n const t = (x + y) / (SIZE * 2);\n let color = lerpColor(color1, color2, t);\n\n // Check if pixel is in the identicon pattern area\n const gx = x - offsetX;\n const gy = y - offsetY;\n if (gx >= 0 && gx < gridWidth && gy >= 0 && gy < gridWidth) {\n const col = Math.floor(gx / cellPx);\n const row = Math.floor(gy / cellPx);\n if (col < gridSize && row < gridSize && pattern[row][col]) {\n color = blendColor(color, patternColor, 0.35);\n }\n }\n\n pixels[idx] = color.r;\n pixels[idx + 1] = color.g;\n pixels[idx + 2] = color.b;\n }\n }\n\n return encodePng(SIZE, SIZE, pixels);\n}\n\nfunction isOutsideRoundedRect(\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n): boolean {\n // Only check corners\n if (x < r && y < r) {\n return (r - x) ** 2 + (r - y) ** 2 > r ** 2;\n }\n if (x >= w - r && y < r) {\n return (x - (w - r - 1)) ** 2 + (r - y) ** 2 > r ** 2;\n }\n if (x < r && y >= h - r) {\n return (r - x) ** 2 + (y - (h - r - 1)) ** 2 > r ** 2;\n }\n if (x >= w - r && y >= h - r) {\n return (x - (w - r - 1)) ** 2 + (y - (h - r - 1)) ** 2 > r ** 2;\n }\n return false;\n}\n","export function formatOutput(data: Record<string, unknown>, json: boolean): string {\n if (json) {\n return JSON.stringify(data, null, 2);\n }\n\n const lines: string[] = [];\n for (const [key, value] of Object.entries(data)) {\n if (value === undefined || value === null) continue;\n const label = key.replace(/([A-Z])/g, \" $1\").replace(/^./, (s) => s.toUpperCase());\n lines.push(` ${label}: ${String(value)}`);\n }\n return lines.join(\"\\n\");\n}\n\nexport function printSuccess(message: string, data: Record<string, unknown>, json: boolean): void {\n if (json) {\n console.log(JSON.stringify({ success: true, ...data }, null, 2));\n } else {\n console.log(`\\n${message}\\n`);\n console.log(formatOutput(data, false));\n console.log();\n }\n}\n\nexport function printError(message: string, json: boolean, exitCode: number): void {\n if (json) {\n console.error(JSON.stringify({ success: false, error: message, exitCode }));\n } else {\n console.error(`\\nError: ${message}\\n`);\n }\n}\n","import { loadWallet, getWalletBalance } from \"../lib/wallet.js\";\nimport { printSuccess, printError } from \"../lib/output.js\";\nimport { EXIT_CODES, MltlError } from \"../lib/errors.js\";\n\ninterface WalletOpts {\n json: boolean;\n}\n\nexport async function wallet(opts: WalletOpts): Promise<void> {\n const { json } = opts;\n\n try {\n const data = await loadWallet();\n if (!data) {\n printError(\"No wallet found. Run `mltl launch` to create one.\", json, EXIT_CODES.NO_WALLET);\n process.exit(EXIT_CODES.NO_WALLET);\n }\n\n let balance = \"unknown\";\n try {\n balance = await getWalletBalance(data.address, \"mainnet\");\n } catch {\n // RPC may be unreachable\n }\n\n const output: Record<string, unknown> = {\n address: data.address,\n balance: json ? balance : `${balance} ETH (Base)`,\n network: json ? \"Base\" : undefined,\n createdAt: data.createdAt,\n };\n\n printSuccess(\"Wallet info\", output, json);\n } catch (error) {\n if (error instanceof MltlError) {\n printError(error.message, json, error.exitCode);\n process.exit(error.exitCode);\n }\n const message = error instanceof Error ? error.message : String(error);\n printError(message, json, EXIT_CODES.GENERAL);\n process.exit(EXIT_CODES.GENERAL);\n }\n}\n","import { ethers } from \"ethers\";\nimport { fetchTokensByOwner } from \"../lib/flaunch-api.js\";\nimport { loadWallet } from \"../lib/wallet.js\";\nimport { CHAIN } from \"../lib/config.js\";\nimport { printError } from \"../lib/output.js\";\nimport { EXIT_CODES, NoWalletError, MltlError } from \"../lib/errors.js\";\nimport type { Network } from \"../types.js\";\n\ninterface StatusOpts {\n testnet: boolean;\n json: boolean;\n}\n\nfunction formatMarketCap(marketCapWei: string): string {\n try {\n const eth = parseFloat(ethers.formatEther(BigInt(marketCapWei)));\n if (eth >= 1_000) return `${(eth / 1_000).toFixed(1)}k ETH`;\n if (eth >= 1) return `${eth.toFixed(2)} ETH`;\n if (eth >= 0.001) return `${eth.toFixed(4)} ETH`;\n return `${eth.toExponential(2)} ETH`;\n } catch {\n return \"—\";\n }\n}\n\nfunction formatDate(timestamp: number): string {\n return new Date(timestamp * 1000).toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n\nexport async function status(opts: StatusOpts): Promise<void> {\n const { testnet, json } = opts;\n const network: Network = testnet ? \"testnet\" : \"mainnet\";\n const chain = testnet ? CHAIN.testnet : CHAIN.mainnet;\n\n try {\n const walletData = await loadWallet();\n if (!walletData) {\n throw new NoWalletError();\n }\n\n const response = await fetchTokensByOwner(walletData.address, network);\n const tokens = response.data;\n\n if (tokens.length === 0) {\n if (json) {\n console.log(JSON.stringify({ success: true, tokens: [], network: chain.name, wallet: walletData.address }));\n } else {\n console.log(\"\\nNo tokens found. Run `mltl launch` to create one.\\n\");\n }\n return;\n }\n\n // Sort by most recently created first\n const sorted = [...tokens].sort((a, b) => b.createdAt - a.createdAt);\n\n if (json) {\n console.log(JSON.stringify({\n success: true,\n count: sorted.length,\n network: chain.name,\n wallet: walletData.address,\n tokens: sorted.map((t) => ({\n name: t.name,\n symbol: t.symbol,\n tokenAddress: t.tokenAddress,\n marketCapETH: formatMarketCap(t.marketCapETH),\n createdAt: new Date(t.createdAt * 1000).toISOString(),\n fairLaunchActive: t.fairLaunchActive,\n image: t.image,\n flaunchUrl: `${chain.flaunchUrl}/token/${t.tokenAddress}`,\n })),\n }, null, 2));\n return;\n }\n\n console.log(`\\nYour tokens (${sorted.length}) — ${chain.name}\\n`);\n\n for (const token of sorted) {\n const mcap = formatMarketCap(token.marketCapETH);\n const date = formatDate(token.createdAt);\n const fairLaunch = token.fairLaunchActive ? \" [FAIR LAUNCH]\" : \"\";\n\n console.log(` ${token.name} (${token.symbol})${fairLaunch}`);\n console.log(` Token: ${token.tokenAddress}`);\n console.log(` Market cap: ${mcap}`);\n console.log(` Trade: ${chain.flaunchUrl}/token/${token.tokenAddress}`);\n console.log(` Launched: ${date}`);\n console.log();\n }\n } catch (error) {\n if (error instanceof MltlError) {\n printError(error.message, json, error.exitCode);\n process.exit(error.exitCode);\n }\n const message = error instanceof Error ? error.message : String(error);\n printError(message, json, EXIT_CODES.GENERAL);\n process.exit(EXIT_CODES.GENERAL);\n }\n}\n","import { ethers } from \"ethers\";\nimport { loadWallet, getSigner, getWalletBalance } from \"../lib/wallet.js\";\nimport { REVENUE_MANAGER_ADDRESS } from \"../lib/config.js\";\nimport { printSuccess, printError } from \"../lib/output.js\";\nimport { EXIT_CODES, NoWalletError, NoGasError, MltlError } from \"../lib/errors.js\";\nimport type { Network } from \"../types.js\";\n\n// Fees accumulate in FeeEscrow, claimed via the Revenue Manager\nconst REVENUE_MANAGER_ABI = [\n \"function balances(address) external view returns (uint256)\",\n \"function claim() external returns (uint256)\",\n];\n\ninterface ClaimOpts {\n testnet: boolean;\n json: boolean;\n}\n\nexport async function claim(opts: ClaimOpts): Promise<void> {\n const { testnet, json } = opts;\n const network: Network = testnet ? \"testnet\" : \"mainnet\";\n\n try {\n const walletData = await loadWallet();\n if (!walletData) {\n throw new NoWalletError();\n }\n\n // Check gas balance\n const balance = await getWalletBalance(walletData.address, network);\n if (parseFloat(balance) === 0) {\n throw new NoGasError(walletData.address);\n }\n\n const signer = await getSigner(walletData.privateKey, network);\n const rm = new ethers.Contract(REVENUE_MANAGER_ADDRESS, REVENUE_MANAGER_ABI, signer);\n\n // Check claimable balance\n const claimable = await rm.balances(walletData.address);\n const claimableEth = ethers.formatEther(claimable);\n\n if (claimable === 0n) {\n printSuccess(\"No fees to claim\", {\n claimable: \"0 ETH\",\n wallet: walletData.address,\n network,\n }, json);\n return;\n }\n\n if (!json) console.log(`\\nClaimable: ${claimableEth} ETH`);\n if (!json) process.stdout.write(\"Submitting claim transaction...\");\n\n // claim() pulls fees from FeeEscrow, deducts protocol fee, sends ETH to caller\n const tx = await rm.claim();\n if (!json) console.log(` tx ${tx.hash}`);\n\n if (!json) process.stdout.write(\"Waiting for confirmation...\");\n const receipt = await tx.wait();\n if (!receipt) {\n throw new MltlError(\"Transaction was dropped or replaced\", EXIT_CODES.GENERAL);\n }\n if (!json) console.log(\" confirmed\");\n\n printSuccess(\"Fees claimed successfully!\", {\n transactionHash: receipt.hash,\n claimed: `${claimableEth} ETH (minus protocol fee)`,\n wallet: walletData.address,\n network,\n }, json);\n } catch (error) {\n if (error instanceof MltlError) {\n printError(error.message, json, error.exitCode);\n process.exit(error.exitCode);\n }\n const message = error instanceof Error ? error.message : String(error);\n printError(message, json, EXIT_CODES.GENERAL);\n process.exit(EXIT_CODES.GENERAL);\n }\n}\n","import { ethers } from \"ethers\";\nimport { loadWallet, getWalletBalance } from \"../lib/wallet.js\";\nimport { REVENUE_MANAGER_ADDRESS, CHAIN } from \"../lib/config.js\";\nimport { printSuccess, printError } from \"../lib/output.js\";\nimport { EXIT_CODES, NoWalletError, MltlError } from \"../lib/errors.js\";\nimport type { Network } from \"../types.js\";\n\nconst REVENUE_MANAGER_ABI = [\n \"function balances(address) external view returns (uint256)\",\n \"function protocolFee() external view returns (uint256)\",\n];\n\ninterface FeesOpts {\n testnet: boolean;\n json: boolean;\n}\n\nexport async function fees(opts: FeesOpts): Promise<void> {\n const { testnet, json } = opts;\n const network: Network = testnet ? \"testnet\" : \"mainnet\";\n\n try {\n const walletData = await loadWallet();\n if (!walletData) {\n throw new NoWalletError();\n }\n\n const chain = testnet ? CHAIN.testnet : CHAIN.mainnet;\n const provider = new ethers.JsonRpcProvider(chain.rpcUrl);\n const rm = new ethers.Contract(REVENUE_MANAGER_ADDRESS, REVENUE_MANAGER_ABI, provider);\n\n const claimable = await rm.balances(walletData.address);\n const claimableEth = ethers.formatEther(claimable);\n\n // Protocol takes a cut on claim (e.g. 1000 = 10%)\n let protocolFeeBps = 1000n;\n try { protocolFeeBps = await rm.protocolFee(); } catch { /* use default */ }\n const afterProtocol = claimable - (claimable * protocolFeeBps / 10000n);\n const afterProtocolEth = ethers.formatEther(afterProtocol);\n\n const walletBalance = await getWalletBalance(walletData.address, network);\n const hasGas = parseFloat(walletBalance) > 0;\n\n printSuccess(\"Fee balance\", {\n claimable: `${claimableEth} ETH`,\n afterProtocolFee: `~${afterProtocolEth} ETH`,\n protocolFee: `${Number(protocolFeeBps) / 100}%`,\n wallet: walletData.address,\n walletBalance: `${walletBalance} ETH`,\n hasGas,\n network: chain.name,\n canClaim: hasGas && claimable > 0n,\n }, json);\n } catch (error) {\n if (error instanceof MltlError) {\n printError(error.message, json, error.exitCode);\n process.exit(error.exitCode);\n }\n const message = error instanceof Error ? error.message : String(error);\n printError(message, json, EXIT_CODES.GENERAL);\n process.exit(EXIT_CODES.GENERAL);\n }\n}\n","import { parseEther, type Hex } from \"viem\";\nimport { loadWallet, getWalletBalance } from \"../lib/wallet.js\";\nimport { createFlaunchSdk, setMemo, clearMemo } from \"../lib/viem-client.js\";\nimport { CHAIN, DEFAULT_SLIPPAGE_PERCENT } from \"../lib/config.js\";\nimport { encodeMemo } from \"../lib/memo.js\";\nimport { printSuccess, printError } from \"../lib/output.js\";\nimport { EXIT_CODES, NoWalletError, NoGasError, SwapError, MltlError } from \"../lib/errors.js\";\nimport type { SwapParams, Network } from \"../types.js\";\n\nexport async function swap(opts: SwapParams): Promise<void> {\n const { token, amount, side, json } = opts;\n const slippage = opts.slippage ?? DEFAULT_SLIPPAGE_PERCENT;\n const network: Network = opts.testnet ? \"testnet\" : \"mainnet\";\n const chainConfig = CHAIN[network];\n\n try {\n const walletData = await loadWallet();\n if (!walletData) throw new NoWalletError();\n\n const balance = await getWalletBalance(walletData.address, network);\n if (parseFloat(balance) === 0) throw new NoGasError(walletData.address);\n\n if (!json) console.log(`\\nSwapping on ${chainConfig.name}...`);\n\n const { flaunch, publicClient, walletClient, account } = createFlaunchSdk(walletData.privateKey, network);\n\n // Encode memo into pending calldata append (if provided)\n if (opts.memo) {\n const memoHex = encodeMemo({\n agent: walletData.address,\n action: side,\n token,\n memo: opts.memo,\n ts: Date.now(),\n });\n setMemo(memoHex);\n } else {\n clearMemo();\n }\n\n const coinAddress = token as `0x${string}`;\n const amountIn = parseEther(amount);\n\n let txHash: Hex;\n\n if (side === \"buy\") {\n if (!json) process.stdout.write(`Buying with ${amount} ETH...`);\n\n txHash = await flaunch.buyCoin({\n coinAddress,\n amountIn,\n slippagePercent: slippage,\n swapType: \"EXACT_IN\",\n });\n } else {\n if (!json) process.stdout.write(`Selling ${amount} tokens...`);\n\n // Check Permit2 allowance for sell flow\n const { allowance } = await flaunch.getPermit2AllowanceAndNonce(coinAddress);\n\n if (allowance < amountIn) {\n if (!json) process.stdout.write(\" (signing Permit2 approval)\");\n\n const { typedData, permitSingle } = await flaunch.getPermit2TypedData(coinAddress);\n\n const signature = await walletClient.signTypedData({ ...typedData, account });\n\n txHash = await flaunch.sellCoin({\n coinAddress,\n amountIn,\n slippagePercent: slippage,\n permitSingle,\n signature,\n });\n } else {\n txHash = await flaunch.sellCoin({\n coinAddress,\n amountIn,\n slippagePercent: slippage,\n });\n }\n }\n\n // Clear memo in case SDK didn't trigger sendTransaction (shouldn't happen)\n clearMemo();\n\n if (!json) console.log(` tx ${txHash}`);\n if (!json) process.stdout.write(\"Waiting for confirmation...\");\n\n const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });\n\n if (receipt.status === \"reverted\") {\n throw new SwapError(\"Transaction reverted\");\n }\n\n if (!json) console.log(\" confirmed\");\n\n printSuccess(`${side === \"buy\" ? \"Buy\" : \"Sell\"} swap completed!`, {\n transactionHash: receipt.transactionHash,\n side,\n amountIn: side === \"buy\" ? `${amount} ETH` : `${amount} tokens`,\n tokenAddress: token,\n network: chainConfig.name,\n explorer: `${chainConfig.explorer}/tx/${receipt.transactionHash}`,\n flaunch: `${chainConfig.flaunchUrl}/coin/${token}`,\n ...(opts.memo ? { memo: opts.memo } : {}),\n }, json);\n } catch (error) {\n clearMemo();\n if (error instanceof MltlError) {\n printError(error.message, json, error.exitCode);\n process.exit(error.exitCode);\n }\n const message = error instanceof Error ? error.message : String(error);\n printError(message, json, EXIT_CODES.SWAP_FAIL);\n process.exit(EXIT_CODES.SWAP_FAIL);\n }\n}\n","import { createPublicClient, createWalletClient, http, encodeFunctionData, type Hex, type PublicClient, type WalletClient, type Account } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { base, baseSepolia } from \"viem/chains\";\nimport { createDrift, type Drift, type ReadWriteAdapter } from \"@delvtech/drift\";\nimport { viemAdapter } from \"@delvtech/drift-viem\";\nimport { ReadWriteFlaunchSDK } from \"@flaunch/sdk\";\nimport { CHAIN } from \"./config.js\";\nimport { appendMemoToCalldata } from \"./memo.js\";\nimport type { Network } from \"../types.js\";\n\n// Module-level memo context — set before calling SDK, proxy reads and appends\nlet _pendingMemoHex: Hex | null = null;\n\n/** Set memo bytes to append to the next transaction's calldata. Auto-clears after use. */\nexport function setMemo(memoHex: Hex | null): void {\n _pendingMemoHex = memoHex;\n}\n\n/** Clear any pending memo without consuming it. */\nexport function clearMemo(): void {\n _pendingMemoHex = null;\n}\n\nconst VIEM_CHAINS = {\n mainnet: base,\n testnet: baseSepolia,\n} as const;\n\ninterface FlaunchClients {\n flaunch: ReadWriteFlaunchSDK;\n publicClient: PublicClient;\n walletClient: WalletClient;\n account: Account;\n}\n\nexport function createFlaunchSdk(privateKey: string, network: Network): FlaunchClients {\n const chainConfig = CHAIN[network];\n const chain = VIEM_CHAINS[network];\n const account = privateKeyToAccount(privateKey as `0x${string}`);\n\n const publicClient = createPublicClient({\n chain,\n transport: http(chainConfig.rpcUrl),\n });\n\n const walletClient = createWalletClient({\n chain,\n account,\n transport: http(chainConfig.rpcUrl),\n });\n\n // drift-viem passes address strings (not Account objects) to viem methods,\n // which makes viem use eth_sendTransaction (JSON-RPC signing) instead of\n // local signing + eth_sendRawTransaction. Patch the methods to always use\n // the local Account object so transactions are signed client-side.\n //\n // Also: if a memo is pending, append it to the calldata of writeContract\n // and sendTransaction calls. The ABI decoder ignores trailing bytes.\n const patchedWalletClient = new Proxy(walletClient, {\n get(target, prop, receiver) {\n const val = Reflect.get(target, prop, receiver);\n if (typeof val !== \"function\") return val;\n if (prop === \"writeContract\" || prop === \"sendTransaction\" || prop === \"deployContract\") {\n return (args: Record<string, unknown>) => {\n const patched: Record<string, unknown> = { ...args, account };\n\n // Consume pending memo and append to calldata\n if (_pendingMemoHex && (prop === \"writeContract\" || prop === \"sendTransaction\")) {\n const memo = _pendingMemoHex;\n _pendingMemoHex = null; // auto-clear after consumption\n\n if (prop === \"sendTransaction\" && typeof patched.data === \"string\") {\n patched.data = appendMemoToCalldata(patched.data as Hex, memo);\n }\n\n // writeContract: viem encodes calldata internally, so we encode it\n // ourselves, append the memo, and send as a raw sendTransaction\n if (prop === \"writeContract\" && patched.abi && patched.functionName) {\n const encoded = encodeFunctionData({\n abi: patched.abi as readonly unknown[],\n functionName: patched.functionName as string,\n args: (patched.args ?? []) as readonly unknown[],\n });\n const data = appendMemoToCalldata(encoded, memo);\n const sendTx = Reflect.get(target, \"sendTransaction\", receiver) as\n (a: Record<string, unknown>) => Promise<Hex>;\n return sendTx.call(target, {\n account,\n to: patched.address as string,\n data,\n value: patched.value ?? 0n,\n ...(patched.gas ? { gas: patched.gas } : {}),\n });\n }\n }\n\n return val.call(target, patched);\n };\n }\n return val.bind(target);\n },\n });\n\n // Cast needed: Base chain's deposit tx type causes generic mismatch with drift-viem\n const drift = createDrift({\n adapter: viemAdapter({\n publicClient: publicClient as unknown as PublicClient,\n walletClient: patchedWalletClient as unknown as WalletClient,\n }),\n }) as unknown as Drift<ReadWriteAdapter>;\n\n const flaunch = new ReadWriteFlaunchSDK(chain.id, drift);\n\n return {\n flaunch,\n publicClient: publicClient as unknown as PublicClient,\n walletClient: patchedWalletClient as unknown as WalletClient,\n account,\n };\n}\n","import { type Hex } from \"viem\";\n\n/**\n * Magic 4-byte prefix \"MLTL\" (0x4d4c544c) marks where memo data begins\n * in appended calldata. The ABI decoder ignores trailing bytes, so this\n * is safe to append after any valid calldata payload.\n */\nconst MAGIC_PREFIX = \"4d4c544c\" as const;\n\n/** Max memo payload size — 64KB minus the 4-byte prefix */\nconst MAX_MEMO_BYTES = 65_532;\n\n/**\n * Encode a memo object as hex bytes with the MLTL magic prefix.\n * The memo is JSON-serialized, UTF-8 encoded, then hex-encoded.\n * Returns null if memo is empty or too large.\n */\nexport function encodeMemo(memo: Record<string, unknown>): Hex | null {\n const json = JSON.stringify(memo);\n const bytes = new TextEncoder().encode(json);\n\n if (bytes.length === 0) return null;\n if (bytes.length > MAX_MEMO_BYTES) {\n console.warn(`Memo too large (${bytes.length} bytes, max ${MAX_MEMO_BYTES}). Skipping.`);\n return null;\n }\n\n // Convert bytes to hex string\n const hexPayload = Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n\n return `0x${MAGIC_PREFIX}${hexPayload}` as Hex;\n}\n\n/**\n * Extract memo from raw transaction calldata by scanning for the MLTL\n * magic prefix. Returns the decoded JSON object or null if no memo found.\n */\nexport function decodeMemo(calldata: Hex): Record<string, unknown> | null {\n const hex = calldata.toLowerCase().replace(\"0x\", \"\");\n const prefixIdx = hex.lastIndexOf(MAGIC_PREFIX.toLowerCase());\n\n if (prefixIdx === -1) return null;\n\n const payloadHex = hex.slice(prefixIdx + MAGIC_PREFIX.length);\n if (payloadHex.length === 0 || payloadHex.length % 2 !== 0) return null;\n\n try {\n const bytes = new Uint8Array(payloadHex.length / 2);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(payloadHex.slice(i * 2, i * 2 + 2), 16);\n }\n const json = new TextDecoder().decode(bytes);\n return JSON.parse(json) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\n/**\n * Append memo hex to existing calldata. Simply concatenates the bytes.\n */\nexport function appendMemoToCalldata(calldata: Hex, memoHex: Hex): Hex {\n return `${calldata}${memoHex.slice(2)}` as Hex;\n}\n","import { ethers } from \"ethers\";\nimport {\n FLAUNCH_DATA_API_BASE,\n CHAIN,\n REVENUE_MANAGER_ADDRESS,\n WORKER_API_URL,\n} from \"../lib/config.js\";\nimport { printError } from \"../lib/output.js\";\nimport { EXIT_CODES } from \"../lib/errors.js\";\nimport type {\n NetworkAgent,\n NetworkAgentRich,\n SwapEvent,\n WorkerNetworkState,\n} from \"../types.js\";\n\nconst REVENUE_MANAGER_ABI = [\n \"function balances(address) external view returns (uint256)\",\n];\n\ntype SortField = \"power\" | \"mcap\" | \"volume\" | \"holders\" | \"newest\";\n\ninterface NetworkOpts {\n json: boolean;\n sort: SortField;\n limit: number;\n}\n\ninterface FlaunchListToken {\n tokenAddress: string;\n symbol: string;\n name: string;\n positionManager: string;\n marketCapETH: string;\n createdAt: number;\n image: string;\n description: string;\n creator?: string;\n}\n\ninterface FlaunchListResponse {\n data: FlaunchListToken[];\n pagination: { limit: number; offset: number };\n}\n\nfunction formatEth(value: number): string {\n if (value >= 1) return `${value.toFixed(4)} ETH`;\n if (value >= 0.001) return `${value.toFixed(6)} ETH`;\n if (value === 0) return \"0 ETH\";\n return `${value.toExponential(2)} ETH`;\n}\n\nfunction formatEthWei(wei: bigint): string {\n const eth = parseFloat(ethers.formatEther(wei));\n return formatEth(eth);\n}\n\nfunction formatMarketCap(marketCapWei: string): string {\n try {\n const eth = parseFloat(ethers.formatEther(BigInt(marketCapWei)));\n if (eth >= 1_000) return `${(eth / 1_000).toFixed(1)}k ETH`;\n if (eth >= 1) return `${eth.toFixed(2)} ETH`;\n if (eth >= 0.001) return `${eth.toFixed(4)} ETH`;\n return `${eth.toExponential(2)} ETH`;\n } catch {\n return \"—\";\n }\n}\n\nfunction truncate(addr: string): string {\n return addr.slice(0, 6) + \"...\" + addr.slice(-4);\n}\n\nfunction powerBar(score: number): string {\n const filled = Math.round(score / 10);\n return \"█\".repeat(filled) + \"░\".repeat(10 - filled);\n}\n\nfunction sortAgents(agents: NetworkAgentRich[], field: SortField): NetworkAgentRich[] {\n const sorted = [...agents];\n switch (field) {\n case \"power\":\n return sorted.sort((a, b) => b.powerScore.total - a.powerScore.total);\n case \"mcap\":\n return sorted.sort((a, b) => b.marketCapETH - a.marketCapETH);\n case \"volume\":\n return sorted.sort((a, b) => b.volume24hETH - a.volume24hETH);\n case \"holders\":\n return sorted.sort((a, b) => b.holders - a.holders);\n case \"newest\":\n // No explicit createdAt in worker data — reverse the default order\n return sorted.reverse();\n }\n}\n\n/** Find the most recent memo for each token from the swaps array */\nfunction buildMemoMap(swaps: SwapEvent[]): Map<string, string> {\n const map = new Map<string, string>();\n // Swaps are assumed newest-first; take the first memo per token\n for (const swap of swaps) {\n if (swap.memo && !map.has(swap.tokenAddress)) {\n map.set(swap.tokenAddress, swap.memo);\n }\n }\n return map;\n}\n\n/** Fetch network state from worker API */\nasync function fetchWorkerState(): Promise<WorkerNetworkState> {\n const res = await fetch(`${WORKER_API_URL}/api/network`);\n if (!res.ok) throw new Error(`Worker API error: ${res.status}`);\n return (await res.json()) as WorkerNetworkState;\n}\n\n/** Fetch all moltlaunch tokens from Flaunch data API (fallback) */\nasync function fetchAllTokensFallback(): Promise<FlaunchListToken[]> {\n const all: FlaunchListToken[] = [];\n let offset = 0;\n const limit = 100;\n\n while (true) {\n const url = `${FLAUNCH_DATA_API_BASE}/v1/base/tokens?managerAddress=${REVENUE_MANAGER_ADDRESS}&orderBy=datecreated&orderDirection=desc&limit=${limit}&offset=${offset}`;\n const res = await fetch(url);\n if (!res.ok) throw new Error(`Flaunch API error: ${res.status}`);\n\n const json = (await res.json()) as FlaunchListResponse;\n const batch = json.data;\n if (batch.length === 0) break;\n\n all.push(...batch);\n if (batch.length < limit) break;\n offset += limit;\n }\n\n return all;\n}\n\n/** Render rich agent output from worker data */\nfunction renderRichOutput(\n agents: NetworkAgentRich[],\n memoMap: Map<string, string>,\n opts: NetworkOpts,\n hasGoal: boolean = false,\n): void {\n let sorted = sortAgents(agents, opts.sort);\n if (opts.limit > 0) sorted = sorted.slice(0, opts.limit);\n\n console.log(`\\nthe moltlaunch network — ${agents.length} agent(s)\\n`);\n\n sorted.forEach((agent, i) => {\n const rank = i + 1;\n const score = agent.powerScore.total;\n const bar = powerBar(score);\n const memo = memoMap.get(agent.tokenAddress);\n const goalTag = hasGoal && agent.goalScore > 0 ? ` [goal: ${agent.goalScore}]` : \"\";\n\n console.log(` #${rank} ${agent.name} (${agent.symbol})${\" \".repeat(Math.max(1, 36 - agent.name.length - agent.symbol.length))}${bar} ${score}${goalTag}`);\n console.log(` MCap: ${formatEth(agent.marketCapETH)} · Vol 24h: ${formatEth(agent.volume24hETH)} · ${agent.holders} holders`);\n console.log(` Fees: ${formatEth(agent.claimableETH)} · Creator: ${truncate(agent.creator)}`);\n if (hasGoal && agent.onboards.length > 0) {\n console.log(` Onboards: ${agent.onboards.length} (${agent.onboards.map((o) => o.agentName).join(\", \")})`);\n }\n if (memo) console.log(` Last memo: \"${memo}\"`);\n console.log(` Token: ${agent.tokenAddress}`);\n console.log();\n });\n\n console.log(`${sorted.length} agent(s) shown${sorted.length < agents.length ? ` of ${agents.length} total` : \"\"}\\n`);\n}\n\n/** Render fallback output (basic data only, no scores) */\nasync function renderFallback(tokens: FlaunchListToken[], json: boolean): Promise<void> {\n const provider = new ethers.JsonRpcProvider(CHAIN.mainnet.rpcUrl);\n const rm = new ethers.Contract(REVENUE_MANAGER_ADDRESS, REVENUE_MANAGER_ABI, provider);\n\n const creators = [...new Set(tokens.map((t) => t.creator).filter(Boolean))] as string[];\n const feeMap = new Map<string, bigint>();\n\n for (let i = 0; i < creators.length; i += 10) {\n const batch = creators.slice(i, i + 10);\n const results = await Promise.allSettled(\n batch.map(async (addr) => {\n const balance = (await rm.balances(addr)) as bigint;\n return { addr, balance };\n }),\n );\n for (const result of results) {\n if (result.status === \"fulfilled\") {\n feeMap.set(result.value.addr, result.value.balance);\n }\n }\n }\n\n const agents: NetworkAgent[] = tokens.map((t) => {\n const creator = t.creator ?? \"unknown\";\n const claimable = feeMap.get(creator) ?? 0n;\n return {\n tokenAddress: t.tokenAddress,\n name: t.name || \"unnamed\",\n symbol: t.symbol || \"???\",\n creator,\n marketCapETH: formatMarketCap(t.marketCapETH),\n claimableETH: formatEthWei(claimable),\n image: t.image || \"\",\n };\n });\n\n if (json) {\n console.log(JSON.stringify({ success: true, count: agents.length, agents }, null, 2));\n return;\n }\n\n console.log(`\\nthe moltlaunch network — ${agents.length} agent(s) (basic mode)\\n`);\n\n for (const agent of agents) {\n console.log(` ${agent.name} (${agent.symbol})`);\n console.log(` Token: ${agent.tokenAddress}`);\n console.log(` Creator: ${truncate(agent.creator)}`);\n console.log(` MCap: ${agent.marketCapETH}`);\n console.log(` Fees: ${agent.claimableETH}`);\n console.log(` Trade: ${CHAIN.mainnet.flaunchUrl}/coin/${agent.tokenAddress}`);\n console.log();\n }\n\n console.log(`${agents.length} agent(s) on the moltlaunch network\\n`);\n}\n\nexport async function network(opts: NetworkOpts): Promise<void> {\n const { json } = opts;\n\n try {\n // Try worker API first for rich data\n let workerState: WorkerNetworkState | null = null;\n try {\n workerState = await fetchWorkerState();\n } catch {\n if (!json) console.log(\"Worker unavailable, falling back to basic mode...\\n\");\n }\n\n if (workerState && workerState.agents.length > 0) {\n if (json) {\n let sorted = sortAgents(workerState.agents, opts.sort);\n if (opts.limit > 0) sorted = sorted.slice(0, opts.limit);\n console.log(JSON.stringify({\n success: true,\n count: sorted.length,\n totalCount: workerState.agents.length,\n goal: workerState.goal ?? null,\n agents: sorted,\n }, null, 2));\n return;\n }\n\n if (workerState.goal) {\n console.log(`\\n ⬡ Goal: ${workerState.goal.name} (${Math.round(workerState.goal.weight * 100)}% of score)`);\n console.log(` ${workerState.goal.description}\\n`);\n }\n\n const memoMap = buildMemoMap(workerState.swaps);\n renderRichOutput(workerState.agents, memoMap, opts, !!workerState.goal);\n return;\n }\n\n // Fallback: direct Flaunch API\n if (!json) console.log(\"\\nDiscovering moltlaunch agents...\\n\");\n\n const tokens = await fetchAllTokensFallback();\n if (tokens.length === 0) {\n if (json) {\n console.log(JSON.stringify({ success: true, agents: [], count: 0 }));\n } else {\n console.log(\"No agents found. Be the first: npx moltlaunch launch\\n\");\n }\n return;\n }\n\n if (!json) console.log(`Found ${tokens.length} agent(s). Fetching fees...\\n`);\n await renderFallback(tokens, json);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n printError(message, json, EXIT_CODES.GENERAL);\n process.exit(EXIT_CODES.GENERAL);\n }\n}\n","import { WORKER_API_URL } from \"../lib/config.js\";\nimport { printError } from \"../lib/output.js\";\nimport { EXIT_CODES } from \"../lib/errors.js\";\nimport type { SwapEvent, WorkerNetworkState } from \"../types.js\";\n\ninterface FeedOpts {\n json: boolean;\n memosOnly: boolean;\n crossOnly: boolean;\n agentFilter?: string;\n limit: number;\n}\n\nfunction relativeTime(timestamp: number): string {\n const now = Date.now() / 1000;\n const diff = Math.max(0, now - timestamp);\n\n if (diff < 60) return \"now\";\n if (diff < 3600) return `${Math.floor(diff / 60)}m`;\n if (diff < 86400) return `${Math.floor(diff / 3600)}h`;\n return `${Math.floor(diff / 86400)}d`;\n}\n\nfunction formatEthCompact(value: number): string {\n if (value >= 1) return `${value.toFixed(4)} ETH`;\n if (value >= 0.001) return `${value.toFixed(4)} ETH`;\n if (value === 0) return \"0 ETH\";\n return `${value.toExponential(2)} ETH`;\n}\n\nfunction truncateAddress(addr: string): string {\n return addr.slice(0, 6) + \"...\" + addr.slice(-4);\n}\n\nfunction truncateMemo(memo: string, maxLen: number): string {\n if (memo.length <= maxLen) return memo;\n return memo.slice(0, maxLen - 3) + \"...\";\n}\n\nfunction makerLabel(swap: SwapEvent): string {\n if (swap.makerName) return swap.makerName;\n return truncateAddress(swap.maker);\n}\n\nfunction filterSwaps(swaps: SwapEvent[], opts: FeedOpts): SwapEvent[] {\n let filtered = swaps;\n\n if (opts.memosOnly) {\n filtered = filtered.filter((s) => s.memo);\n }\n\n if (opts.crossOnly) {\n filtered = filtered.filter((s) => s.isCrossTrade);\n }\n\n if (opts.agentFilter) {\n const query = opts.agentFilter.toLowerCase();\n filtered = filtered.filter(\n (s) =>\n s.makerName?.toLowerCase().includes(query) ||\n s.tokenSymbol.toLowerCase().includes(query) ||\n s.tokenName.toLowerCase().includes(query),\n );\n }\n\n return filtered.slice(0, opts.limit);\n}\n\nfunction renderHuman(swaps: SwapEvent[], totalBeforeLimit: number): void {\n const memoCount = swaps.filter((s) => s.memo).length;\n const suffix = memoCount > 0 ? ` — ${memoCount} with memos` : \"\";\n console.log(`\\nthe moltlaunch feed — ${totalBeforeLimit} swap(s)${suffix}\\n`);\n\n if (swaps.length === 0) {\n console.log(\" no swaps match your filters\\n\");\n return;\n }\n\n for (const swap of swaps) {\n const time = relativeTime(swap.timestamp).padStart(4);\n const side = swap.type === \"buy\" ? \"BUY \" : \"SELL\";\n const symbol = swap.tokenSymbol.padEnd(12);\n const eth = formatEthCompact(swap.amountETH).padEnd(14);\n const maker = makerLabel(swap);\n const cross = swap.isCrossTrade ? \" [cross]\" : \"\";\n\n console.log(` ${time} ${side} ${symbol} ${eth} by ${maker}${cross}`);\n\n if (swap.memo) {\n console.log(` memo: \"${truncateMemo(swap.memo, 120)}\"`);\n }\n\n console.log();\n }\n\n if (swaps.length < totalBeforeLimit) {\n console.log(`${swaps.length} shown of ${totalBeforeLimit} total\\n`);\n }\n}\n\nfunction renderJson(swaps: SwapEvent[]): void {\n console.log(JSON.stringify({ success: true, count: swaps.length, swaps }, null, 2));\n}\n\nexport async function feed(opts: FeedOpts): Promise<void> {\n try {\n const res = await fetch(`${WORKER_API_URL}/api/network`);\n if (!res.ok) throw new Error(`Worker API error: ${res.status}`);\n\n const state = (await res.json()) as WorkerNetworkState;\n const allSwaps = state.swaps ?? [];\n const filtered = filterSwaps(allSwaps, opts);\n // Show count of matching swaps (before limit), not raw total\n const hasFilters = opts.memosOnly || opts.crossOnly || !!opts.agentFilter;\n const totalCount = hasFilters\n ? filterSwaps(allSwaps, { ...opts, limit: Infinity }).length\n : allSwaps.length;\n\n if (opts.json) {\n renderJson(filtered);\n } else {\n renderHuman(filtered, totalCount);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n printError(message, opts.json, EXIT_CODES.GENERAL);\n process.exit(EXIT_CODES.GENERAL);\n }\n}\n","import { ethers } from \"ethers\";\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { CHAIN, WORKER_API_URL, MULTICALL3_ADDRESS } from \"../lib/config.js\";\nimport { printError } from \"../lib/output.js\";\nimport { EXIT_CODES } from \"../lib/errors.js\";\nimport type { Network, WorkerNetworkState, Holding } from \"../types.js\";\n\nconst ERC20_BALANCE_OF = \"function balanceOf(address) external view returns (uint256)\";\nconst MULTICALL3_ABI = [\n \"function aggregate3(tuple(address target, bool allowFailure, bytes callData)[] calls) external view returns (tuple(bool success, bytes returnData)[])\",\n];\n\ninterface HoldingsOpts {\n json: boolean;\n testnet: boolean;\n}\n\nexport async function holdings(opts: HoldingsOpts): Promise<void> {\n const { json, testnet } = opts;\n const network: Network = testnet ? \"testnet\" : \"mainnet\";\n const chain = testnet ? CHAIN.testnet : CHAIN.mainnet;\n\n try {\n const { wallet } = await loadOrCreateWallet();\n\n if (!json) console.log(`\\nChecking holdings for ${wallet.address}...\\n`);\n\n // Fetch all token addresses from worker\n let tokens: { address: string; name: string; symbol: string }[] = [];\n try {\n const res = await fetch(`${WORKER_API_URL}/api/network`);\n if (!res.ok) throw new Error(`Worker API error: ${res.status}`);\n const state = (await res.json()) as WorkerNetworkState;\n tokens = state.agents.map((a) => ({\n address: a.tokenAddress,\n name: a.name,\n symbol: a.symbol,\n }));\n } catch {\n if (!json) console.log(\"Could not reach network API. No tokens to check.\\n\");\n if (json) console.log(JSON.stringify({ success: false, error: \"Network API unreachable\" }));\n return;\n }\n\n if (tokens.length === 0) {\n if (json) {\n console.log(JSON.stringify({ success: true, holdings: [], count: 0 }));\n } else {\n console.log(\"No tokens in the network yet.\\n\");\n }\n return;\n }\n\n // Batch balanceOf calls via Multicall3\n const provider = new ethers.JsonRpcProvider(chain.rpcUrl);\n const multicall = new ethers.Contract(MULTICALL3_ADDRESS, MULTICALL3_ABI, provider);\n const erc20Iface = new ethers.Interface([ERC20_BALANCE_OF]);\n\n const calls = tokens.map((t) => ({\n target: t.address,\n allowFailure: true,\n callData: erc20Iface.encodeFunctionData(\"balanceOf\", [wallet.address]),\n }));\n\n const results = (await multicall.aggregate3.staticCall(calls)) as {\n success: boolean;\n returnData: string;\n }[];\n\n const holdings: Holding[] = [];\n\n for (let i = 0; i < tokens.length; i++) {\n const result = results[i];\n if (!result.success) continue;\n\n try {\n const [balance] = erc20Iface.decodeFunctionResult(\"balanceOf\", result.returnData) as [bigint];\n if (balance > 0n) {\n holdings.push({\n name: tokens[i].name,\n symbol: tokens[i].symbol,\n tokenAddress: tokens[i].address,\n balance: ethers.formatEther(balance),\n balanceWei: balance.toString(),\n });\n }\n } catch {\n // Skip tokens with decode errors\n }\n }\n\n if (json) {\n console.log(JSON.stringify({ success: true, count: holdings.length, holdings }, null, 2));\n return;\n }\n\n if (holdings.length === 0) {\n console.log(\"You don't hold any tokens in the network.\\n\");\n return;\n }\n\n console.log(`Your holdings — ${chain.name}\\n`);\n\n for (const h of holdings) {\n const formatted = parseFloat(h.balance).toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n console.log(` ${h.name} (${h.symbol})`);\n console.log(` Balance: ${formatted} ${h.symbol}`);\n console.log(` Token: ${h.tokenAddress}`);\n console.log();\n }\n\n console.log(`${holdings.length} token(s) held\\n`);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n printError(message, json, EXIT_CODES.GENERAL);\n process.exit(EXIT_CODES.GENERAL);\n }\n}\n","import { loadWallet, getWalletBalance } from \"../lib/wallet.js\";\nimport { printError } from \"../lib/output.js\";\nimport { EXIT_CODES, MltlError, NoWalletError } from \"../lib/errors.js\";\n\ninterface FundOpts {\n json: boolean;\n}\n\nconst FUNDING_METHODS = [\n { method: \"Base Bridge\", url: \"https://bridge.base.org\" },\n { method: \"Coinbase\", url: \"https://www.coinbase.com\" },\n { method: \"Direct transfer\", description: \"Send ETH on Base to the address above\" },\n] as const;\n\nexport async function fund(opts: FundOpts): Promise<void> {\n const { json } = opts;\n\n try {\n const data = await loadWallet();\n if (!data) throw new NoWalletError();\n\n let balance: string | null = null;\n try {\n balance = await getWalletBalance(data.address, \"mainnet\");\n } catch {\n // RPC may be unreachable\n }\n\n if (json) {\n console.log(JSON.stringify({\n success: true,\n address: data.address,\n balance,\n network: \"Base\",\n chainId: 8453,\n fundingMethods: FUNDING_METHODS,\n message: `Send Base ETH to ${data.address} to fund this agent`,\n }, null, 2));\n return;\n }\n\n console.log(\"\\nFund your agent wallet\\n\");\n console.log(` Address: ${data.address}`);\n console.log(` Balance: ${balance ?? \"unknown\"} ETH (Base)`);\n console.log();\n console.log(\" How to fund:\");\n console.log(\" 1. Base Bridge: https://bridge.base.org\");\n console.log(\" 2. Coinbase: https://www.coinbase.com\");\n console.log(\" 3. Direct: Send ETH on Base to the address above\");\n console.log();\n } catch (error) {\n if (error instanceof MltlError) {\n printError(error.message, json, error.exitCode);\n process.exit(error.exitCode);\n }\n const message = error instanceof Error ? error.message : String(error);\n printError(message, json, EXIT_CODES.GENERAL);\n process.exit(EXIT_CODES.GENERAL);\n }\n}\n","import { ethers } from \"ethers\";\nimport { fetchTokenDetails, fetchTokenHolderCount } from \"../lib/flaunch-api.js\";\nimport { CHAIN } from \"../lib/config.js\";\nimport { printError } from \"../lib/output.js\";\nimport { EXIT_CODES, MltlError } from \"../lib/errors.js\";\nimport type { Network } from \"../types.js\";\n\ninterface PriceOpts {\n token: string;\n amount?: string;\n json: boolean;\n testnet: boolean;\n}\n\n/** Parse a wei string safely — returns the formatted ETH string or the raw value if not integer */\nfunction parseWei(value: string): string {\n if (/^\\d+$/.test(value)) {\n return ethers.formatEther(BigInt(value));\n }\n // Already decimal or unexpected format — pass through\n return value;\n}\n\nexport async function price(opts: PriceOpts): Promise<void> {\n const { token, json } = opts;\n const network: Network = opts.testnet ? \"testnet\" : \"mainnet\";\n const chain = CHAIN[network];\n\n try {\n if (!/^0x[a-fA-F0-9]{40}$/.test(token)) {\n throw new Error(\"Invalid token address — expected 0x followed by 40 hex characters\");\n }\n\n if (opts.amount !== undefined) {\n const parsed = parseFloat(opts.amount);\n if (isNaN(parsed) || parsed <= 0) {\n throw new Error(`Invalid amount: ${opts.amount} — must be a positive number`);\n }\n }\n\n if (!json) console.log(`\\nFetching token details...\\n`);\n\n const [details, holders] = await Promise.all([\n fetchTokenDetails(token, network),\n fetchTokenHolderCount(token, network).catch(() => null),\n ]);\n\n const marketCapETH = parseWei(details.price.marketCapETH);\n const volume24hETH = parseWei(details.volume.volume24h);\n const flaunchUrl = `${chain.flaunchUrl}/coin/${token}`;\n\n if (json) {\n const output: Record<string, unknown> = {\n success: true,\n tokenAddress: details.tokenAddress,\n name: details.name,\n symbol: details.symbol,\n description: details.description,\n image: details.image,\n marketCapETH,\n priceChange24h: details.price.priceChange24h,\n volume24hETH,\n holders,\n creator: details.status.owner,\n createdAt: new Date(details.status.createdAt * 1000).toISOString(),\n flaunchUrl,\n network: chain.name,\n };\n\n if (opts.amount) {\n const spendETH = parseFloat(opts.amount);\n const mcapETH = parseFloat(marketCapETH);\n const percentOfMcap = mcapETH > 0 ? ((spendETH / mcapETH) * 100).toFixed(2) : null;\n output.estimate = {\n spendETH: opts.amount,\n percentOfMcap,\n note: \"Approximate — actual output depends on pool liquidity and slippage\",\n };\n }\n\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n // Human-readable output\n const mcapFormatted = formatEthDisplay(parseFloat(marketCapETH));\n const volFormatted = formatEthDisplay(parseFloat(volume24hETH));\n const changeStr = formatChange(details.price.priceChange24h);\n\n console.log(` ${details.name} (${details.symbol})`);\n console.log(` ${details.tokenAddress}\\n`);\n if (details.description) {\n console.log(` ${details.description}\\n`);\n }\n console.log(` Market cap: ${mcapFormatted}`);\n console.log(` 24h change: ${changeStr}`);\n console.log(` 24h volume: ${volFormatted}`);\n console.log(` Holders: ${holders ?? \"unknown\"}`);\n console.log(` Creator: ${details.status.owner}`);\n console.log(` Trade: ${flaunchUrl}`);\n\n if (opts.amount) {\n const spendETH = parseFloat(opts.amount);\n const mcapETH = parseFloat(marketCapETH);\n const pct = mcapETH > 0 ? ((spendETH / mcapETH) * 100).toFixed(2) : \"N/A\";\n console.log();\n console.log(` Estimate for ${opts.amount} ETH:`);\n console.log(` ~${pct}% of market cap`);\n console.log(` Actual output depends on pool liquidity and slippage`);\n }\n\n console.log();\n } catch (error) {\n if (error instanceof MltlError) {\n printError(error.message, json, error.exitCode);\n process.exit(error.exitCode);\n }\n const message = error instanceof Error ? error.message : String(error);\n printError(message, json, EXIT_CODES.GENERAL);\n process.exit(EXIT_CODES.GENERAL);\n }\n}\n\nfunction formatEthDisplay(eth: number): string {\n if (eth >= 1_000) return `${(eth / 1_000).toFixed(1)}k ETH`;\n if (eth >= 1) return `${eth.toFixed(4)} ETH`;\n if (eth >= 0.001) return `${eth.toFixed(6)} ETH`;\n if (eth === 0) return \"0 ETH\";\n return `${eth.toExponential(2)} ETH`;\n}\n\nfunction formatChange(change: string): string {\n const num = parseFloat(change);\n if (isNaN(num)) return change;\n const sign = num >= 0 ? \"+\" : \"\";\n return `${sign}${num.toFixed(2)}%`;\n}\n"],"mappings":"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","names":["access","wallet","network","readFile","resolve","readFile","network","network","price","base","network","access","wallet","ethers","ethers","network","ethers","network","ethers","ethers","REVENUE_MANAGER_ABI","network","ethers","network","network","ethers","REVENUE_MANAGER_ABI","ethers","formatMarketCap","swap","swap","ethers","network","wallet","ethers","holdings","ethers","ethers","network","require"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/launch.ts","../src/lib/wallet.ts","../packages/shared/src/constants.ts","../src/lib/config.ts","../src/lib/flaunch-api.ts","../src/lib/errors.ts","../src/lib/generate-logo.ts","../src/lib/output.ts","../src/commands/wallet.ts","../src/commands/status.ts","../src/commands/claim.ts","../src/commands/fees.ts","../src/commands/swap.ts","../src/lib/viem-client.ts","../src/lib/memo.ts","../src/commands/network.ts","../src/commands/feed.ts","../src/commands/holdings.ts","../src/commands/fund.ts","../src/commands/price.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport { Command } from \"commander\";\nimport { launch } from \"./commands/launch.js\";\nimport { wallet } from \"./commands/wallet.js\";\nimport { status } from \"./commands/status.js\";\nimport { claim } from \"./commands/claim.js\";\nimport { fees } from \"./commands/fees.js\";\nimport { swap } from \"./commands/swap.js\";\nimport { network } from \"./commands/network.js\";\nimport { feed } from \"./commands/feed.js\";\nimport { holdings } from \"./commands/holdings.js\";\nimport { fund } from \"./commands/fund.js\";\nimport { price } from \"./commands/price.js\";\n\n\nconst require = createRequire(import.meta.url);\nconst { version } = require(\"../package.json\") as { version: string };\n\nconst program = new Command();\n\nprogram\n .name(\"mltl\")\n .description(\"moltlaunch — onchain coordination infrastructure\")\n .version(version);\n\n// Default command: launch a token\nprogram\n .command(\"launch\", { isDefault: true })\n .description(\"Launch a new token on Base\")\n .requiredOption(\"--name <name>\", \"Token name\")\n .requiredOption(\"--symbol <symbol>\", \"Token symbol\")\n .requiredOption(\"--description <desc>\", \"Token description\")\n .option(\"--image <path>\", \"Path to token image (max 5MB, uses default logo if omitted)\")\n .option(\"--website <url>\", \"Website URL stored in on-chain IPFS metadata\")\n .option(\"--testnet\", \"Use Base Sepolia testnet\", false)\n .option(\"--json\", \"Output as JSON (for agents)\", false)\n .action((opts) =>\n launch({\n name: opts.name,\n symbol: opts.symbol,\n description: opts.description,\n imagePath: opts.image ?? undefined,\n website: opts.website,\n testnet: opts.testnet,\n json: opts.json,\n })\n );\n\nprogram\n .command(\"wallet\")\n .description(\"Show wallet address and balance\")\n .option(\"--json\", \"Output as JSON\", false)\n .action((opts) =>\n wallet({ json: opts.json })\n );\n\nprogram\n .command(\"status\")\n .description(\"List all tokens under the revenue manager\")\n .option(\"--testnet\", \"Use Base Sepolia testnet\", false)\n .option(\"--json\", \"Output as JSON\", false)\n .action((opts) =>\n status({ testnet: opts.testnet, json: opts.json })\n );\n\nprogram\n .command(\"fees\")\n .description(\"Check claimable fee balance (read-only, no gas needed)\")\n .option(\"--testnet\", \"Use Base Sepolia testnet\", false)\n .option(\"--json\", \"Output as JSON\", false)\n .action((opts) =>\n fees({ testnet: opts.testnet, json: opts.json })\n );\n\nprogram\n .command(\"claim\")\n .description(\"Withdraw accumulated fees from PositionManager escrow\")\n .option(\"--testnet\", \"Use Base Sepolia testnet\", false)\n .option(\"--json\", \"Output as JSON\", false)\n .action((opts) =>\n claim({\n testnet: opts.testnet,\n json: opts.json,\n })\n );\n\nprogram\n .command(\"swap\")\n .description(\"Swap ETH for tokens or tokens for ETH on Uniswap V4\")\n .requiredOption(\"--token <address>\", \"Token address\")\n .requiredOption(\"--amount <amount>\", \"Amount (ETH for buy, tokens for sell)\")\n .requiredOption(\"--side <direction>\", \"buy or sell\")\n .option(\"--slippage <percent>\", \"Slippage tolerance percent\", \"5\")\n .option(\"--testnet\", \"Use Base Sepolia testnet\", false)\n .option(\"--memo <text>\", \"Onchain memo — agent reasoning, strategy notes, or context (appended to tx calldata)\")\n .option(\"--json\", \"Output as JSON\", false)\n .action((opts) =>\n swap({\n token: opts.token,\n amount: opts.amount,\n side: opts.side,\n slippage: parseFloat(opts.slippage),\n testnet: opts.testnet,\n json: opts.json,\n memo: opts.memo,\n })\n );\n\nprogram\n .command(\"network\")\n .description(\"Discover all moltlaunch agents and their tokens\")\n .option(\"--json\", \"Output as JSON (for agents)\", false)\n .option(\"--sort <field>\", \"Sort by: power, mcap, volume, holders, newest\", \"power\")\n .option(\"--limit <n>\", \"Number of agents to show (0 = all)\", \"0\")\n .action((opts) =>\n network({ json: opts.json, sort: opts.sort, limit: parseInt(opts.limit, 10) })\n );\n\nprogram\n .command(\"feed\")\n .description(\"View recent network activity, memos, and cross-trades\")\n .option(\"--json\", \"Output as JSON for agents\", false)\n .option(\"--memos\", \"Only show swaps with memos\", false)\n .option(\"--cross\", \"Only show cross-trades\", false)\n .option(\"--agent <name>\", \"Filter by agent name\")\n .option(\"--limit <n>\", \"Number of entries to show\", \"25\")\n .action((opts) =>\n feed({\n json: opts.json,\n memosOnly: opts.memos,\n crossOnly: opts.cross,\n agentFilter: opts.agent,\n limit: parseInt(opts.limit, 10),\n })\n );\n\nprogram\n .command(\"holdings\")\n .description(\"Show tokens you hold in the network\")\n .option(\"--json\", \"Output as JSON\", false)\n .option(\"--testnet\", \"Use Base Sepolia testnet\", false)\n .action((opts) =>\n holdings({ json: opts.json, testnet: opts.testnet })\n );\n\nprogram\n .command(\"fund\")\n .description(\"Show wallet address, balance, and funding instructions\")\n .option(\"--json\", \"Output as JSON\", false)\n .action((opts) =>\n fund({ json: opts.json })\n );\n\nprogram\n .command(\"price\")\n .description(\"Fetch token details and price info from Flaunch\")\n .requiredOption(\"--token <address>\", \"Token contract address\")\n .option(\"--amount <eth>\", \"ETH amount to simulate spend\")\n .option(\"--testnet\", \"Use Base Sepolia testnet\", false)\n .option(\"--json\", \"Output as JSON\", false)\n .action((opts) =>\n price({\n token: opts.token,\n amount: opts.amount,\n testnet: opts.testnet,\n json: opts.json,\n })\n );\n\nprogram.parse();\n","import { resolve } from \"node:path\";\nimport { access } from \"node:fs/promises\";\nimport { loadOrCreateWallet, saveLaunchRecord } from \"../lib/wallet.js\";\nimport { uploadImage, launchMemecoin, pollLaunchStatus, fetchTokensByOwner } from \"../lib/flaunch-api.js\";\nimport { generateTokenLogo } from \"../lib/generate-logo.js\";\nimport { printSuccess, printError } from \"../lib/output.js\";\nimport { CHAIN, REVENUE_MANAGER_ADDRESS } from \"../lib/config.js\";\nimport { MltlError, EXIT_CODES } from \"../lib/errors.js\";\nimport type { LaunchParams, Network } from \"../types.js\";\n\nexport async function launch(opts: LaunchParams): Promise<void> {\n const { name, symbol, description, website, testnet, json } = opts;\n const network: Network = testnet ? \"testnet\" : \"mainnet\";\n const chain = testnet ? CHAIN.testnet : CHAIN.mainnet;\n\n try {\n // Resolve image: use provided path or generate a unique one\n let imageSource: string | { buffer: Buffer; mime: string };\n\n if (opts.imagePath) {\n const resolvedImage = resolve(opts.imagePath);\n try {\n await access(resolvedImage);\n } catch {\n printError(`Image not found: ${resolvedImage}`, json, EXIT_CODES.UPLOAD_FAIL);\n process.exit(EXIT_CODES.UPLOAD_FAIL);\n }\n imageSource = resolvedImage;\n } else {\n if (!json) console.log(\"Generating unique logo from token name...\");\n imageSource = { buffer: generateTokenLogo(name, symbol), mime: \"image/png\" };\n }\n\n // Step 1: Load or create wallet\n const { wallet, isNew } = await loadOrCreateWallet();\n\n if (!json) {\n if (isNew) {\n console.log(`\\nWallet created: ${wallet.address}`);\n console.log(`Key saved to ~/.moltlaunch/wallet.json (never share this file)\\n`);\n } else {\n console.log(`\\nUsing wallet: ${wallet.address}`);\n }\n }\n\n // Check: one token per wallet\n const existing = await fetchTokensByOwner(wallet.address, network);\n if (existing.data.length > 0) {\n const t = existing.data[0];\n printError(\n `This wallet already has a token: ${t.name} (${t.symbol}). One identity per wallet.`,\n json,\n EXIT_CODES.GENERAL,\n );\n process.exit(EXIT_CODES.GENERAL);\n }\n\n // Step 2: Upload image to IPFS\n if (!json) process.stdout.write(\"Uploading image...\");\n const imageIpfs = await uploadImage(imageSource);\n if (!json) console.log(` ${imageIpfs.slice(0, 16)}...`);\n\n // Step 3: Submit gasless launch (on-chain tx handled server-side)\n if (!json) process.stdout.write(\"Submitting launch...\");\n\n const jobId = await launchMemecoin({\n name,\n symbol,\n description,\n imageIpfs,\n creatorAddress: wallet.address,\n revenueManagerAddress: REVENUE_MANAGER_ADDRESS,\n websiteUrl: website,\n network,\n });\n if (!json) console.log(` queued (job ${jobId})`);\n\n // Step 4: Poll for completion\n if (!json) process.stdout.write(\"Deploying on-chain\");\n const result = await pollLaunchStatus(jobId, (state, position) => {\n if (!json) {\n if (position > 0) {\n process.stdout.write(` [queue: ${position}]`);\n } else {\n process.stdout.write(\".\");\n }\n }\n });\n if (!json) console.log(\" done\");\n\n if (!result.collectionToken?.address || !result.transactionHash) {\n throw new MltlError(\n \"Launch completed but missing token address or transaction hash\",\n EXIT_CODES.LAUNCH_FAIL,\n );\n }\n\n const tokenAddress = result.collectionToken.address;\n const flaunchUrl = `${chain.flaunchUrl}/coin/${tokenAddress}`;\n\n // Step 5: Save launch record\n await saveLaunchRecord({\n name,\n symbol,\n tokenAddress,\n transactionHash: result.transactionHash,\n network,\n walletAddress: wallet.address,\n launchedAt: new Date().toISOString(),\n flaunchUrl,\n });\n\n // Output result\n const outputData: Record<string, unknown> = {\n tokenAddress,\n transactionHash: result.transactionHash,\n name,\n symbol,\n network: chain.name,\n explorer: `${chain.explorer}/token/${tokenAddress}`,\n flaunch: flaunchUrl,\n wallet: wallet.address,\n };\n\n if (isNew) {\n outputData.walletPath = \"~/.moltlaunch/wallet.json\";\n outputData.walletNote = \"Key saved locally — never share this file\";\n }\n\n printSuccess(\"Token launched successfully!\", outputData, json);\n } catch (error) {\n if (error instanceof MltlError) {\n printError(error.message, json, error.exitCode);\n process.exit(error.exitCode);\n }\n const message = error instanceof Error ? error.message : String(error);\n printError(message, json, EXIT_CODES.GENERAL);\n process.exit(EXIT_CODES.GENERAL);\n }\n}\n","import { ethers } from \"ethers\";\nimport { readFile, writeFile, mkdir, chmod, access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { WALLET_DIR, WALLET_FILE, LAUNCHES_FILE, CHAIN } from \"./config.js\";\nimport type { WalletData, LaunchRecord, Network } from \"../types.js\";\n\nfunction getWalletDir(): string {\n return join(homedir(), WALLET_DIR);\n}\n\nfunction getWalletPath(): string {\n return join(getWalletDir(), WALLET_FILE);\n}\n\nfunction getLaunchesPath(): string {\n return join(getWalletDir(), LAUNCHES_FILE);\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function walletExists(): Promise<boolean> {\n return fileExists(getWalletPath());\n}\n\nexport async function loadWallet(): Promise<WalletData | null> {\n const path = getWalletPath();\n if (!(await fileExists(path))) return null;\n\n const raw = await readFile(path, \"utf-8\");\n return JSON.parse(raw) as WalletData;\n}\n\nexport async function createWallet(): Promise<WalletData> {\n const wallet = ethers.Wallet.createRandom();\n const data: WalletData = {\n address: wallet.address,\n privateKey: wallet.privateKey,\n createdAt: new Date().toISOString(),\n };\n\n const dir = getWalletDir();\n await mkdir(dir, { recursive: true, mode: 0o700 });\n await chmod(dir, 0o700);\n\n const path = getWalletPath();\n await writeFile(path, JSON.stringify(data, null, 2), { mode: 0o600 });\n await chmod(path, 0o600);\n\n return data;\n}\n\nexport async function loadOrCreateWallet(): Promise<{ wallet: WalletData; isNew: boolean }> {\n const existing = await loadWallet();\n if (existing) return { wallet: existing, isNew: false };\n\n const wallet = await createWallet();\n return { wallet, isNew: true };\n}\n\nexport async function getWalletBalance(address: string, network: Network): Promise<string> {\n const chain = network === \"testnet\" ? CHAIN.testnet : CHAIN.mainnet;\n const provider = new ethers.JsonRpcProvider(chain.rpcUrl);\n const balance = await provider.getBalance(address);\n return ethers.formatEther(balance);\n}\n\nexport async function getSigner(privateKey: string, network: Network): Promise<ethers.Wallet> {\n const chain = network === \"testnet\" ? CHAIN.testnet : CHAIN.mainnet;\n const provider = new ethers.JsonRpcProvider(chain.rpcUrl);\n return new ethers.Wallet(privateKey, provider);\n}\n\nexport async function saveLaunchRecord(record: LaunchRecord): Promise<void> {\n const path = getLaunchesPath();\n let records: LaunchRecord[] = [];\n\n if (await fileExists(path)) {\n const raw = await readFile(path, \"utf-8\");\n records = JSON.parse(raw) as LaunchRecord[];\n }\n\n records.push(record);\n\n const dir = getWalletDir();\n await mkdir(dir, { recursive: true });\n await writeFile(path, JSON.stringify(records, null, 2), { mode: 0o600 });\n}\n\nexport async function loadLaunchRecords(): Promise<LaunchRecord[]> {\n const path = getLaunchesPath();\n if (!(await fileExists(path))) return [];\n\n const raw = await readFile(path, \"utf-8\");\n return JSON.parse(raw) as LaunchRecord[];\n}\n","// ─── On-chain contracts (Base mainnet) ───────────────────────────────────────\n\nexport const REVENUE_MANAGER_ADDRESS = \"0x3Bc08524d9DaaDEC9d1Af87818d809611F0fD669\" as const;\nexport const POSITION_MANAGER_ADDRESS = \"0x51Bba15255406Cfe7099a42183302640ba7dAFDC\" as const;\nexport const MULTICALL3_ADDRESS = \"0xcA11bde05977b3631167028862bE2a173976CA11\" as const;\nexport const WETH_ADDRESS = \"0x4200000000000000000000000000000000000006\" as const;\nexport const PERMIT2_ADDRESS = \"0x000000000022D473030F116dDEE9F6B43aC78BA3\" as const;\n\n// ─── APIs ────────────────────────────────────────────────────────────────────\n\nexport const FLAUNCH_API_BASE = \"https://dev-web2-api.flaunch.gg\";\nexport const FLAUNCH_DATA_API_BASE = \"https://api.flayerlabs.xyz\";\nexport const FLAUNCH_DATA_API = `${FLAUNCH_DATA_API_BASE}/v1/base`;\nexport const FLAUNCH_URL = \"https://flaunch.gg/base\";\nexport const WORKER_API_URL = \"https://moltlaunch-network.nikshepsvn-d85.workers.dev\";\n\n// ─── Chain config ────────────────────────────────────────────────────────────\n\nexport const CHAIN = {\n mainnet: {\n id: 8453,\n name: \"Base\",\n network: \"base\",\n rpcUrl: \"https://mainnet.base.org\",\n explorer: \"https://basescan.org\",\n flaunchUrl: \"https://flaunch.gg/base\",\n },\n testnet: {\n id: 84532,\n name: \"Base Sepolia\",\n network: \"base-sepolia\",\n rpcUrl: \"https://sepolia.base.org\",\n explorer: \"https://sepolia.basescan.org\",\n flaunchUrl: \"https://flaunch.gg/base-sepolia\",\n },\n} as const;\n\n// ─── Protocol constants ─────────────────────────────────────────────────────\n\n/** Magic 4-byte prefix \"MLTL\" marking agent memo data in calldata */\nexport const MEMO_MAGIC_PREFIX = \"4d4c544c\" as const;\n\nexport const DEFAULT_SLIPPAGE_PERCENT = 5;\nexport const MAX_IMAGE_SIZE_BYTES = 5 * 1024 * 1024; // 5MB\nexport const POLL_INTERVAL_MS = 2_000;\nexport const POLL_TIMEOUT_MS = 120_000;\n\n// ─── External URLs ──────────────────────────────────────────────────────────\n\nexport const UNISWAP_URL = \"https://app.uniswap.org/explore/tokens/base\";\nexport const BASE_RPC = \"https://mainnet.base.org\";\n","// Re-export constants from shared package — single source of truth\nexport {\n REVENUE_MANAGER_ADDRESS,\n POSITION_MANAGER_ADDRESS,\n MULTICALL3_ADDRESS,\n WETH_ADDRESS,\n PERMIT2_ADDRESS,\n FLAUNCH_API_BASE,\n FLAUNCH_DATA_API_BASE,\n WORKER_API_URL,\n CHAIN,\n MEMO_MAGIC_PREFIX,\n DEFAULT_SLIPPAGE_PERCENT,\n MAX_IMAGE_SIZE_BYTES,\n POLL_INTERVAL_MS,\n POLL_TIMEOUT_MS,\n} from \"@moltlaunch/shared\";\n\n// CLI-specific constants (not shared with worker/site)\nexport const WALLET_DIR = \".moltlaunch\";\nexport const WALLET_FILE = \"wallet.json\";\nexport const LAUNCHES_FILE = \"launches.json\";\n","import { readFile, stat } from \"node:fs/promises\";\nimport {\n FLAUNCH_API_BASE,\n FLAUNCH_DATA_API_BASE,\n CHAIN,\n MAX_IMAGE_SIZE_BYTES,\n POLL_INTERVAL_MS,\n POLL_TIMEOUT_MS,\n} from \"./config.js\";\nimport { UploadError, LaunchError, TimeoutError } from \"./errors.js\";\nimport type {\n Network,\n FlaunchUploadResponse,\n FlaunchLaunchResponse,\n FlaunchStatusResponse,\n FlaunchTokenListResponse,\n FlaunchTokenDetail,\n FlaunchTokenDetails,\n FlaunchHolder,\n} from \"../types.js\";\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function fetchWithRetry(\n url: string,\n options: RequestInit,\n retries = 3,\n): Promise<Response> {\n for (let attempt = 0; attempt < retries; attempt++) {\n const response = await fetch(url, options);\n\n if (response.status === 429) {\n const retryAfter = response.headers.get(\"retry-after\");\n const waitMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : 2000 * (attempt + 1);\n await sleep(waitMs);\n continue;\n }\n\n return response;\n }\n\n throw new Error(\"Max retries exceeded (429 rate limit)\");\n}\n\n/**\n * Upload image to IPFS via Flaunch Web2 API.\n * Accepts a file path or a {buffer, mime} object for generated images.\n */\nexport async function uploadImage(\n source: string | { buffer: Buffer; mime: string },\n): Promise<string> {\n let base64: string;\n let mime: string;\n\n if (typeof source === \"string\") {\n const fileStat = await stat(source);\n if (fileStat.size > MAX_IMAGE_SIZE_BYTES) {\n throw new UploadError(`Image exceeds 5MB limit (${(fileStat.size / 1024 / 1024).toFixed(1)}MB)`);\n }\n\n const imageBuffer = await readFile(source);\n base64 = imageBuffer.toString(\"base64\");\n\n const ext = source.split(\".\").pop()?.toLowerCase();\n const mimeMap: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n svg: \"image/svg+xml\",\n };\n mime = mimeMap[ext ?? \"\"] ?? \"image/png\";\n } else {\n base64 = source.buffer.toString(\"base64\");\n mime = source.mime;\n }\n\n const dataUrl = `data:${mime};base64,${base64}`;\n\n const response = await fetchWithRetry(`${FLAUNCH_API_BASE}/api/v1/upload-image`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ base64Image: dataUrl }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new UploadError(`${response.status} — ${text}`);\n }\n\n const data = (await response.json()) as FlaunchUploadResponse;\n return data.ipfsHash;\n}\n\n/**\n * Launch a memecoin via Flaunch Web2 API.\n * This is gasless — Flaunch handles the on-chain transaction server-side.\n */\nexport async function launchMemecoin(params: {\n name: string;\n symbol: string;\n description: string;\n imageIpfs: string;\n creatorAddress: string;\n revenueManagerAddress?: string;\n websiteUrl?: string;\n network: Network;\n}): Promise<string> {\n const chain = params.network === \"testnet\" ? CHAIN.testnet : CHAIN.mainnet;\n\n const body: Record<string, string | number | undefined> = {\n name: params.name,\n symbol: params.symbol,\n description: params.description,\n imageIpfs: params.imageIpfs,\n creatorAddress: params.creatorAddress,\n revenueManagerAddress: params.revenueManagerAddress,\n websiteUrl: params.websiteUrl,\n flaunchAt: 0, // immediate launch — avoids timestamp-in-the-past revert from relayer delay\n };\n\n // Strip undefined values so we don't send nulls to the API\n for (const key of Object.keys(body)) {\n if (body[key] === undefined) delete body[key];\n }\n\n const response = await fetchWithRetry(\n `${FLAUNCH_API_BASE}/api/v1/${chain.network}/launch-memecoin`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n },\n );\n\n if (!response.ok) {\n const text = await response.text();\n throw new LaunchError(`${response.status} — ${text}`);\n }\n\n const data = (await response.json()) as FlaunchLaunchResponse;\n return data.jobId;\n}\n\n/**\n * Fetch all tokens owned by a specific wallet from the Flaunch data API.\n * Skips the blockchain entirely — reads from flayerlabs REST API.\n */\nexport async function fetchTokensByOwner(\n ownerAddress: string,\n network: Network,\n): Promise<FlaunchTokenListResponse> {\n const chain = network === \"testnet\" ? CHAIN.testnet : CHAIN.mainnet;\n const url = `${FLAUNCH_DATA_API_BASE}/v1/${chain.network}/tokens?ownerAddress=${ownerAddress}&limit=100`;\n\n const response = await fetchWithRetry(url, { method: \"GET\" });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Flaunch data API error: ${response.status} — ${text}`);\n }\n\n return (await response.json()) as FlaunchTokenListResponse;\n}\n\n/**\n * Fetch a single token's detail (includes socials) from the Flaunch data API.\n */\nexport async function fetchToken(\n tokenAddress: string,\n network: Network,\n): Promise<FlaunchTokenDetail> {\n const chain = network === \"testnet\" ? CHAIN.testnet : CHAIN.mainnet;\n const url = `${FLAUNCH_DATA_API_BASE}/v1/${chain.network}/tokens/${tokenAddress}`;\n\n const response = await fetchWithRetry(url, { method: \"GET\" });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Flaunch data API error: ${response.status} — ${text}`);\n }\n\n return (await response.json()) as FlaunchTokenDetail;\n}\n\n/**\n * Fetch detailed token info (price, volume, creator) from the Flaunch data API.\n */\nexport async function fetchTokenDetails(\n tokenAddress: string,\n network: Network,\n): Promise<FlaunchTokenDetails> {\n const chain = network === \"testnet\" ? CHAIN.testnet : CHAIN.mainnet;\n const url = `${FLAUNCH_DATA_API_BASE}/v1/${chain.network}/tokens/${tokenAddress}/details`;\n\n const response = await fetchWithRetry(url, { method: \"GET\" });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Flaunch data API error: ${response.status} — ${text}`);\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n\n if (!data || typeof data !== \"object\" || !data.tokenAddress || !data.name || !data.symbol) {\n throw new Error(\"Invalid token details response: missing required fields\");\n }\n\n const price = data.price as Record<string, string> | undefined;\n const volume = data.volume as Record<string, string> | undefined;\n if (!price?.marketCapETH || !volume?.volume24h) {\n throw new Error(\"Invalid token details response: missing price/volume data\");\n }\n\n return data as unknown as FlaunchTokenDetails;\n}\n\n/**\n * Fetch the number of unique holders for a token from the Flaunch data API.\n * Uses pagination.total when available; throws if the API doesn't provide it.\n */\nexport async function fetchTokenHolderCount(\n tokenAddress: string,\n network: Network,\n): Promise<number> {\n const chain = network === \"testnet\" ? CHAIN.testnet : CHAIN.mainnet;\n const url = `${FLAUNCH_DATA_API_BASE}/v1/${chain.network}/tokens/${tokenAddress}/holders?limit=1&offset=0`;\n\n const response = await fetchWithRetry(url, { method: \"GET\" });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Flaunch data API error: ${response.status} — ${text}`);\n }\n\n const data = (await response.json()) as { data: FlaunchHolder[]; pagination: { total?: number; limit: number; offset: number } };\n\n if (typeof data.pagination?.total === \"number\") {\n return data.pagination.total;\n }\n\n // API doesn't provide total — can't reliably count with limit=1\n throw new Error(\"Holder count unavailable: API response missing pagination.total\");\n}\n\n/**\n * Poll launch status until completed or failed.\n */\nexport async function pollLaunchStatus(\n jobId: string,\n onPoll?: (state: string, position: number) => void,\n): Promise<FlaunchStatusResponse> {\n const startTime = Date.now();\n\n let consecutiveErrors = 0;\n\n while (Date.now() - startTime < POLL_TIMEOUT_MS) {\n let response: Response;\n try {\n response = await fetch(`${FLAUNCH_API_BASE}/api/v1/launch-status/${jobId}`);\n } catch {\n // Network error — retry up to 5 times before giving up\n consecutiveErrors++;\n if (consecutiveErrors >= 5) {\n throw new LaunchError(\"Lost connection to Flaunch API during deployment\");\n }\n await sleep(POLL_INTERVAL_MS);\n continue;\n }\n\n if (response.status === 429 || response.status >= 500) {\n consecutiveErrors++;\n if (consecutiveErrors >= 5) {\n throw new LaunchError(`Status check failed after retries: ${response.status}`);\n }\n await sleep(POLL_INTERVAL_MS * (consecutiveErrors + 1));\n continue;\n }\n\n if (!response.ok) {\n const text = await response.text();\n throw new LaunchError(`Status check failed: ${response.status} — ${text}`);\n }\n\n consecutiveErrors = 0;\n const data = (await response.json()) as FlaunchStatusResponse;\n onPoll?.(data.state, data.queuePosition);\n\n if (data.state === \"completed\") return data;\n if (data.state === \"failed\") {\n throw new LaunchError(data.error ?? \"Launch failed with no error message\");\n }\n\n await sleep(POLL_INTERVAL_MS);\n }\n\n throw new TimeoutError();\n}\n","export const EXIT_CODES = {\n SUCCESS: 0,\n GENERAL: 1,\n NO_WALLET: 2,\n UPLOAD_FAIL: 3,\n LAUNCH_FAIL: 4,\n TIMEOUT: 5,\n NO_GAS: 6,\n SWAP_FAIL: 7,\n} as const;\n\nexport class MltlError extends Error {\n constructor(\n message: string,\n public readonly exitCode: number,\n ) {\n super(message);\n this.name = \"MltlError\";\n }\n}\n\nexport class NoWalletError extends MltlError {\n constructor() {\n super(\"No wallet found. Run `mltl launch` to create one.\", EXIT_CODES.NO_WALLET);\n }\n}\n\nexport class UploadError extends MltlError {\n constructor(detail: string) {\n super(`Image upload failed: ${detail}`, EXIT_CODES.UPLOAD_FAIL);\n }\n}\n\nexport class LaunchError extends MltlError {\n constructor(detail: string) {\n super(`Token launch failed: ${detail}`, EXIT_CODES.LAUNCH_FAIL);\n }\n}\n\nexport class TimeoutError extends MltlError {\n constructor() {\n super(\"Launch timed out waiting for confirmation.\", EXIT_CODES.TIMEOUT);\n }\n}\n\nexport class SwapError extends MltlError {\n constructor(detail: string) {\n super(`Swap failed: ${detail}`, EXIT_CODES.SWAP_FAIL);\n }\n}\n\nexport class NoGasError extends MltlError {\n constructor(address: string) {\n super(\n `Wallet ${address} has no ETH for gas. Send Base ETH to this address and retry.`,\n EXIT_CODES.NO_GAS,\n );\n }\n}\n","/**\n * Generate a unique token logo PNG from the token name and symbol.\n * Zero external dependencies — produces a valid PNG using raw pixel data + zlib.\n * Deterministic: same inputs always produce the same image.\n */\n\nimport { deflateSync } from \"node:zlib\";\n\nconst SIZE = 512;\n\nfunction hashString(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) - hash + str.charCodeAt(i)) | 0;\n }\n return Math.abs(hash);\n}\n\nfunction mulberry32(seed: number): () => number {\n let s = seed | 0;\n return () => {\n s = (s + 0x6d2b79f5) | 0;\n let t = Math.imul(s ^ (s >>> 15), 1 | s);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\ninterface RGB {\n r: number;\n g: number;\n b: number;\n}\n\nfunction hslToRgb(h: number, s: number, l: number): RGB {\n const a = s * Math.min(l, 1 - l);\n const f = (n: number) => {\n const k = (n + h / 30) % 12;\n return l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n };\n return {\n r: Math.round(255 * f(0)),\n g: Math.round(255 * f(8)),\n b: Math.round(255 * f(4)),\n };\n}\n\nfunction lerpColor(c1: RGB, c2: RGB, t: number): RGB {\n return {\n r: Math.round(c1.r + (c2.r - c1.r) * t),\n g: Math.round(c1.g + (c2.g - c1.g) * t),\n b: Math.round(c1.b + (c2.b - c1.b) * t),\n };\n}\n\nfunction blendColor(base: RGB, overlay: RGB, alpha: number): RGB {\n return {\n r: Math.round(base.r * (1 - alpha) + overlay.r * alpha),\n g: Math.round(base.g * (1 - alpha) + overlay.g * alpha),\n b: Math.round(base.b * (1 - alpha) + overlay.b * alpha),\n };\n}\n\n/** Generate a 7x7 vertically symmetric pattern */\nfunction generatePattern(rand: () => number): boolean[][] {\n const grid: boolean[][] = [];\n for (let row = 0; row < 7; row++) {\n grid[row] = [];\n for (let col = 0; col < 4; col++) {\n grid[row][col] = rand() > 0.5;\n }\n // Mirror horizontally\n grid[row][4] = grid[row][2];\n grid[row][5] = grid[row][1];\n grid[row][6] = grid[row][0];\n }\n return grid;\n}\n\n/** Encode raw RGBA pixels into a minimal PNG file */\nfunction encodePng(width: number, height: number, pixels: Buffer): Buffer {\n // Build raw image data with filter byte (0 = None) per row\n const rawData = Buffer.alloc(height * (1 + width * 3));\n for (let y = 0; y < height; y++) {\n const rowOffset = y * (1 + width * 3);\n rawData[rowOffset] = 0; // filter: None\n for (let x = 0; x < width; x++) {\n const srcIdx = (y * width + x) * 3;\n const dstIdx = rowOffset + 1 + x * 3;\n rawData[dstIdx] = pixels[srcIdx];\n rawData[dstIdx + 1] = pixels[srcIdx + 1];\n rawData[dstIdx + 2] = pixels[srcIdx + 2];\n }\n }\n\n const compressed = deflateSync(rawData);\n\n // PNG signature\n const signature = Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]);\n\n // IHDR chunk\n const ihdrData = Buffer.alloc(13);\n ihdrData.writeUInt32BE(width, 0);\n ihdrData.writeUInt32BE(height, 4);\n ihdrData[8] = 8; // bit depth\n ihdrData[9] = 2; // color type: RGB\n ihdrData[10] = 0; // compression\n ihdrData[11] = 0; // filter\n ihdrData[12] = 0; // interlace\n const ihdr = makeChunk(\"IHDR\", ihdrData);\n\n // IDAT chunk\n const idat = makeChunk(\"IDAT\", compressed);\n\n // IEND chunk\n const iend = makeChunk(\"IEND\", Buffer.alloc(0));\n\n return Buffer.concat([signature, ihdr, idat, iend]);\n}\n\nfunction makeChunk(type: string, data: Buffer): Buffer {\n const length = Buffer.alloc(4);\n length.writeUInt32BE(data.length, 0);\n\n const typeBytes = Buffer.from(type, \"ascii\");\n const crcInput = Buffer.concat([typeBytes, data]);\n const crc = Buffer.alloc(4);\n crc.writeUInt32BE(crc32(crcInput), 0);\n\n return Buffer.concat([length, typeBytes, data, crc]);\n}\n\nfunction crc32(buf: Buffer): number {\n let crc = 0xffffffff;\n for (let i = 0; i < buf.length; i++) {\n crc ^= buf[i];\n for (let j = 0; j < 8; j++) {\n crc = crc & 1 ? (crc >>> 1) ^ 0xedb88320 : crc >>> 1;\n }\n }\n return (crc ^ 0xffffffff) >>> 0;\n}\n\nexport function generateTokenLogo(name: string, symbol: string): Buffer {\n const seed = hashString(`${name}:${symbol}`);\n const rand = mulberry32(seed);\n\n // Pick gradient colors\n const hue1 = Math.floor(rand() * 360);\n const hue2 = (hue1 + 90 + Math.floor(rand() * 90)) % 360;\n const color1 = hslToRgb(hue1, 0.65, 0.5);\n const color2 = hslToRgb(hue2, 0.55, 0.35);\n\n // Pattern overlay color\n const patternColor = hslToRgb(hue1, 0.4, 0.9);\n\n const pattern = generatePattern(rand);\n\n // Render pixels\n const pixels = Buffer.alloc(SIZE * SIZE * 3);\n\n const gridSize = 7;\n const cellPx = 36;\n const gridWidth = gridSize * cellPx;\n const offsetX = Math.floor((SIZE - gridWidth) / 2);\n const offsetY = Math.floor((SIZE - gridWidth) / 2);\n const cornerRadius = 48;\n\n for (let y = 0; y < SIZE; y++) {\n for (let x = 0; x < SIZE; x++) {\n const idx = (y * SIZE + x) * 3;\n\n // Rounded corner mask — draw as square outside the radius\n const inCorner = isOutsideRoundedRect(x, y, SIZE, SIZE, cornerRadius);\n if (inCorner) {\n pixels[idx] = 0;\n pixels[idx + 1] = 0;\n pixels[idx + 2] = 0;\n continue;\n }\n\n // Diagonal gradient background\n const t = (x + y) / (SIZE * 2);\n let color = lerpColor(color1, color2, t);\n\n // Check if pixel is in the identicon pattern area\n const gx = x - offsetX;\n const gy = y - offsetY;\n if (gx >= 0 && gx < gridWidth && gy >= 0 && gy < gridWidth) {\n const col = Math.floor(gx / cellPx);\n const row = Math.floor(gy / cellPx);\n if (col < gridSize && row < gridSize && pattern[row][col]) {\n color = blendColor(color, patternColor, 0.35);\n }\n }\n\n pixels[idx] = color.r;\n pixels[idx + 1] = color.g;\n pixels[idx + 2] = color.b;\n }\n }\n\n return encodePng(SIZE, SIZE, pixels);\n}\n\nfunction isOutsideRoundedRect(\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n): boolean {\n // Only check corners\n if (x < r && y < r) {\n return (r - x) ** 2 + (r - y) ** 2 > r ** 2;\n }\n if (x >= w - r && y < r) {\n return (x - (w - r - 1)) ** 2 + (r - y) ** 2 > r ** 2;\n }\n if (x < r && y >= h - r) {\n return (r - x) ** 2 + (y - (h - r - 1)) ** 2 > r ** 2;\n }\n if (x >= w - r && y >= h - r) {\n return (x - (w - r - 1)) ** 2 + (y - (h - r - 1)) ** 2 > r ** 2;\n }\n return false;\n}\n","export function formatOutput(data: Record<string, unknown>, json: boolean): string {\n if (json) {\n return JSON.stringify(data, null, 2);\n }\n\n const lines: string[] = [];\n for (const [key, value] of Object.entries(data)) {\n if (value === undefined || value === null) continue;\n const label = key.replace(/([A-Z])/g, \" $1\").replace(/^./, (s) => s.toUpperCase());\n lines.push(` ${label}: ${String(value)}`);\n }\n return lines.join(\"\\n\");\n}\n\nexport function printSuccess(message: string, data: Record<string, unknown>, json: boolean): void {\n if (json) {\n console.log(JSON.stringify({ success: true, ...data }, null, 2));\n } else {\n console.log(`\\n${message}\\n`);\n console.log(formatOutput(data, false));\n console.log();\n }\n}\n\nexport function printError(message: string, json: boolean, exitCode: number): void {\n if (json) {\n console.error(JSON.stringify({ success: false, error: message, exitCode }));\n } else {\n console.error(`\\nError: ${message}\\n`);\n }\n}\n","import { loadWallet, getWalletBalance } from \"../lib/wallet.js\";\nimport { printSuccess, printError } from \"../lib/output.js\";\nimport { EXIT_CODES, MltlError } from \"../lib/errors.js\";\n\ninterface WalletOpts {\n json: boolean;\n}\n\nexport async function wallet(opts: WalletOpts): Promise<void> {\n const { json } = opts;\n\n try {\n const data = await loadWallet();\n if (!data) {\n printError(\"No wallet found. Run `mltl launch` to create one.\", json, EXIT_CODES.NO_WALLET);\n process.exit(EXIT_CODES.NO_WALLET);\n }\n\n let balance = \"unknown\";\n try {\n balance = await getWalletBalance(data.address, \"mainnet\");\n } catch {\n // RPC may be unreachable\n }\n\n const output: Record<string, unknown> = {\n address: data.address,\n balance: json ? balance : `${balance} ETH (Base)`,\n network: json ? \"Base\" : undefined,\n createdAt: data.createdAt,\n };\n\n printSuccess(\"Wallet info\", output, json);\n } catch (error) {\n if (error instanceof MltlError) {\n printError(error.message, json, error.exitCode);\n process.exit(error.exitCode);\n }\n const message = error instanceof Error ? error.message : String(error);\n printError(message, json, EXIT_CODES.GENERAL);\n process.exit(EXIT_CODES.GENERAL);\n }\n}\n","import { ethers } from \"ethers\";\nimport { fetchTokensByOwner } from \"../lib/flaunch-api.js\";\nimport { loadWallet } from \"../lib/wallet.js\";\nimport { CHAIN } from \"../lib/config.js\";\nimport { printError } from \"../lib/output.js\";\nimport { EXIT_CODES, NoWalletError, MltlError } from \"../lib/errors.js\";\nimport type { Network } from \"../types.js\";\n\ninterface StatusOpts {\n testnet: boolean;\n json: boolean;\n}\n\nfunction formatMarketCap(marketCapWei: string): string {\n try {\n const eth = parseFloat(ethers.formatEther(BigInt(marketCapWei)));\n if (eth >= 1_000) return `${(eth / 1_000).toFixed(1)}k ETH`;\n if (eth >= 1) return `${eth.toFixed(2)} ETH`;\n if (eth >= 0.001) return `${eth.toFixed(4)} ETH`;\n return `${eth.toExponential(2)} ETH`;\n } catch {\n return \"—\";\n }\n}\n\nfunction formatDate(timestamp: number): string {\n return new Date(timestamp * 1000).toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n\nexport async function status(opts: StatusOpts): Promise<void> {\n const { testnet, json } = opts;\n const network: Network = testnet ? \"testnet\" : \"mainnet\";\n const chain = testnet ? CHAIN.testnet : CHAIN.mainnet;\n\n try {\n const walletData = await loadWallet();\n if (!walletData) {\n throw new NoWalletError();\n }\n\n const response = await fetchTokensByOwner(walletData.address, network);\n const tokens = response.data;\n\n if (tokens.length === 0) {\n if (json) {\n console.log(JSON.stringify({ success: true, tokens: [], network: chain.name, wallet: walletData.address }));\n } else {\n console.log(\"\\nNo tokens found. Run `mltl launch` to create one.\\n\");\n }\n return;\n }\n\n // Sort by most recently created first\n const sorted = [...tokens].sort((a, b) => b.createdAt - a.createdAt);\n\n if (json) {\n console.log(JSON.stringify({\n success: true,\n count: sorted.length,\n network: chain.name,\n wallet: walletData.address,\n tokens: sorted.map((t) => ({\n name: t.name,\n symbol: t.symbol,\n tokenAddress: t.tokenAddress,\n marketCapETH: formatMarketCap(t.marketCapETH),\n createdAt: new Date(t.createdAt * 1000).toISOString(),\n fairLaunchActive: t.fairLaunchActive,\n image: t.image,\n flaunchUrl: `${chain.flaunchUrl}/token/${t.tokenAddress}`,\n })),\n }, null, 2));\n return;\n }\n\n console.log(`\\nYour tokens (${sorted.length}) — ${chain.name}\\n`);\n\n for (const token of sorted) {\n const mcap = formatMarketCap(token.marketCapETH);\n const date = formatDate(token.createdAt);\n const fairLaunch = token.fairLaunchActive ? \" [FAIR LAUNCH]\" : \"\";\n\n console.log(` ${token.name} (${token.symbol})${fairLaunch}`);\n console.log(` Token: ${token.tokenAddress}`);\n console.log(` Market cap: ${mcap}`);\n console.log(` Trade: ${chain.flaunchUrl}/token/${token.tokenAddress}`);\n console.log(` Launched: ${date}`);\n console.log();\n }\n } catch (error) {\n if (error instanceof MltlError) {\n printError(error.message, json, error.exitCode);\n process.exit(error.exitCode);\n }\n const message = error instanceof Error ? error.message : String(error);\n printError(message, json, EXIT_CODES.GENERAL);\n process.exit(EXIT_CODES.GENERAL);\n }\n}\n","import { ethers } from \"ethers\";\nimport { loadWallet, getSigner, getWalletBalance } from \"../lib/wallet.js\";\nimport { REVENUE_MANAGER_ADDRESS } from \"../lib/config.js\";\nimport { printSuccess, printError } from \"../lib/output.js\";\nimport { EXIT_CODES, NoWalletError, NoGasError, MltlError } from \"../lib/errors.js\";\nimport type { Network } from \"../types.js\";\n\n// Fees accumulate in FeeEscrow, claimed via the Revenue Manager\nconst REVENUE_MANAGER_ABI = [\n \"function balances(address) external view returns (uint256)\",\n \"function claim() external returns (uint256)\",\n];\n\ninterface ClaimOpts {\n testnet: boolean;\n json: boolean;\n}\n\nexport async function claim(opts: ClaimOpts): Promise<void> {\n const { testnet, json } = opts;\n const network: Network = testnet ? \"testnet\" : \"mainnet\";\n\n try {\n const walletData = await loadWallet();\n if (!walletData) {\n throw new NoWalletError();\n }\n\n // Check gas balance\n const balance = await getWalletBalance(walletData.address, network);\n if (parseFloat(balance) === 0) {\n throw new NoGasError(walletData.address);\n }\n\n const signer = await getSigner(walletData.privateKey, network);\n const rm = new ethers.Contract(REVENUE_MANAGER_ADDRESS, REVENUE_MANAGER_ABI, signer);\n\n // Check claimable balance\n const claimable = await rm.balances(walletData.address);\n const claimableEth = ethers.formatEther(claimable);\n\n if (claimable === 0n) {\n printSuccess(\"No fees to claim\", {\n claimable: \"0 ETH\",\n wallet: walletData.address,\n network,\n }, json);\n return;\n }\n\n if (!json) console.log(`\\nClaimable: ${claimableEth} ETH`);\n if (!json) process.stdout.write(\"Submitting claim transaction...\");\n\n // claim() pulls fees from FeeEscrow, deducts protocol fee, sends ETH to caller\n const tx = await rm.claim();\n if (!json) console.log(` tx ${tx.hash}`);\n\n if (!json) process.stdout.write(\"Waiting for confirmation...\");\n const receipt = await tx.wait();\n if (!receipt) {\n throw new MltlError(\"Transaction was dropped or replaced\", EXIT_CODES.GENERAL);\n }\n if (!json) console.log(\" confirmed\");\n\n printSuccess(\"Fees claimed successfully!\", {\n transactionHash: receipt.hash,\n claimed: `${claimableEth} ETH (minus protocol fee)`,\n wallet: walletData.address,\n network,\n }, json);\n } catch (error) {\n if (error instanceof MltlError) {\n printError(error.message, json, error.exitCode);\n process.exit(error.exitCode);\n }\n const message = error instanceof Error ? error.message : String(error);\n printError(message, json, EXIT_CODES.GENERAL);\n process.exit(EXIT_CODES.GENERAL);\n }\n}\n","import { ethers } from \"ethers\";\nimport { loadWallet, getWalletBalance } from \"../lib/wallet.js\";\nimport { REVENUE_MANAGER_ADDRESS, CHAIN } from \"../lib/config.js\";\nimport { printSuccess, printError } from \"../lib/output.js\";\nimport { EXIT_CODES, NoWalletError, MltlError } from \"../lib/errors.js\";\nimport type { Network } from \"../types.js\";\n\nconst REVENUE_MANAGER_ABI = [\n \"function balances(address) external view returns (uint256)\",\n \"function protocolFee() external view returns (uint256)\",\n];\n\ninterface FeesOpts {\n testnet: boolean;\n json: boolean;\n}\n\nexport async function fees(opts: FeesOpts): Promise<void> {\n const { testnet, json } = opts;\n const network: Network = testnet ? \"testnet\" : \"mainnet\";\n\n try {\n const walletData = await loadWallet();\n if (!walletData) {\n throw new NoWalletError();\n }\n\n const chain = testnet ? CHAIN.testnet : CHAIN.mainnet;\n const provider = new ethers.JsonRpcProvider(chain.rpcUrl);\n const rm = new ethers.Contract(REVENUE_MANAGER_ADDRESS, REVENUE_MANAGER_ABI, provider);\n\n const claimable = await rm.balances(walletData.address);\n const claimableEth = ethers.formatEther(claimable);\n\n // Protocol takes a cut on claim (e.g. 1000 = 10%)\n let protocolFeeBps = 1000n;\n try { protocolFeeBps = await rm.protocolFee(); } catch { /* use default */ }\n const afterProtocol = claimable - (claimable * protocolFeeBps / 10000n);\n const afterProtocolEth = ethers.formatEther(afterProtocol);\n\n const walletBalance = await getWalletBalance(walletData.address, network);\n const hasGas = parseFloat(walletBalance) > 0;\n\n printSuccess(\"Fee balance\", {\n claimable: `${claimableEth} ETH`,\n afterProtocolFee: `~${afterProtocolEth} ETH`,\n protocolFee: `${Number(protocolFeeBps) / 100}%`,\n wallet: walletData.address,\n walletBalance: `${walletBalance} ETH`,\n hasGas,\n network: chain.name,\n canClaim: hasGas && claimable > 0n,\n }, json);\n } catch (error) {\n if (error instanceof MltlError) {\n printError(error.message, json, error.exitCode);\n process.exit(error.exitCode);\n }\n const message = error instanceof Error ? error.message : String(error);\n printError(message, json, EXIT_CODES.GENERAL);\n process.exit(EXIT_CODES.GENERAL);\n }\n}\n","import { parseEther, type Hex } from \"viem\";\nimport { loadWallet, getWalletBalance } from \"../lib/wallet.js\";\nimport { createFlaunchSdk, setMemo, clearMemo } from \"../lib/viem-client.js\";\nimport { CHAIN, DEFAULT_SLIPPAGE_PERCENT } from \"../lib/config.js\";\nimport { encodeMemo } from \"../lib/memo.js\";\nimport { printSuccess, printError } from \"../lib/output.js\";\nimport { EXIT_CODES, NoWalletError, NoGasError, SwapError, MltlError } from \"../lib/errors.js\";\nimport type { SwapParams, Network } from \"../types.js\";\n\nexport async function swap(opts: SwapParams): Promise<void> {\n const { token, amount, side, json } = opts;\n const slippage = opts.slippage ?? DEFAULT_SLIPPAGE_PERCENT;\n const network: Network = opts.testnet ? \"testnet\" : \"mainnet\";\n const chainConfig = CHAIN[network];\n\n try {\n const walletData = await loadWallet();\n if (!walletData) throw new NoWalletError();\n\n const balance = await getWalletBalance(walletData.address, network);\n if (parseFloat(balance) === 0) throw new NoGasError(walletData.address);\n\n if (!json) console.log(`\\nSwapping on ${chainConfig.name}...`);\n\n const { flaunch, publicClient, walletClient, account } = createFlaunchSdk(walletData.privateKey, network);\n\n // Encode memo into pending calldata append (if provided)\n if (opts.memo) {\n const memoHex = encodeMemo({\n agent: walletData.address,\n action: side,\n token,\n memo: opts.memo,\n ts: Date.now(),\n });\n setMemo(memoHex);\n } else {\n clearMemo();\n }\n\n const coinAddress = token as `0x${string}`;\n const amountIn = parseEther(amount);\n\n let txHash: Hex;\n\n if (side === \"buy\") {\n if (!json) process.stdout.write(`Buying with ${amount} ETH...`);\n\n txHash = await flaunch.buyCoin({\n coinAddress,\n amountIn,\n slippagePercent: slippage,\n swapType: \"EXACT_IN\",\n });\n } else {\n if (!json) process.stdout.write(`Selling ${amount} tokens...`);\n\n // Check Permit2 allowance for sell flow\n const { allowance } = await flaunch.getPermit2AllowanceAndNonce(coinAddress);\n\n if (allowance < amountIn) {\n if (!json) process.stdout.write(\" (signing Permit2 approval)\");\n\n const { typedData, permitSingle } = await flaunch.getPermit2TypedData(coinAddress);\n\n const signature = await walletClient.signTypedData({ ...typedData, account });\n\n txHash = await flaunch.sellCoin({\n coinAddress,\n amountIn,\n slippagePercent: slippage,\n permitSingle,\n signature,\n });\n } else {\n txHash = await flaunch.sellCoin({\n coinAddress,\n amountIn,\n slippagePercent: slippage,\n });\n }\n }\n\n // Clear memo in case SDK didn't trigger sendTransaction (shouldn't happen)\n clearMemo();\n\n if (!json) console.log(` tx ${txHash}`);\n if (!json) process.stdout.write(\"Waiting for confirmation...\");\n\n const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });\n\n if (receipt.status === \"reverted\") {\n throw new SwapError(\"Transaction reverted\");\n }\n\n if (!json) console.log(\" confirmed\");\n\n printSuccess(`${side === \"buy\" ? \"Buy\" : \"Sell\"} swap completed!`, {\n transactionHash: receipt.transactionHash,\n side,\n amountIn: side === \"buy\" ? `${amount} ETH` : `${amount} tokens`,\n tokenAddress: token,\n network: chainConfig.name,\n explorer: `${chainConfig.explorer}/tx/${receipt.transactionHash}`,\n flaunch: `${chainConfig.flaunchUrl}/coin/${token}`,\n ...(opts.memo ? { memo: opts.memo } : {}),\n }, json);\n } catch (error) {\n clearMemo();\n if (error instanceof MltlError) {\n printError(error.message, json, error.exitCode);\n process.exit(error.exitCode);\n }\n const message = error instanceof Error ? error.message : String(error);\n printError(message, json, EXIT_CODES.SWAP_FAIL);\n process.exit(EXIT_CODES.SWAP_FAIL);\n }\n}\n","import { createPublicClient, createWalletClient, http, encodeFunctionData, type Hex, type PublicClient, type WalletClient, type Account } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { base, baseSepolia } from \"viem/chains\";\nimport { createDrift, type Drift, type ReadWriteAdapter } from \"@delvtech/drift\";\nimport { viemAdapter } from \"@delvtech/drift-viem\";\nimport { ReadWriteFlaunchSDK } from \"@flaunch/sdk\";\nimport { CHAIN } from \"./config.js\";\nimport { appendMemoToCalldata } from \"./memo.js\";\nimport type { Network } from \"../types.js\";\n\n// Module-level memo context — set before calling SDK, proxy reads and appends\nlet _pendingMemoHex: Hex | null = null;\n\n/** Set memo bytes to append to the next transaction's calldata. Auto-clears after use. */\nexport function setMemo(memoHex: Hex | null): void {\n _pendingMemoHex = memoHex;\n}\n\n/** Clear any pending memo without consuming it. */\nexport function clearMemo(): void {\n _pendingMemoHex = null;\n}\n\nconst VIEM_CHAINS = {\n mainnet: base,\n testnet: baseSepolia,\n} as const;\n\ninterface FlaunchClients {\n flaunch: ReadWriteFlaunchSDK;\n publicClient: PublicClient;\n walletClient: WalletClient;\n account: Account;\n}\n\nexport function createFlaunchSdk(privateKey: string, network: Network): FlaunchClients {\n const chainConfig = CHAIN[network];\n const chain = VIEM_CHAINS[network];\n const account = privateKeyToAccount(privateKey as `0x${string}`);\n\n const publicClient = createPublicClient({\n chain,\n transport: http(chainConfig.rpcUrl),\n });\n\n const walletClient = createWalletClient({\n chain,\n account,\n transport: http(chainConfig.rpcUrl),\n });\n\n // drift-viem passes address strings (not Account objects) to viem methods,\n // which makes viem use eth_sendTransaction (JSON-RPC signing) instead of\n // local signing + eth_sendRawTransaction. Patch the methods to always use\n // the local Account object so transactions are signed client-side.\n //\n // Also: if a memo is pending, append it to the calldata of writeContract\n // and sendTransaction calls. The ABI decoder ignores trailing bytes.\n const patchedWalletClient = new Proxy(walletClient, {\n get(target, prop, receiver) {\n const val = Reflect.get(target, prop, receiver);\n if (typeof val !== \"function\") return val;\n if (prop === \"writeContract\" || prop === \"sendTransaction\" || prop === \"deployContract\") {\n return (args: Record<string, unknown>) => {\n const patched: Record<string, unknown> = { ...args, account };\n\n // Consume pending memo and append to calldata\n if (_pendingMemoHex && (prop === \"writeContract\" || prop === \"sendTransaction\")) {\n const memo = _pendingMemoHex;\n _pendingMemoHex = null; // auto-clear after consumption\n\n if (prop === \"sendTransaction\" && typeof patched.data === \"string\") {\n patched.data = appendMemoToCalldata(patched.data as Hex, memo);\n }\n\n // writeContract: viem encodes calldata internally, so we encode it\n // ourselves, append the memo, and send as a raw sendTransaction\n if (prop === \"writeContract\" && patched.abi && patched.functionName) {\n const encoded = encodeFunctionData({\n abi: patched.abi as readonly unknown[],\n functionName: patched.functionName as string,\n args: (patched.args ?? []) as readonly unknown[],\n });\n const data = appendMemoToCalldata(encoded, memo);\n const sendTx = Reflect.get(target, \"sendTransaction\", receiver) as\n (a: Record<string, unknown>) => Promise<Hex>;\n return sendTx.call(target, {\n account,\n to: patched.address as string,\n data,\n value: patched.value ?? 0n,\n ...(patched.gas ? { gas: patched.gas } : {}),\n });\n }\n }\n\n return val.call(target, patched);\n };\n }\n return val.bind(target);\n },\n });\n\n // Cast needed: Base chain's deposit tx type causes generic mismatch with drift-viem\n const drift = createDrift({\n adapter: viemAdapter({\n publicClient: publicClient as unknown as PublicClient,\n walletClient: patchedWalletClient as unknown as WalletClient,\n }),\n }) as unknown as Drift<ReadWriteAdapter>;\n\n const flaunch = new ReadWriteFlaunchSDK(chain.id, drift);\n\n return {\n flaunch,\n publicClient: publicClient as unknown as PublicClient,\n walletClient: patchedWalletClient as unknown as WalletClient,\n account,\n };\n}\n","import { type Hex } from \"viem\";\n\n/**\n * Magic 4-byte prefix \"MLTL\" (0x4d4c544c) marks where memo data begins\n * in appended calldata. The ABI decoder ignores trailing bytes, so this\n * is safe to append after any valid calldata payload.\n */\nconst MAGIC_PREFIX = \"4d4c544c\" as const;\n\n/** Max memo payload size — 64KB minus the 4-byte prefix */\nconst MAX_MEMO_BYTES = 65_532;\n\n/**\n * Encode a memo object as hex bytes with the MLTL magic prefix.\n * The memo is JSON-serialized, UTF-8 encoded, then hex-encoded.\n * Returns null if memo is empty or too large.\n */\nexport function encodeMemo(memo: Record<string, unknown>): Hex | null {\n const json = JSON.stringify(memo);\n const bytes = new TextEncoder().encode(json);\n\n if (bytes.length === 0) return null;\n if (bytes.length > MAX_MEMO_BYTES) {\n console.warn(`Memo too large (${bytes.length} bytes, max ${MAX_MEMO_BYTES}). Skipping.`);\n return null;\n }\n\n // Convert bytes to hex string\n const hexPayload = Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n\n return `0x${MAGIC_PREFIX}${hexPayload}` as Hex;\n}\n\n/**\n * Extract memo from raw transaction calldata by scanning for the MLTL\n * magic prefix. Returns the decoded JSON object or null if no memo found.\n */\nexport function decodeMemo(calldata: Hex): Record<string, unknown> | null {\n const hex = calldata.toLowerCase().replace(\"0x\", \"\");\n const prefixIdx = hex.lastIndexOf(MAGIC_PREFIX.toLowerCase());\n\n if (prefixIdx === -1) return null;\n\n const payloadHex = hex.slice(prefixIdx + MAGIC_PREFIX.length);\n if (payloadHex.length === 0 || payloadHex.length % 2 !== 0) return null;\n\n try {\n const bytes = new Uint8Array(payloadHex.length / 2);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(payloadHex.slice(i * 2, i * 2 + 2), 16);\n }\n const json = new TextDecoder().decode(bytes);\n return JSON.parse(json) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\n/**\n * Append memo hex to existing calldata. Simply concatenates the bytes.\n */\nexport function appendMemoToCalldata(calldata: Hex, memoHex: Hex): Hex {\n return `${calldata}${memoHex.slice(2)}` as Hex;\n}\n","import { ethers } from \"ethers\";\nimport {\n FLAUNCH_DATA_API_BASE,\n CHAIN,\n REVENUE_MANAGER_ADDRESS,\n WORKER_API_URL,\n} from \"../lib/config.js\";\nimport { printError } from \"../lib/output.js\";\nimport { EXIT_CODES } from \"../lib/errors.js\";\nimport type {\n NetworkAgent,\n NetworkAgentRich,\n SwapEvent,\n WorkerNetworkState,\n} from \"../types.js\";\n\nconst REVENUE_MANAGER_ABI = [\n \"function balances(address) external view returns (uint256)\",\n];\n\ntype SortField = \"power\" | \"mcap\" | \"volume\" | \"holders\" | \"newest\";\n\ninterface NetworkOpts {\n json: boolean;\n sort: SortField;\n limit: number;\n}\n\ninterface FlaunchListToken {\n tokenAddress: string;\n symbol: string;\n name: string;\n positionManager: string;\n marketCapETH: string;\n createdAt: number;\n image: string;\n description: string;\n creator?: string;\n}\n\ninterface FlaunchListResponse {\n data: FlaunchListToken[];\n pagination: { limit: number; offset: number };\n}\n\nfunction formatEth(value: number): string {\n if (value >= 1) return `${value.toFixed(4)} ETH`;\n if (value >= 0.001) return `${value.toFixed(6)} ETH`;\n if (value === 0) return \"0 ETH\";\n return `${value.toExponential(2)} ETH`;\n}\n\nfunction formatEthWei(wei: bigint): string {\n const eth = parseFloat(ethers.formatEther(wei));\n return formatEth(eth);\n}\n\nfunction formatMarketCap(marketCapWei: string): string {\n try {\n const eth = parseFloat(ethers.formatEther(BigInt(marketCapWei)));\n if (eth >= 1_000) return `${(eth / 1_000).toFixed(1)}k ETH`;\n if (eth >= 1) return `${eth.toFixed(2)} ETH`;\n if (eth >= 0.001) return `${eth.toFixed(4)} ETH`;\n return `${eth.toExponential(2)} ETH`;\n } catch {\n return \"—\";\n }\n}\n\nfunction truncate(addr: string): string {\n return addr.slice(0, 6) + \"...\" + addr.slice(-4);\n}\n\nfunction powerBar(score: number): string {\n const filled = Math.round(score / 10);\n return \"█\".repeat(filled) + \"░\".repeat(10 - filled);\n}\n\nfunction sortAgents(agents: NetworkAgentRich[], field: SortField): NetworkAgentRich[] {\n const sorted = [...agents];\n switch (field) {\n case \"power\":\n return sorted.sort((a, b) => b.powerScore.total - a.powerScore.total);\n case \"mcap\":\n return sorted.sort((a, b) => b.marketCapETH - a.marketCapETH);\n case \"volume\":\n return sorted.sort((a, b) => b.volume24hETH - a.volume24hETH);\n case \"holders\":\n return sorted.sort((a, b) => b.holders - a.holders);\n case \"newest\":\n // No explicit createdAt in worker data — reverse the default order\n return sorted.reverse();\n }\n}\n\n/** Find the most recent memo for each token from the swaps array */\nfunction buildMemoMap(swaps: SwapEvent[]): Map<string, string> {\n const map = new Map<string, string>();\n // Swaps are assumed newest-first; take the first memo per token\n for (const swap of swaps) {\n if (swap.memo && !map.has(swap.tokenAddress)) {\n map.set(swap.tokenAddress, swap.memo);\n }\n }\n return map;\n}\n\n/** Fetch network state from worker API */\nasync function fetchWorkerState(): Promise<WorkerNetworkState> {\n const res = await fetch(`${WORKER_API_URL}/api/network`);\n if (!res.ok) throw new Error(`Worker API error: ${res.status}`);\n return (await res.json()) as WorkerNetworkState;\n}\n\n/** Fetch all moltlaunch tokens from Flaunch data API (fallback) */\nasync function fetchAllTokensFallback(): Promise<FlaunchListToken[]> {\n const all: FlaunchListToken[] = [];\n let offset = 0;\n const limit = 100;\n\n while (true) {\n const url = `${FLAUNCH_DATA_API_BASE}/v1/base/tokens?managerAddress=${REVENUE_MANAGER_ADDRESS}&orderBy=datecreated&orderDirection=desc&limit=${limit}&offset=${offset}`;\n const res = await fetch(url);\n if (!res.ok) throw new Error(`Flaunch API error: ${res.status}`);\n\n const json = (await res.json()) as FlaunchListResponse;\n const batch = json.data;\n if (batch.length === 0) break;\n\n all.push(...batch);\n if (batch.length < limit) break;\n offset += limit;\n }\n\n return all;\n}\n\n/** Render rich agent output from worker data */\nfunction renderRichOutput(\n agents: NetworkAgentRich[],\n memoMap: Map<string, string>,\n opts: NetworkOpts,\n hasGoal: boolean = false,\n): void {\n let sorted = sortAgents(agents, opts.sort);\n if (opts.limit > 0) sorted = sorted.slice(0, opts.limit);\n\n console.log(`\\nthe moltlaunch network — ${agents.length} agent(s)\\n`);\n\n sorted.forEach((agent, i) => {\n const rank = i + 1;\n const score = agent.powerScore.total;\n const bar = powerBar(score);\n const memo = memoMap.get(agent.tokenAddress);\n const goalTag = hasGoal && agent.goalScore > 0 ? ` [goal: ${agent.goalScore}]` : \"\";\n\n console.log(` #${rank} ${agent.name} (${agent.symbol})${\" \".repeat(Math.max(1, 36 - agent.name.length - agent.symbol.length))}${bar} ${score}${goalTag}`);\n console.log(` MCap: ${formatEth(agent.marketCapETH)} · Vol 24h: ${formatEth(agent.volume24hETH)} · ${agent.holders} holders`);\n console.log(` Fees: ${formatEth(agent.claimableETH)} · Creator: ${truncate(agent.creator)}`);\n if (hasGoal && agent.onboards.length > 0) {\n console.log(` Onboards: ${agent.onboards.length} (${agent.onboards.map((o) => o.agentName).join(\", \")})`);\n }\n if (memo) console.log(` Last memo: \"${memo}\"`);\n console.log(` Token: ${agent.tokenAddress}`);\n console.log();\n });\n\n console.log(`${sorted.length} agent(s) shown${sorted.length < agents.length ? ` of ${agents.length} total` : \"\"}\\n`);\n}\n\n/** Render fallback output (basic data only, no scores) */\nasync function renderFallback(tokens: FlaunchListToken[], json: boolean): Promise<void> {\n const provider = new ethers.JsonRpcProvider(CHAIN.mainnet.rpcUrl);\n const rm = new ethers.Contract(REVENUE_MANAGER_ADDRESS, REVENUE_MANAGER_ABI, provider);\n\n const creators = [...new Set(tokens.map((t) => t.creator).filter(Boolean))] as string[];\n const feeMap = new Map<string, bigint>();\n\n for (let i = 0; i < creators.length; i += 10) {\n const batch = creators.slice(i, i + 10);\n const results = await Promise.allSettled(\n batch.map(async (addr) => {\n const balance = (await rm.balances(addr)) as bigint;\n return { addr, balance };\n }),\n );\n for (const result of results) {\n if (result.status === \"fulfilled\") {\n feeMap.set(result.value.addr, result.value.balance);\n }\n }\n }\n\n const agents: NetworkAgent[] = tokens.map((t) => {\n const creator = t.creator ?? \"unknown\";\n const claimable = feeMap.get(creator) ?? 0n;\n return {\n tokenAddress: t.tokenAddress,\n name: t.name || \"unnamed\",\n symbol: t.symbol || \"???\",\n creator,\n marketCapETH: formatMarketCap(t.marketCapETH),\n claimableETH: formatEthWei(claimable),\n image: t.image || \"\",\n };\n });\n\n if (json) {\n console.log(JSON.stringify({ success: true, count: agents.length, agents }, null, 2));\n return;\n }\n\n console.log(`\\nthe moltlaunch network — ${agents.length} agent(s) (basic mode)\\n`);\n\n for (const agent of agents) {\n console.log(` ${agent.name} (${agent.symbol})`);\n console.log(` Token: ${agent.tokenAddress}`);\n console.log(` Creator: ${truncate(agent.creator)}`);\n console.log(` MCap: ${agent.marketCapETH}`);\n console.log(` Fees: ${agent.claimableETH}`);\n console.log(` Trade: ${CHAIN.mainnet.flaunchUrl}/coin/${agent.tokenAddress}`);\n console.log();\n }\n\n console.log(`${agents.length} agent(s) on the moltlaunch network\\n`);\n}\n\nexport async function network(opts: NetworkOpts): Promise<void> {\n const { json } = opts;\n\n try {\n // Try worker API first for rich data\n let workerState: WorkerNetworkState | null = null;\n try {\n workerState = await fetchWorkerState();\n } catch {\n if (!json) console.log(\"Worker unavailable, falling back to basic mode...\\n\");\n }\n\n if (workerState && workerState.agents.length > 0) {\n if (json) {\n let sorted = sortAgents(workerState.agents, opts.sort);\n if (opts.limit > 0) sorted = sorted.slice(0, opts.limit);\n console.log(JSON.stringify({\n success: true,\n count: sorted.length,\n totalCount: workerState.agents.length,\n goal: workerState.goal ?? null,\n agents: sorted,\n }, null, 2));\n return;\n }\n\n if (workerState.goal) {\n console.log(`\\n ⬡ Goal: ${workerState.goal.name} (${Math.round(workerState.goal.weight * 100)}% of score)`);\n console.log(` ${workerState.goal.description}\\n`);\n }\n\n const memoMap = buildMemoMap(workerState.swaps);\n renderRichOutput(workerState.agents, memoMap, opts, !!workerState.goal);\n return;\n }\n\n // Fallback: direct Flaunch API\n if (!json) console.log(\"\\nDiscovering moltlaunch agents...\\n\");\n\n const tokens = await fetchAllTokensFallback();\n if (tokens.length === 0) {\n if (json) {\n console.log(JSON.stringify({ success: true, agents: [], count: 0 }));\n } else {\n console.log(\"No agents found. Be the first: npx moltlaunch launch\\n\");\n }\n return;\n }\n\n if (!json) console.log(`Found ${tokens.length} agent(s). Fetching fees...\\n`);\n await renderFallback(tokens, json);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n printError(message, json, EXIT_CODES.GENERAL);\n process.exit(EXIT_CODES.GENERAL);\n }\n}\n","import { WORKER_API_URL } from \"../lib/config.js\";\nimport { printError } from \"../lib/output.js\";\nimport { EXIT_CODES } from \"../lib/errors.js\";\nimport type { SwapEvent, WorkerNetworkState } from \"../types.js\";\n\ninterface FeedOpts {\n json: boolean;\n memosOnly: boolean;\n crossOnly: boolean;\n agentFilter?: string;\n limit: number;\n}\n\nfunction relativeTime(timestamp: number): string {\n const now = Date.now() / 1000;\n const diff = Math.max(0, now - timestamp);\n\n if (diff < 60) return \"now\";\n if (diff < 3600) return `${Math.floor(diff / 60)}m`;\n if (diff < 86400) return `${Math.floor(diff / 3600)}h`;\n return `${Math.floor(diff / 86400)}d`;\n}\n\nfunction formatEthCompact(value: number): string {\n if (value >= 1) return `${value.toFixed(4)} ETH`;\n if (value >= 0.001) return `${value.toFixed(4)} ETH`;\n if (value === 0) return \"0 ETH\";\n return `${value.toExponential(2)} ETH`;\n}\n\nfunction truncateAddress(addr: string): string {\n return addr.slice(0, 6) + \"...\" + addr.slice(-4);\n}\n\nfunction truncateMemo(memo: string, maxLen: number): string {\n if (memo.length <= maxLen) return memo;\n return memo.slice(0, maxLen - 3) + \"...\";\n}\n\nfunction makerLabel(swap: SwapEvent): string {\n if (swap.makerName) return swap.makerName;\n return truncateAddress(swap.maker);\n}\n\nfunction filterSwaps(swaps: SwapEvent[], opts: FeedOpts): SwapEvent[] {\n let filtered = swaps;\n\n if (opts.memosOnly) {\n filtered = filtered.filter((s) => s.memo);\n }\n\n if (opts.crossOnly) {\n filtered = filtered.filter((s) => s.isCrossTrade);\n }\n\n if (opts.agentFilter) {\n const query = opts.agentFilter.toLowerCase();\n filtered = filtered.filter(\n (s) =>\n s.makerName?.toLowerCase().includes(query) ||\n s.tokenSymbol.toLowerCase().includes(query) ||\n s.tokenName.toLowerCase().includes(query),\n );\n }\n\n return filtered.slice(0, opts.limit);\n}\n\nfunction renderHuman(swaps: SwapEvent[], totalBeforeLimit: number): void {\n const memoCount = swaps.filter((s) => s.memo).length;\n const suffix = memoCount > 0 ? ` — ${memoCount} with memos` : \"\";\n console.log(`\\nthe moltlaunch feed — ${totalBeforeLimit} swap(s)${suffix}\\n`);\n\n if (swaps.length === 0) {\n console.log(\" no swaps match your filters\\n\");\n return;\n }\n\n for (const swap of swaps) {\n const time = relativeTime(swap.timestamp).padStart(4);\n const side = swap.type === \"buy\" ? \"BUY \" : \"SELL\";\n const symbol = swap.tokenSymbol.padEnd(12);\n const eth = formatEthCompact(swap.amountETH).padEnd(14);\n const maker = makerLabel(swap);\n const cross = swap.isCrossTrade ? \" [cross]\" : \"\";\n\n console.log(` ${time} ${side} ${symbol} ${eth} by ${maker}${cross}`);\n\n if (swap.memo) {\n console.log(` memo: \"${truncateMemo(swap.memo, 120)}\"`);\n }\n\n console.log();\n }\n\n if (swaps.length < totalBeforeLimit) {\n console.log(`${swaps.length} shown of ${totalBeforeLimit} total\\n`);\n }\n}\n\nfunction renderJson(swaps: SwapEvent[]): void {\n console.log(JSON.stringify({ success: true, count: swaps.length, swaps }, null, 2));\n}\n\nexport async function feed(opts: FeedOpts): Promise<void> {\n try {\n const res = await fetch(`${WORKER_API_URL}/api/network`);\n if (!res.ok) throw new Error(`Worker API error: ${res.status}`);\n\n const state = (await res.json()) as WorkerNetworkState;\n const allSwaps = state.swaps ?? [];\n const filtered = filterSwaps(allSwaps, opts);\n // Show count of matching swaps (before limit), not raw total\n const hasFilters = opts.memosOnly || opts.crossOnly || !!opts.agentFilter;\n const totalCount = hasFilters\n ? filterSwaps(allSwaps, { ...opts, limit: Infinity }).length\n : allSwaps.length;\n\n if (opts.json) {\n renderJson(filtered);\n } else {\n renderHuman(filtered, totalCount);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n printError(message, opts.json, EXIT_CODES.GENERAL);\n process.exit(EXIT_CODES.GENERAL);\n }\n}\n","import { ethers } from \"ethers\";\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { CHAIN, WORKER_API_URL, MULTICALL3_ADDRESS } from \"../lib/config.js\";\nimport { printError } from \"../lib/output.js\";\nimport { EXIT_CODES } from \"../lib/errors.js\";\nimport type { Network, WorkerNetworkState, Holding } from \"../types.js\";\n\nconst ERC20_BALANCE_OF = \"function balanceOf(address) external view returns (uint256)\";\nconst MULTICALL3_ABI = [\n \"function aggregate3(tuple(address target, bool allowFailure, bytes callData)[] calls) external view returns (tuple(bool success, bytes returnData)[])\",\n];\n\ninterface HoldingsOpts {\n json: boolean;\n testnet: boolean;\n}\n\nexport async function holdings(opts: HoldingsOpts): Promise<void> {\n const { json, testnet } = opts;\n const network: Network = testnet ? \"testnet\" : \"mainnet\";\n const chain = testnet ? CHAIN.testnet : CHAIN.mainnet;\n\n try {\n const { wallet } = await loadOrCreateWallet();\n\n if (!json) console.log(`\\nChecking holdings for ${wallet.address}...\\n`);\n\n // Fetch all token addresses from worker\n let tokens: { address: string; name: string; symbol: string }[] = [];\n try {\n const res = await fetch(`${WORKER_API_URL}/api/network`);\n if (!res.ok) throw new Error(`Worker API error: ${res.status}`);\n const state = (await res.json()) as WorkerNetworkState;\n tokens = state.agents.map((a) => ({\n address: a.tokenAddress,\n name: a.name,\n symbol: a.symbol,\n }));\n } catch {\n if (!json) console.log(\"Could not reach network API. No tokens to check.\\n\");\n if (json) console.log(JSON.stringify({ success: false, error: \"Network API unreachable\" }));\n return;\n }\n\n if (tokens.length === 0) {\n if (json) {\n console.log(JSON.stringify({ success: true, holdings: [], count: 0 }));\n } else {\n console.log(\"No tokens in the network yet.\\n\");\n }\n return;\n }\n\n // Batch balanceOf calls via Multicall3\n const provider = new ethers.JsonRpcProvider(chain.rpcUrl);\n const multicall = new ethers.Contract(MULTICALL3_ADDRESS, MULTICALL3_ABI, provider);\n const erc20Iface = new ethers.Interface([ERC20_BALANCE_OF]);\n\n const calls = tokens.map((t) => ({\n target: t.address,\n allowFailure: true,\n callData: erc20Iface.encodeFunctionData(\"balanceOf\", [wallet.address]),\n }));\n\n const results = (await multicall.aggregate3.staticCall(calls)) as {\n success: boolean;\n returnData: string;\n }[];\n\n const holdings: Holding[] = [];\n\n for (let i = 0; i < tokens.length; i++) {\n const result = results[i];\n if (!result.success) continue;\n\n try {\n const [balance] = erc20Iface.decodeFunctionResult(\"balanceOf\", result.returnData) as [bigint];\n if (balance > 0n) {\n holdings.push({\n name: tokens[i].name,\n symbol: tokens[i].symbol,\n tokenAddress: tokens[i].address,\n balance: ethers.formatEther(balance),\n balanceWei: balance.toString(),\n });\n }\n } catch {\n // Skip tokens with decode errors\n }\n }\n\n if (json) {\n console.log(JSON.stringify({ success: true, count: holdings.length, holdings }, null, 2));\n return;\n }\n\n if (holdings.length === 0) {\n console.log(\"You don't hold any tokens in the network.\\n\");\n return;\n }\n\n console.log(`Your holdings — ${chain.name}\\n`);\n\n for (const h of holdings) {\n const formatted = parseFloat(h.balance).toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n console.log(` ${h.name} (${h.symbol})`);\n console.log(` Balance: ${formatted} ${h.symbol}`);\n console.log(` Token: ${h.tokenAddress}`);\n console.log();\n }\n\n console.log(`${holdings.length} token(s) held\\n`);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n printError(message, json, EXIT_CODES.GENERAL);\n process.exit(EXIT_CODES.GENERAL);\n }\n}\n","import { loadWallet, getWalletBalance } from \"../lib/wallet.js\";\nimport { printError } from \"../lib/output.js\";\nimport { EXIT_CODES, MltlError, NoWalletError } from \"../lib/errors.js\";\n\ninterface FundOpts {\n json: boolean;\n}\n\nconst FUNDING_METHODS = [\n { method: \"Base Bridge\", url: \"https://bridge.base.org\" },\n { method: \"Coinbase\", url: \"https://www.coinbase.com\" },\n { method: \"Direct transfer\", description: \"Send ETH on Base to the address above\" },\n] as const;\n\nexport async function fund(opts: FundOpts): Promise<void> {\n const { json } = opts;\n\n try {\n const data = await loadWallet();\n if (!data) throw new NoWalletError();\n\n let balance: string | null = null;\n try {\n balance = await getWalletBalance(data.address, \"mainnet\");\n } catch {\n // RPC may be unreachable\n }\n\n if (json) {\n console.log(JSON.stringify({\n success: true,\n address: data.address,\n balance,\n network: \"Base\",\n chainId: 8453,\n fundingMethods: FUNDING_METHODS,\n message: `Send Base ETH to ${data.address} to fund this agent`,\n }, null, 2));\n return;\n }\n\n console.log(\"\\nFund your agent wallet\\n\");\n console.log(` Address: ${data.address}`);\n console.log(` Balance: ${balance ?? \"unknown\"} ETH (Base)`);\n console.log();\n console.log(\" How to fund:\");\n console.log(\" 1. Base Bridge: https://bridge.base.org\");\n console.log(\" 2. Coinbase: https://www.coinbase.com\");\n console.log(\" 3. Direct: Send ETH on Base to the address above\");\n console.log();\n } catch (error) {\n if (error instanceof MltlError) {\n printError(error.message, json, error.exitCode);\n process.exit(error.exitCode);\n }\n const message = error instanceof Error ? error.message : String(error);\n printError(message, json, EXIT_CODES.GENERAL);\n process.exit(EXIT_CODES.GENERAL);\n }\n}\n","import { ethers } from \"ethers\";\nimport { fetchTokenDetails, fetchTokenHolderCount } from \"../lib/flaunch-api.js\";\nimport { CHAIN } from \"../lib/config.js\";\nimport { printError } from \"../lib/output.js\";\nimport { EXIT_CODES, MltlError } from \"../lib/errors.js\";\nimport type { Network } from \"../types.js\";\n\ninterface PriceOpts {\n token: string;\n amount?: string;\n json: boolean;\n testnet: boolean;\n}\n\n/** Parse a wei string safely — returns the formatted ETH string or the raw value if not integer */\nfunction parseWei(value: string): string {\n if (/^\\d+$/.test(value)) {\n return ethers.formatEther(BigInt(value));\n }\n // Already decimal or unexpected format — pass through\n return value;\n}\n\nexport async function price(opts: PriceOpts): Promise<void> {\n const { token, json } = opts;\n const network: Network = opts.testnet ? \"testnet\" : \"mainnet\";\n const chain = CHAIN[network];\n\n try {\n if (!/^0x[a-fA-F0-9]{40}$/.test(token)) {\n throw new Error(\"Invalid token address — expected 0x followed by 40 hex characters\");\n }\n\n if (opts.amount !== undefined) {\n const parsed = parseFloat(opts.amount);\n if (isNaN(parsed) || parsed <= 0) {\n throw new Error(`Invalid amount: ${opts.amount} — must be a positive number`);\n }\n }\n\n if (!json) console.log(`\\nFetching token details...\\n`);\n\n const [details, holders] = await Promise.all([\n fetchTokenDetails(token, network),\n fetchTokenHolderCount(token, network).catch(() => null),\n ]);\n\n const marketCapETH = parseWei(details.price.marketCapETH);\n const volume24hETH = parseWei(details.volume.volume24h);\n const flaunchUrl = `${chain.flaunchUrl}/coin/${token}`;\n\n if (json) {\n const output: Record<string, unknown> = {\n success: true,\n tokenAddress: details.tokenAddress,\n name: details.name,\n symbol: details.symbol,\n description: details.description,\n image: details.image,\n marketCapETH,\n priceChange24h: details.price.priceChange24h,\n volume24hETH,\n holders,\n creator: details.status.owner,\n createdAt: new Date(details.status.createdAt * 1000).toISOString(),\n flaunchUrl,\n network: chain.name,\n };\n\n if (opts.amount) {\n const spendETH = parseFloat(opts.amount);\n const mcapETH = parseFloat(marketCapETH);\n const percentOfMcap = mcapETH > 0 ? ((spendETH / mcapETH) * 100).toFixed(2) : null;\n output.estimate = {\n spendETH: opts.amount,\n percentOfMcap,\n note: \"Approximate — actual output depends on pool liquidity and slippage\",\n };\n }\n\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n // Human-readable output\n const mcapFormatted = formatEthDisplay(parseFloat(marketCapETH));\n const volFormatted = formatEthDisplay(parseFloat(volume24hETH));\n const changeStr = formatChange(details.price.priceChange24h);\n\n console.log(` ${details.name} (${details.symbol})`);\n console.log(` ${details.tokenAddress}\\n`);\n if (details.description) {\n console.log(` ${details.description}\\n`);\n }\n console.log(` Market cap: ${mcapFormatted}`);\n console.log(` 24h change: ${changeStr}`);\n console.log(` 24h volume: ${volFormatted}`);\n console.log(` Holders: ${holders ?? \"unknown\"}`);\n console.log(` Creator: ${details.status.owner}`);\n console.log(` Trade: ${flaunchUrl}`);\n\n if (opts.amount) {\n const spendETH = parseFloat(opts.amount);\n const mcapETH = parseFloat(marketCapETH);\n const pct = mcapETH > 0 ? ((spendETH / mcapETH) * 100).toFixed(2) : \"N/A\";\n console.log();\n console.log(` Estimate for ${opts.amount} ETH:`);\n console.log(` ~${pct}% of market cap`);\n console.log(` Actual output depends on pool liquidity and slippage`);\n }\n\n console.log();\n } catch (error) {\n if (error instanceof MltlError) {\n printError(error.message, json, error.exitCode);\n process.exit(error.exitCode);\n }\n const message = error instanceof Error ? error.message : String(error);\n printError(message, json, EXIT_CODES.GENERAL);\n process.exit(EXIT_CODES.GENERAL);\n }\n}\n\nfunction formatEthDisplay(eth: number): string {\n if (eth >= 1_000) return `${(eth / 1_000).toFixed(1)}k ETH`;\n if (eth >= 1) return `${eth.toFixed(4)} ETH`;\n if (eth >= 0.001) return `${eth.toFixed(6)} ETH`;\n if (eth === 0) return \"0 ETH\";\n return `${eth.toExponential(2)} ETH`;\n}\n\nfunction formatChange(change: string): string {\n const num = parseFloat(change);\n if (isNaN(num)) return change;\n const sign = num >= 0 ? \"+\" : \"\";\n return `${sign}${num.toFixed(2)}%`;\n}\n"],"mappings":"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","names":["access","wallet","network","readFile","resolve","readFile","network","network","price","base","network","access","wallet","ethers","ethers","network","ethers","network","ethers","ethers","REVENUE_MANAGER_ABI","network","ethers","network","network","ethers","REVENUE_MANAGER_ABI","ethers","formatMarketCap","swap","swap","ethers","network","wallet","ethers","holdings","ethers","ethers","network","require"]}
|
package/package.json
CHANGED