From 3d2ec69e0b7fdeb48e2c7a01feb4247c10a77096 Mon Sep 17 00:00:00 2001 From: Adam Carpenter Date: Wed, 7 Sep 2022 12:09:58 -0600 Subject: [PATCH 1/7] Add function to MM getInterface to check provider against all other provider flags --- packages/demo/package.json | 2 +- packages/injected/package.json | 2 +- packages/injected/src/wallets.ts | 22 +++++++++++++++++++--- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/packages/demo/package.json b/packages/demo/package.json index dd27261d5..0f917e52c 100644 --- a/packages/demo/package.json +++ b/packages/demo/package.json @@ -28,7 +28,7 @@ "@web3-onboard/fortmatic": "^2.0.13", "@web3-onboard/gas": "^2.1.2", "@web3-onboard/gnosis": "^2.1.2", - "@web3-onboard/injected-wallets": "^2.2.1", + "@web3-onboard/injected-wallets": "^2.2.2-alpha.1", "@web3-onboard/keepkey": "^2.3.0", "@web3-onboard/keystone": "^2.3.0", "@web3-onboard/ledger": "^2.3.0", diff --git a/packages/injected/package.json b/packages/injected/package.json index 7c9ef3814..f9210527a 100644 --- a/packages/injected/package.json +++ b/packages/injected/package.json @@ -1,6 +1,6 @@ { "name": "@web3-onboard/injected-wallets", - "version": "2.2.1", + "version": "2.2.2-alpha.1", "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 aa15318ab..078e20683 100644 --- a/packages/injected/src/wallets.ts +++ b/packages/injected/src/wallets.ts @@ -23,23 +23,39 @@ 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]) + ? window.ethereum.providers.find(provider => { + if (!checkOtherProviderFlags) { + return !!provider[identity] + } + return ( + !!provider[identity] && + !checkOtherProviderIdentities(identity, provider) + ) + }) : window.ethereum) as EIP1193Provider }) } +function checkOtherProviderIdentities(identity: string, provider: any) { + 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], getIcon: async () => (await import('./icons/metamask.js')).default, - getInterface: getInjectedInterface(ProviderIdentityFlag.MetaMask), + getInterface: getInjectedInterface(ProviderIdentityFlag.MetaMask, true), platforms: ['all'] } From 0985dbb6ee7a0e8c69828711a89c1b6d2c6d2c66 Mon Sep 17 00:00:00 2001 From: Adam Carpenter Date: Wed, 7 Sep 2022 12:21:33 -0600 Subject: [PATCH 2/7] Refactor function that retrieves provider from providers array --- packages/injected/src/wallets.ts | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/packages/injected/src/wallets.ts b/packages/injected/src/wallets.ts index 078e20683..e80d4ffb8 100644 --- a/packages/injected/src/wallets.ts +++ b/packages/injected/src/wallets.ts @@ -29,19 +29,28 @@ function getInjectedInterface( return async () => ({ provider: (window.ethereum.providers && Array.isArray(window.ethereum.providers) - ? window.ethereum.providers.find(provider => { - if (!checkOtherProviderFlags) { - return !!provider[identity] - } - return ( - !!provider[identity] && - !checkOtherProviderIdentities(identity, provider) - ) - }) + ? getInterfaceFromProvidersArray( + checkOtherProviderFlags || false, + identity + ) : window.ethereum) as EIP1193Provider }) } +function getInterfaceFromProvidersArray( + checkOtherProviderFlags: boolean, + identity: string +) { + return window.ethereum.providers.find(provider => { + if (!checkOtherProviderFlags) { + return !!provider[identity] + } + return ( + !!provider[identity] && !checkOtherProviderIdentities(identity, provider) + ) + }) +} + function checkOtherProviderIdentities(identity: string, provider: any) { const otherProviderFlags = Object.values(ProviderIdentityFlag).filter( id => id !== identity && id !== ProviderIdentityFlag.Detected From 8cd3eb5d6d0ea7fe66e024831fd214a8328ab3cc Mon Sep 17 00:00:00 2001 From: Adam Carpenter Date: Wed, 7 Sep 2022 16:16:43 -0600 Subject: [PATCH 3/7] Small refactor --- packages/injected/src/wallets.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/injected/src/wallets.ts b/packages/injected/src/wallets.ts index e80d4ffb8..537f76670 100644 --- a/packages/injected/src/wallets.ts +++ b/packages/injected/src/wallets.ts @@ -30,16 +30,16 @@ function getInjectedInterface( provider: (window.ethereum.providers && Array.isArray(window.ethereum.providers) ? getInterfaceFromProvidersArray( - checkOtherProviderFlags || false, - identity + identity, + checkOtherProviderFlags ) : window.ethereum) as EIP1193Provider }) } function getInterfaceFromProvidersArray( - checkOtherProviderFlags: boolean, - identity: string + identity: string, + checkOtherProviderFlags?: boolean, ) { return window.ethereum.providers.find(provider => { if (!checkOtherProviderFlags) { From 478157839905450c126777671fdc820605a03ec5 Mon Sep 17 00:00:00 2001 From: Adam Carpenter Date: Wed, 7 Sep 2022 16:19:27 -0600 Subject: [PATCH 4/7] Smaller refactor --- packages/injected/src/wallets.ts | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/packages/injected/src/wallets.ts b/packages/injected/src/wallets.ts index 537f76670..eff5eab80 100644 --- a/packages/injected/src/wallets.ts +++ b/packages/injected/src/wallets.ts @@ -29,25 +29,20 @@ function getInjectedInterface( return async () => ({ provider: (window.ethereum.providers && Array.isArray(window.ethereum.providers) - ? getInterfaceFromProvidersArray( - identity, - checkOtherProviderFlags - ) + ? getInterfaceFromProvidersArray(identity, checkOtherProviderFlags) : window.ethereum) as EIP1193Provider }) } function getInterfaceFromProvidersArray( identity: string, - checkOtherProviderFlags?: boolean, + checkOtherProviderFlags?: boolean ) { return window.ethereum.providers.find(provider => { - if (!checkOtherProviderFlags) { - return !!provider[identity] - } - return ( - !!provider[identity] && !checkOtherProviderIdentities(identity, provider) - ) + return checkOtherProviderFlags + ? !!provider[identity] && + !checkOtherProviderIdentities(identity, provider) + : !!provider[identity] }) } From 34f92f2247abfdb9765ffa6aebc2cf023d6cf53e Mon Sep 17 00:00:00 2001 From: Adam Carpenter Date: Thu, 8 Sep 2022 08:55:20 -0600 Subject: [PATCH 5/7] Added provider identity check for MM --- packages/injected/src/wallets.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/injected/src/wallets.ts b/packages/injected/src/wallets.ts index eff5eab80..c9b054e3f 100644 --- a/packages/injected/src/wallets.ts +++ b/packages/injected/src/wallets.ts @@ -57,7 +57,9 @@ const metamask: InjectedWalletModule = { label: ProviderLabel.MetaMask, injectedNamespace: InjectedNameSpace.Ethereum, checkProviderIdentity: ({ provider }) => - !!provider && !!provider[ProviderIdentityFlag.MetaMask], + !!provider && + !!provider[ProviderIdentityFlag.MetaMask] && + !checkOtherProviderIdentities(ProviderIdentityFlag.MetaMask, provider), getIcon: async () => (await import('./icons/metamask.js')).default, getInterface: getInjectedInterface(ProviderIdentityFlag.MetaMask, true), platforms: ['all'] From fbf626b98049f645f1e0117ba3877c7ee355a575 Mon Sep 17 00:00:00 2001 From: Adam Carpenter Date: Thu, 8 Sep 2022 10:48:59 -0600 Subject: [PATCH 6/7] Rename function for checking for other provider flags --- packages/injected/src/wallets.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/injected/src/wallets.ts b/packages/injected/src/wallets.ts index c9b054e3f..3a63c9126 100644 --- a/packages/injected/src/wallets.ts +++ b/packages/injected/src/wallets.ts @@ -41,12 +41,12 @@ function getInterfaceFromProvidersArray( return window.ethereum.providers.find(provider => { return checkOtherProviderFlags ? !!provider[identity] && - !checkOtherProviderIdentities(identity, provider) + !otherProviderFlagsExist(identity, provider) : !!provider[identity] }) } -function checkOtherProviderIdentities(identity: string, provider: any) { +function otherProviderFlagsExist(identity: string, provider: any): boolean { const otherProviderFlags = Object.values(ProviderIdentityFlag).filter( id => id !== identity && id !== ProviderIdentityFlag.Detected ) @@ -59,7 +59,7 @@ const metamask: InjectedWalletModule = { checkProviderIdentity: ({ provider }) => !!provider && !!provider[ProviderIdentityFlag.MetaMask] && - !checkOtherProviderIdentities(ProviderIdentityFlag.MetaMask, provider), + !otherProviderFlagsExist(ProviderIdentityFlag.MetaMask, provider), getIcon: async () => (await import('./icons/metamask.js')).default, getInterface: getInjectedInterface(ProviderIdentityFlag.MetaMask, true), platforms: ['all'] From 4f44e98edbfa8fb18ac5dabb1a13641b69f8f163 Mon Sep 17 00:00:00 2001 From: Adam Carpenter Date: Fri, 9 Sep 2022 08:58:14 -0600 Subject: [PATCH 7/7] Bump version and merge in develop --- packages/injected/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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",