Skip to content

Commit 56623ac

Browse files
authored
[injected-v2.0.5] - Add support for multiple injected wallet support when Coinbase wallet is installed (#924)
* A start on handling multiple installed extensions * Expand on check for providers array * Update version for injected wallet package * Update brave wallet to check providers array * Update BlankWallet -> BlockWallet, add usage around getInjectedInterface
1 parent d6183bf commit 56623ac

File tree

5 files changed

+41
-25
lines changed

5 files changed

+41
-25
lines changed

packages/injected/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@web3-onboard/injected-wallets",
3-
"version": "2.0.4",
3+
"version": "2.0.5",
44
"description": "Injected wallets module for web3-onboard",
55
"module": "dist/index.js",
66
"browser": "dist/index.js",

packages/injected/src/index.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,22 @@ function injected(options?: InjectedWalletOptions): WalletInit {
5555
({ injectedNamespace, checkProviderIdentity, label }) => {
5656
const provider = window[injectedNamespace] as CustomWindow['ethereum']
5757

58-
const walletExists = checkProviderIdentity({ provider, device })
58+
if (!provider) return
59+
60+
let walletExists
61+
62+
if (provider.providers && Array.isArray(provider.providers)) {
63+
walletExists = !!provider.providers.filter(provider =>
64+
checkProviderIdentity({ provider, device })
65+
).length
66+
} else {
67+
walletExists = checkProviderIdentity({ provider, device })
68+
}
5969

6070
if (
6171
walletExists &&
62-
provider &&
6372
provider.isMetaMask &&
73+
!provider.overrideIsMetaMask &&
6474
label !== ProviderLabel.MetaMask &&
6575
label !== 'Detected Wallet'
6676
) {

packages/injected/src/types.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export enum ProviderIdentityFlag {
1616
AToken = 'isAToken',
1717
Binance = 'bbcSignTx',
1818
Bitpie = 'isBitpie',
19-
BlankWallet = 'isBlank',
19+
BlockWallet = 'isBlockWallet',
2020
Coinbase = 'isToshi',
2121
CoinbaseExtension = 'isCoinbaseWallet',
2222
Detected = 'request',
@@ -47,7 +47,7 @@ export enum ProviderLabel {
4747
AToken = 'AToken',
4848
Binance = 'Binance Smart Wallet',
4949
Bitpie = 'Bitpie',
50-
BlankWallet = 'BlankWallet',
50+
BlockWallet = 'BlockWallet',
5151
Brave = 'Brave Wallet',
5252
Coinbase = 'Coinbase Wallet',
5353
Dcent = `D'CENT`,
@@ -107,7 +107,8 @@ export interface CustomWindow extends Window {
107107
export type InjectedProvider = ExternalProvider &
108108
BinanceProvider &
109109
MeetOneProvider &
110-
Record<string, boolean>
110+
Record<string, boolean> &
111+
Record<string, InjectedProvider[]>
111112

112113
export type WalletFilters = {
113114
// A provider label mapped to a list of excluded platforms

packages/injected/src/wallets.ts

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,27 +17,34 @@ declare const window: CustomWindow
1717

1818
const UNSUPPORTED_METHOD = null
1919

20+
function getInjectedInterface(
21+
identity: string
22+
): () => Promise<{ provider: EIP1193Provider }> {
23+
return async () => ({
24+
provider: (window.ethereum.providers &&
25+
Array.isArray(window.ethereum.providers)
26+
? window.ethereum.providers.find(provider => !!provider[identity])
27+
: window.ethereum) as EIP1193Provider
28+
})
29+
}
30+
2031
const metamask: InjectedWalletModule = {
2132
label: ProviderLabel.MetaMask,
2233
injectedNamespace: InjectedNameSpace.Ethereum,
2334
checkProviderIdentity: ({ provider }) =>
2435
!!provider && !!provider[ProviderIdentityFlag.MetaMask],
2536
getIcon: async () => (await import('./icons/metamask.js')).default,
26-
getInterface: async () => ({
27-
provider: window.ethereum as EIP1193Provider
28-
}),
37+
getInterface: getInjectedInterface(ProviderIdentityFlag.MetaMask),
2938
platforms: ['all']
3039
}
3140

3241
const brave: InjectedWalletModule = {
3342
label: ProviderLabel.Brave,
3443
injectedNamespace: InjectedNameSpace.Ethereum,
35-
checkProviderIdentity: ({ provider }) =>
44+
checkProviderIdentity: ({ provider }) =>
3645
!!provider && !!provider[ProviderIdentityFlag.BraveWallet],
3746
getIcon: async () => (await import('./icons/brave.js')).default,
38-
getInterface: async () => ({
39-
provider: window.ethereum as EIP1193Provider
40-
}),
47+
getInterface: getInjectedInterface(ProviderIdentityFlag.BraveWallet),
4148
platforms: ['all']
4249
}
4350

@@ -109,7 +116,10 @@ const coinbase: InjectedWalletModule = {
109116
!!provider.providers[0][ProviderIdentityFlag.CoinbaseExtension]),
110117
getIcon: async () => (await import('./icons/coinbase.js')).default,
111118
getInterface: async () => {
112-
const provider = window.ethereum as EIP1193Provider
119+
const { provider } = await getInjectedInterface(
120+
ProviderIdentityFlag.CoinbaseExtension
121+
)()
122+
113123
const addListener: SimpleEventEmitter['on'] = provider.on.bind(provider)
114124
provider.on = (event, func) => {
115125
// intercept chainChanged event and format string
@@ -231,18 +241,13 @@ const bitpie: InjectedWalletModule = {
231241
platforms: ['mobile']
232242
}
233243

234-
const blankwallet: InjectedWalletModule = {
235-
label: ProviderLabel.BlankWallet,
244+
const blockwallet: InjectedWalletModule = {
245+
label: ProviderLabel.BlockWallet,
236246
injectedNamespace: InjectedNameSpace.Ethereum,
237247
checkProviderIdentity: ({ provider }) =>
238-
!!provider && !!provider[ProviderIdentityFlag.BlankWallet],
239-
getIcon: async () => (await import('./icons/blankwallet.js')).default,
240-
getInterface: async () => ({
241-
provider: createEIP1193Provider(window.ethereum, {
242-
wallet_switchEthereumChain: UNSUPPORTED_METHOD,
243-
eth_selectAccounts: UNSUPPORTED_METHOD
244-
})
245-
}),
248+
!!provider && !!provider[ProviderIdentityFlag.BlockWallet],
249+
getIcon: async () => (await import('./icons/blockwallet.js')).default,
250+
getInterface: getInjectedInterface(ProviderIdentityFlag.BlockWallet),
246251
platforms: ['desktop']
247252
}
248253

@@ -487,7 +492,7 @@ const wallets = [
487492
alphawallet,
488493
atoken,
489494
bitpie,
490-
blankwallet,
495+
blockwallet,
491496
brave,
492497
dcent,
493498
frame,

0 commit comments

Comments
 (0)