@aztec/pxe 0.0.0-test.1 → 0.0.1-commit.017a351

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 (573) hide show
  1. package/README.md +5 -5
  2. package/dest/bin/check_oracle_version.d.ts +2 -0
  3. package/dest/bin/check_oracle_version.d.ts.map +1 -0
  4. package/dest/bin/check_oracle_version.js +73 -0
  5. package/dest/bin/index.d.ts +2 -3
  6. package/dest/bin/index.d.ts.map +1 -1
  7. package/dest/bin/index.js +1 -28
  8. package/dest/bin/oracle_version_helpers.d.ts +26 -0
  9. package/dest/bin/oracle_version_helpers.d.ts.map +1 -0
  10. package/dest/bin/oracle_version_helpers.js +93 -0
  11. package/dest/block_synchronizer/block_stream_source.d.ts +10 -0
  12. package/dest/block_synchronizer/block_stream_source.d.ts.map +1 -0
  13. package/dest/block_synchronizer/block_stream_source.js +62 -0
  14. package/dest/block_synchronizer/block_synchronizer.d.ts +49 -0
  15. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -0
  16. package/dest/block_synchronizer/block_synchronizer.js +173 -0
  17. package/dest/block_synchronizer/index.d.ts +2 -0
  18. package/dest/block_synchronizer/index.d.ts.map +1 -0
  19. package/dest/block_synchronizer/index.js +1 -0
  20. package/dest/config/index.d.ts +20 -25
  21. package/dest/config/index.d.ts.map +1 -1
  22. package/dest/config/index.js +35 -35
  23. package/dest/config/package_info.d.ts +1 -1
  24. package/dest/config/package_info.js +1 -1
  25. package/dest/contract_function_simulator/benchmarked_node.d.ts +9 -0
  26. package/dest/contract_function_simulator/benchmarked_node.d.ts.map +1 -0
  27. package/dest/contract_function_simulator/benchmarked_node.js +77 -0
  28. package/dest/contract_function_simulator/contract_function_simulator.d.ts +119 -0
  29. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -0
  30. package/dest/contract_function_simulator/contract_function_simulator.js +480 -0
  31. package/dest/contract_function_simulator/ephemeral_array_service.d.ts +28 -0
  32. package/dest/contract_function_simulator/ephemeral_array_service.d.ts.map +1 -0
  33. package/dest/contract_function_simulator/ephemeral_array_service.js +78 -0
  34. package/dest/contract_function_simulator/execution_note_cache.d.ts +104 -0
  35. package/dest/contract_function_simulator/execution_note_cache.d.ts.map +1 -0
  36. package/dest/contract_function_simulator/execution_note_cache.js +208 -0
  37. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts +12 -0
  38. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts.map +1 -0
  39. package/dest/contract_function_simulator/execution_tagging_index_cache.js +30 -0
  40. package/dest/contract_function_simulator/hashed_values_cache.d.ts +28 -0
  41. package/dest/contract_function_simulator/hashed_values_cache.d.ts.map +1 -0
  42. package/dest/contract_function_simulator/hashed_values_cache.js +36 -0
  43. package/dest/contract_function_simulator/index.d.ts +26 -0
  44. package/dest/contract_function_simulator/index.d.ts.map +1 -0
  45. package/dest/contract_function_simulator/index.js +23 -0
  46. package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts +48 -0
  47. package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts.map +1 -0
  48. package/dest/contract_function_simulator/noir-structs/bounded_vec.js +45 -0
  49. package/dest/contract_function_simulator/noir-structs/ephemeral_array.d.ts +37 -0
  50. package/dest/contract_function_simulator/noir-structs/ephemeral_array.d.ts.map +1 -0
  51. package/dest/contract_function_simulator/noir-structs/ephemeral_array.js +59 -0
  52. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +20 -0
  53. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts.map +1 -0
  54. package/dest/contract_function_simulator/noir-structs/event_validation_request.js +39 -0
  55. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts +26 -0
  56. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts.map +1 -0
  57. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.js +57 -0
  58. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts +17 -0
  59. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts.map +1 -0
  60. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.js +63 -0
  61. package/dest/contract_function_simulator/noir-structs/note_data.d.ts +27 -0
  62. package/dest/contract_function_simulator/noir-structs/note_data.d.ts.map +1 -0
  63. package/dest/contract_function_simulator/noir-structs/note_data.js +3 -0
  64. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +22 -0
  65. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts.map +1 -0
  66. package/dest/contract_function_simulator/noir-structs/note_validation_request.js +47 -0
  67. package/dest/contract_function_simulator/noir-structs/option.d.ts +61 -0
  68. package/dest/contract_function_simulator/noir-structs/option.d.ts.map +1 -0
  69. package/dest/contract_function_simulator/noir-structs/option.js +62 -0
  70. package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts +11 -0
  71. package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts.map +1 -0
  72. package/dest/contract_function_simulator/noir-structs/provided_secret.js +24 -0
  73. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts +16 -0
  74. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts.map +1 -0
  75. package/dest/contract_function_simulator/noir-structs/utility_context.js +22 -0
  76. package/dest/contract_function_simulator/oracle/index.d.ts +14 -0
  77. package/dest/contract_function_simulator/oracle/index.d.ts.map +1 -0
  78. package/dest/contract_function_simulator/oracle/index.js +2 -0
  79. package/dest/contract_function_simulator/oracle/interfaces.d.ts +25 -0
  80. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -0
  81. package/dest/contract_function_simulator/oracle/interfaces.js +4 -0
  82. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts +19 -0
  83. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts.map +1 -0
  84. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.js +24 -0
  85. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts +28 -0
  86. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts.map +1 -0
  87. package/dest/contract_function_simulator/oracle/note_packing_utils.js +54 -0
  88. package/dest/contract_function_simulator/oracle/oracle.d.ts +89 -0
  89. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -0
  90. package/dest/contract_function_simulator/oracle/oracle.js +552 -0
  91. package/dest/contract_function_simulator/oracle/oracle_registry.d.ts +127 -0
  92. package/dest/contract_function_simulator/oracle/oracle_registry.d.ts.map +1 -0
  93. package/dest/contract_function_simulator/oracle/oracle_registry.js +786 -0
  94. package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts +139 -0
  95. package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts.map +1 -0
  96. package/dest/contract_function_simulator/oracle/oracle_type_mappings.js +560 -0
  97. package/dest/contract_function_simulator/oracle/private_execution.d.ts +23 -0
  98. package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -0
  99. package/dest/contract_function_simulator/oracle/private_execution.js +89 -0
  100. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +212 -0
  101. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -0
  102. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +457 -0
  103. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +283 -0
  104. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -0
  105. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +654 -0
  106. package/dest/contract_function_simulator/pick_notes.d.ts +85 -0
  107. package/dest/contract_function_simulator/pick_notes.d.ts.map +1 -0
  108. package/dest/contract_function_simulator/pick_notes.js +68 -0
  109. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts +6 -0
  110. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts.map +1 -0
  111. package/dest/contract_function_simulator/proxied_contract_data_source.js +51 -0
  112. package/dest/contract_logging.d.ts +27 -0
  113. package/dest/contract_logging.d.ts.map +1 -0
  114. package/dest/contract_logging.js +38 -0
  115. package/dest/contract_sync/contract_sync_service.d.ts +42 -0
  116. package/dest/contract_sync/contract_sync_service.d.ts.map +1 -0
  117. package/dest/contract_sync/contract_sync_service.js +135 -0
  118. package/dest/contract_sync/helpers.d.ts +27 -0
  119. package/dest/contract_sync/helpers.d.ts.map +1 -0
  120. package/dest/contract_sync/helpers.js +53 -0
  121. package/dest/debug/pxe_debug_utils.d.ts +40 -0
  122. package/dest/debug/pxe_debug_utils.d.ts.map +1 -0
  123. package/dest/debug/pxe_debug_utils.js +42 -0
  124. package/dest/entrypoints/client/bundle/index.d.ts +6 -3
  125. package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
  126. package/dest/entrypoints/client/bundle/index.js +4 -2
  127. package/dest/entrypoints/client/bundle/utils.d.ts +10 -10
  128. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  129. package/dest/entrypoints/client/bundle/utils.js +51 -14
  130. package/dest/entrypoints/client/lazy/index.d.ts +6 -3
  131. package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
  132. package/dest/entrypoints/client/lazy/index.js +4 -2
  133. package/dest/entrypoints/client/lazy/utils.d.ts +10 -10
  134. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  135. package/dest/entrypoints/client/lazy/utils.js +51 -14
  136. package/dest/entrypoints/pxe_creation_options.d.ts +26 -0
  137. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -0
  138. package/dest/entrypoints/pxe_creation_options.js +3 -0
  139. package/dest/entrypoints/server/index.d.ts +10 -4
  140. package/dest/entrypoints/server/index.d.ts.map +1 -1
  141. package/dest/entrypoints/server/index.js +8 -3
  142. package/dest/entrypoints/server/utils.d.ts +9 -16
  143. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  144. package/dest/entrypoints/server/utils.js +62 -36
  145. package/dest/error_enriching.d.ts +11 -0
  146. package/dest/error_enriching.d.ts.map +1 -0
  147. package/dest/{pxe_service/error_enriching.js → error_enriching.js} +30 -22
  148. package/dest/events/event_service.d.ts +24 -0
  149. package/dest/events/event_service.d.ts.map +1 -0
  150. package/dest/events/event_service.js +77 -0
  151. package/dest/events/index.d.ts +2 -0
  152. package/dest/events/index.d.ts.map +1 -0
  153. package/dest/events/index.js +1 -0
  154. package/dest/events/private_event_filter_validator.d.ts +10 -0
  155. package/dest/events/private_event_filter_validator.d.ts.map +1 -0
  156. package/dest/events/private_event_filter_validator.js +53 -0
  157. package/dest/hooks/authorize_utility_call.d.ts +41 -0
  158. package/dest/hooks/authorize_utility_call.d.ts.map +1 -0
  159. package/dest/hooks/authorize_utility_call.js +4 -0
  160. package/dest/hooks/execution_hooks.d.ts +42 -0
  161. package/dest/hooks/execution_hooks.d.ts.map +1 -0
  162. package/dest/hooks/execution_hooks.js +9 -0
  163. package/dest/hooks/index.d.ts +4 -0
  164. package/dest/hooks/index.d.ts.map +1 -0
  165. package/dest/hooks/index.js +1 -0
  166. package/dest/job_coordinator/job_coordinator.d.ts +75 -0
  167. package/dest/job_coordinator/job_coordinator.d.ts.map +1 -0
  168. package/dest/job_coordinator/job_coordinator.js +94 -0
  169. package/dest/logs/log_service.d.ts +29 -0
  170. package/dest/logs/log_service.d.ts.map +1 -0
  171. package/dest/logs/log_service.js +172 -0
  172. package/dest/messages/message_context_service.d.ts +17 -0
  173. package/dest/messages/message_context_service.d.ts.map +1 -0
  174. package/dest/messages/message_context_service.js +55 -0
  175. package/dest/notes/index.d.ts +2 -0
  176. package/dest/notes/index.d.ts.map +1 -0
  177. package/dest/notes/index.js +1 -0
  178. package/dest/notes/note_service.d.ts +70 -0
  179. package/dest/notes/note_service.d.ts.map +1 -0
  180. package/dest/notes/note_service.js +172 -0
  181. package/dest/notes_filter.d.ts +24 -0
  182. package/dest/notes_filter.d.ts.map +1 -0
  183. package/dest/notes_filter.js +4 -0
  184. package/dest/oracle_version.d.ts +4 -0
  185. package/dest/oracle_version.d.ts.map +1 -0
  186. package/dest/oracle_version.js +21 -0
  187. package/dest/private_kernel/batch_planner.d.ts +47 -0
  188. package/dest/private_kernel/batch_planner.d.ts.map +1 -0
  189. package/dest/private_kernel/batch_planner.js +104 -0
  190. package/dest/private_kernel/hints/compute_tx_expiration_timestamp.d.ts +4 -0
  191. package/dest/private_kernel/hints/compute_tx_expiration_timestamp.d.ts.map +1 -0
  192. package/dest/private_kernel/hints/compute_tx_expiration_timestamp.js +41 -0
  193. package/dest/private_kernel/hints/index.d.ts +3 -0
  194. package/dest/private_kernel/hints/index.d.ts.map +1 -0
  195. package/dest/private_kernel/hints/index.js +2 -0
  196. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +29 -0
  197. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -0
  198. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.js +338 -0
  199. package/dest/private_kernel/hints/test_utils.d.ts +122 -0
  200. package/dest/private_kernel/hints/test_utils.d.ts.map +1 -0
  201. package/dest/private_kernel/hints/test_utils.js +202 -0
  202. package/dest/private_kernel/index.d.ts +3 -0
  203. package/dest/private_kernel/index.d.ts.map +1 -0
  204. package/dest/private_kernel/index.js +2 -0
  205. package/dest/private_kernel/private_kernel_execution_prover.d.ts +49 -0
  206. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -0
  207. package/dest/private_kernel/private_kernel_execution_prover.js +386 -0
  208. package/dest/private_kernel/private_kernel_oracle.d.ts +63 -0
  209. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -0
  210. package/dest/private_kernel/private_kernel_oracle.js +98 -0
  211. package/dest/pxe.d.ts +300 -0
  212. package/dest/pxe.d.ts.map +1 -0
  213. package/dest/pxe.js +839 -0
  214. package/dest/storage/address_store/address_store.d.ts +11 -0
  215. package/dest/storage/address_store/address_store.d.ts.map +1 -0
  216. package/dest/storage/{address_data_provider/address_data_provider.js → address_store/address_store.js} +13 -15
  217. package/dest/storage/address_store/index.d.ts +2 -0
  218. package/dest/storage/address_store/index.d.ts.map +1 -0
  219. package/dest/storage/address_store/index.js +1 -0
  220. package/dest/storage/anchor_block_store/anchor_block_store.d.ts +17 -0
  221. package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -0
  222. package/dest/storage/anchor_block_store/anchor_block_store.js +26 -0
  223. package/dest/storage/anchor_block_store/index.d.ts +2 -0
  224. package/dest/storage/anchor_block_store/index.d.ts.map +1 -0
  225. package/dest/storage/anchor_block_store/index.js +1 -0
  226. package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.d.ts +42 -0
  227. package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.d.ts.map +1 -0
  228. package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.js +93 -0
  229. package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts +15 -0
  230. package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts.map +1 -0
  231. package/dest/storage/backwards_compatibility_tests/schema_tests.js +591 -0
  232. package/dest/storage/backwards_compatibility_tests/store_spy.d.ts +19 -0
  233. package/dest/storage/backwards_compatibility_tests/store_spy.d.ts.map +1 -0
  234. package/dest/storage/backwards_compatibility_tests/store_spy.js +63 -0
  235. package/dest/storage/capsule_store/capsule_service.d.ts +21 -0
  236. package/dest/storage/capsule_store/capsule_service.d.ts.map +1 -0
  237. package/dest/storage/capsule_store/capsule_service.js +50 -0
  238. package/dest/storage/capsule_store/capsule_store.d.ts +72 -0
  239. package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -0
  240. package/dest/storage/capsule_store/capsule_store.js +261 -0
  241. package/dest/storage/capsule_store/index.d.ts +3 -0
  242. package/dest/storage/capsule_store/index.d.ts.map +1 -0
  243. package/dest/storage/capsule_store/index.js +2 -0
  244. package/dest/storage/contract_store/contract_store.d.ts +93 -0
  245. package/dest/storage/contract_store/contract_store.d.ts.map +1 -0
  246. package/dest/storage/contract_store/contract_store.js +292 -0
  247. package/dest/storage/contract_store/index.d.ts +2 -0
  248. package/dest/storage/contract_store/index.d.ts.map +1 -0
  249. package/dest/storage/contract_store/index.js +1 -0
  250. package/dest/storage/contract_store/private_functions_tree.d.ts +27 -0
  251. package/dest/storage/contract_store/private_functions_tree.d.ts.map +1 -0
  252. package/dest/storage/contract_store/private_functions_tree.js +47 -0
  253. package/dest/storage/index.d.ts +9 -10
  254. package/dest/storage/index.d.ts.map +1 -1
  255. package/dest/storage/index.js +8 -9
  256. package/dest/storage/metadata.d.ts +2 -0
  257. package/dest/storage/metadata.d.ts.map +1 -0
  258. package/dest/storage/metadata.js +1 -0
  259. package/dest/storage/note_store/index.d.ts +3 -0
  260. package/dest/storage/note_store/index.d.ts.map +1 -0
  261. package/dest/storage/note_store/index.js +2 -0
  262. package/dest/storage/note_store/note_store.d.ts +83 -0
  263. package/dest/storage/note_store/note_store.d.ts.map +1 -0
  264. package/dest/storage/note_store/note_store.js +343 -0
  265. package/dest/storage/note_store/stored_note.d.ts +16 -0
  266. package/dest/storage/note_store/stored_note.d.ts.map +1 -0
  267. package/dest/storage/note_store/stored_note.js +43 -0
  268. package/dest/storage/open_pxe_stores.d.ts +33 -0
  269. package/dest/storage/open_pxe_stores.d.ts.map +1 -0
  270. package/dest/storage/open_pxe_stores.js +27 -0
  271. package/dest/storage/private_event_store/private_event_store.d.ts +91 -0
  272. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -0
  273. package/dest/storage/private_event_store/private_event_store.js +276 -0
  274. package/dest/storage/private_event_store/stored_private_event.d.ts +23 -0
  275. package/dest/storage/private_event_store/stored_private_event.d.ts.map +1 -0
  276. package/dest/storage/private_event_store/stored_private_event.js +56 -0
  277. package/dest/storage/tagging_store/index.d.ts +4 -0
  278. package/dest/storage/tagging_store/index.d.ts.map +1 -0
  279. package/dest/storage/tagging_store/index.js +3 -0
  280. package/dest/storage/tagging_store/recipient_tagging_store.d.ts +28 -0
  281. package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -0
  282. package/dest/storage/tagging_store/recipient_tagging_store.js +111 -0
  283. package/dest/storage/tagging_store/sender_address_book_store.d.ts +14 -0
  284. package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +1 -0
  285. package/dest/storage/tagging_store/sender_address_book_store.js +36 -0
  286. package/dest/storage/tagging_store/sender_tagging_store.d.ts +78 -0
  287. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -0
  288. package/dest/storage/tagging_store/sender_tagging_store.js +374 -0
  289. package/dest/tagging/constants.d.ts +2 -0
  290. package/dest/tagging/constants.d.ts.map +1 -0
  291. package/dest/tagging/constants.js +10 -0
  292. package/dest/tagging/get_all_logs_by_tags.d.ts +48 -0
  293. package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -0
  294. package/dest/tagging/get_all_logs_by_tags.js +59 -0
  295. package/dest/tagging/index.d.ts +18 -0
  296. package/dest/tagging/index.d.ts.map +1 -0
  297. package/dest/tagging/index.js +16 -0
  298. package/dest/tagging/persist_sender_tagging_index_ranges.d.ts +29 -0
  299. package/dest/tagging/persist_sender_tagging_index_ranges.d.ts.map +1 -0
  300. package/dest/tagging/persist_sender_tagging_index_ranges.js +42 -0
  301. package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts +56 -0
  302. package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts.map +1 -0
  303. package/dest/tagging/recipient_sync/sync_tagged_private_logs.js +163 -0
  304. package/dest/tagging/recipient_sync/utils/find_highest_indexes.d.ts +12 -0
  305. package/dest/tagging/recipient_sync/utils/find_highest_indexes.d.ts.map +1 -0
  306. package/dest/tagging/recipient_sync/utils/find_highest_indexes.js +20 -0
  307. package/dest/tagging/reconcile_tagging_index_ranges.d.ts +36 -0
  308. package/dest/tagging/reconcile_tagging_index_ranges.d.ts.map +1 -0
  309. package/dest/tagging/reconcile_tagging_index_ranges.js +74 -0
  310. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +16 -0
  311. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -0
  312. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +92 -0
  313. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +17 -0
  314. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -0
  315. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +60 -0
  316. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +19 -0
  317. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -0
  318. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +72 -0
  319. package/package.json +48 -33
  320. package/src/bin/check_oracle_version.ts +88 -0
  321. package/src/bin/index.ts +1 -38
  322. package/src/bin/oracle_version_helpers.ts +121 -0
  323. package/src/block_synchronizer/block_stream_source.ts +81 -0
  324. package/src/block_synchronizer/block_synchronizer.ts +200 -0
  325. package/src/block_synchronizer/index.ts +1 -0
  326. package/src/config/index.ts +48 -56
  327. package/src/config/package_info.ts +1 -1
  328. package/src/contract_function_simulator/benchmarked_node.ts +103 -0
  329. package/src/contract_function_simulator/contract_function_simulator.ts +888 -0
  330. package/src/contract_function_simulator/ephemeral_array_service.ts +110 -0
  331. package/src/contract_function_simulator/execution_note_cache.ts +252 -0
  332. package/src/contract_function_simulator/execution_tagging_index_cache.ts +33 -0
  333. package/src/contract_function_simulator/hashed_values_cache.ts +47 -0
  334. package/src/contract_function_simulator/index.ts +63 -0
  335. package/src/contract_function_simulator/noir-structs/bounded_vec.ts +55 -0
  336. package/src/contract_function_simulator/noir-structs/ephemeral_array.ts +66 -0
  337. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +52 -0
  338. package/src/contract_function_simulator/noir-structs/log_retrieval_request.ts +61 -0
  339. package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +66 -0
  340. package/src/contract_function_simulator/noir-structs/note_data.ts +27 -0
  341. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +59 -0
  342. package/src/contract_function_simulator/noir-structs/option.ts +69 -0
  343. package/src/contract_function_simulator/noir-structs/provided_secret.ts +27 -0
  344. package/src/contract_function_simulator/noir-structs/utility_context.ts +23 -0
  345. package/src/contract_function_simulator/oracle/index.ts +16 -0
  346. package/src/contract_function_simulator/oracle/interfaces.ts +21 -0
  347. package/src/contract_function_simulator/oracle/message_load_oracle_inputs.ts +23 -0
  348. package/src/contract_function_simulator/oracle/note_packing_utils.ts +68 -0
  349. package/src/contract_function_simulator/oracle/oracle.ts +711 -0
  350. package/src/contract_function_simulator/oracle/oracle_registry.ts +585 -0
  351. package/src/contract_function_simulator/oracle/oracle_type_mappings.ts +553 -0
  352. package/src/contract_function_simulator/oracle/private_execution.ts +141 -0
  353. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +667 -0
  354. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +967 -0
  355. package/src/contract_function_simulator/pick_notes.ts +160 -0
  356. package/src/contract_function_simulator/proxied_contract_data_source.ts +60 -0
  357. package/src/contract_logging.ts +52 -0
  358. package/src/contract_sync/contract_sync_service.ts +189 -0
  359. package/src/contract_sync/helpers.ts +86 -0
  360. package/src/debug/pxe_debug_utils.ts +85 -0
  361. package/src/entrypoints/client/bundle/index.ts +5 -2
  362. package/src/entrypoints/client/bundle/utils.ts +47 -35
  363. package/src/entrypoints/client/lazy/index.ts +5 -2
  364. package/src/entrypoints/client/lazy/utils.ts +48 -31
  365. package/src/entrypoints/pxe_creation_options.ts +28 -0
  366. package/src/entrypoints/server/index.ts +9 -3
  367. package/src/entrypoints/server/utils.ts +65 -56
  368. package/src/{pxe_service/error_enriching.ts → error_enriching.ts} +40 -39
  369. package/src/events/event_service.ts +119 -0
  370. package/src/events/index.ts +1 -0
  371. package/src/events/private_event_filter_validator.ts +66 -0
  372. package/src/hooks/authorize_utility_call.ts +44 -0
  373. package/src/hooks/execution_hooks.ts +48 -0
  374. package/src/hooks/index.ts +7 -0
  375. package/src/job_coordinator/job_coordinator.ts +150 -0
  376. package/src/logs/log_service.ts +237 -0
  377. package/src/messages/message_context_service.ts +62 -0
  378. package/src/notes/index.ts +1 -0
  379. package/src/notes/note_service.ts +230 -0
  380. package/src/notes_filter.ts +24 -0
  381. package/src/oracle_version.ts +22 -0
  382. package/src/private_kernel/batch_planner.ts +169 -0
  383. package/src/private_kernel/hints/compute_tx_expiration_timestamp.ts +58 -0
  384. package/src/private_kernel/hints/index.ts +2 -0
  385. package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +542 -0
  386. package/src/private_kernel/hints/test_utils.ts +318 -0
  387. package/src/private_kernel/index.ts +2 -0
  388. package/src/private_kernel/private_kernel_execution_prover.ts +598 -0
  389. package/src/private_kernel/private_kernel_oracle.ts +162 -0
  390. package/src/pxe.ts +1305 -0
  391. package/src/storage/{address_data_provider/address_data_provider.ts → address_store/address_store.ts} +15 -21
  392. package/src/storage/address_store/index.ts +1 -0
  393. package/src/storage/anchor_block_store/anchor_block_store.ts +33 -0
  394. package/src/storage/anchor_block_store/index.ts +1 -0
  395. package/src/storage/backwards_compatibility_tests/__snapshots__/AddressStore.json +22 -0
  396. package/src/storage/backwards_compatibility_tests/__snapshots__/AnchorBlockStore.json +3 -0
  397. package/src/storage/backwards_compatibility_tests/__snapshots__/CapsuleStore.json +16 -0
  398. package/src/storage/backwards_compatibility_tests/__snapshots__/ContractStore.json +28 -0
  399. package/src/storage/backwards_compatibility_tests/__snapshots__/KeyStore.json +52 -0
  400. package/src/storage/backwards_compatibility_tests/__snapshots__/L2TipsKVStore.json +46 -0
  401. package/src/storage/backwards_compatibility_tests/__snapshots__/NoteStore.json +36 -0
  402. package/src/storage/backwards_compatibility_tests/__snapshots__/PrivateEventStore.json +44 -0
  403. package/src/storage/backwards_compatibility_tests/__snapshots__/RecipientTaggingStore.json +18 -0
  404. package/src/storage/backwards_compatibility_tests/__snapshots__/SenderAddressBookStore.json +16 -0
  405. package/src/storage/backwards_compatibility_tests/__snapshots__/SenderTaggingStore.json +22 -0
  406. package/src/storage/backwards_compatibility_tests/__snapshots__/opened_stores.json +97 -0
  407. package/src/storage/backwards_compatibility_tests/kv_store_snapshot.ts +122 -0
  408. package/src/storage/backwards_compatibility_tests/schema_tests.ts +712 -0
  409. package/src/storage/backwards_compatibility_tests/store_spy.ts +73 -0
  410. package/src/storage/capsule_store/capsule_service.ts +90 -0
  411. package/src/storage/capsule_store/capsule_store.ts +333 -0
  412. package/src/storage/capsule_store/index.ts +2 -0
  413. package/src/storage/contract_store/contract_store.ts +408 -0
  414. package/src/storage/contract_store/index.ts +1 -0
  415. package/src/storage/contract_store/private_functions_tree.ts +67 -0
  416. package/src/storage/index.ts +8 -10
  417. package/src/storage/metadata.ts +1 -0
  418. package/src/storage/note_store/index.ts +2 -0
  419. package/src/storage/note_store/note_store.ts +415 -0
  420. package/src/storage/note_store/stored_note.ts +48 -0
  421. package/src/storage/open_pxe_stores.ts +49 -0
  422. package/src/storage/private_event_store/private_event_store.ts +388 -0
  423. package/src/storage/private_event_store/stored_private_event.ts +73 -0
  424. package/src/storage/tagging_store/index.ts +3 -0
  425. package/src/storage/tagging_store/recipient_tagging_store.ts +139 -0
  426. package/src/storage/tagging_store/sender_address_book_store.ts +48 -0
  427. package/src/storage/tagging_store/sender_tagging_store.ts +476 -0
  428. package/src/tagging/constants.ts +10 -0
  429. package/src/tagging/get_all_logs_by_tags.ts +120 -0
  430. package/src/tagging/index.ts +20 -0
  431. package/src/tagging/persist_sender_tagging_index_ranges.ts +57 -0
  432. package/src/tagging/recipient_sync/sync_tagged_private_logs.ts +240 -0
  433. package/src/tagging/recipient_sync/utils/find_highest_indexes.ts +34 -0
  434. package/src/tagging/reconcile_tagging_index_ranges.ts +102 -0
  435. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +134 -0
  436. package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +66 -0
  437. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +84 -0
  438. package/dest/entrypoints/client/pxe_creation_options.d.ts +0 -11
  439. package/dest/entrypoints/client/pxe_creation_options.d.ts.map +0 -1
  440. package/dest/entrypoints/client/pxe_creation_options.js +0 -1
  441. package/dest/kernel_oracle/index.d.ts +0 -45
  442. package/dest/kernel_oracle/index.d.ts.map +0 -1
  443. package/dest/kernel_oracle/index.js +0 -76
  444. package/dest/kernel_prover/hints/build_private_kernel_reset_private_inputs.d.ts +0 -28
  445. package/dest/kernel_prover/hints/build_private_kernel_reset_private_inputs.d.ts.map +0 -1
  446. package/dest/kernel_prover/hints/build_private_kernel_reset_private_inputs.js +0 -270
  447. package/dest/kernel_prover/hints/index.d.ts +0 -2
  448. package/dest/kernel_prover/hints/index.d.ts.map +0 -1
  449. package/dest/kernel_prover/hints/index.js +0 -1
  450. package/dest/kernel_prover/index.d.ts +0 -3
  451. package/dest/kernel_prover/index.d.ts.map +0 -1
  452. package/dest/kernel_prover/index.js +0 -2
  453. package/dest/kernel_prover/kernel_prover.d.ts +0 -38
  454. package/dest/kernel_prover/kernel_prover.d.ts.map +0 -1
  455. package/dest/kernel_prover/kernel_prover.js +0 -217
  456. package/dest/kernel_prover/proving_data_oracle.d.ts +0 -73
  457. package/dest/kernel_prover/proving_data_oracle.d.ts.map +0 -1
  458. package/dest/kernel_prover/proving_data_oracle.js +0 -4
  459. package/dest/note_decryption_utils/add_public_values_to_payload.d.ts +0 -11
  460. package/dest/note_decryption_utils/add_public_values_to_payload.d.ts.map +0 -1
  461. package/dest/note_decryption_utils/add_public_values_to_payload.js +0 -47
  462. package/dest/pxe_http/index.d.ts +0 -2
  463. package/dest/pxe_http/index.d.ts.map +0 -1
  464. package/dest/pxe_http/index.js +0 -1
  465. package/dest/pxe_http/pxe_http_server.d.ts +0 -16
  466. package/dest/pxe_http/pxe_http_server.d.ts.map +0 -1
  467. package/dest/pxe_http/pxe_http_server.js +0 -27
  468. package/dest/pxe_oracle_interface/index.d.ts +0 -159
  469. package/dest/pxe_oracle_interface/index.d.ts.map +0 -1
  470. package/dest/pxe_oracle_interface/index.js +0 -692
  471. package/dest/pxe_oracle_interface/tagging_utils.d.ts +0 -17
  472. package/dest/pxe_oracle_interface/tagging_utils.d.ts.map +0 -1
  473. package/dest/pxe_oracle_interface/tagging_utils.js +0 -23
  474. package/dest/pxe_service/error_enriching.d.ts +0 -11
  475. package/dest/pxe_service/error_enriching.d.ts.map +0 -1
  476. package/dest/pxe_service/index.d.ts +0 -3
  477. package/dest/pxe_service/index.d.ts.map +0 -1
  478. package/dest/pxe_service/index.js +0 -2
  479. package/dest/pxe_service/pxe_service.d.ts +0 -111
  480. package/dest/pxe_service/pxe_service.d.ts.map +0 -1
  481. package/dest/pxe_service/pxe_service.js +0 -664
  482. package/dest/storage/address_data_provider/address_data_provider.d.ts +0 -13
  483. package/dest/storage/address_data_provider/address_data_provider.d.ts.map +0 -1
  484. package/dest/storage/address_data_provider/index.d.ts +0 -2
  485. package/dest/storage/address_data_provider/index.d.ts.map +0 -1
  486. package/dest/storage/address_data_provider/index.js +0 -1
  487. package/dest/storage/auth_witness_data_provider/auth_witness_data_provider.d.ts +0 -11
  488. package/dest/storage/auth_witness_data_provider/auth_witness_data_provider.d.ts.map +0 -1
  489. package/dest/storage/auth_witness_data_provider/auth_witness_data_provider.js +0 -20
  490. package/dest/storage/auth_witness_data_provider/index.d.ts +0 -2
  491. package/dest/storage/auth_witness_data_provider/index.d.ts.map +0 -1
  492. package/dest/storage/auth_witness_data_provider/index.js +0 -1
  493. package/dest/storage/capsule_data_provider/capsule_data_provider.d.ts +0 -16
  494. package/dest/storage/capsule_data_provider/capsule_data_provider.d.ts.map +0 -1
  495. package/dest/storage/capsule_data_provider/capsule_data_provider.js +0 -57
  496. package/dest/storage/capsule_data_provider/index.d.ts +0 -2
  497. package/dest/storage/capsule_data_provider/index.d.ts.map +0 -1
  498. package/dest/storage/capsule_data_provider/index.js +0 -1
  499. package/dest/storage/contract_data_provider/contract_data_provider.d.ts +0 -109
  500. package/dest/storage/contract_data_provider/contract_data_provider.d.ts.map +0 -1
  501. package/dest/storage/contract_data_provider/contract_data_provider.js +0 -183
  502. package/dest/storage/contract_data_provider/index.d.ts +0 -3
  503. package/dest/storage/contract_data_provider/index.d.ts.map +0 -1
  504. package/dest/storage/contract_data_provider/index.js +0 -2
  505. package/dest/storage/contract_data_provider/private_functions_tree.d.ts +0 -66
  506. package/dest/storage/contract_data_provider/private_functions_tree.d.ts.map +0 -1
  507. package/dest/storage/contract_data_provider/private_functions_tree.js +0 -99
  508. package/dest/storage/data_provider.d.ts +0 -4
  509. package/dest/storage/data_provider.d.ts.map +0 -1
  510. package/dest/storage/data_provider.js +0 -1
  511. package/dest/storage/note_data_provider/index.d.ts +0 -3
  512. package/dest/storage/note_data_provider/index.d.ts.map +0 -1
  513. package/dest/storage/note_data_provider/index.js +0 -2
  514. package/dest/storage/note_data_provider/note_dao.d.ts +0 -106
  515. package/dest/storage/note_data_provider/note_dao.d.ts.map +0 -1
  516. package/dest/storage/note_data_provider/note_dao.js +0 -106
  517. package/dest/storage/note_data_provider/note_data_provider.d.ts +0 -20
  518. package/dest/storage/note_data_provider/note_data_provider.d.ts.map +0 -1
  519. package/dest/storage/note_data_provider/note_data_provider.js +0 -249
  520. package/dest/storage/sync_data_provider/index.d.ts +0 -2
  521. package/dest/storage/sync_data_provider/index.d.ts.map +0 -1
  522. package/dest/storage/sync_data_provider/index.js +0 -1
  523. package/dest/storage/sync_data_provider/sync_data_provider.d.ts +0 -12
  524. package/dest/storage/sync_data_provider/sync_data_provider.d.ts.map +0 -1
  525. package/dest/storage/sync_data_provider/sync_data_provider.js +0 -29
  526. package/dest/storage/tagging_data_provider/index.d.ts +0 -2
  527. package/dest/storage/tagging_data_provider/index.d.ts.map +0 -1
  528. package/dest/storage/tagging_data_provider/index.js +0 -1
  529. package/dest/storage/tagging_data_provider/tagging_data_provider.d.ts +0 -18
  530. package/dest/storage/tagging_data_provider/tagging_data_provider.d.ts.map +0 -1
  531. package/dest/storage/tagging_data_provider/tagging_data_provider.js +0 -65
  532. package/dest/synchronizer/index.d.ts +0 -2
  533. package/dest/synchronizer/index.d.ts.map +0 -1
  534. package/dest/synchronizer/index.js +0 -1
  535. package/dest/synchronizer/synchronizer.d.ts +0 -37
  536. package/dest/synchronizer/synchronizer.d.ts.map +0 -1
  537. package/dest/synchronizer/synchronizer.js +0 -103
  538. package/dest/test/pxe_test_suite.d.ts +0 -3
  539. package/dest/test/pxe_test_suite.d.ts.map +0 -1
  540. package/dest/test/pxe_test_suite.js +0 -97
  541. package/src/entrypoints/client/pxe_creation_options.ts +0 -7
  542. package/src/kernel_oracle/index.ts +0 -117
  543. package/src/kernel_prover/hints/build_private_kernel_reset_private_inputs.ts +0 -472
  544. package/src/kernel_prover/hints/index.ts +0 -1
  545. package/src/kernel_prover/index.ts +0 -2
  546. package/src/kernel_prover/kernel_prover.ts +0 -351
  547. package/src/kernel_prover/proving_data_oracle.ts +0 -83
  548. package/src/note_decryption_utils/add_public_values_to_payload.ts +0 -64
  549. package/src/pxe_http/index.ts +0 -1
  550. package/src/pxe_http/pxe_http_server.ts +0 -29
  551. package/src/pxe_oracle_interface/index.ts +0 -925
  552. package/src/pxe_oracle_interface/tagging_utils.ts +0 -32
  553. package/src/pxe_service/index.ts +0 -2
  554. package/src/pxe_service/pxe_service.ts +0 -949
  555. package/src/storage/address_data_provider/index.ts +0 -1
  556. package/src/storage/auth_witness_data_provider/auth_witness_data_provider.ts +0 -34
  557. package/src/storage/auth_witness_data_provider/index.ts +0 -1
  558. package/src/storage/capsule_data_provider/capsule_data_provider.ts +0 -80
  559. package/src/storage/capsule_data_provider/index.ts +0 -1
  560. package/src/storage/contract_data_provider/contract_data_provider.ts +0 -261
  561. package/src/storage/contract_data_provider/index.ts +0 -2
  562. package/src/storage/contract_data_provider/private_functions_tree.ts +0 -131
  563. package/src/storage/data_provider.ts +0 -3
  564. package/src/storage/note_data_provider/index.ts +0 -2
  565. package/src/storage/note_data_provider/note_dao.ts +0 -162
  566. package/src/storage/note_data_provider/note_data_provider.ts +0 -345
  567. package/src/storage/sync_data_provider/index.ts +0 -1
  568. package/src/storage/sync_data_provider/sync_data_provider.ts +0 -40
  569. package/src/storage/tagging_data_provider/index.ts +0 -1
  570. package/src/storage/tagging_data_provider/tagging_data_provider.ts +0 -92
  571. package/src/synchronizer/index.ts +0 -1
  572. package/src/synchronizer/synchronizer.ts +0 -121
  573. package/src/test/pxe_test_suite.ts +0 -111
package/src/pxe.ts ADDED
@@ -0,0 +1,1305 @@
1
+ import type { PrivateEventFilter } from '@aztec/aztec.js/wallet';
2
+ import { BlockNumber } from '@aztec/foundation/branded-types';
3
+ import { Fr } from '@aztec/foundation/curves/bn254';
4
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
5
+ import { SerialQueue } from '@aztec/foundation/queue';
6
+ import { Timer } from '@aztec/foundation/timer';
7
+ import { KeyStore } from '@aztec/key-store';
8
+ import type { AztecAsyncKVStore } from '@aztec/kv-store';
9
+ import { type ProtocolContractsProvider, protocolContractNames } from '@aztec/protocol-contracts';
10
+ import type { CircuitSimulator } from '@aztec/simulator/client';
11
+ import {
12
+ type ContractArtifact,
13
+ EventSelector,
14
+ FunctionCall,
15
+ FunctionType,
16
+ decodeFunctionSignature,
17
+ } from '@aztec/stdlib/abi';
18
+ import type { AuthWitness } from '@aztec/stdlib/auth-witness';
19
+ import type { AztecAddress } from '@aztec/stdlib/aztec-address';
20
+ import { GENESIS_BLOCK_HEADER_HASH, type L2TipsProvider } from '@aztec/stdlib/block';
21
+ import {
22
+ CompleteAddress,
23
+ type ContractInstanceWithAddress,
24
+ type PartialAddress,
25
+ computeContractAddressFromInstance,
26
+ getContractClassFromArtifact,
27
+ } from '@aztec/stdlib/contract';
28
+ import { SimulationError } from '@aztec/stdlib/errors';
29
+ import type { AztecNode, PrivateKernelProver } from '@aztec/stdlib/interfaces/client';
30
+ import type {
31
+ PrivateExecutionStep,
32
+ PrivateKernelExecutionProofOutput,
33
+ PrivateKernelTailCircuitPublicInputs,
34
+ } from '@aztec/stdlib/kernel';
35
+ import {
36
+ BlockHeader,
37
+ type ContractOverrides,
38
+ type InTx,
39
+ PrivateExecutionResult,
40
+ PrivateSimulationResult,
41
+ type ProvingTimings,
42
+ PublicSimulationOutput,
43
+ SimulationOverrides,
44
+ type SimulationTimings,
45
+ Tx,
46
+ TxExecutionRequest,
47
+ TxProfileResult,
48
+ TxProvingResult,
49
+ TxSimulationResult,
50
+ UtilityExecutionResult,
51
+ } from '@aztec/stdlib/tx';
52
+
53
+ import { inspect } from 'util';
54
+
55
+ import { BlockSynchronizer } from './block_synchronizer/index.js';
56
+ import type { PXEConfig } from './config/index.js';
57
+ import { BenchmarkedNodeFactory } from './contract_function_simulator/benchmarked_node.js';
58
+ import {
59
+ ContractFunctionSimulator,
60
+ generateSimulatedProvingResult,
61
+ } from './contract_function_simulator/contract_function_simulator.js';
62
+ import { ProxiedContractStoreFactory } from './contract_function_simulator/proxied_contract_data_source.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';
66
+ import { PXEDebugUtils } from './debug/pxe_debug_utils.js';
67
+ import { enrichPublicSimulationError, enrichSimulationError } from './error_enriching.js';
68
+ import { PrivateEventFilterValidator } from './events/private_event_filter_validator.js';
69
+ import type { ExecutionHooks } from './hooks/index.js';
70
+ import { JobCoordinator } from './job_coordinator/job_coordinator.js';
71
+ import { MessageContextService } from './messages/message_context_service.js';
72
+ import {
73
+ PrivateKernelExecutionProver,
74
+ type PrivateKernelExecutionProverConfig,
75
+ } from './private_kernel/private_kernel_execution_prover.js';
76
+ import { PrivateKernelOracle } from './private_kernel/private_kernel_oracle.js';
77
+ import { AddressStore } from './storage/address_store/address_store.js';
78
+ import { AnchorBlockStore } from './storage/anchor_block_store/anchor_block_store.js';
79
+ import { CapsuleStore } from './storage/capsule_store/capsule_store.js';
80
+ import { ContractStore } from './storage/contract_store/contract_store.js';
81
+ import { NoteStore } from './storage/note_store/note_store.js';
82
+ import { openPxeStores } from './storage/open_pxe_stores.js';
83
+ import { PrivateEventStore } from './storage/private_event_store/private_event_store.js';
84
+ import { RecipientTaggingStore } from './storage/tagging_store/recipient_tagging_store.js';
85
+ import { SenderAddressBookStore } from './storage/tagging_store/sender_address_book_store.js';
86
+ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store.js';
87
+ import { persistSenderTaggingIndexRangesForTx } from './tagging/index.js';
88
+
89
+ export type PackedPrivateEvent = InTx & {
90
+ packedEvent: Fr[];
91
+ eventSelector: EventSelector;
92
+ };
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
+
181
+ /**
182
+ * Private eXecution Environment (PXE) is a library used by wallets to simulate private phase of transactions and to
183
+ * manage private state of users.
184
+ */
185
+ export class PXE {
186
+ private constructor(
187
+ private node: AztecNode,
188
+ private db: AztecAsyncKVStore,
189
+ private blockStateSynchronizer: BlockSynchronizer,
190
+ private keyStore: KeyStore,
191
+ private contractStore: ContractStore,
192
+ private noteStore: NoteStore,
193
+ private capsuleStore: CapsuleStore,
194
+ private anchorBlockStore: AnchorBlockStore,
195
+ private senderTaggingStore: SenderTaggingStore,
196
+ private senderAddressBookStore: SenderAddressBookStore,
197
+ private recipientTaggingStore: RecipientTaggingStore,
198
+ private addressStore: AddressStore,
199
+ private privateEventStore: PrivateEventStore,
200
+ private contractSyncService: ContractSyncService,
201
+ private messageContextService: MessageContextService,
202
+ private l2TipsStore: L2TipsProvider,
203
+ private simulator: CircuitSimulator,
204
+ private proverEnabled: boolean,
205
+ private autoSync: boolean,
206
+ private proofCreator: PrivateKernelProver,
207
+ private protocolContractsProvider: ProtocolContractsProvider,
208
+ private preloadedContractsProvider: PreloadedContractsProvider,
209
+ private log: Logger,
210
+ private jobQueue: SerialQueue,
211
+ private jobCoordinator: JobCoordinator,
212
+ public debug: PXEDebugUtils,
213
+ private hooks: ExecutionHooks | undefined,
214
+ ) {}
215
+
216
+ /**
217
+ * Creates an instance of a PXE by instantiating all the necessary data providers and services.
218
+ * Also triggers the registration of the protocol contracts and makes sure the provided node
219
+ * can be contacted.
220
+ *
221
+ * @returns A promise that resolves PXE is ready to be used.
222
+ */
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
+
238
+ const log =
239
+ !loggerOrSuffix || typeof loggerOrSuffix === 'string'
240
+ ? createLogger(loggerOrSuffix ? `pxe:service:${loggerOrSuffix}` : `pxe:service`)
241
+ : loggerOrSuffix;
242
+
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
+
275
+ const synchronizer = new BlockSynchronizer(
276
+ node,
277
+ store,
278
+ anchorBlockStore,
279
+ noteStore,
280
+ privateEventStore,
281
+ l2TipsStore,
282
+ contractSyncService,
283
+ config,
284
+ bindings,
285
+ );
286
+
287
+ const jobCoordinator = new JobCoordinator(store, bindings);
288
+ jobCoordinator.registerStores([
289
+ capsuleStore,
290
+ senderTaggingStore,
291
+ recipientTaggingStore,
292
+ privateEventStore,
293
+ noteStore,
294
+ contractSyncService,
295
+ ]);
296
+
297
+ const debugUtils = new PXEDebugUtils(contractSyncService, noteStore, synchronizer, anchorBlockStore);
298
+
299
+ const jobQueue = new SerialQueue();
300
+
301
+ const pxe = new PXE(
302
+ node,
303
+ store,
304
+ synchronizer,
305
+ keyStore,
306
+ contractStore,
307
+ noteStore,
308
+ capsuleStore,
309
+ anchorBlockStore,
310
+ senderTaggingStore,
311
+ senderAddressBookStore,
312
+ recipientTaggingStore,
313
+ addressStore,
314
+ privateEventStore,
315
+ contractSyncService,
316
+ messageContextService,
317
+ l2TipsStore,
318
+ simulator,
319
+ proverEnabled,
320
+ config.autoSync,
321
+ proofCreator,
322
+ protocolContractsProvider,
323
+ preloadedContractsProvider,
324
+ log,
325
+ jobQueue,
326
+ jobCoordinator,
327
+ debugUtils,
328
+ hooks,
329
+ );
330
+
331
+ debugUtils.setPXEHelpers(
332
+ pxe.#putInJobQueue.bind(pxe),
333
+ pxe.#getSimulatorForTx.bind(pxe),
334
+ pxe.#executeUtility.bind(pxe),
335
+ );
336
+
337
+ pxe.jobQueue.start();
338
+
339
+ await Promise.all([pxe.#registerProtocolContracts(), pxe.#registerPreloadedContracts()]);
340
+ log.info(`Started PXE connected to chain ${info.l1ChainId} version ${info.rollupVersion}`);
341
+ return pxe;
342
+ }
343
+
344
+ // Internal methods
345
+
346
+ #getSimulatorForTx(overrides?: { contracts?: ContractOverrides }) {
347
+ const proxyContractStore = ProxiedContractStoreFactory.create(this.contractStore, overrides?.contracts);
348
+
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
+ });
366
+ }
367
+
368
+ #contextualizeError(err: Error, ...context: string[]): Error {
369
+ let contextStr = '';
370
+ if (context.length > 0) {
371
+ contextStr = `\nContext:\n${context.join('\n')}`;
372
+ }
373
+ if (err instanceof SimulationError) {
374
+ err.setAztecContext(contextStr);
375
+ } else {
376
+ this.log.error(err.name, err);
377
+ this.log.debug(contextStr);
378
+ }
379
+ return err;
380
+ }
381
+
382
+ /**
383
+ * Enqueues a job for execution once no other jobs are running. Returns a promise that will resolve once the job is
384
+ * complete.
385
+ *
386
+ * Useful for tasks that cannot run concurrently, such as contract function simulation.
387
+ */
388
+ #putInJobQueue<T>(fn: (jobId: string) => Promise<T>): Promise<T> {
389
+ // TODO(#12636): relax the conditions under which we forbid concurrency.
390
+ if (this.jobQueue.length() != 0) {
391
+ this.log.warn(
392
+ `PXE is already processing ${this.jobQueue.length()} jobs, concurrent execution is not supported. Will run once those are complete.`,
393
+ );
394
+ }
395
+
396
+ return this.jobQueue.put(async () => {
397
+ const jobId = this.jobCoordinator.beginJob();
398
+ this.log.verbose(`Beginning job ${jobId}`);
399
+
400
+ try {
401
+ const result = await fn(jobId);
402
+ this.log.verbose(`Committing job ${jobId}`);
403
+
404
+ await this.jobCoordinator.commitJob(jobId);
405
+ return result;
406
+ } catch (err) {
407
+ this.log.verbose(`Aborting job ${jobId}`);
408
+ await this.jobCoordinator.abortJob(jobId);
409
+ throw err;
410
+ }
411
+ });
412
+ }
413
+
414
+ async #registerProtocolContracts() {
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
+ );
426
+ this.log.verbose(`Registered protocol contracts in pxe`, registered);
427
+ }
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
+
437
+ // Executes the entrypoint private function, as well as all nested private
438
+ // functions that might arise.
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> {
454
+ const { origin: contractAddress, functionSelector } = txRequest;
455
+
456
+ try {
457
+ await this.contractSyncService.ensureContractSynced(
458
+ contractAddress,
459
+ functionSelector,
460
+ (privateSyncCall, execScopes) =>
461
+ this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
462
+ anchorBlockHeader,
463
+ jobId,
464
+ scopes,
465
+ );
466
+
467
+ const result = await contractFunctionSimulator.run(txRequest, {
468
+ contractAddress,
469
+ selector: functionSelector,
470
+ anchorBlockHeader,
471
+ scopes,
472
+ jobId,
473
+ senderForTags,
474
+ });
475
+ this.log.debug(`Private simulation completed for ${contractAddress.toString()}:${functionSelector}`);
476
+ return result;
477
+ } catch (err) {
478
+ if (err instanceof SimulationError) {
479
+ await enrichSimulationError(err, this.contractStore, this.log);
480
+ }
481
+ throw err;
482
+ }
483
+ }
484
+
485
+ /**
486
+ * Execute a utility function call on the given contract.
487
+ * @param contractFunctionSimulator - The simulator to use for the function call.
488
+ * @param call - The function call to execute.
489
+ * @param authWitnesses - Authentication witnesses required for the function call.
490
+ * @param scopes - Optional array of account addresses whose notes can be accessed in this call. Defaults to all
491
+ * accounts if not specified.
492
+ * @param jobId - The job ID for staged writes.
493
+ * @returns The execution result containing the outputs of the utility function.
494
+ */
495
+ async #executeUtility(
496
+ contractFunctionSimulator: ContractFunctionSimulator,
497
+ call: FunctionCall,
498
+ authWitnesses: AuthWitness[] | undefined,
499
+ scopes: AztecAddress[],
500
+ jobId: string,
501
+ ) {
502
+ try {
503
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
504
+ const { result, offchainEffects } = await contractFunctionSimulator.runUtility(
505
+ call,
506
+ authWitnesses ?? [],
507
+ anchorBlockHeader,
508
+ scopes,
509
+ jobId,
510
+ );
511
+ return { result, offchainEffects };
512
+ } catch (err) {
513
+ if (err instanceof SimulationError) {
514
+ await enrichSimulationError(err, this.contractStore, this.log);
515
+ }
516
+ throw err;
517
+ }
518
+ }
519
+
520
+ /**
521
+ * Simulate the public part of a transaction.
522
+ * This allows to catch public execution errors before submitting the transaction.
523
+ * It can also be used for estimating gas in the future.
524
+ * @param tx - The transaction to be simulated.
525
+ */
526
+ async #simulatePublicCalls(tx: Tx, skipFeeEnforcement: boolean, overrides?: SimulationOverrides) {
527
+ // Simulating public calls can throw if the TX fails in a phase that doesn't allow reverts (setup)
528
+ // Or return as reverted if it fails in a phase that allows reverts (app logic, teardown)
529
+ try {
530
+ const result = await this.node.simulatePublicCalls(tx, skipFeeEnforcement, overrides);
531
+ if (result.revertReason) {
532
+ throw result.revertReason;
533
+ }
534
+ return result;
535
+ } catch (err) {
536
+ if (err instanceof SimulationError) {
537
+ try {
538
+ await enrichPublicSimulationError(err, this.contractStore, this.log);
539
+ } catch (enrichErr) {
540
+ this.log.error(`Failed to enrich public simulation error: ${enrichErr}`);
541
+ }
542
+ }
543
+ throw err;
544
+ }
545
+ }
546
+
547
+ /**
548
+ * Generate a kernel proof, and create a private kernel output.
549
+ * The function takes in a transaction execution request, and the result of private execution
550
+ * and then generates a kernel proof.
551
+ *
552
+ * @param txExecutionRequest - The transaction request to be simulated and proved.
553
+ * @param proofCreator - The proof creator to use for proving the execution.
554
+ * @param privateExecutionResult - The result of the private execution
555
+ * @param config - The configuration for the kernel execution prover.
556
+ * @returns An object that contains the output of the kernel execution, including the ChonkProof if proving is enabled.
557
+ */
558
+ async #prove(
559
+ txExecutionRequest: TxExecutionRequest,
560
+ proofCreator: PrivateKernelProver,
561
+ privateExecutionResult: PrivateExecutionResult,
562
+ anchorBlockHeader: BlockHeader,
563
+ config: PrivateKernelExecutionProverConfig,
564
+ ): Promise<PrivateKernelExecutionProofOutput<PrivateKernelTailCircuitPublicInputs>> {
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
+ );
572
+ this.log.debug(`Executing kernel trace prover (${JSON.stringify(config)})...`);
573
+ return await kernelTraceProver.proveWithKernels(txExecutionRequest.toTxRequest(), privateExecutionResult, config);
574
+ }
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
+
587
+ // Public API
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
+ */
613
+ public getContractInstance(address: AztecAddress): Promise<ContractInstanceWithAddress | undefined> {
614
+ return this.contractStore.getContractInstance(address);
615
+ }
616
+
617
+ /**
618
+ * Returns the contract artifact for a given contract class id, if it's registered in the PXE.
619
+ * @param id - Identifier of the contract class.
620
+ * @returns The contract artifact if found, undefined otherwise.
621
+ */
622
+ public async getContractArtifact(id: Fr): Promise<ContractArtifact | undefined> {
623
+ return await this.contractStore.getContractArtifact(id);
624
+ }
625
+
626
+ /**
627
+ * Registers a user account in PXE given its master encryption private key.
628
+ * Once a new account is registered, the PXE will trial-decrypt all published notes on
629
+ * the chain and store those that correspond to the registered account. Will do nothing if the
630
+ * account is already registered.
631
+ *
632
+ * @param secretKey - Secret key of the corresponding user master public key.
633
+ * @param partialAddress - The partial address of the account contract corresponding to the account being registered.
634
+ * @returns The complete address of the account.
635
+ */
636
+ public async registerAccount(secretKey: Fr, partialAddress: PartialAddress): Promise<CompleteAddress> {
637
+ const accounts = await this.keyStore.getAccounts();
638
+ const accountCompleteAddress = await this.keyStore.addAccount(secretKey, partialAddress);
639
+ if (accounts.some(a => a.equals(accountCompleteAddress.address))) {
640
+ this.log.info(`Account:\n "${accountCompleteAddress.address.toString()}"\n already registered.`);
641
+ return accountCompleteAddress;
642
+ } else {
643
+ this.log.info(`Registered account ${accountCompleteAddress.address.toString()}`);
644
+ this.log.debug(`Registered account\n ${accountCompleteAddress.toReadableString()}`);
645
+ }
646
+
647
+ await this.addressStore.addCompleteAddress(accountCompleteAddress);
648
+ return accountCompleteAddress;
649
+ }
650
+
651
+ /**
652
+ * Registers a sender in this PXE.
653
+ *
654
+ * After registering a new sender, the PXE will sync private logs that are tagged with this sender's address.
655
+ * Will do nothing if the address is already registered.
656
+ *
657
+ * @param sender - Address of the sender to register.
658
+ * @returns The address of the sender.
659
+ * TODO: It's strange that we return the address here and I (benesjan) think we should drop the return value.
660
+ */
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
+
668
+ const accounts = await this.keyStore.getAccounts();
669
+ if (accounts.some(a => a.equals(sender))) {
670
+ this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
671
+ return sender;
672
+ }
673
+
674
+ const wasAdded = await this.senderAddressBookStore.addSender(sender);
675
+
676
+ if (wasAdded) {
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()));
681
+ } else {
682
+ this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
683
+ }
684
+
685
+ return sender;
686
+ }
687
+
688
+ /**
689
+ * Retrieves senders registered in this PXE.
690
+ * @returns Senders registered in this PXE.
691
+ */
692
+ public getSenders(): Promise<AztecAddress[]> {
693
+ return this.senderAddressBookStore.getSenders();
694
+ }
695
+
696
+ /**
697
+ * Removes a sender registered in this PXE.
698
+ * @param sender - The address of the sender to remove.
699
+ */
700
+ public async removeSender(sender: AztecAddress): Promise<void> {
701
+ const wasRemoved = await this.senderAddressBookStore.removeSender(sender);
702
+
703
+ if (wasRemoved) {
704
+ this.log.info(`Removed sender:\n ${sender.toString()}`);
705
+ } else {
706
+ this.log.info(`Sender:\n "${sender.toString()}"\n not registered in PXE.`);
707
+ }
708
+ }
709
+
710
+ /**
711
+ * Retrieves the user accounts registered on this PXE.
712
+ * @returns An array of the accounts registered on this PXE.
713
+ */
714
+ public async getRegisteredAccounts(): Promise<CompleteAddress[]> {
715
+ // Get complete addresses of both the recipients and the accounts
716
+ const completeAddresses = await this.addressStore.getCompleteAddresses();
717
+ // Filter out the addresses not corresponding to accounts
718
+ const accounts = await this.keyStore.getAccounts();
719
+ return completeAddresses.filter(completeAddress =>
720
+ accounts.find(address => address.equals(completeAddress.address)),
721
+ );
722
+ }
723
+
724
+ /**
725
+ * Registers a contract class in the PXE without registering any associated contract instance with it.
726
+ *
727
+ * @param artifact - The build artifact for the contract class.
728
+ */
729
+ public async registerContractClass(artifact: ContractArtifact): Promise<void> {
730
+ const contractClassId = await this.contractStore.addContractArtifact(artifact);
731
+ this.log.info(`Added contract class ${artifact.name} with id ${contractClassId}`);
732
+ }
733
+
734
+ /**
735
+ * Adds deployed contracts to the PXE. Deployed contract information is used to access the
736
+ * contract code when simulating local transactions. This is automatically called by aztec.js when
737
+ * deploying a contract. Dapps that wish to interact with contracts already deployed should register
738
+ * these contracts in their users' PXE through this method.
739
+ *
740
+ * @param contract - A contract instance to register, with an optional artifact which can be omitted if the contract class has already been registered.
741
+ */
742
+ public async registerContract(contract: { instance: ContractInstanceWithAddress; artifact?: ContractArtifact }) {
743
+ const { instance } = contract;
744
+ let { artifact } = contract;
745
+
746
+ if (artifact) {
747
+ // If the user provides an artifact, validate it against the expected class id and register it
748
+ const contractClass = await getContractClassFromArtifact(artifact);
749
+ if (!contractClass.id.equals(instance.currentContractClassId)) {
750
+ throw new Error(
751
+ `Artifact does not match expected class id (computed ${contractClass.id} but instance refers to ${instance.currentContractClassId})`,
752
+ );
753
+ }
754
+ const computedAddress = await computeContractAddressFromInstance(instance);
755
+ if (!computedAddress.equals(instance.address)) {
756
+ throw new Error('Added a contract in which the address does not match the contract instance.');
757
+ }
758
+
759
+ await this.contractStore.addContractArtifact(artifact, contractClass);
760
+
761
+ const publicFunctionSignatures = artifact.functions
762
+ .filter(fn => fn.functionType === FunctionType.PUBLIC)
763
+ .map(fn => decodeFunctionSignature(fn.name, fn.parameters));
764
+ if (publicFunctionSignatures.length > 0) {
765
+ await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
766
+ }
767
+ } else {
768
+ // Otherwise, make sure there is an artifact already registered for that class id
769
+ artifact = await this.contractStore.getContractArtifact(instance.currentContractClassId);
770
+ if (!artifact) {
771
+ throw new Error(
772
+ `Artifact not found when registering an instance. Contract class: ${instance.currentContractClassId}.`,
773
+ );
774
+ }
775
+ }
776
+
777
+ await this.contractStore.addContractInstance(instance);
778
+ this.log.info(
779
+ `Added contract ${artifact.name} at ${instance.address.toString()} with class ${instance.currentContractClassId}`,
780
+ );
781
+ }
782
+
783
+ /**
784
+ * Updates a deployed contract in the PXE. This is used to update the contract artifact when
785
+ * an update has happened, so the new code can be used in the simulation of local transactions.
786
+ * This is called by aztec.js when instantiating a contract in a given address with a mismatching artifact.
787
+ * @param contractAddress - The address of the contract to update.
788
+ * @param artifact - The updated artifact for the contract.
789
+ * @throws If the artifact's contract class is not found in the PXE or if the contract class is different from
790
+ * the current one (current one from the point of view of the node to which the PXE is connected).
791
+ */
792
+ public updateContract(contractAddress: AztecAddress, artifact: ContractArtifact): Promise<void> {
793
+ // We disable concurrently updating contracts to avoid concurrently syncing with the node, or changing a contract's
794
+ // class while we're simulating it.
795
+ return this.#putInJobQueue(async () => {
796
+ const currentInstance = await this.contractStore.getContractInstance(contractAddress);
797
+ if (!currentInstance) {
798
+ throw new Error(`Instance not found when updating a contract. Contract address: ${contractAddress}.`);
799
+ }
800
+ const contractClass = await getContractClassFromArtifact(artifact);
801
+ await this.#maybeSync();
802
+
803
+ const header = await this.anchorBlockStore.getBlockHeader();
804
+
805
+ const currentClassId = await readCurrentClassId(contractAddress, currentInstance, this.node, header);
806
+ if (!contractClass.id.equals(currentClassId)) {
807
+ throw new Error('Could not update contract to a class different from the current one.');
808
+ }
809
+
810
+ const publicFunctionSignatures = artifact.functions
811
+ .filter(fn => fn.functionType === FunctionType.PUBLIC)
812
+ .map(fn => decodeFunctionSignature(fn.name, fn.parameters));
813
+ if (publicFunctionSignatures.length > 0) {
814
+ await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
815
+ }
816
+
817
+ currentInstance.currentContractClassId = contractClass.id;
818
+ await Promise.all([
819
+ this.contractStore.addContractArtifact(artifact, contractClass),
820
+ this.contractStore.addContractInstance(currentInstance),
821
+ ]);
822
+ this.log.info(`Updated contract ${artifact.name} at ${contractAddress.toString()} to class ${contractClass.id}`);
823
+ });
824
+ }
825
+
826
+ /**
827
+ * Retrieves the addresses of contracts added to this PXE.
828
+ * @returns An array of contracts addresses registered on this PXE.
829
+ */
830
+ public getContracts(): Promise<AztecAddress[]> {
831
+ return this.contractStore.getContractsAddresses();
832
+ }
833
+
834
+ /**
835
+ * Proves the private portion of a simulated transaction, ready to send to the network
836
+ * (where validators prove the public portion).
837
+ *
838
+ * @param txRequest - An authenticated tx request ready for proving
839
+ * @param scopes - Addresses whose private state and keys are accessible during private execution.
840
+ * @returns A result containing the proof and public inputs of the tail circuit.
841
+ * @throws If contract code not found, or public simulation reverts.
842
+ * Also throws if simulatePublic is true and public simulation reverts.
843
+ */
844
+ public proveTx(txRequest: TxExecutionRequest, { scopes, senderForTags }: ProveTxOpts): Promise<TxProvingResult> {
845
+ let privateExecutionResult: PrivateExecutionResult;
846
+ // We disable proving concurrently mostly out of caution, since it accesses some of our stores. Proving is so
847
+ // computationally demanding that it'd be rare for someone to try to do it concurrently regardless.
848
+ return this.#putInJobQueue(async jobId => {
849
+ const totalTimer = new Timer();
850
+ try {
851
+ const syncTimer = new Timer();
852
+ await this.#maybeSync();
853
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
854
+ const syncTime = syncTimer.ms();
855
+ const contractFunctionSimulator = this.#getSimulatorForTx();
856
+ privateExecutionResult = await this.#executePrivate({
857
+ contractFunctionSimulator,
858
+ txRequest,
859
+ anchorBlockHeader,
860
+ scopes,
861
+ jobId,
862
+ senderForTags,
863
+ });
864
+
865
+ const {
866
+ publicInputs,
867
+ chonkProof,
868
+ executionSteps,
869
+ timings: { proving } = {},
870
+ } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, anchorBlockHeader, {
871
+ simulate: false,
872
+ skipFeeEnforcement: false,
873
+ profileMode: 'none',
874
+ });
875
+
876
+ const totalTime = totalTimer.ms();
877
+
878
+ const perFunction = executionSteps.map(({ functionName, timings: { witgen, oracles } }) => ({
879
+ functionName,
880
+ time: witgen,
881
+ oracles,
882
+ }));
883
+
884
+ const timings: ProvingTimings = {
885
+ total: totalTime,
886
+ sync: syncTime,
887
+ proving,
888
+ perFunction,
889
+ unaccounted:
890
+ totalTime - ((syncTime ?? 0) + (proving ?? 0) + perFunction.reduce((acc, { time }) => acc + time, 0)),
891
+ };
892
+
893
+ this.log.debug(`Proving completed in ${totalTime}ms`, { timings });
894
+
895
+ const txProvingResult = new TxProvingResult(privateExecutionResult, publicInputs, chonkProof!, {
896
+ timings,
897
+ nodeRPCCalls: contractFunctionSimulator?.getStats().nodeRPCCalls,
898
+ });
899
+
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
+ );
914
+
915
+ return txProvingResult;
916
+ } catch (err: any) {
917
+ throw this.#contextualizeError(err, inspect(txRequest), inspect(privateExecutionResult));
918
+ }
919
+ });
920
+ }
921
+
922
+ /**
923
+ * Profiles a transaction, reporting gate counts (unless disabled) and returns an execution trace.
924
+ * @param txRequest - An authenticated tx request ready for simulation.
925
+ * @returns A trace of the program execution with gate counts.
926
+ * @throws If the code for the functions executed in this transaction have not been made available via `addContracts`.
927
+ */
928
+ public profileTx(
929
+ txRequest: TxExecutionRequest,
930
+ { profileMode, skipProofGeneration = true, scopes, senderForTags }: ProfileTxOpts,
931
+ ): Promise<TxProfileResult> {
932
+ // We disable concurrent profiles for consistency with simulateTx.
933
+ return this.#putInJobQueue(async jobId => {
934
+ const totalTimer = new Timer();
935
+ try {
936
+ const txInfo = {
937
+ origin: txRequest.origin,
938
+ functionSelector: txRequest.functionSelector,
939
+ simulatePublic: false,
940
+ chainId: txRequest.txContext.chainId,
941
+ version: txRequest.txContext.version,
942
+ authWitnesses: txRequest.authWitnesses.map(w => w.requestHash),
943
+ };
944
+ this.log.info(
945
+ `Profiling transaction execution request to ${txRequest.functionSelector} at ${txRequest.origin}`,
946
+ txInfo,
947
+ );
948
+ const syncTimer = new Timer();
949
+ await this.#maybeSync();
950
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
951
+ const syncTime = syncTimer.ms();
952
+
953
+ const contractFunctionSimulator = this.#getSimulatorForTx();
954
+ const privateExecutionResult = await this.#executePrivate({
955
+ contractFunctionSimulator,
956
+ txRequest,
957
+ anchorBlockHeader,
958
+ scopes,
959
+ jobId,
960
+ senderForTags,
961
+ });
962
+
963
+ const { executionSteps, timings: { proving } = {} } = await this.#prove(
964
+ txRequest,
965
+ this.proofCreator,
966
+ privateExecutionResult,
967
+ anchorBlockHeader,
968
+ {
969
+ simulate: skipProofGeneration,
970
+ skipFeeEnforcement: false,
971
+ profileMode,
972
+ },
973
+ );
974
+
975
+ const totalTime = totalTimer.ms();
976
+
977
+ const perFunction = executionSteps.map(({ functionName, timings: { witgen, oracles } }) => {
978
+ return {
979
+ functionName,
980
+ time: witgen,
981
+ oracles,
982
+ };
983
+ });
984
+
985
+ // Gate computation is time is not relevant for profiling, so we subtract it from the total time.
986
+ const gateCountComputationTime =
987
+ executionSteps.reduce((acc, { timings }) => acc + (timings.gateCount ?? 0), 0) ?? 0;
988
+
989
+ const total = totalTime - gateCountComputationTime;
990
+
991
+ const timings: ProvingTimings = {
992
+ total,
993
+ sync: syncTime,
994
+ proving,
995
+ perFunction,
996
+ unaccounted:
997
+ total - ((syncTime ?? 0) + (proving ?? 0) + perFunction.reduce((acc, { time }) => acc + time, 0)),
998
+ };
999
+
1000
+ const simulatorStats = contractFunctionSimulator.getStats();
1001
+ return new TxProfileResult(executionSteps, { timings, nodeRPCCalls: simulatorStats.nodeRPCCalls });
1002
+ } catch (err: any) {
1003
+ throw this.#contextualizeError(err, inspect(txRequest), `profileMode=${profileMode}`);
1004
+ }
1005
+ });
1006
+ }
1007
+
1008
+ /**
1009
+ * Simulates a transaction based on the provided preauthenticated execution request.
1010
+ * This will run a local simulation of private execution (and optionally of public as well), run the
1011
+ * kernel circuits to ensure adherence to protocol rules (without generating a proof), and return the
1012
+ * simulation results .
1013
+ *
1014
+ *
1015
+ * Note that this is used with `ContractFunctionInteraction::simulateTx` to bypass certain checks.
1016
+ * In that case, the transaction returned is only potentially ready to be sent to the network for execution.
1017
+ *
1018
+ *
1019
+ * @param txRequest - An authenticated tx request ready for simulation.
1020
+ * @returns A simulated transaction result object that includes public and private return values.
1021
+ * @throws If the code for the functions executed in this transaction have not been made available via `addContracts`.
1022
+ * Also throws if simulatePublic is true and public simulation reverts.
1023
+ *
1024
+ * TODO(#7456) Prevent msgSender being defined here for the first call
1025
+ */
1026
+ public simulateTx(
1027
+ txRequest: TxExecutionRequest,
1028
+ {
1029
+ simulatePublic,
1030
+ skipTxValidation = false,
1031
+ skipFeeEnforcement = false,
1032
+ skipKernels = true,
1033
+ overrides,
1034
+ scopes,
1035
+ senderForTags,
1036
+ }: SimulateTxOpts,
1037
+ ): Promise<TxSimulationResult> {
1038
+ // We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
1039
+ // to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
1040
+ // delete the same read value, or reading values that another simulation is currently modifying).
1041
+ return this.#putInJobQueue(async jobId => {
1042
+ try {
1043
+ const totalTimer = new Timer();
1044
+ const txInfo = {
1045
+ origin: txRequest.origin,
1046
+ functionSelector: txRequest.functionSelector,
1047
+ simulatePublic,
1048
+ chainId: txRequest.txContext.chainId,
1049
+ version: txRequest.txContext.version,
1050
+ authWitnesses: txRequest.authWitnesses.map(w => w.requestHash),
1051
+ };
1052
+ this.log.info(
1053
+ `Simulating transaction execution request to ${txRequest.functionSelector} at ${txRequest.origin}`,
1054
+ txInfo,
1055
+ );
1056
+ const syncTimer = new Timer();
1057
+ await this.#maybeSync();
1058
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
1059
+ const syncTime = syncTimer.ms();
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
+ }
1066
+ const contractFunctionSimulator = this.#getSimulatorForTx(overrides);
1067
+
1068
+ // Execution of private functions only; no proving, and no kernel logic.
1069
+ const privateExecutionResult = await this.#executePrivate({
1070
+ contractFunctionSimulator,
1071
+ txRequest,
1072
+ anchorBlockHeader,
1073
+ scopes,
1074
+ jobId,
1075
+ senderForTags,
1076
+ });
1077
+
1078
+ let publicInputs: PrivateKernelTailCircuitPublicInputs | undefined;
1079
+ let executionSteps: PrivateExecutionStep[] = [];
1080
+
1081
+ if (skipKernels) {
1082
+ ({ publicInputs, executionSteps } = await generateSimulatedProvingResult(
1083
+ privateExecutionResult,
1084
+ (addr, sel) => this.contractStore.getDebugFunctionName(addr, sel),
1085
+ this.node,
1086
+ ));
1087
+ } else {
1088
+ // Kernel logic, plus proving of all private functions and kernels.
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
+ ));
1100
+ }
1101
+
1102
+ const privateSimulationResult = new PrivateSimulationResult(privateExecutionResult, publicInputs);
1103
+ const simulatedTx = await privateSimulationResult.toSimulatedTx();
1104
+ let publicSimulationTime: number | undefined;
1105
+ let publicOutput: PublicSimulationOutput | undefined;
1106
+ if (simulatePublic && publicInputs.forPublic) {
1107
+ const publicSimulationTimer = new Timer();
1108
+ publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement, overrides);
1109
+ publicSimulationTime = publicSimulationTimer.ms();
1110
+ if (publicOutput?.debugLogs?.length) {
1111
+ await displayDebugLogs(publicOutput.debugLogs, addr => this.contractStore.getDebugContractName(addr));
1112
+ }
1113
+ }
1114
+
1115
+ let validationTime: number | undefined;
1116
+ if (!skipTxValidation) {
1117
+ const validationTimer = new Timer();
1118
+ const validationResult = await this.node.isValidTx(simulatedTx, { isSimulation: true, skipFeeEnforcement });
1119
+ validationTime = validationTimer.ms();
1120
+ if (validationResult.result === '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}`);
1123
+ }
1124
+ }
1125
+
1126
+ const txHash = simulatedTx.getTxHash();
1127
+
1128
+ const totalTime = totalTimer.ms();
1129
+
1130
+ const perFunction = executionSteps.map(({ functionName, timings: { witgen, oracles } }) => ({
1131
+ functionName,
1132
+ time: witgen,
1133
+ oracles,
1134
+ }));
1135
+
1136
+ const timings: SimulationTimings = {
1137
+ total: totalTime,
1138
+ sync: syncTime,
1139
+ publicSimulation: publicSimulationTime,
1140
+ validation: validationTime,
1141
+ perFunction,
1142
+ unaccounted:
1143
+ totalTime -
1144
+ (syncTime +
1145
+ (publicSimulationTime ?? 0) +
1146
+ (validationTime ?? 0) +
1147
+ perFunction.reduce((acc, { time }) => acc + time, 0)),
1148
+ };
1149
+
1150
+ this.log.info(`Simulation completed for ${txHash.toString()} in ${totalTime}ms`, {
1151
+ txHash,
1152
+ ...txInfo,
1153
+ ...(publicOutput
1154
+ ? {
1155
+ gasUsed: publicOutput.gasUsed,
1156
+ revertCode: publicOutput.txEffect.revertCode.getCode(),
1157
+ revertReason: publicOutput.revertReason,
1158
+ }
1159
+ : {}),
1160
+ });
1161
+
1162
+ const simulatorStats = contractFunctionSimulator.getStats();
1163
+ return TxSimulationResult.fromPrivateSimulationResultAndPublicOutput(privateSimulationResult, publicOutput, {
1164
+ timings,
1165
+ nodeRPCCalls: simulatorStats.nodeRPCCalls,
1166
+ });
1167
+ } catch (err: any) {
1168
+ throw this.#contextualizeError(
1169
+ err,
1170
+ inspect(txRequest),
1171
+ `simulatePublic=${simulatePublic}`,
1172
+ `skipTxValidation=${skipTxValidation}`,
1173
+ `scopes=${scopes.map(s => s.toString()).join(', ')}`,
1174
+ );
1175
+ }
1176
+ });
1177
+ }
1178
+
1179
+ /**
1180
+ * Executes a contract utility function.
1181
+ * @param call - The function call containing the function details, arguments, and target contract address.
1182
+ */
1183
+ public executeUtility(
1184
+ call: FunctionCall,
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.
1188
+ // to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
1189
+ // delete the same read value, or reading values that another execution is currently modifying).
1190
+ return this.#putInJobQueue(async jobId => {
1191
+ try {
1192
+ const totalTimer = new Timer();
1193
+ const syncTimer = new Timer();
1194
+ await this.#maybeSync();
1195
+ const syncTime = syncTimer.ms();
1196
+ const functionTimer = new Timer();
1197
+ const contractFunctionSimulator = this.#getSimulatorForTx();
1198
+
1199
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
1200
+ await this.contractSyncService.ensureContractSynced(
1201
+ call.to,
1202
+ call.selector,
1203
+ (privateSyncCall, execScopes) =>
1204
+ this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
1205
+ anchorBlockHeader,
1206
+ jobId,
1207
+ scopes,
1208
+ );
1209
+
1210
+ const { result: executionResult, offchainEffects } = await this.#executeUtility(
1211
+ contractFunctionSimulator,
1212
+ call,
1213
+ authwits ?? [],
1214
+ scopes,
1215
+ jobId,
1216
+ );
1217
+ const functionTime = functionTimer.ms();
1218
+
1219
+ const totalTime = totalTimer.ms();
1220
+
1221
+ const perFunction = [{ functionName: call.name, time: functionTime }];
1222
+
1223
+ const timings: SimulationTimings = {
1224
+ total: totalTime,
1225
+ sync: syncTime,
1226
+ perFunction,
1227
+ unaccounted: totalTime - (syncTime + perFunction.reduce((acc, { time }) => acc + time, 0)),
1228
+ };
1229
+
1230
+ const simulationStats = contractFunctionSimulator.getStats();
1231
+ return {
1232
+ result: executionResult,
1233
+ offchainEffects,
1234
+ anchorBlockTimestamp: anchorBlockHeader.globalVariables.timestamp,
1235
+ stats: { timings, nodeRPCCalls: simulationStats.nodeRPCCalls },
1236
+ };
1237
+ } catch (err: any) {
1238
+ const { to, name, args } = call;
1239
+ const stringifiedArgs = args.map(arg => arg.toString()).join(', ');
1240
+ throw this.#contextualizeError(
1241
+ err,
1242
+ `executeUtility ${to}:${name}(${stringifiedArgs})`,
1243
+ `scopes=${scopes.map(s => s.toString()).join(', ')}`,
1244
+ );
1245
+ }
1246
+ });
1247
+ }
1248
+
1249
+ /**
1250
+ * Returns the private events given search parameters.
1251
+ * @param eventSelector - Event selector to search for.
1252
+ * @param filter
1253
+ * contractAddress - The address of the contract to get events from. Required.
1254
+ * scopes - One or more event scope addresses to filter by. Required.
1255
+ * fromBlock - The block number to search from (inclusive). Optional. If provided, it must be >= 0.
1256
+ * Defaults to 0.
1257
+ * If toBlock is defined but fromBlock is not, fromBlock defaults to toBlock - 1.
1258
+ * toBlock - The block number to search up to (exclusive). Optional. If provided, it must be > 0.
1259
+ * Defaults to the latest known block to PXE + 1.
1260
+ * @returns - The packed events with block and tx metadata.
1261
+ */
1262
+ public async getPrivateEvents(
1263
+ eventSelector: EventSelector,
1264
+ filter: PrivateEventFilter,
1265
+ ): Promise<PackedPrivateEvent[]> {
1266
+ let anchorBlockNumber: BlockNumber;
1267
+
1268
+ await this.#putInJobQueue(async jobId => {
1269
+ await this.#maybeSync();
1270
+
1271
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
1272
+ anchorBlockNumber = anchorBlockHeader.getBlockNumber();
1273
+
1274
+ const contractFunctionSimulator = this.#getSimulatorForTx();
1275
+
1276
+ await this.contractSyncService.ensureContractSynced(
1277
+ filter.contractAddress,
1278
+ null,
1279
+ async (privateSyncCall, execScopes) =>
1280
+ await this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
1281
+ anchorBlockHeader,
1282
+ jobId,
1283
+ filter.scopes,
1284
+ );
1285
+ });
1286
+
1287
+ // anchorBlockNumber is set during the job and fixed to whatever it is after a block sync
1288
+ const sanitizedFilter = new PrivateEventFilterValidator(anchorBlockNumber!).validate(filter);
1289
+
1290
+ this.log.debug(
1291
+ `Getting private events for ${sanitizedFilter.contractAddress.toString()} from ${sanitizedFilter.fromBlock} to ${sanitizedFilter.toBlock}`,
1292
+ );
1293
+
1294
+ return this.privateEventStore.getPrivateEvents(eventSelector, sanitizedFilter);
1295
+ }
1296
+
1297
+ /**
1298
+ * Stops the PXE's job queue and closes the backing store.
1299
+ */
1300
+ public async stop(): Promise<void> {
1301
+ await this.jobQueue.end();
1302
+ await this.blockStateSynchronizer.stop();
1303
+ await this.db.close();
1304
+ }
1305
+ }