CORE FEATURE

Stealth Transfers

Send ETH privately to any .dust name. Each payment lands at a unique one-time address that only the recipient can detect.

The Problem

On any public EVM chain, every transaction is permanently visible. When someone pays you at your regular wallet address, anyone can: see your total balance, trace every prior payment, learn your income, and profile your spending habits. Sharing your address is a privacy risk.

Stealth transfers solve this by making each payment land at a fresh, unlinkable, one-time address — while still being discoverable by the recipient through a secret only they hold.

How Stealth Transfers Work

STEALTH TRANSFERS / ECDH DERIVATION
alice.dust meta-addressGR = r×G
PUBLICSPEND KEY
PUBLICVIEW KEY
SENDER
01
Sender picks random scalar r, computes R = r × G
Ephemeral keypair on secp256k1
02
Compute shared secret
sharedSecret = r × viewKey
SHARED SECRET
03
Derive stealth address
addr = spendKey + hash(sharedSecret) × G
STEALTH ADDRESSunique · one-time · unlinkable

Sender has

Recipient's stealth meta-address — their two public keys (spendKey, viewKey) fetched from StealthNameRegistry.

Recipient has

Their stealth private keys — derived from their wallet signature + PIN via PBKDF2. Never stored, always recomputed locally.

  1. 01

    Sender picks a random scalar r

    A fresh random number r is generated in the browser for every payment. This is the ephemeral private key — it produces a unique payment every time, even if the same sender pays the same recipient repeatedly.
  2. 02

    Compute shared secret via ECDH

    Using elliptic curve Diffie-Hellman on secp256k1: sharedSecret = r × viewKey. Only someone who knows either r (the sender's ephemeral secret) or viewKey (the recipient's private view key) can compute this value.
  3. 03

    Derive the stealth address

    stealthAddress = spendKey + hash(sharedSecret) × G. This is a normal Ethereum address. Nothing on-chain identifies it as belonging to any particular person. The sender computes R = r × G (the ephemeral public key) to publish as a hint.
  4. 04

    Send ETH + publish announcement

    ETH is transferred directly to stealthAddress. Simultaneously, the sender calls ERC5564Announcer.announce(schemeId, stealthAddress, R, metadata). This emits a public event — it's the broadcast hint that all recipient scanners read.
  5. 05

    Recipient's scanner detects the payment

    The recipient's browser scanner fetches all recent announcements. For each one, it computes sharedSecret = viewKey × R and checks if the derived stealth address matches. When it does, the payment is detected and shown in Activities.
  6. 06

    Gasless claim via ERC-4337

    The recipient clicks Claim. The browser derives the stealth private key (spendKey + hash(sharedSecret)) and signs a UserOperation. A DustPaymaster-sponsored relayer submits it — a StealthAccount is deployed at the stealth address and immediately drains its balance to the recipient's chosen claim address. Gas is zero for the recipient.

.dust Names

Instead of sharing two raw public keys, users register a readable name on the StealthNameRegistry contract. Names are up to 32 characters and end with .dust.

Name typeExampleUse case
Primary namealice.dustMain identity
Sub-accountwork.alice.dustSegment payment streams
Custom link/pay/alice/freelanceTrack per-campaign analytics

Sub-accounts

Sub-accounts (e.g. work.alice.dust) use the same stealth key pair but register separately — allowing different payment streams to flow to the same recipient without any on-chain connection.

Security Model

spendKey

The private key that controls stealth funds. Derived from wallet signature + PIN. Never leaves the browser.

viewKey

Used only for scanning. Allows detecting incoming payments without spending authority. The public part (viewKey × G) is on-chain.

Ephemeral key r

Generated fresh per payment by the sender. Discarded after the announcement. Creates unlinkability.

Announcements

Published on-chain but contain no decryptable private information. Only viewKey holders can match them to stealth addresses.

V2 Keys (BN254)

DustPool V2 uses separate keys on the BN254 curve for FFLONK proofs. The spending key and nullifier key are derived from the same wallet signature + PIN but reduced modulo the BN254 field order.

Works with DustPool V2

Stealth transfers are the first step in the Dust privacy pipeline. After claiming stealth payments, deposit them into DustPool V2 to break the fan-in correlation. V2 supports arbitrary amounts — no need to split claims into fixed denominations before depositing.

Standards

ERC-5564ERC-6538ERC-4337secp256k1 ECDHPBKDF2-SHA512BN254 (V2)Poseidon (V2)

View contract addresses →