@wagmi/connectors 3.1.1 → 4.0.0-alpha.1

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.
Files changed (73) hide show
  1. package/README.md +6 -39
  2. package/dist/esm/coinbaseWallet.js +141 -0
  3. package/dist/esm/coinbaseWallet.js.map +1 -0
  4. package/dist/esm/exports/index.js +7 -0
  5. package/dist/esm/exports/index.js.map +1 -0
  6. package/dist/esm/exports/index.test-d.js +4 -0
  7. package/dist/esm/exports/index.test-d.js.map +1 -0
  8. package/dist/esm/injected.js +372 -0
  9. package/dist/esm/injected.js.map +1 -0
  10. package/dist/esm/ledger.js +162 -0
  11. package/dist/esm/ledger.js.map +1 -0
  12. package/dist/esm/safe.js +88 -0
  13. package/dist/esm/safe.js.map +1 -0
  14. package/dist/esm/tsconfig.build.tsbuildinfo +1 -0
  15. package/dist/esm/version.js +2 -0
  16. package/dist/esm/version.js.map +1 -0
  17. package/dist/esm/walletConnect.js +280 -0
  18. package/dist/esm/walletConnect.js.map +1 -0
  19. package/dist/types/coinbaseWallet.d.ts +21 -0
  20. package/dist/types/coinbaseWallet.d.ts.map +1 -0
  21. package/dist/types/exports/index.d.ts +7 -0
  22. package/dist/types/exports/index.d.ts.map +1 -0
  23. package/dist/types/exports/index.test-d.d.ts +2 -0
  24. package/dist/types/exports/index.test-d.d.ts.map +1 -0
  25. package/dist/types/injected.d.ts +382 -0
  26. package/dist/types/injected.d.ts.map +1 -0
  27. package/dist/types/ledger.d.ts +18 -0
  28. package/dist/types/ledger.d.ts.map +1 -0
  29. package/dist/types/safe.d.ts +18 -0
  30. package/dist/types/safe.d.ts.map +1 -0
  31. package/dist/types/version.d.ts +2 -0
  32. package/dist/types/version.d.ts.map +1 -0
  33. package/dist/types/walletConnect.d.ts +63 -0
  34. package/dist/types/walletConnect.d.ts.map +1 -0
  35. package/package.json +43 -82
  36. package/src/coinbaseWallet.ts +207 -0
  37. package/src/exports/index.ts +17 -0
  38. package/src/injected.ts +535 -0
  39. package/src/ledger.ts +210 -0
  40. package/src/safe.ts +114 -0
  41. package/src/version.ts +1 -0
  42. package/src/walletConnect.ts +394 -0
  43. package/coinbaseWallet/package.json +0 -4
  44. package/dist/base-70e3a8a9.d.ts +0 -142
  45. package/dist/chunk-2UFLHRLT.js +0 -391
  46. package/dist/chunk-OQILYQDO.js +0 -15
  47. package/dist/chunk-UGBGYVBH.js +0 -22
  48. package/dist/chunk-W65LBPLT.js +0 -58
  49. package/dist/coinbaseWallet.d.ts +0 -62
  50. package/dist/coinbaseWallet.js +0 -216
  51. package/dist/index.d.ts +0 -20
  52. package/dist/index.js +0 -16
  53. package/dist/injected.d.ts +0 -64
  54. package/dist/injected.js +0 -9
  55. package/dist/ledger.d.ts +0 -69
  56. package/dist/ledger.js +0 -261
  57. package/dist/metaMask.d.ts +0 -33
  58. package/dist/metaMask.js +0 -144
  59. package/dist/mock/index.d.ts +0 -80
  60. package/dist/mock/index.js +0 -200
  61. package/dist/safe.d.ts +0 -53
  62. package/dist/safe.js +0 -129
  63. package/dist/walletConnect.d.ts +0 -109
  64. package/dist/walletConnect.js +0 -325
  65. package/dist/walletConnectLegacy.d.ts +0 -38
  66. package/dist/walletConnectLegacy.js +0 -179
  67. package/injected/package.json +0 -4
  68. package/ledger/package.json +0 -4
  69. package/metaMask/package.json +0 -4
  70. package/mock/package.json +0 -4
  71. package/safe/package.json +0 -4
  72. package/walletConnect/package.json +0 -4
  73. package/walletConnectLegacy/package.json +0 -4
@@ -0,0 +1,207 @@
1
+ import {
2
+ type CoinbaseWalletProvider,
3
+ CoinbaseWalletSDK,
4
+ } from '@coinbase/wallet-sdk'
5
+ import {
6
+ ChainNotConfiguredError,
7
+ createConnector,
8
+ normalizeChainId,
9
+ } from '@wagmi/core'
10
+ import type { Evaluate, Mutable, Omit } from '@wagmi/core/internal'
11
+ import {
12
+ type ProviderRpcError,
13
+ SwitchChainError,
14
+ UserRejectedRequestError,
15
+ getAddress,
16
+ numberToHex,
17
+ } from 'viem'
18
+
19
+ export type CoinbaseWalletParameters = Evaluate<
20
+ Mutable<
21
+ Omit<
22
+ ConstructorParameters<typeof CoinbaseWalletSDK>[0],
23
+ 'reloadOnDisconnect' // remove property since TSDoc says default is `true`
24
+ >
25
+ > & {
26
+ /**
27
+ * Fallback Ethereum JSON RPC URL
28
+ * @default ""
29
+ */
30
+ jsonRpcUrl?: string | undefined
31
+ /**
32
+ * Fallback Ethereum Chain ID
33
+ * @default 1
34
+ */
35
+ chainId?: number | undefined
36
+ /**
37
+ * Whether or not to reload dapp automatically after disconnect.
38
+ * @default false
39
+ */
40
+ reloadOnDisconnect?: boolean | undefined
41
+ }
42
+ >
43
+
44
+ export function coinbaseWallet(parameters: CoinbaseWalletParameters) {
45
+ const reloadOnDisconnect = false
46
+
47
+ type Provider = CoinbaseWalletProvider
48
+ type Properties = {}
49
+
50
+ let sdk: CoinbaseWalletSDK | undefined
51
+ let provider_: Provider | undefined
52
+
53
+ return createConnector<Provider, Properties>((config) => ({
54
+ id: 'coinbaseWallet',
55
+ name: 'Coinbase Wallet',
56
+ async connect({ chainId } = {}) {
57
+ try {
58
+ const provider = await this.getProvider()
59
+ const accounts = (
60
+ (await provider.request({
61
+ method: 'eth_requestAccounts',
62
+ })) as string[]
63
+ ).map(getAddress)
64
+ provider.on('accountsChanged', this.onAccountsChanged)
65
+ provider.on('chainChanged', this.onChainChanged)
66
+ provider.on('disconnect', this.onDisconnect.bind(this))
67
+
68
+ // Switch to chain if provided
69
+ let currentChainId = await this.getChainId()
70
+ if (chainId && currentChainId !== chainId) {
71
+ const chain = await this.switchChain!({ chainId }).catch(() => ({
72
+ id: currentChainId,
73
+ }))
74
+ currentChainId = chain?.id ?? currentChainId
75
+ }
76
+
77
+ return { accounts, chainId: currentChainId }
78
+ } catch (error) {
79
+ if (
80
+ /(user closed modal|accounts received is empty)/i.test(
81
+ (error as Error).message,
82
+ )
83
+ )
84
+ throw new UserRejectedRequestError(error as Error)
85
+ throw error
86
+ }
87
+ },
88
+ async disconnect() {
89
+ const provider = await this.getProvider()
90
+
91
+ provider.removeListener('accountsChanged', this.onAccountsChanged)
92
+ provider.removeListener('chainChanged', this.onChainChanged)
93
+ provider.removeListener('disconnect', this.onDisconnect.bind(this))
94
+
95
+ provider.disconnect()
96
+ provider.close()
97
+ },
98
+ async getAccounts() {
99
+ const provider = await this.getProvider()
100
+ return (
101
+ await provider.request<string[]>({
102
+ method: 'eth_accounts',
103
+ })
104
+ ).map(getAddress)
105
+ },
106
+ async getProvider() {
107
+ if (!provider_) {
108
+ sdk = new CoinbaseWalletSDK({ reloadOnDisconnect, ...parameters })
109
+
110
+ /**
111
+ * Mock implementations to retrieve private `walletExtension` method
112
+ * from the Coinbase Wallet SDK.
113
+ */
114
+ abstract class WalletProvider {
115
+ // https://github.com/coinbase/coinbase-wallet-sdk/blob/b4cca90022ffeb46b7bbaaab9389a33133fe0844/packages/wallet-sdk/src/provider/CoinbaseWalletProvider.ts#L927-L936
116
+ abstract getChainId(): number
117
+ }
118
+ abstract class SDK {
119
+ // https://github.com/coinbase/coinbase-wallet-sdk/blob/b4cca90022ffeb46b7bbaaab9389a33133fe0844/packages/wallet-sdk/src/CoinbaseWalletSDK.ts#L233-L235
120
+ abstract get walletExtension(): WalletProvider | undefined
121
+ }
122
+ const walletExtensionChainId = (
123
+ sdk as unknown as SDK
124
+ ).walletExtension?.getChainId()
125
+
126
+ const chain =
127
+ config.chains.find((chain) =>
128
+ parameters.chainId
129
+ ? chain.id === parameters.chainId
130
+ : chain.id === walletExtensionChainId,
131
+ ) || config.chains[0]
132
+ const chainId = parameters.chainId || chain?.id
133
+ const jsonRpcUrl =
134
+ parameters.jsonRpcUrl || chain?.rpcUrls.default.http[0]
135
+
136
+ provider_ = sdk.makeWeb3Provider(jsonRpcUrl, chainId)
137
+ }
138
+ return provider_
139
+ },
140
+ async getChainId() {
141
+ const provider = await this.getProvider()
142
+ return normalizeChainId(provider.chainId)
143
+ },
144
+ async isAuthorized() {
145
+ try {
146
+ const accounts = await this.getAccounts()
147
+ return !!accounts.length
148
+ } catch {
149
+ return false
150
+ }
151
+ },
152
+ async switchChain({ chainId }) {
153
+ const chain = config.chains.find((chain) => chain.id === chainId)
154
+ if (!chain) throw new SwitchChainError(new ChainNotConfiguredError())
155
+
156
+ const provider = await this.getProvider()
157
+ const chainId_ = numberToHex(chain.id)
158
+
159
+ try {
160
+ await provider.request({
161
+ method: 'wallet_switchEthereumChain',
162
+ params: [{ chainId: chainId_ }],
163
+ })
164
+ return chain
165
+ } catch (error) {
166
+ // Indicates chain is not added to provider
167
+ if ((error as ProviderRpcError).code === 4902) {
168
+ try {
169
+ await provider.request({
170
+ method: 'wallet_addEthereumChain',
171
+ params: [
172
+ {
173
+ chainId: chainId_,
174
+ chainName: chain.name,
175
+ nativeCurrency: chain.nativeCurrency,
176
+ rpcUrls: [chain.rpcUrls.public?.http[0] ?? ''],
177
+ blockExplorerUrls: [chain.blockExplorers?.default],
178
+ },
179
+ ],
180
+ })
181
+ return chain
182
+ } catch (error) {
183
+ throw new UserRejectedRequestError(error as Error)
184
+ }
185
+ }
186
+
187
+ throw new SwitchChainError(error as Error)
188
+ }
189
+ },
190
+ onAccountsChanged(accounts) {
191
+ if (accounts.length === 0) config.emitter.emit('disconnect')
192
+ else config.emitter.emit('change', { accounts: accounts.map(getAddress) })
193
+ },
194
+ onChainChanged(chain) {
195
+ const chainId = normalizeChainId(chain)
196
+ config.emitter.emit('change', { chainId })
197
+ },
198
+ async onDisconnect(_error) {
199
+ config.emitter.emit('disconnect')
200
+
201
+ const provider = await this.getProvider()
202
+ provider.removeListener('accountsChanged', this.onAccountsChanged)
203
+ provider.removeListener('chainChanged', this.onChainChanged)
204
+ provider.removeListener('disconnect', this.onDisconnect.bind(this))
205
+ },
206
+ }))
207
+ }
@@ -0,0 +1,17 @@
1
+ export {
2
+ type CoinbaseWalletParameters,
3
+ coinbaseWallet,
4
+ } from '../coinbaseWallet.js'
5
+
6
+ export { type InjectedParameters, injected } from '../injected.js'
7
+
8
+ export { type LedgerParameters, ledger } from '../ledger.js'
9
+
10
+ export { type SafeParameters, safe } from '../safe.js'
11
+
12
+ export {
13
+ type WalletConnectParameters,
14
+ walletConnect,
15
+ } from '../walletConnect.js'
16
+
17
+ export { version } from '../version.js'