Skip to content

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;
  • wallet_history.get_burns, get_burn_totals, get_burn_leaderboard and get_fee_totals — the burn monitor.

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.

text
  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. Each balance pill carries a caret ahead of the amount, marking it as the menu it opens.

The interface is translated into nine locales, including the burn monitor.

Burn monitor ​

/burn-monitor shows what has been destroyed by sending it to @null, read from the wallet indexer's burn methods (it needs wallet_indexer_enabled): totals, the list of burn events, the transaction fees burned, and a Top burners leaderboard over the selected window (24h, 7d, 30d or all).

The leaderboard ranks transfers and power-ups to @null and, since indexer v0.4.0, post beneficiary burns credited to the post's author. It shows the liquid total and a BLURT POWER column for vesting burns, each as it was burned (a dash where an account has none). The wallet sends the current BLURT/VESTS ratio as vesting_rate so the indexer can order the two together. It fetches the top 100 in one call and pages through them twenty at a time; the page survives auto-refresh and resets when the window changes.

Manage Auth: the recovery account ​

Besides the posting, active and owner authority lists, Manage Auth has a recovery account section, signed with the owner key (it broadcasts change_recovery_account). It names the account in force, or says that none is set and what follows from that, and reports a pending change with the date it takes effect (read from database_api.find_change_recovery_account_requests).

A change takes effect after the chain's 30-day recovery delay; the current setting holds until then. The confirmation names which of three outcomes a submission produces:

Submitted accountOutcome
any, with no request pendinga first request, effective after the delay
the account already in forcethe pending request is withdrawn, at once
any other accountthe pending request is replaced and the delay restarts

The chain compares the submission with the account in force, not with the one pending, so re-sending a pending name neither confirms nor withdraws it.

Settings: privacy ​

The Privacy section lets an account ask the front-ends to stop showing its blog and its profile. The preference is written with bridge.account_visibility_set, signed with the posting key (the direction is part of what is signed), and read back with bridge.account_visibility_get.

Each nexus-go node keeps the preference in its own store and nodes do not replicate, so the wallet writes to every node in SDC_ALT_API_ENDPOINTS and retries the ones that missed it with the same signed payload. The view reports how many nodes hold the preference rather than a bare success; a node that does not implement the method is reported apart and not retried. This withholds, it does not delete: everything stays on the chain, and anything reading the chain directly can still show it. See nexus-go for its effect on reads.

Configuration ​

Configured with SDC_* environment variables (mapped in config/custom-environment-variables.json), sharing condenser's surface plus the indexer toggle:

VariablePurpose
SDC_WALLET_INDEXER_ENABLEDuse the wallet_history.* accelerated path (else chain fallback)
SDC_CLIENT_BLURTD_URLRPC endpoint the browser uses (the RPC proxy)
SDC_SERVER_BLURTD_URLRPC endpoint the SSR server uses
SDC_USE_APPBASEappbase JSON-RPC calling convention
SDC_CHAIN_IDchain id to sign against
SDC_ADDRESS_PREFIXpublic-key address prefix (BLT)
SDC_ALT_API_ENDPOINTSalternative RPC endpoints
SDC_SESSION_SECRETKEY / SDC_SESSION_KEY / SDC_SESSION_COOKIE_KEYserver session secrets; keep constant
SDC_DATABASE_URLsession/state store connection
SDC_IMAGE_PROXY_PREFIX / SDC_UPLOAD_IMAGE_URLimage proxy and upload service
SDC_PRICE_INFO_URLprice feed for fiat-value displays
SOCIAL_URLlink 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.

Released under the MIT License.