Admin Dashboard v2 — status by route
Live URL: https://admin-dashboard-v2-bay.vercel.app/
What works, what's mocked, what's missing — one row per route. Backend lives in asp-v2 at api-dev.0xbow.io.
Status legend:
✅ Live and wired to the real backend
🟡 Partial / mock data / cosmetic gaps
🟠 Backend endpoint exists, frontend not yet using it
🔴 No backend endpoint — screen 404s or shows placeholder
Route
Status
What works
What's missing
/
✅
Sign in with Google (OIDC), session persists, permissions come from /admin/verify-token
—
/auth/callback
✅
OIDC code+PKCE exchange against /admin/auth/oidc/exchange
—
/(admin) (dashboard)
✅
Global statistics, entrypoints, token prices. Pool cards grid linking to each pool dashboard. All money values now use the shared utils/money.ts formatter (USD → no decimals, ETH → 2 decimals, both compact above 100K).
—
Route
Status
What works
What's missing
/deposits
✅
List with filters (status, address), paged, multi-select, bulk Approve / Decline / Revalidate, CSV export across all pages
—
/deposits/[id]
✅
Real detail page (overview / risk / onchain block), per-row Approve / Decline / Revalidate / Comment, formatted money
Decision history + comment thread feed (backend serializer needs decisions and adminComments)
/withdrawals
✅
List with address filter, paged, CSV export across all pages, formatted amounts
—
Pool configuration (which pools exist, their min/max deposit, etc.) is read-only because pools are deployed onchain. Per-pool actions (approve/decline deposits, post comments, revalidate) work the same as on the global screens.
Route
Status
What works
What's missing
/pools
✅
Read-only listing from /admin/assets, chain-name mapping. New Pool / Edit buttons removed (pools are deployed onchain).
—
/pools/[poolId]
✅
Per-pool dashboard wired to fetchPool + chain-scoped events for deposit/withdrawal counts, formatted min/max deposit
TVL is hardcoded to 0 until /admin/assets-stats accepts a per-asset filter
/pools/[poolId]/deposits
✅
Real deposits list scoped to the pool's chainId, with multi-select + bulk Approve / Decline / Revalidate (same actions as /deposits) and CSV export
Pool/asset-scoped filter; right now this shows all deposits on the chain
/pools/[poolId]/withdrawals
✅
Real withdrawals list scoped to chain, with CSV export
Same chain-vs-asset scope caveat
/pools/[poolId]/addresses
✅
Informational redirect — backend whitelist/blacklist is global, not pool-scoped
—
Addresses (Whitelist / Blacklist)
Route
Status
What works
What's missing
/addresses
✅
Full CRUD on whitelist + blacklist (/admin/whitelist, /admin/blacklist), paged, permission-gated
—
Risk / Alerts / Investigations (PR #69, merged)
Route
Status
What works
What's missing
/risk/rules
✅
Full CRUD on /admin/risk/rules — New / Edit / Toggle / Delete
Runtime risk evaluator still doesn't read these rules (config-only for now)
/risk/policy
🟡
UI scaffold only
No backend
/risk/checks
🟡
UI scaffold only
No backend
/risk/changelog
🟡
UI scaffold only
No backend
/risk/lists
🟡
UI scaffold only
No backend
/alerts
✅
Full CRUD on /admin/alerts/rules + history acknowledge
Alert generation (no engine emits alert_event rows yet); delivery-channel CRUD removed (no backend)
/investigations
✅
List, New modal (title + description + severity), refresh; rows link to detail; permission-gated on MANAGE_INVESTIGATIONS
"Add Evidence" hidden until backend supports evidence
/investigations/[id]
✅
Real detail view with Edit modal (title/description/status/severity) and Conclude action
Linked deposits / addresses / evidence — backend has no relations table yet
Route
Status
What works
What's missing
/users
✅
Admin users list, invite, role editor, deactivate
—
/killswitch
✅
Global + per-chain killswitches via /admin/settings/killswitches
Per-pool / per-asset scope is not modelled on backend
/merkle-tree
✅
Read-only association set view via public endpoints
Admin merkle tree rollback / push-empty / push-filtered actions aren't surfaced in the UI yet
/audit-log
🔴
UI exists
No /admin/audit-log endpoint on backend
Route
Status
What works
What's missing
/stats
🟡
Reuses public statistics
Risk-distribution view is mock-only
/stats/health
✅
Live via /:chainId/health/*
—
/stats/pools
🟡
Renders against fetchPools; per-asset TVL is 0; money values use the shared formatter
Backend asset stats need per-asset filter
/stats/risk
🔴
UI exists, fetchRiskDistribution throws
No backend
/compliance
🔴
UI exists
No /admin/compliance/* endpoints
/cross-pool
🟡
Scaffold
No backend
/kyt
🟡
Scaffold
No backend
/search
✅
Cross-deposit/withdrawal search, formatted amounts
—
/glossary
✅
Static glossary content
—
What v1 had that v2 still doesn't
POI (Proof of Innocence) flow on deposits — deliberately deferred (per Patrick).
Per-asset TVL on pool dashboards — needs backend filter on /:chainId/admin/assets-stats.
Audit log, sessions, notifications, compliance — frontend screens exist, no backend.
What changed in this batch
Pool sub-routes (/pools/:poolId/{deposits,withdrawals,addresses}) — wired to real data; no more "unavailable" placeholders.
Main dashboard — new Pools card grid above Supported Chains, each card links to the per-pool dashboard.
Money formatting — shared utils/money.ts applied everywhere amounts are shown: USD/stablecoin → integer thousand-separated, ETH-style → up to 2 decimals, anything above 100K → compact (250K / 1.2M / 4.5B).
Investigations — Conclude works; View now navigates by the real numeric id; detail page is a real Edit form.
Alerts — dead "Configure / Edit" channel buttons removed.
Per-pool dashboard — TVL hero + range cards use the shared formatter.
Open asp-v2 PRs that move the dial
No open backend PRs for audit log, sessions, notifications, compliance, deposit decisions feed, or POI.