The backend has no lending module at all, so the fixtures here ARE the API contract rather than a placeholder for one.
Screens: overview, markets and market detail (4 tabs), risk and liquidations, operations. Plus a two-level sidebar, breadcrumbs, module tab strip and the /lending route subtree.
Foundation:
- decimal-string formatting and comparison in @/lib/format/*; money is never narrowed through a JS number
- the mock layer sits behind src/services/lending.service.ts on the live code path, so swapping to the real API changes one file. fe/src/devServer/ is dead code precisely because it was a parallel branch nobody wired up
- VITE_LENDING_MOCKS is false in .env and true only in .env.development, which vite build never reads, so mocks cannot reach a deployed bundle by construction
- DataTable on TanStack Table v8 with a decimal-string comparator: the built-in
picks
basicat <=10 rows andalphanumericabove, and both misorder decimals
Fixtures are derived from base facts, not transcribed. The wireframe's own numbers do not reconcile (USDC utilization is 41.15% not 41.18%; USDT cash plus borrowed exceeds supplied by 16,920, modelled here as protocol equity), so deriving is what keeps the contract self-consistent.
Requires Node >= 24.9. On Node 20 lint crashes and 7 test suites silently fail to run while still reporting a pass.
Co-Authored-By: Claude Opus 5 noreply@anthropic.com