{"id":"ERC-5564","name":"Stealth Addresses","status":"Final","chain":"both","category":{"id":"identity","name":"Identity & Privacy","description":"Who you are on-chain, and what you choose to reveal"},"journeyStages":[{"id":"authentication","name":"Authentication & Identity","description":"Proving who you are and logging in"}],"uxImpact":"Senders generate one-time stealth addresses for recipients — receive funds privately without revealing main wallet. Design implications: show 'Send Privately' option, explain stealth address concept simply, add stealth transaction scanner for recipients. Design decisions: how to onboard users to stealth — complexity vs privacy benefit, whether to default to private or make it opt-in, scanning UX for finding received funds. 77K addresses deployed via Umbra. Part of the On-Chain Activity Is Public by Default pain point (High severity, Research status). Users often don't realize their complete financial history is visible — stealth addresses are one of four leading privacy solutions.","hasDetailedContent":true,"content":{"id":"ERC-5564","sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/erc-5564","type":"official-spec"}],"lastReviewed":"2026-05-25","lastUpdated":"2026-05-25","summary":"Senders generate one-time stealth addresses for recipients — receive funds privately without revealing main wallet.","partialDeployment":{"body":"Many wallets support sending to a private receiving profile, but inbox scanning and claim flows are not universal yet. Label what each wallet can do, offer Rescan, and never imply funds are lost when a payment has not appeared."},"designerTakeaways":["You can offer Send privately alongside normal send with plain-language privacy benefit.","Your receive flow can show a stealth receiving address separate from your public wallet.","You can build a stealth payment inbox that scans and surfaces incoming deposits."],"applicability":{"whenToUse":["Privacy is a core product value.","Users receive donations, salary, or payments without public linkage.","Wallet supports stealth key generation and scanning."],"whenToAvoid":["Compliance requires transparent recipient identity on every transfer.","Wallet lacks scanning infrastructure — users would miss funds.","Simple public address send meets the need with less risk."]},"prototypeFirst":[{"screen":"Send privately composer","why":"Senders need privacy without learning stealth jargon.","covers":["Stealth recipient","Amount","Confirmation"],"include":["Send privately toggle","Recipient stealth address field","Privacy explainer one-liner"]},{"screen":"Stealth receive setup","why":"Recipients must register and share the right meta-address.","covers":["Unregistered","Registered","Share sheet"],"include":["Register for private payments CTA","Meta-address copy","QR for stealth receiving"]},{"screen":"Stealth payment inbox","why":"Funds are invisible until scanned — inbox is critical.","covers":["Scanning","New payment found","Empty"],"include":["Scan now button","Incoming payment rows","Claim or acknowledge flow"]},{"screen":"Privacy onboarding","why":"First-time users need metaphor before math.","covers":["Opt-in education","Skip"],"include":["One-time address analogy","When to use public vs private","Do not show keys by default"]}],"mentalModel":[{"label":"Public wallet","description":"Your normal address — full history visible on explorers."},{"label":"Stealth meta-address","description":"A receiving profile from which one-time addresses are derived — not where funds sit."},{"label":"Ephemeral deposit address","description":"Sender pays to a unique address linked only to recipient via cryptography."},{"label":"Scanning","description":"Recipient wallet scans chain to detect payments to addresses only they can recognize."},{"label":"Spending","description":"Detected funds move to spendable balance after recipient claims with derived keys."}],"statesToDesign":[{"state":"Stealth not set up","trigger":"User has no stealth keys.","userNeed":"Start receiving private payments.","designResponse":"Onboarding card with Register for private payments."},{"state":"Scanning for payments","trigger":"User opens inbox or background scan runs.","userNeed":"Know scan is working.","designResponse":"Scanning indicator with last checked time."},{"state":"New stealth payment detected","trigger":"Scan finds incoming deposit.","userNeed":"See amount and sender hint if available.","designResponse":"Inbox row with Accept or Review action."},{"state":"Send privately confirmation","trigger":"Sender submits stealth payment.","userNeed":"Confirm sent without exposing recipient main wallet.","designResponse":"Sent privately confirmation; no link to recipient public address."},{"state":"Scan failed or missed payment","trigger":"Indexer lag or user on new device.","userNeed":"Recover without panic.","designResponse":"Rescan CTA and support path; never imply funds are lost."}],"designDecisions":[{"question":"Default to private or opt-in?","recommendation":"Opt-in with clear Send privately toggle; keep public send default for familiarity.","rationale":"Stealth misses funds if scanning fails — defaulting private is risky."},{"question":"How much cryptography to show?","recommendation":"Meta-address copy button only; hide derivation details.","rationale":"Keys and schemes overwhelm; outcomes matter."},{"question":"Automatic background scan?","recommendation":"Yes with manual Rescan and notification on new payment.","rationale":"Users will not manually scan every session."}],"problemsSolved":[{"problem":"All wallet activity is public","oldWay":"Single address reveals full financial history","newWay":"One-time deposit addresses unlink payments from main wallet","impact":"critical"},{"problem":"Sharing address reveals entire history","oldWay":"Give address to receive payment, they see all your transactions","newWay":"Generate fresh address per sender","impact":"critical"},{"problem":"Donation and salary privacy","oldWay":"Recipients expose net worth on chain","newWay":"Stealth receive hides incoming payment graph","impact":"high"},{"problem":"Sender links to recipient forever","oldWay":"Permanent address ties parties in explorer graph","newWay":"Ephemeral address breaks long-term linkability","impact":"high"},{"problem":"Reusing addresses destroys privacy","oldWay":"Manual new address per payment = terrible UX","newWay":"Automatic stealth address generation","impact":"high"}],"uxPatterns":[{"name":"Share Stealth Meta-Address","description":"Give out a receiving profile that enables private payments.","mockup":"concept/stealth-receive","components":["StealthMetaAddressDisplay"],"userFlow":["User wants to receive payment privately","Opens private receiving setup","Copies or shows QR of meta-address","Shares with sender"]},{"name":"Send Privately Toggle","description":"Optional stealth send in transfer composer.","mockup":"concept/stealth-address","components":["PrivacyToggle","StealthAddressInput","SendButton"],"userFlow":["User composes send","Enables Send privately","Enters meta-address","Confirms","Payment sent to ephemeral address"]},{"name":"Send to Stealth Address","description":"Send payment privately to a recipient meta-address.","mockup":"concept/stealth-address","components":["StealthSendForm","PrivacyIndicator"],"userFlow":["User pastes recipient meta-address","Enters amount","System generates unique deposit address","Shows privacy assurances","Sends and publishes announcement for recipient"]},{"name":"Stealth Payment Inbox","description":"Scan and list incoming private payments.","mockup":"concept/stealth-inbox","components":["ScanButton","PaymentList","AcceptAction"],"userFlow":["User opens inbox","Scan runs","Payments appear","User accepts into balance"]},{"name":"Claim Stealth Payment","description":"Move funds from a stealth deposit to a spendable wallet.","mockup":"concept/stealth-inbox","components":["ClaimDestinationPicker","PrivacyIndicator"],"userFlow":["User selects payment to claim","Sees payment details","Chooses destination (main vs fresh wallet)","Warned if main wallet breaks privacy","Claims to chosen destination"]}],"uiComponents":[{"name":"StealthMetaAddressDisplay","description":"Show and share private receiving profile","states":["generating","ready","copied"],"props":["metaAddress","onCopy","showQR"]},{"name":"StealthInbox","description":"Scan and list stealth payments","states":["scanning","found-payments","no-payments","error"],"props":["payments[]","onClaim","scanProgress"]},{"name":"StealthSendForm","description":"Form for sending to a stealth meta-address","states":["entering","generating","confirming","sent"],"props":["recipientMetaAddress","amount","generatedAddress","onSend"]},{"name":"ClaimDestinationPicker","description":"Choose where to claim a stealth payment","states":["selecting","warning","confirmed"],"props":["mainWallet","freshAddressOption","onSelect"]},{"name":"PrivacyIndicator","description":"Show privacy level of an action","states":["private","partially-private","public"],"props":["privacyLevel","explanation"]}],"seenInTheWild":[{"app":"Umbra","url":"https://umbra.cash/","note":"Stealth address pioneer with 77K+ deployments; reference for scan UX."},{"app":"Railgun","url":"https://railgun.org/","note":"Private transfer patterns inform send/receive mental models."},{"app":"Safe","url":"https://safe.global/","note":"Multi-chain wallets exploring privacy receive flows."},{"app":"Vitalik blog","url":"https://vitalik.eth.limo/","note":"Stealth address explainer shapes user-facing metaphors."}],"antiPatterns":[{"pattern":"Stealth receive with no scanner","why":"Users never see incoming funds","instead":"Mandatory inbox with auto-scan and notifications","severity":"critical"},{"pattern":"Claiming to main wallet by default","why":"Links stealth payment to main identity and defeats privacy","instead":"Default to fresh address; warn if main wallet selected","severity":"critical"},{"pattern":"Showing stealth and public address interchangeably","why":"Senders pay to wrong target","instead":"Distinct labels: Public address vs Private receiving profile","severity":"critical"},{"pattern":"Auto-claiming to main wallet","why":"User loses privacy without knowing","instead":"Always ask where to claim and explain implications","severity":"critical"},{"pattern":"No scanning progress indicator","why":"Scanning can take time; users think the inbox is broken","instead":"Show scanning progress and found count","severity":"high"},{"pattern":"Privacy jargon in primary CTA","why":"Users avoid feature they do not understand","instead":"Send privately with one-line benefit copy","severity":"high"}],"vocabulary":[{"use":"Send privately","avoid":"Generate stealth address","why":"Outcome language over cryptography."},{"use":"Private receiving profile","avoid":"Stealth meta-address","why":"Metaphor before protocol terms."},{"use":"Check for incoming payments","avoid":"Scan stealth tags","why":"Action users understand."}],"onMonad":[{"aspect":"Scan throughput","ethereum":"Scanning large history is slow","monad":"High throughput chains need efficient scan indexing","designImplication":"Invest in fast inbox scan; show progress for large histories."},{"aspect":"Claim cost","ethereum":"Each claim costs gas, discouraging small payments","monad":"Cheap claims make small stealth payments viable","designImplication":"Small private tips and donations become practical."},{"aspect":"Private send cost","ethereum":"Stealth txs may cost more","monad":"Lower fees reduce barrier to privacy opt-in","designImplication":"Do not warn heavily about gas for private sends on Monad."},{"aspect":"Claim finality","ethereum":"Claim tx takes ~15 seconds","monad":"Sub-second claim finality","designImplication":"Instant access to received funds after claim."}],"keyTakeaways":["ERC-5564 = privacy through one-time deposit addresses","Share a private receiving profile; receive to unlinkable addresses","Default claims to a fresh wallet; warn before claiming to main","Show scanning progress when checking the inbox","Explain privacy benefits in plain language, not cryptography"],"technicalNotes":"ERC-5564 stealth requires reliable scanning; never ship receive-only stealth without inbox UX.","relatedStandards":[{"id":"ERC-6538","relationship":"Registry for discovering stealth meta-addresses"},{"id":"ERC-721","relationship":"Optional NFT privacy extensions"}]},"sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/erc-5564","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=ERC-5564","type":"discussion"},{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/erc-5564","type":"official-spec"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-5564","markdown":"https://www.eipsfordesigners.com/standards/ERC-5564/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-5564/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-5564","official":"https://eips.ethereum.org/EIPS/erc-5564","discussion":"https://ethereum-magicians.org/search?q=ERC-5564"},"freshness":{"lastReviewed":"2026-05-25","lastUpdated":"2026-05-25"}}