dop-wallet-v6 1.2.21 ā 1.3.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.
- package/dist/services/dop/core/react-native-init.d.ts +14 -5
- package/dist/services/dop/core/react-native-init.js +449 -34
- package/dist/services/dop/core/react-native-init.js.map +1 -1
- package/dist/services/dop/crypto/react-native-crypto-provider.d.ts +1 -1
- package/dist/services/dop/crypto/react-native-crypto-provider.js +20 -2
- package/dist/services/dop/crypto/react-native-crypto-provider.js.map +1 -1
- package/dist/services/dop/dop-txids/graphql/index.js +3 -6
- package/dist/services/dop/dop-txids/graphql/index.js.map +1 -1
- package/dist/services/dop/quick-sync/V2/graphql/index.js +3 -6
- package/dist/services/dop/quick-sync/V2/graphql/index.js.map +1 -1
- package/dist/services/dop/quick-sync/V3/graphql/index.js +3 -6
- package/dist/services/dop/quick-sync/V3/graphql/index.js.map +1 -1
- package/dist/tests/balances.test.js +115 -112
- package/dist/tests/balances.test.js.map +1 -1
- package/dist/tests/setup.test.js +5 -1
- package/dist/tests/setup.test.js.map +1 -1
- package/package.json +2 -1
- package/patches/dop-engine-v3+1.4.9.patch +252 -2
- package/dist/tests/on-chain-event-logger.d.ts +0 -62
- package/dist/tests/on-chain-event-logger.js +0 -217
- package/dist/tests/on-chain-event-logger.js.map +0 -1
|
@@ -1,8 +1,201 @@
|
|
|
1
|
+
diff --git a/node_modules/dop-engine-v3/dist/contracts/dop-smart-wallet/V2/dop-smart-wallet.js b/node_modules/dop-engine-v3/dist/contracts/dop-smart-wallet/V2/dop-smart-wallet.js
|
|
2
|
+
index 56b2ecb..e5f75b7 100644
|
|
3
|
+
--- a/node_modules/dop-engine-v3/dist/contracts/dop-smart-wallet/V2/dop-smart-wallet.js
|
|
4
|
+
+++ b/node_modules/dop-engine-v3/dist/contracts/dop-smart-wallet/V2/dop-smart-wallet.js
|
|
5
|
+
@@ -75,6 +75,7 @@ class DopSmartWalletContract extends events_1.default {
|
|
6
|
+
* @returns isValid
|
|
7
|
+
*/
|
|
8
|
+
async validateMerkleroot(tree, root) {
|
|
9
|
+
+ console.log(`Validating V2 merkleroot for tree ${tree} : ${root}`);
|
|
10
|
+
try {
|
|
11
|
+
const isValidMerkleroot = await this.contract.rootHistory(tree, bytes_1.ByteUtils.formatToByteLength(root, bytes_1.ByteLength.UINT_256, true));
|
|
12
|
+
// if (!isValidMerkleroot && EngineDebug.isTestRun()) {
|
|
13
|
+
diff --git a/node_modules/dop-engine-v3/dist/dop-engine.js b/node_modules/dop-engine-v3/dist/dop-engine.js
|
|
14
|
+
index d1e96e8..31c592d 100644
|
|
15
|
+
--- a/node_modules/dop-engine-v3/dist/dop-engine.js
|
|
16
|
+
+++ b/node_modules/dop-engine-v3/dist/dop-engine.js
|
|
17
|
+
@@ -254,14 +254,17 @@ class DopEngine extends events_1.default {
|
|
18
|
+
}
|
|
19
|
+
async performQuickSync(txidVersion, chain, endProgress, retryCount = 0) {
|
|
20
|
+
try {
|
|
21
|
+
+ console.log("Starting quick sync...");
|
|
22
|
+
debugger_1.default.log(`[${txidVersion}] quickSync: chain ${chain.type}:${chain.id}`);
|
|
23
|
+
const utxoMerkletree = this.getUTXOMerkletree(txidVersion, chain);
|
|
24
|
+
const startScanningBlockQuickSync = await this.getStartScanningBlock(txidVersion, chain);
|
|
25
|
+
+ console.log(`Quick syncing UTXO merkletree for txid version ${txidVersion} on chain ${chain.type}:${chain.id} from block ${startScanningBlockQuickSync}...`);
|
|
26
|
+
debugger_1.default.log(`[${txidVersion}] Start scanning block for QuickSync: ${startScanningBlockQuickSync}`);
|
|
27
|
+
this.emitUTXOMerkletreeScanUpdateEvent(txidVersion, chain, endProgress * 0.2); // 10% / 50%
|
|
28
|
+
// Fetch events
|
|
29
|
+
const { commitmentEvents, decryptEvents, nullifierEvents, dopTransactionEvents } = await this.quickSyncEvents(txidVersion, chain, startScanningBlockQuickSync);
|
|
30
|
+
if (dopTransactionEvents) {
|
|
31
|
+
+ console.log(`QuickSync dopTransactionEvents: ${dopTransactionEvents.length}`);
|
|
32
|
+
debugger_1.default.log(`[${txidVersion}] QuickSync dopTransactionEvents: ${dopTransactionEvents.length}`);
|
|
33
|
+
await this.handleNewDopTransactionsV3(txidVersion, chain, dopTransactionEvents);
|
|
34
|
+
}
|
|
35
|
+
@@ -269,6 +272,7 @@ class DopEngine extends events_1.default {
|
|
36
|
+
await this.decryptListener(txidVersion, chain, decryptEvents);
|
|
37
|
+
this.emitUTXOMerkletreeScanUpdateEvent(txidVersion, chain, endProgress * 0.5); // 25% / 50%
|
|
38
|
+
await this.nullifierListener(txidVersion, chain, nullifierEvents);
|
|
39
|
+
+ console.log(`QuickSync commitmentEvents: ${commitmentEvents.length}`);
|
|
40
|
+
debugger_1.default.log(`[${txidVersion}] QuickSync commitments: ${commitmentEvents.length}`);
|
|
41
|
+
// Make sure commitments are scanned after Decrypts and Nullifiers.
|
|
42
|
+
await this.commitmentListener(txidVersion, chain, commitmentEvents, false, // shouldUpdateTrees - wait until after all commitments added
|
|
43
|
+
@@ -285,6 +289,7 @@ class DopEngine extends events_1.default {
|
|
44
|
+
await this.performQuickSync(txidVersion, chain, endProgress, retryCount + 1);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
+ console.error('Quick sync failed:', cause);
|
|
48
|
+
debugger_1.default.error(new Error('Failed to quick sync', { cause }));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
@@ -327,8 +332,10 @@ class DopEngine extends events_1.default {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
// eslint-disable-next-line no-await-in-loop
|
|
55
|
+
+ console.log(`Scanning UTXO history for txid version ${txidVersion} on chain ${chain.type}:${chain.id}...`);
|
|
56
|
+
await this.scanUTXOHistory(txidVersion, chain, walletIdFilter);
|
|
57
|
+
}
|
|
58
|
+
+ console.log("Finished scanning UTXO history");
|
|
59
|
+
await this.scanTXIDHistoryV2(chain);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
@@ -880,6 +887,7 @@ class DopEngine extends events_1.default {
|
|
63
|
+
await this.syncDopTransactionsV2(chain, 'reset after txid index');
|
|
64
|
+
}
|
|
65
|
+
static async validateMerkleroot(txidVersion, chain, tree, _index, merkleroot) {
|
|
66
|
+
+
|
|
67
|
+
switch (txidVersion) {
|
|
68
|
+
case poi_types_1.TXIDVersion.V2_PoseidonMerkle:
|
|
69
|
+
return contract_store_1.ContractStore.dopSmartWalletContracts
|
|
70
|
+
@@ -901,7 +909,9 @@ class DopEngine extends events_1.default {
|
|
71
|
+
*/
|
|
72
|
+
async loadNetwork(chain, dopSmartWalletContractAddress, relayAdaptV2ContractAddress, poseidonMerkleAccumulatorV3Address, poseidonMerkleVerifierV3Address, tokenVaultV3Address, defaultProvider, pollingProvider, deploymentBlocks, supportsV3) {
|
|
73
|
+
debugger_1.default.log(`loadNetwork: ${chain.type}:${chain.id}`);
|
|
74
|
+
+ console.log(`Loading network: ${chain.type}:${chain.id}`);
|
|
75
|
+
try {
|
|
76
|
+
+ console.log(`Waiting for default RPC provider to connect...`);
|
|
77
|
+
await (0, promises_1.promiseTimeout)(defaultProvider.getBlockNumber(), 60_000, 'Timed out waiting for default RPC provider to connect.');
|
|
78
|
+
}
|
|
79
|
+
catch (cause) {
|
|
80
|
+
@@ -946,14 +956,19 @@ class DopEngine extends events_1.default {
|
|
81
|
+
contract_store_1.ContractStore.poseidonMerkleVerifierV3Contracts.set(null, chain, new poseidon_merkle_verifier_1.PoseidonMerkleVerifierContract(poseidonMerkleVerifierV3Address, defaultProvider));
|
|
82
|
+
contract_store_1.ContractStore.tokenVaultV3Contracts.set(null, chain, new token_vault_contract_1.TokenVaultContract(tokenVaultV3Address, defaultProvider));
|
|
83
|
+
}
|
|
84
|
+
+ console.log(`Setting up merkletrees for ${chain.type}:${chain.id} ACTIVE_TXID_VERSIONS=${poi_types_1.ACTIVE_TXID_VERSIONS.join(', ')} `);
|
|
85
|
+
for (const txidVersion of poi_types_1.ACTIVE_UTXO_MERKLETREE_TXID_VERSIONS) {
|
|
86
|
+
// eslint-disable-next-line no-await-in-loop
|
|
87
|
+
+ console.log(`Setting up UTXO merkletree for ${chain.type}:${chain.id} - ${txidVersion}`);
|
|
88
|
+
+ console.log(`Validating UTXO merkleroot for ${chain.type}:${chain.id} - ${txidVersion}`);
|
|
89
|
+
const utxoMerkletree = await utxo_merkletree_1.UTXOMerkletree.create(this.db, chain, txidVersion,
|
|
90
|
+
// eslint-disable-next-line @typescript-eslint/no-shadow
|
|
91
|
+
(txidVersion, chain, tree, index, merkleroot) => DopEngine.validateMerkleroot(txidVersion, chain, tree, index, merkleroot));
|
|
92
|
+
+ console.log(`UTXO merkletree created for ${chain.type}:${chain.id} - ${txidVersion}`);
|
|
93
|
+
this.utxoMerkletrees.set(txidVersion, chain, utxoMerkletree);
|
|
94
|
+
// Load utxo merkletree to all wallets
|
|
95
|
+
// eslint-disable-next-line no-await-in-loop
|
|
96
|
+
+ console.log(`Loading UTXO merkletree to wallets for ${chain.type}:${chain.id} - ${txidVersion}`);
|
|
97
|
+
await Promise.all(Object.values(this.wallets).map(async (wallet) => {
|
|
98
|
+
await wallet.loadUTXOMerkletree(txidVersion, utxoMerkletree);
|
|
99
|
+
}));
|
|
100
|
+
@@ -962,6 +977,7 @@ class DopEngine extends events_1.default {
|
|
101
|
+
// Wallet Txid merkletree
|
|
102
|
+
const autoValidate = async () => true;
|
|
103
|
+
// eslint-disable-next-line no-await-in-loop
|
|
104
|
+
+ console.log(`Setting up TXID merkletree for ${chain.type}:${chain.id} - ${txidVersion}`);
|
|
105
|
+
txidMerkletree = await txid_merkletree_1.TXIDMerkletree.createForWallet(this.db, chain, txidVersion,
|
|
106
|
+
// For V3, we receive events in realtime, and validation is done via on-chain verificationHash field.
|
|
107
|
+
supportsV3 ? autoValidate : this.validateDopTxidMerkleroot);
|
|
108
|
+
@@ -978,6 +994,7 @@ class DopEngine extends events_1.default {
|
|
109
|
+
if (this.skipMerkletreeScans) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
+ console.log(`Setting up merkletrees for ${chain.type}:${chain.id}`);
|
|
113
|
+
// Set up listeners
|
|
114
|
+
const commitmentListener = async (txidVersion, commitmentEvents) => {
|
|
115
|
+
await this.commitmentListener(txidVersion, chain, commitmentEvents, true, // shouldUpdateTrees
|
|
116
|
+
@@ -990,6 +1007,7 @@ class DopEngine extends events_1.default {
|
|
117
|
+
false);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
+ console.log(`Setting commitment listener for ${chain.type}:${chain.id}`);
|
|
121
|
+
const nullifierListener = async (txidVersion, nullifiers) => {
|
|
122
|
+
await this.nullifierListener(txidVersion, chain, nullifiers);
|
|
123
|
+
// Only start wallet balance decryption if utxoMerkletree is not already scanning
|
|
124
|
+
@@ -1003,6 +1021,7 @@ class DopEngine extends events_1.default {
|
|
125
|
+
const decryptListener = async (txidVersion, decrypts) => {
|
|
126
|
+
await this.decryptListener(txidVersion, chain, decrypts);
|
|
127
|
+
};
|
|
128
|
+
+ console.log(`Setting merkletree listeners for ${chain.type}:${chain.id}`);
|
|
129
|
+
await contract_store_1.ContractStore.dopSmartWalletContracts
|
|
130
|
+
.get(null, chain)
|
|
131
|
+
?.setTreeUpdateListeners(commitmentListener, nullifierListener, decryptListener);
|
|
132
|
+
@@ -1025,6 +1044,7 @@ class DopEngine extends events_1.default {
|
|
133
|
+
false);
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
+ console.log(`Setting V3 merkletree listeners for ${chain.type}:${chain.id}`);
|
|
137
|
+
await contract_store_1.ContractStore.poseidonMerkleAccumulatorV3Contracts
|
|
138
|
+
.get(null, chain)
|
|
139
|
+
?.setTreeUpdateListeners(commitmentListenerV3, // No wallet scans
|
|
140
|
+
@@ -1293,7 +1313,9 @@ class DopEngine extends events_1.default {
|
|
141
|
+
* @returns id
|
|
142
|
+
*/
|
|
143
|
+
async createWalletFromMnemonic(encryptionKey, mnemonic, index = 0, creationBlockNumbers = undefined) {
|
|
144
|
+
+ console.log('Creating wallet from mnemonic...');
|
|
145
|
+
const wallet = await dop_wallet_1.DopWallet.fromMnemonic(this.db, encryptionKey, mnemonic, index, creationBlockNumbers, this.prover);
|
|
146
|
+
+ console.log('Wallet created. Loading wallet...');
|
|
147
|
+
await this.loadWallet(wallet);
|
|
148
|
+
return wallet;
|
|
149
|
+
}
|
|
150
|
+
diff --git a/node_modules/dop-engine-v3/dist/merkletree/merkletree.js b/node_modules/dop-engine-v3/dist/merkletree/merkletree.js
|
|
151
|
+
index 8ca9cd7..aa1b812 100644
|
|
152
|
+
--- a/node_modules/dop-engine-v3/dist/merkletree/merkletree.js
|
|
153
|
+
+++ b/node_modules/dop-engine-v3/dist/merkletree/merkletree.js
|
|
154
|
+
@@ -272,9 +272,19 @@ class Merkletree {
|
|
155
|
+
}
|
|
156
|
+
async getMetadataFromStorage() {
|
|
157
|
+
const storedMetadata = await this.getMerkletreesMetadata();
|
|
158
|
+
+
|
|
159
|
+
if (!storedMetadata) {
|
|
160
|
+
+ console.warn('No metadata found, starting fresh');
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
+
|
|
164
|
+
+ // Validate metadata structure
|
|
165
|
+
+ if (typeof storedMetadata !== 'object' || !storedMetadata.trees) {
|
|
166
|
+
+ console.warn('Invalid metadata format (expected object with trees property), got:', typeof storedMetadata, storedMetadata);
|
|
167
|
+
+ console.log('Clearing corrupted metadata and starting fresh');
|
|
168
|
+
+ return;
|
|
169
|
+
+ }
|
|
170
|
+
+
|
|
171
|
+
const treeKeys = Object.keys(storedMetadata.trees);
|
|
172
|
+
for (const treeKey of treeKeys) {
|
|
173
|
+
const tree = Number(treeKey);
|
|
174
|
+
@@ -292,10 +302,17 @@ class Merkletree {
|
|
175
|
+
*/
|
|
176
|
+
async getMerkletreesMetadata() {
|
|
177
|
+
try {
|
|
178
|
+
- const metadata = msgpack_lite_1.default.decode(bytes_1.ByteUtils.arrayify((await this.db.get(this.getMerkletreeDBPrefix()))));
|
|
179
|
+
+ const rawData = await this.db.get(this.getMerkletreeDBPrefix());
|
|
180
|
+
+ if (rawData == null || rawData === undefined) {
|
|
181
|
+
+ console.warn('No merkletree metadata found in DB (first time setup)');
|
|
182
|
+
+ return undefined;
|
|
183
|
+
+ }
|
|
184
|
+
+ const metadata = msgpack_lite_1.default.decode(bytes_1.ByteUtils.arrayify(rawData));
|
|
185
|
+
+ console.log('Successfully decoded merkletree metadata');
|
|
186
|
+
return metadata;
|
|
187
|
+
}
|
|
188
|
+
- catch {
|
|
189
|
+
+ catch (err) {
|
|
190
|
+
+ console.log('Error fetching merkletree metadata:', err);
|
|
191
|
+
return undefined;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
1
194
|
diff --git a/node_modules/dop-engine-v3/dist/utils/keys-utils.js b/node_modules/dop-engine-v3/dist/utils/keys-utils.js
|
|
2
|
-
index c6e9aca..
|
|
195
|
+
index c6e9aca..dd634ae 100644
|
|
3
196
|
--- a/node_modules/dop-engine-v3/dist/utils/keys-utils.js
|
|
4
197
|
+++ b/node_modules/dop-engine-v3/dist/utils/keys-utils.js
|
|
5
|
-
@@ -7,
|
|
198
|
+
@@ -7,11 +7,30 @@ const poseidon_1 = require("./poseidon");
|
|
6
199
|
const bytes_1 = require("./bytes");
|
|
7
200
|
const hash_1 = require("./hash");
|
|
8
201
|
const scalar_multiply_1 = require("./scalar-multiply");
|
|
@@ -10,7 +203,64 @@ index c6e9aca..653041a 100644
|
|
|
10
203
|
+
|
|
11
204
|
+ed25519_1.utils.sha512 = hashes.sha512;
|
|
12
205
|
+ed25519_1.utils.sha512Async = (m) => Promise.resolve(hashes.sha512(m));
|
|
206
|
+
+
|
|
207
|
+
+// Helper function to convert Uint8Array to Buffer without causing React Native issues
|
|
208
|
+
+// This handles the case where Buffer polyfill may not work properly with Uint8Array
|
|
209
|
+
+function safeUint8ArrayToBuffer(uint8Array) {
|
|
210
|
+
+ if (Buffer.isBuffer(uint8Array)) {
|
|
211
|
+
+ return uint8Array;
|
|
212
|
+
+ }
|
|
213
|
+
+ // Create buffer using array notation instead of Buffer.from to avoid to-buffer module issues
|
|
214
|
+
+ const buffer = Buffer.allocUnsafe(uint8Array.length);
|
|
215
|
+
+ for (let i = 0; i < uint8Array.length; i++) {
|
|
216
|
+
+ buffer[i] = uint8Array[i];
|
|
217
|
+
+ }
|
|
218
|
+
+ return buffer;
|
|
219
|
+
+}
|
|
13
220
|
+
|
|
14
221
|
const { bytesToHex, randomBytes } = ed25519_1.utils;
|
|
15
222
|
function getPublicSpendingKey(privateKey) {
|
|
16
223
|
if (privateKey.length !== 32)
|
|
224
|
+
throw Error('Invalid private key length');
|
|
225
|
+
- return circomlibjs_1.eddsa.prv2pub(Buffer.from(privateKey));
|
|
226
|
+
+ return circomlibjs_1.eddsa.prv2pub(safeUint8ArrayToBuffer(privateKey));
|
|
227
|
+
}
|
|
228
|
+
exports.getPublicSpendingKey = getPublicSpendingKey;
|
|
229
|
+
async function getPublicViewingKey(privateViewingKey) {
|
|
230
|
+
@@ -23,7 +42,7 @@ function getRandomScalar() {
|
|
231
|
+
}
|
|
232
|
+
exports.getRandomScalar = getRandomScalar;
|
|
233
|
+
function signEDDSA(privateKey, message) {
|
|
234
|
+
- return circomlibjs_1.eddsa.signPoseidon(Buffer.from(privateKey), message);
|
|
235
|
+
+ return circomlibjs_1.eddsa.signPoseidon(safeUint8ArrayToBuffer(privateKey), message);
|
|
236
|
+
}
|
|
237
|
+
exports.signEDDSA = signEDDSA;
|
|
238
|
+
function verifyEDDSA(message, signature, pubkey) {
|
|
239
|
+
diff --git a/node_modules/dop-engine-v3/dist/wallet/abstract-wallet.js b/node_modules/dop-engine-v3/dist/wallet/abstract-wallet.js
|
|
240
|
+
index f80d71f..d7b13da 100644
|
|
241
|
+
--- a/node_modules/dop-engine-v3/dist/wallet/abstract-wallet.js
|
|
242
|
+
+++ b/node_modules/dop-engine-v3/dist/wallet/abstract-wallet.js
|
|
243
|
+
@@ -1695,6 +1695,7 @@ class AbstractWallet extends events_1.default {
|
|
244
|
+
return msgpack_lite_1.default.decode(bytes_1.ByteUtils.fastHexToBytes(await db.getEncrypted(AbstractWallet.dbPath(id), encryptionKey)));
|
|
245
|
+
}
|
|
246
|
+
static async write(db, id, encryptionKey, data) {
|
|
247
|
+
+ console.log('Writing wallet data to db...');
|
|
248
|
+
await db.putEncrypted(AbstractWallet.dbPath(id), encryptionKey, msgpack_lite_1.default.encode(data));
|
|
249
|
+
}
|
|
250
|
+
static async delete(db, id) {
|
|
251
|
+
diff --git a/node_modules/dop-engine-v3/dist/wallet/dop-wallet.js b/node_modules/dop-engine-v3/dist/wallet/dop-wallet.js
|
|
252
|
+
index d0dcdad..55c1fad 100644
|
|
253
|
+
--- a/node_modules/dop-engine-v3/dist/wallet/dop-wallet.js
|
|
254
|
+
+++ b/node_modules/dop-engine-v3/dist/wallet/dop-wallet.js
|
|
255
|
+
@@ -63,7 +63,10 @@ class DopWallet extends abstract_wallet_1.AbstractWallet {
|
|
256
|
+
static async fromMnemonic(db, encryptionKey, mnemonic, index, creationBlockNumbers, prover) {
|
|
257
|
+
const id = DopWallet.generateID(mnemonic, index);
|
|
258
|
+
// Write encrypted mnemonic to DB
|
|
259
|
+
- await abstract_wallet_1.AbstractWallet.write(db, id, encryptionKey, { mnemonic, index, creationBlockNumbers });
|
|
260
|
+
+ try {
|
|
261
|
+
+ await abstract_wallet_1.AbstractWallet.write(db, id, encryptionKey, { mnemonic, index, creationBlockNumbers });
|
|
262
|
+
+ } catch (error) {
|
|
263
|
+
+ }
|
|
264
|
+
return this.createWallet(id, db, mnemonic, index, creationBlockNumbers, prover);
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
@@ -1,62 +0,0 @@
|
|
|
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;
|
|
@@ -1,217 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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();"]}
|