diff --git a/packages/injected/package.json b/packages/injected/package.json index f9210527a..59e9ba78f 100644 --- a/packages/injected/package.json +++ b/packages/injected/package.json @@ -1,6 +1,6 @@ { "name": "@web3-onboard/injected-wallets", - "version": "2.2.2-alpha.1", + "version": "2.2.2-alpha.2", "description": "Injected wallet module for connecting browser extension and mobile wallets to Web3-Onboard. Web3-Onboard makes it simple to connect Ethereum hardware and software wallets to your dapp. Features standardised spec compliant web3 providers for all supported wallets, framework agnostic modern javascript UI with code splitting, CSS customization, multi-chain and multi-account support, reactive wallet state subscriptions and real-time transaction state change notifications.", "keywords": [ "Ethereum", diff --git a/packages/injected/src/wallets.ts b/packages/injected/src/wallets.ts index 69205acd1..2a23fbdf1 100644 --- a/packages/injected/src/wallets.ts +++ b/packages/injected/src/wallets.ts @@ -23,23 +23,45 @@ declare const window: CustomWindow const UNSUPPORTED_METHOD = null function getInjectedInterface( - identity: string + identity: string, + checkOtherProviderFlags?: boolean ): () => Promise<{ provider: EIP1193Provider }> { return async () => ({ provider: (window.ethereum.providers && Array.isArray(window.ethereum.providers) - ? window.ethereum.providers.find(provider => !!provider[identity]) + ? getInterfaceFromProvidersArray(identity, checkOtherProviderFlags) : window.ethereum) as EIP1193Provider }) } +function getInterfaceFromProvidersArray( + identity: string, + checkOtherProviderFlags?: boolean +) { + return window.ethereum.providers.find(provider => { + return checkOtherProviderFlags + ? !!provider[identity] && + !otherProviderFlagsExist(identity, provider) + : !!provider[identity] + }) +} + +function otherProviderFlagsExist(identity: string, provider: any): boolean { + const otherProviderFlags = Object.values(ProviderIdentityFlag).filter( + id => id !== identity && id !== ProviderIdentityFlag.Detected + ) + return otherProviderFlags.some(id => !!provider[id]) +} + const metamask: InjectedWalletModule = { label: ProviderLabel.MetaMask, injectedNamespace: InjectedNameSpace.Ethereum, checkProviderIdentity: ({ provider }) => - !!provider && !!provider[ProviderIdentityFlag.MetaMask], + !!provider && + !!provider[ProviderIdentityFlag.MetaMask] && + !otherProviderFlagsExist(ProviderIdentityFlag.MetaMask, provider), getIcon: async () => (await import('./icons/metamask.js')).default, - getInterface: getInjectedInterface(ProviderIdentityFlag.MetaMask), + getInterface: getInjectedInterface(ProviderIdentityFlag.MetaMask, true), platforms: ['all'] }