{"version":3,"file":"clawnch-fees.mjs","names":[],"sources":["../../../src/tools/clawnch-fees.ts"],"sourcesContent":["/**\n * Clawnch Fees Tool — check and claim LP trading fees\n * \n * Clawnch-launched tokens earn 1% LP fees on every swap.\n * 80% goes to the deployer, 20% to the platform.\n */\n\nimport { Type } from '@sinclair/typebox';\nimport { stringEnum, jsonResult, errorResult, readStringParam } from '../lib/tool-helpers.js';\nimport {\n  getWalletState,\n  requireWalletClient,\n  requirePublicClient,\n} from '../services/walletconnect-service.js';\nimport { validateClaim } from '../services/safety-service.js';\n\nconst CLAWNCH_API_URL = process.env.CLAWNCHER_API_URL || 'https://clawn.ch';\nconst ACTIONS = ['check', 'claim', 'claim_all'] as const;\n\nconst ClawnchFeesSchema = Type.Object({\n  action: stringEnum(ACTIONS, {\n    description: 'check: see unclaimed fees. claim: claim fees for a specific token. claim_all: claim all available fees.',\n  }),\n  token: Type.Optional(Type.String({\n    description: 'Token contract address (required for \"claim\" action)',\n  })),\n});\n\nexport function createClawnchFeesTool() {\n  return {\n    name: 'clawnch_fees',\n    label: 'Clawnch Fees',\n    ownerOnly: true,\n    description:\n      'Check and claim trading fee revenue from Clawnch-launched tokens. ' +\n      'Every swap pays 1% LP fees — 80% goes to you as the deployer. ' +\n      'Fees accumulate in WETH and can be claimed anytime.',\n    parameters: ClawnchFeesSchema,\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      const state = getWalletState();\n      if (!state.connected) {\n        return errorResult('No wallet connected. Use clawnchconnect tool to connect first.');\n      }\n\n      switch (action) {\n        case 'check':\n          return handleCheck(state.address!);\n        case 'claim':\n          return handleClaim(params, state.address!);\n        case 'claim_all':\n          return handleClaimAll(state.address!);\n        default:\n          return errorResult(`Unknown action: ${action}`);\n      }\n    },\n  };\n}\n\nasync function handleCheck(address: string) {\n  try {\n    const { ClawnchClient } = await import('@clawnch/clawncher-sdk');\n    const client = new ClawnchClient({\n      baseUrl: CLAWNCH_API_URL,\n    });\n\n    const fees = await client.getAvailableFees(address);\n\n    return jsonResult({\n      address,\n      ...fees,\n      note: fees.tokens?.length\n        ? 'Use action \"claim\" with a token address to claim fees, or \"claim_all\" to claim everything.'\n        : 'No unclaimed fees found. Deploy tokens to start earning.',\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>, address: string) {\n  const token = readStringParam(params, 'token', { required: true })!;\n\n  // Pre-flight: check gas balance\n  try {\n    const safety = await validateClaim();\n    if (!safety.safe) {\n      return errorResult(\n        `Claim blocked:\\n` + safety.blockers.map(b => `  ✗ ${b}`).join('\\n')\n      );\n    }\n  } catch {\n    // Don't block on safety infra failure\n  }\n\n  try {\n    const { ClawncherClaimer } = await import('@clawnch/clawncher-sdk');\n    const wallet = requireWalletClient();\n    const publicClient = requirePublicClient();\n\n    const claimer = new ClawncherClaimer({\n      wallet,\n      publicClient,\n      network: (process.env.CLAWNCHER_NETWORK as 'mainnet' | 'sepolia') || 'mainnet',\n    });\n\n    const result = await claimer.claimAll(\n      token as `0x${string}`,\n      address as `0x${string}`,\n    );\n\n    return jsonResult({\n      status: 'success',\n      token,\n      collectTx: result.collectRewards?.txHash,\n      claimWethTx: result.claimFeesWeth?.txHash,\n      claimTokenTx: result.claimFeesToken?.txHash,\n    });\n  } catch (err) {\n    return errorResult(`Fee claim failed: ${err instanceof Error ? err.message : String(err)}`);\n  }\n}\n\nasync function handleClaimAll(address: string) {\n  try {\n    // First check what's available\n    const { ClawnchClient, ClawncherClaimer } = await import('@clawnch/clawncher-sdk');\n    const client = new ClawnchClient({\n      baseUrl: CLAWNCH_API_URL,\n    });\n\n    const fees = await client.getAvailableFees(address);\n    const claimableTokens = fees.tokens?.filter((t: any) =>\n      parseFloat(t.wethFees || '0') > 0 || parseFloat(t.tokenFees || '0') > 0,\n    ) ?? [];\n\n    if (claimableTokens.length === 0) {\n      return jsonResult({\n        status: 'nothing_to_claim',\n        address,\n        message: 'No unclaimed fees found.',\n      });\n    }\n\n    const wallet = requireWalletClient();\n    const publicClient = requirePublicClient();\n    const claimer = new ClawncherClaimer({\n      wallet,\n      publicClient,\n      network: (process.env.CLAWNCHER_NETWORK as 'mainnet' | 'sepolia') || 'mainnet',\n    });\n\n    const tokens = claimableTokens.map((t: any) => t.address as `0x${string}`);\n    const batchResult = await claimer.claimBatch(tokens, address as `0x${string}`);\n\n    const results = batchResult.results.map((r: any) => ({\n      token: r.token,\n      status: r.success ? 'claimed' : 'failed',\n      collectTx: r.collectRewards?.txHash,\n      claimWethTx: r.claimFeesWeth?.txHash,\n      claimTokenTx: r.claimFeesToken?.txHash,\n      error: r.error?.message,\n    }));\n\n    return jsonResult({\n      status: 'complete',\n      tokensProcessed: batchResult.results.length,\n      successCount: batchResult.successCount,\n      failureCount: batchResult.failureCount,\n      results,\n    });\n  } catch (err) {\n    return errorResult(`Claim all failed: ${err instanceof Error ? err.message : String(err)}`);\n  }\n}\n"],"mappings":"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"}