@wagmi/connectors 4.1.26 → 4.1.28

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.26';
1
+ export const version = '4.1.28';
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;AAGD,wBAAgB,QAAQ,CAAC,UAAU,GAAE,kBAAuB;2BAGjC,mBAAmB,GAAG,IAAI;;gCAEF,IAAI;GA+QtD;yBApRe,QAAQ"}
@@ -1,2 +1,2 @@
1
- export declare const version = "4.1.26";
1
+ export declare const version = "4.1.28";
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.26",
4
+ "version": "4.1.28",
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.17"
33
+ "@wagmi/core": "2.6.19"
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,15 @@ 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
 
34
24
  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
25
  export function metaMask(parameters: MetaMaskParameters = {}) {
43
26
  type Provider = SDKProvider
44
27
  type Properties = {
@@ -48,7 +31,8 @@ export function metaMask(parameters: MetaMaskParameters = {}) {
48
31
  type Listener = Parameters<Provider['on']>[1]
49
32
 
50
33
  let sdk: MetaMaskSDK
51
- let walletProvider: Provider | undefined
34
+ let provider: Provider | undefined
35
+ let providerPromise: Promise<typeof provider>
52
36
 
53
37
  return createConnector<Provider, Properties, StorageItem>((config) => ({
54
38
  id: 'metaMaskSDK',
@@ -62,30 +46,8 @@ export function metaMask(parameters: MetaMaskParameters = {}) {
62
46
  async connect({ chainId, isReconnecting } = {}) {
63
47
  const provider = await this.getProvider()
64
48
 
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
- }
49
+ let accounts: readonly Address[] = []
50
+ if (isReconnecting) accounts = await this.getAccounts().catch(() => [])
89
51
 
90
52
  try {
91
53
  if (!accounts?.length) {
@@ -104,20 +66,8 @@ export function metaMask(parameters: MetaMaskParameters = {}) {
104
66
  provider.on('chainChanged', this.onChainChanged as Listener)
105
67
  provider.on('disconnect', this.onDisconnect.bind(this) as Listener)
106
68
 
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
69
  // Switch to chain if provided
120
- let currentChainId = await this.getChainId()
70
+ let currentChainId = (await this.getChainId()) as number
121
71
  if (chainId && currentChainId !== chainId) {
122
72
  const chain = await this.switchChain!({ chainId }).catch((error) => {
123
73
  if (error.code === UserRejectedRequestError.code) throw error
@@ -164,44 +114,46 @@ export function metaMask(parameters: MetaMaskParameters = {}) {
164
114
  async getChainId() {
165
115
  const provider = await this.getProvider()
166
116
  const chainId =
167
- provider.chainId ?? (await provider?.request({ method: 'eth_chainId' }))
117
+ provider.getChainId() ||
118
+ (await provider?.request({ method: 'eth_chainId' }))
168
119
  return Number(chainId)
169
120
  },
170
121
  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
- }
122
+ async function initProvider() {
123
+ const { MetaMaskSDK } = await import('@metamask/sdk')
124
+ sdk = new MetaMaskSDK({
125
+ dappMetadata: {},
126
+ ...parameters,
127
+ _source: 'wagmi',
128
+ readonlyRPCMap: Object.fromEntries(
129
+ config.chains.map((chain) => [
130
+ chain.id,
131
+ chain.rpcUrls.default.http[0]!,
132
+ ]),
133
+ ),
134
+ })
135
+ await sdk.init()
136
+ return sdk.getProvider()!
200
137
  }
201
- return walletProvider!
138
+
139
+ if (!provider) {
140
+ if (!providerPromise) providerPromise = initProvider()
141
+ provider = await providerPromise
142
+ }
143
+ return provider!
202
144
  },
203
145
  async isAuthorized() {
204
146
  try {
147
+ const isMobileBrowser =
148
+ typeof navigator !== 'undefined'
149
+ ? /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
150
+ navigator.userAgent,
151
+ )
152
+ : false
153
+
154
+ // MetaMask Mobile doesn't support persisted sessions.
155
+ if (isMobileBrowser) return false
156
+
205
157
  const isDisconnected =
206
158
  // If shim exists in storage, connector is disconnected
207
159
  await config.storage?.getItem('metaMaskSDK.disconnected')
@@ -326,6 +278,12 @@ export function metaMask(parameters: MetaMaskParameters = {}) {
326
278
  if (provider && !!(await this.getAccounts()).length) return
327
279
  }
328
280
 
281
+ // Remove cached SDK properties.
282
+ if (typeof localStorage !== 'undefined') {
283
+ localStorage.removeItem('MMSDK_cached_address')
284
+ localStorage.removeItem('MMSDK_cached_chainId')
285
+ }
286
+
329
287
  // No need to remove 'metaMaskSDK.disconnected' from storage because `onDisconnect` is typically
330
288
  // only called when the wallet is disconnected through the wallet's interface, meaning the wallet
331
289
  // actually disconnected and we don't need to simulate it.
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = '4.1.26'
1
+ export const version = '4.1.28'