@wagmi/connectors 6.1.4 → 7.0.0

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.
@@ -1,6 +1,5 @@
1
1
  import type {
2
2
  createCoinbaseWalletSDK,
3
- Preference,
4
3
  ProviderInterface,
5
4
  } from '@coinbase/wallet-sdk'
6
5
  import {
@@ -8,11 +7,7 @@ import {
8
7
  type Connector,
9
8
  createConnector,
10
9
  } from '@wagmi/core'
11
- import type { Compute, Mutable, Omit } from '@wagmi/core/internal'
12
- import type {
13
- CoinbaseWalletProvider as CBW_Provider,
14
- CoinbaseWalletSDK as CBW_SDK,
15
- } from 'cbw-sdk'
10
+ import type { Mutable, Omit } from '@wagmi/core/internal'
16
11
  import {
17
12
  type AddEthereumChainParameter,
18
13
  type Address,
@@ -24,59 +19,20 @@ import {
24
19
  UserRejectedRequestError,
25
20
  } from 'viem'
26
21
 
27
- type Version = '3' | '4'
28
-
29
- export type CoinbaseWalletParameters<version extends Version = '3'> =
30
- version extends '4'
31
- ? Compute<
32
- {
33
- headlessMode?: false | undefined
34
- /** Coinbase Wallet SDK version */
35
- version?: version | '3' | undefined
36
- } & Version4Parameters
37
- >
38
- : Compute<
39
- {
40
- /**
41
- * @deprecated `headlessMode` will be removed in the next major version. Upgrade to `version: '4'`.
42
- */
43
- headlessMode?: true | undefined
44
- /**
45
- * Coinbase Wallet SDK version
46
- * @deprecated Version 3 will be removed in the next major version. Upgrade to `version: '4'`.
47
- * @default '4'
48
- */
49
- version?: version | '4' | undefined
50
- } & Version3Parameters
51
- >
52
-
53
- coinbaseWallet.type = 'coinbaseWallet' as const
54
- export function coinbaseWallet<version extends Version>(
55
- parameters: CoinbaseWalletParameters<version> = {} as any,
56
- ): version extends '4'
57
- ? ReturnType<typeof version4>
58
- : ReturnType<typeof version3> {
59
- if (parameters.version === '3' || parameters.headlessMode)
60
- return version3(parameters as Version3Parameters) as any
61
- return version4(parameters as Version4Parameters) as any
62
- }
63
-
64
- type Version4Parameters = Mutable<
22
+ export type CoinbaseWalletParameters<
23
+ /** @deprecated remove */
24
+ _ = unknown,
25
+ > = Mutable<
65
26
  Omit<
66
27
  Parameters<typeof createCoinbaseWalletSDK>[0],
67
- | 'appChainIds' // set via wagmi config
68
- | 'preference'
69
- > & {
70
- // TODO(v3): Remove `Preference['options']`
71
- /**
72
- * Preference for the type of wallet to display.
73
- * @default 'all'
74
- */
75
- preference?: Preference['options'] | Compute<Preference> | undefined
76
- }
28
+ 'appChainIds' // set via wagmi config
29
+ >
77
30
  >
78
31
 
79
- function version4(parameters: Version4Parameters) {
32
+ coinbaseWallet.type = 'coinbaseWallet' as const
33
+ export function coinbaseWallet(
34
+ parameters: CoinbaseWalletParameters = {} as any,
35
+ ) {
80
36
  type Provider = ProviderInterface & {
81
37
  // for backwards compatibility
82
38
  close?(): void
@@ -195,20 +151,14 @@ function version4(parameters: Version4Parameters) {
195
151
  },
196
152
  async getProvider() {
197
153
  if (!walletProvider) {
198
- const preference = (() => {
199
- if (typeof parameters.preference === 'string')
200
- return { options: parameters.preference }
201
- return {
202
- ...parameters.preference,
203
- options: parameters.preference?.options ?? 'all',
204
- }
205
- })()
206
-
207
154
  const { createCoinbaseWalletSDK } = await import('@coinbase/wallet-sdk')
208
155
  const sdk = createCoinbaseWalletSDK({
209
156
  ...parameters,
210
157
  appChainIds: config.chains.map((x) => x.id),
211
- preference,
158
+ preference: {
159
+ options: 'all',
160
+ ...(parameters.preference ?? {}),
161
+ },
212
162
  })
213
163
 
214
164
  walletProvider = sdk.getProvider()
@@ -308,253 +258,3 @@ function version4(parameters: Version4Parameters) {
308
258
  },
309
259
  }))
310
260
  }
311
-
312
- type Version3Parameters = Mutable<
313
- Omit<
314
- ConstructorParameters<typeof CBW_SDK>[0],
315
- 'reloadOnDisconnect' // remove property since TSDoc says default is `true`
316
- >
317
- > & {
318
- /**
319
- * Fallback Ethereum JSON RPC URL
320
- * @default ""
321
- */
322
- jsonRpcUrl?: string | undefined
323
- /**
324
- * Fallback Ethereum Chain ID
325
- * @default 1
326
- */
327
- chainId?: number | undefined
328
- /**
329
- * Whether or not to reload dapp automatically after disconnect.
330
- * @default false
331
- */
332
- reloadOnDisconnect?: boolean | undefined
333
- }
334
-
335
- function version3(parameters: Version3Parameters) {
336
- const reloadOnDisconnect = false
337
-
338
- type Provider = CBW_Provider
339
-
340
- let sdk: CBW_SDK | undefined
341
- let walletProvider: Provider | undefined
342
-
343
- let accountsChanged: Connector['onAccountsChanged'] | undefined
344
- let chainChanged: Connector['onChainChanged'] | undefined
345
- let disconnect: Connector['onDisconnect'] | undefined
346
-
347
- return createConnector<Provider>((config) => ({
348
- id: 'coinbaseWalletSDK',
349
- name: 'Coinbase Wallet',
350
- rdns: 'com.coinbase.wallet',
351
- type: coinbaseWallet.type,
352
- async connect({ chainId, withCapabilities } = {}) {
353
- try {
354
- const provider = await this.getProvider()
355
- const accounts = (
356
- (await provider.request({
357
- method: 'eth_requestAccounts',
358
- })) as string[]
359
- ).map((x) => getAddress(x))
360
-
361
- if (!accountsChanged) {
362
- accountsChanged = this.onAccountsChanged.bind(this)
363
- provider.on('accountsChanged', accountsChanged)
364
- }
365
- if (!chainChanged) {
366
- chainChanged = this.onChainChanged.bind(this)
367
- provider.on('chainChanged', chainChanged)
368
- }
369
- if (!disconnect) {
370
- disconnect = this.onDisconnect.bind(this)
371
- provider.on('disconnect', disconnect)
372
- }
373
-
374
- // Switch to chain if provided
375
- let currentChainId = await this.getChainId()
376
- if (chainId && currentChainId !== chainId) {
377
- const chain = await this.switchChain!({ chainId }).catch((error) => {
378
- if (error.code === UserRejectedRequestError.code) throw error
379
- return { id: currentChainId }
380
- })
381
- currentChainId = chain?.id ?? currentChainId
382
- }
383
-
384
- return {
385
- accounts: (withCapabilities
386
- ? accounts.map((address) => ({ address, capabilities: {} }))
387
- : accounts) as never,
388
- chainId: currentChainId,
389
- }
390
- } catch (error) {
391
- if (
392
- /(user closed modal|accounts received is empty|user denied account)/i.test(
393
- (error as Error).message,
394
- )
395
- )
396
- throw new UserRejectedRequestError(error as Error)
397
- throw error
398
- }
399
- },
400
- async disconnect() {
401
- const provider = await this.getProvider()
402
-
403
- if (accountsChanged) {
404
- provider.removeListener('accountsChanged', accountsChanged)
405
- accountsChanged = undefined
406
- }
407
- if (chainChanged) {
408
- provider.removeListener('chainChanged', chainChanged)
409
- chainChanged = undefined
410
- }
411
- if (disconnect) {
412
- provider.removeListener('disconnect', disconnect)
413
- disconnect = undefined
414
- }
415
-
416
- provider.disconnect()
417
- provider.close()
418
- },
419
- async getAccounts() {
420
- const provider = await this.getProvider()
421
- return (
422
- await provider.request<string[]>({
423
- method: 'eth_accounts',
424
- })
425
- ).map((x) => getAddress(x))
426
- },
427
- async getChainId() {
428
- const provider = await this.getProvider()
429
- const chainId = await provider.request<Hex>({
430
- method: 'eth_chainId',
431
- })
432
- return Number(chainId)
433
- },
434
- async getProvider() {
435
- if (!walletProvider) {
436
- // Unwrapping import for Vite compatibility.
437
- // See: https://github.com/vitejs/vite/issues/9703
438
- const CoinbaseWalletSDK = await (async () => {
439
- const { default: SDK } = await import('cbw-sdk')
440
- if (typeof SDK !== 'function' && typeof SDK.default === 'function')
441
- return SDK.default
442
- return SDK as unknown as typeof SDK.default
443
- })()
444
-
445
- sdk = new CoinbaseWalletSDK({ ...parameters, reloadOnDisconnect })
446
-
447
- // Force types to retrieve private `walletExtension` method from the Coinbase Wallet SDK.
448
- const walletExtensionChainId = (
449
- sdk as unknown as {
450
- get walletExtension(): { getChainId(): number } | undefined
451
- }
452
- ).walletExtension?.getChainId()
453
-
454
- const chain =
455
- config.chains.find((chain) =>
456
- parameters.chainId
457
- ? chain.id === parameters.chainId
458
- : chain.id === walletExtensionChainId,
459
- ) || config.chains[0]
460
- const chainId = parameters.chainId || chain?.id
461
- const jsonRpcUrl =
462
- parameters.jsonRpcUrl || chain?.rpcUrls.default.http[0]
463
-
464
- walletProvider = sdk.makeWeb3Provider(jsonRpcUrl, chainId)
465
- }
466
-
467
- return walletProvider
468
- },
469
- async isAuthorized() {
470
- try {
471
- const accounts = await this.getAccounts()
472
- return !!accounts.length
473
- } catch {
474
- return false
475
- }
476
- },
477
- async switchChain({ addEthereumChainParameter, chainId }) {
478
- const chain = config.chains.find((chain) => chain.id === chainId)
479
- if (!chain) throw new SwitchChainError(new ChainNotConfiguredError())
480
-
481
- const provider = await this.getProvider()
482
-
483
- try {
484
- await provider.request({
485
- method: 'wallet_switchEthereumChain',
486
- params: [{ chainId: numberToHex(chain.id) }],
487
- })
488
- return chain
489
- } catch (error) {
490
- // Indicates chain is not added to provider
491
- if ((error as ProviderRpcError).code === 4902) {
492
- try {
493
- let blockExplorerUrls: string[] | undefined
494
- if (addEthereumChainParameter?.blockExplorerUrls)
495
- blockExplorerUrls = addEthereumChainParameter.blockExplorerUrls
496
- else
497
- blockExplorerUrls = chain.blockExplorers?.default.url
498
- ? [chain.blockExplorers?.default.url]
499
- : []
500
-
501
- let rpcUrls: readonly string[]
502
- if (addEthereumChainParameter?.rpcUrls?.length)
503
- rpcUrls = addEthereumChainParameter.rpcUrls
504
- else rpcUrls = [chain.rpcUrls.default?.http[0] ?? '']
505
-
506
- const addEthereumChain = {
507
- blockExplorerUrls,
508
- chainId: numberToHex(chainId),
509
- chainName: addEthereumChainParameter?.chainName ?? chain.name,
510
- iconUrls: addEthereumChainParameter?.iconUrls,
511
- nativeCurrency:
512
- addEthereumChainParameter?.nativeCurrency ??
513
- chain.nativeCurrency,
514
- rpcUrls,
515
- } satisfies AddEthereumChainParameter
516
-
517
- await provider.request({
518
- method: 'wallet_addEthereumChain',
519
- params: [addEthereumChain],
520
- })
521
-
522
- return chain
523
- } catch (error) {
524
- throw new UserRejectedRequestError(error as Error)
525
- }
526
- }
527
-
528
- throw new SwitchChainError(error as Error)
529
- }
530
- },
531
- onAccountsChanged(accounts) {
532
- if (accounts.length === 0) this.onDisconnect()
533
- else
534
- config.emitter.emit('change', {
535
- accounts: accounts.map((x) => getAddress(x)),
536
- })
537
- },
538
- onChainChanged(chain) {
539
- const chainId = Number(chain)
540
- config.emitter.emit('change', { chainId })
541
- },
542
- async onDisconnect(_error) {
543
- config.emitter.emit('disconnect')
544
-
545
- const provider = await this.getProvider()
546
- if (accountsChanged) {
547
- provider.removeListener('accountsChanged', accountsChanged)
548
- accountsChanged = undefined
549
- }
550
- if (chainChanged) {
551
- provider.removeListener('chainChanged', chainChanged)
552
- chainChanged = undefined
553
- }
554
- if (disconnect) {
555
- provider.removeListener('disconnect', disconnect)
556
- disconnect = undefined
557
- }
558
- },
559
- }))
560
- }
package/src/gemini.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  import type { AppMetadata, ProviderInterface } from '@gemini-wallet/core'
2
- import { GeminiWalletProvider } from '@gemini-wallet/core'
3
2
  import {
4
3
  ChainNotConfiguredError,
5
4
  type Connector,
@@ -110,6 +109,7 @@ export function gemini(parameters: GeminiParameters = {}) {
110
109
  },
111
110
  async getProvider() {
112
111
  if (!walletProvider) {
112
+ const { GeminiWalletProvider } = await import('@gemini-wallet/core')
113
113
  walletProvider = new GeminiWalletProvider({
114
114
  appMetadata: parameters.appMetadata ?? {},
115
115
  chain: {
package/src/metaMask.ts CHANGED
@@ -61,16 +61,7 @@ type WagmiMetaMaskSDKOptions = Compute<
61
61
  | 'useDeeplink'
62
62
  | 'readonlyRPCMap'
63
63
  >
64
- > & {
65
- /** @deprecated */
66
- forceDeleteProvider?: MetaMaskSDKOptions['forceDeleteProvider']
67
- /** @deprecated */
68
- forceInjectProvider?: MetaMaskSDKOptions['forceInjectProvider']
69
- /** @deprecated */
70
- injectProvider?: MetaMaskSDKOptions['injectProvider']
71
- /** @deprecated */
72
- useDeeplink?: MetaMaskSDKOptions['useDeeplink']
73
- }
64
+ >
74
65
  >
75
66
 
76
67
  metaMask.type = 'metaMask' as const
@@ -259,12 +250,12 @@ export function metaMask(parameters: MetaMaskParameters = {}) {
259
250
  })?.[0]
260
251
 
261
252
  sdk = new MetaMaskSDK({
253
+ // Workaround cast since MetaMask SDK does not support `'exactOptionalPropertyTypes'`
254
+ ...(parameters as RemoveUndefined<typeof parameters>),
262
255
  _source: 'wagmi',
263
256
  forceDeleteProvider: false,
264
257
  forceInjectProvider: false,
265
258
  injectProvider: false,
266
- // Workaround cast since MetaMask SDK does not support `'exactOptionalPropertyTypes'`
267
- ...(parameters as RemoveUndefined<typeof parameters>),
268
259
  readonlyRPCMap,
269
260
  dappMetadata: {
270
261
  ...parameters.dappMetadata,
@@ -278,7 +269,7 @@ export function metaMask(parameters: MetaMaskParameters = {}) {
278
269
  ? window.location.origin
279
270
  : 'https://wagmi.sh',
280
271
  },
281
- useDeeplink: parameters.useDeeplink ?? true,
272
+ useDeeplink: true,
282
273
  })
283
274
  const result = await sdk.init()
284
275
  // On initial load, sometimes `sdk.getProvider` does not return provider.
package/src/porto.ts CHANGED
@@ -4,8 +4,7 @@ import {
4
4
  createConnector,
5
5
  } from '@wagmi/core'
6
6
  import type { ExactPartial } from '@wagmi/core/internal'
7
- import { type Porto, RpcSchema } from 'porto'
8
- import { z } from 'porto/internal'
7
+ import type { Porto, RpcSchema } from 'porto'
9
8
  import {
10
9
  type Address,
11
10
  getAddress,
@@ -89,6 +88,8 @@ export function porto(parameters: PortoParameters = {}) {
89
88
 
90
89
  try {
91
90
  if (!accounts?.length && !isReconnecting) {
91
+ const { RpcSchema } = await import('porto')
92
+ const { z } = await import('porto/internal')
92
93
  const res = await provider.request({
93
94
  method: 'wallet_connect',
94
95
  params: [
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = '6.1.4'
1
+ export const version = '7.0.0'
@@ -73,53 +73,6 @@ export type WalletConnectParameters = Compute<
73
73
  >
74
74
 
75
75
  walletConnect.type = 'walletConnect' as const
76
- /**
77
- * @deprecated **NOTE: This connector uses a vulnerable dependency downstream** (`@walletconnect/ethereum-provider@2.21.1` > `@reown/appkit@1.8.9` > `@reown/appkit-utils@1.8.9` > `@walletconnect/logger@2.1.2` > `pino@7.11.0`). You should override `pino` to a secure version via your package manager:
78
- *
79
- * ### npm
80
- * ```json
81
- * {
82
- * "overrides": {
83
- * "@walletconnect/logger": {
84
- * "pino": "10.0.0"
85
- * }
86
- * }
87
- * }
88
- * ```
89
- *
90
- * ### pnpm
91
- * ```json
92
- * {
93
- * "pnpm": {
94
- * "overrides": {
95
- * "@walletconnect/logger>pino": "10.0.0"
96
- * }
97
- * }
98
- * }
99
- * ```
100
- *
101
- * ### yarn
102
- * ```json
103
- * {
104
- * "resolutions": {
105
- * "@walletconnect/logger/pino": "10.0.0"
106
- * }
107
- * }
108
- * ```
109
- *
110
- * ### bun
111
- * ```json
112
- * {
113
- * "overrides": {
114
- * "@walletconnect/logger": {
115
- * "pino": "10.0.0"
116
- * }
117
- * }
118
- * }
119
- * ```
120
- *
121
- * Normally the Wagmi team would upgrade `@walletconnect/ethereum-provider` to a fixed version for you, but `@walletconnect/ethereum-provider` was relicensed recently from Apache to a [non-permissive license](https://github.com/reown-com/appkit/blob/main/LICENSE.md). We are trying to get the WalletConnect team to release a version that closes the vulnerability under the old Apache license.
122
- */
123
76
  export function walletConnect(parameters: WalletConnectParameters) {
124
77
  const isNewChainsStale = parameters.isNewChainsStale ?? true
125
78