Wallet — Reference
The complete reference for the wallet app: its architecture, the wallet-indexer integration and fallback, the main views, and configuration. For a gentle introduction, start with the Quick guide.
The Blurt Wallet (blurt/blurt-wallet) is a dedicated, server-side-rendered React application built from the condenser codebase, specialized to account-money tasks: balances, transfers, history, rewards, delegations, power up/down, and savings.
Architecture
It shares condenser's architecture (see Condenser): React UI, Redux state, redux-saga side effects, react-router, a Koa SSR server, and blurtjs (@blurtfoundation/blurtjs) for building, signing, and broadcasting transactions. The tree mirrors condenser (src/app, src/server, src/shared, src/db).
Transactions are signed client-side; private keys never leave the device and are never held server-side. The wallet's job is to present balances and history and to help the user sign — the authority is always the user's key on blurtd.
Wallet-indexer integration
This is what distinguishes the wallet from condenser. History and reward screens can be served two ways, chosen by one flag:
Accelerated path (wallet_indexer_enabled on). The wallet calls the wallet indexer through the same RPC endpoint, and the RPC proxy routes the wallet_history.* methods to it — no new origin, no separate CORS:
wallet_history.get_wallet_history— paged financial history;wallet_history.get_reward_totals— server-side author/curation reward totals.
The indexer returns pre-decoded, normalized events, so the screens paint instantly instead of the browser paginating and summing chain history.
Fallback path (indexer off or unavailable). The wallet sources history from the chain node with account_history_api.get_account_history and normalizes it into the same event shape, so a single render path handles both sources. This is the client side of the indexer's fallback contract: the accelerator is optional, and the wallet keeps working with correct data if no indexer is running.
history/rewards screen
├─ wallet_indexer_enabled? ──► wallet_history.* (fast, normalized)
└─ else / unavailable ──────► account_history_api.get_account_history
(normalized to the same shape)How it talks to the stack
One RPC endpoint, routed by the proxy:
SDC_CLIENT_BLURTD_URL(browser) /SDC_SERVER_BLURTD_URL(SSR) point at the proxy;wallet_history.*→ wallet indexer;- balances, broadcasts, and the history fallback →
blurtd.
Main views
Balances and available funds, transfer (send/receive), full transaction history, author and curation reward totals, power up / power down (VESTS), delegations, and savings.
Configuration
Configured with SDC_* environment variables (mapped in config/custom-environment-variables.json), sharing condenser's surface plus the indexer toggle:
| Variable | Purpose |
|---|---|
SDC_WALLET_INDEXER_ENABLED | use the wallet_history.* accelerated path (else chain fallback) |
SDC_CLIENT_BLURTD_URL | RPC endpoint the browser uses (the RPC proxy) |
SDC_SERVER_BLURTD_URL | RPC endpoint the SSR server uses |
SDC_USE_APPBASE | appbase JSON-RPC calling convention |
SDC_CHAIN_ID | chain id to sign against |
SDC_ADDRESS_PREFIX | public-key address prefix (BLT) |
SDC_ALT_API_ENDPOINTS | alternative RPC endpoints |
SDC_SESSION_SECRETKEY / SDC_SESSION_KEY / SDC_SESSION_COOKIE_KEY | server session secrets; keep constant |
SDC_DATABASE_URL | session/state store connection |
SDC_IMAGE_PROXY_PREFIX / SDC_UPLOAD_IMAGE_URL | image proxy and upload service |
SDC_PRICE_INFO_URL | price feed for fiat-value displays |
SOCIAL_URL | link back to the social front-end (condenser) |
Build and run
The wallet builds and runs like condenser (React bundle + Koa server) and ships as a container. Provide a stable session secret, point the SDC_*_BLURTD_URL variables at your RPC endpoint, and set SDC_WALLET_INDEXER_ENABLED to match whether your endpoint's proxy routes wallet_history.* to an indexer. See the repository for current build and deployment details.
Where it fits
The wallet is the dedicated money UI and the reference consumer of the wallet indexer: it demonstrates the whole point of that service — fast, normalized history with a transparent fallback — through the same one-URL proxy every front-end uses.
