Rand Wallet on the web
The same wallet in an ordinary browser tab, served from your own machine by a small loopback-only server. It is not hosted anywhere, on purpose: a web wallet is only as trustworthy as the origin serving it, and this one is served by you.
Not hosted anywhere. Run it from a checkout of the clients repository, or from the source archive, below.
- Built with
- JavaScript · WebAssembly core
- Distributed through
- a checkout of the clients repository, served on your own machine
- Requires
- Node 20 or later; a current browser
- Sending
- Sends through the RandProtocol prover, or your own
Version 0.8.0
The files are attached to the v0.8.0 release on GitHub; the buttons here are links to them, and nothing is served from this site.
- Unpack it and run web/wallet/serve.sh inside, exactly as from a git checkout. The archive has the full node submodule in it, which GitHub's own “Source code” archives leave out.
# with SHA256SUMS downloaded into the same folder as the file
shasum -a 256 -c SHA256SUMS --ignore-missing # macOS
sha256sum -c SHA256SUMS --ignore-missing # Linux
# or print the sum of one file and compare it with the one above
shasum -a 256 rand-wallet-0.8.0-source.tar.gz A matching sum says the file is the one that was published. It does not say the file was built from the source: the builds are not reproducible bit for bit yet, so if that is what you need to know, build it yourself.
Sends through the RandProtocol prover, or your own
A bundle proof peaks at about 6.2 GB of memory and a browser gives WebAssembly 4 GiB, so the web wallet never proves for itself. It builds the transfer, has a prover make the proof (the RandProtocol prover by default, or one you pair), checks the proof locally and submits it.
To keep your history from the RandProtocol prover, pair the Rand Wallet desktop app on the same computer (Settings → Prove for my other devices) or your own rand-prover. A proof in progress lives only in the tab's memory; reloading the page mid-proof forgets it, and nothing is sent.
A device that cannot make a proof uses the RandProtocol provers by default: a few machines run by the validators (four today, under https://prover.randprotocol.org), no fee. From 0.6.9 each has its own key, which the wallet pins, and the wallet says so before the first send. The machine that proves a send receives the wallet's viewing key and a one-time salt: its operator can read the wallet's whole history, every payment received and sent, and cannot spend. The spend key never leaves your device, which makes the small authorisation proof itself. For more privacy choose your own prover in Settings → Prover, which is then always preferred; the wallet checks every proof before it submits it.
Pairing a prover, step by step: docs/prover.md.
Where the key lives
The spend key is the wallet's one secret. There is no account and no server holding a copy: lose the key and nobody can restore it, so save it when the wallet shows it to you.
Run it from a checkout
- Clone the clients repository and run web/wallet/serve.sh, then open http://127.0.0.1:8787/. The first run builds the WebAssembly core, which takes a few minutes; after that a start is a file copy.
- If you find Rand Wallet at some remote URL, trust it exactly as much as whoever runs that server. For anything that matters, use the desktop app or the browser extension.
Toolchain: Rust 1.98.1, pinned in the repository, which rustup installs. The build guide covers every client from a clean machine. Source directories: web/wallet/, ui/, core/.
git clone --recurse-submodules https://github.com/randprotocol/clients.git && cd clients
git checkout v0.8.0 && git submodule update --init # the release; core/vendor/fullnode @ v0.8.0 (c0878c3)
web/wallet/serve.sh # build, then serve at http://127.0.0.1:8787/
RAND_WALLET_PORT=9000 web/wallet/serve.sh # on another port What it does, on every platform
- Create a wallet
- A spend key generated on the device, shown once for you to save, and the rand1… address derived from it. Import an existing key, or a wallet.key.json from the rand CLI; every client exports the same file.
- Receive and send
- Your balance is the set of notes only your key can open; the wallet scans the commitment tree to find them. A transfer of RAND or of any listed RPL token is one 4-in-4-out bundle authorised by a proof. Nobody learns the sender, the receiver, the amount or which asset moved.
- Faucet
- On a testnet with an open faucet, one tap mints 100 RAND into a note only you can open.
- Disclose only what you choose
- Copy your viewing key and open My history on RandScan to see every note you sent or received, or copy one payment's transaction key to disclose exactly that payment and nothing else. The explorer decrypts in your browser and never sends the key anywhere.
Viewing keys and transaction keys open on randscan.org.
Before you send anything
- Chain
- The public endpoint serves chain 21, live since 12 Oct 2026 10:31 UTC (cut on fullnode v0.8.0). The wallet core vendors fullnode v0.8.0 (c0878c3) and refuses any other chain: chain 21 runs constraint set 9, so a 0.7.x wallet cannot send on it, and this release cannot send on chain 20. Keys and addresses carry over; a wallet that scanned chain 20 shows a different-chain banner once and rescans from chain 21's genesis. Bridge deposits and withdrawals keep a 0.1% fee in zUSD, which the wallet shows before you withdraw.
- RPC endpoint
- Settings → Network. Defaults to https://rpc.randprotocol.org; any rand-node RPC you can reach works, and a saved URL is checked before it is kept
- Proving
- A bundle proof peaks at about 6.2 GB of memory and takes about a minute on a laptop CPU
- Status
- Experimental testnet software. Not audited. RAND on the testnet carries no real value
- Licence
- GPL-3.0-only, like the full node crates every client links
One wallet, every platform
The same key file, address format and rules everywhere: a wallet created here imports into any other client and into the rand CLI.