@aztec/pxe 0.0.1-commit.b6e433891 → 0.0.1-commit.b9865e97

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 (343) hide show
  1. package/dest/bin/check_oracle_version.js +43 -99
  2. package/dest/bin/index.d.ts +2 -0
  3. package/dest/bin/index.d.ts.map +1 -0
  4. package/dest/bin/index.js +1 -0
  5. package/dest/bin/oracle_version_helpers.d.ts +26 -0
  6. package/dest/bin/oracle_version_helpers.d.ts.map +1 -0
  7. package/dest/bin/oracle_version_helpers.js +93 -0
  8. package/dest/block_synchronizer/block_stream_source.d.ts +10 -0
  9. package/dest/block_synchronizer/block_stream_source.d.ts.map +1 -0
  10. package/dest/block_synchronizer/block_stream_source.js +62 -0
  11. package/dest/block_synchronizer/block_synchronizer.d.ts +6 -2
  12. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
  13. package/dest/block_synchronizer/block_synchronizer.js +30 -10
  14. package/dest/config/index.d.ts +7 -1
  15. package/dest/config/index.d.ts.map +1 -1
  16. package/dest/config/index.js +12 -14
  17. package/dest/config/package_info.js +1 -1
  18. package/dest/contract_function_simulator/contract_function_simulator.d.ts +9 -4
  19. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  20. package/dest/contract_function_simulator/contract_function_simulator.js +26 -13
  21. package/dest/contract_function_simulator/ephemeral_array_service.d.ts +28 -0
  22. package/dest/contract_function_simulator/ephemeral_array_service.d.ts.map +1 -0
  23. package/dest/contract_function_simulator/ephemeral_array_service.js +78 -0
  24. package/dest/contract_function_simulator/execution_note_cache.d.ts +2 -2
  25. package/dest/contract_function_simulator/execution_note_cache.d.ts.map +1 -1
  26. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts +5 -9
  27. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts.map +1 -1
  28. package/dest/contract_function_simulator/execution_tagging_index_cache.js +3 -7
  29. package/dest/contract_function_simulator/index.d.ts +13 -2
  30. package/dest/contract_function_simulator/index.d.ts.map +1 -1
  31. package/dest/contract_function_simulator/index.js +10 -0
  32. package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts +48 -0
  33. package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts.map +1 -0
  34. package/dest/contract_function_simulator/noir-structs/bounded_vec.js +45 -0
  35. package/dest/contract_function_simulator/noir-structs/ephemeral_array.d.ts +37 -0
  36. package/dest/contract_function_simulator/noir-structs/ephemeral_array.d.ts.map +1 -0
  37. package/dest/contract_function_simulator/noir-structs/ephemeral_array.js +59 -0
  38. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +5 -5
  39. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts.map +1 -1
  40. package/dest/contract_function_simulator/noir-structs/event_validation_request.js +6 -8
  41. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts +13 -3
  42. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts.map +1 -1
  43. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.js +35 -4
  44. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts +1 -1
  45. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.js +1 -1
  46. package/dest/contract_function_simulator/noir-structs/note_data.d.ts +27 -0
  47. package/dest/contract_function_simulator/noir-structs/note_data.d.ts.map +1 -0
  48. package/dest/contract_function_simulator/noir-structs/note_data.js +3 -0
  49. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +5 -5
  50. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts.map +1 -1
  51. package/dest/contract_function_simulator/noir-structs/note_validation_request.js +6 -8
  52. package/dest/contract_function_simulator/noir-structs/option.d.ts +61 -0
  53. package/dest/contract_function_simulator/noir-structs/option.d.ts.map +1 -0
  54. package/dest/contract_function_simulator/noir-structs/option.js +62 -0
  55. package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts +11 -0
  56. package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts.map +1 -0
  57. package/dest/contract_function_simulator/noir-structs/provided_secret.js +24 -0
  58. package/dest/contract_function_simulator/oracle/interfaces.d.ts +16 -103
  59. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  60. package/dest/contract_function_simulator/oracle/interfaces.js +2 -2
  61. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts +2 -2
  62. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts.map +1 -1
  63. package/dest/contract_function_simulator/oracle/note_packing_utils.js +2 -2
  64. package/dest/contract_function_simulator/oracle/oracle.d.ts +74 -46
  65. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
  66. package/dest/contract_function_simulator/oracle/oracle.js +407 -292
  67. package/dest/contract_function_simulator/oracle/oracle_registry.d.ts +127 -0
  68. package/dest/contract_function_simulator/oracle/oracle_registry.d.ts.map +1 -0
  69. package/dest/contract_function_simulator/oracle/oracle_registry.js +786 -0
  70. package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts +139 -0
  71. package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts.map +1 -0
  72. package/dest/contract_function_simulator/oracle/oracle_type_mappings.js +560 -0
  73. package/dest/contract_function_simulator/oracle/private_execution.js +1 -1
  74. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +33 -36
  75. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  76. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +70 -52
  77. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +95 -59
  78. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  79. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +365 -162
  80. package/dest/contract_function_simulator/pick_notes.d.ts +1 -1
  81. package/dest/contract_function_simulator/pick_notes.d.ts.map +1 -1
  82. package/dest/contract_function_simulator/pick_notes.js +20 -3
  83. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts +1 -1
  84. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts.map +1 -1
  85. package/dest/contract_function_simulator/proxied_contract_data_source.js +35 -64
  86. package/dest/contract_logging.d.ts +9 -4
  87. package/dest/contract_logging.d.ts.map +1 -1
  88. package/dest/contract_logging.js +21 -6
  89. package/dest/contract_sync/contract_sync_service.d.ts +6 -9
  90. package/dest/contract_sync/contract_sync_service.d.ts.map +1 -1
  91. package/dest/contract_sync/contract_sync_service.js +71 -50
  92. package/dest/contract_sync/helpers.d.ts +2 -4
  93. package/dest/contract_sync/helpers.d.ts.map +1 -1
  94. package/dest/contract_sync/helpers.js +12 -14
  95. package/dest/debug/pxe_debug_utils.d.ts +3 -8
  96. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  97. package/dest/debug/pxe_debug_utils.js +0 -6
  98. package/dest/entrypoints/client/bundle/index.d.ts +1 -2
  99. package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
  100. package/dest/entrypoints/client/bundle/index.js +0 -1
  101. package/dest/entrypoints/client/bundle/utils.d.ts +2 -2
  102. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  103. package/dest/entrypoints/client/bundle/utils.js +13 -5
  104. package/dest/entrypoints/client/lazy/index.d.ts +1 -2
  105. package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
  106. package/dest/entrypoints/client/lazy/index.js +0 -1
  107. package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
  108. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  109. package/dest/entrypoints/client/lazy/utils.js +13 -5
  110. package/dest/entrypoints/pxe_creation_options.d.ts +9 -1
  111. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  112. package/dest/entrypoints/pxe_creation_options.js +3 -1
  113. package/dest/entrypoints/server/index.d.ts +3 -3
  114. package/dest/entrypoints/server/index.d.ts.map +1 -1
  115. package/dest/entrypoints/server/index.js +2 -2
  116. package/dest/entrypoints/server/utils.d.ts +4 -3
  117. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  118. package/dest/entrypoints/server/utils.js +13 -5
  119. package/dest/events/event_service.d.ts +15 -6
  120. package/dest/events/event_service.d.ts.map +1 -1
  121. package/dest/events/event_service.js +44 -11
  122. package/dest/events/private_event_filter_validator.d.ts +3 -2
  123. package/dest/events/private_event_filter_validator.d.ts.map +1 -1
  124. package/dest/events/private_event_filter_validator.js +15 -0
  125. package/dest/hooks/authorize_utility_call.d.ts +41 -0
  126. package/dest/hooks/authorize_utility_call.d.ts.map +1 -0
  127. package/dest/hooks/authorize_utility_call.js +4 -0
  128. package/dest/hooks/execution_hooks.d.ts +42 -0
  129. package/dest/hooks/execution_hooks.d.ts.map +1 -0
  130. package/dest/hooks/execution_hooks.js +9 -0
  131. package/dest/hooks/index.d.ts +4 -0
  132. package/dest/hooks/index.d.ts.map +1 -0
  133. package/dest/hooks/index.js +1 -0
  134. package/dest/logs/log_service.d.ts +9 -9
  135. package/dest/logs/log_service.d.ts.map +1 -1
  136. package/dest/logs/log_service.js +126 -72
  137. package/dest/messages/message_context_service.d.ts +3 -3
  138. package/dest/messages/message_context_service.d.ts.map +1 -1
  139. package/dest/messages/message_context_service.js +30 -11
  140. package/dest/notes/note_service.d.ts +27 -6
  141. package/dest/notes/note_service.d.ts.map +1 -1
  142. package/dest/notes/note_service.js +80 -56
  143. package/dest/notes_filter.d.ts +2 -3
  144. package/dest/notes_filter.d.ts.map +1 -1
  145. package/dest/oracle_version.d.ts +4 -3
  146. package/dest/oracle_version.d.ts.map +1 -1
  147. package/dest/oracle_version.js +20 -10
  148. package/dest/private_kernel/batch_planner.d.ts +47 -0
  149. package/dest/private_kernel/batch_planner.d.ts.map +1 -0
  150. package/dest/private_kernel/batch_planner.js +104 -0
  151. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.js +1 -1
  152. package/dest/private_kernel/hints/test_utils.d.ts +1 -1
  153. package/dest/private_kernel/hints/test_utils.d.ts.map +1 -1
  154. package/dest/private_kernel/hints/test_utils.js +2 -3
  155. package/dest/private_kernel/private_kernel_execution_prover.d.ts +6 -2
  156. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  157. package/dest/private_kernel/private_kernel_execution_prover.js +152 -59
  158. package/dest/private_kernel/private_kernel_oracle.d.ts +10 -10
  159. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  160. package/dest/private_kernel/private_kernel_oracle.js +24 -22
  161. package/dest/pxe.d.ts +56 -10
  162. package/dest/pxe.d.ts.map +1 -1
  163. package/dest/pxe.js +138 -91
  164. package/dest/storage/anchor_block_store/anchor_block_store.js +1 -1
  165. package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.d.ts +42 -0
  166. package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.d.ts.map +1 -0
  167. package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.js +93 -0
  168. package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts +15 -0
  169. package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts.map +1 -0
  170. package/dest/storage/backwards_compatibility_tests/schema_tests.js +591 -0
  171. package/dest/storage/backwards_compatibility_tests/store_spy.d.ts +19 -0
  172. package/dest/storage/backwards_compatibility_tests/store_spy.d.ts.map +1 -0
  173. package/dest/storage/backwards_compatibility_tests/store_spy.js +63 -0
  174. package/dest/storage/capsule_store/capsule_service.d.ts +21 -0
  175. package/dest/storage/capsule_store/capsule_service.d.ts.map +1 -0
  176. package/dest/storage/capsule_store/capsule_service.js +50 -0
  177. package/dest/storage/capsule_store/capsule_store.d.ts +9 -9
  178. package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
  179. package/dest/storage/capsule_store/capsule_store.js +36 -28
  180. package/dest/storage/capsule_store/index.d.ts +2 -1
  181. package/dest/storage/capsule_store/index.d.ts.map +1 -1
  182. package/dest/storage/capsule_store/index.js +1 -0
  183. package/dest/storage/contract_store/contract_store.d.ts +1 -1
  184. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  185. package/dest/storage/contract_store/contract_store.js +9 -26
  186. package/dest/storage/metadata.d.ts +1 -1
  187. package/dest/storage/metadata.js +1 -1
  188. package/dest/storage/note_store/note_store.d.ts +1 -1
  189. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  190. package/dest/storage/note_store/note_store.js +2 -2
  191. package/dest/storage/open_pxe_stores.d.ts +33 -0
  192. package/dest/storage/open_pxe_stores.d.ts.map +1 -0
  193. package/dest/storage/open_pxe_stores.js +27 -0
  194. package/dest/storage/private_event_store/private_event_store.d.ts +1 -1
  195. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  196. package/dest/storage/private_event_store/private_event_store.js +3 -0
  197. package/dest/storage/private_event_store/stored_private_event.js +1 -1
  198. package/dest/storage/tagging_store/recipient_tagging_store.d.ts +6 -6
  199. package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
  200. package/dest/storage/tagging_store/sender_tagging_store.d.ts +5 -5
  201. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  202. package/dest/storage/tagging_store/sender_tagging_store.js +3 -3
  203. package/dest/tagging/get_all_logs_by_tags.d.ts +34 -10
  204. package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -1
  205. package/dest/tagging/get_all_logs_by_tags.js +36 -37
  206. package/dest/tagging/index.d.ts +5 -4
  207. package/dest/tagging/index.d.ts.map +1 -1
  208. package/dest/tagging/index.js +4 -3
  209. package/dest/tagging/persist_sender_tagging_index_ranges.d.ts +29 -0
  210. package/dest/tagging/persist_sender_tagging_index_ranges.d.ts.map +1 -0
  211. package/dest/tagging/persist_sender_tagging_index_ranges.js +42 -0
  212. package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts +56 -0
  213. package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts.map +1 -0
  214. package/dest/tagging/recipient_sync/sync_tagged_private_logs.js +163 -0
  215. package/dest/tagging/recipient_sync/utils/find_highest_indexes.d.ts +3 -3
  216. package/dest/tagging/recipient_sync/utils/find_highest_indexes.d.ts.map +1 -1
  217. package/dest/tagging/reconcile_tagging_index_ranges.d.ts +36 -0
  218. package/dest/tagging/reconcile_tagging_index_ranges.d.ts.map +1 -0
  219. package/dest/tagging/reconcile_tagging_index_ranges.js +74 -0
  220. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +4 -5
  221. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
  222. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +26 -14
  223. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +11 -6
  224. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
  225. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +21 -0
  226. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +4 -4
  227. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
  228. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +2 -2
  229. package/package.json +20 -17
  230. package/src/bin/check_oracle_version.ts +49 -122
  231. package/src/bin/index.ts +1 -0
  232. package/src/bin/oracle_version_helpers.ts +121 -0
  233. package/src/block_synchronizer/block_stream_source.ts +81 -0
  234. package/src/block_synchronizer/block_synchronizer.ts +33 -11
  235. package/src/config/index.ts +14 -8
  236. package/src/config/package_info.ts +1 -1
  237. package/src/contract_function_simulator/contract_function_simulator.ts +44 -16
  238. package/src/contract_function_simulator/ephemeral_array_service.ts +110 -0
  239. package/src/contract_function_simulator/execution_note_cache.ts +1 -1
  240. package/src/contract_function_simulator/execution_tagging_index_cache.ts +5 -9
  241. package/src/contract_function_simulator/index.ts +50 -1
  242. package/src/contract_function_simulator/noir-structs/bounded_vec.ts +55 -0
  243. package/src/contract_function_simulator/noir-structs/ephemeral_array.ts +66 -0
  244. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +4 -6
  245. package/src/contract_function_simulator/noir-structs/log_retrieval_request.ts +36 -3
  246. package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +1 -1
  247. package/src/contract_function_simulator/noir-structs/note_data.ts +27 -0
  248. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +4 -6
  249. package/src/contract_function_simulator/noir-structs/option.ts +69 -0
  250. package/src/contract_function_simulator/noir-structs/provided_secret.ts +27 -0
  251. package/src/contract_function_simulator/oracle/interfaces.ts +12 -176
  252. package/src/contract_function_simulator/oracle/note_packing_utils.ts +3 -3
  253. package/src/contract_function_simulator/oracle/oracle.ts +498 -462
  254. package/src/contract_function_simulator/oracle/oracle_registry.ts +585 -0
  255. package/src/contract_function_simulator/oracle/oracle_type_mappings.ts +553 -0
  256. package/src/contract_function_simulator/oracle/private_execution.ts +1 -1
  257. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +93 -71
  258. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +534 -267
  259. package/src/contract_function_simulator/pick_notes.ts +22 -3
  260. package/src/contract_function_simulator/proxied_contract_data_source.ts +41 -64
  261. package/src/contract_logging.ts +18 -5
  262. package/src/contract_sync/contract_sync_service.ts +97 -89
  263. package/src/contract_sync/helpers.ts +13 -25
  264. package/src/debug/pxe_debug_utils.ts +3 -11
  265. package/src/entrypoints/client/bundle/index.ts +0 -1
  266. package/src/entrypoints/client/bundle/utils.ts +10 -5
  267. package/src/entrypoints/client/lazy/index.ts +0 -1
  268. package/src/entrypoints/client/lazy/utils.ts +10 -5
  269. package/src/entrypoints/pxe_creation_options.ts +14 -0
  270. package/src/entrypoints/server/index.ts +2 -2
  271. package/src/entrypoints/server/utils.ts +15 -6
  272. package/src/events/event_service.ts +69 -21
  273. package/src/events/private_event_filter_validator.ts +21 -1
  274. package/src/hooks/authorize_utility_call.ts +44 -0
  275. package/src/hooks/execution_hooks.ts +48 -0
  276. package/src/hooks/index.ts +7 -0
  277. package/src/logs/log_service.ts +158 -134
  278. package/src/messages/message_context_service.ts +43 -26
  279. package/src/notes/note_service.ts +119 -85
  280. package/src/notes_filter.ts +1 -3
  281. package/src/oracle_version.ts +20 -10
  282. package/src/private_kernel/batch_planner.ts +169 -0
  283. package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +1 -1
  284. package/src/private_kernel/hints/test_utils.ts +2 -9
  285. package/src/private_kernel/private_kernel_execution_prover.ts +240 -82
  286. package/src/private_kernel/private_kernel_oracle.ts +35 -25
  287. package/src/pxe.ts +226 -95
  288. package/src/storage/anchor_block_store/anchor_block_store.ts +1 -1
  289. package/src/storage/backwards_compatibility_tests/__snapshots__/AddressStore.json +22 -0
  290. package/src/storage/backwards_compatibility_tests/__snapshots__/AnchorBlockStore.json +3 -0
  291. package/src/storage/backwards_compatibility_tests/__snapshots__/CapsuleStore.json +16 -0
  292. package/src/storage/backwards_compatibility_tests/__snapshots__/ContractStore.json +28 -0
  293. package/src/storage/backwards_compatibility_tests/__snapshots__/KeyStore.json +52 -0
  294. package/src/storage/backwards_compatibility_tests/__snapshots__/L2TipsKVStore.json +46 -0
  295. package/src/storage/backwards_compatibility_tests/__snapshots__/NoteStore.json +36 -0
  296. package/src/storage/backwards_compatibility_tests/__snapshots__/PrivateEventStore.json +44 -0
  297. package/src/storage/backwards_compatibility_tests/__snapshots__/RecipientTaggingStore.json +18 -0
  298. package/src/storage/backwards_compatibility_tests/__snapshots__/SenderAddressBookStore.json +16 -0
  299. package/src/storage/backwards_compatibility_tests/__snapshots__/SenderTaggingStore.json +22 -0
  300. package/src/storage/backwards_compatibility_tests/__snapshots__/opened_stores.json +97 -0
  301. package/src/storage/backwards_compatibility_tests/kv_store_snapshot.ts +122 -0
  302. package/src/storage/backwards_compatibility_tests/schema_tests.ts +712 -0
  303. package/src/storage/backwards_compatibility_tests/store_spy.ts +73 -0
  304. package/src/storage/capsule_store/capsule_service.ts +90 -0
  305. package/src/storage/capsule_store/capsule_store.ts +44 -26
  306. package/src/storage/capsule_store/index.ts +1 -0
  307. package/src/storage/contract_store/contract_store.ts +14 -35
  308. package/src/storage/metadata.ts +1 -1
  309. package/src/storage/note_store/note_store.ts +2 -5
  310. package/src/storage/open_pxe_stores.ts +49 -0
  311. package/src/storage/private_event_store/private_event_store.ts +4 -0
  312. package/src/storage/private_event_store/stored_private_event.ts +1 -1
  313. package/src/storage/tagging_store/recipient_tagging_store.ts +5 -9
  314. package/src/storage/tagging_store/sender_tagging_store.ts +6 -6
  315. package/src/tagging/get_all_logs_by_tags.ts +78 -50
  316. package/src/tagging/index.ts +4 -3
  317. package/src/tagging/persist_sender_tagging_index_ranges.ts +57 -0
  318. package/src/tagging/recipient_sync/sync_tagged_private_logs.ts +240 -0
  319. package/src/tagging/recipient_sync/utils/find_highest_indexes.ts +2 -2
  320. package/src/tagging/reconcile_tagging_index_ranges.ts +102 -0
  321. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +41 -19
  322. package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +23 -8
  323. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +4 -5
  324. package/dest/access_scopes.d.ts +0 -9
  325. package/dest/access_scopes.d.ts.map +0 -1
  326. package/dest/access_scopes.js +0 -6
  327. package/dest/contract_function_simulator/noir-structs/message_tx_context.d.ts +0 -16
  328. package/dest/contract_function_simulator/noir-structs/message_tx_context.d.ts.map +0 -1
  329. package/dest/contract_function_simulator/noir-structs/message_tx_context.js +0 -57
  330. package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.d.ts +0 -9
  331. package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.d.ts.map +0 -1
  332. package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.js +0 -42
  333. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +0 -14
  334. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +0 -1
  335. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +0 -99
  336. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +0 -14
  337. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +0 -1
  338. package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +0 -33
  339. package/src/access_scopes.ts +0 -9
  340. package/src/contract_function_simulator/noir-structs/message_tx_context.ts +0 -55
  341. package/src/contract_function_simulator/oracle/legacy_oracle_mappings.ts +0 -135
  342. package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +0 -140
  343. package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +0 -44
package/src/pxe.ts CHANGED
@@ -6,7 +6,6 @@ import { SerialQueue } from '@aztec/foundation/queue';
6
6
  import { Timer } from '@aztec/foundation/timer';
7
7
  import { KeyStore } from '@aztec/key-store';
8
8
  import type { AztecAsyncKVStore } from '@aztec/kv-store';
9
- import { L2TipsKVStore } from '@aztec/kv-store/stores';
10
9
  import { type ProtocolContractsProvider, protocolContractNames } from '@aztec/protocol-contracts';
11
10
  import type { CircuitSimulator } from '@aztec/simulator/client';
12
11
  import {
@@ -18,6 +17,7 @@ import {
18
17
  } from '@aztec/stdlib/abi';
19
18
  import type { AuthWitness } from '@aztec/stdlib/auth-witness';
20
19
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
20
+ import { GENESIS_BLOCK_HEADER_HASH, type L2TipsProvider } from '@aztec/stdlib/block';
21
21
  import {
22
22
  CompleteAddress,
23
23
  type ContractInstanceWithAddress,
@@ -52,7 +52,6 @@ import {
52
52
 
53
53
  import { inspect } from 'util';
54
54
 
55
- import type { AccessScopes } from './access_scopes.js';
56
55
  import { BlockSynchronizer } from './block_synchronizer/index.js';
57
56
  import type { PXEConfig } from './config/index.js';
58
57
  import { BenchmarkedNodeFactory } from './contract_function_simulator/benchmarked_node.js';
@@ -67,6 +66,7 @@ import { readCurrentClassId } from './contract_sync/helpers.js';
67
66
  import { PXEDebugUtils } from './debug/pxe_debug_utils.js';
68
67
  import { enrichPublicSimulationError, enrichSimulationError } from './error_enriching.js';
69
68
  import { PrivateEventFilterValidator } from './events/private_event_filter_validator.js';
69
+ import type { ExecutionHooks } from './hooks/index.js';
70
70
  import { JobCoordinator } from './job_coordinator/job_coordinator.js';
71
71
  import { MessageContextService } from './messages/message_context_service.js';
72
72
  import {
@@ -79,16 +79,26 @@ import { AnchorBlockStore } from './storage/anchor_block_store/anchor_block_stor
79
79
  import { CapsuleStore } from './storage/capsule_store/capsule_store.js';
80
80
  import { ContractStore } from './storage/contract_store/contract_store.js';
81
81
  import { NoteStore } from './storage/note_store/note_store.js';
82
+ import { openPxeStores } from './storage/open_pxe_stores.js';
82
83
  import { PrivateEventStore } from './storage/private_event_store/private_event_store.js';
83
84
  import { RecipientTaggingStore } from './storage/tagging_store/recipient_tagging_store.js';
84
85
  import { SenderAddressBookStore } from './storage/tagging_store/sender_address_book_store.js';
85
86
  import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store.js';
87
+ import { persistSenderTaggingIndexRangesForTx } from './tagging/index.js';
86
88
 
87
89
  export type PackedPrivateEvent = InTx & {
88
90
  packedEvent: Fr[];
89
91
  eventSelector: EventSelector;
90
92
  };
91
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
+
92
102
  /** Options for PXE.profileTx. */
93
103
  export type ProfileTxOpts = {
94
104
  /** The profiling mode to use. */
@@ -96,7 +106,9 @@ export type ProfileTxOpts = {
96
106
  /** If true, proof generation is skipped during profiling. Defaults to true. */
97
107
  skipProofGeneration?: boolean;
98
108
  /** Addresses whose private state and keys are accessible during private execution. */
99
- scopes: AccessScopes;
109
+ scopes: AztecAddress[];
110
+ /** Sender address used to derive discovery tags for private messages (notes, events, logs) this tx emits. */
111
+ senderForTags?: AztecAddress;
100
112
  };
101
113
 
102
114
  /** Options for PXE.simulateTx. */
@@ -109,10 +121,16 @@ export type SimulateTxOpts = {
109
121
  skipFeeEnforcement?: boolean;
110
122
  /** If true, kernel logic is emulated in TS for simulation */
111
123
  skipKernels?: boolean;
112
- /** State overrides for the simulation, such as contract instances and artifacts. Requires skipKernels: true */
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
+ */
113
129
  overrides?: SimulationOverrides;
114
130
  /** Addresses whose private state and keys are accessible during private execution */
115
- scopes: AccessScopes;
131
+ scopes: AztecAddress[];
132
+ /** Sender address used to derive discovery tags for private messages (notes, events, logs) this tx emits. */
133
+ senderForTags?: AztecAddress;
116
134
  };
117
135
 
118
136
  /** Options for PXE.executeUtility. */
@@ -120,7 +138,22 @@ export type ExecuteUtilityOpts = {
120
138
  /** The authentication witnesses required for the function call. */
121
139
  authwits?: AuthWitness[];
122
140
  /** The accounts whose notes we can access in this call */
123
- scopes: AccessScopes;
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 }>>;
124
157
  };
125
158
 
126
159
  /** Args for PXE.create. */
@@ -135,10 +168,14 @@ export type PXECreateArgs = {
135
168
  simulator: CircuitSimulator;
136
169
  /** Provider for protocol contract artifacts and instances. */
137
170
  protocolContractsProvider: ProtocolContractsProvider;
171
+ /** Provider for the "nice to have" contracts the PXE preloads. */
172
+ preloadedContractsProvider: PreloadedContractsProvider;
138
173
  /** PXE configuration options. */
139
174
  config: PXEConfig;
140
175
  /** Optional logger instance or string suffix for the logger name. */
141
176
  loggerOrSuffix?: string | Logger;
177
+ /** Optional hooks to observe and influence contract execution. */
178
+ hooks?: ExecutionHooks;
142
179
  };
143
180
 
144
181
  /**
@@ -162,14 +199,18 @@ export class PXE {
162
199
  private privateEventStore: PrivateEventStore,
163
200
  private contractSyncService: ContractSyncService,
164
201
  private messageContextService: MessageContextService,
202
+ private l2TipsStore: L2TipsProvider,
165
203
  private simulator: CircuitSimulator,
166
204
  private proverEnabled: boolean,
205
+ private autoSync: boolean,
167
206
  private proofCreator: PrivateKernelProver,
168
207
  private protocolContractsProvider: ProtocolContractsProvider,
208
+ private preloadedContractsProvider: PreloadedContractsProvider,
169
209
  private log: Logger,
170
210
  private jobQueue: SerialQueue,
171
211
  private jobCoordinator: JobCoordinator,
172
212
  public debug: PXEDebugUtils,
213
+ private hooks: ExecutionHooks | undefined,
173
214
  ) {}
174
215
 
175
216
  /**
@@ -185,8 +226,10 @@ export class PXE {
185
226
  proofCreator,
186
227
  simulator,
187
228
  protocolContractsProvider,
229
+ preloadedContractsProvider,
188
230
  config,
189
231
  loggerOrSuffix,
232
+ hooks,
190
233
  }: PXECreateArgs) {
191
234
  // Extract bindings from the logger, or use empty bindings if a string suffix is provided.
192
235
  const bindings: LoggerBindings | undefined =
@@ -199,18 +242,28 @@ export class PXE {
199
242
 
200
243
  const info = await node.getNodeInfo();
201
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
+
202
253
  const proverEnabled = config.proverEnabled !== undefined ? config.proverEnabled : info.realProofs;
203
- const addressStore = new AddressStore(store);
204
- const privateEventStore = new PrivateEventStore(store);
205
- const contractStore = new ContractStore(store);
206
- const noteStore = new NoteStore(store);
207
- const anchorBlockStore = new AnchorBlockStore(store);
208
- const senderTaggingStore = new SenderTaggingStore(store);
209
- const senderAddressBookStore = new SenderAddressBookStore(store);
210
- const recipientTaggingStore = new RecipientTaggingStore(store);
211
- const capsuleStore = new CapsuleStore(store);
212
- const keyStore = new KeyStore(store);
213
- const tipsStore = new L2TipsKVStore(store, 'pxe');
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);
214
267
  const contractSyncService = new ContractSyncService(
215
268
  node,
216
269
  contractStore,
@@ -225,7 +278,7 @@ export class PXE {
225
278
  anchorBlockStore,
226
279
  noteStore,
227
280
  privateEventStore,
228
- tipsStore,
281
+ l2TipsStore,
229
282
  contractSyncService,
230
283
  config,
231
284
  bindings,
@@ -261,14 +314,18 @@ export class PXE {
261
314
  privateEventStore,
262
315
  contractSyncService,
263
316
  messageContextService,
317
+ l2TipsStore,
264
318
  simulator,
265
319
  proverEnabled,
320
+ config.autoSync,
266
321
  proofCreator,
267
322
  protocolContractsProvider,
323
+ preloadedContractsProvider,
268
324
  log,
269
325
  jobQueue,
270
326
  jobCoordinator,
271
327
  debugUtils,
328
+ hooks,
272
329
  );
273
330
 
274
331
  debugUtils.setPXEHelpers(
@@ -279,7 +336,7 @@ export class PXE {
279
336
 
280
337
  pxe.jobQueue.start();
281
338
 
282
- await pxe.#registerProtocolContracts();
339
+ await Promise.all([pxe.#registerProtocolContracts(), pxe.#registerPreloadedContracts()]);
283
340
  log.info(`Started PXE connected to chain ${info.l1ChainId} version ${info.rollupVersion}`);
284
341
  return pxe;
285
342
  }
@@ -295,6 +352,7 @@ export class PXE {
295
352
  keyStore: this.keyStore,
296
353
  addressStore: this.addressStore,
297
354
  aztecNode: BenchmarkedNodeFactory.create(this.node),
355
+ l2TipsStore: this.l2TipsStore,
298
356
  senderTaggingStore: this.senderTaggingStore,
299
357
  recipientTaggingStore: this.recipientTaggingStore,
300
358
  senderAddressBookStore: this.senderAddressBookStore,
@@ -303,6 +361,7 @@ export class PXE {
303
361
  simulator: this.simulator,
304
362
  contractSyncService: this.contractSyncService,
305
363
  messageContextService: this.messageContextService,
364
+ hooks: this.hooks,
306
365
  });
307
366
  }
308
367
 
@@ -353,29 +412,48 @@ export class PXE {
353
412
  }
354
413
 
355
414
  async #registerProtocolContracts() {
356
- const registered: Record<string, string> = {};
357
- for (const name of protocolContractNames) {
358
- const { address, instance, artifact } = await this.protocolContractsProvider.getProtocolContractArtifact(name);
359
- await this.contractStore.addContractArtifact(artifact);
360
- await this.contractStore.addContractInstance(instance);
361
- registered[name] = address.toString();
362
- }
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
+ );
363
426
  this.log.verbose(`Registered protocol contracts in pxe`, registered);
364
427
  }
365
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
+
366
437
  // Executes the entrypoint private function, as well as all nested private
367
438
  // functions that might arise.
368
- async #executePrivate(
369
- contractFunctionSimulator: ContractFunctionSimulator,
370
- txRequest: TxExecutionRequest,
371
- scopes: AccessScopes,
372
- jobId: string,
373
- ): Promise<PrivateExecutionResult> {
439
+ async #executePrivate({
440
+ contractFunctionSimulator,
441
+ txRequest,
442
+ anchorBlockHeader,
443
+ scopes,
444
+ jobId,
445
+ senderForTags,
446
+ }: {
447
+ contractFunctionSimulator: ContractFunctionSimulator;
448
+ txRequest: TxExecutionRequest;
449
+ anchorBlockHeader: BlockHeader;
450
+ scopes: AztecAddress[];
451
+ jobId: string;
452
+ senderForTags?: AztecAddress;
453
+ }): Promise<PrivateExecutionResult> {
374
454
  const { origin: contractAddress, functionSelector } = txRequest;
375
455
 
376
456
  try {
377
- const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
378
-
379
457
  await this.contractSyncService.ensureContractSynced(
380
458
  contractAddress,
381
459
  functionSelector,
@@ -392,6 +470,7 @@ export class PXE {
392
470
  anchorBlockHeader,
393
471
  scopes,
394
472
  jobId,
473
+ senderForTags,
395
474
  });
396
475
  this.log.debug(`Private simulation completed for ${contractAddress.toString()}:${functionSelector}`);
397
476
  return result;
@@ -417,7 +496,7 @@ export class PXE {
417
496
  contractFunctionSimulator: ContractFunctionSimulator,
418
497
  call: FunctionCall,
419
498
  authWitnesses: AuthWitness[] | undefined,
420
- scopes: AccessScopes,
499
+ scopes: AztecAddress[],
421
500
  jobId: string,
422
501
  ) {
423
502
  try {
@@ -444,11 +523,11 @@ export class PXE {
444
523
  * It can also be used for estimating gas in the future.
445
524
  * @param tx - The transaction to be simulated.
446
525
  */
447
- async #simulatePublicCalls(tx: Tx, skipFeeEnforcement: boolean) {
526
+ async #simulatePublicCalls(tx: Tx, skipFeeEnforcement: boolean, overrides?: SimulationOverrides) {
448
527
  // Simulating public calls can throw if the TX fails in a phase that doesn't allow reverts (setup)
449
528
  // Or return as reverted if it fails in a phase that allows reverts (app logic, teardown)
450
529
  try {
451
- const result = await this.node.simulatePublicCalls(tx, skipFeeEnforcement);
530
+ const result = await this.node.simulatePublicCalls(tx, skipFeeEnforcement, overrides);
452
531
  if (result.revertReason) {
453
532
  throw result.revertReason;
454
533
  }
@@ -480,11 +559,10 @@ export class PXE {
480
559
  txExecutionRequest: TxExecutionRequest,
481
560
  proofCreator: PrivateKernelProver,
482
561
  privateExecutionResult: PrivateExecutionResult,
562
+ anchorBlockHeader: BlockHeader,
483
563
  config: PrivateKernelExecutionProverConfig,
484
564
  ): Promise<PrivateKernelExecutionProofOutput<PrivateKernelTailCircuitPublicInputs>> {
485
- const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
486
- const anchorBlockHash = await anchorBlockHeader.hash();
487
- const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHash);
565
+ const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHeader);
488
566
  const kernelTraceProver = new PrivateKernelExecutionProver(
489
567
  kernelOracle,
490
568
  proofCreator,
@@ -495,14 +573,36 @@ export class PXE {
495
573
  return await kernelTraceProver.proveWithKernels(txExecutionRequest.toTxRequest(), privateExecutionResult, config);
496
574
  }
497
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
+
498
587
  // Public API
499
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
+
500
598
  /**
501
599
  * Returns the block header up to which the PXE has synced.
502
600
  * @returns The synced block header
503
601
  */
504
602
  public getSyncedBlockHeader(): Promise<BlockHeader> {
505
- return this.anchorBlockStore.getBlockHeader();
603
+ return this.#putInJobQueue(() => {
604
+ return this.anchorBlockStore.getBlockHeader();
605
+ });
506
606
  }
507
607
 
508
608
  /**
@@ -536,7 +636,7 @@ export class PXE {
536
636
  public async registerAccount(secretKey: Fr, partialAddress: PartialAddress): Promise<CompleteAddress> {
537
637
  const accounts = await this.keyStore.getAccounts();
538
638
  const accountCompleteAddress = await this.keyStore.addAccount(secretKey, partialAddress);
539
- if (accounts.includes(accountCompleteAddress.address)) {
639
+ if (accounts.some(a => a.equals(accountCompleteAddress.address))) {
540
640
  this.log.info(`Account:\n "${accountCompleteAddress.address.toString()}"\n already registered.`);
541
641
  return accountCompleteAddress;
542
642
  } else {
@@ -559,8 +659,14 @@ export class PXE {
559
659
  * TODO: It's strange that we return the address here and I (benesjan) think we should drop the return value.
560
660
  */
561
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
+
562
668
  const accounts = await this.keyStore.getAccounts();
563
- if (accounts.includes(sender)) {
669
+ if (accounts.some(a => a.equals(sender))) {
564
670
  this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
565
671
  return sender;
566
672
  }
@@ -570,8 +676,8 @@ export class PXE {
570
676
  if (wasAdded) {
571
677
  this.log.info(`Added sender:\n ${sender.toString()}`);
572
678
  // Wipe the entire sync cache: the new sender's tagged logs could contain notes/events for any contract, so
573
- // all contracts must re-sync to discover them.
574
- this.contractSyncService.wipe();
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()));
575
681
  } else {
576
682
  this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
577
683
  }
@@ -655,7 +761,9 @@ export class PXE {
655
761
  const publicFunctionSignatures = artifact.functions
656
762
  .filter(fn => fn.functionType === FunctionType.PUBLIC)
657
763
  .map(fn => decodeFunctionSignature(fn.name, fn.parameters));
658
- await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
764
+ if (publicFunctionSignatures.length > 0) {
765
+ await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
766
+ }
659
767
  } else {
660
768
  // Otherwise, make sure there is an artifact already registered for that class id
661
769
  artifact = await this.contractStore.getContractArtifact(instance.currentContractClassId);
@@ -690,7 +798,7 @@ export class PXE {
690
798
  throw new Error(`Instance not found when updating a contract. Contract address: ${contractAddress}.`);
691
799
  }
692
800
  const contractClass = await getContractClassFromArtifact(artifact);
693
- await this.blockStateSynchronizer.sync();
801
+ await this.#maybeSync();
694
802
 
695
803
  const header = await this.anchorBlockStore.getBlockHeader();
696
804
 
@@ -702,7 +810,9 @@ export class PXE {
702
810
  const publicFunctionSignatures = artifact.functions
703
811
  .filter(fn => fn.functionType === FunctionType.PUBLIC)
704
812
  .map(fn => decodeFunctionSignature(fn.name, fn.parameters));
705
- await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
813
+ if (publicFunctionSignatures.length > 0) {
814
+ await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
815
+ }
706
816
 
707
817
  currentInstance.currentContractClassId = contractClass.id;
708
818
  await Promise.all([
@@ -731,7 +841,7 @@ export class PXE {
731
841
  * @throws If contract code not found, or public simulation reverts.
732
842
  * Also throws if simulatePublic is true and public simulation reverts.
733
843
  */
734
- public proveTx(txRequest: TxExecutionRequest, scopes: AztecAddress[]): Promise<TxProvingResult> {
844
+ public proveTx(txRequest: TxExecutionRequest, { scopes, senderForTags }: ProveTxOpts): Promise<TxProvingResult> {
735
845
  let privateExecutionResult: PrivateExecutionResult;
736
846
  // We disable proving concurrently mostly out of caution, since it accesses some of our stores. Proving is so
737
847
  // computationally demanding that it'd be rare for someone to try to do it concurrently regardless.
@@ -739,17 +849,25 @@ export class PXE {
739
849
  const totalTimer = new Timer();
740
850
  try {
741
851
  const syncTimer = new Timer();
742
- await this.blockStateSynchronizer.sync();
852
+ await this.#maybeSync();
853
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
743
854
  const syncTime = syncTimer.ms();
744
855
  const contractFunctionSimulator = this.#getSimulatorForTx();
745
- privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, scopes, jobId);
856
+ privateExecutionResult = await this.#executePrivate({
857
+ contractFunctionSimulator,
858
+ txRequest,
859
+ anchorBlockHeader,
860
+ scopes,
861
+ jobId,
862
+ senderForTags,
863
+ });
746
864
 
747
865
  const {
748
866
  publicInputs,
749
867
  chonkProof,
750
868
  executionSteps,
751
869
  timings: { proving } = {},
752
- } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
870
+ } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, anchorBlockHeader, {
753
871
  simulate: false,
754
872
  skipFeeEnforcement: false,
755
873
  profileMode: 'none',
@@ -779,23 +897,20 @@ export class PXE {
779
897
  nodeRPCCalls: contractFunctionSimulator?.getStats().nodeRPCCalls,
780
898
  });
781
899
 
782
- // While not strictly necessary to store tagging cache contents in the DB since we sync tagging indexes from
783
- // chain before sending new logs, the sync can only see logs already included in blocks. If we send another
784
- // transaction before this one is included in a block from this PXE, and that transaction contains a log with
785
- // a tag derived from the same secret, we would reuse the tag and the transactions would be linked. Hence
786
- // storing the tags here prevents linkage of txs sent from the same PXE.
787
- const taggingIndexRangesUsedInTheTx = privateExecutionResult.entrypoint.taggingIndexRanges;
788
- if (taggingIndexRangesUsedInTheTx.length > 0) {
789
- // TODO(benesjan): The following is an expensive operation. Figure out a way to avoid it.
790
- const txHash = (await txProvingResult.toTx()).txHash;
791
-
792
- await this.senderTaggingStore.storePendingIndexes(taggingIndexRangesUsedInTheTx, txHash, jobId);
793
- this.log.debug(`Stored used tagging index ranges as sender for the tx`, {
794
- taggingIndexRangesUsedInTheTx,
795
- });
796
- } else {
797
- this.log.debug(`No tagging index ranges used in the tx`);
798
- }
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
+ );
799
914
 
800
915
  return txProvingResult;
801
916
  } catch (err: any) {
@@ -812,7 +927,7 @@ export class PXE {
812
927
  */
813
928
  public profileTx(
814
929
  txRequest: TxExecutionRequest,
815
- { profileMode, skipProofGeneration = true, scopes }: ProfileTxOpts,
930
+ { profileMode, skipProofGeneration = true, scopes, senderForTags }: ProfileTxOpts,
816
931
  ): Promise<TxProfileResult> {
817
932
  // We disable concurrent profiles for consistency with simulateTx.
818
933
  return this.#putInJobQueue(async jobId => {
@@ -831,16 +946,25 @@ export class PXE {
831
946
  txInfo,
832
947
  );
833
948
  const syncTimer = new Timer();
834
- await this.blockStateSynchronizer.sync();
949
+ await this.#maybeSync();
950
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
835
951
  const syncTime = syncTimer.ms();
836
952
 
837
953
  const contractFunctionSimulator = this.#getSimulatorForTx();
838
- const privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, scopes, jobId);
954
+ const privateExecutionResult = await this.#executePrivate({
955
+ contractFunctionSimulator,
956
+ txRequest,
957
+ anchorBlockHeader,
958
+ scopes,
959
+ jobId,
960
+ senderForTags,
961
+ });
839
962
 
840
963
  const { executionSteps, timings: { proving } = {} } = await this.#prove(
841
964
  txRequest,
842
965
  this.proofCreator,
843
966
  privateExecutionResult,
967
+ anchorBlockHeader,
844
968
  {
845
969
  simulate: skipProofGeneration,
846
970
  skipFeeEnforcement: false,
@@ -908,6 +1032,7 @@ export class PXE {
908
1032
  skipKernels = true,
909
1033
  overrides,
910
1034
  scopes,
1035
+ senderForTags,
911
1036
  }: SimulateTxOpts,
912
1037
  ): Promise<TxSimulationResult> {
913
1038
  // We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
@@ -929,27 +1054,26 @@ export class PXE {
929
1054
  txInfo,
930
1055
  );
931
1056
  const syncTimer = new Timer();
932
- await this.blockStateSynchronizer.sync();
1057
+ await this.#maybeSync();
1058
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
933
1059
  const syncTime = syncTimer.ms();
934
1060
 
935
- const overriddenContracts = overrides?.contracts ? new Set(Object.keys(overrides.contracts)) : undefined;
936
- const hasOverriddenContracts = overriddenContracts !== undefined && overriddenContracts.size > 0;
937
-
938
- if (hasOverriddenContracts && !skipKernels) {
1061
+ if (overrides?.contracts && Object.keys(overrides.contracts).length > 0 && !skipKernels) {
939
1062
  throw new Error(
940
1063
  'Simulating with overridden contracts is not compatible with kernel execution. Please set skipKernels to true when simulating with overridden contracts.',
941
1064
  );
942
1065
  }
943
1066
  const contractFunctionSimulator = this.#getSimulatorForTx(overrides);
944
1067
 
945
- if (hasOverriddenContracts) {
946
- // Overridden contracts don't have a sync function, so calling sync on them would fail.
947
- // We exclude them so the sync service skips them entirely.
948
- this.contractSyncService.setExcludedFromSync(jobId, overriddenContracts);
949
- }
950
-
951
1068
  // Execution of private functions only; no proving, and no kernel logic.
952
- const privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, scopes, jobId);
1069
+ const privateExecutionResult = await this.#executePrivate({
1070
+ contractFunctionSimulator,
1071
+ txRequest,
1072
+ anchorBlockHeader,
1073
+ scopes,
1074
+ jobId,
1075
+ senderForTags,
1076
+ });
953
1077
 
954
1078
  let publicInputs: PrivateKernelTailCircuitPublicInputs | undefined;
955
1079
  let executionSteps: PrivateExecutionStep[] = [];
@@ -962,11 +1086,17 @@ export class PXE {
962
1086
  ));
963
1087
  } else {
964
1088
  // Kernel logic, plus proving of all private functions and kernels.
965
- ({ publicInputs, executionSteps } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
966
- simulate: true,
967
- skipFeeEnforcement,
968
- profileMode: 'none',
969
- }));
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
+ ));
970
1100
  }
971
1101
 
972
1102
  const privateSimulationResult = new PrivateSimulationResult(privateExecutionResult, publicInputs);
@@ -975,7 +1105,7 @@ export class PXE {
975
1105
  let publicOutput: PublicSimulationOutput | undefined;
976
1106
  if (simulatePublic && publicInputs.forPublic) {
977
1107
  const publicSimulationTimer = new Timer();
978
- publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement);
1108
+ publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement, overrides);
979
1109
  publicSimulationTime = publicSimulationTimer.ms();
980
1110
  if (publicOutput?.debugLogs?.length) {
981
1111
  await displayDebugLogs(publicOutput.debugLogs, addr => this.contractStore.getDebugContractName(addr));
@@ -1040,7 +1170,7 @@ export class PXE {
1040
1170
  inspect(txRequest),
1041
1171
  `simulatePublic=${simulatePublic}`,
1042
1172
  `skipTxValidation=${skipTxValidation}`,
1043
- `scopes=${scopes === 'ALL_SCOPES' ? scopes : scopes.map(s => s.toString()).join(', ')}`,
1173
+ `scopes=${scopes.map(s => s.toString()).join(', ')}`,
1044
1174
  );
1045
1175
  }
1046
1176
  });
@@ -1052,7 +1182,7 @@ export class PXE {
1052
1182
  */
1053
1183
  public executeUtility(
1054
1184
  call: FunctionCall,
1055
- { authwits, scopes }: ExecuteUtilityOpts = { scopes: 'ALL_SCOPES' },
1185
+ { authwits, scopes }: ExecuteUtilityOpts = { scopes: [] },
1056
1186
  ): Promise<UtilityExecutionResult> {
1057
1187
  // We disable concurrent executions since those might execute oracles which read and write to the PXE stores (e.g.
1058
1188
  // to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
@@ -1061,7 +1191,7 @@ export class PXE {
1061
1191
  try {
1062
1192
  const totalTimer = new Timer();
1063
1193
  const syncTimer = new Timer();
1064
- await this.blockStateSynchronizer.sync();
1194
+ await this.#maybeSync();
1065
1195
  const syncTime = syncTimer.ms();
1066
1196
  const functionTimer = new Timer();
1067
1197
  const contractFunctionSimulator = this.#getSimulatorForTx();
@@ -1110,7 +1240,7 @@ export class PXE {
1110
1240
  throw this.#contextualizeError(
1111
1241
  err,
1112
1242
  `executeUtility ${to}:${name}(${stringifiedArgs})`,
1113
- `scopes=${scopes === 'ALL_SCOPES' ? scopes : scopes.map(s => s.toString()).join(', ')}`,
1243
+ `scopes=${scopes.map(s => s.toString()).join(', ')}`,
1114
1244
  );
1115
1245
  }
1116
1246
  });
@@ -1136,7 +1266,7 @@ export class PXE {
1136
1266
  let anchorBlockNumber: BlockNumber;
1137
1267
 
1138
1268
  await this.#putInJobQueue(async jobId => {
1139
- await this.blockStateSynchronizer.sync();
1269
+ await this.#maybeSync();
1140
1270
 
1141
1271
  const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
1142
1272
  anchorBlockNumber = anchorBlockHeader.getBlockNumber();
@@ -1169,6 +1299,7 @@ export class PXE {
1169
1299
  */
1170
1300
  public async stop(): Promise<void> {
1171
1301
  await this.jobQueue.end();
1302
+ await this.blockStateSynchronizer.stop();
1172
1303
  await this.db.close();
1173
1304
  }
1174
1305
  }