{"version":3,"file":"clawnch-launch.mjs","names":[],"sources":["../../../src/tools/clawnch-launch.ts"],"sourcesContent":["/**\n * Clawnch Launch Tool — deploy tokens via the Clawnch launchpad\n * \n * Uses the verified deploy API (two-step challenge) for safe, rate-limited launches.\n * Transaction approval goes through ClawnchConnect.\n */\n\nimport { Type } from '@sinclair/typebox';\nimport { jsonResult, errorResult, readStringParam, readNumberParam } from '../lib/tool-helpers.js';\nimport { requireWalletClient, requirePublicClient, getWalletState } from '../services/walletconnect-service.js';\nimport { validateLaunch } from '../services/safety-service.js';\nimport { getCredentialVault } from '../services/credential-vault.js';\n\nconst ClawnchLaunchSchema = Type.Object({\n  name: Type.String({\n    description: 'Token name (e.g. \"Lobster Coin\")',\n  }),\n  symbol: Type.String({\n    description: 'Token ticker symbol (e.g. \"LOBSTR\"). Max 10 characters.',\n  }),\n  description: Type.Optional(Type.String({\n    description: 'Token description',\n  })),\n  image: Type.Optional(Type.String({\n    description: 'Token logo — URL to an image or base64-encoded image data',\n  })),\n  vault_percentage: Type.Optional(Type.Number({\n    description: 'Percentage of supply to lock in vault (1-90%). Locked for 7+ days.',\n  })),\n  dev_buy_eth: Type.Optional(Type.String({\n    description: 'ETH amount for dev buy at launch (e.g. \"0.01\"). Tokens sent to your wallet.',\n  })),\n  bypass_rate_limit: Type.Optional(Type.Boolean({\n    description: 'Burn 10,000 $CLAWNCH to bypass the 1-launch-per-hour rate limit',\n  })),\n});\n\nexport function createClawnchLaunchTool() {\n  return {\n    name: 'clawnch_launch',\n    label: 'Clawnch Launch',\n    ownerOnly: true,\n    description:\n      'Deploy a new ERC-20 token on Base via the Clawnch launchpad. ' +\n      'Creates a Uniswap V4 pool with MEV protection and fee distribution. ' +\n      'Requires a connected wallet and Clawnch API key. ' +\n      'Rate limited to 1 launch per hour (bypass by burning 10K $CLAWNCH). ' +\n      '80% of trading fees go to you, 20% to the platform.',\n    parameters: ClawnchLaunchSchema,\n    execute: async (_toolCallId: string, args: unknown) => {\n      const params = args as Record<string, unknown>;\n\n      const state = getWalletState();\n      if (!state.connected) {\n        return errorResult('No wallet connected. Use clawnchconnect tool to connect first.');\n      }\n\n      const apiKey = getCredentialVault().getSecret('clawnch.launcherApiKey', 'clawnch-launch');\n      if (!apiKey) {\n        return errorResult(\n          'Clawnch API key required for token launches. Set CLAWNCHER_API_KEY env var. ' +\n          'Get one at https://clawn.ch/agents'\n        );\n      }\n\n      const name = readStringParam(params, 'name', { required: true })!;\n      const symbol = readStringParam(params, 'symbol', { required: true })!;\n      const description = readStringParam(params, 'description');\n      const image = readStringParam(params, 'image');\n      const vaultPercentageRaw = readNumberParam(params, 'vault_percentage');\n      const vaultPercentage = vaultPercentageRaw !== undefined\n        ? Math.max(1, Math.min(90, Math.round(vaultPercentageRaw)))\n        : undefined;\n      const devBuyEth = readStringParam(params, 'dev_buy_eth');\n      const bypassRateLimit = params.bypass_rate_limit === true;\n\n      // Validate\n      if (symbol.length > 10) {\n        return errorResult('Symbol must be 10 characters or less.');\n      }\n\n      // Pre-flight safety: check balance for gas + dev buy\n      try {\n        const safety = await validateLaunch({\n          devBuyEth: devBuyEth ? parseFloat(devBuyEth) : undefined,\n        });\n        if (!safety.safe) {\n          return errorResult(\n            `Launch blocked by safety checks:\\n` +\n            safety.blockers.map(b => `  ✗ ${b}`).join('\\n')\n          );\n        }\n      } catch (err) {\n        // Safety check infrastructure failure — log but don't block the launch.\n        console.warn('[clawnch-launch] Safety pre-flight failed, proceeding without validation:', err instanceof Error ? err.message : String(err));\n      }\n\n      try {\n        const { ClawnchApiDeployer } = await import('@clawnch/clawncher-sdk');\n        const wallet = requireWalletClient();\n        const publicClient = requirePublicClient();\n\n        const deployer = new ClawnchApiDeployer({\n          apiKey,\n          wallet,\n          publicClient,\n          apiBaseUrl: process.env.CLAWNCHER_API_URL || 'https://clawn.ch',\n        });\n\n        const deployOptions: any = {\n          name,\n          symbol,\n          description,\n          image,\n          bypassRateLimit,\n        };\n\n        if (vaultPercentage) {\n          deployOptions.vault = {\n            percentage: vaultPercentage,\n            lockupDuration: 7 * 24 * 60 * 60, // 7 days minimum\n            recipient: state.address,\n          };\n        }\n\n        if (devBuyEth) {\n          deployOptions.devBuy = {\n            ethAmount: devBuyEth,\n            recipient: state.address,\n          };\n        }\n\n        const result = await deployer.deploy(deployOptions);\n\n        return jsonResult({\n          status: 'success',\n          name,\n          symbol,\n          txHash: result.txHash,\n          tokenAddress: result.tokenAddress,\n          clawnchUrl: `https://clawn.ch/token/${result.tokenAddress}`,\n          clawnchBurned: result.clawnchBurned ? '10,000 $CLAWNCH' : undefined,\n          burnTxHash: result.burnTxHash,\n          note: 'Token deployed! Trading is live on Uniswap V4. ' +\n            'MEV protection active for first 30 seconds.',\n        });\n      } catch (err) {\n        return errorResult(`Launch failed: ${err instanceof Error ? err.message : String(err)}`);\n      }\n    },\n  };\n}\n"],"mappings":";;;;;;;;;;;AAaA,MAAM,sBAAsB,KAAK,OAAO;CACtC,MAAM,KAAK,OAAO,EAChB,aAAa,sCACd,CAAC;CACF,QAAQ,KAAK,OAAO,EAClB,aAAa,6DACd,CAAC;CACF,aAAa,KAAK,SAAS,KAAK,OAAO,EACrC,aAAa,qBACd,CAAC,CAAC;CACH,OAAO,KAAK,SAAS,KAAK,OAAO,EAC/B,aAAa,6DACd,CAAC,CAAC;CACH,kBAAkB,KAAK,SAAS,KAAK,OAAO,EAC1C,aAAa,sEACd,CAAC,CAAC;CACH,aAAa,KAAK,SAAS,KAAK,OAAO,EACrC,aAAa,iFACd,CAAC,CAAC;CACH,mBAAmB,KAAK,SAAS,KAAK,QAAQ,EAC5C,aAAa,mEACd,CAAC,CAAC;CACJ,CAAC;AAEF,SAAgB,0BAA0B;AACxC,QAAO;EACL,MAAM;EACN,OAAO;EACP,WAAW;EACX,aACE;EAKF,YAAY;EACZ,SAAS,OAAO,aAAqB,SAAkB;GACrD,MAAM,SAAS;GAEf,MAAM,QAAQ,gBAAgB;AAC9B,OAAI,CAAC,MAAM,UACT,QAAO,YAAY,iEAAiE;GAGtF,MAAM,SAAS,oBAAoB,CAAC,UAAU,0BAA0B,iBAAiB;AACzF,OAAI,CAAC,OACH,QAAO,YACL,iHAED;GAGH,MAAM,OAAO,gBAAgB,QAAQ,QAAQ,EAAE,UAAU,MAAM,CAAC;GAChE,MAAM,SAAS,gBAAgB,QAAQ,UAAU,EAAE,UAAU,MAAM,CAAC;GACpE,MAAM,cAAc,gBAAgB,QAAQ,cAAc;GAC1D,MAAM,QAAQ,gBAAgB,QAAQ,QAAQ;GAC9C,MAAM,qBAAqB,gBAAgB,QAAQ,mBAAmB;GACtE,MAAM,kBAAkB,uBAAuB,KAAA,IAC3C,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,MAAM,mBAAmB,CAAC,CAAC,GACzD,KAAA;GACJ,MAAM,YAAY,gBAAgB,QAAQ,cAAc;GACxD,MAAM,kBAAkB,OAAO,sBAAsB;AAGrD,OAAI,OAAO,SAAS,GAClB,QAAO,YAAY,wCAAwC;AAI7D,OAAI;IACF,MAAM,SAAS,MAAM,eAAe,EAClC,WAAW,YAAY,WAAW,UAAU,GAAG,KAAA,GAChD,CAAC;AACF,QAAI,CAAC,OAAO,KACV,QAAO,YACL,uCACA,OAAO,SAAS,KAAI,MAAK,OAAO,IAAI,CAAC,KAAK,KAAK,CAChD;YAEI,KAAK;AAEZ,YAAQ,KAAK,6EAA6E,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,CAAC;;AAG7I,OAAI;IACF,MAAM,EAAE,uBAAuB,MAAM,OAAO;IAI5C,MAAM,WAAW,IAAI,mBAAmB;KACtC;KACA,QALa,qBAAqB;KAMlC,cALmB,qBAAqB;KAMxC,YAAY,QAAQ,IAAI,qBAAqB;KAC9C,CAAC;IAEF,MAAM,gBAAqB;KACzB;KACA;KACA;KACA;KACA;KACD;AAED,QAAI,gBACF,eAAc,QAAQ;KACpB,YAAY;KACZ,gBAAgB,QAAc;KAC9B,WAAW,MAAM;KAClB;AAGH,QAAI,UACF,eAAc,SAAS;KACrB,WAAW;KACX,WAAW,MAAM;KAClB;IAGH,MAAM,SAAS,MAAM,SAAS,OAAO,cAAc;AAEnD,WAAO,WAAW;KAChB,QAAQ;KACR;KACA;KACA,QAAQ,OAAO;KACf,cAAc,OAAO;KACrB,YAAY,0BAA0B,OAAO;KAC7C,eAAe,OAAO,gBAAgB,oBAAoB,KAAA;KAC1D,YAAY,OAAO;KACnB,MAAM;KAEP,CAAC;YACK,KAAK;AACZ,WAAO,YAAY,kBAAkB,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAAG;;;EAG7F"}