@aztec/pxe 0.0.1-commit.993d240 → 0.0.1-commit.9a89641

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 (451) hide show
  1. package/dest/bin/check_oracle_version.d.ts +2 -12
  2. package/dest/bin/check_oracle_version.d.ts.map +1 -1
  3. package/dest/bin/check_oracle_version.js +9 -122
  4. package/dest/bin/index.d.ts +2 -2
  5. package/dest/bin/index.d.ts.map +1 -1
  6. package/dest/bin/index.js +1 -1
  7. package/dest/bin/oracle_version_helpers.d.ts +20 -0
  8. package/dest/bin/oracle_version_helpers.d.ts.map +1 -0
  9. package/dest/bin/oracle_version_helpers.js +25 -0
  10. package/dest/block_synchronizer/block_stream_source.d.ts +5 -5
  11. package/dest/block_synchronizer/block_stream_source.d.ts.map +1 -1
  12. package/dest/block_synchronizer/block_stream_source.js +4 -29
  13. package/dest/block_synchronizer/block_synchronizer.d.ts +17 -15
  14. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
  15. package/dest/block_synchronizer/block_synchronizer.js +41 -18
  16. package/dest/config/index.d.ts +2 -1
  17. package/dest/config/index.d.ts.map +1 -1
  18. package/dest/config/index.js +1 -0
  19. package/dest/config/package_info.js +1 -1
  20. package/dest/contract/contract_class_service.d.ts +24 -0
  21. package/dest/contract/contract_class_service.d.ts.map +1 -0
  22. package/dest/contract/contract_class_service.js +36 -0
  23. package/dest/contract/contract_sync_service.d.ts +48 -0
  24. package/dest/contract/contract_sync_service.d.ts.map +1 -0
  25. package/dest/{contract_sync → contract}/contract_sync_service.js +26 -45
  26. package/dest/contract/helpers.d.ts +7 -0
  27. package/dest/contract/helpers.d.ts.map +1 -0
  28. package/dest/contract/helpers.js +20 -0
  29. package/dest/contract/skip_sync_contracts.d.ts +11 -0
  30. package/dest/contract/skip_sync_contracts.d.ts.map +1 -0
  31. package/dest/contract/skip_sync_contracts.js +18 -0
  32. package/dest/contract_function_simulator/anchored_contract_data.d.ts +36 -0
  33. package/dest/contract_function_simulator/anchored_contract_data.d.ts.map +1 -0
  34. package/dest/contract_function_simulator/anchored_contract_data.js +54 -0
  35. package/dest/contract_function_simulator/contract_function_simulator.d.ts +19 -25
  36. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  37. package/dest/contract_function_simulator/contract_function_simulator.js +63 -49
  38. package/dest/contract_function_simulator/execution_note_cache.d.ts +4 -10
  39. package/dest/contract_function_simulator/execution_note_cache.d.ts.map +1 -1
  40. package/dest/contract_function_simulator/execution_note_cache.js +8 -28
  41. package/dest/contract_function_simulator/index.d.ts +24 -6
  42. package/dest/contract_function_simulator/index.d.ts.map +1 -1
  43. package/dest/contract_function_simulator/index.js +9 -4
  44. package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts +8 -27
  45. package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts.map +1 -1
  46. package/dest/contract_function_simulator/noir-structs/bounded_vec.js +8 -23
  47. package/dest/contract_function_simulator/noir-structs/contract_class_log_data.d.ts +9 -0
  48. package/dest/contract_function_simulator/noir-structs/contract_class_log_data.d.ts.map +1 -0
  49. package/dest/contract_function_simulator/noir-structs/contract_class_log_data.js +1 -0
  50. package/dest/contract_function_simulator/noir-structs/embedded_curve_point.d.ts +7 -0
  51. package/dest/contract_function_simulator/noir-structs/embedded_curve_point.d.ts.map +1 -0
  52. package/dest/contract_function_simulator/noir-structs/embedded_curve_point.js +1 -0
  53. package/dest/contract_function_simulator/noir-structs/ephemeral_array.d.ts +37 -0
  54. package/dest/contract_function_simulator/noir-structs/ephemeral_array.d.ts.map +1 -0
  55. package/dest/contract_function_simulator/noir-structs/ephemeral_array.js +59 -0
  56. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +3 -2
  57. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts.map +1 -1
  58. package/dest/contract_function_simulator/noir-structs/event_validation_request.js +2 -2
  59. package/dest/contract_function_simulator/noir-structs/fact.d.ts +16 -0
  60. package/dest/contract_function_simulator/noir-structs/fact.d.ts.map +1 -0
  61. package/dest/contract_function_simulator/noir-structs/fact.js +6 -0
  62. package/dest/contract_function_simulator/noir-structs/fact_collection.d.ts +27 -0
  63. package/dest/contract_function_simulator/noir-structs/fact_collection.d.ts.map +1 -0
  64. package/dest/contract_function_simulator/noir-structs/fact_collection.js +31 -0
  65. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts +11 -12
  66. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts.map +1 -1
  67. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.js +6 -49
  68. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts +10 -8
  69. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts.map +1 -1
  70. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.js +1 -60
  71. package/dest/contract_function_simulator/noir-structs/note_data.d.ts +27 -0
  72. package/dest/contract_function_simulator/noir-structs/note_data.d.ts.map +1 -0
  73. package/dest/contract_function_simulator/noir-structs/note_data.js +3 -0
  74. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +3 -2
  75. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts.map +1 -1
  76. package/dest/contract_function_simulator/noir-structs/note_validation_request.js +3 -3
  77. package/dest/contract_function_simulator/noir-structs/option.d.ts +9 -11
  78. package/dest/contract_function_simulator/noir-structs/option.d.ts.map +1 -1
  79. package/dest/contract_function_simulator/noir-structs/option.js +18 -13
  80. package/dest/contract_function_simulator/noir-structs/origin_block.d.ts +11 -0
  81. package/dest/contract_function_simulator/noir-structs/origin_block.d.ts.map +1 -0
  82. package/dest/contract_function_simulator/noir-structs/origin_block.js +5 -0
  83. package/dest/contract_function_simulator/noir-structs/pending_tagged_log.d.ts +11 -0
  84. package/dest/contract_function_simulator/noir-structs/pending_tagged_log.d.ts.map +1 -0
  85. package/dest/contract_function_simulator/noir-structs/pending_tagged_log.js +4 -0
  86. package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts +8 -0
  87. package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts.map +1 -0
  88. package/dest/contract_function_simulator/noir-structs/provided_secret.js +1 -0
  89. package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.d.ts +28 -0
  90. package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.d.ts.map +1 -0
  91. package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.js +50 -0
  92. package/dest/contract_function_simulator/noir-structs/resolved_tx.d.ts +19 -0
  93. package/dest/contract_function_simulator/noir-structs/resolved_tx.d.ts.map +1 -0
  94. package/dest/contract_function_simulator/noir-structs/resolved_tx.js +9 -0
  95. package/dest/contract_function_simulator/noir-structs/tx_effect_data.d.ts +15 -0
  96. package/dest/contract_function_simulator/noir-structs/tx_effect_data.d.ts.map +1 -0
  97. package/dest/contract_function_simulator/noir-structs/tx_effect_data.js +5 -0
  98. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts +6 -11
  99. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts.map +1 -1
  100. package/dest/contract_function_simulator/noir-structs/utility_context.js +1 -20
  101. package/dest/contract_function_simulator/oracle/acir_callback.d.ts +21 -0
  102. package/dest/contract_function_simulator/oracle/acir_callback.d.ts.map +1 -0
  103. package/dest/contract_function_simulator/oracle/acir_callback.js +115 -0
  104. package/dest/contract_function_simulator/oracle/index.d.ts +2 -13
  105. package/dest/contract_function_simulator/oracle/index.d.ts.map +1 -1
  106. package/dest/contract_function_simulator/oracle/index.js +1 -1
  107. package/dest/contract_function_simulator/oracle/interfaces.d.ts +15 -114
  108. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  109. package/dest/contract_function_simulator/oracle/interfaces.js +2 -2
  110. package/dest/contract_function_simulator/oracle/legacy_oracle_registry.d.ts +39 -0
  111. package/dest/contract_function_simulator/oracle/legacy_oracle_registry.d.ts.map +1 -0
  112. package/dest/contract_function_simulator/oracle/legacy_oracle_registry.js +107 -0
  113. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts +3 -14
  114. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts.map +1 -1
  115. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.js +1 -24
  116. package/dest/contract_function_simulator/oracle/oracle_registry.d.ts +92 -100
  117. package/dest/contract_function_simulator/oracle/oracle_registry.d.ts.map +1 -1
  118. package/dest/contract_function_simulator/oracle/oracle_registry.js +296 -479
  119. package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts +274 -0
  120. package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts.map +1 -0
  121. package/dest/contract_function_simulator/oracle/oracle_type_mappings.js +1253 -0
  122. package/dest/contract_function_simulator/oracle/private_execution.d.ts +1 -1
  123. package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
  124. package/dest/contract_function_simulator/oracle/private_execution.js +2 -3
  125. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +32 -21
  126. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  127. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +152 -49
  128. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +97 -37
  129. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  130. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +376 -138
  131. package/dest/contract_function_simulator/transient_array_service.d.ts +31 -0
  132. package/dest/contract_function_simulator/transient_array_service.d.ts.map +1 -0
  133. package/dest/contract_function_simulator/transient_array_service.js +62 -0
  134. package/dest/debug/pxe_debug_utils.d.ts +2 -2
  135. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  136. package/dest/entrypoints/client/bundle/index.d.ts +2 -1
  137. package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
  138. package/dest/entrypoints/client/bundle/index.js +1 -0
  139. package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
  140. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  141. package/dest/entrypoints/client/bundle/utils.js +17 -6
  142. package/dest/entrypoints/client/lazy/index.d.ts +2 -1
  143. package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
  144. package/dest/entrypoints/client/lazy/index.js +1 -0
  145. package/dest/entrypoints/client/lazy/utils.d.ts +1 -1
  146. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  147. package/dest/entrypoints/client/lazy/utils.js +17 -6
  148. package/dest/entrypoints/client/store.d.ts +14 -0
  149. package/dest/entrypoints/client/store.d.ts.map +1 -0
  150. package/dest/entrypoints/client/store.js +42 -0
  151. package/dest/entrypoints/pxe_creation_options.d.ts +9 -3
  152. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  153. package/dest/entrypoints/server/index.d.ts +6 -3
  154. package/dest/entrypoints/server/index.d.ts.map +1 -1
  155. package/dest/entrypoints/server/index.js +4 -2
  156. package/dest/entrypoints/server/store.d.ts +18 -0
  157. package/dest/entrypoints/server/store.d.ts.map +1 -0
  158. package/dest/entrypoints/server/store.js +28 -0
  159. package/dest/entrypoints/server/utils.d.ts +1 -1
  160. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  161. package/dest/entrypoints/server/utils.js +16 -4
  162. package/dest/error_enriching.d.ts +5 -3
  163. package/dest/error_enriching.d.ts.map +1 -1
  164. package/dest/error_enriching.js +13 -11
  165. package/dest/events/event_service.d.ts +13 -6
  166. package/dest/events/event_service.d.ts.map +1 -1
  167. package/dest/events/event_service.js +13 -13
  168. package/dest/hooks/execution_hooks.d.ts +31 -11
  169. package/dest/hooks/execution_hooks.d.ts.map +1 -1
  170. package/dest/hooks/execution_hooks.js +3 -3
  171. package/dest/hooks/index.d.ts +4 -3
  172. package/dest/hooks/index.d.ts.map +1 -1
  173. package/dest/hooks/index.js +1 -0
  174. package/dest/hooks/resolve_custom_request.d.ts +23 -0
  175. package/dest/hooks/resolve_custom_request.d.ts.map +1 -0
  176. package/dest/hooks/resolve_custom_request.js +3 -0
  177. package/dest/hooks/resolve_tagging_secret_strategy.d.ts +50 -0
  178. package/dest/hooks/resolve_tagging_secret_strategy.d.ts.map +1 -0
  179. package/dest/hooks/resolve_tagging_secret_strategy.js +3 -0
  180. package/dest/logs/log_service.d.ts +18 -8
  181. package/dest/logs/log_service.d.ts.map +1 -1
  182. package/dest/logs/log_service.js +93 -45
  183. package/dest/messages/tx_resolver_service.d.ts +28 -0
  184. package/dest/messages/tx_resolver_service.d.ts.map +1 -0
  185. package/dest/messages/tx_resolver_service.js +61 -0
  186. package/dest/node/benchmarked_node.d.ts +20 -0
  187. package/dest/node/benchmarked_node.d.ts.map +1 -0
  188. package/dest/node/benchmarked_node.js +94 -0
  189. package/dest/node/caching_aztec_node.d.ts +24 -0
  190. package/dest/node/caching_aztec_node.d.ts.map +1 -0
  191. package/dest/node/caching_aztec_node.js +267 -0
  192. package/dest/notes/note_service.d.ts +13 -7
  193. package/dest/notes/note_service.d.ts.map +1 -1
  194. package/dest/notes/note_service.js +10 -10
  195. package/dest/oracle_version.d.ts +3 -3
  196. package/dest/oracle_version.js +8 -8
  197. package/dest/private_kernel/batch_planner.d.ts +1 -1
  198. package/dest/private_kernel/batch_planner.d.ts.map +1 -1
  199. package/dest/private_kernel/batch_planner.js +1 -1
  200. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +1 -1
  201. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -1
  202. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.js +6 -2
  203. package/dest/private_kernel/hints/test_utils.js +1 -1
  204. package/dest/private_kernel/private_kernel_execution_prover.d.ts +1 -1
  205. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  206. package/dest/private_kernel/private_kernel_execution_prover.js +61 -40
  207. package/dest/private_kernel/private_kernel_oracle.d.ts +4 -2
  208. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  209. package/dest/private_kernel/private_kernel_oracle.js +17 -5
  210. package/dest/pxe.d.ts +114 -48
  211. package/dest/pxe.d.ts.map +1 -1
  212. package/dest/pxe.js +251 -148
  213. package/dest/storage/allowed_scopes.d.ts +6 -0
  214. package/dest/storage/allowed_scopes.d.ts.map +1 -0
  215. package/dest/storage/allowed_scopes.js +7 -0
  216. package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -6
  217. package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
  218. package/dest/storage/anchor_block_store/anchor_block_store.js +8 -6
  219. package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts +1 -1
  220. package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts.map +1 -1
  221. package/dest/storage/backwards_compatibility_tests/schema_tests.js +129 -49
  222. package/dest/storage/capsule_store/capsule_service.d.ts +1 -1
  223. package/dest/storage/capsule_store/capsule_service.d.ts.map +1 -1
  224. package/dest/storage/capsule_store/capsule_service.js +6 -9
  225. package/dest/storage/contract_store/contract_store.d.ts +27 -24
  226. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  227. package/dest/storage/contract_store/contract_store.js +66 -77
  228. package/dest/storage/fact_store/fact_service.d.ts +22 -0
  229. package/dest/storage/fact_store/fact_service.d.ts.map +1 -0
  230. package/dest/storage/fact_store/fact_service.js +45 -0
  231. package/dest/storage/fact_store/fact_store.d.ts +95 -0
  232. package/dest/storage/fact_store/fact_store.d.ts.map +1 -0
  233. package/dest/storage/fact_store/fact_store.js +408 -0
  234. package/dest/storage/fact_store/fact_store_keys.d.ts +34 -0
  235. package/dest/storage/fact_store/fact_store_keys.d.ts.map +1 -0
  236. package/dest/storage/fact_store/fact_store_keys.js +50 -0
  237. package/dest/storage/fact_store/index.d.ts +6 -0
  238. package/dest/storage/fact_store/index.d.ts.map +1 -0
  239. package/dest/storage/fact_store/index.js +4 -0
  240. package/dest/storage/fact_store/origin_state.d.ts +59 -0
  241. package/dest/storage/fact_store/origin_state.d.ts.map +1 -0
  242. package/dest/storage/fact_store/origin_state.js +60 -0
  243. package/dest/storage/fact_store/stored_fact.d.ts +32 -0
  244. package/dest/storage/fact_store/stored_fact.d.ts.map +1 -0
  245. package/dest/storage/fact_store/stored_fact.js +64 -0
  246. package/dest/storage/index.d.ts +3 -2
  247. package/dest/storage/index.d.ts.map +1 -1
  248. package/dest/storage/index.js +2 -1
  249. package/dest/storage/metadata.d.ts +2 -2
  250. package/dest/storage/metadata.d.ts.map +1 -1
  251. package/dest/storage/metadata.js +1 -1
  252. package/dest/storage/note_store/note_store.d.ts +42 -33
  253. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  254. package/dest/storage/note_store/note_store.js +197 -168
  255. package/dest/storage/note_store/stored_note.d.ts +3 -8
  256. package/dest/storage/note_store/stored_note.d.ts.map +1 -1
  257. package/dest/storage/note_store/stored_note.js +4 -20
  258. package/dest/storage/open_pxe_stores.d.ts +5 -3
  259. package/dest/storage/open_pxe_stores.d.ts.map +1 -1
  260. package/dest/storage/open_pxe_stores.js +5 -3
  261. package/dest/storage/private_event_store/private_event_store.d.ts +13 -16
  262. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  263. package/dest/storage/private_event_store/private_event_store.js +40 -43
  264. package/dest/storage/store_identity.d.ts +35 -0
  265. package/dest/storage/store_identity.d.ts.map +1 -0
  266. package/dest/storage/store_identity.js +44 -0
  267. package/dest/storage/tagging_store/index.d.ts +2 -2
  268. package/dest/storage/tagging_store/index.d.ts.map +1 -1
  269. package/dest/storage/tagging_store/index.js +1 -1
  270. package/dest/storage/tagging_store/sender_tagging_store.d.ts +41 -10
  271. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  272. package/dest/storage/tagging_store/sender_tagging_store.js +81 -29
  273. package/dest/storage/tagging_store/tagging_secret_sources_store.d.ts +51 -0
  274. package/dest/storage/tagging_store/tagging_secret_sources_store.d.ts.map +1 -0
  275. package/dest/storage/tagging_store/tagging_secret_sources_store.js +105 -0
  276. package/dest/tagging/constants.d.ts +11 -2
  277. package/dest/tagging/constants.d.ts.map +1 -1
  278. package/dest/tagging/constants.js +38 -10
  279. package/dest/tagging/get_all_logs_by_tags.d.ts +29 -8
  280. package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -1
  281. package/dest/tagging/get_all_logs_by_tags.js +29 -10
  282. package/dest/tagging/index.d.ts +3 -3
  283. package/dest/tagging/index.d.ts.map +1 -1
  284. package/dest/tagging/index.js +2 -2
  285. package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts +27 -9
  286. package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts.map +1 -1
  287. package/dest/tagging/recipient_sync/sync_tagged_private_logs.js +104 -33
  288. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +6 -3
  289. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
  290. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +23 -36
  291. package/dest/tagging/sender_sync/utils/classify_pending_txs.d.ts +22 -0
  292. package/dest/tagging/sender_sync/utils/classify_pending_txs.d.ts.map +1 -0
  293. package/dest/tagging/sender_sync/utils/classify_pending_txs.js +61 -0
  294. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +15 -5
  295. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
  296. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +36 -35
  297. package/dest/tagging/sender_sync/utils/resolve_pending_txs.d.ts +29 -0
  298. package/dest/tagging/sender_sync/utils/resolve_pending_txs.d.ts.map +1 -0
  299. package/dest/tagging/sender_sync/utils/resolve_pending_txs.js +41 -0
  300. package/dest/tagging/sender_sync/utils/test_utils.d.ts +16 -0
  301. package/dest/tagging/sender_sync/utils/test_utils.d.ts.map +1 -0
  302. package/dest/tagging/sender_sync/utils/test_utils.js +24 -0
  303. package/dest/tagging/testing/tag_query_test_utils.d.ts +6 -0
  304. package/dest/tagging/testing/tag_query_test_utils.d.ts.map +1 -0
  305. package/dest/tagging/testing/tag_query_test_utils.js +10 -0
  306. package/package.json +17 -17
  307. package/src/bin/check_oracle_version.ts +8 -151
  308. package/src/bin/index.ts +1 -1
  309. package/src/bin/oracle_version_helpers.ts +30 -0
  310. package/src/block_synchronizer/block_stream_source.ts +6 -45
  311. package/src/block_synchronizer/block_synchronizer.ts +54 -30
  312. package/src/config/index.ts +1 -0
  313. package/src/config/package_info.ts +1 -1
  314. package/src/contract/contract_class_service.ts +45 -0
  315. package/src/{contract_sync → contract}/contract_sync_service.ts +37 -50
  316. package/src/contract/helpers.ts +35 -0
  317. package/src/contract/skip_sync_contracts.ts +23 -0
  318. package/src/contract_function_simulator/anchored_contract_data.ts +74 -0
  319. package/src/contract_function_simulator/contract_function_simulator.ts +96 -59
  320. package/src/contract_function_simulator/execution_note_cache.ts +8 -29
  321. package/src/contract_function_simulator/index.ts +87 -5
  322. package/src/contract_function_simulator/noir-structs/bounded_vec.ts +12 -24
  323. package/src/contract_function_simulator/noir-structs/contract_class_log_data.ts +9 -0
  324. package/src/contract_function_simulator/noir-structs/embedded_curve_point.ts +4 -0
  325. package/src/contract_function_simulator/noir-structs/ephemeral_array.ts +66 -0
  326. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +3 -3
  327. package/src/contract_function_simulator/noir-structs/fact.ts +13 -0
  328. package/src/contract_function_simulator/noir-structs/fact_collection.ts +64 -0
  329. package/src/contract_function_simulator/noir-structs/log_retrieval_request.ts +20 -46
  330. package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +13 -60
  331. package/src/contract_function_simulator/noir-structs/note_data.ts +27 -0
  332. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +4 -4
  333. package/src/contract_function_simulator/noir-structs/option.ts +17 -11
  334. package/src/contract_function_simulator/noir-structs/origin_block.ts +8 -0
  335. package/src/contract_function_simulator/noir-structs/pending_tagged_log.ts +12 -0
  336. package/src/contract_function_simulator/noir-structs/provided_secret.ts +5 -0
  337. package/src/contract_function_simulator/noir-structs/resolved_tagging_strategy.ts +66 -0
  338. package/src/contract_function_simulator/noir-structs/resolved_tx.ts +19 -0
  339. package/src/contract_function_simulator/noir-structs/tx_effect_data.ts +16 -0
  340. package/src/contract_function_simulator/noir-structs/utility_context.ts +5 -17
  341. package/src/contract_function_simulator/oracle/acir_callback.ts +154 -0
  342. package/src/contract_function_simulator/oracle/index.ts +1 -15
  343. package/src/contract_function_simulator/oracle/interfaces.ts +11 -189
  344. package/src/contract_function_simulator/oracle/legacy_oracle_registry.ts +147 -0
  345. package/src/contract_function_simulator/oracle/message_load_oracle_inputs.ts +6 -21
  346. package/src/contract_function_simulator/oracle/oracle_registry.ts +289 -483
  347. package/src/contract_function_simulator/oracle/oracle_type_mappings.ts +1067 -0
  348. package/src/contract_function_simulator/oracle/private_execution.ts +2 -3
  349. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +190 -61
  350. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +556 -174
  351. package/src/contract_function_simulator/transient_array_service.ts +91 -0
  352. package/src/debug/pxe_debug_utils.ts +1 -1
  353. package/src/entrypoints/client/bundle/index.ts +1 -0
  354. package/src/entrypoints/client/bundle/utils.ts +24 -5
  355. package/src/entrypoints/client/lazy/index.ts +1 -0
  356. package/src/entrypoints/client/lazy/utils.ts +24 -5
  357. package/src/entrypoints/client/store.ts +54 -0
  358. package/src/entrypoints/pxe_creation_options.ts +8 -2
  359. package/src/entrypoints/server/index.ts +6 -2
  360. package/src/entrypoints/server/store.ts +47 -0
  361. package/src/entrypoints/server/utils.ts +31 -9
  362. package/src/error_enriching.ts +27 -11
  363. package/src/events/event_service.ts +24 -14
  364. package/src/hooks/execution_hooks.ts +32 -12
  365. package/src/hooks/index.ts +8 -2
  366. package/src/hooks/resolve_custom_request.ts +24 -0
  367. package/src/hooks/resolve_tagging_secret_strategy.ts +60 -0
  368. package/src/logs/log_service.ts +122 -61
  369. package/src/messages/tx_resolver_service.ts +80 -0
  370. package/src/node/benchmarked_node.ts +140 -0
  371. package/src/node/caching_aztec_node.ts +406 -0
  372. package/src/notes/note_service.ts +20 -14
  373. package/src/oracle_version.ts +8 -8
  374. package/src/private_kernel/batch_planner.ts +0 -1
  375. package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +11 -1
  376. package/src/private_kernel/hints/test_utils.ts +1 -1
  377. package/src/private_kernel/private_kernel_execution_prover.ts +112 -56
  378. package/src/private_kernel/private_kernel_oracle.ts +23 -4
  379. package/src/pxe.ts +357 -172
  380. package/src/storage/allowed_scopes.ts +14 -0
  381. package/src/storage/anchor_block_store/anchor_block_store.ts +8 -6
  382. package/src/storage/backwards_compatibility_tests/__snapshots__/AddressStore.json +6 -6
  383. package/src/storage/backwards_compatibility_tests/__snapshots__/ContractStore.json +1 -1
  384. package/src/storage/backwards_compatibility_tests/__snapshots__/FactStore.json +40 -0
  385. package/src/storage/backwards_compatibility_tests/__snapshots__/KeyStore.json +12 -12
  386. package/src/storage/backwards_compatibility_tests/__snapshots__/L2TipsKVStore.json +9 -15
  387. package/src/storage/backwards_compatibility_tests/__snapshots__/NoteStore.json +24 -4
  388. package/src/storage/backwards_compatibility_tests/__snapshots__/RecipientTaggingStore.json +11 -3
  389. package/src/storage/backwards_compatibility_tests/__snapshots__/SenderTaggingStore.json +12 -4
  390. package/src/storage/backwards_compatibility_tests/__snapshots__/TaggingSecretSourcesStore.json +30 -0
  391. package/src/storage/backwards_compatibility_tests/__snapshots__/opened_stores.json +29 -9
  392. package/src/storage/backwards_compatibility_tests/schema_tests.ts +141 -50
  393. package/src/storage/capsule_store/capsule_service.ts +8 -13
  394. package/src/storage/contract_store/contract_store.ts +88 -94
  395. package/src/storage/fact_store/fact_service.ts +69 -0
  396. package/src/storage/fact_store/fact_store.ts +487 -0
  397. package/src/storage/fact_store/fact_store_keys.ts +75 -0
  398. package/src/storage/fact_store/index.ts +15 -0
  399. package/src/storage/fact_store/origin_state.ts +84 -0
  400. package/src/storage/fact_store/stored_fact.ts +80 -0
  401. package/src/storage/index.ts +2 -1
  402. package/src/storage/metadata.ts +1 -1
  403. package/src/storage/note_store/note_store.ts +226 -187
  404. package/src/storage/note_store/stored_note.ts +5 -27
  405. package/src/storage/open_pxe_stores.ts +6 -3
  406. package/src/storage/private_event_store/private_event_store.ts +49 -55
  407. package/src/storage/store_identity.ts +72 -0
  408. package/src/storage/tagging_store/index.ts +1 -1
  409. package/src/storage/tagging_store/sender_tagging_store.ts +113 -41
  410. package/src/storage/tagging_store/tagging_secret_sources_store.ts +138 -0
  411. package/src/tagging/constants.ts +42 -10
  412. package/src/tagging/get_all_logs_by_tags.ts +47 -11
  413. package/src/tagging/index.ts +7 -2
  414. package/src/tagging/recipient_sync/sync_tagged_private_logs.ts +161 -46
  415. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +27 -57
  416. package/src/tagging/sender_sync/utils/classify_pending_txs.ts +91 -0
  417. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +46 -40
  418. package/src/tagging/sender_sync/utils/resolve_pending_txs.ts +64 -0
  419. package/src/tagging/sender_sync/utils/test_utils.ts +46 -0
  420. package/src/tagging/testing/tag_query_test_utils.ts +11 -0
  421. package/dest/contract_function_simulator/benchmarked_node.d.ts +0 -9
  422. package/dest/contract_function_simulator/benchmarked_node.d.ts.map +0 -1
  423. package/dest/contract_function_simulator/benchmarked_node.js +0 -77
  424. package/dest/contract_function_simulator/oracle/oracle.d.ts +0 -89
  425. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +0 -1
  426. package/dest/contract_function_simulator/oracle/oracle.js +0 -552
  427. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts +0 -6
  428. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts.map +0 -1
  429. package/dest/contract_function_simulator/proxied_contract_data_source.js +0 -51
  430. package/dest/contract_sync/contract_sync_service.d.ts +0 -42
  431. package/dest/contract_sync/contract_sync_service.d.ts.map +0 -1
  432. package/dest/contract_sync/helpers.d.ts +0 -27
  433. package/dest/contract_sync/helpers.d.ts.map +0 -1
  434. package/dest/contract_sync/helpers.js +0 -53
  435. package/dest/messages/message_context_service.d.ts +0 -17
  436. package/dest/messages/message_context_service.d.ts.map +0 -1
  437. package/dest/messages/message_context_service.js +0 -38
  438. package/dest/storage/tagging_store/sender_address_book_store.d.ts +0 -14
  439. package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +0 -1
  440. package/dest/storage/tagging_store/sender_address_book_store.js +0 -36
  441. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +0 -17
  442. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +0 -1
  443. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +0 -60
  444. package/src/contract_function_simulator/benchmarked_node.ts +0 -103
  445. package/src/contract_function_simulator/oracle/oracle.ts +0 -711
  446. package/src/contract_function_simulator/proxied_contract_data_source.ts +0 -60
  447. package/src/contract_sync/helpers.ts +0 -86
  448. package/src/messages/message_context_service.ts +0 -45
  449. package/src/storage/backwards_compatibility_tests/__snapshots__/SenderAddressBookStore.json +0 -16
  450. package/src/storage/tagging_store/sender_address_book_store.ts +0 -48
  451. package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +0 -66
@@ -1,8 +1,9 @@
1
- import { ARCHIVE_HEIGHT, type NOTE_HASH_TREE_HEIGHT } from '@aztec/constants';
1
+ import { ARCHIVE_HEIGHT, type NOTE_HASH_TREE_HEIGHT, PRIVATE_LOG_CIPHERTEXT_LEN } from '@aztec/constants';
2
2
  import type { BlockNumber } from '@aztec/foundation/branded-types';
3
3
  import { uniqueBy } from '@aztec/foundation/collection';
4
4
  import { Aes128 } from '@aztec/foundation/crypto/aes128';
5
5
  import { Fr } from '@aztec/foundation/curves/bn254';
6
+ import { Point } from '@aztec/foundation/curves/grumpkin';
6
7
  import { LogLevels, type Logger, createLogger } from '@aztec/foundation/log';
7
8
  import { MembershipWitness } from '@aztec/foundation/trees';
8
9
  import type { KeyStore } from '@aztec/key-store';
@@ -14,73 +15,88 @@ import {
14
15
  toACVMWitness,
15
16
  witnessMapToFields,
16
17
  } from '@aztec/simulator/client';
18
+ import { STANDARD_HANDSHAKE_REGISTRY_ADDRESS } from '@aztec/standard-contracts/handshake-registry/constants';
17
19
  import { type FunctionCall, FunctionSelector } from '@aztec/stdlib/abi';
18
20
  import type { AuthWitness } from '@aztec/stdlib/auth-witness';
19
21
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
20
22
  import { BlockHash, type L2TipsProvider } from '@aztec/stdlib/block';
21
- import type { CompleteAddress, ContractInstance, PartialAddress } from '@aztec/stdlib/contract';
23
+ import type { CompleteAddress, ContractInstancePreimageWithAddress, PartialAddress } from '@aztec/stdlib/contract';
22
24
  import { siloNullifier } from '@aztec/stdlib/hash';
23
25
  import type { AztecNode } from '@aztec/stdlib/interfaces/server';
24
26
  import type { KeyValidationRequest } from '@aztec/stdlib/kernel';
25
- import { PublicKey, PublicKeys, computeAddressSecret, hashPublicKey } from '@aztec/stdlib/keys';
26
- import { MessageContext, deriveAppSiloedSharedSecret } from '@aztec/stdlib/logs';
27
- import { getNonNullifiedL1ToL2MessageWitness } from '@aztec/stdlib/messaging';
27
+ import { PublicKeys, computeAddressSecret, hashPublicKey } from '@aztec/stdlib/keys';
28
+ import { AppTaggingSecret, FlatPublicLogs, appSiloEcdhSharedSecret } from '@aztec/stdlib/logs';
29
+ import { type UnsiloedMessageNullifier, getL1ToL2MessageWitness } from '@aztec/stdlib/messaging';
28
30
  import type { NoteStatus } from '@aztec/stdlib/note';
29
31
  import { MerkleTreeId, type NullifierMembershipWitness, PublicDataWitness } from '@aztec/stdlib/trees';
30
32
  import {
31
33
  type BlockHeader,
34
+ CallContext,
32
35
  type Capsule,
33
- type IndexedTxEffect,
34
36
  type OffchainEffect,
35
- TxEffect,
37
+ type TxEffect,
36
38
  type TxHash,
39
+ type TxReceipt,
37
40
  } from '@aztec/stdlib/tx';
38
41
 
42
+ import type { ContractSyncService } from '../../contract/contract_sync_service.js';
39
43
  import { createContractLogger, logContractMessage, stripAztecnrLogPrefix } from '../../contract_logging.js';
40
- import type { ContractSyncService } from '../../contract_sync/contract_sync_service.js';
41
- import { EventService } from '../../events/event_service.js';
44
+ import { EventService, type EventValidationTxData } from '../../events/event_service.js';
42
45
  import type { UtilityCallAuthorizationRequest } from '../../hooks/authorize_utility_call.js';
43
46
  import type { ExecutionHooks } from '../../hooks/index.js';
44
- import { LogService } from '../../logs/log_service.js';
45
- import { MessageContextService } from '../../messages/message_context_service.js';
46
- import { NoteService } from '../../notes/note_service.js';
47
+ import { LogService, type RetrievedTaggedLog } from '../../logs/log_service.js';
48
+ import { type TxOnchainContext, TxResolverService } from '../../messages/tx_resolver_service.js';
49
+ import { NoteService, type NoteValidationTxData } from '../../notes/note_service.js';
47
50
  import { ORACLE_VERSION_MAJOR } from '../../oracle_version.js';
48
51
  import type { AddressStore } from '../../storage/address_store/address_store.js';
52
+ import { assertAllowedScope } from '../../storage/allowed_scopes.js';
49
53
  import type { CapsuleService } from '../../storage/capsule_store/capsule_service.js';
50
- import type { ContractStore } from '../../storage/contract_store/contract_store.js';
54
+ import { FactCollectionKey, FactCollectionTypeKey, anchoredTipBlockNumbers } from '../../storage/fact_store/index.js';
55
+ import type { FactService, OriginBlock } from '../../storage/fact_store/index.js';
51
56
  import type { NoteStore } from '../../storage/note_store/note_store.js';
52
57
  import type { PrivateEventStore } from '../../storage/private_event_store/private_event_store.js';
53
58
  import type { RecipientTaggingStore } from '../../storage/tagging_store/recipient_tagging_store.js';
54
- import type { SenderAddressBookStore } from '../../storage/tagging_store/sender_address_book_store.js';
59
+ import type { TaggingSecretSourcesStore } from '../../storage/tagging_store/tagging_secret_sources_store.js';
60
+ import type { AnchoredContractData } from '../anchored_contract_data.js';
55
61
  import { EphemeralArrayService } from '../ephemeral_array_service.js';
56
62
  import { BoundedVec } from '../noir-structs/bounded_vec.js';
57
- import { EventValidationRequest } from '../noir-structs/event_validation_request.js';
58
- import { LogRetrievalRequest } from '../noir-structs/log_retrieval_request.js';
59
- import { NoteValidationRequest } from '../noir-structs/note_validation_request.js';
63
+ import type { EmbeddedCurvePoint } from '../noir-structs/embedded_curve_point.js';
64
+ import { EphemeralArray } from '../noir-structs/ephemeral_array.js';
65
+ import type { EventValidationRequest } from '../noir-structs/event_validation_request.js';
66
+ import { type FactCollection, emptyFactCollection, toNoirFactCollection } from '../noir-structs/fact_collection.js';
67
+ import type { LogRetrievalRequest } from '../noir-structs/log_retrieval_request.js';
68
+ import type { LogRetrievalResponse } from '../noir-structs/log_retrieval_response.js';
69
+ import type { NoteData } from '../noir-structs/note_data.js';
70
+ import type { NoteValidationRequest } from '../noir-structs/note_validation_request.js';
60
71
  import { Option } from '../noir-structs/option.js';
61
- import { UtilityContext } from '../noir-structs/utility_context.js';
72
+ import type { PendingTaggedLog } from '../noir-structs/pending_tagged_log.js';
73
+ import type { ProvidedSecret } from '../noir-structs/provided_secret.js';
74
+ import type { ResolvedTx } from '../noir-structs/resolved_tx.js';
75
+ import type { TxEffectData } from '../noir-structs/tx_effect_data.js';
76
+ import type { UtilityContext } from '../noir-structs/utility_context.js';
62
77
  import { pickNotes } from '../pick_notes.js';
63
- import type { IMiscOracle, IUtilityExecutionOracle, NoteData } from './interfaces.js';
64
- import { MessageLoadOracleInputs } from './message_load_oracle_inputs.js';
65
- import { Oracle } from './oracle.js';
78
+ import type { TransientArrayService } from '../transient_array_service.js';
79
+ import { buildACIRCallback } from './acir_callback.js';
80
+ import type { IMiscOracle, IUtilityExecutionOracle } from './interfaces.js';
66
81
 
67
82
  /** Args for UtilityExecutionOracle constructor. */
68
83
  export type UtilityExecutionOracleArgs = {
69
- contractAddress: AztecAddress;
84
+ callContext: CallContext;
70
85
  /** List of transient auth witnesses to be used during this simulation */
71
86
  authWitnesses: AuthWitness[];
72
87
  capsules: Capsule[]; // TODO(#12425): Rename to transientCapsules
73
88
  anchorBlockHeader: BlockHeader;
74
- contractStore: ContractStore;
89
+ anchoredContractData: AnchoredContractData;
75
90
  noteStore: NoteStore;
76
91
  keyStore: KeyStore;
77
92
  addressStore: AddressStore;
78
93
  aztecNode: AztecNode;
79
94
  recipientTaggingStore: RecipientTaggingStore;
80
- senderAddressBookStore: SenderAddressBookStore;
95
+ taggingSecretSourcesStore: TaggingSecretSourcesStore;
81
96
  capsuleService: CapsuleService;
97
+ factService: FactService;
82
98
  privateEventStore: PrivateEventStore;
83
- messageContextService: MessageContextService;
99
+ txResolver: TxResolverService;
84
100
  contractSyncService: ContractSyncService;
85
101
  l2TipsStore: L2TipsProvider;
86
102
  jobId: string;
@@ -90,6 +106,7 @@ export type UtilityExecutionOracleArgs = {
90
106
  hooks?: ExecutionHooks;
91
107
  /** Needed to trigger contract synchronization before nested cross-contract calls. */
92
108
  utilityExecutor: (call: FunctionCall, scopes: AztecAddress[]) => Promise<void>;
109
+ transientArrayService: TransientArrayService;
93
110
  };
94
111
 
95
112
  /**
@@ -103,24 +120,35 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
103
120
  private aztecnrLogger: Logger | undefined;
104
121
  private offchainEffects: OffchainEffect[] = [];
105
122
  private readonly ephemeralArrayService = new EphemeralArrayService();
123
+ protected readonly transientArrayService: TransientArrayService;
124
+ /** Keyed by tx hash string. */
125
+ private readonly txReceiptsCache = new Map<string, Promise<TxReceipt<{ includeTxEffect: true }>>>();
126
+ /**
127
+ * Information that can be used to validate the existence of a note or an event, keyed by tx hash string. It is
128
+ * populated by the node queries that precede validation (tagged log retrieval, tx resolution), which already return
129
+ * everything validation needs, so validating a note or event created in one of those txs costs no node roundtrip.
130
+ * Notes and events reached through other paths (e.g. offchain inbox messages) still need a receipt.
131
+ */
132
+ private readonly validationTxDataCache = new Map<string, ValidationTxData>();
106
133
 
107
134
  // We store oracle version to be able to show a nice error message when an oracle handler is missing.
108
135
  private contractOracleVersion: { major: number; minor: number } | undefined;
109
136
 
110
- protected readonly contractAddress: AztecAddress;
137
+ protected readonly callContext: CallContext;
111
138
  protected readonly authWitnesses: AuthWitness[];
112
139
  protected readonly capsules: Capsule[];
113
140
  protected readonly anchorBlockHeader: BlockHeader;
114
- protected readonly contractStore: ContractStore;
141
+ protected readonly anchoredContractData: AnchoredContractData;
115
142
  protected readonly noteStore: NoteStore;
116
143
  protected readonly keyStore: KeyStore;
117
144
  protected readonly addressStore: AddressStore;
118
145
  protected readonly aztecNode: AztecNode;
119
146
  protected readonly recipientTaggingStore: RecipientTaggingStore;
120
- protected readonly senderAddressBookStore: SenderAddressBookStore;
147
+ protected readonly taggingSecretSourcesStore: TaggingSecretSourcesStore;
121
148
  protected readonly capsuleService: CapsuleService;
149
+ protected readonly factService: FactService;
122
150
  protected readonly privateEventStore: PrivateEventStore;
123
- protected readonly messageContextService: MessageContextService;
151
+ protected readonly txResolver: TxResolverService;
124
152
  protected readonly contractSyncService: ContractSyncService;
125
153
  protected readonly l2TipsStore: L2TipsProvider;
126
154
  protected readonly jobId: string;
@@ -131,20 +159,21 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
131
159
  protected readonly utilityExecutor: (call: FunctionCall, scopes: AztecAddress[]) => Promise<void>;
132
160
 
133
161
  constructor(args: UtilityExecutionOracleArgs) {
134
- this.contractAddress = args.contractAddress;
162
+ this.callContext = args.callContext;
135
163
  this.authWitnesses = args.authWitnesses;
136
164
  this.capsules = args.capsules;
137
165
  this.anchorBlockHeader = args.anchorBlockHeader;
138
- this.contractStore = args.contractStore;
166
+ this.anchoredContractData = args.anchoredContractData;
139
167
  this.noteStore = args.noteStore;
140
168
  this.keyStore = args.keyStore;
141
169
  this.addressStore = args.addressStore;
142
170
  this.aztecNode = args.aztecNode;
143
171
  this.recipientTaggingStore = args.recipientTaggingStore;
144
- this.senderAddressBookStore = args.senderAddressBookStore;
172
+ this.taggingSecretSourcesStore = args.taggingSecretSourcesStore;
145
173
  this.capsuleService = args.capsuleService;
174
+ this.factService = args.factService;
146
175
  this.privateEventStore = args.privateEventStore;
147
- this.messageContextService = args.messageContextService;
176
+ this.txResolver = args.txResolver;
148
177
  this.contractSyncService = args.contractSyncService;
149
178
  this.l2TipsStore = args.l2TipsStore;
150
179
  this.jobId = args.jobId;
@@ -153,6 +182,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
153
182
  this.simulator = args.simulator;
154
183
  this.hooks = args.hooks;
155
184
  this.utilityExecutor = args.utilityExecutor;
185
+ this.transientArrayService = args.transientArrayService;
156
186
  }
157
187
 
158
188
  public assertCompatibleOracleVersion(major: number, minor: number): void {
@@ -179,17 +209,22 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
179
209
  }
180
210
 
181
211
  public getUtilityContext(): UtilityContext {
182
- return new UtilityContext(this.anchorBlockHeader, this.contractAddress);
212
+ return {
213
+ blockHeader: this.anchorBlockHeader,
214
+ contractAddress: this.callContext.contractAddress,
215
+ msgSender: this.callContext.msgSender,
216
+ };
183
217
  }
184
218
 
185
219
  /**
186
220
  * Retrieve keys associated with a specific master public key and app address.
187
221
  * @param pkMHash - The master public key hash.
222
+ * @param _keyIndex - Sent by the Noir oracle caller but unused here; kept to match the oracle signature.
188
223
  * @returns A Promise that resolves to nullifier keys.
189
224
  * @throws If the keys are not registered in the key store.
190
225
  * @throws If scopes are defined and the account is not in the scopes.
191
226
  */
192
- public async getKeyValidationRequest(pkMHash: Fr): Promise<KeyValidationRequest> {
227
+ public async getKeyValidationRequest(pkMHash: Fr, _keyIndex: Fr): Promise<KeyValidationRequest> {
193
228
  let hasAccess = false;
194
229
  for (let i = 0; i < this.scopes.length && !hasAccess; i++) {
195
230
  if (await this.keyStore.accountHasKey(this.scopes[i], pkMHash)) {
@@ -243,7 +278,23 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
243
278
  const witness = await this.#queryWithBlockHashNotAfterAnchor(referenceBlockHash, () =>
244
279
  this.aztecNode.getBlockHashMembershipWitness(referenceBlockHash, blockHash),
245
280
  );
246
- return witness ? Option.some(witness) : Option.none(MembershipWitness.empty(ARCHIVE_HEIGHT));
281
+ return witness ? Option.some(witness) : Option.none();
282
+ }
283
+
284
+ /** Returns whether each block hash is present in the archive tree at the referenced block. */
285
+ public async areBlockHashesInArchive(
286
+ referenceBlockHash: BlockHash,
287
+ blockHashes: EphemeralArray<BlockHash>,
288
+ ): Promise<EphemeralArray<boolean>> {
289
+ const hashes = blockHashes.readAll(this.ephemeralArrayService);
290
+ const memberships = await this.#queryWithBlockHashNotAfterAnchor(referenceBlockHash, () =>
291
+ Promise.all(
292
+ hashes.map(blockHash =>
293
+ this.aztecNode.getBlockHashMembershipWitness(referenceBlockHash, blockHash).then(Boolean),
294
+ ),
295
+ ),
296
+ );
297
+ return EphemeralArray.fromValues(this.ephemeralArrayService, memberships);
247
298
  }
248
299
 
249
300
  /**
@@ -335,7 +386,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
335
386
  ): Promise<Option<{ publicKeys: PublicKeys; partialAddress: PartialAddress }>> {
336
387
  const completeAddress = await this.addressStore.getCompleteAddress(account);
337
388
  if (!completeAddress) {
338
- return Option.none({ publicKeys: PublicKeys.default(), partialAddress: Fr.ZERO });
389
+ return Option.none();
339
390
  }
340
391
  return Option.some({ publicKeys: completeAddress.publicKeys, partialAddress: completeAddress.partialAddress });
341
392
  }
@@ -345,7 +396,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
345
396
  if (!completeAddress) {
346
397
  throw new Error(
347
398
  `No public key registered for address ${account}.
348
- Register it by calling pxe.addAccount(...).\nSee docs for context: https://docs.aztec.network/developers/resources/debugging/aztecnr-errors#simulation-error-no-public-key-registered-for-address-0x0-register-it-by-calling-pxeregisterrecipient-or-pxeregisteraccount`,
399
+ Register it by calling wallet.registerSender(...).\nSee docs for context: https://docs.aztec.network/errors/14`,
349
400
  );
350
401
  }
351
402
  return completeAddress;
@@ -356,8 +407,8 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
356
407
  * @param address - Address.
357
408
  * @returns A contract instance.
358
409
  */
359
- public async getContractInstance(address: AztecAddress): Promise<ContractInstance> {
360
- const instance = await this.contractStore.getContractInstance(address);
410
+ public async getContractInstance(address: AztecAddress): Promise<ContractInstancePreimageWithAddress> {
411
+ const instance = await this.anchoredContractData.getContractInstance(address);
361
412
  if (!instance) {
362
413
  throw new Error(`No contract instance found for address ${address.toString()}`);
363
414
  }
@@ -454,23 +505,21 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
454
505
  }
455
506
 
456
507
  /**
457
- * Returns the membership witness of an un-nullified L1 to L2 message.
458
- * @param contractAddress - Address of a contract by which the message was emitted.
508
+ * Returns the membership witness of an L1 to L2 message.
459
509
  * @param messageHash - Hash of the message.
460
- * @param secret - Secret used to compute a nullifier.
461
- * @dev Contract address and secret are only used to compute the nullifier to get non-nullified messages
510
+ * @param nullifier - When present, the unsiloed nullifier of the message and the address to silo it with. The witness
511
+ * is only returned if the siloed nullifier is absent from the nullifier tree, i.e. the message has not been consumed.
462
512
  * @returns The l1 to l2 membership witness (index of message in the tree and sibling path).
463
513
  */
464
- public async getL1ToL2MembershipWitness(contractAddress: AztecAddress, messageHash: Fr, secret: Fr) {
465
- const [messageIndex, siblingPath] = await getNonNullifiedL1ToL2MessageWitness(
514
+ public async getL1ToL2MembershipWitnessV2(messageHash: Fr, nullifier: Option<UnsiloedMessageNullifier>) {
515
+ const [messageIndex, siblingPath] = await getL1ToL2MessageWitness(
466
516
  this.aztecNode,
467
- contractAddress,
468
517
  messageHash,
469
- secret,
518
+ nullifier.value,
470
519
  await this.anchorBlockHeader.hash(),
471
520
  );
472
521
 
473
- return new MessageLoadOracleInputs(messageIndex, siblingPath);
522
+ return { index: messageIndex, siblingPath };
474
523
  }
475
524
 
476
525
  /**
@@ -489,14 +538,14 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
489
538
  return this.#queryWithBlockHashNotAfterAnchor(blockHash, async () => {
490
539
  const slots = Array(numberOfElements)
491
540
  .fill(0)
492
- .map((_, i) => new Fr(startStorageSlot.value + BigInt(i)));
493
-
541
+ .map((_, i) => new Fr(startStorageSlot.toBigInt() + BigInt(i)));
494
542
  const values = await Promise.all(
495
543
  slots.map(storageSlot => this.aztecNode.getPublicStorageAt(blockHash, contractAddress, storageSlot)),
496
544
  );
497
545
 
498
546
  this.logger.debug(
499
- `Oracle storage read: slots=[${slots.map(slot => slot.toString()).join(', ')}] address=${contractAddress.toString()} values=[${values.join(', ')}]`,
547
+ `Oracle storage read: start=${startStorageSlot.toString()} count=${numberOfElements} ` +
548
+ `address=${contractAddress.toString()} values=[${values.join(', ')}]`,
500
549
  );
501
550
 
502
551
  return values;
@@ -512,7 +561,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
512
561
  // to re-use jobId as instanceId here as executions of different PXE jobs are isolated.
513
562
  this.contractLogger = await createContractLogger(
514
563
  this.contractAddress,
515
- addr => this.contractStore.getDebugContractName(addr),
564
+ addr => this.anchoredContractData.getDebugContractName(addr),
516
565
  'user',
517
566
  { instanceId: this.jobId },
518
567
  );
@@ -529,7 +578,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
529
578
  // to re-use jobId as instanceId here as executions of different PXE jobs are isolated.
530
579
  this.aztecnrLogger = await createContractLogger(
531
580
  this.contractAddress,
532
- addr => this.contractStore.getDebugContractName(addr),
581
+ addr => this.anchoredContractData.getDebugContractName(addr),
533
582
  'aztecnr',
534
583
  { instanceId: this.jobId },
535
584
  );
@@ -537,7 +586,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
537
586
  return this.aztecnrLogger;
538
587
  }
539
588
 
540
- public async log(level: number, message: string, fields: Fr[]): Promise<void> {
589
+ public async log(level: number, message: string, _fieldsSize: number, fields: Fr[]): Promise<void> {
541
590
  if (!LogLevels[level]) {
542
591
  throw new Error(`Invalid log level: ${level}`);
543
592
  }
@@ -548,11 +597,21 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
548
597
  logContractMessage(logger, LogLevels[level], strippedMessage, fields);
549
598
  }
550
599
 
551
- /** Fetches pending tagged logs into a freshly allocated ephemeral array and returns its base slot. */
552
- public async getPendingTaggedLogs(scope: AztecAddress): Promise<Fr> {
600
+ /** Fetches pending tagged logs into a freshly allocated ephemeral array and returns it. */
601
+ public async getPendingTaggedLogsV2(
602
+ scope: AztecAddress,
603
+ providedSecrets: EphemeralArray<ProvidedSecret>,
604
+ ): Promise<EphemeralArray<PendingTaggedLog>> {
605
+ const secrets = providedSecrets
606
+ .readAll(this.ephemeralArrayService)
607
+ .map(ps => new AppTaggingSecret(ps.secret, this.contractAddress, ps.mode));
608
+
553
609
  const logService = this.#createLogService();
554
- const logs = await logService.fetchTaggedLogs(this.contractAddress, scope);
555
- return this.ephemeralArrayService.newArray(logs.map(log => log.toFields()));
610
+ const retrievedLogs = await logService.fetchTaggedLogs(this.contractAddress, scope, secrets);
611
+
612
+ this.#cacheValidationTxData(retrievedLogs);
613
+
614
+ return EphemeralArray.fromValues(this.ephemeralArrayService, retrievedLogs.map(toPendingTaggedLog));
556
615
  }
557
616
 
558
617
  #createLogService(): LogService {
@@ -562,27 +621,24 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
562
621
  this.l2TipsStore,
563
622
  this.keyStore,
564
623
  this.recipientTaggingStore,
565
- this.senderAddressBookStore,
624
+ this.taggingSecretSourcesStore,
566
625
  this.addressStore,
626
+ this.scopes,
567
627
  this.jobId,
568
628
  this.logger.getBindings(),
569
629
  );
570
630
  }
571
631
 
572
632
  public async validateAndStoreEnqueuedNotesAndEvents(
573
- noteValidationRequestsArrayBaseSlot: Fr,
574
- eventValidationRequestsArrayBaseSlot: Fr,
633
+ noteValidationRequests: EphemeralArray<NoteValidationRequest>,
634
+ eventValidationRequests: EphemeralArray<EventValidationRequest>,
575
635
  scope: AztecAddress,
576
636
  ) {
577
- const noteValidationRequests = this.ephemeralArrayService
578
- .readArrayAt(noteValidationRequestsArrayBaseSlot)
579
- .map(fields => NoteValidationRequest.fromFields(fields));
580
-
581
- const eventValidationRequests = this.ephemeralArrayService
582
- .readArrayAt(eventValidationRequestsArrayBaseSlot)
583
- .map(fields => EventValidationRequest.fromFields(fields));
584
-
585
- await this.#processValidationRequests(noteValidationRequests, eventValidationRequests, scope);
637
+ await this.#processValidationRequests(
638
+ noteValidationRequests.readAll(this.ephemeralArrayService),
639
+ eventValidationRequests.readAll(this.ephemeralArrayService),
640
+ scope,
641
+ );
586
642
  }
587
643
 
588
644
  async #processValidationRequests(
@@ -590,7 +646,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
590
646
  eventValidationRequests: EventValidationRequest[],
591
647
  scope: AztecAddress,
592
648
  ) {
593
- const txEffects = await this.#fetchTxEffects([
649
+ const validationTxData = await this.#getValidationTxData([
594
650
  ...noteValidationRequests.map(r => r.txHash),
595
651
  ...eventValidationRequests.map(r => r.txHash),
596
652
  ]);
@@ -599,70 +655,73 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
599
655
  const eventService = new EventService(this.anchorBlockHeader, this.aztecNode, this.privateEventStore, this.jobId);
600
656
 
601
657
  await Promise.all([
602
- noteService.validateAndStoreNotes(noteValidationRequests, scope, txEffects),
603
- eventService.validateAndStoreEvents(eventValidationRequests, scope, txEffects),
658
+ noteService.validateAndStoreNotes(noteValidationRequests, scope, validationTxData),
659
+ eventService.validateAndStoreEvents(eventValidationRequests, scope, validationTxData),
604
660
  ]);
605
661
  }
606
662
 
607
- public async getLogsByTag(requestArrayBaseSlot: Fr): Promise<Fr> {
608
- const logRetrievalRequests = this.ephemeralArrayService
609
- .readArrayAt(requestArrayBaseSlot)
610
- .map(LogRetrievalRequest.fromFields);
663
+ public async getLogsByTagV2(
664
+ requests: EphemeralArray<LogRetrievalRequest>,
665
+ ): Promise<EphemeralArray<EphemeralArray<LogRetrievalResponse>>> {
666
+ const logRetrievalRequests = requests.readAll(this.ephemeralArrayService);
611
667
  const logService = this.#createLogService();
612
668
 
613
- const logRetrievalResponses = await logService.fetchLogsByTag(this.contractAddress, logRetrievalRequests);
669
+ const retrievedLogsPerRequest = await logService.fetchLogsByTag(this.contractAddress, logRetrievalRequests);
670
+
671
+ this.#cacheValidationTxData(retrievedLogsPerRequest.flat());
614
672
 
615
673
  // Create an inner ephemeral array for each request's matching logs, then wrap all slots in an outer array.
616
- const innerSlots = logRetrievalResponses.map(responses =>
617
- this.ephemeralArrayService.newArray(responses.map(r => r.toFields())),
674
+ const innerArrays = retrievedLogsPerRequest.map(retrievedLogs =>
675
+ EphemeralArray.fromValues(this.ephemeralArrayService, retrievedLogs.map(toLogRetrievalResponse)),
618
676
  );
619
677
 
620
- return this.ephemeralArrayService.newArray(innerSlots.map(slot => [slot]));
678
+ return EphemeralArray.fromValues(this.ephemeralArrayService, innerArrays);
621
679
  }
622
680
 
623
- /** Reads tx hash requests from an ephemeral array, resolves their contexts, and returns the response slot. */
624
- public async getMessageContextsByTxHash(requestArrayBaseSlot: Fr): Promise<Fr> {
625
- const requestFields = this.ephemeralArrayService.readArrayAt(requestArrayBaseSlot);
681
+ /** Given an array of tx hashes, returns an aligned array of tx info if the tx is available. */
682
+ public async getResolvedTxs(requests: EphemeralArray<Fr>): Promise<EphemeralArray<Option<ResolvedTx>>> {
683
+ const txHashes = requests.readAll(this.ephemeralArrayService);
626
684
 
627
- const txHashes = requestFields.map((fields, i) => {
628
- if (fields.length !== 1) {
629
- throw new Error(
630
- `Malformed message context request at index ${i}: expected 1 field (tx hash), got ${fields.length}`,
631
- );
632
- }
633
- return fields[0];
634
- });
685
+ const resolved = await this.txResolver.resolveTxs(txHashes, this.anchorBlockHeader.getBlockNumber());
635
686
 
636
- const maybeMessageContexts = await this.messageContextService.getMessageContextsByTxHash(
637
- txHashes,
638
- this.anchorBlockHeader.getBlockNumber(),
639
- );
687
+ this.#cacheValidationTxData(resolved.filter(tx => tx !== null));
640
688
 
641
- return this.ephemeralArrayService.newArray(maybeMessageContexts.map(MessageContext.toSerializedOption));
689
+ const options = resolved.map(tx => (tx ? Option.some(toResolvedTx(tx)) : Option.none<ResolvedTx>()));
690
+ return EphemeralArray.fromValues(this.ephemeralArrayService, options);
642
691
  }
643
692
 
644
693
  /**
645
694
  * Fetches the effects of a transaction by its hash. Returns null if the tx is not found or is beyond the anchor
646
695
  * block.
647
696
  */
648
- public async getTxEffect(txHash: TxHash): Promise<Option<TxEffect>> {
697
+ public async getTxEffect(txHash: TxHash): Promise<Option<TxEffectData>> {
649
698
  if (txHash.hash.isZero()) {
650
699
  throw new Error('Invalid tx hash passed into aztec_utl_getTxEffect oracle handler');
651
700
  }
652
701
 
653
- const txEffect = await this.aztecNode.getTxEffect(txHash);
654
- if (!txEffect || txEffect.l2BlockNumber > this.anchorBlockHeader.getBlockNumber()) {
655
- return Option.none(TxEffect.empty());
702
+ return await this.#getTxEffectOption(txHash);
703
+ }
704
+
705
+ /** Fetches transaction effects for all hashes, preserving request order. */
706
+ public async getTxEffects(txHashes: EphemeralArray<TxHash>): Promise<EphemeralArray<Option<TxEffectData>>> {
707
+ const hashes = txHashes.readAll(this.ephemeralArrayService);
708
+ const invalidHash = hashes.find(txHash => txHash.hash.isZero());
709
+ if (invalidHash) {
710
+ throw new Error('Invalid tx hash passed into aztec_utl_getTxEffects oracle handler');
656
711
  }
657
712
 
658
- return Option.some(txEffect.data);
713
+ const uniqueTxHashes = uniqueBy(hashes, h => h.toString());
714
+ const options = await Promise.all(uniqueTxHashes.map(txHash => this.#getTxEffectOption(txHash)));
715
+ const optionsByHash = new Map(uniqueTxHashes.map((txHash, i) => [txHash.toString(), options[i]]));
716
+
717
+ return EphemeralArray.fromValues(
718
+ this.ephemeralArrayService,
719
+ hashes.map(txHash => optionsByHash.get(txHash.toString())!),
720
+ );
659
721
  }
660
722
 
661
723
  public setCapsule(contractAddress: AztecAddress, slot: Fr, capsule: Fr[], scope: AztecAddress): void {
662
- if (!contractAddress.equals(this.contractAddress)) {
663
- // TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
664
- throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
665
- }
724
+ this.#assertOwnContract(contractAddress);
666
725
  this.capsuleService.setCapsule(contractAddress, slot, capsule, this.jobId, scope);
667
726
  }
668
727
 
@@ -672,19 +731,13 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
672
731
  tSize: number,
673
732
  scope: AztecAddress,
674
733
  ): Promise<Option<Fr[]>> {
675
- if (!contractAddress.equals(this.contractAddress)) {
676
- // TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
677
- throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
678
- }
734
+ this.#assertOwnContract(contractAddress);
679
735
  const values = await this.capsuleService.getCapsule(contractAddress, slot, this.jobId, scope, this.capsules);
680
- return values ? Option.some(values) : Option.none(new Array(tSize).fill(Fr.ZERO));
736
+ return values ? Option.some(values) : Option.none({ length: tSize });
681
737
  }
682
738
 
683
739
  public deleteCapsule(contractAddress: AztecAddress, slot: Fr, scope: AztecAddress): void {
684
- if (!contractAddress.equals(this.contractAddress)) {
685
- // TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
686
- throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
687
- }
740
+ this.#assertOwnContract(contractAddress);
688
741
  this.capsuleService.deleteCapsule(contractAddress, slot, this.jobId, scope);
689
742
  }
690
743
 
@@ -695,11 +748,114 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
695
748
  numEntries: number,
696
749
  scope: AztecAddress,
697
750
  ): Promise<void> {
751
+ this.#assertOwnContract(contractAddress);
752
+ return this.capsuleService.copyCapsule(contractAddress, srcSlot, dstSlot, numEntries, this.jobId, scope);
753
+ }
754
+
755
+ /**
756
+ * Asserts the executing contract may only access its own slice of PXE DB.
757
+ */
758
+ #assertOwnContract(contractAddress: AztecAddress): void {
698
759
  if (!contractAddress.equals(this.contractAddress)) {
699
- // TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
700
760
  throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
701
761
  }
702
- return this.capsuleService.copyCapsule(contractAddress, srcSlot, dstSlot, numEntries, this.jobId, scope);
762
+ }
763
+
764
+ /**
765
+ * Records a fact into a collection. A `Some` origin block makes the fact retractable (pruned on reorg of that
766
+ * block), a `None` origin block makes it non-retractable, surviving reorgs.
767
+ */
768
+ public recordFact(
769
+ contractAddress: AztecAddress,
770
+ scope: AztecAddress,
771
+ factCollectionTypeId: Fr,
772
+ factCollectionId: Fr,
773
+ factTypeId: Fr,
774
+ payload: EphemeralArray<Fr>,
775
+ originBlock: Option<OriginBlock>,
776
+ ): Promise<void> {
777
+ this.#assertOwnContract(contractAddress);
778
+ return this.factService.recordFact(
779
+ new FactCollectionKey(contractAddress, scope, factCollectionTypeId, factCollectionId),
780
+ factTypeId,
781
+ payload.readAll(this.ephemeralArrayService),
782
+ originBlock.isSome() ? originBlock.value : undefined,
783
+ this.jobId,
784
+ );
785
+ }
786
+
787
+ /**
788
+ * Deletes a fact collection, removing all its facts. A no-op if no such collection exists.
789
+ */
790
+ public deleteFactCollection(
791
+ contractAddress: AztecAddress,
792
+ scope: AztecAddress,
793
+ factCollectionTypeId: Fr,
794
+ factCollectionId: Fr,
795
+ ): Promise<void> {
796
+ this.#assertOwnContract(contractAddress);
797
+ return this.factService.deleteFactCollection(
798
+ new FactCollectionKey(contractAddress, scope, factCollectionTypeId, factCollectionId),
799
+ this.jobId,
800
+ );
801
+ }
802
+
803
+ /**
804
+ * Returns a fact collection.
805
+ */
806
+ public async getFactCollection(
807
+ contractAddress: AztecAddress,
808
+ scope: AztecAddress,
809
+ factCollectionTypeId: Fr,
810
+ factCollectionId: Fr,
811
+ ): Promise<Option<FactCollection>> {
812
+ this.#assertOwnContract(contractAddress);
813
+ const tips = anchoredTipBlockNumbers(await this.l2TipsStore.getL2Tips(), this.anchorBlockHeader.getBlockNumber());
814
+ const collection = await this.factService.getFactCollection(
815
+ new FactCollectionKey(contractAddress, scope, factCollectionTypeId, factCollectionId),
816
+ tips,
817
+ this.jobId,
818
+ );
819
+ return collection
820
+ ? Option.some(
821
+ toNoirFactCollection(
822
+ this.ephemeralArrayService,
823
+ contractAddress,
824
+ scope,
825
+ factCollectionTypeId,
826
+ factCollectionId,
827
+ collection.facts,
828
+ ),
829
+ )
830
+ : Option.none(emptyFactCollection(this.ephemeralArrayService));
831
+ }
832
+
833
+ /** Returns every fact collection of `factCollectionTypeId`. */
834
+ public async getFactCollectionsByType(
835
+ contractAddress: AztecAddress,
836
+ scope: AztecAddress,
837
+ factCollectionTypeId: Fr,
838
+ ): Promise<EphemeralArray<FactCollection>> {
839
+ this.#assertOwnContract(contractAddress);
840
+ const tips = anchoredTipBlockNumbers(await this.l2TipsStore.getL2Tips(), this.anchorBlockHeader.getBlockNumber());
841
+ const collections = await this.factService.getFactCollectionsByType(
842
+ new FactCollectionTypeKey(contractAddress, scope, factCollectionTypeId),
843
+ tips,
844
+ this.jobId,
845
+ );
846
+ return EphemeralArray.fromValues(
847
+ this.ephemeralArrayService,
848
+ collections.map(collection =>
849
+ toNoirFactCollection(
850
+ this.ephemeralArrayService,
851
+ collection.key.contractAddress,
852
+ collection.key.scope,
853
+ collection.key.factCollectionTypeId,
854
+ collection.key.factCollectionId,
855
+ collection.facts,
856
+ ),
857
+ ),
858
+ );
703
859
  }
704
860
 
705
861
  /**
@@ -716,45 +872,68 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
716
872
  // TODO(#11849): consider replacing this oracle with a pure Noir implementation of aes decryption.
717
873
  public async decryptAes128(
718
874
  ciphertext: BoundedVec<number>,
719
- iv: Buffer,
720
- symKey: Buffer,
875
+ iv: number[],
876
+ symKey: number[],
721
877
  ): Promise<Option<BoundedVec<number>>> {
722
878
  const capacity = ciphertext.maxLength;
723
879
  try {
724
880
  const aes128 = new Aes128();
725
- const plaintext = await aes128.decryptBufferCBC(Buffer.from(ciphertext.data), iv, symKey);
881
+ const plaintext = await aes128.decryptBufferCBC(
882
+ Buffer.from(ciphertext.data),
883
+ Buffer.from(iv),
884
+ Buffer.from(symKey),
885
+ );
726
886
  return Option.some(BoundedVec.from<number>({ data: [...plaintext], maxLength: capacity }));
727
887
  } catch {
728
- return Option.none(BoundedVec.empty<number>({ maxLength: capacity }));
888
+ return Option.none({ maxLength: capacity });
729
889
  }
730
890
  }
731
891
 
732
892
  /**
733
893
  * Retrieves app-siloed shared secrets for multiple ephemeral public keys stored in an ephemeral array.
734
894
  * @param address - The recipient address.
735
- * @param ephPksSlot - Ephemeral array slot containing the serialized Points.
895
+ * @param ephPks - Ephemeral array containing the serialized Points.
736
896
  * @param contractAddress - The contract address for app-siloing (validated against execution context).
737
- * @returns The slot of a new ephemeral array containing the computed shared secrets.
897
+ * @returns A new ephemeral array containing the computed shared secrets, or an empty array when the PXE does not
898
+ * hold the keys for `address`.
899
+ * @throws If `address` is not in the execution's allowed scopes.
738
900
  */
739
- public async getSharedSecrets(address: AztecAddress, ephPksSlot: Fr, contractAddress: AztecAddress): Promise<Fr> {
901
+ public async getSharedSecrets(
902
+ address: AztecAddress,
903
+ ephPks: EphemeralArray<EmbeddedCurvePoint>,
904
+ contractAddress: AztecAddress,
905
+ ): Promise<EphemeralArray<Fr>> {
740
906
  if (!contractAddress.equals(this.contractAddress)) {
741
907
  throw new Error(
742
908
  `getSharedSecrets called with contract address ${contractAddress}, expected ${this.contractAddress}`,
743
909
  );
744
910
  }
745
- const recipientCompleteAddress = await this.getCompleteAddressOrFail(address);
911
+
912
+ assertAllowedScope(address, this.scopes);
913
+
914
+ // An address can be in scope without the PXE holding its keys (e.g. syncing a registered but non-owned account),
915
+ // in which case no secrets can be derived and we return an empty array rather than failing.
916
+ const recipientCompleteAddress = await this.addressStore.getCompleteAddress(address);
917
+ if (!recipientCompleteAddress) {
918
+ this.logger.warn(
919
+ `Computing shared secrets for address ${address} whose keys are not held - returning no secrets`,
920
+ {
921
+ address,
922
+ contractAddress: this.contractAddress,
923
+ },
924
+ );
925
+ return EphemeralArray.fromValues<Fr>(this.ephemeralArrayService, []);
926
+ }
746
927
  const ivpkMHash = await hashPublicKey(recipientCompleteAddress.publicKeys.ivpkM);
747
928
  const ivskM = await this.keyStore.getMasterSecretKey(ivpkMHash);
748
929
  const addressSecret = await computeAddressSecret(await recipientCompleteAddress.getPreaddress(), ivskM);
749
930
 
750
- const ephPkFields = this.ephemeralArrayService.readArrayAt(ephPksSlot);
931
+ const ephPkPoints = ephPks.readAll(this.ephemeralArrayService);
751
932
  const secrets = await Promise.all(
752
- ephPkFields.map(fields =>
753
- deriveAppSiloedSharedSecret(addressSecret, PublicKey.fromFields(fields), this.contractAddress),
754
- ),
933
+ ephPkPoints.map(({ x, y }) => appSiloEcdhSharedSecret(addressSecret, new Point(x, y), this.contractAddress)),
755
934
  );
756
935
 
757
- return this.ephemeralArrayService.newArray(secrets.map(s => [s]));
936
+ return EphemeralArray.fromValues(this.ephemeralArrayService, secrets);
758
937
  }
759
938
 
760
939
  public pushEphemeral(slot: Fr, elements: Fr[]): number {
@@ -785,6 +964,34 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
785
964
  this.ephemeralArrayService.clear(slot);
786
965
  }
787
966
 
967
+ public pushTransient(slot: Fr, elements: Fr[]): number {
968
+ return this.transientArrayService.push(this.contractAddress, slot, elements);
969
+ }
970
+
971
+ public popTransient(slot: Fr): Fr[] {
972
+ return this.transientArrayService.pop(this.contractAddress, slot);
973
+ }
974
+
975
+ public getTransient(slot: Fr, index: number): Fr[] {
976
+ return this.transientArrayService.get(this.contractAddress, slot, index);
977
+ }
978
+
979
+ public setTransient(slot: Fr, index: number, elements: Fr[]): void {
980
+ this.transientArrayService.set(this.contractAddress, slot, index, elements);
981
+ }
982
+
983
+ public getTransientLen(slot: Fr): number {
984
+ return this.transientArrayService.len(this.contractAddress, slot);
985
+ }
986
+
987
+ public removeTransient(slot: Fr, index: number): void {
988
+ this.transientArrayService.remove(this.contractAddress, slot, index);
989
+ }
990
+
991
+ public clearTransient(slot: Fr): void {
992
+ this.transientArrayService.clear(this.contractAddress, slot);
993
+ }
994
+
788
995
  public emitOffchainEffect(data: Fr[]): Promise<void> {
789
996
  this.offchainEffects.push({ data, contractAddress: this.contractAddress });
790
997
  return Promise.resolve();
@@ -796,38 +1003,53 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
796
1003
  functionSelector: FunctionSelector,
797
1004
  args: Fr[],
798
1005
  ): Promise<Fr[]> {
799
- const targetArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(
1006
+ const targetArtifact = await this.anchoredContractData.getFunctionArtifactWithDebugMetadata(
800
1007
  targetContractAddress,
801
1008
  functionSelector,
802
1009
  );
1010
+ if (!targetArtifact) {
1011
+ throw new Error(
1012
+ `Cannot call ${targetContractAddress}:${functionSelector}: the contract is not registered. ` +
1013
+ `Register it via wallet.registerContract(...).`,
1014
+ );
1015
+ }
803
1016
 
804
1017
  if (!targetContractAddress.equals(this.contractAddress)) {
805
- const [callerInstance, targetInstance] = await Promise.all([
806
- this.getContractInstance(this.contractAddress),
807
- this.getContractInstance(targetContractAddress),
808
- ]);
809
- const request: UtilityCallAuthorizationRequest = {
810
- caller: this.contractAddress,
811
- callerClassId: callerInstance.currentContractClassId,
812
- target: targetContractAddress,
813
- targetClassId: targetInstance.currentContractClassId,
814
- functionSelector,
815
- functionName: targetArtifact.name,
816
- args,
817
- callerContext: this.callerContext,
818
- };
819
-
820
- const response = this.hooks
821
- ? await this.hooks.authorizeUtilityCall(request)
822
- : { authorized: false, reason: 'No execution hooks configured' };
823
-
824
- if (!response.authorized) {
825
- const reason = response.reason ? `: ${response.reason}` : '';
826
- throw new Error(
827
- `Cross-contract utility call denied${reason}. ${this.contractAddress} attempted to call ` +
828
- `${targetContractAddress}:${functionSelector} (${targetArtifact.name}). ` +
829
- `See https://docs.aztec.network/errors/11`,
830
- );
1018
+ // Standard handshake registry reads are authorized by default; every other cross-contract call needs the hook.
1019
+ if (!(await isStandardHandshakeRegistryUtilityRead(targetContractAddress, functionSelector))) {
1020
+ const [callerClassId, targetClassId] = await Promise.all([
1021
+ this.anchoredContractData.getCurrentClassId(this.contractAddress),
1022
+ this.anchoredContractData.getCurrentClassId(targetContractAddress),
1023
+ ]);
1024
+ if (!callerClassId || !targetClassId) {
1025
+ throw new Error(
1026
+ `Cannot authorize utility call from ${this.contractAddress} to ${targetContractAddress}: ` +
1027
+ `${!callerClassId ? this.contractAddress : targetContractAddress} is not registered.`,
1028
+ );
1029
+ }
1030
+ const request: UtilityCallAuthorizationRequest = {
1031
+ caller: this.contractAddress,
1032
+ callerClassId,
1033
+ target: targetContractAddress,
1034
+ targetClassId,
1035
+ functionSelector,
1036
+ functionName: targetArtifact.name,
1037
+ args,
1038
+ callerContext: this.callerContext,
1039
+ };
1040
+
1041
+ const response = this.hooks?.authorizeUtilityCall
1042
+ ? await this.hooks.authorizeUtilityCall(request)
1043
+ : { authorized: false, reason: 'No authorizeUtilityCall hook configured' };
1044
+
1045
+ if (!response.authorized) {
1046
+ const reason = response.reason ? `: ${response.reason}` : '';
1047
+ throw new Error(
1048
+ `Cross-contract utility call denied${reason}. ${this.contractAddress} attempted to call ` +
1049
+ `${targetContractAddress}:${functionSelector} (${targetArtifact.name}). ` +
1050
+ `See https://docs.aztec.network/errors/11`,
1051
+ );
1052
+ }
831
1053
  }
832
1054
 
833
1055
  await this.contractSyncService.ensureContractSynced(
@@ -845,20 +1067,26 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
845
1067
  );
846
1068
 
847
1069
  const nestedOracle = new UtilityExecutionOracle({
848
- contractAddress: targetContractAddress,
1070
+ callContext: CallContext.from({
1071
+ msgSender: this.contractAddress,
1072
+ contractAddress: targetContractAddress,
1073
+ functionSelector,
1074
+ isStaticCall: true,
1075
+ }),
849
1076
  authWitnesses: this.authWitnesses,
850
1077
  capsules: this.capsules,
851
1078
  anchorBlockHeader: this.anchorBlockHeader,
852
- contractStore: this.contractStore,
1079
+ anchoredContractData: this.anchoredContractData,
853
1080
  noteStore: this.noteStore,
854
1081
  keyStore: this.keyStore,
855
1082
  addressStore: this.addressStore,
856
1083
  aztecNode: this.aztecNode,
857
1084
  recipientTaggingStore: this.recipientTaggingStore,
858
- senderAddressBookStore: this.senderAddressBookStore,
1085
+ taggingSecretSourcesStore: this.taggingSecretSourcesStore,
859
1086
  capsuleService: this.capsuleService,
1087
+ factService: this.factService,
860
1088
  privateEventStore: this.privateEventStore,
861
- messageContextService: this.messageContextService,
1089
+ txResolver: this.txResolver,
862
1090
  contractSyncService: this.contractSyncService,
863
1091
  l2TipsStore: this.l2TipsStore,
864
1092
  jobId: this.jobId,
@@ -867,12 +1095,13 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
867
1095
  hooks: this.hooks,
868
1096
  utilityExecutor: this.utilityExecutor,
869
1097
  log: this.logger,
1098
+ // Shared across the whole execution tree: nested utility frames inherit the caller's transient-array store.
1099
+ transientArrayService: this.transientArrayService,
870
1100
  });
871
1101
 
872
1102
  const initialWitness = toACVMWitness(0, args);
873
- const acvmCallback = new Oracle(nestedOracle);
874
1103
  const acirExecutionResult = await this.simulator
875
- .executeUserCircuit(initialWitness, targetArtifact, acvmCallback.toACIRCallback())
1104
+ .executeUserCircuit(initialWitness, targetArtifact, buildACIRCallback(nestedOracle))
876
1105
  .catch((err: Error) => {
877
1106
  err.message = resolveAssertionMessageFromError(err, targetArtifact);
878
1107
  throw new ExecutionError(
@@ -891,18 +1120,93 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
891
1120
  return this.offchainEffects;
892
1121
  }
893
1122
 
1123
+ /** Stores the onchain context of the given txs, so that validating the notes and events they created is free. */
1124
+ #cacheValidationTxData(txs: TxOnchainContext[]) {
1125
+ txs.forEach(tx => this.validationTxDataCache.set(tx.txHash.toString(), toValidationTxData(tx)));
1126
+ }
1127
+
894
1128
  /**
895
- * Fetches tx effects for the given hashes in parallel, deduplicating repeated hashes so each tx is only requested
896
- * once. Returns a map keyed by `TxHash.toString()`; hashes for which the node has no tx effect are omitted.
1129
+ * Returns the information needed to validate the notes and events created in the given txs, keyed by
1130
+ * `TxHash.toString()`. Txs already in {@link validationTxDataCache} cost no node request, and the rest are read from
1131
+ * the node. Txs with no tx effect are absent from the returned map.
897
1132
  */
898
- async #fetchTxEffects(txHashes: TxHash[]): Promise<Map<string, IndexedTxEffect>> {
899
- const uniqueTxHashes = uniqueBy(txHashes, h => h.toString());
900
- const fetched = await Promise.all(uniqueTxHashes.map(h => this.aztecNode.getTxEffect(h)));
901
- return new Map(
902
- uniqueTxHashes
903
- .map((h, i): [string, IndexedTxEffect | undefined] => [h.toString(), fetched[i]])
904
- .filter((entry): entry is [string, IndexedTxEffect] => entry[1] !== undefined),
905
- );
1133
+ async #getValidationTxData(txHashes: TxHash[]): Promise<Map<string, ValidationTxData>> {
1134
+ const known: [string, ValidationTxData][] = [];
1135
+ const misses: TxHash[] = [];
1136
+ for (const txHash of uniqueBy(txHashes, h => h.toString())) {
1137
+ const key = txHash.toString();
1138
+ const cached = this.validationTxDataCache.get(key);
1139
+ if (cached) {
1140
+ known.push([key, cached]);
1141
+ } else {
1142
+ misses.push(txHash);
1143
+ }
1144
+ }
1145
+
1146
+ const fetched = await Promise.all(misses.map(h => this.#getTxReceiptWithEffect(h)));
1147
+ return new Map([
1148
+ ...known,
1149
+ ...misses
1150
+ .map((h, i): [string, ValidationTxData | undefined] => {
1151
+ const receipt = fetched[i];
1152
+ if (!receipt.isMined() || !receipt.txEffect) {
1153
+ return [h.toString(), undefined];
1154
+ }
1155
+ return [
1156
+ h.toString(),
1157
+ {
1158
+ noteHashes: receipt.txEffect.noteHashes,
1159
+ nullifiers: receipt.txEffect.nullifiers,
1160
+ l2BlockNumber: receipt.blockNumber,
1161
+ l2BlockHash: receipt.blockHash,
1162
+ txIndexInBlock: receipt.txIndexInBlock,
1163
+ },
1164
+ ];
1165
+ })
1166
+ .filter((entry): entry is [string, ValidationTxData] => entry[1] !== undefined),
1167
+ ]);
1168
+ }
1169
+
1170
+ /**
1171
+ * Reads a receipt with its effect, at most once per tx for the lifetime of this execution.
1172
+ *
1173
+ * A receipt is not cacheable in general, since pending, mined and dropped are all correct answers to the same call
1174
+ * over time. Within one execution it is: the execution is anchored at a fixed block, and validation runs in several
1175
+ * batches that name overlapping tx hashes, so re-reading would both cost extra requests and let one execution see a
1176
+ * tx as included in one batch and absent in the next.
1177
+ */
1178
+ #getTxReceiptWithEffect(txHash: TxHash) {
1179
+ const key = txHash.toString();
1180
+ let receipt = this.txReceiptsCache.get(key);
1181
+ if (!receipt) {
1182
+ receipt = this.aztecNode.getTxReceipt(txHash, { includeTxEffect: true }).catch(err => {
1183
+ this.txReceiptsCache.delete(key);
1184
+ throw err;
1185
+ });
1186
+ this.txReceiptsCache.set(key, receipt);
1187
+ }
1188
+ return receipt;
1189
+ }
1190
+
1191
+ async #getTxEffectOption(txHash: TxHash): Promise<Option<TxEffectData>> {
1192
+ const receipt = await this.#getTxReceiptWithEffect(txHash);
1193
+ if (!receipt.isMined() || !receipt.txEffect || receipt.blockNumber > this.anchorBlockHeader.getBlockNumber()) {
1194
+ return Option.none();
1195
+ }
1196
+ return Option.some(this.#toTxEffectData(receipt.txEffect));
1197
+ }
1198
+
1199
+ #toTxEffectData(txEffect: TxEffect): TxEffectData {
1200
+ return {
1201
+ ...txEffect,
1202
+ revertCode: txEffect.revertCode.getCode(),
1203
+ publicLogs: FlatPublicLogs.fromLogs(txEffect.publicLogs),
1204
+ contractClassLogs: txEffect.contractClassLogs.map(log => ({
1205
+ contractAddress: log.contractAddress,
1206
+ fields: log.fields.toFields(),
1207
+ emittedLength: log.emittedLength,
1208
+ })),
1209
+ };
906
1210
  }
907
1211
 
908
1212
  /** Runs a query concurrently with a validation that the block hash is not ahead of the anchor block. */
@@ -936,4 +1240,82 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
936
1240
  protected get callerContext(): 'private' | 'private view' | 'utility' {
937
1241
  return 'utility';
938
1242
  }
1243
+
1244
+ /** The address of the contract whose function is being executed, from the call context. */
1245
+ protected get contractAddress(): AztecAddress {
1246
+ return this.callContext.contractAddress;
1247
+ }
1248
+ }
1249
+
1250
+ // Registry reads that any contract may issue without an `authorizeUtilityCall` hook. The constrained-delivery
1251
+ // library calls these implicitly for the app, and they are safe to default-authorize: `get_app_siloed_secrets`
1252
+ // siloes every returned secret to `msg_sender`, and `get_non_interactive_handshakes` only exposes ephemeral public
1253
+ // keys, from which the shared secret cannot be derived without the recipient's secret keys.
1254
+ const STANDARD_HANDSHAKE_REGISTRY_DEFAULT_AUTHORIZED_READ_SIGNATURES = [
1255
+ 'get_non_interactive_handshakes((Field),u32)',
1256
+ 'get_app_siloed_secrets((Field),(Field))',
1257
+ ];
1258
+
1259
+ async function doesSelectorHaveSignature(functionSelector: FunctionSelector, signature: string): Promise<boolean> {
1260
+ return functionSelector.equals(await FunctionSelector.fromSignature(signature));
1261
+ }
1262
+
1263
+ /**
1264
+ * Whether a cross-contract utility call targets one of the standard handshake registry's read functions.
1265
+ *
1266
+ * These reads are authorized by PXE for every wallet, without consulting the `authorizeUtilityCall` hook, so that
1267
+ * wallets don't need to know the handshake registry exists in order to deliver and discover messages through it.
1268
+ */
1269
+ async function isStandardHandshakeRegistryUtilityRead(
1270
+ targetContractAddress: AztecAddress,
1271
+ functionSelector: FunctionSelector,
1272
+ ): Promise<boolean> {
1273
+ if (!targetContractAddress.equals(STANDARD_HANDSHAKE_REGISTRY_ADDRESS)) {
1274
+ return false;
1275
+ }
1276
+
1277
+ const matches = await Promise.all(
1278
+ STANDARD_HANDSHAKE_REGISTRY_DEFAULT_AUTHORIZED_READ_SIGNATURES.map(signature =>
1279
+ doesSelectorHaveSignature(functionSelector, signature),
1280
+ ),
1281
+ );
1282
+ return matches.some(Boolean);
939
1283
  }
1284
+
1285
+ function toPendingTaggedLog(retrievedLog: RetrievedTaggedLog): PendingTaggedLog {
1286
+ return { log: retrievedLog.logData, context: toResolvedTx(retrievedLog) };
1287
+ }
1288
+
1289
+ function toResolvedTx(tx: TxOnchainContext): ResolvedTx {
1290
+ const { txHash, blockNumber, blockHash, noteHashes, nullifiers } = tx;
1291
+ return {
1292
+ txHash,
1293
+ uniqueNoteHashesInTx: noteHashes,
1294
+ firstNullifierInTx: nullifiers[0],
1295
+ blockNumber,
1296
+ blockHash: blockHash.toFr(),
1297
+ };
1298
+ }
1299
+
1300
+ function toLogRetrievalResponse(retrievedLog: RetrievedTaggedLog): LogRetrievalResponse {
1301
+ const { logData, txHash, blockNumber, blockHash, blockTimestamp, noteHashes, nullifiers } = retrievedLog;
1302
+ return {
1303
+ // Skip the tag, and clip to the wire cap: public logs can exceed PRIVATE_LOG_CIPHERTEXT_LEN, which is the fixed
1304
+ // size of the oracle's BoundedVec slot. A no-op for private logs, which are already within the cap.
1305
+ logPayload: logData.slice(1, 1 + PRIVATE_LOG_CIPHERTEXT_LEN),
1306
+ txHash,
1307
+ uniqueNoteHashesInTx: noteHashes,
1308
+ firstNullifierInTx: nullifiers[0],
1309
+ blockNumber,
1310
+ blockTimestamp,
1311
+ blockHash,
1312
+ };
1313
+ }
1314
+
1315
+ function toValidationTxData(tx: TxOnchainContext): ValidationTxData {
1316
+ const { blockNumber, blockHash, txIndexInBlock, noteHashes, nullifiers } = tx;
1317
+ return { noteHashes, nullifiers, l2BlockNumber: blockNumber, l2BlockHash: blockHash, txIndexInBlock };
1318
+ }
1319
+
1320
+ /** The onchain context of a tx served to note and event validation: the union of what the two services read. */
1321
+ type ValidationTxData = NoteValidationTxData & EventValidationTxData;