@@ -9,7 +9,6 @@ import { getProviderName } from '../../utilities'
9
9
// wallets that qualify for default wallets need to have no
10
10
// init parameters that are required for full functionality
11
11
const desktopDefaultWalletNames = [
12
- 'detectedwallet' ,
13
12
'metamask' ,
14
13
'binance' ,
15
14
'frame' ,
@@ -19,7 +18,6 @@ const desktopDefaultWalletNames = [
19
18
]
20
19
21
20
const mobileDefaultWalletNames = [
22
- 'detectedwallet' ,
23
21
'metamask' ,
24
22
'coinbase' ,
25
23
'trust' ,
@@ -39,48 +37,65 @@ const mobileDefaultWalletNames = [
39
37
'tp'
40
38
]
41
39
42
- const injectedWalletDetected = ( ) =>
43
- window . ethereum && getProviderName ( window . ethereum ) === undefined
40
+ const providerNameToWalletName = ( providerName : string ) =>
41
+ providerName === 'imToken'
42
+ ? providerName
43
+ : providerName === 'WalletConnect'
44
+ ? 'walletConnect'
45
+ : providerName . toLocaleLowerCase ( )
44
46
45
47
function select (
46
48
wallets : Array < WalletInitOptions | WalletModule > | undefined ,
47
49
networkId : number ,
48
50
isMobile : boolean
49
51
) {
52
+ // If we detect an injected wallet then place the detected wallet
53
+ // at the beginning of the list e.g. the top of the wallet select modal
54
+ let detectedProviderName : string | undefined
55
+ let detectedWalletName : string | undefined
56
+ if ( window ?. ethereum ) {
57
+ detectedProviderName = getProviderName ( window . ethereum )
58
+ if ( detectedProviderName ) {
59
+ detectedWalletName = providerNameToWalletName ( detectedProviderName )
60
+ }
61
+ }
62
+
50
63
if ( wallets ) {
51
64
const hideWallet = ( wallet : WalletInitOptions ) =>
52
65
wallet ?. display &&
53
66
wallet ?. display [ isMobile ? 'mobile' : 'desktop' ] === false
54
67
55
- // For backwards compatibility if a user is still using 'detectedwallet' in the onboard wallet select array
56
- // it will be filtered out so there are no duplicates
57
- wallets = wallets . filter (
58
- wallet =>
59
- 'walletName' in wallet
60
- ? wallet . walletName !== 'detectedwallet' && ! hideWallet ( wallet )
61
- : true // It is not a WalletInitOption but rather a WalletModule so let it through
62
- )
63
-
64
- // If we detect an injected wallet then place the detected wallet
65
- // at the beginning of the list e.g. the top of the wallet select modal
66
- if ( injectedWalletDetected ( ) ) {
68
+ if ( detectedWalletName ) {
69
+ // This wallet is built into onboard so add the walletName and
70
+ // the code below will load it as a wallet module
71
+ wallets . unshift ( { walletName : detectedWalletName } )
72
+ } else if ( detectedProviderName ) {
73
+ // A provider has been detected but there is not a walletName therefore
74
+ // this wallet is not built into onboard so add it as a generic injected wallet
67
75
wallets . unshift ( { walletName : 'detectedwallet' } )
68
76
}
69
77
78
+ const setOfWallets = new Set < string > ( )
70
79
return Promise . all (
71
80
wallets . map ( wallet => {
72
81
// If this is a wallet init object then load the built-in wallet module
73
- if ( isWalletInit ( wallet ) ) {
82
+ if ( isWalletInit ( wallet ) && ! hideWallet ( wallet ) ) {
74
83
const { walletName, ...initParams } = wallet
75
- try {
76
- return getModule ( walletName ) . then ( ( m : any ) =>
77
- m . default ( { ...initParams , networkId, isMobile } )
78
- )
79
- } catch ( error ) {
80
- if ( error . name === 'DeprecatedWalletError' ) {
81
- console . warn ( error . message )
82
- } else {
83
- throw error
84
+ // Check to see if we have seen this wallet before
85
+ // prevents duplicated injected wallet from being added
86
+ if ( ! setOfWallets . has ( walletName ) ) {
87
+ try {
88
+ const module = getModule ( walletName ) . then ( ( m : any ) =>
89
+ m . default ( { ...initParams , networkId, isMobile } )
90
+ )
91
+ setOfWallets . add ( walletName )
92
+ return module
93
+ } catch ( error ) {
94
+ if ( error . name === 'DeprecatedWalletError' ) {
95
+ console . warn ( error . message )
96
+ } else {
97
+ throw error
98
+ }
84
99
}
85
100
}
86
101
}
@@ -94,17 +109,17 @@ function select(
94
109
const defaultWalletNames = isMobile
95
110
? mobileDefaultWalletNames
96
111
: desktopDefaultWalletNames
97
-
112
+ // If we have detected a builtin wallet that is not already in the list of default wallets so add it
113
+ if ( detectedWalletName && ! defaultWalletNames . includes ( detectedWalletName ) ) {
114
+ defaultWalletNames . unshift ( detectedWalletName )
115
+ // If we detected a provider but it is not builtin add the generic injected provider
116
+ } else if ( ! detectedWalletName && detectedProviderName ) {
117
+ defaultWalletNames . unshift ( 'detectedwallet' )
118
+ }
98
119
return Promise . all (
99
- defaultWalletNames
100
- // Include the detected wallet only if an injected wallet is detected
101
- . filter (
102
- walletName =>
103
- walletName !== 'detectedwallet' || injectedWalletDetected ( )
104
- )
105
- . map ( walletName =>
106
- getModule ( walletName ) . then ( ( m : any ) => m . default ( { networkId } ) )
107
- )
120
+ defaultWalletNames . map ( walletName =>
121
+ getModule ( walletName ) . then ( ( m : any ) => m . default ( { networkId } ) )
122
+ )
108
123
)
109
124
}
110
125
0 commit comments