@wagmi/connectors 4.0.0 → 4.0.2
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/README.md +13 -0
- package/dist/esm/coinbaseWallet.js +20 -19
- package/dist/esm/coinbaseWallet.js.map +1 -1
- package/dist/esm/exports/index.js +7 -0
- package/dist/esm/exports/index.js.map +1 -0
- package/dist/esm/exports/index.test-d.js.map +1 -0
- package/dist/esm/metaMask.js +266 -0
- package/dist/esm/metaMask.js.map +1 -0
- package/dist/esm/safe.js +19 -16
- package/dist/esm/safe.js.map +1 -1
- package/dist/esm/tsconfig.build.tsbuildinfo +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/esm/walletConnect.js +15 -16
- package/dist/esm/walletConnect.js.map +1 -1
- package/dist/types/coinbaseWallet.d.ts +3 -0
- package/dist/types/coinbaseWallet.d.ts.map +1 -1
- package/dist/types/exports/index.d.ts +7 -0
- package/dist/types/exports/index.d.ts.map +1 -0
- package/dist/types/exports/index.test-d.d.ts.map +1 -0
- package/dist/types/metaMask.d.ts +13 -0
- package/dist/types/metaMask.d.ts.map +1 -0
- package/dist/types/safe.d.ts +5 -2
- package/dist/types/safe.d.ts.map +1 -1
- package/dist/types/version.d.ts +1 -1
- package/dist/types/walletConnect.d.ts +3 -0
- package/dist/types/walletConnect.d.ts.map +1 -1
- package/package.json +21 -38
- package/src/coinbaseWallet.ts +20 -19
- package/src/exports/index.ts +22 -0
- package/src/metaMask.ts +334 -0
- package/src/safe.ts +26 -20
- package/src/version.ts +1 -1
- package/src/walletConnect.ts +15 -20
- package/dist/esm/index.js +0 -7
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/index.test-d.js.map +0 -1
- package/dist/esm/injected.js +0 -372
- package/dist/esm/injected.js.map +0 -1
- package/dist/esm/ledger.js +0 -162
- package/dist/esm/ledger.js.map +0 -1
- package/dist/types/index.d.ts +0 -7
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.test-d.d.ts.map +0 -1
- package/dist/types/injected.d.ts +0 -381
- package/dist/types/injected.d.ts.map +0 -1
- package/dist/types/ledger.d.ts +0 -18
- package/dist/types/ledger.d.ts.map +0 -1
- package/src/index.ts +0 -17
- package/src/injected.ts +0 -527
- package/src/ledger.ts +0 -210
- /package/dist/esm/{index.test-d.js → exports/index.test-d.js} +0 -0
- /package/dist/types/{index.test-d.d.ts → exports/index.test-d.d.ts} +0 -0
package/src/metaMask.ts
ADDED
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
import {
|
|
2
|
+
EventType,
|
|
3
|
+
MetaMaskSDK,
|
|
4
|
+
type MetaMaskSDKOptions,
|
|
5
|
+
SDKProvider,
|
|
6
|
+
} from '@metamask/sdk'
|
|
7
|
+
import {
|
|
8
|
+
ChainNotConfiguredError,
|
|
9
|
+
createConnector,
|
|
10
|
+
normalizeChainId,
|
|
11
|
+
} from '@wagmi/core'
|
|
12
|
+
import type { Evaluate, ExactPartial, Omit } from '@wagmi/core/internal'
|
|
13
|
+
import {
|
|
14
|
+
type Address,
|
|
15
|
+
type ProviderConnectInfo,
|
|
16
|
+
type ProviderRpcError,
|
|
17
|
+
ResourceUnavailableRpcError,
|
|
18
|
+
RpcError,
|
|
19
|
+
SwitchChainError,
|
|
20
|
+
UserRejectedRequestError,
|
|
21
|
+
type WalletPermission,
|
|
22
|
+
getAddress,
|
|
23
|
+
numberToHex,
|
|
24
|
+
} from 'viem'
|
|
25
|
+
|
|
26
|
+
export type MetaMaskParameters = Evaluate<
|
|
27
|
+
ExactPartial<
|
|
28
|
+
Omit<
|
|
29
|
+
MetaMaskSDKOptions,
|
|
30
|
+
| 'checkInstallationImmediately'
|
|
31
|
+
| 'checkInstallationOnAllCalls'
|
|
32
|
+
| 'defaultReadOnlyChainId'
|
|
33
|
+
| 'readonlyRPCMap'
|
|
34
|
+
>
|
|
35
|
+
>
|
|
36
|
+
>
|
|
37
|
+
|
|
38
|
+
metaMask.type = 'metaMask' as const
|
|
39
|
+
export function metaMask(parameters: MetaMaskParameters = {}) {
|
|
40
|
+
type Provider = SDKProvider
|
|
41
|
+
type Properties = {
|
|
42
|
+
onConnect(connectInfo: ProviderConnectInfo): void
|
|
43
|
+
}
|
|
44
|
+
type StorageItem = { 'metaMaskSDK.disconnected': true }
|
|
45
|
+
type Listener = Parameters<Provider['on']>[1]
|
|
46
|
+
|
|
47
|
+
let sdk: MetaMaskSDK
|
|
48
|
+
let walletProvider: Provider | undefined
|
|
49
|
+
|
|
50
|
+
return createConnector<Provider, Properties, StorageItem>((config) => ({
|
|
51
|
+
id: 'metaMaskSDK',
|
|
52
|
+
name: 'MetaMask',
|
|
53
|
+
type: metaMask.type,
|
|
54
|
+
async setup() {
|
|
55
|
+
const provider = await this.getProvider()
|
|
56
|
+
if (provider)
|
|
57
|
+
provider.on('connect', this.onConnect.bind(this) as Listener)
|
|
58
|
+
},
|
|
59
|
+
async connect({ chainId, isReconnecting } = {}) {
|
|
60
|
+
const provider = await this.getProvider()
|
|
61
|
+
|
|
62
|
+
let accounts: readonly Address[] | null = null
|
|
63
|
+
if (!isReconnecting) {
|
|
64
|
+
accounts = await this.getAccounts().catch(() => null)
|
|
65
|
+
const isAuthorized = !!accounts?.length
|
|
66
|
+
if (isAuthorized)
|
|
67
|
+
// Attempt to show another prompt for selecting account if already connected
|
|
68
|
+
try {
|
|
69
|
+
const permissions = (await provider.request({
|
|
70
|
+
method: 'wallet_requestPermissions',
|
|
71
|
+
params: [{ eth_accounts: {} }],
|
|
72
|
+
})) as WalletPermission[]
|
|
73
|
+
accounts = permissions[0]?.caveats?.[0]?.value?.map(getAddress)
|
|
74
|
+
} catch (err) {
|
|
75
|
+
const error = err as RpcError
|
|
76
|
+
// Not all injected providers support `wallet_requestPermissions` (e.g. MetaMask iOS).
|
|
77
|
+
// Only bubble up error if user rejects request
|
|
78
|
+
if (error.code === UserRejectedRequestError.code)
|
|
79
|
+
throw new UserRejectedRequestError(error)
|
|
80
|
+
// Or prompt is already open
|
|
81
|
+
if (error.code === ResourceUnavailableRpcError.code) throw error
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
try {
|
|
86
|
+
if (!accounts?.length) {
|
|
87
|
+
const requestedAccounts = (await sdk.connect()) as string[]
|
|
88
|
+
accounts = requestedAccounts.map(getAddress)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
provider.removeListener(
|
|
92
|
+
'connect',
|
|
93
|
+
this.onConnect.bind(this) as Listener,
|
|
94
|
+
)
|
|
95
|
+
provider.on(
|
|
96
|
+
'accountsChanged',
|
|
97
|
+
this.onAccountsChanged.bind(this) as Listener,
|
|
98
|
+
)
|
|
99
|
+
provider.on('chainChanged', this.onChainChanged as Listener)
|
|
100
|
+
provider.on('disconnect', this.onDisconnect.bind(this) as Listener)
|
|
101
|
+
|
|
102
|
+
// Backward compatibility with older wallet (<7.3) version that return accounts before authorization
|
|
103
|
+
if (!sdk.isExtensionActive() && !sdk._getConnection()?.isAuthorized()) {
|
|
104
|
+
function waitForAuthorized() {
|
|
105
|
+
return new Promise((resolve) => {
|
|
106
|
+
const connection = sdk._getConnection()
|
|
107
|
+
const connector = connection?.getConnector()
|
|
108
|
+
connector?.once(EventType.AUTHORIZED, () => resolve(true))
|
|
109
|
+
})
|
|
110
|
+
}
|
|
111
|
+
await waitForAuthorized()
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Switch to chain if provided
|
|
115
|
+
let currentChainId = await this.getChainId()
|
|
116
|
+
if (chainId && currentChainId !== chainId) {
|
|
117
|
+
const chain = await this.switchChain!({ chainId }).catch((error) => {
|
|
118
|
+
if (error.code === UserRejectedRequestError.code) throw error
|
|
119
|
+
return { id: currentChainId }
|
|
120
|
+
})
|
|
121
|
+
currentChainId = chain?.id ?? currentChainId
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
await config.storage?.removeItem('metaMaskSDK.disconnected')
|
|
125
|
+
|
|
126
|
+
return { accounts, chainId: currentChainId }
|
|
127
|
+
} catch (err) {
|
|
128
|
+
const error = err as RpcError
|
|
129
|
+
if (error.code === UserRejectedRequestError.code)
|
|
130
|
+
throw new UserRejectedRequestError(error)
|
|
131
|
+
if (error.code === ResourceUnavailableRpcError.code)
|
|
132
|
+
throw new ResourceUnavailableRpcError(error)
|
|
133
|
+
throw error
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
async disconnect() {
|
|
137
|
+
const provider = await this.getProvider()
|
|
138
|
+
|
|
139
|
+
provider.removeListener(
|
|
140
|
+
'accountsChanged',
|
|
141
|
+
this.onAccountsChanged.bind(this),
|
|
142
|
+
)
|
|
143
|
+
provider.removeListener('chainChanged', this.onChainChanged)
|
|
144
|
+
provider.removeListener('disconnect', this.onDisconnect.bind(this))
|
|
145
|
+
provider.on('connect', this.onConnect.bind(this) as Listener)
|
|
146
|
+
|
|
147
|
+
sdk.terminate()
|
|
148
|
+
|
|
149
|
+
// Add shim signalling connector is disconnected
|
|
150
|
+
await config.storage?.setItem('metaMaskSDK.disconnected', true)
|
|
151
|
+
},
|
|
152
|
+
async getAccounts() {
|
|
153
|
+
const provider = await this.getProvider()
|
|
154
|
+
const accounts = (await provider.request({
|
|
155
|
+
method: 'eth_accounts',
|
|
156
|
+
})) as string[]
|
|
157
|
+
return accounts.map(getAddress)
|
|
158
|
+
},
|
|
159
|
+
async getChainId() {
|
|
160
|
+
const provider = await this.getProvider()
|
|
161
|
+
const chainId =
|
|
162
|
+
provider.chainId ?? (await provider?.request({ method: 'eth_chainId' }))
|
|
163
|
+
return normalizeChainId(chainId)
|
|
164
|
+
},
|
|
165
|
+
async getProvider() {
|
|
166
|
+
if (!walletProvider) {
|
|
167
|
+
if (!sdk || !sdk?.isInitialized()) {
|
|
168
|
+
sdk = new MetaMaskSDK({
|
|
169
|
+
enableDebug: false,
|
|
170
|
+
dappMetadata: { name: 'wagmi' },
|
|
171
|
+
extensionOnly: true,
|
|
172
|
+
modals: {
|
|
173
|
+
// Disable by default since it pops up when mobile tries to reconnect
|
|
174
|
+
otp() {
|
|
175
|
+
const noop = () => {}
|
|
176
|
+
return { mount: noop, unmount: noop }
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
useDeeplink: true,
|
|
180
|
+
_source: 'wagmi',
|
|
181
|
+
...parameters,
|
|
182
|
+
checkInstallationImmediately: false,
|
|
183
|
+
checkInstallationOnAllCalls: false,
|
|
184
|
+
})
|
|
185
|
+
await sdk.init()
|
|
186
|
+
}
|
|
187
|
+
try {
|
|
188
|
+
walletProvider = sdk.getProvider()
|
|
189
|
+
} catch (error) {
|
|
190
|
+
// TODO: SDK sometimes throws errors when MM extension or mobile provider is not detected (don't throw for those errors)
|
|
191
|
+
const regex = /^SDK state invalid -- undefined( mobile)? provider$/
|
|
192
|
+
if (!regex.test((error as Error).message)) throw error
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return walletProvider!
|
|
196
|
+
},
|
|
197
|
+
async isAuthorized() {
|
|
198
|
+
try {
|
|
199
|
+
const isDisconnected =
|
|
200
|
+
// If shim exists in storage, connector is disconnected
|
|
201
|
+
await config.storage?.getItem('metaMaskSDK.disconnected')
|
|
202
|
+
if (isDisconnected) return false
|
|
203
|
+
|
|
204
|
+
const accounts = await this.getAccounts()
|
|
205
|
+
return !!accounts.length
|
|
206
|
+
} catch {
|
|
207
|
+
return false
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
async switchChain({ chainId }) {
|
|
211
|
+
const provider = await this.getProvider()
|
|
212
|
+
|
|
213
|
+
const chain = config.chains.find((x) => x.id === chainId)
|
|
214
|
+
if (!chain) throw new SwitchChainError(new ChainNotConfiguredError())
|
|
215
|
+
|
|
216
|
+
try {
|
|
217
|
+
await Promise.all([
|
|
218
|
+
provider.request({
|
|
219
|
+
method: 'wallet_switchEthereumChain',
|
|
220
|
+
params: [{ chainId: numberToHex(chainId) }],
|
|
221
|
+
}),
|
|
222
|
+
new Promise<void>((resolve) =>
|
|
223
|
+
config.emitter.once('change', ({ chainId: currentChainId }) => {
|
|
224
|
+
if (currentChainId === chainId) resolve()
|
|
225
|
+
}),
|
|
226
|
+
),
|
|
227
|
+
])
|
|
228
|
+
return chain
|
|
229
|
+
} catch (err) {
|
|
230
|
+
const error = err as RpcError
|
|
231
|
+
|
|
232
|
+
// Indicates chain is not added to provider
|
|
233
|
+
if (
|
|
234
|
+
error.code === 4902 ||
|
|
235
|
+
// Unwrapping for MetaMask Mobile
|
|
236
|
+
// https://github.com/MetaMask/metamask-mobile/issues/2944#issuecomment-976988719
|
|
237
|
+
(error as ProviderRpcError<{ originalError?: { code: number } }>)
|
|
238
|
+
?.data?.originalError?.code === 4902
|
|
239
|
+
) {
|
|
240
|
+
try {
|
|
241
|
+
const { default: blockExplorer, ...blockExplorers } =
|
|
242
|
+
chain.blockExplorers ?? {}
|
|
243
|
+
let blockExplorerUrls: string[] = []
|
|
244
|
+
if (blockExplorer)
|
|
245
|
+
blockExplorerUrls = [
|
|
246
|
+
blockExplorer.url,
|
|
247
|
+
...Object.values(blockExplorers).map((x) => x.url),
|
|
248
|
+
]
|
|
249
|
+
|
|
250
|
+
await provider.request({
|
|
251
|
+
method: 'wallet_addEthereumChain',
|
|
252
|
+
params: [
|
|
253
|
+
{
|
|
254
|
+
chainId: numberToHex(chainId),
|
|
255
|
+
chainName: chain.name,
|
|
256
|
+
nativeCurrency: chain.nativeCurrency,
|
|
257
|
+
rpcUrls: [chain.rpcUrls.default?.http[0] ?? ''],
|
|
258
|
+
blockExplorerUrls,
|
|
259
|
+
},
|
|
260
|
+
],
|
|
261
|
+
})
|
|
262
|
+
|
|
263
|
+
const currentChainId = await this.getChainId()
|
|
264
|
+
if (currentChainId !== chainId)
|
|
265
|
+
throw new UserRejectedRequestError(
|
|
266
|
+
new Error('User rejected switch after adding network.'),
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
return chain
|
|
270
|
+
} catch (error) {
|
|
271
|
+
throw new UserRejectedRequestError(error as Error)
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
if (error.code === UserRejectedRequestError.code)
|
|
276
|
+
throw new UserRejectedRequestError(error)
|
|
277
|
+
throw new SwitchChainError(error)
|
|
278
|
+
}
|
|
279
|
+
},
|
|
280
|
+
async onAccountsChanged(accounts) {
|
|
281
|
+
// Disconnect if there are no accounts
|
|
282
|
+
if (accounts.length === 0) this.onDisconnect()
|
|
283
|
+
// Connect if emitter is listening for connect event (e.g. is disconnected and connects through wallet interface)
|
|
284
|
+
else if (config.emitter.listenerCount('connect')) {
|
|
285
|
+
const chainId = (await this.getChainId()).toString()
|
|
286
|
+
this.onConnect({ chainId })
|
|
287
|
+
await config.storage?.removeItem('metaMaskSDK.disconnected')
|
|
288
|
+
}
|
|
289
|
+
// Regular change event
|
|
290
|
+
else config.emitter.emit('change', { accounts: accounts.map(getAddress) })
|
|
291
|
+
},
|
|
292
|
+
onChainChanged(chain) {
|
|
293
|
+
const chainId = normalizeChainId(chain)
|
|
294
|
+
config.emitter.emit('change', { chainId })
|
|
295
|
+
},
|
|
296
|
+
async onConnect(connectInfo) {
|
|
297
|
+
const accounts = await this.getAccounts()
|
|
298
|
+
if (accounts.length === 0) return
|
|
299
|
+
|
|
300
|
+
const chainId = normalizeChainId(connectInfo.chainId)
|
|
301
|
+
config.emitter.emit('connect', { accounts, chainId })
|
|
302
|
+
|
|
303
|
+
const provider = await this.getProvider()
|
|
304
|
+
if (provider) {
|
|
305
|
+
provider.removeListener('connect', this.onConnect.bind(this))
|
|
306
|
+
provider.on('accountsChanged', this.onAccountsChanged.bind(this) as any)
|
|
307
|
+
provider.on('chainChanged', this.onChainChanged as any)
|
|
308
|
+
provider.on('disconnect', this.onDisconnect.bind(this) as any)
|
|
309
|
+
}
|
|
310
|
+
},
|
|
311
|
+
async onDisconnect(error) {
|
|
312
|
+
const provider = await this.getProvider()
|
|
313
|
+
|
|
314
|
+
// If MetaMask emits a `code: 1013` error, wait for reconnection before disconnecting
|
|
315
|
+
// https://github.com/MetaMask/providers/pull/120
|
|
316
|
+
if (error && (error as RpcError<1013>).code === 1013) {
|
|
317
|
+
if (provider && !!(await this.getAccounts()).length) return
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// No need to remove 'metaMaskSDK.disconnected' from storage because `onDisconnect` is typically
|
|
321
|
+
// only called when the wallet is disconnected through the wallet's interface, meaning the wallet
|
|
322
|
+
// actually disconnected and we don't need to simulate it.
|
|
323
|
+
config.emitter.emit('disconnect')
|
|
324
|
+
|
|
325
|
+
provider.removeListener(
|
|
326
|
+
'accountsChanged',
|
|
327
|
+
this.onAccountsChanged.bind(this),
|
|
328
|
+
)
|
|
329
|
+
provider.removeListener('chainChanged', this.onChainChanged)
|
|
330
|
+
provider.removeListener('disconnect', this.onDisconnect.bind(this))
|
|
331
|
+
provider.on('connect', this.onConnect.bind(this) as any)
|
|
332
|
+
},
|
|
333
|
+
}))
|
|
334
|
+
}
|
package/src/safe.ts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { SafeAppProvider } from '@safe-global/safe-apps-provider'
|
|
2
2
|
import { type Opts, default as SafeAppsSDK } from '@safe-global/safe-apps-sdk'
|
|
3
|
-
import {
|
|
4
|
-
|
|
3
|
+
import {
|
|
4
|
+
ProviderNotFoundError,
|
|
5
|
+
createConnector,
|
|
6
|
+
normalizeChainId,
|
|
7
|
+
} from '@wagmi/core'
|
|
5
8
|
import type { Evaluate } from '@wagmi/core/internal'
|
|
6
9
|
import { getAddress } from 'viem'
|
|
7
10
|
|
|
@@ -19,12 +22,13 @@ export type SafeParameters = Evaluate<
|
|
|
19
22
|
}
|
|
20
23
|
>
|
|
21
24
|
|
|
25
|
+
safe.type = 'safe' as const
|
|
22
26
|
export function safe(parameters: SafeParameters = {}) {
|
|
23
|
-
|
|
24
|
-
type Properties = {}
|
|
25
|
-
type StorageItem = { 'safe.shimDisconnect': true }
|
|
27
|
+
const { shimDisconnect = false } = parameters
|
|
26
28
|
|
|
27
|
-
|
|
29
|
+
type Provider = SafeAppProvider | undefined
|
|
30
|
+
type Properties = {}
|
|
31
|
+
type StorageItem = { 'safe.disconnected': true }
|
|
28
32
|
|
|
29
33
|
let provider_: Provider | undefined
|
|
30
34
|
let SDK: typeof SafeAppsSDK.default
|
|
@@ -39,12 +43,8 @@ export function safe(parameters: SafeParameters = {}) {
|
|
|
39
43
|
return createConnector<Provider, Properties, StorageItem>((config) => ({
|
|
40
44
|
id: 'safe',
|
|
41
45
|
name: 'Safe',
|
|
46
|
+
type: safe.type,
|
|
42
47
|
async connect() {
|
|
43
|
-
// Only allowed in iframe context
|
|
44
|
-
const isIframe =
|
|
45
|
-
typeof window !== 'undefined' && window?.parent !== window
|
|
46
|
-
if (!isIframe) throw new ProviderNotFoundError()
|
|
47
|
-
|
|
48
48
|
const provider = await this.getProvider()
|
|
49
49
|
if (!provider) throw new ProviderNotFoundError()
|
|
50
50
|
|
|
@@ -53,19 +53,20 @@ export function safe(parameters: SafeParameters = {}) {
|
|
|
53
53
|
|
|
54
54
|
provider.on('disconnect', this.onDisconnect.bind(this))
|
|
55
55
|
|
|
56
|
-
//
|
|
57
|
-
if (
|
|
58
|
-
await config.storage?.setItem(shimDisconnectStorageKey, true)
|
|
56
|
+
// Remove disconnected shim if it exists
|
|
57
|
+
if (shimDisconnect) await config.storage?.removeItem('safe.disconnected')
|
|
59
58
|
|
|
60
59
|
return { accounts, chainId }
|
|
61
60
|
},
|
|
62
61
|
async disconnect() {
|
|
63
62
|
const provider = await this.getProvider()
|
|
63
|
+
if (!provider) throw new ProviderNotFoundError()
|
|
64
|
+
|
|
64
65
|
provider.removeListener('disconnect', this.onDisconnect.bind(this))
|
|
65
66
|
|
|
66
|
-
//
|
|
67
|
-
if (
|
|
68
|
-
await config.storage?.
|
|
67
|
+
// Add shim signalling connector is disconnected
|
|
68
|
+
if (shimDisconnect)
|
|
69
|
+
await config.storage?.setItem('safe.disconnected', true)
|
|
69
70
|
},
|
|
70
71
|
async getAccounts() {
|
|
71
72
|
const provider = await this.getProvider()
|
|
@@ -75,6 +76,11 @@ export function safe(parameters: SafeParameters = {}) {
|
|
|
75
76
|
)
|
|
76
77
|
},
|
|
77
78
|
async getProvider() {
|
|
79
|
+
// Only allowed in iframe context
|
|
80
|
+
const isIframe =
|
|
81
|
+
typeof window !== 'undefined' && window?.parent !== window
|
|
82
|
+
if (!isIframe) return
|
|
83
|
+
|
|
78
84
|
if (!provider_) {
|
|
79
85
|
const safe = await sdk.safe.getInfo()
|
|
80
86
|
if (!safe) throw new Error('Could not load Safe information')
|
|
@@ -90,9 +96,9 @@ export function safe(parameters: SafeParameters = {}) {
|
|
|
90
96
|
async isAuthorized() {
|
|
91
97
|
try {
|
|
92
98
|
const isDisconnected =
|
|
93
|
-
|
|
94
|
-
// If shim
|
|
95
|
-
|
|
99
|
+
shimDisconnect &&
|
|
100
|
+
// If shim exists in storage, connector is disconnected
|
|
101
|
+
(await config.storage?.getItem('safe.disconnected'))
|
|
96
102
|
if (isDisconnected) return false
|
|
97
103
|
|
|
98
104
|
const accounts = await this.getAccounts()
|
package/src/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = '4.0.
|
|
1
|
+
export const version = '4.0.2'
|
package/src/walletConnect.ts
CHANGED
|
@@ -5,11 +5,7 @@ import {
|
|
|
5
5
|
normalizeChainId,
|
|
6
6
|
} from '@wagmi/core'
|
|
7
7
|
import type { Evaluate, ExactPartial, Omit } from '@wagmi/core/internal'
|
|
8
|
-
import {
|
|
9
|
-
EthereumProvider,
|
|
10
|
-
OPTIONAL_EVENTS,
|
|
11
|
-
OPTIONAL_METHODS,
|
|
12
|
-
} from '@walletconnect/ethereum-provider'
|
|
8
|
+
import { EthereumProvider } from '@walletconnect/ethereum-provider'
|
|
13
9
|
import {
|
|
14
10
|
type Address,
|
|
15
11
|
type ProviderConnectInfo,
|
|
@@ -71,6 +67,7 @@ export type WalletConnectParameters = Evaluate<
|
|
|
71
67
|
ExactPartial<Pick<EthereumProviderOptions, 'showQrModal'>>
|
|
72
68
|
>
|
|
73
69
|
|
|
70
|
+
walletConnect.type = 'walletConnect' as const
|
|
74
71
|
export function walletConnect(parameters: WalletConnectParameters) {
|
|
75
72
|
const isNewChainsStale = parameters.isNewChainsStale ?? true
|
|
76
73
|
|
|
@@ -104,8 +101,9 @@ export function walletConnect(parameters: WalletConnectParameters) {
|
|
|
104
101
|
return createConnector<Provider, Properties, StorageItem>((config) => ({
|
|
105
102
|
id: 'walletConnect',
|
|
106
103
|
name: 'WalletConnect',
|
|
104
|
+
type: walletConnect.type,
|
|
107
105
|
async setup() {
|
|
108
|
-
const provider = await this.getProvider()
|
|
106
|
+
const provider = await this.getProvider().catch(() => null)
|
|
109
107
|
if (!provider) return
|
|
110
108
|
provider.on('connect', this.onConnect.bind(this))
|
|
111
109
|
provider.on('session_delete', this.onSessionDelete.bind(this))
|
|
@@ -137,8 +135,7 @@ export function walletConnect(parameters: WalletConnectParameters) {
|
|
|
137
135
|
.filter((chain) => chain.id !== targetChainId)
|
|
138
136
|
.map((optionalChain) => optionalChain.id)
|
|
139
137
|
await provider.connect({
|
|
140
|
-
|
|
141
|
-
optionalChains,
|
|
138
|
+
optionalChains: [targetChainId, ...optionalChains],
|
|
142
139
|
...('pairingTopic' in rest
|
|
143
140
|
? { pairingTopic: rest.pairingTopic }
|
|
144
141
|
: {}),
|
|
@@ -173,21 +170,21 @@ export function walletConnect(parameters: WalletConnectParameters) {
|
|
|
173
170
|
async disconnect() {
|
|
174
171
|
const provider = await this.getProvider()
|
|
175
172
|
try {
|
|
176
|
-
await provider
|
|
173
|
+
await provider?.disconnect()
|
|
177
174
|
} catch (error) {
|
|
178
175
|
if (!/No matching key/i.test((error as Error).message)) throw error
|
|
179
176
|
} finally {
|
|
180
|
-
provider
|
|
177
|
+
provider?.removeListener(
|
|
181
178
|
'accountsChanged',
|
|
182
179
|
this.onAccountsChanged.bind(this),
|
|
183
180
|
)
|
|
184
|
-
provider
|
|
185
|
-
provider
|
|
186
|
-
provider
|
|
181
|
+
provider?.removeListener('chainChanged', this.onChainChanged)
|
|
182
|
+
provider?.removeListener('disconnect', this.onDisconnect.bind(this))
|
|
183
|
+
provider?.removeListener(
|
|
187
184
|
'session_delete',
|
|
188
185
|
this.onSessionDelete.bind(this),
|
|
189
186
|
)
|
|
190
|
-
provider
|
|
187
|
+
provider?.on('connect', this.onConnect.bind(this))
|
|
191
188
|
|
|
192
189
|
this.setRequestedChainsIds([])
|
|
193
190
|
}
|
|
@@ -198,14 +195,11 @@ export function walletConnect(parameters: WalletConnectParameters) {
|
|
|
198
195
|
},
|
|
199
196
|
async getProvider({ chainId } = {}) {
|
|
200
197
|
async function initProvider() {
|
|
201
|
-
const
|
|
202
|
-
if (!
|
|
198
|
+
const optionalChains = config.chains.map((x) => x.id) as [number]
|
|
199
|
+
if (!optionalChains.length) return
|
|
203
200
|
return await EthereumProvider.init({
|
|
204
201
|
...parameters,
|
|
205
|
-
chains: [defaultChain],
|
|
206
202
|
disableProviderPing: true,
|
|
207
|
-
optionalMethods: OPTIONAL_METHODS,
|
|
208
|
-
optionalEvents: OPTIONAL_EVENTS,
|
|
209
203
|
optionalChains,
|
|
210
204
|
projectId: parameters.projectId,
|
|
211
205
|
rpcMap: Object.fromEntries(
|
|
@@ -269,7 +263,7 @@ export function walletConnect(parameters: WalletConnectParameters) {
|
|
|
269
263
|
params: [
|
|
270
264
|
{
|
|
271
265
|
chainId: numberToHex(chain.id),
|
|
272
|
-
blockExplorerUrls: [chain.blockExplorers?.default],
|
|
266
|
+
blockExplorerUrls: [chain.blockExplorers?.default.url],
|
|
273
267
|
chainName: chain.name,
|
|
274
268
|
nativeCurrency: chain.nativeCurrency,
|
|
275
269
|
rpcUrls: [...chain.rpcUrls.default.http],
|
|
@@ -286,6 +280,7 @@ export function walletConnect(parameters: WalletConnectParameters) {
|
|
|
286
280
|
})
|
|
287
281
|
return chain
|
|
288
282
|
} catch (error) {
|
|
283
|
+
console.log({ error })
|
|
289
284
|
const message =
|
|
290
285
|
typeof error === 'string'
|
|
291
286
|
? error
|
package/dist/esm/index.js
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export { coinbaseWallet, } from './coinbaseWallet.js';
|
|
2
|
-
export { injected } from './injected.js';
|
|
3
|
-
export { ledger } from './ledger.js';
|
|
4
|
-
export { safe } from './safe.js';
|
|
5
|
-
export { walletConnect, } from './walletConnect.js';
|
|
6
|
-
export { version } from './version.js';
|
|
7
|
-
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,GACf,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EAA2B,QAAQ,EAAE,MAAM,eAAe,CAAA;AAEjE,OAAO,EAAyB,MAAM,EAAE,MAAM,aAAa,CAAA;AAE3D,OAAO,EAAuB,IAAI,EAAE,MAAM,WAAW,CAAA;AAErD,OAAO,EAEL,aAAa,GACd,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.test-d.js","sourceRoot":"","sources":["../../src/index.test-d.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AAErC,uFAAuF;AACvF,YAAY,CAAC,CAAC,CAAC,CAAC,aAAa,EAAU,CAAA"}
|