@aztec/pxe 0.0.1-commit.7b97ef96e → 0.0.1-commit.7cbc774

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 (316) 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/config/package_info.js +1 -1
  17. package/dest/contract_function_simulator/contract_function_simulator.d.ts +16 -5
  18. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  19. package/dest/contract_function_simulator/contract_function_simulator.js +58 -23
  20. package/dest/contract_function_simulator/ephemeral_array_service.d.ts +28 -0
  21. package/dest/contract_function_simulator/ephemeral_array_service.d.ts.map +1 -0
  22. package/dest/contract_function_simulator/ephemeral_array_service.js +78 -0
  23. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts +7 -11
  24. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts.map +1 -1
  25. package/dest/contract_function_simulator/execution_tagging_index_cache.js +19 -15
  26. package/dest/contract_function_simulator/index.d.ts +4 -1
  27. package/dest/contract_function_simulator/index.d.ts.map +1 -1
  28. package/dest/contract_function_simulator/index.js +3 -0
  29. package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts +48 -0
  30. package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts.map +1 -0
  31. package/dest/contract_function_simulator/noir-structs/bounded_vec.js +45 -0
  32. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +4 -6
  33. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts.map +1 -1
  34. package/dest/contract_function_simulator/noir-structs/event_validation_request.js +8 -9
  35. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts +13 -3
  36. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts.map +1 -1
  37. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.js +35 -4
  38. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts +2 -2
  39. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts.map +1 -1
  40. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.js +2 -4
  41. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +4 -7
  42. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts.map +1 -1
  43. package/dest/contract_function_simulator/noir-structs/note_validation_request.js +6 -10
  44. package/dest/contract_function_simulator/noir-structs/option.d.ts +61 -0
  45. package/dest/contract_function_simulator/noir-structs/option.d.ts.map +1 -0
  46. package/dest/contract_function_simulator/noir-structs/option.js +62 -0
  47. package/dest/contract_function_simulator/oracle/interfaces.d.ts +67 -51
  48. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  49. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts +2 -2
  50. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts.map +1 -1
  51. package/dest/contract_function_simulator/oracle/note_packing_utils.js +2 -2
  52. package/dest/contract_function_simulator/oracle/oracle.d.ts +74 -45
  53. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
  54. package/dest/contract_function_simulator/oracle/oracle.js +471 -287
  55. package/dest/contract_function_simulator/oracle/oracle_registry.d.ts +147 -0
  56. package/dest/contract_function_simulator/oracle/oracle_registry.d.ts.map +1 -0
  57. package/dest/contract_function_simulator/oracle/oracle_registry.js +1199 -0
  58. package/dest/contract_function_simulator/oracle/private_execution.js +5 -3
  59. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +44 -70
  60. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  61. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +96 -99
  62. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +112 -67
  63. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  64. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +395 -141
  65. package/dest/contract_function_simulator/pick_notes.d.ts +1 -1
  66. package/dest/contract_function_simulator/pick_notes.d.ts.map +1 -1
  67. package/dest/contract_function_simulator/pick_notes.js +20 -3
  68. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts +1 -1
  69. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts.map +1 -1
  70. package/dest/contract_function_simulator/proxied_contract_data_source.js +35 -64
  71. package/dest/contract_logging.d.ts +9 -4
  72. package/dest/contract_logging.d.ts.map +1 -1
  73. package/dest/contract_logging.js +21 -6
  74. package/dest/contract_sync/contract_sync_service.d.ts +7 -8
  75. package/dest/contract_sync/contract_sync_service.d.ts.map +1 -1
  76. package/dest/contract_sync/contract_sync_service.js +87 -49
  77. package/dest/contract_sync/helpers.d.ts +2 -4
  78. package/dest/contract_sync/helpers.d.ts.map +1 -1
  79. package/dest/contract_sync/helpers.js +12 -14
  80. package/dest/debug/pxe_debug_utils.d.ts +3 -8
  81. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  82. package/dest/debug/pxe_debug_utils.js +0 -6
  83. package/dest/entrypoints/client/bundle/index.d.ts +1 -2
  84. package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
  85. package/dest/entrypoints/client/bundle/index.js +0 -1
  86. package/dest/entrypoints/client/bundle/utils.d.ts +2 -2
  87. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  88. package/dest/entrypoints/client/bundle/utils.js +13 -5
  89. package/dest/entrypoints/client/lazy/index.d.ts +1 -2
  90. package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
  91. package/dest/entrypoints/client/lazy/index.js +0 -1
  92. package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
  93. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  94. package/dest/entrypoints/client/lazy/utils.js +13 -5
  95. package/dest/entrypoints/pxe_creation_options.d.ts +9 -1
  96. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  97. package/dest/entrypoints/pxe_creation_options.js +3 -1
  98. package/dest/entrypoints/server/index.d.ts +3 -3
  99. package/dest/entrypoints/server/index.d.ts.map +1 -1
  100. package/dest/entrypoints/server/index.js +2 -2
  101. package/dest/entrypoints/server/utils.d.ts +4 -3
  102. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  103. package/dest/entrypoints/server/utils.js +13 -5
  104. package/dest/events/event_service.d.ts +15 -6
  105. package/dest/events/event_service.d.ts.map +1 -1
  106. package/dest/events/event_service.js +44 -11
  107. package/dest/events/private_event_filter_validator.d.ts +3 -2
  108. package/dest/events/private_event_filter_validator.d.ts.map +1 -1
  109. package/dest/events/private_event_filter_validator.js +15 -0
  110. package/dest/hooks/authorize_utility_call.d.ts +41 -0
  111. package/dest/hooks/authorize_utility_call.d.ts.map +1 -0
  112. package/dest/hooks/authorize_utility_call.js +4 -0
  113. package/dest/hooks/execution_hooks.d.ts +42 -0
  114. package/dest/hooks/execution_hooks.d.ts.map +1 -0
  115. package/dest/hooks/execution_hooks.js +9 -0
  116. package/dest/hooks/index.d.ts +4 -0
  117. package/dest/hooks/index.d.ts.map +1 -0
  118. package/dest/hooks/index.js +1 -0
  119. package/dest/logs/log_service.d.ts +9 -9
  120. package/dest/logs/log_service.d.ts.map +1 -1
  121. package/dest/logs/log_service.js +122 -72
  122. package/dest/messages/message_context_service.d.ts +17 -0
  123. package/dest/messages/message_context_service.d.ts.map +1 -0
  124. package/dest/messages/message_context_service.js +38 -0
  125. package/dest/notes/note_service.d.ts +27 -6
  126. package/dest/notes/note_service.d.ts.map +1 -1
  127. package/dest/notes/note_service.js +80 -56
  128. package/dest/notes_filter.d.ts +2 -3
  129. package/dest/notes_filter.d.ts.map +1 -1
  130. package/dest/oracle_version.d.ts +4 -3
  131. package/dest/oracle_version.d.ts.map +1 -1
  132. package/dest/oracle_version.js +20 -10
  133. package/dest/private_kernel/batch_planner.d.ts +47 -0
  134. package/dest/private_kernel/batch_planner.d.ts.map +1 -0
  135. package/dest/private_kernel/batch_planner.js +104 -0
  136. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +4 -3
  137. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -1
  138. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.js +126 -65
  139. package/dest/private_kernel/hints/test_utils.d.ts +122 -0
  140. package/dest/private_kernel/hints/test_utils.d.ts.map +1 -0
  141. package/dest/private_kernel/hints/test_utils.js +202 -0
  142. package/dest/private_kernel/private_kernel_execution_prover.d.ts +6 -2
  143. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  144. package/dest/private_kernel/private_kernel_execution_prover.js +165 -64
  145. package/dest/private_kernel/private_kernel_oracle.d.ts +10 -10
  146. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  147. package/dest/private_kernel/private_kernel_oracle.js +24 -22
  148. package/dest/pxe.d.ts +61 -11
  149. package/dest/pxe.d.ts.map +1 -1
  150. package/dest/pxe.js +162 -97
  151. package/dest/storage/anchor_block_store/anchor_block_store.js +1 -1
  152. package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.d.ts +42 -0
  153. package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.d.ts.map +1 -0
  154. package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.js +93 -0
  155. package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts +15 -0
  156. package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts.map +1 -0
  157. package/dest/storage/backwards_compatibility_tests/schema_tests.js +591 -0
  158. package/dest/storage/backwards_compatibility_tests/store_spy.d.ts +19 -0
  159. package/dest/storage/backwards_compatibility_tests/store_spy.d.ts.map +1 -0
  160. package/dest/storage/backwards_compatibility_tests/store_spy.js +63 -0
  161. package/dest/storage/capsule_store/capsule_service.d.ts +21 -0
  162. package/dest/storage/capsule_store/capsule_service.d.ts.map +1 -0
  163. package/dest/storage/capsule_store/capsule_service.js +50 -0
  164. package/dest/storage/capsule_store/capsule_store.d.ts +9 -9
  165. package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
  166. package/dest/storage/capsule_store/capsule_store.js +36 -28
  167. package/dest/storage/capsule_store/index.d.ts +2 -1
  168. package/dest/storage/capsule_store/index.d.ts.map +1 -1
  169. package/dest/storage/capsule_store/index.js +1 -0
  170. package/dest/storage/contract_store/contract_store.d.ts +1 -1
  171. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  172. package/dest/storage/contract_store/contract_store.js +9 -26
  173. package/dest/storage/metadata.d.ts +1 -1
  174. package/dest/storage/metadata.js +1 -1
  175. package/dest/storage/note_store/note_store.d.ts +1 -1
  176. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  177. package/dest/storage/note_store/note_store.js +2 -2
  178. package/dest/storage/open_pxe_stores.d.ts +33 -0
  179. package/dest/storage/open_pxe_stores.d.ts.map +1 -0
  180. package/dest/storage/open_pxe_stores.js +27 -0
  181. package/dest/storage/private_event_store/private_event_store.d.ts +1 -1
  182. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  183. package/dest/storage/private_event_store/private_event_store.js +3 -0
  184. package/dest/storage/private_event_store/stored_private_event.js +1 -1
  185. package/dest/storage/tagging_store/recipient_tagging_store.d.ts +6 -6
  186. package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
  187. package/dest/storage/tagging_store/sender_tagging_store.d.ts +29 -28
  188. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  189. package/dest/storage/tagging_store/sender_tagging_store.js +141 -115
  190. package/dest/tagging/get_all_logs_by_tags.d.ts +34 -10
  191. package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -1
  192. package/dest/tagging/get_all_logs_by_tags.js +36 -37
  193. package/dest/tagging/index.d.ts +6 -5
  194. package/dest/tagging/index.d.ts.map +1 -1
  195. package/dest/tagging/index.js +4 -3
  196. package/dest/tagging/persist_sender_tagging_index_ranges.d.ts +29 -0
  197. package/dest/tagging/persist_sender_tagging_index_ranges.d.ts.map +1 -0
  198. package/dest/tagging/persist_sender_tagging_index_ranges.js +42 -0
  199. package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts +56 -0
  200. package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts.map +1 -0
  201. package/dest/tagging/recipient_sync/sync_tagged_private_logs.js +163 -0
  202. package/dest/tagging/recipient_sync/utils/find_highest_indexes.d.ts +3 -3
  203. package/dest/tagging/recipient_sync/utils/find_highest_indexes.d.ts.map +1 -1
  204. package/dest/tagging/reconcile_tagging_index_ranges.d.ts +36 -0
  205. package/dest/tagging/reconcile_tagging_index_ranges.d.ts.map +1 -0
  206. package/dest/tagging/reconcile_tagging_index_ranges.js +74 -0
  207. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +4 -9
  208. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
  209. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +30 -14
  210. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +13 -7
  211. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
  212. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +41 -10
  213. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +5 -7
  214. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
  215. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +37 -25
  216. package/package.json +20 -17
  217. package/src/bin/check_oracle_version.ts +41 -31
  218. package/src/bin/index.ts +1 -0
  219. package/src/block_synchronizer/block_stream_source.ts +81 -0
  220. package/src/block_synchronizer/block_synchronizer.ts +33 -11
  221. package/src/config/index.ts +15 -9
  222. package/src/config/package_info.ts +1 -1
  223. package/src/contract_function_simulator/contract_function_simulator.ts +94 -35
  224. package/src/contract_function_simulator/ephemeral_array_service.ts +110 -0
  225. package/src/contract_function_simulator/execution_tagging_index_cache.ts +19 -18
  226. package/src/contract_function_simulator/index.ts +3 -0
  227. package/src/contract_function_simulator/noir-structs/bounded_vec.ts +55 -0
  228. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +10 -9
  229. package/src/contract_function_simulator/noir-structs/log_retrieval_request.ts +36 -3
  230. package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +2 -5
  231. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +5 -10
  232. package/src/contract_function_simulator/noir-structs/option.ts +69 -0
  233. package/src/contract_function_simulator/oracle/interfaces.ts +85 -72
  234. package/src/contract_function_simulator/oracle/note_packing_utils.ts +3 -3
  235. package/src/contract_function_simulator/oracle/oracle.ts +558 -484
  236. package/src/contract_function_simulator/oracle/oracle_registry.ts +904 -0
  237. package/src/contract_function_simulator/oracle/private_execution.ts +4 -4
  238. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +120 -130
  239. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +543 -221
  240. package/src/contract_function_simulator/pick_notes.ts +22 -3
  241. package/src/contract_function_simulator/proxied_contract_data_source.ts +41 -64
  242. package/src/contract_logging.ts +18 -5
  243. package/src/contract_sync/contract_sync_service.ts +120 -83
  244. package/src/contract_sync/helpers.ts +13 -25
  245. package/src/debug/pxe_debug_utils.ts +3 -11
  246. package/src/entrypoints/client/bundle/index.ts +0 -1
  247. package/src/entrypoints/client/bundle/utils.ts +10 -5
  248. package/src/entrypoints/client/lazy/index.ts +0 -1
  249. package/src/entrypoints/client/lazy/utils.ts +10 -5
  250. package/src/entrypoints/pxe_creation_options.ts +14 -0
  251. package/src/entrypoints/server/index.ts +2 -2
  252. package/src/entrypoints/server/utils.ts +15 -6
  253. package/src/events/event_service.ts +69 -21
  254. package/src/events/private_event_filter_validator.ts +21 -1
  255. package/src/hooks/authorize_utility_call.ts +44 -0
  256. package/src/hooks/execution_hooks.ts +48 -0
  257. package/src/hooks/index.ts +7 -0
  258. package/src/logs/log_service.ts +153 -129
  259. package/src/messages/message_context_service.ts +45 -0
  260. package/src/notes/note_service.ts +119 -85
  261. package/src/notes_filter.ts +1 -3
  262. package/src/oracle_version.ts +20 -10
  263. package/src/private_kernel/batch_planner.ts +169 -0
  264. package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +158 -111
  265. package/src/private_kernel/hints/test_utils.ts +318 -0
  266. package/src/private_kernel/private_kernel_execution_prover.ts +253 -88
  267. package/src/private_kernel/private_kernel_oracle.ts +35 -25
  268. package/src/pxe.ts +270 -102
  269. package/src/storage/anchor_block_store/anchor_block_store.ts +1 -1
  270. package/src/storage/backwards_compatibility_tests/__snapshots__/AddressStore.json +22 -0
  271. package/src/storage/backwards_compatibility_tests/__snapshots__/AnchorBlockStore.json +3 -0
  272. package/src/storage/backwards_compatibility_tests/__snapshots__/CapsuleStore.json +16 -0
  273. package/src/storage/backwards_compatibility_tests/__snapshots__/ContractStore.json +28 -0
  274. package/src/storage/backwards_compatibility_tests/__snapshots__/KeyStore.json +52 -0
  275. package/src/storage/backwards_compatibility_tests/__snapshots__/L2TipsKVStore.json +46 -0
  276. package/src/storage/backwards_compatibility_tests/__snapshots__/NoteStore.json +36 -0
  277. package/src/storage/backwards_compatibility_tests/__snapshots__/PrivateEventStore.json +44 -0
  278. package/src/storage/backwards_compatibility_tests/__snapshots__/RecipientTaggingStore.json +18 -0
  279. package/src/storage/backwards_compatibility_tests/__snapshots__/SenderAddressBookStore.json +16 -0
  280. package/src/storage/backwards_compatibility_tests/__snapshots__/SenderTaggingStore.json +22 -0
  281. package/src/storage/backwards_compatibility_tests/__snapshots__/opened_stores.json +97 -0
  282. package/src/storage/backwards_compatibility_tests/kv_store_snapshot.ts +122 -0
  283. package/src/storage/backwards_compatibility_tests/schema_tests.ts +712 -0
  284. package/src/storage/backwards_compatibility_tests/store_spy.ts +73 -0
  285. package/src/storage/capsule_store/capsule_service.ts +90 -0
  286. package/src/storage/capsule_store/capsule_store.ts +44 -26
  287. package/src/storage/capsule_store/index.ts +1 -0
  288. package/src/storage/contract_store/contract_store.ts +14 -35
  289. package/src/storage/metadata.ts +1 -1
  290. package/src/storage/note_store/note_store.ts +2 -5
  291. package/src/storage/open_pxe_stores.ts +49 -0
  292. package/src/storage/private_event_store/private_event_store.ts +4 -0
  293. package/src/storage/private_event_store/stored_private_event.ts +1 -1
  294. package/src/storage/tagging_store/recipient_tagging_store.ts +5 -5
  295. package/src/storage/tagging_store/sender_tagging_store.ts +185 -138
  296. package/src/tagging/get_all_logs_by_tags.ts +78 -50
  297. package/src/tagging/index.ts +5 -4
  298. package/src/tagging/persist_sender_tagging_index_ranges.ts +57 -0
  299. package/src/tagging/recipient_sync/sync_tagged_private_logs.ts +240 -0
  300. package/src/tagging/recipient_sync/utils/find_highest_indexes.ts +2 -2
  301. package/src/tagging/reconcile_tagging_index_ranges.ts +102 -0
  302. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +52 -17
  303. package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +44 -14
  304. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +27 -27
  305. package/dest/access_scopes.d.ts +0 -9
  306. package/dest/access_scopes.d.ts.map +0 -1
  307. package/dest/access_scopes.js +0 -6
  308. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +0 -15
  309. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +0 -1
  310. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +0 -99
  311. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +0 -15
  312. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +0 -1
  313. package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +0 -32
  314. package/src/access_scopes.ts +0 -9
  315. package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +0 -143
  316. 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
 
@@ -1,3 +1,3 @@
1
1
  export function getPackageInfo() {
2
- return { version: '5.0.0', name: '@aztec/pxe' };
2
+ return { version: '6.0.0', name: '@aztec/pxe' };
3
3
  }
@@ -4,8 +4,6 @@ import {
4
4
  AVM_SENDL2TOL1MSG_BASE_L2_GAS,
5
5
  DA_GAS_PER_FIELD,
6
6
  FIXED_AVM_STARTUP_L2_GAS,
7
- FIXED_DA_GAS,
8
- FIXED_L2_GAS,
9
7
  L2_GAS_PER_CONTRACT_CLASS_LOG,
10
8
  L2_GAS_PER_L2_TO_L1_MSG,
11
9
  L2_GAS_PER_NOTE_HASH,
@@ -19,6 +17,10 @@ import {
19
17
  MAX_NULLIFIERS_PER_TX,
20
18
  MAX_NULLIFIER_READ_REQUESTS_PER_TX,
21
19
  MAX_PRIVATE_LOGS_PER_TX,
20
+ MAX_TX_LIFETIME,
21
+ PRIVATE_TX_L2_GAS_OVERHEAD,
22
+ PUBLIC_TX_L2_GAS_OVERHEAD,
23
+ TX_DA_GAS_OVERHEAD,
22
24
  } from '@aztec/constants';
23
25
  import { arrayNonEmptyLength, padArrayEnd } from '@aztec/foundation/collection';
24
26
  import { Fr } from '@aztec/foundation/curves/bn254';
@@ -40,7 +42,7 @@ import type { FunctionCall } from '@aztec/stdlib/abi';
40
42
  import { FunctionSelector, FunctionType } from '@aztec/stdlib/abi';
41
43
  import type { AuthWitness } from '@aztec/stdlib/auth-witness';
42
44
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
43
- import type { BlockParameter } from '@aztec/stdlib/block';
45
+ import type { BlockParameter, L2TipsProvider } from '@aztec/stdlib/block';
44
46
  import { Gas } from '@aztec/stdlib/gas';
45
47
  import {
46
48
  computeNoteHashNonce,
@@ -74,10 +76,12 @@ import {
74
76
  import { PrivateLog } from '@aztec/stdlib/logs';
75
77
  import { ScopedL2ToL1Message } from '@aztec/stdlib/messaging';
76
78
  import { ChonkProof } from '@aztec/stdlib/proofs';
79
+ import { MerkleTreeId } from '@aztec/stdlib/trees';
77
80
  import {
78
81
  BlockHeader,
79
82
  CallContext,
80
83
  HashedValues,
84
+ type OffchainEffect,
81
85
  PrivateExecutionResult,
82
86
  TxConstantData,
83
87
  TxExecutionRequest,
@@ -86,9 +90,11 @@ import {
86
90
  getFinalMinRevertibleSideEffectCounter,
87
91
  } from '@aztec/stdlib/tx';
88
92
 
89
- import type { AccessScopes } from '../access_scopes.js';
90
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';
91
96
  import type { AddressStore } from '../storage/address_store/address_store.js';
97
+ import { CapsuleService } from '../storage/capsule_store/capsule_service.js';
92
98
  import type { CapsuleStore } from '../storage/capsule_store/capsule_store.js';
93
99
  import type { ContractStore } from '../storage/contract_store/contract_store.js';
94
100
  import type { NoteStore } from '../storage/note_store/note_store.js';
@@ -118,7 +124,7 @@ export type ContractSimulatorRunOpts = {
118
124
  /** The address used as a tagging sender when emitting private logs. */
119
125
  senderForTags?: AztecAddress;
120
126
  /** The accounts whose notes we can access in this call. */
121
- scopes: AccessScopes;
127
+ scopes: AztecAddress[];
122
128
  /** The job ID for staged writes. */
123
129
  jobId: string;
124
130
  };
@@ -130,6 +136,7 @@ export type ContractFunctionSimulatorArgs = {
130
136
  keyStore: KeyStore;
131
137
  addressStore: AddressStore;
132
138
  aztecNode: AztecNode;
139
+ l2TipsStore: L2TipsProvider;
133
140
  senderTaggingStore: SenderTaggingStore;
134
141
  recipientTaggingStore: RecipientTaggingStore;
135
142
  senderAddressBookStore: SenderAddressBookStore;
@@ -137,6 +144,8 @@ export type ContractFunctionSimulatorArgs = {
137
144
  privateEventStore: PrivateEventStore;
138
145
  simulator: CircuitSimulator;
139
146
  contractSyncService: ContractSyncService;
147
+ messageContextService: MessageContextService;
148
+ hooks?: ExecutionHooks;
140
149
  };
141
150
 
142
151
  /**
@@ -149,6 +158,7 @@ export class ContractFunctionSimulator {
149
158
  private readonly keyStore: KeyStore;
150
159
  private readonly addressStore: AddressStore;
151
160
  private readonly aztecNode: AztecNode;
161
+ private readonly l2TipsStore: L2TipsProvider;
152
162
  private readonly senderTaggingStore: SenderTaggingStore;
153
163
  private readonly recipientTaggingStore: RecipientTaggingStore;
154
164
  private readonly senderAddressBookStore: SenderAddressBookStore;
@@ -156,6 +166,8 @@ export class ContractFunctionSimulator {
156
166
  private readonly privateEventStore: PrivateEventStore;
157
167
  private readonly simulator: CircuitSimulator;
158
168
  private readonly contractSyncService: ContractSyncService;
169
+ private readonly messageContextService: MessageContextService;
170
+ private readonly hooks: ExecutionHooks | undefined;
159
171
 
160
172
  constructor(args: ContractFunctionSimulatorArgs) {
161
173
  this.contractStore = args.contractStore;
@@ -163,6 +175,7 @@ export class ContractFunctionSimulator {
163
175
  this.keyStore = args.keyStore;
164
176
  this.addressStore = args.addressStore;
165
177
  this.aztecNode = args.aztecNode;
178
+ this.l2TipsStore = args.l2TipsStore;
166
179
  this.senderTaggingStore = args.senderTaggingStore;
167
180
  this.recipientTaggingStore = args.recipientTaggingStore;
168
181
  this.senderAddressBookStore = args.senderAddressBookStore;
@@ -170,6 +183,8 @@ export class ContractFunctionSimulator {
170
183
  this.privateEventStore = args.privateEventStore;
171
184
  this.simulator = args.simulator;
172
185
  this.contractSyncService = args.contractSyncService;
186
+ this.messageContextService = args.messageContextService;
187
+ this.hooks = args.hooks;
173
188
  this.log = createLogger('simulator');
174
189
  }
175
190
 
@@ -198,7 +213,7 @@ export class ContractFunctionSimulator {
198
213
  }
199
214
 
200
215
  if (request.origin !== contractAddress) {
201
- this.log.warn(
216
+ throw new Error(
202
217
  `Request origin does not match contract address in simulation. Request origin: ${request.origin}, contract address: ${contractAddress}`,
203
218
  );
204
219
  }
@@ -238,8 +253,9 @@ export class ContractFunctionSimulator {
238
253
  senderTaggingStore: this.senderTaggingStore,
239
254
  recipientTaggingStore: this.recipientTaggingStore,
240
255
  senderAddressBookStore: this.senderAddressBookStore,
241
- capsuleStore: this.capsuleStore,
256
+ capsuleService: new CapsuleService(this.capsuleStore, scopes),
242
257
  privateEventStore: this.privateEventStore,
258
+ messageContextService: this.messageContextService,
243
259
  contractSyncService: this.contractSyncService,
244
260
  jobId,
245
261
  totalPublicCalldataCount: 0,
@@ -247,6 +263,8 @@ export class ContractFunctionSimulator {
247
263
  scopes,
248
264
  senderForTags,
249
265
  simulator: this.simulator,
266
+ l2TipsStore: this.l2TipsStore,
267
+ hooks: this.hooks,
250
268
  });
251
269
 
252
270
  const setupTime = simulatorSetupTimer.ms();
@@ -276,7 +294,7 @@ export class ContractFunctionSimulator {
276
294
  );
277
295
  const publicFunctionsCalldata = await Promise.all(
278
296
  publicCallRequests.map(async r => {
279
- const calldata = await privateExecutionOracle.privateLoadFromExecutionCache(r.calldataHash);
297
+ const calldata = await privateExecutionOracle.getHashPreimage(r.calldataHash);
280
298
  return new HashedValues(calldata, r.calldataHash);
281
299
  }),
282
300
  );
@@ -297,7 +315,6 @@ export class ContractFunctionSimulator {
297
315
  }
298
316
  }
299
317
 
300
- // docs:start:execute_utility_function
301
318
  /**
302
319
  * Runs a utility function.
303
320
  * @param call - The function call to execute.
@@ -311,15 +328,19 @@ export class ContractFunctionSimulator {
311
328
  call: FunctionCall,
312
329
  authwits: AuthWitness[],
313
330
  anchorBlockHeader: BlockHeader,
314
- scopes: AccessScopes,
331
+ scopes: AztecAddress[],
315
332
  jobId: string,
316
- ): Promise<Fr[]> {
333
+ ): Promise<{ result: Fr[]; offchainEffects: OffchainEffect[] }> {
317
334
  const entryPointArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(call.to, call.selector);
318
335
 
319
336
  if (entryPointArtifact.functionType !== FunctionType.UTILITY) {
320
337
  throw new Error(`Cannot run ${entryPointArtifact.functionType} function as utility`);
321
338
  }
322
339
 
340
+ const utilityExecutor = async (syncCall: FunctionCall, execScopes: AztecAddress[]) => {
341
+ await this.runUtility(syncCall, [], anchorBlockHeader, execScopes, jobId);
342
+ };
343
+
323
344
  const oracle = new UtilityExecutionOracle({
324
345
  contractAddress: call.to,
325
346
  authWitnesses: authwits,
@@ -332,10 +353,16 @@ export class ContractFunctionSimulator {
332
353
  aztecNode: this.aztecNode,
333
354
  recipientTaggingStore: this.recipientTaggingStore,
334
355
  senderAddressBookStore: this.senderAddressBookStore,
335
- capsuleStore: this.capsuleStore,
356
+ capsuleService: new CapsuleService(this.capsuleStore, scopes),
336
357
  privateEventStore: this.privateEventStore,
358
+ messageContextService: this.messageContextService,
359
+ contractSyncService: this.contractSyncService,
360
+ l2TipsStore: this.l2TipsStore,
337
361
  jobId,
338
362
  scopes,
363
+ simulator: this.simulator,
364
+ hooks: this.hooks,
365
+ utilityExecutor,
339
366
  });
340
367
 
341
368
  try {
@@ -361,12 +388,14 @@ export class ContractFunctionSimulator {
361
388
  });
362
389
 
363
390
  this.log.verbose(`Utility execution for ${call.to}.${call.selector} completed`);
364
- return witnessMapToFields(acirExecutionResult.returnWitness);
391
+ return {
392
+ result: witnessMapToFields(acirExecutionResult.returnWitness),
393
+ offchainEffects: oracle.getOffchainEffects(),
394
+ };
365
395
  } catch (err) {
366
396
  throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during private execution'));
367
397
  }
368
398
  }
369
- // docs:end:execute_utility_function
370
399
 
371
400
  /**
372
401
  * Returns the execution statistics collected during the simulator run.
@@ -431,14 +460,34 @@ export async function generateSimulatedProvingResult(
431
460
 
432
461
  let publicTeardownCallRequest;
433
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
+
434
470
  const executions = [privateExecutionResult.entrypoint];
435
471
 
436
472
  while (executions.length !== 0) {
437
473
  const execution = executions.shift()!;
438
474
  executions.unshift(...execution!.nestedExecutionResults);
439
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
+
440
482
  const { contractAddress } = execution.publicInputs.callContext;
441
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
+
442
491
  scopedNoteHashes.push(
443
492
  ...execution.publicInputs.noteHashes
444
493
  .getActiveItems()
@@ -653,9 +702,14 @@ export async function generateSimulatedProvingResult(
653
702
 
654
703
  const publicInputs = new PrivateKernelTailCircuitPublicInputs(
655
704
  constantData,
656
- /*gasUsed=*/ gasUsed.add(Gas.from({ l2Gas: FIXED_L2_GAS, daGas: FIXED_DA_GAS })),
657
- /*feePayer=*/ AztecAddress.zero(),
658
- /*expirationTimestamp=*/ 0n,
705
+ /*gasUsed=*/ gasUsed.add(
706
+ Gas.from({
707
+ l2Gas: isPrivateOnlyTx ? PRIVATE_TX_L2_GAS_OVERHEAD : PUBLIC_TX_L2_GAS_OVERHEAD,
708
+ daGas: TX_DA_GAS_OVERHEAD,
709
+ }),
710
+ ),
711
+ /*feePayer=*/ feePayer,
712
+ /*expirationTimestamp=*/ expirationTimestamp,
659
713
  hasPublicCalls ? inputsForPublic : undefined,
660
714
  !hasPublicCalls ? inputsForRollup : undefined,
661
715
  );
@@ -683,6 +737,7 @@ function squashTransientSideEffects(
683
737
  scopedNullifiersCLA,
684
738
  /*futureNoteHashReads=*/ [],
685
739
  /*futureNullifierReads=*/ [],
740
+ /*futureLogs=*/ [],
686
741
  noteHashNullifierCounterMap,
687
742
  minRevertibleSideEffectCounter,
688
743
  );
@@ -709,7 +764,7 @@ function squashTransientSideEffects(
709
764
  * at the tx's anchor block, mimicking the behavior of the kernels
710
765
  */
711
766
  async function verifyReadRequests(
712
- node: Pick<AztecNode, 'getNoteHashMembershipWitness' | 'getNullifierMembershipWitness'>,
767
+ node: Pick<AztecNode, 'findLeavesIndexes'>,
713
768
  anchorBlockHash: BlockParameter,
714
769
  noteHashReadRequests: ScopedReadRequest[],
715
770
  nullifierReadRequests: ScopedReadRequest[],
@@ -725,16 +780,8 @@ async function verifyReadRequests(
725
780
  nullifierReadRequests.length,
726
781
  );
727
782
 
728
- const noteHashResetActions = getNoteHashReadRequestResetActions(
729
- noteHashReadRequestsCLA,
730
- scopedNoteHashesCLA,
731
- /*futureNoteHashes=*/ [],
732
- );
733
- const nullifierResetActions = getNullifierReadRequestResetActions(
734
- nullifierReadRequestsCLA,
735
- scopedNullifiersCLA,
736
- /*futureNullifiers=*/ [],
737
- );
783
+ const noteHashResetActions = getNoteHashReadRequestResetActions(noteHashReadRequestsCLA, scopedNoteHashesCLA);
784
+ const nullifierResetActions = getNullifierReadRequestResetActions(nullifierReadRequestsCLA, scopedNullifiersCLA);
738
785
 
739
786
  const settledNoteHashReads: { index: number; value: Fr }[] = [];
740
787
  for (let i = 0; i < noteHashResetActions.actions.length; i++) {
@@ -750,13 +797,25 @@ async function verifyReadRequests(
750
797
  }
751
798
  }
752
799
 
753
- const [noteHashWitnesses, nullifierWitnesses] = await Promise.all([
754
- Promise.all(settledNoteHashReads.map(({ value }) => node.getNoteHashMembershipWitness(anchorBlockHash, value))),
755
- 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
+ : [],
756
815
  ]);
757
816
 
758
817
  for (let i = 0; i < settledNoteHashReads.length; i++) {
759
- if (!noteHashWitnesses[i]) {
818
+ if (!noteHashResults[i]) {
760
819
  throw new Error(
761
820
  `Note hash read request at index ${settledNoteHashReads[i].index} is reading an unknown note hash: ${settledNoteHashReads[i].value}`,
762
821
  );
@@ -764,7 +823,7 @@ async function verifyReadRequests(
764
823
  }
765
824
 
766
825
  for (let i = 0; i < settledNullifierReads.length; i++) {
767
- if (!nullifierWitnesses[i]) {
826
+ if (!nullifierResults[i]) {
768
827
  throw new Error(
769
828
  `Nullifier read request at index ${settledNullifierReads[i].index} is reading an unknown nullifier: ${settledNullifierReads[i].value}`,
770
829
  );
@@ -810,9 +869,9 @@ function meterGasUsed(data: PrivateToRollupAccumulatedData | PrivateToPublicAccu
810
869
  meteredL2Gas += numPrivatelogs * L2_GAS_PER_PRIVATE_LOG;
811
870
 
812
871
  const numContractClassLogs = arrayNonEmptyLength(data.contractClassLogsHashes, log => log.isEmpty());
813
- // 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
814
873
  meteredDAFields += data.contractClassLogsHashes.reduce(
815
- (acc, log) => (!log.isEmpty() ? acc + log.logHash.length + 2 : acc),
874
+ (acc, log) => (!log.isEmpty() ? acc + log.logHash.length + 1 : acc),
816
875
  0,
817
876
  );
818
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
+ }