The problem with reusable addresses
When multiple payments go to the same address, they are trivially linkable:Stealth meta-addresses
Instead of sharing a wallet address, you publish a stealth meta-address. This contains two public keys encoded together:st:eth: prefix identifies the scheme and chain family. The two keys serve different roles.
Spending key
Used to derive stealth addresses. The private half lets you spend funds sent to any stealth address generated from it.
Viewing key
Used to scan for incoming payments. The private half lets you detect payments without the ability to spend them.
- ERC-6538 — Stealth Meta-Address Registry: stores your meta-address on-chain, keyed to your wallet.
- ERC-5564 — Stealth Address Messenger: defines the announcement format senders publish after each payment.
.wraith names so you can register alice.wraith instead of sharing a raw hex string.
The two-key flow
Setup (one time)
You sign a message with your wallet. Wraith derives your spending key and viewing key from that signature inside the TEE, encodes them as a stealth meta-address, and registers it on-chain under your
.wraith name.Sender generates a stealth address
The sender resolves your Internally the sender:
.wraith name to your meta-address, then generates a one-time stealth address from it using the low-level crypto primitives:- Generates a random ephemeral key pair
(r, R) - Computes a shared secret via ECDH:
S = r × viewingPubKey - Hashes the secret:
h = keccak256(S) - Derives the stealth address:
spendingPubKey + h × G - Sends funds to that address
- Publishes an on-chain announcement containing
(R, viewTag)
Sender publishes an announcement
The announcement is a public on-chain event containing the ephemeral public key
R and a 1-byte view tag. It reveals nothing about who the recipient is — it is only useful to someone who holds the matching viewing key.Recipient scans for payments
You scan the chain’s announcements using your viewing key. For each announcement, Wraith checks whether it belongs to you:Or via the agent with natural language:
View tags: fast scanning
Without view tags, checking whether an announcement belongs to you requires a full ECDH computation and elliptic curve point addition for every announcement on-chain. At scale this is slow. View tags add a 1-byte shortcut published alongside each announcement. When scanning, you first compare just this byte:- If it does not match, skip — this rejects ~255 out of every 256 non-matching announcements with a single byte comparison.
- If it does match, proceed to the full ECDH check.
Visual flow
EVM vs. Stellar
The same concept applies on both chain families, adapted to their respective cryptographic primitives:| Step | EVM (secp256k1) | Stellar (ed25519) |
|---|---|---|
| Key derivation | keccak256(r) of wallet signature | SHA-256("wraith:spending:" || sig) |
| ECDH | secp256k1.getSharedSecret | X25519 (Montgomery form) |
| Hash to scalar | keccak256(S) mod n | SHA-256("wraith:scalar:" || S) mod L |
| View tag | keccak256(S)[0] | SHA-256("wraith:tag:" || S)[0] |
| Address format | 0x... (20 bytes) | G... (56 chars) |
| Signing | secp256k1 ECDSA | ed25519 with raw scalar |
Standards
EVM stealth addresses in Wraith are built on two Ethereum standards:- ERC-5564 — defines the announcement format: ephemeral public key, view tag, and stealth address, emitted as an on-chain event after each payment.
- ERC-6538 — defines the meta-address registry: a contract that stores your stealth meta-address on-chain keyed to your wallet address.
- WraithNames — maps human-readable
.wraithnames to meta-addresses on-chain, so senders usealice.wraithinstead of raw hex. - WraithSender — executes the send and the announcement in a single atomic transaction, so they can never get out of sync.
- WraithWithdrawer — sponsors gas for stealth address withdrawals via EIP-7702, so recipients do not need ETH on the stealth address to spend it.
When using the Wraith agent, all of this — key derivation, address generation, announcement, scanning, and spending — is handled automatically. You interact entirely through natural language via
agent.chat().Next steps
Wraith agents and identity
Learn how agents hold your identity and keys on the Wraith network.
Privacy model and TEE security
Understand how keys are protected and how to avoid privacy pitfalls.

