@aztec/txe 0.74.0 → 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dest/bin/index.js +3 -5
  2. package/dest/index.js +112 -64
  3. package/dest/node/txe_node.js +292 -338
  4. package/dest/oracle/txe_oracle.js +208 -147
  5. package/dest/txe_service/txe_service.js +194 -118
  6. package/dest/util/encoding.js +16 -7
  7. package/dest/util/expected_failure_error.js +1 -2
  8. package/dest/util/txe_database.js +5 -9
  9. package/dest/util/txe_public_contract_data_source.js +21 -12
  10. package/dest/util/txe_world_state_db.js +7 -8
  11. package/package.json +14 -15
  12. package/src/index.ts +109 -35
  13. package/src/node/txe_node.ts +4 -0
  14. package/src/oracle/txe_oracle.ts +8 -29
  15. package/src/txe_service/txe_service.ts +14 -46
  16. package/src/util/encoding.ts +3 -3
  17. package/dest/bin/index.d.ts +0 -3
  18. package/dest/bin/index.d.ts.map +0 -1
  19. package/dest/index.d.ts +0 -8
  20. package/dest/index.d.ts.map +0 -1
  21. package/dest/node/txe_node.d.ts +0 -354
  22. package/dest/node/txe_node.d.ts.map +0 -1
  23. package/dest/oracle/txe_oracle.d.ts +0 -132
  24. package/dest/oracle/txe_oracle.d.ts.map +0 -1
  25. package/dest/txe_service/txe_service.d.ts +0 -204
  26. package/dest/txe_service/txe_service.d.ts.map +0 -1
  27. package/dest/util/encoding.d.ts +0 -29
  28. package/dest/util/encoding.d.ts.map +0 -1
  29. package/dest/util/expected_failure_error.d.ts +0 -4
  30. package/dest/util/expected_failure_error.d.ts.map +0 -1
  31. package/dest/util/txe_database.d.ts +0 -10
  32. package/dest/util/txe_database.d.ts.map +0 -1
  33. package/dest/util/txe_public_contract_data_source.d.ts +0 -18
  34. package/dest/util/txe_public_contract_data_source.d.ts.map +0 -1
  35. package/dest/util/txe_world_state_db.d.ts +0 -16
  36. package/dest/util/txe_world_state_db.d.ts.map +0 -1
@@ -1,11 +1,9 @@
1
- var _TXE_instances, _TXE_calculateAppTaggingSecret;
2
- import { __classPrivateFieldGet } from "tslib";
3
- import { AuthWitness, Body, L2Block, MerkleTreeId, Note, NullifierMembershipWitness, PublicDataWitness, PublicExecutionRequest, SimulationError, TxEffect, TxHash, } from '@aztec/circuit-types';
4
- import { AppendOnlyTreeSnapshot, BlockHeader, CallContext, DEPLOYER_CONTRACT_ADDRESS, Gas, GasFees, GlobalVariables, IndexedTaggingSecret, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, NULLIFIER_SUBTREE_HEIGHT, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, PRIVATE_CONTEXT_INPUTS_LENGTH, PUBLIC_DISPATCH_SELECTOR, PrivateContextInputs, PublicDataTreeLeaf, PublicDataWrite, computeContractClassId, computeTaggingSecretPoint, deriveKeys, getContractClassFromArtifact, } from '@aztec/circuits.js';
1
+ import { AuthWitness, Body, L2Block, MerkleTreeId, Note, NullifierMembershipWitness, PublicDataWitness, PublicExecutionRequest, SimulationError, TxEffect, TxHash } from '@aztec/circuit-types';
2
+ import { AppendOnlyTreeSnapshot, BlockHeader, CallContext, Gas, GasFees, GlobalVariables, IndexedTaggingSecret, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, NULLIFIER_SUBTREE_HEIGHT, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, PRIVATE_CONTEXT_INPUTS_LENGTH, PUBLIC_DISPATCH_SELECTOR, PrivateContextInputs, PublicDataTreeLeaf, PublicDataWrite, computeTaggingSecretPoint, deriveKeys } from '@aztec/circuits.js';
5
3
  import { Schnorr } from '@aztec/circuits.js/barretenberg';
6
- import { computeNoteHashNonce, computePublicDataTreeLeafSlot, computeUniqueNoteHash, siloNoteHash, siloNullifier, } from '@aztec/circuits.js/hash';
7
- import { makeAppendOnlyTreeSnapshot, makeContentCommitment, makeGlobalVariables, makeHeader, } from '@aztec/circuits.js/testing';
8
- import { FunctionSelector, countArgumentsSize, } from '@aztec/foundation/abi';
4
+ import { computeNoteHashNonce, computePublicDataTreeLeafSlot, computeUniqueNoteHash, siloNoteHash, siloNullifier } from '@aztec/circuits.js/hash';
5
+ import { makeAppendOnlyTreeSnapshot, makeContentCommitment, makeGlobalVariables, makeHeader } from '@aztec/circuits.js/testing';
6
+ import { FunctionSelector, countArgumentsSize } from '@aztec/foundation/abi';
9
7
  import { AztecAddress } from '@aztec/foundation/aztec-address';
10
8
  import { padArrayEnd } from '@aztec/foundation/collection';
11
9
  import { poseidon2Hash } from '@aztec/foundation/crypto';
@@ -13,15 +11,42 @@ import { Fr } from '@aztec/foundation/fields';
13
11
  import { applyStringFormatting, createDebugOnlyLogger } from '@aztec/foundation/log';
14
12
  import { Timer } from '@aztec/foundation/timer';
15
13
  import { ContractDataOracle, SimulatorOracle, enrichPublicSimulationError } from '@aztec/pxe';
16
- import { ExecutionNoteCache, Oracle, WASMSimulator, extractCallStack, extractPrivateCircuitPublicInputs, pickNotes, toACVMWitness, witnessMapToFields, } from '@aztec/simulator/client';
14
+ import { ExecutionNoteCache, Oracle, WASMSimulator, extractCallStack, extractPrivateCircuitPublicInputs, pickNotes, toACVMWitness, witnessMapToFields } from '@aztec/simulator/client';
17
15
  import { createTxForPublicCalls } from '@aztec/simulator/public/fixtures';
18
- import { ExecutionError, PublicTxSimulator, createSimulationError, resolveAssertionMessageFromError, } from '@aztec/simulator/server';
16
+ import { ExecutionError, PublicTxSimulator, createSimulationError, resolveAssertionMessageFromError } from '@aztec/simulator/server';
19
17
  import { TXENode } from '../node/txe_node.js';
20
18
  import { TXEPublicContractDataSource } from '../util/txe_public_contract_data_source.js';
21
19
  import { TXEWorldStateDB } from '../util/txe_world_state_db.js';
22
20
  export class TXE {
23
- constructor(logger, executionCache, keyStore, txeDatabase, contractAddress, nativeWorldStateService, baseFork) {
24
- _TXE_instances.add(this);
21
+ logger;
22
+ executionCache;
23
+ keyStore;
24
+ txeDatabase;
25
+ contractAddress;
26
+ nativeWorldStateService;
27
+ baseFork;
28
+ blockNumber;
29
+ sideEffectCounter;
30
+ msgSender;
31
+ functionSelector;
32
+ isStaticCall;
33
+ // Return/revert data of the latest nested call.
34
+ nestedCallReturndata;
35
+ contractDataOracle;
36
+ simulatorOracle;
37
+ publicDataWrites;
38
+ uniqueNoteHashesFromPublic;
39
+ siloedNullifiersFromPublic;
40
+ privateLogs;
41
+ publicLogs;
42
+ committedBlocks;
43
+ VERSION;
44
+ CHAIN_ID;
45
+ node;
46
+ simulationProvider;
47
+ noteCache;
48
+ debug;
49
+ constructor(logger, executionCache, keyStore, txeDatabase, contractAddress, nativeWorldStateService, baseFork){
25
50
  this.logger = logger;
26
51
  this.executionCache = executionCache;
27
52
  this.keyStore = keyStore;
@@ -33,7 +58,6 @@ export class TXE {
33
58
  this.sideEffectCounter = 0;
34
59
  this.functionSelector = FunctionSelector.fromField(new Fr(0));
35
60
  this.isStaticCall = false;
36
- // Return/revert data of the latest nested call.
37
61
  this.nestedCallReturndata = [];
38
62
  this.publicDataWrites = [];
39
63
  this.uniqueNoteHashesFromPublic = [];
@@ -63,10 +87,10 @@ export class TXE {
63
87
  return this.baseFork;
64
88
  }
65
89
  getChainId() {
66
- return Promise.resolve(this.node.getChainId().then(id => new Fr(id)));
90
+ return Promise.resolve(this.node.getChainId().then((id)=>new Fr(id)));
67
91
  }
68
92
  getVersion() {
69
- return Promise.resolve(this.node.getVersion().then(v => new Fr(v)));
93
+ return Promise.resolve(this.node.getVersion().then((v)=>new Fr(v)));
70
94
  }
71
95
  getMsgSender() {
72
96
  return this.msgSender;
@@ -105,15 +129,13 @@ export class TXE {
105
129
  async addContractInstance(contractInstance) {
106
130
  await this.txeDatabase.addContractInstance(contractInstance);
107
131
  }
108
- async addContractArtifact(artifact) {
109
- const contractClass = await getContractClassFromArtifact(artifact);
110
- await this.txeDatabase.addContractArtifact(await computeContractClassId(contractClass), artifact);
132
+ async addContractArtifact(contractClassId, artifact) {
133
+ await this.txeDatabase.addContractArtifact(contractClassId, artifact);
111
134
  }
112
135
  async getPrivateContextInputs(blockNumber, sideEffectsCounter = this.sideEffectCounter, isStaticCall = false) {
113
136
  if (blockNumber > this.blockNumber) {
114
137
  throw new Error(`Tried to request private context inputs for ${blockNumber}, which is greater than our current block number of ${this.blockNumber}`);
115
- }
116
- else if (blockNumber === this.blockNumber) {
138
+ } else if (blockNumber === this.blockNumber) {
117
139
  this.logger.debug(`Tried to request private context inputs for ${blockNumber}, equal to current block of ${this.blockNumber}. Clamping to current block - 1.`);
118
140
  blockNumber = this.blockNumber - 1;
119
141
  }
@@ -138,18 +160,20 @@ export class TXE {
138
160
  const privateKey = await this.keyStore.getMasterSecretKey(account.publicKeys.masterIncomingViewingPublicKey);
139
161
  const schnorr = new Schnorr();
140
162
  const signature = await schnorr.constructSignature(messageHash.toBuffer(), privateKey);
141
- const authWitness = new AuthWitness(messageHash, [...signature.toBuffer()]);
163
+ const authWitness = new AuthWitness(messageHash, [
164
+ ...signature.toBuffer()
165
+ ]);
142
166
  return this.txeDatabase.addAuthWitness(authWitness.requestHash, authWitness.witness);
143
167
  }
144
168
  async addPublicDataWrites(writes) {
145
169
  this.publicDataWrites.push(...writes);
146
- await this.baseFork.sequentialInsert(MerkleTreeId.PUBLIC_DATA_TREE, writes.map(w => new PublicDataTreeLeaf(w.leafSlot, w.value).toBuffer()));
170
+ await this.baseFork.sequentialInsert(MerkleTreeId.PUBLIC_DATA_TREE, writes.map((w)=>new PublicDataTreeLeaf(w.leafSlot, w.value).toBuffer()));
147
171
  }
148
172
  async checkNullifiersNotInTree(contractAddress, nullifiers) {
149
- const siloedNullifiers = await Promise.all(nullifiers.map(nullifier => siloNullifier(contractAddress, nullifier)));
173
+ const siloedNullifiers = await Promise.all(nullifiers.map((nullifier)=>siloNullifier(contractAddress, nullifier)));
150
174
  const db = this.baseFork;
151
- const nullifierIndexesInTree = await db.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, siloedNullifiers.map(n => n.toBuffer()));
152
- if (nullifierIndexesInTree.some(index => index !== undefined)) {
175
+ const nullifierIndexesInTree = await db.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, siloedNullifiers.map((n)=>n.toBuffer()));
176
+ if (nullifierIndexesInTree.some((index)=>index !== undefined)) {
153
177
  throw new Error(`Rejecting tx for emitting duplicate nullifiers`);
154
178
  }
155
179
  }
@@ -160,20 +184,22 @@ export class TXE {
160
184
  this.uniqueNoteHashesFromPublic.push(...siloedNoteHashes);
161
185
  }
162
186
  async addPrivateLogs(contractAddress, privateLogs) {
163
- for (const privateLog of privateLogs) {
164
- privateLog.fields[0] = await poseidon2Hash([contractAddress, privateLog.fields[0]]);
187
+ for (const privateLog of privateLogs){
188
+ privateLog.fields[0] = await poseidon2Hash([
189
+ contractAddress,
190
+ privateLog.fields[0]
191
+ ]);
165
192
  }
166
193
  this.privateLogs.push(...privateLogs);
167
194
  }
168
195
  addPublicLogs(logs) {
169
- logs.forEach(log => {
196
+ logs.forEach((log)=>{
170
197
  try {
171
198
  // The first elt stores lengths => tag is in fields[1]
172
199
  const tag = log.log[1];
173
200
  this.logger.verbose(`Found tagged public log with tag ${tag.toString()} in block ${this.blockNumber}`);
174
201
  this.publicLogs.push(log);
175
- }
176
- catch (err) {
202
+ } catch (err) {
177
203
  this.logger.warn(`Failed to add tagged log to store: ${err}`);
178
204
  }
179
205
  });
@@ -212,12 +238,17 @@ export class TXE {
212
238
  }
213
239
  async getMembershipWitness(blockNumber, treeId, leafValue) {
214
240
  const snap = this.nativeWorldStateService.getSnapshot(blockNumber);
215
- const index = (await snap.findLeafIndices(treeId, [leafValue.toBuffer()]))[0];
241
+ const index = (await snap.findLeafIndices(treeId, [
242
+ leafValue.toBuffer()
243
+ ]))[0];
216
244
  if (index === undefined) {
217
245
  throw new Error(`Leaf value: ${leafValue} not found in ${MerkleTreeId[treeId]} at block ${blockNumber}`);
218
246
  }
219
247
  const siblingPath = await snap.getSiblingPath(treeId, index);
220
- return [new Fr(index), ...siblingPath.toFields()];
248
+ return [
249
+ new Fr(index),
250
+ ...siblingPath.toFields()
251
+ ];
221
252
  }
222
253
  async getSiblingPath(blockNumber, treeId, leafIndex) {
223
254
  const snap = this.nativeWorldStateService.getSnapshot(blockNumber);
@@ -226,13 +257,18 @@ export class TXE {
226
257
  }
227
258
  async getNullifierMembershipWitness(blockNumber, nullifier) {
228
259
  const snap = this.nativeWorldStateService.getSnapshot(blockNumber);
229
- const [index] = await snap.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, [nullifier.toBuffer()]);
260
+ const [index] = await snap.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, [
261
+ nullifier.toBuffer()
262
+ ]);
230
263
  if (!index) {
231
264
  return undefined;
232
265
  }
233
266
  const leafPreimagePromise = snap.getLeafPreimage(MerkleTreeId.NULLIFIER_TREE, index);
234
267
  const siblingPathPromise = snap.getSiblingPath(MerkleTreeId.NULLIFIER_TREE, BigInt(index));
235
- const [leafPreimage, siblingPath] = await Promise.all([leafPreimagePromise, siblingPathPromise]);
268
+ const [leafPreimage, siblingPath] = await Promise.all([
269
+ leafPreimagePromise,
270
+ siblingPathPromise
271
+ ]);
236
272
  if (!leafPreimage) {
237
273
  return undefined;
238
274
  }
@@ -243,9 +279,8 @@ export class TXE {
243
279
  const lowLeafResult = await snap.getPreviousValueIndex(MerkleTreeId.PUBLIC_DATA_TREE, leafSlot.toBigInt());
244
280
  if (!lowLeafResult) {
245
281
  return undefined;
246
- }
247
- else {
248
- const preimage = (await snap.getLeafPreimage(MerkleTreeId.PUBLIC_DATA_TREE, lowLeafResult.index));
282
+ } else {
283
+ const preimage = await snap.getLeafPreimage(MerkleTreeId.PUBLIC_DATA_TREE, lowLeafResult.index);
249
284
  const path = await snap.getSiblingPath(MerkleTreeId.PUBLIC_DATA_TREE, lowLeafResult.index);
250
285
  return new PublicDataWitness(lowLeafResult.index, preimage, path);
251
286
  }
@@ -260,7 +295,7 @@ export class TXE {
260
295
  if (alreadyPresent) {
261
296
  this.logger.warn(`Nullifier ${nullifier.toBigInt()} already exists in the tree`);
262
297
  }
263
- const preimageData = (await snap.getLeafPreimage(MerkleTreeId.NULLIFIER_TREE, index));
298
+ const preimageData = await snap.getLeafPreimage(MerkleTreeId.NULLIFIER_TREE, index);
264
299
  const siblingPath = await snap.getSiblingPath(MerkleTreeId.NULLIFIER_TREE, BigInt(index));
265
300
  return new NullifierMembershipWitness(BigInt(index), preimageData, siblingPath);
266
301
  }
@@ -274,6 +309,7 @@ export class TXE {
274
309
  const previousState = this.nativeWorldStateService.getSnapshot(blockNumber - 1);
275
310
  const archiveInfo = await previousState.getTreeInfo(MerkleTreeId.ARCHIVE);
276
311
  const header = new BlockHeader(new AppendOnlyTreeSnapshot(new Fr(archiveInfo.root), Number(archiveInfo.size)), makeContentCommitment(), stateReference, makeGlobalVariables(), Fr.ZERO, Fr.ZERO);
312
+ header.globalVariables.blockNumber = new Fr(blockNumber);
277
313
  return header;
278
314
  }
279
315
  getCompleteAddress(account) {
@@ -290,23 +326,32 @@ export class TXE {
290
326
  const pendingNotes = this.noteCache.getNotes(this.contractAddress, storageSlot);
291
327
  const pendingNullifiers = this.noteCache.getNullifiers(this.contractAddress);
292
328
  const dbNotes = await this.simulatorOracle.getNotes(this.contractAddress, storageSlot, status);
293
- const dbNotesFiltered = dbNotes.filter(n => !pendingNullifiers.has(n.siloedNullifier.value));
294
- const notes = pickNotes([...dbNotesFiltered, ...pendingNotes], {
295
- selects: selectByIndexes.slice(0, numSelects).map((index, i) => ({
296
- selector: { index, offset: selectByOffsets[i], length: selectByLengths[i] },
297
- value: selectValues[i],
298
- comparator: selectComparators[i],
299
- })),
300
- sorts: sortByIndexes.map((index, i) => ({
301
- selector: { index, offset: sortByOffsets[i], length: sortByLengths[i] },
302
- order: sortOrder[i],
303
- })),
329
+ const dbNotesFiltered = dbNotes.filter((n)=>!pendingNullifiers.has(n.siloedNullifier.value));
330
+ const notes = pickNotes([
331
+ ...dbNotesFiltered,
332
+ ...pendingNotes
333
+ ], {
334
+ selects: selectByIndexes.slice(0, numSelects).map((index, i)=>({
335
+ selector: {
336
+ index,
337
+ offset: selectByOffsets[i],
338
+ length: selectByLengths[i]
339
+ },
340
+ value: selectValues[i],
341
+ comparator: selectComparators[i]
342
+ })),
343
+ sorts: sortByIndexes.map((index, i)=>({
344
+ selector: {
345
+ index,
346
+ offset: sortByOffsets[i],
347
+ length: sortByLengths[i]
348
+ },
349
+ order: sortOrder[i]
350
+ })),
304
351
  limit,
305
- offset,
352
+ offset
306
353
  });
307
- this.logger.debug(`Returning ${notes.length} notes for ${this.contractAddress} at ${storageSlot}: ${notes
308
- .map(n => `${n.nonce.toString()}:[${n.note.items.map(i => i.toString()).join(',')}]`)
309
- .join(', ')}`);
354
+ this.logger.debug(`Returning ${notes.length} notes for ${this.contractAddress} at ${storageSlot}: ${notes.map((n)=>`${n.nonce.toString()}:[${n.note.items.map((i)=>i.toString()).join(',')}]`).join(', ')}`);
310
355
  return notes;
311
356
  }
312
357
  notifyCreatedNote(storageSlot, _noteTypeId, noteItems, noteHash, counter) {
@@ -314,27 +359,33 @@ export class TXE {
314
359
  this.noteCache.addNewNote({
315
360
  contractAddress: this.contractAddress,
316
361
  storageSlot,
317
- nonce: Fr.ZERO, // Nonce cannot be known during private execution.
362
+ nonce: Fr.ZERO,
318
363
  note,
319
- siloedNullifier: undefined, // Siloed nullifier cannot be known for newly created note.
320
- noteHash,
364
+ siloedNullifier: undefined,
365
+ noteHash
321
366
  }, counter);
322
367
  this.sideEffectCounter = counter + 1;
323
368
  return Promise.resolve();
324
369
  }
325
370
  async notifyNullifiedNote(innerNullifier, noteHash, counter) {
326
- await this.checkNullifiersNotInTree(this.contractAddress, [innerNullifier]);
371
+ await this.checkNullifiersNotInTree(this.contractAddress, [
372
+ innerNullifier
373
+ ]);
327
374
  await this.noteCache.nullifyNote(this.contractAddress, innerNullifier, noteHash);
328
375
  this.sideEffectCounter = counter + 1;
329
376
  }
330
377
  async notifyCreatedNullifier(innerNullifier) {
331
- await this.checkNullifiersNotInTree(this.contractAddress, [innerNullifier]);
378
+ await this.checkNullifiersNotInTree(this.contractAddress, [
379
+ innerNullifier
380
+ ]);
332
381
  await this.noteCache.nullifierCreated(this.contractAddress, innerNullifier);
333
382
  }
334
383
  async checkNullifierExists(innerNullifier) {
335
384
  const snap = this.nativeWorldStateService.getSnapshot(this.blockNumber - 1);
336
385
  const nullifier = await siloNullifier(this.contractAddress, innerNullifier);
337
- const [index] = await snap.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, [nullifier.toBuffer()]);
386
+ const [index] = await snap.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, [
387
+ nullifier.toBuffer()
388
+ ]);
338
389
  return index !== undefined;
339
390
  }
340
391
  getL1ToL2MembershipWitness(_contractAddress, _messageHash, _secret) {
@@ -344,18 +395,17 @@ export class TXE {
344
395
  let db;
345
396
  if (blockNumber === this.blockNumber) {
346
397
  db = this.baseFork;
347
- }
348
- else {
398
+ } else {
349
399
  db = this.nativeWorldStateService.getSnapshot(blockNumber);
350
400
  }
351
401
  const values = [];
352
- for (let i = 0n; i < numberOfElements; i++) {
402
+ for(let i = 0n; i < numberOfElements; i++){
353
403
  const storageSlot = startStorageSlot.add(new Fr(i));
354
404
  const leafSlot = (await computePublicDataTreeLeafSlot(contractAddress, storageSlot)).toBigInt();
355
405
  const lowLeafResult = await db.getPreviousValueIndex(MerkleTreeId.PUBLIC_DATA_TREE, leafSlot);
356
406
  let value = Fr.ZERO;
357
407
  if (lowLeafResult && lowLeafResult.alreadyPresent) {
358
- const preimage = (await db.getLeafPreimage(MerkleTreeId.PUBLIC_DATA_TREE, lowLeafResult.index));
408
+ const preimage = await db.getLeafPreimage(MerkleTreeId.PUBLIC_DATA_TREE, lowLeafResult.index);
359
409
  value = preimage.value;
360
410
  }
361
411
  this.logger.debug(`Oracle storage read: slot=${storageSlot.toString()} value=${value}`);
@@ -364,51 +414,56 @@ export class TXE {
364
414
  return values;
365
415
  }
366
416
  async storageWrite(startStorageSlot, values) {
367
- const publicDataWrites = await Promise.all(values.map(async (value, i) => {
417
+ const publicDataWrites = await Promise.all(values.map(async (value, i)=>{
368
418
  const storageSlot = startStorageSlot.add(new Fr(i));
369
419
  this.logger.debug(`Oracle storage write: slot=${storageSlot.toString()} value=${value}`);
370
420
  return new PublicDataWrite(await computePublicDataTreeLeafSlot(this.contractAddress, storageSlot), value);
371
421
  }));
372
422
  await this.addPublicDataWrites(publicDataWrites);
373
- return publicDataWrites.map(write => write.value);
423
+ return publicDataWrites.map((write)=>write.value);
374
424
  }
375
425
  async commitState() {
376
426
  const blockNumber = await this.getBlockNumber();
377
427
  const { usedTxRequestHashForNonces } = this.noteCache.finish();
378
428
  if (this.committedBlocks.has(blockNumber)) {
379
429
  throw new Error('Already committed state');
380
- }
381
- else {
430
+ } else {
382
431
  this.committedBlocks.add(blockNumber);
383
432
  }
384
433
  const fork = this.baseFork;
385
434
  const txEffect = TxEffect.empty();
386
435
  const nonceGenerator = usedTxRequestHashForNonces ? this.getTxRequestHash() : this.noteCache.getAllNullifiers()[0];
387
436
  let i = 0;
388
- const uniqueNoteHashesFromPrivate = await Promise.all(this.noteCache
389
- .getAllNotes()
390
- .map(async (pendingNote) => computeUniqueNoteHash(await computeNoteHashNonce(nonceGenerator, i++), await siloNoteHash(pendingNote.note.contractAddress, pendingNote.noteHashForConsumption))));
391
- txEffect.noteHashes = [...uniqueNoteHashesFromPrivate, ...this.uniqueNoteHashesFromPublic];
392
- txEffect.nullifiers = [...this.siloedNullifiersFromPublic, ...this.noteCache.getAllNullifiers()];
437
+ const uniqueNoteHashesFromPrivate = await Promise.all(this.noteCache.getAllNotes().map(async (pendingNote)=>computeUniqueNoteHash(await computeNoteHashNonce(nonceGenerator, i++), await siloNoteHash(pendingNote.note.contractAddress, pendingNote.noteHashForConsumption))));
438
+ txEffect.noteHashes = [
439
+ ...uniqueNoteHashesFromPrivate,
440
+ ...this.uniqueNoteHashesFromPublic
441
+ ];
442
+ txEffect.nullifiers = [
443
+ ...this.siloedNullifiersFromPublic,
444
+ ...this.noteCache.getAllNullifiers()
445
+ ];
393
446
  if (usedTxRequestHashForNonces) {
394
447
  txEffect.nullifiers.unshift(this.getTxRequestHash());
395
448
  }
396
449
  txEffect.publicDataWrites = this.publicDataWrites;
397
- const body = new Body([txEffect]);
450
+ const body = new Body([
451
+ txEffect
452
+ ]);
398
453
  const l2Block = new L2Block(makeAppendOnlyTreeSnapshot(blockNumber + 1), makeHeader(0, blockNumber, blockNumber), body);
399
454
  const paddedTxEffects = l2Block.body.txEffects;
400
455
  const l1ToL2Messages = Array(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP).fill(0).map(Fr.zero);
401
456
  {
402
- const noteHashesPadded = paddedTxEffects.flatMap(txEffect => padArrayEnd(txEffect.noteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX));
457
+ const noteHashesPadded = paddedTxEffects.flatMap((txEffect)=>padArrayEnd(txEffect.noteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX));
403
458
  await fork.appendLeaves(MerkleTreeId.NOTE_HASH_TREE, noteHashesPadded);
404
459
  await fork.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, l1ToL2Messages);
405
460
  }
406
461
  {
407
- for (const txEffect of paddedTxEffects) {
462
+ for (const txEffect of paddedTxEffects){
408
463
  // We do not need to add public data writes because we apply them as we go. We use the sequentialInsert because
409
464
  // the batchInsert was not working when updating a previously updated slot.
410
465
  const nullifiersPadded = padArrayEnd(txEffect.nullifiers, Fr.ZERO, MAX_NULLIFIERS_PER_TX);
411
- await fork.batchInsert(MerkleTreeId.NULLIFIER_TREE, nullifiersPadded.map(nullifier => nullifier.toBuffer()), NULLIFIER_SUBTREE_HEIGHT);
466
+ await fork.batchInsert(MerkleTreeId.NULLIFIER_TREE, nullifiersPadded.map((nullifier)=>nullifier.toBuffer()), NULLIFIER_SUBTREE_HEIGHT);
412
467
  }
413
468
  }
414
469
  await this.node.setTxEffect(blockNumber, new TxHash(new Fr(blockNumber)), txEffect);
@@ -418,6 +473,7 @@ export class TXE {
418
473
  const stateReference = await fork.getStateReference();
419
474
  const archiveInfo = await fork.getTreeInfo(MerkleTreeId.ARCHIVE);
420
475
  const header = new BlockHeader(new AppendOnlyTreeSnapshot(new Fr(archiveInfo.root), Number(archiveInfo.size)), makeContentCommitment(), stateReference, makeGlobalVariables(), Fr.ZERO, Fr.ZERO);
476
+ header.globalVariables.blockNumber = new Fr(blockNumber);
421
477
  l2Block.header = header;
422
478
  await fork.updateArchive(l2Block.header);
423
479
  await this.nativeWorldStateService.handleL2BlockAndMessages(l2Block, l1ToL2Messages);
@@ -449,14 +505,14 @@ export class TXE {
449
505
  const initialWitness = await this.getInitialWitness(artifact, argsHash, sideEffectCounter, isStaticCall);
450
506
  const acvmCallback = new Oracle(this);
451
507
  const timer = new Timer();
452
- const acirExecutionResult = await this.simulationProvider
453
- .executeUserCircuit(acir, initialWitness, acvmCallback)
454
- .catch((err) => {
508
+ const acirExecutionResult = await this.simulationProvider.executeUserCircuit(acir, initialWitness, acvmCallback).catch((err)=>{
455
509
  err.message = resolveAssertionMessageFromError(err, artifact);
456
510
  const execError = new ExecutionError(err.message, {
457
511
  contractAddress: targetContractAddress,
458
- functionSelector,
459
- }, extractCallStack(err, artifact.debug), { cause: err });
512
+ functionSelector
513
+ }, extractCallStack(err, artifact.debug), {
514
+ cause: err
515
+ });
460
516
  this.logger.debug(`Error executing private function ${targetContractAddress}:${functionSelector}`);
461
517
  throw createSimulationError(execError);
462
518
  });
@@ -469,16 +525,19 @@ export class TXE {
469
525
  eventName: 'circuit-witness-generation',
470
526
  inputSize: initialWitnessSize,
471
527
  outputSize: publicInputs.toBuffer().length,
472
- appCircuitName: 'noname',
528
+ appCircuitName: 'noname'
473
529
  });
474
530
  // Apply side effects
475
531
  const endSideEffectCounter = publicInputs.endSideEffectCounter;
476
532
  this.sideEffectCounter = endSideEffectCounter.toNumber() + 1;
477
- await this.addPrivateLogs(targetContractAddress, publicInputs.privateLogs.filter(privateLog => !privateLog.isEmpty()).map(privateLog => privateLog.log));
533
+ await this.addPrivateLogs(targetContractAddress, publicInputs.privateLogs.filter((privateLog)=>!privateLog.isEmpty()).map((privateLog)=>privateLog.log));
478
534
  this.setContractAddress(currentContractAddress);
479
535
  this.setMsgSender(currentMessageSender);
480
536
  this.setFunctionSelector(currentFunctionSelector);
481
- return { endSideEffectCounter, returnsHash: publicInputs.returnsHash };
537
+ return {
538
+ endSideEffectCounter,
539
+ returnsHash: publicInputs.returnsHash
540
+ };
482
541
  }
483
542
  async getInitialWitness(abi, argsHash, sideEffectCounter, isStaticCall) {
484
543
  const argumentsSize = countArgumentsSize(abi);
@@ -491,7 +550,10 @@ export class TXE {
491
550
  if (privateContextInputsAsFields.length !== PRIVATE_CONTEXT_INPUTS_LENGTH) {
492
551
  throw new Error('Invalid private context inputs size');
493
552
  }
494
- const fields = [...privateContextInputsAsFields, ...args];
553
+ const fields = [
554
+ ...privateContextInputsAsFields,
555
+ ...args
556
+ ];
495
557
  return toACVMWitness(0, fields);
496
558
  }
497
559
  async getDebugFunctionName(address, selector) {
@@ -503,11 +565,11 @@ export class TXE {
503
565
  if (!artifact) {
504
566
  return undefined;
505
567
  }
506
- const functionSelectorsAndNames = await Promise.all(artifact.functions.map(async (f) => ({
507
- name: f.name,
508
- selector: await FunctionSelector.fromNameAndParameters(f.name, f.parameters),
509
- })));
510
- const functionSelectorAndName = functionSelectorsAndNames.find(f => f.selector.equals(selector));
568
+ const functionSelectorsAndNames = await Promise.all(artifact.functions.map(async (f)=>({
569
+ name: f.name,
570
+ selector: await FunctionSelector.fromNameAndParameters(f.name, f.parameters)
571
+ })));
572
+ const functionSelectorAndName = functionSelectorsAndNames.find((f)=>f.selector.equals(selector));
511
573
  if (!functionSelectorAndName) {
512
574
  return undefined;
513
575
  }
@@ -516,41 +578,26 @@ export class TXE {
516
578
  async executePublicFunction(args, callContext, isTeardown = false) {
517
579
  const executionRequest = new PublicExecutionRequest(callContext, args);
518
580
  const db = this.baseFork;
519
- const worldStateDb = new TXEWorldStateDB(db, new TXEPublicContractDataSource(this), this);
520
581
  const globalVariables = GlobalVariables.empty();
521
582
  globalVariables.chainId = new Fr(await this.node.getChainId());
522
583
  globalVariables.version = new Fr(await this.node.getVersion());
523
584
  globalVariables.blockNumber = new Fr(this.blockNumber);
524
585
  globalVariables.gasFees = new GasFees(1, 1);
525
- const tempFork = await this.nativeWorldStateService.fork();
526
- // Apply current public data writes
527
- await tempFork.sequentialInsert(MerkleTreeId.PUBLIC_DATA_TREE, this.publicDataWrites.map(p => p.toBuffer()));
528
- // If the contract instance exists in the TXE's world state, make sure its nullifier is present in the tree
529
- // so its nullifier check passes.
530
- if ((await worldStateDb.getContractInstance(callContext.contractAddress)) !== undefined) {
531
- const contractAddressNullifier = await siloNullifier(AztecAddress.fromNumber(DEPLOYER_CONTRACT_ADDRESS), callContext.contractAddress.toField());
532
- if ((await worldStateDb.getNullifierIndex(contractAddressNullifier)) === undefined) {
533
- await tempFork.batchInsert(MerkleTreeId.NULLIFIER_TREE, [contractAddressNullifier.toBuffer()], 0);
534
- }
535
- }
536
- const simulator = new PublicTxSimulator(tempFork, new TXEWorldStateDB(tempFork, new TXEPublicContractDataSource(this), this), globalVariables);
586
+ const simulator = new PublicTxSimulator(db, new TXEWorldStateDB(db, new TXEPublicContractDataSource(this), this), globalVariables);
537
587
  const { usedTxRequestHashForNonces } = this.noteCache.finish();
538
588
  const firstNullifier = usedTxRequestHashForNonces ? this.getTxRequestHash() : this.noteCache.getAllNullifiers()[0];
539
589
  // When setting up a teardown call, we tell it that
540
590
  // private execution used Gas(1, 1) so it can compute a tx fee.
541
591
  const gasUsedByPrivate = isTeardown ? new Gas(1, 1) : Gas.empty();
542
- const tx = await createTxForPublicCalls(firstNullifier,
543
- /*setupExecutionRequests=*/ [],
544
- /*appExecutionRequests=*/ isTeardown ? [] : [executionRequest],
545
- /*teardownExecutionRequests=*/ isTeardown ? executionRequest : undefined,
546
- /*feePayer=*/ AztecAddress.zero(), gasUsedByPrivate);
592
+ const tx = await createTxForPublicCalls(firstNullifier, /*setupExecutionRequests=*/ [], /*appExecutionRequests=*/ isTeardown ? [] : [
593
+ executionRequest
594
+ ], /*teardownExecutionRequests=*/ isTeardown ? executionRequest : undefined, /*feePayer=*/ AztecAddress.zero(), gasUsedByPrivate);
547
595
  const result = await simulator.simulate(tx);
548
- const noteHashes = result.avmProvingRequest.inputs.publicInputs.accumulatedData.noteHashes.filter(s => !s.isEmpty());
549
- const publicDataWrites = result.avmProvingRequest.inputs.publicInputs.accumulatedData.publicDataWrites.filter(s => !s.isEmpty());
596
+ const noteHashes = result.avmProvingRequest.inputs.publicInputs.accumulatedData.noteHashes.filter((s)=>!s.isEmpty());
597
+ const publicDataWrites = result.avmProvingRequest.inputs.publicInputs.accumulatedData.publicDataWrites.filter((s)=>!s.isEmpty());
550
598
  await this.addPublicDataWrites(publicDataWrites);
551
599
  this.addUniqueNoteHashesFromPublic(noteHashes);
552
- this.addPublicLogs(result.avmProvingRequest.inputs.publicInputs.accumulatedData.publicLogs.filter(log => !log.contractAddress.equals(AztecAddress.ZERO)));
553
- await tempFork.close();
600
+ this.addPublicLogs(result.avmProvingRequest.inputs.publicInputs.accumulatedData.publicLogs.filter((log)=>!log.contractAddress.equals(AztecAddress.ZERO)));
554
601
  return Promise.resolve(result);
555
602
  }
556
603
  async enqueuePublicFunctionCall(targetContractAddress, functionSelector, argsHash, _sideEffectCounter, isStaticCall, isTeardown = false) {
@@ -561,9 +608,11 @@ export class TXE {
561
608
  this.setMsgSender(this.contractAddress);
562
609
  this.setContractAddress(targetContractAddress);
563
610
  this.setFunctionSelector(functionSelector);
564
- const callContext = new CallContext(
565
- /* msgSender */ currentContractAddress, targetContractAddress, FunctionSelector.fromField(new Fr(PUBLIC_DISPATCH_SELECTOR)), isStaticCall);
566
- const args = [this.functionSelector.toField(), ...this.executionCache.getPreimage(argsHash)];
611
+ const callContext = new CallContext(/* msgSender */ currentContractAddress, targetContractAddress, FunctionSelector.fromField(new Fr(PUBLIC_DISPATCH_SELECTOR)), isStaticCall);
612
+ const args = [
613
+ this.functionSelector.toField(),
614
+ ...this.executionCache.getPreimage(argsHash)
615
+ ];
567
616
  const newArgsHash = await this.executionCache.store(args);
568
617
  const executionResult = await this.executePublicFunction(args, callContext, isTeardown);
569
618
  // Poor man's revert handling
@@ -571,8 +620,7 @@ export class TXE {
571
620
  if (executionResult.revertReason && executionResult.revertReason instanceof SimulationError) {
572
621
  await enrichPublicSimulationError(executionResult.revertReason, this.contractDataOracle, this.txeDatabase, this.logger);
573
622
  throw new Error(executionResult.revertReason.message);
574
- }
575
- else {
623
+ } else {
576
624
  throw new Error(`Enqueued public function call reverted: ${executionResult.revertReason}`);
577
625
  }
578
626
  }
@@ -580,7 +628,7 @@ export class TXE {
580
628
  const sideEffects = executionResult.avmProvingRequest.inputs.publicInputs.accumulatedData;
581
629
  const { usedTxRequestHashForNonces } = this.noteCache.finish();
582
630
  const firstNullifier = usedTxRequestHashForNonces ? this.getTxRequestHash() : this.noteCache.getAllNullifiers()[0];
583
- const nullifiers = sideEffects.nullifiers.filter(s => !s.isEmpty()).filter(s => !s.equals(firstNullifier));
631
+ const nullifiers = sideEffects.nullifiers.filter((s)=>!s.isEmpty()).filter((s)=>!s.equals(firstNullifier));
584
632
  // For some reason we cannot move this up to 'executePublicFunction'. It gives us an error of trying to modify the same nullifier twice.
585
633
  this.addSiloedNullifiersFromPublic(nullifiers);
586
634
  this.setContractAddress(currentContractAddress);
@@ -591,28 +639,47 @@ export class TXE {
591
639
  async setPublicTeardownFunctionCall(targetContractAddress, functionSelector, argsHash, sideEffectCounter, isStaticCall) {
592
640
  // Definitely not right, in that the teardown should always be last.
593
641
  // But useful for executing flows.
594
- return await this.enqueuePublicFunctionCall(targetContractAddress, functionSelector, argsHash, sideEffectCounter, isStaticCall,
595
- /*isTeardown=*/ true);
642
+ return await this.enqueuePublicFunctionCall(targetContractAddress, functionSelector, argsHash, sideEffectCounter, isStaticCall, /*isTeardown=*/ true);
596
643
  }
597
644
  async notifySetMinRevertibleSideEffectCounter(minRevertibleSideEffectCounter) {
598
645
  await this.noteCache.setMinRevertibleSideEffectCounter(minRevertibleSideEffectCounter);
599
646
  }
600
647
  debugLog(message, fields) {
601
- this.logger.verbose(`${applyStringFormatting(message, fields)}`, { module: `${this.logger.module}:debug_log` });
648
+ this.logger.verbose(`${applyStringFormatting(message, fields)}`, {
649
+ module: `${this.logger.module}:debug_log`
650
+ });
602
651
  }
603
652
  async incrementAppTaggingSecretIndexAsSender(sender, recipient) {
604
- const appSecret = await __classPrivateFieldGet(this, _TXE_instances, "m", _TXE_calculateAppTaggingSecret).call(this, this.contractAddress, sender, recipient);
605
- const [index] = await this.txeDatabase.getTaggingSecretsIndexesAsSender([appSecret]);
606
- await this.txeDatabase.setTaggingSecretsIndexesAsSender([new IndexedTaggingSecret(appSecret, index + 1)]);
653
+ const appSecret = await this.#calculateAppTaggingSecret(this.contractAddress, sender, recipient);
654
+ const [index] = await this.txeDatabase.getTaggingSecretsIndexesAsSender([
655
+ appSecret
656
+ ]);
657
+ await this.txeDatabase.setTaggingSecretsIndexesAsSender([
658
+ new IndexedTaggingSecret(appSecret, index + 1)
659
+ ]);
607
660
  }
608
661
  async getIndexedTaggingSecretAsSender(sender, recipient) {
609
- const secret = await __classPrivateFieldGet(this, _TXE_instances, "m", _TXE_calculateAppTaggingSecret).call(this, this.contractAddress, sender, recipient);
610
- const [index] = await this.txeDatabase.getTaggingSecretsIndexesAsSender([secret]);
662
+ const secret = await this.#calculateAppTaggingSecret(this.contractAddress, sender, recipient);
663
+ const [index] = await this.txeDatabase.getTaggingSecretsIndexesAsSender([
664
+ secret
665
+ ]);
611
666
  return new IndexedTaggingSecret(secret, index);
612
667
  }
668
+ async #calculateAppTaggingSecret(contractAddress, sender, recipient) {
669
+ const senderCompleteAddress = await this.getCompleteAddress(sender);
670
+ const senderIvsk = await this.keyStore.getMasterIncomingViewingSecretKey(sender);
671
+ const secretPoint = await computeTaggingSecretPoint(senderCompleteAddress, senderIvsk, recipient);
672
+ // Silo the secret to the app so it can't be used to track other app's notes
673
+ const appSecret = poseidon2Hash([
674
+ secretPoint.x,
675
+ secretPoint.y,
676
+ contractAddress
677
+ ]);
678
+ return appSecret;
679
+ }
613
680
  async syncNotes() {
614
681
  const taggedLogsByRecipient = await this.simulatorOracle.syncTaggedLogs(this.contractAddress, await this.getBlockNumber(), undefined);
615
- for (const [recipient, taggedLogs] of taggedLogsByRecipient.entries()) {
682
+ for (const [recipient, taggedLogs] of taggedLogsByRecipient.entries()){
616
683
  await this.simulatorOracle.processTaggedLogs(taggedLogs, AztecAddress.fromString(recipient));
617
684
  }
618
685
  await this.simulatorOracle.removeNullifiedNotes(this.contractAddress);
@@ -628,21 +695,18 @@ export class TXE {
628
695
  const currentMessageSender = this.msgSender;
629
696
  this.setMsgSender(this.contractAddress);
630
697
  this.setContractAddress(targetContractAddress);
631
- const callContext = new CallContext(
632
- /* msgSender */ currentContractAddress, targetContractAddress, FunctionSelector.fromField(new Fr(PUBLIC_DISPATCH_SELECTOR)), isStaticCall);
698
+ const callContext = new CallContext(/* msgSender */ currentContractAddress, targetContractAddress, FunctionSelector.fromField(new Fr(PUBLIC_DISPATCH_SELECTOR)), isStaticCall);
633
699
  const executionResult = await this.executePublicFunction(args, callContext);
634
700
  // Save return/revert data for later.
635
701
  this.nestedCallReturndata = executionResult.processedPhases[0].returnValues[0].values;
636
702
  // Apply side effects
637
703
  if (executionResult.revertCode.isOK()) {
638
704
  const sideEffects = executionResult.avmProvingRequest.inputs.publicInputs.accumulatedData;
639
- const publicDataWrites = sideEffects.publicDataWrites.filter(s => !s.isEmpty());
640
- const noteHashes = sideEffects.noteHashes.filter(s => !s.isEmpty());
705
+ const publicDataWrites = sideEffects.publicDataWrites.filter((s)=>!s.isEmpty());
706
+ const noteHashes = sideEffects.noteHashes.filter((s)=>!s.isEmpty());
641
707
  const { usedTxRequestHashForNonces } = this.noteCache.finish();
642
- const firstNullifier = usedTxRequestHashForNonces
643
- ? this.getTxRequestHash()
644
- : this.noteCache.getAllNullifiers()[0];
645
- const nullifiers = sideEffects.nullifiers.filter(s => !s.isEmpty()).filter(s => !s.equals(firstNullifier));
708
+ const firstNullifier = usedTxRequestHashForNonces ? this.getTxRequestHash() : this.noteCache.getAllNullifiers()[0];
709
+ const nullifiers = sideEffects.nullifiers.filter((s)=>!s.isEmpty()).filter((s)=>!s.equals(firstNullifier));
646
710
  await this.addPublicDataWrites(publicDataWrites);
647
711
  this.addUniqueNoteHashesFromPublic(noteHashes);
648
712
  this.addSiloedNullifiersFromPublic(nullifiers);
@@ -660,18 +724,24 @@ export class TXE {
660
724
  async avmOpcodeNullifierExists(innerNullifier, targetAddress) {
661
725
  const nullifier = await siloNullifier(targetAddress, innerNullifier);
662
726
  const db = this.baseFork;
663
- const index = (await db.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, [nullifier.toBuffer()]))[0];
727
+ const index = (await db.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, [
728
+ nullifier.toBuffer()
729
+ ]))[0];
664
730
  return index !== undefined;
665
731
  }
666
732
  async avmOpcodeEmitNullifier(nullifier) {
667
733
  const siloedNullifier = await siloNullifier(this.contractAddress, nullifier);
668
- this.addSiloedNullifiersFromPublic([siloedNullifier]);
734
+ this.addSiloedNullifiersFromPublic([
735
+ siloedNullifier
736
+ ]);
669
737
  return Promise.resolve();
670
738
  }
671
739
  // Doesn't this need to get hashed w/ the nonce ?
672
740
  async avmOpcodeEmitNoteHash(noteHash) {
673
741
  const siloedNoteHash = await siloNoteHash(this.contractAddress, noteHash);
674
- this.addUniqueNoteHashesFromPublic([siloedNoteHash]);
742
+ this.addUniqueNoteHashesFromPublic([
743
+ siloedNoteHash
744
+ ]);
675
745
  return Promise.resolve();
676
746
  }
677
747
  async avmOpcodeStorageRead(slot) {
@@ -680,7 +750,7 @@ export class TXE {
680
750
  if (!lowLeafResult || !lowLeafResult.alreadyPresent) {
681
751
  return Fr.ZERO;
682
752
  }
683
- const preimage = (await this.baseFork.getLeafPreimage(MerkleTreeId.PUBLIC_DATA_TREE, lowLeafResult.index));
753
+ const preimage = await this.baseFork.getLeafPreimage(MerkleTreeId.PUBLIC_DATA_TREE, lowLeafResult.index);
684
754
  return preimage.value;
685
755
  }
686
756
  dbStore(contractAddress, slot, values) {
@@ -712,12 +782,3 @@ export class TXE {
712
782
  return this.txeDatabase.dbCopy(this.contractAddress, srcSlot, dstSlot, numEntries);
713
783
  }
714
784
  }
715
- _TXE_instances = new WeakSet(), _TXE_calculateAppTaggingSecret = async function _TXE_calculateAppTaggingSecret(contractAddress, sender, recipient) {
716
- const senderCompleteAddress = await this.getCompleteAddress(sender);
717
- const senderIvsk = await this.keyStore.getMasterIncomingViewingSecretKey(sender);
718
- const secretPoint = await computeTaggingSecretPoint(senderCompleteAddress, senderIvsk, recipient);
719
- // Silo the secret to the app so it can't be used to track other app's notes
720
- const appSecret = poseidon2Hash([secretPoint.x, secretPoint.y, contractAddress]);
721
- return appSecret;
722
- };
723
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhlX29yYWNsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcmFjbGUvdHhlX29yYWNsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFDTCxXQUFXLEVBQ1gsSUFBSSxFQUNKLE9BQU8sRUFDUCxZQUFZLEVBR1osSUFBSSxFQUVKLDBCQUEwQixFQUMxQixpQkFBaUIsRUFDakIsc0JBQXNCLEVBQ3RCLGVBQWUsRUFDZixRQUFRLEVBQ1IsTUFBTSxHQUVQLE1BQU0sc0JBQXNCLENBQUM7QUFFOUIsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixXQUFXLEVBQ1gsV0FBVyxFQUdYLHlCQUF5QixFQUN6QixHQUFHLEVBQ0gsT0FBTyxFQUNQLGVBQWUsRUFDZixvQkFBb0IsRUFHcEIsc0JBQXNCLEVBQ3RCLHFCQUFxQixFQUNyQix3QkFBd0IsRUFFeEIsbUNBQW1DLEVBRW5DLDZCQUE2QixFQUU3Qix3QkFBd0IsRUFDeEIsb0JBQW9CLEVBRXBCLGtCQUFrQixFQUVsQixlQUFlLEVBRWYsc0JBQXNCLEVBQ3RCLHlCQUF5QixFQUN6QixVQUFVLEVBQ1YsNEJBQTRCLEdBQzdCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzFELE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsNkJBQTZCLEVBQzdCLHFCQUFxQixFQUNyQixZQUFZLEVBQ1osYUFBYSxHQUNkLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUNMLDBCQUEwQixFQUMxQixxQkFBcUIsRUFDckIsbUJBQW1CLEVBQ25CLFVBQVUsR0FDWCxNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFHTCxnQkFBZ0IsRUFFaEIsa0JBQWtCLEdBQ25CLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxXQUFXLEVB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