HomeEIPs
EIPsEIP-5749
EIP-5749

The 'window.evmproviders' object

Add 'window.evmproviders' and suggest the eventual removal of 'window.ethereum'
FinalStandards Track: Interface
Created: 2022-10-04
Requires: EIP-1193
Kosala Hemachandra (@kvhnuke)
DiscussionsOriginal linkEdit
1 min read

The EIP-5749 proposal suggests replacing the current method of interacting with injected wallets, 'window.ethereum', with a new interface called 'window.evmproviders'. This new interface would allow for the interoperability of multiple browser wallets at the same time, improving user experience and encouraging innovation in the space. The current method only permits one wallet to be injected at a time, resulting in a race condition between two or more wallets, which creates an inconsistent connection behavior that makes having and using more than one browser wallet unpredictable and impractical. The proposal aims to foster fairer competition by reducing the barriers to entry for new wallet providers, along with enhancing the user experience on Ethereum networks. The proposal introduces a set of window events to provide a two-way communication protocol between Ethereum libraries and injected scripts provided by browser extensions, enabling users to select their wallet of choice. Each wallet provider will be announced with a unique identifier, a locally unique identifier, a human-readable name, and an icon. The wallet provider will also announce their own EIP-1193 provider interface in parallel with the provider info defined above. The proposal also includes security considerations, such as rendering SVG images using the tag to ensure no JS executions can happen.

Video
Anyone may contribute to propose contents.
Go propose
Original

Abstract

A Javascript Ethereum Provider interface injection that will allow for the interoperability of multiple browser wallets at the same time. Replacing window.ethereum with window.evmproviders is a simple solution that will provide multiple benefits including: improving user experience, encouraging innovation in the space, removing race conditions and a 'winner-takes-most' environment as well as lowering barriers for user adoption.

Motivation

At present, window.ethereum is the prevailing method by which Ethereum-compatible applications interact with injected wallets. This originated with Mist Wallet in 2015 to interact with other applications. With the proliferation of both applications and wallets, window.ethereum has unintended negative consequences:

  • window.ethereum only permits one wallet to be injected at a time, resulting in a race condition between two or more wallets. This creates an inconsistent connection behavior that makes having and using more than one browser wallet unpredictable and impractical. The current solution is for wallets to inject their own namespaces, but this is not feasible as every application would need to be made aware of any wallet that might be used.
  • The aforementioned race condition means users are disincentivized to experiment with new wallets. This creates a 'winner-takes-most' wallet market across EVM chains which forces application developers to optimize for a particular wallet experience.
  • The 'winner-takes-most' wallet environment that results from the window.ethereum standard hinders innovation because it creates a barrier to adoption. New entrants into the space have difficulty gaining traction against legacy players because users can have no more than one injected wallet. With new entrants crowded out, legacy wallet providers are put under little pressure to innovate.
  • Wallets continue to be the most fundamental tool for interacting with blockchains. A homogeneous wallet experience in Ethereum and EVM chains risks stunting UX improvement across the ecosystem and will allow other ecosystems that are more encouraging of competition and innovation to move ahead.
  • Some wallets that currently use window.ethereum as of August, 2022. Currently a user will have inconsistent behavior if they use multiple of these wallets in a single browser.
    • Metamask
    • Coinbase wallet
    • Enkrypt
    • Trust wallet
    • Rainbow

Replacing window.ethereum with window.evmproviders will allow solutions such as web3modal and web3onboard to display all injected wallets the user has installed. This will simpify the UX and remove race conditions between wallet providers in case multiple wallets are installed. Over time, as window.evmproviders supplants the current standard and removes barriers to choice, we can hope to see a wallet landscape more reflective of user preference.

Specification

The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in RFC 2119.

window.evmproviders={}

/** * Represents the assets needed to display a wallet */ interface ProviderInfo { /** * A UUIDv4 unique to the wallet provider. * * 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. * * @readonly */ uuid: string; /** * The name of the wallet provider (e.g. `MetaMask` or `Enkrypt`) * * @readonly */ name: string; /** * A base64 encoded SVG image. * * Base64 is defined in RFC 4648. * * @readonly */ icon: `data:image/svg+xml;base64,${string}`; /** * A description of the wallet provider. * * @readonly */ description: string; }
/** * Represents the new Provider with info type that extends the EIP1193 provider */ interface ProviderWithInfo extends EIP1193Provider { info: ProviderInfo; }

Type EIP1193Provider is documented at EIP-1193

/** * The type of `window.evmproviders` */ interface EVMProviders { /** * The key is RECOMMENDED to be the name of the extension in snake_case. It MUST contain only lowercase letters, numbers, and underscores. */ [index: string]: ProviderWithInfo; }

Rationale

Standardizing a ProviderInfo type allows determining the necessary information to populate a wallet selection popup. This is particularly useful for web3 onboarding libraries such as Web3Modal, Web3React, and Web3Onboard.

The name evmproviders was chosen to include other EVM-compliant chains.

The SVG image format was chosen for its flexibility, lightweight nature, and dynamic resizing capabilities.

Backwards Compatibility

This EIP doesn't require supplanting window.ethereum, so it doesn't directly break existing applications. However, the recommended behavior of eventually supplanting window.ethereum would break existing applications that rely on it.

Reference Implementation

Injection

const provider: ProviderWithInfo = [your wallet] window.evmproviders = window.evmproviders || {}; window.evmproviders[name] = provider

Retrieving all EVM providers

const allproviders = Object.values(window.evmproviders)

Security Considerations

The security considerations of EIP-1193 apply to this EIP.

The use of SVG images introduces a cross-site scripting risk as they can include JavaScript code. Applications and libraries must render SVG images using the <img> tag to ensure no JS executions can happen.

Copyright and related rights waived via CC0.

Further reading
Anyone may contribute to propose contents.
Go propose
Adopted by projects
Anyone may contribute to propose contents.
Go propose

Not miss a beat of EIPs' update?

Subscribe EIPs Fun to receive the latest updates of EIPs Good for Buidlers to follow up.

View all
Serve EIP builders, scale Ethereum.
Resources
GitHub
Supported by