/**
* 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`
);
}