diff --git a/back_end/src/controllers/public.ts b/back_end/src/controllers/public.ts index 573cfc3..1019d85 100644 --- a/back_end/src/controllers/public.ts +++ b/back_end/src/controllers/public.ts @@ -503,6 +503,23 @@ interface PastWinRow { pot_after_fee_sats: number | null; buyer_name: string | null; serial_number: number | null; + winning_lightning_address: string | null; +} + +/** + * Truncate lightning address for privacy + * "username@blink.sv" -> "us******@blink.sv" + */ +function truncateLightningAddress(address: string | null): string | null { + if (!address || !address.includes('@')) return address; + + const [username, domain] = address.split('@'); + + // Show first 2 chars of username, then asterisks + const visibleChars = Math.min(2, username.length); + const truncatedUsername = username.substring(0, visibleChars) + '******'; + + return `${truncatedUsername}@${domain}`; } /** @@ -523,6 +540,7 @@ export async function getPastWins(req: Request, res: Response) { jc.scheduled_at, jc.pot_total_sats, jc.pot_after_fee_sats, + jc.winning_lightning_address, tp.buyer_name, t.serial_number FROM jackpot_cycles jc @@ -544,6 +562,7 @@ export async function getPastWins(req: Request, res: Response) { ? parseInt(row.pot_after_fee_sats.toString()) : null, winner_name: row.buyer_name || 'Anon', + winner_address: truncateLightningAddress(row.winning_lightning_address), winning_ticket_serial: row.serial_number ? parseInt(row.serial_number.toString()) : null, diff --git a/front_end/src/app/past-wins/page.tsx b/front_end/src/app/past-wins/page.tsx index c47027d..c354fbd 100644 --- a/front_end/src/app/past-wins/page.tsx +++ b/front_end/src/app/past-wins/page.tsx @@ -13,6 +13,7 @@ interface PastWin { pot_total_sats: number; pot_after_fee_sats: number | null; winner_name: string; + winner_address: string | null; winning_ticket_serial: number | null; } @@ -87,13 +88,19 @@ export default function PastWinsPage() { -