@wagmi/core 0.5.5 → 0.5.7

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 (54) hide show
  1. package/chains/dist/wagmi-core-chains.cjs.dev.js +2 -2
  2. package/chains/dist/wagmi-core-chains.cjs.prod.js +2 -2
  3. package/chains/dist/wagmi-core-chains.esm.js +2 -2
  4. package/connectors/coinbaseWallet/dist/wagmi-core-connectors-coinbaseWallet.cjs.dev.js +10 -6
  5. package/connectors/coinbaseWallet/dist/wagmi-core-connectors-coinbaseWallet.cjs.prod.js +10 -6
  6. package/connectors/coinbaseWallet/dist/wagmi-core-connectors-coinbaseWallet.esm.js +10 -6
  7. package/connectors/metaMask/dist/wagmi-core-connectors-metaMask.cjs.dev.js +3 -3
  8. package/connectors/metaMask/dist/wagmi-core-connectors-metaMask.cjs.prod.js +3 -3
  9. package/connectors/metaMask/dist/wagmi-core-connectors-metaMask.esm.js +3 -3
  10. package/connectors/mock/dist/wagmi-core-connectors-mock.cjs.dev.js +3 -3
  11. package/connectors/mock/dist/wagmi-core-connectors-mock.cjs.prod.js +3 -3
  12. package/connectors/mock/dist/wagmi-core-connectors-mock.esm.js +3 -3
  13. package/connectors/walletConnect/dist/wagmi-core-connectors-walletConnect.cjs.dev.js +3 -3
  14. package/connectors/walletConnect/dist/wagmi-core-connectors-walletConnect.cjs.prod.js +3 -3
  15. package/connectors/walletConnect/dist/wagmi-core-connectors-walletConnect.esm.js +3 -3
  16. package/dist/{chains-868f0ac6.cjs.prod.js → chains-789e0c2e.cjs.prod.js} +2 -1
  17. package/dist/{chains-5ceae8b1.esm.js → chains-8c76af1b.esm.js} +3 -2
  18. package/dist/{chains-4fdb21bc.cjs.dev.js → chains-ec1de502.cjs.dev.js} +2 -1
  19. package/dist/debounce-0862bf88.esm.js +18 -0
  20. package/dist/debounce-2d836dc9.cjs.prod.js +20 -0
  21. package/dist/debounce-46ac0312.cjs.dev.js +20 -0
  22. package/dist/declarations/src/client.d.ts +16 -2
  23. package/dist/declarations/src/constants/rpcs.d.ts +1 -1
  24. package/dist/declarations/src/errors.d.ts +23 -2
  25. package/dist/declarations/src/index.d.ts +1 -1
  26. package/dist/declarations/src/internal.d.ts +1 -0
  27. package/dist/declarations/src/utils/debounce.d.ts +1 -0
  28. package/dist/declarations/src/utils/index.d.ts +2 -1
  29. package/dist/declarations/src/utils/logger.d.ts +1 -0
  30. package/dist/{getProvider-316a5d3f.cjs.dev.js → getProvider-1b3eeda8.cjs.dev.js} +117 -35
  31. package/dist/{getProvider-51ad330f.cjs.prod.js → getProvider-ad4ce6a4.cjs.prod.js} +117 -35
  32. package/dist/{getProvider-a6708613.esm.js → getProvider-f1dfc7e3.esm.js} +116 -36
  33. package/dist/{rpcs-6e1b1718.esm.js → rpcs-8d636858.esm.js} +1 -0
  34. package/dist/{rpcs-3326627e.cjs.dev.js → rpcs-d2cd65f1.cjs.dev.js} +1 -0
  35. package/dist/{rpcs-45537550.cjs.prod.js → rpcs-edec227e.cjs.prod.js} +1 -0
  36. package/dist/wagmi-core.cjs.dev.js +112 -37
  37. package/dist/wagmi-core.cjs.prod.js +112 -37
  38. package/dist/wagmi-core.esm.js +109 -35
  39. package/internal/dist/wagmi-core-internal.cjs.d.ts +1 -0
  40. package/internal/dist/wagmi-core-internal.cjs.dev.js +9 -0
  41. package/internal/dist/wagmi-core-internal.cjs.js +7 -0
  42. package/internal/dist/wagmi-core-internal.cjs.prod.js +9 -0
  43. package/internal/dist/wagmi-core-internal.esm.js +1 -0
  44. package/internal/package.json +4 -0
  45. package/package.json +7 -1
  46. package/providers/alchemy/dist/wagmi-core-providers-alchemy.cjs.dev.js +1 -1
  47. package/providers/alchemy/dist/wagmi-core-providers-alchemy.cjs.prod.js +1 -1
  48. package/providers/alchemy/dist/wagmi-core-providers-alchemy.esm.js +1 -1
  49. package/providers/coinbaseNode/dist/wagmi-core-providers-coinbaseNode.cjs.d.ts +11 -0
  50. package/providers/coinbaseNode/dist/wagmi-core-providers-coinbaseNode.cjs.js +16 -0
  51. package/providers/infura/dist/wagmi-core-providers-infura.cjs.dev.js +1 -1
  52. package/providers/infura/dist/wagmi-core-providers-infura.cjs.prod.js +1 -1
  53. package/providers/infura/dist/wagmi-core-providers-infura.esm.js +1 -1
  54. package/dist/declarations/src/utils/warn.d.ts +0 -1
@@ -3,7 +3,7 @@ import create from 'zustand/vanilla';
3
3
  import { providers } from 'ethers';
4
4
  import { getAddress, hexValue } from 'ethers/lib/utils';
5
5
  import EventEmitter from 'eventemitter3';
6
- import { d as defaultChains } from './chains-5ceae8b1.esm.js';
6
+ import { d as defaultChains } from './chains-8c76af1b.esm.js';
7
7
 
8
8
  function _checkPrivateRedeclaration(obj, privateCollection) {
9
9
  if (privateCollection.has(obj)) {
@@ -232,29 +232,65 @@ class ContractMethodDoesNotExistError extends Error {
232
232
  }
233
233
  class ContractMethodNoResultError extends Error {
234
234
  constructor(_ref5) {
235
- var _chain$blockExplorers2;
236
-
237
235
  let {
238
236
  addressOrName,
237
+ args,
239
238
  chainId,
240
239
  functionName
241
240
  } = _ref5;
242
- const {
243
- chains,
244
- network
245
- } = getProvider();
246
- const chain = chains === null || chains === void 0 ? void 0 : chains.find(_ref6 => {
247
- let {
248
- id
249
- } = _ref6;
250
- return id === (chainId || network.chainId);
251
- });
252
- const blockExplorer = chain === null || chain === void 0 ? void 0 : (_chain$blockExplorers2 = chain.blockExplorers) === null || _chain$blockExplorers2 === void 0 ? void 0 : _chain$blockExplorers2.default;
253
- super(["Function \"".concat(functionName, "\" on contract \"").concat(addressOrName, "\" returned an empty response."), '', "Are you sure the function \"".concat(functionName, "\" exists on this contract?"), ...(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'));
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'));
254
248
 
255
249
  _defineProperty(this, "name", 'ContractMethodNoResultError');
256
250
  }
257
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
+
258
294
  }
259
295
  class ProviderChainsNotFound extends Error {
260
296
  constructor() {
@@ -283,10 +319,10 @@ class SwitchChainError extends ProviderRpcError {
283
319
 
284
320
  }
285
321
  class SwitchChainNotSupportedError extends Error {
286
- constructor(_ref7) {
322
+ constructor(_ref8) {
287
323
  let {
288
324
  connector
289
- } = _ref7;
325
+ } = _ref8;
290
326
  super("\"".concat(connector.name, "\" does not support programmatic chain switching."));
291
327
 
292
328
  _defineProperty(this, "name", 'SwitchChainNotSupportedError');
@@ -732,6 +768,9 @@ class Client {
732
768
  storage = createStorage({
733
769
  storage: typeof window !== 'undefined' ? window.localStorage : noopStorage
734
770
  }),
771
+ logger = {
772
+ warn: console.warn
773
+ },
735
774
  webSocketProvider: _webSocketProvider
736
775
  } = _ref;
737
776
 
@@ -739,10 +778,14 @@ class Client {
739
778
 
740
779
  _defineProperty(this, "config", void 0);
741
780
 
781
+ _defineProperty(this, "providers", new Map());
782
+
742
783
  _defineProperty(this, "storage", void 0);
743
784
 
744
785
  _defineProperty(this, "store", void 0);
745
786
 
787
+ _defineProperty(this, "webSocketProviders", new Map());
788
+
746
789
  _classPrivateFieldInitSpec(this, _isAutoConnecting, {
747
790
  writable: true,
748
791
  value: void 0
@@ -753,7 +796,15 @@ class Client {
753
796
  value: void 0
754
797
  });
755
798
 
756
- // Check status for autoConnect flag
799
+ this.config = {
800
+ autoConnect,
801
+ connectors,
802
+ logger,
803
+ provider: _provider,
804
+ storage,
805
+ webSocketProvider: _webSocketProvider
806
+ }; // Check status for autoConnect flag
807
+
757
808
  let status = 'disconnected';
758
809
 
759
810
  let _chainId;
@@ -773,13 +824,13 @@ class Client {
773
824
 
774
825
  this.store = create(subscribeWithSelector(persist(() => ({
775
826
  connectors: typeof connectors === 'function' ? connectors() : connectors,
776
- provider: typeof _provider === 'function' ? _provider({
827
+ provider: this.getProvider({
777
828
  chainId: _chainId
778
- }) : _provider,
829
+ }),
779
830
  status,
780
- webSocketProvider: typeof _webSocketProvider === 'function' ? _webSocketProvider({
831
+ webSocketProvider: this.getWebSocketProvider({
781
832
  chainId: _chainId
782
- }) : _webSocketProvider
833
+ })
783
834
  }), {
784
835
  name: storeKey,
785
836
  getStorage: () => storage,
@@ -797,13 +848,6 @@ class Client {
797
848
  },
798
849
  version: 1
799
850
  })));
800
- this.config = {
801
- autoConnect,
802
- connectors,
803
- provider: _provider,
804
- storage,
805
- webSocketProvider: _webSocketProvider
806
- };
807
851
  this.storage = storage;
808
852
 
809
853
  _classPrivateFieldSet(this, _lastUsedConnector, storage === null || storage === void 0 ? void 0 : storage.getItem('wallet'));
@@ -922,6 +966,40 @@ class Client {
922
966
  return this.data;
923
967
  }
924
968
 
969
+ getProvider() {
970
+ let {
971
+ bust,
972
+ chainId
973
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
974
+ let provider_ = this.providers.get(chainId !== null && chainId !== void 0 ? chainId : -1);
975
+ if (provider_ && !bust) return provider_;
976
+ const {
977
+ provider
978
+ } = this.config;
979
+ provider_ = typeof provider === 'function' ? provider({
980
+ chainId
981
+ }) : provider;
982
+ this.providers.set(chainId !== null && chainId !== void 0 ? chainId : -1, provider_);
983
+ return provider_;
984
+ }
985
+
986
+ getWebSocketProvider() {
987
+ let {
988
+ bust,
989
+ chainId
990
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
991
+ let webSocketProvider_ = this.webSocketProviders.get(chainId !== null && chainId !== void 0 ? chainId : -1);
992
+ if (webSocketProvider_ && !bust) return webSocketProvider_;
993
+ const {
994
+ webSocketProvider
995
+ } = this.config;
996
+ webSocketProvider_ = typeof webSocketProvider === 'function' ? webSocketProvider({
997
+ chainId
998
+ }) : webSocketProvider;
999
+ if (webSocketProvider_) this.webSocketProviders.set(chainId !== null && chainId !== void 0 ? chainId : -1, webSocketProvider_);
1000
+ return webSocketProvider_;
1001
+ }
1002
+
925
1003
  setLastUsedConnector() {
926
1004
  var _this$storage;
927
1005
 
@@ -981,12 +1059,14 @@ function _addEffects2() {
981
1059
  return data === null || data === void 0 ? void 0 : (_data$chain2 = data.chain) === null || _data$chain2 === void 0 ? void 0 : _data$chain2.id;
982
1060
  }, chainId => {
983
1061
  this.setState(x => ({ ...x,
984
- provider: subscribeProvider ? provider({
1062
+ provider: this.getProvider({
1063
+ bust: true,
985
1064
  chainId
986
- }) : x.provider,
987
- webSocketProvider: subscribeWebSocketProvider ? webSocketProvider({
1065
+ }),
1066
+ webSocketProvider: this.getWebSocketProvider({
1067
+ bust: true,
988
1068
  chainId
989
- }) : x.webSocketProvider
1069
+ })
990
1070
  }));
991
1071
  });
992
1072
  }
@@ -1010,10 +1090,10 @@ function getProvider() {
1010
1090
  chainId
1011
1091
  } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
1012
1092
  const client = getClient();
1013
- if (chainId && typeof client.config.provider === 'function') return client.config.provider({
1093
+ if (chainId) return client.getProvider({
1014
1094
  chainId
1015
- });
1095
+ }) || client.provider;
1016
1096
  return client.provider;
1017
1097
  }
1018
1098
 
1019
- 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, ContractMethodNoResultError as f, getClient as g, createClient as h, Client as i, Connector as j, ChainNotConfiguredError as k, ProviderRpcError as l, RpcError as m, normalizeChainId as n, SwitchChainError as o, createStorage as p, noopStorage as q, _defineProperty as r, _classPrivateFieldInitSpec as s, _classPrivateFieldGet as t, _classPrivateFieldSet as u, _classPrivateMethodGet as v };
1099
+ 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, _classPrivateFieldInitSpec as u, _classPrivateFieldGet as v, _classPrivateFieldSet as w, _classPrivateMethodGet as x };
@@ -21,6 +21,7 @@ const infuraRpcUrls = {
21
21
  rinkeby: 'https://rinkeby.infura.io/v3',
22
22
  goerli: 'https://goerli.infura.io/v3',
23
23
  kovan: 'https://kovan.infura.io/v3',
24
+ sepolia: 'https://sepolia.infura.io/v3',
24
25
  optimism: 'https://optimism-mainnet.infura.io/v3',
25
26
  optimismKovan: 'https://optimism-kovan.infura.io/v3',
26
27
  optimismGoerli: 'https://optimism-goerli.infura.io/v3',
@@ -23,6 +23,7 @@ const infuraRpcUrls = {
23
23
  rinkeby: 'https://rinkeby.infura.io/v3',
24
24
  goerli: 'https://goerli.infura.io/v3',
25
25
  kovan: 'https://kovan.infura.io/v3',
26
+ sepolia: 'https://sepolia.infura.io/v3',
26
27
  optimism: 'https://optimism-mainnet.infura.io/v3',
27
28
  optimismKovan: 'https://optimism-kovan.infura.io/v3',
28
29
  optimismGoerli: 'https://optimism-goerli.infura.io/v3',
@@ -23,6 +23,7 @@ const infuraRpcUrls = {
23
23
  rinkeby: 'https://rinkeby.infura.io/v3',
24
24
  goerli: 'https://goerli.infura.io/v3',
25
25
  kovan: 'https://kovan.infura.io/v3',
26
+ sepolia: 'https://sepolia.infura.io/v3',
26
27
  optimism: 'https://optimism-mainnet.infura.io/v3',
27
28
  optimismKovan: 'https://optimism-kovan.infura.io/v3',
28
29
  optimismGoerli: 'https://optimism-goerli.infura.io/v3',
@@ -2,13 +2,14 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var getProvider = require('./getProvider-316a5d3f.cjs.dev.js');
5
+ var getProvider = require('./getProvider-1b3eeda8.cjs.dev.js');
6
6
  var ethers = require('ethers');
7
7
  var ethers$1 = require('ethers/lib/ethers');
8
8
  var utils = require('ethers/lib/utils');
9
+ var chains = require('./chains-ec1de502.cjs.dev.js');
9
10
  var shallow = require('zustand/shallow');
10
- var rpcs = require('./rpcs-3326627e.cjs.dev.js');
11
- var chains = require('./chains-4fdb21bc.cjs.dev.js');
11
+ var debounce = require('./debounce-46ac0312.cjs.dev.js');
12
+ var rpcs = require('./rpcs-d2cd65f1.cjs.dev.js');
12
13
  require('zustand/middleware');
13
14
  require('zustand/vanilla');
14
15
  require('eventemitter3');
@@ -176,6 +177,12 @@ function deepEqual(a, b) {
176
177
  return a !== a && b !== b;
177
178
  }
178
179
 
180
+ function logWarn(message) {
181
+ var _getClient, _getClient$config$log, _getClient$config$log2;
182
+
183
+ (_getClient = getProvider.getClient()) === null || _getClient === void 0 ? void 0 : (_getClient$config$log = _getClient.config.logger) === null || _getClient$config$log === void 0 ? void 0 : (_getClient$config$log2 = _getClient$config$log.warn) === null || _getClient$config$log2 === void 0 ? void 0 : _getClient$config$log2.call(_getClient$config$log, message);
184
+ }
185
+
179
186
  function minimizeContractInterface(_ref) {
180
187
  let {
181
188
  contractInterface,
@@ -356,7 +363,7 @@ async function deprecatedWriteContract(_ref) {
356
363
  });
357
364
  const contractWithSigner = contract.connect(signer);
358
365
  const contractFunction = contractWithSigner[functionName];
359
- if (!contractFunction) console.warn("\"".concat(functionName, "\" does not exist in interface for contract \"").concat(addressOrName, "\""));
366
+ if (!contractFunction) logWarn("\"".concat(functionName, "\" does not exist in interface for contract \"").concat(addressOrName, "\""));
360
367
  return await contractFunction(...params);
361
368
  } catch (error) {
362
369
  if (error.code === 4001) throw new getProvider.UserRejectedRequestError(error);
@@ -468,9 +475,9 @@ function getWebSocketProvider() {
468
475
  chainId
469
476
  } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
470
477
  const client = getProvider.getClient();
471
- if (chainId && typeof client.config.webSocketProvider === 'function') return client.config.webSocketProvider({
478
+ if (chainId) return client.getWebSocketProvider({
472
479
  chainId
473
- });
480
+ }) || client.webSocketProvider;
474
481
  return client.webSocketProvider;
475
482
  }
476
483
 
@@ -521,7 +528,7 @@ async function readContract(_ref) {
521
528
  });
522
529
  const params = [...(Array.isArray(args) ? args : args ? [args] : []), ...(overrides ? [overrides] : [])];
523
530
  const contractFunction = contract[functionName];
524
- if (!contractFunction) console.warn("\"".concat(functionName, "\" is not in the interface for contract \"").concat(addressOrName, "\""));
531
+ if (!contractFunction) logWarn("\"".concat(functionName, "\" is not in the interface for contract \"").concat(addressOrName, "\""));
525
532
  const response = await (contractFunction === null || contractFunction === void 0 ? void 0 : contractFunction(...params));
526
533
  return response;
527
534
  }
@@ -566,13 +573,23 @@ async function multicall(_ref) {
566
573
  contractInterface
567
574
  });
568
575
  const params = Array.isArray(args) ? args : args ? [args] : [];
569
- const callData = contract.interface.encodeFunctionData(functionName, params);
570
- if (!contract[functionName]) console.warn("\"".concat(functionName, "\" is not in the interface for contract \"").concat(addressOrName, "\""));
571
- return {
572
- target: addressOrName,
573
- allowFailure,
574
- callData
575
- };
576
+
577
+ try {
578
+ const callData = contract.interface.encodeFunctionData(functionName, params);
579
+ if (!contract[functionName]) logWarn("\"".concat(functionName, "\" is not in the interface for contract \"").concat(addressOrName, "\""));
580
+ return {
581
+ target: addressOrName,
582
+ allowFailure,
583
+ callData
584
+ };
585
+ } catch (err) {
586
+ if (!allowFailure) throw err;
587
+ return {
588
+ target: addressOrName,
589
+ allowFailure,
590
+ callData: '0x'
591
+ };
592
+ }
576
593
  });
577
594
  const params = [...[calls], ...(overrides ? [overrides] : [])];
578
595
  const results = await multicallContract.aggregate3(...params);
@@ -581,34 +598,62 @@ async function multicall(_ref) {
581
598
  returnData,
582
599
  success
583
600
  } = _ref3;
584
- if (!success) return null;
585
601
  const {
586
602
  addressOrName,
587
603
  contractInterface,
588
- functionName
604
+ functionName,
605
+ args
589
606
  } = contracts[i];
607
+ const contract = getContract({
608
+ addressOrName,
609
+ contractInterface
610
+ });
611
+
612
+ if (!success) {
613
+ let error;
614
+
615
+ try {
616
+ contract.interface.decodeFunctionResult(functionName, returnData);
617
+ } catch (err) {
618
+ error = new getProvider.ContractMethodRevertedError({
619
+ addressOrName,
620
+ args,
621
+ chainId: chain.id,
622
+ functionName,
623
+ errorMessage: err.message
624
+ });
625
+ if (!allowFailure) throw error;
626
+ logWarn(error.message);
627
+ }
628
+
629
+ return null;
630
+ }
590
631
 
591
632
  if (returnData === '0x') {
592
- const err = new getProvider.ContractMethodNoResultError({
633
+ const error = new getProvider.ContractMethodNoResultError({
593
634
  addressOrName,
635
+ args,
594
636
  chainId: chain.id,
595
637
  functionName
596
638
  });
597
- if (!allowFailure) throw err;
598
- console.warn(err.message);
639
+ if (!allowFailure) throw error;
640
+ logWarn(error.message);
599
641
  return null;
600
642
  }
601
643
 
602
- const contract = getContract({
603
- addressOrName,
604
- contractInterface
605
- });
606
-
607
644
  try {
608
645
  const result = contract.interface.decodeFunctionResult(functionName, returnData);
609
646
  return Array.isArray(result) && result.length === 1 ? result[0] : result;
610
647
  } catch (err) {
611
- if (!allowFailure) throw err;
648
+ const error = new getProvider.ContractResultDecodeError({
649
+ addressOrName,
650
+ args,
651
+ chainId: chain.id,
652
+ functionName,
653
+ errorMessage: err.message
654
+ });
655
+ if (!allowFailure) throw error;
656
+ logWarn(error.message);
612
657
  return null;
613
658
  }
614
659
  });
@@ -631,7 +676,8 @@ async function readContracts(_ref) {
631
676
  [chainId]: [...(contracts[chainId] || []), contract]
632
677
  };
633
678
  }, {});
634
- const promises = Object.entries(contractsByChainId).map(_ref2 => {
679
+
680
+ const promises = () => Object.entries(contractsByChainId).map(_ref2 => {
635
681
  let [chainId, contracts] = _ref2;
636
682
  return multicall({
637
683
  allowFailure,
@@ -642,11 +688,11 @@ async function readContracts(_ref) {
642
688
  });
643
689
 
644
690
  if (allowFailure) {
645
- return (await Promise.allSettled(promises)).map(result => {
691
+ return (await Promise.allSettled(promises())).map(result => {
646
692
  if (result.status === 'fulfilled') return result.value;
647
693
 
648
694
  if (result.reason instanceof getProvider.ChainDoesNotSupportMulticallError) {
649
- console.warn(result.reason.message);
695
+ logWarn(result.reason.message);
650
696
  throw result.reason;
651
697
  }
652
698
 
@@ -654,18 +700,38 @@ async function readContracts(_ref) {
654
700
  }).flat();
655
701
  }
656
702
 
657
- return (await Promise.all(promises)).flat();
703
+ return (await Promise.all(promises())).flat();
658
704
  } catch (err) {
705
+ if (err instanceof getProvider.ContractResultDecodeError) throw err;
659
706
  if (err instanceof getProvider.ContractMethodNoResultError) throw err;
660
- const promises = contracts.map(contract => readContract({ ...contract,
707
+ if (err instanceof getProvider.ContractMethodRevertedError) throw err;
708
+
709
+ const promises = () => contracts.map(contract => readContract({ ...contract,
661
710
  overrides
662
711
  }));
663
712
 
664
713
  if (allowFailure) {
665
- return (await Promise.allSettled(promises)).map(result => result.status === 'fulfilled' ? result.value : null);
714
+ return (await Promise.allSettled(promises())).map((result, i) => {
715
+ if (result.status === 'fulfilled') return result.value;
716
+ const {
717
+ addressOrName,
718
+ functionName,
719
+ chainId,
720
+ args
721
+ } = contracts[i];
722
+ const error = new getProvider.ContractMethodRevertedError({
723
+ addressOrName,
724
+ functionName,
725
+ chainId: chainId !== null && chainId !== void 0 ? chainId : chains.mainnet.id,
726
+ args,
727
+ errorMessage: result.reason
728
+ });
729
+ logWarn(error.message);
730
+ return null;
731
+ });
666
732
  }
667
733
 
668
- return await Promise.all(promises);
734
+ return await Promise.all(promises());
669
735
  }
670
736
  }
671
737
 
@@ -737,13 +803,20 @@ function watchBlockNumber(args, callback) {
737
803
  let previousProvider;
738
804
 
739
805
  const createListener = provider => {
806
+ // We need to debounce the listener as we want to opt-out
807
+ // of the behavior where ethers emits a "block" event for
808
+ // every block that was missed in between the `pollingInterval`.
809
+ // We are setting a wait time of 1 as emitting an event in
810
+ // ethers takes ~0.1ms.
811
+ const debouncedCallback = debounce.debounce(callback, 1);
812
+
740
813
  if (previousProvider) {
741
814
  var _previousProvider;
742
815
 
743
- (_previousProvider = previousProvider) === null || _previousProvider === void 0 ? void 0 : _previousProvider.off('block', callback);
816
+ (_previousProvider = previousProvider) === null || _previousProvider === void 0 ? void 0 : _previousProvider.off('block', debouncedCallback);
744
817
  }
745
818
 
746
- provider.on('block', callback);
819
+ provider.on('block', debouncedCallback);
747
820
  previousProvider = provider;
748
821
  };
749
822
 
@@ -1469,6 +1542,8 @@ exports.ConnectorAlreadyConnectedError = getProvider.ConnectorAlreadyConnectedEr
1469
1542
  exports.ConnectorNotFoundError = getProvider.ConnectorNotFoundError;
1470
1543
  exports.ContractMethodDoesNotExistError = getProvider.ContractMethodDoesNotExistError;
1471
1544
  exports.ContractMethodNoResultError = getProvider.ContractMethodNoResultError;
1545
+ exports.ContractMethodRevertedError = getProvider.ContractMethodRevertedError;
1546
+ exports.ContractResultDecodeError = getProvider.ContractResultDecodeError;
1472
1547
  exports.InjectedConnector = getProvider.InjectedConnector;
1473
1548
  exports.ProviderChainsNotFound = getProvider.ProviderChainsNotFound;
1474
1549
  exports.ProviderRpcError = getProvider.ProviderRpcError;
@@ -1482,15 +1557,15 @@ exports.createStorage = getProvider.createStorage;
1482
1557
  exports.getProvider = getProvider.getProvider;
1483
1558
  exports.noopStorage = getProvider.noopStorage;
1484
1559
  exports.normalizeChainId = getProvider.normalizeChainId;
1485
- exports.alchemyRpcUrls = rpcs.alchemyRpcUrls;
1486
- exports.infuraRpcUrls = rpcs.infuraRpcUrls;
1487
- exports.publicRpcUrls = rpcs.publicRpcUrls;
1488
1560
  exports.allChains = chains.allChains;
1489
1561
  exports.chain = chains.chain;
1490
1562
  exports.chainId = chains.chainId;
1491
1563
  exports.defaultChains = chains.defaultChains;
1492
1564
  exports.defaultL2Chains = chains.defaultL2Chains;
1493
1565
  exports.etherscanBlockExplorers = chains.etherscanBlockExplorers;
1566
+ exports.alchemyRpcUrls = rpcs.alchemyRpcUrls;
1567
+ exports.infuraRpcUrls = rpcs.infuraRpcUrls;
1568
+ exports.publicRpcUrls = rpcs.publicRpcUrls;
1494
1569
  exports.configureChains = configureChains;
1495
1570
  exports.connect = connect;
1496
1571
  exports.deepEqual = deepEqual;