Rand Protocol
Wallets

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.

Rand Wallet icon

iOS

Coming to the store
Mobile · Swift · SwiftUI
Distributed through
TestFlight while in testing, then the App Store
Requires
iOS 16 or later
Store listing pending. Until it clears review, build it from source.
Rand Wallet for iOS

Android

Download 0.8.1
Mobile · Java
Distributed through
Google Play, open testing first
Requires
Android 8 (API 26) or later, arm64 or x86_64
Download for Android
Google Play listing pending.
Rand Wallet for Android

Chrome

Download 0.8.1
Browser extension · JavaScript · Manifest V3
Distributed through
the Chrome Web Store; also installs in Edge and Brave
Requires
Chrome 116 or later
Download for Chrome
Chrome Web Store listing pending.
Rand Wallet for Chrome

Firefox

Download 0.8.1
Browser extension · JavaScript · Manifest V3
Distributed through
addons.mozilla.org
Requires
Firefox 140 or later
Download for Firefox
Firefox Add-ons listing pending.
Rand Wallet for Firefox

Windows

Download 0.8.1
Desktop · Tauri · Rust core, shared interface
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
Desktop · Tauri · Rust core, shared interface
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
Desktop · Tauri · Rust core, shared interface
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
Web · JavaScript · WebAssembly core
Distributed through
a checkout of the clients repository, served on your own machine
Requires
Node 20 or later; a current browser
Served from your own checkout, not hosted anywhere.
Rand Wallet on the web

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.

Create a wallet

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.

Create a wallet in this browser
Loading the key code…
  1. Wait for the badge above to read Ready offline. Everything the wallet needs is then in this tab.
  2. Turn off Wi‑Fi, or switch on airplane mode. Keep this tab open.
  3. Generate. The spend key comes from your device's own randomness and never leaves it.
  4. Download wallet.key.json and copy the address. Then reconnect.

Every client

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.

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.
How it works

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.

Testnet notes

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
Build from source

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.

Source
randprotocol/clients
GPL-3.0-only
Build the core, then a client
bash
# 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 …