From 9b89f7a9cc45860249ddc87553b958f44afadf5c Mon Sep 17 00:00:00 2001 From: Frederik Bolding Date: Wed, 11 Jun 2025 13:11:29 +0200 Subject: [PATCH] feat: Prefer EIP-6963 for detecting providers --- jest.setup.ts | 28 ++++++++++++++++++++++++++++ src/store/api.test.ts | 6 ++++++ src/utils/snaps.test.ts | 18 ++++++++++++++++++ src/utils/snaps.ts | 24 ++++++++++++------------ 4 files changed, 64 insertions(+), 12 deletions(-) diff --git a/jest.setup.ts b/jest.setup.ts index 41c0529307..052bf17198 100644 --- a/jest.setup.ts +++ b/jest.setup.ts @@ -31,4 +31,32 @@ beforeEach(() => { originalConsoleError(error, ...args); }); + + const realAddEventListener = window?.addEventListener?.bind?.(window); + + // Return window.ethereum for EIP6963 when applicable. + Object.assign(globalThis, 'window', { + addEventListener: jest.fn().mockImplementation((type, listener) => { + if ( + typeof listener === 'function' && + type === 'eip6963:announceProvider' && + window.ethereum + ) { + listener( + new CustomEvent('eip6963:announceProvider', { + detail: { + info: { + name: 'MetaMask', + rdns: 'io.metamask', + uuid: '359b317d-0e02-4cea-ade8-7f671fdd5c7e', + }, + provider: window.ethereum, + }, + }), + ); + } else { + realAddEventListener(type, listener); + } + }), + }); }); diff --git a/src/store/api.test.ts b/src/store/api.test.ts index f724b296e2..2bd88ce19e 100644 --- a/src/store/api.test.ts +++ b/src/store/api.test.ts @@ -57,6 +57,9 @@ describe('request', () => { writable: true, value: { ethereum: provider, + addEventListener: jest.fn(), + dispatchEvent: jest.fn(), + removeEventListener: jest.fn(), }, }); @@ -78,6 +81,9 @@ describe('request', () => { writable: true, value: { ethereum: provider, + addEventListener: jest.fn(), + dispatchEvent: jest.fn(), + removeEventListener: jest.fn(), }, }); diff --git a/src/utils/snaps.test.ts b/src/utils/snaps.test.ts index 65b25aca8b..c42b1b85c0 100644 --- a/src/utils/snaps.test.ts +++ b/src/utils/snaps.test.ts @@ -122,6 +122,9 @@ describe('getMetaMaskProvider', () => { // eslint-disable-next-line @typescript-eslint/naming-convention web3_clientVersion: 'MetaMask/11.0.0', }), + addEventListener: jest.fn(), + dispatchEvent: jest.fn(), + removeEventListener: jest.fn(), }, }); @@ -146,6 +149,9 @@ describe('getMetaMaskProvider', () => { provider, ], }, + addEventListener: jest.fn(), + dispatchEvent: jest.fn(), + removeEventListener: jest.fn(), }, }); @@ -170,6 +176,9 @@ describe('getMetaMaskProvider', () => { provider, ], }, + addEventListener: jest.fn(), + dispatchEvent: jest.fn(), + removeEventListener: jest.fn(), }, }); @@ -230,6 +239,9 @@ describe('getSnapsProvider', () => { // eslint-disable-next-line @typescript-eslint/naming-convention wallet_getAllSnaps: [], }), + addEventListener: jest.fn(), + dispatchEvent: jest.fn(), + removeEventListener: jest.fn(), }, }); @@ -254,6 +266,9 @@ describe('getSnapsProvider', () => { provider, ], }, + addEventListener: jest.fn(), + dispatchEvent: jest.fn(), + removeEventListener: jest.fn(), }, }); @@ -278,6 +293,9 @@ describe('getSnapsProvider', () => { provider, ], }, + addEventListener: jest.fn(), + dispatchEvent: jest.fn(), + removeEventListener: jest.fn(), }, }); diff --git a/src/utils/snaps.ts b/src/utils/snaps.ts index 9b99340c1a..328cfc0427 100644 --- a/src/utils/snaps.ts +++ b/src/utils/snaps.ts @@ -118,6 +118,12 @@ export async function getMetaMaskProvider() { return null; } + const eip6963Provider = await getMetaMaskEIP6963Provider(); + + if (eip6963Provider) { + return eip6963Provider; + } + if (await isMetaMaskProvider()) { return window.ethereum; } @@ -138,12 +144,6 @@ export async function getMetaMaskProvider() { } } - const eip6963Provider = await getMetaMaskEIP6963Provider(); - - if (eip6963Provider) { - return eip6963Provider; - } - return null; } @@ -158,6 +158,12 @@ export async function getSnapsProvider() { return null; } + const eip6963Provider = await getMetaMaskEIP6963Provider(); + + if (eip6963Provider && (await hasSnapsSupport(eip6963Provider))) { + return eip6963Provider; + } + if (await hasSnapsSupport()) { return window.ethereum; } @@ -178,12 +184,6 @@ export async function getSnapsProvider() { } } - const eip6963Provider = await getMetaMaskEIP6963Provider(); - - if (eip6963Provider && (await hasSnapsSupport(eip6963Provider))) { - return eip6963Provider; - } - return null; }