@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
@@ -1,5 +1,6 @@
1
1
  import { BlockNumber } from '@aztec/foundation/branded-types';
2
2
  import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
3
+ import { SerialQueue } from '@aztec/foundation/queue';
3
4
  import type { AztecAsyncKVStore } from '@aztec/kv-store';
4
5
  import type { L2TipsKVStore } from '@aztec/kv-store/stores';
5
6
  import { BlockHash, L2BlockStream, type L2BlockStreamEvent, type L2BlockStreamEventHandler } from '@aztec/stdlib/block';
@@ -11,6 +12,7 @@ import type { ContractSyncService } from '../contract_sync/contract_sync_service
11
12
  import type { AnchorBlockStore } from '../storage/anchor_block_store/anchor_block_store.js';
12
13
  import type { NoteStore } from '../storage/note_store/note_store.js';
13
14
  import type { PrivateEventStore } from '../storage/private_event_store/private_event_store.js';
15
+ import { blockStreamSourceFromAztecNode } from './block_stream_source.js';
14
16
 
15
17
  /**
16
18
  * The BlockSynchronizer class orchestrates synchronization between PXE and Aztec node, maintaining an up-to-date
@@ -20,6 +22,7 @@ import type { PrivateEventStore } from '../storage/private_event_store/private_e
20
22
  export class BlockSynchronizer implements L2BlockStreamEventHandler {
21
23
  private log: Logger;
22
24
  private isSyncing: Promise<void> | undefined;
25
+ private readonly eventQueue = new SerialQueue();
23
26
  protected readonly blockStream: L2BlockStream;
24
27
 
25
28
  constructor(
@@ -35,11 +38,12 @@ export class BlockSynchronizer implements L2BlockStreamEventHandler {
35
38
  ) {
36
39
  this.log = createLogger('pxe:block_synchronizer', bindings);
37
40
  this.blockStream = this.createBlockStream(config);
41
+ this.eventQueue.start();
38
42
  }
39
43
 
40
44
  protected createBlockStream(config: Partial<BlockSynchronizerConfig>): L2BlockStream {
41
45
  return new L2BlockStream(
42
- this.node,
46
+ blockStreamSourceFromAztecNode(this.node),
43
47
  this.l2TipsStore,
44
48
  this,
45
49
  createLogger('pxe:block_stream', this.log.getBindings()),
@@ -52,8 +56,12 @@ export class BlockSynchronizer implements L2BlockStreamEventHandler {
52
56
  );
53
57
  }
54
58
 
55
- /** Handle events emitted by the block stream. */
56
- public async handleBlockStreamEvent(event: L2BlockStreamEvent): Promise<void> {
59
+ /** Handle events emitted by the block stream. Serialized to prevent concurrent mutations to anchor state. */
60
+ public handleBlockStreamEvent(event: L2BlockStreamEvent): Promise<void> {
61
+ return this.eventQueue.put(() => this.doHandleBlockStreamEvent(event));
62
+ }
63
+
64
+ private async doHandleBlockStreamEvent(event: L2BlockStreamEvent): Promise<void> {
57
65
  await this.l2TipsStore.handleBlockStreamEvent(event);
58
66
 
59
67
  switch (event.type) {
@@ -74,18 +82,22 @@ export class BlockSynchronizer implements L2BlockStreamEventHandler {
74
82
  }
75
83
  case 'chain-proven': {
76
84
  if (this.config.syncChainTip === 'proven') {
77
- const blockHeader = await this.node.getBlockHeader(BlockNumber(event.block.number));
78
- if (blockHeader) {
79
- await this.updateAnchorBlockHeader(blockHeader);
85
+ const block = await this.node.getBlock(BlockNumber(event.block.number));
86
+ if (block) {
87
+ await this.updateAnchorBlockHeader(block.header);
88
+ } else {
89
+ this.log.warn(`Block header not found for proven block ${event.block.number}, skipping anchor update`);
80
90
  }
81
91
  }
82
92
  break;
83
93
  }
84
94
  case 'chain-finalized': {
85
95
  if (this.config.syncChainTip === 'finalized') {
86
- const blockHeader = await this.node.getBlockHeader(BlockNumber(event.block.number));
87
- if (blockHeader) {
88
- await this.updateAnchorBlockHeader(blockHeader);
96
+ const block = await this.node.getBlock(BlockNumber(event.block.number));
97
+ if (block) {
98
+ await this.updateAnchorBlockHeader(block.header);
99
+ } else {
100
+ this.log.warn(`Block header not found for finalized block ${event.block.number}, skipping anchor update`);
89
101
  }
90
102
  }
91
103
  break;
@@ -106,7 +118,8 @@ export class BlockSynchronizer implements L2BlockStreamEventHandler {
106
118
  // Note that the following is not necessarily the anchor block that will be used in the transaction - if
107
119
  // the chain has already moved past the reorg, we'll also see blocks-added events that will push the anchor
108
120
  // forward.
109
- const newAnchorBlockHeader = await this.node.getBlockHeader(BlockHash.fromString(event.block.hash));
121
+ const newAnchorBlock = await this.node.getBlock(BlockHash.fromString(event.block.hash));
122
+ const newAnchorBlockHeader = newAnchorBlock?.header;
110
123
 
111
124
  if (!newAnchorBlockHeader) {
112
125
  throw new Error(
@@ -152,6 +165,8 @@ export class BlockSynchronizer implements L2BlockStreamEventHandler {
152
165
  }
153
166
 
154
167
  this.log.debug(`Syncing PXE with the node`);
168
+ // Capture the promise locally so we always await the exact promise we created, even if this.isSyncing is modified
169
+ // between assignment and await (e.g. due to future refactors introducing a yield point).
155
170
  const isSyncing = this.doSync();
156
171
  this.isSyncing = isSyncing;
157
172
  try {
@@ -161,6 +176,13 @@ export class BlockSynchronizer implements L2BlockStreamEventHandler {
161
176
  }
162
177
  }
163
178
 
179
+ /** Stops the block synchronizer, waiting for any in-progress sync and queued events to complete. */
180
+ public async stop() {
181
+ await this.isSyncing;
182
+ await this.blockStream.stop();
183
+ await this.eventQueue.end();
184
+ }
185
+
164
186
  private async doSync() {
165
187
  let currentHeader;
166
188
 
@@ -171,7 +193,7 @@ export class BlockSynchronizer implements L2BlockStreamEventHandler {
171
193
  }
172
194
  if (!currentHeader) {
173
195
  // REFACTOR: We should know the header of the genesis block without having to request it from the node.
174
- await this.anchorBlockStore.setHeader((await this.node.getBlockHeader(BlockNumber.ZERO))!);
196
+ await this.anchorBlockStore.setHeader((await this.node.getBlockData(BlockNumber.ZERO))!.header);
175
197
  }
176
198
  await this.blockStream.sync();
177
199
  }
@@ -1,12 +1,13 @@
1
1
  import {
2
2
  type ConfigMappingsType,
3
3
  booleanConfigHelper,
4
+ enumConfigHelper,
4
5
  getConfigFromMappings,
5
6
  numberConfigHelper,
6
7
  parseBooleanEnv,
7
8
  } from '@aztec/foundation/config';
8
- import { type DataStoreConfig, dataConfigMappings } from '@aztec/kv-store/config';
9
9
  import { type ChainConfig, chainConfigMappings } from '@aztec/stdlib/config';
10
+ import { type DataStoreConfig, dataConfigMappings } from '@aztec/stdlib/kv-store';
10
11
 
11
12
  export { getPackageInfo } from './package_info.js';
12
13
 
@@ -26,6 +27,12 @@ export interface BlockSynchronizerConfig {
26
27
  l2BlockBatchSize: number;
27
28
  /** Which chain tip to sync to (proposed, checkpointed, proven, finalized) */
28
29
  syncChainTip?: 'proposed' | 'checkpointed' | 'proven' | 'finalized';
30
+ /**
31
+ * Whether PXE should automatically sync with the node before each operation (simulate, prove, profile,
32
+ * execute utility, get private events, update contract). When disabled, callers (e.g. wallets) are
33
+ * responsible for calling `pxe.sync()` explicitly
34
+ */
35
+ autoSync: boolean;
29
36
  }
30
37
 
31
38
  export type PXEConfig = KernelProverConfig & DataStoreConfig & ChainConfig & BlockSynchronizerConfig;
@@ -58,14 +65,13 @@ export const pxeConfigMappings: ConfigMappingsType<PXEConfig> = {
58
65
  syncChainTip: {
59
66
  env: 'PXE_SYNC_CHAIN_TIP',
60
67
  description: 'Which chain tip to sync to (proposed, checkpointed, proven, finalized)',
61
- defaultValue: 'proposed',
62
- parseEnv: (val: string) => {
63
- const allowedValues = ['proposed', 'checkpointed', 'proven', 'finalized'];
64
- if (allowedValues.includes(val)) {
65
- return val;
66
- }
67
- throw new Error(`Invalid value for PXE_SYNC_CHAIN_TIP: ${val}. Allowed values are: ${allowedValues.join(', ')}`);
68
- },
68
+ ...enumConfigHelper(['proposed', 'checkpointed', 'proven', 'finalized'], 'proposed'),
69
+ },
70
+ autoSync: {
71
+ env: 'PXE_AUTO_SYNC',
72
+ description:
73
+ 'Whether PXE syncs with the node automatically before each operation. Disable to let the caller (e.g. a wallet) drive syncs explicitly via pxe.sync().',
74
+ ...booleanConfigHelper(true),
69
75
  },
70
76
  };
71
77
 
@@ -17,6 +17,7 @@ import {
17
17
  MAX_NULLIFIERS_PER_TX,
18
18
  MAX_NULLIFIER_READ_REQUESTS_PER_TX,
19
19
  MAX_PRIVATE_LOGS_PER_TX,
20
+ MAX_TX_LIFETIME,
20
21
  PRIVATE_TX_L2_GAS_OVERHEAD,
21
22
  PUBLIC_TX_L2_GAS_OVERHEAD,
22
23
  TX_DA_GAS_OVERHEAD,
@@ -41,7 +42,7 @@ import type { FunctionCall } from '@aztec/stdlib/abi';
41
42
  import { FunctionSelector, FunctionType } from '@aztec/stdlib/abi';
42
43
  import type { AuthWitness } from '@aztec/stdlib/auth-witness';
43
44
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
44
- import type { BlockParameter } from '@aztec/stdlib/block';
45
+ import type { BlockParameter, L2TipsProvider } from '@aztec/stdlib/block';
45
46
  import { Gas } from '@aztec/stdlib/gas';
46
47
  import {
47
48
  computeNoteHashNonce,
@@ -75,10 +76,12 @@ import {
75
76
  import { PrivateLog } from '@aztec/stdlib/logs';
76
77
  import { ScopedL2ToL1Message } from '@aztec/stdlib/messaging';
77
78
  import { ChonkProof } from '@aztec/stdlib/proofs';
79
+ import { MerkleTreeId } from '@aztec/stdlib/trees';
78
80
  import {
79
81
  BlockHeader,
80
82
  CallContext,
81
83
  HashedValues,
84
+ type OffchainEffect,
82
85
  PrivateExecutionResult,
83
86
  TxConstantData,
84
87
  TxExecutionRequest,
@@ -87,9 +90,11 @@ import {
87
90
  getFinalMinRevertibleSideEffectCounter,
88
91
  } from '@aztec/stdlib/tx';
89
92
 
90
- import type { AccessScopes } from '../access_scopes.js';
91
93
  import type { ContractSyncService } from '../contract_sync/contract_sync_service.js';
94
+ import type { ExecutionHooks } from '../hooks/index.js';
95
+ import type { MessageContextService } from '../messages/message_context_service.js';
92
96
  import type { AddressStore } from '../storage/address_store/address_store.js';
97
+ import { CapsuleService } from '../storage/capsule_store/capsule_service.js';
93
98
  import type { CapsuleStore } from '../storage/capsule_store/capsule_store.js';
94
99
  import type { ContractStore } from '../storage/contract_store/contract_store.js';
95
100
  import type { NoteStore } from '../storage/note_store/note_store.js';
@@ -119,7 +124,7 @@ export type ContractSimulatorRunOpts = {
119
124
  /** The address used as a tagging sender when emitting private logs. */
120
125
  senderForTags?: AztecAddress;
121
126
  /** The accounts whose notes we can access in this call. */
122
- scopes: AccessScopes;
127
+ scopes: AztecAddress[];
123
128
  /** The job ID for staged writes. */
124
129
  jobId: string;
125
130
  };
@@ -131,6 +136,7 @@ export type ContractFunctionSimulatorArgs = {
131
136
  keyStore: KeyStore;
132
137
  addressStore: AddressStore;
133
138
  aztecNode: AztecNode;
139
+ l2TipsStore: L2TipsProvider;
134
140
  senderTaggingStore: SenderTaggingStore;
135
141
  recipientTaggingStore: RecipientTaggingStore;
136
142
  senderAddressBookStore: SenderAddressBookStore;
@@ -138,6 +144,8 @@ export type ContractFunctionSimulatorArgs = {
138
144
  privateEventStore: PrivateEventStore;
139
145
  simulator: CircuitSimulator;
140
146
  contractSyncService: ContractSyncService;
147
+ messageContextService: MessageContextService;
148
+ hooks?: ExecutionHooks;
141
149
  };
142
150
 
143
151
  /**
@@ -150,6 +158,7 @@ export class ContractFunctionSimulator {
150
158
  private readonly keyStore: KeyStore;
151
159
  private readonly addressStore: AddressStore;
152
160
  private readonly aztecNode: AztecNode;
161
+ private readonly l2TipsStore: L2TipsProvider;
153
162
  private readonly senderTaggingStore: SenderTaggingStore;
154
163
  private readonly recipientTaggingStore: RecipientTaggingStore;
155
164
  private readonly senderAddressBookStore: SenderAddressBookStore;
@@ -157,6 +166,8 @@ export class ContractFunctionSimulator {
157
166
  private readonly privateEventStore: PrivateEventStore;
158
167
  private readonly simulator: CircuitSimulator;
159
168
  private readonly contractSyncService: ContractSyncService;
169
+ private readonly messageContextService: MessageContextService;
170
+ private readonly hooks: ExecutionHooks | undefined;
160
171
 
161
172
  constructor(args: ContractFunctionSimulatorArgs) {
162
173
  this.contractStore = args.contractStore;
@@ -164,6 +175,7 @@ export class ContractFunctionSimulator {
164
175
  this.keyStore = args.keyStore;
165
176
  this.addressStore = args.addressStore;
166
177
  this.aztecNode = args.aztecNode;
178
+ this.l2TipsStore = args.l2TipsStore;
167
179
  this.senderTaggingStore = args.senderTaggingStore;
168
180
  this.recipientTaggingStore = args.recipientTaggingStore;
169
181
  this.senderAddressBookStore = args.senderAddressBookStore;
@@ -171,6 +183,8 @@ export class ContractFunctionSimulator {
171
183
  this.privateEventStore = args.privateEventStore;
172
184
  this.simulator = args.simulator;
173
185
  this.contractSyncService = args.contractSyncService;
186
+ this.messageContextService = args.messageContextService;
187
+ this.hooks = args.hooks;
174
188
  this.log = createLogger('simulator');
175
189
  }
176
190
 
@@ -199,7 +213,7 @@ export class ContractFunctionSimulator {
199
213
  }
200
214
 
201
215
  if (request.origin !== contractAddress) {
202
- this.log.warn(
216
+ throw new Error(
203
217
  `Request origin does not match contract address in simulation. Request origin: ${request.origin}, contract address: ${contractAddress}`,
204
218
  );
205
219
  }
@@ -239,8 +253,9 @@ export class ContractFunctionSimulator {
239
253
  senderTaggingStore: this.senderTaggingStore,
240
254
  recipientTaggingStore: this.recipientTaggingStore,
241
255
  senderAddressBookStore: this.senderAddressBookStore,
242
- capsuleStore: this.capsuleStore,
256
+ capsuleService: new CapsuleService(this.capsuleStore, scopes),
243
257
  privateEventStore: this.privateEventStore,
258
+ messageContextService: this.messageContextService,
244
259
  contractSyncService: this.contractSyncService,
245
260
  jobId,
246
261
  totalPublicCalldataCount: 0,
@@ -248,6 +263,8 @@ export class ContractFunctionSimulator {
248
263
  scopes,
249
264
  senderForTags,
250
265
  simulator: this.simulator,
266
+ l2TipsStore: this.l2TipsStore,
267
+ hooks: this.hooks,
251
268
  });
252
269
 
253
270
  const setupTime = simulatorSetupTimer.ms();
@@ -277,7 +294,7 @@ export class ContractFunctionSimulator {
277
294
  );
278
295
  const publicFunctionsCalldata = await Promise.all(
279
296
  publicCallRequests.map(async r => {
280
- const calldata = await privateExecutionOracle.privateLoadFromExecutionCache(r.calldataHash);
297
+ const calldata = await privateExecutionOracle.getHashPreimage(r.calldataHash);
281
298
  return new HashedValues(calldata, r.calldataHash);
282
299
  }),
283
300
  );
@@ -298,7 +315,6 @@ export class ContractFunctionSimulator {
298
315
  }
299
316
  }
300
317
 
301
- // docs:start:execute_utility_function
302
318
  /**
303
319
  * Runs a utility function.
304
320
  * @param call - The function call to execute.
@@ -312,15 +328,19 @@ export class ContractFunctionSimulator {
312
328
  call: FunctionCall,
313
329
  authwits: AuthWitness[],
314
330
  anchorBlockHeader: BlockHeader,
315
- scopes: AccessScopes,
331
+ scopes: AztecAddress[],
316
332
  jobId: string,
317
- ): Promise<Fr[]> {
333
+ ): Promise<{ result: Fr[]; offchainEffects: OffchainEffect[] }> {
318
334
  const entryPointArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(call.to, call.selector);
319
335
 
320
336
  if (entryPointArtifact.functionType !== FunctionType.UTILITY) {
321
337
  throw new Error(`Cannot run ${entryPointArtifact.functionType} function as utility`);
322
338
  }
323
339
 
340
+ const utilityExecutor = async (syncCall: FunctionCall, execScopes: AztecAddress[]) => {
341
+ await this.runUtility(syncCall, [], anchorBlockHeader, execScopes, jobId);
342
+ };
343
+
324
344
  const oracle = new UtilityExecutionOracle({
325
345
  contractAddress: call.to,
326
346
  authWitnesses: authwits,
@@ -333,10 +353,16 @@ export class ContractFunctionSimulator {
333
353
  aztecNode: this.aztecNode,
334
354
  recipientTaggingStore: this.recipientTaggingStore,
335
355
  senderAddressBookStore: this.senderAddressBookStore,
336
- capsuleStore: this.capsuleStore,
356
+ capsuleService: new CapsuleService(this.capsuleStore, scopes),
337
357
  privateEventStore: this.privateEventStore,
358
+ messageContextService: this.messageContextService,
359
+ contractSyncService: this.contractSyncService,
360
+ l2TipsStore: this.l2TipsStore,
338
361
  jobId,
339
362
  scopes,
363
+ simulator: this.simulator,
364
+ hooks: this.hooks,
365
+ utilityExecutor,
340
366
  });
341
367
 
342
368
  try {
@@ -362,12 +388,14 @@ export class ContractFunctionSimulator {
362
388
  });
363
389
 
364
390
  this.log.verbose(`Utility execution for ${call.to}.${call.selector} completed`);
365
- return witnessMapToFields(acirExecutionResult.returnWitness);
391
+ return {
392
+ result: witnessMapToFields(acirExecutionResult.returnWitness),
393
+ offchainEffects: oracle.getOffchainEffects(),
394
+ };
366
395
  } catch (err) {
367
396
  throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during private execution'));
368
397
  }
369
398
  }
370
- // docs:end:execute_utility_function
371
399
 
372
400
  /**
373
401
  * Returns the execution statistics collected during the simulator run.
@@ -432,14 +460,34 @@ export async function generateSimulatedProvingResult(
432
460
 
433
461
  let publicTeardownCallRequest;
434
462
 
463
+ // We set expiration timestamp to anchor_block_timestamp + MAX_TX_LIFETIME (24h) just like kernels do
464
+ let expirationTimestamp =
465
+ privateExecutionResult.entrypoint.publicInputs.anchorBlockHeader.globalVariables.timestamp +
466
+ BigInt(MAX_TX_LIFETIME);
467
+
468
+ let feePayer = AztecAddress.zero();
469
+
435
470
  const executions = [privateExecutionResult.entrypoint];
436
471
 
437
472
  while (executions.length !== 0) {
438
473
  const execution = executions.shift()!;
439
474
  executions.unshift(...execution!.nestedExecutionResults);
440
475
 
476
+ // Just like kernels we overwrite the default value if the call sets it.
477
+ const callExpirationTimestamp = execution.publicInputs.expirationTimestamp;
478
+ if (callExpirationTimestamp !== 0n && callExpirationTimestamp < expirationTimestamp) {
479
+ expirationTimestamp = callExpirationTimestamp;
480
+ }
481
+
441
482
  const { contractAddress } = execution.publicInputs.callContext;
442
483
 
484
+ if (execution.publicInputs.isFeePayer) {
485
+ if (!feePayer.isZero()) {
486
+ throw new Error('Multiple fee payers found in private execution result');
487
+ }
488
+ feePayer = contractAddress;
489
+ }
490
+
443
491
  scopedNoteHashes.push(
444
492
  ...execution.publicInputs.noteHashes
445
493
  .getActiveItems()
@@ -660,8 +708,8 @@ export async function generateSimulatedProvingResult(
660
708
  daGas: TX_DA_GAS_OVERHEAD,
661
709
  }),
662
710
  ),
663
- /*feePayer=*/ AztecAddress.zero(),
664
- /*expirationTimestamp=*/ 0n,
711
+ /*feePayer=*/ feePayer,
712
+ /*expirationTimestamp=*/ expirationTimestamp,
665
713
  hasPublicCalls ? inputsForPublic : undefined,
666
714
  !hasPublicCalls ? inputsForRollup : undefined,
667
715
  );
@@ -716,7 +764,7 @@ function squashTransientSideEffects(
716
764
  * at the tx's anchor block, mimicking the behavior of the kernels
717
765
  */
718
766
  async function verifyReadRequests(
719
- node: Pick<AztecNode, 'getNoteHashMembershipWitness' | 'getNullifierMembershipWitness'>,
767
+ node: Pick<AztecNode, 'findLeavesIndexes'>,
720
768
  anchorBlockHash: BlockParameter,
721
769
  noteHashReadRequests: ScopedReadRequest[],
722
770
  nullifierReadRequests: ScopedReadRequest[],
@@ -749,13 +797,25 @@ async function verifyReadRequests(
749
797
  }
750
798
  }
751
799
 
752
- const [noteHashWitnesses, nullifierWitnesses] = await Promise.all([
753
- Promise.all(settledNoteHashReads.map(({ value }) => node.getNoteHashMembershipWitness(anchorBlockHash, value))),
754
- Promise.all(settledNullifierReads.map(({ value }) => node.getNullifierMembershipWitness(anchorBlockHash, value))),
800
+ const [noteHashResults, nullifierResults] = await Promise.all([
801
+ settledNoteHashReads.length > 0
802
+ ? node.findLeavesIndexes(
803
+ anchorBlockHash,
804
+ MerkleTreeId.NOTE_HASH_TREE,
805
+ settledNoteHashReads.map(({ value }) => value),
806
+ )
807
+ : [],
808
+ settledNullifierReads.length > 0
809
+ ? node.findLeavesIndexes(
810
+ anchorBlockHash,
811
+ MerkleTreeId.NULLIFIER_TREE,
812
+ settledNullifierReads.map(({ value }) => value),
813
+ )
814
+ : [],
755
815
  ]);
756
816
 
757
817
  for (let i = 0; i < settledNoteHashReads.length; i++) {
758
- if (!noteHashWitnesses[i]) {
818
+ if (!noteHashResults[i]) {
759
819
  throw new Error(
760
820
  `Note hash read request at index ${settledNoteHashReads[i].index} is reading an unknown note hash: ${settledNoteHashReads[i].value}`,
761
821
  );
@@ -763,7 +823,7 @@ async function verifyReadRequests(
763
823
  }
764
824
 
765
825
  for (let i = 0; i < settledNullifierReads.length; i++) {
766
- if (!nullifierWitnesses[i]) {
826
+ if (!nullifierResults[i]) {
767
827
  throw new Error(
768
828
  `Nullifier read request at index ${settledNullifierReads[i].index} is reading an unknown nullifier: ${settledNullifierReads[i].value}`,
769
829
  );
@@ -809,9 +869,9 @@ function meterGasUsed(data: PrivateToRollupAccumulatedData | PrivateToPublicAccu
809
869
  meteredL2Gas += numPrivatelogs * L2_GAS_PER_PRIVATE_LOG;
810
870
 
811
871
  const numContractClassLogs = arrayNonEmptyLength(data.contractClassLogsHashes, log => log.isEmpty());
812
- // Every contract class log emits its length and contract address as additional fields
872
+ // Every contract class log emits its contract address as an additional field
813
873
  meteredDAFields += data.contractClassLogsHashes.reduce(
814
- (acc, log) => (!log.isEmpty() ? acc + log.logHash.length + 2 : acc),
874
+ (acc, log) => (!log.isEmpty() ? acc + log.logHash.length + 1 : acc),
815
875
  0,
816
876
  );
817
877
  meteredL2Gas += numContractClassLogs * L2_GAS_PER_CONTRACT_CLASS_LOG;
@@ -0,0 +1,110 @@
1
+ import { Fr } from '@aztec/foundation/curves/bn254';
2
+
3
+ /** In-memory store for ephemeral arrays scoped to a single contract call frame. */
4
+ export class EphemeralArrayService {
5
+ /**
6
+ * Maps a slot to the elements of the array stored at that slot. Each element is a serialized representation of
7
+ * the original type.
8
+ */
9
+ #arrays: Map<string, Fr[][]> = new Map();
10
+
11
+ /** Returns all elements in the array, or an empty array if uninitialized. */
12
+ readArrayAt(slot: Fr): Fr[][] {
13
+ return this.#arrays.get(slot.toString()) ?? [];
14
+ }
15
+
16
+ #setArray(slot: Fr, array: Fr[][]): void {
17
+ this.#arrays.set(slot.toString(), array);
18
+ }
19
+
20
+ /** Returns the number of elements in the array at the given slot. */
21
+ len(slot: Fr): number {
22
+ return this.readArrayAt(slot).length;
23
+ }
24
+
25
+ /** Appends an element to the array and returns the new length. */
26
+ push(slot: Fr, elements: Fr[]): number {
27
+ const array = this.readArrayAt(slot);
28
+ array.push(elements);
29
+ this.#setArray(slot, array);
30
+ return array.length;
31
+ }
32
+
33
+ /** Removes and returns the last element. Throws if empty. */
34
+ pop(slot: Fr): Fr[] {
35
+ const array = this.readArrayAt(slot);
36
+ if (array.length === 0) {
37
+ throw new Error(`Ephemeral array at slot ${slot} is empty`);
38
+ }
39
+ const element = array.pop()!;
40
+ this.#setArray(slot, array);
41
+ return element;
42
+ }
43
+
44
+ /** Returns the element at the given index. Throws if out of bounds. */
45
+ get(slot: Fr, index: number): Fr[] {
46
+ const array = this.readArrayAt(slot);
47
+ if (index < 0 || index >= array.length) {
48
+ throw new Error(
49
+ `Ephemeral array index ${index} out of bounds for array of length ${array.length} at slot ${slot}`,
50
+ );
51
+ }
52
+ return array[index];
53
+ }
54
+
55
+ /** Overwrites the element at the given index. Throws if out of bounds. */
56
+ set(slot: Fr, index: number, value: Fr[]): void {
57
+ const array = this.readArrayAt(slot);
58
+ if (index < 0 || index >= array.length) {
59
+ throw new Error(
60
+ `Ephemeral array index ${index} out of bounds for array of length ${array.length} at slot ${slot}`,
61
+ );
62
+ }
63
+ array[index] = value;
64
+ }
65
+
66
+ /** Removes the element at the given index, shifting subsequent elements backward. Throws if out of bounds. */
67
+ remove(slot: Fr, index: number): void {
68
+ const array = this.readArrayAt(slot);
69
+ if (index < 0 || index >= array.length) {
70
+ throw new Error(
71
+ `Ephemeral array index ${index} out of bounds for array of length ${array.length} at slot ${slot}`,
72
+ );
73
+ }
74
+ array.splice(index, 1);
75
+ }
76
+
77
+ /** Removes all elements from the array. */
78
+ clear(slot: Fr): void {
79
+ this.#arrays.delete(slot.toString());
80
+ }
81
+
82
+ /** Allocates a fresh, unused slot for a new ephemeral array. */
83
+ allocateSlot(): Fr {
84
+ let slot: Fr;
85
+ do {
86
+ slot = Fr.random();
87
+ } while (this.#arrays.has(slot.toString()));
88
+ return slot;
89
+ }
90
+
91
+ /** Creates a new ephemeral array pre-populated with the given elements and returns its slot. */
92
+ newArray(elements: Fr[][]): Fr {
93
+ const slot = this.allocateSlot();
94
+ this.#setArray(slot, elements);
95
+ return slot;
96
+ }
97
+
98
+ /** Copies `count` elements from the source array to the destination array (overwrites destination). */
99
+ copy(srcSlot: Fr, dstSlot: Fr, count: number): void {
100
+ const srcArray = this.readArrayAt(srcSlot);
101
+ if (count > srcArray.length) {
102
+ throw new Error(
103
+ `Cannot copy ${count} elements from ephemeral array of length ${srcArray.length} at slot ${srcSlot}`,
104
+ );
105
+ }
106
+ // Deep copy the elements to avoid aliasing
107
+ const copied = srcArray.slice(0, count).map(el => [...el]);
108
+ this.#setArray(dstSlot, copied);
109
+ }
110
+ }
@@ -1,32 +1,33 @@
1
- import { DirectionalAppTaggingSecret, type PreTag } from '@aztec/stdlib/logs';
1
+ import { AppTaggingSecret, type TaggingIndexRange } from '@aztec/stdlib/logs';
2
2
 
3
- /**
4
- * A map that stores the tagging index for a given directional app tagging secret.
5
- * Note: The directional app tagging secret is unique for a (sender, recipient, contract) tuple while the direction
6
- * of sender -> recipient matters.
7
- */
3
+ /** A map that stores the tagging index range for a given app tagging secret. */
8
4
  export class ExecutionTaggingIndexCache {
9
- private taggingIndexMap: Map<string, number> = new Map();
5
+ private taggingIndexMap: Map<string, { lowestIndex: number; highestIndex: number }> = new Map();
10
6
 
11
- public getLastUsedIndex(secret: DirectionalAppTaggingSecret): number | undefined {
12
- return this.taggingIndexMap.get(secret.toString());
7
+ public getLastUsedIndex(secret: AppTaggingSecret): number | undefined {
8
+ return this.taggingIndexMap.get(secret.toString())?.highestIndex;
13
9
  }
14
10
 
15
- public setLastUsedIndex(secret: DirectionalAppTaggingSecret, index: number) {
11
+ public setLastUsedIndex(secret: AppTaggingSecret, index: number) {
16
12
  const currentValue = this.taggingIndexMap.get(secret.toString());
17
- if (currentValue !== undefined && currentValue !== index - 1) {
18
- throw new Error(`Invalid tagging index update. Current value: ${currentValue}, new value: ${index}`);
13
+ if (currentValue !== undefined && currentValue.highestIndex !== index - 1) {
14
+ throw new Error(`Invalid tagging index update. Current value: ${currentValue.highestIndex}, new value: ${index}`);
15
+ }
16
+ if (currentValue !== undefined) {
17
+ currentValue.highestIndex = index;
18
+ } else {
19
+ this.taggingIndexMap.set(secret.toString(), { lowestIndex: index, highestIndex: index });
19
20
  }
20
- this.taggingIndexMap.set(secret.toString(), index);
21
21
  }
22
22
 
23
23
  /**
24
- * Returns the pre-tags that were used in this execution (and that need to be stored in the db).
24
+ * Returns the tagging index ranges that were used in this execution (and that need to be stored in the db).
25
25
  */
26
- public getUsedPreTags(): PreTag[] {
27
- return Array.from(this.taggingIndexMap.entries()).map(([secret, index]) => ({
28
- secret: DirectionalAppTaggingSecret.fromString(secret),
29
- index,
26
+ public getUsedTaggingIndexRanges(): TaggingIndexRange[] {
27
+ return Array.from(this.taggingIndexMap.entries()).map(([secret, { lowestIndex, highestIndex }]) => ({
28
+ extendedSecret: AppTaggingSecret.fromString(secret),
29
+ lowestIndex,
30
+ highestIndex,
30
31
  }));
31
32
  }
32
33
  }
@@ -4,10 +4,13 @@ export { HashedValuesCache } from './hashed_values_cache.js';
4
4
  export { pickNotes } from './pick_notes.js';
5
5
  export type { NoteData, IMiscOracle, IUtilityExecutionOracle, IPrivateExecutionOracle } from './oracle/interfaces.js';
6
6
  export { MessageLoadOracleInputs } from './oracle/message_load_oracle_inputs.js';
7
+ export { MessageContextService } from '../messages/message_context_service.js';
7
8
  export { UtilityExecutionOracle } from './oracle/utility_execution_oracle.js';
8
9
  export { PrivateExecutionOracle } from './oracle/private_execution_oracle.js';
9
10
  export { Oracle } from './oracle/oracle.js';
10
11
  export { executePrivateFunction, extractPrivateCircuitPublicInputs } from './oracle/private_execution.js';
11
12
  export { generateSimulatedProvingResult } from './contract_function_simulator.js';
12
13
  export { packAsHintedNote } from './oracle/note_packing_utils.js';
14
+ export { BoundedVec } from './noir-structs/bounded_vec.js';
15
+ export { Option } from './noir-structs/option.js';
13
16
  export { UtilityContext } from './noir-structs/utility_context.js';