// Two more "product screenshot" surfaces for the Variant C hero rotator. // TransactionsTableMock — the streaming transactions list // BlocklistMock — the blocklist editor function TransactionsTableMock() { const base = [ { t: '11:42:08', id: 'pay_01K5Z0QXM3', client: 'inxy_main', amt: '4,820', ccy: 'USDT', score: 92, dec: 'BLOCK', tone: 'block', reason: 'IP blocklist · velocity +21%' }, { t: '11:42:07', id: 'pay_01K5Z0PN7C', client: 'inxy_main', amt: '180', ccy: 'USDT', score: 7, dec: 'APPROVE', tone: 'approve', reason: 'known IP · in hours' }, { t: '11:42:06', id: 'pay_01K5Z0P4BX', client: 'acme_eu', amt: '12,500', ccy: 'USDT', score: 64, dec: 'REVIEW', tone: 'review', reason: 'amount > 2× baseline' }, { t: '11:42:05', id: 'pay_01K5Z0NNF9', client: 'acme_eu', amt: '280', ccy: 'EUR', score: 4, dec: 'APPROVE', tone: 'approve', reason: 'whitelisted destination' }, { t: '11:42:04', id: 'pay_01K5Z0N2AA', client: 'lumen_labs', amt: '940', ccy: 'USDT', score: 88, dec: 'BLOCK', tone: 'block', reason: 'sanctioned country' }, { t: '11:42:03', id: 'pay_01K5Z0MDLR', client: 'inxy_main', amt: '72', ccy: 'USDT', score: 23, dec: 'APPROVE', tone: 'approve', reason: 'low risk' }, { t: '11:42:02', id: 'pay_01K5Z0LY17', client: 'nimbus_pay', amt: '26,800', ccy: 'USDT', score: 71, dec: 'REVIEW', tone: 'review', reason: 'amount > 2× baseline' }, { t: '11:42:01', id: 'pay_01K5Z0KC7E', client: 'inxy_main', amt: '650', ccy: 'USDT', score: 94, dec: 'BLOCK', tone: 'block', reason: 'IP blocklist' }, { t: '11:42:00', id: 'pay_01K5Z0K019', client: 'acme_eu', amt: '9,200', ccy: 'USDT', score: 58, dec: 'REVIEW', tone: 'review', reason: 'anonymizer IP' }, ]; const [rows, setRows] = React.useState(() => base.slice(0, 8).map((r, i) => ({ ...r, _k: i }))); const [seed, setSeed] = React.useState(8); React.useEffect(() => { const iv = setInterval(() => { setSeed(s => s + 1); const nxt = base[seed % base.length]; // shift times by 1s setRows(prev => [{ ...nxt, _k: seed + 1000, t: bumpTime(prev[0]?.t || '11:42:08') }, ...prev.slice(0, 7)]); }, 2100); return () => clearInterval(iv); }, [seed]); return (
console.dipoli.io / transactions
K kseniya@dipoli
Overview Transactions Clients Blocklist Settings
prod · eu-west-1
{/* Filter bar */}
All Approved Review 48 Blocked 12 pay_01K… Last 15m
Time Transaction Client Amount Score Verdict
{rows.map(r => (
{r.t}
{r.id}
{r.reason}
{r.client} {r.amt}{r.ccy} {r.score} {r.dec}
))}
); } function bumpTime(t) { const [h, m, s] = t.split(':').map(Number); let ns = s + 1; let nm = m, nh = h; if (ns >= 60) { ns = 0; nm++; } if (nm >= 60) { nm = 0; nh++; } const pad = x => String(x).padStart(2, '0'); return pad(nh) + ':' + pad(nm) + ':' + pad(ns); } // ───── Blocklist editor mock function BlocklistMock() { const initial = [ { kind: 'IP', value: '213.180.204.62', scope: 'Global', added: '2d ago', hits: 147, note: 'Known laundering ring' }, { kind: 'Address', value: 'TGx9BkL…eKz', scope: 'Global', added: '3h ago', hits: 1, note: 'Manual review' }, { kind: 'IP', value: '89.238.147.12', scope: 'inxy_main', added: '6h ago', hits: 23, note: 'Anonymizer exit node' }, { kind: 'Country', value: 'IR — Iran', scope: 'Global', added: 'OFAC', hits: 89, note: 'Sanctioned' }, { kind: 'Address', value: '0x7f9…ae1', scope: 'lumen_labs', added: '1d ago', hits: 4, note: 'Mixer-adjacent' }, { kind: 'IP', value: '45.132.90.14', scope: 'Global', added: 'just now', hits: 0, note: 'High-velocity new IP' }, { kind: 'Country', value: 'KP — DPRK', scope: 'Global', added: 'OFAC', hits: 3, note: 'Sanctioned' }, ]; return (
console.dipoli.io / blocklist
K kseniya@dipoli
Overview Transactions Clients Blocklist Settings
prod · eu-west-1
{/* Left — tabs */}
Lists
Blocklist 412
Allowlist 188
Watch 24
Scope
Global 210
inxy_main 98
acme_eu 64
lumen_labs 28
{/* Main */}
Search entries…
All IP Address Country
Type Value Scope Added Hits Note
{initial.map((r, i) => (
{r.kind} {r.value} {r.scope} {r.added} 50 ? 'var(--block)' : r.hits > 0 ? 'var(--review)' : 'var(--fg-dim)', fontWeight: 600, fontSize: 11.5 }}> {r.hits} {r.note}
))}
); } Object.assign(window, { TransactionsTableMock, BlocklistMock });