{"id":"EIP-5749","name":"window.evmproviders Object","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":"Alternative to EIP-6963 using window.evmproviders object — wallets register themselves by name for easy enumeration. Design implications: iterate Object.values(window.evmproviders) to build wallet selection UI, display wallet name, description, and base64 SVG icon for each provider, use snake_case keys as stable identifiers. Design decisions: choose between EIP-5749 vs EIP-6963 (6963 has more adoption), design fallback for wallets only supporting window.ethereum, handle scenario where both standards coexist during transition period.","hasDetailedContent":true,"content":{"id":"EIP-5749","sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/eip-5749","type":"official-spec"}],"lastReviewed":"2026-05-25","lastUpdated":"2026-05-25","summary":"Alternative to EIP-6963 using window.evmproviders object — wallets register themselves by name for easy enumeration.","designerTakeaways":["You can build a wallet grid from window.evmproviders without hard-coding brand lists.","Your connect flow can merge 5749 and EIP-6963 discovery for maximum coverage.","You can remember the user's last wallet key for faster reconnect on return visits."],"applicability":{"whenToUse":["Desktop dApps need to list multiple browser extension wallets.","You want wallet name, description, and base64 SVG icon in the picker.","You are supporting wallets that register via window.evmproviders."],"whenToAvoid":["Mobile-only WalletConnect flows with no injected providers.","Your target wallets only support EIP-6963 and not evmproviders.","Single-wallet environments where a picker adds friction without benefit."]},"prototypeFirst":[{"screen":"Primary happy path","why":"Prove the core user promise before edge cases.","covers":["Success state","Clear outcome copy"],"include":["Primary CTA","Confirmation feedback","Next step"]},{"screen":"Blocked or unsupported state","why":"Users discover limits when wallets or chains lack support.","covers":["Unsupported wallet","Wrong network"],"include":["Plain-language reason","Fallback action"]},{"screen":"Failure recovery","why":"Trust breaks when errors look like bugs.","covers":["User rejection","Transaction revert"],"include":["Retry path","Support context"]},{"screen":"Advanced disclosure","why":"Power users need technical detail without cluttering the default path.","covers":["Contract address","Token ID","Raw status"],"include":["Expandable section","Copy buttons","Explorer link"]}],"mentalModel":[{"label":"Wallet registration","description":"Extensions add themselves to window.evmproviders with a name, icon, and provider object keyed by wallet id."},{"label":"Enumeration","description":"Your dApp reads evmproviders to build the picker grid. Merge with EIP-6963 announcements when both exist."},{"label":"User selection","description":"The user picks a wallet by name and icon. Never assume the first key in the object is their preference."},{"label":"Provider handoff","description":"Connection uses the selected entry provider only. Store the wallet key for faster reconnect on return visits."},{"label":"Missing provider","description":"When evmproviders is empty, fall back to EIP-6963 events or WalletConnect without breaking the connect flow."}],"statesToDesign":[{"state":"Ready","trigger":"Prerequisites met.","userNeed":"Understand what happens next.","designResponse":"Enable primary action with plain-language preview."},{"state":"Awaiting signature","trigger":"Wallet prompt open.","userNeed":"Know what they are approving.","designResponse":"Mirror human-readable summary in app and wallet."},{"state":"Pending","trigger":"Transaction submitted.","userNeed":"Confidence it is progressing.","designResponse":"Show status strip with explorer link."},{"state":"Succeeded","trigger":"On-chain confirmation.","userNeed":"See updated ownership or balance.","designResponse":"Celebrate outcome and show new state clearly."},{"state":"Failed or reverted","trigger":"Validation or execution failed.","userNeed":"Fix or retry without guessing.","designResponse":"Name the failed constraint and offer a concrete next step."}],"designDecisions":[{"question":"How much protocol detail do users see?","recommendation":"Lead with outcomes; tuck identifiers behind review.","rationale":"Users decide on consequences, not function selectors."},{"question":"What happens when support is missing?","recommendation":"Block with explanation and fallback path.","rationale":"Silent failure feels like a broken product."},{"question":"How do you label restricted assets?","recommendation":"Use persistent badges for non-transferable, locked, or expiring states.","rationale":"Hidden restrictions cause rage-quits at transfer time."}],"problemsSolved":[{"problem":"Inconsistent behavior across apps","oldWay":"Each team reinvents copy and edge cases","newWay":"Shared standard gives predictable UX patterns","impact":"high"},{"problem":"Users surprised by on-chain rules","oldWay":"Generic transfer UI fails at submit time","newWay":"Standard-aware UI sets expectations upfront","impact":"high"},{"problem":"Support burden from opaque errors","oldWay":"Raw revert reasons in toasts","newWay":"Mapped states explain what to do next","impact":"medium"}],"uxPatterns":[{"name":"EVM Providers Grid","description":"Wallet picker from window.evmproviders entries.","mockup":"concept/wallet-discovery","components":["WalletGrid","ProviderIcon","ProviderName"],"userFlow":["User clicks Connect","App reads evmproviders","Grid shows wallets","User selects","Connection proceeds"]},{"name":"Dual Discovery Merge","description":"Combine 5749 and EIP-6963 results.","mockup":"concept/wallet","components":["MergedWalletList","DedupeLogic"],"userFlow":["Listen for 6963 events","Read evmproviders object","Merge and dedupe","Render unified list","User connects"]}],"seenInTheWild":[{"app":"Rabby","url":"https://rabby.io/","note":"Multi-wallet products expect enumeration rather than a single injected provider."},{"app":"Rainbow","url":"https://rainbow.me/","note":"Sets expectations for wallet icon quality and naming in pickers."},{"app":"wagmi","url":"https://wagmi.sh/","note":"Connection libraries abstract multi-provider discovery for dApp teams."}],"antiPatterns":[{"pattern":"Hiding standard-imposed restrictions until submit","why":"Users feel tricked when actions fail at the last step","instead":"Show eligibility and badges before the primary CTA","severity":"critical"},{"pattern":"Protocol jargon in user-facing copy","why":"Non-technical users cannot consent informedly","instead":"Use outcome language with optional technical disclosure","severity":"high"},{"pattern":"No fallback when wallet lacks support","why":"Dead-end flows increase churn","instead":"Explain limitation and offer alternate path or network","severity":"high"}],"vocabulary":[{"use":"Your balance / Your item","avoid":"Token ID / Token contract","why":"Ownership language matches mental models."},{"use":"Cannot transfer yet","avoid":"Transfer reverted","why":"Explain restriction without EVM vocabulary."},{"use":"Confirm in wallet","avoid":"Sign transaction","why":"Matches wallet UX users already know."}],"onMonad":[{"aspect":"Confirmation speed","ethereum":"Multi-step flows can feel slow between signatures","monad":"Sub-second finality tightens feedback loops","designImplication":"Prefer inline status over long pending modals on Monad."},{"aspect":"Transaction cost","ethereum":"Gas can discourage exploratory actions","monad":"Lower fees enable lighter-weight interactions","designImplication":"Safe to offer preview retries and social actions more freely."}],"technicalNotes":"EIP-5749 registers wallets on window.evmproviders with snake_case keys. Prefer supporting EIP-6963 in parallel during transition.","relatedStandards":[{"id":"EIP-6963","relationship":"Preferred discovery with broader wallet adoption"},{"id":"EIP-1193","relationship":"Provider API used after selection"}]},"sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/eip-5749","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=EIP-5749","type":"discussion"},{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/eip-5749","type":"official-spec"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/EIP-5749","markdown":"https://www.eipsfordesigners.com/standards/EIP-5749/content.md","agent":"https://www.eipsfordesigners.com/standards/EIP-5749/agent.md","api":"https://www.eipsfordesigners.com/api/standards/EIP-5749","official":"https://eips.ethereum.org/EIPS/eip-5749","discussion":"https://ethereum-magicians.org/search?q=EIP-5749"},"freshness":{"lastReviewed":"2026-05-25","lastUpdated":"2026-05-25"}}