@wagmi/connectors 4.1.25 → 4.1.27

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,2 +1,2 @@
1
- export const version = '4.1.25';
1
+ export const version = '4.1.27';
2
2
  //# sourceMappingURL=version.js.map
@@ -1,14 +1,7 @@
1
1
  import { type MetaMaskSDKOptions, type SDKProvider } from '@metamask/sdk';
2
- import type { Evaluate, ExactPartial, Omit } from '@wagmi/core/internal';
2
+ import type { Evaluate, ExactPartial } from '@wagmi/core/internal';
3
3
  import { type ProviderConnectInfo } from 'viem';
4
- export type MetaMaskParameters = Evaluate<ExactPartial<Omit<MetaMaskSDKOptions, 'checkInstallationImmediately' | 'checkInstallationOnAllCalls' | 'defaultReadOnlyChainId' | 'readonlyRPCMap'>>>;
5
- /**
6
- * @deprecated
7
- *
8
- * __Warning__ This connector has a large file size due to the underlying `@metamask/sdk`. For mobile
9
- * support, it is recommended to use {@link walletConnect}. For desktop support, you should rely on Multi Injected
10
- * Provider Discovery (EIP-6963) via the Wagmi {@link Config}.
11
- */
4
+ export type MetaMaskParameters = Evaluate<ExactPartial<Omit<MetaMaskSDKOptions, '_source' | 'readonlyRPCMap'>>>;
12
5
  export declare function metaMask(parameters?: MetaMaskParameters): import("@wagmi/core").CreateConnectorFn<SDKProvider, {
13
6
  onConnect(connectInfo: ProviderConnectInfo): void;
14
7
  }, {
@@ -1 +1 @@
1
- {"version":3,"file":"metaMask.d.ts","sourceRoot":"","sources":["../../src/metaMask.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,WAAW,EACjB,MAAM,eAAe,CAAA;AAEtB,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AACxE,OAAO,EAEL,KAAK,mBAAmB,EASzB,MAAM,MAAM,CAAA;AAEb,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CACvC,YAAY,CACV,IAAI,CACF,kBAAkB,EAChB,8BAA8B,GAC9B,6BAA6B,GAC7B,wBAAwB,GACxB,gBAAgB,CACnB,CACF,CACF,CAAA;AAGD;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,UAAU,GAAE,kBAAuB;2BAGjC,mBAAmB,GAAG,IAAI;;gCAEF,IAAI;GAwStD;yBA7Se,QAAQ"}
1
+ {"version":3,"file":"metaMask.d.ts","sourceRoot":"","sources":["../../src/metaMask.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,WAAW,EACjB,MAAM,eAAe,CAAA;AAEtB,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAClE,OAAO,EAEL,KAAK,mBAAmB,EAQzB,MAAM,MAAM,CAAA;AAEb,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CACvC,YAAY,CAAC,IAAI,CAAC,kBAAkB,EAAE,SAAS,GAAG,gBAAgB,CAAC,CAAC,CACrE,CAAA;AAQD,wBAAgB,QAAQ,CAAC,UAAU,GAAE,kBAAuB;2BAGjC,mBAAmB,GAAG,IAAI;;gCAEF,IAAI;GAwQtD;yBA7Qe,QAAQ"}
@@ -1,2 +1,2 @@
1
- export declare const version = "4.1.25";
1
+ export declare const version = "4.1.27";
2
2
  //# sourceMappingURL=version.d.ts.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@wagmi/connectors",
3
3
  "description": "Collection of connectors for Wagmi",
4
- "version": "4.1.25",
4
+ "version": "4.1.27",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
@@ -30,7 +30,7 @@
30
30
  "peerDependencies": {
31
31
  "typescript": ">=5.0.4",
32
32
  "viem": "2.x",
33
- "@wagmi/core": "2.6.16"
33
+ "@wagmi/core": "2.6.18"
34
34
  },
35
35
  "peerDependenciesMeta": {
36
36
  "typescript": {
@@ -39,7 +39,7 @@
39
39
  },
40
40
  "dependencies": {
41
41
  "@coinbase/wallet-sdk": "3.9.1",
42
- "@metamask/sdk": "0.14.3",
42
+ "@metamask/sdk": "0.18.6",
43
43
  "@safe-global/safe-apps-provider": "0.18.1",
44
44
  "@safe-global/safe-apps-sdk": "8.1.0",
45
45
  "@walletconnect/ethereum-provider": "2.11.2",
package/src/metaMask.ts CHANGED
@@ -1,11 +1,10 @@
1
1
  import {
2
- EventType,
3
2
  type MetaMaskSDK,
4
3
  type MetaMaskSDKOptions,
5
4
  type SDKProvider,
6
5
  } from '@metamask/sdk'
7
6
  import { ChainNotConfiguredError, createConnector } from '@wagmi/core'
8
- import type { Evaluate, ExactPartial, Omit } from '@wagmi/core/internal'
7
+ import type { Evaluate, ExactPartial } from '@wagmi/core/internal'
9
8
  import {
10
9
  type Address,
11
10
  type ProviderConnectInfo,
@@ -14,31 +13,20 @@ import {
14
13
  RpcError,
15
14
  SwitchChainError,
16
15
  UserRejectedRequestError,
17
- type WalletPermission,
18
16
  getAddress,
19
17
  numberToHex,
20
18
  } from 'viem'
21
19
 
22
20
  export type MetaMaskParameters = Evaluate<
23
- ExactPartial<
24
- Omit<
25
- MetaMaskSDKOptions,
26
- | 'checkInstallationImmediately'
27
- | 'checkInstallationOnAllCalls'
28
- | 'defaultReadOnlyChainId'
29
- | 'readonlyRPCMap'
30
- >
31
- >
21
+ ExactPartial<Omit<MetaMaskSDKOptions, '_source' | 'readonlyRPCMap'>>
32
22
  >
33
23
 
24
+ const isMobileBrowser =
25
+ /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
26
+ navigator.userAgent,
27
+ )
28
+
34
29
  metaMask.type = 'metaMask' as const
35
- /**
36
- * @deprecated
37
- *
38
- * __Warning__ This connector has a large file size due to the underlying `@metamask/sdk`. For mobile
39
- * support, it is recommended to use {@link walletConnect}. For desktop support, you should rely on Multi Injected
40
- * Provider Discovery (EIP-6963) via the Wagmi {@link Config}.
41
- */
42
30
  export function metaMask(parameters: MetaMaskParameters = {}) {
43
31
  type Provider = SDKProvider
44
32
  type Properties = {
@@ -48,7 +36,8 @@ export function metaMask(parameters: MetaMaskParameters = {}) {
48
36
  type Listener = Parameters<Provider['on']>[1]
49
37
 
50
38
  let sdk: MetaMaskSDK
51
- let walletProvider: Provider | undefined
39
+ let provider: Provider | undefined
40
+ let providerPromise: Promise<typeof provider>
52
41
 
53
42
  return createConnector<Provider, Properties, StorageItem>((config) => ({
54
43
  id: 'metaMaskSDK',
@@ -62,30 +51,8 @@ export function metaMask(parameters: MetaMaskParameters = {}) {
62
51
  async connect({ chainId, isReconnecting } = {}) {
63
52
  const provider = await this.getProvider()
64
53
 
65
- let accounts: readonly Address[] | null = null
66
- if (!isReconnecting) {
67
- accounts = await this.getAccounts().catch(() => null)
68
- const isAuthorized = !!accounts?.length
69
- if (isAuthorized)
70
- // Attempt to show another prompt for selecting account if already connected
71
- try {
72
- const permissions = (await provider.request({
73
- method: 'wallet_requestPermissions',
74
- params: [{ eth_accounts: {} }],
75
- })) as WalletPermission[]
76
- accounts = (permissions[0]?.caveats?.[0]?.value as string[])?.map(
77
- (x) => getAddress(x),
78
- )
79
- } catch (err) {
80
- const error = err as RpcError
81
- // Not all injected providers support `wallet_requestPermissions` (e.g. MetaMask iOS).
82
- // Only bubble up error if user rejects request
83
- if (error.code === UserRejectedRequestError.code)
84
- throw new UserRejectedRequestError(error)
85
- // Or prompt is already open
86
- if (error.code === ResourceUnavailableRpcError.code) throw error
87
- }
88
- }
54
+ let accounts: readonly Address[] = []
55
+ if (isReconnecting) accounts = await this.getAccounts().catch(() => [])
89
56
 
90
57
  try {
91
58
  if (!accounts?.length) {
@@ -104,20 +71,8 @@ export function metaMask(parameters: MetaMaskParameters = {}) {
104
71
  provider.on('chainChanged', this.onChainChanged as Listener)
105
72
  provider.on('disconnect', this.onDisconnect.bind(this) as Listener)
106
73
 
107
- // Backward compatibility with older wallet (<7.3) version that return accounts before authorization
108
- if (!sdk.isExtensionActive() && !sdk._getConnection()?.isAuthorized()) {
109
- function waitForAuthorized() {
110
- return new Promise((resolve) => {
111
- const connection = sdk._getConnection()
112
- const connector = connection?.getConnector()
113
- connector?.once(EventType.AUTHORIZED, () => resolve(true))
114
- })
115
- }
116
- await waitForAuthorized()
117
- }
118
-
119
74
  // Switch to chain if provided
120
- let currentChainId = await this.getChainId()
75
+ let currentChainId = (await this.getChainId()) as number
121
76
  if (chainId && currentChainId !== chainId) {
122
77
  const chain = await this.switchChain!({ chainId }).catch((error) => {
123
78
  if (error.code === UserRejectedRequestError.code) throw error
@@ -164,44 +119,39 @@ export function metaMask(parameters: MetaMaskParameters = {}) {
164
119
  async getChainId() {
165
120
  const provider = await this.getProvider()
166
121
  const chainId =
167
- provider.chainId ?? (await provider?.request({ method: 'eth_chainId' }))
122
+ provider.getChainId() ||
123
+ (await provider?.request({ method: 'eth_chainId' }))
168
124
  return Number(chainId)
169
125
  },
170
126
  async getProvider() {
171
- if (!walletProvider) {
172
- if (!sdk || !sdk?.isInitialized()) {
173
- const { MetaMaskSDK } = await import('@metamask/sdk')
174
- sdk = new MetaMaskSDK({
175
- dappMetadata: { name: 'wagmi' },
176
- enableAnalytics: false,
177
- extensionOnly: true,
178
- modals: {
179
- // Disable by default since it pops up when mobile tries to reconnect
180
- otp() {
181
- const noop = () => {}
182
- return { mount: noop, unmount: noop }
183
- },
184
- },
185
- useDeeplink: true,
186
- _source: 'wagmi',
187
- ...parameters,
188
- checkInstallationImmediately: false,
189
- checkInstallationOnAllCalls: false,
190
- })
191
- await sdk.init()
192
- }
193
- try {
194
- walletProvider = sdk.getProvider()
195
- } catch (error) {
196
- // TODO: SDK sometimes throws errors when MM extension or mobile provider is not detected (don't throw for those errors)
197
- const regex = /^SDK state invalid -- undefined( mobile)? provider$/
198
- if (!regex.test((error as Error).message)) throw error
199
- }
127
+ async function initProvider() {
128
+ const { MetaMaskSDK } = await import('@metamask/sdk')
129
+ sdk = new MetaMaskSDK({
130
+ dappMetadata: {},
131
+ ...parameters,
132
+ _source: 'wagmi',
133
+ readonlyRPCMap: Object.fromEntries(
134
+ config.chains.map((chain) => [
135
+ chain.id,
136
+ chain.rpcUrls.default.http[0]!,
137
+ ]),
138
+ ),
139
+ })
140
+ await sdk.init()
141
+ return sdk.getProvider()!
200
142
  }
201
- return walletProvider!
143
+
144
+ if (!provider) {
145
+ if (!providerPromise) providerPromise = initProvider()
146
+ provider = await providerPromise
147
+ }
148
+ return provider!
202
149
  },
203
150
  async isAuthorized() {
204
151
  try {
152
+ // MetaMask Mobile doesn't support persisted sessions.
153
+ if (isMobileBrowser) return false
154
+
205
155
  const isDisconnected =
206
156
  // If shim exists in storage, connector is disconnected
207
157
  await config.storage?.getItem('metaMaskSDK.disconnected')
@@ -326,6 +276,12 @@ export function metaMask(parameters: MetaMaskParameters = {}) {
326
276
  if (provider && !!(await this.getAccounts()).length) return
327
277
  }
328
278
 
279
+ // Remove cached SDK properties.
280
+ if (typeof localStorage !== 'undefined') {
281
+ localStorage.removeItem('MMSDK_cached_address')
282
+ localStorage.removeItem('MMSDK_cached_chainId')
283
+ }
284
+
329
285
  // No need to remove 'metaMaskSDK.disconnected' from storage because `onDisconnect` is typically
330
286
  // only called when the wallet is disconnected through the wallet's interface, meaning the wallet
331
287
  // actually disconnected and we don't need to simulate it.
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = '4.1.25'
1
+ export const version = '4.1.27'