Skip to content

Commit b141e9f

Browse files
feat: Prefer EIP-6963 for detecting providers (#563)
Prefer EIP-6963 for detecting providers to reduce usage of providers pretending to be MetaMask or providers that aggressively overwrite `window.ethereum`.
1 parent b46fda1 commit b141e9f

File tree

4 files changed

+64
-12
lines changed

4 files changed

+64
-12
lines changed

jest.setup.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,32 @@ beforeEach(() => {
3131

3232
originalConsoleError(error, ...args);
3333
});
34+
35+
const realAddEventListener = window?.addEventListener?.bind?.(window);
36+
37+
// Return window.ethereum for EIP6963 when applicable.
38+
Object.assign(globalThis, 'window', {
39+
addEventListener: jest.fn().mockImplementation((type, listener) => {
40+
if (
41+
typeof listener === 'function' &&
42+
type === 'eip6963:announceProvider' &&
43+
window.ethereum
44+
) {
45+
listener(
46+
new CustomEvent('eip6963:announceProvider', {
47+
detail: {
48+
info: {
49+
name: 'MetaMask',
50+
rdns: 'io.metamask',
51+
uuid: '359b317d-0e02-4cea-ade8-7f671fdd5c7e',
52+
},
53+
provider: window.ethereum,
54+
},
55+
}),
56+
);
57+
} else {
58+
realAddEventListener(type, listener);
59+
}
60+
}),
61+
});
3462
});

src/store/api.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ describe('request', () => {
5757
writable: true,
5858
value: {
5959
ethereum: provider,
60+
addEventListener: jest.fn(),
61+
dispatchEvent: jest.fn(),
62+
removeEventListener: jest.fn(),
6063
},
6164
});
6265

@@ -78,6 +81,9 @@ describe('request', () => {
7881
writable: true,
7982
value: {
8083
ethereum: provider,
84+
addEventListener: jest.fn(),
85+
dispatchEvent: jest.fn(),
86+
removeEventListener: jest.fn(),
8187
},
8288
});
8389

src/utils/snaps.test.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,9 @@ describe('getMetaMaskProvider', () => {
122122
// eslint-disable-next-line @typescript-eslint/naming-convention
123123
web3_clientVersion: 'MetaMask/11.0.0',
124124
}),
125+
addEventListener: jest.fn(),
126+
dispatchEvent: jest.fn(),
127+
removeEventListener: jest.fn(),
125128
},
126129
});
127130

@@ -146,6 +149,9 @@ describe('getMetaMaskProvider', () => {
146149
provider,
147150
],
148151
},
152+
addEventListener: jest.fn(),
153+
dispatchEvent: jest.fn(),
154+
removeEventListener: jest.fn(),
149155
},
150156
});
151157

@@ -170,6 +176,9 @@ describe('getMetaMaskProvider', () => {
170176
provider,
171177
],
172178
},
179+
addEventListener: jest.fn(),
180+
dispatchEvent: jest.fn(),
181+
removeEventListener: jest.fn(),
173182
},
174183
});
175184

@@ -230,6 +239,9 @@ describe('getSnapsProvider', () => {
230239
// eslint-disable-next-line @typescript-eslint/naming-convention
231240
wallet_getAllSnaps: [],
232241
}),
242+
addEventListener: jest.fn(),
243+
dispatchEvent: jest.fn(),
244+
removeEventListener: jest.fn(),
233245
},
234246
});
235247

@@ -254,6 +266,9 @@ describe('getSnapsProvider', () => {
254266
provider,
255267
],
256268
},
269+
addEventListener: jest.fn(),
270+
dispatchEvent: jest.fn(),
271+
removeEventListener: jest.fn(),
257272
},
258273
});
259274

@@ -278,6 +293,9 @@ describe('getSnapsProvider', () => {
278293
provider,
279294
],
280295
},
296+
addEventListener: jest.fn(),
297+
dispatchEvent: jest.fn(),
298+
removeEventListener: jest.fn(),
281299
},
282300
});
283301

src/utils/snaps.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,12 @@ export async function getMetaMaskProvider() {
118118
return null;
119119
}
120120

121+
const eip6963Provider = await getMetaMaskEIP6963Provider();
122+
123+
if (eip6963Provider) {
124+
return eip6963Provider;
125+
}
126+
121127
if (await isMetaMaskProvider()) {
122128
return window.ethereum;
123129
}
@@ -138,12 +144,6 @@ export async function getMetaMaskProvider() {
138144
}
139145
}
140146

141-
const eip6963Provider = await getMetaMaskEIP6963Provider();
142-
143-
if (eip6963Provider) {
144-
return eip6963Provider;
145-
}
146-
147147
return null;
148148
}
149149

@@ -158,6 +158,12 @@ export async function getSnapsProvider() {
158158
return null;
159159
}
160160

161+
const eip6963Provider = await getMetaMaskEIP6963Provider();
162+
163+
if (eip6963Provider && (await hasSnapsSupport(eip6963Provider))) {
164+
return eip6963Provider;
165+
}
166+
161167
if (await hasSnapsSupport()) {
162168
return window.ethereum;
163169
}
@@ -178,12 +184,6 @@ export async function getSnapsProvider() {
178184
}
179185
}
180186

181-
const eip6963Provider = await getMetaMaskEIP6963Provider();
182-
183-
if (eip6963Provider && (await hasSnapsSupport(eip6963Provider))) {
184-
return eip6963Provider;
185-
}
186-
187187
return null;
188188
}
189189

0 commit comments

Comments
 (0)