@t402/mcp 1.0.0 → 2.4.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/server/t402Server.ts","../../src/tools/getBalance.ts","../../src/constants.ts","../../src/tools/getAllBalances.ts","../../src/tools/pay.ts","../../src/tools/payGasless.ts","../../src/tools/getBridgeFee.ts","../../src/tools/bridge.ts","../../src/tools/index.ts"],"sourcesContent":["/**\n * @t402/mcp - MCP Server for AI Agent Payments\n *\n * This package provides a Model Context Protocol (MCP) server that enables\n * AI agents to make stablecoin payments across multiple blockchain networks.\n *\n * @example\n * ```typescript\n * import { createT402McpServer, loadConfigFromEnv } from '@t402/mcp';\n *\n * const config = loadConfigFromEnv();\n * const server = createT402McpServer(config);\n * await server.run();\n * ```\n *\n * @example Claude Desktop Configuration\n * ```json\n * {\n * \"mcpServers\": {\n * \"t402\": {\n * \"command\": \"npx\",\n * \"args\": [\"@t402/mcp\"],\n * \"env\": {\n * \"T402_PRIVATE_KEY\": \"0x...\",\n * \"T402_DEMO_MODE\": \"true\"\n * }\n * }\n * }\n * }\n * ```\n */\n\n// Server\nexport {\n T402McpServer,\n createT402McpServer,\n loadConfigFromEnv,\n} from \"./server/index.js\";\n\n// Tools\nexport {\n // Tool definitions\n TOOL_DEFINITIONS,\n // Balance tools\n getBalanceInputSchema,\n executeGetBalance,\n formatBalanceResult,\n getAllBalancesInputSchema,\n executeGetAllBalances,\n formatAllBalancesResult,\n // Payment tools\n payInputSchema,\n executePay,\n formatPaymentResult,\n payGaslessInputSchema,\n executePayGasless,\n formatGaslessPaymentResult,\n GASLESS_SUPPORTED_NETWORKS,\n // Bridge tools\n getBridgeFeeInputSchema,\n executeGetBridgeFee,\n formatBridgeFeeResult,\n bridgeInputSchema,\n executeBridge,\n formatBridgeResult,\n // Types\n type GetBalanceInput,\n type GetAllBalancesInput,\n type AllBalancesResult,\n type PayInput,\n type PayOptions,\n type PayGaslessInput,\n type PayGaslessOptions,\n type GetBridgeFeeInput,\n type BridgeInput,\n type BridgeOptions,\n} from \"./tools/index.js\";\n\n// Types\nexport type {\n SupportedNetwork,\n TokenBalance,\n ChainBalance,\n PaymentParams,\n PaymentResult,\n GaslessPaymentResult,\n BridgeFeeQuote,\n BridgeResult,\n McpServerConfig,\n ToolContext,\n} from \"./types.js\";\n\n// Constants\nexport {\n CHAIN_IDS,\n NATIVE_SYMBOLS,\n EXPLORER_URLS,\n DEFAULT_RPC_URLS,\n USDC_ADDRESSES,\n USDT_ADDRESSES,\n USDT0_ADDRESSES,\n BRIDGEABLE_CHAINS,\n getExplorerTxUrl,\n getLayerZeroScanUrl,\n supportsToken,\n getTokenAddress,\n formatTokenAmount,\n parseTokenAmount,\n} from \"./constants.js\";\n","/**\n * t402 MCP Server - Main server implementation\n */\n\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type { McpServerConfig, SupportedNetwork } from \"../types.js\";\nimport {\n TOOL_DEFINITIONS,\n executeGetBalance,\n formatBalanceResult,\n getBalanceInputSchema,\n executeGetAllBalances,\n formatAllBalancesResult,\n getAllBalancesInputSchema,\n executePay,\n formatPaymentResult,\n payInputSchema,\n executePayGasless,\n formatGaslessPaymentResult,\n payGaslessInputSchema,\n executeGetBridgeFee,\n formatBridgeFeeResult,\n getBridgeFeeInputSchema,\n executeBridge,\n formatBridgeResult,\n bridgeInputSchema,\n} from \"../tools/index.js\";\n\n/**\n * t402 MCP Server\n *\n * Provides payment tools for AI agents via the Model Context Protocol.\n */\nexport class T402McpServer {\n private server: Server;\n private config: McpServerConfig;\n\n constructor(config: McpServerConfig = {}) {\n this.config = config;\n this.server = new Server(\n {\n name: \"t402\",\n version: \"1.0.0\",\n },\n {\n capabilities: {\n tools: {},\n },\n }\n );\n\n this.setupHandlers();\n }\n\n /**\n * Set up MCP request handlers\n */\n private setupHandlers(): void {\n // List available tools\n this.server.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: Object.values(TOOL_DEFINITIONS),\n };\n });\n\n // Handle tool calls\n this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n try {\n switch (name) {\n case \"t402/getBalance\":\n return await this.handleGetBalance(args);\n\n case \"t402/getAllBalances\":\n return await this.handleGetAllBalances(args);\n\n case \"t402/pay\":\n return await this.handlePay(args);\n\n case \"t402/payGasless\":\n return await this.handlePayGasless(args);\n\n case \"t402/getBridgeFee\":\n return await this.handleGetBridgeFee(args);\n\n case \"t402/bridge\":\n return await this.handleBridge(args);\n\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error: ${message}`,\n },\n ],\n isError: true,\n };\n }\n });\n }\n\n /**\n * Handle t402/getBalance\n */\n private async handleGetBalance(args: unknown) {\n const input = getBalanceInputSchema.parse(args);\n const result = await executeGetBalance(input, this.config.rpcUrls);\n return {\n content: [\n {\n type: \"text\" as const,\n text: formatBalanceResult(result),\n },\n ],\n };\n }\n\n /**\n * Handle t402/getAllBalances\n */\n private async handleGetAllBalances(args: unknown) {\n const input = getAllBalancesInputSchema.parse(args);\n const result = await executeGetAllBalances(input, this.config.rpcUrls);\n return {\n content: [\n {\n type: \"text\" as const,\n text: formatAllBalancesResult(result),\n },\n ],\n };\n }\n\n /**\n * Handle t402/pay\n */\n private async handlePay(args: unknown) {\n if (!this.config.privateKey && !this.config.demoMode) {\n throw new Error(\n \"Private key not configured. Set T402_PRIVATE_KEY environment variable or enable demo mode.\"\n );\n }\n\n const input = payInputSchema.parse(args);\n const result = await executePay(input, {\n privateKey: this.config.privateKey || \"0x\",\n rpcUrl: this.config.rpcUrls?.[input.network as SupportedNetwork],\n demoMode: this.config.demoMode,\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: formatPaymentResult(result),\n },\n ],\n };\n }\n\n /**\n * Handle t402/payGasless\n */\n private async handlePayGasless(args: unknown) {\n if (!this.config.privateKey && !this.config.demoMode) {\n throw new Error(\n \"Private key not configured. Set T402_PRIVATE_KEY environment variable or enable demo mode.\"\n );\n }\n\n if (!this.config.bundlerUrl && !this.config.demoMode) {\n throw new Error(\n \"Bundler URL not configured. Set T402_BUNDLER_URL environment variable or enable demo mode.\"\n );\n }\n\n if (!this.config.paymasterUrl && !this.config.demoMode) {\n throw new Error(\n \"Paymaster URL not configured. Set T402_PAYMASTER_URL environment variable or enable demo mode.\"\n );\n }\n\n const input = payGaslessInputSchema.parse(args);\n const result = await executePayGasless(input, {\n privateKey: this.config.privateKey || \"0x\",\n bundlerUrl: this.config.bundlerUrl || \"\",\n paymasterUrl: this.config.paymasterUrl || \"\",\n rpcUrl: this.config.rpcUrls?.[input.network as SupportedNetwork],\n demoMode: this.config.demoMode,\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: formatGaslessPaymentResult(result),\n },\n ],\n };\n }\n\n /**\n * Handle t402/getBridgeFee\n */\n private async handleGetBridgeFee(args: unknown) {\n const input = getBridgeFeeInputSchema.parse(args);\n const result = await executeGetBridgeFee(input, this.config.rpcUrls);\n return {\n content: [\n {\n type: \"text\" as const,\n text: formatBridgeFeeResult(result),\n },\n ],\n };\n }\n\n /**\n * Handle t402/bridge\n */\n private async handleBridge(args: unknown) {\n if (!this.config.privateKey && !this.config.demoMode) {\n throw new Error(\n \"Private key not configured. Set T402_PRIVATE_KEY environment variable or enable demo mode.\"\n );\n }\n\n const input = bridgeInputSchema.parse(args);\n const result = await executeBridge(input, {\n privateKey: this.config.privateKey || \"0x\",\n rpcUrl: this.config.rpcUrls?.[input.fromChain as SupportedNetwork],\n demoMode: this.config.demoMode,\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: formatBridgeResult(result),\n },\n ],\n };\n }\n\n /**\n * Start the server using stdio transport\n */\n async run(): Promise<void> {\n const transport = new StdioServerTransport();\n await this.server.connect(transport);\n console.error(\"t402 MCP Server running on stdio\");\n }\n}\n\n/**\n * Create a new t402 MCP server instance\n */\nexport function createT402McpServer(config?: McpServerConfig): T402McpServer {\n return new T402McpServer(config);\n}\n\n/**\n * Load configuration from environment variables\n */\nexport function loadConfigFromEnv(): McpServerConfig {\n const config: McpServerConfig = {};\n\n // Private key\n if (process.env.T402_PRIVATE_KEY) {\n config.privateKey = process.env.T402_PRIVATE_KEY;\n }\n\n // Demo mode\n if (process.env.T402_DEMO_MODE === \"true\") {\n config.demoMode = true;\n }\n\n // ERC-4337 configuration\n if (process.env.T402_BUNDLER_URL) {\n config.bundlerUrl = process.env.T402_BUNDLER_URL;\n }\n if (process.env.T402_PAYMASTER_URL) {\n config.paymasterUrl = process.env.T402_PAYMASTER_URL;\n }\n\n // Custom RPC URLs\n const rpcUrls: Partial<Record<SupportedNetwork, string>> = {};\n const networks: SupportedNetwork[] = [\n \"ethereum\",\n \"base\",\n \"arbitrum\",\n \"optimism\",\n \"polygon\",\n \"avalanche\",\n \"ink\",\n \"berachain\",\n \"unichain\",\n ];\n\n for (const network of networks) {\n const envVar = `T402_RPC_${network.toUpperCase()}`;\n if (process.env[envVar]) {\n rpcUrls[network] = process.env[envVar];\n }\n }\n\n if (Object.keys(rpcUrls).length > 0) {\n config.rpcUrls = rpcUrls;\n }\n\n return config;\n}\n","/**\n * t402/getBalance - Get token balance for a specific network\n */\n\nimport { z } from \"zod\";\nimport {\n createPublicClient,\n http,\n formatEther,\n formatUnits,\n type Address,\n} from \"viem\";\nimport * as chains from \"viem/chains\";\nimport type { SupportedNetwork, TokenBalance, ChainBalance } from \"../types.js\";\nimport {\n CHAIN_IDS,\n NATIVE_SYMBOLS,\n DEFAULT_RPC_URLS,\n USDC_ADDRESSES,\n USDT_ADDRESSES,\n USDT0_ADDRESSES,\n ERC20_ABI,\n} from \"../constants.js\";\n\n/**\n * Input schema for getBalance tool\n */\nexport const getBalanceInputSchema = z.object({\n network: z\n .enum([\n \"ethereum\",\n \"base\",\n \"arbitrum\",\n \"optimism\",\n \"polygon\",\n \"avalanche\",\n \"ink\",\n \"berachain\",\n \"unichain\",\n ])\n .describe(\"Blockchain network to check balance on\"),\n address: z\n .string()\n .regex(/^0x[a-fA-F0-9]{40}$/)\n .describe(\"Wallet address to check balance for\"),\n});\n\nexport type GetBalanceInput = z.infer<typeof getBalanceInputSchema>;\n\n/**\n * Get the viem chain configuration for a network\n */\nfunction getViemChain(network: SupportedNetwork) {\n switch (network) {\n case \"ethereum\": return chains.mainnet;\n case \"base\": return chains.base;\n case \"arbitrum\": return chains.arbitrum;\n case \"optimism\": return chains.optimism;\n case \"polygon\": return chains.polygon;\n case \"avalanche\": return chains.avalanche;\n case \"ink\": return chains.ink;\n case \"berachain\": return chains.berachain;\n case \"unichain\": return chains.unichain;\n default: return chains.mainnet;\n }\n}\n\n/**\n * Get token balance for an address\n */\nasync function getTokenBalance(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n client: any,\n tokenAddress: Address,\n walletAddress: Address\n): Promise<TokenBalance | null> {\n try {\n const [balance, decimals, symbol] = await Promise.all([\n client.readContract({\n address: tokenAddress,\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [walletAddress],\n }) as Promise<bigint>,\n client.readContract({\n address: tokenAddress,\n abi: ERC20_ABI,\n functionName: \"decimals\",\n }) as Promise<number>,\n client.readContract({\n address: tokenAddress,\n abi: ERC20_ABI,\n functionName: \"symbol\",\n }) as Promise<string>,\n ]);\n\n return {\n symbol,\n address: tokenAddress,\n balance: balance.toString(),\n formatted: formatUnits(balance, decimals),\n decimals,\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Execute getBalance tool\n */\nexport async function executeGetBalance(\n input: GetBalanceInput,\n rpcUrls?: Partial<Record<SupportedNetwork, string>>\n): Promise<ChainBalance> {\n const { network, address } = input;\n const walletAddress = address as Address;\n\n const rpcUrl = rpcUrls?.[network] || DEFAULT_RPC_URLS[network];\n const chain = getViemChain(network);\n\n const client = createPublicClient({\n chain,\n transport: http(rpcUrl),\n });\n\n // Get native balance\n const nativeBalance = await client.getBalance({ address: walletAddress });\n\n // Get token balances\n const tokenAddresses: { token: Address; expected: string }[] = [];\n\n if (USDC_ADDRESSES[network]) {\n tokenAddresses.push({ token: USDC_ADDRESSES[network]!, expected: \"USDC\" });\n }\n if (USDT_ADDRESSES[network]) {\n tokenAddresses.push({ token: USDT_ADDRESSES[network]!, expected: \"USDT\" });\n }\n if (USDT0_ADDRESSES[network]) {\n tokenAddresses.push({ token: USDT0_ADDRESSES[network]!, expected: \"USDT0\" });\n }\n\n const tokenBalances = await Promise.all(\n tokenAddresses.map(({ token }) =>\n getTokenBalance(client, token, walletAddress)\n )\n );\n\n const tokens = tokenBalances.filter(\n (t): t is TokenBalance => t !== null\n );\n\n return {\n network,\n chainId: CHAIN_IDS[network],\n native: {\n symbol: NATIVE_SYMBOLS[network],\n balance: nativeBalance.toString(),\n formatted: formatEther(nativeBalance),\n },\n tokens,\n };\n}\n\n/**\n * Format balance result for display\n */\nexport function formatBalanceResult(balance: ChainBalance): string {\n const lines: string[] = [\n `## Balance on ${balance.network} (Chain ID: ${balance.chainId})`,\n \"\",\n `### Native Token`,\n `- ${balance.native.symbol}: ${balance.native.formatted}`,\n \"\",\n ];\n\n if (balance.tokens.length > 0) {\n lines.push(\"### Stablecoins\");\n for (const token of balance.tokens) {\n lines.push(`- ${token.symbol}: ${token.formatted}`);\n }\n } else {\n lines.push(\"_No stablecoin balances found_\");\n }\n\n return lines.join(\"\\n\");\n}\n","/**\n * Constants and network configurations for t402 MCP Server\n */\n\nimport type { Address } from \"viem\";\nimport type { SupportedNetwork } from \"./types.js\";\n\n/**\n * Chain IDs by network\n */\nexport const CHAIN_IDS: Record<SupportedNetwork, number> = {\n ethereum: 1,\n base: 8453,\n arbitrum: 42161,\n optimism: 10,\n polygon: 137,\n avalanche: 43114,\n ink: 57073,\n berachain: 80094,\n unichain: 130,\n};\n\n/**\n * Native token symbols by network\n */\nexport const NATIVE_SYMBOLS: Record<SupportedNetwork, string> = {\n ethereum: \"ETH\",\n base: \"ETH\",\n arbitrum: \"ETH\",\n optimism: \"ETH\",\n polygon: \"MATIC\",\n avalanche: \"AVAX\",\n ink: \"ETH\",\n berachain: \"BERA\",\n unichain: \"ETH\",\n};\n\n/**\n * Block explorer URLs by network\n */\nexport const EXPLORER_URLS: Record<SupportedNetwork, string> = {\n ethereum: \"https://etherscan.io\",\n base: \"https://basescan.org\",\n arbitrum: \"https://arbiscan.io\",\n optimism: \"https://optimistic.etherscan.io\",\n polygon: \"https://polygonscan.com\",\n avalanche: \"https://snowtrace.io\",\n ink: \"https://explorer.inkonchain.com\",\n berachain: \"https://berascan.com\",\n unichain: \"https://unichain.blockscout.com\",\n};\n\n/**\n * Default RPC URLs by network (public endpoints)\n */\nexport const DEFAULT_RPC_URLS: Record<SupportedNetwork, string> = {\n ethereum: \"https://eth.llamarpc.com\",\n base: \"https://mainnet.base.org\",\n arbitrum: \"https://arb1.arbitrum.io/rpc\",\n optimism: \"https://mainnet.optimism.io\",\n polygon: \"https://polygon-rpc.com\",\n avalanche: \"https://api.avax.network/ext/bc/C/rpc\",\n ink: \"https://rpc-gel.inkonchain.com\",\n berachain: \"https://rpc.berachain.com\",\n unichain: \"https://mainnet.unichain.org\",\n};\n\n/**\n * USDC contract addresses by network\n */\nexport const USDC_ADDRESSES: Partial<Record<SupportedNetwork, Address>> = {\n ethereum: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n base: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n arbitrum: \"0xaf88d065e77c8cC2239327C5EDb3A432268e5831\",\n optimism: \"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85\",\n polygon: \"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359\",\n avalanche: \"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E\",\n};\n\n/**\n * USDT contract addresses by network\n */\nexport const USDT_ADDRESSES: Partial<Record<SupportedNetwork, Address>> = {\n ethereum: \"0xdAC17F958D2ee523a2206206994597C13D831ec7\",\n arbitrum: \"0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9\",\n polygon: \"0xc2132D05D31c914a87C6611C10748AEb04B58e8F\",\n avalanche: \"0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7\",\n optimism: \"0x94b008aA00579c1307B0EF2c499aD98a8ce58e58\",\n};\n\n/**\n * USDT0 (LayerZero OFT) contract addresses by network\n */\nexport const USDT0_ADDRESSES: Partial<Record<SupportedNetwork, Address>> = {\n ethereum: \"0x6C96dE32CEa08842dcc4058c14d3aaAD7Fa41dee\",\n arbitrum: \"0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9\",\n ink: \"0x0200C29006150606B650577BBE7B6248F58470c1\",\n berachain: \"0x779Ded0c9e1022225f8E0630b35a9b54bE713736\",\n unichain: \"0x588ce4F028D8e7B53B687865d6A67b3A54C75518\",\n};\n\n/**\n * Chains that support USDT0 bridging\n */\nexport const BRIDGEABLE_CHAINS: SupportedNetwork[] = [\n \"ethereum\",\n \"arbitrum\",\n \"ink\",\n \"berachain\",\n \"unichain\",\n];\n\n/**\n * ERC20 ABI for balance and transfer operations\n */\nexport const ERC20_ABI = [\n {\n name: \"balanceOf\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"account\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"decimals\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint8\" }],\n },\n {\n name: \"symbol\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"string\" }],\n },\n {\n name: \"transfer\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"to\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n {\n name: \"approve\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"spender\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n {\n name: \"allowance\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [\n { name: \"owner\", type: \"address\" },\n { name: \"spender\", type: \"address\" },\n ],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n] as const;\n\n/**\n * Get explorer URL for a transaction\n */\nexport function getExplorerTxUrl(\n network: SupportedNetwork,\n txHash: string\n): string {\n return `${EXPLORER_URLS[network]}/tx/${txHash}`;\n}\n\n/**\n * Get LayerZero Scan URL for a message\n */\nexport function getLayerZeroScanUrl(messageGuid: string): string {\n return `https://layerzeroscan.com/tx/${messageGuid}`;\n}\n\n/**\n * Check if a network supports a specific token\n */\nexport function supportsToken(\n network: SupportedNetwork,\n token: \"USDC\" | \"USDT\" | \"USDT0\"\n): boolean {\n switch (token) {\n case \"USDC\":\n return network in USDC_ADDRESSES;\n case \"USDT\":\n return network in USDT_ADDRESSES;\n case \"USDT0\":\n return network in USDT0_ADDRESSES;\n default:\n return false;\n }\n}\n\n/**\n * Get token address for a network\n */\nexport function getTokenAddress(\n network: SupportedNetwork,\n token: \"USDC\" | \"USDT\" | \"USDT0\"\n): Address | undefined {\n switch (token) {\n case \"USDC\":\n return USDC_ADDRESSES[network];\n case \"USDT\":\n return USDT_ADDRESSES[network];\n case \"USDT0\":\n return USDT0_ADDRESSES[network];\n default:\n return undefined;\n }\n}\n\n/**\n * Format token amount for display\n */\nexport function formatTokenAmount(\n amount: bigint,\n decimals: number,\n symbol: string\n): string {\n const divisor = BigInt(10 ** decimals);\n const wholePart = amount / divisor;\n const fractionalPart = amount % divisor;\n const fractionalStr = fractionalPart.toString().padStart(decimals, \"0\");\n const trimmedFractional = fractionalStr.replace(/0+$/, \"\") || \"0\";\n\n if (trimmedFractional === \"0\") {\n return `${wholePart} ${symbol}`;\n }\n return `${wholePart}.${trimmedFractional} ${symbol}`;\n}\n\n/**\n * Parse token amount from string to bigint\n */\nexport function parseTokenAmount(amount: string, decimals: number): bigint {\n const [wholePart, fractionalPart = \"\"] = amount.split(\".\");\n const paddedFractional = fractionalPart.padEnd(decimals, \"0\").slice(0, decimals);\n return BigInt(wholePart + paddedFractional);\n}\n","/**\n * t402/getAllBalances - Get token balances across all supported networks\n */\n\nimport { z } from \"zod\";\nimport type { SupportedNetwork, ChainBalance } from \"../types.js\";\nimport { executeGetBalance } from \"./getBalance.js\";\n\n/**\n * Input schema for getAllBalances tool\n */\nexport const getAllBalancesInputSchema = z.object({\n address: z\n .string()\n .regex(/^0x[a-fA-F0-9]{40}$/)\n .describe(\"Wallet address to check balances for\"),\n networks: z\n .array(\n z.enum([\n \"ethereum\",\n \"base\",\n \"arbitrum\",\n \"optimism\",\n \"polygon\",\n \"avalanche\",\n \"ink\",\n \"berachain\",\n \"unichain\",\n ])\n )\n .optional()\n .describe(\n \"Optional list of networks to check. If not provided, checks all supported networks.\"\n ),\n});\n\nexport type GetAllBalancesInput = z.infer<typeof getAllBalancesInputSchema>;\n\n/**\n * All supported networks\n */\nconst ALL_NETWORKS: SupportedNetwork[] = [\n \"ethereum\",\n \"base\",\n \"arbitrum\",\n \"optimism\",\n \"polygon\",\n \"avalanche\",\n \"ink\",\n \"berachain\",\n \"unichain\",\n];\n\n/**\n * Result of getAllBalances\n */\nexport interface AllBalancesResult {\n address: string;\n balances: ChainBalance[];\n totalUsdcBalance: string;\n totalUsdtBalance: string;\n summary: string;\n}\n\n/**\n * Execute getAllBalances tool\n */\nexport async function executeGetAllBalances(\n input: GetAllBalancesInput,\n rpcUrls?: Partial<Record<SupportedNetwork, string>>\n): Promise<AllBalancesResult> {\n const { address, networks = ALL_NETWORKS } = input;\n\n // Fetch balances from all networks in parallel\n const balancePromises = networks.map((network) =>\n executeGetBalance({ network, address }, rpcUrls).catch((error) => {\n console.error(`Failed to fetch balance for ${network}:`, error);\n return null;\n })\n );\n\n const results = await Promise.all(balancePromises);\n const balances = results.filter((b): b is ChainBalance => b !== null);\n\n // Calculate total stablecoin balances\n let totalUsdc = 0n;\n let totalUsdt = 0n;\n\n for (const balance of balances) {\n for (const token of balance.tokens) {\n if (token.symbol === \"USDC\") {\n totalUsdc += BigInt(token.balance);\n } else if (token.symbol === \"USDT\" || token.symbol === \"USDT0\") {\n totalUsdt += BigInt(token.balance);\n }\n }\n }\n\n // Format totals (assuming 6 decimals for USDC/USDT)\n const formatTotal = (amount: bigint): string => {\n const divisor = BigInt(10 ** 6);\n const whole = amount / divisor;\n const fraction = amount % divisor;\n const fractionStr = fraction.toString().padStart(6, \"0\").replace(/0+$/, \"\");\n return fractionStr ? `${whole}.${fractionStr}` : whole.toString();\n };\n\n const totalUsdcFormatted = formatTotal(totalUsdc);\n const totalUsdtFormatted = formatTotal(totalUsdt);\n\n // Create summary\n const chainsWithBalance = balances.filter(\n (b) =>\n b.tokens.some((t) => BigInt(t.balance) > 0n) ||\n BigInt(b.native.balance) > 0n\n );\n\n const summary = [\n `Found balances on ${chainsWithBalance.length} of ${balances.length} networks checked.`,\n `Total USDC: ${totalUsdcFormatted}`,\n `Total USDT: ${totalUsdtFormatted}`,\n ].join(\" \");\n\n return {\n address,\n balances,\n totalUsdcBalance: totalUsdcFormatted,\n totalUsdtBalance: totalUsdtFormatted,\n summary,\n };\n}\n\n/**\n * Format all balances result for display\n */\nexport function formatAllBalancesResult(result: AllBalancesResult): string {\n const lines: string[] = [\n `## Multi-Chain Balance Summary`,\n `**Address:** \\`${result.address}\\``,\n \"\",\n `### Totals`,\n `- **Total USDC:** ${result.totalUsdcBalance}`,\n `- **Total USDT:** ${result.totalUsdtBalance}`,\n \"\",\n `### By Network`,\n \"\",\n ];\n\n for (const balance of result.balances) {\n const hasBalance =\n balance.tokens.some((t) => BigInt(t.balance) > 0n) ||\n BigInt(balance.native.balance) > 0n;\n\n if (!hasBalance) continue;\n\n lines.push(`#### ${balance.network}`);\n lines.push(`- ${balance.native.symbol}: ${balance.native.formatted}`);\n for (const token of balance.tokens) {\n if (BigInt(token.balance) > 0n) {\n lines.push(`- ${token.symbol}: ${token.formatted}`);\n }\n }\n lines.push(\"\");\n }\n\n // List networks with no balance\n const emptyNetworks = result.balances.filter(\n (b) =>\n !b.tokens.some((t) => BigInt(t.balance) > 0n) &&\n BigInt(b.native.balance) === 0n\n );\n\n if (emptyNetworks.length > 0) {\n lines.push(`_No balance on: ${emptyNetworks.map((n) => n.network).join(\", \")}_`);\n }\n\n return lines.join(\"\\n\");\n}\n","/**\n * t402/pay - Execute a payment on a specific network\n */\n\nimport { z } from \"zod\";\nimport {\n createPublicClient,\n createWalletClient,\n http,\n parseUnits,\n type Address,\n} from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport * as chains from \"viem/chains\";\nimport type { SupportedNetwork, PaymentResult } from \"../types.js\";\nimport {\n DEFAULT_RPC_URLS,\n ERC20_ABI,\n getTokenAddress,\n getExplorerTxUrl,\n supportsToken,\n} from \"../constants.js\";\n\n/**\n * Input schema for pay tool\n */\nexport const payInputSchema = z.object({\n to: z\n .string()\n .regex(/^0x[a-fA-F0-9]{40}$/)\n .describe(\"Recipient address\"),\n amount: z\n .string()\n .regex(/^\\d+(\\.\\d+)?$/)\n .describe(\"Amount to pay (e.g., '10.50' for 10.50 USDC)\"),\n token: z\n .enum([\"USDC\", \"USDT\", \"USDT0\"])\n .describe(\"Token to use for payment\"),\n network: z\n .enum([\n \"ethereum\",\n \"base\",\n \"arbitrum\",\n \"optimism\",\n \"polygon\",\n \"avalanche\",\n \"ink\",\n \"berachain\",\n \"unichain\",\n ])\n .describe(\"Network to execute payment on\"),\n memo: z\n .string()\n .optional()\n .describe(\"Optional memo/reference for the payment\"),\n});\n\nexport type PayInput = z.infer<typeof payInputSchema>;\n\n/**\n * Get the viem chain configuration for a network\n */\nfunction getViemChain(network: SupportedNetwork) {\n switch (network) {\n case \"ethereum\": return chains.mainnet;\n case \"base\": return chains.base;\n case \"arbitrum\": return chains.arbitrum;\n case \"optimism\": return chains.optimism;\n case \"polygon\": return chains.polygon;\n case \"avalanche\": return chains.avalanche;\n case \"ink\": return chains.ink;\n case \"berachain\": return chains.berachain;\n case \"unichain\": return chains.unichain;\n default: return chains.mainnet;\n }\n}\n\n/**\n * Options for executing payment\n */\nexport interface PayOptions {\n /** Private key for signing (hex with 0x prefix) */\n privateKey: string;\n /** Custom RPC URL */\n rpcUrl?: string;\n /** Demo mode - simulate without executing */\n demoMode?: boolean;\n}\n\n/**\n * Execute pay tool\n */\nexport async function executePay(\n input: PayInput,\n options: PayOptions\n): Promise<PaymentResult> {\n const { to, amount, token, network, memo } = input;\n const { privateKey, rpcUrl, demoMode } = options;\n\n // Validate token support on network\n if (!supportsToken(network, token)) {\n throw new Error(`Token ${token} is not supported on ${network}`);\n }\n\n const tokenAddress = getTokenAddress(network, token);\n if (!tokenAddress) {\n throw new Error(`Could not find ${token} address for ${network}`);\n }\n\n // Parse amount (USDC/USDT use 6 decimals)\n const decimals = 6;\n const amountBigInt = parseUnits(amount, decimals);\n\n // Demo mode - return simulated result\n if (demoMode) {\n const fakeTxHash = `0x${\"0\".repeat(64)}` as `0x${string}`;\n return {\n txHash: fakeTxHash,\n network,\n amount,\n token,\n to: to as Address,\n explorerUrl: getExplorerTxUrl(network, fakeTxHash),\n };\n }\n\n // Create clients\n const chain = getViemChain(network);\n const transport = http(rpcUrl || DEFAULT_RPC_URLS[network]);\n\n const account = privateKeyToAccount(privateKey as `0x${string}`);\n\n const publicClient = createPublicClient({\n chain,\n transport,\n });\n\n const walletClient = createWalletClient({\n account,\n chain,\n transport,\n });\n\n // Check balance\n const balance = (await publicClient.readContract({\n address: tokenAddress,\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [account.address],\n })) as bigint;\n\n if (balance < amountBigInt) {\n throw new Error(\n `Insufficient ${token} balance. Have: ${balance.toString()}, Need: ${amountBigInt.toString()}`\n );\n }\n\n // Execute transfer\n const hash = await walletClient.writeContract({\n address: tokenAddress,\n abi: ERC20_ABI,\n functionName: \"transfer\",\n args: [to as Address, amountBigInt],\n });\n\n // Wait for confirmation\n const receipt = await publicClient.waitForTransactionReceipt({ hash });\n\n if (receipt.status !== \"success\") {\n throw new Error(`Transaction failed: ${hash}`);\n }\n\n return {\n txHash: hash,\n network,\n amount,\n token,\n to: to as Address,\n explorerUrl: getExplorerTxUrl(network, hash),\n };\n}\n\n/**\n * Format payment result for display\n */\nexport function formatPaymentResult(result: PaymentResult): string {\n return [\n `## Payment Successful`,\n \"\",\n `- **Amount:** ${result.amount} ${result.token}`,\n `- **To:** \\`${result.to}\\``,\n `- **Network:** ${result.network}`,\n `- **Transaction:** \\`${result.txHash}\\``,\n \"\",\n `[View on Explorer](${result.explorerUrl})`,\n ].join(\"\\n\");\n}\n","/**\n * t402/payGasless - Execute a gasless payment using ERC-4337\n */\n\nimport { z } from \"zod\";\nimport {\n createPublicClient,\n http,\n parseUnits,\n encodeFunctionData,\n type Address,\n} from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport * as chains from \"viem/chains\";\nimport type { SupportedNetwork, GaslessPaymentResult } from \"../types.js\";\nimport {\n DEFAULT_RPC_URLS,\n ERC20_ABI,\n getTokenAddress,\n getExplorerTxUrl,\n supportsToken,\n} from \"../constants.js\";\n\n/**\n * Input schema for payGasless tool\n */\nexport const payGaslessInputSchema = z.object({\n to: z\n .string()\n .regex(/^0x[a-fA-F0-9]{40}$/)\n .describe(\"Recipient address\"),\n amount: z\n .string()\n .regex(/^\\d+(\\.\\d+)?$/)\n .describe(\"Amount to pay (e.g., '10.50' for 10.50 USDC)\"),\n token: z\n .enum([\"USDC\", \"USDT\", \"USDT0\"])\n .describe(\"Token to use for payment\"),\n network: z\n .enum([\n \"ethereum\",\n \"base\",\n \"arbitrum\",\n \"optimism\",\n \"polygon\",\n \"avalanche\",\n ])\n .describe(\"Network to execute gasless payment on (must support ERC-4337)\"),\n});\n\nexport type PayGaslessInput = z.infer<typeof payGaslessInputSchema>;\n\n/**\n * Networks that support ERC-4337 gasless transactions\n */\nexport const GASLESS_SUPPORTED_NETWORKS: SupportedNetwork[] = [\n \"ethereum\",\n \"base\",\n \"arbitrum\",\n \"optimism\",\n \"polygon\",\n \"avalanche\",\n];\n\n/**\n * Get the viem chain configuration for a network\n */\nfunction getViemChain(network: SupportedNetwork) {\n switch (network) {\n case \"ethereum\": return chains.mainnet;\n case \"base\": return chains.base;\n case \"arbitrum\": return chains.arbitrum;\n case \"optimism\": return chains.optimism;\n case \"polygon\": return chains.polygon;\n case \"avalanche\": return chains.avalanche;\n case \"ink\": return chains.ink;\n case \"berachain\": return chains.berachain;\n case \"unichain\": return chains.unichain;\n default: return chains.mainnet;\n }\n}\n\n/**\n * Options for executing gasless payment\n */\nexport interface PayGaslessOptions {\n /** Private key for signing (hex with 0x prefix) */\n privateKey: string;\n /** Bundler URL for ERC-4337 */\n bundlerUrl: string;\n /** Paymaster URL for sponsoring gas */\n paymasterUrl: string;\n /** Custom RPC URL */\n rpcUrl?: string;\n /** Demo mode - simulate without executing */\n demoMode?: boolean;\n}\n\n/**\n * User operation structure (simplified)\n */\ninterface UserOperation {\n sender: Address;\n nonce: bigint;\n initCode: `0x${string}`;\n callData: `0x${string}`;\n callGasLimit: bigint;\n verificationGasLimit: bigint;\n preVerificationGas: bigint;\n maxFeePerGas: bigint;\n maxPriorityFeePerGas: bigint;\n paymasterAndData: `0x${string}`;\n signature: `0x${string}`;\n}\n\n/**\n * Execute payGasless tool\n */\nexport async function executePayGasless(\n input: PayGaslessInput,\n options: PayGaslessOptions\n): Promise<GaslessPaymentResult> {\n const { to, amount, token, network } = input;\n const { privateKey, bundlerUrl, paymasterUrl, rpcUrl, demoMode } = options;\n\n // Validate network supports gasless\n if (!GASLESS_SUPPORTED_NETWORKS.includes(network)) {\n throw new Error(\n `Network ${network} does not support ERC-4337 gasless transactions. Supported: ${GASLESS_SUPPORTED_NETWORKS.join(\", \")}`\n );\n }\n\n // Validate token support on network\n if (!supportsToken(network, token)) {\n throw new Error(`Token ${token} is not supported on ${network}`);\n }\n\n const tokenAddress = getTokenAddress(network, token);\n if (!tokenAddress) {\n throw new Error(`Could not find ${token} address for ${network}`);\n }\n\n // Parse amount (USDC/USDT use 6 decimals)\n const decimals = 6;\n const amountBigInt = parseUnits(amount, decimals);\n\n // Demo mode - return simulated result\n if (demoMode) {\n const fakeTxHash = `0x${\"1\".repeat(64)}` as `0x${string}`;\n const fakeUserOpHash = `0x${\"2\".repeat(64)}` as `0x${string}`;\n return {\n txHash: fakeTxHash,\n userOpHash: fakeUserOpHash,\n network,\n amount,\n token,\n to: to as Address,\n explorerUrl: getExplorerTxUrl(network, fakeTxHash),\n paymaster: \"demo-paymaster\",\n };\n }\n\n // Create clients\n const chain = getViemChain(network);\n const transport = http(rpcUrl || DEFAULT_RPC_URLS[network]);\n\n const account = privateKeyToAccount(privateKey as `0x${string}`);\n\n const publicClient = createPublicClient({\n chain,\n transport,\n });\n\n // Encode the transfer call data\n const callData = encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"transfer\",\n args: [to as Address, amountBigInt],\n });\n\n // Build user operation\n // Note: In production, this would integrate with a full ERC-4337 bundler\n const nonce = await publicClient.getTransactionCount({\n address: account.address,\n });\n\n const gasPrice = await publicClient.getGasPrice();\n\n const userOp: UserOperation = {\n sender: account.address,\n nonce: BigInt(nonce),\n initCode: \"0x\",\n callData: callData as `0x${string}`,\n callGasLimit: 100000n,\n verificationGasLimit: 100000n,\n preVerificationGas: 50000n,\n maxFeePerGas: gasPrice,\n maxPriorityFeePerGas: gasPrice / 10n,\n paymasterAndData: \"0x\", // Would be filled by paymaster\n signature: \"0x\",\n };\n\n // In production, this would:\n // 1. Request paymaster sponsorship from paymasterUrl\n // 2. Sign the user operation\n // 3. Submit to bundler at bundlerUrl\n // 4. Wait for user operation to be included\n\n // For now, send as regular transaction with sponsorship note\n const response = await fetch(bundlerUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: 1,\n method: \"eth_sendUserOperation\",\n params: [userOp, chain.id],\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Bundler request failed: ${response.statusText}`);\n }\n\n const result = (await response.json()) as {\n error?: { message: string };\n result?: string;\n };\n\n if (result.error) {\n throw new Error(`Bundler error: ${result.error.message}`);\n }\n\n const userOpHash = result.result as string;\n\n // Poll for receipt\n let receipt: { transactionHash: string } | null = null;\n for (let i = 0; i < 30; i++) {\n const receiptResponse = await fetch(bundlerUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: 1,\n method: \"eth_getUserOperationReceipt\",\n params: [userOpHash],\n }),\n });\n\n const receiptResult = (await receiptResponse.json()) as {\n result?: { transactionHash: string };\n };\n if (receiptResult.result) {\n receipt = receiptResult.result;\n break;\n }\n\n await new Promise((resolve) => setTimeout(resolve, 2000));\n }\n\n if (!receipt) {\n throw new Error(\"Timeout waiting for user operation receipt\");\n }\n\n return {\n txHash: receipt.transactionHash,\n userOpHash,\n network,\n amount,\n token,\n to: to as Address,\n explorerUrl: getExplorerTxUrl(network, receipt.transactionHash),\n };\n}\n\n/**\n * Format gasless payment result for display\n */\nexport function formatGaslessPaymentResult(result: GaslessPaymentResult): string {\n const lines = [\n `## Gasless Payment Successful`,\n \"\",\n `- **Amount:** ${result.amount} ${result.token}`,\n `- **To:** \\`${result.to}\\``,\n `- **Network:** ${result.network}`,\n `- **Transaction:** \\`${result.txHash}\\``,\n `- **UserOp Hash:** \\`${result.userOpHash}\\``,\n ];\n\n if (result.paymaster) {\n lines.push(`- **Paymaster:** ${result.paymaster}`);\n }\n\n lines.push(\"\");\n lines.push(`[View on Explorer](${result.explorerUrl})`);\n lines.push(\"\");\n lines.push(\"_Gas fees were sponsored - no ETH was deducted from your wallet._\");\n\n return lines.join(\"\\n\");\n}\n","/**\n * t402/getBridgeFee - Get fee quote for bridging USDT0 between chains\n */\n\nimport { z } from \"zod\";\nimport {\n createPublicClient,\n http,\n formatEther,\n type Address,\n} from \"viem\";\nimport * as chains from \"viem/chains\";\nimport type { SupportedNetwork, BridgeFeeQuote } from \"../types.js\";\nimport {\n DEFAULT_RPC_URLS,\n BRIDGEABLE_CHAINS,\n USDT0_ADDRESSES,\n NATIVE_SYMBOLS,\n parseTokenAmount,\n} from \"../constants.js\";\n\n/**\n * Input schema for getBridgeFee tool\n */\nexport const getBridgeFeeInputSchema = z.object({\n fromChain: z\n .enum([\"ethereum\", \"arbitrum\", \"ink\", \"berachain\", \"unichain\"])\n .describe(\"Source chain to bridge from\"),\n toChain: z\n .enum([\"ethereum\", \"arbitrum\", \"ink\", \"berachain\", \"unichain\"])\n .describe(\"Destination chain to bridge to\"),\n amount: z\n .string()\n .regex(/^\\d+(\\.\\d+)?$/)\n .describe(\"Amount of USDT0 to bridge (e.g., '100' for 100 USDT0)\"),\n recipient: z\n .string()\n .regex(/^0x[a-fA-F0-9]{40}$/)\n .describe(\"Recipient address on destination chain\"),\n});\n\nexport type GetBridgeFeeInput = z.infer<typeof getBridgeFeeInputSchema>;\n\n/**\n * LayerZero endpoint IDs for supported chains\n */\nconst LAYERZERO_ENDPOINT_IDS: Record<string, number> = {\n ethereum: 30101,\n arbitrum: 30110,\n ink: 30291,\n berachain: 30362,\n unichain: 30320,\n};\n\n/**\n * Estimated bridge times in seconds\n */\nconst ESTIMATED_BRIDGE_TIMES: Record<string, number> = {\n ethereum: 900, // 15 minutes\n arbitrum: 300, // 5 minutes\n ink: 300, // 5 minutes\n berachain: 300, // 5 minutes\n unichain: 300, // 5 minutes\n};\n\n/**\n * OFT contract ABI for quoteSend\n */\nconst OFT_ABI = [\n {\n name: \"quoteSend\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [\n {\n name: \"_sendParam\",\n type: \"tuple\",\n components: [\n { name: \"dstEid\", type: \"uint32\" },\n { name: \"to\", type: \"bytes32\" },\n { name: \"amountLD\", type: \"uint256\" },\n { name: \"minAmountLD\", type: \"uint256\" },\n { name: \"extraOptions\", type: \"bytes\" },\n { name: \"composeMsg\", type: \"bytes\" },\n { name: \"oftCmd\", type: \"bytes\" },\n ],\n },\n { name: \"_payInLzToken\", type: \"bool\" },\n ],\n outputs: [\n {\n name: \"msgFee\",\n type: \"tuple\",\n components: [\n { name: \"nativeFee\", type: \"uint256\" },\n { name: \"lzTokenFee\", type: \"uint256\" },\n ],\n },\n ],\n },\n] as const;\n\n/**\n * Get the viem chain configuration for a network\n */\nfunction getViemChain(network: SupportedNetwork) {\n switch (network) {\n case \"ethereum\": return chains.mainnet;\n case \"arbitrum\": return chains.arbitrum;\n case \"ink\": return chains.ink;\n case \"berachain\": return chains.berachain;\n case \"unichain\": return chains.unichain;\n default: return undefined;\n }\n}\n\n/**\n * Convert address to bytes32 format for LayerZero\n */\nfunction addressToBytes32(address: Address): `0x${string}` {\n return `0x${address.slice(2).padStart(64, \"0\")}` as `0x${string}`;\n}\n\n/**\n * Execute getBridgeFee tool\n */\nexport async function executeGetBridgeFee(\n input: GetBridgeFeeInput,\n rpcUrls?: Partial<Record<SupportedNetwork, string>>\n): Promise<BridgeFeeQuote> {\n const { fromChain, toChain, amount, recipient } = input;\n\n // Validate chains are different\n if (fromChain === toChain) {\n throw new Error(\"Source and destination chains must be different\");\n }\n\n // Validate both chains support bridging\n if (!BRIDGEABLE_CHAINS.includes(fromChain as SupportedNetwork)) {\n throw new Error(`Chain ${fromChain} does not support USDT0 bridging`);\n }\n if (!BRIDGEABLE_CHAINS.includes(toChain as SupportedNetwork)) {\n throw new Error(`Chain ${toChain} does not support USDT0 bridging`);\n }\n\n // Get USDT0 address on source chain\n const usdt0Address = USDT0_ADDRESSES[fromChain as SupportedNetwork];\n if (!usdt0Address) {\n throw new Error(`USDT0 not found on ${fromChain}`);\n }\n\n // Parse amount (6 decimals)\n const amountBigInt = parseTokenAmount(amount, 6);\n\n // Create client\n const chain = getViemChain(fromChain as SupportedNetwork);\n if (!chain) {\n throw new Error(`Unsupported chain: ${fromChain}`);\n }\n\n const rpcUrl = rpcUrls?.[fromChain as SupportedNetwork] || DEFAULT_RPC_URLS[fromChain as SupportedNetwork];\n const client = createPublicClient({\n chain,\n transport: http(rpcUrl),\n });\n\n // Build send params\n const dstEid = LAYERZERO_ENDPOINT_IDS[toChain];\n const sendParam = {\n dstEid,\n to: addressToBytes32(recipient as Address),\n amountLD: amountBigInt,\n minAmountLD: amountBigInt, // No slippage for quote\n extraOptions: \"0x\" as `0x${string}`,\n composeMsg: \"0x\" as `0x${string}`,\n oftCmd: \"0x\" as `0x${string}`,\n };\n\n // Get quote from contract\n const quote = (await client.readContract({\n address: usdt0Address,\n abi: OFT_ABI,\n functionName: \"quoteSend\",\n args: [sendParam, false],\n })) as { nativeFee: bigint; lzTokenFee: bigint };\n\n const nativeSymbol = NATIVE_SYMBOLS[fromChain as SupportedNetwork];\n const estimatedTime = ESTIMATED_BRIDGE_TIMES[toChain] || 300;\n\n return {\n fromChain: fromChain as SupportedNetwork,\n toChain: toChain as SupportedNetwork,\n amount,\n nativeFee: quote.nativeFee.toString(),\n nativeFeeFormatted: `${formatEther(quote.nativeFee)} ${nativeSymbol}`,\n estimatedTime,\n };\n}\n\n/**\n * Format bridge fee result for display\n */\nexport function formatBridgeFeeResult(result: BridgeFeeQuote): string {\n const minutes = Math.ceil(result.estimatedTime / 60);\n\n return [\n `## Bridge Fee Quote`,\n \"\",\n `- **Route:** ${result.fromChain} → ${result.toChain}`,\n `- **Amount:** ${result.amount} USDT0`,\n `- **Native Fee:** ${result.nativeFeeFormatted}`,\n `- **Estimated Time:** ~${minutes} minutes`,\n \"\",\n \"_Note: Actual fees may vary slightly at execution time._\",\n ].join(\"\\n\");\n}\n","/**\n * t402/bridge - Bridge USDT0 between chains using LayerZero OFT\n */\n\nimport { z } from \"zod\";\nimport {\n createPublicClient,\n createWalletClient,\n http,\n keccak256,\n toBytes,\n type Address,\n} from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport * as chains from \"viem/chains\";\nimport type { SupportedNetwork, BridgeResult } from \"../types.js\";\nimport {\n DEFAULT_RPC_URLS,\n BRIDGEABLE_CHAINS,\n USDT0_ADDRESSES,\n ERC20_ABI,\n parseTokenAmount,\n getLayerZeroScanUrl,\n getExplorerTxUrl,\n} from \"../constants.js\";\n\n/**\n * Input schema for bridge tool\n */\nexport const bridgeInputSchema = z.object({\n fromChain: z\n .enum([\"ethereum\", \"arbitrum\", \"ink\", \"berachain\", \"unichain\"])\n .describe(\"Source chain to bridge from\"),\n toChain: z\n .enum([\"ethereum\", \"arbitrum\", \"ink\", \"berachain\", \"unichain\"])\n .describe(\"Destination chain to bridge to\"),\n amount: z\n .string()\n .regex(/^\\d+(\\.\\d+)?$/)\n .describe(\"Amount of USDT0 to bridge (e.g., '100' for 100 USDT0)\"),\n recipient: z\n .string()\n .regex(/^0x[a-fA-F0-9]{40}$/)\n .describe(\"Recipient address on destination chain\"),\n});\n\nexport type BridgeInput = z.infer<typeof bridgeInputSchema>;\n\n/**\n * LayerZero endpoint IDs for supported chains\n */\nconst LAYERZERO_ENDPOINT_IDS: Record<string, number> = {\n ethereum: 30101,\n arbitrum: 30110,\n ink: 30291,\n berachain: 30362,\n unichain: 30320,\n};\n\n/**\n * Estimated bridge times in seconds\n */\nconst ESTIMATED_BRIDGE_TIMES: Record<string, number> = {\n ethereum: 900,\n arbitrum: 300,\n ink: 300,\n berachain: 300,\n unichain: 300,\n};\n\n/**\n * OFT contract ABI\n */\nconst OFT_ABI = [\n {\n name: \"quoteSend\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [\n {\n name: \"_sendParam\",\n type: \"tuple\",\n components: [\n { name: \"dstEid\", type: \"uint32\" },\n { name: \"to\", type: \"bytes32\" },\n { name: \"amountLD\", type: \"uint256\" },\n { name: \"minAmountLD\", type: \"uint256\" },\n { name: \"extraOptions\", type: \"bytes\" },\n { name: \"composeMsg\", type: \"bytes\" },\n { name: \"oftCmd\", type: \"bytes\" },\n ],\n },\n { name: \"_payInLzToken\", type: \"bool\" },\n ],\n outputs: [\n {\n name: \"msgFee\",\n type: \"tuple\",\n components: [\n { name: \"nativeFee\", type: \"uint256\" },\n { name: \"lzTokenFee\", type: \"uint256\" },\n ],\n },\n ],\n },\n {\n name: \"send\",\n type: \"function\",\n stateMutability: \"payable\",\n inputs: [\n {\n name: \"_sendParam\",\n type: \"tuple\",\n components: [\n { name: \"dstEid\", type: \"uint32\" },\n { name: \"to\", type: \"bytes32\" },\n { name: \"amountLD\", type: \"uint256\" },\n { name: \"minAmountLD\", type: \"uint256\" },\n { name: \"extraOptions\", type: \"bytes\" },\n { name: \"composeMsg\", type: \"bytes\" },\n { name: \"oftCmd\", type: \"bytes\" },\n ],\n },\n {\n name: \"_fee\",\n type: \"tuple\",\n components: [\n { name: \"nativeFee\", type: \"uint256\" },\n { name: \"lzTokenFee\", type: \"uint256\" },\n ],\n },\n { name: \"_refundAddress\", type: \"address\" },\n ],\n outputs: [\n {\n name: \"msgReceipt\",\n type: \"tuple\",\n components: [\n { name: \"guid\", type: \"bytes32\" },\n { name: \"nonce\", type: \"uint64\" },\n {\n name: \"fee\",\n type: \"tuple\",\n components: [\n { name: \"nativeFee\", type: \"uint256\" },\n { name: \"lzTokenFee\", type: \"uint256\" },\n ],\n },\n ],\n },\n {\n name: \"oftReceipt\",\n type: \"tuple\",\n components: [\n { name: \"amountSentLD\", type: \"uint256\" },\n { name: \"amountReceivedLD\", type: \"uint256\" },\n ],\n },\n ],\n },\n] as const;\n\n/**\n * OFTSent event topic\n */\nconst OFT_SENT_EVENT_TOPIC = keccak256(\n toBytes(\"OFTSent(bytes32,uint32,address,uint256,uint256)\")\n);\n\n/**\n * Get the viem chain configuration for a network\n */\nfunction getViemChain(network: SupportedNetwork) {\n switch (network) {\n case \"ethereum\": return chains.mainnet;\n case \"arbitrum\": return chains.arbitrum;\n case \"ink\": return chains.ink;\n case \"berachain\": return chains.berachain;\n case \"unichain\": return chains.unichain;\n default: return undefined;\n }\n}\n\n/**\n * Convert address to bytes32 format for LayerZero\n */\nfunction addressToBytes32(address: Address): `0x${string}` {\n return `0x${address.slice(2).padStart(64, \"0\")}` as `0x${string}`;\n}\n\n/**\n * Options for executing bridge\n */\nexport interface BridgeOptions {\n /** Private key for signing (hex with 0x prefix) */\n privateKey: string;\n /** Custom RPC URL */\n rpcUrl?: string;\n /** Demo mode - simulate without executing */\n demoMode?: boolean;\n /** Slippage tolerance percentage (default: 0.5) */\n slippageTolerance?: number;\n}\n\n/**\n * Execute bridge tool\n */\nexport async function executeBridge(\n input: BridgeInput,\n options: BridgeOptions\n): Promise<BridgeResult> {\n const { fromChain, toChain, amount, recipient } = input;\n const { privateKey, rpcUrl, demoMode, slippageTolerance = 0.5 } = options;\n\n // Validate chains are different\n if (fromChain === toChain) {\n throw new Error(\"Source and destination chains must be different\");\n }\n\n // Validate both chains support bridging\n if (!BRIDGEABLE_CHAINS.includes(fromChain as SupportedNetwork)) {\n throw new Error(`Chain ${fromChain} does not support USDT0 bridging`);\n }\n if (!BRIDGEABLE_CHAINS.includes(toChain as SupportedNetwork)) {\n throw new Error(`Chain ${toChain} does not support USDT0 bridging`);\n }\n\n // Get USDT0 address on source chain\n const usdt0Address = USDT0_ADDRESSES[fromChain as SupportedNetwork];\n if (!usdt0Address) {\n throw new Error(`USDT0 not found on ${fromChain}`);\n }\n\n // Parse amount (6 decimals)\n const amountBigInt = parseTokenAmount(amount, 6);\n\n // Calculate minimum amount with slippage\n const slippageMultiplier = BigInt(Math.floor((100 - slippageTolerance) * 100));\n const minAmountBigInt = (amountBigInt * slippageMultiplier) / 10000n;\n\n // Demo mode - return simulated result\n if (demoMode) {\n const fakeTxHash = `0x${\"a\".repeat(64)}` as `0x${string}`;\n const fakeGuid = `0x${\"b\".repeat(64)}` as `0x${string}`;\n const estimatedTime = ESTIMATED_BRIDGE_TIMES[toChain] || 300;\n\n return {\n txHash: fakeTxHash,\n messageGuid: fakeGuid,\n amount,\n fromChain: fromChain as SupportedNetwork,\n toChain: toChain as SupportedNetwork,\n estimatedTime,\n trackingUrl: getLayerZeroScanUrl(fakeGuid),\n };\n }\n\n // Create clients\n const chain = getViemChain(fromChain as SupportedNetwork);\n if (!chain) {\n throw new Error(`Unsupported chain: ${fromChain}`);\n }\n\n const transport = http(rpcUrl || DEFAULT_RPC_URLS[fromChain as SupportedNetwork]);\n const account = privateKeyToAccount(privateKey as `0x${string}`);\n\n const publicClient = createPublicClient({\n chain,\n transport,\n });\n\n const walletClient = createWalletClient({\n account,\n chain,\n transport,\n });\n\n // Check USDT0 balance\n const balance = (await publicClient.readContract({\n address: usdt0Address,\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [account.address],\n })) as bigint;\n\n if (balance < amountBigInt) {\n throw new Error(\n `Insufficient USDT0 balance. Have: ${balance.toString()}, Need: ${amountBigInt.toString()}`\n );\n }\n\n // Build send params\n const dstEid = LAYERZERO_ENDPOINT_IDS[toChain];\n const sendParam = {\n dstEid,\n to: addressToBytes32(recipient as Address),\n amountLD: amountBigInt,\n minAmountLD: minAmountBigInt,\n extraOptions: \"0x\" as `0x${string}`,\n composeMsg: \"0x\" as `0x${string}`,\n oftCmd: \"0x\" as `0x${string}`,\n };\n\n // Get quote\n const quote = (await publicClient.readContract({\n address: usdt0Address,\n abi: OFT_ABI,\n functionName: \"quoteSend\",\n args: [sendParam, false],\n })) as { nativeFee: bigint; lzTokenFee: bigint };\n\n // Add 10% buffer to fee\n const nativeFeeWithBuffer = (quote.nativeFee * 110n) / 100n;\n\n // Execute send\n const hash = await walletClient.writeContract({\n address: usdt0Address,\n abi: OFT_ABI,\n functionName: \"send\",\n args: [\n sendParam,\n { nativeFee: nativeFeeWithBuffer, lzTokenFee: 0n },\n account.address,\n ],\n value: nativeFeeWithBuffer,\n });\n\n // Wait for confirmation\n const receipt = await publicClient.waitForTransactionReceipt({ hash });\n\n if (receipt.status !== \"success\") {\n throw new Error(`Bridge transaction failed: ${hash}`);\n }\n\n // Extract message GUID from OFTSent event\n let messageGuid: `0x${string}` = \"0x\" as `0x${string}`;\n for (const log of receipt.logs) {\n if (log.topics[0] === OFT_SENT_EVENT_TOPIC && log.topics[1]) {\n messageGuid = log.topics[1] as `0x${string}`;\n break;\n }\n }\n\n if (messageGuid === \"0x\") {\n throw new Error(\"Failed to extract message GUID from transaction logs\");\n }\n\n const estimatedTime = ESTIMATED_BRIDGE_TIMES[toChain] || 300;\n\n return {\n txHash: hash,\n messageGuid,\n amount,\n fromChain: fromChain as SupportedNetwork,\n toChain: toChain as SupportedNetwork,\n estimatedTime,\n trackingUrl: getLayerZeroScanUrl(messageGuid),\n };\n}\n\n/**\n * Format bridge result for display\n */\nexport function formatBridgeResult(result: BridgeResult): string {\n const minutes = Math.ceil(result.estimatedTime / 60);\n\n return [\n `## Bridge Transaction Submitted`,\n \"\",\n `- **Route:** ${result.fromChain} → ${result.toChain}`,\n `- **Amount:** ${result.amount} USDT0`,\n `- **Transaction:** \\`${result.txHash}\\``,\n `- **Message GUID:** \\`${result.messageGuid}\\``,\n `- **Estimated Delivery:** ~${minutes} minutes`,\n \"\",\n `### Tracking`,\n `- [View on LayerZero Scan](${result.trackingUrl})`,\n `- [View Source TX](${getExplorerTxUrl(result.fromChain, result.txHash)})`,\n \"\",\n \"_Your USDT0 will arrive on ${result.toChain} once the LayerZero message is delivered._\",\n ].join(\"\\n\");\n}\n","/**\n * t402 MCP Tools - Export all payment tools\n */\n\n// Balance tools\nexport {\n getBalanceInputSchema,\n executeGetBalance,\n formatBalanceResult,\n type GetBalanceInput,\n} from \"./getBalance.js\";\n\nexport {\n getAllBalancesInputSchema,\n executeGetAllBalances,\n formatAllBalancesResult,\n type GetAllBalancesInput,\n type AllBalancesResult,\n} from \"./getAllBalances.js\";\n\n// Payment tools\nexport {\n payInputSchema,\n executePay,\n formatPaymentResult,\n type PayInput,\n type PayOptions,\n} from \"./pay.js\";\n\nexport {\n payGaslessInputSchema,\n executePayGasless,\n formatGaslessPaymentResult,\n GASLESS_SUPPORTED_NETWORKS,\n type PayGaslessInput,\n type PayGaslessOptions,\n} from \"./payGasless.js\";\n\n// Bridge tools\nexport {\n getBridgeFeeInputSchema,\n executeGetBridgeFee,\n formatBridgeFeeResult,\n type GetBridgeFeeInput,\n} from \"./getBridgeFee.js\";\n\nexport {\n bridgeInputSchema,\n executeBridge,\n formatBridgeResult,\n type BridgeInput,\n type BridgeOptions,\n} from \"./bridge.js\";\n\n/**\n * Tool definitions for MCP server registration\n */\nexport const TOOL_DEFINITIONS = {\n \"t402/getBalance\": {\n name: \"t402/getBalance\",\n description:\n \"Get token balances (native + stablecoins) for a wallet on a specific blockchain network. Returns ETH/native token balance plus USDC, USDT, and USDT0 balances where supported.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n network: {\n type: \"string\",\n enum: [\n \"ethereum\",\n \"base\",\n \"arbitrum\",\n \"optimism\",\n \"polygon\",\n \"avalanche\",\n \"ink\",\n \"berachain\",\n \"unichain\",\n ],\n description: \"Blockchain network to check balance on\",\n },\n address: {\n type: \"string\",\n pattern: \"^0x[a-fA-F0-9]{40}$\",\n description: \"Wallet address to check balance for\",\n },\n },\n required: [\"network\", \"address\"],\n },\n },\n\n \"t402/getAllBalances\": {\n name: \"t402/getAllBalances\",\n description:\n \"Get token balances across all supported networks for a wallet. Returns aggregated totals and per-network breakdown of native tokens and stablecoins (USDC, USDT, USDT0).\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n address: {\n type: \"string\",\n pattern: \"^0x[a-fA-F0-9]{40}$\",\n description: \"Wallet address to check balances for\",\n },\n networks: {\n type: \"array\",\n items: {\n type: \"string\",\n enum: [\n \"ethereum\",\n \"base\",\n \"arbitrum\",\n \"optimism\",\n \"polygon\",\n \"avalanche\",\n \"ink\",\n \"berachain\",\n \"unichain\",\n ],\n },\n description:\n \"Optional list of networks to check. If not provided, checks all supported networks.\",\n },\n },\n required: [\"address\"],\n },\n },\n\n \"t402/pay\": {\n name: \"t402/pay\",\n description:\n \"Execute a stablecoin payment on a specific blockchain network. Supports USDC, USDT, and USDT0 tokens. Requires a configured wallet with sufficient balance and native token for gas.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n to: {\n type: \"string\",\n pattern: \"^0x[a-fA-F0-9]{40}$\",\n description: \"Recipient address\",\n },\n amount: {\n type: \"string\",\n pattern: \"^\\\\d+(\\\\.\\\\d+)?$\",\n description: \"Amount to pay (e.g., '10.50' for 10.50 USDC)\",\n },\n token: {\n type: \"string\",\n enum: [\"USDC\", \"USDT\", \"USDT0\"],\n description: \"Token to use for payment\",\n },\n network: {\n type: \"string\",\n enum: [\n \"ethereum\",\n \"base\",\n \"arbitrum\",\n \"optimism\",\n \"polygon\",\n \"avalanche\",\n \"ink\",\n \"berachain\",\n \"unichain\",\n ],\n description: \"Network to execute payment on\",\n },\n memo: {\n type: \"string\",\n description: \"Optional memo/reference for the payment\",\n },\n },\n required: [\"to\", \"amount\", \"token\", \"network\"],\n },\n },\n\n \"t402/payGasless\": {\n name: \"t402/payGasless\",\n description:\n \"Execute a gasless stablecoin payment using ERC-4337 account abstraction. Gas fees are sponsored by a paymaster, so no ETH is needed for the transaction. Supported on select networks.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n to: {\n type: \"string\",\n pattern: \"^0x[a-fA-F0-9]{40}$\",\n description: \"Recipient address\",\n },\n amount: {\n type: \"string\",\n pattern: \"^\\\\d+(\\\\.\\\\d+)?$\",\n description: \"Amount to pay (e.g., '10.50' for 10.50 USDC)\",\n },\n token: {\n type: \"string\",\n enum: [\"USDC\", \"USDT\", \"USDT0\"],\n description: \"Token to use for payment\",\n },\n network: {\n type: \"string\",\n enum: [\"ethereum\", \"base\", \"arbitrum\", \"optimism\", \"polygon\", \"avalanche\"],\n description: \"Network to execute gasless payment on (must support ERC-4337)\",\n },\n },\n required: [\"to\", \"amount\", \"token\", \"network\"],\n },\n },\n\n \"t402/getBridgeFee\": {\n name: \"t402/getBridgeFee\",\n description:\n \"Get the fee quote for bridging USDT0 between chains using LayerZero OFT. Returns the native token fee required and estimated delivery time. Supported chains: ethereum, arbitrum, ink, berachain, unichain.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n fromChain: {\n type: \"string\",\n enum: [\"ethereum\", \"arbitrum\", \"ink\", \"berachain\", \"unichain\"],\n description: \"Source chain to bridge from\",\n },\n toChain: {\n type: \"string\",\n enum: [\"ethereum\", \"arbitrum\", \"ink\", \"berachain\", \"unichain\"],\n description: \"Destination chain to bridge to\",\n },\n amount: {\n type: \"string\",\n pattern: \"^\\\\d+(\\\\.\\\\d+)?$\",\n description: \"Amount of USDT0 to bridge (e.g., '100' for 100 USDT0)\",\n },\n recipient: {\n type: \"string\",\n pattern: \"^0x[a-fA-F0-9]{40}$\",\n description: \"Recipient address on destination chain\",\n },\n },\n required: [\"fromChain\", \"toChain\", \"amount\", \"recipient\"],\n },\n },\n\n \"t402/bridge\": {\n name: \"t402/bridge\",\n description:\n \"Bridge USDT0 between chains using LayerZero OFT standard. Executes a cross-chain transfer and returns the LayerZero message GUID for tracking. Supported chains: ethereum, arbitrum, ink, berachain, unichain.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n fromChain: {\n type: \"string\",\n enum: [\"ethereum\", \"arbitrum\", \"ink\", \"berachain\", \"unichain\"],\n description: \"Source chain to bridge from\",\n },\n toChain: {\n type: \"string\",\n enum: [\"ethereum\", \"arbitrum\", \"ink\", \"berachain\", \"unichain\"],\n description: \"Destination chain to bridge to\",\n },\n amount: {\n type: \"string\",\n pattern: \"^\\\\d+(\\\\.\\\\d+)?$\",\n description: \"Amount of USDT0 to bridge (e.g., '100' for 100 USDT0)\",\n },\n recipient: {\n type: \"string\",\n pattern: \"^0x[a-fA-F0-9]{40}$\",\n description: \"Recipient address on destination chain\",\n },\n },\n required: [\"fromChain\", \"toChain\", \"amount\", \"recipient\"],\n },\n },\n};\n"],"mappings":"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","names":["import_zod","import_zod","import_viem","chains","getViemChain","import_zod","import_viem","import_accounts","chains","getViemChain","import_zod","import_viem","chains","getViemChain","import_zod","import_viem","import_accounts","chains","LAYERZERO_ENDPOINT_IDS","ESTIMATED_BRIDGE_TIMES","OFT_ABI","getViemChain","addressToBytes32","estimatedTime"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/server/t402Server.ts","../../src/tools/getBalance.ts","../../src/constants.ts","../../src/tools/getAllBalances.ts","../../src/tools/pay.ts","../../src/tools/payGasless.ts","../../src/tools/getBridgeFee.ts","../../src/tools/bridge.ts","../../src/tools/index.ts"],"sourcesContent":["/**\n * @t402/mcp - MCP Server for AI Agent Payments\n *\n * This package provides a Model Context Protocol (MCP) server that enables\n * AI agents to make stablecoin payments across multiple blockchain networks.\n *\n * @example\n * ```typescript\n * import { createT402McpServer, loadConfigFromEnv } from '@t402/mcp';\n *\n * const config = loadConfigFromEnv();\n * const server = createT402McpServer(config);\n * await server.run();\n * ```\n *\n * @example Claude Desktop Configuration\n * ```json\n * {\n * \"mcpServers\": {\n * \"t402\": {\n * \"command\": \"npx\",\n * \"args\": [\"@t402/mcp\"],\n * \"env\": {\n * \"T402_PRIVATE_KEY\": \"0x...\",\n * \"T402_DEMO_MODE\": \"true\"\n * }\n * }\n * }\n * }\n * ```\n */\n\n// Server\nexport { T402McpServer, createT402McpServer, loadConfigFromEnv } from './server/index.js'\n\n// Tools\nexport {\n // Tool definitions\n TOOL_DEFINITIONS,\n // Balance tools\n getBalanceInputSchema,\n executeGetBalance,\n formatBalanceResult,\n getAllBalancesInputSchema,\n executeGetAllBalances,\n formatAllBalancesResult,\n // Payment tools\n payInputSchema,\n executePay,\n formatPaymentResult,\n payGaslessInputSchema,\n executePayGasless,\n formatGaslessPaymentResult,\n GASLESS_SUPPORTED_NETWORKS,\n // Bridge tools\n getBridgeFeeInputSchema,\n executeGetBridgeFee,\n formatBridgeFeeResult,\n bridgeInputSchema,\n executeBridge,\n formatBridgeResult,\n // Types\n type GetBalanceInput,\n type GetAllBalancesInput,\n type AllBalancesResult,\n type PayInput,\n type PayOptions,\n type PayGaslessInput,\n type PayGaslessOptions,\n type GetBridgeFeeInput,\n type BridgeInput,\n type BridgeOptions,\n} from './tools/index.js'\n\n// Types\nexport type {\n SupportedNetwork,\n TokenBalance,\n ChainBalance,\n PaymentParams,\n PaymentResult,\n GaslessPaymentResult,\n BridgeFeeQuote,\n BridgeResult,\n McpServerConfig,\n ToolContext,\n} from './types.js'\n\n// Constants\nexport {\n CHAIN_IDS,\n NATIVE_SYMBOLS,\n EXPLORER_URLS,\n DEFAULT_RPC_URLS,\n USDC_ADDRESSES,\n USDT_ADDRESSES,\n USDT0_ADDRESSES,\n BRIDGEABLE_CHAINS,\n getExplorerTxUrl,\n getLayerZeroScanUrl,\n supportsToken,\n getTokenAddress,\n formatTokenAmount,\n parseTokenAmount,\n} from './constants.js'\n","/**\n * t402 MCP Server - Main server implementation\n */\n\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js'\nimport type { McpServerConfig, SupportedNetwork } from '../types.js'\nimport {\n TOOL_DEFINITIONS,\n executeGetBalance,\n formatBalanceResult,\n getBalanceInputSchema,\n executeGetAllBalances,\n formatAllBalancesResult,\n getAllBalancesInputSchema,\n executePay,\n formatPaymentResult,\n payInputSchema,\n executePayGasless,\n formatGaslessPaymentResult,\n payGaslessInputSchema,\n executeGetBridgeFee,\n formatBridgeFeeResult,\n getBridgeFeeInputSchema,\n executeBridge,\n formatBridgeResult,\n bridgeInputSchema,\n} from '../tools/index.js'\n\n/**\n * t402 MCP Server\n *\n * Provides payment tools for AI agents via the Model Context Protocol.\n */\nexport class T402McpServer {\n private server: Server\n private config: McpServerConfig\n\n constructor(config: McpServerConfig = {}) {\n this.config = config\n this.server = new Server(\n {\n name: 't402',\n version: '1.0.0',\n },\n {\n capabilities: {\n tools: {},\n },\n },\n )\n\n this.setupHandlers()\n }\n\n /**\n * Set up MCP request handlers\n */\n private setupHandlers(): void {\n // List available tools\n this.server.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: Object.values(TOOL_DEFINITIONS),\n }\n })\n\n // Handle tool calls\n this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params\n\n try {\n switch (name) {\n case 't402/getBalance':\n return await this.handleGetBalance(args)\n\n case 't402/getAllBalances':\n return await this.handleGetAllBalances(args)\n\n case 't402/pay':\n return await this.handlePay(args)\n\n case 't402/payGasless':\n return await this.handlePayGasless(args)\n\n case 't402/getBridgeFee':\n return await this.handleGetBridgeFee(args)\n\n case 't402/bridge':\n return await this.handleBridge(args)\n\n default:\n throw new Error(`Unknown tool: ${name}`)\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return {\n content: [\n {\n type: 'text' as const,\n text: `Error: ${message}`,\n },\n ],\n isError: true,\n }\n }\n })\n }\n\n /**\n * Handle t402/getBalance\n */\n private async handleGetBalance(args: unknown) {\n const input = getBalanceInputSchema.parse(args)\n const result = await executeGetBalance(input, this.config.rpcUrls)\n return {\n content: [\n {\n type: 'text' as const,\n text: formatBalanceResult(result),\n },\n ],\n }\n }\n\n /**\n * Handle t402/getAllBalances\n */\n private async handleGetAllBalances(args: unknown) {\n const input = getAllBalancesInputSchema.parse(args)\n const result = await executeGetAllBalances(input, this.config.rpcUrls)\n return {\n content: [\n {\n type: 'text' as const,\n text: formatAllBalancesResult(result),\n },\n ],\n }\n }\n\n /**\n * Handle t402/pay\n */\n private async handlePay(args: unknown) {\n if (!this.config.privateKey && !this.config.demoMode) {\n throw new Error(\n 'Private key not configured. Set T402_PRIVATE_KEY environment variable or enable demo mode.',\n )\n }\n\n const input = payInputSchema.parse(args)\n const result = await executePay(input, {\n privateKey: this.config.privateKey || '0x',\n rpcUrl: this.config.rpcUrls?.[input.network as SupportedNetwork],\n demoMode: this.config.demoMode,\n })\n\n return {\n content: [\n {\n type: 'text' as const,\n text: formatPaymentResult(result),\n },\n ],\n }\n }\n\n /**\n * Handle t402/payGasless\n */\n private async handlePayGasless(args: unknown) {\n if (!this.config.privateKey && !this.config.demoMode) {\n throw new Error(\n 'Private key not configured. Set T402_PRIVATE_KEY environment variable or enable demo mode.',\n )\n }\n\n if (!this.config.bundlerUrl && !this.config.demoMode) {\n throw new Error(\n 'Bundler URL not configured. Set T402_BUNDLER_URL environment variable or enable demo mode.',\n )\n }\n\n if (!this.config.paymasterUrl && !this.config.demoMode) {\n throw new Error(\n 'Paymaster URL not configured. Set T402_PAYMASTER_URL environment variable or enable demo mode.',\n )\n }\n\n const input = payGaslessInputSchema.parse(args)\n const result = await executePayGasless(input, {\n privateKey: this.config.privateKey || '0x',\n bundlerUrl: this.config.bundlerUrl || '',\n paymasterUrl: this.config.paymasterUrl || '',\n rpcUrl: this.config.rpcUrls?.[input.network as SupportedNetwork],\n demoMode: this.config.demoMode,\n })\n\n return {\n content: [\n {\n type: 'text' as const,\n text: formatGaslessPaymentResult(result),\n },\n ],\n }\n }\n\n /**\n * Handle t402/getBridgeFee\n */\n private async handleGetBridgeFee(args: unknown) {\n const input = getBridgeFeeInputSchema.parse(args)\n const result = await executeGetBridgeFee(input, this.config.rpcUrls)\n return {\n content: [\n {\n type: 'text' as const,\n text: formatBridgeFeeResult(result),\n },\n ],\n }\n }\n\n /**\n * Handle t402/bridge\n */\n private async handleBridge(args: unknown) {\n if (!this.config.privateKey && !this.config.demoMode) {\n throw new Error(\n 'Private key not configured. Set T402_PRIVATE_KEY environment variable or enable demo mode.',\n )\n }\n\n const input = bridgeInputSchema.parse(args)\n const result = await executeBridge(input, {\n privateKey: this.config.privateKey || '0x',\n rpcUrl: this.config.rpcUrls?.[input.fromChain as SupportedNetwork],\n demoMode: this.config.demoMode,\n })\n\n return {\n content: [\n {\n type: 'text' as const,\n text: formatBridgeResult(result),\n },\n ],\n }\n }\n\n /**\n * Start the server using stdio transport\n */\n async run(): Promise<void> {\n const transport = new StdioServerTransport()\n await this.server.connect(transport)\n console.error('t402 MCP Server running on stdio')\n }\n}\n\n/**\n * Create a new t402 MCP server instance\n */\nexport function createT402McpServer(config?: McpServerConfig): T402McpServer {\n return new T402McpServer(config)\n}\n\n/**\n * Load configuration from environment variables\n */\nexport function loadConfigFromEnv(): McpServerConfig {\n const config: McpServerConfig = {}\n\n // Private key\n if (process.env.T402_PRIVATE_KEY) {\n config.privateKey = process.env.T402_PRIVATE_KEY\n }\n\n // Demo mode\n if (process.env.T402_DEMO_MODE === 'true') {\n config.demoMode = true\n }\n\n // ERC-4337 configuration\n if (process.env.T402_BUNDLER_URL) {\n config.bundlerUrl = process.env.T402_BUNDLER_URL\n }\n if (process.env.T402_PAYMASTER_URL) {\n config.paymasterUrl = process.env.T402_PAYMASTER_URL\n }\n\n // Custom RPC URLs\n const rpcUrls: Partial<Record<SupportedNetwork, string>> = {}\n const networks: SupportedNetwork[] = [\n 'ethereum',\n 'base',\n 'arbitrum',\n 'optimism',\n 'polygon',\n 'avalanche',\n 'ink',\n 'berachain',\n 'unichain',\n ]\n\n for (const network of networks) {\n const envVar = `T402_RPC_${network.toUpperCase()}`\n if (process.env[envVar]) {\n rpcUrls[network] = process.env[envVar]\n }\n }\n\n if (Object.keys(rpcUrls).length > 0) {\n config.rpcUrls = rpcUrls\n }\n\n return config\n}\n","/**\n * t402/getBalance - Get token balance for a specific network\n */\n\nimport { z } from 'zod'\nimport { createPublicClient, http, formatEther, formatUnits, type Address } from 'viem'\nimport * as chains from 'viem/chains'\nimport type { SupportedNetwork, TokenBalance, ChainBalance } from '../types.js'\nimport {\n CHAIN_IDS,\n NATIVE_SYMBOLS,\n DEFAULT_RPC_URLS,\n USDC_ADDRESSES,\n USDT_ADDRESSES,\n USDT0_ADDRESSES,\n ERC20_ABI,\n} from '../constants.js'\n\n/**\n * Input schema for getBalance tool\n */\nexport const getBalanceInputSchema = z.object({\n network: z\n .enum([\n 'ethereum',\n 'base',\n 'arbitrum',\n 'optimism',\n 'polygon',\n 'avalanche',\n 'ink',\n 'berachain',\n 'unichain',\n ])\n .describe('Blockchain network to check balance on'),\n address: z\n .string()\n .regex(/^0x[a-fA-F0-9]{40}$/)\n .describe('Wallet address to check balance for'),\n})\n\nexport type GetBalanceInput = z.infer<typeof getBalanceInputSchema>\n\n/**\n * Get the viem chain configuration for a network\n */\nfunction getViemChain(network: SupportedNetwork) {\n switch (network) {\n case 'ethereum':\n return chains.mainnet\n case 'base':\n return chains.base\n case 'arbitrum':\n return chains.arbitrum\n case 'optimism':\n return chains.optimism\n case 'polygon':\n return chains.polygon\n case 'avalanche':\n return chains.avalanche\n case 'ink':\n return chains.ink\n case 'berachain':\n return chains.berachain\n case 'unichain':\n return chains.unichain\n default:\n return chains.mainnet\n }\n}\n\n/**\n * Get token balance for an address\n */\nasync function getTokenBalance(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n client: any,\n tokenAddress: Address,\n walletAddress: Address,\n): Promise<TokenBalance | null> {\n try {\n const [balance, decimals, symbol] = await Promise.all([\n client.readContract({\n address: tokenAddress,\n abi: ERC20_ABI,\n functionName: 'balanceOf',\n args: [walletAddress],\n }) as Promise<bigint>,\n client.readContract({\n address: tokenAddress,\n abi: ERC20_ABI,\n functionName: 'decimals',\n }) as Promise<number>,\n client.readContract({\n address: tokenAddress,\n abi: ERC20_ABI,\n functionName: 'symbol',\n }) as Promise<string>,\n ])\n\n return {\n symbol,\n address: tokenAddress,\n balance: balance.toString(),\n formatted: formatUnits(balance, decimals),\n decimals,\n }\n } catch {\n return null\n }\n}\n\n/**\n * Execute getBalance tool\n */\nexport async function executeGetBalance(\n input: GetBalanceInput,\n rpcUrls?: Partial<Record<SupportedNetwork, string>>,\n): Promise<ChainBalance> {\n const { network, address } = input\n const walletAddress = address as Address\n\n const rpcUrl = rpcUrls?.[network] || DEFAULT_RPC_URLS[network]\n const chain = getViemChain(network)\n\n const client = createPublicClient({\n chain,\n transport: http(rpcUrl),\n })\n\n // Get native balance\n const nativeBalance = await client.getBalance({ address: walletAddress })\n\n // Get token balances\n const tokenAddresses: { token: Address; expected: string }[] = []\n\n if (USDC_ADDRESSES[network]) {\n tokenAddresses.push({ token: USDC_ADDRESSES[network]!, expected: 'USDC' })\n }\n if (USDT_ADDRESSES[network]) {\n tokenAddresses.push({ token: USDT_ADDRESSES[network]!, expected: 'USDT' })\n }\n if (USDT0_ADDRESSES[network]) {\n tokenAddresses.push({ token: USDT0_ADDRESSES[network]!, expected: 'USDT0' })\n }\n\n const tokenBalances = await Promise.all(\n tokenAddresses.map(({ token }) => getTokenBalance(client, token, walletAddress)),\n )\n\n const tokens = tokenBalances.filter((t): t is TokenBalance => t !== null)\n\n return {\n network,\n chainId: CHAIN_IDS[network],\n native: {\n symbol: NATIVE_SYMBOLS[network],\n balance: nativeBalance.toString(),\n formatted: formatEther(nativeBalance),\n },\n tokens,\n }\n}\n\n/**\n * Format balance result for display\n */\nexport function formatBalanceResult(balance: ChainBalance): string {\n const lines: string[] = [\n `## Balance on ${balance.network} (Chain ID: ${balance.chainId})`,\n '',\n `### Native Token`,\n `- ${balance.native.symbol}: ${balance.native.formatted}`,\n '',\n ]\n\n if (balance.tokens.length > 0) {\n lines.push('### Stablecoins')\n for (const token of balance.tokens) {\n lines.push(`- ${token.symbol}: ${token.formatted}`)\n }\n } else {\n lines.push('_No stablecoin balances found_')\n }\n\n return lines.join('\\n')\n}\n","/**\n * Constants and network configurations for t402 MCP Server\n */\n\nimport type { Address } from 'viem'\nimport type { SupportedNetwork } from './types.js'\n\n/**\n * Chain IDs by network\n */\nexport const CHAIN_IDS: Record<SupportedNetwork, number> = {\n ethereum: 1,\n base: 8453,\n arbitrum: 42161,\n optimism: 10,\n polygon: 137,\n avalanche: 43114,\n ink: 57073,\n berachain: 80094,\n unichain: 130,\n}\n\n/**\n * Native token symbols by network\n */\nexport const NATIVE_SYMBOLS: Record<SupportedNetwork, string> = {\n ethereum: 'ETH',\n base: 'ETH',\n arbitrum: 'ETH',\n optimism: 'ETH',\n polygon: 'MATIC',\n avalanche: 'AVAX',\n ink: 'ETH',\n berachain: 'BERA',\n unichain: 'ETH',\n}\n\n/**\n * Block explorer URLs by network\n */\nexport const EXPLORER_URLS: Record<SupportedNetwork, string> = {\n ethereum: 'https://etherscan.io',\n base: 'https://basescan.org',\n arbitrum: 'https://arbiscan.io',\n optimism: 'https://optimistic.etherscan.io',\n polygon: 'https://polygonscan.com',\n avalanche: 'https://snowtrace.io',\n ink: 'https://explorer.inkonchain.com',\n berachain: 'https://berascan.com',\n unichain: 'https://unichain.blockscout.com',\n}\n\n/**\n * Default RPC URLs by network (public endpoints)\n */\nexport const DEFAULT_RPC_URLS: Record<SupportedNetwork, string> = {\n ethereum: 'https://eth.llamarpc.com',\n base: 'https://mainnet.base.org',\n arbitrum: 'https://arb1.arbitrum.io/rpc',\n optimism: 'https://mainnet.optimism.io',\n polygon: 'https://polygon-rpc.com',\n avalanche: 'https://api.avax.network/ext/bc/C/rpc',\n ink: 'https://rpc-gel.inkonchain.com',\n berachain: 'https://rpc.berachain.com',\n unichain: 'https://mainnet.unichain.org',\n}\n\n/**\n * USDC contract addresses by network\n */\nexport const USDC_ADDRESSES: Partial<Record<SupportedNetwork, Address>> = {\n ethereum: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n base: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n arbitrum: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',\n optimism: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',\n polygon: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n avalanche: '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E',\n}\n\n/**\n * USDT contract addresses by network\n */\nexport const USDT_ADDRESSES: Partial<Record<SupportedNetwork, Address>> = {\n ethereum: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\n arbitrum: '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9',\n polygon: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F',\n avalanche: '0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7',\n optimism: '0x94b008aA00579c1307B0EF2c499aD98a8ce58e58',\n}\n\n/**\n * USDT0 (LayerZero OFT) contract addresses by network\n */\nexport const USDT0_ADDRESSES: Partial<Record<SupportedNetwork, Address>> = {\n ethereum: '0x6C96dE32CEa08842dcc4058c14d3aaAD7Fa41dee',\n arbitrum: '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9',\n ink: '0x0200C29006150606B650577BBE7B6248F58470c1',\n berachain: '0x779Ded0c9e1022225f8E0630b35a9b54bE713736',\n unichain: '0x9151434b16b9763660705744891fA906F660EcC5',\n}\n\n/**\n * Chains that support USDT0 bridging\n */\nexport const BRIDGEABLE_CHAINS: SupportedNetwork[] = [\n 'ethereum',\n 'arbitrum',\n 'ink',\n 'berachain',\n 'unichain',\n]\n\n/**\n * ERC20 ABI for balance and transfer operations\n */\nexport const ERC20_ABI = [\n {\n name: 'balanceOf',\n type: 'function',\n stateMutability: 'view',\n inputs: [{ name: 'account', type: 'address' }],\n outputs: [{ name: '', type: 'uint256' }],\n },\n {\n name: 'decimals',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ name: '', type: 'uint8' }],\n },\n {\n name: 'symbol',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ name: '', type: 'string' }],\n },\n {\n name: 'transfer',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { name: 'to', type: 'address' },\n { name: 'amount', type: 'uint256' },\n ],\n outputs: [{ name: '', type: 'bool' }],\n },\n {\n name: 'approve',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { name: 'spender', type: 'address' },\n { name: 'amount', type: 'uint256' },\n ],\n outputs: [{ name: '', type: 'bool' }],\n },\n {\n name: 'allowance',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { name: 'owner', type: 'address' },\n { name: 'spender', type: 'address' },\n ],\n outputs: [{ name: '', type: 'uint256' }],\n },\n] as const\n\n/**\n * Get explorer URL for a transaction\n */\nexport function getExplorerTxUrl(network: SupportedNetwork, txHash: string): string {\n return `${EXPLORER_URLS[network]}/tx/${txHash}`\n}\n\n/**\n * Get LayerZero Scan URL for a message\n */\nexport function getLayerZeroScanUrl(messageGuid: string): string {\n return `https://layerzeroscan.com/tx/${messageGuid}`\n}\n\n/**\n * Check if a network supports a specific token\n */\nexport function supportsToken(\n network: SupportedNetwork,\n token: 'USDC' | 'USDT' | 'USDT0',\n): boolean {\n switch (token) {\n case 'USDC':\n return network in USDC_ADDRESSES\n case 'USDT':\n return network in USDT_ADDRESSES\n case 'USDT0':\n return network in USDT0_ADDRESSES\n default:\n return false\n }\n}\n\n/**\n * Get token address for a network\n */\nexport function getTokenAddress(\n network: SupportedNetwork,\n token: 'USDC' | 'USDT' | 'USDT0',\n): Address | undefined {\n switch (token) {\n case 'USDC':\n return USDC_ADDRESSES[network]\n case 'USDT':\n return USDT_ADDRESSES[network]\n case 'USDT0':\n return USDT0_ADDRESSES[network]\n default:\n return undefined\n }\n}\n\n/**\n * Format token amount for display\n */\nexport function formatTokenAmount(amount: bigint, decimals: number, symbol: string): string {\n const divisor = BigInt(10 ** decimals)\n const wholePart = amount / divisor\n const fractionalPart = amount % divisor\n const fractionalStr = fractionalPart.toString().padStart(decimals, '0')\n const trimmedFractional = fractionalStr.replace(/0+$/, '') || '0'\n\n if (trimmedFractional === '0') {\n return `${wholePart} ${symbol}`\n }\n return `${wholePart}.${trimmedFractional} ${symbol}`\n}\n\n/**\n * Parse token amount from string to bigint\n */\nexport function parseTokenAmount(amount: string, decimals: number): bigint {\n const [wholePart, fractionalPart = ''] = amount.split('.')\n const paddedFractional = fractionalPart.padEnd(decimals, '0').slice(0, decimals)\n return BigInt(wholePart + paddedFractional)\n}\n","/**\n * t402/getAllBalances - Get token balances across all supported networks\n */\n\nimport { z } from 'zod'\nimport type { SupportedNetwork, ChainBalance } from '../types.js'\nimport { executeGetBalance } from './getBalance.js'\n\n/**\n * Input schema for getAllBalances tool\n */\nexport const getAllBalancesInputSchema = z.object({\n address: z\n .string()\n .regex(/^0x[a-fA-F0-9]{40}$/)\n .describe('Wallet address to check balances for'),\n networks: z\n .array(\n z.enum([\n 'ethereum',\n 'base',\n 'arbitrum',\n 'optimism',\n 'polygon',\n 'avalanche',\n 'ink',\n 'berachain',\n 'unichain',\n ]),\n )\n .optional()\n .describe(\n 'Optional list of networks to check. If not provided, checks all supported networks.',\n ),\n})\n\nexport type GetAllBalancesInput = z.infer<typeof getAllBalancesInputSchema>\n\n/**\n * All supported networks\n */\nconst ALL_NETWORKS: SupportedNetwork[] = [\n 'ethereum',\n 'base',\n 'arbitrum',\n 'optimism',\n 'polygon',\n 'avalanche',\n 'ink',\n 'berachain',\n 'unichain',\n]\n\n/**\n * Result of getAllBalances\n */\nexport interface AllBalancesResult {\n address: string\n balances: ChainBalance[]\n totalUsdcBalance: string\n totalUsdtBalance: string\n summary: string\n}\n\n/**\n * Execute getAllBalances tool\n */\nexport async function executeGetAllBalances(\n input: GetAllBalancesInput,\n rpcUrls?: Partial<Record<SupportedNetwork, string>>,\n): Promise<AllBalancesResult> {\n const { address, networks = ALL_NETWORKS } = input\n\n // Fetch balances from all networks in parallel\n const balancePromises = networks.map((network) =>\n executeGetBalance({ network, address }, rpcUrls).catch((error) => {\n console.error(`Failed to fetch balance for ${network}:`, error)\n return null\n }),\n )\n\n const results = await Promise.all(balancePromises)\n const balances = results.filter((b): b is ChainBalance => b !== null)\n\n // Calculate total stablecoin balances\n let totalUsdc = 0n\n let totalUsdt = 0n\n\n for (const balance of balances) {\n for (const token of balance.tokens) {\n if (token.symbol === 'USDC') {\n totalUsdc += BigInt(token.balance)\n } else if (token.symbol === 'USDT' || token.symbol === 'USDT0') {\n totalUsdt += BigInt(token.balance)\n }\n }\n }\n\n // Format totals (assuming 6 decimals for USDC/USDT)\n const formatTotal = (amount: bigint): string => {\n const divisor = BigInt(10 ** 6)\n const whole = amount / divisor\n const fraction = amount % divisor\n const fractionStr = fraction.toString().padStart(6, '0').replace(/0+$/, '')\n return fractionStr ? `${whole}.${fractionStr}` : whole.toString()\n }\n\n const totalUsdcFormatted = formatTotal(totalUsdc)\n const totalUsdtFormatted = formatTotal(totalUsdt)\n\n // Create summary\n const chainsWithBalance = balances.filter(\n (b) => b.tokens.some((t) => BigInt(t.balance) > 0n) || BigInt(b.native.balance) > 0n,\n )\n\n const summary = [\n `Found balances on ${chainsWithBalance.length} of ${balances.length} networks checked.`,\n `Total USDC: ${totalUsdcFormatted}`,\n `Total USDT: ${totalUsdtFormatted}`,\n ].join(' ')\n\n return {\n address,\n balances,\n totalUsdcBalance: totalUsdcFormatted,\n totalUsdtBalance: totalUsdtFormatted,\n summary,\n }\n}\n\n/**\n * Format all balances result for display\n */\nexport function formatAllBalancesResult(result: AllBalancesResult): string {\n const lines: string[] = [\n `## Multi-Chain Balance Summary`,\n `**Address:** \\`${result.address}\\``,\n '',\n `### Totals`,\n `- **Total USDC:** ${result.totalUsdcBalance}`,\n `- **Total USDT:** ${result.totalUsdtBalance}`,\n '',\n `### By Network`,\n '',\n ]\n\n for (const balance of result.balances) {\n const hasBalance =\n balance.tokens.some((t) => BigInt(t.balance) > 0n) || BigInt(balance.native.balance) > 0n\n\n if (!hasBalance) continue\n\n lines.push(`#### ${balance.network}`)\n lines.push(`- ${balance.native.symbol}: ${balance.native.formatted}`)\n for (const token of balance.tokens) {\n if (BigInt(token.balance) > 0n) {\n lines.push(`- ${token.symbol}: ${token.formatted}`)\n }\n }\n lines.push('')\n }\n\n // List networks with no balance\n const emptyNetworks = result.balances.filter(\n (b) => !b.tokens.some((t) => BigInt(t.balance) > 0n) && BigInt(b.native.balance) === 0n,\n )\n\n if (emptyNetworks.length > 0) {\n lines.push(`_No balance on: ${emptyNetworks.map((n) => n.network).join(', ')}_`)\n }\n\n return lines.join('\\n')\n}\n","/**\n * t402/pay - Execute a payment on a specific network\n */\n\nimport { z } from 'zod'\nimport { createPublicClient, createWalletClient, http, parseUnits, type Address } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport * as chains from 'viem/chains'\nimport type { SupportedNetwork, PaymentResult } from '../types.js'\nimport {\n DEFAULT_RPC_URLS,\n ERC20_ABI,\n getTokenAddress,\n getExplorerTxUrl,\n supportsToken,\n} from '../constants.js'\n\n/**\n * Input schema for pay tool\n */\nexport const payInputSchema = z.object({\n to: z\n .string()\n .regex(/^0x[a-fA-F0-9]{40}$/)\n .describe('Recipient address'),\n amount: z\n .string()\n .regex(/^\\d+(\\.\\d+)?$/)\n .describe(\"Amount to pay (e.g., '10.50' for 10.50 USDC)\"),\n token: z.enum(['USDC', 'USDT', 'USDT0']).describe('Token to use for payment'),\n network: z\n .enum([\n 'ethereum',\n 'base',\n 'arbitrum',\n 'optimism',\n 'polygon',\n 'avalanche',\n 'ink',\n 'berachain',\n 'unichain',\n ])\n .describe('Network to execute payment on'),\n memo: z.string().optional().describe('Optional memo/reference for the payment'),\n})\n\nexport type PayInput = z.infer<typeof payInputSchema>\n\n/**\n * Get the viem chain configuration for a network\n */\nfunction getViemChain(network: SupportedNetwork) {\n switch (network) {\n case 'ethereum':\n return chains.mainnet\n case 'base':\n return chains.base\n case 'arbitrum':\n return chains.arbitrum\n case 'optimism':\n return chains.optimism\n case 'polygon':\n return chains.polygon\n case 'avalanche':\n return chains.avalanche\n case 'ink':\n return chains.ink\n case 'berachain':\n return chains.berachain\n case 'unichain':\n return chains.unichain\n default:\n return chains.mainnet\n }\n}\n\n/**\n * Options for executing payment\n */\nexport interface PayOptions {\n /** Private key for signing (hex with 0x prefix) */\n privateKey: string\n /** Custom RPC URL */\n rpcUrl?: string\n /** Demo mode - simulate without executing */\n demoMode?: boolean\n}\n\n/**\n * Execute pay tool\n */\nexport async function executePay(input: PayInput, options: PayOptions): Promise<PaymentResult> {\n const { to, amount, token, network, memo: _memo } = input\n const { privateKey, rpcUrl, demoMode } = options\n\n // Validate token support on network\n if (!supportsToken(network, token)) {\n throw new Error(`Token ${token} is not supported on ${network}`)\n }\n\n const tokenAddress = getTokenAddress(network, token)\n if (!tokenAddress) {\n throw new Error(`Could not find ${token} address for ${network}`)\n }\n\n // Parse amount (USDC/USDT use 6 decimals)\n const decimals = 6\n const amountBigInt = parseUnits(amount, decimals)\n\n // Demo mode - return simulated result\n if (demoMode) {\n const fakeTxHash = `0x${'0'.repeat(64)}` as `0x${string}`\n return {\n txHash: fakeTxHash,\n network,\n amount,\n token,\n to: to as Address,\n explorerUrl: getExplorerTxUrl(network, fakeTxHash),\n }\n }\n\n // Create clients\n const chain = getViemChain(network)\n const transport = http(rpcUrl || DEFAULT_RPC_URLS[network])\n\n const account = privateKeyToAccount(privateKey as `0x${string}`)\n\n const publicClient = createPublicClient({\n chain,\n transport,\n })\n\n const walletClient = createWalletClient({\n account,\n chain,\n transport,\n })\n\n // Check balance\n const balance = (await publicClient.readContract({\n address: tokenAddress,\n abi: ERC20_ABI,\n functionName: 'balanceOf',\n args: [account.address],\n })) as bigint\n\n if (balance < amountBigInt) {\n throw new Error(\n `Insufficient ${token} balance. Have: ${balance.toString()}, Need: ${amountBigInt.toString()}`,\n )\n }\n\n // Execute transfer\n const hash = await walletClient.writeContract({\n address: tokenAddress,\n abi: ERC20_ABI,\n functionName: 'transfer',\n args: [to as Address, amountBigInt],\n })\n\n // Wait for confirmation\n const receipt = await publicClient.waitForTransactionReceipt({ hash })\n\n if (receipt.status !== 'success') {\n throw new Error(`Transaction failed: ${hash}`)\n }\n\n return {\n txHash: hash,\n network,\n amount,\n token,\n to: to as Address,\n explorerUrl: getExplorerTxUrl(network, hash),\n }\n}\n\n/**\n * Format payment result for display\n */\nexport function formatPaymentResult(result: PaymentResult): string {\n return [\n `## Payment Successful`,\n '',\n `- **Amount:** ${result.amount} ${result.token}`,\n `- **To:** \\`${result.to}\\``,\n `- **Network:** ${result.network}`,\n `- **Transaction:** \\`${result.txHash}\\``,\n '',\n `[View on Explorer](${result.explorerUrl})`,\n ].join('\\n')\n}\n","/**\n * t402/payGasless - Execute a gasless payment using ERC-4337\n */\n\nimport { z } from 'zod'\nimport { createPublicClient, http, parseUnits, encodeFunctionData, type Address } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport * as chains from 'viem/chains'\nimport type { SupportedNetwork, GaslessPaymentResult } from '../types.js'\nimport {\n DEFAULT_RPC_URLS,\n ERC20_ABI,\n getTokenAddress,\n getExplorerTxUrl,\n supportsToken,\n} from '../constants.js'\n\n/**\n * Input schema for payGasless tool\n */\nexport const payGaslessInputSchema = z.object({\n to: z\n .string()\n .regex(/^0x[a-fA-F0-9]{40}$/)\n .describe('Recipient address'),\n amount: z\n .string()\n .regex(/^\\d+(\\.\\d+)?$/)\n .describe(\"Amount to pay (e.g., '10.50' for 10.50 USDC)\"),\n token: z.enum(['USDC', 'USDT', 'USDT0']).describe('Token to use for payment'),\n network: z\n .enum(['ethereum', 'base', 'arbitrum', 'optimism', 'polygon', 'avalanche'])\n .describe('Network to execute gasless payment on (must support ERC-4337)'),\n})\n\nexport type PayGaslessInput = z.infer<typeof payGaslessInputSchema>\n\n/**\n * Networks that support ERC-4337 gasless transactions\n */\nexport const GASLESS_SUPPORTED_NETWORKS: SupportedNetwork[] = [\n 'ethereum',\n 'base',\n 'arbitrum',\n 'optimism',\n 'polygon',\n 'avalanche',\n]\n\n/**\n * Get the viem chain configuration for a network\n */\nfunction getViemChain(network: SupportedNetwork) {\n switch (network) {\n case 'ethereum':\n return chains.mainnet\n case 'base':\n return chains.base\n case 'arbitrum':\n return chains.arbitrum\n case 'optimism':\n return chains.optimism\n case 'polygon':\n return chains.polygon\n case 'avalanche':\n return chains.avalanche\n case 'ink':\n return chains.ink\n case 'berachain':\n return chains.berachain\n case 'unichain':\n return chains.unichain\n default:\n return chains.mainnet\n }\n}\n\n/**\n * Options for executing gasless payment\n */\nexport interface PayGaslessOptions {\n /** Private key for signing (hex with 0x prefix) */\n privateKey: string\n /** Bundler URL for ERC-4337 */\n bundlerUrl: string\n /** Paymaster URL for sponsoring gas */\n paymasterUrl: string\n /** Custom RPC URL */\n rpcUrl?: string\n /** Demo mode - simulate without executing */\n demoMode?: boolean\n}\n\n/**\n * User operation structure (simplified)\n */\ninterface UserOperation {\n sender: Address\n nonce: bigint\n initCode: `0x${string}`\n callData: `0x${string}`\n callGasLimit: bigint\n verificationGasLimit: bigint\n preVerificationGas: bigint\n maxFeePerGas: bigint\n maxPriorityFeePerGas: bigint\n paymasterAndData: `0x${string}`\n signature: `0x${string}`\n}\n\n/**\n * Execute payGasless tool\n */\nexport async function executePayGasless(\n input: PayGaslessInput,\n options: PayGaslessOptions,\n): Promise<GaslessPaymentResult> {\n const { to, amount, token, network } = input\n const { privateKey, bundlerUrl, paymasterUrl: _paymasterUrl, rpcUrl, demoMode } = options\n\n // Validate network supports gasless\n if (!GASLESS_SUPPORTED_NETWORKS.includes(network)) {\n throw new Error(\n `Network ${network} does not support ERC-4337 gasless transactions. Supported: ${GASLESS_SUPPORTED_NETWORKS.join(', ')}`,\n )\n }\n\n // Validate token support on network\n if (!supportsToken(network, token)) {\n throw new Error(`Token ${token} is not supported on ${network}`)\n }\n\n const tokenAddress = getTokenAddress(network, token)\n if (!tokenAddress) {\n throw new Error(`Could not find ${token} address for ${network}`)\n }\n\n // Parse amount (USDC/USDT use 6 decimals)\n const decimals = 6\n const amountBigInt = parseUnits(amount, decimals)\n\n // Demo mode - return simulated result\n if (demoMode) {\n const fakeTxHash = `0x${'1'.repeat(64)}` as `0x${string}`\n const fakeUserOpHash = `0x${'2'.repeat(64)}` as `0x${string}`\n return {\n txHash: fakeTxHash,\n userOpHash: fakeUserOpHash,\n network,\n amount,\n token,\n to: to as Address,\n explorerUrl: getExplorerTxUrl(network, fakeTxHash),\n paymaster: 'demo-paymaster',\n }\n }\n\n // Create clients\n const chain = getViemChain(network)\n const transport = http(rpcUrl || DEFAULT_RPC_URLS[network])\n\n const account = privateKeyToAccount(privateKey as `0x${string}`)\n\n const publicClient = createPublicClient({\n chain,\n transport,\n })\n\n // Encode the transfer call data\n const callData = encodeFunctionData({\n abi: ERC20_ABI,\n functionName: 'transfer',\n args: [to as Address, amountBigInt],\n })\n\n // Build user operation\n // Note: In production, this would integrate with a full ERC-4337 bundler\n const nonce = await publicClient.getTransactionCount({\n address: account.address,\n })\n\n const gasPrice = await publicClient.getGasPrice()\n\n const userOp: UserOperation = {\n sender: account.address,\n nonce: BigInt(nonce),\n initCode: '0x',\n callData: callData as `0x${string}`,\n callGasLimit: 100000n,\n verificationGasLimit: 100000n,\n preVerificationGas: 50000n,\n maxFeePerGas: gasPrice,\n maxPriorityFeePerGas: gasPrice / 10n,\n paymasterAndData: '0x', // Would be filled by paymaster\n signature: '0x',\n }\n\n // In production, this would:\n // 1. Request paymaster sponsorship from paymasterUrl\n // 2. Sign the user operation\n // 3. Submit to bundler at bundlerUrl\n // 4. Wait for user operation to be included\n\n // For now, send as regular transaction with sponsorship note\n const response = await fetch(bundlerUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'eth_sendUserOperation',\n params: [userOp, chain.id],\n }),\n })\n\n if (!response.ok) {\n throw new Error(`Bundler request failed: ${response.statusText}`)\n }\n\n const result = (await response.json()) as {\n error?: { message: string }\n result?: string\n }\n\n if (result.error) {\n throw new Error(`Bundler error: ${result.error.message}`)\n }\n\n const userOpHash = result.result as string\n\n // Poll for receipt\n let receipt: { transactionHash: string } | null = null\n for (let i = 0; i < 30; i++) {\n const receiptResponse = await fetch(bundlerUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'eth_getUserOperationReceipt',\n params: [userOpHash],\n }),\n })\n\n const receiptResult = (await receiptResponse.json()) as {\n result?: { transactionHash: string }\n }\n if (receiptResult.result) {\n receipt = receiptResult.result\n break\n }\n\n await new Promise((resolve) => setTimeout(resolve, 2000))\n }\n\n if (!receipt) {\n throw new Error('Timeout waiting for user operation receipt')\n }\n\n return {\n txHash: receipt.transactionHash,\n userOpHash,\n network,\n amount,\n token,\n to: to as Address,\n explorerUrl: getExplorerTxUrl(network, receipt.transactionHash),\n }\n}\n\n/**\n * Format gasless payment result for display\n */\nexport function formatGaslessPaymentResult(result: GaslessPaymentResult): string {\n const lines = [\n `## Gasless Payment Successful`,\n '',\n `- **Amount:** ${result.amount} ${result.token}`,\n `- **To:** \\`${result.to}\\``,\n `- **Network:** ${result.network}`,\n `- **Transaction:** \\`${result.txHash}\\``,\n `- **UserOp Hash:** \\`${result.userOpHash}\\``,\n ]\n\n if (result.paymaster) {\n lines.push(`- **Paymaster:** ${result.paymaster}`)\n }\n\n lines.push('')\n lines.push(`[View on Explorer](${result.explorerUrl})`)\n lines.push('')\n lines.push('_Gas fees were sponsored - no ETH was deducted from your wallet._')\n\n return lines.join('\\n')\n}\n","/**\n * t402/getBridgeFee - Get fee quote for bridging USDT0 between chains\n */\n\nimport { z } from 'zod'\nimport { createPublicClient, http, formatEther, type Address } from 'viem'\nimport * as chains from 'viem/chains'\nimport type { SupportedNetwork, BridgeFeeQuote } from '../types.js'\nimport {\n DEFAULT_RPC_URLS,\n BRIDGEABLE_CHAINS,\n USDT0_ADDRESSES,\n NATIVE_SYMBOLS,\n parseTokenAmount,\n} from '../constants.js'\n\n/**\n * Input schema for getBridgeFee tool\n */\nexport const getBridgeFeeInputSchema = z.object({\n fromChain: z\n .enum(['ethereum', 'arbitrum', 'ink', 'berachain', 'unichain'])\n .describe('Source chain to bridge from'),\n toChain: z\n .enum(['ethereum', 'arbitrum', 'ink', 'berachain', 'unichain'])\n .describe('Destination chain to bridge to'),\n amount: z\n .string()\n .regex(/^\\d+(\\.\\d+)?$/)\n .describe(\"Amount of USDT0 to bridge (e.g., '100' for 100 USDT0)\"),\n recipient: z\n .string()\n .regex(/^0x[a-fA-F0-9]{40}$/)\n .describe('Recipient address on destination chain'),\n})\n\nexport type GetBridgeFeeInput = z.infer<typeof getBridgeFeeInputSchema>\n\n/**\n * LayerZero endpoint IDs for supported chains\n */\nconst LAYERZERO_ENDPOINT_IDS: Record<string, number> = {\n ethereum: 30101,\n arbitrum: 30110,\n ink: 30291,\n berachain: 30362,\n unichain: 30320,\n}\n\n/**\n * Estimated bridge times in seconds\n */\nconst ESTIMATED_BRIDGE_TIMES: Record<string, number> = {\n ethereum: 900, // 15 minutes\n arbitrum: 300, // 5 minutes\n ink: 300, // 5 minutes\n berachain: 300, // 5 minutes\n unichain: 300, // 5 minutes\n}\n\n/**\n * OFT contract ABI for quoteSend\n */\nconst OFT_ABI = [\n {\n name: 'quoteSend',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n {\n name: '_sendParam',\n type: 'tuple',\n components: [\n { name: 'dstEid', type: 'uint32' },\n { name: 'to', type: 'bytes32' },\n { name: 'amountLD', type: 'uint256' },\n { name: 'minAmountLD', type: 'uint256' },\n { name: 'extraOptions', type: 'bytes' },\n { name: 'composeMsg', type: 'bytes' },\n { name: 'oftCmd', type: 'bytes' },\n ],\n },\n { name: '_payInLzToken', type: 'bool' },\n ],\n outputs: [\n {\n name: 'msgFee',\n type: 'tuple',\n components: [\n { name: 'nativeFee', type: 'uint256' },\n { name: 'lzTokenFee', type: 'uint256' },\n ],\n },\n ],\n },\n] as const\n\n/**\n * Get the viem chain configuration for a network\n */\nfunction getViemChain(network: SupportedNetwork) {\n switch (network) {\n case 'ethereum':\n return chains.mainnet\n case 'arbitrum':\n return chains.arbitrum\n case 'ink':\n return chains.ink\n case 'berachain':\n return chains.berachain\n case 'unichain':\n return chains.unichain\n default:\n return undefined\n }\n}\n\n/**\n * Convert address to bytes32 format for LayerZero\n */\nfunction addressToBytes32(address: Address): `0x${string}` {\n return `0x${address.slice(2).padStart(64, '0')}` as `0x${string}`\n}\n\n/**\n * Execute getBridgeFee tool\n */\nexport async function executeGetBridgeFee(\n input: GetBridgeFeeInput,\n rpcUrls?: Partial<Record<SupportedNetwork, string>>,\n): Promise<BridgeFeeQuote> {\n const { fromChain, toChain, amount, recipient } = input\n\n // Validate chains are different\n if (fromChain === toChain) {\n throw new Error('Source and destination chains must be different')\n }\n\n // Validate both chains support bridging\n if (!BRIDGEABLE_CHAINS.includes(fromChain as SupportedNetwork)) {\n throw new Error(`Chain ${fromChain} does not support USDT0 bridging`)\n }\n if (!BRIDGEABLE_CHAINS.includes(toChain as SupportedNetwork)) {\n throw new Error(`Chain ${toChain} does not support USDT0 bridging`)\n }\n\n // Get USDT0 address on source chain\n const usdt0Address = USDT0_ADDRESSES[fromChain as SupportedNetwork]\n if (!usdt0Address) {\n throw new Error(`USDT0 not found on ${fromChain}`)\n }\n\n // Parse amount (6 decimals)\n const amountBigInt = parseTokenAmount(amount, 6)\n\n // Create client\n const chain = getViemChain(fromChain as SupportedNetwork)\n if (!chain) {\n throw new Error(`Unsupported chain: ${fromChain}`)\n }\n\n const rpcUrl =\n rpcUrls?.[fromChain as SupportedNetwork] || DEFAULT_RPC_URLS[fromChain as SupportedNetwork]\n const client = createPublicClient({\n chain,\n transport: http(rpcUrl),\n })\n\n // Build send params\n const dstEid = LAYERZERO_ENDPOINT_IDS[toChain]\n const sendParam = {\n dstEid,\n to: addressToBytes32(recipient as Address),\n amountLD: amountBigInt,\n minAmountLD: amountBigInt, // No slippage for quote\n extraOptions: '0x' as `0x${string}`,\n composeMsg: '0x' as `0x${string}`,\n oftCmd: '0x' as `0x${string}`,\n }\n\n // Get quote from contract\n const quote = (await client.readContract({\n address: usdt0Address,\n abi: OFT_ABI,\n functionName: 'quoteSend',\n args: [sendParam, false],\n })) as { nativeFee: bigint; lzTokenFee: bigint }\n\n const nativeSymbol = NATIVE_SYMBOLS[fromChain as SupportedNetwork]\n const estimatedTime = ESTIMATED_BRIDGE_TIMES[toChain] || 300\n\n return {\n fromChain: fromChain as SupportedNetwork,\n toChain: toChain as SupportedNetwork,\n amount,\n nativeFee: quote.nativeFee.toString(),\n nativeFeeFormatted: `${formatEther(quote.nativeFee)} ${nativeSymbol}`,\n estimatedTime,\n }\n}\n\n/**\n * Format bridge fee result for display\n */\nexport function formatBridgeFeeResult(result: BridgeFeeQuote): string {\n const minutes = Math.ceil(result.estimatedTime / 60)\n\n return [\n `## Bridge Fee Quote`,\n '',\n `- **Route:** ${result.fromChain} → ${result.toChain}`,\n `- **Amount:** ${result.amount} USDT0`,\n `- **Native Fee:** ${result.nativeFeeFormatted}`,\n `- **Estimated Time:** ~${minutes} minutes`,\n '',\n '_Note: Actual fees may vary slightly at execution time._',\n ].join('\\n')\n}\n","/**\n * t402/bridge - Bridge USDT0 between chains using LayerZero OFT\n */\n\nimport { z } from 'zod'\nimport {\n createPublicClient,\n createWalletClient,\n http,\n keccak256,\n toBytes,\n type Address,\n} from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport * as chains from 'viem/chains'\nimport type { SupportedNetwork, BridgeResult } from '../types.js'\nimport {\n DEFAULT_RPC_URLS,\n BRIDGEABLE_CHAINS,\n USDT0_ADDRESSES,\n ERC20_ABI,\n parseTokenAmount,\n getLayerZeroScanUrl,\n getExplorerTxUrl,\n} from '../constants.js'\n\n/**\n * Input schema for bridge tool\n */\nexport const bridgeInputSchema = z.object({\n fromChain: z\n .enum(['ethereum', 'arbitrum', 'ink', 'berachain', 'unichain'])\n .describe('Source chain to bridge from'),\n toChain: z\n .enum(['ethereum', 'arbitrum', 'ink', 'berachain', 'unichain'])\n .describe('Destination chain to bridge to'),\n amount: z\n .string()\n .regex(/^\\d+(\\.\\d+)?$/)\n .describe(\"Amount of USDT0 to bridge (e.g., '100' for 100 USDT0)\"),\n recipient: z\n .string()\n .regex(/^0x[a-fA-F0-9]{40}$/)\n .describe('Recipient address on destination chain'),\n})\n\nexport type BridgeInput = z.infer<typeof bridgeInputSchema>\n\n/**\n * LayerZero endpoint IDs for supported chains\n */\nconst LAYERZERO_ENDPOINT_IDS: Record<string, number> = {\n ethereum: 30101,\n arbitrum: 30110,\n ink: 30291,\n berachain: 30362,\n unichain: 30320,\n}\n\n/**\n * Estimated bridge times in seconds\n */\nconst ESTIMATED_BRIDGE_TIMES: Record<string, number> = {\n ethereum: 900,\n arbitrum: 300,\n ink: 300,\n berachain: 300,\n unichain: 300,\n}\n\n/**\n * OFT contract ABI\n */\nconst OFT_ABI = [\n {\n name: 'quoteSend',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n {\n name: '_sendParam',\n type: 'tuple',\n components: [\n { name: 'dstEid', type: 'uint32' },\n { name: 'to', type: 'bytes32' },\n { name: 'amountLD', type: 'uint256' },\n { name: 'minAmountLD', type: 'uint256' },\n { name: 'extraOptions', type: 'bytes' },\n { name: 'composeMsg', type: 'bytes' },\n { name: 'oftCmd', type: 'bytes' },\n ],\n },\n { name: '_payInLzToken', type: 'bool' },\n ],\n outputs: [\n {\n name: 'msgFee',\n type: 'tuple',\n components: [\n { name: 'nativeFee', type: 'uint256' },\n { name: 'lzTokenFee', type: 'uint256' },\n ],\n },\n ],\n },\n {\n name: 'send',\n type: 'function',\n stateMutability: 'payable',\n inputs: [\n {\n name: '_sendParam',\n type: 'tuple',\n components: [\n { name: 'dstEid', type: 'uint32' },\n { name: 'to', type: 'bytes32' },\n { name: 'amountLD', type: 'uint256' },\n { name: 'minAmountLD', type: 'uint256' },\n { name: 'extraOptions', type: 'bytes' },\n { name: 'composeMsg', type: 'bytes' },\n { name: 'oftCmd', type: 'bytes' },\n ],\n },\n {\n name: '_fee',\n type: 'tuple',\n components: [\n { name: 'nativeFee', type: 'uint256' },\n { name: 'lzTokenFee', type: 'uint256' },\n ],\n },\n { name: '_refundAddress', type: 'address' },\n ],\n outputs: [\n {\n name: 'msgReceipt',\n type: 'tuple',\n components: [\n { name: 'guid', type: 'bytes32' },\n { name: 'nonce', type: 'uint64' },\n {\n name: 'fee',\n type: 'tuple',\n components: [\n { name: 'nativeFee', type: 'uint256' },\n { name: 'lzTokenFee', type: 'uint256' },\n ],\n },\n ],\n },\n {\n name: 'oftReceipt',\n type: 'tuple',\n components: [\n { name: 'amountSentLD', type: 'uint256' },\n { name: 'amountReceivedLD', type: 'uint256' },\n ],\n },\n ],\n },\n] as const\n\n/**\n * OFTSent event topic\n */\nconst OFT_SENT_EVENT_TOPIC = keccak256(toBytes('OFTSent(bytes32,uint32,address,uint256,uint256)'))\n\n/**\n * Get the viem chain configuration for a network\n */\nfunction getViemChain(network: SupportedNetwork) {\n switch (network) {\n case 'ethereum':\n return chains.mainnet\n case 'arbitrum':\n return chains.arbitrum\n case 'ink':\n return chains.ink\n case 'berachain':\n return chains.berachain\n case 'unichain':\n return chains.unichain\n default:\n return undefined\n }\n}\n\n/**\n * Convert address to bytes32 format for LayerZero\n */\nfunction addressToBytes32(address: Address): `0x${string}` {\n return `0x${address.slice(2).padStart(64, '0')}` as `0x${string}`\n}\n\n/**\n * Options for executing bridge\n */\nexport interface BridgeOptions {\n /** Private key for signing (hex with 0x prefix) */\n privateKey: string\n /** Custom RPC URL */\n rpcUrl?: string\n /** Demo mode - simulate without executing */\n demoMode?: boolean\n /** Slippage tolerance percentage (default: 0.5) */\n slippageTolerance?: number\n}\n\n/**\n * Execute bridge tool\n */\nexport async function executeBridge(\n input: BridgeInput,\n options: BridgeOptions,\n): Promise<BridgeResult> {\n const { fromChain, toChain, amount, recipient } = input\n const { privateKey, rpcUrl, demoMode, slippageTolerance = 0.5 } = options\n\n // Validate chains are different\n if (fromChain === toChain) {\n throw new Error('Source and destination chains must be different')\n }\n\n // Validate both chains support bridging\n if (!BRIDGEABLE_CHAINS.includes(fromChain as SupportedNetwork)) {\n throw new Error(`Chain ${fromChain} does not support USDT0 bridging`)\n }\n if (!BRIDGEABLE_CHAINS.includes(toChain as SupportedNetwork)) {\n throw new Error(`Chain ${toChain} does not support USDT0 bridging`)\n }\n\n // Get USDT0 address on source chain\n const usdt0Address = USDT0_ADDRESSES[fromChain as SupportedNetwork]\n if (!usdt0Address) {\n throw new Error(`USDT0 not found on ${fromChain}`)\n }\n\n // Parse amount (6 decimals)\n const amountBigInt = parseTokenAmount(amount, 6)\n\n // Calculate minimum amount with slippage\n const slippageMultiplier = BigInt(Math.floor((100 - slippageTolerance) * 100))\n const minAmountBigInt = (amountBigInt * slippageMultiplier) / 10000n\n\n // Demo mode - return simulated result\n if (demoMode) {\n const fakeTxHash = `0x${'a'.repeat(64)}` as `0x${string}`\n const fakeGuid = `0x${'b'.repeat(64)}` as `0x${string}`\n const estimatedTime = ESTIMATED_BRIDGE_TIMES[toChain] || 300\n\n return {\n txHash: fakeTxHash,\n messageGuid: fakeGuid,\n amount,\n fromChain: fromChain as SupportedNetwork,\n toChain: toChain as SupportedNetwork,\n estimatedTime,\n trackingUrl: getLayerZeroScanUrl(fakeGuid),\n }\n }\n\n // Create clients\n const chain = getViemChain(fromChain as SupportedNetwork)\n if (!chain) {\n throw new Error(`Unsupported chain: ${fromChain}`)\n }\n\n const transport = http(rpcUrl || DEFAULT_RPC_URLS[fromChain as SupportedNetwork])\n const account = privateKeyToAccount(privateKey as `0x${string}`)\n\n const publicClient = createPublicClient({\n chain,\n transport,\n })\n\n const walletClient = createWalletClient({\n account,\n chain,\n transport,\n })\n\n // Check USDT0 balance\n const balance = (await publicClient.readContract({\n address: usdt0Address,\n abi: ERC20_ABI,\n functionName: 'balanceOf',\n args: [account.address],\n })) as bigint\n\n if (balance < amountBigInt) {\n throw new Error(\n `Insufficient USDT0 balance. Have: ${balance.toString()}, Need: ${amountBigInt.toString()}`,\n )\n }\n\n // Build send params\n const dstEid = LAYERZERO_ENDPOINT_IDS[toChain]\n const sendParam = {\n dstEid,\n to: addressToBytes32(recipient as Address),\n amountLD: amountBigInt,\n minAmountLD: minAmountBigInt,\n extraOptions: '0x' as `0x${string}`,\n composeMsg: '0x' as `0x${string}`,\n oftCmd: '0x' as `0x${string}`,\n }\n\n // Get quote\n const quote = (await publicClient.readContract({\n address: usdt0Address,\n abi: OFT_ABI,\n functionName: 'quoteSend',\n args: [sendParam, false],\n })) as { nativeFee: bigint; lzTokenFee: bigint }\n\n // Add 10% buffer to fee\n const nativeFeeWithBuffer = (quote.nativeFee * 110n) / 100n\n\n // Execute send\n const hash = await walletClient.writeContract({\n address: usdt0Address,\n abi: OFT_ABI,\n functionName: 'send',\n args: [sendParam, { nativeFee: nativeFeeWithBuffer, lzTokenFee: 0n }, account.address],\n value: nativeFeeWithBuffer,\n })\n\n // Wait for confirmation\n const receipt = await publicClient.waitForTransactionReceipt({ hash })\n\n if (receipt.status !== 'success') {\n throw new Error(`Bridge transaction failed: ${hash}`)\n }\n\n // Extract message GUID from OFTSent event\n let messageGuid: `0x${string}` = '0x' as `0x${string}`\n for (const log of receipt.logs) {\n if (log.topics[0] === OFT_SENT_EVENT_TOPIC && log.topics[1]) {\n messageGuid = log.topics[1] as `0x${string}`\n break\n }\n }\n\n if (messageGuid === '0x') {\n throw new Error('Failed to extract message GUID from transaction logs')\n }\n\n const estimatedTime = ESTIMATED_BRIDGE_TIMES[toChain] || 300\n\n return {\n txHash: hash,\n messageGuid,\n amount,\n fromChain: fromChain as SupportedNetwork,\n toChain: toChain as SupportedNetwork,\n estimatedTime,\n trackingUrl: getLayerZeroScanUrl(messageGuid),\n }\n}\n\n/**\n * Format bridge result for display\n */\nexport function formatBridgeResult(result: BridgeResult): string {\n const minutes = Math.ceil(result.estimatedTime / 60)\n\n return [\n `## Bridge Transaction Submitted`,\n '',\n `- **Route:** ${result.fromChain} → ${result.toChain}`,\n `- **Amount:** ${result.amount} USDT0`,\n `- **Transaction:** \\`${result.txHash}\\``,\n `- **Message GUID:** \\`${result.messageGuid}\\``,\n `- **Estimated Delivery:** ~${minutes} minutes`,\n '',\n `### Tracking`,\n `- [View on LayerZero Scan](${result.trackingUrl})`,\n `- [View Source TX](${getExplorerTxUrl(result.fromChain, result.txHash)})`,\n '',\n `_Your USDT0 will arrive on ${result.toChain} once the LayerZero message is delivered._`,\n ].join('\\n')\n}\n","/**\n * t402 MCP Tools - Export all payment tools\n */\n\n// Balance tools\nexport {\n getBalanceInputSchema,\n executeGetBalance,\n formatBalanceResult,\n type GetBalanceInput,\n} from './getBalance.js'\n\nexport {\n getAllBalancesInputSchema,\n executeGetAllBalances,\n formatAllBalancesResult,\n type GetAllBalancesInput,\n type AllBalancesResult,\n} from './getAllBalances.js'\n\n// Payment tools\nexport {\n payInputSchema,\n executePay,\n formatPaymentResult,\n type PayInput,\n type PayOptions,\n} from './pay.js'\n\nexport {\n payGaslessInputSchema,\n executePayGasless,\n formatGaslessPaymentResult,\n GASLESS_SUPPORTED_NETWORKS,\n type PayGaslessInput,\n type PayGaslessOptions,\n} from './payGasless.js'\n\n// Bridge tools\nexport {\n getBridgeFeeInputSchema,\n executeGetBridgeFee,\n formatBridgeFeeResult,\n type GetBridgeFeeInput,\n} from './getBridgeFee.js'\n\nexport {\n bridgeInputSchema,\n executeBridge,\n formatBridgeResult,\n type BridgeInput,\n type BridgeOptions,\n} from './bridge.js'\n\n/**\n * Tool definitions for MCP server registration\n */\nexport const TOOL_DEFINITIONS = {\n 't402/getBalance': {\n name: 't402/getBalance',\n description:\n 'Get token balances (native + stablecoins) for a wallet on a specific blockchain network. Returns ETH/native token balance plus USDC, USDT, and USDT0 balances where supported.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n network: {\n type: 'string',\n enum: [\n 'ethereum',\n 'base',\n 'arbitrum',\n 'optimism',\n 'polygon',\n 'avalanche',\n 'ink',\n 'berachain',\n 'unichain',\n ],\n description: 'Blockchain network to check balance on',\n },\n address: {\n type: 'string',\n pattern: '^0x[a-fA-F0-9]{40}$',\n description: 'Wallet address to check balance for',\n },\n },\n required: ['network', 'address'],\n },\n },\n\n 't402/getAllBalances': {\n name: 't402/getAllBalances',\n description:\n 'Get token balances across all supported networks for a wallet. Returns aggregated totals and per-network breakdown of native tokens and stablecoins (USDC, USDT, USDT0).',\n inputSchema: {\n type: 'object' as const,\n properties: {\n address: {\n type: 'string',\n pattern: '^0x[a-fA-F0-9]{40}$',\n description: 'Wallet address to check balances for',\n },\n networks: {\n type: 'array',\n items: {\n type: 'string',\n enum: [\n 'ethereum',\n 'base',\n 'arbitrum',\n 'optimism',\n 'polygon',\n 'avalanche',\n 'ink',\n 'berachain',\n 'unichain',\n ],\n },\n description:\n 'Optional list of networks to check. If not provided, checks all supported networks.',\n },\n },\n required: ['address'],\n },\n },\n\n 't402/pay': {\n name: 't402/pay',\n description:\n 'Execute a stablecoin payment on a specific blockchain network. Supports USDC, USDT, and USDT0 tokens. Requires a configured wallet with sufficient balance and native token for gas.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n to: {\n type: 'string',\n pattern: '^0x[a-fA-F0-9]{40}$',\n description: 'Recipient address',\n },\n amount: {\n type: 'string',\n pattern: '^\\\\d+(\\\\.\\\\d+)?$',\n description: \"Amount to pay (e.g., '10.50' for 10.50 USDC)\",\n },\n token: {\n type: 'string',\n enum: ['USDC', 'USDT', 'USDT0'],\n description: 'Token to use for payment',\n },\n network: {\n type: 'string',\n enum: [\n 'ethereum',\n 'base',\n 'arbitrum',\n 'optimism',\n 'polygon',\n 'avalanche',\n 'ink',\n 'berachain',\n 'unichain',\n ],\n description: 'Network to execute payment on',\n },\n memo: {\n type: 'string',\n description: 'Optional memo/reference for the payment',\n },\n },\n required: ['to', 'amount', 'token', 'network'],\n },\n },\n\n 't402/payGasless': {\n name: 't402/payGasless',\n description:\n 'Execute a gasless stablecoin payment using ERC-4337 account abstraction. Gas fees are sponsored by a paymaster, so no ETH is needed for the transaction. Supported on select networks.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n to: {\n type: 'string',\n pattern: '^0x[a-fA-F0-9]{40}$',\n description: 'Recipient address',\n },\n amount: {\n type: 'string',\n pattern: '^\\\\d+(\\\\.\\\\d+)?$',\n description: \"Amount to pay (e.g., '10.50' for 10.50 USDC)\",\n },\n token: {\n type: 'string',\n enum: ['USDC', 'USDT', 'USDT0'],\n description: 'Token to use for payment',\n },\n network: {\n type: 'string',\n enum: ['ethereum', 'base', 'arbitrum', 'optimism', 'polygon', 'avalanche'],\n description: 'Network to execute gasless payment on (must support ERC-4337)',\n },\n },\n required: ['to', 'amount', 'token', 'network'],\n },\n },\n\n 't402/getBridgeFee': {\n name: 't402/getBridgeFee',\n description:\n 'Get the fee quote for bridging USDT0 between chains using LayerZero OFT. Returns the native token fee required and estimated delivery time. Supported chains: ethereum, arbitrum, ink, berachain, unichain.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n fromChain: {\n type: 'string',\n enum: ['ethereum', 'arbitrum', 'ink', 'berachain', 'unichain'],\n description: 'Source chain to bridge from',\n },\n toChain: {\n type: 'string',\n enum: ['ethereum', 'arbitrum', 'ink', 'berachain', 'unichain'],\n description: 'Destination chain to bridge to',\n },\n amount: {\n type: 'string',\n pattern: '^\\\\d+(\\\\.\\\\d+)?$',\n description: \"Amount of USDT0 to bridge (e.g., '100' for 100 USDT0)\",\n },\n recipient: {\n type: 'string',\n pattern: '^0x[a-fA-F0-9]{40}$',\n description: 'Recipient address on destination chain',\n },\n },\n required: ['fromChain', 'toChain', 'amount', 'recipient'],\n },\n },\n\n 't402/bridge': {\n name: 't402/bridge',\n description:\n 'Bridge USDT0 between chains using LayerZero OFT standard. Executes a cross-chain transfer and returns the LayerZero message GUID for tracking. Supported chains: ethereum, arbitrum, ink, berachain, unichain.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n fromChain: {\n type: 'string',\n enum: ['ethereum', 'arbitrum', 'ink', 'berachain', 'unichain'],\n description: 'Source chain to bridge from',\n },\n toChain: {\n type: 'string',\n enum: ['ethereum', 'arbitrum', 'ink', 'berachain', 'unichain'],\n description: 'Destination chain to bridge to',\n },\n amount: {\n type: 'string',\n pattern: '^\\\\d+(\\\\.\\\\d+)?$',\n description: \"Amount of USDT0 to bridge (e.g., '100' for 100 USDT0)\",\n },\n recipient: {\n type: 'string',\n pattern: '^0x[a-fA-F0-9]{40}$',\n description: 'Recipient address on destination chain',\n },\n },\n required: ['fromChain', 'toChain', 'amount', 'recipient'],\n },\n },\n}\n"],"mappings":"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","names":["import_zod","import_zod","import_viem","chains","getViemChain","import_zod","import_viem","import_accounts","chains","getViemChain","import_zod","import_viem","chains","getViemChain","import_zod","import_viem","import_accounts","chains","LAYERZERO_ENDPOINT_IDS","ESTIMATED_BRIDGE_TIMES","OFT_ABI","getViemChain","addressToBytes32","estimatedTime"]}
@@ -1,4 +1,4 @@
1
- import { M as McpServerConfig } from '../types-BINGE6ja.js';
1
+ import { M as McpServerConfig } from '../types-CWK2p9_n.js';
2
2
  import 'viem';
3
3
 
4
4
  /**
@@ -5,6 +5,7 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __getProtoOf = Object.getPrototypeOf;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
9
  var __export = (target, all) => {
9
10
  for (var name in all)
10
11
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -26,6 +27,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
27
  mod
27
28
  ));
28
29
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
29
31
 
30
32
  // src/server/index.ts
31
33
  var server_exports = {};
@@ -111,7 +113,7 @@ var USDT0_ADDRESSES = {
111
113
  arbitrum: "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9",
112
114
  ink: "0x0200C29006150606B650577BBE7B6248F58470c1",
113
115
  berachain: "0x779Ded0c9e1022225f8E0630b35a9b54bE713736",
114
- unichain: "0x588ce4F028D8e7B53B687865d6A67b3A54C75518"
116
+ unichain: "0x9151434b16b9763660705744891fA906F660EcC5"
115
117
  };
116
118
  var BRIDGEABLE_CHAINS = [
117
119
  "ethereum",
@@ -300,13 +302,9 @@ async function executeGetBalance(input, rpcUrls) {
300
302
  tokenAddresses.push({ token: USDT0_ADDRESSES[network], expected: "USDT0" });
301
303
  }
302
304
  const tokenBalances = await Promise.all(
303
- tokenAddresses.map(
304
- ({ token }) => getTokenBalance(client, token, walletAddress)
305
- )
306
- );
307
- const tokens = tokenBalances.filter(
308
- (t) => t !== null
305
+ tokenAddresses.map(({ token }) => getTokenBalance(client, token, walletAddress))
309
306
  );
307
+ const tokens = tokenBalances.filter((t) => t !== null);
310
308
  return {
311
309
  network,
312
310
  chainId: CHAIN_IDS[network],
@@ -494,7 +492,7 @@ function getViemChain2(network) {
494
492
  }
495
493
  }
496
494
  async function executePay(input, options) {
497
- const { to, amount, token, network, memo } = input;
495
+ const { to, amount, token, network, memo: _memo } = input;
498
496
  const { privateKey, rpcUrl, demoMode } = options;
499
497
  if (!supportsToken(network, token)) {
500
498
  throw new Error(`Token ${token} is not supported on ${network}`);
@@ -580,14 +578,7 @@ var payGaslessInputSchema = import_zod4.z.object({
580
578
  to: import_zod4.z.string().regex(/^0x[a-fA-F0-9]{40}$/).describe("Recipient address"),
581
579
  amount: import_zod4.z.string().regex(/^\d+(\.\d+)?$/).describe("Amount to pay (e.g., '10.50' for 10.50 USDC)"),
582
580
  token: import_zod4.z.enum(["USDC", "USDT", "USDT0"]).describe("Token to use for payment"),
583
- network: import_zod4.z.enum([
584
- "ethereum",
585
- "base",
586
- "arbitrum",
587
- "optimism",
588
- "polygon",
589
- "avalanche"
590
- ]).describe("Network to execute gasless payment on (must support ERC-4337)")
581
+ network: import_zod4.z.enum(["ethereum", "base", "arbitrum", "optimism", "polygon", "avalanche"]).describe("Network to execute gasless payment on (must support ERC-4337)")
591
582
  });
592
583
  var GASLESS_SUPPORTED_NETWORKS = [
593
584
  "ethereum",
@@ -623,7 +614,7 @@ function getViemChain3(network) {
623
614
  }
624
615
  async function executePayGasless(input, options) {
625
616
  const { to, amount, token, network } = input;
626
- const { privateKey, bundlerUrl, paymasterUrl, rpcUrl, demoMode } = options;
617
+ const { privateKey, bundlerUrl, paymasterUrl: _paymasterUrl, rpcUrl, demoMode } = options;
627
618
  if (!GASLESS_SUPPORTED_NETWORKS.includes(network)) {
628
619
  throw new Error(
629
620
  `Network ${network} does not support ERC-4337 gasless transactions. Supported: ${GASLESS_SUPPORTED_NETWORKS.join(", ")}`
@@ -1013,9 +1004,7 @@ var OFT_ABI2 = [
1013
1004
  ]
1014
1005
  }
1015
1006
  ];
1016
- var OFT_SENT_EVENT_TOPIC = (0, import_viem5.keccak256)(
1017
- (0, import_viem5.toBytes)("OFTSent(bytes32,uint32,address,uint256,uint256)")
1018
- );
1007
+ var OFT_SENT_EVENT_TOPIC = (0, import_viem5.keccak256)((0, import_viem5.toBytes)("OFTSent(bytes32,uint32,address,uint256,uint256)"));
1019
1008
  function getViemChain5(network) {
1020
1009
  switch (network) {
1021
1010
  case "ethereum":
@@ -1115,11 +1104,7 @@ async function executeBridge(input, options) {
1115
1104
  address: usdt0Address,
1116
1105
  abi: OFT_ABI2,
1117
1106
  functionName: "send",
1118
- args: [
1119
- sendParam,
1120
- { nativeFee: nativeFeeWithBuffer, lzTokenFee: 0n },
1121
- account.address
1122
- ],
1107
+ args: [sendParam, { nativeFee: nativeFeeWithBuffer, lzTokenFee: 0n }, account.address],
1123
1108
  value: nativeFeeWithBuffer
1124
1109
  });
1125
1110
  const receipt = await publicClient.waitForTransactionReceipt({ hash });
@@ -1162,7 +1147,7 @@ function formatBridgeResult(result) {
1162
1147
  `- [View on LayerZero Scan](${result.trackingUrl})`,
1163
1148
  `- [View Source TX](${getExplorerTxUrl(result.fromChain, result.txHash)})`,
1164
1149
  "",
1165
- "_Your USDT0 will arrive on ${result.toChain} once the LayerZero message is delivered._"
1150
+ `_Your USDT0 will arrive on ${result.toChain} once the LayerZero message is delivered._`
1166
1151
  ].join("\n");
1167
1152
  }
1168
1153
 
@@ -1370,6 +1355,8 @@ var TOOL_DEFINITIONS = {
1370
1355
  // src/server/t402Server.ts
1371
1356
  var T402McpServer = class {
1372
1357
  constructor(config = {}) {
1358
+ __publicField(this, "server");
1359
+ __publicField(this, "config");
1373
1360
  this.config = config;
1374
1361
  this.server = new import_server.Server(
1375
1362
  {