From f7dba465df29a37d25e55764cf077cd13cb96a34 Mon Sep 17 00:00:00 2001 From: Christian Montoya Date: Mon, 9 Jun 2025 15:16:38 -0400 Subject: [PATCH 1/2] Use only 6963, remove code and tests that rely on window.ethereum --- src/utils/snaps.test.ts | 176 +--------------------------------------- src/utils/snaps.ts | 79 ++++-------------- 2 files changed, 15 insertions(+), 240 deletions(-) diff --git a/src/utils/snaps.test.ts b/src/utils/snaps.test.ts index 65b25aca8b..8e5f53583d 100644 --- a/src/utils/snaps.test.ts +++ b/src/utils/snaps.test.ts @@ -1,4 +1,4 @@ -import { describe, it, expect, beforeEach } from '@jest/globals'; +import { describe, it, expect } from '@jest/globals'; import type { VerifiedSnap } from './snaps'; import { @@ -89,93 +89,6 @@ describe('isMetaMaskProvider', () => { }); describe('getMetaMaskProvider', () => { - beforeEach(() => { - Object.defineProperty(globalThis, 'window', { - writable: true, - value: undefined, - }); - }); - - it('returns `null` if `window` is undefined', async () => { - expect(await getMetaMaskProvider()).toBeNull(); - }); - - it('returns `null` if no provider is detected', async () => { - Object.defineProperty(globalThis, 'window', { - writable: true, - value: { - ethereum: undefined, - addEventListener: jest.fn(), - dispatchEvent: jest.fn(), - removeEventListener: jest.fn(), - }, - }); - - expect(await getMetaMaskProvider()).toBeNull(); - }); - - it('returns the provider if it is MetaMask', async () => { - Object.defineProperty(globalThis, 'window', { - writable: true, - value: { - ethereum: getRequestMethodMock({ - // eslint-disable-next-line @typescript-eslint/naming-convention - web3_clientVersion: 'MetaMask/11.0.0', - }), - }, - }); - - expect(await getMetaMaskProvider()).not.toBeNull(); - }); - - it('returns the provider if it is in the `window.ethereum.detected` array', async () => { - const provider = getRequestMethodMock({ - // eslint-disable-next-line @typescript-eslint/naming-convention - web3_clientVersion: 'MetaMask/11.0.0', - }); - - Object.defineProperty(globalThis, 'window', { - writable: true, - value: { - ethereum: { - detected: [ - getRequestMethodMock({ - // eslint-disable-next-line @typescript-eslint/naming-convention - web3_clientVersion: 'Foo/11.0.0', - }), - provider, - ], - }, - }, - }); - - expect(await getMetaMaskProvider()).toBe(provider); - }); - - it('returns the provider if it is in the `window.ethereum.providers` array', async () => { - const provider = getRequestMethodMock({ - // eslint-disable-next-line @typescript-eslint/naming-convention - web3_clientVersion: 'MetaMask/11.0.0', - }); - - Object.defineProperty(globalThis, 'window', { - writable: true, - value: { - ethereum: { - providers: [ - getRequestMethodMock({ - // eslint-disable-next-line @typescript-eslint/naming-convention - web3_clientVersion: 'Foo/11.0.0', - }), - provider, - ], - }, - }, - }); - - expect(await getMetaMaskProvider()).toBe(provider); - }); - it('returns the provider if it is available via EIP6963', async () => { Object.defineProperty(globalThis, 'window', { writable: true, @@ -197,93 +110,6 @@ describe('getMetaMaskProvider', () => { }); describe('getSnapsProvider', () => { - beforeEach(() => { - Object.defineProperty(globalThis, 'window', { - writable: true, - value: undefined, - }); - }); - - it('returns `null` if `window` is undefined', async () => { - expect(await getSnapsProvider()).toBeNull(); - }); - - it('returns `null` if no provider is detected', async () => { - Object.defineProperty(globalThis, 'window', { - writable: true, - value: { - ethereum: undefined, - addEventListener: jest.fn(), - dispatchEvent: jest.fn(), - removeEventListener: jest.fn(), - }, - }); - - expect(await getSnapsProvider()).toBeNull(); - }); - - it('returns the provider if it supports Snaps', async () => { - Object.defineProperty(globalThis, 'window', { - writable: true, - value: { - ethereum: getRequestMethodMock({ - // eslint-disable-next-line @typescript-eslint/naming-convention - wallet_getAllSnaps: [], - }), - }, - }); - - expect(await getSnapsProvider()).not.toBeNull(); - }); - - it('returns the provider if it is in the `window.ethereum.detected` array', async () => { - const provider = getRequestMethodMock({ - // eslint-disable-next-line @typescript-eslint/naming-convention - wallet_getAllSnaps: [], - }); - - Object.defineProperty(globalThis, 'window', { - writable: true, - value: { - ethereum: { - detected: [ - getRequestMethodMock({ - // eslint-disable-next-line @typescript-eslint/naming-convention - wallet_getSnaps: new Error('Unsupported method.'), - }), - provider, - ], - }, - }, - }); - - expect(await getSnapsProvider()).toBe(provider); - }); - - it('returns the provider if it is in the `window.ethereum.providers` array', async () => { - const provider = getRequestMethodMock({ - // eslint-disable-next-line @typescript-eslint/naming-convention - wallet_getSnaps: {}, - }); - - Object.defineProperty(globalThis, 'window', { - writable: true, - value: { - ethereum: { - providers: [ - getRequestMethodMock({ - // eslint-disable-next-line @typescript-eslint/naming-convention - wallet_getSnaps: new Error('Unsupported method.'), - }), - provider, - ], - }, - }, - }); - - expect(await getSnapsProvider()).toBe(provider); - }); - it('returns the provider if it is available via EIP6963', async () => { Object.defineProperty(globalThis, 'window', { writable: true, diff --git a/src/utils/snaps.ts b/src/utils/snaps.ts index 9b99340c1a..28f808c6ba 100644 --- a/src/utils/snaps.ts +++ b/src/utils/snaps.ts @@ -21,13 +21,10 @@ export type Fields = { /** * Check if the current provider supports snaps by calling `wallet_getSnaps`. * - * @param provider - The provider to use to check for snaps support. Defaults to - * `window.ethereum`. + * @param provider - The provider to use to check for snaps support. * @returns True if the provider supports snaps, false otherwise. */ -export async function hasSnapsSupport( - provider: MetaMaskInpageProvider = window.ethereum, -) { +export async function hasSnapsSupport(provider: MetaMaskInpageProvider) { try { await provider.request({ method: 'wallet_getSnaps', @@ -42,13 +39,10 @@ export async function hasSnapsSupport( /** * Check if the current provider is MetaMask by calling `web3_clientVersion`. * - * @param provider - The provider to use to check for MetaMask. Defaults to - * `window.ethereum`. + * @param provider - The provider to use to check for MetaMask. * @returns True if the provider is MetaMask, false otherwise. */ -export async function isMetaMaskProvider( - provider: MetaMaskInpageProvider = window.ethereum, -) { +export async function isMetaMaskProvider(provider: MetaMaskInpageProvider) { try { const result = await provider.request({ method: 'web3_clientVersion', @@ -68,6 +62,14 @@ export async function isMetaMaskProvider( * @returns A MetaMask provider if found, otherwise null. */ export async function getMetaMaskEIP6963Provider() { + /* can't do this in a util + const [metaMaskProvider, setMetaMaskProvider] = useState(null); + + if(metaMaskProvider) { + return metaMaskProvider; + } + */ + return new Promise((rawResolve) => { // Timeout looking for providers after 500ms const timeout = setTimeout(() => { @@ -99,6 +101,7 @@ export async function getMetaMaskEIP6963Provider() { const { info, provider } = event.detail; if (info.rdns.includes('io.metamask')) { + // setMetaMaskProvider(provider); resolve(provider); } } @@ -114,37 +117,7 @@ export async function getMetaMaskEIP6963Provider() { * and return the first one that is MetaMask. */ export async function getMetaMaskProvider() { - if (typeof window === 'undefined') { - return null; - } - - if (await isMetaMaskProvider()) { - return window.ethereum; - } - - if (window.ethereum?.detected) { - for (const provider of window.ethereum.detected) { - if (await isMetaMaskProvider(provider)) { - return provider; - } - } - } - - if (window.ethereum?.providers) { - for (const provider of window.ethereum.providers) { - if (await isMetaMaskProvider(provider)) { - return provider; - } - } - } - - const eip6963Provider = await getMetaMaskEIP6963Provider(); - - if (eip6963Provider) { - return eip6963Provider; - } - - return null; + return getMetaMaskEIP6963Provider(); } /** @@ -154,30 +127,6 @@ export async function getMetaMaskProvider() { * @returns The provider, or `null` if no provider supports snaps. */ export async function getSnapsProvider() { - if (typeof window === 'undefined') { - return null; - } - - if (await hasSnapsSupport()) { - return window.ethereum; - } - - if (window.ethereum?.detected) { - for (const provider of window.ethereum.detected) { - if (await hasSnapsSupport(provider)) { - return provider; - } - } - } - - if (window.ethereum?.providers) { - for (const provider of window.ethereum.providers) { - if (await hasSnapsSupport(provider)) { - return provider; - } - } - } - const eip6963Provider = await getMetaMaskEIP6963Provider(); if (eip6963Provider && (await hasSnapsSupport(eip6963Provider))) { From 44991f2767f8e7a76df86c05a8d96e6b82462f9f Mon Sep 17 00:00:00 2001 From: Christian Montoya Date: Tue, 10 Jun 2025 17:02:40 -0400 Subject: [PATCH 2/2] Remove comments --- src/utils/snaps.ts | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/utils/snaps.ts b/src/utils/snaps.ts index 28f808c6ba..a6c288e42a 100644 --- a/src/utils/snaps.ts +++ b/src/utils/snaps.ts @@ -62,14 +62,6 @@ export async function isMetaMaskProvider(provider: MetaMaskInpageProvider) { * @returns A MetaMask provider if found, otherwise null. */ export async function getMetaMaskEIP6963Provider() { - /* can't do this in a util - const [metaMaskProvider, setMetaMaskProvider] = useState(null); - - if(metaMaskProvider) { - return metaMaskProvider; - } - */ - return new Promise((rawResolve) => { // Timeout looking for providers after 500ms const timeout = setTimeout(() => { @@ -101,7 +93,6 @@ export async function getMetaMaskEIP6963Provider() { const { info, provider } = event.detail; if (info.rdns.includes('io.metamask')) { - // setMetaMaskProvider(provider); resolve(provider); } }