From b990296e74b969dac1504f58f362616276752cdc Mon Sep 17 00:00:00 2001 From: gomes <17035424+gomesalexandre@users.noreply.github.com> Date: Tue, 1 Sep 2026 11:28:49 +0200 Subject: [PATCH] fix: mustBeMetaMask should not detect brave as MetaMask Brave's built-in wallet sets isMetaMask: true for compatibility, so mustBeMetaMask: true false-positives on Brave. Guard on !isBraveWallet too. Rebased onto the current src/ layout (split into detect-ethereum-provider.ts/metamask-ethereum-provider.ts since this PR was opened). --- src/detect-ethereum-provider.ts | 2 +- src/metamask-ethereum-provider.ts | 1 + test/spec.js | 15 +++++++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/detect-ethereum-provider.ts b/src/detect-ethereum-provider.ts index 41d984f..14873da 100644 --- a/src/detect-ethereum-provider.ts +++ b/src/detect-ethereum-provider.ts @@ -56,7 +56,7 @@ export function detectEthereumProvider({ const { ethereum } = window as WindowWithEthereum; - if (ethereum && (!mustBeMetaMask || ethereum.isMetaMask)) { + if (ethereum && (!mustBeMetaMask || (ethereum.isMetaMask && !ethereum.isBraveWallet))) { resolve(ethereum as unknown as T); } else { diff --git a/src/metamask-ethereum-provider.ts b/src/metamask-ethereum-provider.ts index f33bdec..f7f9fd3 100644 --- a/src/metamask-ethereum-provider.ts +++ b/src/metamask-ethereum-provider.ts @@ -1,5 +1,6 @@ export interface MetaMaskEthereumProvider { isMetaMask?: boolean; + isBraveWallet?: boolean; once(eventName: string | symbol, listener: (...args: any[]) => void): this; on(eventName: string | symbol, listener: (...args: any[]) => void): this; off(eventName: string | symbol, listener: (...args: any[]) => void): this; diff --git a/test/spec.js b/test/spec.js index d5ed28a..79844b3 100644 --- a/test/spec.js +++ b/test/spec.js @@ -21,6 +21,10 @@ const mockGlobalProps = (ethereum) => { const providerWithMetaMask = { isMetaMask: true, } +const providerWithBrave = { + isMetaMask: true, + isBraveWallet: true, +} const providerNoMetaMask = {} const noProvider = null @@ -48,6 +52,17 @@ test('detectEthereumProvider: mustBeMetamask with ethereum already set', async f t.end() }) +test('detectEthereumProvider: mustBeMetamask with Brave ethereum already set', async function (t) { + + mockGlobalProps(providerWithBrave) + + const result = await detectEthereumProvider({ timeout: 1, mustBeMetaMask: true }) + t.equal(result, null, 'promise should have resolved null') + t.ok(window.addEventListener.notCalled, 'addEventListener should not have been called') + t.ok(window.removeEventListener.calledOnce, 'removeEventListener called once') + t.end() +}) + test('detectEthereumProvider: mustBeMetamask with non-MetaMask ethereum already set', async function (t) { mockGlobalProps(providerNoMetaMask)