@wagmi/connectors 3.1.1 → 4.0.0-alpha.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/dist/esm/coinbaseWallet.js +141 -0
- package/dist/esm/coinbaseWallet.js.map +1 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/index.test-d.js +4 -0
- package/dist/esm/index.test-d.js.map +1 -0
- package/dist/esm/injected.js +372 -0
- package/dist/esm/injected.js.map +1 -0
- package/dist/esm/ledger.js +162 -0
- package/dist/esm/ledger.js.map +1 -0
- package/dist/esm/safe.js +88 -0
- package/dist/esm/safe.js.map +1 -0
- package/dist/esm/tsconfig.build.tsbuildinfo +1 -0
- package/dist/esm/version.js +2 -0
- package/dist/esm/version.js.map +1 -0
- package/dist/esm/walletConnect.js +280 -0
- package/dist/esm/walletConnect.js.map +1 -0
- package/dist/types/coinbaseWallet.d.ts +21 -0
- package/dist/types/coinbaseWallet.d.ts.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.test-d.d.ts +2 -0
- package/dist/types/index.test-d.d.ts.map +1 -0
- package/dist/types/injected.d.ts +382 -0
- package/dist/types/injected.d.ts.map +1 -0
- package/dist/types/ledger.d.ts +18 -0
- package/dist/types/ledger.d.ts.map +1 -0
- package/dist/types/safe.d.ts +18 -0
- package/dist/types/safe.d.ts.map +1 -0
- package/dist/types/version.d.ts +2 -0
- package/dist/types/version.d.ts.map +1 -0
- package/dist/types/walletConnect.d.ts +63 -0
- package/dist/types/walletConnect.d.ts.map +1 -0
- package/package.json +44 -83
- package/src/coinbaseWallet.ts +207 -0
- package/src/index.ts +17 -0
- package/src/injected.ts +535 -0
- package/src/ledger.ts +210 -0
- package/src/safe.ts +114 -0
- package/src/version.ts +1 -0
- package/src/walletConnect.ts +394 -0
- package/README.md +0 -46
- package/coinbaseWallet/package.json +0 -4
- package/dist/base-70e3a8a9.d.ts +0 -142
- package/dist/chunk-2UFLHRLT.js +0 -391
- package/dist/chunk-OQILYQDO.js +0 -15
- package/dist/chunk-UGBGYVBH.js +0 -22
- package/dist/chunk-W65LBPLT.js +0 -58
- package/dist/coinbaseWallet.d.ts +0 -62
- package/dist/coinbaseWallet.js +0 -216
- package/dist/index.d.ts +0 -20
- package/dist/index.js +0 -16
- package/dist/injected.d.ts +0 -64
- package/dist/injected.js +0 -9
- package/dist/ledger.d.ts +0 -69
- package/dist/ledger.js +0 -261
- package/dist/metaMask.d.ts +0 -33
- package/dist/metaMask.js +0 -144
- package/dist/mock/index.d.ts +0 -80
- package/dist/mock/index.js +0 -200
- package/dist/safe.d.ts +0 -53
- package/dist/safe.js +0 -129
- package/dist/walletConnect.d.ts +0 -109
- package/dist/walletConnect.js +0 -325
- package/dist/walletConnectLegacy.d.ts +0 -38
- package/dist/walletConnectLegacy.js +0 -179
- package/injected/package.json +0 -4
- package/ledger/package.json +0 -4
- package/metaMask/package.json +0 -4
- package/mock/package.json +0 -4
- package/safe/package.json +0 -4
- package/walletConnect/package.json +0 -4
- 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
|
+
}
|
package/src/index.ts
ADDED
|
@@ -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'
|