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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (312) hide show
  1. package/dest/bin/check_oracle_version.d.ts +12 -2
  2. package/dest/bin/check_oracle_version.d.ts.map +1 -1
  3. package/dest/bin/check_oracle_version.js +31 -25
  4. package/dest/bin/index.d.ts +2 -0
  5. package/dest/bin/index.d.ts.map +1 -0
  6. package/dest/bin/index.js +1 -0
  7. package/dest/block_synchronizer/block_stream_source.d.ts +10 -0
  8. package/dest/block_synchronizer/block_stream_source.d.ts.map +1 -0
  9. package/dest/block_synchronizer/block_stream_source.js +62 -0
  10. package/dest/block_synchronizer/block_synchronizer.d.ts +6 -2
  11. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
  12. package/dest/block_synchronizer/block_synchronizer.js +30 -10
  13. package/dest/config/index.d.ts +8 -2
  14. package/dest/config/index.d.ts.map +1 -1
  15. package/dest/config/index.js +13 -15
  16. package/dest/contract_function_simulator/contract_function_simulator.d.ts +16 -5
  17. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  18. package/dest/contract_function_simulator/contract_function_simulator.js +53 -18
  19. package/dest/contract_function_simulator/ephemeral_array_service.d.ts +28 -0
  20. package/dest/contract_function_simulator/ephemeral_array_service.d.ts.map +1 -0
  21. package/dest/contract_function_simulator/ephemeral_array_service.js +78 -0
  22. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts +7 -11
  23. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts.map +1 -1
  24. package/dest/contract_function_simulator/execution_tagging_index_cache.js +19 -15
  25. package/dest/contract_function_simulator/index.d.ts +4 -1
  26. package/dest/contract_function_simulator/index.d.ts.map +1 -1
  27. package/dest/contract_function_simulator/index.js +3 -0
  28. package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts +48 -0
  29. package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts.map +1 -0
  30. package/dest/contract_function_simulator/noir-structs/bounded_vec.js +45 -0
  31. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +4 -6
  32. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts.map +1 -1
  33. package/dest/contract_function_simulator/noir-structs/event_validation_request.js +8 -9
  34. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts +13 -3
  35. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts.map +1 -1
  36. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.js +35 -4
  37. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts +2 -2
  38. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts.map +1 -1
  39. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.js +2 -4
  40. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +4 -7
  41. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts.map +1 -1
  42. package/dest/contract_function_simulator/noir-structs/note_validation_request.js +6 -10
  43. package/dest/contract_function_simulator/noir-structs/option.d.ts +61 -0
  44. package/dest/contract_function_simulator/noir-structs/option.d.ts.map +1 -0
  45. package/dest/contract_function_simulator/noir-structs/option.js +62 -0
  46. package/dest/contract_function_simulator/oracle/interfaces.d.ts +67 -51
  47. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  48. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts +2 -2
  49. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts.map +1 -1
  50. package/dest/contract_function_simulator/oracle/note_packing_utils.js +2 -2
  51. package/dest/contract_function_simulator/oracle/oracle.d.ts +74 -45
  52. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
  53. package/dest/contract_function_simulator/oracle/oracle.js +471 -287
  54. package/dest/contract_function_simulator/oracle/oracle_registry.d.ts +147 -0
  55. package/dest/contract_function_simulator/oracle/oracle_registry.d.ts.map +1 -0
  56. package/dest/contract_function_simulator/oracle/oracle_registry.js +1199 -0
  57. package/dest/contract_function_simulator/oracle/private_execution.js +5 -3
  58. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +44 -70
  59. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  60. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +96 -99
  61. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +112 -67
  62. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  63. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +395 -141
  64. package/dest/contract_function_simulator/pick_notes.d.ts +1 -1
  65. package/dest/contract_function_simulator/pick_notes.d.ts.map +1 -1
  66. package/dest/contract_function_simulator/pick_notes.js +20 -3
  67. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts +1 -1
  68. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts.map +1 -1
  69. package/dest/contract_function_simulator/proxied_contract_data_source.js +35 -64
  70. package/dest/contract_logging.d.ts +9 -4
  71. package/dest/contract_logging.d.ts.map +1 -1
  72. package/dest/contract_logging.js +21 -6
  73. package/dest/contract_sync/contract_sync_service.d.ts +7 -8
  74. package/dest/contract_sync/contract_sync_service.d.ts.map +1 -1
  75. package/dest/contract_sync/contract_sync_service.js +87 -49
  76. package/dest/contract_sync/helpers.d.ts +2 -4
  77. package/dest/contract_sync/helpers.d.ts.map +1 -1
  78. package/dest/contract_sync/helpers.js +12 -14
  79. package/dest/debug/pxe_debug_utils.d.ts +3 -8
  80. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  81. package/dest/debug/pxe_debug_utils.js +0 -6
  82. package/dest/entrypoints/client/bundle/index.d.ts +1 -2
  83. package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
  84. package/dest/entrypoints/client/bundle/index.js +0 -1
  85. package/dest/entrypoints/client/bundle/utils.d.ts +2 -2
  86. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  87. package/dest/entrypoints/client/bundle/utils.js +13 -5
  88. package/dest/entrypoints/client/lazy/index.d.ts +1 -2
  89. package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
  90. package/dest/entrypoints/client/lazy/index.js +0 -1
  91. package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
  92. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  93. package/dest/entrypoints/client/lazy/utils.js +13 -5
  94. package/dest/entrypoints/pxe_creation_options.d.ts +9 -1
  95. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  96. package/dest/entrypoints/pxe_creation_options.js +3 -1
  97. package/dest/entrypoints/server/index.d.ts +3 -3
  98. package/dest/entrypoints/server/index.d.ts.map +1 -1
  99. package/dest/entrypoints/server/index.js +2 -2
  100. package/dest/entrypoints/server/utils.d.ts +4 -3
  101. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  102. package/dest/entrypoints/server/utils.js +13 -5
  103. package/dest/events/event_service.d.ts +15 -6
  104. package/dest/events/event_service.d.ts.map +1 -1
  105. package/dest/events/event_service.js +44 -11
  106. package/dest/events/private_event_filter_validator.d.ts +3 -2
  107. package/dest/events/private_event_filter_validator.d.ts.map +1 -1
  108. package/dest/events/private_event_filter_validator.js +15 -0
  109. package/dest/hooks/authorize_utility_call.d.ts +41 -0
  110. package/dest/hooks/authorize_utility_call.d.ts.map +1 -0
  111. package/dest/hooks/authorize_utility_call.js +4 -0
  112. package/dest/hooks/execution_hooks.d.ts +42 -0
  113. package/dest/hooks/execution_hooks.d.ts.map +1 -0
  114. package/dest/hooks/execution_hooks.js +9 -0
  115. package/dest/hooks/index.d.ts +4 -0
  116. package/dest/hooks/index.d.ts.map +1 -0
  117. package/dest/hooks/index.js +1 -0
  118. package/dest/logs/log_service.d.ts +9 -9
  119. package/dest/logs/log_service.d.ts.map +1 -1
  120. package/dest/logs/log_service.js +122 -72
  121. package/dest/messages/message_context_service.d.ts +17 -0
  122. package/dest/messages/message_context_service.d.ts.map +1 -0
  123. package/dest/messages/message_context_service.js +38 -0
  124. package/dest/notes/note_service.d.ts +27 -6
  125. package/dest/notes/note_service.d.ts.map +1 -1
  126. package/dest/notes/note_service.js +80 -56
  127. package/dest/notes_filter.d.ts +2 -3
  128. package/dest/notes_filter.d.ts.map +1 -1
  129. package/dest/oracle_version.d.ts +4 -3
  130. package/dest/oracle_version.d.ts.map +1 -1
  131. package/dest/oracle_version.js +20 -10
  132. package/dest/private_kernel/batch_planner.d.ts +47 -0
  133. package/dest/private_kernel/batch_planner.d.ts.map +1 -0
  134. package/dest/private_kernel/batch_planner.js +104 -0
  135. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.js +1 -1
  136. package/dest/private_kernel/hints/test_utils.d.ts +1 -1
  137. package/dest/private_kernel/hints/test_utils.d.ts.map +1 -1
  138. package/dest/private_kernel/hints/test_utils.js +2 -3
  139. package/dest/private_kernel/private_kernel_execution_prover.d.ts +6 -2
  140. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  141. package/dest/private_kernel/private_kernel_execution_prover.js +152 -59
  142. package/dest/private_kernel/private_kernel_oracle.d.ts +10 -10
  143. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  144. package/dest/private_kernel/private_kernel_oracle.js +24 -22
  145. package/dest/pxe.d.ts +61 -11
  146. package/dest/pxe.d.ts.map +1 -1
  147. package/dest/pxe.js +162 -97
  148. package/dest/storage/anchor_block_store/anchor_block_store.js +1 -1
  149. package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.d.ts +42 -0
  150. package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.d.ts.map +1 -0
  151. package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.js +93 -0
  152. package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts +15 -0
  153. package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts.map +1 -0
  154. package/dest/storage/backwards_compatibility_tests/schema_tests.js +591 -0
  155. package/dest/storage/backwards_compatibility_tests/store_spy.d.ts +19 -0
  156. package/dest/storage/backwards_compatibility_tests/store_spy.d.ts.map +1 -0
  157. package/dest/storage/backwards_compatibility_tests/store_spy.js +63 -0
  158. package/dest/storage/capsule_store/capsule_service.d.ts +21 -0
  159. package/dest/storage/capsule_store/capsule_service.d.ts.map +1 -0
  160. package/dest/storage/capsule_store/capsule_service.js +50 -0
  161. package/dest/storage/capsule_store/capsule_store.d.ts +9 -9
  162. package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
  163. package/dest/storage/capsule_store/capsule_store.js +36 -28
  164. package/dest/storage/capsule_store/index.d.ts +2 -1
  165. package/dest/storage/capsule_store/index.d.ts.map +1 -1
  166. package/dest/storage/capsule_store/index.js +1 -0
  167. package/dest/storage/contract_store/contract_store.d.ts +1 -1
  168. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  169. package/dest/storage/contract_store/contract_store.js +9 -26
  170. package/dest/storage/metadata.d.ts +1 -1
  171. package/dest/storage/metadata.js +1 -1
  172. package/dest/storage/note_store/note_store.d.ts +1 -1
  173. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  174. package/dest/storage/note_store/note_store.js +2 -2
  175. package/dest/storage/open_pxe_stores.d.ts +33 -0
  176. package/dest/storage/open_pxe_stores.d.ts.map +1 -0
  177. package/dest/storage/open_pxe_stores.js +27 -0
  178. package/dest/storage/private_event_store/private_event_store.d.ts +1 -1
  179. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  180. package/dest/storage/private_event_store/private_event_store.js +3 -0
  181. package/dest/storage/private_event_store/stored_private_event.js +1 -1
  182. package/dest/storage/tagging_store/recipient_tagging_store.d.ts +6 -6
  183. package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
  184. package/dest/storage/tagging_store/sender_tagging_store.d.ts +29 -28
  185. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  186. package/dest/storage/tagging_store/sender_tagging_store.js +141 -115
  187. package/dest/tagging/get_all_logs_by_tags.d.ts +34 -10
  188. package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -1
  189. package/dest/tagging/get_all_logs_by_tags.js +36 -37
  190. package/dest/tagging/index.d.ts +6 -5
  191. package/dest/tagging/index.d.ts.map +1 -1
  192. package/dest/tagging/index.js +4 -3
  193. package/dest/tagging/persist_sender_tagging_index_ranges.d.ts +29 -0
  194. package/dest/tagging/persist_sender_tagging_index_ranges.d.ts.map +1 -0
  195. package/dest/tagging/persist_sender_tagging_index_ranges.js +42 -0
  196. package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts +56 -0
  197. package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts.map +1 -0
  198. package/dest/tagging/recipient_sync/sync_tagged_private_logs.js +163 -0
  199. package/dest/tagging/recipient_sync/utils/find_highest_indexes.d.ts +3 -3
  200. package/dest/tagging/recipient_sync/utils/find_highest_indexes.d.ts.map +1 -1
  201. package/dest/tagging/reconcile_tagging_index_ranges.d.ts +36 -0
  202. package/dest/tagging/reconcile_tagging_index_ranges.d.ts.map +1 -0
  203. package/dest/tagging/reconcile_tagging_index_ranges.js +74 -0
  204. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +4 -9
  205. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
  206. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +30 -14
  207. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +13 -7
  208. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
  209. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +41 -10
  210. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +5 -7
  211. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
  212. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +37 -25
  213. package/package.json +20 -17
  214. package/src/bin/check_oracle_version.ts +41 -31
  215. package/src/bin/index.ts +1 -0
  216. package/src/block_synchronizer/block_stream_source.ts +81 -0
  217. package/src/block_synchronizer/block_synchronizer.ts +33 -11
  218. package/src/config/index.ts +15 -9
  219. package/src/contract_function_simulator/contract_function_simulator.ts +82 -22
  220. package/src/contract_function_simulator/ephemeral_array_service.ts +110 -0
  221. package/src/contract_function_simulator/execution_tagging_index_cache.ts +19 -18
  222. package/src/contract_function_simulator/index.ts +3 -0
  223. package/src/contract_function_simulator/noir-structs/bounded_vec.ts +55 -0
  224. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +10 -9
  225. package/src/contract_function_simulator/noir-structs/log_retrieval_request.ts +36 -3
  226. package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +2 -5
  227. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +5 -10
  228. package/src/contract_function_simulator/noir-structs/option.ts +69 -0
  229. package/src/contract_function_simulator/oracle/interfaces.ts +85 -72
  230. package/src/contract_function_simulator/oracle/note_packing_utils.ts +3 -3
  231. package/src/contract_function_simulator/oracle/oracle.ts +558 -484
  232. package/src/contract_function_simulator/oracle/oracle_registry.ts +904 -0
  233. package/src/contract_function_simulator/oracle/private_execution.ts +4 -4
  234. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +120 -130
  235. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +543 -221
  236. package/src/contract_function_simulator/pick_notes.ts +22 -3
  237. package/src/contract_function_simulator/proxied_contract_data_source.ts +41 -64
  238. package/src/contract_logging.ts +18 -5
  239. package/src/contract_sync/contract_sync_service.ts +120 -83
  240. package/src/contract_sync/helpers.ts +13 -25
  241. package/src/debug/pxe_debug_utils.ts +3 -11
  242. package/src/entrypoints/client/bundle/index.ts +0 -1
  243. package/src/entrypoints/client/bundle/utils.ts +10 -5
  244. package/src/entrypoints/client/lazy/index.ts +0 -1
  245. package/src/entrypoints/client/lazy/utils.ts +10 -5
  246. package/src/entrypoints/pxe_creation_options.ts +14 -0
  247. package/src/entrypoints/server/index.ts +2 -2
  248. package/src/entrypoints/server/utils.ts +15 -6
  249. package/src/events/event_service.ts +69 -21
  250. package/src/events/private_event_filter_validator.ts +21 -1
  251. package/src/hooks/authorize_utility_call.ts +44 -0
  252. package/src/hooks/execution_hooks.ts +48 -0
  253. package/src/hooks/index.ts +7 -0
  254. package/src/logs/log_service.ts +153 -129
  255. package/src/messages/message_context_service.ts +45 -0
  256. package/src/notes/note_service.ts +119 -85
  257. package/src/notes_filter.ts +1 -3
  258. package/src/oracle_version.ts +20 -10
  259. package/src/private_kernel/batch_planner.ts +169 -0
  260. package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +1 -1
  261. package/src/private_kernel/hints/test_utils.ts +2 -9
  262. package/src/private_kernel/private_kernel_execution_prover.ts +240 -82
  263. package/src/private_kernel/private_kernel_oracle.ts +35 -25
  264. package/src/pxe.ts +270 -102
  265. package/src/storage/anchor_block_store/anchor_block_store.ts +1 -1
  266. package/src/storage/backwards_compatibility_tests/__snapshots__/AddressStore.json +22 -0
  267. package/src/storage/backwards_compatibility_tests/__snapshots__/AnchorBlockStore.json +3 -0
  268. package/src/storage/backwards_compatibility_tests/__snapshots__/CapsuleStore.json +16 -0
  269. package/src/storage/backwards_compatibility_tests/__snapshots__/ContractStore.json +28 -0
  270. package/src/storage/backwards_compatibility_tests/__snapshots__/KeyStore.json +52 -0
  271. package/src/storage/backwards_compatibility_tests/__snapshots__/L2TipsKVStore.json +46 -0
  272. package/src/storage/backwards_compatibility_tests/__snapshots__/NoteStore.json +36 -0
  273. package/src/storage/backwards_compatibility_tests/__snapshots__/PrivateEventStore.json +44 -0
  274. package/src/storage/backwards_compatibility_tests/__snapshots__/RecipientTaggingStore.json +18 -0
  275. package/src/storage/backwards_compatibility_tests/__snapshots__/SenderAddressBookStore.json +16 -0
  276. package/src/storage/backwards_compatibility_tests/__snapshots__/SenderTaggingStore.json +22 -0
  277. package/src/storage/backwards_compatibility_tests/__snapshots__/opened_stores.json +97 -0
  278. package/src/storage/backwards_compatibility_tests/kv_store_snapshot.ts +122 -0
  279. package/src/storage/backwards_compatibility_tests/schema_tests.ts +712 -0
  280. package/src/storage/backwards_compatibility_tests/store_spy.ts +73 -0
  281. package/src/storage/capsule_store/capsule_service.ts +90 -0
  282. package/src/storage/capsule_store/capsule_store.ts +44 -26
  283. package/src/storage/capsule_store/index.ts +1 -0
  284. package/src/storage/contract_store/contract_store.ts +14 -35
  285. package/src/storage/metadata.ts +1 -1
  286. package/src/storage/note_store/note_store.ts +2 -5
  287. package/src/storage/open_pxe_stores.ts +49 -0
  288. package/src/storage/private_event_store/private_event_store.ts +4 -0
  289. package/src/storage/private_event_store/stored_private_event.ts +1 -1
  290. package/src/storage/tagging_store/recipient_tagging_store.ts +5 -5
  291. package/src/storage/tagging_store/sender_tagging_store.ts +185 -138
  292. package/src/tagging/get_all_logs_by_tags.ts +78 -50
  293. package/src/tagging/index.ts +5 -4
  294. package/src/tagging/persist_sender_tagging_index_ranges.ts +57 -0
  295. package/src/tagging/recipient_sync/sync_tagged_private_logs.ts +240 -0
  296. package/src/tagging/recipient_sync/utils/find_highest_indexes.ts +2 -2
  297. package/src/tagging/reconcile_tagging_index_ranges.ts +102 -0
  298. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +52 -17
  299. package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +44 -14
  300. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +27 -27
  301. package/dest/access_scopes.d.ts +0 -9
  302. package/dest/access_scopes.d.ts.map +0 -1
  303. package/dest/access_scopes.js +0 -6
  304. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +0 -15
  305. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +0 -1
  306. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +0 -99
  307. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +0 -15
  308. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +0 -1
  309. package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +0 -32
  310. package/src/access_scopes.ts +0 -9
  311. package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +0 -143
  312. package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +0 -49
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,7 +66,9 @@ 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
+ import { MessageContextService } from './messages/message_context_service.js';
71
72
  import {
72
73
  PrivateKernelExecutionProver,
73
74
  type PrivateKernelExecutionProverConfig,
@@ -78,16 +79,26 @@ import { AnchorBlockStore } from './storage/anchor_block_store/anchor_block_stor
78
79
  import { CapsuleStore } from './storage/capsule_store/capsule_store.js';
79
80
  import { ContractStore } from './storage/contract_store/contract_store.js';
80
81
  import { NoteStore } from './storage/note_store/note_store.js';
82
+ import { openPxeStores } from './storage/open_pxe_stores.js';
81
83
  import { PrivateEventStore } from './storage/private_event_store/private_event_store.js';
82
84
  import { RecipientTaggingStore } from './storage/tagging_store/recipient_tagging_store.js';
83
85
  import { SenderAddressBookStore } from './storage/tagging_store/sender_address_book_store.js';
84
86
  import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store.js';
87
+ import { persistSenderTaggingIndexRangesForTx } from './tagging/index.js';
85
88
 
86
89
  export type PackedPrivateEvent = InTx & {
87
90
  packedEvent: Fr[];
88
91
  eventSelector: EventSelector;
89
92
  };
90
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
+
91
102
  /** Options for PXE.profileTx. */
92
103
  export type ProfileTxOpts = {
93
104
  /** The profiling mode to use. */
@@ -95,7 +106,9 @@ export type ProfileTxOpts = {
95
106
  /** If true, proof generation is skipped during profiling. Defaults to true. */
96
107
  skipProofGeneration?: boolean;
97
108
  /** Addresses whose private state and keys are accessible during private execution. */
98
- 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;
99
112
  };
100
113
 
101
114
  /** Options for PXE.simulateTx. */
@@ -106,10 +119,18 @@ export type SimulateTxOpts = {
106
119
  skipTxValidation?: boolean;
107
120
  /** If false, fees are enforced. */
108
121
  skipFeeEnforcement?: boolean;
109
- /** State overrides for the simulation, such as contract instances and artifacts. */
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
+ */
110
129
  overrides?: SimulationOverrides;
111
130
  /** Addresses whose private state and keys are accessible during private execution */
112
- 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;
113
134
  };
114
135
 
115
136
  /** Options for PXE.executeUtility. */
@@ -117,7 +138,22 @@ export type ExecuteUtilityOpts = {
117
138
  /** The authentication witnesses required for the function call. */
118
139
  authwits?: AuthWitness[];
119
140
  /** The accounts whose notes we can access in this call */
120
- 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 }>>;
121
157
  };
122
158
 
123
159
  /** Args for PXE.create. */
@@ -132,10 +168,14 @@ export type PXECreateArgs = {
132
168
  simulator: CircuitSimulator;
133
169
  /** Provider for protocol contract artifacts and instances. */
134
170
  protocolContractsProvider: ProtocolContractsProvider;
171
+ /** Provider for the "nice to have" contracts the PXE preloads. */
172
+ preloadedContractsProvider: PreloadedContractsProvider;
135
173
  /** PXE configuration options. */
136
174
  config: PXEConfig;
137
175
  /** Optional logger instance or string suffix for the logger name. */
138
176
  loggerOrSuffix?: string | Logger;
177
+ /** Optional hooks to observe and influence contract execution. */
178
+ hooks?: ExecutionHooks;
139
179
  };
140
180
 
141
181
  /**
@@ -145,6 +185,7 @@ export type PXECreateArgs = {
145
185
  export class PXE {
146
186
  private constructor(
147
187
  private node: AztecNode,
188
+ private db: AztecAsyncKVStore,
148
189
  private blockStateSynchronizer: BlockSynchronizer,
149
190
  private keyStore: KeyStore,
150
191
  private contractStore: ContractStore,
@@ -157,14 +198,19 @@ export class PXE {
157
198
  private addressStore: AddressStore,
158
199
  private privateEventStore: PrivateEventStore,
159
200
  private contractSyncService: ContractSyncService,
201
+ private messageContextService: MessageContextService,
202
+ private l2TipsStore: L2TipsProvider,
160
203
  private simulator: CircuitSimulator,
161
204
  private proverEnabled: boolean,
205
+ private autoSync: boolean,
162
206
  private proofCreator: PrivateKernelProver,
163
207
  private protocolContractsProvider: ProtocolContractsProvider,
208
+ private preloadedContractsProvider: PreloadedContractsProvider,
164
209
  private log: Logger,
165
210
  private jobQueue: SerialQueue,
166
211
  private jobCoordinator: JobCoordinator,
167
212
  public debug: PXEDebugUtils,
213
+ private hooks: ExecutionHooks | undefined,
168
214
  ) {}
169
215
 
170
216
  /**
@@ -180,8 +226,10 @@ export class PXE {
180
226
  proofCreator,
181
227
  simulator,
182
228
  protocolContractsProvider,
229
+ preloadedContractsProvider,
183
230
  config,
184
231
  loggerOrSuffix,
232
+ hooks,
185
233
  }: PXECreateArgs) {
186
234
  // Extract bindings from the logger, or use empty bindings if a string suffix is provided.
187
235
  const bindings: LoggerBindings | undefined =
@@ -194,31 +242,43 @@ export class PXE {
194
242
 
195
243
  const info = await node.getNodeInfo();
196
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
+
197
253
  const proverEnabled = config.proverEnabled !== undefined ? config.proverEnabled : info.realProofs;
198
- const addressStore = new AddressStore(store);
199
- const privateEventStore = new PrivateEventStore(store);
200
- const contractStore = new ContractStore(store);
201
- const noteStore = new NoteStore(store);
202
- const anchorBlockStore = new AnchorBlockStore(store);
203
- const senderTaggingStore = new SenderTaggingStore(store);
204
- const senderAddressBookStore = new SenderAddressBookStore(store);
205
- const recipientTaggingStore = new RecipientTaggingStore(store);
206
- const capsuleStore = new CapsuleStore(store);
207
- const keyStore = new KeyStore(store);
208
- 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);
209
267
  const contractSyncService = new ContractSyncService(
210
268
  node,
211
269
  contractStore,
212
270
  noteStore,
213
271
  createLogger('pxe:contract_sync', bindings),
214
272
  );
273
+ const messageContextService = new MessageContextService(node);
274
+
215
275
  const synchronizer = new BlockSynchronizer(
216
276
  node,
217
277
  store,
218
278
  anchorBlockStore,
219
279
  noteStore,
220
280
  privateEventStore,
221
- tipsStore,
281
+ l2TipsStore,
222
282
  contractSyncService,
223
283
  config,
224
284
  bindings,
@@ -240,6 +300,7 @@ export class PXE {
240
300
 
241
301
  const pxe = new PXE(
242
302
  node,
303
+ store,
243
304
  synchronizer,
244
305
  keyStore,
245
306
  contractStore,
@@ -252,14 +313,19 @@ export class PXE {
252
313
  addressStore,
253
314
  privateEventStore,
254
315
  contractSyncService,
316
+ messageContextService,
317
+ l2TipsStore,
255
318
  simulator,
256
319
  proverEnabled,
320
+ config.autoSync,
257
321
  proofCreator,
258
322
  protocolContractsProvider,
323
+ preloadedContractsProvider,
259
324
  log,
260
325
  jobQueue,
261
326
  jobCoordinator,
262
327
  debugUtils,
328
+ hooks,
263
329
  );
264
330
 
265
331
  debugUtils.setPXEHelpers(
@@ -270,7 +336,7 @@ export class PXE {
270
336
 
271
337
  pxe.jobQueue.start();
272
338
 
273
- await pxe.#registerProtocolContracts();
339
+ await Promise.all([pxe.#registerProtocolContracts(), pxe.#registerPreloadedContracts()]);
274
340
  log.info(`Started PXE connected to chain ${info.l1ChainId} version ${info.rollupVersion}`);
275
341
  return pxe;
276
342
  }
@@ -286,6 +352,7 @@ export class PXE {
286
352
  keyStore: this.keyStore,
287
353
  addressStore: this.addressStore,
288
354
  aztecNode: BenchmarkedNodeFactory.create(this.node),
355
+ l2TipsStore: this.l2TipsStore,
289
356
  senderTaggingStore: this.senderTaggingStore,
290
357
  recipientTaggingStore: this.recipientTaggingStore,
291
358
  senderAddressBookStore: this.senderAddressBookStore,
@@ -293,6 +360,8 @@ export class PXE {
293
360
  privateEventStore: this.privateEventStore,
294
361
  simulator: this.simulator,
295
362
  contractSyncService: this.contractSyncService,
363
+ messageContextService: this.messageContextService,
364
+ hooks: this.hooks,
296
365
  });
297
366
  }
298
367
 
@@ -343,29 +412,48 @@ export class PXE {
343
412
  }
344
413
 
345
414
  async #registerProtocolContracts() {
346
- const registered: Record<string, string> = {};
347
- for (const name of protocolContractNames) {
348
- const { address, instance, artifact } = await this.protocolContractsProvider.getProtocolContractArtifact(name);
349
- await this.contractStore.addContractArtifact(artifact);
350
- await this.contractStore.addContractInstance(instance);
351
- registered[name] = address.toString();
352
- }
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
+ );
353
426
  this.log.verbose(`Registered protocol contracts in pxe`, registered);
354
427
  }
355
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
+
356
437
  // Executes the entrypoint private function, as well as all nested private
357
438
  // functions that might arise.
358
- async #executePrivate(
359
- contractFunctionSimulator: ContractFunctionSimulator,
360
- txRequest: TxExecutionRequest,
361
- scopes: AccessScopes,
362
- jobId: string,
363
- ): 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> {
364
454
  const { origin: contractAddress, functionSelector } = txRequest;
365
455
 
366
456
  try {
367
- const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
368
-
369
457
  await this.contractSyncService.ensureContractSynced(
370
458
  contractAddress,
371
459
  functionSelector,
@@ -382,6 +470,7 @@ export class PXE {
382
470
  anchorBlockHeader,
383
471
  scopes,
384
472
  jobId,
473
+ senderForTags,
385
474
  });
386
475
  this.log.debug(`Private simulation completed for ${contractAddress.toString()}:${functionSelector}`);
387
476
  return result;
@@ -407,12 +496,19 @@ export class PXE {
407
496
  contractFunctionSimulator: ContractFunctionSimulator,
408
497
  call: FunctionCall,
409
498
  authWitnesses: AuthWitness[] | undefined,
410
- scopes: AccessScopes,
499
+ scopes: AztecAddress[],
411
500
  jobId: string,
412
501
  ) {
413
502
  try {
414
503
  const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
415
- return contractFunctionSimulator.runUtility(call, authWitnesses ?? [], anchorBlockHeader, scopes, jobId);
504
+ const { result, offchainEffects } = await contractFunctionSimulator.runUtility(
505
+ call,
506
+ authWitnesses ?? [],
507
+ anchorBlockHeader,
508
+ scopes,
509
+ jobId,
510
+ );
511
+ return { result, offchainEffects };
416
512
  } catch (err) {
417
513
  if (err instanceof SimulationError) {
418
514
  await enrichSimulationError(err, this.contractStore, this.log);
@@ -427,11 +523,11 @@ export class PXE {
427
523
  * It can also be used for estimating gas in the future.
428
524
  * @param tx - The transaction to be simulated.
429
525
  */
430
- async #simulatePublicCalls(tx: Tx, skipFeeEnforcement: boolean) {
526
+ async #simulatePublicCalls(tx: Tx, skipFeeEnforcement: boolean, overrides?: SimulationOverrides) {
431
527
  // Simulating public calls can throw if the TX fails in a phase that doesn't allow reverts (setup)
432
528
  // Or return as reverted if it fails in a phase that allows reverts (app logic, teardown)
433
529
  try {
434
- const result = await this.node.simulatePublicCalls(tx, skipFeeEnforcement);
530
+ const result = await this.node.simulatePublicCalls(tx, skipFeeEnforcement, overrides);
435
531
  if (result.revertReason) {
436
532
  throw result.revertReason;
437
533
  }
@@ -463,11 +559,10 @@ export class PXE {
463
559
  txExecutionRequest: TxExecutionRequest,
464
560
  proofCreator: PrivateKernelProver,
465
561
  privateExecutionResult: PrivateExecutionResult,
562
+ anchorBlockHeader: BlockHeader,
466
563
  config: PrivateKernelExecutionProverConfig,
467
564
  ): Promise<PrivateKernelExecutionProofOutput<PrivateKernelTailCircuitPublicInputs>> {
468
- const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
469
- const anchorBlockHash = await anchorBlockHeader.hash();
470
- const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHash);
565
+ const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHeader);
471
566
  const kernelTraceProver = new PrivateKernelExecutionProver(
472
567
  kernelOracle,
473
568
  proofCreator,
@@ -478,14 +573,36 @@ export class PXE {
478
573
  return await kernelTraceProver.proveWithKernels(txExecutionRequest.toTxRequest(), privateExecutionResult, config);
479
574
  }
480
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
+
481
587
  // Public API
482
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
+
483
598
  /**
484
599
  * Returns the block header up to which the PXE has synced.
485
600
  * @returns The synced block header
486
601
  */
487
602
  public getSyncedBlockHeader(): Promise<BlockHeader> {
488
- return this.anchorBlockStore.getBlockHeader();
603
+ return this.#putInJobQueue(() => {
604
+ return this.anchorBlockStore.getBlockHeader();
605
+ });
489
606
  }
490
607
 
491
608
  /**
@@ -519,7 +636,7 @@ export class PXE {
519
636
  public async registerAccount(secretKey: Fr, partialAddress: PartialAddress): Promise<CompleteAddress> {
520
637
  const accounts = await this.keyStore.getAccounts();
521
638
  const accountCompleteAddress = await this.keyStore.addAccount(secretKey, partialAddress);
522
- if (accounts.includes(accountCompleteAddress.address)) {
639
+ if (accounts.some(a => a.equals(accountCompleteAddress.address))) {
523
640
  this.log.info(`Account:\n "${accountCompleteAddress.address.toString()}"\n already registered.`);
524
641
  return accountCompleteAddress;
525
642
  } else {
@@ -542,8 +659,14 @@ export class PXE {
542
659
  * TODO: It's strange that we return the address here and I (benesjan) think we should drop the return value.
543
660
  */
544
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
+
545
668
  const accounts = await this.keyStore.getAccounts();
546
- if (accounts.includes(sender)) {
669
+ if (accounts.some(a => a.equals(sender))) {
547
670
  this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
548
671
  return sender;
549
672
  }
@@ -552,6 +675,9 @@ export class PXE {
552
675
 
553
676
  if (wasAdded) {
554
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()));
555
681
  } else {
556
682
  this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
557
683
  }
@@ -635,7 +761,9 @@ export class PXE {
635
761
  const publicFunctionSignatures = artifact.functions
636
762
  .filter(fn => fn.functionType === FunctionType.PUBLIC)
637
763
  .map(fn => decodeFunctionSignature(fn.name, fn.parameters));
638
- await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
764
+ if (publicFunctionSignatures.length > 0) {
765
+ await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
766
+ }
639
767
  } else {
640
768
  // Otherwise, make sure there is an artifact already registered for that class id
641
769
  artifact = await this.contractStore.getContractArtifact(instance.currentContractClassId);
@@ -670,7 +798,7 @@ export class PXE {
670
798
  throw new Error(`Instance not found when updating a contract. Contract address: ${contractAddress}.`);
671
799
  }
672
800
  const contractClass = await getContractClassFromArtifact(artifact);
673
- await this.blockStateSynchronizer.sync();
801
+ await this.#maybeSync();
674
802
 
675
803
  const header = await this.anchorBlockStore.getBlockHeader();
676
804
 
@@ -682,7 +810,9 @@ export class PXE {
682
810
  const publicFunctionSignatures = artifact.functions
683
811
  .filter(fn => fn.functionType === FunctionType.PUBLIC)
684
812
  .map(fn => decodeFunctionSignature(fn.name, fn.parameters));
685
- await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
813
+ if (publicFunctionSignatures.length > 0) {
814
+ await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
815
+ }
686
816
 
687
817
  currentInstance.currentContractClassId = contractClass.id;
688
818
  await Promise.all([
@@ -711,7 +841,7 @@ export class PXE {
711
841
  * @throws If contract code not found, or public simulation reverts.
712
842
  * Also throws if simulatePublic is true and public simulation reverts.
713
843
  */
714
- public proveTx(txRequest: TxExecutionRequest, scopes: AztecAddress[]): Promise<TxProvingResult> {
844
+ public proveTx(txRequest: TxExecutionRequest, { scopes, senderForTags }: ProveTxOpts): Promise<TxProvingResult> {
715
845
  let privateExecutionResult: PrivateExecutionResult;
716
846
  // We disable proving concurrently mostly out of caution, since it accesses some of our stores. Proving is so
717
847
  // computationally demanding that it'd be rare for someone to try to do it concurrently regardless.
@@ -719,17 +849,25 @@ export class PXE {
719
849
  const totalTimer = new Timer();
720
850
  try {
721
851
  const syncTimer = new Timer();
722
- await this.blockStateSynchronizer.sync();
852
+ await this.#maybeSync();
853
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
723
854
  const syncTime = syncTimer.ms();
724
855
  const contractFunctionSimulator = this.#getSimulatorForTx();
725
- 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
+ });
726
864
 
727
865
  const {
728
866
  publicInputs,
729
867
  chonkProof,
730
868
  executionSteps,
731
869
  timings: { proving } = {},
732
- } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
870
+ } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, anchorBlockHeader, {
733
871
  simulate: false,
734
872
  skipFeeEnforcement: false,
735
873
  profileMode: 'none',
@@ -759,23 +897,20 @@ export class PXE {
759
897
  nodeRPCCalls: contractFunctionSimulator?.getStats().nodeRPCCalls,
760
898
  });
761
899
 
762
- // While not strictly necessary to store tagging cache contents in the DB since we sync tagging indexes from
763
- // chain before sending new logs, the sync can only see logs already included in blocks. If we send another
764
- // transaction before this one is included in a block from this PXE, and that transaction contains a log with
765
- // a tag derived from the same secret, we would reuse the tag and the transactions would be linked. Hence
766
- // storing the tags here prevents linkage of txs sent from the same PXE.
767
- const preTagsUsedInTheTx = privateExecutionResult.entrypoint.preTags;
768
- if (preTagsUsedInTheTx.length > 0) {
769
- // TODO(benesjan): The following is an expensive operation. Figure out a way to avoid it.
770
- const txHash = (await txProvingResult.toTx()).txHash;
771
-
772
- await this.senderTaggingStore.storePendingIndexes(preTagsUsedInTheTx, txHash, jobId);
773
- this.log.debug(`Stored used pre-tags as sender for the tx`, {
774
- preTagsUsedInTheTx,
775
- });
776
- } else {
777
- this.log.debug(`No pre-tags used in the tx`);
778
- }
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
+ );
779
914
 
780
915
  return txProvingResult;
781
916
  } catch (err: any) {
@@ -792,7 +927,7 @@ export class PXE {
792
927
  */
793
928
  public profileTx(
794
929
  txRequest: TxExecutionRequest,
795
- { profileMode, skipProofGeneration = true, scopes }: ProfileTxOpts,
930
+ { profileMode, skipProofGeneration = true, scopes, senderForTags }: ProfileTxOpts,
796
931
  ): Promise<TxProfileResult> {
797
932
  // We disable concurrent profiles for consistency with simulateTx.
798
933
  return this.#putInJobQueue(async jobId => {
@@ -811,16 +946,25 @@ export class PXE {
811
946
  txInfo,
812
947
  );
813
948
  const syncTimer = new Timer();
814
- await this.blockStateSynchronizer.sync();
949
+ await this.#maybeSync();
950
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
815
951
  const syncTime = syncTimer.ms();
816
952
 
817
953
  const contractFunctionSimulator = this.#getSimulatorForTx();
818
- 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
+ });
819
962
 
820
963
  const { executionSteps, timings: { proving } = {} } = await this.#prove(
821
964
  txRequest,
822
965
  this.proofCreator,
823
966
  privateExecutionResult,
967
+ anchorBlockHeader,
824
968
  {
825
969
  simulate: skipProofGeneration,
826
970
  skipFeeEnforcement: false,
@@ -881,7 +1025,15 @@ export class PXE {
881
1025
  */
882
1026
  public simulateTx(
883
1027
  txRequest: TxExecutionRequest,
884
- { simulatePublic, skipTxValidation = false, skipFeeEnforcement = false, overrides, scopes }: SimulateTxOpts,
1028
+ {
1029
+ simulatePublic,
1030
+ skipTxValidation = false,
1031
+ skipFeeEnforcement = false,
1032
+ skipKernels = true,
1033
+ overrides,
1034
+ scopes,
1035
+ senderForTags,
1036
+ }: SimulateTxOpts,
885
1037
  ): Promise<TxSimulationResult> {
886
1038
  // We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
887
1039
  // to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
@@ -902,24 +1054,26 @@ export class PXE {
902
1054
  txInfo,
903
1055
  );
904
1056
  const syncTimer = new Timer();
905
- await this.blockStateSynchronizer.sync();
1057
+ await this.#maybeSync();
1058
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
906
1059
  const syncTime = syncTimer.ms();
907
1060
 
908
- const contractFunctionSimulator = this.#getSimulatorForTx(overrides);
909
- // Temporary: in case there are overrides, we have to skip the kernels or validations
910
- // will fail. Consider handing control to the user/wallet on whether they want to run them
911
- // or not.
912
- const overriddenContracts = overrides?.contracts ? new Set(Object.keys(overrides.contracts)) : undefined;
913
- const hasOverriddenContracts = overriddenContracts !== undefined && overriddenContracts.size > 0;
914
- const skipKernels = hasOverriddenContracts;
915
-
916
- // Set overridden contracts on the sync service so it knows to skip syncing them
917
- if (hasOverriddenContracts) {
918
- this.contractSyncService.setOverriddenContracts(jobId, overriddenContracts);
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
+ );
919
1065
  }
1066
+ const contractFunctionSimulator = this.#getSimulatorForTx(overrides);
920
1067
 
921
1068
  // Execution of private functions only; no proving, and no kernel logic.
922
- 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
+ });
923
1077
 
924
1078
  let publicInputs: PrivateKernelTailCircuitPublicInputs | undefined;
925
1079
  let executionSteps: PrivateExecutionStep[] = [];
@@ -932,11 +1086,17 @@ export class PXE {
932
1086
  ));
933
1087
  } else {
934
1088
  // Kernel logic, plus proving of all private functions and kernels.
935
- ({ publicInputs, executionSteps } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
936
- simulate: true,
937
- skipFeeEnforcement,
938
- profileMode: 'none',
939
- }));
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
+ ));
940
1100
  }
941
1101
 
942
1102
  const privateSimulationResult = new PrivateSimulationResult(privateExecutionResult, publicInputs);
@@ -945,7 +1105,7 @@ export class PXE {
945
1105
  let publicOutput: PublicSimulationOutput | undefined;
946
1106
  if (simulatePublic && publicInputs.forPublic) {
947
1107
  const publicSimulationTimer = new Timer();
948
- publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement);
1108
+ publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement, overrides);
949
1109
  publicSimulationTime = publicSimulationTimer.ms();
950
1110
  if (publicOutput?.debugLogs?.length) {
951
1111
  await displayDebugLogs(publicOutput.debugLogs, addr => this.contractStore.getDebugContractName(addr));
@@ -958,7 +1118,8 @@ export class PXE {
958
1118
  const validationResult = await this.node.isValidTx(simulatedTx, { isSimulation: true, skipFeeEnforcement });
959
1119
  validationTime = validationTimer.ms();
960
1120
  if (validationResult.result === 'invalid') {
961
- throw new Error('The simulated transaction is unable to be added to state and is invalid.');
1121
+ const reason = validationResult.reason.length > 0 ? ` Reason: ${validationResult.reason.join(', ')}` : '';
1122
+ throw new Error(`The simulated transaction is unable to be added to state and is invalid.${reason}`);
962
1123
  }
963
1124
  }
964
1125
 
@@ -1009,7 +1170,7 @@ export class PXE {
1009
1170
  inspect(txRequest),
1010
1171
  `simulatePublic=${simulatePublic}`,
1011
1172
  `skipTxValidation=${skipTxValidation}`,
1012
- `scopes=${scopes === 'ALL_SCOPES' ? scopes : scopes.map(s => s.toString()).join(', ')}`,
1173
+ `scopes=${scopes.map(s => s.toString()).join(', ')}`,
1013
1174
  );
1014
1175
  }
1015
1176
  });
@@ -1021,7 +1182,7 @@ export class PXE {
1021
1182
  */
1022
1183
  public executeUtility(
1023
1184
  call: FunctionCall,
1024
- { authwits, scopes }: ExecuteUtilityOpts = { scopes: 'ALL_SCOPES' },
1185
+ { authwits, scopes }: ExecuteUtilityOpts = { scopes: [] },
1025
1186
  ): Promise<UtilityExecutionResult> {
1026
1187
  // We disable concurrent executions since those might execute oracles which read and write to the PXE stores (e.g.
1027
1188
  // to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
@@ -1030,7 +1191,7 @@ export class PXE {
1030
1191
  try {
1031
1192
  const totalTimer = new Timer();
1032
1193
  const syncTimer = new Timer();
1033
- await this.blockStateSynchronizer.sync();
1194
+ await this.#maybeSync();
1034
1195
  const syncTime = syncTimer.ms();
1035
1196
  const functionTimer = new Timer();
1036
1197
  const contractFunctionSimulator = this.#getSimulatorForTx();
@@ -1046,7 +1207,7 @@ export class PXE {
1046
1207
  scopes,
1047
1208
  );
1048
1209
 
1049
- const executionResult = await this.#executeUtility(
1210
+ const { result: executionResult, offchainEffects } = await this.#executeUtility(
1050
1211
  contractFunctionSimulator,
1051
1212
  call,
1052
1213
  authwits ?? [],
@@ -1067,14 +1228,19 @@ export class PXE {
1067
1228
  };
1068
1229
 
1069
1230
  const simulationStats = contractFunctionSimulator.getStats();
1070
- return { result: executionResult, stats: { timings, nodeRPCCalls: simulationStats.nodeRPCCalls } };
1231
+ return {
1232
+ result: executionResult,
1233
+ offchainEffects,
1234
+ anchorBlockTimestamp: anchorBlockHeader.globalVariables.timestamp,
1235
+ stats: { timings, nodeRPCCalls: simulationStats.nodeRPCCalls },
1236
+ };
1071
1237
  } catch (err: any) {
1072
1238
  const { to, name, args } = call;
1073
1239
  const stringifiedArgs = args.map(arg => arg.toString()).join(', ');
1074
1240
  throw this.#contextualizeError(
1075
1241
  err,
1076
1242
  `executeUtility ${to}:${name}(${stringifiedArgs})`,
1077
- `scopes=${scopes === 'ALL_SCOPES' ? scopes : scopes.map(s => s.toString()).join(', ')}`,
1243
+ `scopes=${scopes.map(s => s.toString()).join(', ')}`,
1078
1244
  );
1079
1245
  }
1080
1246
  });
@@ -1100,7 +1266,7 @@ export class PXE {
1100
1266
  let anchorBlockNumber: BlockNumber;
1101
1267
 
1102
1268
  await this.#putInJobQueue(async jobId => {
1103
- await this.blockStateSynchronizer.sync();
1269
+ await this.#maybeSync();
1104
1270
 
1105
1271
  const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
1106
1272
  anchorBlockNumber = anchorBlockHeader.getBlockNumber();
@@ -1129,9 +1295,11 @@ export class PXE {
1129
1295
  }
1130
1296
 
1131
1297
  /**
1132
- * Stops the PXE's job queue.
1298
+ * Stops the PXE's job queue and closes the backing store.
1133
1299
  */
1134
- public stop(): Promise<void> {
1135
- return this.jobQueue.end();
1300
+ public async stop(): Promise<void> {
1301
+ await this.jobQueue.end();
1302
+ await this.blockStateSynchronizer.stop();
1303
+ await this.db.close();
1136
1304
  }
1137
1305
  }