@aztec/pxe 0.0.1-commit.7d4e6cd → 0.0.1-commit.808bf7f90

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 (261) hide show
  1. package/dest/access_scopes.d.ts +9 -0
  2. package/dest/access_scopes.d.ts.map +1 -0
  3. package/dest/access_scopes.js +6 -0
  4. package/dest/bin/check_oracle_version.js +1 -1
  5. package/dest/block_synchronizer/block_synchronizer.d.ts +11 -5
  6. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
  7. package/dest/block_synchronizer/block_synchronizer.js +72 -21
  8. package/dest/config/index.d.ts +3 -1
  9. package/dest/config/index.d.ts.map +1 -1
  10. package/dest/config/index.js +17 -0
  11. package/dest/config/package_info.js +1 -1
  12. package/dest/contract_function_simulator/benchmarked_node.d.ts +9 -0
  13. package/dest/contract_function_simulator/benchmarked_node.d.ts.map +1 -0
  14. package/dest/contract_function_simulator/benchmarked_node.js +77 -0
  15. package/dest/contract_function_simulator/contract_function_simulator.d.ts +57 -35
  16. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  17. package/dest/contract_function_simulator/contract_function_simulator.js +198 -84
  18. package/dest/contract_function_simulator/execution_note_cache.d.ts +18 -9
  19. package/dest/contract_function_simulator/execution_note_cache.d.ts.map +1 -1
  20. package/dest/contract_function_simulator/execution_note_cache.js +45 -28
  21. package/dest/contract_function_simulator/index.d.ts +2 -2
  22. package/dest/contract_function_simulator/index.d.ts.map +1 -1
  23. package/dest/contract_function_simulator/index.js +1 -1
  24. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +1 -1
  25. package/dest/contract_function_simulator/noir-structs/event_validation_request.js +2 -2
  26. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +3 -3
  27. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts.map +1 -1
  28. package/dest/contract_function_simulator/noir-structs/note_validation_request.js +2 -2
  29. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts +4 -10
  30. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts.map +1 -1
  31. package/dest/contract_function_simulator/noir-structs/utility_context.js +7 -18
  32. package/dest/contract_function_simulator/oracle/interfaces.d.ts +17 -13
  33. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  34. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts +3 -1
  35. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts.map +1 -1
  36. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts +6 -6
  37. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts.map +1 -1
  38. package/dest/contract_function_simulator/oracle/note_packing_utils.js +8 -8
  39. package/dest/contract_function_simulator/oracle/oracle.d.ts +12 -10
  40. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
  41. package/dest/contract_function_simulator/oracle/oracle.js +67 -44
  42. package/dest/contract_function_simulator/oracle/private_execution.d.ts +2 -26
  43. package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
  44. package/dest/contract_function_simulator/oracle/private_execution.js +0 -35
  45. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +44 -35
  46. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  47. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +82 -25
  48. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +66 -33
  49. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  50. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +130 -111
  51. package/dest/contract_logging.d.ts +22 -0
  52. package/dest/contract_logging.d.ts.map +1 -0
  53. package/dest/contract_logging.js +23 -0
  54. package/dest/contract_sync/contract_sync_service.d.ts +43 -0
  55. package/dest/contract_sync/contract_sync_service.d.ts.map +1 -0
  56. package/dest/contract_sync/contract_sync_service.js +97 -0
  57. package/dest/contract_sync/helpers.d.ts +29 -0
  58. package/dest/contract_sync/helpers.d.ts.map +1 -0
  59. package/dest/contract_sync/helpers.js +55 -0
  60. package/dest/debug/pxe_debug_utils.d.ts +24 -10
  61. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  62. package/dest/debug/pxe_debug_utils.js +28 -17
  63. package/dest/entrypoints/client/bundle/index.d.ts +4 -1
  64. package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
  65. package/dest/entrypoints/client/bundle/index.js +3 -0
  66. package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
  67. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  68. package/dest/entrypoints/client/bundle/utils.js +21 -7
  69. package/dest/entrypoints/client/lazy/index.d.ts +4 -1
  70. package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
  71. package/dest/entrypoints/client/lazy/index.js +3 -0
  72. package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
  73. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  74. package/dest/entrypoints/client/lazy/utils.js +22 -8
  75. package/dest/entrypoints/pxe_creation_options.d.ts +3 -2
  76. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  77. package/dest/entrypoints/server/index.d.ts +5 -1
  78. package/dest/entrypoints/server/index.d.ts.map +1 -1
  79. package/dest/entrypoints/server/index.js +4 -0
  80. package/dest/entrypoints/server/utils.d.ts +1 -1
  81. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  82. package/dest/entrypoints/server/utils.js +28 -9
  83. package/dest/events/event_service.d.ts +6 -6
  84. package/dest/events/event_service.d.ts.map +1 -1
  85. package/dest/events/event_service.js +19 -22
  86. package/dest/events/private_event_filter_validator.d.ts +5 -5
  87. package/dest/events/private_event_filter_validator.d.ts.map +1 -1
  88. package/dest/events/private_event_filter_validator.js +5 -6
  89. package/dest/job_coordinator/job_coordinator.d.ts +3 -2
  90. package/dest/job_coordinator/job_coordinator.d.ts.map +1 -1
  91. package/dest/job_coordinator/job_coordinator.js +3 -2
  92. package/dest/logs/log_service.d.ts +8 -5
  93. package/dest/logs/log_service.d.ts.map +1 -1
  94. package/dest/logs/log_service.js +28 -30
  95. package/dest/notes/note_service.d.ts +10 -9
  96. package/dest/notes/note_service.d.ts.map +1 -1
  97. package/dest/notes/note_service.js +34 -38
  98. package/dest/notes_filter.d.ts +25 -0
  99. package/dest/notes_filter.d.ts.map +1 -0
  100. package/dest/notes_filter.js +4 -0
  101. package/dest/oracle_version.d.ts +3 -3
  102. package/dest/oracle_version.d.ts.map +1 -1
  103. package/dest/oracle_version.js +4 -3
  104. package/dest/private_kernel/hints/compute_tx_expiration_timestamp.d.ts +4 -0
  105. package/dest/private_kernel/hints/compute_tx_expiration_timestamp.d.ts.map +1 -0
  106. package/dest/private_kernel/hints/{compute_tx_include_by_timestamp.js → compute_tx_expiration_timestamp.js} +12 -12
  107. package/dest/private_kernel/hints/index.d.ts +3 -3
  108. package/dest/private_kernel/hints/index.d.ts.map +1 -1
  109. package/dest/private_kernel/hints/index.js +2 -2
  110. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +28 -0
  111. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -0
  112. package/dest/private_kernel/hints/{build_private_kernel_reset_private_inputs.js → private_kernel_reset_private_inputs_builder.js} +15 -9
  113. package/dest/private_kernel/private_kernel_execution_prover.d.ts +3 -2
  114. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  115. package/dest/private_kernel/private_kernel_execution_prover.js +9 -9
  116. package/dest/private_kernel/private_kernel_oracle.d.ts +23 -24
  117. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  118. package/dest/private_kernel/private_kernel_oracle.js +94 -2
  119. package/dest/pxe.d.ts +75 -58
  120. package/dest/pxe.d.ts.map +1 -1
  121. package/dest/pxe.js +124 -132
  122. package/dest/storage/address_store/address_store.d.ts +1 -1
  123. package/dest/storage/address_store/address_store.d.ts.map +1 -1
  124. package/dest/storage/address_store/address_store.js +12 -11
  125. package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -1
  126. package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
  127. package/dest/storage/anchor_block_store/anchor_block_store.js +8 -1
  128. package/dest/storage/capsule_store/capsule_store.d.ts +24 -9
  129. package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
  130. package/dest/storage/capsule_store/capsule_store.js +130 -23
  131. package/dest/storage/contract_store/contract_store.d.ts +42 -16
  132. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  133. package/dest/storage/contract_store/contract_store.js +157 -84
  134. package/dest/storage/metadata.d.ts +1 -1
  135. package/dest/storage/metadata.js +1 -1
  136. package/dest/storage/note_store/note_store.d.ts +50 -51
  137. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  138. package/dest/storage/note_store/note_store.js +284 -263
  139. package/dest/storage/note_store/stored_note.d.ts +16 -0
  140. package/dest/storage/note_store/stored_note.d.ts.map +1 -0
  141. package/dest/storage/note_store/stored_note.js +43 -0
  142. package/dest/storage/private_event_store/private_event_store.d.ts +43 -8
  143. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  144. package/dest/storage/private_event_store/private_event_store.js +226 -111
  145. package/dest/storage/private_event_store/stored_private_event.d.ts +23 -0
  146. package/dest/storage/private_event_store/stored_private_event.d.ts.map +1 -0
  147. package/dest/storage/private_event_store/stored_private_event.js +56 -0
  148. package/dest/storage/tagging_store/recipient_tagging_store.d.ts +15 -8
  149. package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
  150. package/dest/storage/tagging_store/recipient_tagging_store.js +88 -19
  151. package/dest/storage/tagging_store/sender_address_book_store.d.ts +1 -1
  152. package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +1 -1
  153. package/dest/storage/tagging_store/sender_address_book_store.js +20 -14
  154. package/dest/storage/tagging_store/sender_tagging_store.d.ts +19 -9
  155. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  156. package/dest/storage/tagging_store/sender_tagging_store.js +252 -100
  157. package/dest/tagging/get_all_logs_by_tags.d.ts +24 -0
  158. package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -0
  159. package/dest/tagging/get_all_logs_by_tags.js +60 -0
  160. package/dest/tagging/index.d.ts +2 -1
  161. package/dest/tagging/index.d.ts.map +1 -1
  162. package/dest/tagging/index.js +1 -0
  163. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +3 -2
  164. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +1 -1
  165. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +10 -10
  166. package/dest/tagging/recipient_sync/utils/find_highest_indexes.js +2 -2
  167. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +3 -2
  168. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +1 -1
  169. package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +5 -2
  170. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +3 -2
  171. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
  172. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +7 -7
  173. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +1 -1
  174. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
  175. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +5 -8
  176. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +5 -2
  177. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
  178. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +10 -5
  179. package/package.json +27 -18
  180. package/src/access_scopes.ts +9 -0
  181. package/src/bin/check_oracle_version.ts +1 -0
  182. package/src/block_synchronizer/block_synchronizer.ts +91 -33
  183. package/src/config/index.ts +14 -0
  184. package/src/config/package_info.ts +1 -1
  185. package/src/contract_function_simulator/benchmarked_node.ts +103 -0
  186. package/src/contract_function_simulator/contract_function_simulator.ts +356 -148
  187. package/src/contract_function_simulator/execution_note_cache.ts +44 -25
  188. package/src/contract_function_simulator/index.ts +1 -1
  189. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +2 -2
  190. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +2 -2
  191. package/src/contract_function_simulator/noir-structs/utility_context.ts +6 -25
  192. package/src/contract_function_simulator/oracle/interfaces.ts +22 -12
  193. package/src/contract_function_simulator/oracle/note_packing_utils.ts +10 -10
  194. package/src/contract_function_simulator/oracle/oracle.ts +79 -47
  195. package/src/contract_function_simulator/oracle/private_execution.ts +1 -67
  196. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +118 -104
  197. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +197 -116
  198. package/src/contract_logging.ts +39 -0
  199. package/src/contract_sync/contract_sync_service.ts +152 -0
  200. package/src/contract_sync/helpers.ts +98 -0
  201. package/src/debug/pxe_debug_utils.ts +63 -18
  202. package/src/entrypoints/client/bundle/index.ts +3 -0
  203. package/src/entrypoints/client/bundle/utils.ts +16 -15
  204. package/src/entrypoints/client/lazy/index.ts +3 -0
  205. package/src/entrypoints/client/lazy/utils.ts +17 -15
  206. package/src/entrypoints/pxe_creation_options.ts +2 -1
  207. package/src/entrypoints/server/index.ts +4 -0
  208. package/src/entrypoints/server/utils.ts +22 -26
  209. package/src/events/event_service.ts +17 -25
  210. package/src/events/private_event_filter_validator.ts +3 -5
  211. package/src/job_coordinator/job_coordinator.ts +4 -3
  212. package/src/logs/log_service.ts +40 -34
  213. package/src/notes/note_service.ts +41 -45
  214. package/src/notes_filter.ts +26 -0
  215. package/src/oracle_version.ts +4 -3
  216. package/src/private_kernel/hints/{compute_tx_include_by_timestamp.ts → compute_tx_expiration_timestamp.ts} +13 -13
  217. package/src/private_kernel/hints/index.ts +2 -2
  218. package/src/private_kernel/hints/{build_private_kernel_reset_private_inputs.ts → private_kernel_reset_private_inputs_builder.ts} +38 -26
  219. package/src/private_kernel/private_kernel_execution_prover.ts +13 -10
  220. package/src/private_kernel/private_kernel_oracle.ts +116 -37
  221. package/src/pxe.ts +235 -209
  222. package/src/storage/address_store/address_store.ts +15 -15
  223. package/src/storage/anchor_block_store/anchor_block_store.ts +8 -0
  224. package/src/storage/capsule_store/capsule_store.ts +159 -23
  225. package/src/storage/contract_store/contract_store.ts +186 -96
  226. package/src/storage/metadata.ts +1 -1
  227. package/src/storage/note_store/note_store.ts +326 -320
  228. package/src/storage/note_store/stored_note.ts +48 -0
  229. package/src/storage/private_event_store/private_event_store.ts +292 -124
  230. package/src/storage/private_event_store/stored_private_event.ts +73 -0
  231. package/src/storage/tagging_store/recipient_tagging_store.ts +106 -20
  232. package/src/storage/tagging_store/sender_address_book_store.ts +20 -14
  233. package/src/storage/tagging_store/sender_tagging_store.ts +293 -108
  234. package/src/tagging/get_all_logs_by_tags.ts +92 -0
  235. package/src/tagging/index.ts +1 -0
  236. package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +20 -9
  237. package/src/tagging/recipient_sync/utils/find_highest_indexes.ts +2 -2
  238. package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +7 -1
  239. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +9 -6
  240. package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +5 -17
  241. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +16 -4
  242. package/dest/contract_function_simulator/proxied_node.d.ts +0 -9
  243. package/dest/contract_function_simulator/proxied_node.d.ts.map +0 -1
  244. package/dest/contract_function_simulator/proxied_node.js +0 -27
  245. package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.d.ts +0 -28
  246. package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.d.ts.map +0 -1
  247. package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts +0 -4
  248. package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts.map +0 -1
  249. package/dest/private_kernel/private_kernel_oracle_impl.d.ts +0 -46
  250. package/dest/private_kernel/private_kernel_oracle_impl.d.ts.map +0 -1
  251. package/dest/private_kernel/private_kernel_oracle_impl.js +0 -85
  252. package/dest/public_storage/public_storage_service.d.ts +0 -24
  253. package/dest/public_storage/public_storage_service.d.ts.map +0 -1
  254. package/dest/public_storage/public_storage_service.js +0 -26
  255. package/dest/tree_membership/tree_membership_service.d.ts +0 -52
  256. package/dest/tree_membership/tree_membership_service.d.ts.map +0 -1
  257. package/dest/tree_membership/tree_membership_service.js +0 -84
  258. package/src/contract_function_simulator/proxied_node.ts +0 -33
  259. package/src/private_kernel/private_kernel_oracle_impl.ts +0 -127
  260. package/src/public_storage/public_storage_service.ts +0 -33
  261. package/src/tree_membership/tree_membership_service.ts +0 -112
package/src/pxe.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import type { PrivateEventFilter } from '@aztec/aztec.js/wallet';
2
+ import { BlockNumber } from '@aztec/foundation/branded-types';
2
3
  import { Fr } from '@aztec/foundation/curves/bn254';
3
- import { type Logger, createLogger } from '@aztec/foundation/log';
4
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
4
5
  import { SerialQueue } from '@aztec/foundation/queue';
5
6
  import { Timer } from '@aztec/foundation/timer';
6
7
  import { KeyStore } from '@aztec/key-store';
@@ -19,14 +20,12 @@ import type { AuthWitness } from '@aztec/stdlib/auth-witness';
19
20
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
20
21
  import {
21
22
  CompleteAddress,
22
- type ContractClassWithId,
23
23
  type ContractInstanceWithAddress,
24
24
  type PartialAddress,
25
25
  computeContractAddressFromInstance,
26
26
  getContractClassFromArtifact,
27
27
  } from '@aztec/stdlib/contract';
28
28
  import { SimulationError } from '@aztec/stdlib/errors';
29
- import { computeProtocolNullifier, siloNullifier } from '@aztec/stdlib/hash';
30
29
  import type { AztecNode, PrivateKernelProver } from '@aztec/stdlib/interfaces/client';
31
30
  import type {
32
31
  PrivateExecutionStep,
@@ -34,6 +33,7 @@ import type {
34
33
  PrivateKernelTailCircuitPublicInputs,
35
34
  } from '@aztec/stdlib/kernel';
36
35
  import {
36
+ BlockHeader,
37
37
  type ContractOverrides,
38
38
  type InTx,
39
39
  PrivateExecutionResult,
@@ -47,20 +47,23 @@ import {
47
47
  TxProfileResult,
48
48
  TxProvingResult,
49
49
  TxSimulationResult,
50
- UtilitySimulationResult,
50
+ UtilityExecutionResult,
51
51
  } from '@aztec/stdlib/tx';
52
52
 
53
53
  import { inspect } from 'util';
54
54
 
55
+ import type { AccessScopes } from './access_scopes.js';
55
56
  import { BlockSynchronizer } from './block_synchronizer/index.js';
56
57
  import type { PXEConfig } from './config/index.js';
58
+ import { BenchmarkedNodeFactory } from './contract_function_simulator/benchmarked_node.js';
57
59
  import {
58
60
  ContractFunctionSimulator,
59
61
  generateSimulatedProvingResult,
60
62
  } from './contract_function_simulator/contract_function_simulator.js';
61
- import { readCurrentClassId } from './contract_function_simulator/oracle/private_execution.js';
62
63
  import { ProxiedContractStoreFactory } from './contract_function_simulator/proxied_contract_data_source.js';
63
- import { ProxiedNodeFactory } from './contract_function_simulator/proxied_node.js';
64
+ import { displayDebugLogs } from './contract_logging.js';
65
+ import { ContractSyncService } from './contract_sync/contract_sync_service.js';
66
+ import { readCurrentClassId } from './contract_sync/helpers.js';
64
67
  import { PXEDebugUtils } from './debug/pxe_debug_utils.js';
65
68
  import { enrichPublicSimulationError, enrichSimulationError } from './error_enriching.js';
66
69
  import { PrivateEventFilterValidator } from './events/private_event_filter_validator.js';
@@ -69,7 +72,7 @@ import {
69
72
  PrivateKernelExecutionProver,
70
73
  type PrivateKernelExecutionProverConfig,
71
74
  } from './private_kernel/private_kernel_execution_prover.js';
72
- import { PrivateKernelOracleImpl } from './private_kernel/private_kernel_oracle_impl.js';
75
+ import { PrivateKernelOracle } from './private_kernel/private_kernel_oracle.js';
73
76
  import { AddressStore } from './storage/address_store/address_store.js';
74
77
  import { AnchorBlockStore } from './storage/anchor_block_store/anchor_block_store.js';
75
78
  import { CapsuleStore } from './storage/capsule_store/capsule_store.js';
@@ -85,6 +88,56 @@ export type PackedPrivateEvent = InTx & {
85
88
  eventSelector: EventSelector;
86
89
  };
87
90
 
91
+ /** Options for PXE.profileTx. */
92
+ export type ProfileTxOpts = {
93
+ /** The profiling mode to use. */
94
+ profileMode: 'full' | 'execution-steps' | 'gates';
95
+ /** If true, proof generation is skipped during profiling. Defaults to true. */
96
+ skipProofGeneration?: boolean;
97
+ /** Addresses whose private state and keys are accessible during private execution. */
98
+ scopes: AccessScopes;
99
+ };
100
+
101
+ /** Options for PXE.simulateTx. */
102
+ export type SimulateTxOpts = {
103
+ /** Whether to simulate the public part of the transaction. */
104
+ simulatePublic: boolean;
105
+ /** If false, this function throws if the transaction is unable to be included in a block at the current state. */
106
+ skipTxValidation?: boolean;
107
+ /** If false, fees are enforced. */
108
+ skipFeeEnforcement?: boolean;
109
+ /** State overrides for the simulation, such as contract instances and artifacts. */
110
+ overrides?: SimulationOverrides;
111
+ /** Addresses whose private state and keys are accessible during private execution */
112
+ scopes: AccessScopes;
113
+ };
114
+
115
+ /** Options for PXE.executeUtility. */
116
+ export type ExecuteUtilityOpts = {
117
+ /** The authentication witnesses required for the function call. */
118
+ authwits?: AuthWitness[];
119
+ /** The accounts whose notes we can access in this call */
120
+ scopes: AccessScopes;
121
+ };
122
+
123
+ /** Args for PXE.create. */
124
+ export type PXECreateArgs = {
125
+ /** The Aztec node to connect to. */
126
+ node: AztecNode;
127
+ /** The key-value store for persisting PXE state. */
128
+ store: AztecAsyncKVStore;
129
+ /** The prover for generating private kernel proofs. */
130
+ proofCreator: PrivateKernelProver;
131
+ /** The circuit simulator for executing ACIR circuits. */
132
+ simulator: CircuitSimulator;
133
+ /** Provider for protocol contract artifacts and instances. */
134
+ protocolContractsProvider: ProtocolContractsProvider;
135
+ /** PXE configuration options. */
136
+ config: PXEConfig;
137
+ /** Optional logger instance or string suffix for the logger name. */
138
+ loggerOrSuffix?: string | Logger;
139
+ };
140
+
88
141
  /**
89
142
  * Private eXecution Environment (PXE) is a library used by wallets to simulate private phase of transactions and to
90
143
  * manage private state of users.
@@ -103,6 +156,7 @@ export class PXE {
103
156
  private recipientTaggingStore: RecipientTaggingStore,
104
157
  private addressStore: AddressStore,
105
158
  private privateEventStore: PrivateEventStore,
159
+ private contractSyncService: ContractSyncService,
106
160
  private simulator: CircuitSimulator,
107
161
  private proverEnabled: boolean,
108
162
  private proofCreator: PrivateKernelProver,
@@ -120,25 +174,31 @@ export class PXE {
120
174
  *
121
175
  * @returns A promise that resolves PXE is ready to be used.
122
176
  */
123
- public static async create(
124
- node: AztecNode,
125
- store: AztecAsyncKVStore,
126
- proofCreator: PrivateKernelProver,
127
- simulator: CircuitSimulator,
128
- protocolContractsProvider: ProtocolContractsProvider,
129
- config: PXEConfig,
130
- loggerOrSuffix?: string | Logger,
131
- ) {
177
+ public static async create({
178
+ node,
179
+ store,
180
+ proofCreator,
181
+ simulator,
182
+ protocolContractsProvider,
183
+ config,
184
+ loggerOrSuffix,
185
+ }: PXECreateArgs) {
186
+ // Extract bindings from the logger, or use empty bindings if a string suffix is provided.
187
+ const bindings: LoggerBindings | undefined =
188
+ loggerOrSuffix && typeof loggerOrSuffix !== 'string' ? loggerOrSuffix.getBindings() : undefined;
189
+
132
190
  const log =
133
191
  !loggerOrSuffix || typeof loggerOrSuffix === 'string'
134
192
  ? createLogger(loggerOrSuffix ? `pxe:service:${loggerOrSuffix}` : `pxe:service`)
135
193
  : loggerOrSuffix;
136
194
 
137
- const proverEnabled = !!config.proverEnabled;
195
+ const info = await node.getNodeInfo();
196
+
197
+ const proverEnabled = config.proverEnabled !== undefined ? config.proverEnabled : info.realProofs;
138
198
  const addressStore = new AddressStore(store);
139
199
  const privateEventStore = new PrivateEventStore(store);
140
200
  const contractStore = new ContractStore(store);
141
- const noteStore = await NoteStore.create(store);
201
+ const noteStore = new NoteStore(store);
142
202
  const anchorBlockStore = new AnchorBlockStore(store);
143
203
  const senderTaggingStore = new SenderTaggingStore(store);
144
204
  const senderAddressBookStore = new SenderAddressBookStore(store);
@@ -146,19 +206,35 @@ export class PXE {
146
206
  const capsuleStore = new CapsuleStore(store);
147
207
  const keyStore = new KeyStore(store);
148
208
  const tipsStore = new L2TipsKVStore(store, 'pxe');
209
+ const contractSyncService = new ContractSyncService(
210
+ node,
211
+ contractStore,
212
+ noteStore,
213
+ createLogger('pxe:contract_sync', bindings),
214
+ );
149
215
  const synchronizer = new BlockSynchronizer(
150
216
  node,
217
+ store,
151
218
  anchorBlockStore,
152
219
  noteStore,
153
220
  privateEventStore,
154
221
  tipsStore,
222
+ contractSyncService,
155
223
  config,
156
- loggerOrSuffix,
224
+ bindings,
157
225
  );
158
226
 
159
- const jobCoordinator = new JobCoordinator(store);
227
+ const jobCoordinator = new JobCoordinator(store, bindings);
228
+ jobCoordinator.registerStores([
229
+ capsuleStore,
230
+ senderTaggingStore,
231
+ recipientTaggingStore,
232
+ privateEventStore,
233
+ noteStore,
234
+ contractSyncService,
235
+ ]);
160
236
 
161
- const debugUtils = new PXEDebugUtils(contractStore, noteStore);
237
+ const debugUtils = new PXEDebugUtils(contractSyncService, noteStore, synchronizer, anchorBlockStore);
162
238
 
163
239
  const jobQueue = new SerialQueue();
164
240
 
@@ -175,6 +251,7 @@ export class PXE {
175
251
  recipientTaggingStore,
176
252
  addressStore,
177
253
  privateEventStore,
254
+ contractSyncService,
178
255
  simulator,
179
256
  proverEnabled,
180
257
  proofCreator,
@@ -185,12 +262,15 @@ export class PXE {
185
262
  debugUtils,
186
263
  );
187
264
 
188
- debugUtils.setPXE(pxe);
265
+ debugUtils.setPXEHelpers(
266
+ pxe.#putInJobQueue.bind(pxe),
267
+ pxe.#getSimulatorForTx.bind(pxe),
268
+ pxe.#executeUtility.bind(pxe),
269
+ );
189
270
 
190
271
  pxe.jobQueue.start();
191
272
 
192
273
  await pxe.#registerProtocolContracts();
193
- const info = await node.getNodeInfo();
194
274
  log.info(`Started PXE connected to chain ${info.l1ChainId} version ${info.rollupVersion}`);
195
275
  return pxe;
196
276
  }
@@ -200,20 +280,20 @@ export class PXE {
200
280
  #getSimulatorForTx(overrides?: { contracts?: ContractOverrides }) {
201
281
  const proxyContractStore = ProxiedContractStoreFactory.create(this.contractStore, overrides?.contracts);
202
282
 
203
- return new ContractFunctionSimulator(
204
- proxyContractStore,
205
- this.noteStore,
206
- this.keyStore,
207
- this.addressStore,
208
- ProxiedNodeFactory.create(this.node),
209
- this.anchorBlockStore,
210
- this.senderTaggingStore,
211
- this.recipientTaggingStore,
212
- this.senderAddressBookStore,
213
- this.capsuleStore,
214
- this.privateEventStore,
215
- this.simulator,
216
- );
283
+ return new ContractFunctionSimulator({
284
+ contractStore: proxyContractStore,
285
+ noteStore: this.noteStore,
286
+ keyStore: this.keyStore,
287
+ addressStore: this.addressStore,
288
+ aztecNode: BenchmarkedNodeFactory.create(this.node),
289
+ senderTaggingStore: this.senderTaggingStore,
290
+ recipientTaggingStore: this.recipientTaggingStore,
291
+ senderAddressBookStore: this.senderAddressBookStore,
292
+ capsuleStore: this.capsuleStore,
293
+ privateEventStore: this.privateEventStore,
294
+ simulator: this.simulator,
295
+ contractSyncService: this.contractSyncService,
296
+ });
217
297
  }
218
298
 
219
299
  #contextualizeError(err: Error, ...context: string[]): Error {
@@ -265,34 +345,20 @@ export class PXE {
265
345
  async #registerProtocolContracts() {
266
346
  const registered: Record<string, string> = {};
267
347
  for (const name of protocolContractNames) {
268
- const { address, contractClass, instance, artifact } =
269
- await this.protocolContractsProvider.getProtocolContractArtifact(name);
270
- await this.contractStore.addContractArtifact(contractClass.id, artifact);
348
+ const { address, instance, artifact } = await this.protocolContractsProvider.getProtocolContractArtifact(name);
349
+ await this.contractStore.addContractArtifact(artifact);
271
350
  await this.contractStore.addContractInstance(instance);
272
351
  registered[name] = address.toString();
273
352
  }
274
353
  this.log.verbose(`Registered protocol contracts in pxe`, registered);
275
354
  }
276
355
 
277
- async #isContractClassPubliclyRegistered(id: Fr): Promise<boolean> {
278
- return !!(await this.node.getContractClass(id));
279
- }
280
-
281
- async #isContractPublished(address: AztecAddress): Promise<boolean> {
282
- return !!(await this.node.getContract(address));
283
- }
284
-
285
- async #isContractInitialized(address: AztecAddress): Promise<boolean> {
286
- const initNullifier = await siloNullifier(address, address.toField());
287
- return !!(await this.node.getNullifierMembershipWitness('latest', initNullifier));
288
- }
289
-
290
356
  // Executes the entrypoint private function, as well as all nested private
291
357
  // functions that might arise.
292
358
  async #executePrivate(
293
359
  contractFunctionSimulator: ContractFunctionSimulator,
294
360
  txRequest: TxExecutionRequest,
295
- scopes: AztecAddress[] | undefined,
361
+ scopes: AccessScopes,
296
362
  jobId: string,
297
363
  ): Promise<PrivateExecutionResult> {
298
364
  const { origin: contractAddress, functionSelector } = txRequest;
@@ -300,18 +366,23 @@ export class PXE {
300
366
  try {
301
367
  const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
302
368
 
303
- const result = await contractFunctionSimulator.run(
304
- txRequest,
369
+ await this.contractSyncService.ensureContractSynced(
305
370
  contractAddress,
306
371
  functionSelector,
307
- undefined,
372
+ (privateSyncCall, execScopes) =>
373
+ this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
308
374
  anchorBlockHeader,
309
- // The sender for tags is set by contracts, typically by an account
310
- // contract entrypoint
311
- undefined, // senderForTags
312
- scopes,
313
375
  jobId,
376
+ scopes,
314
377
  );
378
+
379
+ const result = await contractFunctionSimulator.run(txRequest, {
380
+ contractAddress,
381
+ selector: functionSelector,
382
+ anchorBlockHeader,
383
+ scopes,
384
+ jobId,
385
+ });
315
386
  this.log.debug(`Private simulation completed for ${contractAddress.toString()}:${functionSelector}`);
316
387
  return result;
317
388
  } catch (err) {
@@ -323,20 +394,20 @@ export class PXE {
323
394
  }
324
395
 
325
396
  /**
326
- * Simulate a utility function call on the given contract.
397
+ * Execute a utility function call on the given contract.
327
398
  * @param contractFunctionSimulator - The simulator to use for the function call.
328
399
  * @param call - The function call to execute.
329
400
  * @param authWitnesses - Authentication witnesses required for the function call.
330
401
  * @param scopes - Optional array of account addresses whose notes can be accessed in this call. Defaults to all
331
402
  * accounts if not specified.
332
403
  * @param jobId - The job ID for staged writes.
333
- * @returns The simulation result containing the outputs of the utility function.
404
+ * @returns The execution result containing the outputs of the utility function.
334
405
  */
335
- async #simulateUtility(
406
+ async #executeUtility(
336
407
  contractFunctionSimulator: ContractFunctionSimulator,
337
408
  call: FunctionCall,
338
409
  authWitnesses: AuthWitness[] | undefined,
339
- scopes: AztecAddress[] | undefined,
410
+ scopes: AccessScopes,
340
411
  jobId: string,
341
412
  ) {
342
413
  try {
@@ -394,85 +465,45 @@ export class PXE {
394
465
  privateExecutionResult: PrivateExecutionResult,
395
466
  config: PrivateKernelExecutionProverConfig,
396
467
  ): Promise<PrivateKernelExecutionProofOutput<PrivateKernelTailCircuitPublicInputs>> {
397
- const simulationAnchorBlock = privateExecutionResult.getSimulationAnchorBlockNumber();
398
- const kernelOracle = new PrivateKernelOracleImpl(
399
- this.contractStore,
400
- this.keyStore,
401
- this.node,
402
- simulationAnchorBlock,
468
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
469
+ const anchorBlockHash = await anchorBlockHeader.hash();
470
+ const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHash);
471
+ const kernelTraceProver = new PrivateKernelExecutionProver(
472
+ kernelOracle,
473
+ proofCreator,
474
+ !this.proverEnabled,
475
+ this.log.getBindings(),
403
476
  );
404
- const kernelTraceProver = new PrivateKernelExecutionProver(kernelOracle, proofCreator, !this.proverEnabled);
405
477
  this.log.debug(`Executing kernel trace prover (${JSON.stringify(config)})...`);
406
478
  return await kernelTraceProver.proveWithKernels(txExecutionRequest.toTxRequest(), privateExecutionResult, config);
407
479
  }
408
480
 
409
481
  // Public API
410
482
 
411
- public getContractInstance(address: AztecAddress): Promise<ContractInstanceWithAddress | undefined> {
412
- return this.contractStore.getContractInstance(address);
483
+ /**
484
+ * Returns the block header up to which the PXE has synced.
485
+ * @returns The synced block header
486
+ */
487
+ public getSyncedBlockHeader(): Promise<BlockHeader> {
488
+ return this.anchorBlockStore.getBlockHeader();
413
489
  }
414
490
 
415
491
  /**
416
- * Returns the contract class metadata given a contract class id.
417
- * The metadata consists of its contract class, whether it has been publicly registered, and its artifact.
418
- * @remark - it queries the node to check whether the contract class with the given id has been publicly registered.
419
- * @param id - Identifier of the class.
420
- * @param includeArtifact - Identifier of the class.
421
- * @returns - It returns the contract class metadata, with the artifact field being optional, and will only be returned if true is passed in
422
- * for `includeArtifact`
423
- * TODO(@spalladino): The PXE actually holds artifacts and not classes, what should we return? Also,
424
- * should the pxe query the node for contract public info, and merge it with its own definitions?
425
- * TODO(@spalladino): This method is strictly needed to decide whether to publicly register a class or not
426
- * during a public deployment. We probably want a nicer and more general API for this, but it'll have to
427
- * do for the time being.
492
+ * Returns the contract instance for a given address, if it's registered in the PXE.
493
+ * @param address - The contract address.
494
+ * @returns The contract instance if found, undefined otherwise.
428
495
  */
429
- public async getContractClassMetadata(
430
- id: Fr,
431
- includeArtifact: boolean = false,
432
- ): Promise<{
433
- contractClass: ContractClassWithId | undefined;
434
- isContractClassPubliclyRegistered: boolean;
435
- artifact: ContractArtifact | undefined;
436
- }> {
437
- const artifact = await this.contractStore.getContractArtifact(id);
438
- if (!artifact) {
439
- this.log.warn(`No artifact found for contract class ${id.toString()} when looking for its metadata`);
440
- }
441
-
442
- return {
443
- contractClass: artifact && (await getContractClassFromArtifact(artifact)),
444
- isContractClassPubliclyRegistered: await this.#isContractClassPubliclyRegistered(id),
445
- artifact: includeArtifact ? artifact : undefined,
446
- };
496
+ public getContractInstance(address: AztecAddress): Promise<ContractInstanceWithAddress | undefined> {
497
+ return this.contractStore.getContractInstance(address);
447
498
  }
448
499
 
449
500
  /**
450
- * Returns the contract metadata given an address.
451
- * The metadata consists of its contract instance, which includes the contract class identifier,
452
- * initialization hash, deployment salt, and public keys hash; whether the contract instance has been initialized;
453
- * and whether the contract instance with the given address has been publicly deployed.
454
- * @remark - it queries the node to check whether the contract instance has been initialized / publicly deployed through a node.
455
- * This query is not dependent on the PXE.
456
- * @param address - The address that the contract instance resides at.
457
- * @returns - It returns the contract metadata
458
- * TODO(@spalladino): Should we return the public keys in plain as well here?
501
+ * Returns the contract artifact for a given contract class id, if it's registered in the PXE.
502
+ * @param id - Identifier of the contract class.
503
+ * @returns The contract artifact if found, undefined otherwise.
459
504
  */
460
- public async getContractMetadata(address: AztecAddress): Promise<{
461
- contractInstance: ContractInstanceWithAddress | undefined;
462
- isContractInitialized: boolean;
463
- isContractPublished: boolean;
464
- }> {
465
- let instance;
466
- try {
467
- instance = await this.contractStore.getContractInstance(address);
468
- } catch {
469
- this.log.warn(`No instance found for contract ${address.toString()} when looking for its metadata`);
470
- }
471
- return {
472
- contractInstance: instance,
473
- isContractInitialized: await this.#isContractInitialized(address),
474
- isContractPublished: await this.#isContractPublished(address),
475
- };
505
+ public async getContractArtifact(id: Fr): Promise<ContractArtifact | undefined> {
506
+ return await this.contractStore.getContractArtifact(id);
476
507
  }
477
508
 
478
509
  /**
@@ -497,7 +528,6 @@ export class PXE {
497
528
  }
498
529
 
499
530
  await this.addressStore.addCompleteAddress(accountCompleteAddress);
500
- await this.noteStore.addScope(accountCompleteAddress.address);
501
531
  return accountCompleteAddress;
502
532
  }
503
533
 
@@ -571,8 +601,7 @@ export class PXE {
571
601
  * @param artifact - The build artifact for the contract class.
572
602
  */
573
603
  public async registerContractClass(artifact: ContractArtifact): Promise<void> {
574
- const { id: contractClassId } = await getContractClassFromArtifact(artifact);
575
- await this.contractStore.addContractArtifact(contractClassId, artifact);
604
+ const contractClassId = await this.contractStore.addContractArtifact(artifact);
576
605
  this.log.info(`Added contract class ${artifact.name} with id ${contractClassId}`);
577
606
  }
578
607
 
@@ -591,17 +620,17 @@ export class PXE {
591
620
  if (artifact) {
592
621
  // If the user provides an artifact, validate it against the expected class id and register it
593
622
  const contractClass = await getContractClassFromArtifact(artifact);
594
- const contractClassId = contractClass.id;
595
- if (!contractClassId.equals(instance.currentContractClassId)) {
623
+ if (!contractClass.id.equals(instance.currentContractClassId)) {
596
624
  throw new Error(
597
- `Artifact does not match expected class id (computed ${contractClassId} but instance refers to ${instance.currentContractClassId})`,
625
+ `Artifact does not match expected class id (computed ${contractClass.id} but instance refers to ${instance.currentContractClassId})`,
598
626
  );
599
627
  }
600
628
  const computedAddress = await computeContractAddressFromInstance(instance);
601
629
  if (!computedAddress.equals(instance.address)) {
602
630
  throw new Error('Added a contract in which the address does not match the contract instance.');
603
631
  }
604
- await this.contractStore.addContractArtifact(contractClass.id, artifact);
632
+
633
+ await this.contractStore.addContractArtifact(artifact, contractClass);
605
634
 
606
635
  const publicFunctionSignatures = artifact.functions
607
636
  .filter(fn => fn.functionType === FunctionType.PUBLIC)
@@ -645,26 +674,21 @@ export class PXE {
645
674
 
646
675
  const header = await this.anchorBlockStore.getBlockHeader();
647
676
 
648
- const currentClassId = await readCurrentClassId(
649
- contractAddress,
650
- currentInstance,
651
- this.node,
652
- header.globalVariables.blockNumber,
653
- header.globalVariables.timestamp,
654
- );
677
+ const currentClassId = await readCurrentClassId(contractAddress, currentInstance, this.node, header);
655
678
  if (!contractClass.id.equals(currentClassId)) {
656
679
  throw new Error('Could not update contract to a class different from the current one.');
657
680
  }
658
681
 
659
- await this.contractStore.addContractArtifact(contractClass.id, artifact);
660
-
661
682
  const publicFunctionSignatures = artifact.functions
662
683
  .filter(fn => fn.functionType === FunctionType.PUBLIC)
663
684
  .map(fn => decodeFunctionSignature(fn.name, fn.parameters));
664
685
  await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
665
686
 
666
687
  currentInstance.currentContractClassId = contractClass.id;
667
- await this.contractStore.addContractInstance(currentInstance);
688
+ await Promise.all([
689
+ this.contractStore.addContractArtifact(artifact, contractClass),
690
+ this.contractStore.addContractInstance(currentInstance),
691
+ ]);
668
692
  this.log.info(`Updated contract ${artifact.name} at ${contractAddress.toString()} to class ${contractClass.id}`);
669
693
  });
670
694
  }
@@ -682,11 +706,12 @@ export class PXE {
682
706
  * (where validators prove the public portion).
683
707
  *
684
708
  * @param txRequest - An authenticated tx request ready for proving
709
+ * @param scopes - Addresses whose private state and keys are accessible during private execution.
685
710
  * @returns A result containing the proof and public inputs of the tail circuit.
686
711
  * @throws If contract code not found, or public simulation reverts.
687
712
  * Also throws if simulatePublic is true and public simulation reverts.
688
713
  */
689
- public proveTx(txRequest: TxExecutionRequest): Promise<TxProvingResult> {
714
+ public proveTx(txRequest: TxExecutionRequest, scopes: AztecAddress[]): Promise<TxProvingResult> {
690
715
  let privateExecutionResult: PrivateExecutionResult;
691
716
  // We disable proving concurrently mostly out of caution, since it accesses some of our stores. Proving is so
692
717
  // computationally demanding that it'd be rare for someone to try to do it concurrently regardless.
@@ -697,7 +722,7 @@ export class PXE {
697
722
  await this.blockStateSynchronizer.sync();
698
723
  const syncTime = syncTimer.ms();
699
724
  const contractFunctionSimulator = this.#getSimulatorForTx();
700
- privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, undefined, jobId);
725
+ privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, scopes, jobId);
701
726
 
702
727
  const {
703
728
  publicInputs,
@@ -744,7 +769,7 @@ export class PXE {
744
769
  // TODO(benesjan): The following is an expensive operation. Figure out a way to avoid it.
745
770
  const txHash = (await txProvingResult.toTx()).txHash;
746
771
 
747
- await this.senderTaggingStore.storePendingIndexes(preTagsUsedInTheTx, txHash);
772
+ await this.senderTaggingStore.storePendingIndexes(preTagsUsedInTheTx, txHash, jobId);
748
773
  this.log.debug(`Stored used pre-tags as sender for the tx`, {
749
774
  preTagsUsedInTheTx,
750
775
  });
@@ -761,17 +786,13 @@ export class PXE {
761
786
 
762
787
  /**
763
788
  * Profiles a transaction, reporting gate counts (unless disabled) and returns an execution trace.
764
- *
765
- * @param txRequest - An authenticated tx request ready for simulation
766
- * @param msgSender - (Optional) The message sender to use for the simulation.
767
- * @param skipTxValidation - (Optional) If false, this function throws if the transaction is unable to be included in a block at the current state.
789
+ * @param txRequest - An authenticated tx request ready for simulation.
768
790
  * @returns A trace of the program execution with gate counts.
769
791
  * @throws If the code for the functions executed in this transaction have not been made available via `addContracts`.
770
792
  */
771
793
  public profileTx(
772
794
  txRequest: TxExecutionRequest,
773
- profileMode: 'full' | 'execution-steps' | 'gates',
774
- skipProofGeneration: boolean = true,
795
+ { profileMode, skipProofGeneration = true, scopes }: ProfileTxOpts,
775
796
  ): Promise<TxProfileResult> {
776
797
  // We disable concurrent profiles for consistency with simulateTx.
777
798
  return this.#putInJobQueue(async jobId => {
@@ -794,12 +815,7 @@ export class PXE {
794
815
  const syncTime = syncTimer.ms();
795
816
 
796
817
  const contractFunctionSimulator = this.#getSimulatorForTx();
797
- const privateExecutionResult = await this.#executePrivate(
798
- contractFunctionSimulator,
799
- txRequest,
800
- undefined,
801
- jobId,
802
- );
818
+ const privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, scopes, jobId);
803
819
 
804
820
  const { executionSteps, timings: { proving } = {} } = await this.#prove(
805
821
  txRequest,
@@ -856,12 +872,7 @@ export class PXE {
856
872
  * In that case, the transaction returned is only potentially ready to be sent to the network for execution.
857
873
  *
858
874
  *
859
- * @param txRequest - An authenticated tx request ready for simulation
860
- * @param simulatePublic - Whether to simulate the public part of the transaction.
861
- * @param skipTxValidation - (Optional) If false, this function throws if the transaction is unable to be included in a block at the current state.
862
- * @param skipFeeEnforcement - (Optional) If false, fees are enforced.
863
- * @param overrides - (Optional) State overrides for the simulation, such as msgSender, contract instances and artifacts.
864
- * @param scopes - (Optional) The accounts whose notes we can access in this call. Currently optional and will default to all.
875
+ * @param txRequest - An authenticated tx request ready for simulation.
865
876
  * @returns A simulated transaction result object that includes public and private return values.
866
877
  * @throws If the code for the functions executed in this transaction have not been made available via `addContracts`.
867
878
  * Also throws if simulatePublic is true and public simulation reverts.
@@ -870,11 +881,7 @@ export class PXE {
870
881
  */
871
882
  public simulateTx(
872
883
  txRequest: TxExecutionRequest,
873
- simulatePublic: boolean,
874
- skipTxValidation: boolean = false,
875
- skipFeeEnforcement: boolean = false,
876
- overrides?: SimulationOverrides,
877
- scopes?: AztecAddress[],
884
+ { simulatePublic, skipTxValidation = false, skipFeeEnforcement = false, overrides, scopes }: SimulateTxOpts,
878
885
  ): Promise<TxSimulationResult> {
879
886
  // We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
880
887
  // to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
@@ -902,7 +909,14 @@ export class PXE {
902
909
  // Temporary: in case there are overrides, we have to skip the kernels or validations
903
910
  // will fail. Consider handing control to the user/wallet on whether they want to run them
904
911
  // or not.
905
- const skipKernels = overrides?.contracts !== undefined && Object.keys(overrides.contracts ?? {}).length > 0;
912
+ const overriddenContracts = overrides?.contracts ? new Set(Object.keys(overrides.contracts)) : undefined;
913
+ const hasOverriddenContracts = overriddenContracts !== undefined && overriddenContracts.size > 0;
914
+ const skipKernels = hasOverriddenContracts;
915
+
916
+ // Set overridden contracts on the sync service so it knows to skip syncing them
917
+ if (hasOverriddenContracts) {
918
+ this.contractSyncService.setOverriddenContracts(jobId, overriddenContracts);
919
+ }
906
920
 
907
921
  // Execution of private functions only; no proving, and no kernel logic.
908
922
  const privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, scopes, jobId);
@@ -911,15 +925,10 @@ export class PXE {
911
925
  let executionSteps: PrivateExecutionStep[] = [];
912
926
 
913
927
  if (skipKernels) {
914
- // According to the protocol rules, the nonce generator for the note hashes
915
- // can either be the first nullifier in the tx or the protocol nullifier if there are none.
916
- const nonceGenerator = privateExecutionResult.firstNullifier.equals(Fr.ZERO)
917
- ? await computeProtocolNullifier(await txRequest.toTxRequest().hash())
918
- : privateExecutionResult.firstNullifier;
919
928
  ({ publicInputs, executionSteps } = await generateSimulatedProvingResult(
920
929
  privateExecutionResult,
921
- nonceGenerator,
922
- this.contractStore,
930
+ (addr, sel) => this.contractStore.getDebugFunctionName(addr, sel),
931
+ this.node,
923
932
  ));
924
933
  } else {
925
934
  // Kernel logic, plus proving of all private functions and kernels.
@@ -938,6 +947,9 @@ export class PXE {
938
947
  const publicSimulationTimer = new Timer();
939
948
  publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement);
940
949
  publicSimulationTime = publicSimulationTimer.ms();
950
+ if (publicOutput?.debugLogs?.length) {
951
+ await displayDebugLogs(publicOutput.debugLogs, addr => this.contractStore.getDebugContractName(addr));
952
+ }
941
953
  }
942
954
 
943
955
  let validationTime: number | undefined;
@@ -997,29 +1009,23 @@ export class PXE {
997
1009
  inspect(txRequest),
998
1010
  `simulatePublic=${simulatePublic}`,
999
1011
  `skipTxValidation=${skipTxValidation}`,
1000
- `scopes=${scopes?.map(s => s.toString()).join(', ') ?? 'undefined'}`,
1012
+ `scopes=${scopes === 'ALL_SCOPES' ? scopes : scopes.map(s => s.toString()).join(', ')}`,
1001
1013
  );
1002
1014
  }
1003
1015
  });
1004
1016
  }
1005
1017
 
1006
1018
  /**
1007
- * Simulate the execution of a contract utility function.
1008
- *
1019
+ * Executes a contract utility function.
1009
1020
  * @param call - The function call containing the function details, arguments, and target contract address.
1010
- * @param authwits - (Optional) The authentication witnesses required for the function call.
1011
- * @param scopes - (Optional) The accounts whose notes we can access in this call. Currently optional and will
1012
- * default to all.
1013
- * @returns The result of the utility function call, structured based on the function ABI.
1014
1021
  */
1015
- public simulateUtility(
1022
+ public executeUtility(
1016
1023
  call: FunctionCall,
1017
- authwits?: AuthWitness[],
1018
- scopes?: AztecAddress[],
1019
- ): Promise<UtilitySimulationResult> {
1020
- // We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
1024
+ { authwits, scopes }: ExecuteUtilityOpts = { scopes: 'ALL_SCOPES' },
1025
+ ): Promise<UtilityExecutionResult> {
1026
+ // We disable concurrent executions since those might execute oracles which read and write to the PXE stores (e.g.
1021
1027
  // to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
1022
- // delete the same read value, or reading values that another simulation is currently modifying).
1028
+ // delete the same read value, or reading values that another execution is currently modifying).
1023
1029
  return this.#putInJobQueue(async jobId => {
1024
1030
  try {
1025
1031
  const totalTimer = new Timer();
@@ -1029,11 +1035,18 @@ export class PXE {
1029
1035
  const functionTimer = new Timer();
1030
1036
  const contractFunctionSimulator = this.#getSimulatorForTx();
1031
1037
 
1032
- await this.contractStore.syncPrivateState(call.to, call.selector, privateSyncCall =>
1033
- this.#simulateUtility(contractFunctionSimulator, privateSyncCall, [], undefined, jobId),
1038
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
1039
+ await this.contractSyncService.ensureContractSynced(
1040
+ call.to,
1041
+ call.selector,
1042
+ (privateSyncCall, execScopes) =>
1043
+ this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
1044
+ anchorBlockHeader,
1045
+ jobId,
1046
+ scopes,
1034
1047
  );
1035
1048
 
1036
- const executionResult = await this.#simulateUtility(
1049
+ const executionResult = await this.#executeUtility(
1037
1050
  contractFunctionSimulator,
1038
1051
  call,
1039
1052
  authwits ?? [],
@@ -1060,8 +1073,8 @@ export class PXE {
1060
1073
  const stringifiedArgs = args.map(arg => arg.toString()).join(', ');
1061
1074
  throw this.#contextualizeError(
1062
1075
  err,
1063
- `simulateUtility ${to}:${name}(${stringifiedArgs})`,
1064
- `scopes=${scopes?.map(s => s.toString()).join(', ') ?? 'undefined'}`,
1076
+ `executeUtility ${to}:${name}(${stringifiedArgs})`,
1077
+ `scopes=${scopes === 'ALL_SCOPES' ? scopes : scopes.map(s => s.toString()).join(', ')}`,
1065
1078
  );
1066
1079
  }
1067
1080
  });
@@ -1080,26 +1093,39 @@ export class PXE {
1080
1093
  * Defaults to the latest known block to PXE + 1.
1081
1094
  * @returns - The packed events with block and tx metadata.
1082
1095
  */
1083
- public getPrivateEvents(eventSelector: EventSelector, filter: PrivateEventFilter): Promise<PackedPrivateEvent[]> {
1084
- return this.#putInJobQueue(async jobId => {
1096
+ public async getPrivateEvents(
1097
+ eventSelector: EventSelector,
1098
+ filter: PrivateEventFilter,
1099
+ ): Promise<PackedPrivateEvent[]> {
1100
+ let anchorBlockNumber: BlockNumber;
1101
+
1102
+ await this.#putInJobQueue(async jobId => {
1085
1103
  await this.blockStateSynchronizer.sync();
1104
+
1105
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
1106
+ anchorBlockNumber = anchorBlockHeader.getBlockNumber();
1107
+
1086
1108
  const contractFunctionSimulator = this.#getSimulatorForTx();
1087
1109
 
1088
- await this.contractStore.syncPrivateState(
1110
+ await this.contractSyncService.ensureContractSynced(
1089
1111
  filter.contractAddress,
1090
1112
  null,
1091
- async privateSyncCall =>
1092
- await this.#simulateUtility(contractFunctionSimulator, privateSyncCall, [], undefined, jobId),
1113
+ async (privateSyncCall, execScopes) =>
1114
+ await this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
1115
+ anchorBlockHeader,
1116
+ jobId,
1117
+ filter.scopes,
1093
1118
  );
1119
+ });
1094
1120
 
1095
- const sanitizedFilter = await new PrivateEventFilterValidator(this.anchorBlockStore).validate(filter);
1121
+ // anchorBlockNumber is set during the job and fixed to whatever it is after a block sync
1122
+ const sanitizedFilter = new PrivateEventFilterValidator(anchorBlockNumber!).validate(filter);
1096
1123
 
1097
- this.log.debug(
1098
- `Getting private events for ${sanitizedFilter.contractAddress.toString()} from ${sanitizedFilter.fromBlock} to ${sanitizedFilter.toBlock}`,
1099
- );
1124
+ this.log.debug(
1125
+ `Getting private events for ${sanitizedFilter.contractAddress.toString()} from ${sanitizedFilter.fromBlock} to ${sanitizedFilter.toBlock}`,
1126
+ );
1100
1127
 
1101
- return this.privateEventStore.getPrivateEvents(eventSelector, sanitizedFilter);
1102
- });
1128
+ return this.privateEventStore.getPrivateEvents(eventSelector, sanitizedFilter);
1103
1129
  }
1104
1130
 
1105
1131
  /**