@aztec/pxe 0.56.0 → 0.57.0

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 (75) hide show
  1. package/dest/bin/index.js +0 -0
  2. package/dest/database/deferred_note_dao.d.ts +6 -2
  3. package/dest/database/deferred_note_dao.d.ts.map +1 -1
  4. package/dest/database/deferred_note_dao.js +8 -5
  5. package/dest/database/incoming_note_dao.d.ts +3 -1
  6. package/dest/database/incoming_note_dao.d.ts.map +1 -1
  7. package/dest/database/incoming_note_dao.js +5 -1
  8. package/dest/database/kv_pxe_database.d.ts.map +1 -1
  9. package/dest/database/kv_pxe_database.js +3 -2
  10. package/dest/database/outgoing_note_dao.d.ts +3 -1
  11. package/dest/database/outgoing_note_dao.d.ts.map +1 -1
  12. package/dest/database/outgoing_note_dao.js +5 -1
  13. package/dest/kernel_oracle/index.d.ts +1 -1
  14. package/dest/kernel_prover/hints/build_private_kernel_reset_private_inputs.d.ts +28 -0
  15. package/dest/kernel_prover/hints/build_private_kernel_reset_private_inputs.d.ts.map +1 -0
  16. package/dest/kernel_prover/hints/build_private_kernel_reset_private_inputs.js +260 -0
  17. package/dest/kernel_prover/hints/index.d.ts +1 -2
  18. package/dest/kernel_prover/hints/index.d.ts.map +1 -1
  19. package/dest/kernel_prover/hints/index.js +2 -3
  20. package/dest/kernel_prover/kernel_prover.d.ts +2 -4
  21. package/dest/kernel_prover/kernel_prover.d.ts.map +1 -1
  22. package/dest/kernel_prover/kernel_prover.js +26 -25
  23. package/dest/kernel_prover/test/test_circuit_prover.d.ts +2 -3
  24. package/dest/kernel_prover/test/test_circuit_prover.d.ts.map +1 -1
  25. package/dest/kernel_prover/test/test_circuit_prover.js +8 -11
  26. package/dest/note_processor/note_processor.d.ts.map +1 -1
  27. package/dest/note_processor/note_processor.js +13 -15
  28. package/dest/note_processor/utils/add_nullable_field_to_payload.d.ts +12 -0
  29. package/dest/note_processor/utils/add_nullable_field_to_payload.d.ts.map +1 -0
  30. package/dest/note_processor/utils/add_nullable_field_to_payload.js +46 -0
  31. package/dest/note_processor/utils/brute_force_note_info.d.ts +26 -0
  32. package/dest/note_processor/utils/brute_force_note_info.d.ts.map +1 -0
  33. package/dest/note_processor/utils/brute_force_note_info.js +52 -0
  34. package/dest/note_processor/utils/index.d.ts +3 -0
  35. package/dest/note_processor/utils/index.d.ts.map +1 -0
  36. package/dest/note_processor/utils/index.js +2 -0
  37. package/dest/note_processor/{produce_note_dao.d.ts → utils/produce_note_daos.d.ts} +12 -8
  38. package/dest/note_processor/utils/produce_note_daos.d.ts.map +1 -0
  39. package/dest/note_processor/utils/produce_note_daos.js +53 -0
  40. package/dest/note_processor/utils/produce_note_daos_for_key.d.ts +9 -0
  41. package/dest/note_processor/utils/produce_note_daos_for_key.d.ts.map +1 -0
  42. package/dest/note_processor/utils/produce_note_daos_for_key.js +80 -0
  43. package/dest/pxe_http/pxe_http_server.d.ts.map +1 -1
  44. package/dest/pxe_http/pxe_http_server.js +12 -4
  45. package/dest/pxe_service/pxe_service.d.ts +3 -3
  46. package/dest/pxe_service/pxe_service.d.ts.map +1 -1
  47. package/dest/pxe_service/pxe_service.js +36 -38
  48. package/package.json +17 -14
  49. package/src/database/deferred_note_dao.ts +5 -1
  50. package/src/database/incoming_note_dao.ts +24 -1
  51. package/src/database/kv_pxe_database.ts +3 -1
  52. package/src/database/outgoing_note_dao.ts +23 -1
  53. package/src/kernel_prover/hints/build_private_kernel_reset_private_inputs.ts +467 -0
  54. package/src/kernel_prover/hints/index.ts +1 -2
  55. package/src/kernel_prover/kernel_prover.ts +53 -76
  56. package/src/kernel_prover/test/test_circuit_prover.ts +11 -15
  57. package/src/note_processor/note_processor.ts +30 -21
  58. package/src/note_processor/utils/add_nullable_field_to_payload.ts +67 -0
  59. package/src/note_processor/utils/brute_force_note_info.ts +82 -0
  60. package/src/note_processor/utils/index.ts +2 -0
  61. package/src/note_processor/utils/produce_note_daos.ts +114 -0
  62. package/src/note_processor/utils/produce_note_daos_for_key.ts +157 -0
  63. package/src/pxe_http/pxe_http_server.ts +18 -3
  64. package/src/pxe_service/pxe_service.ts +53 -71
  65. package/dest/kernel_prover/hints/build_private_kernel_reset_hints.d.ts +0 -5
  66. package/dest/kernel_prover/hints/build_private_kernel_reset_hints.d.ts.map +0 -1
  67. package/dest/kernel_prover/hints/build_private_kernel_reset_hints.js +0 -90
  68. package/dest/kernel_prover/hints/needs_reset.d.ts +0 -5
  69. package/dest/kernel_prover/hints/needs_reset.d.ts.map +0 -1
  70. package/dest/kernel_prover/hints/needs_reset.js +0 -38
  71. package/dest/note_processor/produce_note_dao.d.ts.map +0 -1
  72. package/dest/note_processor/produce_note_dao.js +0 -131
  73. package/src/kernel_prover/hints/build_private_kernel_reset_hints.ts +0 -249
  74. package/src/kernel_prover/hints/needs_reset.ts +0 -54
  75. package/src/note_processor/produce_note_dao.ts +0 -235
@@ -1,8 +1,6 @@
1
1
  import {
2
2
  type AuthWitness,
3
3
  type AztecNode,
4
- EncryptedNoteTxL2Logs,
5
- EncryptedTxL2Logs,
6
4
  type EventMetadata,
7
5
  EventType,
8
6
  type ExtendedNote,
@@ -16,17 +14,20 @@ import {
16
14
  type OutgoingNotesFilter,
17
15
  type PXE,
18
16
  type PXEInfo,
17
+ type PrivateExecutionResult,
19
18
  type PrivateKernelProver,
19
+ type PrivateKernelSimulateOutput,
20
+ PrivateSimulationResult,
21
+ type PublicSimulationOutput,
20
22
  type SiblingPath,
21
- SimulatedTx,
22
23
  SimulationError,
23
- TaggedLog,
24
- Tx,
24
+ type Tx,
25
25
  type TxEffect,
26
26
  type TxExecutionRequest,
27
27
  type TxHash,
28
+ TxProvingResult,
28
29
  type TxReceipt,
29
- UnencryptedTxL2Logs,
30
+ TxSimulationResult,
30
31
  UniqueNote,
31
32
  getNonNullifiedL1ToL2MessageWitness,
32
33
  isNoirCallStackUnresolved,
@@ -36,7 +37,9 @@ import {
36
37
  AztecAddress,
37
38
  type CompleteAddress,
38
39
  type L1_TO_L2_MSG_TREE_HEIGHT,
40
+ PUBLIC_DISPATCH_SELECTOR,
39
41
  type PartialAddress,
42
+ type PrivateKernelTailCircuitPublicInputs,
40
43
  computeContractAddressFromInstance,
41
44
  computeContractClassId,
42
45
  getContractClassFromArtifact,
@@ -57,18 +60,7 @@ import { ClassRegistererAddress } from '@aztec/protocol-contracts/class-register
57
60
  import { getCanonicalFeeJuice } from '@aztec/protocol-contracts/fee-juice';
58
61
  import { getCanonicalInstanceDeployer } from '@aztec/protocol-contracts/instance-deployer';
59
62
  import { getCanonicalMultiCallEntrypointAddress } from '@aztec/protocol-contracts/multi-call-entrypoint';
60
- import {
61
- type AcirSimulator,
62
- type ExecutionResult,
63
- accumulateReturnValues,
64
- collectEnqueuedPublicFunctionCalls,
65
- collectPublicTeardownFunctionCall,
66
- collectSortedEncryptedLogs,
67
- collectSortedNoteEncryptedLogs,
68
- collectSortedUnencryptedLogs,
69
- resolveAssertionMessage,
70
- resolveOpcodeLocations,
71
- } from '@aztec/simulator';
63
+ import { type AcirSimulator, resolveAssertionMessage, resolveOpcodeLocations } from '@aztec/simulator';
72
64
  import { type ContractClassWithId, type ContractInstanceWithAddress } from '@aztec/types/contracts';
73
65
  import { type NodeInfo } from '@aztec/types/interfaces';
74
66
 
@@ -510,13 +502,21 @@ export class PXEService implements PXE {
510
502
  return await this.node.getBlock(blockNumber);
511
503
  }
512
504
 
513
- public proveTx(txRequest: TxExecutionRequest, simulatePublic: boolean, scopes?: AztecAddress[]): Promise<Tx> {
505
+ async #simulateKernels(
506
+ txRequest: TxExecutionRequest,
507
+ privateExecutionResult: PrivateExecutionResult,
508
+ ): Promise<PrivateKernelTailCircuitPublicInputs> {
509
+ const result = await this.#prove(txRequest, new TestPrivateKernelProver(), privateExecutionResult);
510
+ return result.publicInputs;
511
+ }
512
+
513
+ public proveTx(
514
+ txRequest: TxExecutionRequest,
515
+ privateExecutionResult: PrivateExecutionResult,
516
+ ): Promise<TxProvingResult> {
514
517
  return this.jobQueue.put(async () => {
515
- const simulatedTx = await this.#simulateAndProve(txRequest, this.proofCreator, undefined, scopes);
516
- if (simulatePublic) {
517
- simulatedTx.publicOutput = await this.#simulatePublicCalls(simulatedTx.tx);
518
- }
519
- return simulatedTx.tx;
518
+ const { publicInputs, clientIvcProof } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult);
519
+ return new TxProvingResult(privateExecutionResult, publicInputs, clientIvcProof!);
520
520
  });
521
521
  }
522
522
 
@@ -527,15 +527,19 @@ export class PXEService implements PXE {
527
527
  msgSender: AztecAddress | undefined = undefined,
528
528
  skipTxValidation: boolean = false,
529
529
  scopes?: AztecAddress[],
530
- ): Promise<SimulatedTx> {
530
+ ): Promise<TxSimulationResult> {
531
531
  return await this.jobQueue.put(async () => {
532
- const simulatedTx = await this.#simulateAndProve(txRequest, this.fakeProofCreator, msgSender, scopes);
532
+ const privateExecutionResult = await this.#executePrivate(txRequest, msgSender, scopes);
533
+ const publicInputs = await this.#simulateKernels(txRequest, privateExecutionResult);
534
+ const privateSimulationResult = new PrivateSimulationResult(privateExecutionResult, publicInputs);
535
+ const simulatedTx = privateSimulationResult.toSimulatedTx();
536
+ let publicOutput: PublicSimulationOutput | undefined;
533
537
  if (simulatePublic) {
534
- simulatedTx.publicOutput = await this.#simulatePublicCalls(simulatedTx.tx);
538
+ publicOutput = await this.#simulatePublicCalls(simulatedTx);
535
539
  }
536
540
 
537
541
  if (!skipTxValidation) {
538
- if (!(await this.node.isValidTx(simulatedTx.tx, true))) {
542
+ if (!(await this.node.isValidTx(simulatedTx, true))) {
539
543
  throw new Error('The simulated transaction is unable to be added to state and is invalid.');
540
544
  }
541
545
  }
@@ -545,9 +549,9 @@ export class PXEService implements PXE {
545
549
  // Meaning that it will not necessarily have produced a nullifier (and thus have no TxHash)
546
550
  // If we log, the `getTxHash` function will throw.
547
551
  if (!msgSender) {
548
- this.log.info(`Executed local simulation for ${simulatedTx.tx.getTxHash()}`);
552
+ this.log.info(`Executed local simulation for ${simulatedTx.getTxHash()}`);
549
553
  }
550
- return simulatedTx;
554
+ return TxSimulationResult.fromPrivateSimulationResultAndPublicOutput(privateSimulationResult, publicOutput);
551
555
  });
552
556
  }
553
557
 
@@ -687,11 +691,11 @@ export class PXEService implements PXE {
687
691
  };
688
692
  }
689
693
 
690
- async #simulate(
694
+ async #executePrivate(
691
695
  txRequest: TxExecutionRequest,
692
696
  msgSender?: AztecAddress,
693
697
  scopes?: AztecAddress[],
694
- ): Promise<ExecutionResult> {
698
+ ): Promise<PrivateExecutionResult> {
695
699
  // TODO - Pause syncing while simulating.
696
700
 
697
701
  const { contractAddress, functionArtifact } = await this.#getSimulationParameters(txRequest);
@@ -749,9 +753,13 @@ export class PXEService implements PXE {
749
753
  if (err instanceof SimulationError) {
750
754
  const callStack = err.getCallStack();
751
755
  const originalFailingFunction = callStack[callStack.length - 1];
756
+ // TODO(https://github.com/AztecProtocol/aztec-packages/issues/8985): Properly fix this.
757
+ // To be able to resolve the assertion message, we need to use the information from the public dispatch function,
758
+ // no matter what the call stack selector points to (since we've modified it to point to the target function).
759
+ // We should remove this because the AVM (or public protocol) shouldn't be aware of the public dispatch calling convention.
752
760
  const debugInfo = await this.contractDataOracle.getFunctionDebugMetadata(
753
761
  originalFailingFunction.contractAddress,
754
- originalFailingFunction.functionSelector,
762
+ FunctionSelector.fromField(new Fr(PUBLIC_DISPATCH_SELECTOR)),
755
763
  );
756
764
  const noirCallStack = err.getNoirCallStack();
757
765
  if (debugInfo) {
@@ -794,40 +802,15 @@ export class PXEService implements PXE {
794
802
  * A private transaction object containing the proof, public inputs, and encrypted logs.
795
803
  * The return values of the private execution
796
804
  */
797
- async #simulateAndProve(
805
+ async #prove(
798
806
  txExecutionRequest: TxExecutionRequest,
799
807
  proofCreator: PrivateKernelProver,
800
- msgSender?: AztecAddress,
801
- scopes?: AztecAddress[],
802
- ): Promise<SimulatedTx> {
803
- // Get values that allow us to reconstruct the block hash
804
- const executionResult = await this.#simulate(txExecutionRequest, msgSender, scopes);
805
-
808
+ privateExecutionResult: PrivateExecutionResult,
809
+ ): Promise<PrivateKernelSimulateOutput<PrivateKernelTailCircuitPublicInputs>> {
806
810
  const kernelOracle = new KernelOracle(this.contractDataOracle, this.keyStore, this.node);
807
811
  const kernelProver = new KernelProver(kernelOracle, proofCreator);
808
812
  this.log.debug(`Executing kernel prover...`);
809
- const { clientIvcProof, publicInputs } = await kernelProver.prove(
810
- txExecutionRequest.toTxRequest(),
811
- executionResult,
812
- );
813
-
814
- const noteEncryptedLogs = new EncryptedNoteTxL2Logs([collectSortedNoteEncryptedLogs(executionResult)]);
815
- const unencryptedLogs = new UnencryptedTxL2Logs([collectSortedUnencryptedLogs(executionResult)]);
816
- const encryptedLogs = new EncryptedTxL2Logs([collectSortedEncryptedLogs(executionResult)]);
817
- const enqueuedPublicFunctions = collectEnqueuedPublicFunctionCalls(executionResult);
818
- const teardownPublicFunction = collectPublicTeardownFunctionCall(executionResult);
819
-
820
- const tx = new Tx(
821
- publicInputs,
822
- clientIvcProof!,
823
- noteEncryptedLogs,
824
- encryptedLogs,
825
- unencryptedLogs,
826
- enqueuedPublicFunctions,
827
- teardownPublicFunction,
828
- );
829
-
830
- return new SimulatedTx(tx, accumulateReturnValues(executionResult));
813
+ return await kernelProver.prove(txExecutionRequest.toTxRequest(), privateExecutionResult);
831
814
  }
832
815
 
833
816
  /**
@@ -944,11 +927,10 @@ export class PXEService implements PXE {
944
927
 
945
928
  const visibleEvents = encryptedLogs.flatMap(encryptedLog => {
946
929
  for (const sk of vsks) {
947
- const decryptedLog =
948
- TaggedLog.decryptAsIncoming(encryptedLog, sk, L1EventPayload) ??
949
- TaggedLog.decryptAsOutgoing(encryptedLog, sk, L1EventPayload);
950
- if (decryptedLog !== undefined) {
951
- return [decryptedLog];
930
+ const decryptedEvent =
931
+ L1EventPayload.decryptAsIncoming(encryptedLog, sk) ?? L1EventPayload.decryptAsOutgoing(encryptedLog, sk);
932
+ if (decryptedEvent !== undefined) {
933
+ return [decryptedEvent];
952
934
  }
953
935
  }
954
936
 
@@ -957,19 +939,19 @@ export class PXEService implements PXE {
957
939
 
958
940
  const decodedEvents = visibleEvents
959
941
  .map(visibleEvent => {
960
- if (visibleEvent.payload === undefined) {
942
+ if (visibleEvent === undefined) {
961
943
  return undefined;
962
944
  }
963
- if (!visibleEvent.payload.eventTypeId.equals(eventMetadata.eventSelector)) {
945
+ if (!visibleEvent.eventTypeId.equals(eventMetadata.eventSelector)) {
964
946
  return undefined;
965
947
  }
966
- if (visibleEvent.payload.event.items.length !== eventMetadata.fieldNames.length) {
948
+ if (visibleEvent.event.items.length !== eventMetadata.fieldNames.length) {
967
949
  throw new Error(
968
950
  'Something is weird here, we have matching EventSelectors, but the actual payload has mismatched length',
969
951
  );
970
952
  }
971
953
 
972
- return eventMetadata.decode(visibleEvent.payload);
954
+ return eventMetadata.decode(visibleEvent);
973
955
  })
974
956
  .filter(visibleEvent => visibleEvent !== undefined) as T[];
975
957
 
@@ -1,5 +0,0 @@
1
- import { type PrivateKernelData, type PrivateKernelResetCircuitPrivateInputsVariants } from '@aztec/circuits.js';
2
- import type { ExecutionResult } from '@aztec/simulator';
3
- import { type ProvingDataOracle } from '../proving_data_oracle.js';
4
- export declare function buildPrivateKernelResetInputs(executionStack: ExecutionResult[], previousKernelData: PrivateKernelData, noteHashLeafIndexMap: Map<bigint, bigint>, noteHashNullifierCounterMap: Map<number, number>, validationRequestsSplitCounter: number, shouldSilo: boolean, oracle: ProvingDataOracle): Promise<PrivateKernelResetCircuitPrivateInputsVariants>;
5
- //# sourceMappingURL=build_private_kernel_reset_hints.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"build_private_kernel_reset_hints.d.ts","sourceRoot":"","sources":["../../../src/kernel_prover/hints/build_private_kernel_reset_hints.ts"],"names":[],"mappings":"AAAA,OAAO,EAWL,KAAK,iBAAiB,EAEtB,KAAK,8CAA8C,EAYpD,MAAM,oBAAoB,CAAC;AAG5B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAyDnE,wBAAsB,6BAA6B,CACjD,cAAc,EAAE,eAAe,EAAE,EACjC,kBAAkB,EAAE,iBAAiB,EACrC,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EACzC,2BAA2B,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAChD,8BAA8B,EAAE,MAAM,EACtC,UAAU,EAAE,OAAO,EACnB,MAAM,EAAE,iBAAiB,2DA+H1B"}
@@ -1,90 +0,0 @@
1
- import { KeyValidationHint, MAX_KEY_VALIDATION_REQUESTS_PER_TX, MAX_NOTE_HASHES_PER_TX, MAX_NOTE_HASH_READ_REQUESTS_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_NULLIFIER_READ_REQUESTS_PER_TX, MembershipWitness, NULLIFIER_TREE_HEIGHT, PRIVATE_RESET_VARIANTS, PrivateKernelResetCircuitPrivateInputs, PrivateKernelResetHints, ScopedNoteHash, ScopedNullifier, ScopedReadRequest, buildNoteHashReadRequestHints, buildNullifierReadRequestHints, buildTransientDataHints, countAccumulatedItems, getNonEmptyItems, } from '@aztec/circuits.js';
2
- import { makeTuple } from '@aztec/foundation/array';
3
- function getNullifierReadRequestHints(nullifierReadRequests, nullifiers, oracle, sizePending, sizeSettled, futureNullifiers) {
4
- const getNullifierMembershipWitness = async (nullifier) => {
5
- const res = await oracle.getNullifierMembershipWitness(nullifier);
6
- if (!res) {
7
- throw new Error(`Cannot find the leaf for nullifier ${nullifier.toBigInt()}.`);
8
- }
9
- const { index, siblingPath, leafPreimage } = res;
10
- return {
11
- membershipWitness: new MembershipWitness(NULLIFIER_TREE_HEIGHT, index, siblingPath.toTuple()),
12
- leafPreimage,
13
- };
14
- };
15
- return buildNullifierReadRequestHints({ getNullifierMembershipWitness }, nullifierReadRequests, nullifiers, sizePending, sizeSettled, futureNullifiers);
16
- }
17
- async function getMasterSecretKeysAndAppKeyGenerators(keyValidationRequests, oracle) {
18
- const keysHints = makeTuple(MAX_KEY_VALIDATION_REQUESTS_PER_TX, () => KeyValidationHint.nada(MAX_KEY_VALIDATION_REQUESTS_PER_TX));
19
- let keyIndex = 0;
20
- for (let i = 0; i < keyValidationRequests.length; ++i) {
21
- const request = keyValidationRequests[i].request;
22
- if (request.isEmpty()) {
23
- break;
24
- }
25
- const secretKeys = await oracle.getMasterSecretKey(request.request.pkM);
26
- keysHints[keyIndex] = new KeyValidationHint(secretKeys, i);
27
- keyIndex++;
28
- }
29
- return {
30
- keysCount: keyIndex,
31
- keysHints,
32
- };
33
- }
34
- export async function buildPrivateKernelResetInputs(executionStack, previousKernelData, noteHashLeafIndexMap, noteHashNullifierCounterMap, validationRequestsSplitCounter, shouldSilo, oracle) {
35
- const publicInputs = previousKernelData.publicInputs;
36
- // Use max sizes, they will be trimmed down later.
37
- const futureNoteHashes = collectNested(executionStack, executionResult => {
38
- const nonEmptyNoteHashes = getNonEmptyItems(executionResult.callStackItem.publicInputs.noteHashes);
39
- return nonEmptyNoteHashes.map(noteHash => new ScopedNoteHash(noteHash, executionResult.callStackItem.publicInputs.callContext.storageContractAddress));
40
- });
41
- const { numPendingReadHints: noteHashPendingReadHints, numSettledReadHints: noteHashSettledReadHints, hints: noteHashReadRequestHints, } = await buildNoteHashReadRequestHints(oracle, publicInputs.validationRequests.noteHashReadRequests, publicInputs.end.noteHashes, noteHashLeafIndexMap, MAX_NOTE_HASH_READ_REQUESTS_PER_TX, MAX_NOTE_HASH_READ_REQUESTS_PER_TX, futureNoteHashes);
42
- const futureNullifiers = collectNested(executionStack, executionResult => {
43
- const nonEmptyNullifiers = getNonEmptyItems(executionResult.callStackItem.publicInputs.nullifiers);
44
- return nonEmptyNullifiers.map(nullifier => new ScopedNullifier(nullifier, executionResult.callStackItem.publicInputs.callContext.storageContractAddress));
45
- });
46
- const { numPendingReadHints: nullifierPendingReadHints, numSettledReadHints: nullifierSettledReadHints, hints: nullifierReadRequestHints, } = await getNullifierReadRequestHints(publicInputs.validationRequests.nullifierReadRequests, publicInputs.end.nullifiers, oracle, MAX_NULLIFIER_READ_REQUESTS_PER_TX, MAX_NULLIFIER_READ_REQUESTS_PER_TX, futureNullifiers);
47
- const { keysCount, keysHints } = await getMasterSecretKeysAndAppKeyGenerators(publicInputs.validationRequests.scopedKeyValidationRequestsAndGenerators, oracle);
48
- const futureNoteHashReads = collectNestedReadRequests(executionStack, executionResult => executionResult.callStackItem.publicInputs.noteHashReadRequests);
49
- const futureNullifierReads = collectNestedReadRequests(executionStack, executionResult => executionResult.callStackItem.publicInputs.nullifierReadRequests);
50
- const noteHashes = publicInputs.end.noteHashes;
51
- const nullifiers = publicInputs.end.nullifiers;
52
- const { numTransientData, hints: transientDataIndexHints } = buildTransientDataHints(noteHashes, nullifiers, futureNoteHashReads, futureNullifierReads, noteHashNullifierCounterMap, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX);
53
- const remainingNoteHashes = countAccumulatedItems(noteHashes) - numTransientData;
54
- const remainingNullifiers = countAccumulatedItems(nullifiers) - numTransientData;
55
- const numEncryptedLogHashes = countAccumulatedItems(publicInputs.end.encryptedLogsHashes);
56
- let privateInputs;
57
- for (const [sizeTag, hintSizes] of Object.entries(PRIVATE_RESET_VARIANTS)) {
58
- const noSiloing = !hintSizes.NOTE_HASH_SILOING_AMOUNT &&
59
- !hintSizes.NULLIFIER_SILOING_AMOUNT &&
60
- !hintSizes.ENCRYPTED_LOG_SILOING_AMOUNT;
61
- const enoughSiloing = hintSizes.NOTE_HASH_SILOING_AMOUNT >= remainingNoteHashes &&
62
- hintSizes.NULLIFIER_SILOING_AMOUNT >= remainingNullifiers &&
63
- hintSizes.ENCRYPTED_LOG_SILOING_AMOUNT >= numEncryptedLogHashes;
64
- if (hintSizes.NOTE_HASH_PENDING_AMOUNT >= noteHashPendingReadHints &&
65
- hintSizes.NOTE_HASH_SETTLED_AMOUNT >= noteHashSettledReadHints &&
66
- hintSizes.NULLIFIER_PENDING_AMOUNT >= nullifierPendingReadHints &&
67
- hintSizes.NULLIFIER_SETTLED_AMOUNT >= nullifierSettledReadHints &&
68
- hintSizes.NULLIFIER_KEYS >= keysCount &&
69
- hintSizes.TRANSIENT_DATA_AMOUNT >= numTransientData &&
70
- ((!shouldSilo && noSiloing) || (shouldSilo && enoughSiloing))) {
71
- privateInputs = new PrivateKernelResetCircuitPrivateInputs(previousKernelData, new PrivateKernelResetHints(noteHashReadRequestHints, nullifierReadRequestHints, keysHints, transientDataIndexHints, validationRequestsSplitCounter).trimToSizes(hintSizes.NOTE_HASH_PENDING_AMOUNT, hintSizes.NOTE_HASH_SETTLED_AMOUNT, hintSizes.NULLIFIER_PENDING_AMOUNT, hintSizes.NULLIFIER_SETTLED_AMOUNT, hintSizes.NULLIFIER_KEYS, hintSizes.TRANSIENT_DATA_AMOUNT), sizeTag);
72
- break;
73
- }
74
- }
75
- if (!privateInputs) {
76
- throw new Error('No private inputs found for the given hint sizes.');
77
- }
78
- return privateInputs;
79
- }
80
- function collectNested(executionStack, extractExecutionItems) {
81
- const thisExecutionReads = executionStack.flatMap(extractExecutionItems);
82
- return thisExecutionReads.concat(executionStack.flatMap(({ nestedExecutions }) => collectNested(nestedExecutions, extractExecutionItems)));
83
- }
84
- function collectNestedReadRequests(executionStack, extractReadRequests) {
85
- return collectNested(executionStack, executionResult => {
86
- const nonEmptyReadRequests = getNonEmptyItems(extractReadRequests(executionResult));
87
- return nonEmptyReadRequests.map(readRequest => new ScopedReadRequest(readRequest, executionResult.callStackItem.publicInputs.callContext.storageContractAddress));
88
- });
89
- }
90
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRfcHJpdmF0ZV9rZXJuZWxfcmVzZXRfaGludHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMva2VybmVsX3Byb3Zlci9oaW50cy9idWlsZF9wcml2YXRlX2tlcm5lbF9yZXNldF9oaW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLGtDQUFrQyxFQUNsQyxzQkFBc0IsRUFDdEIsa0NBQWtDLEVBQ2xDLHFCQUFxQixFQUNyQixrQ0FBa0MsRUFDbEMsaUJBQWlCLEVBQ2pCLHFCQUFxQixFQUNyQixzQkFBc0IsRUFFdEIsc0NBQXNDLEVBRXRDLHVCQUF1QixFQUd2QixjQUFjLEVBQ2QsZUFBZSxFQUNmLGlCQUFpQixFQUNqQiw2QkFBNkIsRUFDN0IsOEJBQThCLEVBQzlCLHVCQUF1QixFQUN2QixxQkFBcUIsRUFDckIsZ0JBQWdCLEdBQ2pCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBTXBELFNBQVMsNEJBQTRCLENBQ25DLHFCQUEwRixFQUMxRixVQUFnRSxFQUNoRSxNQUF5QixFQUN6QixXQUFvQixFQUNwQixXQUFvQixFQUNwQixnQkFBbUM7SUFFbkMsTUFBTSw2QkFBNkIsR0FBRyxLQUFLLEVBQUUsU0FBYSxFQUFFLEVBQUU7UUFDNUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxNQUFNLENBQUMsNkJBQTZCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1QsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsU0FBUyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNqRixDQUFDO1FBRUQsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLEdBQUcsR0FBRyxDQUFDO1FBQ2pELE9BQU87WUFDTCxpQkFBaUIsRUFBRSxJQUFJ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
@@ -1,5 +0,0 @@
1
- import { type PrivateKernelCircuitPublicInputs } from '@aztec/circuits.js';
2
- import { type ExecutionResult } from '@aztec/simulator';
3
- export declare function needsReset(publicInputs: PrivateKernelCircuitPublicInputs, executionStack: ExecutionResult[]): boolean;
4
- export declare function needsFinalReset(publicInputs: PrivateKernelCircuitPublicInputs): boolean;
5
- //# sourceMappingURL=needs_reset.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"needs_reset.d.ts","sourceRoot":"","sources":["../../../src/kernel_prover/hints/needs_reset.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,gCAAgC,EAEtC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,wBAAgB,UAAU,CAAC,YAAY,EAAE,gCAAgC,EAAE,cAAc,EAAE,eAAe,EAAE,WAsB3G;AASD,wBAAgB,eAAe,CAAC,YAAY,EAAE,gCAAgC,WAU7E"}
@@ -1,38 +0,0 @@
1
- import { MAX_KEY_VALIDATION_REQUESTS_PER_TX, MAX_NOTE_ENCRYPTED_LOGS_PER_TX, MAX_NOTE_HASHES_PER_TX, MAX_NOTE_HASH_READ_REQUESTS_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_NULLIFIER_READ_REQUESTS_PER_TX, countAccumulatedItems, } from '@aztec/circuits.js';
2
- export function needsReset(publicInputs, executionStack) {
3
- const nextIteration = executionStack[executionStack.length - 1];
4
- return (countAccumulatedItems(nextIteration.callStackItem.publicInputs.noteHashes) +
5
- countAccumulatedItems(publicInputs.end.noteHashes) >
6
- MAX_NOTE_HASHES_PER_TX ||
7
- countAccumulatedItems(nextIteration.callStackItem.publicInputs.nullifiers) +
8
- countAccumulatedItems(publicInputs.end.nullifiers) >
9
- MAX_NULLIFIERS_PER_TX ||
10
- countAccumulatedItems(nextIteration.callStackItem.publicInputs.noteEncryptedLogsHashes) +
11
- countAccumulatedItems(publicInputs.end.noteEncryptedLogsHashes) >
12
- MAX_NOTE_ENCRYPTED_LOGS_PER_TX ||
13
- countAccumulatedItems(nextIteration.callStackItem.publicInputs.noteHashReadRequests) +
14
- countAccumulatedItems(publicInputs.validationRequests.noteHashReadRequests) >
15
- MAX_NOTE_HASH_READ_REQUESTS_PER_TX ||
16
- countAccumulatedItems(nextIteration.callStackItem.publicInputs.nullifierReadRequests) +
17
- countAccumulatedItems(publicInputs.validationRequests.nullifierReadRequests) >
18
- MAX_NULLIFIER_READ_REQUESTS_PER_TX ||
19
- countAccumulatedItems(nextIteration.callStackItem.publicInputs.keyValidationRequestsAndGenerators) +
20
- countAccumulatedItems(publicInputs.validationRequests.scopedKeyValidationRequestsAndGenerators) >
21
- MAX_KEY_VALIDATION_REQUESTS_PER_TX);
22
- }
23
- function hasTransientNullifier(publicInputs) {
24
- const noteHashSet = new Set();
25
- publicInputs.end.noteHashes.forEach(n => noteHashSet.add(n.noteHash.value.toBigInt()));
26
- noteHashSet.delete(0n);
27
- return publicInputs.end.nullifiers.some(n => noteHashSet.has(n.nullifiedNoteHash.toBigInt()));
28
- }
29
- export function needsFinalReset(publicInputs) {
30
- return (countAccumulatedItems(publicInputs.end.noteHashes) > 0 ||
31
- countAccumulatedItems(publicInputs.end.nullifiers) > 0 ||
32
- countAccumulatedItems(publicInputs.end.encryptedLogsHashes) > 0 ||
33
- countAccumulatedItems(publicInputs.validationRequests.noteHashReadRequests) > 0 ||
34
- countAccumulatedItems(publicInputs.validationRequests.nullifierReadRequests) > 0 ||
35
- countAccumulatedItems(publicInputs.validationRequests.scopedKeyValidationRequestsAndGenerators) > 0 ||
36
- hasTransientNullifier(publicInputs));
37
- }
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVlZHNfcmVzZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMva2VybmVsX3Byb3Zlci9oaW50cy9uZWVkc19yZXNldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsa0NBQWtDLEVBQ2xDLDhCQUE4QixFQUM5QixzQkFBc0IsRUFDdEIsa0NBQWtDLEVBQ2xDLHFCQUFxQixFQUNyQixrQ0FBa0MsRUFFbEMscUJBQXFCLEdBQ3RCLE1BQU0sb0JBQW9CLENBQUM7QUFHNUIsTUFBTSxVQUFVLFVBQVUsQ0FBQyxZQUE4QyxFQUFFLGNBQWlDO0lBQzFHLE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLE9BQU8sQ0FDTCxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUM7UUFDeEUscUJBQXFCLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7UUFDbEQsc0JBQXNCO1FBQ3hCLHFCQUFxQixDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQztZQUN4RSxxQkFBcUIsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQztZQUNsRCxxQkFBcUI7UUFDdkIscUJBQXFCLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsdUJBQXVCLENBQUM7WUFDckYscUJBQXFCLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQztZQUMvRCw4QkFBOEI7UUFDaEMscUJBQXFCLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUM7WUFDbEYscUJBQXFCLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixDQUFDO1lBQzNFLGtDQUFrQztRQUNwQyxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQztZQUNuRixxQkFBcUIsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMscUJBQXFCLENBQUM7WUFDNUUsa0NBQWtDO1FBQ3BDLHFCQUFxQixDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLGtDQUFrQyxDQUFDO1lBQ2hHLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyx3Q0FBd0MsQ0FBQztZQUMvRixrQ0FBa0MsQ0FDckMsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUFDLFlBQThDO0lBQzNFLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7SUFDOUIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdkYsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN2QixPQUFPLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNoRyxDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWUsQ0FBQyxZQUE4QztJQUM1RSxPQUFPLENBQ0wscUJBQXFCLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO1FBQ3RELHFCQUFxQixDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztRQUN0RCxxQkFBcUIsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQztRQUMvRCxxQkFBcUIsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDO1FBQy9FLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUM7UUFDaEYscUJBQXFCLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLHdDQUF3QyxDQUFDLEdBQUcsQ0FBQztRQUNuRyxxQkFBcUIsQ0FBQyxZQUFZLENBQUMsQ0FDcEMsQ0FBQztBQUNKLENBQUMifQ==
@@ -1 +0,0 @@
1
- {"version":3,"file":"produce_note_dao.d.ts","sourceRoot":"","sources":["../../src/note_processor/produce_note_dao.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,EAAE,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,KAAK,aAAa,EAAyB,MAAM,kBAAkB,CAAC;AAE7E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAEnE;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,aAAa,EACxB,KAAK,EAAE,SAAS,GAAG,SAAS,EAC5B,KAAK,EAAE,SAAS,GAAG,SAAS,EAC5B,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,EAAE,EAAE,EAChB,mBAAmB,EAAE,MAAM,EAC3B,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,EAC5B,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IACT,YAAY,EAAE,eAAe,GAAG,SAAS,CAAC;IAC1C,YAAY,EAAE,eAAe,GAAG,SAAS,CAAC;IAC1C,oBAAoB,EAAE,eAAe,GAAG,SAAS,CAAC;IAClD,oBAAoB,EAAE,eAAe,GAAG,SAAS,CAAC;CACnD,CAAC,CA4HD"}
@@ -1,131 +0,0 @@
1
- import { Fr } from '@aztec/circuits.js';
2
- import { computeNoteHashNonce, siloNullifier } from '@aztec/circuits.js/hash';
3
- import { ContractNotFoundError } from '@aztec/simulator';
4
- import { DeferredNoteDao } from '../database/deferred_note_dao.js';
5
- import { IncomingNoteDao } from '../database/incoming_note_dao.js';
6
- import { OutgoingNoteDao } from '../database/outgoing_note_dao.js';
7
- /**
8
- * Decodes a note from a transaction that we know was intended for us.
9
- * Throws if we do not yet have the contract corresponding to the note in our database.
10
- * Accepts a set of excluded indices, which are indices that have been assigned a note in the same tx.
11
- * Inserts the index of the note into the excludedIndices set if the note is successfully decoded.
12
- *
13
- * @param ivpkM - The public counterpart to the secret key to be used in the decryption of incoming note logs.
14
- * @param ovpkM - The public counterpart to the secret key to be used in the decryption of outgoing note logs.
15
- * @param payload - An instance of l1NotePayload.
16
- * @param txHash - The hash of the transaction that created the note. Equivalent to the first nullifier of the transaction.
17
- * @param noteHashes - New note hashes in this transaction, one of which belongs to this note.
18
- * @param dataStartIndexForTx - The next available leaf index for the note hash tree for this transaction.
19
- * @param excludedIndices - Indices that have been assigned a note in the same tx. Notes in a tx can have the same l1NotePayload, we need to find a different index for each replicate.
20
- * @param simulator - An instance of AcirSimulator.
21
- * @returns An object containing the incoming, outgoing, and deferred notes.
22
- */
23
- export async function produceNoteDaos(simulator, ivpkM, ovpkM, payload, txHash, noteHashes, dataStartIndexForTx, excludedIndices, log) {
24
- if (!ivpkM && !ovpkM) {
25
- throw new Error('Both ivpkM and ovpkM are undefined. Cannot create note.');
26
- }
27
- let incomingNote;
28
- let outgoingNote;
29
- let incomingDeferredNote;
30
- let outgoingDeferredNote;
31
- try {
32
- if (ivpkM) {
33
- const { noteHashIndex, nonce, noteHash, siloedNullifier } = await findNoteIndexAndNullifier(simulator, noteHashes, txHash, payload, excludedIndices, true);
34
- const index = BigInt(dataStartIndexForTx + noteHashIndex);
35
- excludedIndices?.add(noteHashIndex);
36
- incomingNote = new IncomingNoteDao(payload.note, payload.contractAddress, payload.storageSlot, payload.noteTypeId, txHash, nonce, noteHash, siloedNullifier, index, ivpkM);
37
- }
38
- }
39
- catch (e) {
40
- if (e instanceof ContractNotFoundError) {
41
- log.warn(e.message);
42
- if (ivpkM) {
43
- incomingDeferredNote = new DeferredNoteDao(ivpkM, payload.note, payload.contractAddress, payload.storageSlot, payload.noteTypeId, txHash, noteHashes, dataStartIndexForTx);
44
- }
45
- }
46
- else {
47
- log.error(`Could not process note because of "${e}". Discarding note...`);
48
- }
49
- }
50
- try {
51
- if (ovpkM) {
52
- if (incomingNote) {
53
- // Incoming note is defined meaning that this PXE has both the incoming and outgoing keys. We can skip computing
54
- // note hash and note index since we already have them in the incoming note.
55
- outgoingNote = new OutgoingNoteDao(payload.note, payload.contractAddress, payload.storageSlot, payload.noteTypeId, txHash, incomingNote.nonce, incomingNote.noteHash, incomingNote.index, ovpkM);
56
- }
57
- else {
58
- const { noteHashIndex, nonce, noteHash } = await findNoteIndexAndNullifier(simulator, noteHashes, txHash, payload, excludedIndices, false);
59
- const index = BigInt(dataStartIndexForTx + noteHashIndex);
60
- excludedIndices?.add(noteHashIndex);
61
- outgoingNote = new OutgoingNoteDao(payload.note, payload.contractAddress, payload.storageSlot, payload.noteTypeId, txHash, nonce, noteHash, index, ovpkM);
62
- }
63
- }
64
- }
65
- catch (e) {
66
- if (e instanceof ContractNotFoundError) {
67
- log.warn(e.message);
68
- if (ovpkM) {
69
- outgoingDeferredNote = new DeferredNoteDao(ovpkM, payload.note, payload.contractAddress, payload.storageSlot, payload.noteTypeId, txHash, noteHashes, dataStartIndexForTx);
70
- }
71
- }
72
- else {
73
- log.error(`Could not process note because of "${e}". Discarding note...`);
74
- }
75
- }
76
- return {
77
- incomingNote,
78
- outgoingNote,
79
- incomingDeferredNote,
80
- outgoingDeferredNote,
81
- };
82
- }
83
- /**
84
- * Finds nonce, index, inner hash and siloed nullifier for a given note.
85
- * @dev Finds the index in the note hash tree by computing the note hash with different nonce and see which hash for
86
- * the current tx matches this value.
87
- * @remarks This method assists in identifying spent notes in the note hash tree.
88
- * @param siloedNoteHashes - Note hashes in the tx. One of them should correspond to the note we are looking for
89
- * @param txHash - Hash of a tx the note was emitted in.
90
- * @param l1NotePayload - The note payload.
91
- * @param excludedIndices - Indices that have been assigned a note in the same tx. Notes in a tx can have the same
92
- * l1NotePayload. We need to find a different index for each replicate.
93
- * @param computeNullifier - A flag indicating whether to compute the nullifier or just return 0.
94
- * @returns Nonce, index, inner hash and siloed nullifier for a given note.
95
- * @throws If cannot find the nonce for the note.
96
- */
97
- async function findNoteIndexAndNullifier(simulator, siloedNoteHashes, txHash, { contractAddress, storageSlot, noteTypeId, note }, excludedIndices, computeNullifier) {
98
- let noteHashIndex = 0;
99
- let nonce;
100
- let noteHash;
101
- let siloedNoteHash;
102
- let innerNullifier;
103
- const firstNullifier = Fr.fromBuffer(txHash.toBuffer());
104
- for (; noteHashIndex < siloedNoteHashes.length; ++noteHashIndex) {
105
- if (excludedIndices.has(noteHashIndex)) {
106
- continue;
107
- }
108
- const siloedNoteHashFromTxEffect = siloedNoteHashes[noteHashIndex];
109
- if (siloedNoteHashFromTxEffect.equals(Fr.ZERO)) {
110
- break;
111
- }
112
- const expectedNonce = computeNoteHashNonce(firstNullifier, noteHashIndex);
113
- ({ noteHash, siloedNoteHash, innerNullifier } = await simulator.computeNoteHashAndOptionallyANullifier(contractAddress, expectedNonce, storageSlot, noteTypeId, computeNullifier, note));
114
- if (siloedNoteHashFromTxEffect.equals(siloedNoteHash)) {
115
- nonce = expectedNonce;
116
- break;
117
- }
118
- }
119
- if (!nonce) {
120
- // NB: this used to warn the user that a decrypted log didn't match any notes.
121
- // This was previously fine as we didn't chop transient note logs, but now we do (#1641 complete).
122
- throw new Error('Cannot find a matching note hash for the note.');
123
- }
124
- return {
125
- noteHashIndex,
126
- nonce,
127
- noteHash: noteHash,
128
- siloedNullifier: siloNullifier(contractAddress, innerNullifier),
129
- };
130
- }
131
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjZV9ub3RlX2Rhby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ub3RlX3Byb2Nlc3Nvci9wcm9kdWNlX25vdGVfZGFvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxFQUFFLEVBQWtCLE1BQU0sb0JBQW9CLENBQUM7QUFDeEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTlFLE9BQU8sRUFBc0IscUJBQXFCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUU3RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVuRTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGVBQWUsQ0FDbkMsU0FBd0IsRUFDeEIsS0FBNEIsRUFDNUIsS0FBNEIsRUFDNUIsT0FBc0IsRUFDdEIsTUFBYyxFQUNkLFVBQWdCLEVBQ2hCLG1CQUEyQixFQUMzQixlQUE0QixFQUM1QixHQUFXO0lBT1gsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMseURBQXlELENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQsSUFBSSxZQUF5QyxDQUFDO0lBQzlDLElBQUksWUFBeUMsQ0FBQztJQUM5QyxJQUFJLG9CQUFpRCxDQUFDO0lBQ3RELElBQUksb0JBQWlELENBQUM7SUFFdEQsSUFBSSxDQUFDO1FBQ0gsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLE1BQU0sRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsR0FBRyxNQUFNLHlCQUF5QixDQUN6RixTQUFTLEVBQ1QsVUFBVSxFQUNW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