Key material
When a user signsSETUP_MESSAGE, the SDK derives:
These keys are chain-neutral: the same wallet has one meta-address across Ethereum, Solana, and Starknet.
Meta-address
A 98-byte value (viewing pubkey ‖ secp256k1 spending pubkey ‖ ed25519 Solana spend pubkey) registered onStealthMetaAddressRegistry. Share it so senders can derive one-time destinations without linking payments to your public identity. (Legacy 66-byte V‖S values still work for Ethereum.)
The same meta-address serves all three chains — only custody differs: an EVM address on Ethereum, an ed25519 account on Solana, and a counterfactual OpenZeppelin EthAccount (signed by the one-time secp256k1 stealth key P_stealth) on Starknet.
Send flow
- Resolve recipient meta-address (registry lookup or direct hex)
prepareStealthSend(meta)derives an ephemeral keypair + one-time stealth address- Transfer native asset to the stealth address
announceonStealthAddressAnnouncerso the recipient can scan
sendStealthPayment for a single high-level call. To weaken timing analysis,
delay the announcement or interleave decoy announcements; see
Anonymity utilities.
Starknet send and sweep go through dedicated builders —
buildStarknetStealthSend
and buildStarknetSweep — that return unsigned calls for the app’s Starknet wallet to
broadcast; the generic sendStealthPayment facade covers Ethereum and Solana only. See
Starknet for the full flow.Receive flow
- Indexer or adapter fetches
Announceevents - WASM view-tag prefilter + DKSAP ownership check (
filterOwnedAnnouncements) - Reconstruct signing key (
getStealthSignerPrivateKey) - Sweep to a fresh address (
sweep)