@lunch-money/ethereum-to-lunch-money 1.4.0 → 2.0.1

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.
@@ -1,24 +1,353 @@
1
1
  import * as ethscan from '@mycrypto/eth-scan';
2
+ import { ethers } from 'ethers';
2
3
  import tokenList1inch from '../fixtures/1inch.json';
3
- export const createEthereumWalletClient = (provider) => {
4
- // A custom ethscan provider implementation is needed to map `call` to `send` for ethscan to use the ethers client correctly.
5
- // This is a temporary solution until the ethscan library is updated to support ethers v6.
6
- const customProvider = {
7
- send(method, params) {
8
- // Type pulled from: https://github.com/MyCryptoHQ/eth-scan/blob/master/src/providers/provider.ts#L32
9
- const typedParams = params;
10
- return provider.call({ to: typedParams[0].to, data: typedParams[0].data });
11
- },
4
+ // Use node-fetch for Node.js compatibility
5
+ import fetch from 'node-fetch';
6
+ /**
7
+ * Debug function that logs to console.log if DEBUG_ETHEREUM environment variable is set
8
+ */
9
+ export const debug = (...args) => {
10
+ if (process.env.DEBUG_ETHEREUM) {
11
+ const timestamp = new Date().toISOString();
12
+ console.log(`[DEBUG_ETHEREUM] [${timestamp}]`, ...args);
13
+ }
14
+ };
15
+ export class EtherscanProvider {
16
+ apiKey;
17
+ baseUrl = 'https://api.etherscan.io/v2/api';
18
+ constructor(apiKey) {
19
+ this.apiKey = apiKey;
20
+ }
21
+ async discoverTokensForWallet(address, chainId) {
22
+ // Use chainId from provider, default to Ethereum mainnet (1)
23
+ const targetChainId = chainId ? Number(chainId) : 1;
24
+ const response = await fetch(`${this.baseUrl}?chainid=${targetChainId}&module=account&action=tokentx&address=${address}&startblock=0&endblock=99999999&sort=desc&apikey=${this.apiKey}`);
25
+ const data = await response.json();
26
+ // Handle valid "no transactions" response
27
+ if (data.status === '0' && data.message === 'No transactions found') {
28
+ return [];
29
+ }
30
+ // Handle API errors
31
+ if (data.status === '0' && data.message === 'NOTOK') {
32
+ throw new Error(`Etherscan V2 API error: ${data.result}`);
33
+ }
34
+ if (data.status !== '1') {
35
+ throw new Error(`Etherscan V2 API error: ${data.message}`);
36
+ }
37
+ // Extract unique token contract addresses from transfer events
38
+ const uniqueTokens = new Set();
39
+ for (const tx of data.result) {
40
+ uniqueTokens.add(tx.contractAddress);
41
+ }
42
+ return Array.from(uniqueTokens);
43
+ }
44
+ }
45
+ export class MoralisProvider {
46
+ apiKey;
47
+ baseUrl = 'https://deep-index.moralis.io/api/v2';
48
+ constructor(apiKey) {
49
+ this.apiKey = apiKey;
50
+ }
51
+ async discoverTokensForWallet(address, chainId) {
52
+ // Map chainId to Moralis chain format (only supports specific enum values)
53
+ let chainFormat;
54
+ if (chainId) {
55
+ switch (Number(chainId)) {
56
+ case 1:
57
+ chainFormat = 'eth';
58
+ break; // Ethereum mainnet
59
+ case 137:
60
+ chainFormat = 'polygon';
61
+ break; // Polygon
62
+ case 56:
63
+ chainFormat = 'bsc';
64
+ break; // BSC
65
+ case 42161:
66
+ chainFormat = 'arbitrum';
67
+ break; // Arbitrum
68
+ case 10:
69
+ chainFormat = 'optimism';
70
+ break; // Optimism
71
+ case 43114:
72
+ chainFormat = 'avalanche';
73
+ break; // Avalanche
74
+ case 250:
75
+ chainFormat = 'fantom';
76
+ break; // Fantom
77
+ default:
78
+ chainFormat = 'eth';
79
+ break; // Default to Ethereum
80
+ }
81
+ }
82
+ else {
83
+ chainFormat = 'eth'; // Default to Ethereum mainnet
84
+ }
85
+ const response = await fetch(`${this.baseUrl}/${address}/erc20?chain=${chainFormat}`, {
86
+ headers: {
87
+ 'X-API-Key': this.apiKey,
88
+ },
89
+ });
90
+ if (!response.ok) {
91
+ const errorData = await response.json().catch(() => ({}));
92
+ if (errorData.message && errorData.message.includes('over 2000 tokens')) {
93
+ throw new Error(`Moralis API error: Wallet has too many tokens (>2000) - ${errorData.message}`);
94
+ }
95
+ throw new Error(`Moralis API error: ${response.status} ${response.statusText}`);
96
+ }
97
+ const data = await response.json();
98
+ // Extract unique token contract addresses from balance data
99
+ const uniqueTokens = new Set();
100
+ for (const item of data) {
101
+ if (item.token_address && item.balance !== '0') {
102
+ uniqueTokens.add(item.token_address);
103
+ }
104
+ }
105
+ return Array.from(uniqueTokens);
106
+ }
107
+ }
108
+ export const createEthereumWalletClient = (serviceProviderInfo = [], walletAPIProviderInfo = []) => {
109
+ let providers = [];
110
+ let etherscanProvider = null;
111
+ let moralisProvider = null;
112
+ try {
113
+ // Initialize the custom provider(s) for ethscan to use the ethers client correctly.
114
+ // A custom ethscan provider implementation is needed to map `call` to `send` for ethscan to use the ethers client correctly.
115
+ // This is a temporary solution until the ethscan library is updated to support ethers v6.
116
+ if (serviceProviderInfo.length) {
117
+ providers = Object.freeze(serviceProviderInfo.map((providerInfo) => {
118
+ if (providerInfo.type === 'Service Provider' && providerInfo.provider) {
119
+ return {
120
+ ...providerInfo,
121
+ customProvider: {
122
+ send(method, params) {
123
+ // Type pulled from: https://github.com/MyCryptoHQ/eth-scan/blob/master/src/providers/provider.ts#L32
124
+ const typedParams = params;
125
+ return providerInfo.provider?.call({
126
+ to: typedParams[0].to,
127
+ data: typedParams[0].data,
128
+ });
129
+ },
130
+ },
131
+ };
132
+ }
133
+ else {
134
+ throw new Error(`Invalid service provider: ${providerInfo.name} passed to createEthereumWalletClient`);
135
+ }
136
+ }));
137
+ // Initialize any wallet API providers
138
+ for (const walletKeyInfo of walletAPIProviderInfo) {
139
+ if (walletKeyInfo.type === 'API Provider') {
140
+ if (walletKeyInfo.name === 'Etherscan' && walletKeyInfo.apiKey) {
141
+ etherscanProvider = new EtherscanProvider(walletKeyInfo.apiKey);
142
+ }
143
+ else if (walletKeyInfo.name === 'Moralis' && walletKeyInfo.apiKey) {
144
+ moralisProvider = new MoralisProvider(walletKeyInfo.apiKey);
145
+ }
146
+ }
147
+ else {
148
+ throw new Error(`Invalid wallet API provider: ${walletKeyInfo.name} passed to createEthereumWalletClient`);
149
+ }
150
+ }
151
+ }
152
+ else {
153
+ // Create a wallet using the quorum of free service providers
154
+ const publicProvider = ethers.getDefaultProvider();
155
+ providers = Object.freeze([
156
+ ...providers,
157
+ {
158
+ type: 'Service Provider',
159
+ name: 'Public Provider',
160
+ provider: publicProvider,
161
+ status: 'SUCCESS',
162
+ customProvider: {
163
+ send(method, params) {
164
+ const typedParams = params;
165
+ return publicProvider?.call({ to: typedParams[0].to, data: typedParams[0].data });
166
+ },
167
+ },
168
+ },
169
+ ]);
170
+ }
171
+ }
172
+ catch (error) {
173
+ throw new Error(`Error creating Ethereum wallet client: ${error instanceof Error ? error.message : String(error)}`);
174
+ }
175
+ const internalGetBalances = async (client, walletAddress, negligibleBalanceThreshold, provider, customProvider, obscuredWalletAddress) => {
176
+ let timeoutId;
177
+ const timeoutDuration = process.env.ETHEREUM_BALANCE_TIMEOUT_MSECS
178
+ ? parseInt(process.env.ETHEREUM_BALANCE_TIMEOUT_MSECS)
179
+ : 60000;
180
+ const timeout = new Promise((_, reject) => {
181
+ timeoutId = setTimeout(() => {
182
+ reject(new Error(`Ethereum connector getBalances timed out after ${timeoutDuration} milliseconds.`));
183
+ }, timeoutDuration);
184
+ });
185
+ const result = await Promise.race([
186
+ (async () => {
187
+ try {
188
+ const weiBalance = await client.getWeiBalance(walletAddress, provider);
189
+ const chainId = await client.getChainId(provider);
190
+ let filteredTokens = [];
191
+ try {
192
+ let discoveredTokens = [];
193
+ if (moralisProvider || etherscanProvider) {
194
+ discoveredTokens = await client.discoverTokensHybrid(walletAddress, chainId);
195
+ if (discoveredTokens.length > 0) {
196
+ filteredTokens = await loadTokenList().then((tokens) => tokens.filter((t) => discoveredTokens.includes(t.address) && BigInt(t.chainId) === BigInt(chainId)));
197
+ debug(`Wallet ${obscuredWalletAddress}: Filtered to ${filteredTokens.length} tokens on chain ${chainId}`);
198
+ }
199
+ else {
200
+ debug(`Wallet ${obscuredWalletAddress}: No tokens discovered, using empty token list`);
201
+ }
202
+ }
203
+ else {
204
+ debug(`Wallet ${obscuredWalletAddress}: No discovery APIs available, using full token list`);
205
+ filteredTokens = (await loadTokenList()).filter((t) => BigInt(t.chainId) === BigInt(chainId));
206
+ }
207
+ }
208
+ catch (error) {
209
+ debug(`Wallet ${obscuredWalletAddress}: Token discovery failed, falling back to full token list:`, error);
210
+ filteredTokens = (await loadTokenList()).filter((t) => BigInt(t.chainId) === BigInt(chainId));
211
+ }
212
+ debug(`Wallet ${obscuredWalletAddress}: Checking balances for ETH and ${filteredTokens.length} other tokens`);
213
+ const map = await ethscan.getTokensBalance(customProvider, walletAddress, filteredTokens.map((t) => t.address));
214
+ return { weiBalance, chainId, map, filteredTokens };
215
+ }
216
+ finally {
217
+ if (timeoutId) {
218
+ clearTimeout(timeoutId);
219
+ }
220
+ }
221
+ })(),
222
+ timeout,
223
+ ]);
224
+ const { weiBalance, chainId, map, filteredTokens } = result;
225
+ debug('ethers.getTokensBalance returned for wallet address:', obscuredWalletAddress);
226
+ const balances = Object.entries(map)
227
+ .map(([address, balance]) => {
228
+ const token = filteredTokens.find((t) => t.address === address);
229
+ if (!token) {
230
+ throw new Error(`Token ${address} not found in discovered token list for chainId ${chainId}`);
231
+ }
232
+ return {
233
+ asset: token.symbol,
234
+ undivisedAmount: balance,
235
+ decimals: token.decimals,
236
+ };
237
+ })
238
+ .concat({ asset: 'ETH', undivisedAmount: weiBalance, decimals: 18 })
239
+ .map(({ asset, undivisedAmount, decimals }) => ({ asset, amount: ethers.formatUnits(undivisedAmount, decimals) }))
240
+ .filter((b) => ethers.parseUnits(b.amount, 18) > negligibleBalanceThreshold)
241
+ .map((b) => ({ asset: b.asset, amount: String(b.amount) }))
242
+ .sort((a, b) => a.asset.localeCompare(b.asset));
243
+ debug(`Returning from getBalances for ${obscuredWalletAddress}:`, balances);
244
+ const balanceResult = {
245
+ providerName: 'wallet_ethereum',
246
+ balances,
247
+ };
248
+ return balanceResult;
12
249
  };
13
250
  return {
14
- async getChainId() {
251
+ async getChainId(provider) {
15
252
  return (await provider.getNetwork()).chainId;
16
253
  },
17
- async getWeiBalance(walletAddress) {
254
+ async getWeiBalance(walletAddress, provider) {
18
255
  return await provider.getBalance(walletAddress);
19
256
  },
20
- async getTokensBalance(walletAddress, tokenContractAddresses) {
21
- return ethscan.getTokensBalance(customProvider, walletAddress, tokenContractAddresses);
257
+ async getBalances(walletAddress, negligibleBalanceThreshold) {
258
+ const obscuredWalletAddress = `0x..${walletAddress.slice(-6)}`;
259
+ debug('getBalances called for wallet address:', obscuredWalletAddress);
260
+ let result = {
261
+ providerName: 'wallet_ethereum',
262
+ balances: [],
263
+ };
264
+ if (providers.length === 0) {
265
+ throw new Error('No Ethereum providers available');
266
+ }
267
+ let providerIndex = 0;
268
+ let provider = providers[0].provider;
269
+ let customProvider = providers[0].customProvider;
270
+ let providerName = providers[0].name;
271
+ debug(`Attempting lookup using primary provider: ${providerName}`);
272
+ let balanceFound = false;
273
+ while (!balanceFound) {
274
+ try {
275
+ result = await internalGetBalances(this, walletAddress, negligibleBalanceThreshold, provider, customProvider, obscuredWalletAddress);
276
+ balanceFound = true;
277
+ }
278
+ catch (error) {
279
+ const errorMessage = error instanceof Error ? error.message : String(error);
280
+ debug(`Error getting balances using provider ${providerName}: ${errorMessage}`);
281
+ if (errorMessage.includes('unconfigured name') || errorMessage.includes('bad address checksum')) {
282
+ balanceFound = true; // Should not be needed, but just in case
283
+ throw new Error(`Invalid wallet address. Account needs to be relinked.`);
284
+ }
285
+ else if (providerIndex === providers.length - 1) {
286
+ balanceFound = true; // Should not be needed, but just in case
287
+ throw error;
288
+ }
289
+ providerIndex = providerIndex + 1;
290
+ providerName = providers[providerIndex].name;
291
+ provider = providers[providerIndex].provider;
292
+ customProvider = providers[providerIndex].customProvider;
293
+ debug(`Retrying lookup using provider: ${providerName}`);
294
+ }
295
+ }
296
+ return result;
297
+ },
298
+ async getTokensBalance(walletAddress, tokenContractAddresses, providerInfo) {
299
+ if (providerInfo.customProvider) {
300
+ return ethscan.getTokensBalance(providerInfo.customProvider, walletAddress, tokenContractAddresses);
301
+ }
302
+ else {
303
+ throw new Error(`No ethscan compatible provider found for ${providerInfo.name}`);
304
+ }
305
+ },
306
+ async discoverTokensHybrid(walletAddress, chainId) {
307
+ const allTokens = new Set();
308
+ // 1. Moralis Discovery (PRIMARY)
309
+ if (moralisProvider) {
310
+ try {
311
+ const moralisTokens = await moralisProvider.discoverTokensForWallet(walletAddress, chainId);
312
+ debug(`Moralis: Discovered ${moralisTokens.length} tokens`);
313
+ moralisTokens.forEach((t) => allTokens.add(t));
314
+ }
315
+ catch (error) {
316
+ debug(`Moralis: Failed - ${error instanceof Error ? error.message : String(error)}`);
317
+ // 2. Etherscan Discovery (FALLBACK ONLY)
318
+ if (etherscanProvider) {
319
+ try {
320
+ const etherscanTokens = await etherscanProvider.discoverTokensForWallet(walletAddress, chainId);
321
+ debug(`Etherscan (fallback): Discovered ${etherscanTokens.length} tokens`);
322
+ etherscanTokens.forEach((t) => allTokens.add(t));
323
+ }
324
+ catch (fallbackError) {
325
+ debug(`Etherscan (fallback): Failed - ${fallbackError instanceof Error ? fallbackError.message : String(fallbackError)}`);
326
+ }
327
+ }
328
+ else {
329
+ debug('Etherscan: No API key provided for fallback');
330
+ }
331
+ }
332
+ }
333
+ else {
334
+ debug('Moralis: No API key provided');
335
+ // 3. Etherscan Discovery (PRIMARY if no Moralis)
336
+ if (etherscanProvider) {
337
+ try {
338
+ const etherscanTokens = await etherscanProvider.discoverTokensForWallet(walletAddress, chainId);
339
+ debug(`Etherscan: Discovered ${etherscanTokens.length} tokens`);
340
+ etherscanTokens.forEach((t) => allTokens.add(t));
341
+ }
342
+ catch (error) {
343
+ debug(`Etherscan: Failed - ${error instanceof Error ? error.message : String(error)}`);
344
+ }
345
+ }
346
+ else {
347
+ debug('Etherscan: No API key provided');
348
+ }
349
+ }
350
+ return Array.from(allTokens);
22
351
  },
23
352
  };
24
353
  };
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAG9C,OAAO,cAAc,MAAM,wBAAwB,CAAC;AASpD,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,QAAiC,EAAwB,EAAE;IACpG,6HAA6H;IAC7H,0FAA0F;IAC1F,MAAM,cAAc,GAAuB;QACzC,IAAI,CAAS,MAAc,EAAE,MAA2B;YACtD,qGAAqG;YACrG,MAAM,WAAW,GAAG,MAAgD,CAAC;YAErE,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAoB,CAAC;QAChG,CAAC;KACF,CAAC;IAEF,OAAO;QACL,KAAK,CAAC,UAAU;YACd,OAAO,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC;QAC/C,CAAC;QACD,KAAK,CAAC,aAAa,CAAC,aAAa;YAC/B,OAAO,MAAM,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QAClD,CAAC;QACD,KAAK,CAAC,gBAAgB,CAAC,aAAa,EAAE,sBAAsB;YAC1D,OAAO,OAAO,CAAC,gBAAgB,CAAC,cAAc,EAAE,aAAa,EAAE,sBAAsB,CAAC,CAAC;QACzF,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAWF,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,IAAsB,EAAE;IACxD,OAAO,cAAc,CAAC,MAAM,CAAC;AAC/B,CAAC,CAAC"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAwC,MAAM,QAAQ,CAAC;AAEtE,OAAO,cAAc,MAAM,wBAAwB,CAAC;AAIpD,2CAA2C;AAC3C,OAAO,KAAK,MAAM,YAAY,CAAC;AAe/B;;GAEG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,GAAG,IAAe,EAAQ,EAAE;IAChD,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE;QAC9B,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,qBAAqB,SAAS,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;KACzD;AACH,CAAC,CAAC;AAaF,MAAM,OAAO,iBAAiB;IACpB,MAAM,CAAS;IACf,OAAO,GAAW,iCAAiC,CAAC;IAE5D,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,OAAe,EAAE,OAAgB;QAC7D,6DAA6D;QAC7D,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEpD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,GAAG,IAAI,CAAC,OAAO,YAAY,aAAa,0CAA0C,OAAO,oDAAoD,IAAI,CAAC,MAAM,EAAE,CAC3J,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEnC,0CAA0C;QAC1C,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,OAAO,KAAK,uBAAuB,EAAE;YACnE,OAAO,EAAE,CAAC;SACX;QAED,oBAAoB;QACpB,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE;YACnD,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;SAC3D;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,EAAE;YACvB,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;SAC5D;QAED,+DAA+D;QAC/D,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;QACvC,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE;YAC5B,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC;SACtC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAClC,CAAC;CACF;AAED,MAAM,OAAO,eAAe;IAClB,MAAM,CAAS;IACf,OAAO,GAAW,sCAAsC,CAAC;IAEjE,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,OAAe,EAAE,OAAgB;QAC7D,2EAA2E;QAC3E,IAAI,WAAmB,CAAC;QACxB,IAAI,OAAO,EAAE;YACX,QAAQ,MAAM,CAAC,OAAO,CAAC,EAAE;gBACvB,KAAK,CAAC;oBACJ,WAAW,GAAG,KAAK,CAAC;oBACpB,MAAM,CAAC,mBAAmB;gBAC5B,KAAK,GAAG;oBACN,WAAW,GAAG,SAAS,CAAC;oBACxB,MAAM,CAAC,UAAU;gBACnB,KAAK,EAAE;oBACL,WAAW,GAAG,KAAK,CAAC;oBACpB,MAAM,CAAC,MAAM;gBACf,KAAK,KAAK;oBACR,WAAW,GAAG,UAAU,CAAC;oBACzB,MAAM,CAAC,WAAW;gBACpB,KAAK,EAAE;oBACL,WAAW,GAAG,UAAU,CAAC;oBACzB,MAAM,CAAC,WAAW;gBACpB,KAAK,KAAK;oBACR,WAAW,GAAG,WAAW,CAAC;oBAC1B,MAAM,CAAC,YAAY;gBACrB,KAAK,GAAG;oBACN,WAAW,GAAG,QAAQ,CAAC;oBACvB,MAAM,CAAC,SAAS;gBAClB;oBACE,WAAW,GAAG,KAAK,CAAC;oBACpB,MAAM,CAAC,sBAAsB;aAChC;SACF;aAAM;YACL,WAAW,GAAG,KAAK,CAAC,CAAC,8BAA8B;SACpD;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,gBAAgB,WAAW,EAAE,EAAE;YACpF,OAAO,EAAE;gBACP,WAAW,EAAE,IAAI,CAAC,MAAM;aACzB;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;YAChB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1D,IAAI,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE;gBACvE,MAAM,IAAI,KAAK,CAAC,2DAA2D,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;aACjG;YACD,MAAM,IAAI,KAAK,CAAC,sBAAsB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;SACjF;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEnC,4DAA4D;QAC5D,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;QACvC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE;YACvB,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,OAAO,KAAK,GAAG,EAAE;gBAC9C,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;aACtC;SACF;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAClC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,sBAAsC,EAAE,EACxC,wBAAwC,EAAE,EACpB,EAAE;IACxB,IAAI,SAAS,GAAgC,EAAE,CAAC;IAChD,IAAI,iBAAiB,GAA6B,IAAI,CAAC;IACvD,IAAI,eAAe,GAA2B,IAAI,CAAC;IAEnD,IAAI;QACF,oFAAoF;QACpF,6HAA6H;QAC7H,0FAA0F;QAC1F,IAAI,mBAAmB,CAAC,MAAM,EAAE;YAC9B,SAAS,GAAG,MAAM,CAAC,MAAM,CACvB,mBAAmB,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE;gBACvC,IAAI,YAAY,CAAC,IAAI,KAAK,kBAAkB,IAAI,YAAY,CAAC,QAAQ,EAAE;oBACrE,OAAO;wBACL,GAAG,YAAY;wBACf,cAAc,EAAE;4BACd,IAAI,CAAS,MAAc,EAAE,MAA2B;gCACtD,qGAAqG;gCACrG,MAAM,WAAW,GAAG,MAAgD,CAAC;gCACrE,OAAO,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC;oCACjC,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE;oCACrB,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI;iCAC1B,CAAoB,CAAC;4BACxB,CAAC;yBACF;qBACF,CAAC;iBACH;qBAAM;oBACL,MAAM,IAAI,KAAK,CAAC,6BAA6B,YAAY,CAAC,IAAI,uCAAuC,CAAC,CAAC;iBACxG;YACH,CAAC,CAAC,CACH,CAAC;YAEF,sCAAsC;YACtC,KAAK,MAAM,aAAa,IAAI,qBAAqB,EAAE;gBACjD,IAAI,aAAa,CAAC,IAAI,KAAK,cAAc,EAAE;oBACzC,IAAI,aAAa,CAAC,IAAI,KAAK,WAAW,IAAI,aAAa,CAAC,MAAM,EAAE;wBAC9D,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;qBACjE;yBAAM,IAAI,aAAa,CAAC,IAAI,KAAK,SAAS,IAAI,aAAa,CAAC,MAAM,EAAE;wBACnE,eAAe,GAAG,IAAI,eAAe,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;qBAC7D;iBACF;qBAAM;oBACL,MAAM,IAAI,KAAK,CAAC,gCAAgC,aAAa,CAAC,IAAI,uCAAuC,CAAC,CAAC;iBAC5G;aACF;SACF;aAAM;YACL,6DAA6D;YAC7D,MAAM,cAAc,GAAG,MAAM,CAAC,kBAAkB,EAAE,CAAC;YACnD,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;gBACxB,GAAG,SAAS;gBACZ;oBACE,IAAI,EAAE,kBAAkB;oBACxB,IAAI,EAAE,iBAAiB;oBACvB,QAAQ,EAAE,cAA0B;oBACpC,MAAM,EAAE,SAAS;oBACjB,cAAc,EAAE;wBACd,IAAI,CAAS,MAAc,EAAE,MAA2B;4BACtD,MAAM,WAAW,GAAG,MAAgD,CAAC;4BACrE,OAAO,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAoB,CAAC;wBACvG,CAAC;qBACF;iBACF;aACF,CAAC,CAAC;SACJ;KACF;IAAC,OAAO,KAAK,EAAE;QACd,MAAM,IAAI,KAAK,CAAC,0CAA0C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;KACrH;IAED,MAAM,mBAAmB,GAAG,KAAK,EAC/B,MAA4B,EAC5B,aAAqB,EACrB,0BAAkC,EAClC,QAA0B,EAC1B,cAAkC,EAClC,qBAA6B,EACgB,EAAE;QAC/C,IAAI,SAAqC,CAAC;QAC1C,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,8BAA8B;YAChE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC;YACtD,CAAC,CAAC,KAAK,CAAC;QACV,MAAM,OAAO,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YAC/C,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC1B,MAAM,CAAC,IAAI,KAAK,CAAC,kDAAkD,eAAe,gBAAgB,CAAC,CAAC,CAAC;YACvG,CAAC,EAAE,eAAe,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YAChC,CAAC,KAAK,IAAI,EAAE;gBACV,IAAI;oBACF,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;oBACvE,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;oBAElD,IAAI,cAAc,GAAY,EAAE,CAAC;oBACjC,IAAI;wBACF,IAAI,gBAAgB,GAAa,EAAE,CAAC;wBACpC,IAAI,eAAe,IAAI,iBAAiB,EAAE;4BACxC,gBAAgB,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;4BAC7E,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;gCAC/B,cAAc,GAAG,MAAM,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CACrD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC,CACpG,CAAC;gCACF,KAAK,CACH,UAAU,qBAAqB,iBAAiB,cAAc,CAAC,MAAM,oBAAoB,OAAO,EAAE,CACnG,CAAC;6BACH;iCAAM;gCACL,KAAK,CAAC,UAAU,qBAAqB,gDAAgD,CAAC,CAAC;6BACxF;yBACF;6BAAM;4BACL,KAAK,CAAC,UAAU,qBAAqB,sDAAsD,CAAC,CAAC;4BAC7F,cAAc,GAAG,CAAC,MAAM,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;yBAC/F;qBACF;oBAAC,OAAO,KAAK,EAAE;wBACd,KAAK,CAAC,UAAU,qBAAqB,4DAA4D,EAAE,KAAK,CAAC,CAAC;wBAC1G,cAAc,GAAG,CAAC,MAAM,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;qBAC/F;oBAED,KAAK,CAAC,UAAU,qBAAqB,mCAAmC,cAAc,CAAC,MAAM,eAAe,CAAC,CAAC;oBAE9G,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,gBAAgB,CACxC,cAAc,EACd,aAAa,EACb,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CACrC,CAAC;oBAEF,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC;iBACrD;wBAAS;oBACR,IAAI,SAAS,EAAE;wBACb,YAAY,CAAC,SAAS,CAAC,CAAC;qBACzB;iBACF;YACH,CAAC,CAAC,EAAE;YACJ,OAAO;SACR,CAAC,CAAC;QAEH,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC;QAC5D,KAAK,CAAC,sDAAsD,EAAE,qBAAqB,CAAC,CAAC;QAErF,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;aACjC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE;YAC1B,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;YAEhE,IAAI,CAAC,KAAK,EAAE;gBACV,MAAM,IAAI,KAAK,CAAC,SAAS,OAAO,mDAAmD,OAAO,EAAE,CAAC,CAAC;aAC/F;YAED,OAAO;gBACL,KAAK,EAAE,KAAK,CAAC,MAAM;gBACnB,eAAe,EAAE,OAAO;gBACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;aACzB,CAAC;QACJ,CAAC,CAAC;aACD,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;aACnE,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,eAAe,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;aACjH,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,0BAA0B,CAAC;aAC3E,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;aAC1D,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAElD,KAAK,CAAC,kCAAkC,qBAAqB,GAAG,EAAE,QAAQ,CAAC,CAAC;QAE5E,MAAM,aAAa,GAAuC;YACxD,YAAY,EAAE,iBAAiB;YAC/B,QAAQ;SACT,CAAC;QAEF,OAAO,aAAa,CAAC;IACvB,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,CAAC,UAAU,CAAC,QAA0B;YACzC,OAAO,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC;QAC/C,CAAC;QACD,KAAK,CAAC,aAAa,CAAC,aAAqB,EAAE,QAA0B;YACnE,OAAO,MAAM,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QAClD,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,aAAqB,EAAE,0BAAkC;YACzE,MAAM,qBAAqB,GAAG,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,KAAK,CAAC,wCAAwC,EAAE,qBAAqB,CAAC,CAAC;YACvE,IAAI,MAAM,GAAuC;gBAC/C,YAAY,EAAE,iBAAiB;gBAC/B,QAAQ,EAAE,EAAE;aACb,CAAC;YACF,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC1B,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;aACpD;YACD,IAAI,aAAa,GAAG,CAAC,CAAC;YACtB,IAAI,QAAQ,GAAqB,SAAS,CAAC,CAAC,CAAC,CAAC,QAA4B,CAAC;YAC3E,IAAI,cAAc,GAAuB,SAAS,CAAC,CAAC,CAAC,CAAC,cAAoC,CAAC;YAC3F,IAAI,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACrC,KAAK,CAAC,6CAA6C,YAAY,EAAE,CAAC,CAAC;YACnE,IAAI,YAAY,GAAG,KAAK,CAAC;YACzB,OAAO,CAAC,YAAY,EAAE;gBACpB,IAAI;oBACF,MAAM,GAAG,MAAM,mBAAmB,CAChC,IAAI,EACJ,aAAa,EACb,0BAA0B,EAC1B,QAAQ,EACR,cAAc,EACd,qBAAqB,CACtB,CAAC;oBACF,YAAY,GAAG,IAAI,CAAC;iBACrB;gBAAC,OAAO,KAAK,EAAE;oBACd,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBAC5E,KAAK,CAAC,yCAAyC,YAAY,KAAK,YAAY,EAAE,CAAC,CAAC;oBAChF,IAAI,YAAY,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE;wBAC/F,YAAY,GAAG,IAAI,CAAC,CAAC,yCAAyC;wBAC9D,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;qBAC1E;yBAAM,IAAI,aAAa,KAAK,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;wBACjD,YAAY,GAAG,IAAI,CAAC,CAAC,yCAAyC;wBAC9D,MAAM,KAAK,CAAC;qBACb;oBACD,aAAa,GAAG,aAAa,GAAG,CAAC,CAAC;oBAClC,YAAY,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC;oBAC7C,QAAQ,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC,QAA4B,CAAC;oBACjE,cAAc,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC,cAAoC,CAAC;oBAC/E,KAAK,CAAC,mCAAmC,YAAY,EAAE,CAAC,CAAC;iBAC1D;aACF;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,KAAK,CAAC,gBAAgB,CAAC,aAAqB,EAAE,sBAAgC,EAAE,YAA0B;YACxG,IAAI,YAAY,CAAC,cAAc,EAAE;gBAC/B,OAAO,OAAO,CAAC,gBAAgB,CAAC,YAAY,CAAC,cAAc,EAAE,aAAa,EAAE,sBAAsB,CAAC,CAAC;aACrG;iBAAM;gBACL,MAAM,IAAI,KAAK,CAAC,4CAA4C,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;aAClF;QACH,CAAC;QACD,KAAK,CAAC,oBAAoB,CAAC,aAAqB,EAAE,OAAe;YAC/D,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;YAEpC,iCAAiC;YACjC,IAAI,eAAe,EAAE;gBACnB,IAAI;oBACF,MAAM,aAAa,GAAG,MAAM,eAAe,CAAC,uBAAuB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;oBAC5F,KAAK,CAAC,uBAAuB,aAAa,CAAC,MAAM,SAAS,CAAC,CAAC;oBAC5D,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;iBAChD;gBAAC,OAAO,KAAK,EAAE;oBACd,KAAK,CAAC,qBAAqB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBAErF,yCAAyC;oBACzC,IAAI,iBAAiB,EAAE;wBACrB,IAAI;4BACF,MAAM,eAAe,GAAG,MAAM,iBAAiB,CAAC,uBAAuB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;4BAChG,KAAK,CAAC,oCAAoC,eAAe,CAAC,MAAM,SAAS,CAAC,CAAC;4BAC3E,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;yBAClD;wBAAC,OAAO,aAAa,EAAE;4BACtB,KAAK,CACH,kCAAkC,aAAa,YAAY,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CACnH,CAAC;yBACH;qBACF;yBAAM;wBACL,KAAK,CAAC,6CAA6C,CAAC,CAAC;qBACtD;iBACF;aACF;iBAAM;gBACL,KAAK,CAAC,8BAA8B,CAAC,CAAC;gBAEtC,iDAAiD;gBACjD,IAAI,iBAAiB,EAAE;oBACrB,IAAI;wBACF,MAAM,eAAe,GAAG,MAAM,iBAAiB,CAAC,uBAAuB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;wBAChG,KAAK,CAAC,yBAAyB,eAAe,CAAC,MAAM,SAAS,CAAC,CAAC;wBAChE,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;qBAClD;oBAAC,OAAO,KAAK,EAAE;wBACd,KAAK,CAAC,uBAAuB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;qBACxF;iBACF;qBAAM;oBACL,KAAK,CAAC,gCAAgC,CAAC,CAAC;iBACzC;aACF;YAED,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAWF,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,IAAsB,EAAE;IACxD,OAAO,cAAc,CAAC,MAAM,CAAC;AAC/B,CAAC,CAAC"}
@@ -0,0 +1,34 @@
1
+ import type { ProviderInfo, EthereumWalletClient } from './client.js';
2
+ export interface EthereumIntegrationType {
3
+ initialized: boolean;
4
+ walletClient: EthereumWalletClient;
5
+ serviceProviderInfo: ProviderInfo[];
6
+ walletProviderInfo: ProviderInfo[];
7
+ [key: string]: unknown;
8
+ }
9
+ export interface INTEGRATIONS {
10
+ ethereum: EthereumIntegrationType;
11
+ [key: string]: unknown;
12
+ }
13
+ declare class EthereumInitializationService {
14
+ private integrations;
15
+ private logDebug;
16
+ private initialized;
17
+ private ethereumIntegration;
18
+ constructor(integrations: INTEGRATIONS, logDebug: (message: string) => void);
19
+ initialize(): Promise<EthereumIntegrationType>;
20
+ private validateAPIKeys;
21
+ private processResults;
22
+ private handleError;
23
+ private testProvider;
24
+ private testApiKey;
25
+ private getCleanErrorMessage;
26
+ private maskKey;
27
+ private warnAboutLegacyKeys;
28
+ private getPrivateProviders;
29
+ private getWalletTokenApiKeyTestInfo;
30
+ private handleMoralisResponse;
31
+ private handleEtherscanResponse;
32
+ private getErrorMessage;
33
+ }
34
+ export default EthereumInitializationService;