@aztec/pxe 0.0.1-commit.42ee6df9b → 0.0.1-commit.431c48d

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 (538) hide show
  1. package/dest/bin/check_oracle_version.js +41 -112
  2. package/dest/bin/index.d.ts +2 -0
  3. package/dest/bin/index.d.ts.map +1 -0
  4. package/dest/bin/index.js +1 -0
  5. package/dest/bin/oracle_version_helpers.d.ts +34 -0
  6. package/dest/bin/oracle_version_helpers.d.ts.map +1 -0
  7. package/dest/bin/oracle_version_helpers.js +46 -0
  8. package/dest/block_synchronizer/block_stream_source.d.ts +10 -0
  9. package/dest/block_synchronizer/block_stream_source.d.ts.map +1 -0
  10. package/dest/block_synchronizer/block_stream_source.js +37 -0
  11. package/dest/block_synchronizer/block_synchronizer.d.ts +22 -16
  12. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
  13. package/dest/block_synchronizer/block_synchronizer.js +65 -28
  14. package/dest/config/index.d.ts +22 -2
  15. package/dest/config/index.d.ts.map +1 -1
  16. package/dest/config/index.js +18 -14
  17. package/dest/config/package_info.js +1 -1
  18. package/dest/contract/contract_call_graph.d.ts +52 -0
  19. package/dest/contract/contract_call_graph.d.ts.map +1 -0
  20. package/dest/contract/contract_call_graph.js +91 -0
  21. package/dest/contract/contract_class_service.d.ts +24 -0
  22. package/dest/contract/contract_class_service.d.ts.map +1 -0
  23. package/dest/contract/contract_class_service.js +36 -0
  24. package/dest/contract/contract_sync_service.d.ts +83 -0
  25. package/dest/contract/contract_sync_service.d.ts.map +1 -0
  26. package/dest/contract/contract_sync_service.js +213 -0
  27. package/dest/contract/helpers.d.ts +7 -0
  28. package/dest/contract/helpers.d.ts.map +1 -0
  29. package/dest/contract/helpers.js +20 -0
  30. package/dest/contract/skip_sync_contracts.d.ts +11 -0
  31. package/dest/contract/skip_sync_contracts.d.ts.map +1 -0
  32. package/dest/contract/skip_sync_contracts.js +18 -0
  33. package/dest/contract_function_simulator/anchored_contract_data.d.ts +36 -0
  34. package/dest/contract_function_simulator/anchored_contract_data.d.ts.map +1 -0
  35. package/dest/contract_function_simulator/anchored_contract_data.js +54 -0
  36. package/dest/contract_function_simulator/contract_function_simulator.d.ts +25 -25
  37. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  38. package/dest/contract_function_simulator/contract_function_simulator.js +90 -65
  39. package/dest/contract_function_simulator/ephemeral_array_service.d.ts +28 -0
  40. package/dest/contract_function_simulator/ephemeral_array_service.d.ts.map +1 -0
  41. package/dest/contract_function_simulator/ephemeral_array_service.js +78 -0
  42. package/dest/contract_function_simulator/execution_note_cache.d.ts +4 -10
  43. package/dest/contract_function_simulator/execution_note_cache.d.ts.map +1 -1
  44. package/dest/contract_function_simulator/execution_note_cache.js +10 -29
  45. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts +5 -9
  46. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts.map +1 -1
  47. package/dest/contract_function_simulator/execution_tagging_index_cache.js +3 -7
  48. package/dest/contract_function_simulator/index.d.ts +26 -6
  49. package/dest/contract_function_simulator/index.d.ts.map +1 -1
  50. package/dest/contract_function_simulator/index.js +11 -4
  51. package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts +29 -0
  52. package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts.map +1 -0
  53. package/dest/contract_function_simulator/noir-structs/bounded_vec.js +30 -0
  54. package/dest/contract_function_simulator/noir-structs/contract_class_log_data.d.ts +9 -0
  55. package/dest/contract_function_simulator/noir-structs/contract_class_log_data.d.ts.map +1 -0
  56. package/dest/contract_function_simulator/noir-structs/contract_class_log_data.js +1 -0
  57. package/dest/contract_function_simulator/noir-structs/embedded_curve_point.d.ts +7 -0
  58. package/dest/contract_function_simulator/noir-structs/embedded_curve_point.d.ts.map +1 -0
  59. package/dest/contract_function_simulator/noir-structs/embedded_curve_point.js +1 -0
  60. package/dest/contract_function_simulator/noir-structs/ephemeral_array.d.ts +37 -0
  61. package/dest/contract_function_simulator/noir-structs/ephemeral_array.d.ts.map +1 -0
  62. package/dest/contract_function_simulator/noir-structs/ephemeral_array.js +59 -0
  63. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +4 -3
  64. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts.map +1 -1
  65. package/dest/contract_function_simulator/noir-structs/event_validation_request.js +5 -4
  66. package/dest/contract_function_simulator/noir-structs/fact.d.ts +16 -0
  67. package/dest/contract_function_simulator/noir-structs/fact.d.ts.map +1 -0
  68. package/dest/contract_function_simulator/noir-structs/fact.js +6 -0
  69. package/dest/contract_function_simulator/noir-structs/fact_collection.d.ts +27 -0
  70. package/dest/contract_function_simulator/noir-structs/fact_collection.d.ts.map +1 -0
  71. package/dest/contract_function_simulator/noir-structs/fact_collection.js +31 -0
  72. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts +19 -10
  73. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts.map +1 -1
  74. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.js +12 -24
  75. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts +11 -9
  76. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts.map +1 -1
  77. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.js +2 -61
  78. package/dest/contract_function_simulator/noir-structs/note_data.d.ts +27 -0
  79. package/dest/contract_function_simulator/noir-structs/note_data.d.ts.map +1 -0
  80. package/dest/contract_function_simulator/noir-structs/note_data.js +3 -0
  81. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +4 -3
  82. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts.map +1 -1
  83. package/dest/contract_function_simulator/noir-structs/note_validation_request.js +6 -5
  84. package/dest/contract_function_simulator/noir-structs/option.d.ts +59 -0
  85. package/dest/contract_function_simulator/noir-structs/option.d.ts.map +1 -0
  86. package/dest/contract_function_simulator/noir-structs/option.js +67 -0
  87. package/dest/contract_function_simulator/noir-structs/origin_block.d.ts +11 -0
  88. package/dest/contract_function_simulator/noir-structs/origin_block.d.ts.map +1 -0
  89. package/dest/contract_function_simulator/noir-structs/origin_block.js +5 -0
  90. package/dest/contract_function_simulator/noir-structs/pending_tagged_log.d.ts +11 -0
  91. package/dest/contract_function_simulator/noir-structs/pending_tagged_log.d.ts.map +1 -0
  92. package/dest/contract_function_simulator/noir-structs/pending_tagged_log.js +4 -0
  93. package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts +8 -0
  94. package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts.map +1 -0
  95. package/dest/contract_function_simulator/noir-structs/provided_secret.js +1 -0
  96. package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.d.ts +28 -0
  97. package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.d.ts.map +1 -0
  98. package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.js +50 -0
  99. package/dest/contract_function_simulator/noir-structs/resolved_tx.d.ts +19 -0
  100. package/dest/contract_function_simulator/noir-structs/resolved_tx.d.ts.map +1 -0
  101. package/dest/contract_function_simulator/noir-structs/resolved_tx.js +9 -0
  102. package/dest/contract_function_simulator/noir-structs/tx_effect_data.d.ts +15 -0
  103. package/dest/contract_function_simulator/noir-structs/tx_effect_data.d.ts.map +1 -0
  104. package/dest/contract_function_simulator/noir-structs/tx_effect_data.js +5 -0
  105. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts +6 -11
  106. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts.map +1 -1
  107. package/dest/contract_function_simulator/noir-structs/utility_context.js +1 -20
  108. package/dest/contract_function_simulator/oracle/acir_callback.d.ts +21 -0
  109. package/dest/contract_function_simulator/oracle/acir_callback.d.ts.map +1 -0
  110. package/dest/contract_function_simulator/oracle/acir_callback.js +115 -0
  111. package/dest/contract_function_simulator/oracle/index.d.ts +2 -13
  112. package/dest/contract_function_simulator/oracle/index.d.ts.map +1 -1
  113. package/dest/contract_function_simulator/oracle/index.js +1 -1
  114. package/dest/contract_function_simulator/oracle/interfaces.d.ts +15 -103
  115. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  116. package/dest/contract_function_simulator/oracle/interfaces.js +2 -2
  117. package/dest/contract_function_simulator/oracle/legacy_oracle_registry.d.ts +39 -0
  118. package/dest/contract_function_simulator/oracle/legacy_oracle_registry.d.ts.map +1 -0
  119. package/dest/contract_function_simulator/oracle/legacy_oracle_registry.js +107 -0
  120. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts +3 -14
  121. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts.map +1 -1
  122. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.js +1 -24
  123. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts +2 -2
  124. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts.map +1 -1
  125. package/dest/contract_function_simulator/oracle/note_packing_utils.js +2 -2
  126. package/dest/contract_function_simulator/oracle/oracle_registry.d.ts +139 -0
  127. package/dest/contract_function_simulator/oracle/oracle_registry.d.ts.map +1 -0
  128. package/dest/contract_function_simulator/oracle/oracle_registry.js +1016 -0
  129. package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts +274 -0
  130. package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts.map +1 -0
  131. package/dest/contract_function_simulator/oracle/oracle_type_mappings.js +1243 -0
  132. package/dest/contract_function_simulator/oracle/private_execution.d.ts +1 -1
  133. package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
  134. package/dest/contract_function_simulator/oracle/private_execution.js +2 -3
  135. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +47 -36
  136. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  137. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +200 -65
  138. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +152 -66
  139. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  140. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +590 -173
  141. package/dest/contract_function_simulator/pick_notes.d.ts +1 -1
  142. package/dest/contract_function_simulator/pick_notes.d.ts.map +1 -1
  143. package/dest/contract_function_simulator/pick_notes.js +20 -3
  144. package/dest/contract_function_simulator/transient_array_service.d.ts +31 -0
  145. package/dest/contract_function_simulator/transient_array_service.d.ts.map +1 -0
  146. package/dest/contract_function_simulator/transient_array_service.js +62 -0
  147. package/dest/debug/pxe_debug_utils.d.ts +2 -7
  148. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  149. package/dest/debug/pxe_debug_utils.js +9 -7
  150. package/dest/entrypoints/client/bundle/index.d.ts +2 -1
  151. package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
  152. package/dest/entrypoints/client/bundle/index.js +1 -0
  153. package/dest/entrypoints/client/bundle/utils.d.ts +2 -2
  154. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  155. package/dest/entrypoints/client/bundle/utils.js +21 -8
  156. package/dest/entrypoints/client/lazy/index.d.ts +2 -1
  157. package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
  158. package/dest/entrypoints/client/lazy/index.js +1 -0
  159. package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
  160. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  161. package/dest/entrypoints/client/lazy/utils.js +21 -8
  162. package/dest/entrypoints/client/store.d.ts +14 -0
  163. package/dest/entrypoints/client/store.d.ts.map +1 -0
  164. package/dest/entrypoints/client/store.js +42 -0
  165. package/dest/entrypoints/pxe_creation_options.d.ts +16 -2
  166. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  167. package/dest/entrypoints/pxe_creation_options.js +3 -1
  168. package/dest/entrypoints/server/index.d.ts +7 -3
  169. package/dest/entrypoints/server/index.d.ts.map +1 -1
  170. package/dest/entrypoints/server/index.js +5 -2
  171. package/dest/entrypoints/server/store.d.ts +18 -0
  172. package/dest/entrypoints/server/store.d.ts.map +1 -0
  173. package/dest/entrypoints/server/store.js +28 -0
  174. package/dest/entrypoints/server/utils.d.ts +4 -3
  175. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  176. package/dest/entrypoints/server/utils.js +22 -8
  177. package/dest/error_enriching.d.ts +5 -3
  178. package/dest/error_enriching.d.ts.map +1 -1
  179. package/dest/error_enriching.js +15 -12
  180. package/dest/events/event_service.d.ts +19 -4
  181. package/dest/events/event_service.d.ts.map +1 -1
  182. package/dest/events/event_service.js +37 -15
  183. package/dest/events/private_event_filter_validator.d.ts +3 -2
  184. package/dest/events/private_event_filter_validator.d.ts.map +1 -1
  185. package/dest/events/private_event_filter_validator.js +15 -0
  186. package/dest/hooks/authorize_utility_call.d.ts +41 -0
  187. package/dest/hooks/authorize_utility_call.d.ts.map +1 -0
  188. package/dest/hooks/authorize_utility_call.js +4 -0
  189. package/dest/hooks/execution_hooks.d.ts +62 -0
  190. package/dest/hooks/execution_hooks.d.ts.map +1 -0
  191. package/dest/hooks/execution_hooks.js +9 -0
  192. package/dest/hooks/index.d.ts +5 -0
  193. package/dest/hooks/index.d.ts.map +1 -0
  194. package/dest/hooks/index.js +2 -0
  195. package/dest/hooks/resolve_custom_request.d.ts +23 -0
  196. package/dest/hooks/resolve_custom_request.d.ts.map +1 -0
  197. package/dest/hooks/resolve_custom_request.js +3 -0
  198. package/dest/hooks/resolve_tagging_secret_strategy.d.ts +50 -0
  199. package/dest/hooks/resolve_tagging_secret_strategy.d.ts.map +1 -0
  200. package/dest/hooks/resolve_tagging_secret_strategy.js +3 -0
  201. package/dest/job_coordinator/job_coordinator.d.ts +10 -1
  202. package/dest/job_coordinator/job_coordinator.d.ts.map +1 -1
  203. package/dest/job_coordinator/job_coordinator.js +19 -0
  204. package/dest/logs/log_service.d.ts +21 -10
  205. package/dest/logs/log_service.d.ts.map +1 -1
  206. package/dest/logs/log_service.js +173 -76
  207. package/dest/messages/tx_resolver_service.d.ts +28 -0
  208. package/dest/messages/tx_resolver_service.d.ts.map +1 -0
  209. package/dest/messages/tx_resolver_service.js +62 -0
  210. package/dest/node/benchmarked_node.d.ts +20 -0
  211. package/dest/node/benchmarked_node.d.ts.map +1 -0
  212. package/dest/node/benchmarked_node.js +94 -0
  213. package/dest/node/caching_aztec_node.d.ts +24 -0
  214. package/dest/node/caching_aztec_node.d.ts.map +1 -0
  215. package/dest/node/caching_aztec_node.js +268 -0
  216. package/dest/notes/note_service.d.ts +32 -4
  217. package/dest/notes/note_service.d.ts.map +1 -1
  218. package/dest/notes/note_service.js +82 -66
  219. package/dest/oracle_version.d.ts +4 -3
  220. package/dest/oracle_version.d.ts.map +1 -1
  221. package/dest/oracle_version.js +20 -10
  222. package/dest/private_kernel/batch_planner.d.ts +47 -0
  223. package/dest/private_kernel/batch_planner.d.ts.map +1 -0
  224. package/dest/private_kernel/batch_planner.js +104 -0
  225. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +1 -1
  226. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -1
  227. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.js +10 -5
  228. package/dest/private_kernel/hints/test_utils.d.ts +1 -1
  229. package/dest/private_kernel/hints/test_utils.d.ts.map +1 -1
  230. package/dest/private_kernel/hints/test_utils.js +3 -4
  231. package/dest/private_kernel/private_kernel_execution_prover.d.ts +6 -2
  232. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  233. package/dest/private_kernel/private_kernel_execution_prover.js +160 -85
  234. package/dest/private_kernel/private_kernel_oracle.d.ts +12 -10
  235. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  236. package/dest/private_kernel/private_kernel_oracle.js +40 -26
  237. package/dest/pxe.d.ts +164 -51
  238. package/dest/pxe.d.ts.map +1 -1
  239. package/dest/pxe.js +388 -215
  240. package/dest/storage/address_store/address_store.d.ts +1 -1
  241. package/dest/storage/address_store/address_store.d.ts.map +1 -1
  242. package/dest/storage/address_store/address_store.js +2 -1
  243. package/dest/storage/allowed_scopes.d.ts +6 -0
  244. package/dest/storage/allowed_scopes.d.ts.map +1 -0
  245. package/dest/storage/allowed_scopes.js +7 -0
  246. package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -6
  247. package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
  248. package/dest/storage/anchor_block_store/anchor_block_store.js +9 -7
  249. package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.d.ts +42 -0
  250. package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.d.ts.map +1 -0
  251. package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.js +93 -0
  252. package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts +15 -0
  253. package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts.map +1 -0
  254. package/dest/storage/backwards_compatibility_tests/schema_tests.js +671 -0
  255. package/dest/storage/backwards_compatibility_tests/store_spy.d.ts +19 -0
  256. package/dest/storage/backwards_compatibility_tests/store_spy.d.ts.map +1 -0
  257. package/dest/storage/backwards_compatibility_tests/store_spy.js +63 -0
  258. package/dest/storage/capsule_store/capsule_service.d.ts +1 -1
  259. package/dest/storage/capsule_store/capsule_service.d.ts.map +1 -1
  260. package/dest/storage/capsule_store/capsule_service.js +6 -9
  261. package/dest/storage/capsule_store/capsule_store.d.ts +1 -1
  262. package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
  263. package/dest/storage/capsule_store/capsule_store.js +9 -6
  264. package/dest/storage/contract_store/contract_store.d.ts +27 -24
  265. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  266. package/dest/storage/contract_store/contract_store.js +72 -99
  267. package/dest/storage/contract_store/private_functions_tree.d.ts +1 -1
  268. package/dest/storage/contract_store/private_functions_tree.d.ts.map +1 -1
  269. package/dest/storage/contract_store/private_functions_tree.js +2 -1
  270. package/dest/storage/fact_store/fact_service.d.ts +22 -0
  271. package/dest/storage/fact_store/fact_service.d.ts.map +1 -0
  272. package/dest/storage/fact_store/fact_service.js +45 -0
  273. package/dest/storage/fact_store/fact_store.d.ts +95 -0
  274. package/dest/storage/fact_store/fact_store.d.ts.map +1 -0
  275. package/dest/storage/fact_store/fact_store.js +411 -0
  276. package/dest/storage/fact_store/fact_store_keys.d.ts +34 -0
  277. package/dest/storage/fact_store/fact_store_keys.d.ts.map +1 -0
  278. package/dest/storage/fact_store/fact_store_keys.js +50 -0
  279. package/dest/storage/fact_store/index.d.ts +6 -0
  280. package/dest/storage/fact_store/index.d.ts.map +1 -0
  281. package/dest/storage/fact_store/index.js +4 -0
  282. package/dest/storage/fact_store/origin_state.d.ts +59 -0
  283. package/dest/storage/fact_store/origin_state.d.ts.map +1 -0
  284. package/dest/storage/fact_store/origin_state.js +60 -0
  285. package/dest/storage/fact_store/stored_fact.d.ts +32 -0
  286. package/dest/storage/fact_store/stored_fact.d.ts.map +1 -0
  287. package/dest/storage/fact_store/stored_fact.js +64 -0
  288. package/dest/storage/index.d.ts +3 -2
  289. package/dest/storage/index.d.ts.map +1 -1
  290. package/dest/storage/index.js +2 -1
  291. package/dest/storage/metadata.d.ts +2 -2
  292. package/dest/storage/metadata.d.ts.map +1 -1
  293. package/dest/storage/metadata.js +1 -1
  294. package/dest/storage/note_store/note_store.d.ts +42 -33
  295. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  296. package/dest/storage/note_store/note_store.js +200 -170
  297. package/dest/storage/note_store/stored_note.d.ts +3 -8
  298. package/dest/storage/note_store/stored_note.d.ts.map +1 -1
  299. package/dest/storage/note_store/stored_note.js +4 -20
  300. package/dest/storage/open_pxe_stores.d.ts +35 -0
  301. package/dest/storage/open_pxe_stores.d.ts.map +1 -0
  302. package/dest/storage/open_pxe_stores.js +29 -0
  303. package/dest/storage/private_event_store/private_event_store.d.ts +13 -16
  304. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  305. package/dest/storage/private_event_store/private_event_store.js +48 -45
  306. package/dest/storage/private_event_store/stored_private_event.js +1 -1
  307. package/dest/storage/store_identity.d.ts +35 -0
  308. package/dest/storage/store_identity.d.ts.map +1 -0
  309. package/dest/storage/store_identity.js +44 -0
  310. package/dest/storage/tagging_store/index.d.ts +2 -2
  311. package/dest/storage/tagging_store/index.d.ts.map +1 -1
  312. package/dest/storage/tagging_store/index.js +1 -1
  313. package/dest/storage/tagging_store/recipient_tagging_store.d.ts +6 -6
  314. package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
  315. package/dest/storage/tagging_store/sender_tagging_store.d.ts +44 -13
  316. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  317. package/dest/storage/tagging_store/sender_tagging_store.js +91 -36
  318. package/dest/storage/tagging_store/tagging_secret_sources_store.d.ts +51 -0
  319. package/dest/storage/tagging_store/tagging_secret_sources_store.d.ts.map +1 -0
  320. package/dest/storage/tagging_store/tagging_secret_sources_store.js +105 -0
  321. package/dest/tagging/constants.d.ts +11 -2
  322. package/dest/tagging/constants.d.ts.map +1 -1
  323. package/dest/tagging/constants.js +38 -10
  324. package/dest/tagging/get_all_logs_by_tags.d.ts +55 -10
  325. package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -1
  326. package/dest/tagging/get_all_logs_by_tags.js +55 -36
  327. package/dest/tagging/index.d.ts +7 -6
  328. package/dest/tagging/index.d.ts.map +1 -1
  329. package/dest/tagging/index.js +6 -5
  330. package/dest/tagging/persist_sender_tagging_index_ranges.d.ts +29 -0
  331. package/dest/tagging/persist_sender_tagging_index_ranges.d.ts.map +1 -0
  332. package/dest/tagging/persist_sender_tagging_index_ranges.js +42 -0
  333. package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts +74 -0
  334. package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts.map +1 -0
  335. package/dest/tagging/recipient_sync/sync_tagged_private_logs.js +235 -0
  336. package/dest/tagging/recipient_sync/utils/find_highest_indexes.d.ts +3 -3
  337. package/dest/tagging/recipient_sync/utils/find_highest_indexes.d.ts.map +1 -1
  338. package/dest/tagging/reconcile_tagging_index_ranges.d.ts +36 -0
  339. package/dest/tagging/reconcile_tagging_index_ranges.d.ts.map +1 -0
  340. package/dest/tagging/reconcile_tagging_index_ranges.js +74 -0
  341. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +8 -6
  342. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
  343. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +24 -27
  344. package/dest/tagging/sender_sync/utils/classify_pending_txs.d.ts +22 -0
  345. package/dest/tagging/sender_sync/utils/classify_pending_txs.d.ts.map +1 -0
  346. package/dest/tagging/sender_sync/utils/classify_pending_txs.js +62 -0
  347. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +17 -7
  348. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
  349. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +39 -37
  350. package/dest/tagging/sender_sync/utils/resolve_pending_txs.d.ts +29 -0
  351. package/dest/tagging/sender_sync/utils/resolve_pending_txs.d.ts.map +1 -0
  352. package/dest/tagging/sender_sync/utils/resolve_pending_txs.js +42 -0
  353. package/dest/tagging/sender_sync/utils/test_utils.d.ts +16 -0
  354. package/dest/tagging/sender_sync/utils/test_utils.d.ts.map +1 -0
  355. package/dest/tagging/sender_sync/utils/test_utils.js +24 -0
  356. package/dest/tagging/testing/tag_query_test_utils.d.ts +6 -0
  357. package/dest/tagging/testing/tag_query_test_utils.d.ts.map +1 -0
  358. package/dest/tagging/testing/tag_query_test_utils.js +10 -0
  359. package/package.json +20 -17
  360. package/src/bin/check_oracle_version.ts +46 -135
  361. package/src/bin/index.ts +1 -0
  362. package/src/bin/oracle_version_helpers.ts +54 -0
  363. package/src/block_synchronizer/block_stream_source.ts +42 -0
  364. package/src/block_synchronizer/block_synchronizer.ts +80 -40
  365. package/src/config/index.ts +40 -9
  366. package/src/config/package_info.ts +1 -1
  367. package/src/contract/contract_call_graph.ts +113 -0
  368. package/src/contract/contract_class_service.ts +45 -0
  369. package/src/contract/contract_sync_service.ts +342 -0
  370. package/src/contract/helpers.ts +35 -0
  371. package/src/contract/skip_sync_contracts.ts +23 -0
  372. package/src/contract_function_simulator/anchored_contract_data.ts +74 -0
  373. package/src/contract_function_simulator/contract_function_simulator.ts +142 -78
  374. package/src/contract_function_simulator/ephemeral_array_service.ts +110 -0
  375. package/src/contract_function_simulator/execution_note_cache.ts +10 -30
  376. package/src/contract_function_simulator/execution_tagging_index_cache.ts +5 -9
  377. package/src/contract_function_simulator/index.ts +89 -5
  378. package/src/contract_function_simulator/noir-structs/bounded_vec.ts +43 -0
  379. package/src/contract_function_simulator/noir-structs/contract_class_log_data.ts +9 -0
  380. package/src/contract_function_simulator/noir-structs/embedded_curve_point.ts +4 -0
  381. package/src/contract_function_simulator/noir-structs/ephemeral_array.ts +66 -0
  382. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +5 -4
  383. package/src/contract_function_simulator/noir-structs/fact.ts +13 -0
  384. package/src/contract_function_simulator/noir-structs/fact_collection.ts +64 -0
  385. package/src/contract_function_simulator/noir-structs/log_retrieval_request.ts +27 -20
  386. package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +14 -61
  387. package/src/contract_function_simulator/noir-structs/note_data.ts +27 -0
  388. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +6 -5
  389. package/src/contract_function_simulator/noir-structs/option.ts +75 -0
  390. package/src/contract_function_simulator/noir-structs/origin_block.ts +8 -0
  391. package/src/contract_function_simulator/noir-structs/pending_tagged_log.ts +12 -0
  392. package/src/contract_function_simulator/noir-structs/provided_secret.ts +5 -0
  393. package/src/contract_function_simulator/noir-structs/resolved_tagging_strategy.ts +66 -0
  394. package/src/contract_function_simulator/noir-structs/resolved_tx.ts +19 -0
  395. package/src/contract_function_simulator/noir-structs/tx_effect_data.ts +16 -0
  396. package/src/contract_function_simulator/noir-structs/utility_context.ts +5 -17
  397. package/src/contract_function_simulator/oracle/acir_callback.ts +154 -0
  398. package/src/contract_function_simulator/oracle/index.ts +1 -15
  399. package/src/contract_function_simulator/oracle/interfaces.ts +11 -185
  400. package/src/contract_function_simulator/oracle/legacy_oracle_registry.ts +147 -0
  401. package/src/contract_function_simulator/oracle/message_load_oracle_inputs.ts +6 -21
  402. package/src/contract_function_simulator/oracle/note_packing_utils.ts +3 -3
  403. package/src/contract_function_simulator/oracle/oracle_registry.ts +710 -0
  404. package/src/contract_function_simulator/oracle/oracle_type_mappings.ts +1052 -0
  405. package/src/contract_function_simulator/oracle/private_execution.ts +2 -3
  406. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +249 -92
  407. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +846 -325
  408. package/src/contract_function_simulator/pick_notes.ts +22 -3
  409. package/src/contract_function_simulator/transient_array_service.ts +91 -0
  410. package/src/debug/pxe_debug_utils.ts +8 -15
  411. package/src/entrypoints/client/bundle/index.ts +1 -0
  412. package/src/entrypoints/client/bundle/utils.ts +26 -8
  413. package/src/entrypoints/client/lazy/index.ts +1 -0
  414. package/src/entrypoints/client/lazy/utils.ts +26 -8
  415. package/src/entrypoints/client/store.ts +54 -0
  416. package/src/entrypoints/pxe_creation_options.ts +21 -1
  417. package/src/entrypoints/server/index.ts +7 -2
  418. package/src/entrypoints/server/store.ts +47 -0
  419. package/src/entrypoints/server/utils.ts +39 -14
  420. package/src/error_enriching.ts +30 -13
  421. package/src/events/event_service.ts +70 -24
  422. package/src/events/private_event_filter_validator.ts +21 -1
  423. package/src/hooks/authorize_utility_call.ts +44 -0
  424. package/src/hooks/execution_hooks.ts +68 -0
  425. package/src/hooks/index.ts +13 -0
  426. package/src/hooks/resolve_custom_request.ts +24 -0
  427. package/src/hooks/resolve_tagging_secret_strategy.ts +60 -0
  428. package/src/job_coordinator/job_coordinator.ts +30 -0
  429. package/src/logs/log_service.ts +212 -146
  430. package/src/messages/tx_resolver_service.ts +81 -0
  431. package/src/node/benchmarked_node.ts +140 -0
  432. package/src/node/caching_aztec_node.ts +407 -0
  433. package/src/notes/note_service.ts +123 -92
  434. package/src/oracle_version.ts +20 -10
  435. package/src/private_kernel/batch_planner.ts +169 -0
  436. package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +15 -4
  437. package/src/private_kernel/hints/test_utils.ts +3 -10
  438. package/src/private_kernel/private_kernel_execution_prover.ts +246 -117
  439. package/src/private_kernel/private_kernel_oracle.ts +58 -29
  440. package/src/pxe.ts +576 -256
  441. package/src/storage/address_store/address_store.ts +2 -1
  442. package/src/storage/allowed_scopes.ts +14 -0
  443. package/src/storage/anchor_block_store/anchor_block_store.ts +9 -7
  444. package/src/storage/backwards_compatibility_tests/__snapshots__/AddressStore.json +22 -0
  445. package/src/storage/backwards_compatibility_tests/__snapshots__/AnchorBlockStore.json +3 -0
  446. package/src/storage/backwards_compatibility_tests/__snapshots__/CapsuleStore.json +16 -0
  447. package/src/storage/backwards_compatibility_tests/__snapshots__/ContractStore.json +28 -0
  448. package/src/storage/backwards_compatibility_tests/__snapshots__/FactStore.json +40 -0
  449. package/src/storage/backwards_compatibility_tests/__snapshots__/KeyStore.json +52 -0
  450. package/src/storage/backwards_compatibility_tests/__snapshots__/L2TipsKVStore.json +40 -0
  451. package/src/storage/backwards_compatibility_tests/__snapshots__/NoteStore.json +56 -0
  452. package/src/storage/backwards_compatibility_tests/__snapshots__/PrivateEventStore.json +44 -0
  453. package/src/storage/backwards_compatibility_tests/__snapshots__/RecipientTaggingStore.json +26 -0
  454. package/src/storage/backwards_compatibility_tests/__snapshots__/SenderTaggingStore.json +30 -0
  455. package/src/storage/backwards_compatibility_tests/__snapshots__/TaggingSecretSourcesStore.json +30 -0
  456. package/src/storage/backwards_compatibility_tests/__snapshots__/opened_stores.json +117 -0
  457. package/src/storage/backwards_compatibility_tests/kv_store_snapshot.ts +122 -0
  458. package/src/storage/backwards_compatibility_tests/schema_tests.ts +803 -0
  459. package/src/storage/backwards_compatibility_tests/store_spy.ts +73 -0
  460. package/src/storage/capsule_store/capsule_service.ts +8 -13
  461. package/src/storage/capsule_store/capsule_store.ts +16 -6
  462. package/src/storage/contract_store/contract_store.ts +98 -125
  463. package/src/storage/contract_store/private_functions_tree.ts +2 -1
  464. package/src/storage/fact_store/fact_service.ts +69 -0
  465. package/src/storage/fact_store/fact_store.ts +488 -0
  466. package/src/storage/fact_store/fact_store_keys.ts +75 -0
  467. package/src/storage/fact_store/index.ts +15 -0
  468. package/src/storage/fact_store/origin_state.ts +84 -0
  469. package/src/storage/fact_store/stored_fact.ts +80 -0
  470. package/src/storage/index.ts +2 -1
  471. package/src/storage/metadata.ts +1 -1
  472. package/src/storage/note_store/note_store.ts +231 -189
  473. package/src/storage/note_store/stored_note.ts +5 -27
  474. package/src/storage/open_pxe_stores.ts +52 -0
  475. package/src/storage/private_event_store/private_event_store.ts +55 -56
  476. package/src/storage/private_event_store/stored_private_event.ts +1 -1
  477. package/src/storage/store_identity.ts +72 -0
  478. package/src/storage/tagging_store/index.ts +1 -1
  479. package/src/storage/tagging_store/recipient_tagging_store.ts +5 -9
  480. package/src/storage/tagging_store/sender_tagging_store.ts +123 -50
  481. package/src/storage/tagging_store/tagging_secret_sources_store.ts +138 -0
  482. package/src/tagging/constants.ts +42 -10
  483. package/src/tagging/get_all_logs_by_tags.ts +115 -50
  484. package/src/tagging/index.ts +11 -5
  485. package/src/tagging/persist_sender_tagging_index_ranges.ts +57 -0
  486. package/src/tagging/recipient_sync/sync_tagged_private_logs.ts +356 -0
  487. package/src/tagging/recipient_sync/utils/find_highest_indexes.ts +2 -2
  488. package/src/tagging/reconcile_tagging_index_ranges.ts +102 -0
  489. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +30 -38
  490. package/src/tagging/sender_sync/utils/classify_pending_txs.ts +92 -0
  491. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +50 -44
  492. package/src/tagging/sender_sync/utils/resolve_pending_txs.ts +65 -0
  493. package/src/tagging/sender_sync/utils/test_utils.ts +46 -0
  494. package/src/tagging/testing/tag_query_test_utils.ts +11 -0
  495. package/dest/contract_function_simulator/benchmarked_node.d.ts +0 -9
  496. package/dest/contract_function_simulator/benchmarked_node.d.ts.map +0 -1
  497. package/dest/contract_function_simulator/benchmarked_node.js +0 -77
  498. package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.d.ts +0 -9
  499. package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.d.ts.map +0 -1
  500. package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.js +0 -38
  501. package/dest/contract_function_simulator/oracle/oracle.d.ts +0 -80
  502. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +0 -1
  503. package/dest/contract_function_simulator/oracle/oracle.js +0 -458
  504. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts +0 -6
  505. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts.map +0 -1
  506. package/dest/contract_function_simulator/proxied_contract_data_source.js +0 -80
  507. package/dest/contract_sync/contract_sync_service.d.ts +0 -44
  508. package/dest/contract_sync/contract_sync_service.d.ts.map +0 -1
  509. package/dest/contract_sync/contract_sync_service.js +0 -104
  510. package/dest/contract_sync/helpers.d.ts +0 -28
  511. package/dest/contract_sync/helpers.d.ts.map +0 -1
  512. package/dest/contract_sync/helpers.js +0 -60
  513. package/dest/messages/message_context_service.d.ts +0 -17
  514. package/dest/messages/message_context_service.d.ts.map +0 -1
  515. package/dest/messages/message_context_service.js +0 -36
  516. package/dest/storage/tagging_store/sender_address_book_store.d.ts +0 -14
  517. package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +0 -1
  518. package/dest/storage/tagging_store/sender_address_book_store.js +0 -36
  519. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +0 -14
  520. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +0 -1
  521. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +0 -99
  522. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +0 -14
  523. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +0 -1
  524. package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +0 -33
  525. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +0 -12
  526. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +0 -1
  527. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +0 -39
  528. package/src/contract_function_simulator/benchmarked_node.ts +0 -103
  529. package/src/contract_function_simulator/oracle/legacy_oracle_mappings.ts +0 -98
  530. package/src/contract_function_simulator/oracle/oracle.ts +0 -721
  531. package/src/contract_function_simulator/proxied_contract_data_source.ts +0 -83
  532. package/src/contract_sync/contract_sync_service.ts +0 -170
  533. package/src/contract_sync/helpers.ts +0 -98
  534. package/src/messages/message_context_service.ts +0 -44
  535. package/src/storage/tagging_store/sender_address_book_store.ts +0 -48
  536. package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +0 -140
  537. package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +0 -44
  538. package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +0 -51
package/src/pxe.ts CHANGED
@@ -1,37 +1,44 @@
1
1
  import type { PrivateEventFilter } from '@aztec/aztec.js/wallet';
2
2
  import { BlockNumber } from '@aztec/foundation/branded-types';
3
3
  import { Fr } from '@aztec/foundation/curves/bn254';
4
+ import { Point } from '@aztec/foundation/curves/grumpkin';
4
5
  import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
6
+ import { allToCompletion } from '@aztec/foundation/promise';
5
7
  import { SerialQueue } from '@aztec/foundation/queue';
6
8
  import { Timer } from '@aztec/foundation/timer';
7
9
  import { KeyStore } from '@aztec/key-store';
10
+ import type { AccountPrivacyKeys, AccountPrivacySecretKeys } from '@aztec/key-store';
8
11
  import type { AztecAsyncKVStore } from '@aztec/kv-store';
9
- import { L2TipsKVStore } from '@aztec/kv-store/stores';
10
12
  import { type ProtocolContractsProvider, protocolContractNames } from '@aztec/protocol-contracts';
11
13
  import type { CircuitSimulator } from '@aztec/simulator/client';
12
14
  import {
13
15
  type ContractArtifact,
14
16
  EventSelector,
15
17
  FunctionCall,
18
+ type FunctionSelector,
16
19
  FunctionType,
17
20
  decodeFunctionSignature,
18
21
  } from '@aztec/stdlib/abi';
19
22
  import type { AuthWitness } from '@aztec/stdlib/auth-witness';
20
23
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
24
+ import { GENESIS_BLOCK_HEADER_HASH, type L2TipsProvider } from '@aztec/stdlib/block';
21
25
  import {
22
26
  CompleteAddress,
27
+ type ContractInstancePreimage,
28
+ type ContractInstancePreimageWithAddress,
23
29
  type ContractInstanceWithAddress,
24
30
  type PartialAddress,
25
31
  computeContractAddressFromInstance,
26
- getContractClassFromArtifact,
27
32
  } from '@aztec/stdlib/contract';
28
33
  import { SimulationError } from '@aztec/stdlib/errors';
29
- import type { AztecNode, PrivateKernelProver } from '@aztec/stdlib/interfaces/client';
34
+ import type { AztecNode, AztecNodeDebug, PrivateKernelProver } from '@aztec/stdlib/interfaces/client';
30
35
  import type {
31
36
  PrivateExecutionStep,
32
37
  PrivateKernelExecutionProofOutput,
33
38
  PrivateKernelTailCircuitPublicInputs,
34
39
  } from '@aztec/stdlib/kernel';
40
+ import { computeAddressSecret } from '@aztec/stdlib/keys';
41
+ import { deriveEcdhSharedSecretPoint, protectFromForgery } from '@aztec/stdlib/logs';
35
42
  import {
36
43
  BlockHeader,
37
44
  type ContractOverrides,
@@ -54,20 +61,20 @@ import { inspect } from 'util';
54
61
 
55
62
  import { BlockSynchronizer } from './block_synchronizer/index.js';
56
63
  import type { PXEConfig } from './config/index.js';
57
- import { BenchmarkedNodeFactory } from './contract_function_simulator/benchmarked_node.js';
64
+ import { ContractClassService } from './contract/contract_class_service.js';
65
+ import { ContractSyncService } from './contract/contract_sync_service.js';
58
66
  import {
59
67
  ContractFunctionSimulator,
60
68
  generateSimulatedProvingResult,
61
69
  } from './contract_function_simulator/contract_function_simulator.js';
62
- import { ProxiedContractStoreFactory } from './contract_function_simulator/proxied_contract_data_source.js';
63
70
  import { displayDebugLogs } from './contract_logging.js';
64
- import { ContractSyncService } from './contract_sync/contract_sync_service.js';
65
- import { readCurrentClassId } from './contract_sync/helpers.js';
66
71
  import { PXEDebugUtils } from './debug/pxe_debug_utils.js';
67
72
  import { enrichPublicSimulationError, enrichSimulationError } from './error_enriching.js';
68
73
  import { PrivateEventFilterValidator } from './events/private_event_filter_validator.js';
74
+ import type { ExecutionHooks } from './hooks/index.js';
69
75
  import { JobCoordinator } from './job_coordinator/job_coordinator.js';
70
- import { MessageContextService } from './messages/message_context_service.js';
76
+ import { TxResolverService } from './messages/tx_resolver_service.js';
77
+ import { type CachingAztecNode, withCache } from './node/caching_aztec_node.js';
71
78
  import {
72
79
  PrivateKernelExecutionProver,
73
80
  type PrivateKernelExecutionProverConfig,
@@ -77,17 +84,31 @@ import { AddressStore } from './storage/address_store/address_store.js';
77
84
  import { AnchorBlockStore } from './storage/anchor_block_store/anchor_block_store.js';
78
85
  import { CapsuleStore } from './storage/capsule_store/capsule_store.js';
79
86
  import { ContractStore } from './storage/contract_store/contract_store.js';
87
+ import { FactStore } from './storage/fact_store/index.js';
80
88
  import { NoteStore } from './storage/note_store/note_store.js';
89
+ import { openPxeStores } from './storage/open_pxe_stores.js';
81
90
  import { PrivateEventStore } from './storage/private_event_store/private_event_store.js';
82
91
  import { RecipientTaggingStore } from './storage/tagging_store/recipient_tagging_store.js';
83
- import { SenderAddressBookStore } from './storage/tagging_store/sender_address_book_store.js';
84
92
  import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store.js';
93
+ import {
94
+ type SharedSecretKind,
95
+ TaggingSecretSourcesStore,
96
+ } from './storage/tagging_store/tagging_secret_sources_store.js';
97
+ import { persistSenderTaggingIndexRangesForTx } from './tagging/index.js';
85
98
 
86
99
  export type PackedPrivateEvent = InTx & {
87
100
  packedEvent: Fr[];
88
101
  eventSelector: EventSelector;
89
102
  };
90
103
 
104
+ /** Options for PXE.proveTx. */
105
+ export type ProveTxOpts = {
106
+ /** Addresses whose private state and keys are accessible during private execution. */
107
+ scopes: AztecAddress[];
108
+ /** Sender address used to derive discovery tags for private messages (notes, events, logs) this tx emits. */
109
+ senderForTags?: AztecAddress;
110
+ };
111
+
91
112
  /** Options for PXE.profileTx. */
92
113
  export type ProfileTxOpts = {
93
114
  /** The profiling mode to use. */
@@ -96,6 +117,8 @@ export type ProfileTxOpts = {
96
117
  skipProofGeneration?: boolean;
97
118
  /** Addresses whose private state and keys are accessible during private execution. */
98
119
  scopes: AztecAddress[];
120
+ /** Sender address used to derive discovery tags for private messages (notes, events, logs) this tx emits. */
121
+ senderForTags?: AztecAddress;
99
122
  };
100
123
 
101
124
  /** Options for PXE.simulateTx. */
@@ -108,10 +131,16 @@ export type SimulateTxOpts = {
108
131
  skipFeeEnforcement?: boolean;
109
132
  /** If true, kernel logic is emulated in TS for simulation */
110
133
  skipKernels?: boolean;
111
- /** State overrides for the simulation, such as contract instances and artifacts. Requires skipKernels: true */
134
+ /**
135
+ * Pre-simulation overrides applied to the ephemeral fork and contract DB. Bundles publicStorage
136
+ * writes (no skipKernels required) and per-address (instance, artifact?) overrides used by both
137
+ * AVM-side public dispatch and PXE-side ACIR private dispatch (requires skipKernels: true).
138
+ */
112
139
  overrides?: SimulationOverrides;
113
140
  /** Addresses whose private state and keys are accessible during private execution */
114
141
  scopes: AztecAddress[];
142
+ /** Sender address used to derive discovery tags for private messages (notes, events, logs) this tx emits. */
143
+ senderForTags?: AztecAddress;
115
144
  };
116
145
 
117
146
  /** Options for PXE.executeUtility. */
@@ -122,10 +151,30 @@ export type ExecuteUtilityOpts = {
122
151
  scopes: AztecAddress[];
123
152
  };
124
153
 
154
+ /**
155
+ * Supplies the set of "nice to have" contracts that every PXE preloads regardless of which wallet
156
+ * drives it. Today this is just the standard multi-call entrypoint: the SDK's self-paid account
157
+ * deploy flow ({@link DeployAccountMethod} with `from = NO_FROM`) routes its payload through it, so a
158
+ * PXE that did not register it would fail contract sync with an opaque "no contract instance" error.
159
+ *
160
+ * Returning a list keeps this extensible: a wallet may supply its own provider that preloads
161
+ * additional contracts. Injected the same way as {@link ProtocolContractsProvider} so the PXE never
162
+ * statically imports the bundled artifacts, keeping the bundle/lazy split intact.
163
+ */
164
+ export type PreloadedContractsProvider = {
165
+ /** Returns the contract instances and artifacts the PXE should preload on startup. */
166
+ getPreloadedContracts: () => Promise<Array<{ instance: ContractInstanceWithAddress; artifact: ContractArtifact }>>;
167
+ };
168
+
125
169
  /** Args for PXE.create. */
126
170
  export type PXECreateArgs = {
127
171
  /** The Aztec node to connect to. */
128
172
  node: AztecNode;
173
+ /**
174
+ * Optional debug API client. When provided, public function signatures are registered with the node so that
175
+ * node-side public-execution stack traces can be named. Skipped when the node does not expose the debug API.
176
+ */
177
+ nodeDebug?: AztecNodeDebug;
129
178
  /** The key-value store for persisting PXE state. */
130
179
  store: AztecAsyncKVStore;
131
180
  /** The prover for generating private kernel proofs. */
@@ -134,41 +183,84 @@ export type PXECreateArgs = {
134
183
  simulator: CircuitSimulator;
135
184
  /** Provider for protocol contract artifacts and instances. */
136
185
  protocolContractsProvider: ProtocolContractsProvider;
186
+ /**
187
+ * Contracts to preload on startup. Injected by the entrypoint with the bundle-or-lazy flavor that
188
+ * matches the runtime (bundle for node/eager browser, lazy for code-split browser), so the PXE
189
+ * never statically imports a standard-contract artifact and the bundle/lazy split stays intact.
190
+ */
191
+ preloadedContractsProvider: PreloadedContractsProvider;
137
192
  /** PXE configuration options. */
138
193
  config: PXEConfig;
139
194
  /** Optional logger instance or string suffix for the logger name. */
140
195
  loggerOrSuffix?: string | Logger;
196
+ /** Optional hooks to observe and influence contract execution. */
197
+ hooks?: ExecutionHooks;
141
198
  };
142
199
 
200
+ /** A source from which PXE derives the tagging secrets it scans for to discover incoming private logs. */
201
+ export type TaggingSecretSource =
202
+ /**
203
+ * Derives a shared secret via ECDH from an external `sender` address against every account registered in this PXE
204
+ * (present and future), so registering one sender applies it to all of them. The address is not secret, so unlike
205
+ * `arbitrary-secret` it can be reused freely across recipients.
206
+ */
207
+ | { kind: 'address-derived'; sender: AztecAddress }
208
+ /**
209
+ * A shared secret point provided directly, scoped to a single recipient. It bypasses ECDH, so it must not be
210
+ * reused across recipients (each would then be able to find the others' tags).
211
+ */
212
+ | { kind: 'arbitrary-secret'; recipient: AztecAddress; secret: Point }
213
+ /**
214
+ * A handshake known by the x-coordinate of its ephemeral public key (the value a recipient learns while authorizing
215
+ * an interactive handshake, which emits no discoverable announcement). The ephemeral key's y-coordinate is always
216
+ * positive by protocol construction, so the x-coordinate alone identifies it.
217
+ */
218
+ | { kind: 'handshake'; recipient: AztecAddress; ephPk: Fr };
219
+
220
+ /**
221
+ * The registered form of a {@link TaggingSecretSource}.
222
+ */
223
+ export type RegisteredTaggingSecretSource =
224
+ | Exclude<TaggingSecretSource, { kind: 'handshake' }>
225
+ /** A handshake's resolved shared secret, derived at registration from the handshake's ephemeral key. */
226
+ | { kind: 'handshake'; recipient: AztecAddress; secret: Point };
227
+
143
228
  /**
144
229
  * Private eXecution Environment (PXE) is a library used by wallets to simulate private phase of transactions and to
145
230
  * manage private state of users.
146
231
  */
147
232
  export class PXE {
148
233
  private constructor(
149
- private node: AztecNode,
234
+ private node: CachingAztecNode,
235
+ private nodeDebug: AztecNodeDebug | undefined,
150
236
  private db: AztecAsyncKVStore,
151
237
  private blockStateSynchronizer: BlockSynchronizer,
152
238
  private keyStore: KeyStore,
153
239
  private contractStore: ContractStore,
154
240
  private noteStore: NoteStore,
155
241
  private capsuleStore: CapsuleStore,
242
+ private factStore: FactStore,
156
243
  private anchorBlockStore: AnchorBlockStore,
157
244
  private senderTaggingStore: SenderTaggingStore,
158
- private senderAddressBookStore: SenderAddressBookStore,
245
+ private taggingSecretSourcesStore: TaggingSecretSourcesStore,
159
246
  private recipientTaggingStore: RecipientTaggingStore,
160
247
  private addressStore: AddressStore,
161
248
  private privateEventStore: PrivateEventStore,
162
249
  private contractSyncService: ContractSyncService,
163
- private messageContextService: MessageContextService,
250
+ private contractClassService: ContractClassService,
251
+ private txResolver: TxResolverService,
252
+ private l2TipsStore: L2TipsProvider,
164
253
  private simulator: CircuitSimulator,
165
254
  private proverEnabled: boolean,
255
+ private autoSync: boolean,
166
256
  private proofCreator: PrivateKernelProver,
167
257
  private protocolContractsProvider: ProtocolContractsProvider,
258
+ private preloadedContractsProvider: PreloadedContractsProvider,
168
259
  private log: Logger,
169
260
  private jobQueue: SerialQueue,
170
261
  private jobCoordinator: JobCoordinator,
171
262
  public debug: PXEDebugUtils,
263
+ private hooks: ExecutionHooks | undefined,
172
264
  ) {}
173
265
 
174
266
  /**
@@ -180,12 +272,15 @@ export class PXE {
180
272
  */
181
273
  public static async create({
182
274
  node,
275
+ nodeDebug,
183
276
  store,
184
277
  proofCreator,
185
278
  simulator,
186
279
  protocolContractsProvider,
280
+ preloadedContractsProvider,
187
281
  config,
188
282
  loggerOrSuffix,
283
+ hooks,
189
284
  }: PXECreateArgs) {
190
285
  // Extract bindings from the logger, or use empty bindings if a string suffix is provided.
191
286
  const bindings: LoggerBindings | undefined =
@@ -198,33 +293,52 @@ export class PXE {
198
293
 
199
294
  const info = await node.getNodeInfo();
200
295
 
296
+ // Source the genesis block hash from the node so PXE's L2BlockStream agrees with the node's
297
+ // archiver on the dynamic initial header hash. Without this the tip store would fall back to
298
+ // the static `GENESIS_BLOCK_HEADER_HASH` constant, which only matches deployments with the
299
+ // default empty genesis (timestamp 0, no prefilled public data) and diverges otherwise — the
300
+ // sync at block 0 would then get stuck in `areBlockHashesEqualAt` and abort. If the node does
301
+ // not return a genesis block (older node or test fixture) we fall back to the static constant.
302
+ const initialBlockHash = (await node.getBlock(BlockNumber.ZERO))?.hash ?? GENESIS_BLOCK_HEADER_HASH;
303
+
201
304
  const proverEnabled = config.proverEnabled !== undefined ? config.proverEnabled : info.realProofs;
202
- const addressStore = new AddressStore(store);
203
- const privateEventStore = new PrivateEventStore(store);
204
- const contractStore = new ContractStore(store);
205
- const noteStore = new NoteStore(store);
206
- const anchorBlockStore = new AnchorBlockStore(store);
207
- const senderTaggingStore = new SenderTaggingStore(store);
208
- const senderAddressBookStore = new SenderAddressBookStore(store);
209
- const recipientTaggingStore = new RecipientTaggingStore(store);
210
- const capsuleStore = new CapsuleStore(store);
211
- const keyStore = new KeyStore(store);
212
- const tipsStore = new L2TipsKVStore(store, 'pxe');
305
+ const {
306
+ addressStore,
307
+ privateEventStore,
308
+ contractStore,
309
+ noteStore,
310
+ anchorBlockStore,
311
+ senderTaggingStore,
312
+ taggingSecretSourcesStore,
313
+ recipientTaggingStore,
314
+ capsuleStore,
315
+ keyStore,
316
+ l2TipsStore,
317
+ factStore,
318
+ } = openPxeStores(store, initialBlockHash);
319
+ // Every PXE consumer reads through this one wrapper, so a read cached by one is served to the rest. Only
320
+ // immutable, hash-pinned reads are cached (the rule lives on `withCache`), which makes it safe regardless of
321
+ // the consumer's anchor block; the block synchronizer wipes it on anchor updates to bound memory.
322
+ const readCachedNode = withCache(node);
323
+ const contractClassService = new ContractClassService(readCachedNode, contractStore);
213
324
  const contractSyncService = new ContractSyncService(
214
- node,
325
+ readCachedNode,
215
326
  contractStore,
327
+ contractClassService,
216
328
  noteStore,
217
329
  createLogger('pxe:contract_sync', bindings),
330
+ config,
218
331
  );
219
- const messageContextService = new MessageContextService(node);
332
+ const txResolver = new TxResolverService(readCachedNode);
220
333
 
221
334
  const synchronizer = new BlockSynchronizer(
222
- node,
335
+ readCachedNode,
223
336
  store,
224
337
  anchorBlockStore,
225
338
  noteStore,
226
339
  privateEventStore,
227
- tipsStore,
340
+ factStore,
341
+ l2TipsStore,
228
342
  contractSyncService,
229
343
  config,
230
344
  bindings,
@@ -237,6 +351,7 @@ export class PXE {
237
351
  recipientTaggingStore,
238
352
  privateEventStore,
239
353
  noteStore,
354
+ factStore,
240
355
  contractSyncService,
241
356
  ]);
242
357
 
@@ -245,29 +360,36 @@ export class PXE {
245
360
  const jobQueue = new SerialQueue();
246
361
 
247
362
  const pxe = new PXE(
248
- node,
363
+ readCachedNode,
364
+ nodeDebug,
249
365
  store,
250
366
  synchronizer,
251
367
  keyStore,
252
368
  contractStore,
253
369
  noteStore,
254
370
  capsuleStore,
371
+ factStore,
255
372
  anchorBlockStore,
256
373
  senderTaggingStore,
257
- senderAddressBookStore,
374
+ taggingSecretSourcesStore,
258
375
  recipientTaggingStore,
259
376
  addressStore,
260
377
  privateEventStore,
261
378
  contractSyncService,
262
- messageContextService,
379
+ contractClassService,
380
+ txResolver,
381
+ l2TipsStore,
263
382
  simulator,
264
383
  proverEnabled,
384
+ config.autoSync,
265
385
  proofCreator,
266
386
  protocolContractsProvider,
387
+ preloadedContractsProvider,
267
388
  log,
268
389
  jobQueue,
269
390
  jobCoordinator,
270
391
  debugUtils,
392
+ hooks,
271
393
  );
272
394
 
273
395
  debugUtils.setPXEHelpers(
@@ -278,7 +400,7 @@ export class PXE {
278
400
 
279
401
  pxe.jobQueue.start();
280
402
 
281
- await pxe.#registerProtocolContracts();
403
+ await allToCompletion([pxe.#registerProtocolContracts(), pxe.#registerPreloadedContracts()]);
282
404
  log.info(`Started PXE connected to chain ${info.l1ChainId} version ${info.rollupVersion}`);
283
405
  return pxe;
284
406
  }
@@ -286,25 +408,52 @@ export class PXE {
286
408
  // Internal methods
287
409
 
288
410
  #getSimulatorForTx(overrides?: { contracts?: ContractOverrides }) {
289
- const proxyContractStore = ProxiedContractStoreFactory.create(this.contractStore, overrides?.contracts);
290
-
291
411
  return new ContractFunctionSimulator({
292
- contractStore: proxyContractStore,
412
+ contractStore: this.contractStore,
413
+ contractClassService: this.contractClassService,
414
+ overrides: overrides?.contracts,
293
415
  noteStore: this.noteStore,
294
416
  keyStore: this.keyStore,
295
417
  addressStore: this.addressStore,
296
- aztecNode: BenchmarkedNodeFactory.create(this.node),
418
+ aztecNode: this.node,
419
+ l2TipsStore: this.l2TipsStore,
297
420
  senderTaggingStore: this.senderTaggingStore,
298
421
  recipientTaggingStore: this.recipientTaggingStore,
299
- senderAddressBookStore: this.senderAddressBookStore,
422
+ taggingSecretSourcesStore: this.taggingSecretSourcesStore,
300
423
  capsuleStore: this.capsuleStore,
424
+ factStore: this.factStore,
301
425
  privateEventStore: this.privateEventStore,
302
426
  simulator: this.simulator,
303
427
  contractSyncService: this.contractSyncService,
304
- messageContextService: this.messageContextService,
428
+ txResolver: this.txResolver,
429
+ hooks: this.hooks,
305
430
  });
306
431
  }
307
432
 
433
+ /** Best-effort debug function name for the class `address` runs at `anchorBlockHeader`. Used for log display only. */
434
+ async #getDebugFunctionName(
435
+ address: AztecAddress,
436
+ selector: FunctionSelector,
437
+ anchorBlockHeader: BlockHeader,
438
+ ): Promise<string> {
439
+ try {
440
+ const classId = await this.contractClassService.getCurrentClassId(address, anchorBlockHeader);
441
+ return classId ? await this.contractStore.getDebugFunctionName(classId, selector) : `${address}:${selector}`;
442
+ } catch {
443
+ return `${address}:${selector}`;
444
+ }
445
+ }
446
+
447
+ /** Best-effort debug contract name for the class `address` runs at `anchorBlockHeader`. Used for log display only. */
448
+ async #getDebugContractName(address: AztecAddress, anchorBlockHeader: BlockHeader): Promise<string | undefined> {
449
+ try {
450
+ const classId = await this.contractClassService.getCurrentClassId(address, anchorBlockHeader);
451
+ return classId ? await this.contractStore.getDebugContractName(classId) : undefined;
452
+ } catch {
453
+ return undefined;
454
+ }
455
+ }
456
+
308
457
  #contextualizeError(err: Error, ...context: string[]): Error {
309
458
  let contextStr = '';
310
459
  if (context.length > 0) {
@@ -352,51 +501,77 @@ export class PXE {
352
501
  }
353
502
 
354
503
  async #registerProtocolContracts() {
355
- const registered: Record<string, string> = {};
356
- for (const name of protocolContractNames) {
357
- const { address, instance, artifact } = await this.protocolContractsProvider.getProtocolContractArtifact(name);
358
- await this.contractStore.addContractArtifact(artifact);
359
- await this.contractStore.addContractInstance(instance);
360
- registered[name] = address.toString();
361
- }
504
+ const registered = Object.fromEntries(
505
+ await allToCompletion(
506
+ protocolContractNames.map(async name => {
507
+ const { address, instance, artifact } =
508
+ await this.protocolContractsProvider.getProtocolContractArtifact(name);
509
+ await this.contractStore.addContractArtifact(artifact);
510
+ await this.contractStore.addContractInstance(instance);
511
+ return [name, address.toString()] as const;
512
+ }),
513
+ ),
514
+ );
362
515
  this.log.verbose(`Registered protocol contracts in pxe`, registered);
363
516
  }
364
517
 
518
+ async #registerPreloadedContracts() {
519
+ const contracts = await this.preloadedContractsProvider.getPreloadedContracts();
520
+ await allToCompletion(
521
+ contracts.map(async ({ instance, artifact }) => {
522
+ if (artifact) {
523
+ await this.registerContractClass(artifact);
524
+ }
525
+ await this.registerContract(instance);
526
+ }),
527
+ );
528
+ this.log.verbose(`Registered preloaded contracts in pxe`, {
529
+ contracts: contracts.map(({ instance }) => instance.address.toString()),
530
+ });
531
+ }
532
+
365
533
  // Executes the entrypoint private function, as well as all nested private
366
534
  // functions that might arise.
367
- async #executePrivate(
368
- contractFunctionSimulator: ContractFunctionSimulator,
369
- txRequest: TxExecutionRequest,
370
- scopes: AztecAddress[],
371
- jobId: string,
372
- ): Promise<PrivateExecutionResult> {
535
+ async #executePrivate({
536
+ contractFunctionSimulator,
537
+ txRequest,
538
+ anchorBlockHeader,
539
+ scopes,
540
+ jobId,
541
+ senderForTags,
542
+ }: {
543
+ contractFunctionSimulator: ContractFunctionSimulator;
544
+ txRequest: TxExecutionRequest;
545
+ anchorBlockHeader: BlockHeader;
546
+ scopes: AztecAddress[];
547
+ jobId: string;
548
+ senderForTags?: AztecAddress;
549
+ }): Promise<PrivateExecutionResult> {
373
550
  const { origin: contractAddress, functionSelector } = txRequest;
374
551
 
375
552
  try {
376
- const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
377
-
378
- await this.contractSyncService.ensureContractSynced(
379
- contractAddress,
380
- functionSelector,
381
- (privateSyncCall, execScopes) =>
553
+ await this.contractSyncService.ensureContractSynced({
554
+ contract: contractAddress,
555
+ functionToInvokeAfterSync: functionSelector,
556
+ utilityExecutor: (privateSyncCall, execScopes) =>
382
557
  this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
383
558
  anchorBlockHeader,
384
559
  jobId,
385
560
  scopes,
386
- );
561
+ triggeredBy: undefined,
562
+ });
387
563
 
388
564
  const result = await contractFunctionSimulator.run(txRequest, {
389
- contractAddress,
390
- selector: functionSelector,
391
565
  anchorBlockHeader,
392
566
  scopes,
393
567
  jobId,
568
+ senderForTags,
394
569
  });
395
570
  this.log.debug(`Private simulation completed for ${contractAddress.toString()}:${functionSelector}`);
396
571
  return result;
397
572
  } catch (err) {
398
573
  if (err instanceof SimulationError) {
399
- await enrichSimulationError(err, this.contractStore, this.log);
574
+ await enrichSimulationError(err, this.contractStore, this.contractClassService, anchorBlockHeader, this.log);
400
575
  }
401
576
  throw err;
402
577
  }
@@ -431,7 +606,8 @@ export class PXE {
431
606
  return { result, offchainEffects };
432
607
  } catch (err) {
433
608
  if (err instanceof SimulationError) {
434
- await enrichSimulationError(err, this.contractStore, this.log);
609
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
610
+ await enrichSimulationError(err, this.contractStore, this.contractClassService, anchorBlockHeader, this.log);
435
611
  }
436
612
  throw err;
437
613
  }
@@ -443,11 +619,11 @@ export class PXE {
443
619
  * It can also be used for estimating gas in the future.
444
620
  * @param tx - The transaction to be simulated.
445
621
  */
446
- async #simulatePublicCalls(tx: Tx, skipFeeEnforcement: boolean) {
622
+ async #simulatePublicCalls(tx: Tx, skipFeeEnforcement: boolean, overrides?: SimulationOverrides) {
447
623
  // Simulating public calls can throw if the TX fails in a phase that doesn't allow reverts (setup)
448
624
  // Or return as reverted if it fails in a phase that allows reverts (app logic, teardown)
449
625
  try {
450
- const result = await this.node.simulatePublicCalls(tx, skipFeeEnforcement);
626
+ const result = await this.node.simulatePublicCalls(tx, skipFeeEnforcement, overrides);
451
627
  if (result.revertReason) {
452
628
  throw result.revertReason;
453
629
  }
@@ -455,7 +631,14 @@ export class PXE {
455
631
  } catch (err) {
456
632
  if (err instanceof SimulationError) {
457
633
  try {
458
- await enrichPublicSimulationError(err, this.contractStore, this.log);
634
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
635
+ await enrichPublicSimulationError(
636
+ err,
637
+ this.contractStore,
638
+ this.contractClassService,
639
+ anchorBlockHeader,
640
+ this.log,
641
+ );
459
642
  } catch (enrichErr) {
460
643
  this.log.error(`Failed to enrich public simulation error: ${enrichErr}`);
461
644
  }
@@ -479,11 +662,16 @@ export class PXE {
479
662
  txExecutionRequest: TxExecutionRequest,
480
663
  proofCreator: PrivateKernelProver,
481
664
  privateExecutionResult: PrivateExecutionResult,
665
+ anchorBlockHeader: BlockHeader,
482
666
  config: PrivateKernelExecutionProverConfig,
483
667
  ): Promise<PrivateKernelExecutionProofOutput<PrivateKernelTailCircuitPublicInputs>> {
484
- const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
485
- const anchorBlockHash = await anchorBlockHeader.hash();
486
- const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHash);
668
+ const kernelOracle = new PrivateKernelOracle(
669
+ this.contractStore,
670
+ this.contractClassService,
671
+ this.keyStore,
672
+ this.node,
673
+ anchorBlockHeader,
674
+ );
487
675
  const kernelTraceProver = new PrivateKernelExecutionProver(
488
676
  kernelOracle,
489
677
  proofCreator,
@@ -494,8 +682,28 @@ export class PXE {
494
682
  return await kernelTraceProver.proveWithKernels(txExecutionRequest.toTxRequest(), privateExecutionResult, config);
495
683
  }
496
684
 
685
+ /**
686
+ * Syncs with the node only when `autoSync` is enabled.
687
+ * When `autoSync` is disabled, callers (typically a wallet) are
688
+ * responsible for invoking `pxe.sync()` at the right granularity.
689
+ */
690
+ async #maybeSync(): Promise<void> {
691
+ if (this.autoSync) {
692
+ await this.blockStateSynchronizer.sync();
693
+ }
694
+ }
695
+
497
696
  // Public API
498
697
 
698
+ /**
699
+ * Triggers a sync of PXE state with the node, regardless of the `autoSync` config flag. Use this to
700
+ * batch syncs across composite flows when `autoSync` is disabled (e.g. one sync per simulate+send
701
+ * instead of one per inner PXE call). Serialized through the job queue.
702
+ */
703
+ public sync(): Promise<void> {
704
+ return this.#putInJobQueue(() => this.blockStateSynchronizer.sync());
705
+ }
706
+
499
707
  /**
500
708
  * Returns the block header up to which the PXE has synced.
501
709
  * @returns The synced block header
@@ -507,11 +715,11 @@ export class PXE {
507
715
  }
508
716
 
509
717
  /**
510
- * Returns the contract instance for a given address, if it's registered in the PXE.
718
+ * Returns the address preimage of the contract instance at a given address, if it's registered in the PXE.
511
719
  * @param address - The contract address.
512
- * @returns The contract instance if found, undefined otherwise.
720
+ * @returns The contract instance address preimage if found, undefined otherwise.
513
721
  */
514
- public getContractInstance(address: AztecAddress): Promise<ContractInstanceWithAddress | undefined> {
722
+ public getContractInstance(address: AztecAddress): Promise<ContractInstancePreimageWithAddress | undefined> {
515
723
  return this.contractStore.getContractInstance(address);
516
724
  }
517
725
 
@@ -525,19 +733,23 @@ export class PXE {
525
733
  }
526
734
 
527
735
  /**
528
- * Registers a user account in PXE given its master encryption private key.
529
- * Once a new account is registered, the PXE will trial-decrypt all published notes on
530
- * the chain and store those that correspond to the registered account. Will do nothing if the
531
- * account is already registered.
736
+ * Registers a user account in PXE.
737
+ *
738
+ * PXE holds the account's four privacy secret keys but only the *public* message-signing and fallback keys: their
739
+ * secret keys are withheld, since PXE is not trusted to hold them.
740
+ *
741
+ * Does nothing if the account is already registered.
742
+ *
743
+ * The four privacy secret keys can be retrieved later with {@link getAccountSecretKeys}.
532
744
  *
533
- * @param secretKey - Secret key of the corresponding user master public key.
745
+ * @param keys - The account's privacy keys: four secret keys plus the message-signing and fallback public keys.
534
746
  * @param partialAddress - The partial address of the account contract corresponding to the account being registered.
535
747
  * @returns The complete address of the account.
536
748
  */
537
- public async registerAccount(secretKey: Fr, partialAddress: PartialAddress): Promise<CompleteAddress> {
749
+ public async registerAccount(keys: AccountPrivacyKeys, partialAddress: PartialAddress): Promise<CompleteAddress> {
538
750
  const accounts = await this.keyStore.getAccounts();
539
- const accountCompleteAddress = await this.keyStore.addAccount(secretKey, partialAddress);
540
- if (accounts.includes(accountCompleteAddress.address)) {
751
+ const accountCompleteAddress = await this.keyStore.addAccount(keys, partialAddress);
752
+ if (accounts.some(a => a.equals(accountCompleteAddress.address))) {
541
753
  this.log.info(`Account:\n "${accountCompleteAddress.address.toString()}"\n already registered.`);
542
754
  return accountCompleteAddress;
543
755
  } else {
@@ -550,56 +762,189 @@ export class PXE {
550
762
  }
551
763
 
552
764
  /**
553
- * Registers a sender in this PXE.
765
+ * Retrieves the four privacy secret keys PXE holds for a registered account (nullifier-hiding, incoming-viewing,
766
+ * outgoing-viewing, tagging).
554
767
  *
555
- * After registering a new sender, the PXE will sync private logs that are tagged with this sender's address.
556
- * Will do nothing if the address is already registered.
768
+ * These do NOT grant control over an account's assets, e.g. they are insufficient to impersonate the account or to
769
+ * spend notes, but they _do_ guard the account's privacy. Parties that have knowledge of these keys can decrypt all
770
+ * messages sent to the account, discover all of their on-chain activity, including notes, events, etc.
557
771
  *
558
- * @param sender - Address of the sender to register.
559
- * @returns The address of the sender.
560
- * TODO: It's strange that we return the address here and I (benesjan) think we should drop the return value.
772
+ * Security is paramount when handling these keys, which should itself be a very rare occurrence. Other than exporting
773
+ * and then importing an account into a separate PXE/wallet, there is typically no need for a wallet to ever access
774
+ * these keys. Applications should NEVER be given access to them.
775
+ *
776
+ * @throws If the account is not registered.
561
777
  */
562
- public async registerSender(sender: AztecAddress): Promise<AztecAddress> {
563
- const accounts = await this.keyStore.getAccounts();
564
- if (accounts.includes(sender)) {
565
- this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
566
- return sender;
567
- }
778
+ public getAccountSecretKeys(account: AztecAddress): Promise<AccountPrivacySecretKeys> {
779
+ return this.keyStore.getAccountSecretKeys(account);
780
+ }
568
781
 
569
- const wasAdded = await this.senderAddressBookStore.addSender(sender);
782
+ /**
783
+ * Registers a source from which this PXE derives the tagging secrets it scans for to discover incoming private logs.
784
+ * See {@link TaggingSecretSource} for the meaning of each variant. Does nothing if the source is already registered.
785
+ *
786
+ * After a new source is added we clear the cache tracking which contracts have finished syncing, so every contract
787
+ * re-syncs against the new source's logs (whose notes/events could belong to any contract). Already-discovered
788
+ * notes/events are not discarded.
789
+ */
790
+ public async registerTaggingSecretSource(source: TaggingSecretSource): Promise<void> {
791
+ let wasAdded: boolean;
792
+
793
+ switch (source.kind) {
794
+ case 'address-derived':
795
+ wasAdded = await this.#registerSender(source.sender);
796
+ break;
797
+ case 'arbitrary-secret':
798
+ wasAdded = await this.#registerSharedSecret(source.recipient, 'arbitrary-secret', source.secret);
799
+ break;
800
+ case 'handshake':
801
+ wasAdded = await this.#registerSharedSecret(
802
+ source.recipient,
803
+ 'handshake',
804
+ await this.#deriveHandshakeSecret(source.recipient, source.ephPk),
805
+ );
806
+ break;
807
+ default: {
808
+ const _: never = source;
809
+ throw new Error('Unhandled tagging secret source kind');
810
+ }
811
+ }
570
812
 
571
813
  if (wasAdded) {
572
- this.log.info(`Added sender:\n ${sender.toString()}`);
573
- // Wipe the entire sync cache: the new sender's tagged logs could contain notes/events for any contract, so
574
- // all contracts must re-sync to discover them.
575
- this.contractSyncService.wipe();
576
- } else {
577
- this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
814
+ // Queued to avoid wiping while a job is in flight.
815
+ await this.#putInJobQueue(() => Promise.resolve(this.contractSyncService.wipe()));
578
816
  }
817
+ }
579
818
 
580
- return sender;
819
+ /**
820
+ * Removes a previously registered tagging secret source, identified by its registered form (see
821
+ * {@link getTaggingSecretSources}). Does nothing if it was not registered.
822
+ */
823
+ public async removeTaggingSecretSource(source: RegisteredTaggingSecretSource): Promise<void> {
824
+ switch (source.kind) {
825
+ case 'address-derived': {
826
+ const { sender } = source;
827
+ const wasRemoved = await this.taggingSecretSourcesStore.removeSender(sender);
828
+ this.log.info(
829
+ wasRemoved
830
+ ? `Removed sender:\n ${sender.toString()}`
831
+ : `Sender:\n "${sender.toString()}"\n not registered in PXE.`,
832
+ );
833
+ break;
834
+ }
835
+ case 'arbitrary-secret':
836
+ case 'handshake': {
837
+ const { kind, recipient, secret } = source;
838
+ const wasRemoved = await this.taggingSecretSourcesStore.removeSharedSecret(recipient, kind, secret);
839
+ this.log.info(
840
+ wasRemoved
841
+ ? `Removed ${kind} shared secret for recipient:\n ${recipient.toString()}`
842
+ : `No ${kind} shared secret registered for recipient:\n ${recipient.toString()}`,
843
+ );
844
+ break;
845
+ }
846
+ default: {
847
+ const _: never = source;
848
+ throw new Error('Unhandled tagging secret source kind');
849
+ }
850
+ }
581
851
  }
582
852
 
583
853
  /**
584
- * Retrieves senders registered in this PXE.
585
- * @returns Senders registered in this PXE.
854
+ * Retrieves the tagging secret sources registered in this PXE, in their registered form. Without a filter it
855
+ * returns every source; pass `{ kind }` to narrow to a single variant. See {@link RegisteredTaggingSecretSource}.
586
856
  */
587
- public getSenders(): Promise<AztecAddress[]> {
588
- return this.senderAddressBookStore.getSenders();
857
+ public getTaggingSecretSources<K extends RegisteredTaggingSecretSource['kind']>(filter: {
858
+ kind: K;
859
+ }): Promise<Extract<RegisteredTaggingSecretSource, { kind: K }>[]>;
860
+ public getTaggingSecretSources(): Promise<RegisteredTaggingSecretSource[]>;
861
+ public async getTaggingSecretSources(filter?: {
862
+ kind?: RegisteredTaggingSecretSource['kind'];
863
+ }): Promise<RegisteredTaggingSecretSource[]> {
864
+ const [senders, secrets] = await allToCompletion([
865
+ this.taggingSecretSourcesStore.getSenders(),
866
+ this.taggingSecretSourcesStore.getAllSharedSecrets(),
867
+ ]);
868
+
869
+ const sources: RegisteredTaggingSecretSource[] = [
870
+ ...senders.map((sender): RegisteredTaggingSecretSource => ({ kind: 'address-derived', sender })),
871
+ ...secrets.map(({ recipient, kind, secret }): RegisteredTaggingSecretSource => ({ kind, recipient, secret })),
872
+ ];
873
+
874
+ return filter?.kind ? sources.filter(source => source.kind === filter.kind) : sources;
875
+ }
876
+
877
+ /** Registers a sender, skipping addresses that belong to a local account. Returns whether it was newly added. */
878
+ async #registerSender(address: AztecAddress): Promise<boolean> {
879
+ if (!(await address.isValid())) {
880
+ throw new Error(
881
+ `Address ${address} is not valid: it does not correspond to a point on the Grumpkin curve. Cannot register it as a sender.`,
882
+ );
883
+ }
884
+
885
+ const accounts = await this.keyStore.getAccounts();
886
+ if (accounts.some(a => a.equals(address))) {
887
+ this.log.info(`Sender:\n "${address.toString()}"\n already registered.`);
888
+ return false;
889
+ }
890
+
891
+ const wasAdded = await this.taggingSecretSourcesStore.addSender(address);
892
+ this.log.info(
893
+ wasAdded ? `Added sender:\n ${address.toString()}` : `Sender:\n "${address.toString()}"\n already registered.`,
894
+ );
895
+ return wasAdded;
589
896
  }
590
897
 
591
898
  /**
592
- * Removes a sender registered in this PXE.
593
- * @param sender - The address of the sender to remove.
899
+ * Derives the shared secret of a handshake from its ephemeral public key: the raw ECDH secret
900
+ * `S = addressSecret(recipient) * ephPk` with the forgery protection applied,
901
+ * matching the protected secret the registry stores and the derivation the recipient-side scan uses for
902
+ * handshakes discovered onchain. The ephemeral key is reconstructed from its x-coordinate with a positive y,
903
+ * matching how the protocol generates it.
904
+ *
905
+ * @throws If `ephPk` is not the x-coordinate of a Grumpkin curve point, or if `recipient` is not an account of
906
+ * this PXE, since the derivation needs its keys.
594
907
  */
595
- public async removeSender(sender: AztecAddress): Promise<void> {
596
- const wasRemoved = await this.senderAddressBookStore.removeSender(sender);
908
+ async #deriveHandshakeSecret(recipient: AztecAddress, ephPk: Fr): Promise<Point> {
909
+ let ephPkPoint: Point;
910
+ try {
911
+ ephPkPoint = await Point.fromXAndSign(ephPk, true);
912
+ } catch {
913
+ throw new Error(`Ephemeral public key x-coordinate ${ephPk} does not correspond to a Grumpkin curve point.`);
914
+ }
597
915
 
598
- if (wasRemoved) {
599
- this.log.info(`Removed sender:\n ${sender.toString()}`);
600
- } else {
601
- this.log.info(`Sender:\n "${sender.toString()}"\n not registered in PXE.`);
916
+ const completeAddress = await this.addressStore.getCompleteAddress(recipient);
917
+ if (!completeAddress || !(await this.keyStore.hasAccount(recipient))) {
918
+ throw new Error(
919
+ `Recipient ${recipient} is not an account of this PXE. A handshake's shared secret can only be derived for an account whose keys are held.`,
920
+ );
602
921
  }
922
+
923
+ const ivskM = await this.keyStore.getMasterIncomingViewingSecretKey(recipient);
924
+ const addressSecret = await computeAddressSecret(await completeAddress.getPreaddress(), ivskM);
925
+ const rawSecret = await deriveEcdhSharedSecretPoint(addressSecret, ephPkPoint);
926
+ return protectFromForgery(rawSecret, ephPkPoint, await recipient.toAddressPoint());
927
+ }
928
+
929
+ /** Registers a resolved shared secret scoped to a recipient. Returns whether it was newly added. */
930
+ async #registerSharedSecret(recipient: AztecAddress, kind: SharedSecretKind, secret: Point): Promise<boolean> {
931
+ if (!(await recipient.isValid())) {
932
+ throw new Error(
933
+ `Recipient ${recipient} is not valid: it does not correspond to a point on the Grumpkin curve. Cannot register a shared secret for it.`,
934
+ );
935
+ }
936
+
937
+ if (secret.isZero() || !secret.isOnCurve()) {
938
+ throw new Error(`Shared secret ${secret} is not a valid non-zero point on the Grumpkin curve.`);
939
+ }
940
+
941
+ const wasAdded = await this.taggingSecretSourcesStore.addSharedSecret(recipient, kind, secret);
942
+ this.log.info(
943
+ wasAdded
944
+ ? `Added ${kind} shared secret for recipient:\n ${recipient.toString()}`
945
+ : `${kind} shared secret already registered for recipient:\n ${recipient.toString()}`,
946
+ );
947
+ return wasAdded;
603
948
  }
604
949
 
605
950
  /**
@@ -623,94 +968,33 @@ export class PXE {
623
968
  */
624
969
  public async registerContractClass(artifact: ContractArtifact): Promise<void> {
625
970
  const contractClassId = await this.contractStore.addContractArtifact(artifact);
971
+ // Publishing the artifact's public function signatures to the node is part of "registering a class", so that
972
+ // node-side debugging works regardless of which entrypoint (registerContractClass or registerContract) was used.
973
+ const publicFunctionSignatures = artifact.functions
974
+ .filter(fn => fn.functionType === FunctionType.PUBLIC)
975
+ .map(fn => decodeFunctionSignature(fn.name, fn.parameters));
976
+ if (publicFunctionSignatures.length > 0) {
977
+ await this.nodeDebug?.registerContractFunctionSignatures(publicFunctionSignatures);
978
+ }
626
979
  this.log.info(`Added contract class ${artifact.name} with id ${contractClassId}`);
627
980
  }
628
981
 
629
982
  /**
630
- * Adds deployed contracts to the PXE. Deployed contract information is used to access the
631
- * contract code when simulating local transactions. This is automatically called by aztec.js when
632
- * deploying a contract. Dapps that wish to interact with contracts already deployed should register
633
- * these contracts in their users' PXE through this method.
983
+ * Registers a deployed contract instance so its private state can be synced and its functions simulated. The
984
+ * artifact for the class the instance runs must be registered separately via {@link registerContractClass}, before
985
+ * or after this call; registration performs no validation, so a missing or mismatched artifact only surfaces when
986
+ * the contract is later simulated. This is automatically called by aztec.js when deploying a contract.
634
987
  *
635
- * @param contract - A contract instance to register, with an optional artifact which can be omitted if the contract class has already been registered.
988
+ * @param instance - The address preimage of the contract instance to register. The address is derived from it.
989
+ * @returns The address of the registered instance.
636
990
  */
637
- public async registerContract(contract: { instance: ContractInstanceWithAddress; artifact?: ContractArtifact }) {
638
- const { instance } = contract;
639
- let { artifact } = contract;
640
-
641
- if (artifact) {
642
- // If the user provides an artifact, validate it against the expected class id and register it
643
- const contractClass = await getContractClassFromArtifact(artifact);
644
- if (!contractClass.id.equals(instance.currentContractClassId)) {
645
- throw new Error(
646
- `Artifact does not match expected class id (computed ${contractClass.id} but instance refers to ${instance.currentContractClassId})`,
647
- );
648
- }
649
- const computedAddress = await computeContractAddressFromInstance(instance);
650
- if (!computedAddress.equals(instance.address)) {
651
- throw new Error('Added a contract in which the address does not match the contract instance.');
652
- }
653
-
654
- await this.contractStore.addContractArtifact(artifact, contractClass);
655
-
656
- const publicFunctionSignatures = artifact.functions
657
- .filter(fn => fn.functionType === FunctionType.PUBLIC)
658
- .map(fn => decodeFunctionSignature(fn.name, fn.parameters));
659
- await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
660
- } else {
661
- // Otherwise, make sure there is an artifact already registered for that class id
662
- artifact = await this.contractStore.getContractArtifact(instance.currentContractClassId);
663
- if (!artifact) {
664
- throw new Error(
665
- `Artifact not found when registering an instance. Contract class: ${instance.currentContractClassId}.`,
666
- );
667
- }
668
- }
669
-
670
- await this.contractStore.addContractInstance(instance);
671
- this.log.info(
672
- `Added contract ${artifact.name} at ${instance.address.toString()} with class ${instance.currentContractClassId}`,
673
- );
674
- }
675
-
676
- /**
677
- * Updates a deployed contract in the PXE. This is used to update the contract artifact when
678
- * an update has happened, so the new code can be used in the simulation of local transactions.
679
- * This is called by aztec.js when instantiating a contract in a given address with a mismatching artifact.
680
- * @param contractAddress - The address of the contract to update.
681
- * @param artifact - The updated artifact for the contract.
682
- * @throws If the artifact's contract class is not found in the PXE or if the contract class is different from
683
- * the current one (current one from the point of view of the node to which the PXE is connected).
684
- */
685
- public updateContract(contractAddress: AztecAddress, artifact: ContractArtifact): Promise<void> {
686
- // We disable concurrently updating contracts to avoid concurrently syncing with the node, or changing a contract's
687
- // class while we're simulating it.
991
+ public registerContract(instance: ContractInstancePreimage): Promise<AztecAddress> {
992
+ // Run inside the job queue so we can't race a concurrent simulation while writing the instance to the store.
688
993
  return this.#putInJobQueue(async () => {
689
- const currentInstance = await this.contractStore.getContractInstance(contractAddress);
690
- if (!currentInstance) {
691
- throw new Error(`Instance not found when updating a contract. Contract address: ${contractAddress}.`);
692
- }
693
- const contractClass = await getContractClassFromArtifact(artifact);
694
- await this.blockStateSynchronizer.sync();
695
-
696
- const header = await this.anchorBlockStore.getBlockHeader();
697
-
698
- const currentClassId = await readCurrentClassId(contractAddress, currentInstance, this.node, header);
699
- if (!contractClass.id.equals(currentClassId)) {
700
- throw new Error('Could not update contract to a class different from the current one.');
701
- }
702
-
703
- const publicFunctionSignatures = artifact.functions
704
- .filter(fn => fn.functionType === FunctionType.PUBLIC)
705
- .map(fn => decodeFunctionSignature(fn.name, fn.parameters));
706
- await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
707
-
708
- currentInstance.currentContractClassId = contractClass.id;
709
- await Promise.all([
710
- this.contractStore.addContractArtifact(artifact, contractClass),
711
- this.contractStore.addContractInstance(currentInstance),
712
- ]);
713
- this.log.info(`Updated contract ${artifact.name} at ${contractAddress.toString()} to class ${contractClass.id}`);
994
+ const address = await computeContractAddressFromInstance(instance);
995
+ await this.contractStore.addContractInstance({ ...instance, address });
996
+ this.log.info(`Added contract at ${address}`, { address });
997
+ return address;
714
998
  });
715
999
  }
716
1000
 
@@ -732,25 +1016,34 @@ export class PXE {
732
1016
  * @throws If contract code not found, or public simulation reverts.
733
1017
  * Also throws if simulatePublic is true and public simulation reverts.
734
1018
  */
735
- public proveTx(txRequest: TxExecutionRequest, scopes: AztecAddress[]): Promise<TxProvingResult> {
1019
+ public proveTx(txRequest: TxExecutionRequest, { scopes, senderForTags }: ProveTxOpts): Promise<TxProvingResult> {
736
1020
  let privateExecutionResult: PrivateExecutionResult;
737
1021
  // We disable proving concurrently mostly out of caution, since it accesses some of our stores. Proving is so
738
1022
  // computationally demanding that it'd be rare for someone to try to do it concurrently regardless.
739
1023
  return this.#putInJobQueue(async jobId => {
740
1024
  const totalTimer = new Timer();
1025
+ const recording = this.node.startRecording();
741
1026
  try {
742
1027
  const syncTimer = new Timer();
743
- await this.blockStateSynchronizer.sync();
1028
+ await this.#maybeSync();
1029
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
744
1030
  const syncTime = syncTimer.ms();
745
1031
  const contractFunctionSimulator = this.#getSimulatorForTx();
746
- privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, scopes, jobId);
1032
+ privateExecutionResult = await this.#executePrivate({
1033
+ contractFunctionSimulator,
1034
+ txRequest,
1035
+ anchorBlockHeader,
1036
+ scopes,
1037
+ jobId,
1038
+ senderForTags,
1039
+ });
747
1040
 
748
1041
  const {
749
1042
  publicInputs,
750
1043
  chonkProof,
751
1044
  executionSteps,
752
1045
  timings: { proving } = {},
753
- } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
1046
+ } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, anchorBlockHeader, {
754
1047
  simulate: false,
755
1048
  skipFeeEnforcement: false,
756
1049
  profileMode: 'none',
@@ -777,30 +1070,30 @@ export class PXE {
777
1070
 
778
1071
  const txProvingResult = new TxProvingResult(privateExecutionResult, publicInputs, chonkProof!, {
779
1072
  timings,
780
- nodeRPCCalls: contractFunctionSimulator?.getStats().nodeRPCCalls,
1073
+ nodeRPCCalls: recording.stop(),
781
1074
  });
782
1075
 
783
- // While not strictly necessary to store tagging cache contents in the DB since we sync tagging indexes from
784
- // chain before sending new logs, the sync can only see logs already included in blocks. If we send another
785
- // transaction before this one is included in a block from this PXE, and that transaction contains a log with
786
- // a tag derived from the same secret, we would reuse the tag and the transactions would be linked. Hence
787
- // storing the tags here prevents linkage of txs sent from the same PXE.
788
- const taggingIndexRangesUsedInTheTx = privateExecutionResult.entrypoint.taggingIndexRanges;
789
- if (taggingIndexRangesUsedInTheTx.length > 0) {
790
- // TODO(benesjan): The following is an expensive operation. Figure out a way to avoid it.
791
- const txHash = (await txProvingResult.toTx()).txHash;
792
-
793
- await this.senderTaggingStore.storePendingIndexes(taggingIndexRangesUsedInTheTx, txHash, jobId);
794
- this.log.debug(`Stored used tagging index ranges as sender for the tx`, {
795
- taggingIndexRangesUsedInTheTx,
796
- });
797
- } else {
798
- this.log.debug(`No tagging index ranges used in the tx`);
799
- }
1076
+ // We keep track of which tagging indices we've used in this tx so that we don't repeat them in future txs
1077
+ // (which would link them) without having to rely on this tx being mined (and us seeing the indices being used
1078
+ // onchain).
1079
+ // Note that this must happen _after_ proving as it requires the proof's public inputs, from which the kernels
1080
+ // may have removed some logs due to note-nullifier squashing - this may lead to range of tagging indices we've
1081
+ // actually used to being reduced.
1082
+ await persistSenderTaggingIndexRangesForTx(
1083
+ this.senderTaggingStore,
1084
+ privateExecutionResult.entrypoint.taggingIndexRanges,
1085
+ publicInputs,
1086
+ () => txProvingResult.getTxHash(),
1087
+ jobId,
1088
+ this.log,
1089
+ );
800
1090
 
801
1091
  return txProvingResult;
802
1092
  } catch (err: any) {
803
1093
  throw this.#contextualizeError(err, inspect(txRequest), inspect(privateExecutionResult));
1094
+ } finally {
1095
+ // Idempotent cleanup for the error and early-exit paths. The success path already stopped the recording.
1096
+ recording.stop();
804
1097
  }
805
1098
  });
806
1099
  }
@@ -813,11 +1106,12 @@ export class PXE {
813
1106
  */
814
1107
  public profileTx(
815
1108
  txRequest: TxExecutionRequest,
816
- { profileMode, skipProofGeneration = true, scopes }: ProfileTxOpts,
1109
+ { profileMode, skipProofGeneration = true, scopes, senderForTags }: ProfileTxOpts,
817
1110
  ): Promise<TxProfileResult> {
818
1111
  // We disable concurrent profiles for consistency with simulateTx.
819
1112
  return this.#putInJobQueue(async jobId => {
820
1113
  const totalTimer = new Timer();
1114
+ const recording = this.node.startRecording();
821
1115
  try {
822
1116
  const txInfo = {
823
1117
  origin: txRequest.origin,
@@ -832,16 +1126,25 @@ export class PXE {
832
1126
  txInfo,
833
1127
  );
834
1128
  const syncTimer = new Timer();
835
- await this.blockStateSynchronizer.sync();
1129
+ await this.#maybeSync();
1130
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
836
1131
  const syncTime = syncTimer.ms();
837
1132
 
838
1133
  const contractFunctionSimulator = this.#getSimulatorForTx();
839
- const privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, scopes, jobId);
1134
+ const privateExecutionResult = await this.#executePrivate({
1135
+ contractFunctionSimulator,
1136
+ txRequest,
1137
+ anchorBlockHeader,
1138
+ scopes,
1139
+ jobId,
1140
+ senderForTags,
1141
+ });
840
1142
 
841
1143
  const { executionSteps, timings: { proving } = {} } = await this.#prove(
842
1144
  txRequest,
843
1145
  this.proofCreator,
844
1146
  privateExecutionResult,
1147
+ anchorBlockHeader,
845
1148
  {
846
1149
  simulate: skipProofGeneration,
847
1150
  skipFeeEnforcement: false,
@@ -874,10 +1177,12 @@ export class PXE {
874
1177
  total - ((syncTime ?? 0) + (proving ?? 0) + perFunction.reduce((acc, { time }) => acc + time, 0)),
875
1178
  };
876
1179
 
877
- const simulatorStats = contractFunctionSimulator.getStats();
878
- return new TxProfileResult(executionSteps, { timings, nodeRPCCalls: simulatorStats.nodeRPCCalls });
1180
+ return new TxProfileResult(executionSteps, { timings, nodeRPCCalls: recording.stop() });
879
1181
  } catch (err: any) {
880
1182
  throw this.#contextualizeError(err, inspect(txRequest), `profileMode=${profileMode}`);
1183
+ } finally {
1184
+ // Idempotent cleanup for the error and early-exit paths. The success path already stopped the recording.
1185
+ recording.stop();
881
1186
  }
882
1187
  });
883
1188
  }
@@ -909,12 +1214,14 @@ export class PXE {
909
1214
  skipKernels = true,
910
1215
  overrides,
911
1216
  scopes,
1217
+ senderForTags,
912
1218
  }: SimulateTxOpts,
913
1219
  ): Promise<TxSimulationResult> {
914
1220
  // We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
915
1221
  // to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
916
1222
  // delete the same read value, or reading values that another simulation is currently modifying).
917
1223
  return this.#putInJobQueue(async jobId => {
1224
+ const recording = this.node.startRecording();
918
1225
  try {
919
1226
  const totalTimer = new Timer();
920
1227
  const txInfo = {
@@ -930,27 +1237,26 @@ export class PXE {
930
1237
  txInfo,
931
1238
  );
932
1239
  const syncTimer = new Timer();
933
- await this.blockStateSynchronizer.sync();
1240
+ await this.#maybeSync();
1241
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
934
1242
  const syncTime = syncTimer.ms();
935
1243
 
936
- const overriddenContracts = overrides?.contracts ? new Set(Object.keys(overrides.contracts)) : undefined;
937
- const hasOverriddenContracts = overriddenContracts !== undefined && overriddenContracts.size > 0;
938
-
939
- if (hasOverriddenContracts && !skipKernels) {
1244
+ if (overrides?.contracts && Object.keys(overrides.contracts).length > 0 && !skipKernels) {
940
1245
  throw new Error(
941
1246
  'Simulating with overridden contracts is not compatible with kernel execution. Please set skipKernels to true when simulating with overridden contracts.',
942
1247
  );
943
1248
  }
944
1249
  const contractFunctionSimulator = this.#getSimulatorForTx(overrides);
945
1250
 
946
- if (hasOverriddenContracts) {
947
- // Overridden contracts don't have a sync function, so calling sync on them would fail.
948
- // We exclude them so the sync service skips them entirely.
949
- this.contractSyncService.setExcludedFromSync(jobId, overriddenContracts);
950
- }
951
-
952
1251
  // Execution of private functions only; no proving, and no kernel logic.
953
- const privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, scopes, jobId);
1252
+ const privateExecutionResult = await this.#executePrivate({
1253
+ contractFunctionSimulator,
1254
+ txRequest,
1255
+ anchorBlockHeader,
1256
+ scopes,
1257
+ jobId,
1258
+ senderForTags,
1259
+ });
954
1260
 
955
1261
  let publicInputs: PrivateKernelTailCircuitPublicInputs | undefined;
956
1262
  let executionSteps: PrivateExecutionStep[] = [];
@@ -958,16 +1264,22 @@ export class PXE {
958
1264
  if (skipKernels) {
959
1265
  ({ publicInputs, executionSteps } = await generateSimulatedProvingResult(
960
1266
  privateExecutionResult,
961
- (addr, sel) => this.contractStore.getDebugFunctionName(addr, sel),
1267
+ (addr, sel) => this.#getDebugFunctionName(addr, sel, anchorBlockHeader),
962
1268
  this.node,
963
1269
  ));
964
1270
  } else {
965
1271
  // Kernel logic, plus proving of all private functions and kernels.
966
- ({ publicInputs, executionSteps } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
967
- simulate: true,
968
- skipFeeEnforcement,
969
- profileMode: 'none',
970
- }));
1272
+ ({ publicInputs, executionSteps } = await this.#prove(
1273
+ txRequest,
1274
+ this.proofCreator,
1275
+ privateExecutionResult,
1276
+ anchorBlockHeader,
1277
+ {
1278
+ simulate: true,
1279
+ skipFeeEnforcement,
1280
+ profileMode: 'none',
1281
+ },
1282
+ ));
971
1283
  }
972
1284
 
973
1285
  const privateSimulationResult = new PrivateSimulationResult(privateExecutionResult, publicInputs);
@@ -976,10 +1288,10 @@ export class PXE {
976
1288
  let publicOutput: PublicSimulationOutput | undefined;
977
1289
  if (simulatePublic && publicInputs.forPublic) {
978
1290
  const publicSimulationTimer = new Timer();
979
- publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement);
1291
+ publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement, overrides);
980
1292
  publicSimulationTime = publicSimulationTimer.ms();
981
1293
  if (publicOutput?.debugLogs?.length) {
982
- await displayDebugLogs(publicOutput.debugLogs, addr => this.contractStore.getDebugContractName(addr));
1294
+ await displayDebugLogs(publicOutput.debugLogs, addr => this.#getDebugContractName(addr, anchorBlockHeader));
983
1295
  }
984
1296
  }
985
1297
 
@@ -1030,10 +1342,9 @@ export class PXE {
1030
1342
  : {}),
1031
1343
  });
1032
1344
 
1033
- const simulatorStats = contractFunctionSimulator.getStats();
1034
1345
  return TxSimulationResult.fromPrivateSimulationResultAndPublicOutput(privateSimulationResult, publicOutput, {
1035
1346
  timings,
1036
- nodeRPCCalls: simulatorStats.nodeRPCCalls,
1347
+ nodeRPCCalls: recording.stop(),
1037
1348
  });
1038
1349
  } catch (err: any) {
1039
1350
  throw this.#contextualizeError(
@@ -1043,6 +1354,9 @@ export class PXE {
1043
1354
  `skipTxValidation=${skipTxValidation}`,
1044
1355
  `scopes=${scopes.map(s => s.toString()).join(', ')}`,
1045
1356
  );
1357
+ } finally {
1358
+ // Idempotent cleanup for the error and early-exit paths. The success path already stopped the recording.
1359
+ recording.stop();
1046
1360
  }
1047
1361
  });
1048
1362
  }
@@ -1059,24 +1373,26 @@ export class PXE {
1059
1373
  // to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
1060
1374
  // delete the same read value, or reading values that another execution is currently modifying).
1061
1375
  return this.#putInJobQueue(async jobId => {
1376
+ const recording = this.node.startRecording();
1062
1377
  try {
1063
1378
  const totalTimer = new Timer();
1064
1379
  const syncTimer = new Timer();
1065
- await this.blockStateSynchronizer.sync();
1380
+ await this.#maybeSync();
1066
1381
  const syncTime = syncTimer.ms();
1067
1382
  const functionTimer = new Timer();
1068
1383
  const contractFunctionSimulator = this.#getSimulatorForTx();
1069
1384
 
1070
1385
  const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
1071
- await this.contractSyncService.ensureContractSynced(
1072
- call.to,
1073
- call.selector,
1074
- (privateSyncCall, execScopes) =>
1386
+ await this.contractSyncService.ensureContractSynced({
1387
+ contract: call.to,
1388
+ functionToInvokeAfterSync: call.selector,
1389
+ utilityExecutor: (privateSyncCall, execScopes) =>
1075
1390
  this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
1076
1391
  anchorBlockHeader,
1077
1392
  jobId,
1078
1393
  scopes,
1079
- );
1394
+ triggeredBy: undefined,
1395
+ });
1080
1396
 
1081
1397
  const { result: executionResult, offchainEffects } = await this.#executeUtility(
1082
1398
  contractFunctionSimulator,
@@ -1098,12 +1414,11 @@ export class PXE {
1098
1414
  unaccounted: totalTime - (syncTime + perFunction.reduce((acc, { time }) => acc + time, 0)),
1099
1415
  };
1100
1416
 
1101
- const simulationStats = contractFunctionSimulator.getStats();
1102
1417
  return {
1103
1418
  result: executionResult,
1104
1419
  offchainEffects,
1105
1420
  anchorBlockTimestamp: anchorBlockHeader.globalVariables.timestamp,
1106
- stats: { timings, nodeRPCCalls: simulationStats.nodeRPCCalls },
1421
+ stats: { timings, nodeRPCCalls: recording.stop() },
1107
1422
  };
1108
1423
  } catch (err: any) {
1109
1424
  const { to, name, args } = call;
@@ -1113,6 +1428,9 @@ export class PXE {
1113
1428
  `executeUtility ${to}:${name}(${stringifiedArgs})`,
1114
1429
  `scopes=${scopes.map(s => s.toString()).join(', ')}`,
1115
1430
  );
1431
+ } finally {
1432
+ // Idempotent cleanup for the error and early-exit paths. The success path already stopped the recording.
1433
+ recording.stop();
1116
1434
  }
1117
1435
  });
1118
1436
  }
@@ -1137,22 +1455,23 @@ export class PXE {
1137
1455
  let anchorBlockNumber: BlockNumber;
1138
1456
 
1139
1457
  await this.#putInJobQueue(async jobId => {
1140
- await this.blockStateSynchronizer.sync();
1458
+ await this.#maybeSync();
1141
1459
 
1142
1460
  const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
1143
1461
  anchorBlockNumber = anchorBlockHeader.getBlockNumber();
1144
1462
 
1145
1463
  const contractFunctionSimulator = this.#getSimulatorForTx();
1146
1464
 
1147
- await this.contractSyncService.ensureContractSynced(
1148
- filter.contractAddress,
1149
- null,
1150
- async (privateSyncCall, execScopes) =>
1465
+ await this.contractSyncService.ensureContractSynced({
1466
+ contract: filter.contractAddress,
1467
+ functionToInvokeAfterSync: null,
1468
+ utilityExecutor: async (privateSyncCall, execScopes) =>
1151
1469
  await this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
1152
1470
  anchorBlockHeader,
1153
1471
  jobId,
1154
- filter.scopes,
1155
- );
1472
+ scopes: filter.scopes,
1473
+ triggeredBy: undefined,
1474
+ });
1156
1475
  });
1157
1476
 
1158
1477
  // anchorBlockNumber is set during the job and fixed to whatever it is after a block sync
@@ -1170,6 +1489,7 @@ export class PXE {
1170
1489
  */
1171
1490
  public async stop(): Promise<void> {
1172
1491
  await this.jobQueue.end();
1492
+ await this.blockStateSynchronizer.stop();
1173
1493
  await this.db.close();
1174
1494
  }
1175
1495
  }