Architecture
BazaarFi is a three-tier system: an on-chain escrow program, a Postgres-backed indexer with WebSockets, and a Next.js frontend. The chain is the source of truth; everything else is a projection for discovery, search, and realtime UX.
Components
- Anchor program — escrows assets in trade PDAs, enforces lifecycle, settles atomically. Emits events for every state change.
- Indexer — polls program signatures every 3s, parses Anchor events, enriches with Helius DAS + Jupiter prices, writes to Postgres, broadcasts WebSocket events.
- Web app — Next.js 15 with RSC for fast initial paint. API routes read Postgres. Client uses React Query + wallet adapter for transactions via
@bazaarfi/sdk. - Shared packages —
@bazaarfi/shared(types/schemas),@bazaarfi/sdk(tx building),@bazaarfi/db(Drizzle schema + queries).
Trade creation flow
- User signs create → deposit → activate via SDK (batched wallet prompt)
- Program emits TradeCreated, AssetDeposited, TradeActivated events
- Indexer parses logs, enriches assets, inserts trades + trade_assets
- WebSocket broadcasts trade.activated; Explore cache invalidates
Settlement flow
- Taker signs accept_trade (with optional ALT setup for large bundles)
- Program atomically transfers all assets; emits TradeAccepted
- Indexer updates status, records activity, notifies maker
- WebSocket broadcasts trade.accepted + stats.updated
Cluster awareness
NEXT_PUBLIC_CLUSTER drives RPC, Helius subdomain, and explorer links. Executable trades always use assets on the active cluster — mainnet metadata can power devnet discovery, but settlement only moves devnet assets when the program is on devnet.
Full technical reference: docs/architecture.md