@wagmi/connectors 4.0.0-alpha.2 → 4.0.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/coinbaseWallet.js +1 -1
- package/dist/esm/coinbaseWallet.js.map +1 -1
- package/dist/esm/injected.js +62 -60
- package/dist/esm/injected.js.map +1 -1
- package/dist/esm/ledger.js +1 -1
- package/dist/esm/ledger.js.map +1 -1
- package/dist/esm/tsconfig.build.tsbuildinfo +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/esm/walletConnect.js +7 -7
- package/dist/esm/walletConnect.js.map +1 -1
- package/dist/types/injected.d.ts +14 -48
- package/dist/types/injected.d.ts.map +1 -1
- package/dist/types/version.d.ts +1 -1
- package/package.json +3 -3
- package/src/coinbaseWallet.ts +1 -1
- package/src/injected.ts +143 -147
- package/src/ledger.ts +1 -1
- package/src/version.ts +1 -1
- package/src/walletConnect.ts +7 -7
package/src/injected.ts
CHANGED
|
@@ -31,6 +31,7 @@ export type InjectedParameters = {
|
|
|
31
31
|
*/
|
|
32
32
|
target?:
|
|
33
33
|
| TargetId
|
|
34
|
+
| (TargetMap[TargetId] & { id: string })
|
|
34
35
|
| (() => (TargetMap[TargetId] & { id: string }) | undefined)
|
|
35
36
|
| undefined
|
|
36
37
|
}
|
|
@@ -46,18 +47,14 @@ const targetMap = {
|
|
|
46
47
|
metaMask: {
|
|
47
48
|
name: 'MetaMask',
|
|
48
49
|
provider(window) {
|
|
49
|
-
return findProvider(window, (
|
|
50
|
-
if (!
|
|
50
|
+
return findProvider(window, (provider) => {
|
|
51
|
+
if (!provider.isMetaMask) return false
|
|
51
52
|
// Brave tries to make itself look like MetaMask
|
|
52
53
|
// Could also try RPC `web3_clientVersion` if following is unreliable
|
|
53
|
-
if (
|
|
54
|
-
windowProvider.isBraveWallet &&
|
|
55
|
-
!windowProvider._events &&
|
|
56
|
-
!windowProvider._state
|
|
57
|
-
)
|
|
54
|
+
if (provider.isBraveWallet && !provider._events && !provider._state)
|
|
58
55
|
return false
|
|
59
56
|
// Other wallets that try to look like MetaMask
|
|
60
|
-
const flags:
|
|
57
|
+
const flags: WalletProviderFlags[] = [
|
|
61
58
|
'isApexWallet',
|
|
62
59
|
'isAvalanche',
|
|
63
60
|
'isBitKeep',
|
|
@@ -75,11 +72,10 @@ const targetMap = {
|
|
|
75
72
|
'isTokenary',
|
|
76
73
|
'isZerion',
|
|
77
74
|
]
|
|
78
|
-
for (const flag of flags) if (
|
|
75
|
+
for (const flag of flags) if (provider[flag]) return false
|
|
79
76
|
return true
|
|
80
77
|
})
|
|
81
78
|
},
|
|
82
|
-
features: ['wallet_requestPermissions'],
|
|
83
79
|
},
|
|
84
80
|
phantom: {
|
|
85
81
|
name: 'Phantom',
|
|
@@ -91,15 +87,17 @@ const targetMap = {
|
|
|
91
87
|
} as const satisfies TargetMap
|
|
92
88
|
|
|
93
89
|
export function injected(parameters: InjectedParameters = {}) {
|
|
94
|
-
const shimDisconnect =
|
|
95
|
-
const unstable_shimAsyncInject = parameters.unstable_shimAsyncInject
|
|
90
|
+
const { shimDisconnect = true, unstable_shimAsyncInject } = parameters
|
|
96
91
|
|
|
97
|
-
function
|
|
92
|
+
function getTarget(): Evaluate<TargetMap[TargetId] & { id: string }> {
|
|
98
93
|
const target = parameters.target
|
|
99
94
|
if (typeof target === 'function') {
|
|
100
95
|
const result = target()
|
|
101
96
|
if (result) return result
|
|
102
97
|
}
|
|
98
|
+
|
|
99
|
+
if (typeof target === 'object') return target
|
|
100
|
+
|
|
103
101
|
if (typeof target === 'string')
|
|
104
102
|
return {
|
|
105
103
|
...(targetMap[target as keyof typeof targetMap] ?? {
|
|
@@ -108,6 +106,7 @@ export function injected(parameters: InjectedParameters = {}) {
|
|
|
108
106
|
}),
|
|
109
107
|
id: target,
|
|
110
108
|
}
|
|
109
|
+
|
|
111
110
|
return {
|
|
112
111
|
id: 'injected',
|
|
113
112
|
name: 'Injected',
|
|
@@ -117,7 +116,7 @@ export function injected(parameters: InjectedParameters = {}) {
|
|
|
117
116
|
}
|
|
118
117
|
}
|
|
119
118
|
|
|
120
|
-
type Provider =
|
|
119
|
+
type Provider = WalletProvider | undefined
|
|
121
120
|
type Properties = {
|
|
122
121
|
onConnect(connectInfo: ProviderConnectInfo): void
|
|
123
122
|
}
|
|
@@ -125,10 +124,10 @@ export function injected(parameters: InjectedParameters = {}) {
|
|
|
125
124
|
|
|
126
125
|
return createConnector<Provider, Properties, StorageItem>((config) => ({
|
|
127
126
|
get id() {
|
|
128
|
-
return
|
|
127
|
+
return getTarget().id
|
|
129
128
|
},
|
|
130
129
|
get name() {
|
|
131
|
-
return
|
|
130
|
+
return getTarget().name
|
|
132
131
|
},
|
|
133
132
|
async setup() {
|
|
134
133
|
const provider = await this.getProvider()
|
|
@@ -142,47 +141,41 @@ export function injected(parameters: InjectedParameters = {}) {
|
|
|
142
141
|
const provider = await this.getProvider()
|
|
143
142
|
if (!provider) throw new ProviderNotFoundError()
|
|
144
143
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
if (
|
|
174
|
-
(error as RpcError).code ===
|
|
175
|
-
new ResourceUnavailableRpcError(error as Error).code
|
|
176
|
-
)
|
|
177
|
-
throw error
|
|
178
|
-
}
|
|
179
|
-
}
|
|
144
|
+
// Attempt to show select prompt with `wallet_requestPermissions` when
|
|
145
|
+
// `shimDisconnect` is active and account is in disconnected state (flag in storage)
|
|
146
|
+
const isDisconnected =
|
|
147
|
+
shimDisconnect &&
|
|
148
|
+
!(await config.storage?.getItem(`${this.id}.connected`))
|
|
149
|
+
|
|
150
|
+
let accounts: readonly Address[] | null = null
|
|
151
|
+
if (isDisconnected) {
|
|
152
|
+
accounts = await this.getAccounts().catch(() => null)
|
|
153
|
+
const isAuthorized = !!accounts?.length
|
|
154
|
+
if (isAuthorized)
|
|
155
|
+
// Attempt to show another prompt for selecting connector if already connected
|
|
156
|
+
try {
|
|
157
|
+
const permissions = await provider.request({
|
|
158
|
+
method: 'wallet_requestPermissions',
|
|
159
|
+
params: [{ eth_accounts: {} }],
|
|
160
|
+
})
|
|
161
|
+
accounts = permissions[0]?.caveats?.[0]?.value?.map(getAddress)
|
|
162
|
+
} catch (err) {
|
|
163
|
+
const error = err as RpcError
|
|
164
|
+
// Not all injected providers support `wallet_requestPermissions` (e.g. MetaMask iOS).
|
|
165
|
+
// Only bubble up error if user rejects request
|
|
166
|
+
if (error.code === UserRejectedRequestError.code)
|
|
167
|
+
throw new UserRejectedRequestError(error)
|
|
168
|
+
// Or prompt is already open
|
|
169
|
+
if (error.code === ResourceUnavailableRpcError.code) throw error
|
|
170
|
+
}
|
|
171
|
+
}
|
|
180
172
|
|
|
173
|
+
try {
|
|
181
174
|
if (!accounts?.length) {
|
|
182
|
-
const
|
|
175
|
+
const requestedAccounts = await provider.request({
|
|
183
176
|
method: 'eth_requestAccounts',
|
|
184
177
|
})
|
|
185
|
-
accounts =
|
|
178
|
+
accounts = requestedAccounts.map(getAddress)
|
|
186
179
|
}
|
|
187
180
|
|
|
188
181
|
provider.removeListener('connect', this.onConnect.bind(this))
|
|
@@ -204,11 +197,12 @@ export function injected(parameters: InjectedParameters = {}) {
|
|
|
204
197
|
await config.storage?.setItem(`${this.id}.connected`, true)
|
|
205
198
|
|
|
206
199
|
return { accounts, chainId: currentChainId }
|
|
207
|
-
} catch (
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
200
|
+
} catch (err) {
|
|
201
|
+
const error = err as RpcError
|
|
202
|
+
if (error.code === UserRejectedRequestError.code)
|
|
203
|
+
throw new UserRejectedRequestError(error)
|
|
204
|
+
if (error.code === ResourceUnavailableRpcError.code)
|
|
205
|
+
throw new ResourceUnavailableRpcError(error)
|
|
212
206
|
throw error
|
|
213
207
|
}
|
|
214
208
|
},
|
|
@@ -242,10 +236,10 @@ export function injected(parameters: InjectedParameters = {}) {
|
|
|
242
236
|
},
|
|
243
237
|
async getProvider() {
|
|
244
238
|
if (typeof window === 'undefined') return undefined
|
|
245
|
-
const
|
|
246
|
-
if (typeof
|
|
247
|
-
return
|
|
248
|
-
return findProvider(window
|
|
239
|
+
const target = getTarget()
|
|
240
|
+
if (typeof target.provider === 'function')
|
|
241
|
+
return target.provider(window as Window | undefined)
|
|
242
|
+
return findProvider(window, target.provider)
|
|
249
243
|
},
|
|
250
244
|
async isAuthorized() {
|
|
251
245
|
try {
|
|
@@ -298,6 +292,7 @@ export function injected(parameters: InjectedParameters = {}) {
|
|
|
298
292
|
|
|
299
293
|
throw new ProviderNotFoundError()
|
|
300
294
|
}
|
|
295
|
+
|
|
301
296
|
const accounts = await this.getAccounts()
|
|
302
297
|
return !!accounts.length
|
|
303
298
|
} catch {
|
|
@@ -326,10 +321,12 @@ export function injected(parameters: InjectedParameters = {}) {
|
|
|
326
321
|
),
|
|
327
322
|
])
|
|
328
323
|
return chain
|
|
329
|
-
} catch (
|
|
324
|
+
} catch (err) {
|
|
325
|
+
const error = err as RpcError
|
|
326
|
+
|
|
330
327
|
// Indicates chain is not added to provider
|
|
331
328
|
if (
|
|
332
|
-
|
|
329
|
+
error.code === 4902 ||
|
|
333
330
|
// Unwrapping for MetaMask Mobile
|
|
334
331
|
// https://github.com/MetaMask/metamask-mobile/issues/2944#issuecomment-976988719
|
|
335
332
|
(error as ProviderRpcError<{ originalError?: { code: number } }>)
|
|
@@ -370,9 +367,9 @@ export function injected(parameters: InjectedParameters = {}) {
|
|
|
370
367
|
}
|
|
371
368
|
}
|
|
372
369
|
|
|
373
|
-
if (
|
|
374
|
-
throw new UserRejectedRequestError(error
|
|
375
|
-
throw new SwitchChainError(error
|
|
370
|
+
if (error.code === UserRejectedRequestError.code)
|
|
371
|
+
throw new UserRejectedRequestError(error)
|
|
372
|
+
throw new SwitchChainError(error)
|
|
376
373
|
}
|
|
377
374
|
},
|
|
378
375
|
async onAccountsChanged(accounts) {
|
|
@@ -436,100 +433,99 @@ export function injected(parameters: InjectedParameters = {}) {
|
|
|
436
433
|
}))
|
|
437
434
|
}
|
|
438
435
|
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
436
|
+
type Target = {
|
|
437
|
+
name: string
|
|
438
|
+
provider:
|
|
439
|
+
| WalletProviderFlags
|
|
440
|
+
| ((window?: Window | undefined) => WalletProvider | undefined)
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
export type TargetId = Evaluate<WalletProviderFlags> extends `is${infer name}`
|
|
442
444
|
? name extends `${infer char}${infer rest}`
|
|
443
445
|
? `${Lowercase<char>}${rest}`
|
|
444
446
|
: never
|
|
445
447
|
: never
|
|
446
448
|
|
|
447
|
-
type Target = {
|
|
448
|
-
name: string
|
|
449
|
-
provider:
|
|
450
|
-
| keyof WindowProviderFlags
|
|
451
|
-
| ((window?: Window | undefined) => WindowProvider | undefined)
|
|
452
|
-
features?: readonly 'wallet_requestPermissions'[] | undefined
|
|
453
|
-
}
|
|
454
449
|
type TargetMap = { [_ in TargetId]?: Target | undefined }
|
|
455
450
|
|
|
456
|
-
type
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
451
|
+
type WalletProviderFlags =
|
|
452
|
+
| 'isApexWallet'
|
|
453
|
+
| 'isAvalanche'
|
|
454
|
+
| 'isBackpack'
|
|
455
|
+
| 'isBifrost'
|
|
456
|
+
| 'isBitKeep'
|
|
457
|
+
| 'isBitski'
|
|
458
|
+
| 'isBlockWallet'
|
|
459
|
+
| 'isBraveWallet'
|
|
460
|
+
| 'isCoinbaseWallet'
|
|
461
|
+
| 'isDawn'
|
|
462
|
+
| 'isEnkrypt'
|
|
463
|
+
| 'isExodus'
|
|
464
|
+
| 'isFrame'
|
|
465
|
+
| 'isFrontier'
|
|
466
|
+
| 'isGamestop'
|
|
467
|
+
| 'isHyperPay'
|
|
468
|
+
| 'isImToken'
|
|
469
|
+
| 'isKuCoinWallet'
|
|
470
|
+
| 'isMathWallet'
|
|
471
|
+
| 'isMetaMask'
|
|
472
|
+
| 'isOkxWallet'
|
|
473
|
+
| 'isOKExWallet'
|
|
474
|
+
| 'isOneInchAndroidWallet'
|
|
475
|
+
| 'isOneInchIOSWallet'
|
|
476
|
+
| 'isOpera'
|
|
477
|
+
| 'isPhantom'
|
|
478
|
+
| 'isPortal'
|
|
479
|
+
| 'isRabby'
|
|
480
|
+
| 'isRainbow'
|
|
481
|
+
| 'isStatus'
|
|
482
|
+
| 'isTally'
|
|
483
|
+
| 'isTokenPocket'
|
|
484
|
+
| 'isTokenary'
|
|
485
|
+
| 'isTrust'
|
|
486
|
+
| 'isTrustWallet'
|
|
487
|
+
| 'isXDEFI'
|
|
488
|
+
| 'isZerion'
|
|
489
|
+
|
|
490
|
+
type WalletProvider = Evaluate<
|
|
491
|
+
EIP1193Provider & {
|
|
492
|
+
[key in WalletProviderFlags]?: true | undefined
|
|
493
|
+
} & {
|
|
494
|
+
providers?: WalletProvider[] | undefined
|
|
495
|
+
/** Only exists in MetaMask as of 2022/04/03 */
|
|
496
|
+
_events?: { connect?: (() => void) | undefined } | undefined
|
|
497
|
+
/** Only exists in MetaMask as of 2022/04/03 */
|
|
498
|
+
_state?:
|
|
499
|
+
| {
|
|
500
|
+
accounts?: string[]
|
|
501
|
+
initialized?: boolean
|
|
502
|
+
isConnected?: boolean
|
|
503
|
+
isPermanentlyDisconnected?: boolean
|
|
504
|
+
isUnlocked?: boolean
|
|
505
|
+
}
|
|
506
|
+
| undefined
|
|
507
|
+
}
|
|
513
508
|
>
|
|
514
509
|
|
|
515
510
|
type Window = {
|
|
516
|
-
coinbaseWalletExtension?:
|
|
517
|
-
ethereum?:
|
|
518
|
-
phantom?: { ethereum:
|
|
511
|
+
coinbaseWalletExtension?: WalletProvider | undefined
|
|
512
|
+
ethereum?: WalletProvider | undefined
|
|
513
|
+
phantom?: { ethereum: WalletProvider } | undefined
|
|
519
514
|
}
|
|
520
515
|
|
|
521
516
|
function findProvider(
|
|
522
|
-
window: Window | undefined,
|
|
523
|
-
|
|
524
|
-
| keyof WindowProviderFlags
|
|
525
|
-
| ((provider: WindowProvider) => boolean),
|
|
517
|
+
window: globalThis.Window | Window | undefined,
|
|
518
|
+
select?: WalletProviderFlags | ((provider: WalletProvider) => boolean),
|
|
526
519
|
) {
|
|
527
|
-
function isProvider(provider:
|
|
528
|
-
if (typeof
|
|
529
|
-
return provider[
|
|
520
|
+
function isProvider(provider: WalletProvider) {
|
|
521
|
+
if (typeof select === 'function') return select(provider)
|
|
522
|
+
if (typeof select === 'string') return provider[select]
|
|
523
|
+
return true
|
|
530
524
|
}
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
if (
|
|
525
|
+
|
|
526
|
+
const ethereum = (window as Window).ethereum
|
|
527
|
+
if (ethereum?.providers)
|
|
528
|
+
return ethereum.providers.find((provider) => isProvider(provider))
|
|
529
|
+
if (ethereum && isProvider(ethereum)) return ethereum
|
|
534
530
|
return undefined
|
|
535
531
|
}
|
package/src/ledger.ts
CHANGED
|
@@ -41,7 +41,7 @@ export function ledger(parameters: LedgerParameters = {}) {
|
|
|
41
41
|
id: 'ledger',
|
|
42
42
|
name: 'Ledger',
|
|
43
43
|
async setup() {
|
|
44
|
-
const provider = await this.getProvider()
|
|
44
|
+
const provider = await this.getProvider().catch(() => null)
|
|
45
45
|
if (!provider) return
|
|
46
46
|
provider.on('connect', this.onConnect.bind(this))
|
|
47
47
|
provider.on('session_delete', this.onSessionDelete.bind(this))
|
package/src/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = '4.0.0-alpha.
|
|
1
|
+
export const version = '4.0.0-alpha.3'
|
package/src/walletConnect.ts
CHANGED
|
@@ -105,7 +105,7 @@ export function walletConnect(parameters: WalletConnectParameters) {
|
|
|
105
105
|
id: 'walletConnect',
|
|
106
106
|
name: 'WalletConnect',
|
|
107
107
|
async setup() {
|
|
108
|
-
const provider = await this.getProvider()
|
|
108
|
+
const provider = await this.getProvider().catch(() => null)
|
|
109
109
|
if (!provider) return
|
|
110
110
|
provider.on('connect', this.onConnect.bind(this))
|
|
111
111
|
provider.on('session_delete', this.onSessionDelete.bind(this))
|
|
@@ -173,21 +173,21 @@ export function walletConnect(parameters: WalletConnectParameters) {
|
|
|
173
173
|
async disconnect() {
|
|
174
174
|
const provider = await this.getProvider()
|
|
175
175
|
try {
|
|
176
|
-
await provider
|
|
176
|
+
await provider?.disconnect()
|
|
177
177
|
} catch (error) {
|
|
178
178
|
if (!/No matching key/i.test((error as Error).message)) throw error
|
|
179
179
|
} finally {
|
|
180
|
-
provider
|
|
180
|
+
provider?.removeListener(
|
|
181
181
|
'accountsChanged',
|
|
182
182
|
this.onAccountsChanged.bind(this),
|
|
183
183
|
)
|
|
184
|
-
provider
|
|
185
|
-
provider
|
|
186
|
-
provider
|
|
184
|
+
provider?.removeListener('chainChanged', this.onChainChanged)
|
|
185
|
+
provider?.removeListener('disconnect', this.onDisconnect.bind(this))
|
|
186
|
+
provider?.removeListener(
|
|
187
187
|
'session_delete',
|
|
188
188
|
this.onSessionDelete.bind(this),
|
|
189
189
|
)
|
|
190
|
-
provider
|
|
190
|
+
provider?.on('connect', this.onConnect.bind(this))
|
|
191
191
|
|
|
192
192
|
this.setRequestedChainsIds([])
|
|
193
193
|
}
|