@@ -20,6 +20,7 @@ import {
20
20
UserRejectedRequestError ,
21
21
getAddress ,
22
22
numberToHex ,
23
+ withRetry ,
23
24
} from 'viem'
24
25
25
26
export type MetaMaskParameters = Evaluate <
@@ -33,7 +34,6 @@ export function metaMask(parameters: MetaMaskParameters = {}) {
33
34
onConnect ( connectInfo : ProviderConnectInfo ) : void
34
35
onDisplayUri ( uri : string ) : void
35
36
}
36
- type StorageItem = { 'metaMaskSDK.disconnected' : true }
37
37
type Listener = Parameters < Provider [ 'on' ] > [ 1 ]
38
38
39
39
let sdk : MetaMaskSDK
@@ -46,7 +46,7 @@ export function metaMask(parameters: MetaMaskParameters = {}) {
46
46
let displayUri : ( ( uri : string ) => void ) | undefined
47
47
let disconnect : Connector [ 'onDisconnect' ] | undefined
48
48
49
- return createConnector < Provider , Properties , StorageItem > ( ( config ) => ( {
49
+ return createConnector < Provider , Properties > ( ( config ) => ( {
50
50
id : 'metaMaskSDK' ,
51
51
name : 'MetaMask' ,
52
52
type : metaMask . type ,
@@ -83,8 +83,6 @@ export function metaMask(parameters: MetaMaskParameters = {}) {
83
83
currentChainId = chain ?. id ?? currentChainId
84
84
}
85
85
86
- await config . storage ?. removeItem ( 'metaMaskSDK.disconnected' )
87
-
88
86
if ( displayUri ) {
89
87
provider . removeListener ( 'display_uri' , displayUri )
90
88
displayUri = undefined
@@ -140,10 +138,7 @@ export function metaMask(parameters: MetaMaskParameters = {}) {
140
138
provider . on ( 'connect' , connect as Listener )
141
139
}
142
140
143
- sdk . terminate ( )
144
-
145
- // Add shim signalling connector is disconnected
146
- await config . storage ?. setItem ( 'metaMaskSDK.disconnected' , true )
141
+ await sdk . terminate ( )
147
142
} ,
148
143
async getAccounts ( ) {
149
144
const provider = await this . getProvider ( )
@@ -197,12 +192,12 @@ export function metaMask(parameters: MetaMaskParameters = {}) {
197
192
} ,
198
193
async isAuthorized ( ) {
199
194
try {
200
- const isDisconnected =
201
- // If shim exists in storage, connector is disconnected
202
- await config . storage ?. getItem ( 'metaMaskSDK.disconnected' )
203
- if ( isDisconnected ) return false
204
-
205
- const accounts = await this . getAccounts ( )
195
+ // MetaMask mobile provider sometimes fails to immediately resolve
196
+ // JSON-RPC requests on page load
197
+ const accounts = await withRetry ( ( ) => this . getAccounts ( ) , {
198
+ delay : 200 ,
199
+ retryCount : 3 ,
200
+ } )
206
201
return ! ! accounts . length
207
202
} catch {
208
203
return false
@@ -295,7 +290,6 @@ export function metaMask(parameters: MetaMaskParameters = {}) {
295
290
else if ( config . emitter . listenerCount ( 'connect' ) ) {
296
291
const chainId = ( await this . getChainId ( ) ) . toString ( )
297
292
this . onConnect ( { chainId } )
298
- await config . storage ?. removeItem ( 'metaMaskSDK.disconnected' )
299
293
}
300
294
// Regular change event
301
295
else
@@ -347,9 +341,6 @@ export function metaMask(parameters: MetaMaskParameters = {}) {
347
341
localStorage . removeItem ( 'MMSDK_cached_chainId' )
348
342
}
349
343
350
- // No need to remove 'metaMaskSDK.disconnected' from storage because `onDisconnect` is typically
351
- // only called when the wallet is disconnected through the wallet's interface, meaning the wallet
352
- // actually disconnected and we don't need to simulate it.
353
344
config . emitter . emit ( 'disconnect' )
354
345
355
346
// Manage EIP-1193 event listeners
0 commit comments