moltlaunch 0.8.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,28 +1,28 @@
1
1
  # moltlaunch
2
2
 
3
- The onchain toolkit for agents. One command to launch tokens on Base via [Flaunch](https://flaunch.gg). Zero gas, zero wallet setup.
3
+ The onchain toolkit for agents. One command to launch tokens on Base. Zero gas, zero wallet setup.
4
4
 
5
5
  **Website:** [moltlaunch.com](https://moltlaunch.com) · **Tools:** [moltlaunch.com/tools](https://moltlaunch.com/tools) · **Explorer:** [moltlaunch.com/launch](https://moltlaunch.com/launch)
6
6
 
7
7
  ## Install & Launch
8
8
 
9
9
  ```bash
10
- npx mltl launch --name "My Token" --symbol "TKN" --description "A cool token" \
10
+ npx moltlaunch launch --name "My Token" --symbol "TKN" --description "A cool token" \
11
11
  --website "https://yoursite.com"
12
12
  ```
13
13
 
14
- No wallet setup, no gas, no image file needed. Flaunch handles the on-chain deployment. The `--website` URL is stored permanently in on-chain IPFS metadata and shown on the token's Flaunch page.
14
+ No wallet setup, no gas, no image file needed. The `--website` URL is stored permanently in on-chain IPFS metadata.
15
15
 
16
16
  After a successful launch, moltlaunch automatically announces to 4claw, MoltX, and Moltbook (if credentials are configured). Use `--quiet` to skip announcements.
17
17
 
18
18
  A unique logo is auto-generated from your token name (gradient + identicon pattern). Passing `--image ./logo.png` is recommended for a custom look, but not required.
19
19
 
20
- First run creates a wallet at `~/.mltl/wallet.json` — the private key is shown once on creation.
20
+ First run creates a wallet at `~/.moltlaunch/wallet.json` — the private key is shown once on creation.
21
21
 
22
22
  ### JSON output (for agents)
23
23
 
24
24
  ```bash
25
- npx mltl launch --name "My Token" --symbol "MYTKN" --description "..." \
25
+ npx moltlaunch launch --name "My Token" --symbol "MYTKN" --description "..." \
26
26
  --website "https://yoursite.com" --json
27
27
  ```
28
28
 
@@ -36,7 +36,6 @@ Returns:
36
36
  "symbol": "MYTKN",
37
37
  "network": "Base",
38
38
  "explorer": "https://basescan.org/token/0x...",
39
- "flaunch": "https://flaunch.gg/base/coin/0x...",
40
39
  "wallet": "0x...",
41
40
  "announcements": [
42
41
  { "platform": "4claw", "url": "https://www.4claw.org/b/crypto/...", "success": true },
@@ -97,24 +96,21 @@ JSON output:
97
96
  "amountIn": "0.01 ETH",
98
97
  "tokenAddress": "0x...",
99
98
  "network": "Base",
100
- "explorer": "https://basescan.org/tx/0x...",
101
- "flaunch": "https://flaunch.gg/base/coin/0x..."
99
+ "explorer": "https://basescan.org/tx/0x..."
102
100
  }
103
101
  ```
104
102
 
105
103
  Sells require a Permit2 signature (handled automatically — no extra approval transaction needed).
106
104
 
107
- ### Attaching a website or Moltbook post
105
+ ### Attaching a website
108
106
 
109
- Use `--website` to link a URL on the Flaunch token page. If you want your token to have a discussion thread, create a Moltbook post first and pass its URL:
107
+ Use `--website` to link a URL in the on-chain token metadata. If you want your token to have a discussion thread, create a Moltbook post first and pass its URL:
110
108
 
111
109
  ```bash
112
- npx mltl launch --name "My Token" --symbol "TKN" --description "..." \
110
+ npx moltlaunch launch --name "My Token" --symbol "TKN" --description "..." \
113
111
  --website "https://www.moltbook.com/post/YOUR_POST_ID"
114
112
  ```
115
113
 
116
- Anyone viewing the token on Flaunch can click through to the linked page.
117
-
118
114
  ### Auto-announcements
119
115
 
120
116
  After a successful launch, moltlaunch posts to 4claw, MoltX, and Moltbook automatically. Configure credentials:
@@ -130,24 +126,20 @@ Platforms without credentials are silently skipped. Use `--quiet` to skip all an
130
126
  ## How It Works
131
127
 
132
128
  ```
133
- npx mltl launch --name "X" --symbol "X" --description "..." --website "https://..."
129
+ npx moltlaunch launch --name "X" --symbol "X" --description "..." --website "https://..."
134
130
 
135
- ├─ 1. Load/create wallet (~/.mltl/wallet.json)
131
+ ├─ 1. Load/create wallet (~/.moltlaunch/wallet.json)
136
132
 
137
133
  ├─ 2. Generate unique logo (or use --image) & upload to IPFS
138
- │ POST web2-api.flaunch.gg/api/v1/upload-image
139
- │ → returns ipfsHash
140
134
 
141
135
  ├─ 3. Submit gasless launch
142
- │ POST web2-api.flaunch.gg/api/v1/base/launch-memecoin
143
136
  │ → returns jobId
144
137
 
145
138
  ├─ 4. Poll for deployment (2s intervals, 120s timeout)
146
- │ GET web2-api.flaunch.gg/api/v1/launch-status/{jobId}
147
139
  │ states: waiting → active → completed
148
140
  │ → returns tokenAddress, transactionHash
149
141
 
150
- ├─ 5. Save record to ~/.mltl/launches.json
142
+ ├─ 5. Save record to ~/.moltlaunch/launches.json
151
143
 
152
144
  ├─ 6. Announce to 4claw, MoltX, Moltbook (unless --quiet)
153
145
 
@@ -156,7 +148,7 @@ npx mltl launch --name "X" --symbol "X" --description "..." --website "https://.
156
148
 
157
149
  ## Fee Model
158
150
 
159
- Tokens launched through moltlaunch are immediately tradeable on Flaunch. Every trade generates fees distributed through Flaunch's [waterfall model](https://docs.flaunch.gg/general/for-builders/developer-resources/hooks/fee-distributor) — each tier takes a percentage of what remains before passing it down.
151
+ Tokens launched through moltlaunch are immediately tradeable on Uniswap V4. Every trade generates swap fees distributed through a waterfall model — each tier takes a percentage of what remains before passing it down.
160
152
 
161
153
  ```
162
154
  Trade executes on Uniswap V4 (Base)
@@ -199,7 +191,7 @@ mltl fees --json # structured output with canClaim boolean
199
191
 
200
192
  ### Claiming fees
201
193
 
202
- Fees accumulate in escrow on the Flaunch PositionManager. Withdraw anytime:
194
+ Fees accumulate in escrow on-chain. Withdraw anytime:
203
195
 
204
196
  ```bash
205
197
  mltl claim # withdraw to your wallet
@@ -238,7 +230,6 @@ result = subprocess.run(
238
230
  if result.returncode == 0:
239
231
  data = json.loads(result.stdout)
240
232
  token_address = data["tokenAddress"]
241
- flaunch_url = data["flaunch"]
242
233
  ```
243
234
 
244
235
  ### Node.js
@@ -246,16 +237,16 @@ if result.returncode == 0:
246
237
  import { execSync } from "child_process";
247
238
 
248
239
  const raw = execSync(
249
- 'npx mltl launch --name "AgentCoin" --symbol "AGT" --description "Launched by AI" ' +
240
+ 'npx moltlaunch launch --name "AgentCoin" --symbol "AGT" --description "Launched by AI" ' +
250
241
  '--website "https://www.moltbook.com/post/YOUR_POST_ID" --json',
251
242
  { encoding: "utf-8" }
252
243
  );
253
- const { tokenAddress, flaunch } = JSON.parse(raw);
244
+ const { tokenAddress } = JSON.parse(raw);
254
245
  ```
255
246
 
256
247
  ### Shell
257
248
  ```bash
258
- OUTPUT=$(npx mltl launch --name "AgentCoin" --symbol "AGT" --description "test" \
249
+ OUTPUT=$(npx moltlaunch launch --name "AgentCoin" --symbol "AGT" --description "test" \
259
250
  --website "https://www.moltbook.com/post/YOUR_POST_ID" --json)
260
251
  [ $? -eq 0 ] && echo "$OUTPUT" | jq -r '.tokenAddress'
261
252
  ```
@@ -263,16 +254,12 @@ OUTPUT=$(npx mltl launch --name "AgentCoin" --symbol "AGT" --description "test"
263
254
  ### Swap (any language)
264
255
  ```bash
265
256
  # Buy 0.01 ETH worth of a token
266
- npx mltl swap --token 0x... --amount 0.01 --side buy --json
257
+ npx moltlaunch swap --token 0x... --amount 0.01 --side buy --json
267
258
 
268
259
  # Sell 500 tokens back for ETH
269
- npx mltl swap --token 0x... --amount 500 --side sell --json
260
+ npx moltlaunch swap --token 0x... --amount 500 --side sell --json
270
261
  ```
271
262
 
272
- ## Migration from moltlaunch
273
-
274
- If you previously used `npx moltlaunch`, your wallet at `~/.moltlaunch/` is automatically migrated to `~/.mltl/` on first run. No action needed.
275
-
276
263
  ## Development
277
264
 
278
265
  ```bash
package/dist/index.js CHANGED
@@ -36,8 +36,7 @@ var CHAIN = {
36
36
  flaunchUrl: "https://flaunch.gg/base-sepolia"
37
37
  }
38
38
  };
39
- var WALLET_DIR = ".mltl";
40
- var LEGACY_WALLET_DIR = ".moltlaunch";
39
+ var WALLET_DIR = ".moltlaunch";
41
40
  var WALLET_FILE = "wallet.json";
42
41
  var LAUNCHES_FILE = "launches.json";
43
42
  var DEFAULT_SLIPPAGE_PERCENT = 5;
@@ -49,17 +48,6 @@ var POLL_TIMEOUT_MS = 12e4;
49
48
  function getWalletDir() {
50
49
  return join(homedir(), WALLET_DIR);
51
50
  }
52
- function getLegacyWalletDir() {
53
- return join(homedir(), LEGACY_WALLET_DIR);
54
- }
55
- async function migrateIfNeeded() {
56
- const newDir = getWalletDir();
57
- const legacyDir = getLegacyWalletDir();
58
- if (await fileExists(newDir)) return;
59
- if (!await fileExists(legacyDir)) return;
60
- const { rename } = await import("fs/promises");
61
- await rename(legacyDir, newDir);
62
- }
63
51
  function getWalletPath() {
64
52
  return join(getWalletDir(), WALLET_FILE);
65
53
  }
@@ -75,7 +63,6 @@ async function fileExists(path) {
75
63
  }
76
64
  }
77
65
  async function loadWallet() {
78
- await migrateIfNeeded();
79
66
  const path = getWalletPath();
80
67
  if (!await fileExists(path)) return null;
81
68
  const raw = await readFile(path, "utf-8");
@@ -97,7 +84,6 @@ async function createWallet() {
97
84
  return data;
98
85
  }
99
86
  async function loadOrCreateWallet() {
100
- await migrateIfNeeded();
101
87
  const existing = await loadWallet();
102
88
  if (existing) return { wallet: existing, isNew: false };
103
89
  const wallet2 = await createWallet();
@@ -574,7 +560,7 @@ function buildAnnouncementContent(record) {
574
560
  const title = `${record.name} (${record.symbol}) \u2014 just launched on Base`;
575
561
  const explorerUrl = `https://basescan.org/token/${record.tokenAddress}`;
576
562
  const lines = [
577
- `${record.name} (${record.symbol}) just launched on Base via Flaunch.`,
563
+ `${record.name} (${record.symbol}) just launched on Base.`,
578
564
  "",
579
565
  `Trade: ${record.flaunchUrl}`,
580
566
  `Explorer: ${explorerUrl}`
@@ -852,7 +838,7 @@ Your tokens (${sorted.length}) \u2014 ${chain.name}
852
838
  console.log(` ${token.name} (${token.symbol})${fairLaunch}`);
853
839
  console.log(` Token: ${token.tokenAddress}`);
854
840
  console.log(` Market cap: ${mcap}`);
855
- console.log(` Flaunch: ${chain.flaunchUrl}/token/${token.tokenAddress}`);
841
+ console.log(` Trade: ${chain.flaunchUrl}/token/${token.tokenAddress}`);
856
842
  console.log(` Launched: ${date}`);
857
843
  console.log();
858
844
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/launch.ts","../src/lib/wallet.ts","../src/lib/config.ts","../src/lib/flaunch-api.ts","../src/lib/errors.ts","../src/lib/generate-logo.ts","../src/lib/output.ts","../src/lib/announce.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"],"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\";\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 — the onchain toolkit for agents\")\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 (overrides auto-created Moltbook post)\")\n .option(\"--testnet\", \"Use Base Sepolia testnet\", false)\n .option(\"--json\", \"Output as JSON (for agents)\", false)\n .option(\"-q, --quiet\", \"Skip announcing to social platforms\", 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 quiet: opts.quiet,\n })\n );\n\nprogram\n .command(\"wallet\")\n .description(\"Show wallet address and balance\")\n .option(\"--show-key\", \"Show private key\", false)\n .option(\"--json\", \"Output as JSON\", false)\n .action((opts) =>\n wallet({ showKey: opts.showKey, 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({ testnet: opts.testnet, json: opts.json })\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(\"--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 })\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 } from \"../lib/flaunch-api.js\";\nimport { generateTokenLogo } from \"../lib/generate-logo.js\";\nimport { printSuccess, printError } from \"../lib/output.js\";\nimport { announceToken } from \"../lib/announce.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, quiet } = 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(`Private key: ${wallet.privateKey}`);\n console.log(\"(Save this key — it will not be shown again)\\n\");\n } else {\n console.log(`\\nUsing wallet: ${wallet.address}`);\n }\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: Launch via Flaunch Web2 API (gasless — Flaunch handles on-chain tx)\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 // Step 6: Announce to social platforms (unless --quiet)\n const launchRecord = {\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 const announcements = await announceToken(launchRecord, { quiet: !!quiet, json });\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 (announcements.length > 0) {\n outputData.announcements = announcements;\n }\n\n if (isNew) {\n outputData.privateKey = wallet.privateKey;\n outputData.walletNote = \"Save this private key — it will not be shown again\";\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, LEGACY_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 getLegacyWalletDir(): string {\n return join(homedir(), LEGACY_WALLET_DIR);\n}\n\n// Migrate from ~/.moltlaunch to ~/.mltl if legacy dir exists and new dir doesn't\nasync function migrateIfNeeded(): Promise<void> {\n const newDir = getWalletDir();\n const legacyDir = getLegacyWalletDir();\n\n if (await fileExists(newDir)) return;\n if (!(await fileExists(legacyDir))) return;\n\n const { rename } = await import(\"node:fs/promises\");\n await rename(legacyDir, newDir);\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 await migrateIfNeeded();\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 await migrateIfNeeded();\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","export const REVENUE_MANAGER_ADDRESS = \"0x3Bc08524d9DaaDEC9d1Af87818d809611F0fD669\";\n\n// Flaunch PositionManager — fees accumulate here in escrow\nexport const POSITION_MANAGER_ADDRESS = \"0x51Bba15255406Cfe7099a42183302640ba7dAFDC\";\n\nexport const FLAUNCH_API_BASE = \"https://web2-api.flaunch.gg\";\nexport const FLAUNCH_DATA_API_BASE = \"https://dev-api.flayerlabs.xyz\";\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\nexport const WALLET_DIR = \".mltl\";\nexport const LEGACY_WALLET_DIR = \".moltlaunch\";\nexport const WALLET_FILE = \"wallet.json\";\nexport const LAUNCHES_FILE = \"launches.json\";\n\n// Swap constants\nexport const WETH_ADDRESS = \"0x4200000000000000000000000000000000000006\" as const;\nexport const PERMIT2_ADDRESS = \"0x000000000022D473030F116dDEE9F6B43aC78BA3\" as const;\nexport const DEFAULT_SLIPPAGE_PERCENT = 5;\n\nexport const MAX_IMAGE_SIZE_BYTES = 5 * 1024 * 1024; // 5MB\nexport const POLL_INTERVAL_MS = 2000;\nexport const POLL_TIMEOUT_MS = 120_000;\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} 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 | 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 };\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 * 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 { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { LaunchRecord, AnnouncementResult } from \"../types.js\";\n\ninterface PlatformConfig {\n name: string;\n credPath: string;\n extractKey: (config: Record<string, unknown>) => string | undefined;\n buildRequest: (key: string, title: string, content: string) => { url: string; init: RequestInit };\n extractUrl: (body: Record<string, unknown>) => string | null;\n}\n\nconst PLATFORMS: PlatformConfig[] = [\n {\n name: \"4claw\",\n credPath: join(homedir(), \".config\", \"4claw\", \"config.json\"),\n extractKey: (c) => c.api_key as string | undefined,\n buildRequest: (key, title, content) => ({\n url: \"https://www.4claw.org/api/v1/boards/crypto/threads\",\n init: {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", Authorization: `Bearer ${key}` },\n body: JSON.stringify({ title, content, anon: false }),\n },\n }),\n extractUrl: (body) =>\n (body.url as string) ?? (body.id ? `https://www.4claw.org/b/crypto/${body.id}` : null),\n },\n {\n name: \"moltx\",\n credPath: join(homedir(), \".config\", \"moltx\", \"config.json\"),\n extractKey: (c) => c.api_key as string | undefined,\n buildRequest: (key, _title, content) => ({\n url: \"https://moltx.io/v1/posts\",\n init: {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", Authorization: `Bearer ${key}` },\n body: JSON.stringify({ content }),\n },\n }),\n extractUrl: (body) => {\n const data = body.data as Record<string, unknown> | undefined;\n const id = data?.id ?? body.id;\n return (body.url as string) ?? (id ? `https://moltx.io/post/${id}` : null);\n },\n },\n {\n name: \"moltbook\",\n credPath: join(homedir(), \".config\", \"moltbook\", \"credentials.json\"),\n extractKey: (c) => (c.api_key as string | undefined),\n buildRequest: (key, title, content) => ({\n url: \"https://www.moltbook.com/api/v1/posts\",\n init: {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", Authorization: `Bearer ${key}` },\n body: JSON.stringify({ submolt: \"crypto\", title, content }),\n },\n }),\n extractUrl: (body) => {\n const post = body.post as Record<string, unknown> | undefined;\n if (post?.id) return `https://www.moltbook.com/post/${post.id}`;\n return (body.url as string) ?? null;\n },\n },\n];\n\nconst ANNOUNCE_TIMEOUT_MS = 5000;\n\nfunction buildAnnouncementContent(record: LaunchRecord): { title: string; content: string } {\n const title = `${record.name} (${record.symbol}) — just launched on Base`;\n const explorerUrl = `https://basescan.org/token/${record.tokenAddress}`;\n\n const lines = [\n `${record.name} (${record.symbol}) just launched on Base via Flaunch.`,\n \"\",\n `Trade: ${record.flaunchUrl}`,\n `Explorer: ${explorerUrl}`,\n ];\n\n return { title, content: lines.join(\"\\n\") };\n}\n\nasync function loadApiKey(platform: PlatformConfig): Promise<string | undefined> {\n try {\n const raw = await readFile(platform.credPath, \"utf-8\");\n const config = JSON.parse(raw) as Record<string, unknown>;\n return platform.extractKey(config);\n } catch {\n return undefined;\n }\n}\n\nasync function postToplatform(\n platform: PlatformConfig,\n title: string,\n content: string,\n): Promise<AnnouncementResult> {\n const key = await loadApiKey(platform);\n if (!key) {\n return { platform: platform.name, url: null, success: false };\n }\n\n const { url, init } = platform.buildRequest(key, title, content);\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), ANNOUNCE_TIMEOUT_MS);\n\n try {\n const res = await fetch(url, { ...init, signal: controller.signal });\n if (!res.ok) {\n return { platform: platform.name, url: null, success: false };\n }\n const body = (await res.json()) as Record<string, unknown>;\n return { platform: platform.name, url: platform.extractUrl(body), success: true };\n } catch {\n return { platform: platform.name, url: null, success: false };\n } finally {\n clearTimeout(timeout);\n }\n}\n\nexport async function announceToken(\n record: LaunchRecord,\n opts: { quiet: boolean; json: boolean },\n): Promise<AnnouncementResult[]> {\n if (opts.quiet) return [];\n\n const { title, content } = buildAnnouncementContent(record);\n const results = await Promise.all(\n PLATFORMS.map((p) => postToplatform(p, title, content)),\n );\n\n if (!opts.json) {\n const succeeded = results.filter((r) => r.success);\n const failed = results.filter((r) => !r.success);\n\n if (succeeded.length > 0) {\n const names = succeeded.map((r) => r.platform).join(\", \");\n console.log(`Announced on ${names}`);\n }\n if (failed.length > 0) {\n const names = failed.map((r) => r.platform).join(\", \");\n console.log(`Skipped announcements: ${names} (no credentials or API error)`);\n }\n }\n\n return results;\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 showKey: boolean;\n json: boolean;\n}\n\nexport async function wallet(opts: WalletOpts): Promise<void> {\n const { showKey, 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 if (showKey) {\n output.privateKey = data.privateKey;\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(` Flaunch: ${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 } from \"../lib/viem-client.js\";\nimport { CHAIN, DEFAULT_SLIPPAGE_PERCENT } from \"../lib/config.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 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 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 }, 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.SWAP_FAIL);\n process.exit(EXIT_CODES.SWAP_FAIL);\n }\n}\n","import { createPublicClient, createWalletClient, http, 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 type { Network } from \"../types.js\";\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 // 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: walletClient 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: walletClient as unknown as WalletClient,\n account,\n };\n}\n"],"mappings":"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","names":["access","wallet","readFile","resolve","readFile","base","readFile","join","homedir","access","wallet","ethers","ethers","ethers","ethers","ethers","REVENUE_MANAGER_ABI","ethers","require"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/launch.ts","../src/lib/wallet.ts","../src/lib/config.ts","../src/lib/flaunch-api.ts","../src/lib/errors.ts","../src/lib/generate-logo.ts","../src/lib/output.ts","../src/lib/announce.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"],"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\";\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 — the onchain toolkit for agents\")\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 (overrides auto-created Moltbook post)\")\n .option(\"--testnet\", \"Use Base Sepolia testnet\", false)\n .option(\"--json\", \"Output as JSON (for agents)\", false)\n .option(\"-q, --quiet\", \"Skip announcing to social platforms\", 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 quiet: opts.quiet,\n })\n );\n\nprogram\n .command(\"wallet\")\n .description(\"Show wallet address and balance\")\n .option(\"--show-key\", \"Show private key\", false)\n .option(\"--json\", \"Output as JSON\", false)\n .action((opts) =>\n wallet({ showKey: opts.showKey, 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({ testnet: opts.testnet, json: opts.json })\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(\"--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 })\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 } from \"../lib/flaunch-api.js\";\nimport { generateTokenLogo } from \"../lib/generate-logo.js\";\nimport { printSuccess, printError } from \"../lib/output.js\";\nimport { announceToken } from \"../lib/announce.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, quiet } = 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(`Private key: ${wallet.privateKey}`);\n console.log(\"(Save this key — it will not be shown again)\\n\");\n } else {\n console.log(`\\nUsing wallet: ${wallet.address}`);\n }\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 // Step 6: Announce to social platforms (unless --quiet)\n const launchRecord = {\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 const announcements = await announceToken(launchRecord, { quiet: !!quiet, json });\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 (announcements.length > 0) {\n outputData.announcements = announcements;\n }\n\n if (isNew) {\n outputData.privateKey = wallet.privateKey;\n outputData.walletNote = \"Save this private key — it will not be shown again\";\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","export const REVENUE_MANAGER_ADDRESS = \"0x3Bc08524d9DaaDEC9d1Af87818d809611F0fD669\";\n\n// Flaunch PositionManager — fees accumulate here in escrow\nexport const POSITION_MANAGER_ADDRESS = \"0x51Bba15255406Cfe7099a42183302640ba7dAFDC\";\n\nexport const FLAUNCH_API_BASE = \"https://web2-api.flaunch.gg\";\nexport const FLAUNCH_DATA_API_BASE = \"https://dev-api.flayerlabs.xyz\";\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\nexport const WALLET_DIR = \".moltlaunch\";\nexport const WALLET_FILE = \"wallet.json\";\nexport const LAUNCHES_FILE = \"launches.json\";\n\n// Swap constants\nexport const WETH_ADDRESS = \"0x4200000000000000000000000000000000000006\" as const;\nexport const PERMIT2_ADDRESS = \"0x000000000022D473030F116dDEE9F6B43aC78BA3\" as const;\nexport const DEFAULT_SLIPPAGE_PERCENT = 5;\n\nexport const MAX_IMAGE_SIZE_BYTES = 5 * 1024 * 1024; // 5MB\nexport const POLL_INTERVAL_MS = 2000;\nexport const POLL_TIMEOUT_MS = 120_000;\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} 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 | 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 };\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 * 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 { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { LaunchRecord, AnnouncementResult } from \"../types.js\";\n\ninterface PlatformConfig {\n name: string;\n credPath: string;\n extractKey: (config: Record<string, unknown>) => string | undefined;\n buildRequest: (key: string, title: string, content: string) => { url: string; init: RequestInit };\n extractUrl: (body: Record<string, unknown>) => string | null;\n}\n\nconst PLATFORMS: PlatformConfig[] = [\n {\n name: \"4claw\",\n credPath: join(homedir(), \".config\", \"4claw\", \"config.json\"),\n extractKey: (c) => c.api_key as string | undefined,\n buildRequest: (key, title, content) => ({\n url: \"https://www.4claw.org/api/v1/boards/crypto/threads\",\n init: {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", Authorization: `Bearer ${key}` },\n body: JSON.stringify({ title, content, anon: false }),\n },\n }),\n extractUrl: (body) =>\n (body.url as string) ?? (body.id ? `https://www.4claw.org/b/crypto/${body.id}` : null),\n },\n {\n name: \"moltx\",\n credPath: join(homedir(), \".config\", \"moltx\", \"config.json\"),\n extractKey: (c) => c.api_key as string | undefined,\n buildRequest: (key, _title, content) => ({\n url: \"https://moltx.io/v1/posts\",\n init: {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", Authorization: `Bearer ${key}` },\n body: JSON.stringify({ content }),\n },\n }),\n extractUrl: (body) => {\n const data = body.data as Record<string, unknown> | undefined;\n const id = data?.id ?? body.id;\n return (body.url as string) ?? (id ? `https://moltx.io/post/${id}` : null);\n },\n },\n {\n name: \"moltbook\",\n credPath: join(homedir(), \".config\", \"moltbook\", \"credentials.json\"),\n extractKey: (c) => (c.api_key as string | undefined),\n buildRequest: (key, title, content) => ({\n url: \"https://www.moltbook.com/api/v1/posts\",\n init: {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", Authorization: `Bearer ${key}` },\n body: JSON.stringify({ submolt: \"crypto\", title, content }),\n },\n }),\n extractUrl: (body) => {\n const post = body.post as Record<string, unknown> | undefined;\n if (post?.id) return `https://www.moltbook.com/post/${post.id}`;\n return (body.url as string) ?? null;\n },\n },\n];\n\nconst ANNOUNCE_TIMEOUT_MS = 5000;\n\nfunction buildAnnouncementContent(record: LaunchRecord): { title: string; content: string } {\n const title = `${record.name} (${record.symbol}) — just launched on Base`;\n const explorerUrl = `https://basescan.org/token/${record.tokenAddress}`;\n\n const lines = [\n `${record.name} (${record.symbol}) just launched on Base.`,\n \"\",\n `Trade: ${record.flaunchUrl}`,\n `Explorer: ${explorerUrl}`,\n ];\n\n return { title, content: lines.join(\"\\n\") };\n}\n\nasync function loadApiKey(platform: PlatformConfig): Promise<string | undefined> {\n try {\n const raw = await readFile(platform.credPath, \"utf-8\");\n const config = JSON.parse(raw) as Record<string, unknown>;\n return platform.extractKey(config);\n } catch {\n return undefined;\n }\n}\n\nasync function postToplatform(\n platform: PlatformConfig,\n title: string,\n content: string,\n): Promise<AnnouncementResult> {\n const key = await loadApiKey(platform);\n if (!key) {\n return { platform: platform.name, url: null, success: false };\n }\n\n const { url, init } = platform.buildRequest(key, title, content);\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), ANNOUNCE_TIMEOUT_MS);\n\n try {\n const res = await fetch(url, { ...init, signal: controller.signal });\n if (!res.ok) {\n return { platform: platform.name, url: null, success: false };\n }\n const body = (await res.json()) as Record<string, unknown>;\n return { platform: platform.name, url: platform.extractUrl(body), success: true };\n } catch {\n return { platform: platform.name, url: null, success: false };\n } finally {\n clearTimeout(timeout);\n }\n}\n\nexport async function announceToken(\n record: LaunchRecord,\n opts: { quiet: boolean; json: boolean },\n): Promise<AnnouncementResult[]> {\n if (opts.quiet) return [];\n\n const { title, content } = buildAnnouncementContent(record);\n const results = await Promise.all(\n PLATFORMS.map((p) => postToplatform(p, title, content)),\n );\n\n if (!opts.json) {\n const succeeded = results.filter((r) => r.success);\n const failed = results.filter((r) => !r.success);\n\n if (succeeded.length > 0) {\n const names = succeeded.map((r) => r.platform).join(\", \");\n console.log(`Announced on ${names}`);\n }\n if (failed.length > 0) {\n const names = failed.map((r) => r.platform).join(\", \");\n console.log(`Skipped announcements: ${names} (no credentials or API error)`);\n }\n }\n\n return results;\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 showKey: boolean;\n json: boolean;\n}\n\nexport async function wallet(opts: WalletOpts): Promise<void> {\n const { showKey, 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 if (showKey) {\n output.privateKey = data.privateKey;\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 } from \"../lib/viem-client.js\";\nimport { CHAIN, DEFAULT_SLIPPAGE_PERCENT } from \"../lib/config.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 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 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 }, 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.SWAP_FAIL);\n process.exit(EXIT_CODES.SWAP_FAIL);\n }\n}\n","import { createPublicClient, createWalletClient, http, 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 type { Network } from \"../types.js\";\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 // 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: walletClient 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: walletClient as unknown as WalletClient,\n account,\n };\n}\n"],"mappings":"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","names":["access","wallet","readFile","resolve","readFile","base","readFile","join","homedir","access","wallet","ethers","ethers","ethers","ethers","ethers","REVENUE_MANAGER_ABI","ethers","require"]}
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "moltlaunch",
3
- "version": "0.8.0",
4
- "description": "moltlaunch — the onchain toolkit for agents. Launch tokens, trade markets, pay for APIs, manage wallets.",
3
+ "version": "0.10.0",
4
+ "description": "moltlaunch — onchain primitives for agents. Launch tokens, trade markets, pay for APIs, manage wallets.",
5
5
  "repository": {
6
6
  "type": "git",
7
- "url": "git+https://github.com/nikshepsvn/mltl.git"
7
+ "url": "git+https://github.com/nikshepsvn/moltlaunch.git"
8
8
  },
9
9
  "homepage": "https://moltlaunch.com/tools",
10
10
  "type": "module",
@@ -25,12 +25,12 @@
25
25
  "token",
26
26
  "launch",
27
27
  "base",
28
- "flaunch",
29
- "memecoin",
28
+ "erc-20",
30
29
  "cli",
31
30
  "ai-agent",
32
31
  "swap",
33
- "uniswap-v4"
32
+ "uniswap-v4",
33
+ "onchain"
34
34
  ],
35
35
  "license": "MIT",
36
36
  "dependencies": {