Your gateway to Boing. Boing Express is a non-custodial wallet designed for the Boing ecosystem. Keys are generated and stored only in your browser. Live at boing.express.
Status: public testnet — mainnet is not live. Boing Express is part of Boing Network — Quality, enforced by the protocol. See BRAND.md for the shared naming and tone.
Scope: Boing Express is a Boing-native wallet (window.boing, 32-byte AccountIds, Ed25519). It does not execute EVM transactions; for EVM chains use the cross-chain interface at Boing Finance.
👋 Everyday users: create or import a wallet, copy your 64-character address, get testnet BOING from the faucet, send, stake. The Chrome/Firefox extension adds “Connect wallet” for dApps.
🛠️ Developers: injectwindow.boing. Methods:boing_requestAccounts,boing_sendTransaction, DEX list RPCs. See docs/WALLET_CONNECTION_AND_API.md.
🛰️ Operators:VITE_BOING_TESTNET_RPCdefaults tohttps://testnet-rpc.boing.network. Mainnet stays off untilVITE_BOING_MAINNET_RPCis a distinct URL.
flowchart LR
You[You] --> Web[🌐 boing.express]
You --> Ext[🧩 Extension]
Web --> Enc[🔐 Encrypted keys in browser]
Ext --> Enc
Ext --> Inject[window.boing]
Inject --> DApp[dApps]
Enc --> RPC[testnet-rpc.boing.network]
DApp --> RPC
- Boing Network: Ed25519 addresses (32-byte AccountId, 64-char hex), send/receive BOING, testnet faucet, staking (Bond/Unbond/ClaimUnbond)
- Assets / NFTs: BOING balance plus reference-NFT watchlist, recent-block discovery, and
transfer_nft(see docs/DEVELOPMENT.md). Official NFT↔fungible companion peers are read from the on-chain registry and shown under matching collections — BOING-LINKED-NFT-TOKEN.md. Optional on-chain builder attested signal (separate registry; read-only when surfaced) — BOING-BUILDER-ATTESTATION.md - Signing: BLAKE3 signable hash + Ed25519; bincode layout matches
boing-primitives - Security: Client-only key generation, password-encrypted storage (AES-GCM), keys never sent to any server
- Recovery phrase: new wallets get a 24-word BIP-39 phrase (import accepts 12 or 24); SLIP-0010 Ed25519, no new dependencies. Raw-key accounts keep working unchanged. Shown again only after your password. docs/RECOVERY_PHRASE_DESIGN.md
- Extension: Injects
window.boingfor dApp connect; Connected sites management in the popup
- React 18 + TypeScript + Vite (static build →
dist/) - @noble/ed25519 and @noble/hashes (BLAKE3)
- Cloudflare Pages; optional RPC gateway Worker (docs/RPC_GATEWAY.md)
pnpm install
pnpm devOpen http://localhost:5173. Production build: pnpm build → dist/.
| Variable | Description |
|---|---|
VITE_BOING_TESTNET_RPC |
Testnet JSON-RPC (default https://testnet-rpc.boing.network) |
VITE_BOING_MAINNET_RPC |
Optional mainnet JSON-RPC. Leave unset until official mainnet is published |
Set these in Cloudflare Pages Build → Environment variables (baked in at build time).
- Pages project, build
pnpm build, outputdist, domain boing.express - GitHub Actions deploys on
main. Secrets:CLOUDFLARE_ACCOUNT_ID,CLOUDFLARE_API_TOKEN - Optional RPC gateway:
pnpm run gateway:deploy— see docs/RPC_GATEWAY.md
pnpm build
npx wrangler pages deploy dist --project-name=boing-walletpnpm run build:extensionChrome: chrome://extensions → Developer mode → Load unpacked → extension/ folder.
Firefox: about:debugging → Load Temporary Add-on → extension/manifest.json.
Recommended pre-review copy: pnpm run build:extension:unpacked → load extension-unpacked/. Store zip: pnpm run zip:extension. Listing checklist: docs/EXTENSION_STORE.md.
- Address: 32-byte AccountId = Ed25519 public key, 64 hex chars (optional
0x) - Submit:
hex(bincode(SignedTransaction))viaboing_submitTransaction - Explorer:
https://boing.observer/account/<address> - Alignment: THREE-CODEBASE-ALIGNMENT.md
Questions or feedback? Join the Boing Network Discord.
Full index with "I want to..." shortcuts: docs/README.md.
| Doc | For |
|---|---|
| docs/WALLET_CONNECTION_AND_API.md | window.boing provider API |
| docs/BOING-EXPRESS-WALLET.md | Provider / RPC-forwarding reference (the canonical product spec of the same name is in boing.network) |
| docs/DEVELOPMENT.md | Environment, CI, Chrome Web Store checklist |
| docs/TESTING.md | Unit, web and extension e2e tests |
| docs/NETWORK_SETUP.md | Network config, runtime node check, signing chain id |
| docs/RPC_GATEWAY.md | Optional HTTPS JSON-RPC Worker |
| docs/SECURITY.md | Security model, auto-lock, CSP |
| docs/EXTENSION_STORE.md | Store listing copy and screenshots |
| docs/WEB-SIGNING-FLOW.md | Web signing (/connect) flow for dApps |
| docs/BULK-TRANSFER.md | Bulk mode in the Transfer tab |
| docs/PUT-BLOB-PUBLISH-SESSION.md | boing_requestPutBlobSession publish sessions |
| docs/RECOVERY_PHRASE_DESIGN.md | Recovery phrase decision and implementation |
| docs/DESIGN_SYSTEM.md | UI tokens, following BRAND.md |
| docs/ASSETS_AND_FONTS.md | Brand assets and fonts |
| docs/CODEBASE-ALIGNMENT.md | Local summary of cross-repo URLs |
| docs/HANDOFF.md | Portal / protocol handoff and backlog |
| docs/BOING_NETWORK_WALLET_IMPLEMENTATION_CHECKLIST.md | Wallet implementation checklist |
| Upstream BOING-LINKED-NFT-TOKEN.md | On-chain NFT↔token link registry (SDK / dApp discovery) |
| Upstream BOING-BUILDER-ATTESTATION.md | On-chain builder attestation registry (builder signal; companions remain project authority) |
- Backup check: new wallets default to a 24-word recovery phrase (BIP-39, SLIP-0010 Ed25519 path
m/44'/1112492366'/0'/0'/0'); you must confirm three words before continuing. Choosing "Private key" instead keeps the classic check (retype the last 6 characters). Import accepts a 12 or 24 word phrase or a raw key. See docs/RECOVERY_PHRASE_DESIGN.md. - Plain-language errors: RPC and node errors are translated (for example "insufficient balance", "nonce too low", "wrong network").
- Wrong-network guard: a banner appears and broadcasting is refused when the node is on a different chain than the one you selected.
- Auto-lock: the extension locks after 15 idle minutes by default (Settings).
- dApp prompts: explicit "Connect to this site?" and signing approvals, with warnings for suspicious origins.
More: docs/SECURITY.md, docs/NETWORK_SETUP.md, docs/TESTING.md.
| Command | Purpose |
|---|---|
pnpm dev |
Vite dev server on http://localhost:5173 |
pnpm build |
Type check and build dist/ (runs prebuild: chain defaults and brand assets) |
pnpm preview |
Preview the production build |
pnpm run build:extension |
Build the MV3 extension into extension/ |
pnpm run build:extension:load |
Build the extension and prepare it for "Load unpacked" |
pnpm run build:extension:unpacked |
Build and copy the unpacked extension |
pnpm run zip:extension |
Zip the built extension for upload |
pnpm run typecheck:ext |
Type check the extension sources |
pnpm test |
Unit tests (Vitest) |
pnpm test:e2e:web |
Web end-to-end tests (Playwright) |
pnpm test:e2e |
Extension end-to-end tests (builds the extension first; see docs/TESTING.md for EXTENSION_E2E flags) |
pnpm run fixtures:sync / fixtures:check |
Sync / verify chain-metadata fixtures against boing.network |
pnpm run generate:chain-defaults / generate:brand-assets |
Regenerate chain defaults / brand assets |
pnpm run pages:deploy |
Build and deploy to Cloudflare Pages |
pnpm run gateway:dev / gateway:deploy |
Run / deploy the optional RPC gateway Worker |
Maintainers also have publish:extension, prepare:extension, copy:extension:unpacked (see docs/DEVELOPMENT.md).
Requires Node 20+ and pnpm 9 (corepack enable).
MIT