/** * Pump Fun Agent Tracker Bot — Telegram Message Formatters * * HTML-formatted messages for Telegram notifications, * following the same patterns as the existing telegram-bot. */ import type { AgentPaymentEvent, BuybackEvent, ClaimEvent, TrackerState, WalletSnapshot, } from './types.js'; function shortAddr(addr: string): string { if (addr.length <= 12) return addr; return `${addr.slice(0, 6)}...${addr.slice(-4)}`; } function escapeHtml(str: string): string { return str .replace(/&/g, '&') .replace(//g, '>'); } function formatTime(unixSeconds: number): string { return new Date(unixSeconds * 1000).toUTCString(); } // ── Payment Received ────────────────────────────────────────────────────── export function formatPaymentNotification(event: AgentPaymentEvent): string { return ( `Agent Payment Received!\n\n` + `Payer: ${shortAddr(event.payerWallet)}\n` + `Amount: ${event.amountSol.toFixed(4)} SOL\n` + `Memo: ${escapeHtml(event.memo)}\n` + `Time: ${formatTime(event.timestamp)}\n\n` + `View TX` ); } // ── Claim Detected ──────────────────────────────────────────────────────── export function formatClaimNotification(event: ClaimEvent): string { const mint = event.tokenMint ? `\nToken: ${shortAddr(event.tokenMint)}` : ''; return ( `Fee Claim Detected!\n\n` + `Claimer: ${shortAddr(event.claimerWallet)}\n` + `Amount: ${event.amountSol.toFixed(4)} SOL\n` + `Type: ${escapeHtml(event.claimType)}${mint}\n` + `Time: ${formatTime(event.timestamp)}\n\n` + `View TX` ); } // ── Buyback Detected ────────────────────────────────────────────────────── export function formatBuybackNotification(event: BuybackEvent): string { const action = event.isBuy ? 'BUY' : 'SELL'; return ( `Token ${action} Detected!\n\n` + `Wallet: ${shortAddr(event.buyerWallet)}\n` + `SOL: ${event.solAmount.toFixed(4)}\n` + `Token: ${shortAddr(event.tokenMint)}\n` + `Time: ${formatTime(event.timestamp)}\n\n` + `View TX · ` + `pump.fun` ); } // ── Wallet Balance ──────────────────────────────────────────────────────── export function formatWalletBalance(snapshot: WalletSnapshot): string { return ( `Developer Wallet Balance\n\n` + `Address: ${shortAddr(snapshot.address)}\n` + `SOL Balance: ${snapshot.solBalance.toFixed(4)} SOL\n` + `Checked: ${formatTime(snapshot.timestamp)}\n\n` + `View on Solscan` ); } // ── Status Summary ──────────────────────────────────────────────────────── export function formatStatus(state: TrackerState, config: { agentMint: string; devWallet: string }): string { const uptimeMs = Date.now() - state.startedAt; const hours = Math.floor(uptimeMs / 3_600_000); const minutes = Math.floor((uptimeMs % 3_600_000) / 60_000); return ( `Agent Tracker Status\n\n` + `Agent Mint: ${shortAddr(config.agentMint)}\n` + `Dev Wallet: ${shortAddr(config.devWallet)}\n` + `Uptime: ${hours}h ${minutes}m\n\n` + `Payments: ${state.totalPaymentsReceived} (${state.totalSolCollected.toFixed(4)} SOL)\n` + `Claims: ${state.totalClaims} (${state.totalClaimsSol.toFixed(4)} SOL)\n` + `Buybacks: ${state.totalBuybacks} (${state.totalBuybackSol.toFixed(4)} SOL)\n` ); } // ── Help ────────────────────────────────────────────────────────────────── export function formatHelp(): string { return ( `Pump Fun Agent Tracker Bot\n\n` + `Commands:\n` + `/start — Start the bot\n` + `/status — Show tracker stats\n` + `/wallet — Check developer wallet balance\n` + `/claims — Show recent claims summary\n` + `/buybacks — Show recent buybacks summary\n` + `/help — Show this message\n\n` + `The bot automatically monitors:\n` + `• Agent payments (invoices paid)\n` + `• Creator fee claims\n` + `• Token buybacks by developer wallet\n` ); }