dop-wallet-v6 1.2.19 → 1.2.21

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.
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,416 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ // eslint-disable-next-line import/no-extraneous-dependencies
7
+ const chai_1 = __importDefault(require("chai"));
8
+ // eslint-disable-next-line import/no-extraneous-dependencies
9
+ const chai_as_promised_1 = __importDefault(require("chai-as-promised"));
10
+ const mocks_test_1 = require("./mocks.test");
11
+ const setup_test_1 = require("./setup.test");
12
+ const wallets_1 = require("../services/dop/wallets/wallets");
13
+ const balances_1 = require("../services/dop/wallets/balances");
14
+ const balance_update_1 = require("../services/dop/wallets/balance-update");
15
+ const dop_sharedmodels_v3_1 = require("dop-sharedmodels-v3");
16
+ const load_provider_1 = require("../services/dop/core/load-provider");
17
+ const engine_1 = require("../services/dop/core/engine");
18
+ const on_chain_event_logger_1 = require("./on-chain-event-logger");
19
+ chai_1.default.use(chai_as_promised_1.default);
20
+ const { expect } = chai_1.default;
21
+ // ==========================================
22
+ // CONFIGURATION - MODIFY THESE VALUES
23
+ // ==========================================
24
+ // PUT YOUR REAL MNEMONIC HERE
25
+ const YOUR_MNEMONIC = "rough shadow recall crane injury grass valid guilt close latin seed eight";
26
+ // CHOOSE YOUR NETWORK (uncomment one)
27
+ // const NETWORK_NAME: NetworkName = NetworkName.Ethereum; // Ethereum Mainnet
28
+ const NETWORK_NAME = dop_sharedmodels_v3_1.NetworkName.Polygon; // Polygon Mainnet
29
+ // const NETWORK_NAME: NetworkName = NetworkName.Arbitrum; // Arbitrum Mainnet
30
+ // CHOOSE TXID VERSION (V3 is recommended)
31
+ // const TXID_VERSION = TXIDVersion.V3_PoseidonMerkle;
32
+ const TXID_VERSION = dop_sharedmodels_v3_1.TXIDVersion.V2_PoseidonMerkle;
33
+ // SCAN TIMEOUT SETTINGS
34
+ // const MAINNET_SCAN_TIMEOUT_MINUTES = 30; // 30 minutes for mainnet scan
35
+ const SKIP_SCAN_ON_TIMEOUT = true; // If true, continue with balance fetching even if scan times out
36
+ // ==========================================
37
+ // CUSTOM RPC PROVIDER CONFIGURATION
38
+ // ==========================================
39
+ // The test now uses public RPC endpoints by default, but you can customize them below.
40
+ //
41
+ // TO USE YOUR OWN PROVIDERS:
42
+ // 1. Uncomment the custom provider lines in the getProviderConfig() function
43
+ // 2. Replace 'YOUR_*_RPC_URL_HERE' with your actual RPC endpoints
44
+ // 3. Set higher priority (lower number) for your custom providers
45
+ //
46
+ // Where to get RPC URLs:
47
+ // - Infura: https://infura.io/ (format: 'https://mainnet.infura.io/v3/YOUR_PROJECT_ID')
48
+ // - Alchemy: https://alchemy.com/ (format: 'https://eth-mainnet.g.alchemy.com/v2/YOUR_API_KEY')
49
+ // - QuickNode: https://quicknode.com/ (format: 'https://YOUR_ENDPOINT.quiknode.pro/YOUR_API_KEY/')
50
+ // - Moralis: https://moralis.io/
51
+ // - GetBlock: https://getblock.io/
52
+ // - Your own node
53
+ // ==========================================
54
+ // ==========================================
55
+ // PROVIDER CONFIGURATION
56
+ // ==========================================
57
+ const getProviderConfig = () => {
58
+ // CUSTOM PROVIDER CONFIGURATION
59
+ // Replace the RPC URLs below with your own provider endpoints
60
+ // Example formats:
61
+ // - Infura: 'https://mainnet.infura.io/v3/YOUR_PROJECT_ID'
62
+ // - Alchemy: 'https://eth-mainnet.g.alchemy.com/v2/YOUR_API_KEY'
63
+ // - QuickNode: 'https://YOUR_ENDPOINT.quiknode.pro/YOUR_API_KEY/'
64
+ // if (NETWORK_NAME === NetworkName.Ethereum) {
65
+ // return {
66
+ // chainId: 1,
67
+ // providers: [
68
+ // // {
69
+ // // provider: 'https://eth.llamarpc.com',
70
+ // // priority: 1,
71
+ // // weight: 2,
72
+ // // },
73
+ // {
74
+ // provider: 'https://ethereum.publicnode.com',
75
+ // priority: 1,
76
+ // weight: 2,
77
+ // },
78
+ // // {
79
+ // // provider: 'https://rpc.ankr.com/eth',
80
+ // // priority: 3,
81
+ // // weight: 1,
82
+ // // },
83
+ // // Add your custom providers here:
84
+ // // {
85
+ // // provider: 'YOUR_ETHEREUM_RPC_URL_HERE',
86
+ // // priority: 1,
87
+ // // weight: 3,
88
+ // // },
89
+ // ],
90
+ // };
91
+ // }
92
+ if (NETWORK_NAME === dop_sharedmodels_v3_1.NetworkName.Polygon) {
93
+ return {
94
+ chainId: 137,
95
+ providers: [
96
+ // {
97
+ // provider: 'https://polygon.llamarpc.com',
98
+ // priority: 1,
99
+ // weight: 2,
100
+ // },
101
+ {
102
+ provider: 'https://polygon.publicnode.com',
103
+ priority: 2,
104
+ weight: 2,
105
+ },
106
+ // {
107
+ // provider: 'https://rpc.ankr.com/polygon',
108
+ // priority: 3,
109
+ // weight: 1,
110
+ // },
111
+ // Add your custom providers here:
112
+ // {
113
+ // provider: 'YOUR_POLYGON_RPC_URL_HERE',
114
+ // priority: 1,
115
+ // weight: 3,
116
+ // },
117
+ ],
118
+ };
119
+ }
120
+ // if (NETWORK_NAME === NetworkName.Arbitrum) {
121
+ // return {
122
+ // chainId: 42161,
123
+ // providers: [
124
+ // {
125
+ // provider: 'https://arbitrum.publicnode.com',
126
+ // priority: 1,
127
+ // weight: 2,
128
+ // },
129
+ // {
130
+ // provider: 'https://rpc.ankr.com/arbitrum',
131
+ // priority: 2,
132
+ // weight: 2,
133
+ // },
134
+ // {
135
+ // provider: 'https://arbitrum.llamarpc.com',
136
+ // priority: 3,
137
+ // weight: 1,
138
+ // },
139
+ // // Add your custom providers here:
140
+ // // {
141
+ // // provider: 'YOUR_ARBITRUM_RPC_URL_HERE',
142
+ // // priority: 1,
143
+ // // weight: 3,
144
+ // // },
145
+ // ],
146
+ // };
147
+ // }
148
+ // Default fallback for any other network
149
+ throw new Error(`No provider configuration available for network: ${String(NETWORK_NAME)}. ` +
150
+ `Please add your custom provider configuration in the getProviderConfig() function.`);
151
+ };
152
+ // ==========================================
153
+ // TEST IMPLEMENTATION
154
+ // ==========================================
155
+ let dopWalletID;
156
+ const balanceUpdatesReceived = [];
157
+ const chain = dop_sharedmodels_v3_1.NETWORK_CONFIG[NETWORK_NAME].chain;
158
+ describe('Real Balance Fetching Test', () => {
159
+ before(async function run() {
160
+ this.timeout(60000); // 1 minute for setup
161
+ console.log('šŸš€ Starting Real Balance Test');
162
+ console.log(`šŸ“” Network: ${NETWORK_NAME}`);
163
+ console.log(`ā›“ļø Chain ID: ${chain.id}`);
164
+ console.log(`šŸ”§ TXID Version: ${TXID_VERSION}`);
165
+ console.log(`ā­ļø Skip on timeout: ${SKIP_SCAN_ON_TIMEOUT ? 'Yes' : 'No'}`);
166
+ console.log('');
167
+ console.log('šŸ”§ Initializing test engine...');
168
+ await (0, setup_test_1.initTestEngine)();
169
+ console.log('šŸ‘› Creating DOP wallet from your mnemonic...');
170
+ const dopWalletInfo = await (0, wallets_1.createDopWallet)(mocks_test_1.MOCK_DB_ENCRYPTION_KEY, YOUR_MNEMONIC, undefined);
171
+ if (!(0, dop_sharedmodels_v3_1.isDefined)(dopWalletInfo)) {
172
+ throw new Error('āŒ Failed to create DOP wallet');
173
+ }
174
+ dopWalletID = dopWalletInfo.id;
175
+ console.log(`āœ… Wallet created successfully!`);
176
+ console.log(`šŸ“ Wallet ID: ${dopWalletID}`);
177
+ console.log(`šŸ“ DOP Address: ${dopWalletInfo.dopAddress}`);
178
+ console.log('');
179
+ // const shareableViewingKey = await getWalletShareableViewingKey(dopWalletID);
180
+ // if (!isDefined(shareableViewingKey)) {
181
+ // throw new Error('āŒ Failed to get shareable viewing key');
182
+ // }
183
+ // // Current block numbers for each chain when the wallet was first created.
184
+ // // If unknown, set to undefined.
185
+ // const creationBlockNumberMap: Optional<MapType<number>> = undefined;
186
+ // const viewOnlyWalletInfo = await createViewOnlyDopWallet(
187
+ // MOCK_DB_ENCRYPTION_KEY,
188
+ // shareableViewingKey,
189
+ // creationBlockNumberMap,
190
+ // );
191
+ // Setup balance update callback with enhanced logging
192
+ (0, balance_update_1.setOnBalanceUpdateCallback)((balancesEvent) => {
193
+ console.log("================================");
194
+ console.log(`šŸ’° Balance Update Received:`);
195
+ console.log(` - ERC20 tokens: ${balancesEvent.erc20Amounts.length}`);
196
+ console.log(` - NFT tokens: ${balancesEvent.nftAmounts.length}`);
197
+ console.log(` - Wallet: ${balancesEvent.dopWalletID}`);
198
+ console.log(` - Chain: ${balancesEvent.chain.type}:${balancesEvent.chain.id}`);
199
+ console.log(` - TXID Version: ${balancesEvent.txidVersion}`);
200
+ console.log(` - Balance Bucket: ${balancesEvent.balanceBucket}`);
201
+ // Log detailed balance information
202
+ if (balancesEvent.erc20Amounts.length > 0) {
203
+ console.log(` - ERC20 Details:`);
204
+ balancesEvent.erc20Amounts.forEach((erc20, index) => {
205
+ console.log(` ${index + 1}. ${erc20.tokenAddress}: ${erc20.amount.toString()}`);
206
+ });
207
+ }
208
+ if (balancesEvent.nftAmounts.length > 0) {
209
+ console.log(` - NFT Details:`);
210
+ balancesEvent.nftAmounts.forEach((nft, index) => {
211
+ console.log(` ${index + 1}. ${nft.nftAddress}#${nft.tokenSubID}: ${nft.amount.toString()}`);
212
+ });
213
+ }
214
+ balanceUpdatesReceived.push(balancesEvent);
215
+ });
216
+ console.log('🌐 Loading provider for mainnet...');
217
+ const providerConfig = getProviderConfig();
218
+ const loadRes = await (0, load_provider_1.loadProvider)(providerConfig, NETWORK_NAME, 30000);
219
+ console.log(`āœ… Provider loaded with fees: ${JSON.stringify(loadRes)}`);
220
+ console.log(`āœ… Provider loaded for ${NETWORK_NAME}`);
221
+ console.log(`āœ… Provider info: ${providerConfig.providers.map(p => p.provider).join(', ')}`);
222
+ console.log('šŸ” Starting contract history scan...');
223
+ console.log('ā³ Starting scan in background (not waiting for completion)...');
224
+ // Start comprehensive on-chain event logging
225
+ on_chain_event_logger_1.onChainEventLogger.startLogging();
226
+ // Start the scan but don't wait for it to complete in the before hook
227
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
228
+ (0, engine_1.getEngine)().scanContractHistory(chain, [dopWalletID]);
229
+ console.log('āœ… Setup completed! Tests will run without waiting for full scan.');
230
+ console.log('āš ļø Note: Balance results may be incomplete if scan is still in progress.');
231
+ console.log('');
232
+ // Stop the comprehensive logging and show summary
233
+ on_chain_event_logger_1.onChainEventLogger.stopLogging();
234
+ });
235
+ after(async () => {
236
+ console.log('🧹 Cleaning up...');
237
+ await (0, setup_test_1.closeTestEngine)();
238
+ console.log('āœ… Cleanup completed');
239
+ });
240
+ it('Should try to fetch balances immediately (without waiting for full scan)', async function run() {
241
+ this.timeout(60000); // 1 minute
242
+ console.log('');
243
+ console.log('šŸš€ QUICK BALANCE CHECK (without full scan)');
244
+ console.log('==========================================');
245
+ console.log('⚔ This test tries to fetch balances immediately');
246
+ console.log('⚔ without waiting for the full blockchain scan.');
247
+ console.log('⚔ Results may be incomplete but useful for testing.');
248
+ console.log('');
249
+ // Optional: Try to wait for scans briefly (but don't fail if timeout)
250
+ console.log('ā³ Briefly checking if scans have completed...');
251
+ try {
252
+ await Promise.race([
253
+ Promise.all([
254
+ (0, setup_test_1.pollUntilUTXOMerkletreeScanned)(),
255
+ (0, setup_test_1.pollUntilTXIDMerkletreeScanned)(),
256
+ ]),
257
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Quick scan check timeout')), 30000)) // 30 second timeout
258
+ ]);
259
+ console.log('āœ… Scans completed! Will get full results.');
260
+ }
261
+ catch (error) {
262
+ console.log('āš ļø Scans still in progress, proceeding anyway...');
263
+ }
264
+ // Get wallet instance
265
+ const wallet = (0, wallets_1.fullWalletForID)(dopWalletID);
266
+ expect(wallet).to.not.be.undefined;
267
+ if (wallet == null) {
268
+ throw new Error('āŒ Wallet not found');
269
+ }
270
+ console.log('šŸ“Š Attempting immediate balance fetch...');
271
+ try {
272
+ // Try to get balances even if scan is not complete
273
+ const quickTokenBalances = await wallet.getTokenBalances(TXID_VERSION, chain, false // onlySpendable = false
274
+ );
275
+ const quickERC20Balances = (0, balance_update_1.getSerializedERC20Balances)(quickTokenBalances);
276
+ const quickNFTBalances = (0, balance_update_1.getSerializedNFTBalances)(quickTokenBalances);
277
+ console.log('āœ… Quick balance fetch successful!');
278
+ console.log(`šŸ“Š Quick Results:`);
279
+ console.log(` - Token addresses found: ${Object.keys(quickTokenBalances).length}`);
280
+ console.log(` - ERC20 balances: ${quickERC20Balances.length}`);
281
+ console.log(` - NFT balances: ${quickNFTBalances.length}`);
282
+ if (quickERC20Balances.length > 0) {
283
+ console.log('šŸ’° Quick ERC20 Balances:');
284
+ quickERC20Balances.forEach((balance, index) => {
285
+ console.log(` ${index + 1}. ${balance.tokenAddress}: ${balance.amount.toString()}`);
286
+ });
287
+ }
288
+ if (quickNFTBalances.length > 0) {
289
+ console.log('šŸŽØ Quick NFT Balances:');
290
+ quickNFTBalances.forEach((nft, index) => {
291
+ console.log(` ${index + 1}. ${nft.nftAddress}#${nft.tokenSubID}: ${nft.amount.toString()}`);
292
+ });
293
+ }
294
+ if (quickERC20Balances.length === 0 && quickNFTBalances.length === 0) {
295
+ console.log('ā„¹ļø No immediate balances found');
296
+ console.log(' This could mean:');
297
+ console.log(' • Blockchain scan is still in progress');
298
+ console.log(' • No DOP transactions exist for this wallet');
299
+ console.log(' • Wallet only has regular (non-private) transactions');
300
+ }
301
+ }
302
+ catch (error) {
303
+ console.log('āš ļø Quick balance fetch failed:');
304
+ console.log(` ${error instanceof Error ? error.message : String(error)}`);
305
+ console.log(' This is normal if the wallet/scan is not ready yet.');
306
+ }
307
+ console.log('āœ… Quick balance check completed!');
308
+ console.log('');
309
+ });
310
+ it('Should fetch real balances from mainnet', async function run() {
311
+ this.timeout(60000); // 1 minute
312
+ console.log('šŸ”„ Fetching your real balances...');
313
+ // Get wallet instance
314
+ const wallet = (0, wallets_1.fullWalletForID)(dopWalletID);
315
+ expect(wallet).to.not.be.undefined;
316
+ if (wallet == null) {
317
+ throw new Error('āŒ Wallet not found');
318
+ }
319
+ console.log('šŸ“Š Getting token balances...');
320
+ // Get all balances (spendable + pending)
321
+ const allTokenBalances = await wallet.getTokenBalances(TXID_VERSION, chain, false // onlySpendable = false
322
+ );
323
+ // Get only spendable balances
324
+ const spendableTokenBalances = await wallet.getTokenBalances(TXID_VERSION, chain, true // onlySpendable = true
325
+ );
326
+ console.log('šŸ“‹ Raw Balance Results:');
327
+ console.log(` - Total token addresses: ${Object.keys(allTokenBalances).length}`);
328
+ console.log(` - Spendable token addresses: ${Object.keys(spendableTokenBalances).length}`);
329
+ // Serialize balances for easier viewing
330
+ const allERC20Balances = (0, balance_update_1.getSerializedERC20Balances)(allTokenBalances);
331
+ const allNFTBalances = (0, balance_update_1.getSerializedNFTBalances)(allTokenBalances);
332
+ const spendableERC20Balances = (0, balance_update_1.getSerializedERC20Balances)(spendableTokenBalances);
333
+ const spendableNFTBalances = (0, balance_update_1.getSerializedNFTBalances)(spendableTokenBalances);
334
+ console.log('');
335
+ console.log('šŸ’° BALANCE SUMMARY:');
336
+ console.log('===================');
337
+ console.log(`šŸ“Š All ERC20 Balances: ${allERC20Balances.length}`);
338
+ console.log(`šŸ“Š All NFT Balances: ${allNFTBalances.length}`);
339
+ console.log(`šŸ’Ž Spendable ERC20 Balances: ${spendableERC20Balances.length}`);
340
+ console.log(`šŸŽØ Spendable NFT Balances: ${spendableNFTBalances.length}`);
341
+ console.log('');
342
+ // Display detailed ERC20 balances
343
+ if (allERC20Balances.length > 0) {
344
+ console.log('šŸ’° ERC20 TOKEN BALANCES:');
345
+ console.log('========================');
346
+ allERC20Balances.forEach((balance, index) => {
347
+ const isSpendable = spendableERC20Balances.some(sb => sb.tokenAddress === balance.tokenAddress && sb.amount.toString() === balance.amount.toString());
348
+ console.log(`${index + 1}. Token: ${balance.tokenAddress}`);
349
+ console.log(` Amount: ${balance.amount.toString()}`);
350
+ console.log(` Status: ${isSpendable ? 'āœ… Spendable' : 'ā³ Pending'}`);
351
+ console.log('');
352
+ });
353
+ }
354
+ // Display detailed NFT balances
355
+ if (allNFTBalances.length > 0) {
356
+ console.log('šŸŽØ NFT TOKEN BALANCES:');
357
+ console.log('======================');
358
+ allNFTBalances.forEach((nft, index) => {
359
+ const isSpendable = spendableNFTBalances.some(sn => sn.nftAddress === nft.nftAddress &&
360
+ sn.tokenSubID === nft.tokenSubID &&
361
+ sn.amount.toString() === nft.amount.toString());
362
+ console.log(`${index + 1}. NFT Contract: ${nft.nftAddress}`);
363
+ console.log(` Token ID: ${nft.tokenSubID}`);
364
+ console.log(` Amount: ${nft.amount.toString()}`);
365
+ console.log(` Status: ${isSpendable ? 'āœ… Spendable' : 'ā³ Pending'}`);
366
+ console.log('');
367
+ });
368
+ }
369
+ if (allERC20Balances.length === 0 && allNFTBalances.length === 0) {
370
+ console.log('ā„¹ļø No DOP balances found for this wallet.');
371
+ console.log('');
372
+ console.log('This could mean:');
373
+ console.log('• This wallet has never received DOP transactions');
374
+ console.log('• This wallet only has regular (non-private) ETH/tokens');
375
+ console.log('• The wallet has been used but all balances have been spent');
376
+ console.log('');
377
+ console.log('šŸ’” To test with balances, you need a wallet that has received');
378
+ console.log(' DOP (private) transactions, not regular Ethereum transactions.');
379
+ }
380
+ // Display balance update summary
381
+ console.log('šŸ“” BALANCE UPDATE CALLBACKS:');
382
+ console.log('============================');
383
+ console.log(`Total updates received: ${balanceUpdatesReceived.length}`);
384
+ if (balanceUpdatesReceived.length > 0) {
385
+ balanceUpdatesReceived.forEach((update, index) => {
386
+ console.log(`Update ${index + 1}:`);
387
+ console.log(` - Chain: ${update.chain.type}:${update.chain.id}`);
388
+ console.log(` - ERC20: ${update.erc20Amounts.length}, NFT: ${update.nftAmounts.length}`);
389
+ console.log(` - Bucket: ${update.balanceBucket}`);
390
+ });
391
+ }
392
+ // Assertions
393
+ expect(allTokenBalances).to.be.an('object');
394
+ expect(spendableTokenBalances).to.be.an('object');
395
+ expect(allERC20Balances).to.be.an('array');
396
+ expect(allNFTBalances).to.be.an('array');
397
+ expect(spendableERC20Balances).to.be.an('array');
398
+ expect(spendableNFTBalances).to.be.an('array');
399
+ console.log('āœ… Real balance fetching test completed successfully!');
400
+ console.log('');
401
+ });
402
+ it('Should test balance refresh functionality', async function run() {
403
+ this.timeout(60000); // 1 minute
404
+ console.log('šŸ”„ Testing balance refresh...');
405
+ const initialUpdateCount = balanceUpdatesReceived.length;
406
+ // Test refreshBalances function with patched version for Ethereum mainnet
407
+ await (0, balances_1.refreshBalances)(chain, [dopWalletID]);
408
+ // Wait for potential updates
409
+ await new Promise(resolve => setTimeout(resolve, 10000)); // 10 seconds
410
+ const finalUpdateCount = balanceUpdatesReceived.length;
411
+ console.log(`šŸ“Š Balance updates: ${initialUpdateCount} → ${finalUpdateCount}`);
412
+ expect(finalUpdateCount).to.be.greaterThanOrEqual(initialUpdateCount);
413
+ console.log('āœ… Balance refresh test completed!');
414
+ });
415
+ });
416
+ //# sourceMappingURL=balances.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"balances.test.js","sourceRoot":"","sources":["../../src/tests/balances.test.ts"],"names":[],"mappings":";;;;;AAAA,6DAA6D;AAC7D,gDAAwB;AACxB,6DAA6D;AAC7D,wEAA8C;AAC9C,6CAEsB;AACtB,6CAKsB;AACtB,6DAAwL;AACxL,+DAG0C;AAC1C,2EAIgD;AAChD,6DAU6B;AAC7B,sEAAkE;AAClE,wDAAwD;AACxD,mEAA6D;AAE7D,cAAI,CAAC,GAAG,CAAC,0BAAc,CAAC,CAAC;AACzB,MAAM,EAAE,MAAM,EAAE,GAAG,cAAI,CAAC;AAExB,6CAA6C;AAC7C,sCAAsC;AACtC,6CAA6C;AAE7C,8BAA8B;AAC9B,MAAM,aAAa,GAAG,2EAA2E,CAAC;AAElG,sCAAsC;AACtC,8EAA8E;AAC9E,MAAM,YAAY,GAAgB,iCAAW,CAAC,OAAO,CAAC,CAAC,kBAAkB;AACzE,8EAA8E;AAE9E,0CAA0C;AAC1C,sDAAsD;AACtD,MAAM,YAAY,GAAG,iCAAW,CAAC,iBAAiB,CAAC;AAEnD,wBAAwB;AACxB,0EAA0E;AAC1E,MAAM,oBAAoB,GAAG,IAAI,CAAC,CAAC,iEAAiE;AAEpG,6CAA6C;AAC7C,oCAAoC;AACpC,6CAA6C;AAC7C,uFAAuF;AACvF,GAAG;AACH,6BAA6B;AAC7B,6EAA6E;AAC7E,kEAAkE;AAClE,kEAAkE;AAClE,EAAE;AACF,yBAAyB;AACzB,wFAAwF;AACxF,gGAAgG;AAChG,mGAAmG;AACnG,iCAAiC;AACjC,mCAAmC;AACnC,kBAAkB;AAClB,6CAA6C;AAE7C,6CAA6C;AAC7C,2BAA2B;AAC3B,6CAA6C;AAE7C,MAAM,iBAAiB,GAAG,GAA+B,EAAE;IACzD,gCAAgC;IAChC,8DAA8D;IAC9D,mBAAmB;IACnB,2DAA2D;IAC3D,iEAAiE;IACjE,kEAAkE;IAElE,+CAA+C;IAC/C,aAAa;IACb,kBAAkB;IAClB,mBAAmB;IACnB,aAAa;IACb,mDAAmD;IACnD,0BAA0B;IAC1B,wBAAwB;IACxB,cAAc;IACd,UAAU;IACV,uDAAuD;IACvD,uBAAuB;IACvB,qBAAqB;IACrB,WAAW;IACX,aAAa;IACb,mDAAmD;IACnD,0BAA0B;IAC1B,wBAAwB;IACxB,cAAc;IACd,2CAA2C;IAC3C,aAAa;IACb,qDAAqD;IACrD,0BAA0B;IAC1B,wBAAwB;IACxB,cAAc;IACd,SAAS;IACT,OAAO;IACP,IAAI;IAEJ,IAAI,YAAY,KAAK,iCAAW,CAAC,OAAO,EAAE;QACxC,OAAO;YACL,OAAO,EAAE,GAAG;YACZ,SAAS,EAAE;gBACT,IAAI;gBACJ,8CAA8C;gBAC9C,iBAAiB;gBACjB,eAAe;gBACf,KAAK;gBACL;oBACE,QAAQ,EAAE,gCAAgC;oBAC1C,QAAQ,EAAE,CAAC;oBACX,MAAM,EAAE,CAAC;iBACV;gBACD,IAAI;gBACJ,8CAA8C;gBAC9C,iBAAiB;gBACjB,eAAe;gBACf,KAAK;gBACL,kCAAkC;gBAClC,IAAI;gBACJ,2CAA2C;gBAC3C,iBAAiB;gBACjB,eAAe;gBACf,KAAK;aACN;SACF,CAAC;KACH;IAED,+CAA+C;IAC/C,aAAa;IACb,sBAAsB;IACtB,mBAAmB;IACnB,UAAU;IACV,uDAAuD;IACvD,uBAAuB;IACvB,qBAAqB;IACrB,WAAW;IACX,UAAU;IACV,qDAAqD;IACrD,uBAAuB;IACvB,qBAAqB;IACrB,WAAW;IACX,UAAU;IACV,qDAAqD;IACrD,uBAAuB;IACvB,qBAAqB;IACrB,WAAW;IACX,2CAA2C;IAC3C,aAAa;IACb,qDAAqD;IACrD,0BAA0B;IAC1B,wBAAwB;IACxB,cAAc;IACd,SAAS;IACT,OAAO;IACP,IAAI;IAEJ,yCAAyC;IACzC,MAAM,IAAI,KAAK,CACb,oDAAoD,MAAM,CAAC,YAAY,CAAC,IAAI;QAC5E,oFAAoF,CACrF,CAAC;AACJ,CAAC,CAAC;AAEF,6CAA6C;AAC7C,sBAAsB;AACtB,6CAA6C;AAE7C,IAAI,WAAmB,CAAC;AACxB,MAAM,sBAAsB,GAAuB,EAAE,CAAC;AACtD,MAAM,KAAK,GAAU,oCAAc,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC;AAExD,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,MAAM,CAAC,KAAK,UAAU,GAAG;QACvB,IAAI,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC,CAAC,qBAAqB;QAE3C,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,eAAe,YAAY,EAAE,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,oBAAoB,YAAY,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,wBAAwB,oBAAoB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,MAAM,IAAA,2BAAc,GAAE,CAAC;QAEvB,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;QAC5D,MAAM,aAAa,GAAG,MAAM,IAAA,yBAAe,EACzC,mCAAsB,EACtB,aAAa,EACb,SAAS,CACV,CAAC;QAEF,IAAI,CAAC,IAAA,+BAAS,EAAC,aAAa,CAAC,EAAE;YAC7B,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;SAClD;QAED,WAAW,GAAG,aAAa,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,iBAAiB,WAAW,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,mBAAmB,aAAa,CAAC,UAAU,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,+EAA+E;QAC/E,yCAAyC;QACzC,8DAA8D;QAC9D,IAAI;QACJ,6EAA6E;QAC7E,mCAAmC;QACnC,uEAAuE;QACvE,4DAA4D;QAC5D,0BAA0B;QAC1B,uBAAuB;QACvB,0BAA0B;QAC1B,KAAK;QAEL,sDAAsD;QACtD,IAAA,2CAA0B,EAAC,CAAC,aAA+B,EAAE,EAAE;YAC7D,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,sBAAsB,aAAa,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,oBAAoB,aAAa,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,gBAAgB,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,eAAe,aAAa,CAAC,KAAK,CAAC,IAAI,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YACjF,OAAO,CAAC,GAAG,CAAC,sBAAsB,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,wBAAwB,aAAa,CAAC,aAAa,EAAE,CAAC,CAAC;YAEnE,mCAAmC;YACnC,IAAI,aAAa,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;gBACzC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;gBACnC,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;oBAClD,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,KAAK,KAAK,CAAC,YAAY,KAAK,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACtF,CAAC,CAAC,CAAC;aACJ;YAED,IAAI,aAAa,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;gBACvC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;gBACjC,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;oBAC9C,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBAClG,CAAC,CAAC,CAAC;aACJ;YAED,sBAAsB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAClD,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,MAAM,IAAA,4BAAY,EAChC,cAAc,EACd,YAAY,EACZ,KAAM,CACP,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,gCAAgC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,yBAAyB,YAAY,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,oBAAoB,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE5F,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;QAE7E,6CAA6C;QAC7C,0CAAkB,CAAC,YAAY,EAAE,CAAC;QAElC,sEAAsE;QACtE,mEAAmE;QACnE,IAAA,kBAAS,GAAE,CAAC,mBAAmB,CAC7B,KAAK,EACL,CAAC,WAAW,CAAC,CACd,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;QAChF,OAAO,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;QACzF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,kDAAkD;QAClD,0CAAkB,CAAC,WAAW,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,KAAK,IAAI,EAAE;QACf,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACjC,MAAM,IAAA,4BAAe,GAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,KAAK,UAAU,GAAG;QAC/F,IAAI,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC,CAAC,WAAW;QAEjC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,sEAAsE;QACtE,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;QAC7D,IAAI;YACF,MAAM,OAAO,CAAC,IAAI,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC;oBACV,IAAA,2CAA8B,GAAE;oBAChC,IAAA,2CAA8B,GAAE;iBACjC,CAAC;gBACF,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,EAAE,KAAM,CAAC,CAAC,CAAC,oBAAoB;aACzH,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;SAC1D;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;SAClE;QAED,sBAAsB;QACtB,MAAM,MAAM,GAAG,IAAA,yBAAe,EAAC,WAAW,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC;QAEnC,IAAI,MAAM,IAAI,IAAI,EAAE;YAClB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;SACvC;QAED,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QAExD,IAAI;YACF,mDAAmD;YACnD,MAAM,kBAAkB,GAAG,MAAM,MAAM,CAAC,gBAAgB,CACtD,YAAY,EACZ,KAAK,EACL,KAAK,CAAC,wBAAwB;aAC/B,CAAC;YAEF,MAAM,kBAAkB,GAAG,IAAA,2CAA0B,EAAC,kBAAkB,CAAC,CAAC;YAC1E,MAAM,gBAAgB,GAAG,IAAA,yCAAwB,EAAC,kBAAkB,CAAC,CAAC;YAEtE,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,+BAA+B,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YACrF,OAAO,CAAC,GAAG,CAAC,wBAAwB,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC;YACjE,OAAO,CAAC,GAAG,CAAC,sBAAsB,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC;YAE7D,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE;gBACjC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;gBACxC,kBAAkB,CAAC,OAAO,CAAC,CAAC,OAAuB,EAAE,KAAa,EAAE,EAAE;oBACpE,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,KAAK,OAAO,CAAC,YAAY,KAAK,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACxF,CAAC,CAAC,CAAC;aACJ;YAED,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC/B,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;gBACtC,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAAiB,EAAE,KAAa,EAAE,EAAE;oBAC5D,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBAChG,CAAC,CAAC,CAAC;aACJ;YAED,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE;gBACpE,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;gBAC/C,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;gBACnC,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;gBACzD,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;gBAC9D,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;aACxE;SAEF;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC5E,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;SACvE;QAED,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,UAAU,GAAG;QAC9D,IAAI,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC,CAAC,WAAW;QAEjC,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QAEjD,sBAAsB;QACtB,MAAM,MAAM,GAAG,IAAA,yBAAe,EAAC,WAAW,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC;QAEnC,IAAI,MAAM,IAAI,IAAI,EAAE;YAClB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;SACvC;QAED,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAE5C,yCAAyC;QACzC,MAAM,gBAAgB,GAAG,MAAM,MAAM,CAAC,gBAAgB,CACpD,YAAY,EACZ,KAAK,EACL,KAAK,CAAC,wBAAwB;SAC/B,CAAC;QAEF,8BAA8B;QAC9B,MAAM,sBAAsB,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAC1D,YAAY,EACZ,KAAK,EACL,IAAI,CAAC,uBAAuB;SAC7B,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,+BAA+B,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,mCAAmC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAE7F,wCAAwC;QACxC,MAAM,gBAAgB,GAAG,IAAA,2CAA0B,EAAC,gBAAgB,CAAC,CAAC;QACtE,MAAM,cAAc,GAAG,IAAA,yCAAwB,EAAC,gBAAgB,CAAC,CAAC;QAClE,MAAM,sBAAsB,GAAG,IAAA,2CAA0B,EAAC,sBAAsB,CAAC,CAAC;QAClF,MAAM,oBAAoB,GAAG,IAAA,yCAAwB,EAAC,sBAAsB,CAAC,CAAC;QAE9E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,0BAA0B,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,wBAAwB,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,gCAAgC,sBAAsB,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,8BAA8B,oBAAoB,CAAC,MAAM,EAAE,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,kCAAkC;QAClC,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;YAC/B,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YACxC,gBAAgB,CAAC,OAAO,CAAC,CAAC,OAAuB,EAAE,KAAa,EAAE,EAAE;gBAClE,MAAM,WAAW,GAAG,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CACnD,EAAE,CAAC,YAAY,KAAK,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAC/F,CAAC;gBACF,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,YAAY,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;gBAC5D,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACvD,OAAO,CAAC,GAAG,CAAC,cAAc,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;gBACvE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;SACJ;QAED,gCAAgC;QAChC,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;YAC7B,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACtC,cAAc,CAAC,OAAO,CAAC,CAAC,GAAiB,EAAE,KAAa,EAAE,EAAE;gBAC1D,MAAM,WAAW,GAAG,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CACjD,EAAE,CAAC,UAAU,KAAK,GAAG,CAAC,UAAU;oBAChC,EAAE,CAAC,UAAU,KAAK,GAAG,CAAC,UAAU;oBAChC,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,CAC/C,CAAC;gBACF,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,mBAAmB,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;gBAC7D,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;gBAC9C,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACnD,OAAO,CAAC,GAAG,CAAC,cAAc,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;gBACvE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;SACJ;QAED,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE;YAChE,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;YACjE,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;YAC3E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;YAC7E,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;SAClF;QAED,iCAAiC;QACjC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,2BAA2B,sBAAsB,CAAC,MAAM,EAAE,CAAC,CAAC;QAExE,IAAI,sBAAsB,CAAC,MAAM,GAAG,CAAC,EAAE;YACrC,sBAAsB,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gBAC/C,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;gBACpC,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;gBAClE,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,YAAY,CAAC,MAAM,UAAU,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC1F,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;YACrD,CAAC,CAAC,CAAC;SACJ;QAED,aAAa;QACb,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;QAClD,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QACjD,MAAM,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QAE/C,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,UAAU,GAAG;QAChE,IAAI,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC,CAAC,WAAW;QAEjC,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAE7C,MAAM,kBAAkB,GAAG,sBAAsB,CAAC,MAAM,CAAC;QAEzD,0EAA0E;QAC1E,MAAM,IAAA,0BAAe,EAAC,KAAK,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;QAE5C,6BAA6B;QAC7B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa;QAEvE,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,MAAM,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,uBAAuB,kBAAkB,MAAM,gBAAgB,EAAE,CAAC,CAAC;QAE/E,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["// eslint-disable-next-line import/no-extraneous-dependencies\nimport chai from 'chai';\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport chaiAsPromised from 'chai-as-promised';\nimport {\n MOCK_DB_ENCRYPTION_KEY,\n} from './mocks.test';\nimport {\n closeTestEngine,\n initTestEngine,\n pollUntilTXIDMerkletreeScanned,\n pollUntilUTXOMerkletreeScanned,\n} from './setup.test';\nimport { createDopWallet, createDopWalletSafe, fullWalletForID, createOrImportDopWallet, createViewOnlyDopWallet, getWalletShareableViewingKey } from '../services/dop/wallets/wallets';\nimport { \n refreshBalances, \n rescanFullUTXOMerkletreesAndWallets \n} from '../services/dop/wallets/balances';\nimport { \n getSerializedERC20Balances, \n getSerializedNFTBalances,\n setOnBalanceUpdateCallback \n} from '../services/dop/wallets/balance-update';\nimport {\n Chain,\n NETWORK_CONFIG,\n NetworkName,\n isDefined,\n TXIDVersion,\n DopBalancesEvent,\n DopERC20Amount,\n DopNFTAmount,\n FallbackProviderJsonConfig,\n} from 'dop-sharedmodels-v3';\nimport { loadProvider } from '../services/dop/core/load-provider';\nimport { getEngine } from '../services/dop/core/engine';\nimport { onChainEventLogger } from './on-chain-event-logger';\n\nchai.use(chaiAsPromised);\nconst { expect } = chai;\n\n// ==========================================\n// CONFIGURATION - MODIFY THESE VALUES\n// ==========================================\n\n// PUT YOUR REAL MNEMONIC HERE\nconst YOUR_MNEMONIC = \"rough shadow recall crane injury grass valid guilt close latin seed eight\";\n\n// CHOOSE YOUR NETWORK (uncomment one)\n// const NETWORK_NAME: NetworkName = NetworkName.Ethereum; // Ethereum Mainnet\nconst NETWORK_NAME: NetworkName = NetworkName.Polygon; // Polygon Mainnet\n// const NETWORK_NAME: NetworkName = NetworkName.Arbitrum; // Arbitrum Mainnet\n\n// CHOOSE TXID VERSION (V3 is recommended)\n// const TXID_VERSION = TXIDVersion.V3_PoseidonMerkle;\nconst TXID_VERSION = TXIDVersion.V2_PoseidonMerkle;\n\n// SCAN TIMEOUT SETTINGS\n// const MAINNET_SCAN_TIMEOUT_MINUTES = 30; // 30 minutes for mainnet scan\nconst SKIP_SCAN_ON_TIMEOUT = true; // If true, continue with balance fetching even if scan times out\n\n// ==========================================\n// CUSTOM RPC PROVIDER CONFIGURATION\n// ==========================================\n// The test now uses public RPC endpoints by default, but you can customize them below.\n// \n// TO USE YOUR OWN PROVIDERS:\n// 1. Uncomment the custom provider lines in the getProviderConfig() function\n// 2. Replace 'YOUR_*_RPC_URL_HERE' with your actual RPC endpoints\n// 3. Set higher priority (lower number) for your custom providers\n//\n// Where to get RPC URLs:\n// - Infura: https://infura.io/ (format: 'https://mainnet.infura.io/v3/YOUR_PROJECT_ID')\n// - Alchemy: https://alchemy.com/ (format: 'https://eth-mainnet.g.alchemy.com/v2/YOUR_API_KEY')\n// - QuickNode: https://quicknode.com/ (format: 'https://YOUR_ENDPOINT.quiknode.pro/YOUR_API_KEY/')\n// - Moralis: https://moralis.io/\n// - GetBlock: https://getblock.io/\n// - Your own node\n// ==========================================\n\n// ==========================================\n// PROVIDER CONFIGURATION \n// ==========================================\n\nconst getProviderConfig = (): FallbackProviderJsonConfig => {\n // CUSTOM PROVIDER CONFIGURATION\n // Replace the RPC URLs below with your own provider endpoints\n // Example formats:\n // - Infura: 'https://mainnet.infura.io/v3/YOUR_PROJECT_ID'\n // - Alchemy: 'https://eth-mainnet.g.alchemy.com/v2/YOUR_API_KEY'\n // - QuickNode: 'https://YOUR_ENDPOINT.quiknode.pro/YOUR_API_KEY/'\n \n // if (NETWORK_NAME === NetworkName.Ethereum) {\n // return {\n // chainId: 1,\n // providers: [\n // // {\n // // provider: 'https://eth.llamarpc.com',\n // // priority: 1,\n // // weight: 2,\n // // },\n // {\n // provider: 'https://ethereum.publicnode.com',\n // priority: 1,\n // weight: 2,\n // },\n // // {\n // // provider: 'https://rpc.ankr.com/eth',\n // // priority: 3,\n // // weight: 1,\n // // },\n // // Add your custom providers here:\n // // {\n // // provider: 'YOUR_ETHEREUM_RPC_URL_HERE',\n // // priority: 1,\n // // weight: 3,\n // // },\n // ],\n // };\n // }\n\n if (NETWORK_NAME === NetworkName.Polygon) {\n return {\n chainId: 137,\n providers: [\n // {\n // provider: 'https://polygon.llamarpc.com',\n // priority: 1,\n // weight: 2,\n // },\n {\n provider: 'https://polygon.publicnode.com',\n priority: 2,\n weight: 2,\n },\n // {\n // provider: 'https://rpc.ankr.com/polygon',\n // priority: 3,\n // weight: 1,\n // },\n // Add your custom providers here:\n // {\n // provider: 'YOUR_POLYGON_RPC_URL_HERE',\n // priority: 1,\n // weight: 3,\n // },\n ],\n };\n }\n\n // if (NETWORK_NAME === NetworkName.Arbitrum) {\n // return {\n // chainId: 42161,\n // providers: [\n // {\n // provider: 'https://arbitrum.publicnode.com',\n // priority: 1,\n // weight: 2,\n // },\n // {\n // provider: 'https://rpc.ankr.com/arbitrum',\n // priority: 2,\n // weight: 2,\n // },\n // {\n // provider: 'https://arbitrum.llamarpc.com',\n // priority: 3,\n // weight: 1,\n // },\n // // Add your custom providers here:\n // // {\n // // provider: 'YOUR_ARBITRUM_RPC_URL_HERE',\n // // priority: 1,\n // // weight: 3,\n // // },\n // ],\n // };\n // }\n\n // Default fallback for any other network\n throw new Error(\n `No provider configuration available for network: ${String(NETWORK_NAME)}. ` +\n `Please add your custom provider configuration in the getProviderConfig() function.`\n );\n};\n\n// ==========================================\n// TEST IMPLEMENTATION\n// ==========================================\n\nlet dopWalletID: string;\nconst balanceUpdatesReceived: DopBalancesEvent[] = [];\nconst chain: Chain = NETWORK_CONFIG[NETWORK_NAME].chain;\n\ndescribe('Real Balance Fetching Test', () => {\n before(async function run() {\n this.timeout(60_000); // 1 minute for setup\n \n console.log('šŸš€ Starting Real Balance Test');\n console.log(`šŸ“” Network: ${NETWORK_NAME}`);\n console.log(`ā›“ļø Chain ID: ${chain.id}`);\n console.log(`šŸ”§ TXID Version: ${TXID_VERSION}`);\n console.log(`ā­ļø Skip on timeout: ${SKIP_SCAN_ON_TIMEOUT ? 'Yes' : 'No'}`);\n console.log('');\n\n console.log('šŸ”§ Initializing test engine...');\n await initTestEngine();\n \n console.log('šŸ‘› Creating DOP wallet from your mnemonic...');\n const dopWalletInfo = await createDopWallet(\n MOCK_DB_ENCRYPTION_KEY,\n YOUR_MNEMONIC,\n undefined, // creationBlockNumbers\n );\n \n if (!isDefined(dopWalletInfo)) {\n throw new Error('āŒ Failed to create DOP wallet');\n }\n \n dopWalletID = dopWalletInfo.id;\n console.log(`āœ… Wallet created successfully!`);\n console.log(`šŸ“ Wallet ID: ${dopWalletID}`);\n console.log(`šŸ“ DOP Address: ${dopWalletInfo.dopAddress}`);\n console.log('');\n\n // const shareableViewingKey = await getWalletShareableViewingKey(dopWalletID);\n // if (!isDefined(shareableViewingKey)) {\n // throw new Error('āŒ Failed to get shareable viewing key');\n // }\n // // Current block numbers for each chain when the wallet was first created.\n // // If unknown, set to undefined.\n // const creationBlockNumberMap: Optional<MapType<number>> = undefined;\n // const viewOnlyWalletInfo = await createViewOnlyDopWallet(\n // MOCK_DB_ENCRYPTION_KEY,\n // shareableViewingKey,\n // creationBlockNumberMap,\n // );\n\n // Setup balance update callback with enhanced logging\n setOnBalanceUpdateCallback((balancesEvent: DopBalancesEvent) => {\n console.log(\"================================\");\n console.log(`šŸ’° Balance Update Received:`);\n console.log(` - ERC20 tokens: ${balancesEvent.erc20Amounts.length}`);\n console.log(` - NFT tokens: ${balancesEvent.nftAmounts.length}`);\n console.log(` - Wallet: ${balancesEvent.dopWalletID}`);\n console.log(` - Chain: ${balancesEvent.chain.type}:${balancesEvent.chain.id}`);\n console.log(` - TXID Version: ${balancesEvent.txidVersion}`);\n console.log(` - Balance Bucket: ${balancesEvent.balanceBucket}`);\n \n // Log detailed balance information\n if (balancesEvent.erc20Amounts.length > 0) {\n console.log(` - ERC20 Details:`);\n balancesEvent.erc20Amounts.forEach((erc20, index) => {\n console.log(` ${index + 1}. ${erc20.tokenAddress}: ${erc20.amount.toString()}`);\n });\n }\n \n if (balancesEvent.nftAmounts.length > 0) {\n console.log(` - NFT Details:`);\n balancesEvent.nftAmounts.forEach((nft, index) => {\n console.log(` ${index + 1}. ${nft.nftAddress}#${nft.tokenSubID}: ${nft.amount.toString()}`);\n });\n }\n \n balanceUpdatesReceived.push(balancesEvent);\n });\n\n console.log('🌐 Loading provider for mainnet...');\n const providerConfig = getProviderConfig();\n const loadRes = await loadProvider(\n providerConfig,\n NETWORK_NAME,\n 30_000, // 30 second polling interval for mainnet\n );\n console.log(`āœ… Provider loaded with fees: ${JSON.stringify(loadRes)}`);\n console.log(`āœ… Provider loaded for ${NETWORK_NAME}`);\n console.log(`āœ… Provider info: ${providerConfig.providers.map(p => p.provider).join(', ')}`);\n\n console.log('šŸ” Starting contract history scan...');\n console.log('ā³ Starting scan in background (not waiting for completion)...');\n \n // Start comprehensive on-chain event logging\n onChainEventLogger.startLogging();\n \n // Start the scan but don't wait for it to complete in the before hook\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n getEngine().scanContractHistory(\n chain,\n [dopWalletID], // walletIdFilter - scan for all wallets\n );\n \n console.log('āœ… Setup completed! Tests will run without waiting for full scan.');\n console.log('āš ļø Note: Balance results may be incomplete if scan is still in progress.');\n console.log('');\n \n // Stop the comprehensive logging and show summary\n onChainEventLogger.stopLogging();\n });\n\n after(async () => {\n console.log('🧹 Cleaning up...');\n await closeTestEngine();\n console.log('āœ… Cleanup completed');\n });\n\n it('Should try to fetch balances immediately (without waiting for full scan)', async function run() {\n this.timeout(60_000); // 1 minute\n \n console.log('');\n console.log('šŸš€ QUICK BALANCE CHECK (without full scan)');\n console.log('==========================================');\n console.log('⚔ This test tries to fetch balances immediately');\n console.log('⚔ without waiting for the full blockchain scan.');\n console.log('⚔ Results may be incomplete but useful for testing.');\n console.log('');\n\n // Optional: Try to wait for scans briefly (but don't fail if timeout)\n console.log('ā³ Briefly checking if scans have completed...');\n try {\n await Promise.race([\n Promise.all([\n pollUntilUTXOMerkletreeScanned(),\n pollUntilTXIDMerkletreeScanned(),\n ]),\n new Promise((_, reject) => setTimeout(() => reject(new Error('Quick scan check timeout')), 30_000)) // 30 second timeout\n ]);\n console.log('āœ… Scans completed! Will get full results.');\n } catch (error) {\n console.log('āš ļø Scans still in progress, proceeding anyway...');\n }\n \n // Get wallet instance\n const wallet = fullWalletForID(dopWalletID);\n expect(wallet).to.not.be.undefined;\n \n if (wallet == null) {\n throw new Error('āŒ Wallet not found');\n }\n\n console.log('šŸ“Š Attempting immediate balance fetch...');\n \n try {\n // Try to get balances even if scan is not complete\n const quickTokenBalances = await wallet.getTokenBalances(\n TXID_VERSION,\n chain,\n false // onlySpendable = false\n );\n \n const quickERC20Balances = getSerializedERC20Balances(quickTokenBalances);\n const quickNFTBalances = getSerializedNFTBalances(quickTokenBalances);\n\n console.log('āœ… Quick balance fetch successful!');\n console.log(`šŸ“Š Quick Results:`);\n console.log(` - Token addresses found: ${Object.keys(quickTokenBalances).length}`);\n console.log(` - ERC20 balances: ${quickERC20Balances.length}`);\n console.log(` - NFT balances: ${quickNFTBalances.length}`);\n \n if (quickERC20Balances.length > 0) {\n console.log('šŸ’° Quick ERC20 Balances:');\n quickERC20Balances.forEach((balance: DopERC20Amount, index: number) => {\n console.log(` ${index + 1}. ${balance.tokenAddress}: ${balance.amount.toString()}`);\n });\n }\n \n if (quickNFTBalances.length > 0) {\n console.log('šŸŽØ Quick NFT Balances:');\n quickNFTBalances.forEach((nft: DopNFTAmount, index: number) => {\n console.log(` ${index + 1}. ${nft.nftAddress}#${nft.tokenSubID}: ${nft.amount.toString()}`);\n });\n }\n \n if (quickERC20Balances.length === 0 && quickNFTBalances.length === 0) {\n console.log('ā„¹ļø No immediate balances found');\n console.log(' This could mean:');\n console.log(' • Blockchain scan is still in progress');\n console.log(' • No DOP transactions exist for this wallet');\n console.log(' • Wallet only has regular (non-private) transactions');\n }\n \n } catch (error) {\n console.log('āš ļø Quick balance fetch failed:');\n console.log(` ${error instanceof Error ? error.message : String(error)}`);\n console.log(' This is normal if the wallet/scan is not ready yet.');\n }\n \n console.log('āœ… Quick balance check completed!');\n console.log('');\n });\n\n it('Should fetch real balances from mainnet', async function run() {\n this.timeout(60_000); // 1 minute\n \n console.log('šŸ”„ Fetching your real balances...');\n \n // Get wallet instance\n const wallet = fullWalletForID(dopWalletID);\n expect(wallet).to.not.be.undefined;\n \n if (wallet == null) {\n throw new Error('āŒ Wallet not found');\n }\n\n console.log('šŸ“Š Getting token balances...');\n \n // Get all balances (spendable + pending)\n const allTokenBalances = await wallet.getTokenBalances(\n TXID_VERSION,\n chain,\n false // onlySpendable = false\n );\n \n // Get only spendable balances\n const spendableTokenBalances = await wallet.getTokenBalances(\n TXID_VERSION,\n chain,\n true // onlySpendable = true\n );\n\n console.log('šŸ“‹ Raw Balance Results:');\n console.log(` - Total token addresses: ${Object.keys(allTokenBalances).length}`);\n console.log(` - Spendable token addresses: ${Object.keys(spendableTokenBalances).length}`);\n \n // Serialize balances for easier viewing\n const allERC20Balances = getSerializedERC20Balances(allTokenBalances);\n const allNFTBalances = getSerializedNFTBalances(allTokenBalances);\n const spendableERC20Balances = getSerializedERC20Balances(spendableTokenBalances);\n const spendableNFTBalances = getSerializedNFTBalances(spendableTokenBalances);\n\n console.log('');\n console.log('šŸ’° BALANCE SUMMARY:');\n console.log('===================');\n console.log(`šŸ“Š All ERC20 Balances: ${allERC20Balances.length}`);\n console.log(`šŸ“Š All NFT Balances: ${allNFTBalances.length}`);\n console.log(`šŸ’Ž Spendable ERC20 Balances: ${spendableERC20Balances.length}`);\n console.log(`šŸŽØ Spendable NFT Balances: ${spendableNFTBalances.length}`);\n console.log('');\n\n // Display detailed ERC20 balances\n if (allERC20Balances.length > 0) {\n console.log('šŸ’° ERC20 TOKEN BALANCES:');\n console.log('========================');\n allERC20Balances.forEach((balance: DopERC20Amount, index: number) => {\n const isSpendable = spendableERC20Balances.some(sb => \n sb.tokenAddress === balance.tokenAddress && sb.amount.toString() === balance.amount.toString()\n );\n console.log(`${index + 1}. Token: ${balance.tokenAddress}`);\n console.log(` Amount: ${balance.amount.toString()}`);\n console.log(` Status: ${isSpendable ? 'āœ… Spendable' : 'ā³ Pending'}`);\n console.log('');\n });\n }\n\n // Display detailed NFT balances\n if (allNFTBalances.length > 0) {\n console.log('šŸŽØ NFT TOKEN BALANCES:');\n console.log('======================');\n allNFTBalances.forEach((nft: DopNFTAmount, index: number) => {\n const isSpendable = spendableNFTBalances.some(sn => \n sn.nftAddress === nft.nftAddress && \n sn.tokenSubID === nft.tokenSubID &&\n sn.amount.toString() === nft.amount.toString()\n );\n console.log(`${index + 1}. NFT Contract: ${nft.nftAddress}`);\n console.log(` Token ID: ${nft.tokenSubID}`);\n console.log(` Amount: ${nft.amount.toString()}`);\n console.log(` Status: ${isSpendable ? 'āœ… Spendable' : 'ā³ Pending'}`);\n console.log('');\n });\n }\n\n if (allERC20Balances.length === 0 && allNFTBalances.length === 0) {\n console.log('ā„¹ļø No DOP balances found for this wallet.');\n console.log('');\n console.log('This could mean:');\n console.log('• This wallet has never received DOP transactions');\n console.log('• This wallet only has regular (non-private) ETH/tokens');\n console.log('• The wallet has been used but all balances have been spent');\n console.log('');\n console.log('šŸ’” To test with balances, you need a wallet that has received');\n console.log(' DOP (private) transactions, not regular Ethereum transactions.');\n }\n\n // Display balance update summary\n console.log('šŸ“” BALANCE UPDATE CALLBACKS:');\n console.log('============================');\n console.log(`Total updates received: ${balanceUpdatesReceived.length}`);\n \n if (balanceUpdatesReceived.length > 0) {\n balanceUpdatesReceived.forEach((update, index) => {\n console.log(`Update ${index + 1}:`);\n console.log(` - Chain: ${update.chain.type}:${update.chain.id}`);\n console.log(` - ERC20: ${update.erc20Amounts.length}, NFT: ${update.nftAmounts.length}`);\n console.log(` - Bucket: ${update.balanceBucket}`);\n });\n }\n\n // Assertions\n expect(allTokenBalances).to.be.an('object');\n expect(spendableTokenBalances).to.be.an('object');\n expect(allERC20Balances).to.be.an('array');\n expect(allNFTBalances).to.be.an('array');\n expect(spendableERC20Balances).to.be.an('array');\n expect(spendableNFTBalances).to.be.an('array');\n\n console.log('āœ… Real balance fetching test completed successfully!');\n console.log('');\n });\n\n it('Should test balance refresh functionality', async function run() {\n this.timeout(60_000); // 1 minute\n \n console.log('šŸ”„ Testing balance refresh...');\n \n const initialUpdateCount = balanceUpdatesReceived.length;\n \n // Test refreshBalances function with patched version for Ethereum mainnet\n await refreshBalances(chain, [dopWalletID]);\n \n // Wait for potential updates\n await new Promise(resolve => setTimeout(resolve, 10000)); // 10 seconds\n \n const finalUpdateCount = balanceUpdatesReceived.length;\n console.log(`šŸ“Š Balance updates: ${initialUpdateCount} → ${finalUpdateCount}`);\n \n expect(finalUpdateCount).to.be.greaterThanOrEqual(initialUpdateCount);\n console.log('āœ… Balance refresh test completed!');\n });\n});\n"]}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * On-Chain Event Logger
3
+ *
4
+ * This module provides comprehensive logging for DOP on-chain event fetching,
5
+ * including GraphQL queries, event processing, and merkletree updates.
6
+ */
7
+ export interface EventCounts {
8
+ commitments: number;
9
+ decrypts: number;
10
+ nullifiers: number;
11
+ graphqlQueries: number;
12
+ scanChunks: number;
13
+ merkletreeUpdates: number;
14
+ balanceUpdates: number;
15
+ }
16
+ export interface GraphQLQueryLog {
17
+ timestamp: Date;
18
+ queryType: 'Commitments' | 'Decrypts' | 'Nullifiers' | 'DopTransactions';
19
+ blockNumber: number;
20
+ resultCount: number;
21
+ duration?: number;
22
+ }
23
+ export declare class OnChainEventLogger {
24
+ private eventCounts;
25
+ private graphqlLogs;
26
+ private originalConsoleLog;
27
+ private startTime;
28
+ constructor();
29
+ /**
30
+ * Start enhanced logging for on-chain events
31
+ */
32
+ startLogging(): void;
33
+ /**
34
+ * Stop logging and restore original console.log
35
+ */
36
+ stopLogging(): void;
37
+ /**
38
+ * Enhanced logger that categorizes and tracks different types of events
39
+ */
40
+ private enhancedLogger;
41
+ /**
42
+ * Print intermediate summary during scanning
43
+ */
44
+ private printIntermediateSummary;
45
+ /**
46
+ * Print final comprehensive summary
47
+ */
48
+ private printFinalSummary;
49
+ /**
50
+ * Log a GraphQL query with details
51
+ */
52
+ logGraphQLQuery(queryType: GraphQLQueryLog['queryType'], blockNumber: number, resultCount: number, duration?: number): void;
53
+ /**
54
+ * Get current event counts
55
+ */
56
+ getEventCounts(): EventCounts;
57
+ /**
58
+ * Get GraphQL query logs
59
+ */
60
+ getGraphQLLogs(): GraphQLQueryLog[];
61
+ }
62
+ export declare const onChainEventLogger: OnChainEventLogger;
@@ -0,0 +1,217 @@
1
+ "use strict";
2
+ /**
3
+ * On-Chain Event Logger
4
+ *
5
+ * This module provides comprehensive logging for DOP on-chain event fetching,
6
+ * including GraphQL queries, event processing, and merkletree updates.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.onChainEventLogger = exports.OnChainEventLogger = void 0;
10
+ class OnChainEventLogger {
11
+ eventCounts = {
12
+ commitments: 0,
13
+ decrypts: 0,
14
+ nullifiers: 0,
15
+ graphqlQueries: 0,
16
+ scanChunks: 0,
17
+ merkletreeUpdates: 0,
18
+ balanceUpdates: 0
19
+ };
20
+ graphqlLogs = [];
21
+ originalConsoleLog;
22
+ startTime;
23
+ constructor() {
24
+ this.originalConsoleLog = console.log;
25
+ this.startTime = new Date();
26
+ }
27
+ /**
28
+ * Start enhanced logging for on-chain events
29
+ */
30
+ startLogging() {
31
+ console.log('šŸ” ENABLING ENHANCED ON-CHAIN EVENT LOGGING');
32
+ console.log('==========================================');
33
+ // Replace console.log with our enhanced version
34
+ console.log = this.enhancedLogger.bind(this);
35
+ }
36
+ /**
37
+ * Stop logging and restore original console.log
38
+ */
39
+ stopLogging() {
40
+ console.log = this.originalConsoleLog;
41
+ this.printFinalSummary();
42
+ }
43
+ /**
44
+ * Enhanced logger that categorizes and tracks different types of events
45
+ */
46
+ enhancedLogger(...args) {
47
+ const message = args.join(' ');
48
+ // Track GraphQL Queries
49
+ if (message.includes('await sdk.') || message.includes('GraphQL Query:')) {
50
+ this.eventCounts.graphqlQueries += 1;
51
+ this.originalConsoleLog(`🌐 [Q${this.eventCounts.graphqlQueries}] GRAPHQL:`, ...args);
52
+ return;
53
+ }
54
+ // Track Commitment Events
55
+ if (message.includes('commitmentListener') || message.includes('leaves at')) {
56
+ this.eventCounts.commitments += 1;
57
+ this.originalConsoleLog(`šŸ“¦ [C${this.eventCounts.commitments}] COMMITMENT:`, ...args);
58
+ // Extract commitment details
59
+ const match = message.match(/(\d+) leaves at (\d+)/);
60
+ if (match) {
61
+ const [, count, index] = match;
62
+ this.originalConsoleLog(` └─ Added ${count} commitment(s) starting at index ${index}`);
63
+ }
64
+ return;
65
+ }
66
+ // Track Decrypt Events
67
+ if (message.includes('decryptListener') || message.includes('engine.decryptListener')) {
68
+ this.eventCounts.decrypts += 1;
69
+ this.originalConsoleLog(`šŸ”“ [D${this.eventCounts.decrypts}] DECRYPT:`, ...args);
70
+ return;
71
+ }
72
+ // Track Nullifier Events
73
+ if (message.includes('nullifierListener') || message.includes('engine.nullifierListener')) {
74
+ this.eventCounts.nullifiers += 1;
75
+ this.originalConsoleLog(`🚫 [N${this.eventCounts.nullifiers}] NULLIFIER:`, ...args);
76
+ return;
77
+ }
78
+ // Track Scan Chunks
79
+ if (message.includes('Scanning historical events') || message.includes('Scanning next')) {
80
+ this.eventCounts.scanChunks += 1;
81
+ this.originalConsoleLog(`šŸ” [CHUNK ${this.eventCounts.scanChunks}] SCAN:`, ...args);
82
+ // Extract block range
83
+ const blockMatch = message.match(/from block (\d+) to (\d+)/);
84
+ if (blockMatch) {
85
+ const [, startBlock, endBlock] = blockMatch;
86
+ const blockRange = parseInt(endBlock, 10) - parseInt(startBlock, 10);
87
+ this.originalConsoleLog(` └─ Block range: ${startBlock} → ${endBlock} (${blockRange.toLocaleString()} blocks)`);
88
+ }
89
+ return;
90
+ }
91
+ // Track QuickSync Operations
92
+ if (message.includes('quickSync') || message.includes('QuickSync')) {
93
+ this.originalConsoleLog('⚔ QUICK SYNC:', ...args);
94
+ // Extract QuickSync details
95
+ const commitmentMatch = message.match(/QuickSync commitments: (\d+)/);
96
+ if (commitmentMatch) {
97
+ const [, count] = commitmentMatch;
98
+ this.originalConsoleLog(` └─ Found ${count} commitments via QuickSync`);
99
+ }
100
+ return;
101
+ }
102
+ // Track Merkletree Updates
103
+ if (message.includes('insertLeaves') || message.includes('queueLeaves') || message.includes('treeLength')) {
104
+ this.eventCounts.merkletreeUpdates += 1;
105
+ this.originalConsoleLog(`🌳 [M${this.eventCounts.merkletreeUpdates}] MERKLETREE:`, ...args);
106
+ return;
107
+ }
108
+ // Track Balance Updates
109
+ if (message.includes('Balance Update Received') || message.includes('Wallet balance SCANNED')) {
110
+ this.eventCounts.balanceUpdates += 1;
111
+ this.originalConsoleLog(`šŸ’° [B${this.eventCounts.balanceUpdates}] BALANCE:`, ...args);
112
+ return;
113
+ }
114
+ // Track Scan Progress
115
+ if (message.includes('lastSyncedBlock') || message.includes('most recent valid commitment block')) {
116
+ this.originalConsoleLog('ā³ SYNC PROGRESS:', ...args);
117
+ return;
118
+ }
119
+ // Track Scan Configuration
120
+ if (message.includes('SCAN_CHUNKS') || message.includes('Total blocks to')) {
121
+ this.originalConsoleLog('šŸ“Š SCAN CONFIG:', ...args);
122
+ return;
123
+ }
124
+ // Track Scan Completion
125
+ if (message.includes('Finished historical event scan')) {
126
+ this.originalConsoleLog('āœ… SCAN COMPLETE:', ...args);
127
+ this.printIntermediateSummary();
128
+ return;
129
+ }
130
+ // Track Error Messages
131
+ if (message.includes('Cannot sync txids') || message.includes('Cannot scan history')) {
132
+ this.originalConsoleLog('āš ļø EXPECTED INFO:', ...args);
133
+ return;
134
+ }
135
+ // Default logging
136
+ this.originalConsoleLog(...args);
137
+ }
138
+ /**
139
+ * Print intermediate summary during scanning
140
+ */
141
+ printIntermediateSummary() {
142
+ const elapsed = new Date().getTime() - this.startTime.getTime();
143
+ const elapsedMinutes = Math.floor(elapsed / 60000);
144
+ const elapsedSeconds = Math.floor((elapsed % 60000) / 1000);
145
+ this.originalConsoleLog('\nšŸ“Š INTERMEDIATE EVENT SUMMARY:');
146
+ this.originalConsoleLog('==============================');
147
+ this.originalConsoleLog(`ā±ļø Elapsed Time: ${elapsedMinutes}m ${elapsedSeconds}s`);
148
+ this.originalConsoleLog(`šŸ“¦ Commitments: ${this.eventCounts.commitments}`);
149
+ this.originalConsoleLog(`šŸ”“ Decrypts: ${this.eventCounts.decrypts}`);
150
+ this.originalConsoleLog(`🚫 Nullifiers: ${this.eventCounts.nullifiers}`);
151
+ this.originalConsoleLog(`šŸ” Scan Chunks: ${this.eventCounts.scanChunks}`);
152
+ this.originalConsoleLog(`🌳 Merkletree Updates: ${this.eventCounts.merkletreeUpdates}`);
153
+ this.originalConsoleLog(`🌐 GraphQL Queries: ${this.eventCounts.graphqlQueries}`);
154
+ this.originalConsoleLog('');
155
+ }
156
+ /**
157
+ * Print final comprehensive summary
158
+ */
159
+ printFinalSummary() {
160
+ const elapsed = new Date().getTime() - this.startTime.getTime();
161
+ const elapsedMinutes = Math.floor(elapsed / 60000);
162
+ const elapsedSeconds = Math.floor((elapsed % 60000) / 1000);
163
+ this.originalConsoleLog('\nšŸŽ‰ FINAL ON-CHAIN EVENT SUMMARY:');
164
+ this.originalConsoleLog('================================');
165
+ this.originalConsoleLog(`ā±ļø Total Duration: ${elapsedMinutes}m ${elapsedSeconds}s`);
166
+ this.originalConsoleLog('');
167
+ this.originalConsoleLog('šŸ“Š Event Breakdown:');
168
+ this.originalConsoleLog(` šŸ“¦ Commitment Events: ${this.eventCounts.commitments}`);
169
+ this.originalConsoleLog(` šŸ”“ Decrypt Events: ${this.eventCounts.decrypts}`);
170
+ this.originalConsoleLog(` 🚫 Nullifier Events: ${this.eventCounts.nullifiers}`);
171
+ this.originalConsoleLog(` šŸ’° Balance Updates: ${this.eventCounts.balanceUpdates}`);
172
+ this.originalConsoleLog('');
173
+ this.originalConsoleLog('šŸ”§ Technical Metrics:');
174
+ this.originalConsoleLog(` šŸ” Scan Chunks Processed: ${this.eventCounts.scanChunks}`);
175
+ this.originalConsoleLog(` 🌳 Merkletree Updates: ${this.eventCounts.merkletreeUpdates}`);
176
+ this.originalConsoleLog(` 🌐 GraphQL Queries: ${this.eventCounts.graphqlQueries}`);
177
+ this.originalConsoleLog('');
178
+ if (this.eventCounts.commitments > 0) {
179
+ this.originalConsoleLog('āœ… Successfully processed on-chain events!');
180
+ }
181
+ else {
182
+ this.originalConsoleLog('ā„¹ļø No DOP events found (this may be normal for new/unused wallets)');
183
+ }
184
+ this.originalConsoleLog('');
185
+ }
186
+ /**
187
+ * Log a GraphQL query with details
188
+ */
189
+ logGraphQLQuery(queryType, blockNumber, resultCount, duration) {
190
+ const log = {
191
+ timestamp: new Date(),
192
+ queryType,
193
+ blockNumber,
194
+ resultCount,
195
+ duration
196
+ };
197
+ this.graphqlLogs.push(log);
198
+ const durationStr = duration != null && duration > 0 ? ` (${duration}ms)` : '';
199
+ this.originalConsoleLog(`🌐 GraphQL ${queryType}: block ${blockNumber} → ${resultCount} results${durationStr}`);
200
+ }
201
+ /**
202
+ * Get current event counts
203
+ */
204
+ getEventCounts() {
205
+ return { ...this.eventCounts };
206
+ }
207
+ /**
208
+ * Get GraphQL query logs
209
+ */
210
+ getGraphQLLogs() {
211
+ return [...this.graphqlLogs];
212
+ }
213
+ }
214
+ exports.OnChainEventLogger = OnChainEventLogger;
215
+ // Global logger instance
216
+ exports.onChainEventLogger = new OnChainEventLogger();
217
+ //# sourceMappingURL=on-chain-event-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"on-chain-event-logger.js","sourceRoot":"","sources":["../../src/tests/on-chain-event-logger.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * On-Chain Event Logger\n * \n * This module provides comprehensive logging for DOP on-chain event fetching,\n * including GraphQL queries, event processing, and merkletree updates.\n */\n\nexport interface EventCounts {\n commitments: number;\n decrypts: number;\n nullifiers: number;\n graphqlQueries: number;\n scanChunks: number;\n merkletreeUpdates: number;\n balanceUpdates: number;\n}\n\nexport interface GraphQLQueryLog {\n timestamp: Date;\n queryType: 'Commitments' | 'Decrypts' | 'Nullifiers' | 'DopTransactions';\n blockNumber: number;\n resultCount: number;\n duration?: number;\n}\n\nexport class OnChainEventLogger {\n private eventCounts: EventCounts = {\n commitments: 0,\n decrypts: 0,\n nullifiers: 0,\n graphqlQueries: 0,\n scanChunks: 0,\n merkletreeUpdates: 0,\n balanceUpdates: 0\n };\n\n private graphqlLogs: GraphQLQueryLog[] = [];\n private originalConsoleLog: typeof console.log;\n private startTime: Date;\n\n constructor() {\n this.originalConsoleLog = console.log;\n this.startTime = new Date();\n }\n\n /**\n * Start enhanced logging for on-chain events\n */\n startLogging(): void {\n console.log('šŸ” ENABLING ENHANCED ON-CHAIN EVENT LOGGING');\n console.log('==========================================');\n \n // Replace console.log with our enhanced version\n console.log = this.enhancedLogger.bind(this);\n }\n\n /**\n * Stop logging and restore original console.log\n */\n stopLogging(): void {\n console.log = this.originalConsoleLog;\n this.printFinalSummary();\n }\n\n /**\n * Enhanced logger that categorizes and tracks different types of events\n */\n private enhancedLogger(...args: any[]): void {\n const message = args.join(' ');\n \n // Track GraphQL Queries\n if (message.includes('await sdk.') || message.includes('GraphQL Query:')) {\n this.eventCounts.graphqlQueries += 1;\n this.originalConsoleLog(`🌐 [Q${this.eventCounts.graphqlQueries}] GRAPHQL:`, ...args);\n return;\n }\n\n // Track Commitment Events\n if (message.includes('commitmentListener') || message.includes('leaves at')) {\n this.eventCounts.commitments += 1;\n this.originalConsoleLog(`šŸ“¦ [C${this.eventCounts.commitments}] COMMITMENT:`, ...args);\n \n // Extract commitment details\n const match = message.match(/(\\d+) leaves at (\\d+)/);\n if (match) {\n const [, count, index] = match;\n this.originalConsoleLog(` └─ Added ${count} commitment(s) starting at index ${index}`);\n }\n return;\n }\n\n // Track Decrypt Events\n if (message.includes('decryptListener') || message.includes('engine.decryptListener')) {\n this.eventCounts.decrypts += 1;\n this.originalConsoleLog(`šŸ”“ [D${this.eventCounts.decrypts}] DECRYPT:`, ...args);\n return;\n }\n\n // Track Nullifier Events\n if (message.includes('nullifierListener') || message.includes('engine.nullifierListener')) {\n this.eventCounts.nullifiers += 1;\n this.originalConsoleLog(`🚫 [N${this.eventCounts.nullifiers}] NULLIFIER:`, ...args);\n return;\n }\n\n // Track Scan Chunks\n if (message.includes('Scanning historical events') || message.includes('Scanning next')) {\n this.eventCounts.scanChunks += 1;\n this.originalConsoleLog(`šŸ” [CHUNK ${this.eventCounts.scanChunks}] SCAN:`, ...args);\n \n // Extract block range\n const blockMatch = message.match(/from block (\\d+) to (\\d+)/);\n if (blockMatch) {\n const [, startBlock, endBlock] = blockMatch;\n const blockRange = parseInt(endBlock, 10) - parseInt(startBlock, 10);\n this.originalConsoleLog(` └─ Block range: ${startBlock} → ${endBlock} (${blockRange.toLocaleString()} blocks)`);\n }\n return;\n }\n\n // Track QuickSync Operations\n if (message.includes('quickSync') || message.includes('QuickSync')) {\n this.originalConsoleLog('⚔ QUICK SYNC:', ...args);\n \n // Extract QuickSync details\n const commitmentMatch = message.match(/QuickSync commitments: (\\d+)/);\n if (commitmentMatch) {\n const [, count] = commitmentMatch;\n this.originalConsoleLog(` └─ Found ${count} commitments via QuickSync`);\n }\n return;\n }\n\n // Track Merkletree Updates\n if (message.includes('insertLeaves') || message.includes('queueLeaves') || message.includes('treeLength')) {\n this.eventCounts.merkletreeUpdates += 1;\n this.originalConsoleLog(`🌳 [M${this.eventCounts.merkletreeUpdates}] MERKLETREE:`, ...args);\n return;\n }\n\n // Track Balance Updates\n if (message.includes('Balance Update Received') || message.includes('Wallet balance SCANNED')) {\n this.eventCounts.balanceUpdates += 1;\n this.originalConsoleLog(`šŸ’° [B${this.eventCounts.balanceUpdates}] BALANCE:`, ...args);\n return;\n }\n\n // Track Scan Progress\n if (message.includes('lastSyncedBlock') || message.includes('most recent valid commitment block')) {\n this.originalConsoleLog('ā³ SYNC PROGRESS:', ...args);\n return;\n }\n\n // Track Scan Configuration\n if (message.includes('SCAN_CHUNKS') || message.includes('Total blocks to')) {\n this.originalConsoleLog('šŸ“Š SCAN CONFIG:', ...args);\n return;\n }\n\n // Track Scan Completion\n if (message.includes('Finished historical event scan')) {\n this.originalConsoleLog('āœ… SCAN COMPLETE:', ...args);\n this.printIntermediateSummary();\n return;\n }\n\n // Track Error Messages\n if (message.includes('Cannot sync txids') || message.includes('Cannot scan history')) {\n this.originalConsoleLog('āš ļø EXPECTED INFO:', ...args);\n return;\n }\n\n // Default logging\n this.originalConsoleLog(...args);\n }\n\n /**\n * Print intermediate summary during scanning\n */\n private printIntermediateSummary(): void {\n const elapsed = new Date().getTime() - this.startTime.getTime();\n const elapsedMinutes = Math.floor(elapsed / 60000);\n const elapsedSeconds = Math.floor((elapsed % 60000) / 1000);\n\n this.originalConsoleLog('\\nšŸ“Š INTERMEDIATE EVENT SUMMARY:');\n this.originalConsoleLog('==============================');\n this.originalConsoleLog(`ā±ļø Elapsed Time: ${elapsedMinutes}m ${elapsedSeconds}s`);\n this.originalConsoleLog(`šŸ“¦ Commitments: ${this.eventCounts.commitments}`);\n this.originalConsoleLog(`šŸ”“ Decrypts: ${this.eventCounts.decrypts}`);\n this.originalConsoleLog(`🚫 Nullifiers: ${this.eventCounts.nullifiers}`);\n this.originalConsoleLog(`šŸ” Scan Chunks: ${this.eventCounts.scanChunks}`);\n this.originalConsoleLog(`🌳 Merkletree Updates: ${this.eventCounts.merkletreeUpdates}`);\n this.originalConsoleLog(`🌐 GraphQL Queries: ${this.eventCounts.graphqlQueries}`);\n this.originalConsoleLog('');\n }\n\n /**\n * Print final comprehensive summary\n */\n private printFinalSummary(): void {\n const elapsed = new Date().getTime() - this.startTime.getTime();\n const elapsedMinutes = Math.floor(elapsed / 60000);\n const elapsedSeconds = Math.floor((elapsed % 60000) / 1000);\n\n this.originalConsoleLog('\\nšŸŽ‰ FINAL ON-CHAIN EVENT SUMMARY:');\n this.originalConsoleLog('================================');\n this.originalConsoleLog(`ā±ļø Total Duration: ${elapsedMinutes}m ${elapsedSeconds}s`);\n this.originalConsoleLog('');\n this.originalConsoleLog('šŸ“Š Event Breakdown:');\n this.originalConsoleLog(` šŸ“¦ Commitment Events: ${this.eventCounts.commitments}`);\n this.originalConsoleLog(` šŸ”“ Decrypt Events: ${this.eventCounts.decrypts}`);\n this.originalConsoleLog(` 🚫 Nullifier Events: ${this.eventCounts.nullifiers}`);\n this.originalConsoleLog(` šŸ’° Balance Updates: ${this.eventCounts.balanceUpdates}`);\n this.originalConsoleLog('');\n this.originalConsoleLog('šŸ”§ Technical Metrics:');\n this.originalConsoleLog(` šŸ” Scan Chunks Processed: ${this.eventCounts.scanChunks}`);\n this.originalConsoleLog(` 🌳 Merkletree Updates: ${this.eventCounts.merkletreeUpdates}`);\n this.originalConsoleLog(` 🌐 GraphQL Queries: ${this.eventCounts.graphqlQueries}`);\n this.originalConsoleLog('');\n \n if (this.eventCounts.commitments > 0) {\n this.originalConsoleLog('āœ… Successfully processed on-chain events!');\n } else {\n this.originalConsoleLog('ā„¹ļø No DOP events found (this may be normal for new/unused wallets)');\n }\n this.originalConsoleLog('');\n }\n\n /**\n * Log a GraphQL query with details\n */\n logGraphQLQuery(queryType: GraphQLQueryLog['queryType'], blockNumber: number, resultCount: number, duration?: number): void {\n const log: GraphQLQueryLog = {\n timestamp: new Date(),\n queryType,\n blockNumber,\n resultCount,\n duration\n };\n \n this.graphqlLogs.push(log);\n \n const durationStr = duration != null && duration > 0 ? ` (${duration}ms)` : '';\n this.originalConsoleLog(`🌐 GraphQL ${queryType}: block ${blockNumber} → ${resultCount} results${durationStr}`);\n }\n\n /**\n * Get current event counts\n */\n getEventCounts(): EventCounts {\n return { ...this.eventCounts };\n }\n\n /**\n * Get GraphQL query logs\n */\n getGraphQLLogs(): GraphQLQueryLog[] {\n return [...this.graphqlLogs];\n }\n}\n\n// Global logger instance\nexport const onChainEventLogger = new OnChainEventLogger();"]}
@@ -63,15 +63,17 @@ const initTestEngine = async (useNativeArtifacts = false) => {
63
63
  const testPOIRequester = new test_wallet_poi_requester_test_1.TestWalletPOIRequester();
64
64
  const txidMerklerootValidator = (txidVersion, chain, tree, index, merkleroot) => testPOIRequester.validateDopTxidMerkleroot(txidVersion, chain, tree, index, merkleroot);
65
65
  // Set the environment variable "VERBOSE" to enable debug logs
66
- const shouldDebug = typeof process.env.VERBOSE !== 'undefined';
67
- if (shouldDebug) {
66
+ const shouldDebug = true;
67
+ if (process.env.VERBOSE != null && process.env.VERBOSE === 'true') {
68
68
  (0, utils_1.setLoggers)(console.log, console.error);
69
69
  }
70
70
  await (0, core_1.startDopEngine)(mocks_test_1.TEST_WALLET_SOURCE, db, shouldDebug, testArtifactStore, useNativeArtifacts, false, // skipMerkletreeScans
71
- false // verboseLogging
71
+ true // verboseLogging
72
72
  );
73
+ console.log('Setting up test engine merkletree scan callbacks...');
73
74
  (0, core_1.setOnUTXOMerkletreeScanCallback)(exports.utxoMerkletreeHistoryScanCallback);
74
75
  (0, core_1.setOnTXIDMerkletreeScanCallback)(exports.txidMerkletreeHistoryScanCallback);
76
+ console.log('Setting done.');
75
77
  };
76
78
  exports.initTestEngine = initTestEngine;
77
79
  const initTestEngineNetworks = async (networkName = dop_sharedmodels_v3_1.NetworkName.EthereumSepolia, mockConfig = mocks_test_1.MOCK_FALLBACK_PROVIDER_JSON_CONFIG_SEPOLIA) => {
@@ -1 +1 @@
1
- {"version":3,"file":"setup.test.js","sourceRoot":"","sources":["../../src/tests/setup.test.ts"],"names":[],"mappings":"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","sourcesContent":["/// <reference types=\"../types/global\" />\n/* eslint-disable import/no-extraneous-dependencies */\n/* eslint-disable no-console */\nimport LevelDOWN from 'leveldown';\nimport fs from 'fs';\nimport {\n MerkletreeScanStatus,\n MerkletreeScanUpdateEvent,\n NETWORK_CONFIG,\n NetworkName,\n poll,\n} from 'dop-sharedmodels-v3';\nimport {\n MOCK_BALANCES_UPDATE_CALLBACK,\n MOCK_FALLBACK_PROVIDER_JSON_CONFIG_SEPOLIA,\n TEST_WALLET_SOURCE,\n} from './mocks.test';\nimport { ArtifactStore } from '../services/artifacts/artifact-store';\nimport {\n setOnBalanceUpdateCallback,\n} from '../services/dop/wallets/balance-update';\nimport { TestWalletPOIRequester } from './poi/test-wallet-poi-requester.test';\nimport {\n GetLatestValidatedDopTxid,\n MerklerootValidator,\n SnarkJSGroth16,\n} from 'dop-engine-v3';\nimport {\n getEngine,\n loadProvider,\n setOnTXIDMerkletreeScanCallback,\n setOnUTXOMerkletreeScanCallback,\n startDopEngine,\n stopDopEngine,\n} from '../services/dop/core';\nimport { groth16 } from 'snarkjs';\nimport { setLoggers } from '../utils';\n\nconst ENGINE_TEST_DB = 'test.db';\nconst db = new LevelDOWN(ENGINE_TEST_DB);\n\nconst setupTests = () => {\n // Uncomment to enable logger during tests (Do not commit).\n // setLoggers(console.log, console.error);\n};\n\nconst rmDirSafe = async (dir: string) => {\n if (await fileExists(dir)) {\n await fs.promises.rm(dir, { recursive: true });\n }\n};\n\nbefore(async () => {\n await rmDirSafe(ENGINE_TEST_DB);\n await rmDirSafe('artifacts-v2.1');\n setupTests();\n});\n\nconst fileExists = (path: string): Promise<boolean> => {\n return new Promise(resolve => {\n fs.promises\n .access(path)\n .then(() => resolve(true))\n .catch(() => resolve(false));\n });\n};\n\nconst testArtifactStore = new ArtifactStore(\n fs.promises.readFile,\n async (dir, path, data) => {\n await fs.promises.mkdir(dir, { recursive: true });\n await fs.promises.writeFile(path, data);\n },\n fileExists,\n);\n\nlet currentUTXOMerkletreeScanStatus: Optional<MerkletreeScanStatus>;\nlet currentTXIDMerkletreeScanStatus: Optional<MerkletreeScanStatus>;\n\nexport const utxoMerkletreeHistoryScanCallback = (\n scanData: MerkletreeScanUpdateEvent,\n): void => {\n currentUTXOMerkletreeScanStatus = scanData.scanStatus;\n};\n\nexport const txidMerkletreeHistoryScanCallback = (\n scanData: MerkletreeScanUpdateEvent,\n): void => {\n currentTXIDMerkletreeScanStatus = scanData.scanStatus;\n};\n\nexport const clearAllMerkletreeScanStatus = () => {\n currentUTXOMerkletreeScanStatus = undefined;\n currentTXIDMerkletreeScanStatus = undefined;\n};\n\nexport const initTestEngine = async (useNativeArtifacts = false) => {\n // SETUP TEST WALLET POI REQUESTER\n const testPOIRequester = new TestWalletPOIRequester();\n const txidMerklerootValidator: MerklerootValidator = (\n txidVersion,\n chain,\n tree,\n index,\n merkleroot,\n ) =>\n testPOIRequester.validateDopTxidMerkleroot(\n txidVersion,\n chain,\n tree,\n index,\n merkleroot,\n );\n // Set the environment variable \"VERBOSE\" to enable debug logs\n const shouldDebug = typeof process.env.VERBOSE !== 'undefined';\n\n if (shouldDebug) {\n setLoggers(console.log, console.error);\n }\n\n await startDopEngine(\n TEST_WALLET_SOURCE,\n db,\n shouldDebug,\n testArtifactStore,\n useNativeArtifacts,\n false, // skipMerkletreeScans\n false // verboseLogging\n );\n\n\n setOnUTXOMerkletreeScanCallback(utxoMerkletreeHistoryScanCallback);\n setOnTXIDMerkletreeScanCallback(txidMerkletreeHistoryScanCallback);\n};\n\nexport const initTestEngineNetworks = async (\n networkName = NetworkName.EthereumSepolia,\n mockConfig = MOCK_FALLBACK_PROVIDER_JSON_CONFIG_SEPOLIA,\n) => {\n // Don't wait for async. It will try to load historical events, which takes a while.\n await loadProvider(\n mockConfig,\n networkName,\n 10_000, // pollingInterval\n );\n const { chain } = NETWORK_CONFIG[networkName];\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n getEngine().scanContractHistory(\n chain,\n undefined, // walletIdFilter\n );\n};\n\nexport const closeTestEngine = async () => {\n await stopDopEngine();\n\n clearAllMerkletreeScanStatus();\n};\n\nexport const pollUntilUTXOMerkletreeScanned = async () => {\n const status = await poll(\n async () => currentUTXOMerkletreeScanStatus,\n status => status === MerkletreeScanStatus.Complete,\n 50,\n 360_000 / 50, // 360 sec.\n );\n if (status !== MerkletreeScanStatus.Complete) {\n throw new Error(`UTXO merkletree scan should be completed - timed out`);\n }\n};\n\nexport const pollUntilTXIDMerkletreeScanned = async () => {\n const status = await poll(\n async () => currentTXIDMerkletreeScanStatus,\n status => status === MerkletreeScanStatus.Complete,\n 50,\n 360_000 / 50, // 360 sec.\n );\n if (status !== MerkletreeScanStatus.Complete) {\n throw new Error(`TXID merkletree scan should be completed - timed out`);\n }\n};\n"]}
1
+ {"version":3,"file":"setup.test.js","sourceRoot":"","sources":["../../src/tests/setup.test.ts"],"names":[],"mappings":"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","sourcesContent":["/// <reference types=\"../types/global\" />\n/* eslint-disable import/no-extraneous-dependencies */\n/* eslint-disable no-console */\nimport LevelDOWN from 'leveldown';\nimport fs from 'fs';\nimport {\n MerkletreeScanStatus,\n MerkletreeScanUpdateEvent,\n NETWORK_CONFIG,\n NetworkName,\n poll,\n} from 'dop-sharedmodels-v3';\nimport {\n MOCK_BALANCES_UPDATE_CALLBACK,\n MOCK_FALLBACK_PROVIDER_JSON_CONFIG_SEPOLIA,\n TEST_WALLET_SOURCE,\n} from './mocks.test';\nimport { ArtifactStore } from '../services/artifacts/artifact-store';\nimport {\n setOnBalanceUpdateCallback,\n} from '../services/dop/wallets/balance-update';\nimport { TestWalletPOIRequester } from './poi/test-wallet-poi-requester.test';\nimport {\n GetLatestValidatedDopTxid,\n MerklerootValidator,\n SnarkJSGroth16,\n} from 'dop-engine-v3';\nimport {\n getEngine,\n loadProvider,\n setOnTXIDMerkletreeScanCallback,\n setOnUTXOMerkletreeScanCallback,\n startDopEngine,\n stopDopEngine,\n} from '../services/dop/core';\nimport { groth16 } from 'snarkjs';\nimport { setLoggers } from '../utils';\n\nconst ENGINE_TEST_DB = 'test.db';\nconst db = new LevelDOWN(ENGINE_TEST_DB);\n\nconst setupTests = () => {\n // Uncomment to enable logger during tests (Do not commit).\n // setLoggers(console.log, console.error);\n};\n\nconst rmDirSafe = async (dir: string) => {\n if (await fileExists(dir)) {\n await fs.promises.rm(dir, { recursive: true });\n }\n};\n\nbefore(async () => {\n await rmDirSafe(ENGINE_TEST_DB);\n await rmDirSafe('artifacts-v2.1');\n setupTests();\n});\n\nconst fileExists = (path: string): Promise<boolean> => {\n return new Promise(resolve => {\n fs.promises\n .access(path)\n .then(() => resolve(true))\n .catch(() => resolve(false));\n });\n};\n\nconst testArtifactStore = new ArtifactStore(\n fs.promises.readFile,\n async (dir, path, data) => {\n await fs.promises.mkdir(dir, { recursive: true });\n await fs.promises.writeFile(path, data);\n },\n fileExists,\n);\n\nlet currentUTXOMerkletreeScanStatus: Optional<MerkletreeScanStatus>;\nlet currentTXIDMerkletreeScanStatus: Optional<MerkletreeScanStatus>;\n\nexport const utxoMerkletreeHistoryScanCallback = (\n scanData: MerkletreeScanUpdateEvent,\n): void => {\n currentUTXOMerkletreeScanStatus = scanData.scanStatus;\n};\n\nexport const txidMerkletreeHistoryScanCallback = (\n scanData: MerkletreeScanUpdateEvent,\n): void => {\n currentTXIDMerkletreeScanStatus = scanData.scanStatus;\n};\n\nexport const clearAllMerkletreeScanStatus = () => {\n currentUTXOMerkletreeScanStatus = undefined;\n currentTXIDMerkletreeScanStatus = undefined;\n};\n\nexport const initTestEngine = async (useNativeArtifacts = false) => {\n // SETUP TEST WALLET POI REQUESTER\n const testPOIRequester = new TestWalletPOIRequester();\n const txidMerklerootValidator: MerklerootValidator = (\n txidVersion,\n chain,\n tree,\n index,\n merkleroot,\n ) =>\n testPOIRequester.validateDopTxidMerkleroot(\n txidVersion,\n chain,\n tree,\n index,\n merkleroot,\n );\n // Set the environment variable \"VERBOSE\" to enable debug logs\n const shouldDebug = true;\n if (process.env.VERBOSE != null && process.env.VERBOSE === 'true') {\n setLoggers(console.log, console.error);\n }\n\n await startDopEngine(\n TEST_WALLET_SOURCE,\n db,\n shouldDebug,\n testArtifactStore,\n useNativeArtifacts,\n false, // skipMerkletreeScans\n true // verboseLogging\n );\n\n console.log('Setting up test engine merkletree scan callbacks...');\n setOnUTXOMerkletreeScanCallback(utxoMerkletreeHistoryScanCallback);\n setOnTXIDMerkletreeScanCallback(txidMerkletreeHistoryScanCallback);\n console.log('Setting done.');\n\n};\n\nexport const initTestEngineNetworks = async (\n networkName = NetworkName.EthereumSepolia,\n mockConfig = MOCK_FALLBACK_PROVIDER_JSON_CONFIG_SEPOLIA,\n) => {\n // Don't wait for async. It will try to load historical events, which takes a while.\n await loadProvider(\n mockConfig,\n networkName,\n 10_000, // pollingInterval\n );\n const { chain } = NETWORK_CONFIG[networkName];\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n getEngine().scanContractHistory(\n chain,\n undefined, // walletIdFilter\n );\n};\n\nexport const closeTestEngine = async () => {\n await stopDopEngine();\n\n clearAllMerkletreeScanStatus();\n};\n\nexport const pollUntilUTXOMerkletreeScanned = async () => {\n const status = await poll(\n async () => currentUTXOMerkletreeScanStatus,\n status => status === MerkletreeScanStatus.Complete,\n 50,\n 360_000 / 50, // 360 sec.\n );\n if (status !== MerkletreeScanStatus.Complete) {\n throw new Error(`UTXO merkletree scan should be completed - timed out`);\n }\n};\n\nexport const pollUntilTXIDMerkletreeScanned = async () => {\n const status = await poll(\n async () => currentTXIDMerkletreeScanStatus,\n status => status === MerkletreeScanStatus.Complete,\n 50,\n 360_000 / 50, // 360 sec.\n );\n if (status !== MerkletreeScanStatus.Complete) {\n throw new Error(`TXID merkletree scan should be completed - timed out`);\n }\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dop-wallet-v6",
3
- "version": "1.2.19",
3
+ "version": "1.2.21",
4
4
  "description": "DOP Wallet SDK, compatible with mobile, browser and nodejs environments.",
5
5
  "main": "dist/index.js",
6
6
  "license": "MIT",
@@ -32,7 +32,7 @@
32
32
  "eslint": "eslint src/**/* --ext .ts,.tsx --ignore-pattern **/*.graphql --fix",
33
33
  "lint": "npm run check-circular-deps && npm run eslint && npm run tsc && npm run tsc-test",
34
34
  "prepare": "npm run build",
35
- "postinstall": "node postinstall.js && patch-package --error-on-fail",
35
+ "postinstall": "node postinstall.js",
36
36
  "verify-rn-compatibility": "node verify-react-native-compatibility.cjs"
37
37
  },
38
38
  "dependencies": {
@@ -114,6 +114,5 @@
114
114
  },
115
115
  "resolutions": {
116
116
  "ethers": "6.13.1"
117
- },
118
- "packageManager": "yarn@1.22.22"
117
+ }
119
118
  }