{"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":"EIP-5749 defines a window.evmproviders object containing injected EIP-1193 providers plus display metadata for enumeration. A client may build a wallet picker from the object, but wallet support is uneven and the announced name, icon, and key are metadata rather than proof of identity or capability.","officialUrl":"https://eips.ethereum.org/EIPS/eip-5749","lastReviewed":"2026-09-18","lastUpdated":"2026-09-18","kind":"proposal","hasDetailedContent":true,"content":{"id":"EIP-5749","specConstraints":[{"id":"eip-5749-provider-identity","constraint":"A registered provider key remains stable across versions of one channel but differs between distinct wallet channels.","appliesTo":"application","normativity":"normative","specQuote":"This must remain the same across versions but must be different across channels. For example, MetaMask, Trust wallet and Enkrypt should each have different UUIDs, but MetaMask 10.22.2 and MetaMask 9.8.1 should have the same UUID.","specSection":"Specification — window.evmproviders={}","specUrl":"https://eips.ethereum.org/EIPS/eip-5749#windowevmproviders","designImplication":"Use the provider identity for stable wallet preference and deduplication, not for version display or capability proof. Keep a visible switch path when the remembered provider is unavailable."},{"id":"eip-5749-legacy-injection-fallback","constraint":"EIP-5749 does not require replacing window.ethereum, so existing injection paths remain a compatibility concern.","appliesTo":"application","normativity":"backwards-compatibility","specQuote":"This EIP doesn't require supplanting `window.ethereum`, so it doesn't directly break existing applications.","specSection":"Backwards Compatibility","specUrl":"https://eips.ethereum.org/EIPS/eip-5749#backwards-compatibility","designImplication":"Feature-detect evmproviders and retain an explicit legacy or alternate provider path. Do not make an empty evmproviders object look like a wallet outage when another supported path exists."},{"id":"eip-5749-svg-icon-safety","constraint":"Applications and libraries must render provider SVG icons with img so embedded JavaScript cannot execute.","appliesTo":"application","normativity":"security-considerations","specQuote":"Applications and libraries must render SVG images using the `<img>` tag to ensure no JS executions can happen.","specSection":"Security Considerations","specUrl":"https://eips.ethereum.org/EIPS/eip-5749#security-considerations","designImplication":"Treat announced icons as untrusted metadata. Use a non-executing image surface and do not let wallet branding become an HTML or script injection path."},{"id":"provider-key-format","constraint":"The provider key is RECOMMENDED to use the extension name in snake_case and MUST contain only lowercase letters, numbers, and underscores.","appliesTo":"application","normativity":"normative","specSection":"Specification > window.evmproviders={}","specUrl":"https://eips.ethereum.org/EIPS/eip-5749#windowevmproviders","designImplication":"Use the canonical key for stable provider labels and deduplication, while rejecting malformed keys before displaying them as distinct providers.","specQuote":"* The key is RECOMMENDED to be the name of the extension in snake_case. It MUST contain only lowercase letters, numbers, and underscores."}],"sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/eip-5749","type":"official-spec"}],"lastReviewed":"2026-09-18","lastUpdated":"2026-09-18","summary":"EIP-5749 defines a window.evmproviders object containing injected EIP-1193 providers plus display metadata for enumeration. A client may build a wallet picker from the object, but wallet support is uneven and the announced name, icon, and key are metadata rather than proof of identity or capability.","partialDeployment":{"body":"EIP-5749 is Final, but a product must feature-detect window.evmproviders and retain EIP-6963, window.ethereum, or another supported connection path when no compatible providers are registered."},"designerTakeaways":["Build a wallet grid from window.evmproviders when the object is present and entries pass your validation policy.","Combine EIP-5749 with EIP-6963 and other supported paths only after deduplicating providers and checking capabilities.","Remember a user's selected provider key as a preference, while keeping an explicit switch and fallback path."],"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":"Provider enumeration","why":"Show a picker only when window.evmproviders contains usable entries.","covers":["Provider list","Clear selection copy"],"include":["Provider name and icon","Capability check","Connection result"]},{"screen":"Missing or unsupported provider object","why":"EIP-5749 support is optional and may coexist with EIP-6963 or legacy injection.","covers":["Empty evmproviders","Unsupported provider method"],"include":["Plain-language reason","Fallback action"]},{"screen":"Connection recovery","why":"A selected provider can reject, disconnect, or fail independently of enumeration.","covers":["User rejection","Provider disconnect"],"include":["Retry path","Support context"]},{"screen":"Provider metadata disclosure","why":"Users may need to understand which provider entry was selected and what it claims.","covers":["Provider key and UUID","Announced name and icon","Supported methods"],"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":"Providers discovered","trigger":"window.evmproviders contains one or more entries.","userNeed":"Choose the intended wallet.","designResponse":"Show announced metadata, check supported methods, and let the user select explicitly."},{"state":"No EIP-5749 providers","trigger":"window.evmproviders is absent or empty.","userNeed":"Find another connection path.","designResponse":"Offer EIP-6963, an injected fallback, WalletConnect, or an embedded path when supported."},{"state":"Provider mismatch","trigger":"The selected entry does not support a required method or event.","userNeed":"Know whether another wallet can continue.","designResponse":"Explain the missing capability and let the user switch or use a fallback."},{"state":"Connected","trigger":"The selected provider returns a successful connection result.","userNeed":"Know which account and network are active.","designResponse":"Show account, network, provider label, and a visible switch/disconnect path."},{"state":"Provider rejected or disconnected","trigger":"The selected provider rejects the request or emits disconnect.","userNeed":"Retry or select another path.","designResponse":"Map the provider error to human copy and preserve the picker or fallback."}],"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 validate announced provider metadata?","recommendation":"Use name and icon for display, treat keys and UUIDs as identifiers, and feature-detect methods separately.","rationale":"EIP-5749 exposes provider metadata but does not authenticate a wallet brand or guarantee capability support."}],"problemsSolved":[{"problem":"Multiple injected providers are hard to enumerate","oldWay":"The app sees one or an unpredictable injected provider","newWay":"A compatible app can enumerate window.evmproviders and let users choose","impact":"high"},{"problem":"Provider metadata and capability scope are unclear","oldWay":"A picker treats every announced wallet as equally supported","newWay":"The UI shows metadata, checks required methods, and keeps switch/fallback paths","impact":"high"},{"problem":"Missing or rejected providers strand users","oldWay":"An empty object or provider error produces a dead-end connect flow","newWay":"Mapped discovery, rejection, disconnect, and fallback states explain what to do next","impact":"medium"}],"uxPatterns":[{"name":"EVM Providers Grid","description":"Wallet picker from window.evmproviders entries.","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.","components":["MergedWalletList","DedupeLogic"],"userFlow":["Listen for 6963 events","Read evmproviders object","Merge and dedupe","Render unified list","User connects"]}],"antiPatterns":[{"pattern":"Treating provider metadata as verified identity","why":"Names, icons, keys, and UUIDs are announced values and do not prove wallet identity or capability","instead":"Display metadata with a fallback, then feature-detect methods and require explicit choice","severity":"critical"},{"pattern":"Assuming every provider supports the same methods","why":"EIP-1193 providers can expose different RPC methods and authorization behavior","instead":"Use outcome language with capability checks and a provider-switch fallback","severity":"high"},{"pattern":"No fallback when window.evmproviders is missing","why":"Many users may have only EIP-6963, legacy injection, mobile, or embedded providers","instead":"Explain the limitation and offer another supported connection path","severity":"high"}],"vocabulary":[{"use":"Wallet name","avoid":"Verified wallet","why":"The announced name is display metadata, not identity proof."},{"use":"No compatible wallet detected","avoid":"window.evmproviders is broken","why":"Describe the available connection paths without blaming a particular implementation."},{"use":"Choose wallet","avoid":"Auto-selected wallet","why":"Keep the user's provider choice visible and reversible."}],"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":"Event-based injected-provider discovery with a separate metadata model"},{"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 search","url":"https://ethereum-magicians.org/search?q=EIP-5749","type":"discussion"}],"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-09-18","lastUpdated":"2026-09-18"}}