// Blocklist scene — 1:1 with app.dipoli.io/blocklist. // Title + description + underline tabs (IPs / Destinations) + table with // staggered row-in animation. Checkbox column + sticky bulk bar removed // per 2026-05-21 review — they were operator-only and felt out of place // in a marketing showcase. const BL = [ { ip: '3.122.14.91', reason: 'Phishing botnet C2', src: 'orbit-18769', by: 'John Carter', added: '27/04/2026 10:59' }, { ip: '185.156.72.10', reason: 'Velocity abuse · 24h', src: 'acme-19104', by: 'Maya Lin', added: '24/04/2026 14:12' }, { ip: '52.10.4.198', reason: 'Datacenter ASN · TOR', src: 'apex-19104', by: 'John Carter', added: '21/04/2026 09:40' }, { ip: '4.71.182.4', reason: 'Sanctions match (OFAC)', src: 'lyra-20126', by: 'Sasha Wong', added: '19/04/2026 17:08' }, { ip: '187.190.4.21', reason: 'Multi-account ring', src: 'lyra-20126', by: 'Maya Lin', added: '15/04/2026 11:22' }, { ip: '5.255.232.201', reason: 'Compound-rule trigger', src: 'apex-19104', by: 'John Carter', added: '12/04/2026 08:55' }, ]; function BlocklistScene({ active }) { const [rows, setRows] = React.useState([]); React.useEffect(() => { if (!active) return; setRows([]); const timers = BL.map((r, i) => setTimeout(() => setRows((prev) => [...prev, r]), i * 110) ); return () => timers.forEach(clearTimeout); }, [active]); return (

Blocklist

Global blacklist (per tenant). Any future transaction matching an IP or destination wallet listed here is auto-blocked, across every client.

{rows.map((r, i) => ( ))}
IP address Reason Source client Added by Added
{r.ip} {r.reason} {r.src} {r.by} {r.added}
); }