{"version":3,"file":"bankr-launch.mjs","names":[],"sources":["../../../src/tools/bankr-launch.ts"],"sourcesContent":["/**\n * Bankr Launch Tool — deploy tokens on Base and Solana via Bankr Agent API.\n *\n * Uses POST /token-launches/deploy for deploy/simulate (direct REST),\n * and prompt API for fee checking and claiming.\n *\n * Separate from clawnch_launch because: different API, different chains\n * (Base + Solana vs Base-only), different fee structure (57/36/5 vs 80/20).\n *\n * Rate limits: 50 deploys/day (100 with Bankr Club).\n */\n\nimport { Type } from '@sinclair/typebox';\nimport { stringEnum, jsonResult, errorResult, readStringParam } from '../lib/tool-helpers.js';\nimport { hasBankrApi } from '../services/bankr-api.js';\n\nconst ACTIONS = ['deploy', 'simulate', 'fees', 'claim'] as const;\nconst CHAINS = ['base', 'solana'] as const;\n\nconst BankrLaunchSchema = Type.Object({\n  action: stringEnum(ACTIONS, {\n    description:\n      'deploy: launch a token on-chain. simulate: dry run (no broadcast). ' +\n      'fees: check earned fees for your tokens. claim: claim earned fees.',\n  }),\n  name: Type.Optional(Type.String({\n    description: 'Token name (1-100 chars). Required for deploy/simulate.',\n  })),\n  symbol: Type.Optional(Type.String({\n    description: 'Token ticker symbol (1-10 chars). Defaults to first 4 chars of name.',\n  })),\n  description: Type.Optional(Type.String({\n    description: 'Token description (max 500 chars).',\n  })),\n  image: Type.Optional(Type.String({\n    description: 'Logo image URL (uploaded to IPFS by Bankr).',\n  })),\n  chain: Type.Optional(stringEnum(CHAINS, {\n    description: 'Chain to deploy on (default: base). Solana uses Raydium LaunchLab.',\n  })),\n  fee_recipient: Type.Optional(Type.String({\n    description: 'Fee recipient — address, ENS name, X handle, or Farcaster handle.',\n  })),\n  tweet_url: Type.Optional(Type.String({\n    description: 'Promotion tweet URL.',\n  })),\n  website_url: Type.Optional(Type.String({\n    description: 'Token website URL.',\n  })),\n});\n\nexport function createBankrLaunchTool() {\n  return {\n    name: 'bankr_launch',\n    label: 'Bankr Launch',\n    ownerOnly: true,\n    description:\n      'Deploy tokens on Base (Uniswap V4) or Solana (Raydium LaunchLab) via Bankr. ' +\n      'Fee split: 57% creator / 36.1% Bankr / 5% protocol on Base. ' +\n      '0.5% bonding curve fee on Solana. Gas is sponsored. ' +\n      'Rate limit: 50 deploys/day (100 with Bankr Club). ' +\n      'Use \"simulate\" for a dry run without broadcasting.',\n    parameters: BankrLaunchSchema,\n    execute: async (_toolCallId: string, args: unknown) => {\n      const params = args as Record<string, unknown>;\n      const action = readStringParam(params, 'action', { required: true })!;\n\n      if (!hasBankrApi()) {\n        return errorResult(\n          'Bankr API key not configured. Connect via /connect_bankr first, ' +\n          'or set BANKR_API_KEY env var.'\n        );\n      }\n\n      switch (action) {\n        case 'deploy':\n        case 'simulate':\n          return handleDeploy(params, action === 'simulate');\n        case 'fees':\n          return handleFees(params);\n        case 'claim':\n          return handleClaim(params);\n        default:\n          return errorResult(`Unknown action: ${action}`);\n      }\n    },\n  };\n}\n\nasync function handleDeploy(params: Record<string, unknown>, simulateOnly: boolean) {\n  const name = readStringParam(params, 'name');\n  if (!name) {\n    return errorResult('Token name is required for deploy/simulate.');\n  }\n  if (name.length > 100) {\n    return errorResult('Token name must be 100 characters or less.');\n  }\n\n  const symbol = readStringParam(params, 'symbol');\n  const description = readStringParam(params, 'description');\n  const image = readStringParam(params, 'image');\n  const chain = (readStringParam(params, 'chain') || 'base') as 'base' | 'solana';\n  const feeRecipient = readStringParam(params, 'fee_recipient');\n  const tweetUrl = readStringParam(params, 'tweet_url');\n  const websiteUrl = readStringParam(params, 'website_url');\n\n  if (description && description.length > 500) {\n    return errorResult('Description must be 500 characters or less.');\n  }\n  if (symbol && symbol.length > 10) {\n    return errorResult('Symbol must be 10 characters or less.');\n  }\n\n  try {\n    const { bankrDeployToken } = await import('../services/bankr-api.js');\n\n    const result = await bankrDeployToken({\n      name,\n      symbol: symbol || undefined,\n      description: description || undefined,\n      imageUrl: image || undefined,\n      chain,\n      feeRecipient: feeRecipient || undefined,\n      tweetUrl: tweetUrl || undefined,\n      websiteUrl: websiteUrl || undefined,\n      simulateOnly,\n    });\n\n    if (simulateOnly) {\n      return jsonResult({\n        status: 'simulated',\n        chain,\n        tokenAddress: result.tokenAddress,\n        feeDistribution: result.feeDistribution,\n        note: 'Dry run — no transaction was broadcast. Use action \"deploy\" to launch for real.',\n      });\n    }\n\n    return jsonResult({\n      status: 'deployed',\n      chain,\n      tokenAddress: result.tokenAddress,\n      poolId: result.poolId,\n      txHash: result.txHash,\n      feeDistribution: result.feeDistribution,\n      note: !feeRecipient\n        ? 'Fees default to your Bankr wallet. Set fee_recipient to redirect.'\n        : undefined,\n    });\n  } catch (err) {\n    return errorResult(`Token deploy failed: ${err instanceof Error ? err.message : String(err)}`);\n  }\n}\n\nasync function handleFees(params: Record<string, unknown>) {\n  try {\n    const { bankrPromptAndPoll } = await import('../services/bankr-api.js');\n    const name = readStringParam(params, 'name');\n\n    const prompt = name\n      ? `check fees for ${name}`\n      : 'how much fees have I earned?';\n\n    const result = await bankrPromptAndPoll(prompt, { timeoutMs: 30_000 });\n\n    if (result.status === 'failed') {\n      return errorResult(`Fee check failed: ${result.error ?? 'Unknown error'}`);\n    }\n\n    return jsonResult({\n      status: 'success',\n      response: result.response,\n      richData: result.richData,\n    });\n  } catch (err) {\n    return errorResult(`Fee check failed: ${err instanceof Error ? err.message : String(err)}`);\n  }\n}\n\nasync function handleClaim(params: Record<string, unknown>) {\n  try {\n    const { bankrPromptAndPoll } = await import('../services/bankr-api.js');\n    const name = readStringParam(params, 'name');\n\n    const prompt = name\n      ? `claim my fees for ${name}`\n      : 'claim all my earned fees';\n\n    const result = await bankrPromptAndPoll(prompt, { timeoutMs: 60_000 });\n\n    if (result.status === 'failed') {\n      return errorResult(`Fee claim failed: ${result.error ?? 'Unknown error'}`);\n    }\n\n    const txData = result.transactions?.find(t => t.type === 'claim');\n\n    return jsonResult({\n      status: 'success',\n      txHash: txData?.hash,\n      response: result.response,\n      richData: result.richData,\n    });\n  } catch (err) {\n    return errorResult(`Fee claim failed: ${err instanceof Error ? err.message : String(err)}`);\n  }\n}\n"],"mappings":"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"}