{"id":"EIP-6963","name":"Multi Injected Provider Discovery","status":"Final","chain":"both","category":{"id":"onboarding","name":"Onboarding & Access","description":"Getting users into web3 without friction"},"journeyStages":[{"id":"discovery","name":"Discovery & Connection","description":"Finding and connecting wallet to dApp"}],"uxImpact":"Users with multiple wallet extensions see all installed wallets in a selection modal — no more random 'last wallet wins' behavior. Design implications: replace single 'Connect Wallet' button with wallet picker showing icons, names, and rdns identifiers; render wallet icons as 96x96px minimum using <img> tags (SVGs must not execute scripts); design empty states for when no wallets are detected. Design decisions: choose between showing all wallets immediately vs progressive disclosure, decide wallet list ordering (alphabetical, most-used, last-connected), consider whether to remember user's preferred wallet across sessions, handle edge cases where wallets may impersonate others via rdns. 🟢 Live on 37+ wallets (Critical priority for wallet connection UX). Important limitation: solves desktop wallet conflicts but does NOT apply to mobile — mobile connection remains a known pain point (Connection Failures, Medium severity).","hasDetailedContent":true,"content":{"id":"EIP-6963","summary":"EIP-6963 solves the \"wallet conflict\" problem. When users have multiple wallets (MetaMask, Coinbase, Rainbow), they used to fight over window.ethereum. Now, each wallet announces itself, and users see a clean list to choose from. No more random wallet hijacking the connection.","applicability":{"whenToUse":["Users may have more than one browser wallet installed.","Connect flows need wallet icons, names, and explicit user choice.","The product targets desktop browsers where extensions compete for injection."],"whenToAvoid":["Mobile wallet connection uses deep links or WalletConnect only.","The product binds to one wallet provider with no user choice.","Wallet discovery is handled entirely outside your UI (embedded wallet only)."]},"designerTakeaways":["You can show every detected wallet in a picker instead of auto-connecting the last one loaded.","You can display wallet icons and names so users know which extension they are approving.","You can remember the last chosen wallet while still letting users switch on reconnect."],"mentalModel":[{"label":"Page load","description":"The dApp dispatches eip6963:requestProvider and listens for wallet announcements instead of assuming window.ethereum."},{"label":"Wallet announcement","description":"Each extension responds with its name, icon, rdns, and EIP-1193 provider. Multiple wallets can coexist without overwriting each other."},{"label":"User choice","description":"Your connect modal lists every detected wallet with branding. Never auto-connect the first provider found."},{"label":"Selected provider","description":"Connection proceeds with the chosen provider only. Remember the last choice for reconnect but keep switch visible."},{"label":"Mobile fallback","description":"When no injected wallets exist, route to WalletConnect or deep links without breaking the desktop picker pattern."}],"problemsSolved":[{"problem":"Multiple wallets fighting for window.ethereum","oldWay":"Last wallet to load wins, user can't choose","newWay":"Each wallet announces itself, user picks","impact":"critical"},{"problem":"Users forced to disable wallets to use another","oldWay":"Disable MetaMask extension to use Rabby","newWay":"All wallets coexist, choose at connection time","impact":"high"},{"problem":"No wallet branding in connection flow","oldWay":"Generic \"Connect Wallet\" with no context","newWay":"See wallet icons, names, choose your preference","impact":"medium"}],"uxPatterns":[{"name":"Wallet Selector Modal","description":"List of all available wallets to connect","mockup":"concept/wallet","userFlow":["User clicks Connect","App listens for EIP-6963 announcements","Shows list of detected wallets","User clicks preferred wallet","Connection proceeds with that wallet"]},{"name":"Wallet Discovery Badges","description":"Show which wallets are available before connect","mockup":"concept/wallet-discovery","userFlow":["Page loads, discovers wallets","Shows wallet icons as preview","User sees their wallet is supported","Clicks connect with confidence"]}],"uiComponents":[{"name":"WalletList","description":"Scrollable list of available wallets","states":["loading","discovered","empty"],"props":["wallets[]","onSelect"]},{"name":"WalletOption","description":"Single wallet row with icon, name, and status","states":["idle","selected","connecting"],"props":["wallet","onClick"]},{"name":"WalletIcon","description":"Wallet brand icon with fallback","states":["loaded","fallback"],"props":["icon","name"]}],"antiPatterns":[{"pattern":"Ignoring EIP-6963 and only using window.ethereum","why":"User has no choice, random wallet selected","instead":"Listen for eip6963:announceProvider events","severity":"high"},{"pattern":"Not showing wallet icons/branding","why":"Users can't identify their wallet in the list","instead":"Display wallet icon and name from rdns","severity":"medium"},{"pattern":"Auto-selecting first wallet found","why":"Removes user choice, may pick wrong wallet","instead":"Always let user explicitly choose","severity":"high"}],"onMonad":[{"aspect":"Wallet Discovery","ethereum":"Standard EIP-6963 discovery","monad":"Same mechanism, works identically","designImplication":"No changes needed for Monad support"}],"keyTakeaways":["EIP-6963 = multiple wallet discovery","Always show wallet selector, never auto-pick","Display wallet icons and names clearly","Fall back to WalletConnect for mobile","Handle no-wallets-detected gracefully"],"technicalNotes":"EIP-6963 uses DOM events for discovery. dApps dispatch eip6963:requestProvider, wallets respond with eip6963:announceProvider containing provider info (icon, name, rdns) and the EIP-1193 provider. This allows multiple wallets to coexist without overwriting window.ethereum."},"sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/eip-6963","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=EIP-6963","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/EIP-6963","markdown":"https://www.eipsfordesigners.com/standards/EIP-6963/content.md","agent":"https://www.eipsfordesigners.com/standards/EIP-6963/agent.md","api":"https://www.eipsfordesigners.com/api/standards/EIP-6963","official":"https://eips.ethereum.org/EIPS/eip-6963","discussion":"https://ethereum-magicians.org/search?q=EIP-6963"},"freshness":{"lastReviewed":"2026-04-05","lastUpdated":"2026-04-05"}}