Web Wallet
The XE web wallet
The XE web wallet is the key-holding half of the web UI embedded in every node. It manages accounts, sends and receives assets, runs P2P chat, exposes a provider dashboard and a DAO governance workspace -- all without any server-side component holding keys.
The wallet and the explorer are two sections of the same application, shipped inside the xe binary.
Key properties
- Client-side keys -- seeds are encrypted with AES-GCM and stored in
localStorage. Decrypted seeds exist only in memory during an active page session. - Multi-wallet -- several accounts in one encrypted vault, sharing one passphrase, with an active-wallet switcher.
- Local signing and PoW -- blocks are built, hashed, proof-of-worked and signed in the browser using Web Crypto Ed25519. The node is contacted only for chain state and block submission.
- Optional --
xe node --wallet=falseserves404for/walletand/wallet/*, leaving a pure explorer.
Features
| Feature | Description |
|---|---|
| Send | Build, sign and submit send blocks for XE or XUSD, with an optional memo of up to 64 bytes |
| Receive | Turn a pending send into a receive block, one at a time from the pending list |
| Balances | Per-asset total and spendable (finalized) balance |
| Faucet | Request testnet XUSD -- only shown when the node is configured with a faucet target |
| History and activity | The account's recent chain, plus a local log of what this browser did |
| Multi-wallet management | Add, import, rename, remove, switch, and reveal the seed of a wallet |
| P2P chat | Signed, proof-of-worked messages between accounts |
| Provider dashboard | Capacity, utilisation, active and past leases -- shown when the active account is a provider |
| DAO governance | Draft, hash, sign and submit state chain blocks -- shown when the active account is in the state chain keyset |
Amounts are rendered from uint64 micro-units through helpers mirroring
core/amount.go, so the wallet shows the same decimal strings as the node and the CLI.
[!WARNING] Testnet only The faucet is a testnet facility. The button is hidden unless the node's UI handler is configured with a faucet target, and
xe nodedoes not set one -- so on a stock node it never appears. See thexe faucetCLI command for the equivalent, and note that the faucet service is not yet deployed.
Tech stack
There is no build step and no framework -- the same plain HTML + ES modules + CSS as the explorer. The cryptography is browser-native:
| Purpose | Implementation |
|---|---|
| Key derivation and signing | Web Crypto Ed25519 (seed imported as a PKCS#8 key) |
| Block hashing | Web Crypto subtle.digest (SHA-256) |
| Proof of work | Bundled assets/blake2b.js |
| Seed encryption | Web Crypto AES-GCM with a PBKDF2-SHA-256 derived key |
[!IMPORTANT] Browser requirement Web Crypto Ed25519 is required for signing: Chrome 113+, Firefox 130+, or Safari 17+.
Security model
Seeds are encrypted at rest using AES-GCM with keys derived via PBKDF2-SHA-256 (600,000 iterations), one random salt per wallet and a fresh IV per encryption. Decrypted seeds live in memory only -- they are never written to storage or sent over the network.
To avoid re-prompting on every page navigation, the passphrase may be cached in
sessionStorage with a 30-minute TTL. That cache is per-tab, dies with the tab, and
is cleared by the lock button.
[!WARNING] Browser security The wallet trusts the browser environment. Users should ensure their device is free of malware and use a strong passphrase. The encrypted seeds in
localStorageare only as secure as the passphrase protecting them, and a cached passphrase insessionStorageis roughly as exposed as a decrypted seed in JS memory -- both are reachable by any code running in the same origin.
See Security for the full encryption and session specification.
Serving the wallet
xe node --ui --wallet--wallet defaults to true. The UI listens on --ui-port (default 8000, bound to
127.0.0.1) and reverse-proxies /api/* to the node's HTTP API, so the browser stays
same-origin. GET /features.json reports whether the wallet and faucet are enabled.
See also
- Security -- AES-GCM encryption, session handling, storage schema
- Features -- detailed feature reference
- Explorer -- the read-only section of the same UI
- API Reference -- HTTP endpoints the wallet communicates with