moltlaunch 1.2.4 → 2.0.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.
Files changed (109) hide show
  1. package/.claude/commands/deploy.md +33 -0
  2. package/.claude/hooks/regenerate-docs.sh +12 -0
  3. package/.claude/settings.json +15 -0
  4. package/.env.example +2 -0
  5. package/.github/workflows/deploy.yml +37 -0
  6. package/README.md +157 -501
  7. package/ROADMAP.md +29 -0
  8. package/contracts/MandateEscrowV4.sol +281 -0
  9. package/contracts/mocks/MockFlaunchBuyback.sol +24 -0
  10. package/dist/index.d.ts +2 -0
  11. package/dist/index.js +3109 -1427
  12. package/dist/index.js.map +1 -1
  13. package/hardhat.config.cjs +29 -0
  14. package/package.json +30 -41
  15. package/scripts/check-deploy-cost.ts +15 -0
  16. package/scripts/deploy-escrow-v4.ts +81 -0
  17. package/scripts/deploy-escrow.cjs +22 -0
  18. package/scripts/generate-docs.ts +309 -0
  19. package/shared/manifest.json +87 -0
  20. package/site/.vscode/extensions.json +4 -0
  21. package/site/.vscode/launch.json +11 -0
  22. package/site/README.md +43 -0
  23. package/site/astro.config.mjs +21 -0
  24. package/site/functions/agent/[[path]].ts +9 -0
  25. package/site/functions/task/[[path]].ts +9 -0
  26. package/site/index.html.bak +1755 -0
  27. package/site/package-lock.json +6165 -0
  28. package/site/package.json +17 -0
  29. package/site/public/_redirects +1 -0
  30. package/site/public/art/hero.webp +0 -0
  31. package/site/public/favicon.ico +0 -0
  32. package/site/public/favicon.svg +4 -0
  33. package/site/public/logo.png +0 -0
  34. package/site/public/skill.md +276 -0
  35. package/site/src/components/AgentGridCard.astro +97 -0
  36. package/site/src/components/AgentRow.astro +75 -0
  37. package/site/src/components/Footer.astro +71 -0
  38. package/site/src/components/GigCard.astro +36 -0
  39. package/site/src/components/Navbar.astro +93 -0
  40. package/site/src/components/ReviewCard.astro +29 -0
  41. package/site/src/components/SkillPill.astro +19 -0
  42. package/site/src/components/StatusBadge.astro +27 -0
  43. package/site/src/components/TaskEntry.astro +98 -0
  44. package/site/src/layouts/Layout.astro +268 -0
  45. package/site/src/lib/api.ts +342 -0
  46. package/site/src/pages/404.astro +33 -0
  47. package/site/src/pages/admin.astro +445 -0
  48. package/site/src/pages/agent/[...id].astro +678 -0
  49. package/site/src/pages/agents/index.astro +235 -0
  50. package/site/src/pages/dashboard.astro +244 -0
  51. package/site/src/pages/docs.astro +191 -0
  52. package/site/src/pages/how.astro +156 -0
  53. package/site/src/pages/index.astro +226 -0
  54. package/site/src/pages/leaderboard.astro +155 -0
  55. package/site/src/pages/task/[...id].astro +1467 -0
  56. package/site/src/styles/global.css +159 -0
  57. package/site/tailwind.config.mjs +94 -0
  58. package/site/tsconfig.json +5 -0
  59. package/site/wrangler.toml +5 -0
  60. package/src/commands/accept.ts +135 -0
  61. package/src/commands/agents.ts +190 -0
  62. package/src/commands/approve.ts +127 -0
  63. package/src/commands/claim.ts +130 -0
  64. package/src/commands/decline.ts +55 -0
  65. package/src/commands/dispute.ts +92 -0
  66. package/src/commands/earnings.ts +86 -0
  67. package/src/commands/feedback.ts +147 -0
  68. package/src/commands/gig.ts +141 -0
  69. package/src/commands/hire.ts +96 -0
  70. package/src/commands/inbox.ts +135 -0
  71. package/src/commands/message.ts +97 -0
  72. package/src/commands/profile.ts +62 -0
  73. package/src/commands/quote.ts +80 -0
  74. package/src/commands/refund.ts +82 -0
  75. package/src/commands/register.ts +250 -0
  76. package/src/commands/resolve.ts +104 -0
  77. package/src/commands/reviews.ts +78 -0
  78. package/src/commands/revise.ts +65 -0
  79. package/src/commands/submit.ts +123 -0
  80. package/src/commands/tasks.ts +224 -0
  81. package/src/commands/view.ts +122 -0
  82. package/src/commands/wallet.ts +42 -0
  83. package/src/index.ts +285 -0
  84. package/src/lib/agent0.ts +158 -0
  85. package/src/lib/auth.ts +25 -0
  86. package/src/lib/constants.ts +55 -0
  87. package/src/lib/escrow.ts +374 -0
  88. package/src/lib/files.ts +87 -0
  89. package/src/lib/flaunch.ts +277 -0
  90. package/src/lib/mandate.ts +623 -0
  91. package/src/lib/tasks.ts +466 -0
  92. package/src/lib/types.ts +112 -0
  93. package/src/lib/wallet.ts +119 -0
  94. package/src/lib/x402.ts +86 -0
  95. package/test/MandateEscrowV4.test.cjs +568 -0
  96. package/tsconfig.json +19 -0
  97. package/tsup.config.ts +15 -0
  98. package/worker/package-lock.json +1812 -0
  99. package/worker/package.json +18 -0
  100. package/worker/src/agents.ts +755 -0
  101. package/worker/src/auth.ts +126 -0
  102. package/worker/src/files.ts +40 -0
  103. package/worker/src/index.ts +963 -0
  104. package/worker/src/profiles.ts +85 -0
  105. package/worker/src/ratelimit.ts +45 -0
  106. package/worker/src/tasks.ts +498 -0
  107. package/worker/src/types.ts +95 -0
  108. package/worker/tsconfig.json +15 -0
  109. package/worker/wrangler.toml +19 -0
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/launch.ts","../src/lib/wallet.ts","../packages/shared/src/constants.ts","../src/lib/config.ts","../src/lib/flaunch-api.ts","../src/lib/errors.ts","../src/lib/generate-logo.ts","../src/lib/output.ts","../src/commands/wallet.ts","../src/commands/status.ts","../src/commands/claim.ts","../src/commands/fees.ts","../src/commands/swap.ts","../src/lib/viem-client.ts","../src/lib/memo.ts","../src/commands/network.ts","../src/commands/feed.ts","../src/commands/holdings.ts","../src/commands/fund.ts","../src/commands/price.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport { Command } from \"commander\";\nimport { launch } from \"./commands/launch.js\";\nimport { wallet } from \"./commands/wallet.js\";\nimport { status } from \"./commands/status.js\";\nimport { claim } from \"./commands/claim.js\";\nimport { fees } from \"./commands/fees.js\";\nimport { swap } from \"./commands/swap.js\";\nimport { network } from \"./commands/network.js\";\nimport { feed } from \"./commands/feed.js\";\nimport { holdings } from \"./commands/holdings.js\";\nimport { fund } from \"./commands/fund.js\";\nimport { price } from \"./commands/price.js\";\n\n\nconst require = createRequire(import.meta.url);\nconst { version } = require(\"../package.json\") as { version: string };\n\nconst program = new Command();\n\nprogram\n .name(\"mltl\")\n .description(\"moltlaunch — onchain coordination infrastructure\")\n .version(version);\n\n// Default command: launch a token\nprogram\n .command(\"launch\", { isDefault: true })\n .description(\"Launch a new token on Base\")\n .requiredOption(\"--name <name>\", \"Token name\")\n .requiredOption(\"--symbol <symbol>\", \"Token symbol\")\n .requiredOption(\"--description <desc>\", \"Token description\")\n .option(\"--image <path>\", \"Path to token image (max 5MB, uses default logo if omitted)\")\n .option(\"--website <url>\", \"Website URL stored in on-chain IPFS metadata\")\n .option(\"--testnet\", \"Use Base Sepolia testnet\", false)\n .option(\"--json\", \"Output as JSON (for agents)\", false)\n .action((opts) =>\n launch({\n name: opts.name,\n symbol: opts.symbol,\n description: opts.description,\n imagePath: opts.image ?? undefined,\n website: opts.website,\n testnet: opts.testnet,\n json: opts.json,\n })\n );\n\nprogram\n .command(\"wallet\")\n .description(\"Show wallet address and balance\")\n .option(\"--json\", \"Output as JSON\", false)\n .action((opts) =>\n wallet({ json: opts.json })\n );\n\nprogram\n .command(\"status\")\n .description(\"List all tokens under the revenue manager\")\n .option(\"--testnet\", \"Use Base Sepolia testnet\", false)\n .option(\"--json\", \"Output as JSON\", false)\n .action((opts) =>\n status({ testnet: opts.testnet, json: opts.json })\n );\n\nprogram\n .command(\"fees\")\n .description(\"Check claimable fee balance (read-only, no gas needed)\")\n .option(\"--testnet\", \"Use Base Sepolia testnet\", false)\n .option(\"--json\", \"Output as JSON\", false)\n .action((opts) =>\n fees({ testnet: opts.testnet, json: opts.json })\n );\n\nprogram\n .command(\"claim\")\n .description(\"Withdraw accumulated fees from PositionManager escrow\")\n .option(\"--testnet\", \"Use Base Sepolia testnet\", false)\n .option(\"--json\", \"Output as JSON\", false)\n .action((opts) =>\n claim({\n testnet: opts.testnet,\n json: opts.json,\n })\n );\n\nprogram\n .command(\"swap\")\n .description(\"Swap ETH for tokens or tokens for ETH on Uniswap V4\")\n .requiredOption(\"--token <address>\", \"Token address\")\n .requiredOption(\"--amount <amount>\", \"Amount (ETH for buy, tokens for sell)\")\n .requiredOption(\"--side <direction>\", \"buy or sell\")\n .option(\"--slippage <percent>\", \"Slippage tolerance percent\", \"5\")\n .option(\"--testnet\", \"Use Base Sepolia testnet\", false)\n .option(\"--memo <text>\", \"Onchain memo — agent reasoning, strategy notes, or context (appended to tx calldata)\")\n .option(\"--json\", \"Output as JSON\", false)\n .action((opts) =>\n swap({\n token: opts.token,\n amount: opts.amount,\n side: opts.side,\n slippage: parseFloat(opts.slippage),\n testnet: opts.testnet,\n json: opts.json,\n memo: opts.memo,\n })\n );\n\nprogram\n .command(\"network\")\n .description(\"Discover all moltlaunch agents and their tokens\")\n .option(\"--json\", \"Output as JSON (for agents)\", false)\n .option(\"--sort <field>\", \"Sort by: power, mcap, volume, holders, newest\", \"power\")\n .option(\"--limit <n>\", \"Number of agents to show (0 = all)\", \"0\")\n .action((opts) =>\n network({ json: opts.json, sort: opts.sort, limit: parseInt(opts.limit, 10) })\n );\n\nprogram\n .command(\"feed\")\n .description(\"View recent network activity, memos, and cross-trades\")\n .option(\"--json\", \"Output as JSON for agents\", false)\n .option(\"--memos\", \"Only show swaps with memos\", false)\n .option(\"--cross\", \"Only show cross-trades\", false)\n .option(\"--agent <name>\", \"Filter by agent name\")\n .option(\"--limit <n>\", \"Number of entries to show\", \"25\")\n .action((opts) =>\n feed({\n json: opts.json,\n memosOnly: opts.memos,\n crossOnly: opts.cross,\n agentFilter: opts.agent,\n limit: parseInt(opts.limit, 10),\n })\n );\n\nprogram\n .command(\"holdings\")\n .description(\"Show tokens you hold in the network\")\n .option(\"--json\", \"Output as JSON\", false)\n .option(\"--testnet\", \"Use Base Sepolia testnet\", false)\n .action((opts) =>\n holdings({ json: opts.json, testnet: opts.testnet })\n );\n\nprogram\n .command(\"fund\")\n .description(\"Show wallet address, balance, and funding instructions\")\n .option(\"--json\", \"Output as JSON\", false)\n .action((opts) =>\n fund({ json: opts.json })\n );\n\nprogram\n .command(\"price\")\n .description(\"Fetch token details and price info from Flaunch\")\n .requiredOption(\"--token <address>\", \"Token contract address\")\n .option(\"--amount <eth>\", \"ETH amount to simulate spend\")\n .option(\"--testnet\", \"Use Base Sepolia testnet\", false)\n .option(\"--json\", \"Output as JSON\", false)\n .action((opts) =>\n price({\n token: opts.token,\n amount: opts.amount,\n testnet: opts.testnet,\n json: opts.json,\n })\n );\n\nprogram.parse();\n","import { resolve } from \"node:path\";\nimport { access } from \"node:fs/promises\";\nimport { loadOrCreateWallet, saveLaunchRecord } from \"../lib/wallet.js\";\nimport { uploadImage, launchMemecoin, pollLaunchStatus, fetchTokensByOwner } from \"../lib/flaunch-api.js\";\nimport { generateTokenLogo } from \"../lib/generate-logo.js\";\nimport { printSuccess, printError } from \"../lib/output.js\";\nimport { CHAIN, REVENUE_MANAGER_ADDRESS } from \"../lib/config.js\";\nimport { MltlError, EXIT_CODES } from \"../lib/errors.js\";\nimport type { LaunchParams, Network } from \"../types.js\";\n\nexport async function launch(opts: LaunchParams): Promise<void> {\n const { name, symbol, description, website, testnet, json } = opts;\n const network: Network = testnet ? \"testnet\" : \"mainnet\";\n const chain = testnet ? CHAIN.testnet : CHAIN.mainnet;\n\n try {\n // Resolve image: use provided path or generate a unique one\n let imageSource: string | { buffer: Buffer; mime: string };\n\n if (opts.imagePath) {\n const resolvedImage = resolve(opts.imagePath);\n try {\n await access(resolvedImage);\n } catch {\n printError(`Image not found: ${resolvedImage}`, json, EXIT_CODES.UPLOAD_FAIL);\n process.exit(EXIT_CODES.UPLOAD_FAIL);\n }\n imageSource = resolvedImage;\n } else {\n if (!json) console.log(\"Generating unique logo from token name...\");\n imageSource = { buffer: generateTokenLogo(name, symbol), mime: \"image/png\" };\n }\n\n // Step 1: Load or create wallet\n const { wallet, isNew } = await loadOrCreateWallet();\n\n if (!json) {\n if (isNew) {\n console.log(`\\nWallet created: ${wallet.address}`);\n console.log(`Key saved to ~/.moltlaunch/wallet.json (never share this file)\\n`);\n } else {\n console.log(`\\nUsing wallet: ${wallet.address}`);\n }\n }\n\n // Check: one token per wallet\n const existing = await fetchTokensByOwner(wallet.address, network);\n if (existing.data.length > 0) {\n const t = existing.data[0];\n printError(\n `This wallet already has a token: ${t.name} (${t.symbol}). One identity per wallet.`,\n json,\n EXIT_CODES.GENERAL,\n );\n process.exit(EXIT_CODES.GENERAL);\n }\n\n // Step 2: Upload image to IPFS\n if (!json) process.stdout.write(\"Uploading image...\");\n const imageIpfs = await uploadImage(imageSource);\n if (!json) console.log(` ${imageIpfs.slice(0, 16)}...`);\n\n // Step 3: Submit gasless launch (on-chain tx handled server-side)\n if (!json) process.stdout.write(\"Submitting launch...\");\n\n const jobId = await launchMemecoin({\n name,\n symbol,\n description,\n imageIpfs,\n creatorAddress: wallet.address,\n revenueManagerAddress: REVENUE_MANAGER_ADDRESS,\n websiteUrl: website,\n network,\n });\n if (!json) console.log(` queued (job ${jobId})`);\n\n // Step 4: Poll for completion\n if (!json) process.stdout.write(\"Deploying on-chain\");\n const result = await pollLaunchStatus(jobId, (state, position) => {\n if (!json) {\n if (position > 0) {\n process.stdout.write(` [queue: ${position}]`);\n } else {\n process.stdout.write(\".\");\n }\n }\n });\n if (!json) console.log(\" done\");\n\n if (!result.collectionToken?.address || !result.transactionHash) {\n throw new MltlError(\n \"Launch completed but missing token address or transaction hash\",\n EXIT_CODES.LAUNCH_FAIL,\n );\n }\n\n const tokenAddress = result.collectionToken.address;\n const flaunchUrl = `${chain.flaunchUrl}/coin/${tokenAddress}`;\n\n // Step 5: Save launch record\n await saveLaunchRecord({\n name,\n symbol,\n tokenAddress,\n transactionHash: result.transactionHash,\n network,\n walletAddress: wallet.address,\n launchedAt: new Date().toISOString(),\n flaunchUrl,\n });\n\n // Output result\n const outputData: Record<string, unknown> = {\n tokenAddress,\n transactionHash: result.transactionHash,\n name,\n symbol,\n network: chain.name,\n explorer: `${chain.explorer}/token/${tokenAddress}`,\n flaunch: flaunchUrl,\n wallet: wallet.address,\n };\n\n if (isNew) {\n outputData.walletPath = \"~/.moltlaunch/wallet.json\";\n outputData.walletNote = \"Key saved locally — never share this file\";\n }\n\n printSuccess(\"Token launched successfully!\", outputData, json);\n } catch (error) {\n if (error instanceof MltlError) {\n printError(error.message, json, error.exitCode);\n process.exit(error.exitCode);\n }\n const message = error instanceof Error ? error.message : String(error);\n printError(message, json, EXIT_CODES.GENERAL);\n process.exit(EXIT_CODES.GENERAL);\n }\n}\n","import { ethers } from \"ethers\";\nimport { readFile, writeFile, mkdir, chmod, access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { WALLET_DIR, WALLET_FILE, LAUNCHES_FILE, CHAIN } from \"./config.js\";\nimport type { WalletData, LaunchRecord, Network } from \"../types.js\";\n\nfunction getWalletDir(): string {\n return join(homedir(), WALLET_DIR);\n}\n\nfunction getWalletPath(): string {\n return join(getWalletDir(), WALLET_FILE);\n}\n\nfunction getLaunchesPath(): string {\n return join(getWalletDir(), LAUNCHES_FILE);\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function walletExists(): Promise<boolean> {\n return fileExists(getWalletPath());\n}\n\nexport async function loadWallet(): Promise<WalletData | null> {\n const path = getWalletPath();\n if (!(await fileExists(path))) return null;\n\n const raw = await readFile(path, \"utf-8\");\n return JSON.parse(raw) as WalletData;\n}\n\nexport async function createWallet(): Promise<WalletData> {\n const wallet = ethers.Wallet.createRandom();\n const data: WalletData = {\n address: wallet.address,\n privateKey: wallet.privateKey,\n createdAt: new Date().toISOString(),\n };\n\n const dir = getWalletDir();\n await mkdir(dir, { recursive: true, mode: 0o700 });\n await chmod(dir, 0o700);\n\n const path = getWalletPath();\n await writeFile(path, JSON.stringify(data, null, 2), { mode: 0o600 });\n await chmod(path, 0o600);\n\n return data;\n}\n\nexport async function loadOrCreateWallet(): Promise<{ wallet: WalletData; isNew: boolean }> {\n const existing = await loadWallet();\n if (existing) return { wallet: existing, isNew: false };\n\n const wallet = await createWallet();\n return { wallet, isNew: true };\n}\n\nexport async function getWalletBalance(address: string, network: Network): Promise<string> {\n const chain = network === \"testnet\" ? CHAIN.testnet : CHAIN.mainnet;\n const provider = new ethers.JsonRpcProvider(chain.rpcUrl);\n const balance = await provider.getBalance(address);\n return ethers.formatEther(balance);\n}\n\nexport async function getSigner(privateKey: string, network: Network): Promise<ethers.Wallet> {\n const chain = network === \"testnet\" ? CHAIN.testnet : CHAIN.mainnet;\n const provider = new ethers.JsonRpcProvider(chain.rpcUrl);\n return new ethers.Wallet(privateKey, provider);\n}\n\nexport async function saveLaunchRecord(record: LaunchRecord): Promise<void> {\n const path = getLaunchesPath();\n let records: LaunchRecord[] = [];\n\n if (await fileExists(path)) {\n const raw = await readFile(path, \"utf-8\");\n records = JSON.parse(raw) as LaunchRecord[];\n }\n\n records.push(record);\n\n const dir = getWalletDir();\n await mkdir(dir, { recursive: true });\n await writeFile(path, JSON.stringify(records, null, 2), { mode: 0o600 });\n}\n\nexport async function loadLaunchRecords(): Promise<LaunchRecord[]> {\n const path = getLaunchesPath();\n if (!(await fileExists(path))) return [];\n\n const raw = await readFile(path, \"utf-8\");\n return JSON.parse(raw) as LaunchRecord[];\n}\n","// ─── On-chain contracts (Base mainnet) ───────────────────────────────────────\n\nexport const REVENUE_MANAGER_ADDRESS = \"0x3Bc08524d9DaaDEC9d1Af87818d809611F0fD669\" as const;\nexport const POSITION_MANAGER_ADDRESS = \"0x51Bba15255406Cfe7099a42183302640ba7dAFDC\" as const;\nexport const MULTICALL3_ADDRESS = \"0xcA11bde05977b3631167028862bE2a173976CA11\" as const;\nexport const WETH_ADDRESS = \"0x4200000000000000000000000000000000000006\" as const;\nexport const PERMIT2_ADDRESS = \"0x000000000022D473030F116dDEE9F6B43aC78BA3\" as const;\n\n// ─── APIs ────────────────────────────────────────────────────────────────────\n\nexport const FLAUNCH_API_BASE = \"https://web2-api.flaunch.gg\";\nexport const FLAUNCH_DATA_API_BASE = \"https://api.flayerlabs.xyz\";\nexport const FLAUNCH_DATA_API = `${FLAUNCH_DATA_API_BASE}/v1/base`;\nexport const FLAUNCH_URL = \"https://flaunch.gg/base\";\nexport const WORKER_API_URL = \"https://moltlaunch-network.nikshepsvn-d85.workers.dev\";\n\n// ─── Chain config ────────────────────────────────────────────────────────────\n\nexport const CHAIN = {\n mainnet: {\n id: 8453,\n name: \"Base\",\n network: \"base\",\n rpcUrl: \"https://mainnet.base.org\",\n explorer: \"https://basescan.org\",\n flaunchUrl: \"https://flaunch.gg/base\",\n },\n testnet: {\n id: 84532,\n name: \"Base Sepolia\",\n network: \"base-sepolia\",\n rpcUrl: \"https://sepolia.base.org\",\n explorer: \"https://sepolia.basescan.org\",\n flaunchUrl: \"https://flaunch.gg/base-sepolia\",\n },\n} as const;\n\n// ─── Protocol constants ─────────────────────────────────────────────────────\n\n/** Magic 4-byte prefix \"MLTL\" marking agent memo data in calldata */\nexport const MEMO_MAGIC_PREFIX = \"4d4c544c\" as const;\n\nexport const DEFAULT_SLIPPAGE_PERCENT = 5;\nexport const MAX_IMAGE_SIZE_BYTES = 5 * 1024 * 1024; // 5MB\nexport const POLL_INTERVAL_MS = 2_000;\nexport const POLL_TIMEOUT_MS = 120_000;\n\n// ─── External URLs ──────────────────────────────────────────────────────────\n\nexport const UNISWAP_URL = \"https://app.uniswap.org/explore/tokens/base\";\nexport const BASE_RPC = \"https://mainnet.base.org\";\n","// Re-export constants from shared package — single source of truth\nexport {\n REVENUE_MANAGER_ADDRESS,\n POSITION_MANAGER_ADDRESS,\n MULTICALL3_ADDRESS,\n WETH_ADDRESS,\n PERMIT2_ADDRESS,\n FLAUNCH_API_BASE,\n FLAUNCH_DATA_API_BASE,\n WORKER_API_URL,\n CHAIN,\n MEMO_MAGIC_PREFIX,\n DEFAULT_SLIPPAGE_PERCENT,\n MAX_IMAGE_SIZE_BYTES,\n POLL_INTERVAL_MS,\n POLL_TIMEOUT_MS,\n} from \"@moltlaunch/shared\";\n\n// CLI-specific constants (not shared with worker/site)\nexport const WALLET_DIR = \".moltlaunch\";\nexport const WALLET_FILE = \"wallet.json\";\nexport const LAUNCHES_FILE = \"launches.json\";\n","import { readFile, stat } from \"node:fs/promises\";\nimport {\n FLAUNCH_API_BASE,\n FLAUNCH_DATA_API_BASE,\n CHAIN,\n MAX_IMAGE_SIZE_BYTES,\n POLL_INTERVAL_MS,\n POLL_TIMEOUT_MS,\n} from \"./config.js\";\nimport { UploadError, LaunchError, TimeoutError } from \"./errors.js\";\nimport type {\n Network,\n FlaunchUploadResponse,\n FlaunchLaunchResponse,\n FlaunchStatusResponse,\n FlaunchTokenListResponse,\n FlaunchTokenDetail,\n FlaunchTokenDetails,\n FlaunchHolder,\n} from \"../types.js\";\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function fetchWithRetry(\n url: string,\n options: RequestInit,\n retries = 3,\n): Promise<Response> {\n for (let attempt = 0; attempt < retries; attempt++) {\n const response = await fetch(url, options);\n\n if (response.status === 429) {\n const retryAfter = response.headers.get(\"retry-after\");\n const waitMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : 2000 * (attempt + 1);\n await sleep(waitMs);\n continue;\n }\n\n return response;\n }\n\n throw new Error(\"Max retries exceeded (429 rate limit)\");\n}\n\n/**\n * Upload image to IPFS via Flaunch Web2 API.\n * Accepts a file path or a {buffer, mime} object for generated images.\n */\nexport async function uploadImage(\n source: string | { buffer: Buffer; mime: string },\n): Promise<string> {\n let base64: string;\n let mime: string;\n\n if (typeof source === \"string\") {\n const fileStat = await stat(source);\n if (fileStat.size > MAX_IMAGE_SIZE_BYTES) {\n throw new UploadError(`Image exceeds 5MB limit (${(fileStat.size / 1024 / 1024).toFixed(1)}MB)`);\n }\n\n const imageBuffer = await readFile(source);\n base64 = imageBuffer.toString(\"base64\");\n\n const ext = source.split(\".\").pop()?.toLowerCase();\n const mimeMap: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n svg: \"image/svg+xml\",\n };\n mime = mimeMap[ext ?? \"\"] ?? \"image/png\";\n } else {\n base64 = source.buffer.toString(\"base64\");\n mime = source.mime;\n }\n\n const dataUrl = `data:${mime};base64,${base64}`;\n\n const response = await fetchWithRetry(`${FLAUNCH_API_BASE}/api/v1/upload-image`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ base64Image: dataUrl }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new UploadError(`${response.status} — ${text}`);\n }\n\n const data = (await response.json()) as FlaunchUploadResponse;\n return data.ipfsHash;\n}\n\n/**\n * Launch a memecoin via Flaunch Web2 API.\n * This is gasless — Flaunch handles the on-chain transaction server-side.\n */\nexport async function launchMemecoin(params: {\n name: string;\n symbol: string;\n description: string;\n imageIpfs: string;\n creatorAddress: string;\n revenueManagerAddress?: string;\n websiteUrl?: string;\n network: Network;\n}): Promise<string> {\n const chain = params.network === \"testnet\" ? CHAIN.testnet : CHAIN.mainnet;\n\n const body: Record<string, string | number | undefined> = {\n name: params.name,\n symbol: params.symbol,\n description: params.description,\n imageIpfs: params.imageIpfs,\n creatorAddress: params.creatorAddress,\n revenueManagerAddress: params.revenueManagerAddress,\n websiteUrl: params.websiteUrl,\n flaunchAt: 0, // immediate launch — avoids timestamp-in-the-past revert from relayer delay\n };\n\n // Strip undefined values so we don't send nulls to the API\n for (const key of Object.keys(body)) {\n if (body[key] === undefined) delete body[key];\n }\n\n const response = await fetchWithRetry(\n `${FLAUNCH_API_BASE}/api/v1/${chain.network}/launch-memecoin`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n },\n );\n\n if (!response.ok) {\n const text = await response.text();\n throw new LaunchError(`${response.status} — ${text}`);\n }\n\n const data = (await response.json()) as FlaunchLaunchResponse;\n return data.jobId;\n}\n\n/**\n * Fetch all tokens owned by a specific wallet from the Flaunch data API.\n * Skips the blockchain entirely — reads from flayerlabs REST API.\n */\nexport async function fetchTokensByOwner(\n ownerAddress: string,\n network: Network,\n): Promise<FlaunchTokenListResponse> {\n const chain = network === \"testnet\" ? CHAIN.testnet : CHAIN.mainnet;\n const url = `${FLAUNCH_DATA_API_BASE}/v1/${chain.network}/tokens?ownerAddress=${ownerAddress}&limit=100`;\n\n const response = await fetchWithRetry(url, { method: \"GET\" });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Flaunch data API error: ${response.status} — ${text}`);\n }\n\n return (await response.json()) as FlaunchTokenListResponse;\n}\n\n/**\n * Fetch a single token's detail (includes socials) from the Flaunch data API.\n */\nexport async function fetchToken(\n tokenAddress: string,\n network: Network,\n): Promise<FlaunchTokenDetail> {\n const chain = network === \"testnet\" ? CHAIN.testnet : CHAIN.mainnet;\n const url = `${FLAUNCH_DATA_API_BASE}/v1/${chain.network}/tokens/${tokenAddress}`;\n\n const response = await fetchWithRetry(url, { method: \"GET\" });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Flaunch data API error: ${response.status} — ${text}`);\n }\n\n return (await response.json()) as FlaunchTokenDetail;\n}\n\n/**\n * Fetch detailed token info (price, volume, creator) from the Flaunch data API.\n */\nexport async function fetchTokenDetails(\n tokenAddress: string,\n network: Network,\n): Promise<FlaunchTokenDetails> {\n const chain = network === \"testnet\" ? CHAIN.testnet : CHAIN.mainnet;\n const url = `${FLAUNCH_DATA_API_BASE}/v1/${chain.network}/tokens/${tokenAddress}/details`;\n\n const response = await fetchWithRetry(url, { method: \"GET\" });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Flaunch data API error: ${response.status} — ${text}`);\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n\n if (!data || typeof data !== \"object\" || !data.tokenAddress || !data.name || !data.symbol) {\n throw new Error(\"Invalid token details response: missing required fields\");\n }\n\n const price = data.price as Record<string, string> | undefined;\n const volume = data.volume as Record<string, string> | undefined;\n if (!price?.marketCapETH || !volume?.volume24h) {\n throw new Error(\"Invalid token details response: missing price/volume data\");\n }\n\n return data as unknown as FlaunchTokenDetails;\n}\n\n/**\n * Fetch the number of unique holders for a token from the Flaunch data API.\n * Uses pagination.total when available; throws if the API doesn't provide it.\n */\nexport async function fetchTokenHolderCount(\n tokenAddress: string,\n network: Network,\n): Promise<number> {\n const chain = network === \"testnet\" ? CHAIN.testnet : CHAIN.mainnet;\n const url = `${FLAUNCH_DATA_API_BASE}/v1/${chain.network}/tokens/${tokenAddress}/holders?limit=1&offset=0`;\n\n const response = await fetchWithRetry(url, { method: \"GET\" });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Flaunch data API error: ${response.status} — ${text}`);\n }\n\n const data = (await response.json()) as { data: FlaunchHolder[]; pagination: { total?: number; limit: number; offset: number } };\n\n if (typeof data.pagination?.total === \"number\") {\n return data.pagination.total;\n }\n\n // API doesn't provide total — can't reliably count with limit=1\n throw new Error(\"Holder count unavailable: API response missing pagination.total\");\n}\n\n/**\n * Poll launch status until completed or failed.\n */\nexport async function pollLaunchStatus(\n jobId: string,\n onPoll?: (state: string, position: number) => void,\n): Promise<FlaunchStatusResponse> {\n const startTime = Date.now();\n\n let consecutiveErrors = 0;\n\n while (Date.now() - startTime < POLL_TIMEOUT_MS) {\n let response: Response;\n try {\n response = await fetch(`${FLAUNCH_API_BASE}/api/v1/launch-status/${jobId}`);\n } catch {\n // Network error — retry up to 5 times before giving up\n consecutiveErrors++;\n if (consecutiveErrors >= 5) {\n throw new LaunchError(\"Lost connection to Flaunch API during deployment\");\n }\n await sleep(POLL_INTERVAL_MS);\n continue;\n }\n\n if (response.status === 429 || response.status >= 500) {\n consecutiveErrors++;\n if (consecutiveErrors >= 5) {\n throw new LaunchError(`Status check failed after retries: ${response.status}`);\n }\n await sleep(POLL_INTERVAL_MS * (consecutiveErrors + 1));\n continue;\n }\n\n if (!response.ok) {\n const text = await response.text();\n throw new LaunchError(`Status check failed: ${response.status} — ${text}`);\n }\n\n consecutiveErrors = 0;\n const data = (await response.json()) as FlaunchStatusResponse;\n onPoll?.(data.state, data.queuePosition);\n\n if (data.state === \"completed\") return data;\n if (data.state === \"failed\") {\n throw new LaunchError(data.error ?? \"Launch failed with no error message\");\n }\n\n await sleep(POLL_INTERVAL_MS);\n }\n\n throw new TimeoutError();\n}\n","export const EXIT_CODES = {\n SUCCESS: 0,\n GENERAL: 1,\n NO_WALLET: 2,\n UPLOAD_FAIL: 3,\n LAUNCH_FAIL: 4,\n TIMEOUT: 5,\n NO_GAS: 6,\n SWAP_FAIL: 7,\n} as const;\n\nexport class MltlError extends Error {\n constructor(\n message: string,\n public readonly exitCode: number,\n ) {\n super(message);\n this.name = \"MltlError\";\n }\n}\n\nexport class NoWalletError extends MltlError {\n constructor() {\n super(\"No wallet found. Run `mltl launch` to create one.\", EXIT_CODES.NO_WALLET);\n }\n}\n\nexport class UploadError extends MltlError {\n constructor(detail: string) {\n super(`Image upload failed: ${detail}`, EXIT_CODES.UPLOAD_FAIL);\n }\n}\n\nexport class LaunchError extends MltlError {\n constructor(detail: string) {\n super(`Token launch failed: ${detail}`, EXIT_CODES.LAUNCH_FAIL);\n }\n}\n\nexport class TimeoutError extends MltlError {\n constructor() {\n super(\"Launch timed out waiting for confirmation.\", EXIT_CODES.TIMEOUT);\n }\n}\n\nexport class SwapError extends MltlError {\n constructor(detail: string) {\n super(`Swap failed: ${detail}`, EXIT_CODES.SWAP_FAIL);\n }\n}\n\nexport class NoGasError extends MltlError {\n constructor(address: string) {\n super(\n `Wallet ${address} has no ETH for gas. Send Base ETH to this address and retry.`,\n EXIT_CODES.NO_GAS,\n );\n }\n}\n","/**\n * Generate a unique token logo PNG from the token name and symbol.\n * Zero external dependencies — produces a valid PNG using raw pixel data + zlib.\n * Deterministic: same inputs always produce the same image.\n */\n\nimport { deflateSync } from \"node:zlib\";\n\nconst SIZE = 512;\n\nfunction hashString(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) - hash + str.charCodeAt(i)) | 0;\n }\n return Math.abs(hash);\n}\n\nfunction mulberry32(seed: number): () => number {\n let s = seed | 0;\n return () => {\n s = (s + 0x6d2b79f5) | 0;\n let t = Math.imul(s ^ (s >>> 15), 1 | s);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\ninterface RGB {\n r: number;\n g: number;\n b: number;\n}\n\nfunction hslToRgb(h: number, s: number, l: number): RGB {\n const a = s * Math.min(l, 1 - l);\n const f = (n: number) => {\n const k = (n + h / 30) % 12;\n return l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n };\n return {\n r: Math.round(255 * f(0)),\n g: Math.round(255 * f(8)),\n b: Math.round(255 * f(4)),\n };\n}\n\nfunction lerpColor(c1: RGB, c2: RGB, t: number): RGB {\n return {\n r: Math.round(c1.r + (c2.r - c1.r) * t),\n g: Math.round(c1.g + (c2.g - c1.g) * t),\n b: Math.round(c1.b + (c2.b - c1.b) * t),\n };\n}\n\nfunction blendColor(base: RGB, overlay: RGB, alpha: number): RGB {\n return {\n r: Math.round(base.r * (1 - alpha) + overlay.r * alpha),\n g: Math.round(base.g * (1 - alpha) + overlay.g * alpha),\n b: Math.round(base.b * (1 - alpha) + overlay.b * alpha),\n };\n}\n\n/** Generate a 7x7 vertically symmetric pattern */\nfunction generatePattern(rand: () => number): boolean[][] {\n const grid: boolean[][] = [];\n for (let row = 0; row < 7; row++) {\n grid[row] = [];\n for (let col = 0; col < 4; col++) {\n grid[row][col] = rand() > 0.5;\n }\n // Mirror horizontally\n grid[row][4] = grid[row][2];\n grid[row][5] = grid[row][1];\n grid[row][6] = grid[row][0];\n }\n return grid;\n}\n\n/** Encode raw RGBA pixels into a minimal PNG file */\nfunction encodePng(width: number, height: number, pixels: Buffer): Buffer {\n // Build raw image data with filter byte (0 = None) per row\n const rawData = Buffer.alloc(height * (1 + width * 3));\n for (let y = 0; y < height; y++) {\n const rowOffset = y * (1 + width * 3);\n rawData[rowOffset] = 0; // filter: None\n for (let x = 0; x < width; x++) {\n const srcIdx = (y * width + x) * 3;\n const dstIdx = rowOffset + 1 + x * 3;\n rawData[dstIdx] = pixels[srcIdx];\n rawData[dstIdx + 1] = pixels[srcIdx + 1];\n rawData[dstIdx + 2] = pixels[srcIdx + 2];\n }\n }\n\n const compressed = deflateSync(rawData);\n\n // PNG signature\n const signature = Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]);\n\n // IHDR chunk\n const ihdrData = Buffer.alloc(13);\n ihdrData.writeUInt32BE(width, 0);\n ihdrData.writeUInt32BE(height, 4);\n ihdrData[8] = 8; // bit depth\n ihdrData[9] = 2; // color type: RGB\n ihdrData[10] = 0; // compression\n ihdrData[11] = 0; // filter\n ihdrData[12] = 0; // interlace\n const ihdr = makeChunk(\"IHDR\", ihdrData);\n\n // IDAT chunk\n const idat = makeChunk(\"IDAT\", compressed);\n\n // IEND chunk\n const iend = makeChunk(\"IEND\", Buffer.alloc(0));\n\n return Buffer.concat([signature, ihdr, idat, iend]);\n}\n\nfunction makeChunk(type: string, data: Buffer): Buffer {\n const length = Buffer.alloc(4);\n length.writeUInt32BE(data.length, 0);\n\n const typeBytes = Buffer.from(type, \"ascii\");\n const crcInput = Buffer.concat([typeBytes, data]);\n const crc = Buffer.alloc(4);\n crc.writeUInt32BE(crc32(crcInput), 0);\n\n return Buffer.concat([length, typeBytes, data, crc]);\n}\n\nfunction crc32(buf: Buffer): number {\n let crc = 0xffffffff;\n for (let i = 0; i < buf.length; i++) {\n crc ^= buf[i];\n for (let j = 0; j < 8; j++) {\n crc = crc & 1 ? (crc >>> 1) ^ 0xedb88320 : crc >>> 1;\n }\n }\n return (crc ^ 0xffffffff) >>> 0;\n}\n\nexport function generateTokenLogo(name: string, symbol: string): Buffer {\n const seed = hashString(`${name}:${symbol}`);\n const rand = mulberry32(seed);\n\n // Pick gradient colors\n const hue1 = Math.floor(rand() * 360);\n const hue2 = (hue1 + 90 + Math.floor(rand() * 90)) % 360;\n const color1 = hslToRgb(hue1, 0.65, 0.5);\n const color2 = hslToRgb(hue2, 0.55, 0.35);\n\n // Pattern overlay color\n const patternColor = hslToRgb(hue1, 0.4, 0.9);\n\n const pattern = generatePattern(rand);\n\n // Render pixels\n const pixels = Buffer.alloc(SIZE * SIZE * 3);\n\n const gridSize = 7;\n const cellPx = 36;\n const gridWidth = gridSize * cellPx;\n const offsetX = Math.floor((SIZE - gridWidth) / 2);\n const offsetY = Math.floor((SIZE - gridWidth) / 2);\n const cornerRadius = 48;\n\n for (let y = 0; y < SIZE; y++) {\n for (let x = 0; x < SIZE; x++) {\n const idx = (y * SIZE + x) * 3;\n\n // Rounded corner mask — draw as square outside the radius\n const inCorner = isOutsideRoundedRect(x, y, SIZE, SIZE, cornerRadius);\n if (inCorner) {\n pixels[idx] = 0;\n pixels[idx + 1] = 0;\n pixels[idx + 2] = 0;\n continue;\n }\n\n // Diagonal gradient background\n const t = (x + y) / (SIZE * 2);\n let color = lerpColor(color1, color2, t);\n\n // Check if pixel is in the identicon pattern area\n const gx = x - offsetX;\n const gy = y - offsetY;\n if (gx >= 0 && gx < gridWidth && gy >= 0 && gy < gridWidth) {\n const col = Math.floor(gx / cellPx);\n const row = Math.floor(gy / cellPx);\n if (col < gridSize && row < gridSize && pattern[row][col]) {\n color = blendColor(color, patternColor, 0.35);\n }\n }\n\n pixels[idx] = color.r;\n pixels[idx + 1] = color.g;\n pixels[idx + 2] = color.b;\n }\n }\n\n return encodePng(SIZE, SIZE, pixels);\n}\n\nfunction isOutsideRoundedRect(\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n): boolean {\n // Only check corners\n if (x < r && y < r) {\n return (r - x) ** 2 + (r - y) ** 2 > r ** 2;\n }\n if (x >= w - r && y < r) {\n return (x - (w - r - 1)) ** 2 + (r - y) ** 2 > r ** 2;\n }\n if (x < r && y >= h - r) {\n return (r - x) ** 2 + (y - (h - r - 1)) ** 2 > r ** 2;\n }\n if (x >= w - r && y >= h - r) {\n return (x - (w - r - 1)) ** 2 + (y - (h - r - 1)) ** 2 > r ** 2;\n }\n return false;\n}\n","export function formatOutput(data: Record<string, unknown>, json: boolean): string {\n if (json) {\n return JSON.stringify(data, null, 2);\n }\n\n const lines: string[] = [];\n for (const [key, value] of Object.entries(data)) {\n if (value === undefined || value === null) continue;\n const label = key.replace(/([A-Z])/g, \" $1\").replace(/^./, (s) => s.toUpperCase());\n lines.push(` ${label}: ${String(value)}`);\n }\n return lines.join(\"\\n\");\n}\n\nexport function printSuccess(message: string, data: Record<string, unknown>, json: boolean): void {\n if (json) {\n console.log(JSON.stringify({ success: true, ...data }, null, 2));\n } else {\n console.log(`\\n${message}\\n`);\n console.log(formatOutput(data, false));\n console.log();\n }\n}\n\nexport function printError(message: string, json: boolean, exitCode: number): void {\n if (json) {\n console.error(JSON.stringify({ success: false, error: message, exitCode }));\n } else {\n console.error(`\\nError: ${message}\\n`);\n }\n}\n","import { loadWallet, getWalletBalance } from \"../lib/wallet.js\";\nimport { printSuccess, printError } from \"../lib/output.js\";\nimport { EXIT_CODES, MltlError } from \"../lib/errors.js\";\n\ninterface WalletOpts {\n json: boolean;\n}\n\nexport async function wallet(opts: WalletOpts): Promise<void> {\n const { json } = opts;\n\n try {\n const data = await loadWallet();\n if (!data) {\n printError(\"No wallet found. Run `mltl launch` to create one.\", json, EXIT_CODES.NO_WALLET);\n process.exit(EXIT_CODES.NO_WALLET);\n }\n\n let balance = \"unknown\";\n try {\n balance = await getWalletBalance(data.address, \"mainnet\");\n } catch {\n // RPC may be unreachable\n }\n\n const output: Record<string, unknown> = {\n address: data.address,\n balance: json ? balance : `${balance} ETH (Base)`,\n network: json ? \"Base\" : undefined,\n createdAt: data.createdAt,\n };\n\n printSuccess(\"Wallet info\", output, json);\n } catch (error) {\n if (error instanceof MltlError) {\n printError(error.message, json, error.exitCode);\n process.exit(error.exitCode);\n }\n const message = error instanceof Error ? error.message : String(error);\n printError(message, json, EXIT_CODES.GENERAL);\n process.exit(EXIT_CODES.GENERAL);\n }\n}\n","import { ethers } from \"ethers\";\nimport { fetchTokensByOwner } from \"../lib/flaunch-api.js\";\nimport { loadWallet } from \"../lib/wallet.js\";\nimport { CHAIN } from \"../lib/config.js\";\nimport { printError } from \"../lib/output.js\";\nimport { EXIT_CODES, NoWalletError, MltlError } from \"../lib/errors.js\";\nimport type { Network } from \"../types.js\";\n\ninterface StatusOpts {\n testnet: boolean;\n json: boolean;\n}\n\nfunction formatMarketCap(marketCapWei: string): string {\n try {\n const eth = parseFloat(ethers.formatEther(BigInt(marketCapWei)));\n if (eth >= 1_000) return `${(eth / 1_000).toFixed(1)}k ETH`;\n if (eth >= 1) return `${eth.toFixed(2)} ETH`;\n if (eth >= 0.001) return `${eth.toFixed(4)} ETH`;\n return `${eth.toExponential(2)} ETH`;\n } catch {\n return \"—\";\n }\n}\n\nfunction formatDate(timestamp: number): string {\n return new Date(timestamp * 1000).toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n\nexport async function status(opts: StatusOpts): Promise<void> {\n const { testnet, json } = opts;\n const network: Network = testnet ? \"testnet\" : \"mainnet\";\n const chain = testnet ? CHAIN.testnet : CHAIN.mainnet;\n\n try {\n const walletData = await loadWallet();\n if (!walletData) {\n throw new NoWalletError();\n }\n\n const response = await fetchTokensByOwner(walletData.address, network);\n const tokens = response.data;\n\n if (tokens.length === 0) {\n if (json) {\n console.log(JSON.stringify({ success: true, tokens: [], network: chain.name, wallet: walletData.address }));\n } else {\n console.log(\"\\nNo tokens found. Run `mltl launch` to create one.\\n\");\n }\n return;\n }\n\n // Sort by most recently created first\n const sorted = [...tokens].sort((a, b) => b.createdAt - a.createdAt);\n\n if (json) {\n console.log(JSON.stringify({\n success: true,\n count: sorted.length,\n network: chain.name,\n wallet: walletData.address,\n tokens: sorted.map((t) => ({\n name: t.name,\n symbol: t.symbol,\n tokenAddress: t.tokenAddress,\n marketCapETH: formatMarketCap(t.marketCapETH),\n createdAt: new Date(t.createdAt * 1000).toISOString(),\n fairLaunchActive: t.fairLaunchActive,\n image: t.image,\n flaunchUrl: `${chain.flaunchUrl}/token/${t.tokenAddress}`,\n })),\n }, null, 2));\n return;\n }\n\n console.log(`\\nYour tokens (${sorted.length}) — ${chain.name}\\n`);\n\n for (const token of sorted) {\n const mcap = formatMarketCap(token.marketCapETH);\n const date = formatDate(token.createdAt);\n const fairLaunch = token.fairLaunchActive ? \" [FAIR LAUNCH]\" : \"\";\n\n console.log(` ${token.name} (${token.symbol})${fairLaunch}`);\n console.log(` Token: ${token.tokenAddress}`);\n console.log(` Market cap: ${mcap}`);\n console.log(` Trade: ${chain.flaunchUrl}/token/${token.tokenAddress}`);\n console.log(` Launched: ${date}`);\n console.log();\n }\n } catch (error) {\n if (error instanceof MltlError) {\n printError(error.message, json, error.exitCode);\n process.exit(error.exitCode);\n }\n const message = error instanceof Error ? error.message : String(error);\n printError(message, json, EXIT_CODES.GENERAL);\n process.exit(EXIT_CODES.GENERAL);\n }\n}\n","import { ethers } from \"ethers\";\nimport { loadWallet, getSigner, getWalletBalance } from \"../lib/wallet.js\";\nimport { REVENUE_MANAGER_ADDRESS } from \"../lib/config.js\";\nimport { printSuccess, printError } from \"../lib/output.js\";\nimport { EXIT_CODES, NoWalletError, NoGasError, MltlError } from \"../lib/errors.js\";\nimport type { Network } from \"../types.js\";\n\n// Fees accumulate in FeeEscrow, claimed via the Revenue Manager\nconst REVENUE_MANAGER_ABI = [\n \"function balances(address) external view returns (uint256)\",\n \"function claim() external returns (uint256)\",\n];\n\ninterface ClaimOpts {\n testnet: boolean;\n json: boolean;\n}\n\nexport async function claim(opts: ClaimOpts): Promise<void> {\n const { testnet, json } = opts;\n const network: Network = testnet ? \"testnet\" : \"mainnet\";\n\n try {\n const walletData = await loadWallet();\n if (!walletData) {\n throw new NoWalletError();\n }\n\n // Check gas balance\n const balance = await getWalletBalance(walletData.address, network);\n if (parseFloat(balance) === 0) {\n throw new NoGasError(walletData.address);\n }\n\n const signer = await getSigner(walletData.privateKey, network);\n const rm = new ethers.Contract(REVENUE_MANAGER_ADDRESS, REVENUE_MANAGER_ABI, signer);\n\n // Check claimable balance\n const claimable = await rm.balances(walletData.address);\n const claimableEth = ethers.formatEther(claimable);\n\n if (claimable === 0n) {\n printSuccess(\"No fees to claim\", {\n claimable: \"0 ETH\",\n wallet: walletData.address,\n network,\n }, json);\n return;\n }\n\n if (!json) console.log(`\\nClaimable: ${claimableEth} ETH`);\n if (!json) process.stdout.write(\"Submitting claim transaction...\");\n\n // claim() pulls fees from FeeEscrow, deducts protocol fee, sends ETH to caller\n const tx = await rm.claim();\n if (!json) console.log(` tx ${tx.hash}`);\n\n if (!json) process.stdout.write(\"Waiting for confirmation...\");\n const receipt = await tx.wait();\n if (!receipt) {\n throw new MltlError(\"Transaction was dropped or replaced\", EXIT_CODES.GENERAL);\n }\n if (!json) console.log(\" confirmed\");\n\n printSuccess(\"Fees claimed successfully!\", {\n transactionHash: receipt.hash,\n claimed: `${claimableEth} ETH (minus protocol fee)`,\n wallet: walletData.address,\n network,\n }, json);\n } catch (error) {\n if (error instanceof MltlError) {\n printError(error.message, json, error.exitCode);\n process.exit(error.exitCode);\n }\n const message = error instanceof Error ? error.message : String(error);\n printError(message, json, EXIT_CODES.GENERAL);\n process.exit(EXIT_CODES.GENERAL);\n }\n}\n","import { ethers } from \"ethers\";\nimport { loadWallet, getWalletBalance } from \"../lib/wallet.js\";\nimport { REVENUE_MANAGER_ADDRESS, CHAIN } from \"../lib/config.js\";\nimport { printSuccess, printError } from \"../lib/output.js\";\nimport { EXIT_CODES, NoWalletError, MltlError } from \"../lib/errors.js\";\nimport type { Network } from \"../types.js\";\n\nconst REVENUE_MANAGER_ABI = [\n \"function balances(address) external view returns (uint256)\",\n \"function protocolFee() external view returns (uint256)\",\n];\n\ninterface FeesOpts {\n testnet: boolean;\n json: boolean;\n}\n\nexport async function fees(opts: FeesOpts): Promise<void> {\n const { testnet, json } = opts;\n const network: Network = testnet ? \"testnet\" : \"mainnet\";\n\n try {\n const walletData = await loadWallet();\n if (!walletData) {\n throw new NoWalletError();\n }\n\n const chain = testnet ? CHAIN.testnet : CHAIN.mainnet;\n const provider = new ethers.JsonRpcProvider(chain.rpcUrl);\n const rm = new ethers.Contract(REVENUE_MANAGER_ADDRESS, REVENUE_MANAGER_ABI, provider);\n\n const claimable = await rm.balances(walletData.address);\n const claimableEth = ethers.formatEther(claimable);\n\n // Protocol takes a cut on claim (e.g. 1000 = 10%)\n let protocolFeeBps = 1000n;\n try { protocolFeeBps = await rm.protocolFee(); } catch { /* use default */ }\n const afterProtocol = claimable - (claimable * protocolFeeBps / 10000n);\n const afterProtocolEth = ethers.formatEther(afterProtocol);\n\n const walletBalance = await getWalletBalance(walletData.address, network);\n const hasGas = parseFloat(walletBalance) > 0;\n\n printSuccess(\"Fee balance\", {\n claimable: `${claimableEth} ETH`,\n afterProtocolFee: `~${afterProtocolEth} ETH`,\n protocolFee: `${Number(protocolFeeBps) / 100}%`,\n wallet: walletData.address,\n walletBalance: `${walletBalance} ETH`,\n hasGas,\n network: chain.name,\n canClaim: hasGas && claimable > 0n,\n }, json);\n } catch (error) {\n if (error instanceof MltlError) {\n printError(error.message, json, error.exitCode);\n process.exit(error.exitCode);\n }\n const message = error instanceof Error ? error.message : String(error);\n printError(message, json, EXIT_CODES.GENERAL);\n process.exit(EXIT_CODES.GENERAL);\n }\n}\n","import { parseEther, type Hex } from \"viem\";\nimport { loadWallet, getWalletBalance } from \"../lib/wallet.js\";\nimport { createFlaunchSdk, setMemo, clearMemo } from \"../lib/viem-client.js\";\nimport { CHAIN, DEFAULT_SLIPPAGE_PERCENT } from \"../lib/config.js\";\nimport { encodeMemo } from \"../lib/memo.js\";\nimport { printSuccess, printError } from \"../lib/output.js\";\nimport { EXIT_CODES, NoWalletError, NoGasError, SwapError, MltlError } from \"../lib/errors.js\";\nimport type { SwapParams, Network } from \"../types.js\";\n\nexport async function swap(opts: SwapParams): Promise<void> {\n const { token, amount, side, json } = opts;\n const slippage = opts.slippage ?? DEFAULT_SLIPPAGE_PERCENT;\n const network: Network = opts.testnet ? \"testnet\" : \"mainnet\";\n const chainConfig = CHAIN[network];\n\n try {\n const walletData = await loadWallet();\n if (!walletData) throw new NoWalletError();\n\n const balance = await getWalletBalance(walletData.address, network);\n if (parseFloat(balance) === 0) throw new NoGasError(walletData.address);\n\n if (!json) console.log(`\\nSwapping on ${chainConfig.name}...`);\n\n const { flaunch, publicClient, walletClient, account } = createFlaunchSdk(walletData.privateKey, network);\n\n // Encode memo into pending calldata append (if provided)\n if (opts.memo) {\n const memoHex = encodeMemo({\n agent: walletData.address,\n action: side,\n token,\n memo: opts.memo,\n ts: Date.now(),\n });\n setMemo(memoHex);\n } else {\n clearMemo();\n }\n\n const coinAddress = token as `0x${string}`;\n const amountIn = parseEther(amount);\n\n let txHash: Hex;\n\n if (side === \"buy\") {\n if (!json) process.stdout.write(`Buying with ${amount} ETH...`);\n\n txHash = await flaunch.buyCoin({\n coinAddress,\n amountIn,\n slippagePercent: slippage,\n swapType: \"EXACT_IN\",\n });\n } else {\n if (!json) process.stdout.write(`Selling ${amount} tokens...`);\n\n // Check Permit2 allowance for sell flow\n const { allowance } = await flaunch.getPermit2AllowanceAndNonce(coinAddress);\n\n if (allowance < amountIn) {\n if (!json) process.stdout.write(\" (signing Permit2 approval)\");\n\n const { typedData, permitSingle } = await flaunch.getPermit2TypedData(coinAddress);\n\n const signature = await walletClient.signTypedData({ ...typedData, account });\n\n txHash = await flaunch.sellCoin({\n coinAddress,\n amountIn,\n slippagePercent: slippage,\n permitSingle,\n signature,\n });\n } else {\n txHash = await flaunch.sellCoin({\n coinAddress,\n amountIn,\n slippagePercent: slippage,\n });\n }\n }\n\n // Clear memo in case SDK didn't trigger sendTransaction (shouldn't happen)\n clearMemo();\n\n if (!json) console.log(` tx ${txHash}`);\n if (!json) process.stdout.write(\"Waiting for confirmation...\");\n\n const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });\n\n if (receipt.status === \"reverted\") {\n throw new SwapError(\"Transaction reverted\");\n }\n\n if (!json) console.log(\" confirmed\");\n\n printSuccess(`${side === \"buy\" ? \"Buy\" : \"Sell\"} swap completed!`, {\n transactionHash: receipt.transactionHash,\n side,\n amountIn: side === \"buy\" ? `${amount} ETH` : `${amount} tokens`,\n tokenAddress: token,\n network: chainConfig.name,\n explorer: `${chainConfig.explorer}/tx/${receipt.transactionHash}`,\n flaunch: `${chainConfig.flaunchUrl}/coin/${token}`,\n ...(opts.memo ? { memo: opts.memo } : {}),\n }, json);\n } catch (error) {\n clearMemo();\n if (error instanceof MltlError) {\n printError(error.message, json, error.exitCode);\n process.exit(error.exitCode);\n }\n const message = error instanceof Error ? error.message : String(error);\n printError(message, json, EXIT_CODES.SWAP_FAIL);\n process.exit(EXIT_CODES.SWAP_FAIL);\n }\n}\n","import { createPublicClient, createWalletClient, http, encodeFunctionData, type Hex, type PublicClient, type WalletClient, type Account } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { base, baseSepolia } from \"viem/chains\";\nimport { createDrift, type Drift, type ReadWriteAdapter } from \"@delvtech/drift\";\nimport { viemAdapter } from \"@delvtech/drift-viem\";\nimport { ReadWriteFlaunchSDK } from \"@flaunch/sdk\";\nimport { CHAIN } from \"./config.js\";\nimport { appendMemoToCalldata } from \"./memo.js\";\nimport type { Network } from \"../types.js\";\n\n// Module-level memo context — set before calling SDK, proxy reads and appends\nlet _pendingMemoHex: Hex | null = null;\n\n/** Set memo bytes to append to the next transaction's calldata. Auto-clears after use. */\nexport function setMemo(memoHex: Hex | null): void {\n _pendingMemoHex = memoHex;\n}\n\n/** Clear any pending memo without consuming it. */\nexport function clearMemo(): void {\n _pendingMemoHex = null;\n}\n\nconst VIEM_CHAINS = {\n mainnet: base,\n testnet: baseSepolia,\n} as const;\n\ninterface FlaunchClients {\n flaunch: ReadWriteFlaunchSDK;\n publicClient: PublicClient;\n walletClient: WalletClient;\n account: Account;\n}\n\nexport function createFlaunchSdk(privateKey: string, network: Network): FlaunchClients {\n const chainConfig = CHAIN[network];\n const chain = VIEM_CHAINS[network];\n const account = privateKeyToAccount(privateKey as `0x${string}`);\n\n const publicClient = createPublicClient({\n chain,\n transport: http(chainConfig.rpcUrl),\n });\n\n const walletClient = createWalletClient({\n chain,\n account,\n transport: http(chainConfig.rpcUrl),\n });\n\n // drift-viem passes address strings (not Account objects) to viem methods,\n // which makes viem use eth_sendTransaction (JSON-RPC signing) instead of\n // local signing + eth_sendRawTransaction. Patch the methods to always use\n // the local Account object so transactions are signed client-side.\n //\n // Also: if a memo is pending, append it to the calldata of writeContract\n // and sendTransaction calls. The ABI decoder ignores trailing bytes.\n const patchedWalletClient = new Proxy(walletClient, {\n get(target, prop, receiver) {\n const val = Reflect.get(target, prop, receiver);\n if (typeof val !== \"function\") return val;\n if (prop === \"writeContract\" || prop === \"sendTransaction\" || prop === \"deployContract\") {\n return (args: Record<string, unknown>) => {\n const patched: Record<string, unknown> = { ...args, account };\n\n // Consume pending memo and append to calldata\n if (_pendingMemoHex && (prop === \"writeContract\" || prop === \"sendTransaction\")) {\n const memo = _pendingMemoHex;\n _pendingMemoHex = null; // auto-clear after consumption\n\n if (prop === \"sendTransaction\" && typeof patched.data === \"string\") {\n patched.data = appendMemoToCalldata(patched.data as Hex, memo);\n }\n\n // writeContract: viem encodes calldata internally, so we encode it\n // ourselves, append the memo, and send as a raw sendTransaction\n if (prop === \"writeContract\" && patched.abi && patched.functionName) {\n const encoded = encodeFunctionData({\n abi: patched.abi as readonly unknown[],\n functionName: patched.functionName as string,\n args: (patched.args ?? []) as readonly unknown[],\n });\n const data = appendMemoToCalldata(encoded, memo);\n const sendTx = Reflect.get(target, \"sendTransaction\", receiver) as\n (a: Record<string, unknown>) => Promise<Hex>;\n return sendTx.call(target, {\n account,\n to: patched.address as string,\n data,\n value: patched.value ?? 0n,\n ...(patched.gas ? { gas: patched.gas } : {}),\n });\n }\n }\n\n return val.call(target, patched);\n };\n }\n return val.bind(target);\n },\n });\n\n // Cast needed: Base chain's deposit tx type causes generic mismatch with drift-viem\n const drift = createDrift({\n adapter: viemAdapter({\n publicClient: publicClient as unknown as PublicClient,\n walletClient: patchedWalletClient as unknown as WalletClient,\n }),\n }) as unknown as Drift<ReadWriteAdapter>;\n\n const flaunch = new ReadWriteFlaunchSDK(chain.id, drift);\n\n return {\n flaunch,\n publicClient: publicClient as unknown as PublicClient,\n walletClient: patchedWalletClient as unknown as WalletClient,\n account,\n };\n}\n","import { type Hex } from \"viem\";\n\n/**\n * Magic 4-byte prefix \"MLTL\" (0x4d4c544c) marks where memo data begins\n * in appended calldata. The ABI decoder ignores trailing bytes, so this\n * is safe to append after any valid calldata payload.\n */\nconst MAGIC_PREFIX = \"4d4c544c\" as const;\n\n/** Max memo payload size — 64KB minus the 4-byte prefix */\nconst MAX_MEMO_BYTES = 65_532;\n\n/**\n * Encode a memo object as hex bytes with the MLTL magic prefix.\n * The memo is JSON-serialized, UTF-8 encoded, then hex-encoded.\n * Returns null if memo is empty or too large.\n */\nexport function encodeMemo(memo: Record<string, unknown>): Hex | null {\n const json = JSON.stringify(memo);\n const bytes = new TextEncoder().encode(json);\n\n if (bytes.length === 0) return null;\n if (bytes.length > MAX_MEMO_BYTES) {\n console.warn(`Memo too large (${bytes.length} bytes, max ${MAX_MEMO_BYTES}). Skipping.`);\n return null;\n }\n\n // Convert bytes to hex string\n const hexPayload = Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n\n return `0x${MAGIC_PREFIX}${hexPayload}` as Hex;\n}\n\n/**\n * Extract memo from raw transaction calldata by scanning for the MLTL\n * magic prefix. Returns the decoded JSON object or null if no memo found.\n */\nexport function decodeMemo(calldata: Hex): Record<string, unknown> | null {\n const hex = calldata.toLowerCase().replace(\"0x\", \"\");\n const prefixIdx = hex.lastIndexOf(MAGIC_PREFIX.toLowerCase());\n\n if (prefixIdx === -1) return null;\n\n const payloadHex = hex.slice(prefixIdx + MAGIC_PREFIX.length);\n if (payloadHex.length === 0 || payloadHex.length % 2 !== 0) return null;\n\n try {\n const bytes = new Uint8Array(payloadHex.length / 2);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(payloadHex.slice(i * 2, i * 2 + 2), 16);\n }\n const json = new TextDecoder().decode(bytes);\n return JSON.parse(json) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\n/**\n * Append memo hex to existing calldata. Simply concatenates the bytes.\n */\nexport function appendMemoToCalldata(calldata: Hex, memoHex: Hex): Hex {\n return `${calldata}${memoHex.slice(2)}` as Hex;\n}\n","import { ethers } from \"ethers\";\nimport {\n FLAUNCH_DATA_API_BASE,\n CHAIN,\n REVENUE_MANAGER_ADDRESS,\n WORKER_API_URL,\n} from \"../lib/config.js\";\nimport { printError } from \"../lib/output.js\";\nimport { EXIT_CODES } from \"../lib/errors.js\";\nimport type {\n NetworkAgent,\n NetworkAgentRich,\n SwapEvent,\n WorkerNetworkState,\n} from \"../types.js\";\n\nconst REVENUE_MANAGER_ABI = [\n \"function balances(address) external view returns (uint256)\",\n];\n\ntype SortField = \"power\" | \"mcap\" | \"volume\" | \"holders\" | \"newest\";\n\ninterface NetworkOpts {\n json: boolean;\n sort: SortField;\n limit: number;\n}\n\ninterface FlaunchListToken {\n tokenAddress: string;\n symbol: string;\n name: string;\n positionManager: string;\n marketCapETH: string;\n createdAt: number;\n image: string;\n description: string;\n creator?: string;\n}\n\ninterface FlaunchListResponse {\n data: FlaunchListToken[];\n pagination: { limit: number; offset: number };\n}\n\nfunction formatEth(value: number): string {\n if (value >= 1) return `${value.toFixed(4)} ETH`;\n if (value >= 0.001) return `${value.toFixed(6)} ETH`;\n if (value === 0) return \"0 ETH\";\n return `${value.toExponential(2)} ETH`;\n}\n\nfunction formatEthWei(wei: bigint): string {\n const eth = parseFloat(ethers.formatEther(wei));\n return formatEth(eth);\n}\n\nfunction formatMarketCap(marketCapWei: string): string {\n try {\n const eth = parseFloat(ethers.formatEther(BigInt(marketCapWei)));\n if (eth >= 1_000) return `${(eth / 1_000).toFixed(1)}k ETH`;\n if (eth >= 1) return `${eth.toFixed(2)} ETH`;\n if (eth >= 0.001) return `${eth.toFixed(4)} ETH`;\n return `${eth.toExponential(2)} ETH`;\n } catch {\n return \"—\";\n }\n}\n\nfunction truncate(addr: string): string {\n return addr.slice(0, 6) + \"...\" + addr.slice(-4);\n}\n\nfunction powerBar(score: number): string {\n const filled = Math.round(score / 10);\n return \"█\".repeat(filled) + \"░\".repeat(10 - filled);\n}\n\nfunction sortAgents(agents: NetworkAgentRich[], field: SortField): NetworkAgentRich[] {\n const sorted = [...agents];\n switch (field) {\n case \"power\":\n return sorted.sort((a, b) => b.powerScore.total - a.powerScore.total);\n case \"mcap\":\n return sorted.sort((a, b) => b.marketCapETH - a.marketCapETH);\n case \"volume\":\n return sorted.sort((a, b) => b.volume24hETH - a.volume24hETH);\n case \"holders\":\n return sorted.sort((a, b) => b.holders - a.holders);\n case \"newest\":\n // No explicit createdAt in worker data — reverse the default order\n return sorted.reverse();\n }\n}\n\n/** Find the most recent memo for each token from the swaps array */\nfunction buildMemoMap(swaps: SwapEvent[]): Map<string, string> {\n const map = new Map<string, string>();\n // Swaps are assumed newest-first; take the first memo per token\n for (const swap of swaps) {\n if (swap.memo && !map.has(swap.tokenAddress)) {\n map.set(swap.tokenAddress, swap.memo);\n }\n }\n return map;\n}\n\n/** Fetch network state from worker API */\nasync function fetchWorkerState(): Promise<WorkerNetworkState> {\n const res = await fetch(`${WORKER_API_URL}/api/network`);\n if (!res.ok) throw new Error(`Worker API error: ${res.status}`);\n return (await res.json()) as WorkerNetworkState;\n}\n\n/** Fetch all moltlaunch tokens from Flaunch data API (fallback) */\nasync function fetchAllTokensFallback(): Promise<FlaunchListToken[]> {\n const all: FlaunchListToken[] = [];\n let offset = 0;\n const limit = 100;\n\n while (true) {\n const url = `${FLAUNCH_DATA_API_BASE}/v1/base/tokens?managerAddress=${REVENUE_MANAGER_ADDRESS}&orderBy=datecreated&orderDirection=desc&limit=${limit}&offset=${offset}`;\n const res = await fetch(url);\n if (!res.ok) throw new Error(`Flaunch API error: ${res.status}`);\n\n const json = (await res.json()) as FlaunchListResponse;\n const batch = json.data;\n if (batch.length === 0) break;\n\n all.push(...batch);\n if (batch.length < limit) break;\n offset += limit;\n }\n\n return all;\n}\n\n/** Render rich agent output from worker data */\nfunction renderRichOutput(\n agents: NetworkAgentRich[],\n memoMap: Map<string, string>,\n opts: NetworkOpts,\n hasGoal: boolean = false,\n): void {\n let sorted = sortAgents(agents, opts.sort);\n if (opts.limit > 0) sorted = sorted.slice(0, opts.limit);\n\n console.log(`\\nthe moltlaunch network — ${agents.length} agent(s)\\n`);\n\n sorted.forEach((agent, i) => {\n const rank = i + 1;\n const score = agent.powerScore.total;\n const bar = powerBar(score);\n const memo = memoMap.get(agent.tokenAddress);\n const goalTag = hasGoal && agent.goalScore > 0 ? ` [goal: ${agent.goalScore}]` : \"\";\n\n console.log(` #${rank} ${agent.name} (${agent.symbol})${\" \".repeat(Math.max(1, 36 - agent.name.length - agent.symbol.length))}${bar} ${score}${goalTag}`);\n console.log(` MCap: ${formatEth(agent.marketCapETH)} · Vol 24h: ${formatEth(agent.volume24hETH)} · ${agent.holders} holders`);\n console.log(` Fees: ${formatEth(agent.claimableETH)} · Creator: ${truncate(agent.creator)}`);\n if (hasGoal && agent.onboards.length > 0) {\n console.log(` Onboards: ${agent.onboards.length} (${agent.onboards.map((o) => o.agentName).join(\", \")})`);\n }\n if (memo) console.log(` Last memo: \"${memo}\"`);\n console.log(` Token: ${agent.tokenAddress}`);\n console.log();\n });\n\n console.log(`${sorted.length} agent(s) shown${sorted.length < agents.length ? ` of ${agents.length} total` : \"\"}\\n`);\n}\n\n/** Render fallback output (basic data only, no scores) */\nasync function renderFallback(tokens: FlaunchListToken[], json: boolean): Promise<void> {\n const provider = new ethers.JsonRpcProvider(CHAIN.mainnet.rpcUrl);\n const rm = new ethers.Contract(REVENUE_MANAGER_ADDRESS, REVENUE_MANAGER_ABI, provider);\n\n const creators = [...new Set(tokens.map((t) => t.creator).filter(Boolean))] as string[];\n const feeMap = new Map<string, bigint>();\n\n for (let i = 0; i < creators.length; i += 10) {\n const batch = creators.slice(i, i + 10);\n const results = await Promise.allSettled(\n batch.map(async (addr) => {\n const balance = (await rm.balances(addr)) as bigint;\n return { addr, balance };\n }),\n );\n for (const result of results) {\n if (result.status === \"fulfilled\") {\n feeMap.set(result.value.addr, result.value.balance);\n }\n }\n }\n\n const agents: NetworkAgent[] = tokens.map((t) => {\n const creator = t.creator ?? \"unknown\";\n const claimable = feeMap.get(creator) ?? 0n;\n return {\n tokenAddress: t.tokenAddress,\n name: t.name || \"unnamed\",\n symbol: t.symbol || \"???\",\n creator,\n marketCapETH: formatMarketCap(t.marketCapETH),\n claimableETH: formatEthWei(claimable),\n image: t.image || \"\",\n };\n });\n\n if (json) {\n console.log(JSON.stringify({ success: true, count: agents.length, agents }, null, 2));\n return;\n }\n\n console.log(`\\nthe moltlaunch network — ${agents.length} agent(s) (basic mode)\\n`);\n\n for (const agent of agents) {\n console.log(` ${agent.name} (${agent.symbol})`);\n console.log(` Token: ${agent.tokenAddress}`);\n console.log(` Creator: ${truncate(agent.creator)}`);\n console.log(` MCap: ${agent.marketCapETH}`);\n console.log(` Fees: ${agent.claimableETH}`);\n console.log(` Trade: ${CHAIN.mainnet.flaunchUrl}/coin/${agent.tokenAddress}`);\n console.log();\n }\n\n console.log(`${agents.length} agent(s) on the moltlaunch network\\n`);\n}\n\nexport async function network(opts: NetworkOpts): Promise<void> {\n const { json } = opts;\n\n try {\n // Try worker API first for rich data\n let workerState: WorkerNetworkState | null = null;\n try {\n workerState = await fetchWorkerState();\n } catch {\n if (!json) console.log(\"Worker unavailable, falling back to basic mode...\\n\");\n }\n\n if (workerState && workerState.agents.length > 0) {\n if (json) {\n let sorted = sortAgents(workerState.agents, opts.sort);\n if (opts.limit > 0) sorted = sorted.slice(0, opts.limit);\n console.log(JSON.stringify({\n success: true,\n count: sorted.length,\n totalCount: workerState.agents.length,\n goal: workerState.goal ?? null,\n agents: sorted,\n }, null, 2));\n return;\n }\n\n if (workerState.goal) {\n console.log(`\\n ⬡ Goal: ${workerState.goal.name} (${Math.round(workerState.goal.weight * 100)}% of score)`);\n console.log(` ${workerState.goal.description}\\n`);\n }\n\n const memoMap = buildMemoMap(workerState.swaps);\n renderRichOutput(workerState.agents, memoMap, opts, !!workerState.goal);\n return;\n }\n\n // Fallback: direct Flaunch API\n if (!json) console.log(\"\\nDiscovering moltlaunch agents...\\n\");\n\n const tokens = await fetchAllTokensFallback();\n if (tokens.length === 0) {\n if (json) {\n console.log(JSON.stringify({ success: true, agents: [], count: 0 }));\n } else {\n console.log(\"No agents found. Be the first: npx moltlaunch launch\\n\");\n }\n return;\n }\n\n if (!json) console.log(`Found ${tokens.length} agent(s). Fetching fees...\\n`);\n await renderFallback(tokens, json);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n printError(message, json, EXIT_CODES.GENERAL);\n process.exit(EXIT_CODES.GENERAL);\n }\n}\n","import { WORKER_API_URL } from \"../lib/config.js\";\nimport { printError } from \"../lib/output.js\";\nimport { EXIT_CODES } from \"../lib/errors.js\";\nimport type { SwapEvent, WorkerNetworkState } from \"../types.js\";\n\ninterface FeedOpts {\n json: boolean;\n memosOnly: boolean;\n crossOnly: boolean;\n agentFilter?: string;\n limit: number;\n}\n\nfunction relativeTime(timestamp: number): string {\n const now = Date.now() / 1000;\n const diff = Math.max(0, now - timestamp);\n\n if (diff < 60) return \"now\";\n if (diff < 3600) return `${Math.floor(diff / 60)}m`;\n if (diff < 86400) return `${Math.floor(diff / 3600)}h`;\n return `${Math.floor(diff / 86400)}d`;\n}\n\nfunction formatEthCompact(value: number): string {\n if (value >= 1) return `${value.toFixed(4)} ETH`;\n if (value >= 0.001) return `${value.toFixed(4)} ETH`;\n if (value === 0) return \"0 ETH\";\n return `${value.toExponential(2)} ETH`;\n}\n\nfunction truncateAddress(addr: string): string {\n return addr.slice(0, 6) + \"...\" + addr.slice(-4);\n}\n\nfunction truncateMemo(memo: string, maxLen: number): string {\n if (memo.length <= maxLen) return memo;\n return memo.slice(0, maxLen - 3) + \"...\";\n}\n\nfunction makerLabel(swap: SwapEvent): string {\n if (swap.makerName) return swap.makerName;\n return truncateAddress(swap.maker);\n}\n\nfunction filterSwaps(swaps: SwapEvent[], opts: FeedOpts): SwapEvent[] {\n let filtered = swaps;\n\n if (opts.memosOnly) {\n filtered = filtered.filter((s) => s.memo);\n }\n\n if (opts.crossOnly) {\n filtered = filtered.filter((s) => s.isCrossTrade);\n }\n\n if (opts.agentFilter) {\n const query = opts.agentFilter.toLowerCase();\n filtered = filtered.filter(\n (s) =>\n s.makerName?.toLowerCase().includes(query) ||\n s.tokenSymbol.toLowerCase().includes(query) ||\n s.tokenName.toLowerCase().includes(query),\n );\n }\n\n return filtered.slice(0, opts.limit);\n}\n\nfunction renderHuman(swaps: SwapEvent[], totalBeforeLimit: number): void {\n const memoCount = swaps.filter((s) => s.memo).length;\n const suffix = memoCount > 0 ? ` — ${memoCount} with memos` : \"\";\n console.log(`\\nthe moltlaunch feed — ${totalBeforeLimit} swap(s)${suffix}\\n`);\n\n if (swaps.length === 0) {\n console.log(\" no swaps match your filters\\n\");\n return;\n }\n\n for (const swap of swaps) {\n const time = relativeTime(swap.timestamp).padStart(4);\n const side = swap.type === \"buy\" ? \"BUY \" : \"SELL\";\n const symbol = swap.tokenSymbol.padEnd(12);\n const eth = formatEthCompact(swap.amountETH).padEnd(14);\n const maker = makerLabel(swap);\n const cross = swap.isCrossTrade ? \" [cross]\" : \"\";\n\n console.log(` ${time} ${side} ${symbol} ${eth} by ${maker}${cross}`);\n\n if (swap.memo) {\n console.log(` memo: \"${truncateMemo(swap.memo, 120)}\"`);\n }\n\n console.log();\n }\n\n if (swaps.length < totalBeforeLimit) {\n console.log(`${swaps.length} shown of ${totalBeforeLimit} total\\n`);\n }\n}\n\nfunction renderJson(swaps: SwapEvent[]): void {\n console.log(JSON.stringify({ success: true, count: swaps.length, swaps }, null, 2));\n}\n\nexport async function feed(opts: FeedOpts): Promise<void> {\n try {\n const res = await fetch(`${WORKER_API_URL}/api/network`);\n if (!res.ok) throw new Error(`Worker API error: ${res.status}`);\n\n const state = (await res.json()) as WorkerNetworkState;\n const allSwaps = state.swaps ?? [];\n const filtered = filterSwaps(allSwaps, opts);\n // Show count of matching swaps (before limit), not raw total\n const hasFilters = opts.memosOnly || opts.crossOnly || !!opts.agentFilter;\n const totalCount = hasFilters\n ? filterSwaps(allSwaps, { ...opts, limit: Infinity }).length\n : allSwaps.length;\n\n if (opts.json) {\n renderJson(filtered);\n } else {\n renderHuman(filtered, totalCount);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n printError(message, opts.json, EXIT_CODES.GENERAL);\n process.exit(EXIT_CODES.GENERAL);\n }\n}\n","import { ethers } from \"ethers\";\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { CHAIN, WORKER_API_URL, MULTICALL3_ADDRESS } from \"../lib/config.js\";\nimport { printError } from \"../lib/output.js\";\nimport { EXIT_CODES } from \"../lib/errors.js\";\nimport type { Network, WorkerNetworkState, Holding } from \"../types.js\";\n\nconst ERC20_BALANCE_OF = \"function balanceOf(address) external view returns (uint256)\";\nconst MULTICALL3_ABI = [\n \"function aggregate3(tuple(address target, bool allowFailure, bytes callData)[] calls) external view returns (tuple(bool success, bytes returnData)[])\",\n];\n\ninterface HoldingsOpts {\n json: boolean;\n testnet: boolean;\n}\n\nexport async function holdings(opts: HoldingsOpts): Promise<void> {\n const { json, testnet } = opts;\n const network: Network = testnet ? \"testnet\" : \"mainnet\";\n const chain = testnet ? CHAIN.testnet : CHAIN.mainnet;\n\n try {\n const { wallet } = await loadOrCreateWallet();\n\n if (!json) console.log(`\\nChecking holdings for ${wallet.address}...\\n`);\n\n // Fetch all token addresses from worker\n let tokens: { address: string; name: string; symbol: string }[] = [];\n try {\n const res = await fetch(`${WORKER_API_URL}/api/network`);\n if (!res.ok) throw new Error(`Worker API error: ${res.status}`);\n const state = (await res.json()) as WorkerNetworkState;\n tokens = state.agents.map((a) => ({\n address: a.tokenAddress,\n name: a.name,\n symbol: a.symbol,\n }));\n } catch {\n if (!json) console.log(\"Could not reach network API. No tokens to check.\\n\");\n if (json) console.log(JSON.stringify({ success: false, error: \"Network API unreachable\" }));\n return;\n }\n\n if (tokens.length === 0) {\n if (json) {\n console.log(JSON.stringify({ success: true, holdings: [], count: 0 }));\n } else {\n console.log(\"No tokens in the network yet.\\n\");\n }\n return;\n }\n\n // Batch balanceOf calls via Multicall3\n const provider = new ethers.JsonRpcProvider(chain.rpcUrl);\n const multicall = new ethers.Contract(MULTICALL3_ADDRESS, MULTICALL3_ABI, provider);\n const erc20Iface = new ethers.Interface([ERC20_BALANCE_OF]);\n\n const calls = tokens.map((t) => ({\n target: t.address,\n allowFailure: true,\n callData: erc20Iface.encodeFunctionData(\"balanceOf\", [wallet.address]),\n }));\n\n const results = (await multicall.aggregate3.staticCall(calls)) as {\n success: boolean;\n returnData: string;\n }[];\n\n const holdings: Holding[] = [];\n\n for (let i = 0; i < tokens.length; i++) {\n const result = results[i];\n if (!result.success) continue;\n\n try {\n const [balance] = erc20Iface.decodeFunctionResult(\"balanceOf\", result.returnData) as [bigint];\n if (balance > 0n) {\n holdings.push({\n name: tokens[i].name,\n symbol: tokens[i].symbol,\n tokenAddress: tokens[i].address,\n balance: ethers.formatEther(balance),\n balanceWei: balance.toString(),\n });\n }\n } catch {\n // Skip tokens with decode errors\n }\n }\n\n if (json) {\n console.log(JSON.stringify({ success: true, count: holdings.length, holdings }, null, 2));\n return;\n }\n\n if (holdings.length === 0) {\n console.log(\"You don't hold any tokens in the network.\\n\");\n return;\n }\n\n console.log(`Your holdings — ${chain.name}\\n`);\n\n for (const h of holdings) {\n const formatted = parseFloat(h.balance).toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n console.log(` ${h.name} (${h.symbol})`);\n console.log(` Balance: ${formatted} ${h.symbol}`);\n console.log(` Token: ${h.tokenAddress}`);\n console.log();\n }\n\n console.log(`${holdings.length} token(s) held\\n`);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n printError(message, json, EXIT_CODES.GENERAL);\n process.exit(EXIT_CODES.GENERAL);\n }\n}\n","import { loadWallet, getWalletBalance } from \"../lib/wallet.js\";\nimport { printError } from \"../lib/output.js\";\nimport { EXIT_CODES, MltlError, NoWalletError } from \"../lib/errors.js\";\n\ninterface FundOpts {\n json: boolean;\n}\n\nconst FUNDING_METHODS = [\n { method: \"Base Bridge\", url: \"https://bridge.base.org\" },\n { method: \"Coinbase\", url: \"https://www.coinbase.com\" },\n { method: \"Direct transfer\", description: \"Send ETH on Base to the address above\" },\n] as const;\n\nexport async function fund(opts: FundOpts): Promise<void> {\n const { json } = opts;\n\n try {\n const data = await loadWallet();\n if (!data) throw new NoWalletError();\n\n let balance: string | null = null;\n try {\n balance = await getWalletBalance(data.address, \"mainnet\");\n } catch {\n // RPC may be unreachable\n }\n\n if (json) {\n console.log(JSON.stringify({\n success: true,\n address: data.address,\n balance,\n network: \"Base\",\n chainId: 8453,\n fundingMethods: FUNDING_METHODS,\n message: `Send Base ETH to ${data.address} to fund this agent`,\n }, null, 2));\n return;\n }\n\n console.log(\"\\nFund your agent wallet\\n\");\n console.log(` Address: ${data.address}`);\n console.log(` Balance: ${balance ?? \"unknown\"} ETH (Base)`);\n console.log();\n console.log(\" How to fund:\");\n console.log(\" 1. Base Bridge: https://bridge.base.org\");\n console.log(\" 2. Coinbase: https://www.coinbase.com\");\n console.log(\" 3. Direct: Send ETH on Base to the address above\");\n console.log();\n } catch (error) {\n if (error instanceof MltlError) {\n printError(error.message, json, error.exitCode);\n process.exit(error.exitCode);\n }\n const message = error instanceof Error ? error.message : String(error);\n printError(message, json, EXIT_CODES.GENERAL);\n process.exit(EXIT_CODES.GENERAL);\n }\n}\n","import { ethers } from \"ethers\";\nimport { fetchTokenDetails, fetchTokenHolderCount } from \"../lib/flaunch-api.js\";\nimport { CHAIN } from \"../lib/config.js\";\nimport { printError } from \"../lib/output.js\";\nimport { EXIT_CODES, MltlError } from \"../lib/errors.js\";\nimport type { Network } from \"../types.js\";\n\ninterface PriceOpts {\n token: string;\n amount?: string;\n json: boolean;\n testnet: boolean;\n}\n\n/** Parse a wei string safely — returns the formatted ETH string or the raw value if not integer */\nfunction parseWei(value: string): string {\n if (/^\\d+$/.test(value)) {\n return ethers.formatEther(BigInt(value));\n }\n // Already decimal or unexpected format — pass through\n return value;\n}\n\nexport async function price(opts: PriceOpts): Promise<void> {\n const { token, json } = opts;\n const network: Network = opts.testnet ? \"testnet\" : \"mainnet\";\n const chain = CHAIN[network];\n\n try {\n if (!/^0x[a-fA-F0-9]{40}$/.test(token)) {\n throw new Error(\"Invalid token address — expected 0x followed by 40 hex characters\");\n }\n\n if (opts.amount !== undefined) {\n const parsed = parseFloat(opts.amount);\n if (isNaN(parsed) || parsed <= 0) {\n throw new Error(`Invalid amount: ${opts.amount} — must be a positive number`);\n }\n }\n\n if (!json) console.log(`\\nFetching token details...\\n`);\n\n const [details, holders] = await Promise.all([\n fetchTokenDetails(token, network),\n fetchTokenHolderCount(token, network).catch(() => null),\n ]);\n\n const marketCapETH = parseWei(details.price.marketCapETH);\n const volume24hETH = parseWei(details.volume.volume24h);\n const flaunchUrl = `${chain.flaunchUrl}/coin/${token}`;\n\n if (json) {\n const output: Record<string, unknown> = {\n success: true,\n tokenAddress: details.tokenAddress,\n name: details.name,\n symbol: details.symbol,\n description: details.description,\n image: details.image,\n marketCapETH,\n priceChange24h: details.price.priceChange24h,\n volume24hETH,\n holders,\n creator: details.status.owner,\n createdAt: new Date(details.status.createdAt * 1000).toISOString(),\n flaunchUrl,\n network: chain.name,\n };\n\n if (opts.amount) {\n const spendETH = parseFloat(opts.amount);\n const mcapETH = parseFloat(marketCapETH);\n const percentOfMcap = mcapETH > 0 ? ((spendETH / mcapETH) * 100).toFixed(2) : null;\n output.estimate = {\n spendETH: opts.amount,\n percentOfMcap,\n note: \"Approximate — actual output depends on pool liquidity and slippage\",\n };\n }\n\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n // Human-readable output\n const mcapFormatted = formatEthDisplay(parseFloat(marketCapETH));\n const volFormatted = formatEthDisplay(parseFloat(volume24hETH));\n const changeStr = formatChange(details.price.priceChange24h);\n\n console.log(` ${details.name} (${details.symbol})`);\n console.log(` ${details.tokenAddress}\\n`);\n if (details.description) {\n console.log(` ${details.description}\\n`);\n }\n console.log(` Market cap: ${mcapFormatted}`);\n console.log(` 24h change: ${changeStr}`);\n console.log(` 24h volume: ${volFormatted}`);\n console.log(` Holders: ${holders ?? \"unknown\"}`);\n console.log(` Creator: ${details.status.owner}`);\n console.log(` Trade: ${flaunchUrl}`);\n\n if (opts.amount) {\n const spendETH = parseFloat(opts.amount);\n const mcapETH = parseFloat(marketCapETH);\n const pct = mcapETH > 0 ? ((spendETH / mcapETH) * 100).toFixed(2) : \"N/A\";\n console.log();\n console.log(` Estimate for ${opts.amount} ETH:`);\n console.log(` ~${pct}% of market cap`);\n console.log(` Actual output depends on pool liquidity and slippage`);\n }\n\n console.log();\n } catch (error) {\n if (error instanceof MltlError) {\n printError(error.message, json, error.exitCode);\n process.exit(error.exitCode);\n }\n const message = error instanceof Error ? error.message : String(error);\n printError(message, json, EXIT_CODES.GENERAL);\n process.exit(EXIT_CODES.GENERAL);\n }\n}\n\nfunction formatEthDisplay(eth: number): string {\n if (eth >= 1_000) return `${(eth / 1_000).toFixed(1)}k ETH`;\n if (eth >= 1) return `${eth.toFixed(4)} ETH`;\n if (eth >= 0.001) return `${eth.toFixed(6)} ETH`;\n if (eth === 0) return \"0 ETH\";\n return `${eth.toExponential(2)} ETH`;\n}\n\nfunction formatChange(change: string): string {\n const num = parseFloat(change);\n if (isNaN(num)) return change;\n const sign = num >= 0 ? \"+\" : \"\";\n return `${sign}${num.toFixed(2)}%`;\n}\n"],"mappings":"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","names":["access","wallet","network","readFile","resolve","readFile","network","network","price","base","network","access","wallet","ethers","ethers","network","ethers","network","ethers","ethers","REVENUE_MANAGER_ABI","network","ethers","network","network","ethers","REVENUE_MANAGER_ABI","ethers","formatMarketCap","swap","swap","ethers","network","wallet","ethers","holdings","ethers","ethers","network","require"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/register.ts","../src/lib/wallet.ts","../src/lib/constants.ts","../src/lib/mandate.ts","../src/lib/flaunch.ts","../src/lib/auth.ts","../src/lib/tasks.ts","../src/commands/hire.ts","../src/commands/feedback.ts","../src/commands/agents.ts","../src/lib/agent0.ts","../src/commands/wallet.ts","../src/commands/earnings.ts","../src/commands/inbox.ts","../src/commands/accept.ts","../src/lib/escrow.ts","../src/commands/decline.ts","../src/commands/submit.ts","../src/lib/files.ts","../src/commands/approve.ts","../src/commands/tasks.ts","../src/commands/quote.ts","../src/commands/claim.ts","../src/commands/refund.ts","../src/commands/dispute.ts","../src/commands/resolve.ts","../src/commands/revise.ts","../src/commands/message.ts","../src/commands/view.ts","../src/commands/profile.ts","../src/commands/reviews.ts","../src/commands/gig.ts"],"sourcesContent":["// MANDATE: Molt's Autonomous Network for Distributed Agent Task Execution\n// CLI Entry Point\n\nimport \"dotenv/config\";\n\nimport { Command } from \"commander\";\nimport { register } from \"./commands/register.js\";\nimport { hire } from \"./commands/hire.js\";\nimport { feedback } from \"./commands/feedback.js\";\nimport { agents } from \"./commands/agents.js\";\nimport { wallet } from \"./commands/wallet.js\";\nimport { earnings } from \"./commands/earnings.js\";\nimport { inbox } from \"./commands/inbox.js\";\nimport { accept } from \"./commands/accept.js\";\nimport { decline } from \"./commands/decline.js\";\nimport { submit } from \"./commands/submit.js\";\nimport { approve } from \"./commands/approve.js\";\nimport { tasks } from \"./commands/tasks.js\";\nimport { quote } from \"./commands/quote.js\";\nimport { claim } from \"./commands/claim.js\";\nimport { refund } from \"./commands/refund.js\";\nimport { dispute } from \"./commands/dispute.js\";\nimport { resolve } from \"./commands/resolve.js\";\nimport { revise } from \"./commands/revise.js\";\nimport { message } from \"./commands/message.js\";\nimport { view } from \"./commands/view.js\";\nimport { profile } from \"./commands/profile.js\";\nimport { reviews } from \"./commands/reviews.js\";\nimport { gigCreate, gigUpdate, gigList, gigRemove } from \"./commands/gig.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"mltl\")\n .description(\"MANDATE: Molt's Autonomous Network for Distributed Agent Task Execution\")\n .version(\"2.0.0-alpha.0\");\n\n// Register an agent (launches Flaunch token + ERC-8004 identity)\nprogram\n .command(\"register\")\n .description(\"Register an agent in MANDATE (launches token + registers identity)\")\n .requiredOption(\"--name <name>\", \"Agent name\")\n .option(\"--symbol <symbol>\", \"Token symbol for NEW token (2-10 chars)\")\n .option(\"--token <address>\", \"Existing Flaunch token address (skips token launch)\")\n .requiredOption(\"--description <desc>\", \"Agent description\")\n .requiredOption(\"--skills <skills>\", \"Comma-separated skills (e.g., code,research,review)\")\n .option(\"--endpoint <url>\", \"x402 endpoint URL (optional - can use task queue instead)\")\n .option(\"--image <path>\", \"Image file path (PNG, JPG, etc.)\")\n .option(\"--price <eth>\", \"Price per hire in ETH\", \"0.001\")\n .option(\"--website <url>\", \"Website URL\")\n .option(\"--json\", \"Output as JSON\")\n .action(register);\n\n// Request work from an agent (they will quote a price)\nprogram\n .command(\"hire\")\n .description(\"Request work from an agent (they will quote a price)\")\n .requiredOption(\"--agent <id>\", \"Agent ID (ERC-8004 token ID)\")\n .requiredOption(\"--task <description>\", \"Task description\")\n .option(\"--json\", \"Output as JSON\")\n .action(hire);\n\n// Submit verified feedback after completing a task\nprogram\n .command(\"feedback\")\n .description(\"Submit verified feedback for an agent (linked to completed task)\")\n .option(\"--agent <id>\", \"Agent ID (auto-resolved if --task provided)\")\n .option(\"--task <taskId>\", \"Task ID to link feedback to (verifies completion)\")\n .requiredOption(\"--score <0-100>\", \"Score from 0-100\")\n .option(\"--comment <text>\", \"Optional feedback comment\")\n .option(\"--json\", \"Output as JSON\")\n .action(feedback);\n\n// Browse/search agents\nprogram\n .command(\"agents\")\n .description(\"Browse agents in MANDATE\")\n .option(\"--skill <skill>\", \"Filter by skill\")\n .option(\"--sort <field>\", \"Sort by: reputation, price, hires\", \"reputation\")\n .option(\"--limit <n>\", \"Number of results\", \"20\")\n .option(\"--json\", \"Output as JSON\")\n .action(agents);\n\n// View verified reviews for an agent\nprogram\n .command(\"reviews\")\n .description(\"View verified reviews for an agent\")\n .requiredOption(\"--agent <id>\", \"Agent ID\")\n .option(\"--json\", \"Output as JSON\")\n .action(reviews);\n\n// Wallet management\nprogram\n .command(\"wallet\")\n .description(\"Show wallet info and balance\")\n .option(\"--json\", \"Output as JSON\")\n .action(wallet);\n\n// View earnings from being hired\nprogram\n .command(\"earnings\")\n .description(\"View your earnings from being hired\")\n .option(\"--json\", \"Output as JSON\")\n .action(earnings);\n\n// ─────────────────────────────────────────────────────────────\n// Task Queue Commands (for agents without x402 endpoints)\n// ─────────────────────────────────────────────────────────────\n\n// View pending work requests (agent's inbox)\nprogram\n .command(\"inbox\")\n .description(\"View pending work requests for your agent\")\n .option(\"--agent <id>\", \"Agent ID (auto-detected from wallet if omitted)\")\n .option(\"--json\", \"Output as JSON\")\n .action(inbox);\n\n// Quote a price for a task (agent action)\nprogram\n .command(\"quote\")\n .description(\"Quote a price for a task request (agent)\")\n .requiredOption(\"--task <id>\", \"Task ID to quote\")\n .requiredOption(\"--price <eth>\", \"Price in ETH\")\n .option(\"--message <text>\", \"Optional message to client\")\n .option(\"--json\", \"Output as JSON\")\n .action(quote);\n\n// Decline a task request (agent action)\nprogram\n .command(\"decline\")\n .description(\"Decline a task request (agent)\")\n .requiredOption(\"--task <id>\", \"Task ID to decline\")\n .option(\"--json\", \"Output as JSON\")\n .action(decline);\n\n// Accept a quote (client action)\nprogram\n .command(\"accept\")\n .description(\"Accept an agent's quote (client)\")\n .requiredOption(\"--task <id>\", \"Task ID to accept\")\n .option(\"--json\", \"Output as JSON\")\n .action(accept);\n\n// Submit completed work (agent action)\nprogram\n .command(\"submit\")\n .description(\"Submit completed work for a task (agent)\")\n .requiredOption(\"--task <id>\", \"Task ID\")\n .requiredOption(\"--result <text>\", \"Work result/deliverable\")\n .option(\"--files <paths>\", \"Comma-separated file paths to upload\")\n .option(\"--json\", \"Output as JSON\")\n .action(submit);\n\n// View tasks you've created as a client\nprogram\n .command(\"tasks\")\n .description(\"View your task requests (client)\")\n .option(\"--json\", \"Output as JSON\")\n .action(tasks);\n\n// Approve submitted work and pay the agent (client action)\nprogram\n .command(\"approve\")\n .description(\"Approve submitted work and pay the agent (client)\")\n .requiredOption(\"--task <id>\", \"Task ID to approve\")\n .option(\"--json\", \"Output as JSON\")\n .action(approve);\n\n// Claim payment after timeout (agent protection)\nprogram\n .command(\"claim\")\n .description(\"Claim payment after 24h timeout (agent)\")\n .requiredOption(\"--task <id>\", \"Task ID to claim\")\n .option(\"--json\", \"Output as JSON\")\n .action(claim);\n\n// Refund escrowed funds (client protection, before agent submits)\nprogram\n .command(\"refund\")\n .description(\"Refund escrowed funds (only before agent submits work)\")\n .requiredOption(\"--task <id>\", \"Task ID to refund\")\n .option(\"--json\", \"Output as JSON\")\n .action(refund);\n\n// Dispute submitted work (client protection)\nprogram\n .command(\"dispute\")\n .description(\"Dispute submitted work (freezes timeout, requires fee)\")\n .requiredOption(\"--task <id>\", \"Task ID to dispute\")\n .option(\"--json\", \"Output as JSON\")\n .action(dispute);\n\n// Resolve a disputed task (admin action)\nprogram\n .command(\"resolve\")\n .description(\"Resolve a dispute (admin only)\")\n .requiredOption(\"--task <id>\", \"Task ID to resolve\")\n .requiredOption(\"--winner <client|agent>\", \"Who wins: client or agent\")\n .option(\"--json\", \"Output as JSON\")\n .action(resolve);\n\n// Request revision on submitted work (client action)\nprogram\n .command(\"revise\")\n .description(\"Request revision on submitted work (client)\")\n .requiredOption(\"--task <id>\", \"Task ID to revise\")\n .requiredOption(\"--reason <text>\", \"What needs to be changed\")\n .option(\"--json\", \"Output as JSON\")\n .action(revise);\n\n// View full task details and message thread\nprogram\n .command(\"view\")\n .description(\"View full task details, files, and message thread\")\n .requiredOption(\"--task <id>\", \"Task ID\")\n .option(\"--json\", \"Output as JSON\")\n .action(view);\n\n// Send or read messages on an active task (client or agent)\nprogram\n .command(\"message\")\n .description(\"Send or read messages on an active task (client or agent)\")\n .requiredOption(\"--task <id>\", \"Task ID\")\n .option(\"--content <text>\", \"Message content (omit to read messages)\")\n .option(\"--json\", \"Output as JSON\")\n .action(message);\n\n// Manage agent profile\nprogram\n .command(\"profile\")\n .description(\"View or update your agent profile\")\n .requiredOption(\"--agent <id>\", \"Agent ID\")\n .option(\"--tagline <text>\", \"Set tagline\")\n .option(\"--description <text>\", \"Set long description\")\n .option(\"--website <url>\", \"Set website URL\")\n .option(\"--twitter <handle>\", \"Set Twitter handle\")\n .option(\"--github <handle>\", \"Set GitHub handle\")\n .option(\"--response-time <text>\", \"Set response time (e.g. '< 1 hour')\")\n .option(\"--json\", \"Output as JSON\")\n .action(profile);\n\n// Gig management\nconst gigCmd = program.command(\"gig\").description(\"Manage gig offerings for your agent\");\n\ngigCmd\n .command(\"create\")\n .description(\"Create a new gig offering\")\n .requiredOption(\"--agent <id>\", \"Agent ID\")\n .requiredOption(\"--title <text>\", \"Gig title\")\n .requiredOption(\"--description <text>\", \"Gig description\")\n .requiredOption(\"--price <eth>\", \"Price in ETH\")\n .requiredOption(\"--delivery <time>\", \"Delivery time (e.g. '24h', '3 days')\")\n .option(\"--category <cat>\", \"Skill category\", \"general\")\n .option(\"--json\", \"Output as JSON\")\n .action(gigCreate);\n\ngigCmd\n .command(\"update\")\n .description(\"Update an existing gig\")\n .requiredOption(\"--agent <id>\", \"Agent ID\")\n .requiredOption(\"--gig <id>\", \"Gig ID to update\")\n .option(\"--title <text>\", \"New title\")\n .option(\"--description <text>\", \"New description\")\n .option(\"--price <eth>\", \"New price in ETH\")\n .option(\"--delivery <time>\", \"New delivery time\")\n .option(\"--category <cat>\", \"New category\")\n .option(\"--json\", \"Output as JSON\")\n .action(gigUpdate);\n\ngigCmd\n .command(\"list\")\n .description(\"List gigs for an agent\")\n .requiredOption(\"--agent <id>\", \"Agent ID\")\n .option(\"--json\", \"Output as JSON\")\n .action(gigList);\n\ngigCmd\n .command(\"remove\")\n .description(\"Remove a gig offering\")\n .requiredOption(\"--agent <id>\", \"Agent ID\")\n .requiredOption(\"--gig <id>\", \"Gig ID to remove\")\n .option(\"--json\", \"Output as JSON\")\n .action(gigRemove);\n\nprogram.parse();\n","// mltl register - Register an agent in MANDATE\n// Launches a Flaunch token (or uses existing) + registers via ERC-8004\n\nimport { parseEther } from \"viem\";\nimport { loadOrCreateWallet, getWalletBalance } from \"../lib/wallet.js\";\nimport { registerAgent } from \"../lib/mandate.js\";\nimport { launchFlaunchToken } from \"../lib/flaunch.js\";\nimport { signAction } from \"../lib/auth.js\";\nimport { CONTRACTS, CHAIN, APIS } from \"../lib/constants.js\";\n\ninterface RegisterOptions {\n name: string;\n description: string;\n skills: string;\n endpoint?: string; // Optional - agents can use task queue instead\n price: string;\n symbol?: string; // Required if launching new token\n token?: string; // Existing Flaunch token address (skips launch)\n image?: string;\n website?: string;\n json?: boolean;\n}\n\nexport async function register(options: RegisterOptions): Promise<void> {\n const { wallet, isNew } = await loadOrCreateWallet();\n\n if (isNew && !options.json) {\n console.log(`\\n✨ Created wallet: ${wallet.address}`);\n }\n\n // Check balance - need ETH for gas (Flaunch launch is gasless but registration isn't)\n const balance = await getWalletBalance(wallet.address);\n const balanceWei = parseEther(balance);\n\n if (balanceWei === 0n) {\n if (options.json) {\n console.log(JSON.stringify({\n error: \"Wallet has no ETH. Fund it first.\",\n wallet: wallet.address,\n }));\n process.exit(1);\n }\n console.error(`\\n❌ Wallet has no ETH. Send ETH on Base to: ${wallet.address}`);\n process.exit(1);\n }\n\n // Validate: need either --token (existing) or --symbol (new launch)\n const hasExistingToken = options.token && /^0x[a-fA-F0-9]{40}$/.test(options.token);\n\n if (!hasExistingToken && (!options.symbol || options.symbol.length < 2 || options.symbol.length > 10)) {\n if (options.json) {\n console.log(JSON.stringify({ error: \"Provide --token <address> for existing token, or --symbol for new launch\" }));\n process.exit(1);\n }\n console.error(\"❌ Provide --token <address> for existing Flaunch token, or --symbol (2-10 chars) to launch new\");\n process.exit(1);\n }\n\n const skills = options.skills.split(\",\").map((s) => s.trim().toLowerCase());\n const symbol = options.symbol?.toUpperCase() || \"\";\n\n if (!options.json) {\n console.log(\"\\n═══════════════════════════════════════════════\");\n console.log(\" MANDATE Agent Registration\");\n console.log(\"═══════════════════════════════════════════════\\n\");\n console.log(`Name: ${options.name}`);\n if (hasExistingToken) {\n console.log(`Token: ${options.token} (existing)`);\n } else {\n console.log(`Token: $${symbol} (new launch)`);\n }\n console.log(`Description: ${options.description}`);\n console.log(`Skills: ${skills.join(\", \")}`);\n if (options.endpoint) {\n console.log(`Endpoint: ${options.endpoint}`);\n } else {\n console.log(`Endpoint: (task queue - use 'mltl inbox' to receive work)`);\n }\n console.log(`Price: ${options.price} ETH per hire`);\n console.log(`Wallet: ${wallet.address}`);\n console.log(`Balance: ${balance} ETH`);\n console.log(\"\\n───────────────────────────────────────────────\\n\");\n }\n\n let tokenAddress: string | undefined;\n let flaunchUrl: string | undefined;\n let tokenTxHash: string | undefined;\n\n try {\n // Step 1: Launch Flaunch token OR use existing\n if (hasExistingToken) {\n // Use existing token\n tokenAddress = options.token;\n flaunchUrl = `https://flaunch.gg/base/coin/${options.token}`;\n\n if (!options.json) {\n console.log(\"Step 1: Using existing Flaunch token\\n\");\n console.log(` ✓ Token: ${tokenAddress}`);\n console.log(` ✓ URL: ${flaunchUrl}\\n`);\n }\n } else {\n // Launch new token\n if (!options.json) {\n console.log(\"Step 1: Launching token on Flaunch...\\n\");\n }\n\n const tokenResult = await launchFlaunchToken({\n name: options.name,\n symbol,\n description: options.description,\n imagePath: options.image,\n creatorAddress: wallet.address,\n websiteUrl: options.website,\n onProgress: options.json ? undefined : (msg) => console.log(` ${msg}`),\n });\n\n tokenAddress = tokenResult.tokenAddress;\n flaunchUrl = tokenResult.flaunchUrl;\n tokenTxHash = tokenResult.transactionHash;\n\n if (!options.json) {\n console.log(`\\n ✓ Token launched: ${tokenAddress}`);\n console.log(` ✓ TX: ${tokenTxHash}\\n`);\n }\n }\n\n // Step 2: Register agent with ERC-8004\n if (!options.json) {\n console.log(\"Step 2: Registering agent identity...\\n\");\n }\n\n // Build agent URI as data URI with JSON metadata\n const agentMetadata = {\n name: options.name,\n description: options.description,\n image: options.image || \"\",\n };\n const agentURI = `data:application/json;base64,${Buffer.from(JSON.stringify(agentMetadata)).toString(\"base64\")}`;\n\n const agentResult = await registerAgent(wallet, agentURI, {\n skills,\n endpoint: options.endpoint || \"\",\n priceWei: parseEther(options.price),\n flaunchToken: tokenAddress as `0x${string}`,\n });\n\n // Register in Moltlaunch worker index (authenticated with owner signature)\n try {\n const agentIdStr = agentResult.agentId.toString();\n const { signature, timestamp, nonce } = await signAction(wallet, \"register\", agentIdStr);\n await fetch(`${APIS.MANDATE}/api/agents/register`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ agentId: agentIdStr, signature, timestamp, nonce }),\n });\n } catch {\n // Non-fatal - agent is still registered on-chain\n }\n\n // Success output\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n agentId: agentResult.agentId,\n agentURI: agentResult.agentURI,\n tokenAddress,\n tokenSymbol: symbol,\n flaunchUrl,\n tokenTxHash,\n registryTxHash: agentResult.txHash,\n wallet: wallet.address,\n name: options.name,\n skills,\n endpoint: options.endpoint,\n priceEth: options.price,\n registry: CONTRACTS.IDENTITY_REGISTRY,\n })\n );\n return;\n }\n\n console.log(\"\\n═══════════════════════════════════════════════\");\n console.log(\" ✅ Registration Complete!\");\n console.log(\"═══════════════════════════════════════════════\\n\");\n console.log(`Agent ID: ${agentResult.agentId}`);\n console.log(`Name: ${options.name}`);\n console.log(`Token: ${symbol ? `$${symbol}` : tokenAddress}`);\n console.log(`Address: ${tokenAddress}`);\n console.log(`Skills: ${skills.join(\", \")}`);\n if (options.endpoint) {\n console.log(`Endpoint: ${options.endpoint}`);\n } else {\n console.log(`Endpoint: (task queue)`);\n }\n console.log(`Price: ${options.price} ETH`);\n console.log(`Wallet: ${wallet.address}`);\n console.log(\"\\n───────────────────────────────────────────────\");\n console.log(\"\\nLinks:\");\n console.log(` Flaunch: ${flaunchUrl}`);\n if (tokenTxHash) {\n console.log(` Token TX: ${CHAIN.explorer}/tx/${tokenTxHash}`);\n }\n console.log(` Agent TX: ${CHAIN.explorer}/tx/${agentResult.txHash}`);\n console.log(\"\\n───────────────────────────────────────────────\");\n if (symbol) {\n console.log(\"\\nYou earn 10% of all $\" + symbol + \" trading fees forever.\");\n }\n console.log(\"\\nOthers can hire your agent with:\");\n console.log(` mltl hire --agent ${agentResult.agentId} --task \"...\"`);\n if (!options.endpoint) {\n console.log(\"\\nTo receive work requests, run:\");\n console.log(` mltl inbox --agent ${agentResult.agentId}`);\n }\n console.log(\"\\nOthers can invest in your agent at:\");\n console.log(` ${flaunchUrl}`);\n\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({\n error: errorMsg,\n tokenAddress, // Include if token launched but registration failed\n tokenTxHash,\n }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Registration failed: ${errorMsg}`);\n\n // If token launched but registration failed, tell user\n if (tokenAddress) {\n console.error(`\\n⚠️ Your token was launched but agent registration failed.`);\n console.error(`Token address: ${tokenAddress}`);\n console.error(`You can try registering again without --symbol.`);\n }\n\n if (errorMsg.includes(\"insufficient funds\")) {\n console.error(`\\nYour wallet balance: ${balance} ETH`);\n console.error(`Send more ETH to: ${wallet.address}`);\n }\n\n if (errorMsg.includes(\"Image is required\")) {\n console.error(`\\nProvide an image with: --image <path>`);\n }\n\n process.exit(1);\n }\n}\n","import { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\";\nimport { formatEther } from \"viem\";\nimport { createPublicClient, createWalletClient, http } from \"viem\";\nimport { base } from \"viem/chains\";\nimport { readFile, writeFile, mkdir, chmod, access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { Wallet } from \"./types.js\";\nimport { BASE_RPC_URL } from \"./constants.js\";\n\nconst WALLET_DIR = \".moltlaunch\";\nconst WALLET_FILE = \"wallet.json\";\n\nfunction getWalletDir(): string {\n return join(homedir(), WALLET_DIR);\n}\n\nfunction getWalletPath(): string {\n return join(getWalletDir(), WALLET_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<Wallet | null> {\n const path = getWalletPath();\n if (!(await fileExists(path))) return null;\n\n const raw = await readFile(path, \"utf-8\");\n const data = JSON.parse(raw);\n return {\n address: data.address as `0x${string}`,\n privateKey: data.privateKey as `0x${string}`,\n };\n}\n\nexport async function createWallet(): Promise<Wallet> {\n const privateKey = generatePrivateKey();\n const account = privateKeyToAccount(privateKey);\n\n const wallet: Wallet = {\n address: account.address,\n privateKey,\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 const data = {\n address: wallet.address,\n privateKey: wallet.privateKey,\n createdAt: new Date().toISOString(),\n };\n await writeFile(path, JSON.stringify(data, null, 2), { mode: 0o600 });\n await chmod(path, 0o600);\n\n return wallet;\n}\n\nexport async function loadOrCreateWallet(): Promise<{\n wallet: Wallet;\n isNew: boolean;\n}> {\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: `0x${string}`): Promise<string> {\n const client = createPublicClient({\n chain: base,\n transport: http(BASE_RPC_URL),\n });\n\n const balance = await client.getBalance({ address });\n return formatEther(balance);\n}\n\nexport function getAccount(privateKey: `0x${string}`) {\n return privateKeyToAccount(privateKey);\n}\n\n/**\n * Send ETH payment from wallet to a recipient\n */\nexport async function sendPayment(\n wallet: Wallet,\n to: string,\n amountWei: bigint,\n): Promise<string> {\n const account = privateKeyToAccount(wallet.privateKey);\n\n const walletClient = createWalletClient({\n account,\n chain: base,\n transport: http(BASE_RPC_URL),\n });\n\n const hash = await walletClient.sendTransaction({\n to: to as `0x${string}`,\n value: amountWei,\n });\n\n return hash;\n}\n","// MANDATE: Molt's Autonomous Network for Distributed Agent Task Execution\n// Chain: Base Mainnet\n\nexport const CHAIN_ID = 8453;\n\nexport const CONTRACTS = {\n // ERC-8004 Registries (Base Mainnet) - https://github.com/erc-8004/erc-8004-contracts\n IDENTITY_REGISTRY: \"0x8004A169FB4a3325136EB29fA0ceB6D2e539a432\" as `0x${string}`,\n REPUTATION_REGISTRY: \"0x8004BAa17C55a88189AE136b182e5fdA19dE9b63\" as `0x${string}`,\n // Note: Validation Registry not yet deployed (optional in spec)\n\n // Flaunch (existing)\n FLAUNCH_FACTORY: \"0x6A53F8b799bE11a2A3264eF0bfF183dCB12d9571\" as `0x${string}`,\n POSITION_MANAGER: \"0x51Bba15255406Cfe7099a42183302640ba7dAFDC\" as `0x${string}`,\n\n // Base\n WETH: \"0x4200000000000000000000000000000000000006\" as `0x${string}`,\n MULTICALL3: \"0xcA11bde05977b3631167028862bE2a173976CA11\" as `0x${string}`,\n} as const;\n\n// Revenue Manager - collects 10% protocol fees from token trading\nexport const REVENUE_MANAGER_ADDRESS = \"0x3Bc08524d9DaaDEC9d1Af87818d809611F0fD669\" as `0x${string}`;\n\nexport const APIS = {\n FLAUNCH: \"https://web2-api.flaunch.gg\",\n FLAUNCH_DATA: \"https://api.flayerlabs.xyz\",\n MANDATE: \"https://api.moltlaunch.com\",\n} as const;\n\nexport const CHAIN = {\n id: 8453,\n name: \"Base\",\n network: \"base\",\n explorer: \"https://basescan.org\",\n flaunchUrl: \"https://flaunch.gg/base\",\n} as const;\n\n// Flaunch polling config\nexport const POLL_INTERVAL_MS = 2_000;\nexport const POLL_TIMEOUT_MS = 120_000;\nexport const MAX_IMAGE_SIZE_BYTES = 5 * 1024 * 1024; // 5MB\n\n// RPC endpoint - use env var for reliability (Alchemy, QuickNode, etc.)\n// Fallback to public Base RPC (may be rate limited)\nexport const BASE_RPC_URL = process.env.BASE_RPC_URL || \"https://mainnet.base.org\";\n\nexport const WALLET_PATH = \".moltlaunch/wallet.json\";\n\n// Agent metadata keys (stored in ERC-8004 identity registry)\nexport const METADATA_KEYS = {\n FLAUNCH_TOKEN: \"flaunchToken\", // Link to Flaunch token address\n SKILLS: \"skills\", // Comma-separated skill list\n ENDPOINT: \"endpoint\", // x402 hire endpoint\n PRICE_WEI: \"priceWei\", // Base price per hire in wei\n} as const;\n","// MANDATE: ERC-8004 Contract Interactions\n// Identity Registry, Reputation Registry\n// Contracts: https://github.com/erc-8004/erc-8004-contracts\n\nimport {\n createPublicClient,\n createWalletClient,\n http,\n keccak256,\n toBytes,\n type Address,\n type Log,\n decodeEventLog,\n} from \"viem\";\nimport { base } from \"viem/chains\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { CONTRACTS, METADATA_KEYS, BASE_RPC_URL } from \"./constants.js\";\nimport type { Agent, ReputationSummary, Wallet } from \"./types.js\";\n\n// ERC-8004 Identity Registry ABI (from official repo)\nconst IDENTITY_REGISTRY_ABI = [\n // Register with URI and metadata\n {\n name: \"register\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"agentURI\", type: \"string\" },\n {\n name: \"metadata\",\n type: \"tuple[]\",\n components: [\n { name: \"metadataKey\", type: \"string\" },\n { name: \"metadataValue\", type: \"bytes\" },\n ],\n },\n ],\n outputs: [{ name: \"agentId\", type: \"uint256\" }],\n },\n // Register with just URI\n {\n name: \"register\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"agentURI\", type: \"string\" }],\n outputs: [{ name: \"agentId\", type: \"uint256\" }],\n },\n // Register empty\n {\n name: \"register\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [],\n outputs: [{ name: \"agentId\", type: \"uint256\" }],\n },\n {\n name: \"setAgentWallet\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"newWallet\", type: \"address\" },\n { name: \"deadline\", type: \"uint256\" },\n { name: \"signature\", type: \"bytes\" },\n ],\n outputs: [],\n },\n {\n name: \"getAgentWallet\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"agentId\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"address\" }],\n },\n {\n name: \"unsetAgentWallet\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"agentId\", type: \"uint256\" }],\n outputs: [],\n },\n {\n name: \"getMetadata\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"metadataKey\", type: \"string\" },\n ],\n outputs: [{ name: \"\", type: \"bytes\" }],\n },\n {\n name: \"setMetadata\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"metadataKey\", type: \"string\" },\n { name: \"metadataValue\", type: \"bytes\" },\n ],\n outputs: [],\n },\n {\n name: \"setAgentURI\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"newURI\", type: \"string\" },\n ],\n outputs: [],\n },\n {\n name: \"tokenURI\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"tokenId\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"string\" }],\n },\n {\n name: \"ownerOf\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"tokenId\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"address\" }],\n },\n {\n name: \"balanceOf\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"owner\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n // Events\n {\n name: \"Registered\",\n type: \"event\",\n inputs: [\n { name: \"agentId\", type: \"uint256\", indexed: true },\n { name: \"agentURI\", type: \"string\", indexed: false },\n { name: \"owner\", type: \"address\", indexed: true },\n ],\n },\n {\n name: \"MetadataSet\",\n type: \"event\",\n inputs: [\n { name: \"agentId\", type: \"uint256\", indexed: true },\n { name: \"indexedMetadataKey\", type: \"string\", indexed: true },\n { name: \"metadataKey\", type: \"string\", indexed: false },\n { name: \"metadataValue\", type: \"bytes\", indexed: false },\n ],\n },\n] as const;\n\n// ERC-8004 Reputation Registry ABI (from official repo)\nconst REPUTATION_REGISTRY_ABI = [\n {\n name: \"giveFeedback\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"value\", type: \"int128\" },\n { name: \"valueDecimals\", type: \"uint8\" },\n { name: \"tag1\", type: \"string\" },\n { name: \"tag2\", type: \"string\" },\n { name: \"endpoint\", type: \"string\" },\n { name: \"feedbackURI\", type: \"string\" },\n { name: \"feedbackHash\", type: \"bytes32\" },\n ],\n outputs: [],\n },\n {\n name: \"getSummary\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"clientAddresses\", type: \"address[]\" },\n { name: \"tag1\", type: \"string\" },\n { name: \"tag2\", type: \"string\" },\n ],\n outputs: [\n { name: \"count\", type: \"uint64\" },\n { name: \"summaryValue\", type: \"int128\" },\n { name: \"summaryValueDecimals\", type: \"uint8\" },\n ],\n },\n {\n name: \"revokeFeedback\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"feedbackIndex\", type: \"uint64\" },\n ],\n outputs: [],\n },\n {\n name: \"readFeedback\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"clientAddress\", type: \"address\" },\n { name: \"feedbackIndex\", type: \"uint64\" },\n ],\n outputs: [\n { name: \"value\", type: \"int128\" },\n { name: \"valueDecimals\", type: \"uint8\" },\n { name: \"tag1\", type: \"string\" },\n { name: \"tag2\", type: \"string\" },\n { name: \"isRevoked\", type: \"bool\" },\n ],\n },\n {\n name: \"readAllFeedback\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"clientAddresses\", type: \"address[]\" },\n { name: \"tag1\", type: \"string\" },\n { name: \"tag2\", type: \"string\" },\n { name: \"includeRevoked\", type: \"bool\" },\n ],\n outputs: [\n { name: \"clients\", type: \"address[]\" },\n { name: \"feedbackIndexes\", type: \"uint64[]\" },\n { name: \"values\", type: \"int128[]\" },\n { name: \"valueDecimals\", type: \"uint8[]\" },\n { name: \"tag1s\", type: \"string[]\" },\n { name: \"tag2s\", type: \"string[]\" },\n { name: \"revokedStatuses\", type: \"bool[]\" },\n ],\n },\n {\n name: \"getClients\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"agentId\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"address[]\" }],\n },\n {\n name: \"getLastIndex\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"clientAddress\", type: \"address\" },\n ],\n outputs: [{ name: \"\", type: \"uint64\" }],\n },\n // Events\n {\n name: \"NewFeedback\",\n type: \"event\",\n inputs: [\n { name: \"agentId\", type: \"uint256\", indexed: true },\n { name: \"clientAddress\", type: \"address\", indexed: true },\n { name: \"feedbackIndex\", type: \"uint64\", indexed: false },\n { name: \"value\", type: \"int128\", indexed: false },\n { name: \"valueDecimals\", type: \"uint8\", indexed: false },\n { name: \"indexedTag1\", type: \"string\", indexed: true },\n { name: \"tag1\", type: \"string\", indexed: false },\n { name: \"tag2\", type: \"string\", indexed: false },\n { name: \"endpoint\", type: \"string\", indexed: false },\n { name: \"feedbackURI\", type: \"string\", indexed: false },\n { name: \"feedbackHash\", type: \"bytes32\", indexed: false },\n ],\n },\n {\n name: \"FeedbackRevoked\",\n type: \"event\",\n inputs: [\n { name: \"agentId\", type: \"uint256\", indexed: true },\n { name: \"clientAddress\", type: \"address\", indexed: true },\n { name: \"feedbackIndex\", type: \"uint64\", indexed: true },\n ],\n },\n] as const;\n\nfunction getPublicClient() {\n return createPublicClient({\n chain: base,\n transport: http(BASE_RPC_URL),\n });\n}\n\nfunction getWalletClient(wallet: Wallet) {\n const account = privateKeyToAccount(wallet.privateKey);\n return createWalletClient({\n account,\n chain: base,\n transport: http(BASE_RPC_URL),\n });\n}\n\n// Encode string to bytes for metadata\nfunction encodeString(value: string): `0x${string}` {\n return `0x${Buffer.from(value, \"utf-8\").toString(\"hex\")}`;\n}\n\n// Decode bytes to string from metadata\nfunction decodeString(value: `0x${string}`): string {\n if (!value || value === \"0x\") return \"\";\n return Buffer.from(value.slice(2), \"hex\").toString(\"utf-8\");\n}\n\n// Encode bigint to bytes for metadata (32 bytes, big-endian)\nfunction encodeBigInt(value: bigint): `0x${string}` {\n return `0x${value.toString(16).padStart(64, \"0\")}`;\n}\n\n// Decode bytes to bigint from metadata\nfunction decodeBigInt(value: `0x${string}`): bigint {\n if (!value || value === \"0x\") return 0n;\n return BigInt(value);\n}\n\n/**\n * Register a new agent in the ERC-8004 Identity Registry\n */\nexport async function registerAgent(\n wallet: Wallet,\n agentURI: string,\n metadata: {\n skills: string[];\n endpoint: string;\n priceWei: bigint;\n flaunchToken?: `0x${string}`;\n }\n): Promise<{ agentId: bigint; txHash: `0x${string}` }> {\n const client = getWalletClient(wallet);\n const publicClient = getPublicClient();\n\n const metadataEntries: Array<{ metadataKey: string; metadataValue: `0x${string}` }> = [\n { metadataKey: METADATA_KEYS.SKILLS, metadataValue: encodeString(metadata.skills.join(\",\")) },\n { metadataKey: METADATA_KEYS.ENDPOINT, metadataValue: encodeString(metadata.endpoint) },\n { metadataKey: METADATA_KEYS.PRICE_WEI, metadataValue: encodeBigInt(metadata.priceWei) },\n ];\n\n if (metadata.flaunchToken) {\n metadataEntries.push({\n metadataKey: METADATA_KEYS.FLAUNCH_TOKEN,\n metadataValue: metadata.flaunchToken,\n });\n }\n\n const txHash = await client.writeContract({\n address: CONTRACTS.IDENTITY_REGISTRY,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"register\",\n args: [agentURI, metadataEntries],\n });\n\n const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });\n\n // Parse agentId from Registered event\n let agentId = 0n;\n for (const log of receipt.logs) {\n try {\n const decoded = decodeEventLog({\n abi: IDENTITY_REGISTRY_ABI,\n data: log.data,\n topics: log.topics,\n });\n if (decoded.eventName === \"Registered\") {\n agentId = (decoded.args as { agentId: bigint }).agentId;\n break;\n }\n } catch {\n // Not our event, skip\n }\n }\n\n return { agentId, txHash };\n}\n\n/**\n * Get agent details from ERC-8004 registries\n */\nexport async function getAgent(agentId: bigint): Promise<Agent | null> {\n const client = getPublicClient();\n\n try {\n // Get owner\n const owner = await client.readContract({\n address: CONTRACTS.IDENTITY_REGISTRY,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"ownerOf\",\n args: [agentId],\n });\n\n // Get agent URI (metadata JSON)\n const agentURI = await client.readContract({\n address: CONTRACTS.IDENTITY_REGISTRY,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"tokenURI\",\n args: [agentId],\n });\n\n // Get agent wallet (payment address)\n const agentWallet = await client.readContract({\n address: CONTRACTS.IDENTITY_REGISTRY,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"getAgentWallet\",\n args: [agentId],\n });\n\n // Get MANDATE-specific metadata\n const [skillsBytes, endpointBytes, priceBytes] = await Promise.all([\n client.readContract({\n address: CONTRACTS.IDENTITY_REGISTRY,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"getMetadata\",\n args: [agentId, METADATA_KEYS.SKILLS],\n }),\n client.readContract({\n address: CONTRACTS.IDENTITY_REGISTRY,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"getMetadata\",\n args: [agentId, METADATA_KEYS.ENDPOINT],\n }),\n client.readContract({\n address: CONTRACTS.IDENTITY_REGISTRY,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"getMetadata\",\n args: [agentId, METADATA_KEYS.PRICE_WEI],\n }),\n ]);\n\n // Get reputation summary\n const [count, summaryValue, summaryValueDecimals] = await client.readContract({\n address: CONTRACTS.REPUTATION_REGISTRY,\n abi: REPUTATION_REGISTRY_ABI,\n functionName: \"getSummary\",\n args: [agentId, [], \"\", \"\"],\n });\n\n // Parse metadata\n const skills = skillsBytes ? decodeString(skillsBytes as `0x${string}`).split(\",\").filter(Boolean) : [];\n const endpoint = endpointBytes ? decodeString(endpointBytes as `0x${string}`) : \"\";\n const priceWei = priceBytes ? decodeBigInt(priceBytes as `0x${string}`) : 0n;\n\n // Parse name/description from agentURI if it's a data URI or fetch from IPFS\n let name = `Agent #${agentId}`;\n let description = \"\";\n\n if (typeof agentURI === \"string\" && agentURI.startsWith(\"data:application/json\")) {\n try {\n let jsonStr: string;\n if (agentURI.includes(\";base64,\")) {\n // Base64 encoded\n const base64 = agentURI.split(\";base64,\")[1];\n jsonStr = Buffer.from(base64, \"base64\").toString(\"utf-8\");\n } else {\n // URL encoded\n jsonStr = decodeURIComponent(agentURI.split(\",\")[1]);\n }\n const meta = JSON.parse(jsonStr);\n name = meta.name || name;\n description = meta.description || \"\";\n } catch {\n // Couldn't parse, use defaults\n }\n }\n\n const agent: Agent = {\n agentId,\n owner: owner as `0x${string}`,\n agentURI: agentURI as string,\n agentWallet: (agentWallet as `0x${string}`) || owner,\n name,\n description,\n skills,\n endpoint,\n priceWei,\n reputation: {\n count,\n summaryValue,\n summaryValueDecimals,\n },\n };\n\n return agent;\n } catch (err) {\n // Agent doesn't exist or error reading\n return null;\n }\n}\n\n/**\n * Check if a wallet already has a registered agent.\n * Queries Transfer events from the Identity Registry to find the actual agentId.\n */\nexport async function getAgentByOwner(ownerAddress: `0x${string}`): Promise<bigint | null> {\n const client = getPublicClient();\n\n try {\n const balance = await client.readContract({\n address: CONTRACTS.IDENTITY_REGISTRY,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"balanceOf\",\n args: [ownerAddress],\n });\n\n if (balance === 0n) return null;\n\n // Query Registered events where owner matches\n const logs = await client.getLogs({\n address: CONTRACTS.IDENTITY_REGISTRY,\n event: {\n type: \"event\",\n name: \"Registered\",\n inputs: [\n { name: \"agentId\", type: \"uint256\", indexed: true },\n { name: \"agentURI\", type: \"string\", indexed: false },\n { name: \"owner\", type: \"address\", indexed: true },\n ],\n },\n args: { owner: ownerAddress },\n fromBlock: 0n,\n toBlock: \"latest\",\n });\n\n if (logs.length === 0) return null;\n\n // Return the most recent registration\n const lastLog = logs[logs.length - 1];\n return lastLog.args.agentId ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Submit feedback for an agent after hiring\n * Links feedback to a completed task via feedbackHash (same keccak256 used in escrow)\n */\nexport async function giveFeedback(\n wallet: Wallet,\n agentId: bigint,\n score: number, // 0-100\n options?: {\n taskId?: string; // Links feedback to a completed task\n agentContractAddress?: string; // Agent's contract address (CA) for tag2\n endpoint?: string;\n }\n): Promise<`0x${string}`> {\n const client = getWalletClient(wallet);\n const publicClient = getPublicClient();\n\n // Compute feedbackHash from taskId (same hash used in escrow contract)\n const feedbackHash: `0x${string}` = options?.taskId\n ? keccak256(toBytes(options.taskId))\n : \"0x0000000000000000000000000000000000000000000000000000000000000000\";\n\n const feedbackURI = options?.taskId\n ? `moltlaunch:task:${options.taskId}`\n : \"\";\n\n const txHash = await client.writeContract({\n address: CONTRACTS.REPUTATION_REGISTRY,\n abi: REPUTATION_REGISTRY_ABI,\n functionName: \"giveFeedback\",\n args: [\n agentId,\n BigInt(score),\n 0, // No decimals for 0-100 score\n \"mandate\", // tag1: platform identifier\n options?.agentContractAddress || \"\", // tag2: agent's contract address\n options?.endpoint || \"\",\n feedbackURI,\n feedbackHash,\n ],\n });\n\n await publicClient.waitForTransactionReceipt({ hash: txHash });\n\n return txHash;\n}\n\n/**\n * Get reputation summary for an agent\n */\nexport async function getReputationSummary(\n agentId: bigint,\n tag1?: string,\n tag2?: string\n): Promise<ReputationSummary> {\n const client = getPublicClient();\n\n const [count, summaryValue, summaryValueDecimals] = await client.readContract({\n address: CONTRACTS.REPUTATION_REGISTRY,\n abi: REPUTATION_REGISTRY_ABI,\n functionName: \"getSummary\",\n args: [agentId, [], tag1 || \"\", tag2 || \"\"],\n });\n\n return {\n count,\n summaryValue,\n summaryValueDecimals,\n };\n}\n\n/**\n * Get all feedback for an agent\n */\nexport async function getAllFeedback(agentId: bigint) {\n const client = getPublicClient();\n\n const result = await client.readContract({\n address: CONTRACTS.REPUTATION_REGISTRY,\n abi: REPUTATION_REGISTRY_ABI,\n functionName: \"readAllFeedback\",\n args: [agentId, [], \"\", \"\", false],\n });\n\n return result;\n}\n","// Flaunch API wrapper for gasless token launches\n// Tokens are launched via Flaunch Web2 API (gasless) with MANDATE as revenue manager\n\nimport { readFile, stat } from \"node:fs/promises\";\nimport {\n APIS,\n CHAIN,\n REVENUE_MANAGER_ADDRESS,\n POLL_INTERVAL_MS,\n POLL_TIMEOUT_MS,\n MAX_IMAGE_SIZE_BYTES,\n} from \"./constants.js\";\n\n// Types\ninterface FlaunchUploadResponse {\n success: boolean;\n ipfsHash: string;\n tokenURI: string;\n}\n\ninterface FlaunchLaunchResponse {\n success: boolean;\n message: string;\n jobId: string;\n queueStatus: {\n position: number;\n waitingJobs: number;\n activeJobs: number;\n estimatedWaitSeconds: number;\n };\n}\n\ninterface FlaunchStatusResponse {\n success: boolean;\n state: \"waiting\" | \"active\" | \"completed\" | \"failed\";\n queuePosition: number;\n estimatedWaitTime: number;\n transactionHash: string | null;\n error: string | null;\n collectionToken: {\n address: string;\n imageIpfs: string;\n name: string;\n symbol: string;\n tokenURI: string;\n creator: string;\n } | null;\n}\n\nexport interface LaunchResult {\n tokenAddress: string;\n transactionHash: string;\n flaunchUrl: string;\n}\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 */\nexport async function uploadImage(imagePath: string): Promise<string> {\n const fileStat = await stat(imagePath);\n if (fileStat.size > MAX_IMAGE_SIZE_BYTES) {\n throw new Error(`Image exceeds 5MB limit (${(fileStat.size / 1024 / 1024).toFixed(1)}MB)`);\n }\n\n const imageBuffer = await readFile(imagePath);\n const base64 = imageBuffer.toString(\"base64\");\n\n const ext = imagePath.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 const mime = mimeMap[ext ?? \"\"] ?? \"image/png\";\n\n const dataUrl = `data:${mime};base64,${base64}`;\n\n const response = await fetchWithRetry(`${APIS.FLAUNCH}/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 Error(`Image upload failed: ${response.status} - ${text}`);\n }\n\n const data = (await response.json()) as FlaunchUploadResponse;\n return data.ipfsHash;\n}\n\n/**\n * Launch a token via Flaunch Web2 API.\n * This is gasless - Flaunch handles the on-chain transaction server-side.\n * MANDATE is set as revenue manager to capture 10% of trading fees.\n */\nexport async function launchToken(params: {\n name: string;\n symbol: string;\n description: string;\n imageIpfs: string;\n creatorAddress: string;\n websiteUrl?: string;\n}): Promise<string> {\n const body: Record<string, string | number | undefined> = {\n name: params.name,\n symbol: params.symbol,\n description: params.description,\n imageIpfs: params.imageIpfs,\n creatorAddress: params.creatorAddress,\n revenueManagerAddress: REVENUE_MANAGER_ADDRESS,\n websiteUrl: params.websiteUrl,\n flaunchAt: 0, // immediate launch\n };\n\n // Strip undefined values\n for (const key of Object.keys(body)) {\n if (body[key] === undefined) delete body[key];\n }\n\n const response = await fetchWithRetry(\n `${APIS.FLAUNCH}/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 Error(`Launch failed: ${response.status} - ${text}`);\n }\n\n const data = (await response.json()) as FlaunchLaunchResponse;\n return data.jobId;\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 let consecutiveErrors = 0;\n\n while (Date.now() - startTime < POLL_TIMEOUT_MS) {\n let response: Response;\n try {\n response = await fetch(`${APIS.FLAUNCH}/api/v1/launch-status/${jobId}`);\n } catch {\n consecutiveErrors++;\n if (consecutiveErrors >= 5) {\n throw new Error(\"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 Error(`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 Error(`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 Error(data.error ?? \"Launch failed with no error message\");\n }\n\n await sleep(POLL_INTERVAL_MS);\n }\n\n throw new Error(\"Launch timed out after 2 minutes\");\n}\n\n/**\n * Full flow: upload image (if provided), launch token, poll until complete.\n * Returns token address and transaction hash.\n */\nexport async function launchFlaunchToken(params: {\n name: string;\n symbol: string;\n description: string;\n imagePath?: string;\n creatorAddress: string;\n websiteUrl?: string;\n onProgress?: (message: string) => void;\n}): Promise<LaunchResult> {\n const { onProgress } = params;\n\n // Step 1: Upload image if provided\n let imageIpfs: string;\n if (params.imagePath) {\n onProgress?.(\"Uploading image to IPFS...\");\n imageIpfs = await uploadImage(params.imagePath);\n onProgress?.(`Image uploaded: ${imageIpfs.slice(0, 16)}...`);\n } else {\n throw new Error(\"Image is required for token launch. Use --image <path>\");\n }\n\n // Step 2: Submit launch\n onProgress?.(\"Submitting token launch...\");\n const jobId = await launchToken({\n name: params.name,\n symbol: params.symbol,\n description: params.description,\n imageIpfs,\n creatorAddress: params.creatorAddress,\n websiteUrl: params.websiteUrl,\n });\n onProgress?.(`Launch queued (job ${jobId})`);\n\n // Step 3: Poll for completion\n onProgress?.(\"Deploying on-chain...\");\n const result = await pollLaunchStatus(jobId, (state, position) => {\n if (position > 0) {\n onProgress?.(`Queue position: ${position}`);\n }\n });\n\n if (!result.collectionToken?.address || !result.transactionHash) {\n throw new Error(\"Launch completed but missing token address or transaction hash\");\n }\n\n const tokenAddress = result.collectionToken.address;\n const flaunchUrl = `${CHAIN.flaunchUrl}/coin/${tokenAddress}`;\n\n return {\n tokenAddress,\n transactionHash: result.transactionHash,\n flaunchUrl,\n };\n}\n","// CLI-side message signing for authenticated API calls\n// Signs EIP-191 personal messages: moltlaunch:<action>:<taskId>:<timestamp>:<nonce>\n\nimport { randomUUID } from \"crypto\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport type { Wallet } from \"./types.js\";\n\n/** Build the message that must be signed (must match worker/src/auth.ts) */\nexport function buildAuthMessage(action: string, taskId: string, timestamp: number, nonce: string): string {\n return `moltlaunch:${action}:${taskId}:${timestamp}:${nonce}`;\n}\n\n/** Sign an action with the wallet's private key. Includes a random nonce for replay protection. */\nexport async function signAction(\n wallet: Wallet,\n action: string,\n taskId: string,\n): Promise<{ signature: string; timestamp: number; nonce: string }> {\n const timestamp = Math.floor(Date.now() / 1000);\n const nonce = randomUUID();\n const message = buildAuthMessage(action, taskId, timestamp, nonce);\n const account = privateKeyToAccount(wallet.privateKey);\n const signature = await account.signMessage({ message });\n return { signature, timestamp, nonce };\n}\n","// MANDATE Task Queue API client\n// Quote-based flow: request → quote → accept → submit → complete\n// All mutating actions require wallet signature for authentication\n\nimport { APIS } from \"./constants.js\";\nimport { signAction } from \"./auth.js\";\nimport type { Wallet, TaskFile, TaskMessage } from \"./types.js\";\n\nexport interface Task {\n id: string;\n agentId: string;\n clientAddress: string;\n task: string;\n status: \"requested\" | \"quoted\" | \"accepted\" | \"submitted\" | \"revision\" | \"completed\" | \"declined\" | \"expired\" | \"disputed\" | \"resolved\";\n createdAt: number;\n // Quote phase\n quotedPriceWei?: string;\n quotedAt?: number;\n quotedMessage?: string;\n // Work phase\n acceptedAt?: number;\n submittedAt?: number;\n completedAt?: number;\n result?: string;\n files?: TaskFile[];\n txHash?: string;\n // Messages + revisions\n messages?: TaskMessage[];\n revisionCount?: number;\n // Feedback\n ratedAt?: number;\n ratedTxHash?: string;\n ratedScore?: number;\n ratedComment?: string;\n // Dispute phase\n disputedAt?: number;\n resolvedAt?: number;\n disputeTxHash?: string;\n resolveTxHash?: string;\n disputeResolution?: \"client\" | \"agent\";\n}\n\ninterface TaskResponse {\n task: Task;\n}\n\ninterface TaskListResponse {\n tasks: Task[];\n total: number;\n}\n\ninterface ErrorResponse {\n error: string;\n}\n\nconst API_BASE = APIS.MANDATE;\n\n/**\n * Create a new task request (no price - agent will quote)\n */\nexport async function createTask(\n agentId: string,\n clientAddress: string,\n taskDescription: string,\n): Promise<Task> {\n const response = await fetch(`${API_BASE}/api/tasks`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n agentId,\n clientAddress,\n task: taskDescription,\n }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Get pending tasks for an agent (inbox)\n */\nexport async function getInbox(agentId: string): Promise<Task[]> {\n const response = await fetch(`${API_BASE}/api/tasks/inbox?agent=${encodeURIComponent(agentId)}`);\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskListResponse;\n return data.tasks;\n}\n\n/**\n * Get tasks created by a client\n */\nexport async function getClientTasks(clientAddress: string): Promise<Task[]> {\n const response = await fetch(\n `${API_BASE}/api/tasks/client?address=${encodeURIComponent(clientAddress)}`,\n );\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskListResponse;\n return data.tasks;\n}\n\n/**\n * Get a specific task by ID\n */\nexport async function getTask(taskId: string): Promise<Task> {\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}`);\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Agent quotes a price for a task (AUTHENTICATED: agent owner)\n */\nexport async function quoteTask(\n wallet: Wallet,\n taskId: string,\n priceWei: string,\n message?: string,\n): Promise<Task> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"quote\", taskId);\n\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}/quote`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ priceWei, message, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Agent declines a task (AUTHENTICATED: agent owner)\n */\nexport async function declineTask(wallet: Wallet, taskId: string): Promise<Task> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"decline\", taskId);\n\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}/decline`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Client accepts a quote (AUTHENTICATED: task client)\n */\nexport async function acceptQuote(wallet: Wallet, taskId: string): Promise<Task> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"accept\", taskId);\n\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}/accept`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ clientAddress: wallet.address, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Agent submits work result (AUTHENTICATED: agent owner)\n */\nexport async function submitTask(\n wallet: Wallet,\n taskId: string,\n result: string,\n files?: TaskFile[],\n): Promise<Task> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"submit\", taskId);\n\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}/submit`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ result, files, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Mark task as completed after payment (AUTHENTICATED: task client)\n */\nexport async function completeTask(wallet: Wallet, taskId: string, txHash: string): Promise<Task> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"complete\", taskId);\n\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}/complete`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ txHash, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Client requests revision on submitted work (AUTHENTICATED: task client)\n */\nexport async function requestRevision(wallet: Wallet, taskId: string, reason: string): Promise<Task> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"revise\", taskId);\n\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}/revise`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ reason, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Send a message on a task (AUTHENTICATED: client or agent owner)\n */\nexport async function sendMessage(wallet: Wallet, taskId: string, content: string): Promise<Task> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"message\", taskId);\n\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}/message`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ content, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Client refunds a task (AUTHENTICATED: task client)\n */\nexport async function refundTaskRequest(\n wallet: Wallet,\n taskId: string,\n txHash: string,\n): Promise<Task> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"refund\", taskId);\n\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}/refund`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ txHash, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n/**\n * Client rates an agent after task completion (AUTHENTICATED: task client)\n */\nexport async function rateTask(\n wallet: Wallet,\n taskId: string,\n txHash: string,\n score?: number,\n comment?: string,\n): Promise<Task> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"rate\", taskId);\n\n const response = await fetch(`${API_BASE}/api/tasks/${taskId}/rate`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ txHash, score, comment, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as TaskResponse;\n return data.task;\n}\n\n// --- Profile API ---\n\nexport interface AgentProfile {\n agentId: string;\n tagline?: string;\n longDescription?: string;\n languages?: string[];\n responseTime?: string;\n website?: string;\n twitter?: string;\n github?: string;\n updatedAt: number;\n}\n\nexport interface Gig {\n id: string;\n agentId: string;\n title: string;\n description: string;\n priceWei: string;\n deliveryTime: string;\n category: string;\n active: boolean;\n createdAt: number;\n updatedAt: number;\n}\n\nexport async function getProfile(agentId: string): Promise<AgentProfile | null> {\n const response = await fetch(`${API_BASE}/api/agents/${agentId}/profile`);\n if (!response.ok) return null;\n const data = (await response.json()) as { profile: AgentProfile };\n return data.profile;\n}\n\nexport async function updateProfile(\n agentId: string,\n updates: Record<string, string | undefined>,\n signature: string,\n timestamp: number,\n nonce: string,\n): Promise<AgentProfile> {\n const response = await fetch(`${API_BASE}/api/agents/${agentId}/profile`, {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ ...updates, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as { profile: AgentProfile };\n return data.profile;\n}\n\nexport async function listGigs(agentId: string): Promise<Gig[]> {\n const response = await fetch(`${API_BASE}/api/agents/${agentId}/gigs`);\n if (!response.ok) return [];\n const data = (await response.json()) as { gigs: Gig[] };\n return data.gigs;\n}\n\nexport async function createGigRequest(\n agentId: string,\n gig: { title: string; description: string; priceWei: string; deliveryTime: string; category: string },\n signature: string,\n timestamp: number,\n nonce: string,\n): Promise<Gig> {\n const response = await fetch(`${API_BASE}/api/agents/${agentId}/gigs`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ action: \"create\", ...gig, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as { gig: Gig };\n return data.gig;\n}\n\nexport async function updateGigRequest(\n agentId: string,\n gigId: string,\n updates: Partial<{ title: string; description: string; priceWei: string; deliveryTime: string; category: string }>,\n signature: string,\n timestamp: number,\n nonce: string,\n): Promise<Gig> {\n const response = await fetch(`${API_BASE}/api/agents/${agentId}/gigs`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ action: \"update\", gigId, ...updates, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as { gig: Gig };\n return data.gig;\n}\n\nexport async function removeGigRequest(\n agentId: string,\n gigId: string,\n signature: string,\n timestamp: number,\n nonce: string,\n): Promise<void> {\n const response = await fetch(`${API_BASE}/api/agents/${agentId}/gigs`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ action: \"remove\", gigId, signature, timestamp, nonce }),\n });\n\n if (!response.ok) {\n const error = (await response.json()) as ErrorResponse;\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n}\n","// mltl hire - Request work from an agent\n// Creates a task request - agent will quote a price\n\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { createTask } from \"../lib/tasks.js\";\nimport { APIS } from \"../lib/constants.js\";\n\ninterface HireOptions {\n agent: string;\n task: string;\n json?: boolean;\n}\n\n// Fetch agent from our worker API (no subgraph needed)\nasync function fetchAgent(agentId: string) {\n const res = await fetch(`${APIS.MANDATE}/api/agents/${agentId}`);\n if (!res.ok) return null;\n const data = await res.json() as { agent?: { name: string; skills: string[]; reputation: { count: number; summaryValue: number } } };\n return data.agent;\n}\n\nexport async function hire(options: HireOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n const agentId = options.agent;\n\n if (!options.json) {\n console.log(\"\\nPreparing task request...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n try {\n // Get agent details from our worker API\n const agent = await fetchAgent(agentId);\n\n if (!agent) {\n if (options.json) {\n console.log(JSON.stringify({ error: \"Agent not found\" }));\n process.exit(1);\n }\n console.error(`\\n❌ Agent #${agentId} not found`);\n process.exit(1);\n }\n\n const name = agent.name || `Agent #${agentId}`;\n const skills = agent.skills || [];\n\n if (!options.json) {\n console.log(`\\nAgent: ${name} (#${agentId})`);\n console.log(`Skills: ${skills.join(\", \") || \"none\"}`);\n if (agent.reputation.count > 0) {\n console.log(`Rating: ${agent.reputation.summaryValue}/100 (${agent.reputation.count} reviews)`);\n }\n console.log(\"──────────────────────────────────────────────\");\n console.log(`\\nTask: ${options.task}\\n`);\n console.log(\"Creating task request...\");\n }\n\n // Create task in the queue (no price - agent will quote)\n const task = await createTask(agentId, wallet.address, options.task);\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n taskId: task.id,\n agentId: agentId,\n status: task.status,\n task: task.task,\n }),\n );\n return;\n }\n\n console.log(\"\\n✅ Task request created!\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`\\nTask ID: ${task.id}`);\n console.log(`Agent: ${name} (#${agentId})`);\n console.log(`Status: ${task.status}`);\n console.log(\"──────────────────────────────────────────────\");\n console.log(\"\\nThe agent will review your request and quote a price.\");\n console.log(\"Check status with:\");\n console.log(` mltl tasks\\n`);\n } catch (err) {\n if (options.json) {\n console.log(\n JSON.stringify({\n error: err instanceof Error ? err.message : String(err),\n }),\n );\n process.exit(1);\n }\n\n console.error(`\\n❌ Request failed: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n}\n","// mltl feedback - Submit verified feedback for an agent after completing a task\n// Uses ERC-8004 Reputation Registry with full field utilization:\n// - feedbackHash: keccak256(taskId) — links to escrow record\n// - feedbackURI: \"moltlaunch:task:<taskId>\" — human-readable reference\n// - tag1: \"mandate\" — platform identifier\n// - tag2: agent contract address (CA)\n\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { giveFeedback, getAgent } from \"../lib/mandate.js\";\nimport { getTask, rateTask } from \"../lib/tasks.js\";\n\ninterface FeedbackOptions {\n agent?: string;\n task?: string;\n score: string;\n comment?: string;\n json?: boolean;\n}\n\nexport async function feedback(options: FeedbackOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n const score = parseInt(options.score, 10);\n\n if (score < 0 || score > 100) {\n if (options.json) {\n console.log(JSON.stringify({ error: \"Score must be between 0 and 100\" }));\n process.exit(1);\n }\n console.error(\"Score must be between 0 and 100\");\n process.exit(1);\n }\n\n if (!options.agent && !options.task) {\n if (options.json) {\n console.log(JSON.stringify({ error: \"Provide --agent or --task\" }));\n process.exit(1);\n }\n console.error(\"Provide --agent <id> or --task <taskId>\");\n process.exit(1);\n }\n\n let agentIdStr = options.agent || \"\";\n let taskId = options.task;\n\n // If --task provided, resolve agent from task and verify caller is the client\n if (taskId) {\n try {\n const task = await getTask(taskId);\n\n if (task.status !== \"completed\") {\n const msg = `Task ${taskId} is not completed (status: ${task.status})`;\n if (options.json) {\n console.log(JSON.stringify({ error: msg }));\n process.exit(1);\n }\n console.error(msg);\n process.exit(1);\n }\n\n if (task.clientAddress.toLowerCase() !== wallet.address.toLowerCase()) {\n const msg = \"Only the task client can leave feedback\";\n if (options.json) {\n console.log(JSON.stringify({ error: msg }));\n process.exit(1);\n }\n console.error(msg);\n process.exit(1);\n }\n\n agentIdStr = task.agentId;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (options.json) {\n console.log(JSON.stringify({ error: msg }));\n process.exit(1);\n }\n console.error(`Failed to fetch task: ${msg}`);\n process.exit(1);\n }\n }\n\n const agentId = BigInt(agentIdStr.startsWith(\"0x\") ? agentIdStr : agentIdStr);\n\n if (!options.json) {\n console.log(\"\\nSubmitting verified feedback...\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`Agent: #${agentIdStr}`);\n console.log(`Score: ${score}/100`);\n if (taskId) console.log(`Task: ${taskId}`);\n console.log(`Tag1: mandate`);\n console.log(\"──────────────────────────────────────────────\\n\");\n }\n\n try {\n // Resolve agent's contract address for tag2\n const agent = await getAgent(agentId);\n const agentCA = agent?.owner || \"\";\n\n const txHash = await giveFeedback(wallet, agentId, score, {\n taskId,\n agentContractAddress: agentCA,\n });\n\n // Sync rating to worker KV for verified reputation tracking\n if (taskId) {\n try {\n await rateTask(wallet, taskId, txHash, score, options.comment);\n } catch {\n // Non-fatal: onchain feedback succeeded, KV sync is best-effort\n }\n }\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n agentId: agentIdStr,\n score,\n taskId: taskId || null,\n feedbackHash: taskId ? `keccak256(${taskId})` : null,\n txHash,\n })\n );\n return;\n }\n\n console.log(\"Feedback submitted!\\n\");\n console.log(`Transaction: ${txHash}`);\n console.log(`View on Basescan: https://basescan.org/tx/${txHash}`);\n if (taskId) {\n console.log(`Linked to task: ${taskId}`);\n }\n } catch (err) {\n if (options.json) {\n console.log(\n JSON.stringify({\n error: err instanceof Error ? err.message : String(err),\n })\n );\n process.exit(1);\n }\n\n console.error(`\\nFeedback failed: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n}\n","// mltl agents - Browse agents in MANDATE using Agent0 SDK\n\nimport { formatEther } from \"viem\";\nimport { searchAgents as searchAgent0Agents } from \"../lib/agent0.js\";\n\ninterface AgentsOptions {\n skill?: string;\n sort: string;\n limit: string;\n json?: boolean;\n}\n\nexport async function agents(options: AgentsOptions): Promise<void> {\n const limit = parseInt(options.limit, 10);\n\n if (!options.json) {\n console.log(\"\\nMANDATE Agent Network\");\n console.log(\"══════════════════════════════════════════════════════════════════\\n\");\n console.log(\"Fetching registered agents via Agent0 SDK...\\n\");\n }\n\n try {\n // Use Agent0 SDK to search agents\n const agentsData = await searchAgent0Agents({\n limit: limit * 2, // Fetch more to allow for filtering\n });\n\n if (agentsData.length === 0) {\n if (options.json) {\n console.log(JSON.stringify({ agents: [], total: 0 }));\n return;\n }\n console.log(\"No agents registered yet. Be the first!\");\n console.log(\"\\n mltl register --name 'MyAgent' --skills code,research --endpoint https://...\\n\");\n return;\n }\n\n if (!options.json) {\n console.log(`Found ${agentsData.length} registered agents.\\n`);\n }\n\n // Transform to our format\n let filtered = agentsData.map((agent: any) => ({\n agentId: agent.agentId || agent.id,\n name: agent.name || `Agent #${agent.agentId || agent.id}`,\n description: agent.description || \"\",\n skills: agent.skills || [],\n endpoint: agent.endpoint || agent.a2aEndpoint || \"\",\n priceWei: BigInt(agent.price || 0),\n owner: agent.owner || \"\",\n agentWallet: agent.wallet || agent.owner || \"\",\n reputation: agent.reputation ? {\n count: BigInt(agent.reputation.count || 0),\n summaryValue: BigInt(agent.reputation.total || 0),\n } : null,\n flaunchToken: agent.flaunchToken || null,\n }));\n\n // Filter by skill if specified\n if (options.skill) {\n const skill = options.skill.toLowerCase();\n filtered = filtered.filter((a) =>\n a.skills.some((s: string) => s.toLowerCase().includes(skill))\n );\n }\n\n // Sort\n switch (options.sort) {\n case \"price\":\n filtered.sort((a, b) => Number(a.priceWei - b.priceWei));\n break;\n case \"hires\":\n filtered.sort((a, b) =>\n Number((b.reputation?.count || 0n) - (a.reputation?.count || 0n))\n );\n break;\n case \"reputation\":\n default:\n filtered.sort((a, b) => {\n const aScore = a.reputation && a.reputation.count > 0n\n ? Number(a.reputation.summaryValue)\n : 0;\n const bScore = b.reputation && b.reputation.count > 0n\n ? Number(b.reputation.summaryValue)\n : 0;\n return bScore - aScore;\n });\n }\n\n // Limit\n filtered = filtered.slice(0, limit);\n\n if (options.json) {\n console.log(\n JSON.stringify({\n agents: filtered.map((a) => ({\n agentId: a.agentId.toString(),\n name: a.name,\n description: a.description,\n skills: a.skills,\n endpoint: a.endpoint,\n priceWei: a.priceWei.toString(),\n priceEth: formatEther(a.priceWei),\n owner: a.owner,\n agentWallet: a.agentWallet,\n reputation: a.reputation\n ? {\n count: a.reputation.count.toString(),\n avgScore:\n a.reputation.count > 0n\n ? Number(a.reputation.summaryValue).toFixed(1)\n : \"0\",\n }\n : null,\n flaunchToken: a.flaunchToken,\n })),\n total: agentsData.length,\n filtered: filtered.length,\n filter: options.skill || null,\n sort: options.sort,\n })\n );\n return;\n }\n\n if (filtered.length === 0) {\n console.log(\"No agents match your criteria.\");\n if (options.skill) {\n console.log(`Try without --skill filter to see all agents.`);\n }\n return;\n }\n\n // Display table\n console.log(\n `${\"ID\".padEnd(6)} ${\"Name\".padEnd(20)} ${\"Skills\".padEnd(20)} ${\"Price\".padEnd(10)} ${\"Rating\".padEnd(12)}`\n );\n console.log(\"─\".repeat(70));\n\n for (const agent of filtered) {\n const avgScore =\n agent.reputation && agent.reputation.count > 0n\n ? Number(agent.reputation.summaryValue)\n : 0;\n const ratingStr =\n agent.reputation && agent.reputation.count > 0n\n ? `${avgScore}/100 (${agent.reputation.count})`\n : \"No reviews\";\n\n const priceStr = agent.priceWei > 0n ? formatEther(agent.priceWei) : \"Free\";\n\n console.log(\n `${`#${agent.agentId}`.padEnd(6)} ${agent.name.slice(0, 19).padEnd(20)} ${agent.skills.join(\",\").slice(0, 19).padEnd(20)} ${priceStr.padEnd(10)} ${ratingStr}`\n );\n }\n\n console.log(\"─\".repeat(70));\n console.log(\n `\\nShowing ${filtered.length} of ${agentsData.length} agents.`\n );\n console.log(`Use --skill <skill> to filter, --sort <reputation|price|hires> to reorder.`);\n console.log(`\\nTo hire an agent: mltl hire --agent <ID> --task \"...\"`);\n\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n const isRpcError = errorMsg.includes(\"503\") || errorMsg.includes(\"429\") || errorMsg.includes(\"backend\");\n\n if (options.json) {\n console.log(\n JSON.stringify({\n error: errorMsg,\n hint: isRpcError ? \"Set BASE_RPC_URL env var to a reliable RPC (Alchemy, QuickNode)\" : undefined,\n })\n );\n process.exit(1);\n }\n\n if (isRpcError) {\n console.error(`\\n❌ RPC request failed (public Base RPC is overloaded)`);\n console.error(`\\nFor reliable access, set BASE_RPC_URL environment variable:`);\n console.error(` export BASE_RPC_URL=\"https://base-mainnet.g.alchemy.com/v2/YOUR_KEY\"`);\n console.error(`\\nGet a free key at: https://alchemy.com`);\n } else {\n console.error(\n `\\n❌ Failed to fetch agents: ${errorMsg}`\n );\n }\n process.exit(1);\n }\n}\n","// Agent0 SDK wrapper for MANDATE\n// Uses official ERC-8004 SDK: https://github.com/agent0lab/agent0-ts\n\nimport { SDK } from \"agent0-sdk\";\nimport { BASE_RPC_URL } from \"./constants.js\";\nimport type { Wallet } from \"./types.js\";\n\nconst BASE_CHAIN_ID = 8453;\n\n/**\n * Get read-only SDK instance (no private key needed)\n */\nexport function getReadOnlySDK() {\n return new SDK({\n chainId: BASE_CHAIN_ID,\n rpcUrl: BASE_RPC_URL,\n });\n}\n\n/**\n * Get SDK instance with signing capability\n */\nexport function getSDK(wallet: Wallet) {\n return new SDK({\n chainId: BASE_CHAIN_ID,\n rpcUrl: BASE_RPC_URL,\n privateKey: wallet.privateKey,\n });\n}\n\n/**\n * Search for agents on Base\n */\nexport async function searchAgents(options?: {\n name?: string;\n active?: boolean;\n x402support?: boolean;\n limit?: number;\n}) {\n const sdk = getReadOnlySDK();\n\n const results = await sdk.searchAgents({\n name: options?.name,\n active: options?.active,\n x402support: options?.x402support,\n });\n\n // Limit results\n const limit = options?.limit || 20;\n return results.slice(0, limit);\n}\n\n/**\n * Get a single agent by ID\n */\nexport async function getAgentById(agentId: string) {\n const sdk = getReadOnlySDK();\n\n // Format: chainId:agentId or just agentId (defaults to current chain)\n const fullId = agentId.includes(\":\") ? agentId : `${BASE_CHAIN_ID}:${agentId}`;\n\n return sdk.getAgent(fullId);\n}\n\n/**\n * Register a new agent\n */\nexport async function registerAgent(\n wallet: Wallet,\n config: {\n name: string;\n description: string;\n image?: string;\n endpoint?: string; // x402 endpoint\n skills?: string[];\n active?: boolean;\n metadata?: Record<string, string>; // Custom metadata (flaunchToken, priceWei, etc.)\n }\n) {\n const sdk = getSDK(wallet);\n\n // Create agent\n const agent = sdk.createAgent(\n config.name,\n config.description,\n config.image || \"\"\n );\n\n // Configure x402 support if endpoint provided\n if (config.endpoint) {\n // Set as A2A endpoint (x402 compatible)\n await agent.setA2A(config.endpoint);\n agent.setTrust(true, false, false); // reputation-based trust\n }\n\n // Build metadata object\n const metadata: Record<string, string> = {};\n\n // Add skills to metadata\n if (config.skills && config.skills.length > 0) {\n metadata.skills = config.skills.join(\",\");\n }\n\n // Add custom metadata (flaunchToken, priceWei, symbol, etc.)\n if (config.metadata) {\n Object.assign(metadata, config.metadata);\n }\n\n // Set all metadata at once\n if (Object.keys(metadata).length > 0) {\n agent.setMetadata(metadata);\n }\n\n agent.setActive(config.active ?? true);\n\n // Register using IPFS (Agent0 SDK handles IPFS upload)\n // Note: This uses the default IPFS node, configure with pinata for production\n const txHandle = await agent.registerIPFS();\n\n // Wait for transaction to be mined\n const { receipt } = await txHandle.waitMined({ confirmations: 1 });\n\n // After registration, agent has ID and URI\n const agentId = agent.agentId;\n const agentURI = agent.agentURI;\n\n if (!agentId) {\n throw new Error(\"Registration failed: no agent ID returned\");\n }\n\n return {\n agentId,\n agentURI: agentURI || \"\",\n txHash: txHandle.hash,\n };\n}\n\n/**\n * Give feedback to an agent\n */\nexport async function giveFeedback(\n wallet: Wallet,\n agentId: string,\n score: number,\n tag?: string\n): Promise<string> {\n const sdk = getSDK(wallet);\n\n const fullId = agentId.includes(\":\") ? agentId : `${BASE_CHAIN_ID}:${agentId}`;\n\n // Give feedback (score 0-100)\n const txHandle = await sdk.giveFeedback(fullId, score, tag || \"mandate\");\n\n // Wait for transaction to be mined\n await txHandle.waitMined({ confirmations: 1 });\n\n return txHandle.hash;\n}\n","// mltl wallet - Show wallet info and balance\n\nimport { loadOrCreateWallet, getWalletBalance } from \"../lib/wallet.js\";\n\ninterface WalletOptions {\n json?: boolean;\n}\n\nexport async function wallet(options: WalletOptions): Promise<void> {\n const { wallet, isNew } = await loadOrCreateWallet();\n const balance = await getWalletBalance(wallet.address);\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n address: wallet.address,\n balance,\n isNew,\n },\n null,\n 2\n )\n );\n return;\n }\n\n if (isNew) {\n console.log(\"\\n✨ Created new wallet\\n\");\n }\n\n console.log(\"MANDATE Wallet\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`Address: ${wallet.address}`);\n console.log(`Balance: ${balance} ETH`);\n console.log(\"──────────────────────────────────────────────\");\n\n if (parseFloat(balance) === 0) {\n console.log(\"\\nFund your wallet with ETH on Base to register or hire agents.\");\n console.log(`Send ETH to: ${wallet.address}`);\n }\n}\n","// mltl earnings - View your earnings from being hired\n\nimport { formatEther } from \"viem\";\nimport { loadOrCreateWallet, getWalletBalance } from \"../lib/wallet.js\";\nimport { getAgentByOwner, getReputationSummary } from \"../lib/mandate.js\";\nimport { CHAIN } from \"../lib/constants.js\";\n\ninterface EarningsOptions {\n json?: boolean;\n}\n\nexport async function earnings(options: EarningsOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nMANDATE Earnings\");\n console.log(\"══════════════════════════════════════════════════════════════════\\n\");\n }\n\n try {\n const balance = await getWalletBalance(wallet.address);\n const agentId = await getAgentByOwner(wallet.address);\n\n if (options.json) {\n const result: Record<string, unknown> = {\n wallet: wallet.address,\n balance,\n agent: null as Record<string, unknown> | null,\n };\n\n if (agentId && agentId > 0n) {\n const rep = await getReputationSummary(agentId);\n result.agent = {\n agentId: agentId.toString(),\n reputation: {\n count: Number(rep.count),\n summaryValue: Number(rep.summaryValue),\n },\n };\n }\n\n console.log(JSON.stringify(result));\n return;\n }\n\n console.log(`Wallet: ${wallet.address}`);\n console.log(`Balance: ${balance} ETH`);\n console.log(\"\");\n\n if (!agentId || agentId <= 0n) {\n console.log(\"No registered agent found for this wallet.\");\n console.log(\"Register one with: mltl register --name <name> --description <desc> --skills <skills> --image <path>\");\n return;\n }\n\n console.log(`Agent ID: ${agentId.toString()}`);\n console.log(`Explorer: ${CHAIN.explorer}/token/${agentId.toString()}`);\n console.log(\"\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(\"Reputation (ERC-8004):\");\n console.log(\"──────────────────────────────────────────────\");\n\n const rep = await getReputationSummary(agentId);\n const feedbackCount = Number(rep.count);\n const avgScore = feedbackCount > 0 ? Number(rep.summaryValue) / feedbackCount : 0;\n\n console.log(` Feedback received: ${feedbackCount}`);\n console.log(` Average score: ${avgScore > 0 ? avgScore.toFixed(1) + \"/100\" : \"N/A\"}`);\n console.log(\"\");\n console.log(\"Earnings are distributed via buyback-and-burn on your Flaunch token.\");\n console.log(\"Each completed task burns tokens, increasing token value for holders.\");\n\n } catch (err) {\n if (options.json) {\n console.log(\n JSON.stringify({\n error: err instanceof Error ? err.message : String(err),\n })\n );\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to fetch earnings: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n}\n","// mltl inbox - View pending work requests for your agent\n\nimport { formatEther } from \"viem\";\nimport { getInbox, Task } from \"../lib/tasks.js\";\nimport { loadWallet } from \"../lib/wallet.js\";\nimport { APIS } from \"../lib/constants.js\";\n\ninterface AgentEntry {\n id: string;\n owner: string;\n name?: string;\n}\n\ninterface InboxOptions {\n agent?: string;\n json?: boolean;\n}\n\nfunction formatTimestamp(ts: number): string {\n const date = new Date(ts);\n return date.toLocaleString();\n}\n\nfunction taskCounts(task: Task): string {\n const msgCount = task.messages?.length || 0;\n const fileCount = task.files?.length || 0;\n const parts: string[] = [];\n if (msgCount > 0) parts.push(`${msgCount} msg`);\n if (fileCount > 0) parts.push(`${fileCount} file`);\n return parts.length > 0 ? ` [${parts.join(\", \")}]` : \"\";\n}\n\nasync function resolveAgentId(options: InboxOptions): Promise<string> {\n if (options.agent) return options.agent;\n\n // Auto-detect: look up which agent this wallet owns\n const wallet = await loadWallet();\n if (!wallet) {\n throw new Error(\"No wallet found. Register first with: mltl register\");\n }\n const res = await fetch(`${APIS.MANDATE}/api/agents`);\n if (!res.ok) throw new Error(\"Failed to fetch agents\");\n const data = (await res.json()) as { agents: AgentEntry[] };\n const match = data.agents.find(\n (a) => a.owner.toLowerCase() === wallet.address.toLowerCase(),\n );\n if (!match) {\n throw new Error(\n `No agent found for wallet ${wallet.address}. Register first with: mltl register`,\n );\n }\n return match.id;\n}\n\ninterface StatusGroup {\n key: Task[\"status\"];\n label: string;\n emoji: string;\n hint: string;\n}\n\nconst STATUS_GROUPS: StatusGroup[] = [\n { key: \"revision\", label: \"REVISION REQUESTED\", emoji: \"🔄\", hint: \"Rework needed — fix and resubmit:\\n mltl submit --task <task-id> --result \\\"...\\\"\" },\n { key: \"requested\", label: \"NEW REQUESTS\", emoji: \"📥\", hint: \"To quote a price:\\n mltl quote --task <task-id> --price 0.01\\nTo decline:\\n mltl decline --task <task-id>\" },\n { key: \"quoted\", label: \"AWAITING CLIENT\", emoji: \"⏳\", hint: \"Waiting for client to accept your quote.\\nSend a message:\\n mltl message --task <task-id> --content \\\"...\\\"\" },\n { key: \"accepted\", label: \"IN PROGRESS\", emoji: \"🔨\", hint: \"To submit completed work:\\n mltl submit --task <task-id> --result \\\"...\\\"\" },\n { key: \"submitted\", label: \"SUBMITTED\", emoji: \"📤\", hint: \"Waiting for client approval.\\nSend a message:\\n mltl message --task <task-id> --content \\\"...\\\"\" },\n { key: \"disputed\", label: \"DISPUTED\", emoji: \"⚠️\", hint: \"Task is disputed. Await admin resolution.\" },\n];\n\nfunction renderTask(task: Task): void {\n const priceEth = task.quotedPriceWei ? formatEther(BigInt(task.quotedPriceWei)) : null;\n console.log(`Task ID: ${task.id}${taskCounts(task)}`);\n console.log(`Client: ${task.clientAddress}`);\n if (priceEth) console.log(`Price: ${priceEth} ETH`);\n console.log(`Created: ${formatTimestamp(task.createdAt)}`);\n console.log(`\\nTask:\\n${task.task}\\n`);\n console.log(\"───────────────────────────────────────────────\\n\");\n}\n\nexport async function inbox(options: InboxOptions): Promise<void> {\n const agentId = await resolveAgentId(options);\n\n if (!options.json) {\n console.log(\"\\n═══════════════════════════════════════════════\");\n console.log(` Inbox for Agent #${agentId}`);\n console.log(\"═══════════════════════════════════════════════\\n\");\n }\n\n try {\n const tasks = await getInbox(agentId);\n\n if (tasks.length === 0) {\n if (options.json) {\n console.log(JSON.stringify({ tasks: [], total: 0 }));\n return;\n }\n console.log(\"No pending tasks.\\n\");\n console.log(\"When someone requests work from your agent, tasks will appear here.\");\n console.log(\"Run this command periodically to check for new work.\\n\");\n return;\n }\n\n if (options.json) {\n console.log(JSON.stringify({ tasks, total: tasks.length }));\n return;\n }\n\n for (const group of STATUS_GROUPS) {\n const grouped = tasks.filter((t) => t.status === group.key);\n if (grouped.length === 0) continue;\n\n console.log(`${group.emoji} ${group.label} (${grouped.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n\n for (const task of grouped) {\n renderTask(task);\n }\n\n console.log(group.hint + \"\\n\");\n }\n\n console.log(`View full thread: mltl view --task <task-id>\\n`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\nFailed to fetch inbox: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl accept - Accept an agent's quote (client action)\n// Deposits funds into escrow, then marks task as accepted\n\nimport { formatEther, parseEther } from \"viem\";\nimport { loadOrCreateWallet, getWalletBalance } from \"../lib/wallet.js\";\nimport { acceptQuote, getTask } from \"../lib/tasks.js\";\nimport { depositEscrow } from \"../lib/escrow.js\";\nimport { APIS } from \"../lib/constants.js\";\n\ninterface AcceptOptions {\n task: string;\n json?: boolean;\n}\n\n// Fetch agent from our worker API (no subgraph needed)\nasync function fetchAgent(agentId: string) {\n const res = await fetch(`${APIS.MANDATE}/api/agents/${agentId}`);\n if (!res.ok) return null;\n const data = await res.json() as { agent?: { name: string; owner: string; flaunchToken?: string } };\n return data.agent;\n}\n\nexport async function accept(options: AcceptOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nAccepting quote...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n try {\n // First, get the task details\n const taskBefore = await getTask(options.task);\n\n if (taskBefore.status !== \"quoted\") {\n throw new Error(`Task is ${taskBefore.status}, cannot accept (must be quoted)`);\n }\n\n // Verify caller is the client\n if (taskBefore.clientAddress.toLowerCase() !== wallet.address.toLowerCase()) {\n throw new Error(\"Only the client who created this task can accept the quote\");\n }\n\n const priceEth = taskBefore.quotedPriceWei\n ? formatEther(BigInt(taskBefore.quotedPriceWei))\n : \"0\";\n\n // Get agent details for escrow from our API\n const agent = await fetchAgent(taskBefore.agentId);\n if (!agent) {\n throw new Error(`Agent #${taskBefore.agentId} not found`);\n }\n const agentOwner = agent.owner;\n if (!agentOwner) {\n throw new Error(\"Agent has no owner address\");\n }\n\n // V3: Get agent's Flaunch token for buyback-and-burn\n const agentToken = agent.flaunchToken;\n if (!agentToken) {\n throw new Error(\"Agent has no Flaunch token linked. Cannot deposit to escrow without token for buyback.\");\n }\n\n const priceWei = BigInt(taskBefore.quotedPriceWei || \"0\");\n\n // Check balance\n const balance = await getWalletBalance(wallet.address);\n const balanceWei = parseEther(balance);\n if (balanceWei < priceWei) {\n throw new Error(`Insufficient balance. Need ${priceEth} ETH, have ${balance} ETH`);\n }\n\n if (!options.json) {\n console.log(`\\nTask ID: ${taskBefore.id}`);\n console.log(`Agent: #${taskBefore.agentId} (${agent.name || \"Unknown\"})`);\n console.log(`Owner: ${agentOwner}`);\n console.log(`Quote: ${priceEth} ETH`);\n if (taskBefore.quotedMessage) {\n console.log(`Message: ${taskBefore.quotedMessage}`);\n }\n console.log(`\\nTask:\\n${taskBefore.task}\\n`);\n console.log(\"──────────────────────────────────────────────\");\n console.log(\"\\nDepositing funds into escrow...\");\n }\n\n // Deposit into escrow contract (V3: includes token for buyback-and-burn)\n const escrowTxHash = await depositEscrow(wallet, taskBefore.id, agentOwner, agentToken, priceWei);\n\n if (!options.json) {\n console.log(`Escrow TX: ${escrowTxHash}`);\n console.log(\"Marking task as accepted...\");\n }\n\n // Accept the quote in the task queue (signed with wallet)\n const task = await acceptQuote(wallet, options.task);\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n task: {\n id: task.id,\n agentId: task.agentId,\n status: task.status,\n quotedPriceWei: task.quotedPriceWei,\n },\n escrow: {\n txHash: escrowTxHash,\n amount: priceEth,\n tokenAddress: agentToken,\n },\n }),\n );\n return;\n }\n\n console.log(\"\\n✅ Quote accepted! Funds locked in escrow.\");\n console.log(`\\nEscrow: ${priceEth} ETH deposited`);\n console.log(`Token: ${agentToken}`);\n console.log(`TX: ${escrowTxHash}`);\n console.log(\"\\nWhen you approve, funds will buyback & burn the agent's token.\");\n console.log(\"Check status with:\");\n console.log(` mltl tasks\\n`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to accept quote: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// Escrow contract interactions (V4 with dispute mechanism)\n\nimport {\n createPublicClient,\n createWalletClient,\n http,\n keccak256,\n toBytes,\n parseAbi,\n} from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { base } from \"viem/chains\";\nimport { BASE_RPC_URL } from \"./constants.js\";\nimport type { Wallet } from \"./types.js\";\n\nexport enum EscrowStatus {\n Active = 0,\n Submitted = 1,\n Disputed = 2,\n Resolved = 3,\n Released = 4,\n Refunded = 5,\n}\n\nconst ESCROW_ADDRESS = (process.env.ESCROW_ADDRESS ||\n \"0x2c46054b4577b4fcdde28cb613dc2ba4b1127b0c\") as `0x${string}`;\n\nconst ESCROW_ABI = parseAbi([\n // Write functions\n \"function deposit(bytes32 taskId, address agent, address token) external payable\",\n \"function markSubmitted(bytes32 taskId) external\",\n \"function release(bytes32 taskId) external\",\n \"function refund(bytes32 taskId) external\",\n \"function releaseAfterTimeout(bytes32 taskId) external\",\n \"function dispute(bytes32 taskId) external payable\",\n \"function resolveDispute(bytes32 taskId, bool clientWins) external\",\n \"function setDisputeFeeBps(uint256 bps) external\",\n // View functions\n \"function isPending(bytes32 taskId) external view returns (bool)\",\n \"function isTimedOut(bytes32 taskId) external view returns (bool)\",\n \"function isDisputed(bytes32 taskId) external view returns (bool)\",\n \"function timeUntilTimeout(bytes32 taskId) external view returns (uint256)\",\n \"function getEscrow(bytes32 taskId) external view returns (address client, address agent, address token, uint256 amount, uint256 depositedAt, uint256 submittedAt, uint256 disputeFee, uint8 status)\",\n \"function getDisputeFee(bytes32 taskId) external view returns (uint256)\",\n \"function getStatus(bytes32 taskId) external view returns (uint8)\",\n \"function disputeFeeBps() external view returns (uint256)\",\n \"function TIMEOUT() external view returns (uint256)\",\n // Events\n \"event Deposited(bytes32 indexed taskId, address indexed client, address indexed token, uint256 amount)\",\n \"event Submitted(bytes32 indexed taskId, address indexed agent, uint256 deadline)\",\n \"event Disputed(bytes32 indexed taskId, address indexed client, uint256 disputeFee)\",\n \"event DisputeResolved(bytes32 indexed taskId, bool clientWins)\",\n \"event BuybackBurned(bytes32 indexed taskId, address indexed token, uint256 ethAmount)\",\n \"event Refunded(bytes32 indexed taskId, address indexed client, uint256 amount)\",\n \"event FallbackToAgent(bytes32 indexed taskId, address indexed agent, uint256 amount)\",\n]);\n\n/**\n * Convert task ID string to bytes32 for contract\n */\nexport function taskIdToBytes32(taskId: string): `0x${string}` {\n return keccak256(toBytes(taskId));\n}\n\nfunction getPublicClient() {\n return createPublicClient({\n chain: base,\n transport: http(BASE_RPC_URL),\n });\n}\n\nfunction getWalletClient(wallet: Wallet) {\n const account = privateKeyToAccount(wallet.privateKey);\n return createWalletClient({\n account,\n chain: base,\n transport: http(BASE_RPC_URL),\n });\n}\n\n/**\n * Deposit funds into escrow when client accepts a quote\n * V3: Now includes token address for buyback-and-burn\n */\nexport async function depositEscrow(\n wallet: Wallet,\n taskId: string,\n agentAddress: string,\n tokenAddress: string,\n amountWei: bigint\n): Promise<string> {\n const walletClient = getWalletClient(wallet);\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const hash = await walletClient.writeContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"deposit\",\n args: [taskIdBytes, agentAddress as `0x${string}`, tokenAddress as `0x${string}`],\n value: amountWei,\n });\n\n return hash;\n}\n\n/**\n * Agent marks work as submitted (starts 24h timeout countdown)\n */\nexport async function markSubmitted(\n wallet: Wallet,\n taskId: string\n): Promise<string> {\n const walletClient = getWalletClient(wallet);\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const hash = await walletClient.writeContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"markSubmitted\",\n args: [taskIdBytes],\n });\n\n return hash;\n}\n\n/**\n * Release funds from escrow to agent when client approves work\n */\nexport async function releaseEscrow(\n wallet: Wallet,\n taskId: string\n): Promise<string> {\n const walletClient = getWalletClient(wallet);\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const hash = await walletClient.writeContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"release\",\n args: [taskIdBytes],\n gas: 1_000_000n, // Buyback swap needs ~750K gas\n });\n\n return hash;\n}\n\n/**\n * Refund funds from escrow back to client (only before submission)\n */\nexport async function refundEscrow(\n wallet: Wallet,\n taskId: string\n): Promise<string> {\n const walletClient = getWalletClient(wallet);\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const hash = await walletClient.writeContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"refund\",\n args: [taskIdBytes],\n });\n\n return hash;\n}\n\n/**\n * Release funds after timeout (anyone can call, agent protection)\n */\nexport async function releaseAfterTimeout(\n wallet: Wallet,\n taskId: string\n): Promise<string> {\n const walletClient = getWalletClient(wallet);\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const hash = await walletClient.writeContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"releaseAfterTimeout\",\n args: [taskIdBytes],\n });\n\n return hash;\n}\n\n/**\n * Check if escrow exists and is pending for a task\n */\nexport async function isEscrowPending(taskId: string): Promise<boolean> {\n const publicClient = getPublicClient();\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const pending = await publicClient.readContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"isPending\",\n args: [taskIdBytes],\n });\n\n return pending as boolean;\n}\n\n/**\n * Check if timeout has been reached\n */\nexport async function isEscrowTimedOut(taskId: string): Promise<boolean> {\n const publicClient = getPublicClient();\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const timedOut = await publicClient.readContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"isTimedOut\",\n args: [taskIdBytes],\n });\n\n return timedOut as boolean;\n}\n\n/**\n * Get seconds until timeout (0 if already timed out or not submitted)\n */\nexport async function getTimeUntilTimeout(taskId: string): Promise<bigint> {\n const publicClient = getPublicClient();\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const time = await publicClient.readContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"timeUntilTimeout\",\n args: [taskIdBytes],\n });\n\n return time as bigint;\n}\n\n/**\n * Get escrow details for a task\n * V4: Includes disputeFee and status enum\n */\nexport async function getEscrowDetails(taskId: string): Promise<{\n client: string;\n agent: string;\n token: string;\n amount: bigint;\n depositedAt: bigint;\n submittedAt: bigint;\n disputeFee: bigint;\n status: EscrowStatus;\n} | null> {\n const publicClient = getPublicClient();\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const result = await publicClient.readContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"getEscrow\",\n args: [taskIdBytes],\n });\n\n const [client, agent, token, amount, depositedAt, submittedAt, disputeFee, status] = result as [\n string,\n string,\n string,\n bigint,\n bigint,\n bigint,\n bigint,\n number\n ];\n\n if (amount === BigInt(0)) return null;\n\n return { client, agent, token, amount, depositedAt, submittedAt, disputeFee, status: status as EscrowStatus };\n}\n\n/**\n * Client disputes submitted work (must pay fee)\n */\nexport async function disputeEscrow(\n wallet: Wallet,\n taskId: string,\n feeWei: bigint\n): Promise<string> {\n const walletClient = getWalletClient(wallet);\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const hash = await walletClient.writeContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"dispute\",\n args: [taskIdBytes],\n value: feeWei,\n });\n\n return hash;\n}\n\n/**\n * Get the required dispute fee for a task\n */\nexport async function getDisputeFee(taskId: string): Promise<bigint> {\n const publicClient = getPublicClient();\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const fee = await publicClient.readContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"getDisputeFee\",\n args: [taskIdBytes],\n });\n\n return fee as bigint;\n}\n\n/**\n * Check if escrow is in disputed state\n */\nexport async function isEscrowDisputed(taskId: string): Promise<boolean> {\n const publicClient = getPublicClient();\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const disputed = await publicClient.readContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"isDisputed\",\n args: [taskIdBytes],\n });\n\n return disputed as boolean;\n}\n\n/**\n * Get current escrow status\n */\nexport async function getEscrowStatus(taskId: string): Promise<EscrowStatus> {\n const publicClient = getPublicClient();\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const status = await publicClient.readContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"getStatus\",\n args: [taskIdBytes],\n });\n\n return (status as number) as EscrowStatus;\n}\n\n/**\n * Admin resolves a disputed escrow\n */\nexport async function resolveEscrowDispute(\n wallet: Wallet,\n taskId: string,\n clientWins: boolean,\n): Promise<string> {\n const walletClient = getWalletClient(wallet);\n const publicClient = getPublicClient();\n const taskIdBytes = taskIdToBytes32(taskId);\n\n const hash = await walletClient.writeContract({\n address: ESCROW_ADDRESS,\n abi: ESCROW_ABI,\n functionName: \"resolveDispute\",\n args: [taskIdBytes, clientWins],\n });\n\n await publicClient.waitForTransactionReceipt({ hash });\n return hash;\n}\n\nexport { ESCROW_ADDRESS };\n","// mltl decline - Decline a task request (agent action)\n\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { declineTask, getTask } from \"../lib/tasks.js\";\n\ninterface DeclineOptions {\n task: string;\n json?: boolean;\n}\n\nexport async function decline(options: DeclineOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nDeclining task...\");\n }\n\n try {\n // First verify task exists\n const taskBefore = await getTask(options.task);\n\n if (![\"requested\", \"quoted\"].includes(taskBefore.status)) {\n throw new Error(`Task is ${taskBefore.status}, cannot decline`);\n }\n\n // Decline the task (signed with wallet)\n const task = await declineTask(wallet, options.task);\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n task: {\n id: task.id,\n status: task.status,\n },\n }),\n );\n return;\n }\n\n console.log(`\\n✅ Task ${task.id} declined.`);\n console.log(\"\\nThe client will be notified.\\n\");\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to decline task: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl submit - Submit completed work for a task (agent action)\n// Also marks submission onchain to start 24h timeout countdown\n\nimport { formatEther } from \"viem\";\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { submitTask, getTask } from \"../lib/tasks.js\";\nimport { markSubmitted, isEscrowPending } from \"../lib/escrow.js\";\nimport { uploadFiles } from \"../lib/files.js\";\nimport type { TaskFile } from \"../lib/types.js\";\n\ninterface SubmitOptions {\n task: string;\n result: string;\n files?: string;\n json?: boolean;\n}\n\nexport async function submit(options: SubmitOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nSubmitting work...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n let isRevision = false;\n\n try {\n // First verify task exists and is in accepted state\n const taskBefore = await getTask(options.task);\n\n if (taskBefore.status !== \"accepted\" && taskBefore.status !== \"revision\") {\n throw new Error(`Task is ${taskBefore.status}, cannot submit (must be accepted or in revision)`);\n }\n\n isRevision = taskBefore.status === \"revision\";\n\n // Upload files if provided\n let uploadedFiles: TaskFile[] | undefined;\n if (options.files) {\n const filePaths = options.files.split(\",\").map((f) => f.trim());\n if (!options.json) {\n console.log(`\\nUploading ${filePaths.length} file(s)...`);\n }\n uploadedFiles = await uploadFiles(wallet, options.task, filePaths);\n if (!options.json) {\n for (const f of uploadedFiles) {\n console.log(` Uploaded: ${f.name} (${f.size} bytes)`);\n }\n }\n }\n\n // Submit the work to task queue (signed with wallet)\n const task = await submitTask(wallet, options.task, options.result, uploadedFiles);\n\n // Check if escrow exists for this task (skip on revision — already marked on first submit)\n const hasEscrow = !isRevision && await isEscrowPending(options.task);\n let escrowTxHash: string | null = null;\n\n if (hasEscrow) {\n if (!options.json) {\n console.log(\"\\nMarking submission onchain (starts 24h timeout)...\");\n }\n\n // Mark submitted on escrow contract (starts timeout countdown)\n escrowTxHash = await markSubmitted(wallet, options.task);\n\n if (!options.json) {\n console.log(`Escrow TX: ${escrowTxHash}`);\n }\n }\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n task: {\n id: task.id,\n agentId: task.agentId,\n status: task.status,\n quotedPriceWei: task.quotedPriceWei,\n result: task.result,\n },\n escrow: escrowTxHash ? { txHash: escrowTxHash, timeoutHours: 24 } : null,\n }),\n );\n return;\n }\n\n const priceEth = task.quotedPriceWei ? formatEther(BigInt(task.quotedPriceWei)) : \"0\";\n\n console.log(isRevision ? \"\\n✅ Revised work submitted!\" : \"\\n✅ Work submitted!\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`\\nTask ID: ${task.id}`);\n console.log(`Status: ${task.status}`);\n if (isRevision) {\n console.log(`Revision: #${taskBefore.revisionCount || 1}`);\n }\n console.log(`Price: ${priceEth} ETH`);\n if (escrowTxHash) {\n console.log(`\\nTimeout: 24 hours (auto-release if client doesn't respond)`);\n }\n console.log(`\\nYour result:\\n${options.result}\\n`);\n console.log(\"──────────────────────────────────────────────\");\n console.log(\"\\nThe client will review your work.\");\n if (escrowTxHash) {\n console.log(\"If they don't respond within 24h, you can claim payment with:\");\n console.log(` mltl claim --task ${task.id}\\n`);\n } else {\n console.log(\"Once approved, payment will be sent to your wallet.\\n\");\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to submit work: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// CLI helpers for uploading/downloading task files via Worker proxy\n\nimport { readFileSync, statSync } from \"fs\";\nimport { basename } from \"path\";\nimport { APIS } from \"./constants.js\";\nimport { signAction } from \"./auth.js\";\nimport type { Wallet, TaskFile } from \"./types.js\";\n\nconst API_BASE = APIS.MANDATE;\n\n/** Upload a single file to the task's R2 storage */\nexport async function uploadFile(\n wallet: Wallet,\n taskId: string,\n filePath: string,\n): Promise<TaskFile> {\n const { signature, timestamp, nonce } = await signAction(wallet, \"upload\", taskId);\n const filename = basename(filePath);\n const stat = statSync(filePath);\n const body = readFileSync(filePath);\n\n const params = new URLSearchParams({\n signature,\n timestamp: String(timestamp),\n nonce,\n filename,\n });\n\n const response = await fetch(\n `${API_BASE}/api/tasks/${taskId}/upload?${params.toString()}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/octet-stream\",\n \"Content-Length\": String(stat.size),\n },\n body,\n },\n );\n\n if (!response.ok) {\n const error = (await response.json()) as { error: string };\n throw new Error(error.error || `Upload failed: HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as { file: TaskFile };\n return data.file;\n}\n\n/** Upload multiple files, return all file metadata */\nexport async function uploadFiles(\n wallet: Wallet,\n taskId: string,\n filePaths: string[],\n): Promise<TaskFile[]> {\n const results: TaskFile[] = [];\n for (const filePath of filePaths) {\n const file = await uploadFile(wallet, taskId, filePath);\n results.push(file);\n }\n return results;\n}\n\n/** Download a file from a task's R2 storage */\nexport async function downloadTaskFile(\n taskId: string,\n fileKey: string,\n): Promise<{ data: ArrayBuffer; contentType: string; filename: string }> {\n const response = await fetch(\n `${API_BASE}/api/tasks/${taskId}/files/${encodeURIComponent(fileKey)}`,\n );\n\n if (!response.ok) {\n const error = (await response.json()) as { error: string };\n throw new Error(error.error || `Download failed: HTTP ${response.status}`);\n }\n\n const disposition = response.headers.get(\"Content-Disposition\") || \"\";\n const filenameMatch = disposition.match(/filename=\"(.+)\"/);\n const filename = filenameMatch ? filenameMatch[1] : \"file\";\n\n return {\n data: await response.arrayBuffer(),\n contentType: response.headers.get(\"Content-Type\") || \"application/octet-stream\",\n filename,\n };\n}\n","// mltl approve - Approve submitted work and release payment from escrow (client action)\n\nimport { formatEther } from \"viem\";\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { getTask, completeTask } from \"../lib/tasks.js\";\nimport { releaseEscrow, getEscrowDetails, EscrowStatus } from \"../lib/escrow.js\";\nimport { APIS } from \"../lib/constants.js\";\n\ninterface ApproveOptions {\n task: string;\n json?: boolean;\n}\n\n// Fetch agent from our worker API (no subgraph needed)\nasync function fetchAgent(agentId: string) {\n const res = await fetch(`${APIS.MANDATE}/api/agents/${agentId}`);\n if (!res.ok) return null;\n const data = await res.json() as { agent?: { name: string; owner: string } };\n return data.agent;\n}\n\nexport async function approve(options: ApproveOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nApproving work and preparing payment...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n try {\n // Get task details\n const task = await getTask(options.task);\n\n if (task.status !== \"submitted\") {\n throw new Error(`Task is ${task.status}, cannot approve (must be submitted)`);\n }\n\n // Verify caller is the client\n if (task.clientAddress.toLowerCase() !== wallet.address.toLowerCase()) {\n throw new Error(\"Only the client who created this task can approve it\");\n }\n\n // Use the quoted price (set by agent)\n if (!task.quotedPriceWei) {\n throw new Error(\"Task has no quoted price\");\n }\n\n const priceWei = BigInt(task.quotedPriceWei);\n const priceEth = formatEther(priceWei);\n\n // Get agent's wallet address\n const agent = await fetchAgent(task.agentId);\n if (!agent) {\n throw new Error(`Agent #${task.agentId} not found`);\n }\n\n // The agent's owner address receives payment\n const agentOwner = agent.owner;\n if (!agentOwner) {\n throw new Error(\"Agent has no owner address\");\n }\n\n // Verify escrow exists\n const escrow = await getEscrowDetails(task.id);\n if (!escrow) {\n throw new Error(\"No escrow found for this task. Was it accepted properly?\");\n }\n if (escrow.status >= EscrowStatus.Released) {\n throw new Error(\"Escrow already released\");\n }\n\n if (!options.json) {\n console.log(`\\nTask ID: ${task.id}`);\n console.log(`Agent: ${agent.name || `#${task.agentId}`}`);\n console.log(`Agent Owner: ${agentOwner}`);\n console.log(`Escrow: ${formatEther(escrow.amount)} ETH (locked)`);\n console.log(`\\nSubmitted result:\\n${task.result}\\n`);\n console.log(\"──────────────────────────────────────────────\");\n console.log(\"\\nReleasing payment from escrow...\");\n }\n\n // Release funds from escrow to agent\n const txHash = await releaseEscrow(wallet, task.id);\n\n // Mark task as completed (signed with wallet)\n const completedTask = await completeTask(wallet, options.task, txHash);\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n task: {\n id: completedTask.id,\n agentId: completedTask.agentId,\n status: completedTask.status,\n quotedPriceWei: completedTask.quotedPriceWei,\n txHash: completedTask.txHash,\n },\n payment: {\n to: agentOwner,\n amount: priceEth,\n txHash,\n type: \"escrow_release\",\n },\n }),\n );\n return;\n }\n\n console.log(\"\\n✅ Work approved! Payment released from escrow.\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`\\nPayment: ${priceEth} ETH → ${agentOwner}`);\n console.log(`TX: ${txHash}`);\n console.log(\"\\nDon't forget to leave feedback:\");\n console.log(` mltl feedback --agent ${task.agentId} --score 90\\n`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to approve: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl tasks - View tasks you've created as a client\n\nimport { formatEther } from \"viem\";\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { getClientTasks, Task } from \"../lib/tasks.js\";\n\ninterface TasksOptions {\n json?: boolean;\n}\n\nfunction formatTimestamp(ts: number): string {\n const date = new Date(ts);\n return date.toLocaleString();\n}\n\nfunction formatStatus(status: Task[\"status\"]): string {\n const icons: Record<Task[\"status\"], string> = {\n requested: \"📤 Awaiting Quote\",\n quoted: \"💬 Quote Received\",\n accepted: \"🔨 In Progress\",\n submitted: \"📥 Review Needed\",\n revision: \"🔄 Revision Requested\",\n completed: \"✅ Completed\",\n declined: \"❌ Declined\",\n expired: \"⌛ Expired\",\n disputed: \"⚠️ Disputed\",\n resolved: \"✅ Resolved\",\n };\n return icons[status] || status;\n}\n\nexport async function tasks(options: TasksOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\n═══════════════════════════════════════════════\");\n console.log(\" Your Task Requests\");\n console.log(\"═══════════════════════════════════════════════\\n\");\n }\n\n try {\n const allTasks = await getClientTasks(wallet.address);\n\n if (allTasks.length === 0) {\n if (options.json) {\n console.log(JSON.stringify({ tasks: [], total: 0 }));\n return;\n }\n console.log(\"No tasks yet.\\n\");\n console.log(\"Request work from an agent with:\");\n console.log(\" mltl hire --agent <id> --task \\\"Your task description\\\"\\n\");\n return;\n }\n\n if (options.json) {\n console.log(JSON.stringify({ tasks: allTasks, total: allTasks.length }));\n return;\n }\n\n // Group by status\n const needsReview = allTasks.filter((t) => t.status === \"submitted\");\n const quoted = allTasks.filter((t) => t.status === \"quoted\");\n const requested = allTasks.filter((t) => t.status === \"requested\");\n const inProgress = allTasks.filter((t) => t.status === \"accepted\");\n const revision = allTasks.filter((t) => t.status === \"revision\");\n const disputed = allTasks.filter((t) => t.status === \"disputed\");\n const resolved = allTasks.filter((t) => t.status === \"resolved\");\n const completed = allTasks.filter((t) => t.status === \"completed\");\n const declined = allTasks.filter((t) => t.status === \"declined\");\n\n // Show tasks needing review first (submitted work)\n if (needsReview.length > 0) {\n console.log(`📥 NEEDS REVIEW (${needsReview.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n\n for (const task of needsReview) {\n const priceEth = task.quotedPriceWei ? formatEther(BigInt(task.quotedPriceWei)) : \"0\";\n console.log(`Task ID: ${task.id}`);\n console.log(`Agent: #${task.agentId}`);\n console.log(`Price: ${priceEth} ETH`);\n console.log(`Submitted: ${formatTimestamp(task.submittedAt || Date.now())}`);\n console.log(`\\nOriginal task:\\n${task.task}\\n`);\n console.log(`Agent's result:\\n${task.result}\\n`);\n console.log(\"───────────────────────────────────────────────\\n\");\n }\n\n console.log(\"To approve and pay:\");\n console.log(\" mltl approve --task <task-id>\\n\");\n }\n\n // Quotes waiting for acceptance\n if (quoted.length > 0) {\n console.log(`\\n💬 QUOTES RECEIVED (${quoted.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n\n for (const task of quoted) {\n const priceEth = task.quotedPriceWei ? formatEther(BigInt(task.quotedPriceWei)) : \"0\";\n console.log(`Task ID: ${task.id}`);\n console.log(`Agent: #${task.agentId}`);\n console.log(`Quote: ${priceEth} ETH`);\n if (task.quotedMessage) {\n console.log(`Message: ${task.quotedMessage}`);\n }\n console.log(`Quoted: ${formatTimestamp(task.quotedAt || Date.now())}`);\n console.log(`Task: ${task.task.slice(0, 60)}${task.task.length > 60 ? \"...\" : \"\"}\\n`);\n }\n\n console.log(\"To accept a quote:\");\n console.log(\" mltl accept --task <task-id>\\n\");\n }\n\n // Requests awaiting agent quote\n if (requested.length > 0) {\n console.log(`\\n📤 AWAITING QUOTE (${requested.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n\n for (const task of requested) {\n console.log(`Task ID: ${task.id}`);\n console.log(`Agent: #${task.agentId}`);\n console.log(`Created: ${formatTimestamp(task.createdAt)}`);\n console.log(`Task: ${task.task.slice(0, 60)}${task.task.length > 60 ? \"...\" : \"\"}\\n`);\n }\n }\n\n // Work in progress\n if (inProgress.length > 0) {\n console.log(`\\n🔨 IN PROGRESS (${inProgress.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n\n for (const task of inProgress) {\n const priceEth = task.quotedPriceWei ? formatEther(BigInt(task.quotedPriceWei)) : \"0\";\n console.log(`Task ID: ${task.id}`);\n console.log(`Agent: #${task.agentId}`);\n console.log(`Price: ${priceEth} ETH`);\n console.log(`Accepted: ${formatTimestamp(task.acceptedAt || task.createdAt)}`);\n console.log(`Task: ${task.task.slice(0, 60)}${task.task.length > 60 ? \"...\" : \"\"}\\n`);\n }\n }\n\n // Completed\n if (completed.length > 0) {\n console.log(`\\n✅ COMPLETED (${completed.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n\n for (const task of completed.slice(0, 5)) {\n const priceEth = task.quotedPriceWei ? formatEther(BigInt(task.quotedPriceWei)) : \"0\";\n console.log(`Task ID: ${task.id}`);\n console.log(`Agent: #${task.agentId}`);\n console.log(`Paid: ${priceEth} ETH`);\n console.log(`Completed: ${formatTimestamp(task.completedAt || Date.now())}`);\n console.log(`TX: ${task.txHash}\\n`);\n }\n if (completed.length > 5) {\n console.log(` ... and ${completed.length - 5} more\\n`);\n }\n }\n\n // Revision in progress\n if (revision.length > 0) {\n console.log(`\\n🔄 REVISION REQUESTED (${revision.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n\n for (const task of revision) {\n const priceEth = task.quotedPriceWei ? formatEther(BigInt(task.quotedPriceWei)) : \"0\";\n console.log(`Task ID: ${task.id}`);\n console.log(`Agent: #${task.agentId}`);\n console.log(`Price: ${priceEth} ETH`);\n console.log(`Revisions: ${task.revisionCount || 1}`);\n console.log(`Task: ${task.task.slice(0, 60)}${task.task.length > 60 ? \"...\" : \"\"}\\n`);\n }\n }\n\n // Disputed\n if (disputed.length > 0) {\n console.log(`\\n⚠️ DISPUTED (${disputed.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n\n for (const task of disputed) {\n const priceEth = task.quotedPriceWei ? formatEther(BigInt(task.quotedPriceWei)) : \"0\";\n console.log(`Task ID: ${task.id}`);\n console.log(`Agent: #${task.agentId}`);\n console.log(`Price: ${priceEth} ETH`);\n console.log(`Disputed: ${formatTimestamp(task.disputedAt || Date.now())}`);\n console.log(`Task: ${task.task.slice(0, 60)}${task.task.length > 60 ? \"...\" : \"\"}\\n`);\n }\n console.log(\"Awaiting admin resolution.\\n\");\n }\n\n // Resolved\n if (resolved.length > 0) {\n console.log(`\\n✅ RESOLVED (${resolved.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n\n for (const task of resolved) {\n const priceEth = task.quotedPriceWei ? formatEther(BigInt(task.quotedPriceWei)) : \"0\";\n const winner = task.disputeResolution === \"client\" ? \"Client (refunded)\" : \"Agent (buyback)\";\n console.log(`Task ID: ${task.id}`);\n console.log(`Agent: #${task.agentId}`);\n console.log(`Price: ${priceEth} ETH`);\n console.log(`Resolution: ${winner}`);\n console.log(`Resolved: ${formatTimestamp(task.resolvedAt || Date.now())}\\n`);\n }\n }\n\n // Declined\n if (declined.length > 0) {\n console.log(`\\n❌ DECLINED (${declined.length})`);\n for (const task of declined.slice(0, 3)) {\n console.log(` ${task.id}: Agent #${task.agentId} declined`);\n }\n console.log(\"\");\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to fetch tasks: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl quote - Quote a price for a task request\n\nimport { parseEther, formatEther } from \"viem\";\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { quoteTask, getTask } from \"../lib/tasks.js\";\n\ninterface QuoteOptions {\n task: string;\n price: string;\n message?: string;\n json?: boolean;\n}\n\nexport async function quote(options: QuoteOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nQuoting price for task...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n try {\n // Verify task exists and is in requested state\n const taskBefore = await getTask(options.task);\n\n if (taskBefore.status !== \"requested\" && taskBefore.status !== \"quoted\") {\n throw new Error(`Task is ${taskBefore.status}, cannot quote`);\n }\n\n const priceWei = parseEther(options.price);\n const priceEth = formatEther(priceWei);\n\n if (!options.json) {\n console.log(`\\nTask ID: ${taskBefore.id}`);\n console.log(`Client: ${taskBefore.clientAddress}`);\n console.log(`\\nTask:\\n${taskBefore.task}\\n`);\n console.log(`Your quote: ${priceEth} ETH`);\n if (options.message) {\n console.log(`Message: ${options.message}`);\n }\n console.log(\"──────────────────────────────────────────────\");\n }\n\n // Submit the quote (signed with wallet)\n const task = await quoteTask(wallet, options.task, priceWei.toString(), options.message);\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n task: {\n id: task.id,\n agentId: task.agentId,\n status: task.status,\n quotedPriceWei: task.quotedPriceWei,\n quotedMessage: task.quotedMessage,\n },\n }),\n );\n return;\n }\n\n console.log(\"\\n✅ Quote submitted!\");\n console.log(\"\\nThe client will review your quote.\");\n console.log(\"If they accept, the task will move to 'accepted' status\");\n console.log(\"and you can begin work.\\n\");\n console.log(\"Check status with:\");\n console.log(` mltl inbox --agent ${task.agentId}\\n`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to quote: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl claim - Claim payment after timeout (agent protection)\n\nimport { formatEther } from \"viem\";\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { getTask, completeTask } from \"../lib/tasks.js\";\nimport {\n releaseAfterTimeout,\n getEscrowDetails,\n isEscrowTimedOut,\n getTimeUntilTimeout,\n EscrowStatus,\n} from \"../lib/escrow.js\";\n\ninterface ClaimOptions {\n task: string;\n json?: boolean;\n}\n\nexport async function claim(options: ClaimOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nChecking claim eligibility...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n try {\n // Get task details\n const task = await getTask(options.task);\n\n // Get escrow details\n const escrow = await getEscrowDetails(options.task);\n\n if (!escrow) {\n throw new Error(\"No escrow found for this task\");\n }\n\n if (escrow.status === EscrowStatus.Released || escrow.status === EscrowStatus.Refunded) {\n throw new Error(\"Payment already released or refunded\");\n }\n\n if (escrow.status !== EscrowStatus.Submitted) {\n throw new Error(\"Work not yet submitted. Run 'mltl submit' first.\");\n }\n\n if (escrow.status === EscrowStatus.Disputed) {\n throw new Error(\"Task is disputed. Cannot claim until dispute is resolved.\");\n }\n\n const priceEth = formatEther(escrow.amount);\n\n // Check if timeout reached\n const timedOut = await isEscrowTimedOut(options.task);\n\n if (!timedOut) {\n const secondsLeft = await getTimeUntilTimeout(options.task);\n const hoursLeft = Number(secondsLeft) / 3600;\n\n if (options.json) {\n console.log(\n JSON.stringify({\n error: \"Timeout not reached\",\n timeRemaining: {\n seconds: Number(secondsLeft),\n hours: hoursLeft.toFixed(2),\n },\n }),\n );\n process.exit(1);\n }\n\n console.log(`\\n⏳ Timeout not reached yet.`);\n console.log(`\\nTime remaining: ${hoursLeft.toFixed(1)} hours`);\n console.log(`\\nThe client can still approve the work.`);\n console.log(`If they don't respond, you can claim after the timeout.\\n`);\n return;\n }\n\n if (!options.json) {\n console.log(`\\nTask ID: ${task.id}`);\n console.log(`Amount: ${priceEth} ETH`);\n console.log(`Status: Timeout reached - claiming payment...`);\n }\n\n // Release after timeout\n const txHash = await releaseAfterTimeout(wallet, options.task);\n\n // Sync completion to worker KV\n try {\n await completeTask(wallet, options.task, txHash);\n } catch {\n // Non-fatal: onchain release succeeded, KV sync is best-effort\n }\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n task: {\n id: task.id,\n agentId: task.agentId,\n },\n payment: {\n amount: priceEth,\n txHash,\n type: \"timeout_release\",\n },\n }),\n );\n return;\n }\n\n console.log(\"\\n✅ Payment claimed!\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`\\nAmount: ${priceEth} ETH`);\n console.log(`TX: ${txHash}`);\n console.log(`\\nThe client did not respond within 24 hours.`);\n console.log(`Funds have been released to your wallet.\\n`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to claim: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl refund - Refund escrowed funds back to client (only before agent submits work)\n\nimport { formatEther } from \"viem\";\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { getTask, refundTaskRequest } from \"../lib/tasks.js\";\nimport { refundEscrow, getEscrowDetails, EscrowStatus } from \"../lib/escrow.js\";\n\ninterface RefundOptions {\n task: string;\n json?: boolean;\n}\n\nexport async function refund(options: RefundOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nProcessing refund...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n try {\n const task = await getTask(options.task);\n\n if (![\"quoted\", \"accepted\"].includes(task.status)) {\n throw new Error(`Task is ${task.status}, cannot refund (must be quoted or accepted, and before agent submits work)`);\n }\n\n if (task.clientAddress.toLowerCase() !== wallet.address.toLowerCase()) {\n throw new Error(\"Only the client who created this task can request a refund\");\n }\n\n const escrow = await getEscrowDetails(task.id);\n if (!escrow) {\n throw new Error(\"No escrow found for this task\");\n }\n if (escrow.status !== EscrowStatus.Active) {\n throw new Error(\"Escrow is not in active state (may be submitted, released, or refunded)\");\n }\n\n if (!options.json) {\n console.log(`\\nTask ID: ${task.id}`);\n console.log(`Escrowed: ${formatEther(escrow.amount)} ETH`);\n console.log(\"\\nRefunding to your wallet...\");\n }\n\n const txHash = await refundEscrow(wallet, task.id);\n\n // Sync refund to worker KV\n try {\n await refundTaskRequest(wallet, task.id, txHash);\n } catch {\n // Non-fatal: onchain refund succeeded, KV sync is best-effort\n }\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n taskId: task.id,\n refundedAmount: formatEther(escrow.amount),\n txHash,\n })\n );\n return;\n }\n\n console.log(\"\\n✅ Refund successful!\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`\\nRefunded: ${formatEther(escrow.amount)} ETH → ${wallet.address}`);\n console.log(`TX: ${txHash}\\n`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to refund: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl dispute - Dispute submitted work and freeze timeout (client action)\n\nimport { formatEther } from \"viem\";\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { getTask } from \"../lib/tasks.js\";\nimport { getEscrowDetails, getDisputeFee, disputeEscrow, EscrowStatus } from \"../lib/escrow.js\";\nimport { signAction } from \"../lib/auth.js\";\nimport { APIS } from \"../lib/constants.js\";\n\ninterface DisputeOptions {\n task: string;\n json?: boolean;\n}\n\nexport async function dispute(options: DisputeOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nDisputing submitted work...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n try {\n const task = await getTask(options.task);\n\n if (task.status !== \"submitted\") {\n throw new Error(`Task is ${task.status}, cannot dispute (must be submitted)`);\n }\n\n if (task.clientAddress.toLowerCase() !== wallet.address.toLowerCase()) {\n throw new Error(\"Only the client who created this task can dispute it\");\n }\n\n const escrow = await getEscrowDetails(task.id);\n if (!escrow) {\n throw new Error(\"No escrow found for this task\");\n }\n if (escrow.status !== EscrowStatus.Submitted) {\n throw new Error(\"Escrow is not in submitted state\");\n }\n\n const feeWei = await getDisputeFee(task.id);\n const feeEth = formatEther(feeWei);\n\n if (!options.json) {\n console.log(`\\nTask ID: ${task.id}`);\n console.log(`Escrow: ${formatEther(escrow.amount)} ETH`);\n console.log(`Dispute fee: ${feeEth} ETH (10% of escrow)`);\n console.log(\"\\nOpening dispute...\");\n }\n\n const txHash = await disputeEscrow(wallet, task.id, feeWei);\n\n // Sign and notify worker\n const { signature, timestamp, nonce } = await signAction(wallet, \"dispute\", task.id);\n\n await fetch(`${APIS.MANDATE}/api/tasks/${task.id}/dispute`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ txHash, signature, timestamp, nonce }),\n });\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n taskId: task.id,\n disputeFee: feeEth,\n txHash,\n })\n );\n return;\n }\n\n console.log(\"\\nDispute opened! Timeout is now frozen.\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`\\nFee paid: ${feeEth} ETH`);\n console.log(`TX: ${txHash}`);\n console.log(\"\\nAn admin will review and resolve the dispute.\");\n console.log(\"If you win, you get your escrow + fee back.\\n\");\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to dispute: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl resolve - Admin resolves a disputed task\n\nimport { formatEther } from \"viem\";\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { getTask } from \"../lib/tasks.js\";\nimport { getEscrowDetails, resolveEscrowDispute, EscrowStatus } from \"../lib/escrow.js\";\nimport { signAction } from \"../lib/auth.js\";\nimport { APIS } from \"../lib/constants.js\";\n\ninterface ResolveOptions {\n task: string;\n winner: string;\n json?: boolean;\n}\n\nexport async function resolve(options: ResolveOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (![\"client\", \"agent\"].includes(options.winner)) {\n console.error('❌ --winner must be \"client\" or \"agent\"');\n process.exit(1);\n }\n\n const clientWins = options.winner === \"client\";\n\n if (!options.json) {\n console.log(\"\\nResolving dispute...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n try {\n const task = await getTask(options.task);\n\n if (task.status !== \"disputed\") {\n throw new Error(`Task is ${task.status}, cannot resolve (must be disputed)`);\n }\n\n const escrow = await getEscrowDetails(task.id);\n if (!escrow) {\n throw new Error(\"No escrow found for this task\");\n }\n if (escrow.status !== EscrowStatus.Disputed) {\n throw new Error(\"Escrow is not in disputed state\");\n }\n\n if (!options.json) {\n console.log(`\\nTask ID: ${task.id}`);\n console.log(`Escrow: ${formatEther(escrow.amount)} ETH`);\n console.log(`Dispute fee: ${formatEther(escrow.disputeFee)} ETH`);\n console.log(`Resolution: ${clientWins ? \"CLIENT WINS (refund)\" : \"AGENT WINS (buyback)\"}`);\n console.log(\"\\nCalling resolveDispute on-chain...\");\n }\n\n const txHash = await resolveEscrowDispute(wallet, task.id, clientWins);\n\n // Sign and notify worker\n const { signature, timestamp, nonce } = await signAction(wallet, \"resolve\", task.id);\n\n await fetch(`${APIS.MANDATE}/api/tasks/${task.id}/resolve`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n resolution: options.winner,\n txHash,\n signature,\n timestamp,\n nonce,\n }),\n });\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n taskId: task.id,\n resolution: options.winner,\n txHash,\n })\n );\n return;\n }\n\n console.log(\"\\nDispute resolved!\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`\\nWinner: ${options.winner}`);\n console.log(`TX: ${txHash}`);\n if (clientWins) {\n console.log(\"\\nClient gets escrow + dispute fee refunded.\");\n } else {\n console.log(\"\\nAgent gets dispute fee. Escrow released via buyback-and-burn.\");\n }\n console.log();\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\n❌ Failed to resolve: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl revise - Request revision on submitted work (client action)\n\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { requestRevision, getTask } from \"../lib/tasks.js\";\n\ninterface ReviseOptions {\n task: string;\n reason: string;\n json?: boolean;\n}\n\nexport async function revise(options: ReviseOptions): Promise<void> {\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nRequesting revision...\");\n console.log(\"──────────────────────────────────────────────\");\n }\n\n try {\n const taskBefore = await getTask(options.task);\n\n if (taskBefore.status !== \"submitted\") {\n throw new Error(`Task is ${taskBefore.status}, can only request revision on submitted work`);\n }\n\n const task = await requestRevision(wallet, options.task, options.reason);\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n task: {\n id: task.id,\n agentId: task.agentId,\n status: task.status,\n revisionCount: task.revisionCount,\n },\n }),\n );\n return;\n }\n\n console.log(\"\\nRevision requested!\");\n console.log(\"──────────────────────────────────────────────\");\n console.log(`\\nTask ID: ${task.id}`);\n console.log(`Status: ${task.status}`);\n console.log(`Revisions: ${task.revisionCount || 1}`);\n console.log(`\\nYour feedback:\\n${options.reason}\\n`);\n console.log(\"──────────────────────────────────────────────\");\n console.log(\"\\nThe agent will revise and resubmit their work.\");\n console.log(\"You can also send messages with:\");\n console.log(` mltl message --task ${task.id} --content \"additional details\"\\n`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\nFailed to request revision: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl message - Send or read messages on a task\n\nimport { loadOrCreateWallet } from \"../lib/wallet.js\";\nimport { sendMessage, getTask } from \"../lib/tasks.js\";\n\ninterface MessageOptions {\n task: string;\n content?: string;\n json?: boolean;\n}\n\nfunction formatTimestamp(ts: number): string {\n return new Date(ts).toLocaleString();\n}\n\nexport async function message(options: MessageOptions): Promise<void> {\n // Read mode: no content provided — display messages\n if (!options.content) {\n try {\n const task = await getTask(options.task);\n\n if (options.json) {\n console.log(JSON.stringify({\n taskId: task.id,\n status: task.status,\n messages: task.messages || [],\n messageCount: task.messages?.length || 0,\n }));\n return;\n }\n\n console.log(`\\nMessages for task ${task.id} (${task.status})\\n`);\n\n if (!task.messages || task.messages.length === 0) {\n console.log(\"No messages yet.\\n\");\n console.log(`Send one: mltl message --task ${task.id} --content \"...\"\\n`);\n return;\n }\n\n console.log(\"───────────────────────────────────────────────\\n\");\n for (const msg of task.messages) {\n const roleTag = msg.role === \"client\" ? \"[CLIENT]\" : \"[AGENT]\";\n console.log(`${roleTag} ${formatTimestamp(msg.timestamp)}`);\n console.log(`${msg.content}\\n`);\n }\n\n console.log(`${task.messages.length} message(s)\\n`);\n return;\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n console.error(`\\nFailed to fetch messages: ${errorMsg}`);\n process.exit(1);\n }\n }\n\n // Send mode\n const { wallet } = await loadOrCreateWallet();\n\n if (!options.json) {\n console.log(\"\\nSending message...\");\n }\n\n try {\n const task = await sendMessage(wallet, options.task, options.content);\n\n const lastMsg = task.messages?.[task.messages.length - 1];\n\n if (options.json) {\n console.log(\n JSON.stringify({\n success: true,\n taskId: task.id,\n messageCount: task.messages?.length || 0,\n role: lastMsg?.role,\n }),\n );\n return;\n }\n\n console.log(`\\nMessage sent (as ${lastMsg?.role || \"unknown\"})!`);\n console.log(`Task ${task.id} — ${task.messages?.length || 0} message(s)\\n`);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\nFailed to send message: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// mltl view - View full task details and message thread\n\nimport { formatEther } from \"viem\";\nimport { getTask, Task } from \"../lib/tasks.js\";\n\ninterface ViewOptions {\n task: string;\n json?: boolean;\n}\n\nfunction formatTimestamp(ts: number): string {\n return new Date(ts).toLocaleString();\n}\n\nfunction suggestedAction(task: Task): string | null {\n switch (task.status) {\n case \"requested\":\n return `Quote: mltl quote --task ${task.id} --price <eth>\\nDecline: mltl decline --task ${task.id}`;\n case \"quoted\":\n return `Message: mltl message --task ${task.id} --content \"...\"`;\n case \"accepted\":\n case \"revision\":\n return `Submit: mltl submit --task ${task.id} --result \"...\"`;\n case \"submitted\":\n return `Message: mltl message --task ${task.id} --content \"...\"`;\n default:\n return null;\n }\n}\n\nexport async function view(options: ViewOptions): Promise<void> {\n try {\n const task = await getTask(options.task);\n\n if (options.json) {\n console.log(JSON.stringify({ task }));\n return;\n }\n\n const priceEth = task.quotedPriceWei ? formatEther(BigInt(task.quotedPriceWei)) : null;\n\n // Header\n console.log(\"\\n═══════════════════════════════════════════════\");\n console.log(` Task ${task.id}`);\n console.log(\"═══════════════════════════════════════════════\\n\");\n console.log(`Status: ${task.status.toUpperCase()}`);\n console.log(`Client: ${task.clientAddress}`);\n if (priceEth) console.log(`Price: ${priceEth} ETH`);\n console.log(`Created: ${formatTimestamp(task.createdAt)}`);\n if (task.acceptedAt) console.log(`Accepted: ${formatTimestamp(task.acceptedAt)}`);\n if (task.submittedAt) console.log(`Submitted: ${formatTimestamp(task.submittedAt)}`);\n if (task.completedAt) console.log(`Completed: ${formatTimestamp(task.completedAt)}`);\n if (task.revisionCount) console.log(`Revisions: ${task.revisionCount}`);\n\n // Description\n console.log(\"\\n───────────────────────────────────────────────\");\n console.log(\" Description\");\n console.log(\"───────────────────────────────────────────────\\n\");\n console.log(task.task);\n\n // Quote message\n if (task.quotedMessage) {\n console.log(\"\\n───────────────────────────────────────────────\");\n console.log(\" Agent Quote Message\");\n console.log(\"───────────────────────────────────────────────\\n\");\n console.log(task.quotedMessage);\n }\n\n // Result\n if (task.result) {\n console.log(\"\\n───────────────────────────────────────────────\");\n console.log(\" Submitted Result\");\n console.log(\"───────────────────────────────────────────────\\n\");\n console.log(task.result);\n }\n\n // Files\n if (task.files && task.files.length > 0) {\n console.log(\"\\n───────────────────────────────────────────────\");\n console.log(` Files (${task.files.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n for (const file of task.files) {\n const sizeKb = (file.size / 1024).toFixed(1);\n console.log(` ${file.name} (${sizeKb} KB)`);\n }\n }\n\n // Messages\n if (task.messages && task.messages.length > 0) {\n console.log(\"\\n───────────────────────────────────────────────\");\n console.log(` Messages (${task.messages.length})`);\n console.log(\"───────────────────────────────────────────────\\n\");\n for (const msg of task.messages) {\n const roleTag = msg.role === \"client\" ? \"[CLIENT]\" : \"[AGENT]\";\n const time = formatTimestamp(msg.timestamp);\n console.log(`${roleTag} ${time}`);\n console.log(`${msg.content}\\n`);\n }\n }\n\n // Suggested action\n const action = suggestedAction(task);\n if (action) {\n console.log(\"───────────────────────────────────────────────\");\n console.log(\" Next Action\");\n console.log(\"───────────────────────────────────────────────\\n\");\n console.log(action);\n }\n\n console.log(\"\");\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\nFailed to fetch task: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// CLI: mltl profile — Manage agent profile\n\nimport { loadWallet } from \"../lib/wallet.js\";\nimport { signAction } from \"../lib/auth.js\";\nimport { updateProfile, getProfile } from \"../lib/tasks.js\";\n\ninterface ProfileOptions {\n agent: string;\n tagline?: string;\n description?: string;\n website?: string;\n twitter?: string;\n github?: string;\n responseTime?: string;\n json?: boolean;\n}\n\nexport async function profile(options: ProfileOptions): Promise<void> {\n const { agent: agentId } = options;\n\n // If no update flags, just show current profile\n const hasUpdates = options.tagline || options.description || options.website ||\n options.twitter || options.github || options.responseTime;\n\n if (!hasUpdates) {\n const current = await getProfile(agentId);\n if (options.json) {\n console.log(JSON.stringify(current, null, 2));\n } else {\n console.log(`\\n Profile for agent ${agentId}\\n`);\n console.log(` Tagline: ${current?.tagline || '(not set)'}`);\n console.log(` Description: ${current?.longDescription ? current.longDescription.slice(0, 80) + '...' : '(not set)'}`);\n console.log(` Website: ${current?.website || '(not set)'}`);\n console.log(` Twitter: ${current?.twitter || '(not set)'}`);\n console.log(` GitHub: ${current?.github || '(not set)'}`);\n console.log(` Response Time: ${current?.responseTime || '(not set)'}`);\n console.log();\n }\n return;\n }\n\n const wallet = await loadWallet();\n const { signature, timestamp, nonce } = await signAction(wallet, \"profile\", agentId);\n\n const updates: Record<string, string | undefined> = {};\n if (options.tagline) updates.tagline = options.tagline;\n if (options.description) updates.longDescription = options.description;\n if (options.website) updates.website = options.website;\n if (options.twitter) updates.twitter = options.twitter;\n if (options.github) updates.github = options.github;\n if (options.responseTime) updates.responseTime = options.responseTime;\n\n const result = await updateProfile(agentId, updates, signature, timestamp, nonce);\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(`\\n Profile updated for agent ${agentId}`);\n if (result.tagline) console.log(` Tagline: ${result.tagline}`);\n console.log();\n }\n}\n","// mltl reviews - View verified reviews for an agent\n\nimport { APIS } from \"../lib/constants.js\";\n\ninterface ReviewsOptions {\n agent: string;\n json?: boolean;\n}\n\ninterface Review {\n taskId: string;\n score: number | null;\n comment: string | null;\n reviewer: string;\n ratedAt: number;\n ratedTxHash: string;\n}\n\ninterface ReviewsResponse {\n reviews: Review[];\n total: number;\n avgScore: number | null;\n reviewCount: number;\n}\n\nfunction formatTimestamp(ts: number): string {\n return new Date(ts).toLocaleString();\n}\n\nexport async function reviews(options: ReviewsOptions): Promise<void> {\n try {\n const res = await fetch(`${APIS.MANDATE}/api/agents/${encodeURIComponent(options.agent)}/reviews`);\n if (!res.ok) {\n const err = (await res.json()) as { error: string };\n throw new Error(err.error || `HTTP ${res.status}`);\n }\n\n const data = (await res.json()) as ReviewsResponse;\n\n if (options.json) {\n console.log(JSON.stringify(data));\n return;\n }\n\n console.log(\"\\n═══════════════════════════════════════════════\");\n console.log(` Reviews for Agent #${options.agent}`);\n console.log(\"═══════════════════════════════════════════════\\n\");\n\n if (data.avgScore !== null) {\n console.log(`Score: ${data.avgScore}/100 (${data.reviewCount} verified review${data.reviewCount !== 1 ? \"s\" : \"\"})\\n`);\n }\n\n if (data.reviews.length === 0) {\n console.log(\"No reviews yet.\\n\");\n return;\n }\n\n console.log(\"───────────────────────────────────────────────\\n\");\n for (const review of data.reviews) {\n const scoreStr = review.score !== null ? `${review.score}/100` : \"No score\";\n console.log(`${scoreStr} ${formatTimestamp(review.ratedAt)}`);\n console.log(`Task: ${review.taskId}`);\n console.log(`Reviewer: ${review.reviewer}`);\n if (review.comment) console.log(`Comment: ${review.comment}`);\n console.log(`TX: ${review.ratedTxHash}\\n`);\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n\n if (options.json) {\n console.log(JSON.stringify({ error: errorMsg }));\n process.exit(1);\n }\n\n console.error(`\\nFailed to fetch reviews: ${errorMsg}`);\n process.exit(1);\n }\n}\n","// CLI: mltl gig — Manage agent gig offerings\n\nimport { loadWallet } from \"../lib/wallet.js\";\nimport { signAction } from \"../lib/auth.js\";\nimport {\n createGigRequest,\n updateGigRequest,\n listGigs,\n removeGigRequest,\n} from \"../lib/tasks.js\";\nimport { parseEther } from \"viem\";\n\ninterface GigCreateOptions {\n agent: string;\n title: string;\n description: string;\n price: string;\n delivery: string;\n category?: string;\n json?: boolean;\n}\n\ninterface GigListOptions {\n agent: string;\n json?: boolean;\n}\n\ninterface GigRemoveOptions {\n agent: string;\n gig: string;\n json?: boolean;\n}\n\nexport async function gigCreate(options: GigCreateOptions): Promise<void> {\n const wallet = await loadWallet();\n const { signature, timestamp, nonce } = await signAction(wallet, \"gig\", options.agent);\n\n const priceWei = parseEther(options.price).toString();\n const category = options.category || \"general\";\n\n const gig = await createGigRequest(\n options.agent,\n {\n title: options.title,\n description: options.description,\n priceWei,\n deliveryTime: options.delivery,\n category,\n },\n signature,\n timestamp,\n nonce,\n );\n\n if (options.json) {\n console.log(JSON.stringify(gig, null, 2));\n } else {\n console.log(`\\n Gig created: ${gig.title}`);\n console.log(` ID: ${gig.id}`);\n console.log(` Price: ${options.price} ETH`);\n console.log(` Delivery: ${gig.deliveryTime}`);\n console.log();\n }\n}\n\nexport async function gigList(options: GigListOptions): Promise<void> {\n const gigs = await listGigs(options.agent);\n\n if (options.json) {\n console.log(JSON.stringify(gigs, null, 2));\n return;\n }\n\n if (gigs.length === 0) {\n console.log(`\\n No gigs found for agent ${options.agent}\\n`);\n return;\n }\n\n console.log(`\\n Gigs for agent ${options.agent}:\\n`);\n for (const gig of gigs) {\n const eth = (Number(gig.priceWei) / 1e18).toFixed(4);\n console.log(` ${gig.title}`);\n console.log(` ID: ${gig.id} | ${eth} ETH | ${gig.deliveryTime} | ${gig.category}`);\n console.log();\n }\n}\n\ninterface GigUpdateOptions {\n agent: string;\n gig: string;\n title?: string;\n description?: string;\n price?: string;\n delivery?: string;\n category?: string;\n json?: boolean;\n}\n\nexport async function gigUpdate(options: GigUpdateOptions): Promise<void> {\n const wallet = await loadWallet();\n const { signature, timestamp, nonce } = await signAction(wallet, \"gig\", options.agent);\n\n const updates: Record<string, string> = {};\n if (options.title) updates.title = options.title;\n if (options.description) updates.description = options.description;\n if (options.price) updates.priceWei = parseEther(options.price).toString();\n if (options.delivery) updates.deliveryTime = options.delivery;\n if (options.category) updates.category = options.category;\n\n if (Object.keys(updates).length === 0) {\n console.error(\"\\n Nothing to update. Use --title, --description, --price, --delivery, or --category.\\n\");\n process.exit(1);\n }\n\n const gig = await updateGigRequest(options.agent, options.gig, updates, signature, timestamp, nonce);\n\n if (options.json) {\n console.log(JSON.stringify(gig, null, 2));\n } else {\n const eth = (Number(gig.priceWei) / 1e18).toFixed(4);\n console.log(`\\n Gig updated: ${gig.title}`);\n console.log(` ID: ${gig.id}`);\n console.log(` Price: ${eth} ETH`);\n console.log(` Delivery: ${gig.deliveryTime}`);\n console.log(` Category: ${gig.category}`);\n console.log();\n }\n}\n\nexport async function gigRemove(options: GigRemoveOptions): Promise<void> {\n const wallet = await loadWallet();\n const { signature, timestamp, nonce } = await signAction(wallet, \"gig\", options.agent);\n\n await removeGigRequest(options.agent, options.gig, signature, timestamp, nonce);\n\n if (options.json) {\n console.log(JSON.stringify({ success: true, gigId: options.gig }));\n } else {\n console.log(`\\n Gig ${options.gig} removed.\\n`);\n }\n}\n"],"mappings":"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","names":["wallet","createPublicClient","createWalletClient","http","base","privateKeyToAccount","createPublicClient","base","http","wallet","privateKeyToAccount","createWalletClient","readFile","resolve","readFile","privateKeyToAccount","wallet","message","wallet","wallet","message","wallet","wallet","formatEther","formatEther","wallet","wallet","rep","formatEther","wallet","formatEther","tasks","formatEther","parseEther","createPublicClient","createWalletClient","http","keccak256","toBytes","privateKeyToAccount","base","keccak256","toBytes","getPublicClient","createPublicClient","base","http","getWalletClient","wallet","privateKeyToAccount","createWalletClient","wallet","getWalletClient","getPublicClient","fetchAgent","wallet","formatEther","parseEther","wallet","formatEther","API_BASE","wallet","stat","wallet","formatEther","formatEther","fetchAgent","wallet","formatEther","formatEther","formatTimestamp","wallet","formatEther","formatTimestamp","parseEther","formatEther","wallet","parseEther","formatEther","formatEther","wallet","formatEther","formatEther","wallet","formatEther","formatEther","wallet","formatEther","formatEther","wallet","formatEther","wallet","formatTimestamp","wallet","formatEther","formatTimestamp","formatEther","wallet","formatTimestamp","parseEther","wallet"]}