@aztec/pxe 0.0.1-commit.96bb3f7 → 0.0.1-commit.993d240

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 (379) hide show
  1. package/dest/bin/check_oracle_version.d.ts +12 -2
  2. package/dest/bin/check_oracle_version.d.ts.map +1 -1
  3. package/dest/bin/check_oracle_version.js +32 -26
  4. package/dest/bin/index.d.ts +2 -0
  5. package/dest/bin/index.d.ts.map +1 -0
  6. package/dest/bin/index.js +1 -0
  7. package/dest/block_synchronizer/block_stream_source.d.ts +10 -0
  8. package/dest/block_synchronizer/block_stream_source.d.ts.map +1 -0
  9. package/dest/block_synchronizer/block_stream_source.js +62 -0
  10. package/dest/block_synchronizer/block_synchronizer.d.ts +16 -6
  11. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
  12. package/dest/block_synchronizer/block_synchronizer.js +94 -23
  13. package/dest/config/index.d.ts +10 -2
  14. package/dest/config/index.d.ts.map +1 -1
  15. package/dest/config/index.js +17 -2
  16. package/dest/config/package_info.js +1 -1
  17. package/dest/contract_function_simulator/benchmarked_node.d.ts +9 -0
  18. package/dest/contract_function_simulator/benchmarked_node.d.ts.map +1 -0
  19. package/dest/contract_function_simulator/benchmarked_node.js +77 -0
  20. package/dest/contract_function_simulator/contract_function_simulator.d.ts +69 -36
  21. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  22. package/dest/contract_function_simulator/contract_function_simulator.js +240 -91
  23. package/dest/contract_function_simulator/ephemeral_array_service.d.ts +28 -0
  24. package/dest/contract_function_simulator/ephemeral_array_service.d.ts.map +1 -0
  25. package/dest/contract_function_simulator/ephemeral_array_service.js +78 -0
  26. package/dest/contract_function_simulator/execution_note_cache.d.ts +18 -9
  27. package/dest/contract_function_simulator/execution_note_cache.d.ts.map +1 -1
  28. package/dest/contract_function_simulator/execution_note_cache.js +45 -28
  29. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts +7 -11
  30. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts.map +1 -1
  31. package/dest/contract_function_simulator/execution_tagging_index_cache.js +19 -15
  32. package/dest/contract_function_simulator/index.d.ts +5 -2
  33. package/dest/contract_function_simulator/index.d.ts.map +1 -1
  34. package/dest/contract_function_simulator/index.js +4 -1
  35. package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts +48 -0
  36. package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts.map +1 -0
  37. package/dest/contract_function_simulator/noir-structs/bounded_vec.js +45 -0
  38. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +5 -7
  39. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts.map +1 -1
  40. package/dest/contract_function_simulator/noir-structs/event_validation_request.js +9 -10
  41. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts +13 -3
  42. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts.map +1 -1
  43. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.js +35 -4
  44. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts +2 -2
  45. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts.map +1 -1
  46. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.js +2 -4
  47. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +5 -8
  48. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts.map +1 -1
  49. package/dest/contract_function_simulator/noir-structs/note_validation_request.js +7 -11
  50. package/dest/contract_function_simulator/noir-structs/option.d.ts +61 -0
  51. package/dest/contract_function_simulator/noir-structs/option.d.ts.map +1 -0
  52. package/dest/contract_function_simulator/noir-structs/option.js +62 -0
  53. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts +4 -10
  54. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts.map +1 -1
  55. package/dest/contract_function_simulator/noir-structs/utility_context.js +7 -18
  56. package/dest/contract_function_simulator/oracle/interfaces.d.ts +70 -50
  57. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  58. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts +3 -1
  59. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts.map +1 -1
  60. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts +7 -7
  61. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts.map +1 -1
  62. package/dest/contract_function_simulator/oracle/note_packing_utils.js +10 -10
  63. package/dest/contract_function_simulator/oracle/oracle.d.ts +74 -43
  64. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
  65. package/dest/contract_function_simulator/oracle/oracle.js +471 -264
  66. package/dest/contract_function_simulator/oracle/oracle_registry.d.ts +147 -0
  67. package/dest/contract_function_simulator/oracle/oracle_registry.d.ts.map +1 -0
  68. package/dest/contract_function_simulator/oracle/oracle_registry.js +1199 -0
  69. package/dest/contract_function_simulator/oracle/private_execution.d.ts +2 -26
  70. package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
  71. package/dest/contract_function_simulator/oracle/private_execution.js +5 -38
  72. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +74 -91
  73. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  74. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +164 -110
  75. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +156 -78
  76. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  77. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +459 -186
  78. package/dest/contract_function_simulator/pick_notes.d.ts +1 -1
  79. package/dest/contract_function_simulator/pick_notes.d.ts.map +1 -1
  80. package/dest/contract_function_simulator/pick_notes.js +20 -3
  81. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts +1 -1
  82. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts.map +1 -1
  83. package/dest/contract_function_simulator/proxied_contract_data_source.js +35 -64
  84. package/dest/contract_logging.d.ts +27 -0
  85. package/dest/contract_logging.d.ts.map +1 -0
  86. package/dest/contract_logging.js +38 -0
  87. package/dest/contract_sync/contract_sync_service.d.ts +42 -0
  88. package/dest/contract_sync/contract_sync_service.d.ts.map +1 -0
  89. package/dest/contract_sync/contract_sync_service.js +135 -0
  90. package/dest/contract_sync/helpers.d.ts +27 -0
  91. package/dest/contract_sync/helpers.d.ts.map +1 -0
  92. package/dest/contract_sync/helpers.js +53 -0
  93. package/dest/debug/pxe_debug_utils.d.ts +19 -10
  94. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  95. package/dest/debug/pxe_debug_utils.js +22 -17
  96. package/dest/entrypoints/client/bundle/index.d.ts +3 -1
  97. package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
  98. package/dest/entrypoints/client/bundle/index.js +2 -0
  99. package/dest/entrypoints/client/bundle/utils.d.ts +2 -2
  100. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  101. package/dest/entrypoints/client/bundle/utils.js +33 -11
  102. package/dest/entrypoints/client/lazy/index.d.ts +3 -1
  103. package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
  104. package/dest/entrypoints/client/lazy/index.js +2 -0
  105. package/dest/entrypoints/client/lazy/utils.d.ts +3 -3
  106. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  107. package/dest/entrypoints/client/lazy/utils.js +34 -12
  108. package/dest/entrypoints/pxe_creation_options.d.ts +11 -2
  109. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  110. package/dest/entrypoints/pxe_creation_options.js +3 -1
  111. package/dest/entrypoints/server/index.d.ts +6 -2
  112. package/dest/entrypoints/server/index.d.ts.map +1 -1
  113. package/dest/entrypoints/server/index.js +5 -1
  114. package/dest/entrypoints/server/utils.d.ts +4 -3
  115. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  116. package/dest/entrypoints/server/utils.js +40 -13
  117. package/dest/events/event_service.d.ts +17 -8
  118. package/dest/events/event_service.d.ts.map +1 -1
  119. package/dest/events/event_service.js +58 -28
  120. package/dest/events/private_event_filter_validator.d.ts +6 -5
  121. package/dest/events/private_event_filter_validator.d.ts.map +1 -1
  122. package/dest/events/private_event_filter_validator.js +20 -6
  123. package/dest/hooks/authorize_utility_call.d.ts +41 -0
  124. package/dest/hooks/authorize_utility_call.d.ts.map +1 -0
  125. package/dest/hooks/authorize_utility_call.js +4 -0
  126. package/dest/hooks/execution_hooks.d.ts +42 -0
  127. package/dest/hooks/execution_hooks.d.ts.map +1 -0
  128. package/dest/hooks/execution_hooks.js +9 -0
  129. package/dest/hooks/index.d.ts +4 -0
  130. package/dest/hooks/index.d.ts.map +1 -0
  131. package/dest/hooks/index.js +1 -0
  132. package/dest/job_coordinator/job_coordinator.d.ts +3 -2
  133. package/dest/job_coordinator/job_coordinator.d.ts.map +1 -1
  134. package/dest/job_coordinator/job_coordinator.js +3 -2
  135. package/dest/logs/log_service.d.ts +13 -10
  136. package/dest/logs/log_service.d.ts.map +1 -1
  137. package/dest/logs/log_service.js +132 -84
  138. package/dest/messages/message_context_service.d.ts +17 -0
  139. package/dest/messages/message_context_service.d.ts.map +1 -0
  140. package/dest/messages/message_context_service.js +38 -0
  141. package/dest/notes/note_service.d.ts +31 -9
  142. package/dest/notes/note_service.d.ts.map +1 -1
  143. package/dest/notes/note_service.js +97 -77
  144. package/dest/notes_filter.d.ts +24 -0
  145. package/dest/notes_filter.d.ts.map +1 -0
  146. package/dest/notes_filter.js +4 -0
  147. package/dest/oracle_version.d.ts +4 -3
  148. package/dest/oracle_version.d.ts.map +1 -1
  149. package/dest/oracle_version.js +20 -9
  150. package/dest/private_kernel/batch_planner.d.ts +47 -0
  151. package/dest/private_kernel/batch_planner.d.ts.map +1 -0
  152. package/dest/private_kernel/batch_planner.js +104 -0
  153. package/dest/private_kernel/hints/compute_tx_expiration_timestamp.d.ts +4 -0
  154. package/dest/private_kernel/hints/compute_tx_expiration_timestamp.d.ts.map +1 -0
  155. package/dest/private_kernel/hints/{compute_tx_include_by_timestamp.js → compute_tx_expiration_timestamp.js} +12 -12
  156. package/dest/private_kernel/hints/index.d.ts +3 -3
  157. package/dest/private_kernel/hints/index.d.ts.map +1 -1
  158. package/dest/private_kernel/hints/index.js +2 -2
  159. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +29 -0
  160. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -0
  161. package/dest/private_kernel/hints/{build_private_kernel_reset_private_inputs.js → private_kernel_reset_private_inputs_builder.js} +141 -74
  162. package/dest/private_kernel/hints/test_utils.d.ts +122 -0
  163. package/dest/private_kernel/hints/test_utils.d.ts.map +1 -0
  164. package/dest/private_kernel/hints/test_utils.js +202 -0
  165. package/dest/private_kernel/private_kernel_execution_prover.d.ts +7 -2
  166. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  167. package/dest/private_kernel/private_kernel_execution_prover.js +168 -67
  168. package/dest/private_kernel/private_kernel_oracle.d.ts +28 -29
  169. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  170. package/dest/private_kernel/private_kernel_oracle.js +96 -2
  171. package/dest/pxe.d.ts +126 -59
  172. package/dest/pxe.d.ts.map +1 -1
  173. package/dest/pxe.js +257 -200
  174. package/dest/storage/address_store/address_store.d.ts +1 -1
  175. package/dest/storage/address_store/address_store.d.ts.map +1 -1
  176. package/dest/storage/address_store/address_store.js +12 -11
  177. package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -1
  178. package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
  179. package/dest/storage/anchor_block_store/anchor_block_store.js +9 -2
  180. package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.d.ts +42 -0
  181. package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.d.ts.map +1 -0
  182. package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.js +93 -0
  183. package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts +15 -0
  184. package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts.map +1 -0
  185. package/dest/storage/backwards_compatibility_tests/schema_tests.js +591 -0
  186. package/dest/storage/backwards_compatibility_tests/store_spy.d.ts +19 -0
  187. package/dest/storage/backwards_compatibility_tests/store_spy.d.ts.map +1 -0
  188. package/dest/storage/backwards_compatibility_tests/store_spy.js +63 -0
  189. package/dest/storage/capsule_store/capsule_service.d.ts +21 -0
  190. package/dest/storage/capsule_store/capsule_service.d.ts.map +1 -0
  191. package/dest/storage/capsule_store/capsule_service.js +50 -0
  192. package/dest/storage/capsule_store/capsule_store.d.ts +25 -10
  193. package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
  194. package/dest/storage/capsule_store/capsule_store.js +143 -28
  195. package/dest/storage/capsule_store/index.d.ts +2 -1
  196. package/dest/storage/capsule_store/index.d.ts.map +1 -1
  197. package/dest/storage/capsule_store/index.js +1 -0
  198. package/dest/storage/contract_store/contract_store.d.ts +42 -16
  199. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  200. package/dest/storage/contract_store/contract_store.js +158 -102
  201. package/dest/storage/metadata.d.ts +1 -1
  202. package/dest/storage/metadata.js +1 -1
  203. package/dest/storage/note_store/note_store.d.ts +50 -51
  204. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  205. package/dest/storage/note_store/note_store.js +284 -263
  206. package/dest/storage/note_store/stored_note.d.ts +16 -0
  207. package/dest/storage/note_store/stored_note.d.ts.map +1 -0
  208. package/dest/storage/note_store/stored_note.js +43 -0
  209. package/dest/storage/open_pxe_stores.d.ts +33 -0
  210. package/dest/storage/open_pxe_stores.d.ts.map +1 -0
  211. package/dest/storage/open_pxe_stores.js +27 -0
  212. package/dest/storage/private_event_store/private_event_store.d.ts +43 -8
  213. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  214. package/dest/storage/private_event_store/private_event_store.js +229 -111
  215. package/dest/storage/private_event_store/stored_private_event.d.ts +23 -0
  216. package/dest/storage/private_event_store/stored_private_event.d.ts.map +1 -0
  217. package/dest/storage/private_event_store/stored_private_event.js +56 -0
  218. package/dest/storage/tagging_store/recipient_tagging_store.d.ts +16 -9
  219. package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
  220. package/dest/storage/tagging_store/recipient_tagging_store.js +88 -19
  221. package/dest/storage/tagging_store/sender_address_book_store.d.ts +1 -1
  222. package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +1 -1
  223. package/dest/storage/tagging_store/sender_address_book_store.js +20 -14
  224. package/dest/storage/tagging_store/sender_tagging_store.d.ts +43 -32
  225. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  226. package/dest/storage/tagging_store/sender_tagging_store.js +300 -122
  227. package/dest/tagging/get_all_logs_by_tags.d.ts +48 -0
  228. package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -0
  229. package/dest/tagging/get_all_logs_by_tags.js +59 -0
  230. package/dest/tagging/index.d.ts +7 -5
  231. package/dest/tagging/index.d.ts.map +1 -1
  232. package/dest/tagging/index.js +5 -3
  233. package/dest/tagging/persist_sender_tagging_index_ranges.d.ts +29 -0
  234. package/dest/tagging/persist_sender_tagging_index_ranges.d.ts.map +1 -0
  235. package/dest/tagging/persist_sender_tagging_index_ranges.js +42 -0
  236. package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts +56 -0
  237. package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts.map +1 -0
  238. package/dest/tagging/recipient_sync/sync_tagged_private_logs.js +163 -0
  239. package/dest/tagging/recipient_sync/utils/find_highest_indexes.d.ts +3 -3
  240. package/dest/tagging/recipient_sync/utils/find_highest_indexes.d.ts.map +1 -1
  241. package/dest/tagging/recipient_sync/utils/find_highest_indexes.js +2 -2
  242. package/dest/tagging/reconcile_tagging_index_ranges.d.ts +36 -0
  243. package/dest/tagging/reconcile_tagging_index_ranges.d.ts.map +1 -0
  244. package/dest/tagging/reconcile_tagging_index_ranges.js +74 -0
  245. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +5 -9
  246. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
  247. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +34 -18
  248. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +13 -7
  249. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
  250. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +44 -16
  251. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +8 -7
  252. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
  253. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +44 -27
  254. package/package.json +31 -19
  255. package/src/bin/check_oracle_version.ts +42 -31
  256. package/src/bin/index.ts +1 -0
  257. package/src/block_synchronizer/block_stream_source.ts +81 -0
  258. package/src/block_synchronizer/block_synchronizer.ts +116 -36
  259. package/src/config/index.ts +21 -1
  260. package/src/config/package_info.ts +1 -1
  261. package/src/contract_function_simulator/benchmarked_node.ts +103 -0
  262. package/src/contract_function_simulator/contract_function_simulator.ts +417 -156
  263. package/src/contract_function_simulator/ephemeral_array_service.ts +110 -0
  264. package/src/contract_function_simulator/execution_note_cache.ts +44 -25
  265. package/src/contract_function_simulator/execution_tagging_index_cache.ts +19 -18
  266. package/src/contract_function_simulator/index.ts +4 -1
  267. package/src/contract_function_simulator/noir-structs/bounded_vec.ts +55 -0
  268. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +11 -10
  269. package/src/contract_function_simulator/noir-structs/log_retrieval_request.ts +36 -3
  270. package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +2 -5
  271. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +6 -11
  272. package/src/contract_function_simulator/noir-structs/option.ts +69 -0
  273. package/src/contract_function_simulator/noir-structs/utility_context.ts +6 -25
  274. package/src/contract_function_simulator/oracle/interfaces.ts +93 -70
  275. package/src/contract_function_simulator/oracle/note_packing_utils.ts +13 -13
  276. package/src/contract_function_simulator/oracle/oracle.ts +567 -461
  277. package/src/contract_function_simulator/oracle/oracle_registry.ts +904 -0
  278. package/src/contract_function_simulator/oracle/private_execution.ts +5 -71
  279. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +213 -209
  280. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +657 -254
  281. package/src/contract_function_simulator/pick_notes.ts +22 -3
  282. package/src/contract_function_simulator/proxied_contract_data_source.ts +41 -64
  283. package/src/contract_logging.ts +52 -0
  284. package/src/contract_sync/contract_sync_service.ts +189 -0
  285. package/src/contract_sync/helpers.ts +86 -0
  286. package/src/debug/pxe_debug_utils.ts +55 -18
  287. package/src/entrypoints/client/bundle/index.ts +2 -0
  288. package/src/entrypoints/client/bundle/utils.ts +26 -20
  289. package/src/entrypoints/client/lazy/index.ts +2 -0
  290. package/src/entrypoints/client/lazy/utils.ts +28 -21
  291. package/src/entrypoints/pxe_creation_options.ts +16 -1
  292. package/src/entrypoints/server/index.ts +5 -1
  293. package/src/entrypoints/server/utils.ts +37 -32
  294. package/src/events/event_service.ts +79 -39
  295. package/src/events/private_event_filter_validator.ts +23 -5
  296. package/src/hooks/authorize_utility_call.ts +44 -0
  297. package/src/hooks/execution_hooks.ts +48 -0
  298. package/src/hooks/index.ts +7 -0
  299. package/src/job_coordinator/job_coordinator.ts +4 -3
  300. package/src/logs/log_service.ts +171 -141
  301. package/src/messages/message_context_service.ts +45 -0
  302. package/src/notes/note_service.ts +137 -107
  303. package/src/notes_filter.ts +24 -0
  304. package/src/oracle_version.ts +20 -9
  305. package/src/private_kernel/batch_planner.ts +169 -0
  306. package/src/private_kernel/hints/{compute_tx_include_by_timestamp.ts → compute_tx_expiration_timestamp.ts} +13 -13
  307. package/src/private_kernel/hints/index.ts +2 -2
  308. package/src/private_kernel/hints/{build_private_kernel_reset_private_inputs.ts → private_kernel_reset_private_inputs_builder.ts} +196 -137
  309. package/src/private_kernel/hints/test_utils.ts +318 -0
  310. package/src/private_kernel/private_kernel_execution_prover.ts +261 -93
  311. package/src/private_kernel/private_kernel_oracle.ts +129 -40
  312. package/src/pxe.ts +467 -273
  313. package/src/storage/address_store/address_store.ts +15 -15
  314. package/src/storage/anchor_block_store/anchor_block_store.ts +9 -1
  315. package/src/storage/backwards_compatibility_tests/__snapshots__/AddressStore.json +22 -0
  316. package/src/storage/backwards_compatibility_tests/__snapshots__/AnchorBlockStore.json +3 -0
  317. package/src/storage/backwards_compatibility_tests/__snapshots__/CapsuleStore.json +16 -0
  318. package/src/storage/backwards_compatibility_tests/__snapshots__/ContractStore.json +28 -0
  319. package/src/storage/backwards_compatibility_tests/__snapshots__/KeyStore.json +52 -0
  320. package/src/storage/backwards_compatibility_tests/__snapshots__/L2TipsKVStore.json +46 -0
  321. package/src/storage/backwards_compatibility_tests/__snapshots__/NoteStore.json +36 -0
  322. package/src/storage/backwards_compatibility_tests/__snapshots__/PrivateEventStore.json +44 -0
  323. package/src/storage/backwards_compatibility_tests/__snapshots__/RecipientTaggingStore.json +18 -0
  324. package/src/storage/backwards_compatibility_tests/__snapshots__/SenderAddressBookStore.json +16 -0
  325. package/src/storage/backwards_compatibility_tests/__snapshots__/SenderTaggingStore.json +22 -0
  326. package/src/storage/backwards_compatibility_tests/__snapshots__/opened_stores.json +97 -0
  327. package/src/storage/backwards_compatibility_tests/kv_store_snapshot.ts +122 -0
  328. package/src/storage/backwards_compatibility_tests/schema_tests.ts +712 -0
  329. package/src/storage/backwards_compatibility_tests/store_spy.ts +73 -0
  330. package/src/storage/capsule_store/capsule_service.ts +90 -0
  331. package/src/storage/capsule_store/capsule_store.ts +183 -29
  332. package/src/storage/capsule_store/index.ts +1 -0
  333. package/src/storage/contract_store/contract_store.ts +194 -125
  334. package/src/storage/metadata.ts +1 -1
  335. package/src/storage/note_store/note_store.ts +323 -320
  336. package/src/storage/note_store/stored_note.ts +48 -0
  337. package/src/storage/open_pxe_stores.ts +49 -0
  338. package/src/storage/private_event_store/private_event_store.ts +296 -124
  339. package/src/storage/private_event_store/stored_private_event.ts +73 -0
  340. package/src/storage/tagging_store/recipient_tagging_store.ts +107 -21
  341. package/src/storage/tagging_store/sender_address_book_store.ts +20 -14
  342. package/src/storage/tagging_store/sender_tagging_store.ts +366 -134
  343. package/src/tagging/get_all_logs_by_tags.ts +120 -0
  344. package/src/tagging/index.ts +6 -4
  345. package/src/tagging/persist_sender_tagging_index_ranges.ts +57 -0
  346. package/src/tagging/recipient_sync/sync_tagged_private_logs.ts +240 -0
  347. package/src/tagging/recipient_sync/utils/find_highest_indexes.ts +4 -4
  348. package/src/tagging/reconcile_tagging_index_ranges.ts +102 -0
  349. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +59 -21
  350. package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +47 -29
  351. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +41 -29
  352. package/dest/contract_function_simulator/proxied_node.d.ts +0 -9
  353. package/dest/contract_function_simulator/proxied_node.d.ts.map +0 -1
  354. package/dest/contract_function_simulator/proxied_node.js +0 -27
  355. package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.d.ts +0 -28
  356. package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.d.ts.map +0 -1
  357. package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts +0 -4
  358. package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts.map +0 -1
  359. package/dest/private_kernel/private_kernel_oracle_impl.d.ts +0 -46
  360. package/dest/private_kernel/private_kernel_oracle_impl.d.ts.map +0 -1
  361. package/dest/private_kernel/private_kernel_oracle_impl.js +0 -85
  362. package/dest/public_storage/public_storage_service.d.ts +0 -24
  363. package/dest/public_storage/public_storage_service.d.ts.map +0 -1
  364. package/dest/public_storage/public_storage_service.js +0 -26
  365. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +0 -14
  366. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +0 -1
  367. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +0 -99
  368. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +0 -14
  369. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +0 -1
  370. package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +0 -29
  371. package/dest/tree_membership/tree_membership_service.d.ts +0 -52
  372. package/dest/tree_membership/tree_membership_service.d.ts.map +0 -1
  373. package/dest/tree_membership/tree_membership_service.js +0 -84
  374. package/src/contract_function_simulator/proxied_node.ts +0 -33
  375. package/src/private_kernel/private_kernel_oracle_impl.ts +0 -127
  376. package/src/public_storage/public_storage_service.ts +0 -33
  377. package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +0 -132
  378. package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +0 -43
  379. package/src/tree_membership/tree_membership_service.ts +0 -112
package/src/pxe.ts CHANGED
@@ -1,11 +1,11 @@
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';
7
8
  import type { AztecAsyncKVStore } from '@aztec/kv-store';
8
- import { L2TipsKVStore } from '@aztec/kv-store/stores';
9
9
  import { type ProtocolContractsProvider, protocolContractNames } from '@aztec/protocol-contracts';
10
10
  import type { CircuitSimulator } from '@aztec/simulator/client';
11
11
  import {
@@ -17,16 +17,15 @@ import {
17
17
  } from '@aztec/stdlib/abi';
18
18
  import type { AuthWitness } from '@aztec/stdlib/auth-witness';
19
19
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
20
+ import { GENESIS_BLOCK_HEADER_HASH, type L2TipsProvider } from '@aztec/stdlib/block';
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,44 +47,137 @@ 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
55
  import { BlockSynchronizer } from './block_synchronizer/index.js';
56
56
  import type { PXEConfig } from './config/index.js';
57
+ import { BenchmarkedNodeFactory } from './contract_function_simulator/benchmarked_node.js';
57
58
  import {
58
59
  ContractFunctionSimulator,
59
60
  generateSimulatedProvingResult,
60
61
  } from './contract_function_simulator/contract_function_simulator.js';
61
- import { readCurrentClassId } from './contract_function_simulator/oracle/private_execution.js';
62
62
  import { ProxiedContractStoreFactory } from './contract_function_simulator/proxied_contract_data_source.js';
63
- import { ProxiedNodeFactory } from './contract_function_simulator/proxied_node.js';
63
+ import { displayDebugLogs } from './contract_logging.js';
64
+ import { ContractSyncService } from './contract_sync/contract_sync_service.js';
65
+ import { readCurrentClassId } from './contract_sync/helpers.js';
64
66
  import { PXEDebugUtils } from './debug/pxe_debug_utils.js';
65
67
  import { enrichPublicSimulationError, enrichSimulationError } from './error_enriching.js';
66
68
  import { PrivateEventFilterValidator } from './events/private_event_filter_validator.js';
69
+ import type { ExecutionHooks } from './hooks/index.js';
67
70
  import { JobCoordinator } from './job_coordinator/job_coordinator.js';
71
+ import { MessageContextService } from './messages/message_context_service.js';
68
72
  import {
69
73
  PrivateKernelExecutionProver,
70
74
  type PrivateKernelExecutionProverConfig,
71
75
  } from './private_kernel/private_kernel_execution_prover.js';
72
- import { PrivateKernelOracleImpl } from './private_kernel/private_kernel_oracle_impl.js';
76
+ import { PrivateKernelOracle } from './private_kernel/private_kernel_oracle.js';
73
77
  import { AddressStore } from './storage/address_store/address_store.js';
74
78
  import { AnchorBlockStore } from './storage/anchor_block_store/anchor_block_store.js';
75
79
  import { CapsuleStore } from './storage/capsule_store/capsule_store.js';
76
80
  import { ContractStore } from './storage/contract_store/contract_store.js';
77
81
  import { NoteStore } from './storage/note_store/note_store.js';
82
+ import { openPxeStores } from './storage/open_pxe_stores.js';
78
83
  import { PrivateEventStore } from './storage/private_event_store/private_event_store.js';
79
84
  import { RecipientTaggingStore } from './storage/tagging_store/recipient_tagging_store.js';
80
85
  import { SenderAddressBookStore } from './storage/tagging_store/sender_address_book_store.js';
81
86
  import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store.js';
87
+ import { persistSenderTaggingIndexRangesForTx } from './tagging/index.js';
82
88
 
83
89
  export type PackedPrivateEvent = InTx & {
84
90
  packedEvent: Fr[];
85
91
  eventSelector: EventSelector;
86
92
  };
87
93
 
94
+ /** Options for PXE.proveTx. */
95
+ export type ProveTxOpts = {
96
+ /** Addresses whose private state and keys are accessible during private execution. */
97
+ scopes: AztecAddress[];
98
+ /** Sender address used to derive discovery tags for private messages (notes, events, logs) this tx emits. */
99
+ senderForTags?: AztecAddress;
100
+ };
101
+
102
+ /** Options for PXE.profileTx. */
103
+ export type ProfileTxOpts = {
104
+ /** The profiling mode to use. */
105
+ profileMode: 'full' | 'execution-steps' | 'gates';
106
+ /** If true, proof generation is skipped during profiling. Defaults to true. */
107
+ skipProofGeneration?: boolean;
108
+ /** Addresses whose private state and keys are accessible during private execution. */
109
+ scopes: AztecAddress[];
110
+ /** Sender address used to derive discovery tags for private messages (notes, events, logs) this tx emits. */
111
+ senderForTags?: AztecAddress;
112
+ };
113
+
114
+ /** Options for PXE.simulateTx. */
115
+ export type SimulateTxOpts = {
116
+ /** Whether to simulate the public part of the transaction. */
117
+ simulatePublic: boolean;
118
+ /** If false, this function throws if the transaction is unable to be included in a block at the current state. */
119
+ skipTxValidation?: boolean;
120
+ /** If false, fees are enforced. */
121
+ skipFeeEnforcement?: boolean;
122
+ /** If true, kernel logic is emulated in TS for simulation */
123
+ skipKernels?: boolean;
124
+ /**
125
+ * Pre-simulation overrides applied to the ephemeral fork and contract DB. Bundles publicStorage
126
+ * writes (no skipKernels required) and per-address (instance, artifact?) overrides used by both
127
+ * AVM-side public dispatch and PXE-side ACIR private dispatch (requires skipKernels: true).
128
+ */
129
+ overrides?: SimulationOverrides;
130
+ /** Addresses whose private state and keys are accessible during private execution */
131
+ scopes: AztecAddress[];
132
+ /** Sender address used to derive discovery tags for private messages (notes, events, logs) this tx emits. */
133
+ senderForTags?: AztecAddress;
134
+ };
135
+
136
+ /** Options for PXE.executeUtility. */
137
+ export type ExecuteUtilityOpts = {
138
+ /** The authentication witnesses required for the function call. */
139
+ authwits?: AuthWitness[];
140
+ /** The accounts whose notes we can access in this call */
141
+ scopes: AztecAddress[];
142
+ };
143
+
144
+ /**
145
+ * Supplies the set of "nice to have" contracts that every PXE preloads regardless of which wallet
146
+ * drives it. Today this is just the standard multi-call entrypoint: the SDK's self-paid account
147
+ * deploy flow ({@link DeployAccountMethod} with `from = NO_FROM`) routes its payload through it, so a
148
+ * PXE that did not register it would fail contract sync with an opaque "no contract instance" error.
149
+ *
150
+ * Returning a list keeps this extensible: a wallet may supply its own provider that preloads
151
+ * additional contracts. Injected the same way as {@link ProtocolContractsProvider} so the PXE never
152
+ * statically imports the bundled artifacts, keeping the bundle/lazy split intact.
153
+ */
154
+ export type PreloadedContractsProvider = {
155
+ /** Returns the contract instances and artifacts the PXE should preload on startup. */
156
+ getPreloadedContracts: () => Promise<Array<{ instance: ContractInstanceWithAddress; artifact: ContractArtifact }>>;
157
+ };
158
+
159
+ /** Args for PXE.create. */
160
+ export type PXECreateArgs = {
161
+ /** The Aztec node to connect to. */
162
+ node: AztecNode;
163
+ /** The key-value store for persisting PXE state. */
164
+ store: AztecAsyncKVStore;
165
+ /** The prover for generating private kernel proofs. */
166
+ proofCreator: PrivateKernelProver;
167
+ /** The circuit simulator for executing ACIR circuits. */
168
+ simulator: CircuitSimulator;
169
+ /** Provider for protocol contract artifacts and instances. */
170
+ protocolContractsProvider: ProtocolContractsProvider;
171
+ /** Provider for the "nice to have" contracts the PXE preloads. */
172
+ preloadedContractsProvider: PreloadedContractsProvider;
173
+ /** PXE configuration options. */
174
+ config: PXEConfig;
175
+ /** Optional logger instance or string suffix for the logger name. */
176
+ loggerOrSuffix?: string | Logger;
177
+ /** Optional hooks to observe and influence contract execution. */
178
+ hooks?: ExecutionHooks;
179
+ };
180
+
88
181
  /**
89
182
  * Private eXecution Environment (PXE) is a library used by wallets to simulate private phase of transactions and to
90
183
  * manage private state of users.
@@ -92,6 +185,7 @@ export type PackedPrivateEvent = InTx & {
92
185
  export class PXE {
93
186
  private constructor(
94
187
  private node: AztecNode,
188
+ private db: AztecAsyncKVStore,
95
189
  private blockStateSynchronizer: BlockSynchronizer,
96
190
  private keyStore: KeyStore,
97
191
  private contractStore: ContractStore,
@@ -103,14 +197,20 @@ export class PXE {
103
197
  private recipientTaggingStore: RecipientTaggingStore,
104
198
  private addressStore: AddressStore,
105
199
  private privateEventStore: PrivateEventStore,
200
+ private contractSyncService: ContractSyncService,
201
+ private messageContextService: MessageContextService,
202
+ private l2TipsStore: L2TipsProvider,
106
203
  private simulator: CircuitSimulator,
107
204
  private proverEnabled: boolean,
205
+ private autoSync: boolean,
108
206
  private proofCreator: PrivateKernelProver,
109
207
  private protocolContractsProvider: ProtocolContractsProvider,
208
+ private preloadedContractsProvider: PreloadedContractsProvider,
110
209
  private log: Logger,
111
210
  private jobQueue: SerialQueue,
112
211
  private jobCoordinator: JobCoordinator,
113
212
  public debug: PXEDebugUtils,
213
+ private hooks: ExecutionHooks | undefined,
114
214
  ) {}
115
215
 
116
216
  /**
@@ -120,50 +220,87 @@ export class PXE {
120
220
  *
121
221
  * @returns A promise that resolves PXE is ready to be used.
122
222
  */
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
- ) {
223
+ public static async create({
224
+ node,
225
+ store,
226
+ proofCreator,
227
+ simulator,
228
+ protocolContractsProvider,
229
+ preloadedContractsProvider,
230
+ config,
231
+ loggerOrSuffix,
232
+ hooks,
233
+ }: PXECreateArgs) {
234
+ // Extract bindings from the logger, or use empty bindings if a string suffix is provided.
235
+ const bindings: LoggerBindings | undefined =
236
+ loggerOrSuffix && typeof loggerOrSuffix !== 'string' ? loggerOrSuffix.getBindings() : undefined;
237
+
132
238
  const log =
133
239
  !loggerOrSuffix || typeof loggerOrSuffix === 'string'
134
240
  ? createLogger(loggerOrSuffix ? `pxe:service:${loggerOrSuffix}` : `pxe:service`)
135
241
  : loggerOrSuffix;
136
242
 
137
- const proverEnabled = !!config.proverEnabled;
138
- const addressStore = new AddressStore(store);
139
- const privateEventStore = new PrivateEventStore(store);
140
- const contractStore = new ContractStore(store);
141
- const noteStore = await NoteStore.create(store);
142
- const anchorBlockStore = new AnchorBlockStore(store);
143
- const senderTaggingStore = new SenderTaggingStore(store);
144
- const senderAddressBookStore = new SenderAddressBookStore(store);
145
- const recipientTaggingStore = new RecipientTaggingStore(store);
146
- const capsuleStore = new CapsuleStore(store);
147
- const keyStore = new KeyStore(store);
148
- const tipsStore = new L2TipsKVStore(store, 'pxe');
243
+ const info = await node.getNodeInfo();
244
+
245
+ // Source the genesis block hash from the node so PXE's L2BlockStream agrees with the node's
246
+ // archiver on the dynamic initial header hash. Without this the tip store would fall back to
247
+ // the static `GENESIS_BLOCK_HEADER_HASH` constant, which only matches deployments with the
248
+ // default empty genesis (timestamp 0, no prefilled public data) and diverges otherwise — the
249
+ // sync at block 0 would then get stuck in `areBlockHashesEqualAt` and abort. If the node does
250
+ // not return a genesis block (older node or test fixture) we fall back to the static constant.
251
+ const initialBlockHash = (await node.getBlock(BlockNumber.ZERO))?.hash ?? GENESIS_BLOCK_HEADER_HASH;
252
+
253
+ const proverEnabled = config.proverEnabled !== undefined ? config.proverEnabled : info.realProofs;
254
+ const {
255
+ addressStore,
256
+ privateEventStore,
257
+ contractStore,
258
+ noteStore,
259
+ anchorBlockStore,
260
+ senderTaggingStore,
261
+ senderAddressBookStore,
262
+ recipientTaggingStore,
263
+ capsuleStore,
264
+ keyStore,
265
+ l2TipsStore,
266
+ } = openPxeStores(store, initialBlockHash);
267
+ const contractSyncService = new ContractSyncService(
268
+ node,
269
+ contractStore,
270
+ noteStore,
271
+ createLogger('pxe:contract_sync', bindings),
272
+ );
273
+ const messageContextService = new MessageContextService(node);
274
+
149
275
  const synchronizer = new BlockSynchronizer(
150
276
  node,
277
+ store,
151
278
  anchorBlockStore,
152
279
  noteStore,
153
280
  privateEventStore,
154
- tipsStore,
281
+ l2TipsStore,
282
+ contractSyncService,
155
283
  config,
156
- loggerOrSuffix,
284
+ bindings,
157
285
  );
158
286
 
159
- const jobCoordinator = new JobCoordinator(store);
287
+ const jobCoordinator = new JobCoordinator(store, bindings);
288
+ jobCoordinator.registerStores([
289
+ capsuleStore,
290
+ senderTaggingStore,
291
+ recipientTaggingStore,
292
+ privateEventStore,
293
+ noteStore,
294
+ contractSyncService,
295
+ ]);
160
296
 
161
- const debugUtils = new PXEDebugUtils(contractStore, noteStore);
297
+ const debugUtils = new PXEDebugUtils(contractSyncService, noteStore, synchronizer, anchorBlockStore);
162
298
 
163
299
  const jobQueue = new SerialQueue();
164
300
 
165
301
  const pxe = new PXE(
166
302
  node,
303
+ store,
167
304
  synchronizer,
168
305
  keyStore,
169
306
  contractStore,
@@ -175,22 +312,31 @@ export class PXE {
175
312
  recipientTaggingStore,
176
313
  addressStore,
177
314
  privateEventStore,
315
+ contractSyncService,
316
+ messageContextService,
317
+ l2TipsStore,
178
318
  simulator,
179
319
  proverEnabled,
320
+ config.autoSync,
180
321
  proofCreator,
181
322
  protocolContractsProvider,
323
+ preloadedContractsProvider,
182
324
  log,
183
325
  jobQueue,
184
326
  jobCoordinator,
185
327
  debugUtils,
328
+ hooks,
186
329
  );
187
330
 
188
- debugUtils.setPXE(pxe);
331
+ debugUtils.setPXEHelpers(
332
+ pxe.#putInJobQueue.bind(pxe),
333
+ pxe.#getSimulatorForTx.bind(pxe),
334
+ pxe.#executeUtility.bind(pxe),
335
+ );
189
336
 
190
337
  pxe.jobQueue.start();
191
338
 
192
- await pxe.#registerProtocolContracts();
193
- const info = await node.getNodeInfo();
339
+ await Promise.all([pxe.#registerProtocolContracts(), pxe.#registerPreloadedContracts()]);
194
340
  log.info(`Started PXE connected to chain ${info.l1ChainId} version ${info.rollupVersion}`);
195
341
  return pxe;
196
342
  }
@@ -200,20 +346,23 @@ export class PXE {
200
346
  #getSimulatorForTx(overrides?: { contracts?: ContractOverrides }) {
201
347
  const proxyContractStore = ProxiedContractStoreFactory.create(this.contractStore, overrides?.contracts);
202
348
 
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
- );
349
+ return new ContractFunctionSimulator({
350
+ contractStore: proxyContractStore,
351
+ noteStore: this.noteStore,
352
+ keyStore: this.keyStore,
353
+ addressStore: this.addressStore,
354
+ aztecNode: BenchmarkedNodeFactory.create(this.node),
355
+ l2TipsStore: this.l2TipsStore,
356
+ senderTaggingStore: this.senderTaggingStore,
357
+ recipientTaggingStore: this.recipientTaggingStore,
358
+ senderAddressBookStore: this.senderAddressBookStore,
359
+ capsuleStore: this.capsuleStore,
360
+ privateEventStore: this.privateEventStore,
361
+ simulator: this.simulator,
362
+ contractSyncService: this.contractSyncService,
363
+ messageContextService: this.messageContextService,
364
+ hooks: this.hooks,
365
+ });
217
366
  }
218
367
 
219
368
  #contextualizeError(err: Error, ...context: string[]): Error {
@@ -263,55 +412,66 @@ export class PXE {
263
412
  }
264
413
 
265
414
  async #registerProtocolContracts() {
266
- const registered: Record<string, string> = {};
267
- 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);
271
- await this.contractStore.addContractInstance(instance);
272
- registered[name] = address.toString();
273
- }
415
+ const registered = Object.fromEntries(
416
+ await Promise.all(
417
+ protocolContractNames.map(async name => {
418
+ const { address, instance, artifact } =
419
+ await this.protocolContractsProvider.getProtocolContractArtifact(name);
420
+ await this.contractStore.addContractArtifact(artifact);
421
+ await this.contractStore.addContractInstance(instance);
422
+ return [name, address.toString()] as const;
423
+ }),
424
+ ),
425
+ );
274
426
  this.log.verbose(`Registered protocol contracts in pxe`, registered);
275
427
  }
276
428
 
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));
429
+ async #registerPreloadedContracts() {
430
+ const contracts = await this.preloadedContractsProvider.getPreloadedContracts();
431
+ await Promise.all(contracts.map(({ instance, artifact }) => this.registerContract({ instance, artifact })));
432
+ this.log.verbose(`Registered preloaded contracts in pxe`, {
433
+ contracts: contracts.map(({ instance }) => instance.address.toString()),
434
+ });
288
435
  }
289
436
 
290
437
  // Executes the entrypoint private function, as well as all nested private
291
438
  // functions that might arise.
292
- async #executePrivate(
293
- contractFunctionSimulator: ContractFunctionSimulator,
294
- txRequest: TxExecutionRequest,
295
- scopes: AztecAddress[] | undefined,
296
- jobId: string,
297
- ): Promise<PrivateExecutionResult> {
439
+ async #executePrivate({
440
+ contractFunctionSimulator,
441
+ txRequest,
442
+ anchorBlockHeader,
443
+ scopes,
444
+ jobId,
445
+ senderForTags,
446
+ }: {
447
+ contractFunctionSimulator: ContractFunctionSimulator;
448
+ txRequest: TxExecutionRequest;
449
+ anchorBlockHeader: BlockHeader;
450
+ scopes: AztecAddress[];
451
+ jobId: string;
452
+ senderForTags?: AztecAddress;
453
+ }): Promise<PrivateExecutionResult> {
298
454
  const { origin: contractAddress, functionSelector } = txRequest;
299
455
 
300
456
  try {
301
- const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
302
-
303
- const result = await contractFunctionSimulator.run(
304
- txRequest,
457
+ await this.contractSyncService.ensureContractSynced(
305
458
  contractAddress,
306
459
  functionSelector,
307
- undefined,
460
+ (privateSyncCall, execScopes) =>
461
+ this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
308
462
  anchorBlockHeader,
309
- // The sender for tags is set by contracts, typically by an account
310
- // contract entrypoint
311
- undefined, // senderForTags
312
- scopes,
313
463
  jobId,
464
+ scopes,
314
465
  );
466
+
467
+ const result = await contractFunctionSimulator.run(txRequest, {
468
+ contractAddress,
469
+ selector: functionSelector,
470
+ anchorBlockHeader,
471
+ scopes,
472
+ jobId,
473
+ senderForTags,
474
+ });
315
475
  this.log.debug(`Private simulation completed for ${contractAddress.toString()}:${functionSelector}`);
316
476
  return result;
317
477
  } catch (err) {
@@ -323,25 +483,32 @@ export class PXE {
323
483
  }
324
484
 
325
485
  /**
326
- * Simulate a utility function call on the given contract.
486
+ * Execute a utility function call on the given contract.
327
487
  * @param contractFunctionSimulator - The simulator to use for the function call.
328
488
  * @param call - The function call to execute.
329
489
  * @param authWitnesses - Authentication witnesses required for the function call.
330
490
  * @param scopes - Optional array of account addresses whose notes can be accessed in this call. Defaults to all
331
491
  * accounts if not specified.
332
492
  * @param jobId - The job ID for staged writes.
333
- * @returns The simulation result containing the outputs of the utility function.
493
+ * @returns The execution result containing the outputs of the utility function.
334
494
  */
335
- async #simulateUtility(
495
+ async #executeUtility(
336
496
  contractFunctionSimulator: ContractFunctionSimulator,
337
497
  call: FunctionCall,
338
498
  authWitnesses: AuthWitness[] | undefined,
339
- scopes: AztecAddress[] | undefined,
499
+ scopes: AztecAddress[],
340
500
  jobId: string,
341
501
  ) {
342
502
  try {
343
503
  const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
344
- return contractFunctionSimulator.runUtility(call, authWitnesses ?? [], anchorBlockHeader, scopes, jobId);
504
+ const { result, offchainEffects } = await contractFunctionSimulator.runUtility(
505
+ call,
506
+ authWitnesses ?? [],
507
+ anchorBlockHeader,
508
+ scopes,
509
+ jobId,
510
+ );
511
+ return { result, offchainEffects };
345
512
  } catch (err) {
346
513
  if (err instanceof SimulationError) {
347
514
  await enrichSimulationError(err, this.contractStore, this.log);
@@ -356,11 +523,11 @@ export class PXE {
356
523
  * It can also be used for estimating gas in the future.
357
524
  * @param tx - The transaction to be simulated.
358
525
  */
359
- async #simulatePublicCalls(tx: Tx, skipFeeEnforcement: boolean) {
526
+ async #simulatePublicCalls(tx: Tx, skipFeeEnforcement: boolean, overrides?: SimulationOverrides) {
360
527
  // Simulating public calls can throw if the TX fails in a phase that doesn't allow reverts (setup)
361
528
  // Or return as reverted if it fails in a phase that allows reverts (app logic, teardown)
362
529
  try {
363
- const result = await this.node.simulatePublicCalls(tx, skipFeeEnforcement);
530
+ const result = await this.node.simulatePublicCalls(tx, skipFeeEnforcement, overrides);
364
531
  if (result.revertReason) {
365
532
  throw result.revertReason;
366
533
  }
@@ -392,87 +559,68 @@ export class PXE {
392
559
  txExecutionRequest: TxExecutionRequest,
393
560
  proofCreator: PrivateKernelProver,
394
561
  privateExecutionResult: PrivateExecutionResult,
562
+ anchorBlockHeader: BlockHeader,
395
563
  config: PrivateKernelExecutionProverConfig,
396
564
  ): Promise<PrivateKernelExecutionProofOutput<PrivateKernelTailCircuitPublicInputs>> {
397
- const simulationAnchorBlock = privateExecutionResult.getSimulationAnchorBlockNumber();
398
- const kernelOracle = new PrivateKernelOracleImpl(
399
- this.contractStore,
400
- this.keyStore,
401
- this.node,
402
- simulationAnchorBlock,
565
+ const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHeader);
566
+ const kernelTraceProver = new PrivateKernelExecutionProver(
567
+ kernelOracle,
568
+ proofCreator,
569
+ !this.proverEnabled,
570
+ this.log.getBindings(),
403
571
  );
404
- const kernelTraceProver = new PrivateKernelExecutionProver(kernelOracle, proofCreator, !this.proverEnabled);
405
572
  this.log.debug(`Executing kernel trace prover (${JSON.stringify(config)})...`);
406
573
  return await kernelTraceProver.proveWithKernels(txExecutionRequest.toTxRequest(), privateExecutionResult, config);
407
574
  }
408
575
 
576
+ /**
577
+ * Syncs with the node only when `autoSync` is enabled.
578
+ * When `autoSync` is disabled, callers (typically a wallet) are
579
+ * responsible for invoking `pxe.sync()` at the right granularity.
580
+ */
581
+ async #maybeSync(): Promise<void> {
582
+ if (this.autoSync) {
583
+ await this.blockStateSynchronizer.sync();
584
+ }
585
+ }
586
+
409
587
  // Public API
410
588
 
411
- public getContractInstance(address: AztecAddress): Promise<ContractInstanceWithAddress | undefined> {
412
- return this.contractStore.getContractInstance(address);
589
+ /**
590
+ * Triggers a sync of PXE state with the node, regardless of the `autoSync` config flag. Use this to
591
+ * batch syncs across composite flows when `autoSync` is disabled (e.g. one sync per simulate+send
592
+ * instead of one per inner PXE call). Serialized through the job queue.
593
+ */
594
+ public sync(): Promise<void> {
595
+ return this.#putInJobQueue(() => this.blockStateSynchronizer.sync());
413
596
  }
414
597
 
415
598
  /**
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.
599
+ * Returns the block header up to which the PXE has synced.
600
+ * @returns The synced block header
428
601
  */
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
- }
602
+ public getSyncedBlockHeader(): Promise<BlockHeader> {
603
+ return this.#putInJobQueue(() => {
604
+ return this.anchorBlockStore.getBlockHeader();
605
+ });
606
+ }
441
607
 
442
- return {
443
- contractClass: artifact && (await getContractClassFromArtifact(artifact)),
444
- isContractClassPubliclyRegistered: await this.#isContractClassPubliclyRegistered(id),
445
- artifact: includeArtifact ? artifact : undefined,
446
- };
608
+ /**
609
+ * Returns the contract instance for a given address, if it's registered in the PXE.
610
+ * @param address - The contract address.
611
+ * @returns The contract instance if found, undefined otherwise.
612
+ */
613
+ public getContractInstance(address: AztecAddress): Promise<ContractInstanceWithAddress | undefined> {
614
+ return this.contractStore.getContractInstance(address);
447
615
  }
448
616
 
449
617
  /**
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?
618
+ * Returns the contract artifact for a given contract class id, if it's registered in the PXE.
619
+ * @param id - Identifier of the contract class.
620
+ * @returns The contract artifact if found, undefined otherwise.
459
621
  */
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
- };
622
+ public async getContractArtifact(id: Fr): Promise<ContractArtifact | undefined> {
623
+ return await this.contractStore.getContractArtifact(id);
476
624
  }
477
625
 
478
626
  /**
@@ -488,7 +636,7 @@ export class PXE {
488
636
  public async registerAccount(secretKey: Fr, partialAddress: PartialAddress): Promise<CompleteAddress> {
489
637
  const accounts = await this.keyStore.getAccounts();
490
638
  const accountCompleteAddress = await this.keyStore.addAccount(secretKey, partialAddress);
491
- if (accounts.includes(accountCompleteAddress.address)) {
639
+ if (accounts.some(a => a.equals(accountCompleteAddress.address))) {
492
640
  this.log.info(`Account:\n "${accountCompleteAddress.address.toString()}"\n already registered.`);
493
641
  return accountCompleteAddress;
494
642
  } else {
@@ -497,7 +645,6 @@ export class PXE {
497
645
  }
498
646
 
499
647
  await this.addressStore.addCompleteAddress(accountCompleteAddress);
500
- await this.noteStore.addScope(accountCompleteAddress.address);
501
648
  return accountCompleteAddress;
502
649
  }
503
650
 
@@ -512,8 +659,14 @@ export class PXE {
512
659
  * TODO: It's strange that we return the address here and I (benesjan) think we should drop the return value.
513
660
  */
514
661
  public async registerSender(sender: AztecAddress): Promise<AztecAddress> {
662
+ if (!(await sender.isValid())) {
663
+ throw new Error(
664
+ `Address ${sender} is not valid: it does not correspond to a point on the Grumpkin curve. Cannot register it as a sender.`,
665
+ );
666
+ }
667
+
515
668
  const accounts = await this.keyStore.getAccounts();
516
- if (accounts.includes(sender)) {
669
+ if (accounts.some(a => a.equals(sender))) {
517
670
  this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
518
671
  return sender;
519
672
  }
@@ -522,6 +675,9 @@ export class PXE {
522
675
 
523
676
  if (wasAdded) {
524
677
  this.log.info(`Added sender:\n ${sender.toString()}`);
678
+ // Wipe the entire sync cache: the new sender's tagged logs could contain notes/events for any contract, so
679
+ // all contracts must re-sync to discover them. Queued to avoid wiping while a job is in flight.
680
+ await this.#putInJobQueue(() => Promise.resolve(this.contractSyncService.wipe()));
525
681
  } else {
526
682
  this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
527
683
  }
@@ -571,8 +727,7 @@ export class PXE {
571
727
  * @param artifact - The build artifact for the contract class.
572
728
  */
573
729
  public async registerContractClass(artifact: ContractArtifact): Promise<void> {
574
- const { id: contractClassId } = await getContractClassFromArtifact(artifact);
575
- await this.contractStore.addContractArtifact(contractClassId, artifact);
730
+ const contractClassId = await this.contractStore.addContractArtifact(artifact);
576
731
  this.log.info(`Added contract class ${artifact.name} with id ${contractClassId}`);
577
732
  }
578
733
 
@@ -591,22 +746,24 @@ export class PXE {
591
746
  if (artifact) {
592
747
  // If the user provides an artifact, validate it against the expected class id and register it
593
748
  const contractClass = await getContractClassFromArtifact(artifact);
594
- const contractClassId = contractClass.id;
595
- if (!contractClassId.equals(instance.currentContractClassId)) {
749
+ if (!contractClass.id.equals(instance.currentContractClassId)) {
596
750
  throw new Error(
597
- `Artifact does not match expected class id (computed ${contractClassId} but instance refers to ${instance.currentContractClassId})`,
751
+ `Artifact does not match expected class id (computed ${contractClass.id} but instance refers to ${instance.currentContractClassId})`,
598
752
  );
599
753
  }
600
754
  const computedAddress = await computeContractAddressFromInstance(instance);
601
755
  if (!computedAddress.equals(instance.address)) {
602
756
  throw new Error('Added a contract in which the address does not match the contract instance.');
603
757
  }
604
- await this.contractStore.addContractArtifact(contractClass.id, artifact);
758
+
759
+ await this.contractStore.addContractArtifact(artifact, contractClass);
605
760
 
606
761
  const publicFunctionSignatures = artifact.functions
607
762
  .filter(fn => fn.functionType === FunctionType.PUBLIC)
608
763
  .map(fn => decodeFunctionSignature(fn.name, fn.parameters));
609
- await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
764
+ if (publicFunctionSignatures.length > 0) {
765
+ await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
766
+ }
610
767
  } else {
611
768
  // Otherwise, make sure there is an artifact already registered for that class id
612
769
  artifact = await this.contractStore.getContractArtifact(instance.currentContractClassId);
@@ -641,30 +798,27 @@ export class PXE {
641
798
  throw new Error(`Instance not found when updating a contract. Contract address: ${contractAddress}.`);
642
799
  }
643
800
  const contractClass = await getContractClassFromArtifact(artifact);
644
- await this.blockStateSynchronizer.sync();
801
+ await this.#maybeSync();
645
802
 
646
803
  const header = await this.anchorBlockStore.getBlockHeader();
647
804
 
648
- const currentClassId = await readCurrentClassId(
649
- contractAddress,
650
- currentInstance,
651
- this.node,
652
- header.globalVariables.blockNumber,
653
- header.globalVariables.timestamp,
654
- );
805
+ const currentClassId = await readCurrentClassId(contractAddress, currentInstance, this.node, header);
655
806
  if (!contractClass.id.equals(currentClassId)) {
656
807
  throw new Error('Could not update contract to a class different from the current one.');
657
808
  }
658
809
 
659
- await this.contractStore.addContractArtifact(contractClass.id, artifact);
660
-
661
810
  const publicFunctionSignatures = artifact.functions
662
811
  .filter(fn => fn.functionType === FunctionType.PUBLIC)
663
812
  .map(fn => decodeFunctionSignature(fn.name, fn.parameters));
664
- await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
813
+ if (publicFunctionSignatures.length > 0) {
814
+ await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
815
+ }
665
816
 
666
817
  currentInstance.currentContractClassId = contractClass.id;
667
- await this.contractStore.addContractInstance(currentInstance);
818
+ await Promise.all([
819
+ this.contractStore.addContractArtifact(artifact, contractClass),
820
+ this.contractStore.addContractInstance(currentInstance),
821
+ ]);
668
822
  this.log.info(`Updated contract ${artifact.name} at ${contractAddress.toString()} to class ${contractClass.id}`);
669
823
  });
670
824
  }
@@ -682,11 +836,12 @@ export class PXE {
682
836
  * (where validators prove the public portion).
683
837
  *
684
838
  * @param txRequest - An authenticated tx request ready for proving
839
+ * @param scopes - Addresses whose private state and keys are accessible during private execution.
685
840
  * @returns A result containing the proof and public inputs of the tail circuit.
686
841
  * @throws If contract code not found, or public simulation reverts.
687
842
  * Also throws if simulatePublic is true and public simulation reverts.
688
843
  */
689
- public proveTx(txRequest: TxExecutionRequest): Promise<TxProvingResult> {
844
+ public proveTx(txRequest: TxExecutionRequest, { scopes, senderForTags }: ProveTxOpts): Promise<TxProvingResult> {
690
845
  let privateExecutionResult: PrivateExecutionResult;
691
846
  // We disable proving concurrently mostly out of caution, since it accesses some of our stores. Proving is so
692
847
  // computationally demanding that it'd be rare for someone to try to do it concurrently regardless.
@@ -694,17 +849,25 @@ export class PXE {
694
849
  const totalTimer = new Timer();
695
850
  try {
696
851
  const syncTimer = new Timer();
697
- await this.blockStateSynchronizer.sync();
852
+ await this.#maybeSync();
853
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
698
854
  const syncTime = syncTimer.ms();
699
855
  const contractFunctionSimulator = this.#getSimulatorForTx();
700
- privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, undefined, jobId);
856
+ privateExecutionResult = await this.#executePrivate({
857
+ contractFunctionSimulator,
858
+ txRequest,
859
+ anchorBlockHeader,
860
+ scopes,
861
+ jobId,
862
+ senderForTags,
863
+ });
701
864
 
702
865
  const {
703
866
  publicInputs,
704
867
  chonkProof,
705
868
  executionSteps,
706
869
  timings: { proving } = {},
707
- } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
870
+ } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, anchorBlockHeader, {
708
871
  simulate: false,
709
872
  skipFeeEnforcement: false,
710
873
  profileMode: 'none',
@@ -734,23 +897,20 @@ export class PXE {
734
897
  nodeRPCCalls: contractFunctionSimulator?.getStats().nodeRPCCalls,
735
898
  });
736
899
 
737
- // While not strictly necessary to store tagging cache contents in the DB since we sync tagging indexes from
738
- // chain before sending new logs, the sync can only see logs already included in blocks. If we send another
739
- // transaction before this one is included in a block from this PXE, and that transaction contains a log with
740
- // a tag derived from the same secret, we would reuse the tag and the transactions would be linked. Hence
741
- // storing the tags here prevents linkage of txs sent from the same PXE.
742
- const preTagsUsedInTheTx = privateExecutionResult.entrypoint.preTags;
743
- if (preTagsUsedInTheTx.length > 0) {
744
- // TODO(benesjan): The following is an expensive operation. Figure out a way to avoid it.
745
- const txHash = (await txProvingResult.toTx()).txHash;
746
-
747
- await this.senderTaggingStore.storePendingIndexes(preTagsUsedInTheTx, txHash);
748
- this.log.debug(`Stored used pre-tags as sender for the tx`, {
749
- preTagsUsedInTheTx,
750
- });
751
- } else {
752
- this.log.debug(`No pre-tags used in the tx`);
753
- }
900
+ // We keep track of which tagging indices we've used in this tx so that we don't repeat them in future txs
901
+ // (which would link them) without having to rely on this tx being mined (and us seeing the indices being used
902
+ // onchain).
903
+ // Note that this must happen _after_ proving as it requires the proof's public inputs, from which the kernels
904
+ // may have removed some logs due to note-nullifier squashing - this may lead to range of tagging indices we've
905
+ // actually used to being reduced.
906
+ await persistSenderTaggingIndexRangesForTx(
907
+ this.senderTaggingStore,
908
+ privateExecutionResult.entrypoint.taggingIndexRanges,
909
+ publicInputs,
910
+ () => txProvingResult.getTxHash(),
911
+ jobId,
912
+ this.log,
913
+ );
754
914
 
755
915
  return txProvingResult;
756
916
  } catch (err: any) {
@@ -761,17 +921,13 @@ export class PXE {
761
921
 
762
922
  /**
763
923
  * 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.
924
+ * @param txRequest - An authenticated tx request ready for simulation.
768
925
  * @returns A trace of the program execution with gate counts.
769
926
  * @throws If the code for the functions executed in this transaction have not been made available via `addContracts`.
770
927
  */
771
928
  public profileTx(
772
929
  txRequest: TxExecutionRequest,
773
- profileMode: 'full' | 'execution-steps' | 'gates',
774
- skipProofGeneration: boolean = true,
930
+ { profileMode, skipProofGeneration = true, scopes, senderForTags }: ProfileTxOpts,
775
931
  ): Promise<TxProfileResult> {
776
932
  // We disable concurrent profiles for consistency with simulateTx.
777
933
  return this.#putInJobQueue(async jobId => {
@@ -790,21 +946,25 @@ export class PXE {
790
946
  txInfo,
791
947
  );
792
948
  const syncTimer = new Timer();
793
- await this.blockStateSynchronizer.sync();
949
+ await this.#maybeSync();
950
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
794
951
  const syncTime = syncTimer.ms();
795
952
 
796
953
  const contractFunctionSimulator = this.#getSimulatorForTx();
797
- const privateExecutionResult = await this.#executePrivate(
954
+ const privateExecutionResult = await this.#executePrivate({
798
955
  contractFunctionSimulator,
799
956
  txRequest,
800
- undefined,
957
+ anchorBlockHeader,
958
+ scopes,
801
959
  jobId,
802
- );
960
+ senderForTags,
961
+ });
803
962
 
804
963
  const { executionSteps, timings: { proving } = {} } = await this.#prove(
805
964
  txRequest,
806
965
  this.proofCreator,
807
966
  privateExecutionResult,
967
+ anchorBlockHeader,
808
968
  {
809
969
  simulate: skipProofGeneration,
810
970
  skipFeeEnforcement: false,
@@ -856,12 +1016,7 @@ export class PXE {
856
1016
  * In that case, the transaction returned is only potentially ready to be sent to the network for execution.
857
1017
  *
858
1018
  *
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.
1019
+ * @param txRequest - An authenticated tx request ready for simulation.
865
1020
  * @returns A simulated transaction result object that includes public and private return values.
866
1021
  * @throws If the code for the functions executed in this transaction have not been made available via `addContracts`.
867
1022
  * Also throws if simulatePublic is true and public simulation reverts.
@@ -870,11 +1025,15 @@ export class PXE {
870
1025
  */
871
1026
  public simulateTx(
872
1027
  txRequest: TxExecutionRequest,
873
- simulatePublic: boolean,
874
- skipTxValidation: boolean = false,
875
- skipFeeEnforcement: boolean = false,
876
- overrides?: SimulationOverrides,
877
- scopes?: AztecAddress[],
1028
+ {
1029
+ simulatePublic,
1030
+ skipTxValidation = false,
1031
+ skipFeeEnforcement = false,
1032
+ skipKernels = true,
1033
+ overrides,
1034
+ scopes,
1035
+ senderForTags,
1036
+ }: SimulateTxOpts,
878
1037
  ): Promise<TxSimulationResult> {
879
1038
  // We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
880
1039
  // to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
@@ -895,39 +1054,49 @@ export class PXE {
895
1054
  txInfo,
896
1055
  );
897
1056
  const syncTimer = new Timer();
898
- await this.blockStateSynchronizer.sync();
1057
+ await this.#maybeSync();
1058
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
899
1059
  const syncTime = syncTimer.ms();
900
1060
 
1061
+ if (overrides?.contracts && Object.keys(overrides.contracts).length > 0 && !skipKernels) {
1062
+ throw new Error(
1063
+ 'Simulating with overridden contracts is not compatible with kernel execution. Please set skipKernels to true when simulating with overridden contracts.',
1064
+ );
1065
+ }
901
1066
  const contractFunctionSimulator = this.#getSimulatorForTx(overrides);
902
- // Temporary: in case there are overrides, we have to skip the kernels or validations
903
- // will fail. Consider handing control to the user/wallet on whether they want to run them
904
- // or not.
905
- const skipKernels = overrides?.contracts !== undefined && Object.keys(overrides.contracts ?? {}).length > 0;
906
1067
 
907
1068
  // Execution of private functions only; no proving, and no kernel logic.
908
- const privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, scopes, jobId);
1069
+ const privateExecutionResult = await this.#executePrivate({
1070
+ contractFunctionSimulator,
1071
+ txRequest,
1072
+ anchorBlockHeader,
1073
+ scopes,
1074
+ jobId,
1075
+ senderForTags,
1076
+ });
909
1077
 
910
1078
  let publicInputs: PrivateKernelTailCircuitPublicInputs | undefined;
911
1079
  let executionSteps: PrivateExecutionStep[] = [];
912
1080
 
913
1081
  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
1082
  ({ publicInputs, executionSteps } = await generateSimulatedProvingResult(
920
1083
  privateExecutionResult,
921
- nonceGenerator,
922
- this.contractStore,
1084
+ (addr, sel) => this.contractStore.getDebugFunctionName(addr, sel),
1085
+ this.node,
923
1086
  ));
924
1087
  } else {
925
1088
  // Kernel logic, plus proving of all private functions and kernels.
926
- ({ publicInputs, executionSteps } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
927
- simulate: true,
928
- skipFeeEnforcement,
929
- profileMode: 'none',
930
- }));
1089
+ ({ publicInputs, executionSteps } = await this.#prove(
1090
+ txRequest,
1091
+ this.proofCreator,
1092
+ privateExecutionResult,
1093
+ anchorBlockHeader,
1094
+ {
1095
+ simulate: true,
1096
+ skipFeeEnforcement,
1097
+ profileMode: 'none',
1098
+ },
1099
+ ));
931
1100
  }
932
1101
 
933
1102
  const privateSimulationResult = new PrivateSimulationResult(privateExecutionResult, publicInputs);
@@ -936,8 +1105,11 @@ export class PXE {
936
1105
  let publicOutput: PublicSimulationOutput | undefined;
937
1106
  if (simulatePublic && publicInputs.forPublic) {
938
1107
  const publicSimulationTimer = new Timer();
939
- publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement);
1108
+ publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement, overrides);
940
1109
  publicSimulationTime = publicSimulationTimer.ms();
1110
+ if (publicOutput?.debugLogs?.length) {
1111
+ await displayDebugLogs(publicOutput.debugLogs, addr => this.contractStore.getDebugContractName(addr));
1112
+ }
941
1113
  }
942
1114
 
943
1115
  let validationTime: number | undefined;
@@ -946,7 +1118,8 @@ export class PXE {
946
1118
  const validationResult = await this.node.isValidTx(simulatedTx, { isSimulation: true, skipFeeEnforcement });
947
1119
  validationTime = validationTimer.ms();
948
1120
  if (validationResult.result === 'invalid') {
949
- throw new Error('The simulated transaction is unable to be added to state and is invalid.');
1121
+ const reason = validationResult.reason.length > 0 ? ` Reason: ${validationResult.reason.join(', ')}` : '';
1122
+ throw new Error(`The simulated transaction is unable to be added to state and is invalid.${reason}`);
950
1123
  }
951
1124
  }
952
1125
 
@@ -997,43 +1170,44 @@ export class PXE {
997
1170
  inspect(txRequest),
998
1171
  `simulatePublic=${simulatePublic}`,
999
1172
  `skipTxValidation=${skipTxValidation}`,
1000
- `scopes=${scopes?.map(s => s.toString()).join(', ') ?? 'undefined'}`,
1173
+ `scopes=${scopes.map(s => s.toString()).join(', ')}`,
1001
1174
  );
1002
1175
  }
1003
1176
  });
1004
1177
  }
1005
1178
 
1006
1179
  /**
1007
- * Simulate the execution of a contract utility function.
1008
- *
1180
+ * Executes a contract utility function.
1009
1181
  * @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
1182
  */
1015
- public simulateUtility(
1183
+ public executeUtility(
1016
1184
  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.
1185
+ { authwits, scopes }: ExecuteUtilityOpts = { scopes: [] },
1186
+ ): Promise<UtilityExecutionResult> {
1187
+ // We disable concurrent executions since those might execute oracles which read and write to the PXE stores (e.g.
1021
1188
  // 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).
1189
+ // delete the same read value, or reading values that another execution is currently modifying).
1023
1190
  return this.#putInJobQueue(async jobId => {
1024
1191
  try {
1025
1192
  const totalTimer = new Timer();
1026
1193
  const syncTimer = new Timer();
1027
- await this.blockStateSynchronizer.sync();
1194
+ await this.#maybeSync();
1028
1195
  const syncTime = syncTimer.ms();
1029
1196
  const functionTimer = new Timer();
1030
1197
  const contractFunctionSimulator = this.#getSimulatorForTx();
1031
1198
 
1032
- await this.contractStore.syncPrivateState(call.to, call.selector, privateSyncCall =>
1033
- this.#simulateUtility(contractFunctionSimulator, privateSyncCall, [], undefined, jobId),
1199
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
1200
+ await this.contractSyncService.ensureContractSynced(
1201
+ call.to,
1202
+ call.selector,
1203
+ (privateSyncCall, execScopes) =>
1204
+ this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
1205
+ anchorBlockHeader,
1206
+ jobId,
1207
+ scopes,
1034
1208
  );
1035
1209
 
1036
- const executionResult = await this.#simulateUtility(
1210
+ const { result: executionResult, offchainEffects } = await this.#executeUtility(
1037
1211
  contractFunctionSimulator,
1038
1212
  call,
1039
1213
  authwits ?? [],
@@ -1054,14 +1228,19 @@ export class PXE {
1054
1228
  };
1055
1229
 
1056
1230
  const simulationStats = contractFunctionSimulator.getStats();
1057
- return { result: executionResult, stats: { timings, nodeRPCCalls: simulationStats.nodeRPCCalls } };
1231
+ return {
1232
+ result: executionResult,
1233
+ offchainEffects,
1234
+ anchorBlockTimestamp: anchorBlockHeader.globalVariables.timestamp,
1235
+ stats: { timings, nodeRPCCalls: simulationStats.nodeRPCCalls },
1236
+ };
1058
1237
  } catch (err: any) {
1059
1238
  const { to, name, args } = call;
1060
1239
  const stringifiedArgs = args.map(arg => arg.toString()).join(', ');
1061
1240
  throw this.#contextualizeError(
1062
1241
  err,
1063
- `simulateUtility ${to}:${name}(${stringifiedArgs})`,
1064
- `scopes=${scopes?.map(s => s.toString()).join(', ') ?? 'undefined'}`,
1242
+ `executeUtility ${to}:${name}(${stringifiedArgs})`,
1243
+ `scopes=${scopes.map(s => s.toString()).join(', ')}`,
1065
1244
  );
1066
1245
  }
1067
1246
  });
@@ -1080,32 +1259,47 @@ export class PXE {
1080
1259
  * Defaults to the latest known block to PXE + 1.
1081
1260
  * @returns - The packed events with block and tx metadata.
1082
1261
  */
1083
- public getPrivateEvents(eventSelector: EventSelector, filter: PrivateEventFilter): Promise<PackedPrivateEvent[]> {
1084
- return this.#putInJobQueue(async jobId => {
1085
- await this.blockStateSynchronizer.sync();
1262
+ public async getPrivateEvents(
1263
+ eventSelector: EventSelector,
1264
+ filter: PrivateEventFilter,
1265
+ ): Promise<PackedPrivateEvent[]> {
1266
+ let anchorBlockNumber: BlockNumber;
1267
+
1268
+ await this.#putInJobQueue(async jobId => {
1269
+ await this.#maybeSync();
1270
+
1271
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
1272
+ anchorBlockNumber = anchorBlockHeader.getBlockNumber();
1273
+
1086
1274
  const contractFunctionSimulator = this.#getSimulatorForTx();
1087
1275
 
1088
- await this.contractStore.syncPrivateState(
1276
+ await this.contractSyncService.ensureContractSynced(
1089
1277
  filter.contractAddress,
1090
1278
  null,
1091
- async privateSyncCall =>
1092
- await this.#simulateUtility(contractFunctionSimulator, privateSyncCall, [], undefined, jobId),
1279
+ async (privateSyncCall, execScopes) =>
1280
+ await this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
1281
+ anchorBlockHeader,
1282
+ jobId,
1283
+ filter.scopes,
1093
1284
  );
1285
+ });
1094
1286
 
1095
- const sanitizedFilter = await new PrivateEventFilterValidator(this.anchorBlockStore).validate(filter);
1287
+ // anchorBlockNumber is set during the job and fixed to whatever it is after a block sync
1288
+ const sanitizedFilter = new PrivateEventFilterValidator(anchorBlockNumber!).validate(filter);
1096
1289
 
1097
- this.log.debug(
1098
- `Getting private events for ${sanitizedFilter.contractAddress.toString()} from ${sanitizedFilter.fromBlock} to ${sanitizedFilter.toBlock}`,
1099
- );
1290
+ this.log.debug(
1291
+ `Getting private events for ${sanitizedFilter.contractAddress.toString()} from ${sanitizedFilter.fromBlock} to ${sanitizedFilter.toBlock}`,
1292
+ );
1100
1293
 
1101
- return this.privateEventStore.getPrivateEvents(eventSelector, sanitizedFilter);
1102
- });
1294
+ return this.privateEventStore.getPrivateEvents(eventSelector, sanitizedFilter);
1103
1295
  }
1104
1296
 
1105
1297
  /**
1106
- * Stops the PXE's job queue.
1298
+ * Stops the PXE's job queue and closes the backing store.
1107
1299
  */
1108
- public stop(): Promise<void> {
1109
- return this.jobQueue.end();
1300
+ public async stop(): Promise<void> {
1301
+ await this.jobQueue.end();
1302
+ await this.blockStateSynchronizer.stop();
1303
+ await this.db.close();
1110
1304
  }
1111
1305
  }