@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.
- package/LICENSE +21 -0
- package/README.md +30 -0
- package/chains/dist/wagmi-core-chains.esm.d.ts +11 -0
- package/chains/dist/wagmi-core-chains.esm.js +2 -0
- package/chains/package.json +3 -0
- package/connectors/coinbaseWallet/dist/wagmi-core-connectors-coinbaseWallet.esm.d.ts +11 -0
- package/connectors/coinbaseWallet/dist/wagmi-core-connectors-coinbaseWallet.esm.js +246 -0
- package/connectors/coinbaseWallet/package.json +3 -0
- package/connectors/metaMask/dist/wagmi-core-connectors-metaMask.esm.d.ts +11 -0
- package/connectors/metaMask/dist/wagmi-core-connectors-metaMask.esm.js +146 -0
- package/connectors/metaMask/package.json +3 -0
- package/connectors/mock/dist/wagmi-core-connectors-mock.esm.d.ts +11 -0
- package/connectors/mock/dist/wagmi-core-connectors-mock.esm.js +257 -0
- package/connectors/mock/package.json +3 -0
- package/connectors/walletConnect/dist/wagmi-core-connectors-walletConnect.esm.d.ts +11 -0
- package/connectors/walletConnect/dist/wagmi-core-connectors-walletConnect.esm.js +207 -0
- package/connectors/walletConnect/package.json +3 -0
- package/dist/chains-de91362e.esm.js +493 -0
- package/dist/getProvider-34b63ce9.esm.js +1055 -0
- package/dist/rpcs-f39d022b.esm.js +50 -0
- package/dist/wagmi-core.esm.d.ts +11 -0
- package/dist/wagmi-core.esm.js +1515 -0
- package/package.json +76 -0
- package/providers/alchemy/dist/wagmi-core-providers-alchemy.esm.d.ts +11 -0
- package/providers/alchemy/dist/wagmi-core-providers-alchemy.esm.js +32 -0
- package/providers/alchemy/package.json +3 -0
- package/providers/infura/dist/wagmi-core-providers-infura.esm.d.ts +11 -0
- package/providers/infura/dist/wagmi-core-providers-infura.esm.js +32 -0
- package/providers/infura/package.json +3 -0
- package/providers/jsonRpc/dist/wagmi-core-providers-jsonRpc.esm.d.ts +11 -0
- package/providers/jsonRpc/dist/wagmi-core-providers-jsonRpc.esm.js +42 -0
- package/providers/jsonRpc/package.json +3 -0
- package/providers/public/dist/wagmi-core-providers-public.esm.d.ts +11 -0
- package/providers/public/dist/wagmi-core-providers-public.esm.js +28 -0
- 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 };
|