EIP-6963: Multi Injected Provider Discovery
Introduction
EIP-6963 proposes the "Multi Injected Provider Discovery" standard, which aims to enhance the discoverability and interaction with multiple injected Ethereum providers in a browser environment. Injected providers refer to browser extensions or other injected scripts that provide access to an Ethereum provider within the context of a web application.
Web3.js library has utility functions for discovery of injected providers using requestEIP6963Providers()
and onNewProviderDiscovered(eventDetails)
.
onNewProviderDiscovered(eventDetails)
can be used to subscribe to events of provider discovery & providers map update and requestEIP6963Providers()
returns Promise object that resolves to Map<string, EIP6963ProviderDetail>
object containing list of providers. For updated providers eip6963:providersMapUpdated
event is emitted and it has updated Map object. This event can be subscribed as mentioned earlier using onNewProviderDiscovered(eventDetails)
eip6963ProvidersMap
object has provider's UUID
as keys and EIP6963ProviderDetail
as values. EIP6963ProviderDetail
is:
export interface EIP6963ProviderDetail {
info: EIP6963ProviderInfo;
provider: EIP1193Provider;
}
where info
has details of provider containing UUID, name, Icon and RDNS as defined in EIP-6963:
export interface EIP6963ProviderInfo {
uuid: string;
name: string;
icon: string;
rdns: string;
}
provider
in EIP6963ProviderDetail
is EIP1193Provider
and it contains actual provider that can be injected in web3 instance.
Following code snippet demonstrates usage of requestEIP6963Providers()
function for providers discovery.
//Assuming multiple providers are installed in browser.
import { Web3 } from 'web3';
// Following will subscribe to event that will be triggered when providers map is updated.
Web3.onNewProviderDiscovered((provider) => {
console.log(provider.detail); // This will log the populated providers map object, provider.detail has Map of all providers yet discovered
// add logic here for updating UI of your DApp
});
// Call the function and wait for the promise to resolve
let providers = await Web3.requestEIP6963Providers();
for (const [key, value] of providers) {
console.log(value);
/* Based on your DApp's logic show use list of providers and get selected provider's UUID from user for injecting its EIP6963ProviderDetail.provider EIP1193 object into web3 object */
if (value.info.name === 'MetaMask') {
const web3 = new Web3(value.provider);
// now you can use web3 object with injected provider
console.log(await web3.eth.getTransaction('0x82512812c11f56aa2474a16d5cc8916b73cd6ed96bf9b8defb3499ec2d9070cb'));
}
}