@wagmi/connectors 0.1.2 → 0.1.3

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/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2022 wagmi
3
+ Copyright (c) 2022 awkweb.eth
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -2,7 +2,7 @@ import { Chain } from '@wagmi/core/chains';
2
2
  import { Address } from 'abitype';
3
3
  import EventEmitter from 'eventemitter3';
4
4
 
5
- declare type ConnectorData<Provider = any> = {
5
+ type ConnectorData<Provider = any> = {
6
6
  account?: Address;
7
7
  chain?: {
8
8
  id: number;
@@ -2,11 +2,11 @@ import { CoinbaseWalletProvider } from '@coinbase/wallet-sdk';
2
2
  import { CoinbaseWalletSDKOptions } from '@coinbase/wallet-sdk/dist/CoinbaseWalletSDK';
3
3
  import { Chain } from '@wagmi/core/chains';
4
4
  import { providers } from 'ethers';
5
- import { C as Connector } from './base-6b5431a5.js';
5
+ import { C as Connector } from './base-caae9601.js';
6
6
  import 'abitype';
7
7
  import 'eventemitter3';
8
8
 
9
- declare type Options = CoinbaseWalletSDKOptions & {
9
+ type Options = CoinbaseWalletSDKOptions & {
10
10
  /**
11
11
  * Fallback Ethereum JSON RPC URL
12
12
  * @default ""
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { C as Connector, a as ConnectorData, b as ConnectorEvents } from './base-6b5431a5.js';
1
+ export { C as Connector, a as ConnectorData, b as ConnectorEvents } from './base-caae9601.js';
2
2
  import '@wagmi/core/chains';
3
3
  import 'abitype';
4
4
  import 'eventemitter3';
@@ -1,11 +1,11 @@
1
- import * as _wagmi_core_dist_index_971cda79 from '@wagmi/core/dist/index-971cda79';
1
+ import * as _wagmi_core_dist_index_37d6352e from '@wagmi/core/dist/index-37d6352e';
2
2
  import { Chain } from '@wagmi/core/chains';
3
3
  import { Address } from 'abitype';
4
4
  import { providers } from 'ethers';
5
- import { C as Connector } from './base-6b5431a5.js';
5
+ import { C as Connector } from './base-caae9601.js';
6
6
  import 'eventemitter3';
7
7
 
8
- declare type InjectedConnectorOptions = {
8
+ type InjectedConnectorOptions = {
9
9
  /** Name of connector */
10
10
  name?: string | ((detectedName: string | string[]) => string);
11
11
  /**
@@ -27,7 +27,7 @@ declare type InjectedConnectorOptions = {
27
27
  */
28
28
  shimDisconnect?: boolean;
29
29
  };
30
- declare type ConnectorOptions = InjectedConnectorOptions & Required<Pick<InjectedConnectorOptions, 'getProvider'>>;
30
+ type ConnectorOptions = InjectedConnectorOptions & Required<Pick<InjectedConnectorOptions, 'getProvider'>>;
31
31
  declare class InjectedConnector extends Connector<Window['ethereum'], ConnectorOptions, providers.JsonRpcSigner> {
32
32
  #private;
33
33
  readonly id: string;
@@ -46,12 +46,12 @@ declare class InjectedConnector extends Connector<Window['ethereum'], ConnectorO
46
46
  id: number;
47
47
  unsupported: boolean;
48
48
  };
49
- provider: _wagmi_core_dist_index_971cda79.E;
49
+ provider: _wagmi_core_dist_index_37d6352e.E;
50
50
  }>;
51
51
  disconnect(): Promise<void>;
52
52
  getAccount(): Promise<`0x${string}`>;
53
53
  getChainId(): Promise<number>;
54
- getProvider(): Promise<_wagmi_core_dist_index_971cda79.E | undefined>;
54
+ getProvider(): Promise<_wagmi_core_dist_index_37d6352e.E | undefined>;
55
55
  getSigner({ chainId }?: {
56
56
  chainId?: number;
57
57
  }): Promise<providers.JsonRpcSigner>;
package/dist/ledger.d.ts CHANGED
@@ -1,12 +1,12 @@
1
1
  import { EthereumProvider } from '@ledgerhq/connect-kit-loader';
2
2
  import { Chain } from '@wagmi/core';
3
3
  import { providers } from 'ethers';
4
- import { C as Connector, a as ConnectorData } from './base-6b5431a5.js';
4
+ import { C as Connector, a as ConnectorData } from './base-caae9601.js';
5
5
  import '@wagmi/core/chains';
6
6
  import 'abitype';
7
7
  import 'eventemitter3';
8
8
 
9
- declare type LedgerConnectorOptions = {
9
+ type LedgerConnectorOptions = {
10
10
  bridge?: string;
11
11
  chainId?: number;
12
12
  enableDebugLogs?: boolean;
@@ -14,7 +14,7 @@ declare type LedgerConnectorOptions = {
14
14
  [chainId: number]: string;
15
15
  };
16
16
  };
17
- declare type LedgerSigner = providers.JsonRpcSigner;
17
+ type LedgerSigner = providers.JsonRpcSigner;
18
18
  declare class LedgerConnector extends Connector<EthereumProvider, LedgerConnectorOptions, LedgerSigner> {
19
19
  #private;
20
20
  readonly id = "ledger";
@@ -1,13 +1,13 @@
1
1
  import { Ethereum } from '@wagmi/core';
2
2
  import { Chain } from '@wagmi/core/chains';
3
3
  import { InjectedConnectorOptions, InjectedConnector } from './injected.js';
4
- import '@wagmi/core/dist/index-971cda79';
4
+ import '@wagmi/core/dist/index-37d6352e';
5
5
  import 'abitype';
6
6
  import 'ethers';
7
- import './base-6b5431a5.js';
7
+ import './base-caae9601.js';
8
8
  import 'eventemitter3';
9
9
 
10
- declare type MetaMaskConnectorOptions = Pick<InjectedConnectorOptions, 'shimChainChangedDisconnect' | 'shimDisconnect'> & {
10
+ type MetaMaskConnectorOptions = Pick<InjectedConnectorOptions, 'shimChainChangedDisconnect' | 'shimDisconnect'> & {
11
11
  /**
12
12
  * While "disconnected" with `shimDisconnect`, allows user to select a different MetaMask account (than the currently connected account) when trying to connect.
13
13
  */
@@ -1,12 +1,12 @@
1
1
  import * as ethers from 'ethers';
2
2
  import { providers } from 'ethers';
3
3
  import { Chain } from '@wagmi/core/chains';
4
- import { C as Connector, a as ConnectorData } from '../base-6b5431a5.js';
4
+ import { C as Connector, a as ConnectorData } from '../base-caae9601.js';
5
5
  import { Signer } from '@wagmi/core';
6
6
  import EventEmitter from 'eventemitter3';
7
7
  import 'abitype';
8
8
 
9
- declare type MockProviderOptions = {
9
+ type MockProviderOptions = {
10
10
  chainId: number;
11
11
  flags?: {
12
12
  isAuthorized?: boolean;
@@ -16,12 +16,12 @@ declare type MockProviderOptions = {
16
16
  };
17
17
  signer: Signer;
18
18
  };
19
- declare type Events = {
19
+ type Events = {
20
20
  accountsChanged(accounts: string[]): void;
21
21
  chainChanged(chainId: number | string): void;
22
22
  disconnect(): void;
23
23
  };
24
- declare type Event = keyof Events;
24
+ type Event = keyof Events;
25
25
  declare class MockProvider extends providers.BaseProvider {
26
26
  #private;
27
27
  events: EventEmitter<Events, any>;
@@ -44,7 +44,7 @@ declare class MockProvider extends providers.BaseProvider {
44
44
  toJSON(): string;
45
45
  }
46
46
 
47
- declare type MockConnectorOptions = Omit<MockProviderOptions, 'chainId'> & {
47
+ type MockConnectorOptions = Omit<MockProviderOptions, 'chainId'> & {
48
48
  chainId?: number;
49
49
  };
50
50
  declare class MockConnector extends Connector<MockProvider, MockConnectorOptions> {
@@ -1,13 +1,28 @@
1
- import { Chain } from '@wagmi/core/chains';
1
+ import * as _walletconnect_universal_provider from '@walletconnect/universal-provider';
2
+ import { UniversalProvider as UniversalProvider$1, UniversalProviderOpts } from '@walletconnect/universal-provider';
3
+ import { Chain } from '@wagmi/core';
2
4
  import WalletConnectProvider from '@walletconnect/ethereum-provider';
3
5
  import { providers } from 'ethers';
4
- import { C as Connector } from './base-6b5431a5.js';
6
+ import { C as Connector } from './base-caae9601.js';
7
+ import '@wagmi/core/chains';
5
8
  import 'abitype';
6
9
  import 'eventemitter3';
7
10
 
8
- declare type WalletConnectOptions = ConstructorParameters<typeof WalletConnectProvider>[0];
9
- declare type WalletConnectSigner = providers.JsonRpcSigner;
10
- declare class WalletConnectConnector extends Connector<WalletConnectProvider, WalletConnectOptions, WalletConnectSigner> {
11
+ type UniversalProvider = InstanceType<typeof UniversalProvider$1>;
12
+ type WalletConnectOptions = {
13
+ /** When `true`, uses default WalletConnect QR Code modal */
14
+ qrcode?: boolean;
15
+ } & (({
16
+ version?: '1';
17
+ } & ConstructorParameters<typeof WalletConnectProvider>[0]) | ({
18
+ /**
19
+ * Project ID associated with [WalletConnect account](https://cloud.walletconnect.com)
20
+ */
21
+ projectId: NonNullable<UniversalProviderOpts['projectId']>;
22
+ version: '2';
23
+ } & Omit<UniversalProviderOpts, 'projectId'>));
24
+ type WalletConnectSigner = providers.JsonRpcSigner;
25
+ declare class WalletConnectConnector extends Connector<WalletConnectProvider | UniversalProvider, WalletConnectOptions, WalletConnectSigner> {
11
26
  #private;
12
27
  readonly id = "walletConnect";
13
28
  readonly name = "WalletConnect";
@@ -16,6 +31,7 @@ declare class WalletConnectConnector extends Connector<WalletConnectProvider, Wa
16
31
  chains?: Chain[];
17
32
  options: WalletConnectOptions;
18
33
  });
34
+ get version(): "1" | "2" | undefined;
19
35
  connect({ chainId }?: {
20
36
  chainId?: number;
21
37
  }): Promise<{
@@ -32,7 +48,7 @@ declare class WalletConnectConnector extends Connector<WalletConnectProvider, Wa
32
48
  getProvider({ chainId, create, }?: {
33
49
  chainId?: number;
34
50
  create?: boolean;
35
- }): Promise<WalletConnectProvider>;
51
+ }): Promise<_walletconnect_universal_provider.default | WalletConnectProvider>;
36
52
  getSigner({ chainId }?: {
37
53
  chainId?: number;
38
54
  }): Promise<providers.JsonRpcSigner>;
@@ -40,6 +56,7 @@ declare class WalletConnectConnector extends Connector<WalletConnectProvider, Wa
40
56
  protected onAccountsChanged: (accounts: string[]) => void;
41
57
  protected onChainChanged: (chainId: number | string) => void;
42
58
  protected onDisconnect: () => void;
59
+ protected onDisplayUri: (uri: string) => void;
43
60
  }
44
61
 
45
62
  export { WalletConnectConnector };
@@ -16,11 +16,22 @@ import {
16
16
  } from "@wagmi/core";
17
17
  import { providers } from "ethers";
18
18
  import { getAddress, hexValue } from "ethers/lib/utils.js";
19
- var switchChainAllowedRegex = /(imtoken|metamask|rainbow|trust wallet)/i;
20
- var _provider, _switchChain, switchChain_fn;
19
+ var defaultV2Config = {
20
+ namespace: "eip155",
21
+ methods: [
22
+ "eth_sendTransaction",
23
+ "eth_sign",
24
+ "eth_signTransaction",
25
+ "eth_signTypedData",
26
+ "personal_sign"
27
+ ],
28
+ events: ["accountsChanged", "chainChanged"]
29
+ };
30
+ var _provider, _isChainsAuthorized, isChainsAuthorized_fn, _switchChain, switchChain_fn;
21
31
  var WalletConnectConnector = class extends Connector {
22
32
  constructor(config) {
23
33
  super(config);
34
+ __privateAdd(this, _isChainsAuthorized);
24
35
  __privateAdd(this, _switchChain);
25
36
  __publicField(this, "id", "walletConnect");
26
37
  __publicField(this, "name", "WalletConnect");
@@ -40,6 +51,14 @@ var WalletConnectConnector = class extends Connector {
40
51
  __publicField(this, "onDisconnect", () => {
41
52
  this.emit("disconnect");
42
53
  });
54
+ __publicField(this, "onDisplayUri", (uri) => {
55
+ this.emit("message", { type: "display_uri", data: uri });
56
+ });
57
+ }
58
+ get version() {
59
+ if ("version" in this.options)
60
+ return this.options.version;
61
+ return "1";
43
62
  }
44
63
  async connect({ chainId } = {}) {
45
64
  try {
@@ -56,13 +75,69 @@ var WalletConnectConnector = class extends Connector {
56
75
  provider.on("accountsChanged", this.onAccountsChanged);
57
76
  provider.on("chainChanged", this.onChainChanged);
58
77
  provider.on("disconnect", this.onDisconnect);
78
+ if (this.version === "2") {
79
+ provider.on("session_delete", this.onDisconnect);
80
+ provider.on("display_uri", this.onDisplayUri);
81
+ const isChainsAuthorized = await __privateMethod(this, _isChainsAuthorized, isChainsAuthorized_fn).call(this);
82
+ if (provider.session && !isChainsAuthorized)
83
+ await provider.disconnect();
84
+ if (!provider.session || provider.session && !isChainsAuthorized) {
85
+ await Promise.race([
86
+ provider.connect({
87
+ namespaces: {
88
+ [defaultV2Config.namespace]: {
89
+ methods: defaultV2Config.methods,
90
+ events: defaultV2Config.events,
91
+ chains: this.chains.map(
92
+ (chain) => `${defaultV2Config.namespace}:${chain.id}`
93
+ ),
94
+ rpcMap: this.chains.reduce(
95
+ (rpc, chain) => ({
96
+ ...rpc,
97
+ [chain.id]: chain.rpcUrls.default.http[0]
98
+ }),
99
+ {}
100
+ )
101
+ }
102
+ }
103
+ }),
104
+ ...this.options.qrcode ? [
105
+ new Promise(
106
+ (_res, reject) => provider.on(
107
+ "display_uri",
108
+ async (uri) => (await import("@walletconnect/qrcode-modal")).default.open(
109
+ uri,
110
+ () => reject(new Error("user rejected"))
111
+ )
112
+ )
113
+ )
114
+ ] : []
115
+ ]);
116
+ if (this.options.qrcode)
117
+ (await import("@walletconnect/qrcode-modal")).default.close();
118
+ }
119
+ }
59
120
  setTimeout(() => this.emit("message", { type: "connecting" }), 0);
60
- const accounts = await provider.enable();
121
+ const accounts = await Promise.race([
122
+ provider.enable(),
123
+ ...this.version === "1" && this.options.qrcode ? [
124
+ new Promise(
125
+ (_res, reject) => provider.connector.on(
126
+ "disconnect",
127
+ () => reject(new Error("user rejected"))
128
+ )
129
+ )
130
+ ] : []
131
+ ]);
61
132
  const account = getAddress(accounts[0]);
62
133
  const id = await this.getChainId();
63
134
  const unsupported = this.isChainUnsupported(id);
64
- const walletName = provider.connector?.peerMeta?.name ?? "";
65
- if (switchChainAllowedRegex.test(walletName))
135
+ if (this.version === "1") {
136
+ const walletName = provider.connector?.peerMeta?.name ?? "";
137
+ const switchChainAllowedRegex = /(imtoken|metamask|omni|rainbow|trust wallet)/i;
138
+ if (switchChainAllowedRegex.test(walletName))
139
+ this.switchChain = __privateMethod(this, _switchChain, switchChain_fn);
140
+ } else
66
141
  this.switchChain = __privateMethod(this, _switchChain, switchChain_fn);
67
142
  return {
68
143
  account,
@@ -72,47 +147,82 @@ var WalletConnectConnector = class extends Connector {
72
147
  )
73
148
  };
74
149
  } catch (error) {
75
- if (/user closed modal/i.test(error.message))
150
+ if (this.version === "2" && this.options.qrcode)
151
+ (await import("@walletconnect/qrcode-modal")).default.close();
152
+ if (/user closed modal|user rejected/i.test(
153
+ error?.message
154
+ )) {
76
155
  throw new UserRejectedRequestError(error);
156
+ }
77
157
  throw error;
78
158
  }
79
159
  }
80
160
  async disconnect() {
81
161
  const provider = await this.getProvider();
82
- await provider.disconnect();
162
+ try {
163
+ await provider.disconnect();
164
+ } catch (error) {
165
+ if (!/No matching key/i.test(error.message))
166
+ throw error;
167
+ }
83
168
  provider.removeListener("accountsChanged", this.onAccountsChanged);
84
169
  provider.removeListener("chainChanged", this.onChainChanged);
85
170
  provider.removeListener("disconnect", this.onDisconnect);
86
- typeof localStorage !== "undefined" && localStorage.removeItem("walletconnect");
171
+ if (this.version === "1" && typeof localStorage !== "undefined")
172
+ localStorage.removeItem("walletconnect");
173
+ else {
174
+ provider.removeListener("session_delete", this.onDisconnect);
175
+ provider.removeListener("display_uri", this.onDisplayUri);
176
+ }
87
177
  }
88
178
  async getAccount() {
89
179
  const provider = await this.getProvider();
90
- const accounts = provider.accounts;
180
+ let accounts;
181
+ if (this.version === "1")
182
+ accounts = provider.accounts;
183
+ else
184
+ accounts = await provider.request({
185
+ method: "eth_accounts"
186
+ });
91
187
  return getAddress(accounts[0]);
92
188
  }
93
189
  async getChainId() {
94
190
  const provider = await this.getProvider();
95
- const chainId = normalizeChainId(provider.chainId);
96
- return chainId;
191
+ if (this.version === "1")
192
+ return normalizeChainId(provider.chainId);
193
+ return getClient().data?.chain?.id ?? normalizeChainId(await provider.request({ method: "eth_chainId" }));
97
194
  }
98
195
  async getProvider({
99
196
  chainId,
100
197
  create
101
198
  } = {}) {
102
199
  if (!__privateGet(this, _provider) || chainId || create) {
103
- const rpc = !this.options?.infuraId ? this.chains.reduce(
104
- (rpc2, chain) => ({
105
- ...rpc2,
106
- [chain.id]: chain.rpcUrls.default.http[0]
107
- }),
108
- {}
109
- ) : {};
110
- const WalletConnectProvider = (await import("@walletconnect/ethereum-provider")).default;
111
- __privateSet(this, _provider, new WalletConnectProvider({
112
- ...this.options,
113
- chainId,
114
- rpc: { ...rpc, ...this.options?.rpc }
115
- }));
200
+ if (this.options.version === "2") {
201
+ const WalletConnectProvider = (await import("@walletconnect/universal-provider")).default;
202
+ __privateSet(this, _provider, await WalletConnectProvider.init(
203
+ this.options
204
+ ));
205
+ if (chainId)
206
+ __privateGet(this, _provider).setDefaultChain(
207
+ `${defaultV2Config.namespace}:${chainId}`
208
+ );
209
+ return __privateGet(this, _provider);
210
+ } else {
211
+ const rpc = !this.options?.infuraId ? this.chains.reduce(
212
+ (rpc2, chain) => ({
213
+ ...rpc2,
214
+ [chain.id]: chain.rpcUrls.default.http[0]
215
+ }),
216
+ {}
217
+ ) : {};
218
+ const WalletConnectProvider = (await import("@walletconnect/ethereum-provider")).default;
219
+ __privateSet(this, _provider, new WalletConnectProvider({
220
+ ...this.options,
221
+ chainId,
222
+ rpc: { ...rpc, ...this.options?.rpc }
223
+ }));
224
+ return __privateGet(this, _provider);
225
+ }
116
226
  }
117
227
  return __privateGet(this, _provider);
118
228
  }
@@ -121,21 +231,45 @@ var WalletConnectConnector = class extends Connector {
121
231
  this.getProvider({ chainId }),
122
232
  this.getAccount()
123
233
  ]);
124
- return new providers.Web3Provider(
125
- provider,
126
- chainId
127
- ).getSigner(account);
234
+ let provider_ = provider;
235
+ if (this.version === "2") {
236
+ const chainId_ = await this.getChainId();
237
+ provider_ = {
238
+ ...provider,
239
+ async request(args) {
240
+ return await provider.request(
241
+ args,
242
+ `${defaultV2Config.namespace}:${chainId ?? chainId_}`
243
+ );
244
+ }
245
+ };
246
+ }
247
+ return new providers.Web3Provider(provider_, chainId).getSigner(account);
128
248
  }
129
249
  async isAuthorized() {
130
250
  try {
131
- const account = await this.getAccount();
132
- return !!account;
251
+ const [account, isChainsAuthorized] = await Promise.all([
252
+ this.getAccount(),
253
+ __privateMethod(this, _isChainsAuthorized, isChainsAuthorized_fn).call(this)
254
+ ]);
255
+ return !!account && isChainsAuthorized;
133
256
  } catch {
134
257
  return false;
135
258
  }
136
259
  }
137
260
  };
138
261
  _provider = new WeakMap();
262
+ _isChainsAuthorized = new WeakSet();
263
+ isChainsAuthorized_fn = async function() {
264
+ const provider = await this.getProvider();
265
+ if (this.version === "1")
266
+ return true;
267
+ const providerChains = provider.namespaces?.[defaultV2Config.namespace]?.chains || [];
268
+ const authorizedChainIds = providerChains.map(
269
+ (chain) => parseInt(chain.split(":")[1] || "")
270
+ );
271
+ return !this.chains.some(({ id }) => !authorizedChainIds.includes(id));
272
+ };
139
273
  _switchChain = new WeakSet();
140
274
  switchChain_fn = async function(chainId) {
141
275
  const provider = await this.getProvider();
@@ -153,11 +287,18 @@ switchChain_fn = async function(chainId) {
153
287
  })
154
288
  )
155
289
  ]);
290
+ if (this.version === "2") {
291
+ ;
292
+ provider.setDefaultChain(
293
+ `${defaultV2Config.namespace}:${chainId}`
294
+ );
295
+ this.onChainChanged(chainId);
296
+ }
156
297
  return this.chains.find((x) => x.id === chainId) ?? {
157
298
  id: chainId,
158
299
  name: `Chain ${id}`,
159
300
  network: `${id}`,
160
- nativeCurrency: { name: "Ether", decimals: 18, symbol: "ETH" },
301
+ nativeCurrency: { decimals: 18, name: "Ether", symbol: "ETH" },
161
302
  rpcUrls: { default: { http: [""] } }
162
303
  };
163
304
  } catch (error) {
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@wagmi/connectors",
3
3
  "description": "A collection of connectors for wagmi",
4
4
  "license": "MIT",
5
- "version": "0.1.2",
5
+ "version": "0.1.3",
6
6
  "peerDependencies": {
7
7
  "@wagmi/core": "0.8.x",
8
8
  "ethers": "^5.0.0"
@@ -16,6 +16,8 @@
16
16
  "@coinbase/wallet-sdk": "^3.5.4",
17
17
  "@ledgerhq/connect-kit-loader": "^1.0.1",
18
18
  "@walletconnect/ethereum-provider": "^1.8.0",
19
+ "@walletconnect/qrcode-modal": "^1.8.0",
20
+ "@walletconnect/universal-provider": "^2.1.4",
19
21
  "abitype": "^0.1.8",
20
22
  "eventemitter3": "^4.0.7"
21
23
  },