Setup & Self-Hosting
Run the BVCC Wallet frontend yourself. The app is fully non-custodial and has no database — Ethereum is the database — so self-hosting is just a Next.js app plus a few optional API keys.
Prerequisites
- ●Node.js >= 18
- ●git
Install
--legacy-peer-deps is required because of WalletConnect peer-dependency conflicts.
Configuration
Copy .env.example to .env.local and fill in what you need:
| Variable | Required | What breaks without it |
|---|---|---|
BUNDLER_PRIVATE_KEY | No | Nothing breaks — the app falls back to the connected wallet (MetaMask/WalletConnect) paying gas via EntryPoint.handleOps. With it set, the server submits UserOps and users get a Face-ID-only UX. |
ARBISCAN_API_KEY | Recommended | Transaction history (Etherscan API v2 proxy) stops working. |
COINGECKO_API_KEY | No | USD price lookups may be rate-limited or unavailable. |
NEXT_PUBLIC_WC_PROJECT_ID | Recommended | WalletConnect (both directions: connecting external wallets and connecting dApps to BVCC) won’t work. Free at cloud.reown.com. |
The optional bundler
Every operation is a UserOp signed with WebAuthn — the only thing that changes is who pays the gas:
- ●With
BUNDLER_PRIVATE_KEY: the/api/send-useroproute signsEntryPoint.handleOpswith that EOA and pays gas server-side. Fund it with a small amount of ETH on each network and rotate it like any hot key. It only accepts BVCC wallet senders (anti gas-drain check), so it can’t be drained relaying arbitrary accounts. - ●Without it: the route returns
501 BUNDLER_NOT_CONFIGUREDand the client falls back to the user’s connected wallet submittinghandleOpsdirectly. Same security, slightly worse UX (the user signs a gas transaction).
See the Bundler API reference for the route spec.
Contracts
Nothing to deploy. The app points at the published factories (same address on every supported network) — see the Contract Reference. If you fork the contracts, update lib/networks.ts.
Development
⚠WSL caveat: if the repo lives under
/mnt/c/..., Turbopack does not detect file changes. After editing, kill the dev server and clear the cache: rm -rf .next && npm run dev.Production (VPS)
nginx reverse proxy (TLS via certbot):
⚠WebAuthn requires a secure context — serve over HTTPS (or localhost for development), otherwise passkey creation will fail.