Rand Wallet
A shielded wallet for RAND, one for each platform. It creates a spend key and a rand1… address, finds your notes by scanning the chain with your own key, proves transfers on the device you are holding or, when it lacks the memory, through the RandProtocol provers by default (or a prover of your own), requests funds from the testnet faucet, and gives you the viewing key and per-transaction keys that randscan.org opens confidential transactions with. Nothing about your balance or your payments is visible to anyone you have not handed a key to — and the wallet is no exception: it holds no account, only your notes.
Sign up or sign in to create a wallet on your sale account, where the address goes straight onto your allocation — or make one right here, offline, with no account at all.
iOS
Coming to the store- Distributed through
- TestFlight while in testing, then the App Store
- Requires
- iOS 16 or later
Android
Download 0.8.1- Distributed through
- Google Play, open testing first
- Requires
- Android 8 (API 26) or later, arm64 or x86_64
Chrome
Download 0.8.1- Distributed through
- the Chrome Web Store; also installs in Edge and Brave
- Requires
- Chrome 116 or later
Firefox
Download 0.8.1- Distributed through
- addons.mozilla.org
- Requires
- Firefox 140 or later
Windows
Download 0.8.1- Distributed through
- an .msi installer, from GitHub Releases
- Requires
- Windows 10 or later, with the WebView2 runtime; 8 GiB of memory to send
macOS
Download 0.8.1- Distributed through
- a .dmg, from GitHub Releases
- Requires
- 8 GiB of memory to send; Xcode Command Line Tools to build
Linux
Download 0.8.1- Distributed through
- a .deb, an .rpm, an AppImage or the bare binary, from GitHub Releases
- Requires
- webkit2gtk 4.1; 8 GiB of memory to send
Web
Run locally- Distributed through
- a checkout of the clients repository, served on your own machine
- Requires
- Node 20 or later; a current browser
Version 0.8.1, 2026-10-22. Every download is a file of the v0.8.1 release on GitHub, and each client's page prints its SHA-256; the whole list is SHA256SUMS. Rather compile it? Build it from source. The wallet collects no data: privacy policy · terms of service.
Make one here, offline
The generator on the right is the full node's own key code, compiled to WebAssembly and loaded into this page. Turn off Wi‑Fi once it says it is ready and it still works: the spend key comes from your device's randomness, the address is derived from it on the spot, and nothing is sent anywhere — there is nowhere for it to go.
The address is rand1 plus 1,667 characters: your wallet's note key and the ML-KEM encapsulation key a sender seals a note to, the form chains 18 and 19 run. (Chain 11 tried a 54-character hash of a signing key; it was reverted because a sender cannot seal a note to a hash — the docs have the record.) Load the key file into the rand CLI or any Rand Wallet app and rand address prints the same address.
Want the address on file for a distribution? The address page has the same generator plus an account to save it to: an email and a password, and only the address is stored.
Prefer to check the code first? It is crates/randprotocol-zkvm/src/address.rs in the full node, and the browser wrapper is server/address-wasm on this site's repository.
- Wait for the badge above to read Ready offline. Everything the wallet needs is then in this tab.
- Turn off Wi‑Fi, or switch on airplane mode. Keep this tab open.
- Generate. The spend key comes from your device's own randomness and never leaves it.
- Download wallet.key.json and copy the address. Then reconnect.
Fingerprint Read this out to whoever you're sending it to, or compare it side by side — 16 characters is enough that two different addresses matching by accident does not happen.
Save with fingerprint ? Check it against the one the owner reads out before you save.
Saved in this browser only; clearing site data removes them.
•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
The key file is the wallet. Whoever has it can spend every note the address ever receives; without it, nothing can. Keep it somewhere private and off this browser — a password manager, an encrypted drive — and only then reconnect. The same file opens in the rand CLI (rand address prints this address) and in every Rand Wallet app. The address is public by design — it carries the note key and the ML-KEM encapsulation key a sender seals a note to, which is why it is 1,667 characters long; the spend key is the only secret. Already have a wallet? Its address is what rand address prints — nothing on this site ever asks for the key file or the spend key.
Every platform, one wallet
The same key file, the same address format and the same rules on every platform. A wallet created on the phone imports into the browser and into the rand CLI, and back.
One core, your keys, your prover
Every client wraps one Rust core built from the full node's own crates: the Poseidon2 key hierarchy, the ML-KEM-768 envelopes and the zkVM prover are the node's code, compiled into an XCFramework for iOS, a native library for Android, WebAssembly for the browsers and a linked crate in the desktop app. The Swift, Java and JavaScript above it are the wallet: the RPC client, the note store, and the screens. Your spend key is generated locally from the operating system's randomness and kept encrypted on the device; what the wallet sends to the RPC endpoint is what a bundle publishes anyway — commitments, nullifiers, sealed envelopes and a proof. A proof needs about 6.2 GB of memory, so the desktop app and large phones prove for themselves, and the browser wallets use the RandProtocol provers by default, or a prover you run, which receives the key sealed to it alone.
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
Or build it yourself
The clients repository holds the Rust core, the shared interface, every app and the packaging for each store. The core vendors the full node at v0.6.7, the build chain 19 ran, as a submodule. The build guide goes through every client from a clean machine, and each client's page has its own steps.
# Rust 1.98.1 (pinned; rustup installs it). Xcode 16+ for iOS, JDK 17+ with SDK 36 and NDK 27 for Android, Node 22+ for the extensions
git clone --recurse-submodules https://github.com/randprotocol/clients.git && cd clients # core/vendor/fullnode @ v0.6.7 (86941a1)
cd core && cargo test --release && cd .. # the core, including a real proof (~1 min)
core/scripts/build-wasm.sh # → extension/shared/core/ (installs wasm-bindgen-cli)
core/scripts/build-ios.sh # → ios/Frameworks/RandWalletCore.xcframework
core/scripts/build-android.sh # → android/app/src/main/jniLibs/ (needs an NDK)
scripts/release/build-desktop.sh # the desktop app: dmg / msi / AppImage, deb, rpm
web/wallet/serve.sh # the local web wallet at http://127.0.0.1:8787/
# Then: /clients/ios, /clients/android, /clients/chrome, /clients/firefox, /clients/macos …