@wagmi/connectors 5.9.2 → 5.9.4

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.9.2';
1
+ export const version = '5.9.4';
2
2
  //# sourceMappingURL=version.js.map
@@ -1,6 +1,7 @@
1
1
  export { type InjectedParameters, injected, type MockParameters, mock, } from '@wagmi/core';
2
2
  export { type BaseAccountParameters, baseAccount } from '../baseAccount.js';
3
3
  export { type CoinbaseWalletParameters, coinbaseWallet, } from '../coinbaseWallet.js';
4
+ export { type GeminiParameters, gemini } from '../gemini.js';
4
5
  export { type MetaMaskParameters, metaMask } from '../metaMask.js';
5
6
  export { type SafeParameters, safe } from '../safe.js';
6
7
  export { version } from '../version.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,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;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EACL,KAAK,uBAAuB,EAC5B,aAAa,GACd,MAAM,qBAAqB,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;AAC7B,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC5D,OAAO,EAAE,KAAK,kBAAkB,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAClE,OAAO,EAAE,KAAK,cAAc,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EACL,KAAK,uBAAuB,EAC5B,aAAa,GACd,MAAM,qBAAqB,CAAA"}
@@ -0,0 +1,18 @@
1
+ import type { AppMetadata } from '@gemini-wallet/core';
2
+ import type { Address } from 'viem';
3
+ export type GeminiParameters = {
4
+ appMetadata?: AppMetadata;
5
+ };
6
+ export declare function gemini(parameters?: GeminiParameters): import("@wagmi/core").CreateConnectorFn<ProviderInterface, {
7
+ connect(parameters?: {
8
+ chainId?: number | undefined;
9
+ isReconnecting?: boolean | undefined;
10
+ }): Promise<{
11
+ accounts: readonly Address[];
12
+ chainId: number;
13
+ }>;
14
+ }, Record<string, unknown>>;
15
+ export declare namespace gemini {
16
+ var type: "gemini";
17
+ }
18
+ //# sourceMappingURL=gemini.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAqB,MAAM,qBAAqB,CAAA;AAOzE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAQnC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,CAAC,EAAE,WAAW,CAAA;CAC1B,CAAA;AAGD,wBAAgB,MAAM,CAAC,UAAU,GAAE,gBAAqB;yBAG/B;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;4BAyJL;yBAlKe,MAAM"}
@@ -1,2 +1,2 @@
1
- export declare const version = "5.9.2";
1
+ export declare const version = "5.9.4";
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.9.2",
4
+ "version": "5.9.4",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
@@ -40,6 +40,7 @@
40
40
  "dependencies": {
41
41
  "@base-org/account": "1.1.1",
42
42
  "@coinbase/wallet-sdk": "4.3.6",
43
+ "@gemini-wallet/core": "0.2.0",
43
44
  "@metamask/sdk": "0.32.0",
44
45
  "@safe-global/safe-apps-provider": "0.18.6",
45
46
  "@safe-global/safe-apps-sdk": "9.1.0",
@@ -12,9 +12,8 @@ export {
12
12
  type CoinbaseWalletParameters,
13
13
  coinbaseWallet,
14
14
  } from '../coinbaseWallet.js'
15
-
15
+ export { type GeminiParameters, gemini } from '../gemini.js'
16
16
  export { type MetaMaskParameters, metaMask } from '../metaMask.js'
17
-
18
17
  export { type SafeParameters, safe } from '../safe.js'
19
18
  export { version } from '../version.js'
20
19
  export {
package/src/gemini.ts ADDED
@@ -0,0 +1,183 @@
1
+ import type { AppMetadata, ProviderInterface } from '@gemini-wallet/core'
2
+ import { GeminiWalletProvider } from '@gemini-wallet/core'
3
+ import {
4
+ ChainNotConfiguredError,
5
+ type Connector,
6
+ createConnector,
7
+ } from '@wagmi/core'
8
+ import type { Address } from 'viem'
9
+ import {
10
+ getAddress,
11
+ numberToHex,
12
+ SwitchChainError,
13
+ UserRejectedRequestError,
14
+ } from 'viem'
15
+
16
+ export type GeminiParameters = {
17
+ appMetadata?: AppMetadata
18
+ }
19
+
20
+ gemini.type = 'gemini' as const
21
+ export function gemini(parameters: GeminiParameters = {}) {
22
+ type Provider = ProviderInterface
23
+ type Properties = {
24
+ connect(parameters?: {
25
+ chainId?: number | undefined
26
+ isReconnecting?: boolean | undefined
27
+ }): Promise<{
28
+ accounts: readonly Address[]
29
+ chainId: number
30
+ }>
31
+ }
32
+
33
+ let walletProvider: Provider | undefined
34
+ let onAccountsChanged: Connector['onAccountsChanged'] | undefined
35
+ let onChainChanged: Connector['onChainChanged'] | undefined
36
+ let onDisconnect: Connector['onDisconnect'] | undefined
37
+
38
+ return createConnector<Provider, Properties>((config) => ({
39
+ id: 'gemini',
40
+ name: 'Gemini Wallet',
41
+ type: gemini.type,
42
+ icon: 'https://keys.gemini.com/images/gemini-wallet-logo.svg',
43
+ async connect({ chainId } = {}) {
44
+ try {
45
+ const provider = await this.getProvider()
46
+ const accounts = (await provider.request({
47
+ method: 'eth_requestAccounts',
48
+ })) as string[]
49
+
50
+ if (!onAccountsChanged) {
51
+ onAccountsChanged = this.onAccountsChanged.bind(this)
52
+ provider.on('accountsChanged', onAccountsChanged)
53
+ }
54
+ if (!onChainChanged) {
55
+ onChainChanged = this.onChainChanged.bind(this)
56
+ provider.on('chainChanged', onChainChanged)
57
+ }
58
+ if (!onDisconnect) {
59
+ onDisconnect = this.onDisconnect.bind(this)
60
+ provider.on('disconnect', onDisconnect)
61
+ }
62
+
63
+ let currentChainId = await this.getChainId()
64
+ if (chainId && currentChainId !== chainId) {
65
+ const chain = await this.switchChain!({ chainId }).catch((error) => {
66
+ if (error.code === UserRejectedRequestError.code) throw error
67
+ return { id: currentChainId }
68
+ })
69
+ currentChainId = chain?.id ?? currentChainId
70
+ }
71
+
72
+ return {
73
+ accounts: accounts.map((x) => getAddress(x)),
74
+ chainId: currentChainId,
75
+ }
76
+ } catch (error) {
77
+ if (
78
+ /(user closed modal|accounts received is empty|user denied account|request rejected)/i.test(
79
+ (error as Error).message,
80
+ )
81
+ )
82
+ throw new UserRejectedRequestError(error as Error)
83
+ throw error
84
+ }
85
+ },
86
+ async disconnect() {
87
+ const provider = await this.getProvider()
88
+
89
+ if (onAccountsChanged) {
90
+ provider.removeListener('accountsChanged', onAccountsChanged)
91
+ onAccountsChanged = undefined
92
+ }
93
+ if (onChainChanged) {
94
+ provider.removeListener('chainChanged', onChainChanged)
95
+ onChainChanged = undefined
96
+ }
97
+ if (onDisconnect) {
98
+ provider.removeListener('disconnect', onDisconnect)
99
+ onDisconnect = undefined
100
+ }
101
+
102
+ await provider.disconnect()
103
+ },
104
+ async getAccounts() {
105
+ const provider = await this.getProvider()
106
+ const accounts = (await provider.request({
107
+ method: 'eth_accounts',
108
+ })) as string[]
109
+ return accounts.map((x) => getAddress(x))
110
+ },
111
+ async getChainId() {
112
+ const provider = await this.getProvider()
113
+ const chainId = (await provider.request({
114
+ method: 'eth_chainId',
115
+ })) as string
116
+ return Number(chainId)
117
+ },
118
+ async getProvider() {
119
+ if (!walletProvider) {
120
+ walletProvider = new GeminiWalletProvider({
121
+ appMetadata: parameters.appMetadata ?? {},
122
+ chain: {
123
+ id: config.chains[0]?.id ?? 1,
124
+ rpcUrl: config.chains[0]?.rpcUrls?.default?.http[0],
125
+ },
126
+ })
127
+ }
128
+ return walletProvider
129
+ },
130
+ async isAuthorized() {
131
+ try {
132
+ const accounts = await this.getAccounts()
133
+ return Boolean(accounts.length)
134
+ } catch {
135
+ return false
136
+ }
137
+ },
138
+ async switchChain({ chainId }) {
139
+ const chain = config.chains.find((chain) => chain.id === chainId)
140
+ if (!chain) throw new SwitchChainError(new ChainNotConfiguredError())
141
+
142
+ const provider = await this.getProvider()
143
+
144
+ try {
145
+ await provider.request({
146
+ method: 'wallet_switchEthereumChain',
147
+ params: [{ chainId: numberToHex(chainId) }],
148
+ })
149
+ return chain
150
+ } catch (error) {
151
+ throw new SwitchChainError(error as Error)
152
+ }
153
+ },
154
+ onAccountsChanged(accounts) {
155
+ if (accounts.length === 0) this.onDisconnect()
156
+ else
157
+ config.emitter.emit('change', {
158
+ accounts: accounts.map((x: string) => getAddress(x)),
159
+ })
160
+ },
161
+ onChainChanged(chain) {
162
+ const chainId = Number(chain)
163
+ config.emitter.emit('change', { chainId })
164
+ },
165
+ async onDisconnect() {
166
+ config.emitter.emit('disconnect')
167
+
168
+ const provider = await this.getProvider()
169
+ if (onAccountsChanged) {
170
+ provider.removeListener('accountsChanged', onAccountsChanged)
171
+ onAccountsChanged = undefined
172
+ }
173
+ if (onChainChanged) {
174
+ provider.removeListener('chainChanged', onChainChanged)
175
+ onChainChanged = undefined
176
+ }
177
+ if (onDisconnect) {
178
+ provider.removeListener('disconnect', onDisconnect)
179
+ onDisconnect = undefined
180
+ }
181
+ },
182
+ }))
183
+ }
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = '5.9.2'
1
+ export const version = '5.9.4'