@wagmi/core 0.4.0-test.2 → 0.4.2

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 (83) 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 +9 -7
  5. package/connectors/coinbaseWallet/dist/wagmi-core-connectors-coinbaseWallet.cjs.prod.js +9 -7
  6. package/connectors/coinbaseWallet/dist/wagmi-core-connectors-coinbaseWallet.esm.js +9 -7
  7. package/connectors/metaMask/dist/wagmi-core-connectors-metaMask.cjs.dev.js +7 -5
  8. package/connectors/metaMask/dist/wagmi-core-connectors-metaMask.cjs.prod.js +7 -5
  9. package/connectors/metaMask/dist/wagmi-core-connectors-metaMask.esm.js +7 -5
  10. package/connectors/mock/dist/wagmi-core-connectors-mock.cjs.dev.js +12 -8
  11. package/connectors/mock/dist/wagmi-core-connectors-mock.cjs.prod.js +12 -8
  12. package/connectors/mock/dist/wagmi-core-connectors-mock.esm.js +7 -7
  13. package/connectors/walletConnect/dist/wagmi-core-connectors-walletConnect.cjs.dev.js +19 -18
  14. package/connectors/walletConnect/dist/wagmi-core-connectors-walletConnect.cjs.prod.js +19 -18
  15. package/connectors/walletConnect/dist/wagmi-core-connectors-walletConnect.esm.js +19 -18
  16. package/dist/base-2d484f6c.cjs.prod.js +329 -0
  17. package/dist/base-e66f9622.esm.js +303 -0
  18. package/dist/base-e71ae4b2.cjs.dev.js +329 -0
  19. package/dist/{chains-7e369752.cjs.dev.js → chains-865492ea.cjs.prod.js} +79 -16
  20. package/dist/{chains-fa406563.esm.js → chains-c389721d.esm.js} +79 -16
  21. package/dist/{chains-d045862c.cjs.prod.js → chains-d970ee8d.cjs.dev.js} +79 -16
  22. package/dist/{client-42cf11b7.cjs.dev.js → client-1feb9121.cjs.prod.js} +29 -46
  23. package/dist/{client-ed3aaa6a.cjs.prod.js → client-53f2119c.cjs.dev.js} +29 -46
  24. package/dist/{client-60ee0298.esm.js → client-ffba0e25.esm.js} +29 -46
  25. package/dist/declarations/src/actions/accounts/getAccount.d.ts +31 -2
  26. package/dist/declarations/src/actions/accounts/getNetwork.d.ts +1 -2
  27. package/dist/declarations/src/actions/accounts/signTypedData.d.ts +17 -15
  28. package/dist/declarations/src/actions/accounts/watchAccount.d.ts +9 -1
  29. package/dist/declarations/src/actions/accounts/watchNetwork.d.ts +8 -1
  30. package/dist/declarations/src/actions/contracts/index.d.ts +5 -3
  31. package/dist/declarations/src/actions/contracts/multicall.d.ts +21 -0
  32. package/dist/declarations/src/actions/contracts/readContract.d.ts +7 -4
  33. package/dist/declarations/src/actions/contracts/readContracts.d.ts +19 -0
  34. package/dist/declarations/src/actions/contracts/watchContractEvent.d.ts +3 -3
  35. package/dist/declarations/src/actions/contracts/watchReadContract.d.ts +2 -3
  36. package/dist/declarations/src/actions/contracts/watchReadContracts.d.ts +6 -0
  37. package/dist/declarations/src/actions/contracts/writeContract.d.ts +10 -4
  38. package/dist/declarations/src/actions/index.d.ts +1 -1
  39. package/dist/declarations/src/actions/transactions/sendTransaction.d.ts +6 -1
  40. package/dist/declarations/src/client.d.ts +6 -11
  41. package/dist/declarations/src/connectors/base.d.ts +4 -3
  42. package/dist/declarations/src/connectors/mock/connector.d.ts +2 -9
  43. package/dist/declarations/src/connectors/mock/provider.d.ts +2 -1
  44. package/dist/declarations/src/connectors/walletConnect.d.ts +5 -4
  45. package/dist/declarations/src/constants/index.d.ts +2 -1
  46. package/dist/declarations/src/constants/multicall.d.ts +25 -0
  47. package/dist/declarations/src/constants/rpcs.d.ts +3 -1
  48. package/dist/declarations/src/errors.d.ts +27 -5
  49. package/dist/declarations/src/index.d.ts +5 -5
  50. package/dist/declarations/src/providers/alchemy.d.ts +2 -2
  51. package/dist/declarations/src/providers/infura.d.ts +2 -2
  52. package/dist/declarations/src/providers/jsonRpc.d.ts +2 -2
  53. package/dist/declarations/src/providers/public.d.ts +2 -2
  54. package/dist/declarations/src/types/index.d.ts +17 -5
  55. package/dist/declarations/src/utils/configureChains.d.ts +10 -4
  56. package/dist/declarations/src/utils/normalizeChainId.d.ts +1 -1
  57. package/dist/{rpcs-9c4eb960.cjs.dev.js → rpcs-1fd0a12f.cjs.prod.js} +14 -0
  58. package/dist/{rpcs-7cfbd91c.esm.js → rpcs-b73a8f60.esm.js} +14 -1
  59. package/dist/{rpcs-b3c52116.cjs.prod.js → rpcs-f1d24f0e.cjs.dev.js} +14 -0
  60. package/dist/wagmi-core.cjs.dev.js +611 -234
  61. package/dist/wagmi-core.cjs.prod.js +611 -234
  62. package/dist/wagmi-core.esm.js +608 -242
  63. package/package.json +15 -3
  64. package/providers/alchemy/dist/wagmi-core-providers-alchemy.cjs.dev.js +1 -1
  65. package/providers/alchemy/dist/wagmi-core-providers-alchemy.cjs.prod.js +1 -1
  66. package/providers/alchemy/dist/wagmi-core-providers-alchemy.esm.js +1 -1
  67. package/providers/infura/dist/wagmi-core-providers-infura.cjs.dev.js +1 -1
  68. package/providers/infura/dist/wagmi-core-providers-infura.cjs.prod.js +1 -1
  69. package/providers/infura/dist/wagmi-core-providers-infura.esm.js +1 -1
  70. package/providers/jsonRpc/dist/wagmi-core-providers-jsonRpc.cjs.dev.js +3 -1
  71. package/providers/jsonRpc/dist/wagmi-core-providers-jsonRpc.cjs.prod.js +3 -1
  72. package/providers/jsonRpc/dist/wagmi-core-providers-jsonRpc.esm.js +3 -1
  73. package/connectors/injected/dist/wagmi-core-connectors-injected.cjs.d.ts +0 -1
  74. package/connectors/injected/dist/wagmi-core-connectors-injected.cjs.dev.js +0 -200
  75. package/connectors/injected/dist/wagmi-core-connectors-injected.cjs.js +0 -7
  76. package/connectors/injected/dist/wagmi-core-connectors-injected.cjs.prod.js +0 -200
  77. package/connectors/injected/dist/wagmi-core-connectors-injected.esm.js +0 -196
  78. package/connectors/walletLink/dist/wagmi-core-connectors-walletLink.cjs.d.ts +0 -11
  79. package/connectors/walletLink/dist/wagmi-core-connectors-walletLink.cjs.js +0 -16
  80. package/dist/base-7f682723.cjs.prod.js +0 -623
  81. package/dist/base-ae774f26.cjs.dev.js +0 -623
  82. package/dist/base-c546f171.esm.js +0 -603
  83. package/dist/declarations/src/utils/eventemitter.d.ts +0 -135
@@ -1,23 +1,16 @@
1
- import { c as client, g as getClient } from './client-60ee0298.esm.js';
2
- export { C as Client, I as InjectedConnector, a as createClient, b as createStorage, n as noopStorage } from './client-60ee0298.esm.js';
3
- import { C as ConnectorAlreadyConnectedError, a as ConnectorNotFoundError, U as UserRejectedRequestError, S as SwitchChainNotSupportedError } from './base-c546f171.esm.js';
4
- export { A as AddChainError, c as ChainNotConfiguredError, b as Connector, C as ConnectorAlreadyConnectedError, a as ConnectorNotFoundError, P as ProviderRpcError, R as ResourceUnavailableError, d as RpcError, e as SwitchChainError, S as SwitchChainNotSupportedError, U as UserRejectedRequestError, n as normalizeChainId } from './base-c546f171.esm.js';
5
- import { Contract } from 'ethers/lib/ethers';
6
- import { formatUnits, getAddress } from 'ethers/lib/utils';
7
- import { a as allChains } from './chains-fa406563.esm.js';
8
- export { a as allChains, c as chain, b as chainId, d as defaultChains, e as defaultL2Chains, f as etherscanBlockExplorers } from './chains-fa406563.esm.js';
9
- import { providers, Contract as Contract$1 } from 'ethers';
10
- export { a as alchemyRpcUrls, i as infuraRpcUrls } from './rpcs-7cfbd91c.esm.js';
1
+ import { c as client, g as getClient } from './client-ffba0e25.esm.js';
2
+ export { C as Client, I as InjectedConnector, a as createClient, b as createStorage, n as noopStorage } from './client-ffba0e25.esm.js';
3
+ import { C as ConnectorAlreadyConnectedError, P as ProviderChainsNotFound, a as ChainDoesNotSupportMulticallError, b as ConnectorNotFoundError, c as ChainMismatchError, U as UserRejectedRequestError, n as normalizeChainId, S as SwitchChainNotSupportedError } from './base-e66f9622.esm.js';
4
+ export { A as AddChainError, a as ChainDoesNotSupportMulticallError, c as ChainMismatchError, e as ChainNotConfiguredError, d as Connector, C as ConnectorAlreadyConnectedError, b as ConnectorNotFoundError, P as ProviderChainsNotFound, f as ProviderRpcError, R as ResourceUnavailableError, g as RpcError, h as SwitchChainError, S as SwitchChainNotSupportedError, U as UserRejectedRequestError, n as normalizeChainId } from './base-e66f9622.esm.js';
5
+ import { logger, Contract as Contract$1 } from 'ethers/lib/ethers';
6
+ import { isAddress, Logger, formatUnits, getAddress } from 'ethers/lib/utils';
7
+ import { providers, Contract } from 'ethers';
8
+ import shallow from 'zustand/shallow';
9
+ export { a as alchemyRpcUrls, i as infuraRpcUrls, p as publicRpcUrls } from './rpcs-b73a8f60.esm.js';
10
+ export { a as allChains, c as chain, b as chainId, d as defaultChains, e as defaultL2Chains, f as etherscanBlockExplorers } from './chains-c389721d.esm.js';
11
11
  import 'zustand/vanilla';
12
12
  import 'zustand/middleware';
13
-
14
- // https://ethereum.org/en/developers/docs/standards/tokens/erc-20
15
- 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
16
-
17
- 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'];
18
-
19
- // https://github.com/ethers-io/ethers.js/blob/master/packages/units/src.ts/index.ts#L10-L18
20
- const units = ['wei', 'kwei', 'mwei', 'gwei', 'szabo', 'finney', 'ether'];
13
+ import 'eventemitter3';
21
14
 
22
15
  function configureChains(defaultChains, providers) {
23
16
  let {
@@ -75,24 +68,29 @@ function configureChains(defaultChains, providers) {
75
68
  const activeChainId = chainId && chains.some(x => x.id === chainId) ? chainId : (_defaultChains$ = defaultChains[0]) === null || _defaultChains$ === void 0 ? void 0 : _defaultChains$.id;
76
69
  const chainProviders = providers_[activeChainId];
77
70
  if (!chainProviders) throw new Error("No providers configured for chain \"".concat(activeChainId, "\""));
78
- if (chainProviders.length === 1) return (_chainProviders$ = chainProviders[0]) === null || _chainProviders$ === void 0 ? void 0 : _chainProviders$.call(chainProviders);
79
- return fallbackProvider(targetQuorum, minQuorum, chainProviders, {
71
+ if (chainProviders.length === 1) return Object.assign(((_chainProviders$ = chainProviders[0]) === null || _chainProviders$ === void 0 ? void 0 : _chainProviders$.call(chainProviders)) || {}, {
72
+ chains
73
+ });
74
+ return Object.assign(fallbackProvider(targetQuorum, minQuorum, chainProviders, {
80
75
  stallTimeout
76
+ }), {
77
+ chains
81
78
  });
82
79
  },
83
80
  webSocketProvider: _ref3 => {
84
- var _defaultChains$2, _chainWebSocketProvid, _chainWebSocketProvid2;
81
+ var _defaultChains$2, _chainWebSocketProvid;
85
82
 
86
83
  let {
87
84
  chainId
88
85
  } = _ref3;
89
86
  const activeChainId = chainId && chains.some(x => x.id === chainId) ? chainId : (_defaultChains$2 = defaultChains[0]) === null || _defaultChains$2 === void 0 ? void 0 : _defaultChains$2.id;
90
87
  const chainWebSocketProviders = webSocketProviders_[activeChainId];
91
- if (!chainWebSocketProviders) return undefined;
92
- if (chainWebSocketProviders.length === 1) return (_chainWebSocketProvid = chainWebSocketProviders[0]) === null || _chainWebSocketProvid === void 0 ? void 0 : _chainWebSocketProvid.call(chainWebSocketProviders); // WebSockets do not work with `fallbackProvider`
88
+ if (!chainWebSocketProviders) return undefined; // WebSockets do not work with `fallbackProvider`
93
89
  // Default to first available
94
90
 
95
- return (_chainWebSocketProvid2 = chainWebSocketProviders[0]) === null || _chainWebSocketProvid2 === void 0 ? void 0 : _chainWebSocketProvid2.call(chainWebSocketProviders);
91
+ return Object.assign(((_chainWebSocketProvid = chainWebSocketProviders[0]) === null || _chainWebSocketProvid === void 0 ? void 0 : _chainWebSocketProvid.call(chainWebSocketProviders)) || {}, {
92
+ chains
93
+ });
96
94
  }
97
95
  };
98
96
  }
@@ -128,6 +126,52 @@ function fallbackProvider(targetQuorum, minQuorum, providers_, _ref4) {
128
126
  }
129
127
  }
130
128
 
129
+ // https://ethereum.org/en/developers/docs/standards/tokens/erc-20
130
+ 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
131
+
132
+ 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'];
133
+
134
+ const multicallInterface = [{
135
+ inputs: [{
136
+ components: [{
137
+ internalType: 'address',
138
+ name: 'target',
139
+ type: 'address'
140
+ }, {
141
+ internalType: 'bool',
142
+ name: 'allowFailure',
143
+ type: 'bool'
144
+ }, {
145
+ internalType: 'bytes',
146
+ name: 'callData',
147
+ type: 'bytes'
148
+ }],
149
+ internalType: 'struct Multicall3.Call3[]',
150
+ name: 'calls',
151
+ type: 'tuple[]'
152
+ }],
153
+ name: 'aggregate3',
154
+ outputs: [{
155
+ components: [{
156
+ internalType: 'bool',
157
+ name: 'success',
158
+ type: 'bool'
159
+ }, {
160
+ internalType: 'bytes',
161
+ name: 'returnData',
162
+ type: 'bytes'
163
+ }],
164
+ internalType: 'struct Multicall3.Result[]',
165
+ name: 'returnData',
166
+ type: 'tuple[]'
167
+ }],
168
+ stateMutability: 'view',
169
+ type: 'function'
170
+ }];
171
+
172
+ // https://github.com/ethers-io/ethers.js/blob/master/packages/units/src.ts/index.ts#L10-L18
173
+ const units = ['wei', 'kwei', 'mwei', 'gwei', 'szabo', 'finney', 'ether'];
174
+
131
175
  async function connect(_ref) {
132
176
  let {
133
177
  chainId,
@@ -135,19 +179,31 @@ async function connect(_ref) {
135
179
  } = _ref;
136
180
  const activeConnector = client.connector;
137
181
  if (connector.id === (activeConnector === null || activeConnector === void 0 ? void 0 : activeConnector.id)) throw new ConnectorAlreadyConnectedError();
138
- const data = await connector.connect({
139
- chainId
140
- });
141
- client.setLastUsedConnector(connector.id);
142
- client.setState(x => ({ ...x,
143
- connector,
144
- chains: connector === null || connector === void 0 ? void 0 : connector.chains,
145
- data
146
- }));
147
- client.storage.setItem('connected', true);
148
- return { ...data,
149
- connector
150
- };
182
+
183
+ try {
184
+ client.setState(x => ({ ...x,
185
+ status: 'connecting'
186
+ }));
187
+ const data = await connector.connect({
188
+ chainId
189
+ });
190
+ client.setLastUsedConnector(connector.id);
191
+ client.setState(x => ({ ...x,
192
+ connector,
193
+ chains: connector === null || connector === void 0 ? void 0 : connector.chains,
194
+ data,
195
+ status: 'connected'
196
+ }));
197
+ client.storage.setItem('connected', true);
198
+ return { ...data,
199
+ connector
200
+ };
201
+ } catch (err) {
202
+ client.setState(x => ({ ...x,
203
+ status: 'disconnected'
204
+ }));
205
+ throw err;
206
+ }
151
207
  }
152
208
 
153
209
  async function disconnect() {
@@ -157,6 +213,15 @@ async function disconnect() {
157
213
  client.storage.removeItem('connected');
158
214
  }
159
215
 
216
+ function getContract(_ref) {
217
+ let {
218
+ addressOrName,
219
+ contractInterface,
220
+ signerOrProvider
221
+ } = _ref;
222
+ return new Contract(addressOrName, contractInterface, signerOrProvider);
223
+ }
224
+
160
225
  function getProvider() {
161
226
  let {
162
227
  chainId
@@ -207,213 +272,152 @@ function watchWebSocketProvider(args, callback) {
207
272
  return unsubscribe;
208
273
  }
209
274
 
210
- async function fetchBalance(_ref) {
211
- var _client$connector$cha, _client$connector, _chain$nativeCurrency, _chain$nativeCurrency2, _chain$nativeCurrency3, _chain$nativeCurrency4;
212
-
275
+ async function readContract(_ref) {
213
276
  let {
214
277
  addressOrName,
278
+ args,
215
279
  chainId,
216
- formatUnits: unit = 'ether',
217
- token
280
+ contractInterface,
281
+ functionName,
282
+ overrides
218
283
  } = _ref;
219
- const client = getClient();
220
284
  const provider = getProvider({
221
285
  chainId
222
286
  });
223
-
224
- if (token) {
225
- const contract = new Contract(token, erc20ABI, provider);
226
- const [value, decimals, symbol] = await Promise.all([contract.balanceOf(addressOrName), contract.decimals(), contract.symbol()]);
227
- return {
228
- decimals,
229
- formatted: formatUnits(value, unit),
230
- symbol,
231
- unit,
232
- value
233
- };
234
- }
235
-
236
- const chains = [...((_client$connector$cha = (_client$connector = client.connector) === null || _client$connector === void 0 ? void 0 : _client$connector.chains) !== null && _client$connector$cha !== void 0 ? _client$connector$cha : []), ...allChains];
237
- const value = await provider.getBalance(addressOrName);
238
- const chain = chains.find(x => x.id === provider.network.chainId);
239
- return {
240
- 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,
241
- formatted: formatUnits(value, unit),
242
- 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',
243
- unit,
244
- value
245
- };
246
- }
247
-
248
- async function fetchSigner() {
249
- var _client$connector, _client$connector$get;
250
-
251
- const client = getClient();
252
- 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;
253
- return signer;
254
- }
255
-
256
- function getAccount() {
257
- const {
258
- data,
259
- connector
260
- } = getClient();
261
- return {
262
- address: data === null || data === void 0 ? void 0 : data.account,
263
- connector
264
- };
265
- }
266
-
267
- function getNetwork() {
268
- var _client$data, _client$data$chain, _client$chains, _find, _client$data2;
269
-
270
- const client = getClient();
271
- 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;
272
- const activeChains = (_client$chains = client.chains) !== null && _client$chains !== void 0 ? _client$chains : [];
273
- const activeChain = (_find = [...activeChains, ...allChains].find(x => x.id === chainId)) !== null && _find !== void 0 ? _find : {
274
- id: chainId,
275
- name: "Chain ".concat(chainId),
276
- network: "".concat(chainId),
277
- rpcUrls: {
278
- default: ''
279
- }
280
- };
281
- return {
282
- chain: chainId ? { ...activeChain,
283
- ...((_client$data2 = client.data) === null || _client$data2 === void 0 ? void 0 : _client$data2.chain),
284
- id: chainId
285
- } : undefined,
286
- chains: activeChains
287
- };
288
- }
289
-
290
- async function signMessage(args) {
291
- try {
292
- const signer = await fetchSigner();
293
- if (!signer) throw new ConnectorNotFoundError();
294
- return await signer.signMessage(args.message);
295
- } catch (error) {
296
- if (error.code === 4001) throw new UserRejectedRequestError(error);
297
- throw error;
298
- }
299
- }
300
-
301
- async function signTypedData(args) {
302
- try {
303
- const signer = await fetchSigner();
304
- if (!signer) throw new ConnectorNotFoundError(); // Method name may be changed in the future, see https://docs.ethers.io/v5/api/signer/#Signer-signTypedData
305
-
306
- return await signer._signTypedData(args.domain, args.types, args.value);
307
- } catch (error) {
308
- if (error.code === 4001) throw new UserRejectedRequestError(error);
309
- throw error;
310
- }
287
+ const contract = getContract({
288
+ addressOrName,
289
+ contractInterface,
290
+ signerOrProvider: provider
291
+ });
292
+ const params = [...(Array.isArray(args) ? args : args ? [args] : []), ...(overrides ? [overrides] : [])];
293
+ const contractFunction = contract[functionName];
294
+ if (!contractFunction) console.warn("\"".concat(functionName, "\" is not in the interface for contract \"").concat(addressOrName, "\""));
295
+ const response = await (contractFunction === null || contractFunction === void 0 ? void 0 : contractFunction(...params));
296
+ return response;
311
297
  }
312
298
 
313
- async function switchNetwork(_ref) {
314
- var _client$connector;
315
-
299
+ async function multicall(_ref) {
316
300
  let {
317
- chainId
301
+ allowFailure = true,
302
+ chainId,
303
+ contracts,
304
+ overrides
318
305
  } = _ref;
319
- const client = getClient();
320
- if (!((_client$connector = client.connector) !== null && _client$connector !== void 0 && _client$connector.switchChain)) throw new SwitchChainNotSupportedError();
321
- const chain = await client.connector.switchChain(chainId);
322
- return chain;
323
- }
324
-
325
- function watchAccount(callback) {
326
- const client = getClient();
327
-
328
- const handleChange = () => callback(getAccount());
329
-
330
- const unsubscribe = client.subscribe(_ref => {
306
+ const provider = getProvider({
307
+ chainId
308
+ });
309
+ if (!provider.chains) throw new ProviderChainsNotFound();
310
+ const chain = provider.chains.find(chain => chain.id === chainId) || provider.chains[0];
311
+ if (!chain) throw new ProviderChainsNotFound();
312
+ if (!(chain !== null && chain !== void 0 && chain.multicall)) throw new ChainDoesNotSupportMulticallError({
313
+ chain
314
+ });
315
+ 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({
316
+ blockNumber: overrides === null || overrides === void 0 ? void 0 : overrides.blockTag,
317
+ chain
318
+ });
319
+ const multicallContract = getContract({
320
+ addressOrName: chain.multicall.address,
321
+ contractInterface: multicallInterface,
322
+ signerOrProvider: provider
323
+ });
324
+ const calls = contracts.map(_ref2 => {
331
325
  let {
332
- data,
333
- connector
334
- } = _ref;
326
+ addressOrName,
327
+ contractInterface,
328
+ functionName,
329
+ ...config
330
+ } = _ref2;
331
+ const {
332
+ args
333
+ } = config || {};
334
+ const contract = getContract({
335
+ addressOrName,
336
+ contractInterface
337
+ });
338
+ const params = Array.isArray(args) ? args : args ? [args] : [];
339
+ const callData = contract.interface.encodeFunctionData(functionName, params);
340
+ if (!contract[functionName]) console.warn("\"".concat(functionName, "\" is not in the interface for contract \"").concat(addressOrName, "\""));
335
341
  return {
336
- account: data === null || data === void 0 ? void 0 : data.account,
337
- connector
342
+ target: addressOrName,
343
+ allowFailure: allowFailure,
344
+ callData
338
345
  };
339
- }, handleChange, {
340
- equalityFn: (selected, previous) => selected.account === previous.account && selected.connector === previous.connector
341
346
  });
342
- return unsubscribe;
347
+ const params = [...[calls], ...(overrides ? [overrides] : [])];
348
+ const results = await multicallContract.aggregate3(...params);
349
+ return results.map((_ref3, i) => {
350
+ let {
351
+ returnData,
352
+ success
353
+ } = _ref3;
354
+ if (!success) return undefined;
355
+ const {
356
+ addressOrName,
357
+ contractInterface,
358
+ functionName
359
+ } = contracts[i];
360
+ const contract = getContract({
361
+ addressOrName,
362
+ contractInterface
363
+ });
364
+ const result = contract.interface.decodeFunctionResult(functionName, returnData);
365
+ return Array.isArray(result) && result.length === 1 ? result[0] : result;
366
+ });
343
367
  }
344
368
 
345
- function watchNetwork(callback) {
346
- const client = getClient();
347
-
348
- const handleChange = () => callback(getNetwork());
369
+ async function readContracts(_ref) {
370
+ let {
371
+ allowFailure = true,
372
+ contracts,
373
+ overrides
374
+ } = _ref;
349
375
 
350
- const unsubscribe = client.subscribe(_ref => {
351
- var _data$chain;
376
+ try {
377
+ const provider = getProvider();
378
+ const contractsByChainId = contracts.reduce((contracts, contract) => {
379
+ var _contract$chainId;
352
380
 
353
- let {
354
- data,
355
- chains
356
- } = _ref;
357
- return {
358
- chainId: data === null || data === void 0 ? void 0 : (_data$chain = data.chain) === null || _data$chain === void 0 ? void 0 : _data$chain.id,
359
- chains
360
- };
361
- }, handleChange, {
362
- equalityFn: (selected, previous) => selected.chainId === previous.chainId && selected.chains === previous.chains
363
- });
364
- return unsubscribe;
365
- }
381
+ const chainId = (_contract$chainId = contract.chainId) !== null && _contract$chainId !== void 0 ? _contract$chainId : provider.network.chainId;
382
+ return { ...contracts,
383
+ [chainId]: [...(contracts[chainId] || []), contract]
384
+ };
385
+ }, {});
386
+ const promises = Object.entries(contractsByChainId).map(_ref2 => {
387
+ let [chainId, contracts] = _ref2;
388
+ return multicall({
389
+ allowFailure,
390
+ chainId: parseInt(chainId),
391
+ contracts,
392
+ overrides
393
+ });
394
+ });
366
395
 
367
- function watchSigner(callback) {
368
- const client = getClient();
396
+ if (allowFailure) {
397
+ return (await Promise.allSettled(promises)).map(result => {
398
+ if (result.status === 'fulfilled') return result.value;
369
399
 
370
- const handleChange = async () => callback(await fetchSigner());
400
+ if (result.reason instanceof ChainDoesNotSupportMulticallError) {
401
+ console.warn(result.reason.message);
402
+ throw result.reason;
403
+ }
371
404
 
372
- const unsubscribe = client.subscribe(_ref => {
373
- var _data$chain;
405
+ return null;
406
+ }).flat();
407
+ }
374
408
 
375
- let {
376
- data,
377
- connector
378
- } = _ref;
379
- return {
380
- account: data === null || data === void 0 ? void 0 : data.account,
381
- chainId: data === null || data === void 0 ? void 0 : (_data$chain = data.chain) === null || _data$chain === void 0 ? void 0 : _data$chain.id,
382
- connector
383
- };
384
- }, handleChange, {
385
- equalityFn: (selected, previous) => selected.account === previous.account && selected.chainId === previous.chainId && selected.connector === previous.connector
386
- });
387
- return unsubscribe;
388
- }
409
+ return (await Promise.all(promises)).flat();
410
+ } catch (err) {
411
+ const promises = contracts.map(contract => readContract({ ...contract,
412
+ overrides
413
+ }));
389
414
 
390
- function getContract(_ref) {
391
- let {
392
- addressOrName,
393
- contractInterface,
394
- signerOrProvider
395
- } = _ref;
396
- return new Contract$1(addressOrName, contractInterface, signerOrProvider);
397
- }
415
+ if (allowFailure) {
416
+ return (await Promise.allSettled(promises)).map(result => result.status === 'fulfilled' ? result.value : null);
417
+ }
398
418
 
399
- async function readContract(contractConfig, functionName) {
400
- let {
401
- args,
402
- chainId,
403
- overrides
404
- } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
405
- const provider = getProvider({
406
- chainId
407
- });
408
- const contract = getContract({
409
- signerOrProvider: provider,
410
- ...contractConfig
411
- });
412
- const params = [...(Array.isArray(args) ? args : args ? [args] : []), ...(overrides ? [overrides] : [])];
413
- const contractFunction = contract[functionName];
414
- if (!contractFunction) console.warn("\"".concat(functionName, "\" does not exist in interface for contract \"").concat(contractConfig.addressOrName, "\""));
415
- const response = await (contractFunction === null || contractFunction === void 0 ? void 0 : contractFunction(...params));
416
- return response;
419
+ return Promise.all(promises);
420
+ }
417
421
  }
418
422
 
419
423
  function watchContractEvent(
@@ -457,7 +461,7 @@ eventName, callback) {
457
461
  webSocketProvider
458
462
  };
459
463
  }, watchEvent, {
460
- equalityFn: (selected, previous) => selected.provider === previous.provider && selected.webSocketProvider === previous.webSocketProvider
464
+ equalityFn: shallow
461
465
  });
462
466
  return () => {
463
467
  var _contract2;
@@ -519,7 +523,7 @@ function watchBlockNumber(args, callback) {
519
523
 
520
524
  callback(await fetchBlockNumber());
521
525
  }, {
522
- equalityFn: (selected, previous) => selected.provider === previous.provider && selected.webSocketProvider === previous.webSocketProvider
526
+ equalityFn: shallow
523
527
  });
524
528
  return () => {
525
529
  unsubscribe();
@@ -527,12 +531,30 @@ function watchBlockNumber(args, callback) {
527
531
  };
528
532
  }
529
533
 
530
- function watchReadContract(contractConfig, functionName) {
531
- let config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
532
- let callback = arguments.length > 3 ? arguments[3] : undefined;
534
+ function watchReadContract(config, callback) {
535
+ const client = getClient();
536
+
537
+ const handleChange = async () => callback(await readContract(config));
538
+
539
+ const unwatch = config.listenToBlock ? watchBlockNumber({
540
+ listen: true
541
+ }, handleChange) : undefined;
542
+ const unsubscribe = client.subscribe(_ref => {
543
+ let {
544
+ provider
545
+ } = _ref;
546
+ return provider;
547
+ }, handleChange);
548
+ return () => {
549
+ unsubscribe();
550
+ unwatch === null || unwatch === void 0 ? void 0 : unwatch();
551
+ };
552
+ }
553
+
554
+ function watchReadContracts(config, callback) {
533
555
  const client = getClient();
534
556
 
535
- const handleChange = async () => callback(await readContract(contractConfig, functionName, config));
557
+ const handleChange = async () => callback(await readContracts(config));
536
558
 
537
559
  const unwatch = config.listenToBlock ? watchBlockNumber({
538
560
  listen: true
@@ -549,29 +571,347 @@ function watchReadContract(contractConfig, functionName) {
549
571
  };
550
572
  }
551
573
 
552
- async function writeContract(contractConfig, functionName) {
574
+ async function writeContract(_ref) {
553
575
  let {
576
+ addressOrName,
554
577
  args,
555
- overrides
556
- } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
557
- const client = getClient();
558
- if (!client.connector) throw new ConnectorNotFoundError();
578
+ chainId,
579
+ contractInterface,
580
+ functionName,
581
+ overrides,
582
+ signerOrProvider
583
+ } = _ref;
584
+ const {
585
+ connector
586
+ } = getClient();
587
+ if (!connector) throw new ConnectorNotFoundError();
559
588
  const params = [...(Array.isArray(args) ? args : args ? [args] : []), ...(overrides ? [overrides] : [])];
560
589
 
561
590
  try {
562
- const signer = await client.connector.getSigner();
563
- const contract = getContract(contractConfig);
591
+ var _chain;
592
+
593
+ let chain;
594
+
595
+ if (chainId) {
596
+ const activeChainId = await connector.getChainId(); // Try to switch chain to provided `chainId`
597
+
598
+ if (chainId !== activeChainId) {
599
+ var _connector$chains$fin, _connector$chains$fin2, _connector$chains$fin3, _connector$chains$fin4;
600
+
601
+ if (connector.switchChain) chain = await connector.switchChain(chainId);else throw new ChainMismatchError({
602
+ 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),
603
+ 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)
604
+ });
605
+ }
606
+ }
607
+
608
+ const signer = await connector.getSigner({
609
+ chainId: (_chain = chain) === null || _chain === void 0 ? void 0 : _chain.id
610
+ });
611
+ const contract = getContract({
612
+ addressOrName,
613
+ contractInterface,
614
+ signerOrProvider
615
+ });
564
616
  const contractWithSigner = contract.connect(signer);
565
617
  const contractFunction = contractWithSigner[functionName];
566
- if (!contractFunction) console.warn("\"".concat(functionName, "\" does not exist in interface for contract \"").concat(contractConfig.addressOrName, "\""));
567
- const response = await contractFunction(...params);
568
- return response;
618
+ if (!contractFunction) console.warn("\"".concat(functionName, "\" does not exist in interface for contract \"").concat(addressOrName, "\""));
619
+ return await contractFunction(...params);
620
+ } catch (error) {
621
+ if (error.code === 4001) throw new UserRejectedRequestError(error);
622
+ throw error;
623
+ }
624
+ }
625
+
626
+ async function fetchBalance(_ref) {
627
+ var _client$chains, _chain$nativeCurrency, _chain$nativeCurrency2, _chain$nativeCurrency3, _chain$nativeCurrency4;
628
+
629
+ let {
630
+ addressOrName,
631
+ chainId,
632
+ formatUnits: unit = 'ether',
633
+ token
634
+ } = _ref;
635
+ const client = getClient();
636
+ const provider = getProvider({
637
+ chainId
638
+ });
639
+
640
+ if (token) {
641
+ const erc20Config = {
642
+ addressOrName: token,
643
+ contractInterface: erc20ABI,
644
+ chainId
645
+ }; // Convert ENS name to address if required
646
+
647
+ let resolvedAddress;
648
+ if (isAddress(addressOrName)) resolvedAddress = addressOrName;else {
649
+ const address = await provider.resolveName(addressOrName); // Same error `provider.getBalance` throws for invalid ENS name
650
+
651
+ if (!address) logger.throwError('ENS name not configured', Logger.errors.UNSUPPORTED_OPERATION, {
652
+ operation: "resolveName(".concat(JSON.stringify(addressOrName), ")")
653
+ });
654
+ resolvedAddress = address;
655
+ }
656
+ const [value, decimals, symbol] = await readContracts({
657
+ allowFailure: false,
658
+ contracts: [{ ...erc20Config,
659
+ functionName: 'balanceOf',
660
+ args: resolvedAddress
661
+ }, { ...erc20Config,
662
+ functionName: 'decimals'
663
+ }, { ...erc20Config,
664
+ functionName: 'symbol'
665
+ }]
666
+ });
667
+ return {
668
+ decimals,
669
+ formatted: formatUnits(value !== null && value !== void 0 ? value : '0', unit),
670
+ symbol,
671
+ unit,
672
+ value
673
+ };
674
+ }
675
+
676
+ const chains = [...(client.provider.chains || []), ...((_client$chains = client.chains) !== null && _client$chains !== void 0 ? _client$chains : [])];
677
+ const value = await provider.getBalance(addressOrName);
678
+ const chain = chains.find(x => x.id === provider.network.chainId);
679
+ return {
680
+ 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,
681
+ formatted: formatUnits(value !== null && value !== void 0 ? value : '0', unit),
682
+ 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',
683
+ unit,
684
+ value
685
+ };
686
+ }
687
+
688
+ async function fetchSigner() {
689
+ var _client$connector, _client$connector$get;
690
+
691
+ const client = getClient();
692
+ 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;
693
+ return signer;
694
+ }
695
+
696
+ function getAccount() {
697
+ const {
698
+ data,
699
+ connector,
700
+ status
701
+ } = getClient();
702
+
703
+ switch (status) {
704
+ case 'connected':
705
+ return {
706
+ address: data === null || data === void 0 ? void 0 : data.account,
707
+ connector: connector,
708
+ isConnected: true,
709
+ isConnecting: false,
710
+ isDisconnected: false,
711
+ isReconnecting: false,
712
+ status
713
+ };
714
+
715
+ case 'reconnecting':
716
+ return {
717
+ address: data === null || data === void 0 ? void 0 : data.account,
718
+ connector,
719
+ isConnected: !!(data !== null && data !== void 0 && data.account),
720
+ isConnecting: false,
721
+ isDisconnected: false,
722
+ isReconnecting: true,
723
+ status
724
+ };
725
+
726
+ case 'connecting':
727
+ return {
728
+ address: undefined,
729
+ connector: undefined,
730
+ isConnected: false,
731
+ isConnecting: true,
732
+ isDisconnected: false,
733
+ isReconnecting: false,
734
+ status
735
+ };
736
+
737
+ case 'disconnected':
738
+ return {
739
+ address: undefined,
740
+ connector: undefined,
741
+ isConnected: false,
742
+ isConnecting: false,
743
+ isDisconnected: true,
744
+ isReconnecting: false,
745
+ status
746
+ };
747
+ }
748
+ }
749
+
750
+ function getNetwork() {
751
+ var _client$data, _client$data$chain, _client$chains, _find, _client$data2;
752
+
753
+ const client = getClient();
754
+ 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;
755
+ const activeChains = (_client$chains = client.chains) !== null && _client$chains !== void 0 ? _client$chains : [];
756
+ const activeChain = (_find = [...(client.provider.chains || []), ...activeChains].find(x => x.id === chainId)) !== null && _find !== void 0 ? _find : {
757
+ id: chainId,
758
+ name: "Chain ".concat(chainId),
759
+ network: "".concat(chainId),
760
+ rpcUrls: {
761
+ default: ''
762
+ }
763
+ };
764
+ return {
765
+ chain: chainId ? { ...activeChain,
766
+ ...((_client$data2 = client.data) === null || _client$data2 === void 0 ? void 0 : _client$data2.chain),
767
+ id: chainId
768
+ } : undefined,
769
+ chains: activeChains
770
+ };
771
+ }
772
+
773
+ async function signMessage(args) {
774
+ try {
775
+ const signer = await fetchSigner();
776
+ if (!signer) throw new ConnectorNotFoundError();
777
+ return await signer.signMessage(args.message);
778
+ } catch (error) {
779
+ if (error.code === 4001) throw new UserRejectedRequestError(error);
780
+ throw error;
781
+ }
782
+ }
783
+
784
+ async function signTypedData(_ref) {
785
+ let {
786
+ domain,
787
+ types,
788
+ value
789
+ } = _ref;
790
+ const {
791
+ connector
792
+ } = getClient();
793
+ if (!connector) throw new ConnectorNotFoundError();
794
+
795
+ try {
796
+ var _chain;
797
+
798
+ const {
799
+ chainId
800
+ } = domain;
801
+ let chain;
802
+
803
+ if (chainId) {
804
+ const chainId_ = normalizeChainId(chainId);
805
+ const activeChainId = await connector.getChainId(); // Try to switch chain to provided `chainId`
806
+
807
+ if (chainId !== activeChainId) {
808
+ var _connector$chains$fin, _connector$chains$fin2, _connector$chains$fin3, _connector$chains$fin4;
809
+
810
+ if (connector.switchChain) chain = await connector.switchChain(chainId_);else throw new ChainMismatchError({
811
+ 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),
812
+ 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_)
813
+ });
814
+ }
815
+ }
816
+
817
+ const signer = await connector.getSigner({
818
+ chainId: (_chain = chain) === null || _chain === void 0 ? void 0 : _chain.id
819
+ }); // Method name may be changed in the future, see https://docs.ethers.io/v5/api/signer/#Signer-signTypedData
820
+
821
+ return await signer._signTypedData(domain, types, value);
569
822
  } catch (error) {
570
823
  if (error.code === 4001) throw new UserRejectedRequestError(error);
571
824
  throw error;
572
825
  }
573
826
  }
574
827
 
828
+ async function switchNetwork(_ref) {
829
+ let {
830
+ chainId
831
+ } = _ref;
832
+ const {
833
+ connector
834
+ } = getClient();
835
+ if (!connector) throw new ConnectorNotFoundError();
836
+ if (!connector.switchChain) throw new SwitchChainNotSupportedError({
837
+ connector
838
+ });
839
+ return await connector.switchChain(chainId);
840
+ }
841
+
842
+ function watchAccount(callback) {
843
+ let {
844
+ selector = x => x
845
+ } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
846
+ const client = getClient();
847
+
848
+ const handleChange = () => callback(getAccount());
849
+
850
+ const unsubscribe = client.subscribe(_ref => {
851
+ let {
852
+ data,
853
+ connector,
854
+ status
855
+ } = _ref;
856
+ return selector({
857
+ address: data === null || data === void 0 ? void 0 : data.account,
858
+ connector,
859
+ status
860
+ });
861
+ }, handleChange, {
862
+ equalityFn: shallow
863
+ });
864
+ return unsubscribe;
865
+ }
866
+
867
+ function watchNetwork(callback) {
868
+ let {
869
+ selector = x => x
870
+ } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
871
+ const client = getClient();
872
+
873
+ const handleChange = () => callback(getNetwork());
874
+
875
+ const unsubscribe = client.subscribe(_ref => {
876
+ var _data$chain;
877
+
878
+ let {
879
+ data,
880
+ chains
881
+ } = _ref;
882
+ return selector({
883
+ chainId: data === null || data === void 0 ? void 0 : (_data$chain = data.chain) === null || _data$chain === void 0 ? void 0 : _data$chain.id,
884
+ chains
885
+ });
886
+ }, handleChange, {
887
+ equalityFn: shallow
888
+ });
889
+ return unsubscribe;
890
+ }
891
+
892
+ function watchSigner(callback) {
893
+ const client = getClient();
894
+
895
+ const handleChange = async () => callback(await fetchSigner());
896
+
897
+ const unsubscribe = client.subscribe(_ref => {
898
+ var _data$chain;
899
+
900
+ let {
901
+ data,
902
+ connector
903
+ } = _ref;
904
+ return {
905
+ account: data === null || data === void 0 ? void 0 : data.account,
906
+ chainId: data === null || data === void 0 ? void 0 : (_data$chain = data.chain) === null || _data$chain === void 0 ? void 0 : _data$chain.id,
907
+ connector
908
+ };
909
+ }, handleChange, {
910
+ equalityFn: shallow
911
+ });
912
+ return unsubscribe;
913
+ }
914
+
575
915
  async function fetchEnsAddress(_ref) {
576
916
  let {
577
917
  chainId,
@@ -654,7 +994,7 @@ async function fetchToken(_ref) {
654
994
  const provider = getProvider({
655
995
  chainId
656
996
  });
657
- const contract = new Contract(address, erc20ABI, provider);
997
+ const contract = new Contract$1(address, erc20ABI, provider);
658
998
  const [symbol, decimals, totalSupply] = await Promise.all([contract.symbol(), contract.decimals(), contract.totalSupply()]);
659
999
  const token = {
660
1000
  address,
@@ -668,12 +1008,38 @@ async function fetchToken(_ref) {
668
1008
  return token;
669
1009
  }
670
1010
 
671
- async function sendTransaction(args) {
1011
+ async function sendTransaction(_ref) {
1012
+ let {
1013
+ chainId,
1014
+ request
1015
+ } = _ref;
1016
+ const {
1017
+ connector
1018
+ } = getClient();
1019
+ if (!connector) throw new ConnectorNotFoundError();
1020
+
672
1021
  try {
673
- const signer = await fetchSigner();
674
- if (!signer) throw new ConnectorNotFoundError();
675
- const transaction = await signer.sendTransaction(args.request);
676
- return transaction;
1022
+ var _chain;
1023
+
1024
+ let chain;
1025
+
1026
+ if (chainId) {
1027
+ const activeChainId = await connector.getChainId(); // Try to switch chain to provided `chainId`
1028
+
1029
+ if (chainId !== activeChainId) {
1030
+ var _connector$chains$fin, _connector$chains$fin2, _connector$chains$fin3, _connector$chains$fin4;
1031
+
1032
+ if (connector.switchChain) chain = await connector.switchChain(chainId);else throw new ChainMismatchError({
1033
+ 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),
1034
+ 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)
1035
+ });
1036
+ }
1037
+ }
1038
+
1039
+ const signer = await connector.getSigner({
1040
+ chainId: (_chain = chain) === null || _chain === void 0 ? void 0 : _chain.id
1041
+ });
1042
+ return await signer.sendTransaction(request);
677
1043
  } catch (error) {
678
1044
  if (error.code === 4001) throw new UserRejectedRequestError(error);
679
1045
  throw error;
@@ -700,4 +1066,4 @@ async function waitForTransaction(_ref) {
700
1066
  return await promise;
701
1067
  }
702
1068
 
703
- export { configureChains, connect, disconnect, erc20ABI, erc721ABI, fetchBalance, fetchBlockNumber, fetchEnsAddress, fetchEnsAvatar, fetchEnsName, fetchEnsResolver, fetchFeeData, fetchSigner, fetchToken, getAccount, getContract, getNetwork, getProvider, getWebSocketProvider, readContract, sendTransaction, signMessage, signTypedData, switchNetwork, units, waitForTransaction, watchAccount, watchBlockNumber, watchContractEvent, watchNetwork, watchProvider, watchReadContract, watchSigner, watchWebSocketProvider, writeContract };
1069
+ export { configureChains, connect, disconnect, erc20ABI, erc721ABI, fetchBalance, fetchBlockNumber, fetchEnsAddress, fetchEnsAvatar, fetchEnsName, fetchEnsResolver, fetchFeeData, fetchSigner, fetchToken, getAccount, getContract, getNetwork, getProvider, getWebSocketProvider, readContract, readContracts, sendTransaction, signMessage, signTypedData, switchNetwork, units, waitForTransaction, watchAccount, watchBlockNumber, watchContractEvent, watchNetwork, watchProvider, watchReadContract, watchReadContracts, watchSigner, watchWebSocketProvider, writeContract };