@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,1515 @@
1
+ import { g as getClient, C as ConnectorAlreadyConnectedError, a as ConnectorNotFoundError, b as ChainMismatchError, U as UserRejectedRequestError, c as ContractMethodDoesNotExistError, d as getProvider, P as ProviderChainsNotFound, e as ChainDoesNotSupportMulticallError, f as ContractMethodRevertedError, h as ContractMethodNoResultError, i as ContractResultDecodeError, n as normalizeChainId, S as SwitchChainNotSupportedError } from './getProvider-34b63ce9.esm.js';
2
+ export { A as AddChainError, e as ChainDoesNotSupportMulticallError, b as ChainMismatchError, m as ChainNotConfiguredError, k as Client, l as Connector, C as ConnectorAlreadyConnectedError, a as ConnectorNotFoundError, c as ContractMethodDoesNotExistError, h as ContractMethodNoResultError, f as ContractMethodRevertedError, i as ContractResultDecodeError, I as InjectedConnector, P as ProviderChainsNotFound, o as ProviderRpcError, R as ResourceUnavailableError, p as RpcError, q as SwitchChainError, S as SwitchChainNotSupportedError, U as UserRejectedRequestError, j as createClient, r as createStorage, d as getProvider, s as noopStorage, n as normalizeChainId } from './getProvider-34b63ce9.esm.js';
3
+ import { providers, Contract as Contract$1 } from 'ethers';
4
+ import { Contract, logger } from 'ethers/lib/ethers';
5
+ import { FormatTypes, formatUnits, getAddress, isAddress, Logger } from 'ethers/lib/utils';
6
+ import { m as mainnet } from './chains-de91362e.esm.js';
7
+ export { a as allChains, c as chain, b as chainId, d as defaultChains, e as defaultL2Chains, f as etherscanBlockExplorers } from './chains-de91362e.esm.js';
8
+ import shallow from 'zustand/shallow';
9
+ export { a as alchemyRpcUrls, i as infuraRpcUrls, p as publicRpcUrls } from './rpcs-f39d022b.esm.js';
10
+ import 'zustand/middleware';
11
+ import 'zustand/vanilla';
12
+ import 'eventemitter3';
13
+
14
+ function configureChains(defaultChains, providers) {
15
+ let {
16
+ minQuorum = 1,
17
+ pollingInterval = 4000,
18
+ targetQuorum = 1,
19
+ stallTimeout
20
+ } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
21
+ if (!defaultChains.length) throw new Error('must have at least one chain');
22
+ if (targetQuorum < minQuorum) throw new Error('quorum cannot be lower than minQuorum');
23
+ let chains = [];
24
+ const providers_ = {};
25
+ const webSocketProviders_ = {};
26
+
27
+ for (const chain of defaultChains) {
28
+ let configExists = false;
29
+
30
+ for (const provider of providers) {
31
+ const apiConfig = provider(chain); // If no API configuration was found (ie. no RPC URL) for
32
+ // this provider, then we skip and check the next one.
33
+
34
+ if (!apiConfig) continue;
35
+ configExists = true;
36
+
37
+ if (!chains.some(_ref => {
38
+ let {
39
+ id
40
+ } = _ref;
41
+ return id === chain.id;
42
+ })) {
43
+ chains = [...chains, apiConfig.chain];
44
+ }
45
+
46
+ providers_[chain.id] = [...(providers_[chain.id] || []), apiConfig.provider];
47
+
48
+ if (apiConfig.webSocketProvider) {
49
+ webSocketProviders_[chain.id] = [...(webSocketProviders_[chain.id] || []), apiConfig.webSocketProvider];
50
+ }
51
+ } // If no API configuration was found across the providers
52
+ // then we throw an error to the consumer.
53
+
54
+
55
+ if (!configExists) {
56
+ throw new Error(["Could not find valid provider configuration for chain \"".concat(chain.name, "\".\n"), "You may need to add `jsonRpcProvider` to `configureChains` with the chain's RPC URLs.", 'Read more: https://wagmi.sh/docs/providers/jsonRpc'].join('\n'));
57
+ }
58
+ }
59
+
60
+ return {
61
+ chains,
62
+ provider: _ref2 => {
63
+ var _defaultChains$;
64
+
65
+ let {
66
+ chainId
67
+ } = _ref2;
68
+ const activeChainId = chainId && chains.some(x => x.id === chainId) ? chainId : (_defaultChains$ = defaultChains[0]) === null || _defaultChains$ === void 0 ? void 0 : _defaultChains$.id;
69
+ const chainProviders = providers_[activeChainId];
70
+ if (!chainProviders || !chainProviders[0]) throw new Error("No providers configured for chain \"".concat(activeChainId, "\""));
71
+
72
+ if (chainProviders.length === 1) {
73
+ return Object.assign(chainProviders[0](), {
74
+ chains,
75
+ pollingInterval
76
+ });
77
+ }
78
+
79
+ return Object.assign(fallbackProvider(targetQuorum, minQuorum, chainProviders, {
80
+ stallTimeout
81
+ }), {
82
+ chains,
83
+ pollingInterval
84
+ });
85
+ },
86
+ webSocketProvider: _ref3 => {
87
+ var _defaultChains$2, _chainWebSocketProvid;
88
+
89
+ let {
90
+ chainId
91
+ } = _ref3;
92
+ const activeChainId = chainId && chains.some(x => x.id === chainId) ? chainId : (_defaultChains$2 = defaultChains[0]) === null || _defaultChains$2 === void 0 ? void 0 : _defaultChains$2.id;
93
+ const chainWebSocketProviders = webSocketProviders_[activeChainId];
94
+ if (!chainWebSocketProviders) return undefined; // WebSockets do not work with `fallbackProvider`
95
+ // Default to first available
96
+
97
+ return Object.assign(((_chainWebSocketProvid = chainWebSocketProviders[0]) === null || _chainWebSocketProvid === void 0 ? void 0 : _chainWebSocketProvid.call(chainWebSocketProviders)) || {}, {
98
+ chains
99
+ });
100
+ }
101
+ };
102
+ }
103
+
104
+ function fallbackProvider(targetQuorum, minQuorum, providers_, _ref4) {
105
+ let {
106
+ stallTimeout
107
+ } = _ref4;
108
+
109
+ try {
110
+ return new providers.FallbackProvider(providers_.map((chainProvider, index) => {
111
+ var _provider$priority, _provider$stallTimeou;
112
+
113
+ const provider = chainProvider();
114
+ return {
115
+ provider,
116
+ priority: (_provider$priority = provider.priority) !== null && _provider$priority !== void 0 ? _provider$priority : index,
117
+ stallTimeout: (_provider$stallTimeou = provider.stallTimeout) !== null && _provider$stallTimeou !== void 0 ? _provider$stallTimeou : stallTimeout,
118
+ weight: provider.weight
119
+ };
120
+ }), targetQuorum);
121
+ } catch (error) {
122
+ var _error$message;
123
+
124
+ if (error !== null && error !== void 0 && (_error$message = error.message) !== null && _error$message !== void 0 && _error$message.includes('quorum will always fail; larger than total weight')) {
125
+ if (targetQuorum === minQuorum) throw error;
126
+ return fallbackProvider(targetQuorum - 1, minQuorum, providers_, {
127
+ stallTimeout
128
+ });
129
+ }
130
+
131
+ throw error;
132
+ }
133
+ }
134
+
135
+ /** Forked from https://github.com/epoberezkin/fast-deep-equal */
136
+ function deepEqual(a, b) {
137
+ if (a === b) return true;
138
+
139
+ if (a && b && typeof a === 'object' && typeof b === 'object') {
140
+ if (a.constructor !== b.constructor) return false;
141
+ let length;
142
+ let i;
143
+
144
+ if (Array.isArray(a) && Array.isArray(b)) {
145
+ length = a.length;
146
+ if (length != b.length) return false;
147
+
148
+ for (i = length; i-- !== 0;) if (!deepEqual(a[i], b[i])) return false;
149
+
150
+ return true;
151
+ }
152
+
153
+ if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();
154
+ if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();
155
+ const keys = Object.keys(a);
156
+ length = keys.length;
157
+ if (length !== Object.keys(b).length) return false;
158
+
159
+ for (i = length; i-- !== 0;) if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;
160
+
161
+ for (i = length; i-- !== 0;) {
162
+ const key = keys[i];
163
+ if (key && !deepEqual(a[key], b[key])) return false;
164
+ }
165
+
166
+ return true;
167
+ } // true if both NaN, false otherwise
168
+
169
+
170
+ return a !== a && b !== b;
171
+ }
172
+
173
+ function minimizeContractInterface(_ref) {
174
+ let {
175
+ contractInterface,
176
+ functionName
177
+ } = _ref;
178
+ const abi = Contract.getInterface(contractInterface).format(FormatTypes.full);
179
+ const minimizedInterface = Array.isArray(abi) ? abi : [abi];
180
+ return minimizedInterface.filter(i => i.includes(functionName));
181
+ }
182
+
183
+ function isPlainArray(value) {
184
+ return Array.isArray(value) && Object.keys(value).length === value.length;
185
+ }
186
+
187
+ function parseContractResult(_ref) {
188
+ let {
189
+ contractInterface,
190
+ data,
191
+ functionName
192
+ } = _ref;
193
+
194
+ if (data && isPlainArray(data)) {
195
+ var _fragment$outputs;
196
+
197
+ const iface = Contract.getInterface(contractInterface);
198
+ const fragment = iface.getFunction(functionName);
199
+ const isTuple = (((_fragment$outputs = fragment.outputs) === null || _fragment$outputs === void 0 ? void 0 : _fragment$outputs.length) || 0) > 1;
200
+ const data_ = isTuple ? data : [data];
201
+ const encodedResult = iface.encodeFunctionResult(functionName, data_);
202
+ const decodedResult = iface.decodeFunctionResult(functionName, encodedResult);
203
+ return isTuple ? decodedResult : decodedResult[0];
204
+ }
205
+
206
+ return data;
207
+ }
208
+
209
+ // https://ethereum.org/en/developers/docs/standards/tokens/erc-20
210
+ const erc20ABI = ['event Approval(address indexed _owner, address indexed _spender, uint256 _value)', 'event Transfer(address indexed _from, address indexed _to, uint256 _value)', 'function allowance(address _owner, address _spender) public view returns (uint256 remaining)', 'function approve(address _spender, uint256 _value) public returns (bool success)', 'function balanceOf(address _owner) public view returns (uint256 balance)', 'function decimals() public view returns (uint8)', 'function name() public view returns (string)', 'function symbol() public view returns (string)', 'function totalSupply() public view returns (uint256)', 'function transfer(address _to, uint256 _value) public returns (bool success)', 'function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)']; // https://ethereum.org/en/developers/docs/standards/tokens/erc-721
211
+
212
+ const erc721ABI = ['event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId)', 'event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved)', 'event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId)', 'function approve(address _approved, uint256 _tokenId) external payable', 'function balanceOf(address _owner) external view returns (uint256)', 'function getApproved(uint256 _tokenId) external view returns (address)', 'function isApprovedForAll(address _owner, address _operator) external view returns (bool)', 'function name() view returns (string memory)', 'function ownerOf(uint256 _tokenId) external view returns (address)', 'function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable', 'function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable', 'function setApprovalForAll(address _operator, bool _approved) external', 'function symbol() view returns (string memory)', 'function tokenByIndex(uint256 _index) view returns (uint256)', 'function tokenOfOwnerByIndex(address _owner, uint256 _index) view returns (uint256 tokenId)', 'function tokenURI(uint256 _tokenId) view returns (string memory)', 'function totalSupply() view returns (uint256)', 'function transferFrom(address _from, address _to, uint256 _tokenId) external payable'];
213
+
214
+ const multicallInterface = [{
215
+ inputs: [{
216
+ components: [{
217
+ internalType: 'address',
218
+ name: 'target',
219
+ type: 'address'
220
+ }, {
221
+ internalType: 'bool',
222
+ name: 'allowFailure',
223
+ type: 'bool'
224
+ }, {
225
+ internalType: 'bytes',
226
+ name: 'callData',
227
+ type: 'bytes'
228
+ }],
229
+ internalType: 'struct Multicall3.Call3[]',
230
+ name: 'calls',
231
+ type: 'tuple[]'
232
+ }],
233
+ name: 'aggregate3',
234
+ outputs: [{
235
+ components: [{
236
+ internalType: 'bool',
237
+ name: 'success',
238
+ type: 'bool'
239
+ }, {
240
+ internalType: 'bytes',
241
+ name: 'returnData',
242
+ type: 'bytes'
243
+ }],
244
+ internalType: 'struct Multicall3.Result[]',
245
+ name: 'returnData',
246
+ type: 'tuple[]'
247
+ }],
248
+ stateMutability: 'view',
249
+ type: 'function'
250
+ }];
251
+
252
+ // https://github.com/ethers-io/ethers.js/blob/master/packages/units/src.ts/index.ts#L10-L18
253
+ const units = ['wei', 'kwei', 'mwei', 'gwei', 'szabo', 'finney', 'ether'];
254
+
255
+ async function connect(_ref) {
256
+ let {
257
+ chainId,
258
+ connector
259
+ } = _ref;
260
+ const client = getClient();
261
+ const activeConnector = client.connector;
262
+ if (connector.id === (activeConnector === null || activeConnector === void 0 ? void 0 : activeConnector.id)) throw new ConnectorAlreadyConnectedError();
263
+
264
+ try {
265
+ client.setState(x => ({ ...x,
266
+ status: 'connecting'
267
+ }));
268
+ const data = await connector.connect({
269
+ chainId
270
+ });
271
+ client.setLastUsedConnector(connector.id);
272
+ client.setState(x => ({ ...x,
273
+ connector,
274
+ chains: connector === null || connector === void 0 ? void 0 : connector.chains,
275
+ data,
276
+ status: 'connected'
277
+ }));
278
+ client.storage.setItem('connected', true);
279
+ return { ...data,
280
+ connector
281
+ };
282
+ } catch (err) {
283
+ client.setState(x => {
284
+ return { ...x,
285
+ // Keep existing connector connected in case of error
286
+ status: x.connector ? 'connected' : 'disconnected'
287
+ };
288
+ });
289
+ throw err;
290
+ }
291
+ }
292
+
293
+ async function disconnect() {
294
+ const client = getClient();
295
+ if (client.connector) await client.connector.disconnect();
296
+ client.clearState();
297
+ client.storage.removeItem('connected');
298
+ }
299
+
300
+ function getContract(_ref) {
301
+ let {
302
+ addressOrName,
303
+ contractInterface,
304
+ signerOrProvider
305
+ } = _ref;
306
+ return new Contract$1(addressOrName, contractInterface, signerOrProvider);
307
+ }
308
+
309
+ async function deprecatedWriteContract(_ref) {
310
+ let {
311
+ addressOrName,
312
+ args,
313
+ chainId,
314
+ contractInterface,
315
+ functionName,
316
+ overrides,
317
+ signerOrProvider
318
+ } = _ref;
319
+ const {
320
+ connector
321
+ } = getClient();
322
+ if (!connector) throw new ConnectorNotFoundError();
323
+ const params = [...(Array.isArray(args) ? args : args ? [args] : []), ...(overrides ? [overrides] : [])];
324
+
325
+ try {
326
+ var _chain;
327
+
328
+ let chain;
329
+
330
+ if (chainId) {
331
+ const activeChainId = await connector.getChainId(); // Try to switch chain to provided `chainId`
332
+
333
+ if (chainId !== activeChainId) {
334
+ var _connector$chains$fin, _connector$chains$fin2, _connector$chains$fin3, _connector$chains$fin4;
335
+
336
+ if (connector.switchChain) chain = await connector.switchChain(chainId);else throw new ChainMismatchError({
337
+ activeChain: (_connector$chains$fin = (_connector$chains$fin2 = connector.chains.find(x => x.id === activeChainId)) === null || _connector$chains$fin2 === void 0 ? void 0 : _connector$chains$fin2.name) !== null && _connector$chains$fin !== void 0 ? _connector$chains$fin : "Chain ".concat(activeChainId),
338
+ targetChain: (_connector$chains$fin3 = (_connector$chains$fin4 = connector.chains.find(x => x.id === chainId)) === null || _connector$chains$fin4 === void 0 ? void 0 : _connector$chains$fin4.name) !== null && _connector$chains$fin3 !== void 0 ? _connector$chains$fin3 : "Chain ".concat(chainId)
339
+ });
340
+ }
341
+ }
342
+
343
+ const signer = await connector.getSigner({
344
+ chainId: (_chain = chain) === null || _chain === void 0 ? void 0 : _chain.id
345
+ });
346
+ const contract = getContract({
347
+ addressOrName,
348
+ contractInterface,
349
+ signerOrProvider
350
+ });
351
+ const contractWithSigner = contract.connect(signer);
352
+ const contractFunction = contractWithSigner[functionName];
353
+ if (!contractFunction) console.warn("\"".concat(functionName, "\" does not exist in interface for contract \"").concat(addressOrName, "\""));
354
+ return await contractFunction(...params);
355
+ } catch (error) {
356
+ if (error.code === 4001) throw new UserRejectedRequestError(error);
357
+ throw error;
358
+ }
359
+ }
360
+
361
+ async function fetchToken(_ref) {
362
+ let {
363
+ address,
364
+ chainId,
365
+ formatUnits: units = 'ether'
366
+ } = _ref;
367
+ const erc20Config = {
368
+ addressOrName: address,
369
+ contractInterface: erc20ABI,
370
+ chainId
371
+ };
372
+ const [decimals, name, symbol, totalSupply] = await readContracts({
373
+ allowFailure: false,
374
+ contracts: [{ ...erc20Config,
375
+ functionName: 'decimals'
376
+ }, { ...erc20Config,
377
+ functionName: 'name'
378
+ }, { ...erc20Config,
379
+ functionName: 'symbol'
380
+ }, { ...erc20Config,
381
+ functionName: 'totalSupply'
382
+ }]
383
+ });
384
+ return {
385
+ address,
386
+ decimals,
387
+ name,
388
+ symbol,
389
+ totalSupply: {
390
+ formatted: formatUnits(totalSupply, units),
391
+ value: totalSupply
392
+ }
393
+ };
394
+ }
395
+
396
+ /**
397
+ * @description Prepares the parameters required for a contract write transaction.
398
+ *
399
+ * Returns config to be passed through to `writeContract`.
400
+ *
401
+ * @example
402
+ * import { prepareWriteContract, writeContract } from '@wagmi/core'
403
+ *
404
+ * const config = await prepareWriteContract({
405
+ * addressOrName: '0x...',
406
+ * contractInterface: wagmiAbi,
407
+ * functionName: 'mint',
408
+ * })
409
+ * const result = await writeContract(config)
410
+ */
411
+ async function prepareWriteContract(_ref) {
412
+ let {
413
+ addressOrName,
414
+ args,
415
+ chainId,
416
+ contractInterface: contractInterface_,
417
+ functionName,
418
+ overrides,
419
+ signer: signer_
420
+ } = _ref;
421
+ const signer = signer_ !== null && signer_ !== void 0 ? signer_ : await fetchSigner();
422
+ if (!signer) throw new ConnectorNotFoundError();
423
+ const contract = getContract({
424
+ addressOrName,
425
+ contractInterface: contractInterface_,
426
+ signerOrProvider: signer
427
+ });
428
+ const populateTransactionFn = contract.populateTransaction[functionName];
429
+
430
+ if (!populateTransactionFn) {
431
+ throw new ContractMethodDoesNotExistError({
432
+ addressOrName,
433
+ functionName
434
+ });
435
+ }
436
+
437
+ const contractInterface = minimizeContractInterface({
438
+ contractInterface: contract.interface,
439
+ functionName
440
+ });
441
+ const params = [...(Array.isArray(args) ? args : args ? [args] : []), ...(overrides ? [overrides] : [])];
442
+ const unsignedTransaction = await populateTransactionFn(...params);
443
+ const gasLimit = unsignedTransaction.gasLimit || (await signer.estimateGas(unsignedTransaction));
444
+ return {
445
+ addressOrName,
446
+ args,
447
+ ...(chainId ? {
448
+ chainId
449
+ } : {}),
450
+ contractInterface,
451
+ functionName,
452
+ overrides,
453
+ request: { ...unsignedTransaction,
454
+ gasLimit
455
+ },
456
+ mode: 'prepared'
457
+ };
458
+ }
459
+
460
+ function getWebSocketProvider() {
461
+ let {
462
+ chainId
463
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
464
+ const client = getClient();
465
+ if (chainId && typeof client.config.webSocketProvider === 'function') return client.config.webSocketProvider({
466
+ chainId
467
+ });
468
+ return client.webSocketProvider;
469
+ }
470
+
471
+ function watchProvider(args, callback) {
472
+ const client = getClient();
473
+
474
+ const handleChange = async () => callback(getProvider(args));
475
+
476
+ const unsubscribe = client.subscribe(_ref => {
477
+ let {
478
+ provider
479
+ } = _ref;
480
+ return provider;
481
+ }, handleChange);
482
+ return unsubscribe;
483
+ }
484
+
485
+ function watchWebSocketProvider(args, callback) {
486
+ const client = getClient();
487
+
488
+ const handleChange = async () => callback(getWebSocketProvider(args));
489
+
490
+ const unsubscribe = client.subscribe(_ref => {
491
+ let {
492
+ webSocketProvider
493
+ } = _ref;
494
+ return webSocketProvider;
495
+ }, handleChange);
496
+ return unsubscribe;
497
+ }
498
+
499
+ async function readContract(_ref) {
500
+ let {
501
+ addressOrName,
502
+ args,
503
+ chainId,
504
+ contractInterface,
505
+ functionName,
506
+ overrides
507
+ } = _ref;
508
+ const provider = getProvider({
509
+ chainId
510
+ });
511
+ const contract = getContract({
512
+ addressOrName,
513
+ contractInterface,
514
+ signerOrProvider: provider
515
+ });
516
+ const params = [...(Array.isArray(args) ? args : args ? [args] : []), ...(overrides ? [overrides] : [])];
517
+ const contractFunction = contract[functionName];
518
+ if (!contractFunction) console.warn("\"".concat(functionName, "\" is not in the interface for contract \"").concat(addressOrName, "\""));
519
+ const response = await (contractFunction === null || contractFunction === void 0 ? void 0 : contractFunction(...params));
520
+ return response;
521
+ }
522
+
523
+ async function multicall(_ref) {
524
+ let {
525
+ allowFailure = true,
526
+ chainId,
527
+ contracts,
528
+ overrides
529
+ } = _ref;
530
+ const provider = getProvider({
531
+ chainId
532
+ });
533
+ if (!provider.chains) throw new ProviderChainsNotFound();
534
+ const chain = provider.chains.find(chain => chain.id === chainId) || provider.chains[0];
535
+ if (!chain) throw new ProviderChainsNotFound();
536
+ if (!(chain !== null && chain !== void 0 && chain.multicall)) throw new ChainDoesNotSupportMulticallError({
537
+ chain
538
+ });
539
+ if (typeof (overrides === null || overrides === void 0 ? void 0 : overrides.blockTag) === 'number' && (overrides === null || overrides === void 0 ? void 0 : overrides.blockTag) < chain.multicall.blockCreated) throw new ChainDoesNotSupportMulticallError({
540
+ blockNumber: overrides === null || overrides === void 0 ? void 0 : overrides.blockTag,
541
+ chain
542
+ });
543
+ const multicallContract = getContract({
544
+ addressOrName: chain.multicall.address,
545
+ contractInterface: multicallInterface,
546
+ signerOrProvider: provider
547
+ });
548
+ const calls = contracts.map(_ref2 => {
549
+ let {
550
+ addressOrName,
551
+ contractInterface,
552
+ functionName,
553
+ ...config
554
+ } = _ref2;
555
+ const {
556
+ args
557
+ } = config || {};
558
+ const contract = getContract({
559
+ addressOrName,
560
+ contractInterface
561
+ });
562
+ const params = Array.isArray(args) ? args : args ? [args] : [];
563
+
564
+ try {
565
+ const callData = contract.interface.encodeFunctionData(functionName, params);
566
+ if (!contract[functionName]) console.warn("\"".concat(functionName, "\" is not in the interface for contract \"").concat(addressOrName, "\""));
567
+ return {
568
+ target: addressOrName,
569
+ allowFailure,
570
+ callData
571
+ };
572
+ } catch (err) {
573
+ if (!allowFailure) throw err;
574
+ return {
575
+ target: addressOrName,
576
+ allowFailure,
577
+ callData: '0x'
578
+ };
579
+ }
580
+ });
581
+ const params = [...[calls], ...(overrides ? [overrides] : [])];
582
+ const results = await multicallContract.aggregate3(...params);
583
+ return results.map((_ref3, i) => {
584
+ let {
585
+ returnData,
586
+ success
587
+ } = _ref3;
588
+ const {
589
+ addressOrName,
590
+ contractInterface,
591
+ functionName,
592
+ args
593
+ } = contracts[i];
594
+ const contract = getContract({
595
+ addressOrName,
596
+ contractInterface
597
+ });
598
+
599
+ if (!success) {
600
+ let error;
601
+
602
+ try {
603
+ contract.interface.decodeFunctionResult(functionName, returnData);
604
+ } catch (err) {
605
+ error = new ContractMethodRevertedError({
606
+ addressOrName,
607
+ args,
608
+ chainId: chain.id,
609
+ functionName,
610
+ errorMessage: err.message
611
+ });
612
+ if (!allowFailure) throw error;
613
+ console.warn(error.message);
614
+ }
615
+
616
+ return null;
617
+ }
618
+
619
+ if (returnData === '0x') {
620
+ const error = new ContractMethodNoResultError({
621
+ addressOrName,
622
+ args,
623
+ chainId: chain.id,
624
+ functionName
625
+ });
626
+ if (!allowFailure) throw error;
627
+ console.warn(error.message);
628
+ return null;
629
+ }
630
+
631
+ try {
632
+ const result = contract.interface.decodeFunctionResult(functionName, returnData);
633
+ return Array.isArray(result) && result.length === 1 ? result[0] : result;
634
+ } catch (err) {
635
+ const error = new ContractResultDecodeError({
636
+ addressOrName,
637
+ args,
638
+ chainId: chain.id,
639
+ functionName,
640
+ errorMessage: err.message
641
+ });
642
+ if (!allowFailure) throw error;
643
+ console.warn(error.message);
644
+ return null;
645
+ }
646
+ });
647
+ }
648
+
649
+ async function readContracts(_ref) {
650
+ let {
651
+ allowFailure = true,
652
+ contracts,
653
+ overrides
654
+ } = _ref;
655
+
656
+ try {
657
+ const provider = getProvider();
658
+ const contractsByChainId = contracts.reduce((contracts, contract) => {
659
+ var _contract$chainId;
660
+
661
+ const chainId = (_contract$chainId = contract.chainId) !== null && _contract$chainId !== void 0 ? _contract$chainId : provider.network.chainId;
662
+ return { ...contracts,
663
+ [chainId]: [...(contracts[chainId] || []), contract]
664
+ };
665
+ }, {});
666
+
667
+ const promises = () => Object.entries(contractsByChainId).map(_ref2 => {
668
+ let [chainId, contracts] = _ref2;
669
+ return multicall({
670
+ allowFailure,
671
+ chainId: parseInt(chainId),
672
+ contracts,
673
+ overrides
674
+ });
675
+ });
676
+
677
+ if (allowFailure) {
678
+ return (await Promise.allSettled(promises())).map(result => {
679
+ if (result.status === 'fulfilled') return result.value;
680
+
681
+ if (result.reason instanceof ChainDoesNotSupportMulticallError) {
682
+ console.warn(result.reason.message);
683
+ throw result.reason;
684
+ }
685
+
686
+ return null;
687
+ }).flat();
688
+ }
689
+
690
+ return (await Promise.all(promises())).flat();
691
+ } catch (err) {
692
+ if (err instanceof ContractResultDecodeError) throw err;
693
+ if (err instanceof ContractMethodNoResultError) throw err;
694
+ if (err instanceof ContractMethodRevertedError) throw err;
695
+
696
+ const promises = () => contracts.map(contract => readContract({ ...contract,
697
+ overrides
698
+ }));
699
+
700
+ if (allowFailure) {
701
+ return (await Promise.allSettled(promises())).map((result, i) => {
702
+ if (result.status === 'fulfilled') return result.value;
703
+ const {
704
+ addressOrName,
705
+ functionName,
706
+ chainId,
707
+ args
708
+ } = contracts[i];
709
+ const error = new ContractMethodRevertedError({
710
+ addressOrName,
711
+ functionName,
712
+ chainId: chainId !== null && chainId !== void 0 ? chainId : mainnet.id,
713
+ args,
714
+ errorMessage: result.reason
715
+ });
716
+ console.warn(error.message);
717
+ return null;
718
+ });
719
+ }
720
+
721
+ return await Promise.all(promises());
722
+ }
723
+ }
724
+
725
+ function watchContractEvent(
726
+ /** Contract configuration */
727
+ contractArgs,
728
+ /** Event name to listen to */
729
+ eventName, callback) {
730
+ let {
731
+ chainId,
732
+ once
733
+ } = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
734
+ let contract;
735
+
736
+ const watchEvent = async () => {
737
+ if (contract) {
738
+ var _contract;
739
+
740
+ (_contract = contract) === null || _contract === void 0 ? void 0 : _contract.off(eventName, callback);
741
+ }
742
+
743
+ contract = getContract({
744
+ signerOrProvider: getWebSocketProvider({
745
+ chainId
746
+ }) || getProvider({
747
+ chainId
748
+ }),
749
+ ...contractArgs
750
+ });
751
+ if (once) contract.once(eventName, callback);else contract.on(eventName, callback);
752
+ };
753
+
754
+ watchEvent();
755
+ const client = getClient();
756
+ const unsubscribe = client.subscribe(_ref => {
757
+ let {
758
+ provider,
759
+ webSocketProvider
760
+ } = _ref;
761
+ return {
762
+ provider,
763
+ webSocketProvider
764
+ };
765
+ }, watchEvent, {
766
+ equalityFn: shallow
767
+ });
768
+ return () => {
769
+ var _contract2;
770
+
771
+ (_contract2 = contract) === null || _contract2 === void 0 ? void 0 : _contract2.off(eventName, callback);
772
+ unsubscribe();
773
+ };
774
+ }
775
+
776
+ async function fetchBlockNumber() {
777
+ let {
778
+ chainId
779
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
780
+ const provider = getProvider({
781
+ chainId
782
+ });
783
+ const blockNumber = await provider.getBlockNumber();
784
+ return blockNumber;
785
+ }
786
+
787
+ function watchBlockNumber(args, callback) {
788
+ var _client$webSocketProv;
789
+
790
+ let previousProvider;
791
+
792
+ const createListener = provider => {
793
+ if (previousProvider) {
794
+ var _previousProvider;
795
+
796
+ (_previousProvider = previousProvider) === null || _previousProvider === void 0 ? void 0 : _previousProvider.off('block', callback);
797
+ }
798
+
799
+ provider.on('block', callback);
800
+ previousProvider = provider;
801
+ };
802
+
803
+ const client = getClient();
804
+ const provider_ = (_client$webSocketProv = client.webSocketProvider) !== null && _client$webSocketProv !== void 0 ? _client$webSocketProv : client.provider;
805
+ if (args.listen) createListener(provider_);
806
+ const unsubscribe = client.subscribe(_ref => {
807
+ let {
808
+ provider,
809
+ webSocketProvider
810
+ } = _ref;
811
+ return {
812
+ provider,
813
+ webSocketProvider
814
+ };
815
+ }, async _ref2 => {
816
+ let {
817
+ provider,
818
+ webSocketProvider
819
+ } = _ref2;
820
+ const provider_ = webSocketProvider !== null && webSocketProvider !== void 0 ? webSocketProvider : provider;
821
+
822
+ if (args.listen && provider_) {
823
+ createListener(provider_);
824
+ }
825
+
826
+ callback(await fetchBlockNumber());
827
+ }, {
828
+ equalityFn: shallow
829
+ });
830
+ return () => {
831
+ unsubscribe();
832
+ provider_ === null || provider_ === void 0 ? void 0 : provider_.off('block', callback);
833
+ };
834
+ }
835
+
836
+ function watchReadContract(config, callback) {
837
+ const client = getClient();
838
+
839
+ const handleChange = async () => callback(await readContract(config));
840
+
841
+ const unwatch = config.listenToBlock ? watchBlockNumber({
842
+ listen: true
843
+ }, handleChange) : undefined;
844
+ const unsubscribe = client.subscribe(_ref => {
845
+ let {
846
+ provider
847
+ } = _ref;
848
+ return provider;
849
+ }, handleChange);
850
+ return () => {
851
+ unsubscribe();
852
+ unwatch === null || unwatch === void 0 ? void 0 : unwatch();
853
+ };
854
+ }
855
+
856
+ function watchReadContracts(config, callback) {
857
+ const client = getClient();
858
+
859
+ const handleChange = async () => callback(await readContracts(config));
860
+
861
+ const unwatch = config.listenToBlock ? watchBlockNumber({
862
+ listen: true
863
+ }, handleChange) : undefined;
864
+ const unsubscribe = client.subscribe(_ref => {
865
+ let {
866
+ provider
867
+ } = _ref;
868
+ return provider;
869
+ }, handleChange);
870
+ return () => {
871
+ unsubscribe();
872
+ unwatch === null || unwatch === void 0 ? void 0 : unwatch();
873
+ };
874
+ }
875
+
876
+ async function deprecatedSendTransaction(_ref) {
877
+ let {
878
+ chainId,
879
+ request
880
+ } = _ref;
881
+ const {
882
+ connector
883
+ } = getClient();
884
+ if (!connector) throw new ConnectorNotFoundError();
885
+
886
+ try {
887
+ var _chain;
888
+
889
+ let chain;
890
+
891
+ if (chainId) {
892
+ const activeChainId = await connector.getChainId(); // Try to switch chain to provided `chainId`
893
+
894
+ if (chainId !== activeChainId) {
895
+ var _connector$chains$fin, _connector$chains$fin2, _connector$chains$fin3, _connector$chains$fin4;
896
+
897
+ if (connector.switchChain) chain = await connector.switchChain(chainId);else throw new ChainMismatchError({
898
+ activeChain: (_connector$chains$fin = (_connector$chains$fin2 = connector.chains.find(x => x.id === activeChainId)) === null || _connector$chains$fin2 === void 0 ? void 0 : _connector$chains$fin2.name) !== null && _connector$chains$fin !== void 0 ? _connector$chains$fin : "Chain ".concat(activeChainId),
899
+ targetChain: (_connector$chains$fin3 = (_connector$chains$fin4 = connector.chains.find(x => x.id === chainId)) === null || _connector$chains$fin4 === void 0 ? void 0 : _connector$chains$fin4.name) !== null && _connector$chains$fin3 !== void 0 ? _connector$chains$fin3 : "Chain ".concat(chainId)
900
+ });
901
+ }
902
+ }
903
+
904
+ const signer = await connector.getSigner({
905
+ chainId: (_chain = chain) === null || _chain === void 0 ? void 0 : _chain.id
906
+ });
907
+ return await signer.sendTransaction(request);
908
+ } catch (error) {
909
+ if (error.code === 4001) throw new UserRejectedRequestError(error);
910
+ throw error;
911
+ }
912
+ }
913
+
914
+ /**
915
+ * @description Fetches transaction for hash
916
+ *
917
+ * @example
918
+ * import { fetchTransaction } from '@wagmi/core'
919
+ *
920
+ * const transaction = await fetchTransaction({
921
+ * chainId: 1,
922
+ * hash: '0x...',
923
+ * })
924
+ */
925
+ async function fetchTransaction(_ref) {
926
+ let {
927
+ chainId,
928
+ hash
929
+ } = _ref;
930
+ const provider = getProvider({
931
+ chainId
932
+ });
933
+ return await provider.getTransaction(hash);
934
+ }
935
+
936
+ async function fetchEnsAddress(_ref) {
937
+ let {
938
+ chainId,
939
+ name
940
+ } = _ref;
941
+ const provider = getProvider({
942
+ chainId
943
+ });
944
+ const address = await provider.resolveName(name);
945
+
946
+ try {
947
+ return address ? getAddress(address) : null;
948
+ } catch (_error) {
949
+ return null;
950
+ }
951
+ }
952
+
953
+ async function fetchEnsAvatar(_ref) {
954
+ let {
955
+ addressOrName,
956
+ chainId
957
+ } = _ref;
958
+ const provider = getProvider({
959
+ chainId
960
+ }); // TODO: Update with more advanced logic
961
+ // https://github.com/ensdomains/ens-avatar
962
+
963
+ const avatar = await provider.getAvatar(addressOrName);
964
+ return avatar;
965
+ }
966
+
967
+ async function fetchEnsName(_ref) {
968
+ let {
969
+ address,
970
+ chainId
971
+ } = _ref;
972
+ const provider = getProvider({
973
+ chainId
974
+ });
975
+ return await provider.lookupAddress(address);
976
+ }
977
+
978
+ async function fetchEnsResolver(_ref) {
979
+ let {
980
+ chainId,
981
+ name
982
+ } = _ref;
983
+ const provider = getProvider({
984
+ chainId
985
+ });
986
+ const resolver = await provider.getResolver(name);
987
+ return resolver;
988
+ }
989
+
990
+ /**
991
+ * @description Prepares the parameters required for sending a transaction.
992
+ *
993
+ * Returns config to be passed through to `sendTransaction`.
994
+ *
995
+ * @example
996
+ * import { prepareSendTransaction, sendTransaction } from '@wagmi/core'
997
+ *
998
+ * const config = await prepareSendTransaction({
999
+ * request: {
1000
+ * to: 'moxey.eth',
1001
+ * value: parseEther('1'),
1002
+ * }
1003
+ * })
1004
+ * const result = await sendTransaction(config)
1005
+ */
1006
+ async function prepareSendTransaction(_ref) {
1007
+ let {
1008
+ chainId,
1009
+ request,
1010
+ signerOrProvider = getProvider({
1011
+ chainId
1012
+ })
1013
+ } = _ref;
1014
+ const [to, gasLimit] = await Promise.all([isAddress(request.to) ? Promise.resolve(request.to) : fetchEnsAddress({
1015
+ name: request.to
1016
+ }), request.gasLimit ? Promise.resolve(request.gasLimit) : signerOrProvider.estimateGas(request)]);
1017
+ if (!to) throw new Error('Could not resolve ENS name');
1018
+ return { ...(chainId ? {
1019
+ chainId
1020
+ } : {}),
1021
+ request: { ...request,
1022
+ gasLimit,
1023
+ to
1024
+ },
1025
+ mode: 'prepared'
1026
+ };
1027
+ }
1028
+
1029
+ /**
1030
+ * @description Function to send a transaction.
1031
+ *
1032
+ * It is recommended to pair this with the `prepareSendTransaction` function to avoid
1033
+ * [UX pitfalls](https://wagmi.sh/docs/prepare-hooks/intro#ux-pitfalls-without-prepare-hooks).
1034
+ *
1035
+ * @example
1036
+ * import { prepareSendTransaction, sendTransaction } from '@wagmi/core'
1037
+ *
1038
+ * const config = await prepareSendTransaction({
1039
+ * to: 'moxey.eth',
1040
+ * value: parseEther('1'),
1041
+ * })
1042
+ * const result = await sendTransaction(config)
1043
+ */
1044
+ async function sendTransaction(_ref) {
1045
+ let {
1046
+ chainId,
1047
+ mode,
1048
+ request
1049
+ } = _ref;
1050
+
1051
+ /********************************************************************/
1052
+
1053
+ /** START: iOS App Link cautious code. */
1054
+
1055
+ /** Do not perform any async operations in this block. */
1056
+
1057
+ /** Ref: wagmi.sh/docs/prepare-hooks/intro#ios-app-link-constraints */
1058
+
1059
+ /********************************************************************/
1060
+ // `fetchSigner` isn't really "asynchronous" as we have already
1061
+ // initialized the provider upon user connection, so it will return
1062
+ // immediately.
1063
+ const signer = await fetchSigner();
1064
+ if (!signer) throw new ConnectorNotFoundError();
1065
+
1066
+ if (mode === 'prepared') {
1067
+ if (!request.gasLimit) throw new Error('`gasLimit` is required');
1068
+ if (!request.to) throw new Error('`to` is required');
1069
+ }
1070
+
1071
+ const {
1072
+ chain: activeChain,
1073
+ chains
1074
+ } = getNetwork();
1075
+ const activeChainId = activeChain === null || activeChain === void 0 ? void 0 : activeChain.id;
1076
+
1077
+ if (chainId && chainId !== (activeChain === null || activeChain === void 0 ? void 0 : activeChain.id)) {
1078
+ var _chains$find$name, _chains$find, _chains$find$name2, _chains$find2;
1079
+
1080
+ throw new ChainMismatchError({
1081
+ activeChain: (_chains$find$name = (_chains$find = chains.find(x => x.id === activeChainId)) === null || _chains$find === void 0 ? void 0 : _chains$find.name) !== null && _chains$find$name !== void 0 ? _chains$find$name : "Chain ".concat(activeChainId),
1082
+ targetChain: (_chains$find$name2 = (_chains$find2 = chains.find(x => x.id === chainId)) === null || _chains$find2 === void 0 ? void 0 : _chains$find2.name) !== null && _chains$find$name2 !== void 0 ? _chains$find$name2 : "Chain ".concat(chainId)
1083
+ });
1084
+ }
1085
+
1086
+ try {
1087
+ var _connectUnchecked, _ref2;
1088
+
1089
+ // Why don't we just use `signer.sendTransaction`?
1090
+ // The `signer.sendTransaction` method performs async
1091
+ // heavy operations (such as fetching block number)
1092
+ // which is not really needed for our case.
1093
+ // Having async heavy operations has side effects
1094
+ // when using it in a click handler (iOS deep linking issues,
1095
+ // delay to open wallet, etc).
1096
+ const uncheckedSigner = (_connectUnchecked = (_ref2 = signer).connectUnchecked) === null || _connectUnchecked === void 0 ? void 0 : _connectUnchecked.call(_ref2);
1097
+ const {
1098
+ hash,
1099
+ wait
1100
+ } = await (uncheckedSigner !== null && uncheckedSigner !== void 0 ? uncheckedSigner : signer).sendTransaction(request);
1101
+ /********************************************************************/
1102
+
1103
+ /** END: iOS App Link cautious code. */
1104
+
1105
+ /** Go nuts! */
1106
+
1107
+ /********************************************************************/
1108
+
1109
+ return {
1110
+ hash,
1111
+ wait
1112
+ };
1113
+ } catch (error) {
1114
+ if (error.code === 4001) throw new UserRejectedRequestError(error);
1115
+ throw error;
1116
+ }
1117
+ }
1118
+
1119
+ async function waitForTransaction(_ref) {
1120
+ let {
1121
+ chainId,
1122
+ confirmations,
1123
+ hash,
1124
+ timeout,
1125
+ wait: wait_
1126
+ } = _ref;
1127
+ let promise;
1128
+
1129
+ if (hash) {
1130
+ const provider = getProvider({
1131
+ chainId
1132
+ });
1133
+ promise = provider.waitForTransaction(hash, confirmations, timeout);
1134
+ } else if (wait_) promise = wait_(confirmations);else throw new Error('hash or wait is required');
1135
+
1136
+ return await promise;
1137
+ }
1138
+
1139
+ /**
1140
+ * @description Function to call a contract write method.
1141
+ *
1142
+ * It is recommended to pair this with the {@link prepareWriteContract} function
1143
+ * to avoid [UX pitfalls](https://wagmi.sh/docs/prepare-hooks/intro#ux-pitfalls-without-prepare-hooks).
1144
+ *
1145
+ * @example
1146
+ * import { prepareWriteContract, writeContract } from '@wagmi/core'
1147
+ *
1148
+ * const config = await prepareWriteContract({
1149
+ * addressOrName: '0x...',
1150
+ * contractInterface: wagmiAbi,
1151
+ * functionName: 'mint',
1152
+ * })
1153
+ * const result = await writeContract(config)
1154
+ */
1155
+ async function writeContract(_ref) {
1156
+ let {
1157
+ addressOrName,
1158
+ args,
1159
+ chainId,
1160
+ contractInterface,
1161
+ functionName,
1162
+ mode,
1163
+ overrides,
1164
+ request: request_
1165
+ } = _ref;
1166
+
1167
+ /********************************************************************/
1168
+
1169
+ /** START: iOS App Link cautious code. */
1170
+
1171
+ /** Do not perform any async operations in this block. */
1172
+
1173
+ /** Ref: wagmi.sh/docs/prepare-hooks/intro#ios-app-link-constraints */
1174
+
1175
+ /********************************************************************/
1176
+ const signer = await fetchSigner();
1177
+ if (!signer) throw new ConnectorNotFoundError();
1178
+ const {
1179
+ chain: activeChain,
1180
+ chains
1181
+ } = getNetwork();
1182
+ const activeChainId = activeChain === null || activeChain === void 0 ? void 0 : activeChain.id;
1183
+
1184
+ if (chainId && chainId !== activeChainId) {
1185
+ var _chains$find$name, _chains$find, _chains$find$name2, _chains$find2;
1186
+
1187
+ throw new ChainMismatchError({
1188
+ activeChain: (_chains$find$name = (_chains$find = chains.find(x => x.id === activeChainId)) === null || _chains$find === void 0 ? void 0 : _chains$find.name) !== null && _chains$find$name !== void 0 ? _chains$find$name : "Chain ".concat(activeChainId),
1189
+ targetChain: (_chains$find$name2 = (_chains$find2 = chains.find(x => x.id === chainId)) === null || _chains$find2 === void 0 ? void 0 : _chains$find2.name) !== null && _chains$find$name2 !== void 0 ? _chains$find$name2 : "Chain ".concat(chainId)
1190
+ });
1191
+ }
1192
+
1193
+ if (mode === 'prepared') {
1194
+ if (!request_) throw new Error('`request` is required');
1195
+ }
1196
+
1197
+ const request = mode === 'recklesslyUnprepared' ? (await prepareWriteContract({
1198
+ addressOrName,
1199
+ args,
1200
+ contractInterface,
1201
+ functionName,
1202
+ overrides
1203
+ })).request : request_;
1204
+ const transaction = await sendTransaction({
1205
+ request,
1206
+ mode: 'prepared'
1207
+ });
1208
+ /********************************************************************/
1209
+
1210
+ /** END: iOS App Link cautious code. */
1211
+
1212
+ /** Go nuts! */
1213
+
1214
+ /********************************************************************/
1215
+
1216
+ return transaction;
1217
+ }
1218
+
1219
+ async function fetchBalance(_ref) {
1220
+ var _client$chains, _chain$nativeCurrency, _chain$nativeCurrency2, _chain$nativeCurrency3, _chain$nativeCurrency4;
1221
+
1222
+ let {
1223
+ addressOrName,
1224
+ chainId,
1225
+ formatUnits: unit,
1226
+ token
1227
+ } = _ref;
1228
+ const client = getClient();
1229
+ const provider = getProvider({
1230
+ chainId
1231
+ });
1232
+
1233
+ if (token) {
1234
+ const erc20Config = {
1235
+ addressOrName: token,
1236
+ contractInterface: erc20ABI,
1237
+ chainId
1238
+ }; // Convert ENS name to address if required
1239
+
1240
+ let resolvedAddress;
1241
+ if (isAddress(addressOrName)) resolvedAddress = addressOrName;else {
1242
+ const address = await provider.resolveName(addressOrName); // Same error `provider.getBalance` throws for invalid ENS name
1243
+
1244
+ if (!address) logger.throwError('ENS name not configured', Logger.errors.UNSUPPORTED_OPERATION, {
1245
+ operation: "resolveName(".concat(JSON.stringify(addressOrName), ")")
1246
+ });
1247
+ resolvedAddress = address;
1248
+ }
1249
+ const [value, decimals, symbol] = await readContracts({
1250
+ allowFailure: false,
1251
+ contracts: [{ ...erc20Config,
1252
+ functionName: 'balanceOf',
1253
+ args: resolvedAddress
1254
+ }, { ...erc20Config,
1255
+ functionName: 'decimals'
1256
+ }, { ...erc20Config,
1257
+ functionName: 'symbol'
1258
+ }]
1259
+ });
1260
+ return {
1261
+ decimals,
1262
+ formatted: formatUnits(value !== null && value !== void 0 ? value : '0', unit !== null && unit !== void 0 ? unit : decimals),
1263
+ symbol,
1264
+ value
1265
+ };
1266
+ }
1267
+
1268
+ const chains = [...(client.provider.chains || []), ...((_client$chains = client.chains) !== null && _client$chains !== void 0 ? _client$chains : [])];
1269
+ const value = await provider.getBalance(addressOrName);
1270
+ const chain = chains.find(x => x.id === provider.network.chainId);
1271
+ return {
1272
+ decimals: (_chain$nativeCurrency = chain === null || chain === void 0 ? void 0 : (_chain$nativeCurrency2 = chain.nativeCurrency) === null || _chain$nativeCurrency2 === void 0 ? void 0 : _chain$nativeCurrency2.decimals) !== null && _chain$nativeCurrency !== void 0 ? _chain$nativeCurrency : 18,
1273
+ formatted: formatUnits(value !== null && value !== void 0 ? value : '0', unit !== null && unit !== void 0 ? unit : 'ether'),
1274
+ symbol: (_chain$nativeCurrency3 = chain === null || chain === void 0 ? void 0 : (_chain$nativeCurrency4 = chain.nativeCurrency) === null || _chain$nativeCurrency4 === void 0 ? void 0 : _chain$nativeCurrency4.symbol) !== null && _chain$nativeCurrency3 !== void 0 ? _chain$nativeCurrency3 : 'ETH',
1275
+ value
1276
+ };
1277
+ }
1278
+
1279
+ async function fetchSigner() {
1280
+ var _client$connector, _client$connector$get;
1281
+
1282
+ const client = getClient();
1283
+ const signer = (await ((_client$connector = client.connector) === null || _client$connector === void 0 ? void 0 : (_client$connector$get = _client$connector.getSigner) === null || _client$connector$get === void 0 ? void 0 : _client$connector$get.call(_client$connector))) || null;
1284
+ return signer;
1285
+ }
1286
+
1287
+ function getAccount() {
1288
+ const {
1289
+ data,
1290
+ connector,
1291
+ status
1292
+ } = getClient();
1293
+
1294
+ switch (status) {
1295
+ case 'connected':
1296
+ return {
1297
+ address: data === null || data === void 0 ? void 0 : data.account,
1298
+ connector: connector,
1299
+ isConnected: true,
1300
+ isConnecting: false,
1301
+ isDisconnected: false,
1302
+ isReconnecting: false,
1303
+ status
1304
+ };
1305
+
1306
+ case 'reconnecting':
1307
+ return {
1308
+ address: data === null || data === void 0 ? void 0 : data.account,
1309
+ connector,
1310
+ isConnected: !!(data !== null && data !== void 0 && data.account),
1311
+ isConnecting: false,
1312
+ isDisconnected: false,
1313
+ isReconnecting: true,
1314
+ status
1315
+ };
1316
+
1317
+ case 'connecting':
1318
+ return {
1319
+ address: undefined,
1320
+ connector: undefined,
1321
+ isConnected: false,
1322
+ isConnecting: true,
1323
+ isDisconnected: false,
1324
+ isReconnecting: false,
1325
+ status
1326
+ };
1327
+
1328
+ case 'disconnected':
1329
+ return {
1330
+ address: undefined,
1331
+ connector: undefined,
1332
+ isConnected: false,
1333
+ isConnecting: false,
1334
+ isDisconnected: true,
1335
+ isReconnecting: false,
1336
+ status
1337
+ };
1338
+ }
1339
+ }
1340
+
1341
+ function getNetwork() {
1342
+ var _client$data, _client$data$chain, _client$chains, _find, _client$data2;
1343
+
1344
+ const client = getClient();
1345
+ const chainId = (_client$data = client.data) === null || _client$data === void 0 ? void 0 : (_client$data$chain = _client$data.chain) === null || _client$data$chain === void 0 ? void 0 : _client$data$chain.id;
1346
+ const activeChains = (_client$chains = client.chains) !== null && _client$chains !== void 0 ? _client$chains : [];
1347
+ const activeChain = (_find = [...(client.provider.chains || []), ...activeChains].find(x => x.id === chainId)) !== null && _find !== void 0 ? _find : {
1348
+ id: chainId,
1349
+ name: "Chain ".concat(chainId),
1350
+ network: "".concat(chainId),
1351
+ rpcUrls: {
1352
+ default: ''
1353
+ }
1354
+ };
1355
+ return {
1356
+ chain: chainId ? { ...activeChain,
1357
+ ...((_client$data2 = client.data) === null || _client$data2 === void 0 ? void 0 : _client$data2.chain),
1358
+ id: chainId
1359
+ } : undefined,
1360
+ chains: activeChains
1361
+ };
1362
+ }
1363
+
1364
+ async function signMessage(args) {
1365
+ try {
1366
+ const signer = await fetchSigner();
1367
+ if (!signer) throw new ConnectorNotFoundError();
1368
+ return await signer.signMessage(args.message);
1369
+ } catch (error) {
1370
+ if (error.code === 4001) throw new UserRejectedRequestError(error);
1371
+ throw error;
1372
+ }
1373
+ }
1374
+
1375
+ async function signTypedData(_ref) {
1376
+ let {
1377
+ domain,
1378
+ types,
1379
+ value
1380
+ } = _ref;
1381
+ const signer = await fetchSigner();
1382
+ if (!signer) throw new ConnectorNotFoundError();
1383
+ const {
1384
+ chain: activeChain,
1385
+ chains
1386
+ } = getNetwork();
1387
+ const {
1388
+ chainId: chainId_
1389
+ } = domain;
1390
+
1391
+ if (chainId_) {
1392
+ const chainId = normalizeChainId(chainId_);
1393
+ const activeChainId = activeChain === null || activeChain === void 0 ? void 0 : activeChain.id;
1394
+
1395
+ if (chainId !== (activeChain === null || activeChain === void 0 ? void 0 : activeChain.id)) {
1396
+ var _chains$find$name, _chains$find, _chains$find$name2, _chains$find2;
1397
+
1398
+ throw new ChainMismatchError({
1399
+ activeChain: (_chains$find$name = (_chains$find = chains.find(x => x.id === activeChainId)) === null || _chains$find === void 0 ? void 0 : _chains$find.name) !== null && _chains$find$name !== void 0 ? _chains$find$name : "Chain ".concat(activeChainId),
1400
+ targetChain: (_chains$find$name2 = (_chains$find2 = chains.find(x => x.id === chainId)) === null || _chains$find2 === void 0 ? void 0 : _chains$find2.name) !== null && _chains$find$name2 !== void 0 ? _chains$find$name2 : "Chain ".concat(chainId)
1401
+ });
1402
+ }
1403
+ } // Method name may be changed in the future, see https://docs.ethers.io/v5/api/signer/#Signer-signTypedData
1404
+
1405
+
1406
+ return await signer._signTypedData(domain, types, value);
1407
+ }
1408
+
1409
+ async function switchNetwork(_ref) {
1410
+ let {
1411
+ chainId
1412
+ } = _ref;
1413
+ const {
1414
+ connector
1415
+ } = getClient();
1416
+ if (!connector) throw new ConnectorNotFoundError();
1417
+ if (!connector.switchChain) throw new SwitchChainNotSupportedError({
1418
+ connector
1419
+ });
1420
+ return await connector.switchChain(chainId);
1421
+ }
1422
+
1423
+ function watchAccount(callback) {
1424
+ let {
1425
+ selector = x => x
1426
+ } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1427
+ const client = getClient();
1428
+
1429
+ const handleChange = () => callback(getAccount());
1430
+
1431
+ const unsubscribe = client.subscribe(_ref => {
1432
+ let {
1433
+ data,
1434
+ connector,
1435
+ status
1436
+ } = _ref;
1437
+ return selector({
1438
+ address: data === null || data === void 0 ? void 0 : data.account,
1439
+ connector,
1440
+ status
1441
+ });
1442
+ }, handleChange, {
1443
+ equalityFn: shallow
1444
+ });
1445
+ return unsubscribe;
1446
+ }
1447
+
1448
+ function watchNetwork(callback) {
1449
+ let {
1450
+ selector = x => x
1451
+ } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1452
+ const client = getClient();
1453
+
1454
+ const handleChange = () => callback(getNetwork());
1455
+
1456
+ const unsubscribe = client.subscribe(_ref => {
1457
+ var _data$chain;
1458
+
1459
+ let {
1460
+ data,
1461
+ chains
1462
+ } = _ref;
1463
+ return selector({
1464
+ chainId: data === null || data === void 0 ? void 0 : (_data$chain = data.chain) === null || _data$chain === void 0 ? void 0 : _data$chain.id,
1465
+ chains
1466
+ });
1467
+ }, handleChange, {
1468
+ equalityFn: shallow
1469
+ });
1470
+ return unsubscribe;
1471
+ }
1472
+
1473
+ function watchSigner(callback) {
1474
+ const client = getClient();
1475
+
1476
+ const handleChange = async () => callback(await fetchSigner());
1477
+
1478
+ const unsubscribe = client.subscribe(_ref => {
1479
+ var _data$chain;
1480
+
1481
+ let {
1482
+ data,
1483
+ connector
1484
+ } = _ref;
1485
+ return {
1486
+ account: data === null || data === void 0 ? void 0 : data.account,
1487
+ chainId: data === null || data === void 0 ? void 0 : (_data$chain = data.chain) === null || _data$chain === void 0 ? void 0 : _data$chain.id,
1488
+ connector
1489
+ };
1490
+ }, handleChange, {
1491
+ equalityFn: shallow
1492
+ });
1493
+ return unsubscribe;
1494
+ }
1495
+
1496
+ async function fetchFeeData() {
1497
+ let {
1498
+ chainId,
1499
+ formatUnits: units = 'wei'
1500
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
1501
+ const provider = getProvider({
1502
+ chainId
1503
+ });
1504
+ const feeData = await provider.getFeeData();
1505
+ const formatted = {
1506
+ gasPrice: feeData.gasPrice ? formatUnits(feeData.gasPrice, units) : null,
1507
+ maxFeePerGas: feeData.maxFeePerGas ? formatUnits(feeData.maxFeePerGas, units) : null,
1508
+ maxPriorityFeePerGas: feeData.maxPriorityFeePerGas ? formatUnits(feeData.maxPriorityFeePerGas, units) : null
1509
+ };
1510
+ return { ...feeData,
1511
+ formatted
1512
+ };
1513
+ }
1514
+
1515
+ export { configureChains, connect, deepEqual, deprecatedSendTransaction, deprecatedWriteContract, disconnect, erc20ABI, erc721ABI, fetchBalance, fetchBlockNumber, fetchEnsAddress, fetchEnsAvatar, fetchEnsName, fetchEnsResolver, fetchFeeData, fetchSigner, fetchToken, fetchTransaction, getAccount, getContract, getNetwork, getWebSocketProvider, minimizeContractInterface, parseContractResult, prepareSendTransaction, prepareWriteContract, readContract, readContracts, sendTransaction, signMessage, signTypedData, switchNetwork, units, waitForTransaction, watchAccount, watchBlockNumber, watchContractEvent, watchNetwork, watchProvider, watchReadContract, watchReadContracts, watchSigner, watchWebSocketProvider, writeContract };