Developer reviewing smart contract architecture diagrams on a glass wall in a modern WeWork space, standing desk in background, natural industrial aesthetic, candid engineering moment.
Protocols

EIP-6963 Multi-Injected Provider Discovery

Standard resolving multi-wallet browser extension conflicts via window event-based discovery. Wallet and dapp developers need provider handling and UX integration review; Chainscore can assess multi-provider conflict resolution logic.
introduction
MULTI-INJECTED PROVIDER DISCOVERY

What is EIP-6963?

A standard for resolving conflicts when multiple browser extension wallets inject an Ethereum provider into the same web page.

EIP-6963 defines a window event-based discovery mechanism that allows multiple browser extension wallets to coexist in a single web application without overwriting each other's injected window.ethereum object. Before this standard, the last wallet extension to inject its provider would win, breaking dapp compatibility for users who run more than one wallet and forcing developers to rely on fragile, non-standard detection workarounds. The proposal replaces the single, mutable window.ethereum pattern with a window.dispatchEvent announcement and a window.addEventListener subscription model, enabling dapps to build a registry of available providers and present users with an explicit wallet selection interface.

Operationally, EIP-6963 introduces two key interfaces: EIP6963AnnounceProviderEvent, which a wallet dispatches with its name, icon, and an EIP1193Provider object, and EIP6963RequestProviderEvent, which a dapp dispatches to solicit announcements from already-injected wallets. This inversion of control eliminates the race condition inherent in the legacy injection model. For dapp developers, the standard requires replacing direct calls to window.ethereum with a provider store that listens for eip6963:announceProvider events and manages multiple provider instances. Wallet teams must implement the announcement dispatch and respond to request events, ensuring their provider metadata is accurate and their RDNS identifier is unique to prevent impersonation.

The standard affects every Ethereum dapp that interacts with browser wallets and every wallet extension that injects a provider. Integration risks include dapps failing to handle multiple connected providers simultaneously, incorrect chain ID or account state tracking when users switch between wallets, and UI inconsistencies in provider selection menus. Teams should audit their provider store logic for race conditions during page load and wallet reconnection, and verify that session management correctly isolates state per selected provider. Chainscore Labs can review multi-provider conflict resolution logic, assess provider store implementations for edge cases, and help wallet and dapp teams validate their EIP-6963 integration against the full discovery lifecycle.

MULTI-PROVIDER DISCOVERY IMPACT

EIP-6963 at a Glance

Operational impact and integration requirements for wallets and dapps adopting the multi-injected provider discovery standard.

AreaWhat changesWho is affectedAction

Provider Discovery

Replaces single window.ethereum injection with a window event-based announcement and request pattern.

Wallet extension developers, dapp front-end teams

Implement eip6963:announceProvider dispatch and eip6963:requestProvider listener; remove reliance on a single injected object.

Multi-Wallet UX

Users with multiple extensions can select a provider without disabling other extensions.

Wallet UX designers, dapp developers

Design a provider selection UI; dapps must handle multiple EIP6963ProviderDetail objects and manage active provider state.

Provider Identity

Wallets announce with a unique rdns identifier, name, and icon, enabling reliable disambiguation.

Wallet teams, dapp developers

Register a globally unique rdns domain; dapps should use rdns for persistent provider preferences, not UI labels.

Conflict Resolution

Eliminates namespace collisions and race conditions between extensions fighting over window.ethereum.

Browser extension wallets, dapp developers

Remove any logic that overwrites or mutates window.ethereum; adopt event-driven provider lifecycle exclusively.

Backward Compatibility

Legacy dapps expecting window.ethereum will not see EIP-6963 providers unless a shim is present.

Dapp developers, wallet teams

Wallets may inject a legacy shim; dapps should prioritize EIP-6963 providers and fall back to window.ethereum only when no announcement is received.

Security Model

Provider announcements are unauthenticated; any script can dispatch a fake announcement.

Dapp developers, security auditors

Treat announced providers as untrusted; do not auto-connect based on announcement alone. Verify provider behavior matches expected interface.

Chainscore Review

Multi-provider conflict logic, provider selection UX, and fallback handling introduce integration risk.

Wallets, dapps, and browser extension teams

Chainscore can review provider discovery implementation, shim logic, and multi-wallet conflict resolution for correctness and security.

technical-context
PROVIDER ANNOUNCEMENT AND SELECTION

How the Discovery Mechanism Works

EIP-6963 replaces imperative window.ethereum injection with an event-driven discovery protocol that lets multiple browser extension wallets coexist and be discovered by decentralized applications without namespace collisions.

EIP-6963 defines a window event-based discovery mechanism that eliminates the single-provider conflict inherent in the legacy window.ethereum injection model. Instead of each wallet extension overwriting window.ethereum and racing for control, every compliant wallet announces itself by dispatching an EIP6963AnnounceProviderEvent on the window object. This event carries an RDNS identifier for the wallet, a user-friendly name, an icon, and—critically—a provider object that the dapp can use directly. The dapp listens for these announcements, collects available providers, and presents the user with a choice, storing the selection for future sessions.

The flow is intentionally decoupled from any single global variable. When a dapp initializes, it registers a listener for the eip6963:announceProvider event and then dispatches an eip6963:requestProvider event to prompt already-loaded wallets to re-announce. This request-reply pattern handles both wallets that load before the dapp and those injected afterward. Each provider object is scoped to the announcing wallet, so the dapp never needs to guess which wallet is behind window.ethereum. The standard also defines TypeScript interfaces for EIP6963ProviderDetail, EIP6963AnnounceProviderEvent, and EIP6963RequestProviderEvent, giving dapp developers a typed contract for building multi-wallet UIs.

For operators and builders, the operational impact is a fundamental shift in how dapps detect and connect to wallets. Integration teams must replace any hardcoded window.ethereum access with an event-driven provider registry, and wallet teams must implement the announce/request event contract correctly to avoid silent failures in dapps that have adopted EIP-6963. Chainscore can review a dapp's provider discovery logic for race conditions, missing re-announcement handling, and UI state management across multiple provider lifecycles, as well as audit wallet extensions for spec compliance and secure provider object construction.

ACTOR IMPACT ANALYSIS

Who Is Affected?

Wallet Extension Providers

Wallet extension teams must implement the EIP6963AnnounceProviderEvent dispatch and listen for EIP6963RequestProviderEvent to participate in the discovery flow. Each provider must supply a unique rdns identifier, a human-readable name, and an icon URI.

Key actions:

  • Replace window.ethereum injection with event-driven announcement.
  • Ensure the rdns string matches the extension's verified domain to prevent spoofing.
  • Handle multiple simultaneous dapp connections without provider state collisions.
  • Test coexistence with other injected wallets to verify no DOM namespace conflicts.

Chainscore can review your announcement payload, rdns uniqueness strategy, and multi-provider conflict resolution logic to prevent silent failures in multi-wallet environments.

implementation-impact
EIP-6963 PROVIDER DISCOVERY

Implementation Impact by Role

EIP-6963 shifts multi-wallet conflict resolution from a single injected provider to an event-driven discovery mechanism. Each role in the ecosystem must update its integration logic, threat model, and user experience to align with the new standard.

01

Wallet Developers

Must implement the eip6963:announceProvider and eip6963:requestProvider event interfaces. This replaces the legacy window.ethereum injection race. Wallets need to define a unique rdns identifier, manage the lifecycle of their EIP6963ProviderInfo object, and ensure they only respond to discovery events after a user gesture to prevent fingerprinting. Failure to adopt this standard will result in a degraded user experience as dapps deprecate legacy provider handling.

02

Dapp and Frontend Developers

Must replace the anti-pattern of blindly consuming window.ethereum with an event listener for eip6963:announceProvider. The UI must be updated to present a provider selection menu to the user when multiple wallets respond. This requires managing a dynamic list of connected providers and handling the case where a user's preferred wallet is not yet announced. Legacy fallback logic should be maintained temporarily but clearly deprecated.

03

Security Auditors

The threat model shifts from a single, trusted provider to a multi-provider environment. Auditors must verify that dapps do not introduce new vulnerabilities by connecting to multiple providers simultaneously. Key risks include UI spoofing where a malicious extension announces a deceptive name or icon to mimic a trusted wallet, and the potential for a confused deputy attack if a dapp routes a sensitive transaction to the wrong provider. Review rdns validation logic carefully.

04

Wallet Integrators and Aggregators

Systems like WalletConnect or multi-wallet SDKs must act as a proxy between dapps and EIP-6963 providers. They should listen for all announced providers, aggregate them into a unified list, and expose a single, curated selection interface to the dapp. This introduces a new trust assumption: the aggregator's UI must faithfully represent each provider's EIP6963ProviderInfo without allowing a compromised provider to inject malicious metadata that could mislead the user or the aggregator's own UI.

05

End Users

Users will gain explicit control over which wallet interface handles a dapp connection, resolving the silent conflict where the last extension loaded would win. The user experience changes from a single, invisible connection to an active choice. Education is required to help users understand why they are being prompted to select a wallet and how to identify their preferred wallet by its icon and name, which is critical for preventing phishing attacks that rely on look-alike provider announcements.

MULTI-PROVIDER CONFLICT & INTEGRATION SURFACE

Compatibility and Security Risks

Evaluates the failure modes, affected actors, and required actions introduced by the shift from a single injected provider to a multi-provider event-driven discovery model.

Risk AreaFailure ModeAffected ActorsMitigation / Action

Race Condition in Dapp Initialization

A dapp that listens for eip6963:announceProvider may connect to the first provider that announces, which might not be the user's intended wallet, leading to a broken or unexpected connection state.

Dapp Developers, Wallet Developers

Dapps must implement a provider selection UI that awaits multiple announcements or a user-defined timeout before auto-connecting. Wallets should ensure their announcement is not delayed by async internal initialization.

User Experience Fragmentation

Users with multiple wallets see a disjointed experience where each dapp independently asks them to choose a wallet, or a dapp's custom selection UI conflicts with the browser's existing injected provider logic.

End Users, Dapp Developers

Dapps should build a consistent, recognizable wallet selection UI. Wallet developers should coordinate on UX patterns to avoid user confusion and decision fatigue across different dapps.

Legacy window.ethereum Conflict

A dapp that does not adopt EIP-6963 will continue to rely on window.ethereum, which is set by a browser extension's content script. This creates a two-tier system where EIP-6963-aware dapps see all wallets, but legacy dapps only see the winner of the extension race.

Dapp Developers, Wallet Developers, End Users

Dapps should prioritize the EIP-6963 interface and treat window.ethereum as a fallback only after warning the user. Wallet developers must continue to manage the window.ethereum race condition for backward compatibility.

Spoofed Provider Announcements

A malicious script or extension could dispatch a fake eip6963:announceProvider event with a spoofed rdns identifier and icon, tricking a dapp into displaying a fraudulent wallet option in its selection UI.

Dapp Developers, End Users

Dapps must not trust the rdns or name fields for security. They should verify the provider object's ability to perform cryptographic actions (e.g., eth_requestAccounts) and cross-reference the rdns against a known list of verified wallet identifiers.

Inconsistent Provider Interface Compliance

A wallet announces itself via EIP-6963 but its provider object does not fully comply with EIP-1193, missing methods like eth_sendTransaction or events like accountsChanged, causing dapp integration failures.

Dapp Developers, Wallet Developers

Dapps must perform runtime capability checks on the provider object before integrating. Wallet developers must rigorously test their EIP-1193 compliance and announce only fully functional provider objects.

Icon and Metadata Trust

A dapp renders the icon URI provided in the announcement, which could be a tracking pixel, an excessively large file, or a malicious SVG that degrades the dapp's performance or leaks user data.

Dapp Developers, End Users

Dapps should sanitize and validate the icon URI, proxy the image request, and enforce strict size and content-type policies. Rendering an icon should not be a default behavior without user interaction.

Event Listener Cleanup and Memory Leaks

A dapp that attaches an eip6963:announceProvider listener but fails to remove it on page navigation or component unmount will accumulate stale listeners, leading to memory leaks and erratic behavior.

Dapp Developers

Dapps must implement proper lifecycle management for event listeners, using AbortController signals or framework-specific cleanup functions to remove listeners when the relevant UI component is destroyed.

MULTI-PROVIDER DISCOVERY READINESS

Integration Checklist

A practical checklist for wallet and dapp teams to verify correct implementation of EIP-6963, ensuring reliable multi-wallet detection and conflict-free provider injection.

What to check: Confirm that the wallet dispatches the eip6963:announceProvider CustomEvent on window exactly once, and only after the page load event has fired. The event must contain a unique rdns identifier and a reference to the wallet's provider object in its detail.

Why it matters: Dispatching too early (e.g., during script evaluation) can cause dapps to miss the announcement. Dispatching multiple times or without a valid rdns identifier breaks the discovery mechanism and can lead to provider conflicts or a broken wallet selector UI.

Readiness signal: A dapp's discovery listener logs a single, unique announcement per installed wallet with a valid, reverse-DNS formatted rdns string on page load.

Chains We Build On

Looking to build on a specific blockchain?

We build smart contracts, DeFi applications, wallets, tokenization platforms, and blockchain infrastructure across the major ecosystems teams choose today. That includes Ethereum, Arbitrum, Optimism, Polygon, Avalanche, Solana, Sui, Aptos, Hedera, Stellar, and NEAR, with support for additional EVM and non-EVM networks based on your product requirements.

EVM ecosystems

  • Ethereum logo
    Ethereum
  • Arbitrum logo
    Arbitrum
  • Optimism logo
    Optimism
  • Polygon logo
    Polygon
  • Avalanche logo
    Avalanche
  • Cronos logo
    Cronos

Non-EVM ecosystems

  • Solana logo
    Solana
  • Sui logo
    Sui
  • Aptos logo
    Aptos
  • Hedera logo
    Hedera
  • Stellar logo
    Stellar
  • NEAR logo
    NEAR

Additional ecosystems

  • Polkadot logo
    Polkadot
  • Cosmos logo
    Cosmos
  • TON logo
    TON
  • Cardano logo
    Cardano
  • Algorand logo
    Algorand
  • Tempo logo
    Tempo

Also available for Base, appchains, custom EVM networks, and cross-chain product architecture.

MULTI-PROVIDER DISCOVERY

Frequently Asked Questions

Common questions from wallet and dapp developers integrating EIP-6963 to resolve multi-wallet conflicts and improve user experience.

EIP-6963 replaces the legacy window.ethereum singleton injection model with a publisher-subscriber pattern. Instead of multiple wallet extensions racing to overwrite a single global variable, each provider announces itself via a CustomEvent (eip6963:announceProvider) dispatched on the window object. The dapp listens for these events and builds a registry of available providers. This allows the dapp to present a user-controlled selection interface, eliminating the conflict where the last installed wallet extension silently takes over.

Trusted by Industry Leaders

Delivering blockchain solutions for 5+ years.

We have partnered with 50+ leading DeFi protocols, NFT ecosystems, and fintech innovators to build secure, scalable, and capital-efficient blockchain products.

Selected Partners & Clients

ChainVote logo
Reax logo
Sokail logo
Swapsicle logo
SyntheX logo
Tekika logo
Telos logo
Zexe logo
ChainVote logo
Reax logo
Sokail logo
Swapsicle logo
SyntheX logo
Tekika logo
Telos logo
Zexe logo
ChainVote logo
Reax logo
Sokail logo
Swapsicle logo
SyntheX logo
Tekika logo
Telos logo
Zexe logo
ChainVote logo
Reax logo
Sokail logo
Swapsicle logo
SyntheX logo
Tekika logo
Telos logo
Zexe logo
I've been working with Chainscore Labs for last 3+ years, they've consistently delivered with strong ownership across multiple projects. The team is reliable and detail-oriented.
L
Lee Erswell
CEO, Telos Foundation
how to get started

How to get started?

If you're looking for blockchain integration, ChainScore Labs has 5+ years of experience helping teams build and integrate exchanges, wallets, smart contracts, tokenization solutions, and protocol-connected products, we can help you choose the right path, integrate securely, and get to production faster. Our team consists of experienced blockchain developers and architects who can help you with your blockchain integration needs.

01

Exploration & Strategy

Define your product goals and choose the right blockchain architecture for your use case.

02

Architecture & Design

Design the smart contracts, tokenomics, and security parameters of your system.

03

Development & Integration

Build and integrate with wallets, oracles, and front-end dApps for a seamless experience.

04

Security & Launch

Comprehensive audits followed by a risk-managed mainnet deployment to protect your users.

Start a build

Need a blockchain engineering team?

Send the project context and we will respond with next steps, scope questions, and a practical path to delivery.