@aztec/pxe 0.40.1 → 0.42.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 (86) hide show
  1. package/dest/config/index.d.ts.map +1 -1
  2. package/dest/config/index.js +5 -2
  3. package/dest/contract_data_oracle/index.d.ts +1 -0
  4. package/dest/contract_data_oracle/index.d.ts.map +1 -1
  5. package/dest/contract_data_oracle/index.js +7 -1
  6. package/dest/contract_data_oracle/private_functions_tree.d.ts.map +1 -1
  7. package/dest/contract_data_oracle/private_functions_tree.js +2 -2
  8. package/dest/database/kv_pxe_database.d.ts +1 -1
  9. package/dest/database/kv_pxe_database.js +2 -2
  10. package/dest/database/pxe_database.d.ts +5 -5
  11. package/dest/kernel_oracle/index.d.ts +7 -4
  12. package/dest/kernel_oracle/index.d.ts.map +1 -1
  13. package/dest/kernel_oracle/index.js +9 -4
  14. package/dest/kernel_prover/kernel_prover.d.ts +3 -0
  15. package/dest/kernel_prover/kernel_prover.d.ts.map +1 -1
  16. package/dest/kernel_prover/kernel_prover.js +51 -15
  17. package/dest/kernel_prover/private_inputs_builders/build_private_kernel_init_hints.d.ts +3 -0
  18. package/dest/kernel_prover/private_inputs_builders/build_private_kernel_init_hints.d.ts.map +1 -0
  19. package/dest/kernel_prover/private_inputs_builders/build_private_kernel_init_hints.js +11 -0
  20. package/dest/kernel_prover/private_inputs_builders/build_private_kernel_reset_hints.d.ts +5 -0
  21. package/dest/kernel_prover/private_inputs_builders/build_private_kernel_reset_hints.d.ts.map +1 -0
  22. package/dest/kernel_prover/private_inputs_builders/build_private_kernel_reset_hints.js +79 -0
  23. package/dest/kernel_prover/private_inputs_builders/build_private_kernel_reset_outputs.d.ts +4 -0
  24. package/dest/kernel_prover/private_inputs_builders/build_private_kernel_reset_outputs.d.ts.map +1 -0
  25. package/dest/kernel_prover/private_inputs_builders/build_private_kernel_reset_outputs.js +14 -0
  26. package/dest/kernel_prover/private_inputs_builders/build_private_kernel_tail_hints.d.ts +1 -2
  27. package/dest/kernel_prover/private_inputs_builders/build_private_kernel_tail_hints.d.ts.map +1 -1
  28. package/dest/kernel_prover/private_inputs_builders/build_private_kernel_tail_hints.js +11 -53
  29. package/dest/kernel_prover/private_inputs_builders/index.d.ts +3 -1
  30. package/dest/kernel_prover/private_inputs_builders/index.d.ts.map +1 -1
  31. package/dest/kernel_prover/private_inputs_builders/index.js +4 -2
  32. package/dest/kernel_prover/proving_data_oracle.d.ts +7 -5
  33. package/dest/kernel_prover/proving_data_oracle.d.ts.map +1 -1
  34. package/dest/kernel_prover/test/test_circuit_prover.d.ts +2 -1
  35. package/dest/kernel_prover/test/test_circuit_prover.d.ts.map +1 -1
  36. package/dest/kernel_prover/test/test_circuit_prover.js +14 -3
  37. package/dest/note_processor/note_processor.d.ts +3 -2
  38. package/dest/note_processor/note_processor.d.ts.map +1 -1
  39. package/dest/note_processor/note_processor.js +3 -2
  40. package/dest/note_processor/produce_note_dao.js +4 -20
  41. package/dest/pxe_http/pxe_http_server.js +3 -3
  42. package/dest/pxe_service/create_pxe_service.d.ts +1 -1
  43. package/dest/pxe_service/create_pxe_service.d.ts.map +1 -1
  44. package/dest/pxe_service/create_pxe_service.js +7 -6
  45. package/dest/pxe_service/pxe_service.d.ts +10 -6
  46. package/dest/pxe_service/pxe_service.d.ts.map +1 -1
  47. package/dest/pxe_service/pxe_service.js +45 -73
  48. package/dest/pxe_service/test/pxe_test_suite.d.ts.map +1 -1
  49. package/dest/pxe_service/test/pxe_test_suite.js +4 -17
  50. package/dest/simulator/index.d.ts +2 -1
  51. package/dest/simulator/index.d.ts.map +1 -1
  52. package/dest/simulator/index.js +1 -1
  53. package/dest/simulator_oracle/index.d.ts +7 -5
  54. package/dest/simulator_oracle/index.d.ts.map +1 -1
  55. package/dest/simulator_oracle/index.js +10 -8
  56. package/dest/synchronizer/synchronizer.d.ts +9 -1
  57. package/dest/synchronizer/synchronizer.d.ts.map +1 -1
  58. package/dest/synchronizer/synchronizer.js +16 -8
  59. package/package.json +14 -14
  60. package/src/config/index.ts +11 -1
  61. package/src/contract_data_oracle/index.ts +7 -0
  62. package/src/contract_data_oracle/private_functions_tree.ts +3 -1
  63. package/src/database/kv_pxe_database.ts +2 -2
  64. package/src/database/pxe_database.ts +5 -5
  65. package/src/kernel_oracle/index.ts +16 -4
  66. package/src/kernel_prover/kernel_prover.ts +93 -24
  67. package/src/kernel_prover/private_inputs_builders/build_private_kernel_init_hints.ts +28 -0
  68. package/src/kernel_prover/private_inputs_builders/build_private_kernel_reset_hints.ts +250 -0
  69. package/src/kernel_prover/private_inputs_builders/build_private_kernel_reset_outputs.ts +45 -0
  70. package/src/kernel_prover/private_inputs_builders/build_private_kernel_tail_hints.ts +29 -126
  71. package/src/kernel_prover/private_inputs_builders/index.ts +3 -1
  72. package/src/kernel_prover/proving_data_oracle.ts +8 -5
  73. package/src/kernel_prover/test/test_circuit_prover.ts +24 -3
  74. package/src/note_processor/note_processor.ts +5 -4
  75. package/src/note_processor/produce_note_dao.ts +3 -19
  76. package/src/pxe_http/pxe_http_server.ts +2 -2
  77. package/src/pxe_service/create_pxe_service.ts +10 -7
  78. package/src/pxe_service/pxe_service.ts +55 -120
  79. package/src/pxe_service/test/pxe_test_suite.ts +1 -21
  80. package/src/simulator/index.ts +2 -1
  81. package/src/simulator_oracle/index.ts +13 -9
  82. package/src/synchronizer/synchronizer.ts +17 -14
  83. package/dest/kernel_prover/private_inputs_builders/build_private_kernel_tail_outputs.d.ts +0 -4
  84. package/dest/kernel_prover/private_inputs_builders/build_private_kernel_tail_outputs.d.ts.map +0 -1
  85. package/dest/kernel_prover/private_inputs_builders/build_private_kernel_tail_outputs.js +0 -10
  86. package/src/kernel_prover/private_inputs_builders/build_private_kernel_tail_outputs.ts +0 -30
@@ -1,6 +1,6 @@
1
1
  var _Synchronizer_instances, _Synchronizer_reprocessDeferredNotesForContract;
2
2
  import { __classPrivateFieldGet } from "tslib";
3
- import { L2BlockL2Logs, MerkleTreeId, } from '@aztec/circuit-types';
3
+ import { L2BlockL2Logs, MerkleTreeId } from '@aztec/circuit-types';
4
4
  import { INITIAL_L2_BLOCK_NUM } from '@aztec/circuits.js';
5
5
  import { createDebugLogger } from '@aztec/foundation/log';
6
6
  import { RunningPromise } from '@aztec/foundation/running-promise';
@@ -89,14 +89,15 @@ export class Synchronizer {
89
89
  if (blocks.length === 0) {
90
90
  return false;
91
91
  }
92
- const encryptedLogs = blocks.flatMap(block => block.body.encryptedLogs);
92
+ const noteEncryptedLogs = blocks.flatMap(block => block.body.noteEncryptedLogs);
93
93
  // Update latest tree roots from the most recent block
94
94
  const latestBlock = blocks[blocks.length - 1];
95
95
  await this.setHeaderFromBlock(latestBlock);
96
- const logCount = L2BlockL2Logs.getTotalLogCount(encryptedLogs);
96
+ const logCount = L2BlockL2Logs.getTotalLogCount(noteEncryptedLogs);
97
97
  this.log.debug(`Forwarding ${logCount} encrypted logs and blocks to ${this.noteProcessors.length} note processors`);
98
98
  for (const noteProcessor of this.noteProcessors) {
99
- await noteProcessor.process(blocks, encryptedLogs);
99
+ // TODO(#6830): pass in only the blocks
100
+ await noteProcessor.process(blocks, noteEncryptedLogs);
100
101
  }
101
102
  return true;
102
103
  }
@@ -154,8 +155,8 @@ export class Synchronizer {
154
155
  // behind main sync.
155
156
  throw new Error('No blocks in processor catch up mode');
156
157
  }
157
- const encryptedLogs = blocks.flatMap(block => block.body.encryptedLogs);
158
- const logCount = L2BlockL2Logs.getTotalLogCount(encryptedLogs);
158
+ const noteEncryptedLogs = blocks.flatMap(block => block.body.noteEncryptedLogs);
159
+ const logCount = L2BlockL2Logs.getTotalLogCount(noteEncryptedLogs);
159
160
  this.log.debug(`Forwarding ${logCount} encrypted logs and blocks to note processors in catch up mode`);
160
161
  for (const noteProcessor of catchUpGroup) {
161
162
  // find the index of the first block that the note processor is not yet synced to
@@ -167,7 +168,7 @@ export class Synchronizer {
167
168
  break;
168
169
  }
169
170
  this.log.debug(`Catching up note processor ${noteProcessor.masterIncomingViewingPublicKey.toString()} by processing ${blocks.length - index} blocks`);
170
- await noteProcessor.process(blocks.slice(index), encryptedLogs.slice(index));
171
+ await noteProcessor.process(blocks.slice(index), noteEncryptedLogs.slice(index));
171
172
  if (noteProcessor.status.syncedToBlock === toBlockNumber) {
172
173
  // Note processor caught up, move it to `noteProcessors` from `noteProcessorsToCatchUp`.
173
174
  this.log.debug(`Note processor for ${noteProcessor.masterIncomingViewingPublicKey.toString()} has caught up`, {
@@ -268,6 +269,13 @@ export class Synchronizer {
268
269
  notes: Object.fromEntries(this.noteProcessors.map(n => [n.masterIncomingViewingPublicKey.toString(), n.status.syncedToBlock])),
269
270
  };
270
271
  }
272
+ /**
273
+ * Returns the note processor stats.
274
+ * @returns The note processor stats for notes for each public key being tracked.
275
+ */
276
+ getSyncStats() {
277
+ return Object.fromEntries(this.noteProcessors.map(n => [n.masterIncomingViewingPublicKey.toString(), n.stats]));
278
+ }
271
279
  /**
272
280
  * Retry decoding any deferred notes for the specified contract address.
273
281
  * @param contractAddress - the contract address that has just been added
@@ -322,4 +330,4 @@ _Synchronizer_instances = new WeakSet(), _Synchronizer_reprocessDeferredNotesFor
322
330
  await this.db.removeNullifiedNotes(relevantNullifiers, publicKey);
323
331
  }
324
332
  };
325
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luY2hyb25pemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bmNocm9uaXplci9zeW5jaHJvbml6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBSUwsYUFBYSxFQUNiLFlBQVksR0FFYixNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFBOEIsb0JBQW9CLEVBQWtCLE1BQU0sb0JBQW9CLENBQUM7QUFFdEcsT0FBTyxFQUFvQixpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUtuRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFM0Q7Ozs7OztHQU1HO0FBQ0gsTUFBTSxPQUFPLFlBQVk7SUFRdkIsWUFBb0IsSUFBZSxFQUFVLEVBQWUsRUFBVSxRQUFxQixFQUFFLFNBQVMsR0FBRyxFQUFFOztRQUF2RixTQUFJLEdBQUosSUFBSSxDQUFXO1FBQVUsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQWE7UUFObkYsbUJBQWMsR0FBb0IsRUFBRSxDQUFDO1FBQ3JDLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsMkJBQXNCLEdBQUcsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO1FBRWxELDRCQUF1QixHQUFvQixFQUFFLENBQUM7UUFHcEQsSUFBSSxDQUFDLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLDBCQUEwQixTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUM3RyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxhQUFhLEdBQUcsSUFBSTtRQUNoRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBRXBCLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDaEYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRVMsS0FBSyxDQUFDLFdBQVc7UUFDekIsbUNBQW1DO1FBQ25DLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqRCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDMUYsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNPLElBQUksQ0FBQyxLQUFhO1FBQzFCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDbEMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLDJEQUEyRDtZQUMzRCxPQUFPLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2hDLElBQUksSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDNUMsNEdBQTRHO29CQUM1RyxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3hELENBQUM7cUJBQU0sQ0FBQztvQkFDTix5RUFBeUU7b0JBQ3pFLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3BDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDTyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDO1FBQzVCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN0RCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3hCLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUVELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBRXhFLHNEQUFzRDtZQUN0RCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM5QyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUUzQyxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDL0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ1osY0FBYyxRQUFRLGlDQUFpQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sa0JBQWtCLENBQ3BHLENBQUM7WUFDRixLQUFLLE1BQU0sYUFBYSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDaEQsTUFBTSxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztZQUNyRCxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLDRCQUE0QixFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2xELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDTyxLQUFLLENBQUMsd0JBQXdCLENBQUMsS0FBSyxHQUFHLENBQUM7UUFDaEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFFbkQsd0RBQXdEO1FBQ3hELCtFQUErRTtRQUMvRSxNQUFNLHVCQUF1QixHQUFvQixFQUFFLENBQUM7UUFFcEQsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUNuRCxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMsYUFBYSxJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUN4RCxzREFBc0Q7Z0JBQ3RELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzFDLENBQUM7aUJBQU0sQ0FBQztnQkFDTix1QkFBdUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDOUMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLHVCQUF1QixHQUFHLHVCQUF1QixDQUFDO1FBRXZELElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDekMsc0RBQXNEO1lBQ3RELHVEQUF1RDtZQUN2RCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCx5QkFBeUI7UUFDekIsOERBQThEO1FBQzlELDBEQUEwRDtRQUMxRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsdUJBQXVCO2FBQzlDLEtBQUssRUFBRTtZQUNSLG1EQUFtRDthQUNsRCxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRW5FLDBEQUEwRDtRQUMxRCxNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUM7UUFDdEQsNkVBQTZFO1FBQzdFLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxhQUFhLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2xELHFIQUFxSDtRQUVySCxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLEtBQUssOEJBQThCLENBQUMsQ0FBQztRQUMzRSxDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbkIsMEdBQTBHO2dCQUMxRyxvQkFBb0I7Z0JBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztZQUMxRCxDQUFDO1lBRUQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFeEUsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQy9ELElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGNBQWMsUUFBUSxnRUFBZ0UsQ0FBQyxDQUFDO1lBRXZHLEtBQUssTUFBTSxhQUFhLElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ3pDLGlGQUFpRjtnQkFDakYsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDM0YsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDakIseUZBQXlGO29CQUN6Riw4RUFBOEU7b0JBQzlFLDREQUE0RDtvQkFDNUQsTUFBTTtnQkFDUixDQUFDO2dCQUVELElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUNaLDhCQUE4QixhQUFhLENBQUMsOEJBQThCLENBQUMsUUFBUSxFQUFFLGtCQUNuRixNQUFNLENBQUMsTUFBTSxHQUFHLEtBQ2xCLFNBQVMsQ0FDVixDQUFDO2dCQUNGLE1BQU0sYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLGFBQWEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFFN0UsSUFBSSxhQUFhLENBQUMsTUFBTSxDQUFDLGFBQWEsS0FBSyxhQUFhLEVBQUUsQ0FBQztvQkFDekQsd0ZBQXdGO29CQUN4RixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FDWixzQkFBc0IsYUFBYSxDQUFDLDhCQUE4QixDQUFDLFFBQVEsRUFBRSxnQkFBZ0IsRUFDN0Y7d0JBQ0UsU0FBUyxFQUFFLDBCQUEwQjt3QkFDckMsU0FBUyxFQUFFLGFBQWEsQ0FBQyw4QkFBOEIsQ0FBQyxRQUFRLEVBQUU7d0JBQ2xFLFFBQVEsRUFBRSxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRTt3QkFDbEMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFO3dCQUM5QixHQUFHLGFBQWEsQ0FBQyxLQUFLO3FCQUNjLENBQ3ZDLENBQUM7b0JBRUYsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQ2hFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsOEJBQThCLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyw4QkFBOEIsQ0FBQyxDQUM5RixDQUFDO29CQUNGLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUMxQyxDQUFDO1lBQ0gsQ0FBQztZQUVELE9BQU8sSUFBSSxDQUFDLENBQUMsbURBQW1EO1FBQ2xFLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsZ0RBQWdELEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDdEUsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVPLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxXQUFvQjtRQUNuRCxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDckQsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksS0FBSyxDQUFDLElBQUk7UUFDZixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNyQixNQUFNLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNJLFVBQVUsQ0FBQyxTQUFvQixFQUFFLFFBQWtCLEVBQUUsYUFBcUI7UUFDL0UsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsOEJBQThCLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNGLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEcsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxJQUFJLGFBQWEsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQy9HLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksS0FBSyxDQUFDLDBCQUEwQixDQUFDLE9BQXFCO1FBQzNELE1BQU0sZUFBZSxHQUFHLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsT0FBTyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQ2pILENBQUM7UUFDRCxNQUFNLGVBQWUsR0FBRyxDQUFDLENBQWdCLEVBQUUsRUFBRSxDQUMzQyxDQUFDLENBQUMsOEJBQThCLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUNyRyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2xILElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxLQUFLLENBQ2Isc0RBQXNELE9BQU8sZ0RBQWdELENBQzlHLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxNQUFNLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRU8scUJBQXFCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsSUFBSSxJQUFJLENBQUMsc0JBQXNCLENBQUM7SUFDakUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksS0FBSyxDQUFDLHlCQUF5QjtRQUNwQyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDaEQsT0FBTyxNQUFNLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDaEQsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGFBQWE7UUFDbEIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDckQsT0FBTztZQUNMLE1BQU0sRUFBRSxlQUFlO1lBQ3ZCLEtBQUssRUFBRSxNQUFNLENBQUMsV0FBVyxDQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLDhCQUE4QixDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FDcEc7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNJLGlDQUFpQyxDQUFDLGVBQTZCO1FBQ3BFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsdUJBQUEsSUFBSSxnRkFBbUMsTUFBdkMsSUFBSSxFQUFvQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0lBQzNGLENBQUM7Q0E0REY7MkZBMURDLEtBQUssMERBQW9DLGVBQTZCO0lBQ3BFLE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUVoRiwyRUFBMkU7SUFDM0UsTUFBTSxxQkFBcUIsR0FBbUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUN4RSxLQUFLLE1BQU0sSUFBSSxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ2pDLE1BQU0sVUFBVSxHQUFHLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2hFLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEIscUJBQXFCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELDhCQUE4QjtJQUM5QixNQUFNLFFBQVEsR0FBYyxFQUFFLENBQUM7SUFDL0IsMEJBQTBCO0lBQzFCLEtBQUssTUFBTSxhQUFhLElBQUkscUJBQXFCLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztRQUMzRCw2RkFBNkY7UUFDN0YsS0FBSyxNQUFNLFNBQVMsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDNUMsTUFBTSxZQUFZLEdBQUcsTUFBTSxTQUFTLENBQUMsbUJBQW1CLENBQ3RELGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsOEJBQThCLENBQUMsQ0FBQyxDQUN4RixDQUFDO1lBQ0YsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDO1FBQ2pDLENBQUM7SUFDSCxDQUFDO0lBRUQseURBQXlEO0lBQ3pELE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyw2QkFBNkIsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUM3RCxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRWpDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ1osc0NBQXNDLE9BQU8sQ0FBQyxlQUFlLFlBQzNELE9BQU8sQ0FBQyxXQUNWLG1CQUFtQixPQUFPLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQ3hELENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztJQUVILDRDQUE0QztJQUM1QyxNQUFNLGdCQUFnQixHQUE4QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQzlELEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7UUFDL0IsTUFBTSxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN4RSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDaEMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsb0VBQW9FO0lBQ3BFLEtBQUssTUFBTSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQzVELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDckQsTUFBTSxrQkFBa0IsR0FBUyxFQUFFLENBQUM7UUFDcEMsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNuQyxtRkFBbUY7WUFDbkYsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLGNBQWMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUM5RixJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNWLGtCQUFrQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNyQyxDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBa0IsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNwRSxDQUFDO0FBQ0gsQ0FBQyJ9
333
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luY2hyb25pemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bmNocm9uaXplci9zeW5jaHJvbml6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQWdDLGFBQWEsRUFBRSxZQUFZLEVBQWUsTUFBTSxzQkFBc0IsQ0FBQztBQUU5RyxPQUFPLEVBQThCLG9CQUFvQixFQUFrQixNQUFNLG9CQUFvQixDQUFDO0FBRXRHLE9BQU8sRUFBb0IsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFNbkUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTNEOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyxZQUFZO0lBUXZCLFlBQW9CLElBQWUsRUFBVSxFQUFlLEVBQVUsUUFBcUIsRUFBRSxTQUFTLEdBQUcsRUFBRTs7UUFBdkYsU0FBSSxHQUFKLElBQUksQ0FBVztRQUFVLE9BQUUsR0FBRixFQUFFLENBQWE7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFhO1FBTm5GLG1CQUFjLEdBQW9CLEVBQUUsQ0FBQztRQUNyQyxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLDJCQUFzQixHQUFHLG9CQUFvQixHQUFHLENBQUMsQ0FBQztRQUVsRCw0QkFBdUIsR0FBb0IsRUFBRSxDQUFDO1FBR3BELElBQUksQ0FBQyxHQUFHLEdBQUcsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQywwQkFBMEIsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDN0csQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsYUFBYSxHQUFHLElBQUk7UUFDaEQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsT0FBTztR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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/pxe",
3
- "version": "0.40.1",
3
+ "version": "0.42.0",
4
4
  "type": "module",
5
5
  "exports": "./dest/index.js",
6
6
  "bin": "./dest/bin/index.js",
@@ -48,19 +48,19 @@
48
48
  ]
49
49
  },
50
50
  "dependencies": {
51
- "@aztec/bb-prover": "0.40.1",
52
- "@aztec/bb.js": "0.40.1",
53
- "@aztec/builder": "0.40.1",
54
- "@aztec/circuit-types": "0.40.1",
55
- "@aztec/circuits.js": "0.40.1",
56
- "@aztec/ethereum": "0.40.1",
57
- "@aztec/foundation": "0.40.1",
58
- "@aztec/key-store": "0.40.1",
59
- "@aztec/kv-store": "0.40.1",
60
- "@aztec/noir-protocol-circuits-types": "0.40.1",
61
- "@aztec/protocol-contracts": "0.40.1",
62
- "@aztec/simulator": "0.40.1",
63
- "@aztec/types": "0.40.1",
51
+ "@aztec/bb-prover": "0.42.0",
52
+ "@aztec/bb.js": "0.42.0",
53
+ "@aztec/builder": "0.42.0",
54
+ "@aztec/circuit-types": "0.42.0",
55
+ "@aztec/circuits.js": "0.42.0",
56
+ "@aztec/ethereum": "0.42.0",
57
+ "@aztec/foundation": "0.42.0",
58
+ "@aztec/key-store": "0.42.0",
59
+ "@aztec/kv-store": "0.42.0",
60
+ "@aztec/noir-protocol-circuits-types": "0.42.0",
61
+ "@aztec/protocol-contracts": "0.42.0",
62
+ "@aztec/simulator": "0.42.0",
63
+ "@aztec/types": "0.42.0",
64
64
  "@noir-lang/noirc_abi": "portal:../../noir/packages/noirc_abi",
65
65
  "koa": "^2.14.2",
66
66
  "koa-router": "^12.0.0",
@@ -37,12 +37,22 @@ export type PXEServiceConfig = PXEConfig & KernelProverConfig & BBProverConfig;
37
37
  * Creates an instance of PXEServiceConfig out of environment variables using sensible defaults for integration testing if not set.
38
38
  */
39
39
  export function getPXEServiceConfig(): PXEServiceConfig {
40
- const { PXE_BLOCK_POLLING_INTERVAL_MS, PXE_L2_STARTING_BLOCK, PXE_DATA_DIRECTORY } = process.env;
40
+ const {
41
+ PXE_BLOCK_POLLING_INTERVAL_MS,
42
+ PXE_L2_STARTING_BLOCK,
43
+ PXE_DATA_DIRECTORY,
44
+ BB_BINARY_PATH,
45
+ BB_WORKING_DIRECTORY,
46
+ PXE_PROVER_ENABLED,
47
+ } = process.env;
41
48
 
42
49
  return {
43
50
  l2BlockPollingIntervalMS: PXE_BLOCK_POLLING_INTERVAL_MS ? +PXE_BLOCK_POLLING_INTERVAL_MS : 1000,
44
51
  l2StartingBlock: PXE_L2_STARTING_BLOCK ? +PXE_L2_STARTING_BLOCK : INITIAL_L2_BLOCK_NUM,
45
52
  dataDirectory: PXE_DATA_DIRECTORY,
53
+ bbBinaryPath: BB_BINARY_PATH,
54
+ bbWorkingDirectory: BB_WORKING_DIRECTORY,
55
+ proverEnabled: ['1', 'true'].includes(PXE_PROVER_ENABLED!),
46
56
  };
47
57
  }
48
58
 
@@ -145,6 +145,13 @@ export class ContractDataOracle {
145
145
  return await Promise.resolve(MembershipWitness.random(VK_TREE_HEIGHT));
146
146
  }
147
147
 
148
+ public async getDebugFunctionName(contractAddress: AztecAddress, selector: FunctionSelector) {
149
+ const tree = await this.getTreeForAddress(contractAddress);
150
+ const { name: contractName } = tree.getArtifact();
151
+ const { name: functionName } = tree.getFunctionArtifact(selector);
152
+ return `${contractName}:${functionName}`;
153
+ }
154
+
148
155
  /**
149
156
  * Retrieve or create a ContractTree instance based on the provided class id.
150
157
  * If an existing tree with the same class id is found in the cache, it will be returned.
@@ -37,7 +37,9 @@ export class PrivateFunctionsTree {
37
37
  const artifact = this.artifact.functions.find(f => selector.equals(f.name, f.parameters));
38
38
  if (!artifact) {
39
39
  throw new Error(
40
- `Unknown function. Selector ${selector.toString()} not found in the artifact with class ${this.getContractClassId().toString()}.`,
40
+ `Unknown function. Selector ${selector.toString()} not found in the artifact ${
41
+ this.artifact.name
42
+ } with class ${this.getContractClassId().toString()}.`,
41
43
  );
42
44
  }
43
45
  return artifact;
@@ -385,8 +385,8 @@ export class KVPxeDatabase implements PxeDatabase {
385
385
  return value ? CompleteAddress.fromBuffer(value) : undefined;
386
386
  }
387
387
 
388
- getCompleteAddress(address: AztecAddress): Promise<CompleteAddress | undefined> {
389
- return Promise.resolve(this.#getCompleteAddress(address));
388
+ getCompleteAddress(account: AztecAddress): Promise<CompleteAddress | undefined> {
389
+ return Promise.resolve(this.#getCompleteAddress(account));
390
390
  }
391
391
 
392
392
  getCompleteAddresses(): Promise<CompleteAddress[]> {
@@ -133,14 +133,14 @@ export interface PxeDatabase extends ContractArtifactDatabase, ContractInstanceD
133
133
  addCompleteAddress(address: CompleteAddress): Promise<boolean>;
134
134
 
135
135
  /**
136
- * Retrieves the complete address corresponding to the provided aztec address.
137
- * @param address - The aztec address of the complete address contract.
138
- * @returns A promise that resolves to a CompleteAddress instance if the address is found, or undefined if not found.
136
+ * Retrieve the complete address associated to a given address.
137
+ * @param account - The account address.
138
+ * @returns A promise that resolves to a CompleteAddress instance if found, or undefined if not found.
139
139
  */
140
- getCompleteAddress(address: AztecAddress): Promise<CompleteAddress | undefined>;
140
+ getCompleteAddress(account: AztecAddress): Promise<CompleteAddress | undefined>;
141
141
 
142
142
  /**
143
- * Retrieves the list of complete address added to this database
143
+ * Retrieves the list of complete addresses added to this database
144
144
  * @returns A promise that resolves to an array of AztecAddress instances.
145
145
  */
146
146
  getCompleteAddresses(): Promise<CompleteAddress[]>;
@@ -1,15 +1,18 @@
1
- import { type AztecNode, type KeyStore } from '@aztec/circuit-types';
1
+ import { type AztecNode } from '@aztec/circuit-types';
2
2
  import {
3
3
  type AztecAddress,
4
4
  type Fr,
5
5
  type FunctionSelector,
6
+ type GrumpkinPrivateKey,
6
7
  MembershipWitness,
7
8
  type NOTE_HASH_TREE_HEIGHT,
8
9
  type Point,
9
10
  computeContractClassIdPreimage,
10
11
  computeSaltedInitializationHash,
11
12
  } from '@aztec/circuits.js';
13
+ import { createDebugLogger } from '@aztec/foundation/log';
12
14
  import { type Tuple } from '@aztec/foundation/serialize';
15
+ import { type KeyStore } from '@aztec/key-store';
13
16
 
14
17
  import { type ContractDataOracle } from '../contract_data_oracle/index.js';
15
18
  import { type ProvingDataOracle } from './../kernel_prover/proving_data_oracle.js';
@@ -20,7 +23,12 @@ import { type ProvingDataOracle } from './../kernel_prover/proving_data_oracle.j
20
23
  * A data oracle that provides information needed for simulating a transaction.
21
24
  */
22
25
  export class KernelOracle implements ProvingDataOracle {
23
- constructor(private contractDataOracle: ContractDataOracle, private keyStore: KeyStore, private node: AztecNode) {}
26
+ constructor(
27
+ private contractDataOracle: ContractDataOracle,
28
+ private keyStore: KeyStore,
29
+ private node: AztecNode,
30
+ private log = createDebugLogger('aztec:pxe:kernel_oracle'),
31
+ ) {}
24
32
 
25
33
  public async getContractAddressPreimage(address: AztecAddress) {
26
34
  const instance = await this.contractDataOracle.getContractInstance(address);
@@ -61,7 +69,11 @@ export class KernelOracle implements ProvingDataOracle {
61
69
  return header.state.partial.noteHashTree.root;
62
70
  }
63
71
 
64
- public getMasterNullifierSecretKey(nullifierPublicKey: Point) {
65
- return this.keyStore.getMasterNullifierSecretKeyForPublicKey(nullifierPublicKey);
72
+ public getMasterSecretKey(masterPublicKey: Point): Promise<GrumpkinPrivateKey> {
73
+ return this.keyStore.getMasterSecretKey(masterPublicKey);
74
+ }
75
+
76
+ public getDebugFunctionName(contractAddress: AztecAddress, selector: FunctionSelector): Promise<string> {
77
+ return this.contractDataOracle.getDebugFunctionName(contractAddress, selector);
66
78
  }
67
79
  }
@@ -2,7 +2,12 @@ import { type KernelProofOutput, type ProofCreator } from '@aztec/circuit-types'
2
2
  import {
3
3
  CallRequest,
4
4
  Fr,
5
- MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL,
5
+ MAX_KEY_VALIDATION_REQUESTS_PER_TX,
6
+ MAX_NEW_NOTE_HASHES_PER_TX,
7
+ MAX_NEW_NULLIFIERS_PER_TX,
8
+ MAX_NOTE_ENCRYPTED_LOGS_PER_TX,
9
+ MAX_NOTE_HASH_READ_REQUESTS_PER_TX,
10
+ MAX_NULLIFIER_READ_REQUESTS_PER_TX,
6
11
  MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,
7
12
  NESTED_RECURSIVE_PROOF_LENGTH,
8
13
  PrivateCallData,
@@ -17,6 +22,7 @@ import {
17
22
  type TxRequest,
18
23
  VK_TREE_HEIGHT,
19
24
  VerificationKeyAsFields,
25
+ getNonEmptyItems,
20
26
  makeRecursiveProof,
21
27
  } from '@aztec/circuits.js';
22
28
  import { padArrayEnd } from '@aztec/foundation/collection';
@@ -26,9 +32,10 @@ import { pushTestData } from '@aztec/foundation/testing';
26
32
  import { type ExecutionResult, collectNoteHashLeafIndexMap, collectNullifiedNoteHashCounters } from '@aztec/simulator';
27
33
 
28
34
  import {
35
+ buildPrivateKernelInitHints,
29
36
  buildPrivateKernelInnerHints,
37
+ buildPrivateKernelResetInputs,
30
38
  buildPrivateKernelTailHints,
31
- buildPrivateKernelTailOutputs,
32
39
  } from './private_inputs_builders/index.js';
33
40
  import { type ProvingDataOracle } from './proving_data_oracle.js';
34
41
 
@@ -70,41 +77,50 @@ export class KernelProver {
70
77
  const noteHashNullifierCounterMap = collectNullifiedNoteHashCounters(executionResult);
71
78
 
72
79
  while (executionStack.length) {
80
+ if (!firstIteration && this.needsReset(executionStack, output)) {
81
+ output = await this.runReset(executionStack, output, noteHashLeafIndexMap, noteHashNullifierCounterMap);
82
+ }
73
83
  const currentExecution = executionStack.pop()!;
74
- executionStack.push(...currentExecution.nestedExecutions);
84
+ executionStack.push(...[...currentExecution.nestedExecutions].reverse());
75
85
 
76
- const privateCallRequests = currentExecution.nestedExecutions.map(result =>
77
- result.callStackItem.toCallRequest(currentExecution.callStackItem.publicInputs.callContext),
78
- );
79
86
  const publicCallRequests = currentExecution.enqueuedPublicFunctionCalls.map(result => result.toCallRequest());
80
87
  const publicTeardownCallRequest = currentExecution.publicTeardownFunctionCall.isEmpty()
81
88
  ? CallRequest.empty()
82
89
  : currentExecution.publicTeardownFunctionCall.toCallRequest();
83
90
 
91
+ const functionName = await this.oracle.getDebugFunctionName(
92
+ currentExecution.callStackItem.contractAddress,
93
+ currentExecution.callStackItem.functionData.selector,
94
+ );
95
+
84
96
  const proofOutput = await this.proofCreator.createAppCircuitProof(
85
97
  currentExecution.partialWitness,
86
98
  currentExecution.acir,
99
+ functionName,
87
100
  );
88
101
 
89
102
  const privateCallData = await this.createPrivateCallData(
90
103
  currentExecution,
91
- privateCallRequests,
92
104
  publicCallRequests,
93
105
  publicTeardownCallRequest,
94
106
  proofOutput.proof,
95
107
  proofOutput.verificationKey,
96
108
  );
97
109
 
98
- const hints = buildPrivateKernelInnerHints(
99
- currentExecution.callStackItem.publicInputs,
100
- noteHashNullifierCounterMap,
101
- );
102
-
103
110
  if (firstIteration) {
111
+ const hints = buildPrivateKernelInitHints(
112
+ currentExecution.callStackItem.publicInputs,
113
+ noteHashNullifierCounterMap,
114
+ currentExecution.callStackItem.publicInputs.privateCallRequests,
115
+ );
104
116
  const proofInput = new PrivateKernelInitCircuitPrivateInputs(txRequest, privateCallData, hints);
105
117
  pushTestData('private-kernel-inputs-init', proofInput);
106
118
  output = await this.proofCreator.createProofInit(proofInput);
107
119
  } else {
120
+ const hints = buildPrivateKernelInnerHints(
121
+ currentExecution.callStackItem.publicInputs,
122
+ noteHashNullifierCounterMap,
123
+ );
108
124
  const previousVkMembershipWitness = await this.oracle.getVkMembershipWitness(output.verificationKey);
109
125
  const previousKernelData = new PrivateKernelData(
110
126
  output.publicInputs,
@@ -120,6 +136,9 @@ export class KernelProver {
120
136
  firstIteration = false;
121
137
  }
122
138
 
139
+ if (this.somethingToReset(output)) {
140
+ output = await this.runReset(executionStack, output, noteHashLeafIndexMap, noteHashNullifierCounterMap);
141
+ }
123
142
  const previousVkMembershipWitness = await this.oracle.getVkMembershipWitness(output.verificationKey);
124
143
  const previousKernelData = new PrivateKernelData(
125
144
  output.publicInputs,
@@ -133,19 +152,76 @@ export class KernelProver {
133
152
  `Calling private kernel tail with hwm ${previousKernelData.publicInputs.minRevertibleSideEffectCounter}`,
134
153
  );
135
154
 
136
- const hints = await buildPrivateKernelTailHints(output.publicInputs, noteHashLeafIndexMap, this.oracle);
155
+ const hints = buildPrivateKernelTailHints(output.publicInputs);
137
156
 
138
- const expectedOutputs = buildPrivateKernelTailOutputs(hints.sortedNewNoteHashes, hints.sortedNewNullifiers);
139
-
140
- const privateInputs = new PrivateKernelTailCircuitPrivateInputs(previousKernelData, expectedOutputs, hints);
157
+ const privateInputs = new PrivateKernelTailCircuitPrivateInputs(previousKernelData, hints);
141
158
 
142
159
  pushTestData('private-kernel-inputs-ordering', privateInputs);
143
160
  return await this.proofCreator.createProofTail(privateInputs);
144
161
  }
145
162
 
163
+ private needsReset(executionStack: ExecutionResult[], output: KernelProofOutput<PrivateKernelCircuitPublicInputs>) {
164
+ const nextIteration = executionStack[executionStack.length - 1];
165
+ return (
166
+ getNonEmptyItems(nextIteration.callStackItem.publicInputs.newNoteHashes).length +
167
+ getNonEmptyItems(output.publicInputs.end.newNoteHashes).length >
168
+ MAX_NEW_NOTE_HASHES_PER_TX ||
169
+ getNonEmptyItems(nextIteration.callStackItem.publicInputs.newNullifiers).length +
170
+ getNonEmptyItems(output.publicInputs.end.newNullifiers).length >
171
+ MAX_NEW_NULLIFIERS_PER_TX ||
172
+ getNonEmptyItems(nextIteration.callStackItem.publicInputs.noteEncryptedLogsHashes).length +
173
+ getNonEmptyItems(output.publicInputs.end.noteEncryptedLogsHashes).length >
174
+ MAX_NOTE_ENCRYPTED_LOGS_PER_TX ||
175
+ getNonEmptyItems(nextIteration.callStackItem.publicInputs.noteHashReadRequests).length +
176
+ getNonEmptyItems(output.publicInputs.validationRequests.noteHashReadRequests).length >
177
+ MAX_NOTE_HASH_READ_REQUESTS_PER_TX ||
178
+ getNonEmptyItems(nextIteration.callStackItem.publicInputs.nullifierReadRequests).length +
179
+ getNonEmptyItems(output.publicInputs.validationRequests.nullifierReadRequests).length >
180
+ MAX_NULLIFIER_READ_REQUESTS_PER_TX ||
181
+ getNonEmptyItems(nextIteration.callStackItem.publicInputs.keyValidationRequestsAndGenerators).length +
182
+ getNonEmptyItems(output.publicInputs.validationRequests.scopedKeyValidationRequestsAndGenerators).length >
183
+ MAX_KEY_VALIDATION_REQUESTS_PER_TX
184
+ );
185
+ }
186
+
187
+ private somethingToReset(output: KernelProofOutput<PrivateKernelCircuitPublicInputs>) {
188
+ return (
189
+ getNonEmptyItems(output.publicInputs.validationRequests.noteHashReadRequests).length > 0 ||
190
+ getNonEmptyItems(output.publicInputs.validationRequests.nullifierReadRequests).length > 0 ||
191
+ getNonEmptyItems(output.publicInputs.validationRequests.scopedKeyValidationRequestsAndGenerators).length > 0 ||
192
+ output.publicInputs.end.newNoteHashes.find(noteHash => noteHash.nullifierCounter !== 0) ||
193
+ output.publicInputs.end.newNullifiers.find(nullifier => !nullifier.nullifiedNoteHash.equals(Fr.zero()))
194
+ );
195
+ }
196
+
197
+ private async runReset(
198
+ executionStack: ExecutionResult[],
199
+ output: KernelProofOutput<PrivateKernelCircuitPublicInputs>,
200
+ noteHashLeafIndexMap: Map<bigint, bigint>,
201
+ noteHashNullifierCounterMap: Map<number, number>,
202
+ ): Promise<KernelProofOutput<PrivateKernelCircuitPublicInputs>> {
203
+ const previousVkMembershipWitness = await this.oracle.getVkMembershipWitness(output.verificationKey);
204
+ const previousKernelData = new PrivateKernelData(
205
+ output.publicInputs,
206
+ output.proof,
207
+ output.verificationKey,
208
+ Number(previousVkMembershipWitness.leafIndex),
209
+ assertLength<Fr, typeof VK_TREE_HEIGHT>(previousVkMembershipWitness.siblingPath, VK_TREE_HEIGHT),
210
+ );
211
+
212
+ return this.proofCreator.createProofReset(
213
+ await buildPrivateKernelResetInputs(
214
+ executionStack,
215
+ previousKernelData,
216
+ noteHashLeafIndexMap,
217
+ noteHashNullifierCounterMap,
218
+ this.oracle,
219
+ ),
220
+ );
221
+ }
222
+
146
223
  private async createPrivateCallData(
147
224
  { callStackItem }: ExecutionResult,
148
- privateCallRequests: CallRequest[],
149
225
  publicCallRequests: CallRequest[],
150
226
  publicTeardownCallRequest: CallRequest,
151
227
  proof: RecursiveProof<typeof RECURSIVE_PROOF_LENGTH>,
@@ -153,12 +229,6 @@ export class KernelProver {
153
229
  ) {
154
230
  const { contractAddress, functionData } = callStackItem;
155
231
 
156
- // Pad with empty items to reach max/const length expected by circuit.
157
- const privateCallStack = padArrayEnd(
158
- privateCallRequests,
159
- CallRequest.empty(),
160
- MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL,
161
- );
162
232
  const publicCallStack = padArrayEnd(publicCallRequests, CallRequest.empty(), MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL);
163
233
 
164
234
  const functionLeafMembershipWitness = await this.oracle.getFunctionMembershipWitness(
@@ -177,7 +247,6 @@ export class KernelProver {
177
247
 
178
248
  return PrivateCallData.from({
179
249
  callStackItem,
180
- privateCallStack,
181
250
  publicCallStack,
182
251
  publicTeardownCallRequest,
183
252
  proof,
@@ -0,0 +1,28 @@
1
+ import {
2
+ type MAX_NEW_NOTE_HASHES_PER_CALL,
3
+ type PrivateCallRequest,
4
+ type PrivateCircuitPublicInputs,
5
+ PrivateKernelInitHints,
6
+ countAccumulatedItems,
7
+ } from '@aztec/circuits.js';
8
+ import { type Tuple } from '@aztec/foundation/serialize';
9
+
10
+ export function buildPrivateKernelInitHints(
11
+ publicInputs: PrivateCircuitPublicInputs,
12
+ noteHashNullifierCounterMap: Map<number, number>,
13
+ privateCallRequests: PrivateCallRequest[],
14
+ ) {
15
+ const nullifierCounters = publicInputs.newNoteHashes.map(
16
+ n => noteHashNullifierCounterMap.get(n.counter) ?? 0,
17
+ ) as Tuple<number, typeof MAX_NEW_NOTE_HASHES_PER_CALL>;
18
+
19
+ const minRevertibleCounter = publicInputs.minRevertibleSideEffectCounter.toNumber();
20
+ let firstRevertiblePrivateCallRequestIndex = privateCallRequests.findIndex(
21
+ r => r.startSideEffectCounter >= minRevertibleCounter,
22
+ );
23
+ if (firstRevertiblePrivateCallRequestIndex === -1) {
24
+ firstRevertiblePrivateCallRequestIndex = countAccumulatedItems(privateCallRequests);
25
+ }
26
+
27
+ return new PrivateKernelInitHints(nullifierCounters, firstRevertiblePrivateCallRequestIndex);
28
+ }