@wagmi/core 0.0.0-20220909032847

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 (35) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +30 -0
  3. package/chains/dist/wagmi-core-chains.esm.d.ts +11 -0
  4. package/chains/dist/wagmi-core-chains.esm.js +2 -0
  5. package/chains/package.json +3 -0
  6. package/connectors/coinbaseWallet/dist/wagmi-core-connectors-coinbaseWallet.esm.d.ts +11 -0
  7. package/connectors/coinbaseWallet/dist/wagmi-core-connectors-coinbaseWallet.esm.js +246 -0
  8. package/connectors/coinbaseWallet/package.json +3 -0
  9. package/connectors/metaMask/dist/wagmi-core-connectors-metaMask.esm.d.ts +11 -0
  10. package/connectors/metaMask/dist/wagmi-core-connectors-metaMask.esm.js +146 -0
  11. package/connectors/metaMask/package.json +3 -0
  12. package/connectors/mock/dist/wagmi-core-connectors-mock.esm.d.ts +11 -0
  13. package/connectors/mock/dist/wagmi-core-connectors-mock.esm.js +257 -0
  14. package/connectors/mock/package.json +3 -0
  15. package/connectors/walletConnect/dist/wagmi-core-connectors-walletConnect.esm.d.ts +11 -0
  16. package/connectors/walletConnect/dist/wagmi-core-connectors-walletConnect.esm.js +207 -0
  17. package/connectors/walletConnect/package.json +3 -0
  18. package/dist/chains-de91362e.esm.js +493 -0
  19. package/dist/getProvider-34b63ce9.esm.js +1055 -0
  20. package/dist/rpcs-f39d022b.esm.js +50 -0
  21. package/dist/wagmi-core.esm.d.ts +11 -0
  22. package/dist/wagmi-core.esm.js +1515 -0
  23. package/package.json +76 -0
  24. package/providers/alchemy/dist/wagmi-core-providers-alchemy.esm.d.ts +11 -0
  25. package/providers/alchemy/dist/wagmi-core-providers-alchemy.esm.js +32 -0
  26. package/providers/alchemy/package.json +3 -0
  27. package/providers/infura/dist/wagmi-core-providers-infura.esm.d.ts +11 -0
  28. package/providers/infura/dist/wagmi-core-providers-infura.esm.js +32 -0
  29. package/providers/infura/package.json +3 -0
  30. package/providers/jsonRpc/dist/wagmi-core-providers-jsonRpc.esm.d.ts +11 -0
  31. package/providers/jsonRpc/dist/wagmi-core-providers-jsonRpc.esm.js +42 -0
  32. package/providers/jsonRpc/package.json +3 -0
  33. package/providers/public/dist/wagmi-core-providers-public.esm.d.ts +11 -0
  34. package/providers/public/dist/wagmi-core-providers-public.esm.js +28 -0
  35. package/providers/public/package.json +3 -0
@@ -0,0 +1,1055 @@
1
+ import { subscribeWithSelector, persist } from 'zustand/middleware';
2
+ import create from 'zustand/vanilla';
3
+ import { providers } from 'ethers';
4
+ import { getAddress, hexValue } from 'ethers/lib/utils';
5
+ import EventEmitter from 'eventemitter3';
6
+ import { d as defaultChains } from './chains-de91362e.esm.js';
7
+
8
+ function _checkPrivateRedeclaration(obj, privateCollection) {
9
+ if (privateCollection.has(obj)) {
10
+ throw new TypeError("Cannot initialize the same private elements twice on an object");
11
+ }
12
+ }
13
+
14
+ function _classPrivateMethodInitSpec(obj, privateSet) {
15
+ _checkPrivateRedeclaration(obj, privateSet);
16
+ privateSet.add(obj);
17
+ }
18
+
19
+ function _classPrivateFieldInitSpec(obj, privateMap, value) {
20
+ _checkPrivateRedeclaration(obj, privateMap);
21
+ privateMap.set(obj, value);
22
+ }
23
+
24
+ function _defineProperty(obj, key, value) {
25
+ if (key in obj) {
26
+ Object.defineProperty(obj, key, {
27
+ value: value,
28
+ enumerable: true,
29
+ configurable: true,
30
+ writable: true
31
+ });
32
+ } else {
33
+ obj[key] = value;
34
+ }
35
+
36
+ return obj;
37
+ }
38
+
39
+ function _classApplyDescriptorGet(receiver, descriptor) {
40
+ if (descriptor.get) {
41
+ return descriptor.get.call(receiver);
42
+ }
43
+
44
+ return descriptor.value;
45
+ }
46
+
47
+ function _classExtractFieldDescriptor(receiver, privateMap, action) {
48
+ if (!privateMap.has(receiver)) {
49
+ throw new TypeError("attempted to " + action + " private field on non-instance");
50
+ }
51
+
52
+ return privateMap.get(receiver);
53
+ }
54
+
55
+ function _classPrivateFieldGet(receiver, privateMap) {
56
+ var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get");
57
+ return _classApplyDescriptorGet(receiver, descriptor);
58
+ }
59
+
60
+ function _classPrivateMethodGet(receiver, privateSet, fn) {
61
+ if (!privateSet.has(receiver)) {
62
+ throw new TypeError("attempted to get private field on non-instance");
63
+ }
64
+
65
+ return fn;
66
+ }
67
+
68
+ function _classApplyDescriptorSet(receiver, descriptor, value) {
69
+ if (descriptor.set) {
70
+ descriptor.set.call(receiver, value);
71
+ } else {
72
+ if (!descriptor.writable) {
73
+ throw new TypeError("attempted to set read only private field");
74
+ }
75
+
76
+ descriptor.value = value;
77
+ }
78
+ }
79
+
80
+ function _classPrivateFieldSet(receiver, privateMap, value) {
81
+ var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set");
82
+ _classApplyDescriptorSet(receiver, descriptor, value);
83
+ return value;
84
+ }
85
+
86
+ /**
87
+ * Error subclass implementing JSON RPC 2.0 errors and Ethereum RPC errors per EIP-1474.
88
+ * @see https://eips.ethereum.org/EIPS/eip-1474
89
+ */
90
+ class RpcError extends Error {
91
+ constructor(
92
+ /** Number error code */
93
+ code,
94
+ /** Human-readable string */
95
+ message,
96
+ /** Low-level error */
97
+ internal,
98
+ /** Other useful information about error */
99
+ data) {
100
+ if (!Number.isInteger(code)) throw new Error('"code" must be an integer.');
101
+ if (!message || typeof message !== 'string') throw new Error('"message" must be a nonempty string.');
102
+ super(message);
103
+
104
+ _defineProperty(this, "code", void 0);
105
+
106
+ _defineProperty(this, "data", void 0);
107
+
108
+ _defineProperty(this, "internal", void 0);
109
+
110
+ this.code = code;
111
+ this.data = data;
112
+ this.internal = internal;
113
+ }
114
+
115
+ }
116
+ /**
117
+ * Error subclass implementing Ethereum Provider errors per EIP-1193.
118
+ * @see https://eips.ethereum.org/EIPS/eip-1193
119
+ */
120
+
121
+ class ProviderRpcError extends RpcError {
122
+ /**
123
+ * Create an Ethereum Provider JSON-RPC error.
124
+ * `code` must be an integer in the 1000 <= 4999 range.
125
+ */
126
+ constructor(
127
+ /**
128
+ * Number error code
129
+ * @see https://eips.ethereum.org/EIPS/eip-1193#error-standards
130
+ */
131
+ code,
132
+ /** Human-readable string */
133
+ message,
134
+ /** Low-level error */
135
+ internal,
136
+ /** Other useful information about error */
137
+ data) {
138
+ if (!(Number.isInteger(code) && code >= 1000 && code <= 4999)) throw new Error('"code" must be an integer such that: 1000 <= code <= 4999');
139
+ super(code, message, internal, data);
140
+ }
141
+
142
+ }
143
+ class AddChainError extends Error {
144
+ constructor() {
145
+ super(...arguments);
146
+
147
+ _defineProperty(this, "name", 'AddChainError');
148
+
149
+ _defineProperty(this, "message", 'Error adding chain');
150
+ }
151
+
152
+ }
153
+ class ChainDoesNotSupportMulticallError extends Error {
154
+ constructor(_ref) {
155
+ let {
156
+ blockNumber,
157
+ chain
158
+ } = _ref;
159
+ super("Chain \"".concat(chain.name, "\" does not support multicall").concat(blockNumber ? " on block ".concat(blockNumber) : '', "."));
160
+
161
+ _defineProperty(this, "name", 'ChainDoesNotSupportMulticall');
162
+ }
163
+
164
+ }
165
+ class ChainMismatchError extends Error {
166
+ constructor(_ref2) {
167
+ let {
168
+ activeChain,
169
+ targetChain
170
+ } = _ref2;
171
+ super("Chain mismatch: Expected \"".concat(targetChain, "\", received \"").concat(activeChain, "\"."));
172
+
173
+ _defineProperty(this, "name", 'ChainMismatchError');
174
+ }
175
+
176
+ }
177
+ class ChainNotConfiguredError extends Error {
178
+ constructor() {
179
+ super(...arguments);
180
+
181
+ _defineProperty(this, "name", 'ChainNotConfigured');
182
+
183
+ _defineProperty(this, "message", 'Chain not configured');
184
+ }
185
+
186
+ }
187
+ class ConnectorAlreadyConnectedError extends Error {
188
+ constructor() {
189
+ super(...arguments);
190
+
191
+ _defineProperty(this, "name", 'ConnectorAlreadyConnectedError');
192
+
193
+ _defineProperty(this, "message", 'Connector already connected');
194
+ }
195
+
196
+ }
197
+ class ConnectorNotFoundError extends Error {
198
+ constructor() {
199
+ super(...arguments);
200
+
201
+ _defineProperty(this, "name", 'ConnectorNotFoundError');
202
+
203
+ _defineProperty(this, "message", 'Connector not found');
204
+ }
205
+
206
+ }
207
+ class ContractMethodDoesNotExistError extends Error {
208
+ constructor(_ref3) {
209
+ var _chain$blockExplorers;
210
+
211
+ let {
212
+ addressOrName,
213
+ chainId,
214
+ functionName
215
+ } = _ref3;
216
+ const {
217
+ chains,
218
+ network
219
+ } = getProvider();
220
+ const chain = chains === null || chains === void 0 ? void 0 : chains.find(_ref4 => {
221
+ let {
222
+ id
223
+ } = _ref4;
224
+ return id === (chainId || network.chainId);
225
+ });
226
+ const blockExplorer = chain === null || chain === void 0 ? void 0 : (_chain$blockExplorers = chain.blockExplorers) === null || _chain$blockExplorers === void 0 ? void 0 : _chain$blockExplorers.default;
227
+ super(["Function \"".concat(functionName, "\" on contract \"").concat(addressOrName, "\" does not exist."), ...(blockExplorer ? ['', "".concat(blockExplorer === null || blockExplorer === void 0 ? void 0 : blockExplorer.name, ": ").concat(blockExplorer === null || blockExplorer === void 0 ? void 0 : blockExplorer.url, "/address/").concat(addressOrName, "#readContract")] : [])].join('\n'));
228
+
229
+ _defineProperty(this, "name", 'ContractMethodDoesNotExistError');
230
+ }
231
+
232
+ }
233
+ class ContractMethodNoResultError extends Error {
234
+ constructor(_ref5) {
235
+ let {
236
+ addressOrName,
237
+ args,
238
+ chainId,
239
+ functionName
240
+ } = _ref5;
241
+ super(['Contract read returned an empty response. This could be due to any of the following:', "- The contract does not have the function \"".concat(functionName, "\","), '- The parameters passed to the contract function may be invalid, or', '- The address is not a contract.', '', "Config:", JSON.stringify({
242
+ addressOrName,
243
+ contractInterface: '...',
244
+ functionName,
245
+ chainId,
246
+ args
247
+ }, null, 2)].join('\n'));
248
+
249
+ _defineProperty(this, "name", 'ContractMethodNoResultError');
250
+ }
251
+
252
+ }
253
+ class ContractMethodRevertedError extends Error {
254
+ constructor(_ref6) {
255
+ let {
256
+ addressOrName,
257
+ args,
258
+ chainId,
259
+ functionName,
260
+ errorMessage
261
+ } = _ref6;
262
+ super(['Contract method reverted with an error.', '', "Config:", JSON.stringify({
263
+ addressOrName,
264
+ contractInterface: '...',
265
+ functionName,
266
+ chainId,
267
+ args
268
+ }, null, 2), '', "Details: ".concat(errorMessage)].join('\n'));
269
+
270
+ _defineProperty(this, "name", 'ContractMethodRevertedError');
271
+ }
272
+
273
+ }
274
+ class ContractResultDecodeError extends Error {
275
+ constructor(_ref7) {
276
+ let {
277
+ addressOrName,
278
+ args,
279
+ chainId,
280
+ functionName,
281
+ errorMessage
282
+ } = _ref7;
283
+ super(['Failed to decode contract function result.', '', "Config:", JSON.stringify({
284
+ addressOrName,
285
+ contractInterface: '...',
286
+ functionName,
287
+ chainId,
288
+ args
289
+ }, null, 2), '', "Details: ".concat(errorMessage)].join('\n'));
290
+
291
+ _defineProperty(this, "name", 'ContractResultDecodeError');
292
+ }
293
+
294
+ }
295
+ class ProviderChainsNotFound extends Error {
296
+ constructor() {
297
+ super(...arguments);
298
+
299
+ _defineProperty(this, "name", 'ProviderChainsNotFound');
300
+
301
+ _defineProperty(this, "message", ['No chains were found on the wagmi provider. Some functions that require a chain may not work.', '', 'It is recommended to add a list of chains to the provider in `createClient`.', '', 'Example:', '', '```', "import { getDefaultProvider } from 'ethers'", "import { chain, createClient } from 'wagmi'", '', 'createClient({', ' provider: Object.assign(getDefaultProvider(), { chains: [chain.mainnet] })', '})', '```'].join('\n'));
302
+ }
303
+
304
+ }
305
+ class ResourceUnavailableError extends RpcError {
306
+ constructor(error) {
307
+ super(-32002, 'Resource unavailable', error);
308
+
309
+ _defineProperty(this, "name", 'ResourceUnavailable');
310
+ }
311
+
312
+ }
313
+ class SwitchChainError extends ProviderRpcError {
314
+ constructor(error) {
315
+ super(4902, 'Error switching chain', error);
316
+
317
+ _defineProperty(this, "name", 'SwitchChainError');
318
+ }
319
+
320
+ }
321
+ class SwitchChainNotSupportedError extends Error {
322
+ constructor(_ref8) {
323
+ let {
324
+ connector
325
+ } = _ref8;
326
+ super("\"".concat(connector.name, "\" does not support programmatic chain switching."));
327
+
328
+ _defineProperty(this, "name", 'SwitchChainNotSupportedError');
329
+ }
330
+
331
+ }
332
+ class UserRejectedRequestError extends ProviderRpcError {
333
+ constructor(error) {
334
+ super(4001, 'User rejected request', error);
335
+
336
+ _defineProperty(this, "name", 'UserRejectedRequestError');
337
+ }
338
+
339
+ }
340
+
341
+ function getInjectedName(ethereum) {
342
+ var _ethereum$providers, _getName;
343
+
344
+ if (!ethereum) return 'Injected';
345
+
346
+ const getName = provider => {
347
+ if (provider.isBitKeep) return 'BitKeep';
348
+ if (provider.isBraveWallet) return 'Brave Wallet';
349
+ if (provider.isCoinbaseWallet) return 'Coinbase Wallet';
350
+ if (provider.isExodus) return 'Exodus';
351
+ if (provider.isFrame) return 'Frame';
352
+ if (provider.isMathWallet) return 'MathWallet';
353
+ if (provider.isOpera) return 'Opera';
354
+ if (provider.isTally) return 'Tally';
355
+ if (provider.isTokenPocket) return 'TokenPocket';
356
+ if (provider.isTokenary) return 'Tokenary';
357
+ if (provider.isTrust) return 'Trust Wallet';
358
+ if (provider.isOneInchIOSWallet || provider.isOneInchAndroidWallet) return '1inch Wallet';
359
+ if (provider.isMetaMask) return 'MetaMask';
360
+ }; // Some injected providers detect multiple other providers and create a list at `ethers.providers`
361
+
362
+
363
+ if ((_ethereum$providers = ethereum.providers) !== null && _ethereum$providers !== void 0 && _ethereum$providers.length) {
364
+ var _names$;
365
+
366
+ // Deduplicate names using Set
367
+ // Coinbase Wallet puts multiple providers in `ethereum.providers`
368
+ const nameSet = new Set();
369
+ let unknownCount = 1;
370
+
371
+ for (const provider of ethereum.providers) {
372
+ let name = getName(provider);
373
+
374
+ if (!name) {
375
+ name = "Unknown Wallet #".concat(unknownCount);
376
+ unknownCount += 1;
377
+ }
378
+
379
+ nameSet.add(name);
380
+ }
381
+
382
+ const names = [...nameSet];
383
+ if (names.length) return names;
384
+ return (_names$ = names[0]) !== null && _names$ !== void 0 ? _names$ : 'Injected';
385
+ }
386
+
387
+ return (_getName = getName(ethereum)) !== null && _getName !== void 0 ? _getName : 'Injected';
388
+ }
389
+
390
+ function normalizeChainId(chainId) {
391
+ if (typeof chainId === 'string') return Number.parseInt(chainId, chainId.trim().substring(0, 2) === '0x' ? 16 : 10);
392
+ if (typeof chainId === 'bigint') return Number(chainId);
393
+ return chainId;
394
+ }
395
+
396
+ class Connector extends EventEmitter {
397
+ /** Unique connector id */
398
+
399
+ /** Connector name */
400
+
401
+ /** Chains connector supports */
402
+
403
+ /** Options to use with connector */
404
+
405
+ /** Whether connector is usable */
406
+ constructor(_ref) {
407
+ let {
408
+ chains = defaultChains,
409
+ options
410
+ } = _ref;
411
+ super();
412
+
413
+ _defineProperty(this, "id", void 0);
414
+
415
+ _defineProperty(this, "name", void 0);
416
+
417
+ _defineProperty(this, "chains", void 0);
418
+
419
+ _defineProperty(this, "options", void 0);
420
+
421
+ _defineProperty(this, "ready", void 0);
422
+
423
+ this.chains = chains;
424
+ this.options = options;
425
+ }
426
+
427
+ getBlockExplorerUrls(chain) {
428
+ var _chain$blockExplorers;
429
+
430
+ const {
431
+ default: blockExplorer,
432
+ ...blockExplorers
433
+ } = (_chain$blockExplorers = chain.blockExplorers) !== null && _chain$blockExplorers !== void 0 ? _chain$blockExplorers : {};
434
+ if (blockExplorer) return [blockExplorer.url, ...Object.values(blockExplorers).map(x => x.url)];
435
+ return [];
436
+ }
437
+
438
+ isChainUnsupported(chainId) {
439
+ return !this.chains.some(x => x.id === chainId);
440
+ }
441
+
442
+ }
443
+
444
+ var _provider = /*#__PURE__*/new WeakMap();
445
+
446
+ var _switchingChains = /*#__PURE__*/new WeakMap();
447
+
448
+ class InjectedConnector extends Connector {
449
+ constructor() {
450
+ let {
451
+ chains,
452
+ options = {
453
+ shimDisconnect: true
454
+ }
455
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
456
+ super({
457
+ chains,
458
+ options
459
+ });
460
+
461
+ _defineProperty(this, "id", void 0);
462
+
463
+ _defineProperty(this, "name", void 0);
464
+
465
+ _defineProperty(this, "ready", typeof window != 'undefined' && !!window.ethereum);
466
+
467
+ _classPrivateFieldInitSpec(this, _provider, {
468
+ writable: true,
469
+ value: void 0
470
+ });
471
+
472
+ _classPrivateFieldInitSpec(this, _switchingChains, {
473
+ writable: true,
474
+ value: void 0
475
+ });
476
+
477
+ _defineProperty(this, "shimDisconnectKey", 'injected.shimDisconnect');
478
+
479
+ _defineProperty(this, "onAccountsChanged", accounts => {
480
+ if (accounts.length === 0) this.emit('disconnect');else this.emit('change', {
481
+ account: getAddress(accounts[0])
482
+ });
483
+ });
484
+
485
+ _defineProperty(this, "onChainChanged", chainId => {
486
+ const id = normalizeChainId(chainId);
487
+ const unsupported = this.isChainUnsupported(id);
488
+ this.emit('change', {
489
+ chain: {
490
+ id,
491
+ unsupported
492
+ }
493
+ });
494
+ });
495
+
496
+ _defineProperty(this, "onDisconnect", () => {
497
+ var _this$options, _this$options2, _getClient$storage;
498
+
499
+ // We need this as MetaMask can emit the "disconnect" event
500
+ // upon switching chains. This workaround ensures that the
501
+ // user currently isn't in the process of switching chains.
502
+ if ((_this$options = this.options) !== null && _this$options !== void 0 && _this$options.shimChainChangedDisconnect && _classPrivateFieldGet(this, _switchingChains)) {
503
+ _classPrivateFieldSet(this, _switchingChains, false);
504
+
505
+ return;
506
+ }
507
+
508
+ this.emit('disconnect'); // Remove shim signalling wallet is disconnected
509
+
510
+ if ((_this$options2 = this.options) !== null && _this$options2 !== void 0 && _this$options2.shimDisconnect) (_getClient$storage = getClient().storage) === null || _getClient$storage === void 0 ? void 0 : _getClient$storage.removeItem(this.shimDisconnectKey);
511
+ });
512
+
513
+ let name = 'Injected';
514
+ const overrideName = options.name;
515
+ if (typeof overrideName === 'string') name = overrideName;else if (typeof window !== 'undefined') {
516
+ const detectedName = getInjectedName(window.ethereum);
517
+ if (overrideName) name = overrideName(detectedName);else name = typeof detectedName === 'string' ? detectedName : detectedName[0];
518
+ }
519
+ this.id = 'injected';
520
+ this.name = name;
521
+ }
522
+
523
+ async connect() {
524
+ let {
525
+ chainId
526
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
527
+
528
+ try {
529
+ var _this$options3, _getClient$storage2;
530
+
531
+ const provider = await this.getProvider();
532
+ if (!provider) throw new ConnectorNotFoundError();
533
+
534
+ if (provider.on) {
535
+ provider.on('accountsChanged', this.onAccountsChanged);
536
+ provider.on('chainChanged', this.onChainChanged);
537
+ provider.on('disconnect', this.onDisconnect);
538
+ }
539
+
540
+ this.emit('message', {
541
+ type: 'connecting'
542
+ });
543
+ const account = await this.getAccount(); // Switch to chain if provided
544
+
545
+ let id = await this.getChainId();
546
+ let unsupported = this.isChainUnsupported(id);
547
+
548
+ if (chainId && id !== chainId) {
549
+ const chain = await this.switchChain(chainId);
550
+ id = chain.id;
551
+ unsupported = this.isChainUnsupported(id);
552
+ } // Add shim to storage signalling wallet is connected
553
+
554
+
555
+ if ((_this$options3 = this.options) !== null && _this$options3 !== void 0 && _this$options3.shimDisconnect) (_getClient$storage2 = getClient().storage) === null || _getClient$storage2 === void 0 ? void 0 : _getClient$storage2.setItem(this.shimDisconnectKey, true);
556
+ return {
557
+ account,
558
+ chain: {
559
+ id,
560
+ unsupported
561
+ },
562
+ provider
563
+ };
564
+ } catch (error) {
565
+ if (this.isUserRejectedRequestError(error)) throw new UserRejectedRequestError(error);
566
+ if (error.code === -32002) throw new ResourceUnavailableError(error);
567
+ throw error;
568
+ }
569
+ }
570
+
571
+ async disconnect() {
572
+ var _this$options4, _getClient$storage3;
573
+
574
+ const provider = await this.getProvider();
575
+ if (!(provider !== null && provider !== void 0 && provider.removeListener)) return;
576
+ provider.removeListener('accountsChanged', this.onAccountsChanged);
577
+ provider.removeListener('chainChanged', this.onChainChanged);
578
+ provider.removeListener('disconnect', this.onDisconnect); // Remove shim signalling wallet is disconnected
579
+
580
+ if ((_this$options4 = this.options) !== null && _this$options4 !== void 0 && _this$options4.shimDisconnect) (_getClient$storage3 = getClient().storage) === null || _getClient$storage3 === void 0 ? void 0 : _getClient$storage3.removeItem(this.shimDisconnectKey);
581
+ }
582
+
583
+ async getAccount() {
584
+ const provider = await this.getProvider();
585
+ if (!provider) throw new ConnectorNotFoundError();
586
+ const accounts = await provider.request({
587
+ method: 'eth_requestAccounts'
588
+ }); // return checksum address
589
+
590
+ return getAddress(accounts[0]);
591
+ }
592
+
593
+ async getChainId() {
594
+ const provider = await this.getProvider();
595
+ if (!provider) throw new ConnectorNotFoundError();
596
+ return await provider.request({
597
+ method: 'eth_chainId'
598
+ }).then(normalizeChainId);
599
+ }
600
+
601
+ async getProvider() {
602
+ if (typeof window !== 'undefined' && !!window.ethereum) _classPrivateFieldSet(this, _provider, window.ethereum);
603
+ return _classPrivateFieldGet(this, _provider);
604
+ }
605
+
606
+ async getSigner() {
607
+ const [provider, account] = await Promise.all([this.getProvider(), this.getAccount()]);
608
+ return new providers.Web3Provider(provider).getSigner(account);
609
+ }
610
+
611
+ async isAuthorized() {
612
+ try {
613
+ var _this$options5, _getClient$storage4;
614
+
615
+ if ((_this$options5 = this.options) !== null && _this$options5 !== void 0 && _this$options5.shimDisconnect && // If shim does not exist in storage, wallet is disconnected
616
+ !((_getClient$storage4 = getClient().storage) !== null && _getClient$storage4 !== void 0 && _getClient$storage4.getItem(this.shimDisconnectKey))) return false;
617
+ const provider = await this.getProvider();
618
+ if (!provider) throw new ConnectorNotFoundError();
619
+ const accounts = await provider.request({
620
+ method: 'eth_accounts'
621
+ });
622
+ const account = accounts[0];
623
+ return !!account;
624
+ } catch {
625
+ return false;
626
+ }
627
+ }
628
+
629
+ async switchChain(chainId) {
630
+ var _this$options6;
631
+
632
+ if ((_this$options6 = this.options) !== null && _this$options6 !== void 0 && _this$options6.shimChainChangedDisconnect) _classPrivateFieldSet(this, _switchingChains, true);
633
+ const provider = await this.getProvider();
634
+ if (!provider) throw new ConnectorNotFoundError();
635
+ const id = hexValue(chainId);
636
+
637
+ try {
638
+ var _this$chains$find;
639
+
640
+ await provider.request({
641
+ method: 'wallet_switchEthereumChain',
642
+ params: [{
643
+ chainId: id
644
+ }]
645
+ });
646
+ return (_this$chains$find = this.chains.find(x => x.id === chainId)) !== null && _this$chains$find !== void 0 ? _this$chains$find : {
647
+ id: chainId,
648
+ name: "Chain ".concat(id),
649
+ network: "".concat(id),
650
+ rpcUrls: {
651
+ default: ''
652
+ }
653
+ };
654
+ } catch (error) {
655
+ var _data, _data$originalError;
656
+
657
+ const chain = this.chains.find(x => x.id === chainId);
658
+ if (!chain) throw new ChainNotConfiguredError(); // Indicates chain is not added to provider
659
+
660
+ if (error.code === 4902 || // Unwrapping for MetaMask Mobile
661
+ // https://github.com/MetaMask/metamask-mobile/issues/2944#issuecomment-976988719
662
+ (error === null || error === void 0 ? void 0 : (_data = error.data) === null || _data === void 0 ? void 0 : (_data$originalError = _data.originalError) === null || _data$originalError === void 0 ? void 0 : _data$originalError.code) === 4902) {
663
+ try {
664
+ var _chain$rpcUrls$public;
665
+
666
+ await provider.request({
667
+ method: 'wallet_addEthereumChain',
668
+ params: [{
669
+ chainId: id,
670
+ chainName: chain.name,
671
+ nativeCurrency: chain.nativeCurrency,
672
+ rpcUrls: [(_chain$rpcUrls$public = chain.rpcUrls.public) !== null && _chain$rpcUrls$public !== void 0 ? _chain$rpcUrls$public : chain.rpcUrls.default],
673
+ blockExplorerUrls: this.getBlockExplorerUrls(chain)
674
+ }]
675
+ });
676
+ return chain;
677
+ } catch (addError) {
678
+ if (this.isUserRejectedRequestError(addError)) throw new UserRejectedRequestError(error);
679
+ throw new AddChainError();
680
+ }
681
+ }
682
+
683
+ if (this.isUserRejectedRequestError(error)) throw new UserRejectedRequestError(error);
684
+ throw new SwitchChainError(error);
685
+ }
686
+ }
687
+
688
+ async watchAsset(_ref) {
689
+ let {
690
+ address,
691
+ decimals = 18,
692
+ image,
693
+ symbol
694
+ } = _ref;
695
+ const provider = await this.getProvider();
696
+ if (!provider) throw new ConnectorNotFoundError();
697
+ return await provider.request({
698
+ method: 'wallet_watchAsset',
699
+ params: {
700
+ type: 'ERC20',
701
+ options: {
702
+ address,
703
+ decimals,
704
+ image,
705
+ symbol
706
+ }
707
+ }
708
+ });
709
+ }
710
+
711
+ isUserRejectedRequestError(error) {
712
+ return error.code === 4001;
713
+ }
714
+
715
+ }
716
+
717
+ const noopStorage = {
718
+ getItem: _key => '',
719
+ setItem: (_key, _value) => null,
720
+ removeItem: _key => null
721
+ };
722
+ function createStorage(_ref) {
723
+ let {
724
+ storage,
725
+ key: prefix = 'wagmi'
726
+ } = _ref;
727
+ return { ...storage,
728
+ getItem: function (key) {
729
+ let defaultState = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
730
+ const value = storage.getItem("".concat(prefix, ".").concat(key));
731
+
732
+ try {
733
+ return value ? JSON.parse(value) : defaultState;
734
+ } catch (error) {
735
+ console.warn(error);
736
+ return defaultState;
737
+ }
738
+ },
739
+ setItem: (key, value) => {
740
+ if (value === null) {
741
+ storage.removeItem("".concat(prefix, ".").concat(key));
742
+ } else {
743
+ try {
744
+ storage.setItem("".concat(prefix, ".").concat(key), JSON.stringify(value));
745
+ } catch (err) {
746
+ console.error(err);
747
+ }
748
+ }
749
+ },
750
+ removeItem: key => storage.removeItem("".concat(prefix, ".").concat(key))
751
+ };
752
+ }
753
+
754
+ const storeKey = 'store';
755
+
756
+ var _isAutoConnecting = /*#__PURE__*/new WeakMap();
757
+
758
+ var _lastUsedConnector = /*#__PURE__*/new WeakMap();
759
+
760
+ var _addEffects = /*#__PURE__*/new WeakSet();
761
+
762
+ class Client {
763
+ constructor(_ref) {
764
+ let {
765
+ autoConnect = false,
766
+ connectors = [new InjectedConnector()],
767
+ provider: _provider,
768
+ storage = createStorage({
769
+ storage: typeof window !== 'undefined' ? window.localStorage : noopStorage
770
+ }),
771
+ webSocketProvider: _webSocketProvider
772
+ } = _ref;
773
+
774
+ _classPrivateMethodInitSpec(this, _addEffects);
775
+
776
+ _defineProperty(this, "config", void 0);
777
+
778
+ _defineProperty(this, "storage", void 0);
779
+
780
+ _defineProperty(this, "store", void 0);
781
+
782
+ _classPrivateFieldInitSpec(this, _isAutoConnecting, {
783
+ writable: true,
784
+ value: void 0
785
+ });
786
+
787
+ _classPrivateFieldInitSpec(this, _lastUsedConnector, {
788
+ writable: true,
789
+ value: void 0
790
+ });
791
+
792
+ // Check status for autoConnect flag
793
+ let status = 'disconnected';
794
+
795
+ let _chainId;
796
+
797
+ if (autoConnect) {
798
+ try {
799
+ var _JSON$parse, _JSON$parse$state, _data$chain;
800
+
801
+ const rawState = storage.getItem(storeKey, '');
802
+ const data = (_JSON$parse = JSON.parse(rawState || '{}')) === null || _JSON$parse === void 0 ? void 0 : (_JSON$parse$state = _JSON$parse.state) === null || _JSON$parse$state === void 0 ? void 0 : _JSON$parse$state.data; // If account exists in localStorage, set status to reconnecting
803
+
804
+ status = data !== null && data !== void 0 && data.account ? 'reconnecting' : 'connecting';
805
+ _chainId = data === null || data === void 0 ? void 0 : (_data$chain = data.chain) === null || _data$chain === void 0 ? void 0 : _data$chain.id; // eslint-disable-next-line no-empty
806
+ } catch (_error) {}
807
+ } // Create store
808
+
809
+
810
+ this.store = create(subscribeWithSelector(persist(() => ({
811
+ connectors: typeof connectors === 'function' ? connectors() : connectors,
812
+ provider: typeof _provider === 'function' ? _provider({
813
+ chainId: _chainId
814
+ }) : _provider,
815
+ status,
816
+ webSocketProvider: typeof _webSocketProvider === 'function' ? _webSocketProvider({
817
+ chainId: _chainId
818
+ }) : _webSocketProvider
819
+ }), {
820
+ name: storeKey,
821
+ getStorage: () => storage,
822
+ partialize: state => {
823
+ var _state$data, _state$data2;
824
+
825
+ return { ...(autoConnect && {
826
+ data: {
827
+ account: state === null || state === void 0 ? void 0 : (_state$data = state.data) === null || _state$data === void 0 ? void 0 : _state$data.account,
828
+ chain: state === null || state === void 0 ? void 0 : (_state$data2 = state.data) === null || _state$data2 === void 0 ? void 0 : _state$data2.chain
829
+ }
830
+ }),
831
+ chains: state === null || state === void 0 ? void 0 : state.chains
832
+ };
833
+ },
834
+ version: 1
835
+ })));
836
+ this.config = {
837
+ autoConnect,
838
+ connectors,
839
+ provider: _provider,
840
+ storage,
841
+ webSocketProvider: _webSocketProvider
842
+ };
843
+ this.storage = storage;
844
+
845
+ _classPrivateFieldSet(this, _lastUsedConnector, storage === null || storage === void 0 ? void 0 : storage.getItem('wallet'));
846
+
847
+ _classPrivateMethodGet(this, _addEffects, _addEffects2).call(this);
848
+
849
+ if (autoConnect && typeof window !== 'undefined') setTimeout(async () => await this.autoConnect(), 0);
850
+ }
851
+
852
+ get chains() {
853
+ return this.store.getState().chains;
854
+ }
855
+
856
+ get connectors() {
857
+ return this.store.getState().connectors;
858
+ }
859
+
860
+ get connector() {
861
+ return this.store.getState().connector;
862
+ }
863
+
864
+ get data() {
865
+ return this.store.getState().data;
866
+ }
867
+
868
+ get error() {
869
+ return this.store.getState().error;
870
+ }
871
+
872
+ get lastUsedChainId() {
873
+ var _this$data, _this$data$chain;
874
+
875
+ return (_this$data = this.data) === null || _this$data === void 0 ? void 0 : (_this$data$chain = _this$data.chain) === null || _this$data$chain === void 0 ? void 0 : _this$data$chain.id;
876
+ }
877
+
878
+ get provider() {
879
+ return this.store.getState().provider;
880
+ }
881
+
882
+ get status() {
883
+ return this.store.getState().status;
884
+ }
885
+
886
+ get subscribe() {
887
+ return this.store.subscribe;
888
+ }
889
+
890
+ get webSocketProvider() {
891
+ return this.store.getState().webSocketProvider;
892
+ }
893
+
894
+ setState(updater) {
895
+ const newState = typeof updater === 'function' ? updater(this.store.getState()) : updater;
896
+ this.store.setState(newState, true);
897
+ }
898
+
899
+ clearState() {
900
+ this.setState(x => ({ ...x,
901
+ connector: undefined,
902
+ data: undefined,
903
+ error: undefined,
904
+ status: 'disconnected'
905
+ }));
906
+ }
907
+
908
+ async destroy() {
909
+ var _this$connector$disco, _this$connector;
910
+
911
+ if (this.connector) await ((_this$connector$disco = (_this$connector = this.connector).disconnect) === null || _this$connector$disco === void 0 ? void 0 : _this$connector$disco.call(_this$connector));
912
+
913
+ _classPrivateFieldSet(this, _isAutoConnecting, false);
914
+
915
+ this.clearState();
916
+ this.store.destroy();
917
+ }
918
+
919
+ async autoConnect() {
920
+ if (_classPrivateFieldGet(this, _isAutoConnecting)) return;
921
+
922
+ _classPrivateFieldSet(this, _isAutoConnecting, true);
923
+
924
+ this.setState(x => {
925
+ var _x$data;
926
+
927
+ return { ...x,
928
+ status: (_x$data = x.data) !== null && _x$data !== void 0 && _x$data.account ? 'reconnecting' : 'connecting'
929
+ };
930
+ }); // Try last used connector first
931
+
932
+ const sorted = _classPrivateFieldGet(this, _lastUsedConnector) ? [...this.connectors].sort(x => x.id === _classPrivateFieldGet(this, _lastUsedConnector) ? -1 : 1) : this.connectors;
933
+ let connected = false;
934
+
935
+ for (const connector of sorted) {
936
+ if (!connector.ready || !connector.isAuthorized) continue;
937
+ const isAuthorized = await connector.isAuthorized();
938
+ if (!isAuthorized) continue;
939
+ const data = await connector.connect();
940
+ this.setState(x => ({ ...x,
941
+ connector,
942
+ chains: connector === null || connector === void 0 ? void 0 : connector.chains,
943
+ data,
944
+ status: 'connected'
945
+ }));
946
+ connected = true;
947
+ break;
948
+ } // If connecting didn't succeed, set to disconnected
949
+
950
+
951
+ if (!connected) this.setState(x => ({ ...x,
952
+ data: undefined,
953
+ status: 'disconnected'
954
+ }));
955
+
956
+ _classPrivateFieldSet(this, _isAutoConnecting, false);
957
+
958
+ return this.data;
959
+ }
960
+
961
+ setLastUsedConnector() {
962
+ var _this$storage;
963
+
964
+ let lastUsedConnector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
965
+ (_this$storage = this.storage) === null || _this$storage === void 0 ? void 0 : _this$storage.setItem('wallet', lastUsedConnector);
966
+ }
967
+
968
+ }
969
+
970
+ function _addEffects2() {
971
+ const onChange = data => {
972
+ this.setState(x => ({ ...x,
973
+ data: { ...x.data,
974
+ ...data
975
+ }
976
+ }));
977
+ };
978
+
979
+ const onDisconnect = () => {
980
+ this.clearState();
981
+ };
982
+
983
+ const onError = error => {
984
+ this.setState(x => ({ ...x,
985
+ error
986
+ }));
987
+ };
988
+
989
+ this.store.subscribe(_ref2 => {
990
+ let {
991
+ connector
992
+ } = _ref2;
993
+ return connector;
994
+ }, (connector, prevConnector) => {
995
+ var _prevConnector$off, _prevConnector$off2, _prevConnector$off3, _connector$on, _connector$on2, _connector$on3;
996
+
997
+ prevConnector === null || prevConnector === void 0 ? void 0 : (_prevConnector$off = prevConnector.off) === null || _prevConnector$off === void 0 ? void 0 : _prevConnector$off.call(prevConnector, 'change', onChange);
998
+ prevConnector === null || prevConnector === void 0 ? void 0 : (_prevConnector$off2 = prevConnector.off) === null || _prevConnector$off2 === void 0 ? void 0 : _prevConnector$off2.call(prevConnector, 'disconnect', onDisconnect);
999
+ prevConnector === null || prevConnector === void 0 ? void 0 : (_prevConnector$off3 = prevConnector.off) === null || _prevConnector$off3 === void 0 ? void 0 : _prevConnector$off3.call(prevConnector, 'error', onError);
1000
+ if (!connector) return;
1001
+ (_connector$on = connector.on) === null || _connector$on === void 0 ? void 0 : _connector$on.call(connector, 'change', onChange);
1002
+ (_connector$on2 = connector.on) === null || _connector$on2 === void 0 ? void 0 : _connector$on2.call(connector, 'disconnect', onDisconnect);
1003
+ (_connector$on3 = connector.on) === null || _connector$on3 === void 0 ? void 0 : _connector$on3.call(connector, 'error', onError);
1004
+ });
1005
+ const {
1006
+ provider,
1007
+ webSocketProvider
1008
+ } = this.config;
1009
+ const subscribeProvider = typeof provider === 'function';
1010
+ const subscribeWebSocketProvider = typeof webSocketProvider === 'function';
1011
+ if (subscribeProvider || subscribeWebSocketProvider) this.store.subscribe(_ref3 => {
1012
+ var _data$chain2;
1013
+
1014
+ let {
1015
+ data
1016
+ } = _ref3;
1017
+ return data === null || data === void 0 ? void 0 : (_data$chain2 = data.chain) === null || _data$chain2 === void 0 ? void 0 : _data$chain2.id;
1018
+ }, chainId => {
1019
+ this.setState(x => ({ ...x,
1020
+ provider: subscribeProvider ? provider({
1021
+ chainId
1022
+ }) : x.provider,
1023
+ webSocketProvider: subscribeWebSocketProvider ? webSocketProvider({
1024
+ chainId
1025
+ }) : x.webSocketProvider
1026
+ }));
1027
+ });
1028
+ }
1029
+
1030
+ let client;
1031
+ function createClient(config) {
1032
+ const client_ = new Client(config);
1033
+ client = client_;
1034
+ return client_;
1035
+ }
1036
+ function getClient() {
1037
+ if (!client) {
1038
+ throw new Error('No wagmi client found. Ensure you have set up a client: https://wagmi.sh/docs/client');
1039
+ }
1040
+
1041
+ return client;
1042
+ }
1043
+
1044
+ function getProvider() {
1045
+ let {
1046
+ chainId
1047
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
1048
+ const client = getClient();
1049
+ if (chainId && typeof client.config.provider === 'function') return client.config.provider({
1050
+ chainId
1051
+ });
1052
+ return client.provider;
1053
+ }
1054
+
1055
+ export { AddChainError as A, ConnectorAlreadyConnectedError as C, InjectedConnector as I, ProviderChainsNotFound as P, ResourceUnavailableError as R, SwitchChainNotSupportedError as S, UserRejectedRequestError as U, _classPrivateMethodInitSpec as _, ConnectorNotFoundError as a, ChainMismatchError as b, ContractMethodDoesNotExistError as c, getProvider as d, ChainDoesNotSupportMulticallError as e, ContractMethodRevertedError as f, getClient as g, ContractMethodNoResultError as h, ContractResultDecodeError as i, createClient as j, Client as k, Connector as l, ChainNotConfiguredError as m, normalizeChainId as n, ProviderRpcError as o, RpcError as p, SwitchChainError as q, createStorage as r, noopStorage as s, _defineProperty as t, _classPrivateMethodGet as u, _classPrivateFieldInitSpec as v, _classPrivateFieldSet as w, _classPrivateFieldGet as x };