@aztec/pxe 0.0.1-commit.2ed92850 → 0.0.1-commit.2f68f620

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