@wagmi/connectors 8.0.26 → 8.1.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.
package/src/porto.ts DELETED
@@ -1,337 +0,0 @@
1
- import {
2
- ChainNotConfiguredError,
3
- type Connector,
4
- createConnector,
5
- } from '@wagmi/core'
6
- import type { ExactPartial } from '@wagmi/core/internal'
7
- import type { Porto, RpcSchema } from 'porto'
8
- import {
9
- type Address,
10
- getAddress,
11
- numberToHex,
12
- type ProviderConnectInfo,
13
- type RpcError,
14
- SwitchChainError,
15
- UserRejectedRequestError,
16
- withRetry,
17
- } from 'viem'
18
-
19
- /**
20
- * @deprecated https://ithaca.xyz/updates/sunsetting-porto
21
- */
22
- export type PortoParameters = ExactPartial<Porto.Config>
23
-
24
- /**
25
- * @deprecated https://ithaca.xyz/updates/sunsetting-porto
26
- */
27
- export function porto(parameters: PortoParameters = {}) {
28
- type Provider = ReturnType<typeof Porto.create>['provider']
29
- type ProviderWithEvents = Provider & {
30
- on: NonNullable<Provider['on']>
31
- removeListener: NonNullable<Provider['removeListener']>
32
- }
33
- type Properties = {
34
- connect<withCapabilities extends boolean = false>(parameters?: {
35
- chainId?: number | undefined
36
- capabilities?:
37
- | (RpcSchema.wallet_connect.Capabilities & {
38
- force?: boolean | undefined
39
- })
40
- | undefined
41
- isReconnecting?: boolean | undefined
42
- withCapabilities?: withCapabilities | boolean | undefined
43
- }): Promise<{
44
- accounts: withCapabilities extends true
45
- ? readonly {
46
- address: Address
47
- capabilities: RpcSchema.wallet_connect.ResponseCapabilities
48
- }[]
49
- : readonly Address[]
50
- chainId: number
51
- }>
52
- getPortoInstance(): Promise<Porto.Porto>
53
- onConnect(connectInfo: ProviderConnectInfo): void
54
- }
55
-
56
- const supportsEvents = (provider: Provider): provider is ProviderWithEvents =>
57
- typeof provider.on === 'function' &&
58
- typeof provider.removeListener === 'function'
59
-
60
- return createConnector<Provider, Properties>((wagmiConfig) => {
61
- const chains = wagmiConfig.chains ?? parameters.chains ?? []
62
-
63
- const transports = (() => {
64
- if (wagmiConfig.transports) return wagmiConfig.transports
65
- return parameters.transports
66
- })()
67
-
68
- let porto_promise: Promise<any> | undefined
69
-
70
- let accountsChanged: Connector['onAccountsChanged'] | undefined
71
- let chainChanged: Connector['onChainChanged'] | undefined
72
- let connect: Connector['onConnect'] | undefined
73
- let disconnect: Connector['onDisconnect'] | undefined
74
-
75
- return {
76
- async connect({ chainId = chains[0].id, ...rest } = {}) {
77
- const isReconnecting =
78
- ('isReconnecting' in rest && rest.isReconnecting) || false
79
- const withCapabilities =
80
- ('withCapabilities' in rest && rest.withCapabilities) || false
81
-
82
- let accounts: readonly (Address | { address: Address })[] = []
83
- let currentChainId: number | undefined
84
-
85
- if (isReconnecting) {
86
- ;[accounts, currentChainId] = await Promise.all([
87
- this.getAccounts().catch(() => []),
88
- this.getChainId().catch(() => undefined),
89
- ])
90
- if (chainId && currentChainId !== chainId) {
91
- const chain = await this.switchChain!({ chainId }).catch(
92
- (error) => {
93
- if (error.code === UserRejectedRequestError.code) throw error
94
- return { id: currentChainId }
95
- },
96
- )
97
- currentChainId = chain?.id ?? currentChainId
98
- }
99
- }
100
-
101
- const provider = (await this.getProvider()) as Provider
102
-
103
- try {
104
- if (!accounts?.length && !isReconnecting) {
105
- const { RpcSchema } = await import(
106
- /* turbopackOptional: true */
107
- 'porto'
108
- )
109
- const { z } = await import(
110
- /* turbopackOptional: true */
111
- 'porto/internal'
112
- )
113
- const res = await provider.request({
114
- method: 'wallet_connect',
115
- params: [
116
- {
117
- ...('capabilities' in rest
118
- ? {
119
- capabilities: z.encode(
120
- RpcSchema.wallet_connect.Capabilities,
121
- rest.capabilities ?? {},
122
- ),
123
- }
124
- : {}),
125
- chainIds: [
126
- numberToHex(chainId),
127
- ...chains
128
- .filter((x) => x.id !== chainId)
129
- .map((x) => numberToHex(x.id)),
130
- ],
131
- },
132
- ],
133
- })
134
- accounts = res.accounts
135
- currentChainId = Number(res.chainIds[0])
136
- }
137
-
138
- if (!currentChainId) throw new ChainNotConfiguredError()
139
-
140
- // Manage EIP-1193 event listeners
141
- // https://eips.ethereum.org/EIPS/eip-1193#events
142
- if (supportsEvents(provider)) {
143
- if (connect) {
144
- provider.removeListener('connect', connect)
145
- connect = undefined
146
- }
147
- if (!accountsChanged) {
148
- accountsChanged = this.onAccountsChanged.bind(this)
149
- // Porto Provider uses Ox, which uses `readonly Address.Address[]` for `accountsChanged`,
150
- // while Connector `accountsChanged` is `string[]`
151
- provider.on('accountsChanged', accountsChanged as never)
152
- }
153
- if (!chainChanged) {
154
- chainChanged = this.onChainChanged.bind(this)
155
- provider.on('chainChanged', chainChanged)
156
- }
157
- if (!disconnect) {
158
- disconnect = this.onDisconnect.bind(this)
159
- provider.on('disconnect', disconnect)
160
- }
161
- }
162
-
163
- return {
164
- accounts: accounts.map((account) => {
165
- if (typeof account === 'object')
166
- return withCapabilities ? account : account.address
167
- return withCapabilities
168
- ? { address: account, capabilities: {} }
169
- : account
170
- }) as never,
171
- chainId: currentChainId,
172
- }
173
- } catch (err) {
174
- const error = err as RpcError
175
- if (error.code === UserRejectedRequestError.code)
176
- throw new UserRejectedRequestError(error)
177
- throw error
178
- }
179
- },
180
- async disconnect() {
181
- const provider = await this.getProvider()
182
-
183
- if (supportsEvents(provider)) {
184
- if (chainChanged) {
185
- provider.removeListener('chainChanged', chainChanged)
186
- chainChanged = undefined
187
- }
188
- if (disconnect) {
189
- provider.removeListener('disconnect', disconnect)
190
- disconnect = undefined
191
- }
192
- if (!connect) {
193
- connect = this.onConnect.bind(this)
194
- provider.on('connect', connect)
195
- }
196
- }
197
-
198
- await provider.request({ method: 'wallet_disconnect' })
199
- },
200
- async getAccounts() {
201
- const provider = await this.getProvider()
202
- const accounts = await provider.request({
203
- method: 'eth_accounts',
204
- })
205
- return accounts.map((x) => getAddress(x))
206
- },
207
- async getChainId() {
208
- const provider = await this.getProvider()
209
- const hexChainId = await provider.request({
210
- method: 'eth_chainId',
211
- })
212
- return Number(hexChainId)
213
- },
214
- async getPortoInstance() {
215
- porto_promise ??= (async () => {
216
- // safe webpack optional peer dependency dynamic import
217
- try {
218
- const { Porto } = await import(
219
- /* turbopackOptional: true */
220
- 'porto'
221
- )
222
- // @ts-ignore
223
- return Porto.create({
224
- ...parameters,
225
- announceProvider: false,
226
- // @ts-ignore
227
- chains,
228
- // @ts-ignore
229
- transports,
230
- })
231
- } catch (error) {
232
- // biome-ignore lint/complexity/noUselessCatch: try block marks dependency as optional for webpack
233
- throw error
234
- }
235
- })()
236
- return await porto_promise
237
- },
238
- async getProvider() {
239
- return (await this.getPortoInstance()).provider
240
- },
241
- icon: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDIyIiBoZWlnaHQ9IjQyMiIgdmlld0JveD0iMCAwIDQyMiA0MjIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSI0MjIiIGhlaWdodD0iNDIyIiBmaWxsPSJibGFjayIvPgo8ZyBjbGlwLXBhdGg9InVybCgjY2xpcDBfMV8xNSkiPgo8cGF0aCBkPSJNODEgMjg2LjM2NkM4MSAyODAuODkzIDg1LjQ1MDUgMjc2LjQ1NSA5MC45NDA0IDI3Ni40NTVIMzI5LjUxMUMzMzUuMDAxIDI3Ni40NTUgMzM5LjQ1MiAyODAuODkzIDMzOS40NTIgMjg2LjM2NlYzMDYuMTg4QzMzOS40NTIgMzExLjY2MiAzMzUuMDAxIDMxNi4wOTkgMzI5LjUxMSAzMTYuMDk5SDkwLjk0MDRDODUuNDUwNSAzMTYuMDk5IDgxIDMxMS42NjIgODEgMzA2LjE4OFYyODYuMzY2WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOTAuOTQwNCAyMzQuODI4Qzg1LjQ1MDUgMjM0LjgyOCA4MSAyMzkuMjY2IDgxIDI0NC43MzlWMjcxLjUzMUM4My44NDMyIDI2OS42MzMgODcuMjYyMiAyNjguNTI2IDkwLjk0MDQgMjY4LjUyNkgzMjkuNTExQzMzMy4xODggMjY4LjUyNiAzMzYuNjA4IDI2OS42MzMgMzM5LjQ1MiAyNzEuNTMxVjI0NC43MzlDMzM5LjQ1MiAyMzkuMjY2IDMzNS4wMDEgMjM0LjgyOCAzMjkuNTExIDIzNC44MjhIOTAuOTQwNFpNMzM5LjQ1MiAyODYuMzY2QzMzOS40NTIgMjgwLjg5MyAzMzUuMDAxIDI3Ni40NTUgMzI5LjUxMSAyNzYuNDU1SDkwLjk0MDRDODUuNDUwNSAyNzYuNDU1IDgxIDI4MC44OTMgODEgMjg2LjM2NlYzMDYuMTlDODEgMzExLjY2NCA4NS40NTA1IDMxNi4xMDEgOTAuOTQwNCAzMTYuMTAxSDMyOS41MTFDMzM1LjAwMSAzMTYuMTAxIDMzOS40NTIgMzExLjY2NCAzMzkuNDUyIDMwNi4xOVYyODYuMzY2WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOTAuOTQwNCAxOTMuMjAxQzg1LjQ1MDUgMTkzLjIwMSA4MSAxOTcuNjM4IDgxIDIwMy4xMTJWMjI5LjkwM0M4My44NDMyIDIyOC4wMDYgODcuMjYyMiAyMjYuODk5IDkwLjk0MDQgMjI2Ljg5OUgzMjkuNTExQzMzMy4xODggMjI2Ljg5OSAzMzYuNjA4IDIyOC4wMDYgMzM5LjQ1MiAyMjkuOTAzVjIwMy4xMTJDMzM5LjQ1MiAxOTcuNjM4IDMzNS4wMDEgMTkzLjIwMSAzMjkuNTExIDE5My4yMDFIOTAuOTQwNFpNMzM5LjQ1MiAyNDQuNzM5QzMzOS40NTIgMjM5LjI2NSAzMzUuMDAxIDIzNC44MjggMzI5LjUxMSAyMzQuODI4SDkwLjk0MDRDODUuNDUwNSAyMzQuODI4IDgxIDIzOS4yNjUgODEgMjQ0LjczOVYyNzEuNTNDODEuMjE3NSAyNzEuMzg1IDgxLjQzODMgMjcxLjI0NSA4MS42NjI0IDI3MS4xMDlDODMuODMyNSAyNjkuNzk0IDg2LjMwNTQgMjY4LjkyNyA4OC45NTIzIDI2OC42MzVDODkuNjA1MSAyNjguNTYzIDkwLjI2ODQgMjY4LjUyNiA5MC45NDA0IDI2OC41MjZIMzI5LjUxMUMzMzAuMTgzIDI2OC41MjYgMzMwLjg0NiAyNjguNTYzIDMzMS40OTggMjY4LjYzNUMzMzQuNDE5IDI2OC45NTcgMzM3LjEyOCAyNjkuOTggMzM5LjQ1MiAyNzEuNTNWMjQ0LjczOVpNMzM5LjQ1MiAyODYuMzY2QzMzOS40NTIgMjgxLjAyMSAzMzUuMjA2IDI3Ni42NjMgMzI5Ljg5MyAyNzYuNDYyQzMyOS43NjcgMjc2LjQ1NyAzMjkuNjQgMjc2LjQ1NSAzMjkuNTExIDI3Ni40NTVIOTAuOTQwNEM4NS40NTA1IDI3Ni40NTUgODEgMjgwLjg5MyA4MSAyODYuMzY2VjMwNi4xODhDODEgMzExLjY2MiA4NS40NTA1IDMxNi4xMDEgOTAuOTQwNCAzMTYuMTAxSDMyOS41MTFDMzM1LjAwMSAzMTYuMTAxIDMzOS40NTIgMzExLjY2MiAzMzkuNDUyIDMwNi4xODhWMjg2LjM2NloiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8cGF0aCBvcGFjaXR5PSIwLjMiIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOTguMDE0NiAxMDRDODguNjE3NyAxMDQgODEgMTExLjU5NSA4MSAxMjAuOTY1VjE4OC4yNzZDODMuODQzMiAxODYuMzc5IDg3LjI2MjIgMTg1LjI3MiA5MC45NDA0IDE4NS4yNzJIMzI5LjUxMUMzMzMuMTg4IDE4NS4yNzIgMzM2LjYwOCAxODYuMzc5IDMzOS40NTIgMTg4LjI3NlYxMjAuOTY1QzMzOS40NTIgMTExLjU5NSAzMzEuODMzIDEwNCAzMjIuNDM3IDEwNEg5OC4wMTQ2Wk0zMzkuNDUyIDIwMy4xMTJDMzM5LjQ1MiAxOTcuNjM4IDMzNS4wMDEgMTkzLjIwMSAzMjkuNTExIDE5My4yMDFIOTAuOTQwNEM4NS40NTA1IDE5My4yMDEgODEgMTk3LjYzOCA4MSAyMDMuMTEyVjIyOS45MDNDODEuMjE3NSAyMjkuNzU4IDgxLjQzODMgMjI5LjYxOCA4MS42NjI0IDIyOS40ODJDODMuODMyNSAyMjguMTY3IDg2LjMwNTQgMjI3LjMgODguOTUyMyAyMjcuMDA4Qzg5LjYwNTEgMjI2LjkzNiA5MC4yNjg0IDIyNi44OTkgOTAuOTQwNCAyMjYuODk5SDMyOS41MTFDMzMwLjE4MyAyMjYuODk5IDMzMC44NDYgMjI2LjkzNiAzMzEuNDk4IDIyNy4wMDhDMzM0LjQxOSAyMjcuMzMgMzM3LjEyOCAyMjguMzUyIDMzOS40NTIgMjI5LjkwM1YyMDMuMTEyWk0zMzkuNDUyIDI0NC43MzlDMzM5LjQ1MiAyMzkuMzkzIDMzNS4yMDYgMjM1LjAzNiAzMjkuODkzIDIzNC44MzVDMzI5Ljc2NyAyMzQuODMgMzI5LjY0IDIzNC44MjggMzI5LjUxMSAyMzQuODI4SDkwLjk0MDRDODUuNDUwNSAyMzQuODI4IDgxIDIzOS4yNjUgODEgMjQ0LjczOVYyNzEuNTNMODEuMDcwNyAyNzEuNDgzQzgxLjI2NTMgMjcxLjM1NSA4MS40NjI1IDI3MS4yMyA4MS42NjI0IDI3MS4xMDlDODEuOTA4MyAyNzAuOTYgODIuMTU4MSAyNzAuODE3IDgyLjQxMTcgMjcwLjY3OUM4NC4zOTUzIDI2OS42MDUgODYuNjA1NCAyNjguODk0IDg4Ljk1MjMgMjY4LjYzNUM4OS4wMDUyIDI2OC42MjkgODkuMDU4IDI2OC42MjQgODkuMTExIDI2OC42MThDODkuNzEyNSAyNjguNTU3IDkwLjMyMjggMjY4LjUyNiA5MC45NDA0IDI2OC41MjZIMzI5LjUxMUMzMjkuNzM4IDI2OC41MjYgMzI5Ljk2NSAyNjguNTMgMzMwLjE5MiAyNjguNTM5QzMzMC42MzEgMjY4LjU1NSAzMzEuMDY3IDI2OC41ODcgMzMxLjQ5OCAyNjguNjM1QzMzNC40MTkgMjY4Ljk1NyAzMzcuMTI4IDI2OS45OCAzMzkuNDUyIDI3MS41M1YyNDQuNzM5Wk0zMzkuNDUyIDI4Ni4zNjZDMzM5LjQ1MiAyODEuMDIxIDMzNS4yMDYgMjc2LjY2MyAzMjkuODkzIDI3Ni40NjJMMzI5Ljg2NSAyNzYuNDYxQzMyOS43NDggMjc2LjQ1NyAzMjkuNjI5IDI3Ni40NTUgMzI5LjUxMSAyNzYuNDU1SDkwLjk0MDRDODUuNDUwNSAyNzYuNDU1IDgxIDI4MC44OTMgODEgMjg2LjM2NlYzMDYuMTg4QzgxIDMxMS42NjIgODUuNDUwNSAzMTYuMTAxIDkwLjk0MDQgMzE2LjEwMUgzMjkuNTExQzMzNS4wMDEgMzE2LjEwMSAzMzkuNDUyIDMxMS42NjIgMzM5LjQ1MiAzMDYuMTg4VjI4Ni4zNjZaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNMjY5Ljg2OCAxMzEuNzUyQzI2OS44NjggMTI2LjI3OCAyNzQuMzE4IDEyMS44NCAyNzkuODA4IDEyMS44NEgzMTEuNjE4QzMxNy4xMDggMTIxLjg0IDMyMS41NTggMTI2LjI3OCAzMjEuNTU4IDEzMS43NTJWMTYxLjQ4NUMzMjEuNTU4IDE2Ni45NTkgMzE3LjEwOCAxNzEuMzk2IDMxMS42MTggMTcxLjM5NkgyNzkuODA4QzI3NC4zMTggMTcxLjM5NiAyNjkuODY4IDE2Ni45NTkgMjY5Ljg2OCAxNjEuNDg1VjEzMS43NTJaIiBmaWxsPSJ3aGl0ZSIvPgo8L2c+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzFfMTUiPgo8cmVjdCB3aWR0aD0iMjU5IiBoZWlnaHQ9IjIxMyIgZmlsbD0id2hpdGUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDgxIDEwNCkiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K',
242
- id: 'xyz.ithaca.porto',
243
- async isAuthorized() {
244
- try {
245
- // Use retry strategy as some injected wallets (e.g. MetaMask) fail to
246
- // immediately resolve JSON-RPC requests on page load.
247
- const accounts = await withRetry(() => this.getAccounts())
248
- return !!accounts.length
249
- } catch {
250
- return false
251
- }
252
- },
253
- name: 'Porto',
254
- async onAccountsChanged(accounts) {
255
- wagmiConfig.emitter.emit('change', {
256
- accounts: accounts.map((x) => getAddress(x)),
257
- })
258
- },
259
- onChainChanged(chain) {
260
- const chainId = Number(chain)
261
- wagmiConfig.emitter.emit('change', { chainId })
262
- },
263
- async onConnect(connectInfo) {
264
- const accounts = await this.getAccounts()
265
- if (accounts.length === 0) return
266
-
267
- const chainId = Number(connectInfo.chainId)
268
- wagmiConfig.emitter.emit('connect', { accounts, chainId })
269
-
270
- // Manage EIP-1193 event listeners
271
- const provider = await this.getProvider()
272
- if (supportsEvents(provider)) {
273
- if (connect) {
274
- provider.removeListener('connect', connect)
275
- connect = undefined
276
- }
277
- if (!accountsChanged) {
278
- accountsChanged = this.onAccountsChanged.bind(this)
279
- // Porto Provider uses Ox, which uses `readonly Address.Address[]` for `accountsChanged`,
280
- // while Connector `accountsChanged` is `string[]`
281
- provider.on('accountsChanged', accountsChanged as never)
282
- }
283
- if (!chainChanged) {
284
- chainChanged = this.onChainChanged.bind(this)
285
- provider.on('chainChanged', chainChanged)
286
- }
287
- if (!disconnect) {
288
- disconnect = this.onDisconnect.bind(this)
289
- provider.on('disconnect', disconnect)
290
- }
291
- }
292
- },
293
- async onDisconnect(_error) {
294
- const provider = await this.getProvider()
295
-
296
- wagmiConfig.emitter.emit('disconnect')
297
-
298
- // Manage EIP-1193 event listeners
299
- if (supportsEvents(provider)) {
300
- if (chainChanged) {
301
- provider.removeListener('chainChanged', chainChanged)
302
- chainChanged = undefined
303
- }
304
- if (disconnect) {
305
- provider.removeListener('disconnect', disconnect)
306
- disconnect = undefined
307
- }
308
- if (!connect) {
309
- connect = this.onConnect.bind(this)
310
- provider.on('connect', connect)
311
- }
312
- }
313
- },
314
- async setup() {
315
- if (!connect) {
316
- const provider = await this.getProvider()
317
- if (!supportsEvents(provider)) return
318
- connect = this.onConnect.bind(this)
319
- provider.on('connect', connect)
320
- }
321
- },
322
- async switchChain({ chainId }) {
323
- const chain = chains.find((x) => x.id === chainId)
324
- if (!chain) throw new SwitchChainError(new ChainNotConfiguredError())
325
-
326
- const provider = await this.getProvider()
327
- await provider.request({
328
- method: 'wallet_switchEthereumChain',
329
- params: [{ chainId: numberToHex(chainId) }],
330
- })
331
-
332
- return chain
333
- },
334
- type: 'injected',
335
- }
336
- })
337
- }