@wagmi/connectors 5.8.6 → 5.9.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,2 +1,2 @@
1
- export const version = '5.8.6';
1
+ export const version = '5.9.0';
2
2
  //# sourceMappingURL=version.js.map
@@ -0,0 +1,14 @@
1
+ import type { ProviderInterface, createBaseAccountSDK } from '@base-org/account';
2
+ import type { Mutable, Omit } from '@wagmi/core/internal';
3
+ import { type Address } from 'viem';
4
+ export type BaseAccountParameters = Mutable<Omit<Parameters<typeof createBaseAccountSDK>[0], 'appChainIds'>>;
5
+ export declare function baseAccount(parameters?: BaseAccountParameters): import("@wagmi/core").CreateConnectorFn<ProviderInterface, {
6
+ connect(parameters?: {
7
+ chainId?: number | undefined;
8
+ isReconnecting?: boolean | undefined;
9
+ }): Promise<{
10
+ accounts: readonly Address[];
11
+ chainId: number;
12
+ }>;
13
+ }, Record<string, unknown>>;
14
+ //# sourceMappingURL=baseAccount.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseAccount.d.ts","sourceRoot":"","sources":["../../src/baseAccount.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAMhF,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAEL,KAAK,OAAO,EAOb,MAAM,MAAM,CAAA;AAEb,MAAM,MAAM,qBAAqB,GAAG,OAAO,CACzC,IAAI,CACF,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC,CAAC,CAAC,EAC1C,aAAa,CACd,CACF,CAAA;AAED,wBAAgB,WAAW,CAAC,UAAU,GAAE,qBAA0B;yBAGzC;QACnB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC5B,cAAc,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;KACrC,GAAG,OAAO,CAAC;QACV,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAA;QAC5B,OAAO,EAAE,MAAM,CAAA;KAChB,CAAC;4BA6ML"}
@@ -1,4 +1,5 @@
1
1
  export { type InjectedParameters, injected, type MockParameters, mock, } from '@wagmi/core';
2
+ export { type BaseAccountParameters, baseAccount } from '../baseAccount.js';
2
3
  export { type CoinbaseWalletParameters, coinbaseWallet, } from '../coinbaseWallet.js';
3
4
  export { type MetaMaskParameters, metaMask } from '../metaMask.js';
4
5
  export { type SafeParameters, safe } from '../safe.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/exports/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,kBAAkB,EACvB,QAAQ,EACR,KAAK,cAAc,EACnB,IAAI,GACL,MAAM,aAAa,CAAA;AAEpB,OAAO,EACL,KAAK,wBAAwB,EAC7B,cAAc,GACf,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EAAE,KAAK,kBAAkB,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAElE,OAAO,EAAE,KAAK,cAAc,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAEtD,OAAO,EACL,KAAK,uBAAuB,EAC5B,aAAa,GACd,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/exports/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,kBAAkB,EACvB,QAAQ,EACR,KAAK,cAAc,EACnB,IAAI,GACL,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,KAAK,qBAAqB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE3E,OAAO,EACL,KAAK,wBAAwB,EAC7B,cAAc,GACf,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EAAE,KAAK,kBAAkB,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAElE,OAAO,EAAE,KAAK,cAAc,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAEtD,OAAO,EACL,KAAK,uBAAuB,EAC5B,aAAa,GACd,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA"}
@@ -1,2 +1,2 @@
1
- export declare const version = "5.8.6";
1
+ export declare const version = "5.9.0";
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": "5.8.6",
4
+ "version": "5.9.0",
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.17.3"
33
+ "@wagmi/core": "2.18.0"
34
34
  },
35
35
  "peerDependenciesMeta": {
36
36
  "typescript": {
@@ -38,6 +38,7 @@
38
38
  }
39
39
  },
40
40
  "dependencies": {
41
+ "@base-org/account": "1.0.2",
41
42
  "@coinbase/wallet-sdk": "4.3.6",
42
43
  "@metamask/sdk": "0.32.0",
43
44
  "@safe-global/safe-apps-provider": "0.18.6",
@@ -0,0 +1,240 @@
1
+ import type { ProviderInterface, createBaseAccountSDK } from '@base-org/account'
2
+ import {
3
+ ChainNotConfiguredError,
4
+ type Connector,
5
+ createConnector,
6
+ } from '@wagmi/core'
7
+ import type { Mutable, Omit } from '@wagmi/core/internal'
8
+ import {
9
+ type AddEthereumChainParameter,
10
+ type Address,
11
+ type Hex,
12
+ type ProviderRpcError,
13
+ SwitchChainError,
14
+ UserRejectedRequestError,
15
+ getAddress,
16
+ numberToHex,
17
+ } from 'viem'
18
+
19
+ export type BaseAccountParameters = Mutable<
20
+ Omit<
21
+ Parameters<typeof createBaseAccountSDK>[0],
22
+ 'appChainIds' // set via wagmi config
23
+ >
24
+ >
25
+
26
+ export function baseAccount(parameters: BaseAccountParameters = {}) {
27
+ type Provider = ProviderInterface
28
+ type Properties = {
29
+ connect(parameters?: {
30
+ chainId?: number | undefined
31
+ isReconnecting?: boolean | undefined
32
+ }): Promise<{
33
+ accounts: readonly Address[]
34
+ chainId: number
35
+ }>
36
+ }
37
+
38
+ let walletProvider: Provider | undefined
39
+
40
+ let accountsChanged: Connector['onAccountsChanged'] | undefined
41
+ let chainChanged: Connector['onChainChanged'] | undefined
42
+ let disconnect: Connector['onDisconnect'] | undefined
43
+
44
+ return createConnector<Provider, Properties>((config) => ({
45
+ id: 'baseAccount',
46
+ name: 'Base Account',
47
+ rdns: 'app.base.account',
48
+ type: 'baseAccount',
49
+ async connect({ chainId } = {}) {
50
+ try {
51
+ const provider = await this.getProvider()
52
+ const accounts = (
53
+ (await provider.request({
54
+ method: 'eth_requestAccounts',
55
+ params: [],
56
+ })) as string[]
57
+ ).map((x) => getAddress(x))
58
+
59
+ if (!accountsChanged) {
60
+ accountsChanged = this.onAccountsChanged.bind(this)
61
+ provider.on('accountsChanged', accountsChanged)
62
+ }
63
+ if (!chainChanged) {
64
+ chainChanged = this.onChainChanged.bind(this)
65
+ provider.on('chainChanged', chainChanged)
66
+ }
67
+ if (!disconnect) {
68
+ disconnect = this.onDisconnect.bind(this)
69
+ provider.on('disconnect', disconnect)
70
+ }
71
+
72
+ // Switch to chain if provided
73
+ let currentChainId = await this.getChainId()
74
+ if (chainId && currentChainId !== chainId) {
75
+ const chain = await this.switchChain!({ chainId }).catch((error) => {
76
+ if (error.code === UserRejectedRequestError.code) throw error
77
+ return { id: currentChainId }
78
+ })
79
+ currentChainId = chain?.id ?? currentChainId
80
+ }
81
+
82
+ return { accounts, chainId: currentChainId }
83
+ } catch (error) {
84
+ if (
85
+ /(user closed modal|accounts received is empty|user denied account|request rejected)/i.test(
86
+ (error as Error).message,
87
+ )
88
+ )
89
+ throw new UserRejectedRequestError(error as Error)
90
+ throw error
91
+ }
92
+ },
93
+ async disconnect() {
94
+ const provider = await this.getProvider()
95
+
96
+ if (accountsChanged) {
97
+ provider.removeListener('accountsChanged', accountsChanged)
98
+ accountsChanged = undefined
99
+ }
100
+ if (chainChanged) {
101
+ provider.removeListener('chainChanged', chainChanged)
102
+ chainChanged = undefined
103
+ }
104
+ if (disconnect) {
105
+ provider.removeListener('disconnect', disconnect)
106
+ disconnect = undefined
107
+ }
108
+
109
+ provider.disconnect()
110
+ },
111
+ async getAccounts() {
112
+ const provider = await this.getProvider()
113
+ return (
114
+ (await provider.request({
115
+ method: 'eth_accounts',
116
+ })) as string[]
117
+ ).map((x) => getAddress(x))
118
+ },
119
+ async getChainId() {
120
+ const provider = await this.getProvider()
121
+ const chainId = (await provider.request({
122
+ method: 'eth_chainId',
123
+ })) as Hex
124
+ return Number(chainId)
125
+ },
126
+ async getProvider() {
127
+ if (!walletProvider) {
128
+ const preference = (() => {
129
+ if (typeof parameters.preference === 'string')
130
+ return { options: parameters.preference }
131
+ return {
132
+ ...parameters.preference,
133
+ options: parameters.preference?.options ?? 'all',
134
+ }
135
+ })()
136
+
137
+ const { createBaseAccountSDK } = await import('@base-org/account')
138
+ const sdk = createBaseAccountSDK({
139
+ ...parameters,
140
+ appChainIds: config.chains.map((x) => x.id),
141
+ preference,
142
+ })
143
+
144
+ walletProvider = sdk.getProvider()
145
+ }
146
+
147
+ return walletProvider
148
+ },
149
+ async isAuthorized() {
150
+ try {
151
+ const accounts = await this.getAccounts()
152
+ return !!accounts.length
153
+ } catch {
154
+ return false
155
+ }
156
+ },
157
+ async switchChain({ addEthereumChainParameter, chainId }) {
158
+ const chain = config.chains.find((chain) => chain.id === chainId)
159
+ if (!chain) throw new SwitchChainError(new ChainNotConfiguredError())
160
+
161
+ const provider = await this.getProvider()
162
+
163
+ try {
164
+ await provider.request({
165
+ method: 'wallet_switchEthereumChain',
166
+ params: [{ chainId: numberToHex(chain.id) }],
167
+ })
168
+ return chain
169
+ } catch (error) {
170
+ // Indicates chain is not added to provider
171
+ if ((error as ProviderRpcError).code === 4902) {
172
+ try {
173
+ let blockExplorerUrls: string[] | undefined
174
+ if (addEthereumChainParameter?.blockExplorerUrls)
175
+ blockExplorerUrls = addEthereumChainParameter.blockExplorerUrls
176
+ else
177
+ blockExplorerUrls = chain.blockExplorers?.default.url
178
+ ? [chain.blockExplorers?.default.url]
179
+ : []
180
+
181
+ let rpcUrls: readonly string[]
182
+ if (addEthereumChainParameter?.rpcUrls?.length)
183
+ rpcUrls = addEthereumChainParameter.rpcUrls
184
+ else rpcUrls = [chain.rpcUrls.default?.http[0] ?? '']
185
+
186
+ const addEthereumChain = {
187
+ blockExplorerUrls,
188
+ chainId: numberToHex(chainId),
189
+ chainName: addEthereumChainParameter?.chainName ?? chain.name,
190
+ iconUrls: addEthereumChainParameter?.iconUrls,
191
+ nativeCurrency:
192
+ addEthereumChainParameter?.nativeCurrency ??
193
+ chain.nativeCurrency,
194
+ rpcUrls,
195
+ } satisfies AddEthereumChainParameter
196
+
197
+ await provider.request({
198
+ method: 'wallet_addEthereumChain',
199
+ params: [addEthereumChain],
200
+ })
201
+
202
+ return chain
203
+ } catch (error) {
204
+ throw new UserRejectedRequestError(error as Error)
205
+ }
206
+ }
207
+
208
+ throw new SwitchChainError(error as Error)
209
+ }
210
+ },
211
+ onAccountsChanged(accounts) {
212
+ if (accounts.length === 0) this.onDisconnect()
213
+ else
214
+ config.emitter.emit('change', {
215
+ accounts: accounts.map((x) => getAddress(x)),
216
+ })
217
+ },
218
+ onChainChanged(chain) {
219
+ const chainId = Number(chain)
220
+ config.emitter.emit('change', { chainId })
221
+ },
222
+ async onDisconnect(_error) {
223
+ config.emitter.emit('disconnect')
224
+
225
+ const provider = await this.getProvider()
226
+ if (accountsChanged) {
227
+ provider.removeListener('accountsChanged', accountsChanged)
228
+ accountsChanged = undefined
229
+ }
230
+ if (chainChanged) {
231
+ provider.removeListener('chainChanged', chainChanged)
232
+ chainChanged = undefined
233
+ }
234
+ if (disconnect) {
235
+ provider.removeListener('disconnect', disconnect)
236
+ disconnect = undefined
237
+ }
238
+ },
239
+ }))
240
+ }
@@ -6,6 +6,8 @@ export {
6
6
  mock,
7
7
  } from '@wagmi/core'
8
8
 
9
+ export { type BaseAccountParameters, baseAccount } from '../baseAccount.js'
10
+
9
11
  export {
10
12
  type CoinbaseWalletParameters,
11
13
  coinbaseWallet,
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = '5.8.6'
1
+ export const version = '5.9.0'