@aztec/pxe 0.0.1-commit.2f68f620 → 0.0.1-commit.3100065

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 (350) hide show
  1. package/dest/bin/check_oracle_version.js +10 -20
  2. package/dest/bin/index.d.ts +2 -2
  3. package/dest/bin/index.d.ts.map +1 -1
  4. package/dest/bin/index.js +1 -1
  5. package/dest/bin/oracle_version_helpers.d.ts +26 -1
  6. package/dest/bin/oracle_version_helpers.d.ts.map +1 -1
  7. package/dest/bin/oracle_version_helpers.js +162 -1
  8. package/dest/block_synchronizer/block_stream_source.d.ts +5 -5
  9. package/dest/block_synchronizer/block_stream_source.d.ts.map +1 -1
  10. package/dest/block_synchronizer/block_stream_source.js +4 -29
  11. package/dest/block_synchronizer/block_synchronizer.d.ts +18 -14
  12. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
  13. package/dest/block_synchronizer/block_synchronizer.js +54 -18
  14. package/dest/config/index.d.ts +2 -1
  15. package/dest/config/index.d.ts.map +1 -1
  16. package/dest/config/index.js +1 -0
  17. package/dest/config/package_info.js +1 -1
  18. package/dest/contract/contract_class_service.d.ts +31 -0
  19. package/dest/contract/contract_class_service.d.ts.map +1 -0
  20. package/dest/contract/contract_class_service.js +68 -0
  21. package/dest/contract/contract_sync_service.d.ts +48 -0
  22. package/dest/contract/contract_sync_service.d.ts.map +1 -0
  23. package/dest/{contract_sync → contract}/contract_sync_service.js +26 -45
  24. package/dest/contract/helpers.d.ts +7 -0
  25. package/dest/contract/helpers.d.ts.map +1 -0
  26. package/dest/contract/helpers.js +20 -0
  27. package/dest/contract_function_simulator/anchored_contract_data.d.ts +36 -0
  28. package/dest/contract_function_simulator/anchored_contract_data.d.ts.map +1 -0
  29. package/dest/contract_function_simulator/anchored_contract_data.js +54 -0
  30. package/dest/contract_function_simulator/aztec_node_read_cache.d.ts +39 -0
  31. package/dest/contract_function_simulator/aztec_node_read_cache.d.ts.map +1 -0
  32. package/dest/contract_function_simulator/aztec_node_read_cache.js +60 -0
  33. package/dest/contract_function_simulator/contract_function_simulator.d.ts +19 -18
  34. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  35. package/dest/contract_function_simulator/contract_function_simulator.js +64 -35
  36. package/dest/contract_function_simulator/execution_note_cache.d.ts +3 -9
  37. package/dest/contract_function_simulator/execution_note_cache.d.ts.map +1 -1
  38. package/dest/contract_function_simulator/execution_note_cache.js +8 -28
  39. package/dest/contract_function_simulator/index.d.ts +19 -10
  40. package/dest/contract_function_simulator/index.d.ts.map +1 -1
  41. package/dest/contract_function_simulator/index.js +7 -9
  42. package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts +8 -27
  43. package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts.map +1 -1
  44. package/dest/contract_function_simulator/noir-structs/bounded_vec.js +8 -23
  45. package/dest/contract_function_simulator/noir-structs/contract_class_log_data.d.ts +9 -0
  46. package/dest/contract_function_simulator/noir-structs/contract_class_log_data.d.ts.map +1 -0
  47. package/dest/contract_function_simulator/noir-structs/contract_class_log_data.js +1 -0
  48. package/dest/contract_function_simulator/noir-structs/embedded_curve_point.d.ts +7 -0
  49. package/dest/contract_function_simulator/noir-structs/embedded_curve_point.d.ts.map +1 -0
  50. package/dest/contract_function_simulator/noir-structs/embedded_curve_point.js +1 -0
  51. package/dest/contract_function_simulator/noir-structs/event_validation_request.js +1 -1
  52. package/dest/contract_function_simulator/noir-structs/fact.d.ts +16 -0
  53. package/dest/contract_function_simulator/noir-structs/fact.d.ts.map +1 -0
  54. package/dest/contract_function_simulator/noir-structs/fact.js +6 -0
  55. package/dest/contract_function_simulator/noir-structs/fact_collection.d.ts +27 -0
  56. package/dest/contract_function_simulator/noir-structs/fact_collection.d.ts.map +1 -0
  57. package/dest/contract_function_simulator/noir-structs/fact_collection.js +31 -0
  58. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts +11 -12
  59. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts.map +1 -1
  60. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.js +6 -49
  61. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts +10 -8
  62. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts.map +1 -1
  63. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.js +1 -60
  64. package/dest/contract_function_simulator/noir-structs/note_validation_request.js +2 -2
  65. package/dest/contract_function_simulator/noir-structs/option.d.ts +9 -11
  66. package/dest/contract_function_simulator/noir-structs/option.d.ts.map +1 -1
  67. package/dest/contract_function_simulator/noir-structs/option.js +18 -13
  68. package/dest/contract_function_simulator/noir-structs/origin_block.d.ts +11 -0
  69. package/dest/contract_function_simulator/noir-structs/origin_block.d.ts.map +1 -0
  70. package/dest/contract_function_simulator/noir-structs/origin_block.js +5 -0
  71. package/dest/contract_function_simulator/noir-structs/pending_tagged_log.d.ts +11 -0
  72. package/dest/contract_function_simulator/noir-structs/pending_tagged_log.d.ts.map +1 -0
  73. package/dest/contract_function_simulator/noir-structs/pending_tagged_log.js +4 -0
  74. package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts +6 -9
  75. package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts.map +1 -1
  76. package/dest/contract_function_simulator/noir-structs/provided_secret.js +1 -24
  77. package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.d.ts +28 -0
  78. package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.d.ts.map +1 -0
  79. package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.js +50 -0
  80. package/dest/contract_function_simulator/noir-structs/resolved_tx.d.ts +21 -0
  81. package/dest/contract_function_simulator/noir-structs/resolved_tx.d.ts.map +1 -0
  82. package/dest/contract_function_simulator/noir-structs/resolved_tx.js +50 -0
  83. package/dest/contract_function_simulator/noir-structs/tx_effect_data.d.ts +14 -0
  84. package/dest/contract_function_simulator/noir-structs/tx_effect_data.d.ts.map +1 -0
  85. package/dest/contract_function_simulator/noir-structs/tx_effect_data.js +5 -0
  86. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts +6 -11
  87. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts.map +1 -1
  88. package/dest/contract_function_simulator/noir-structs/utility_context.js +1 -20
  89. package/dest/contract_function_simulator/oracle/acir_callback.d.ts +21 -0
  90. package/dest/contract_function_simulator/oracle/acir_callback.d.ts.map +1 -0
  91. package/dest/contract_function_simulator/oracle/acir_callback.js +115 -0
  92. package/dest/contract_function_simulator/oracle/index.d.ts +2 -13
  93. package/dest/contract_function_simulator/oracle/index.d.ts.map +1 -1
  94. package/dest/contract_function_simulator/oracle/index.js +1 -1
  95. package/dest/contract_function_simulator/oracle/interfaces.d.ts +2 -3
  96. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  97. package/dest/contract_function_simulator/oracle/legacy_oracle_registry.d.ts +39 -0
  98. package/dest/contract_function_simulator/oracle/legacy_oracle_registry.d.ts.map +1 -0
  99. package/dest/contract_function_simulator/oracle/legacy_oracle_registry.js +107 -0
  100. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts +3 -14
  101. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts.map +1 -1
  102. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.js +1 -24
  103. package/dest/contract_function_simulator/oracle/oracle_registry.d.ts +41 -30
  104. package/dest/contract_function_simulator/oracle/oracle_registry.d.ts.map +1 -1
  105. package/dest/contract_function_simulator/oracle/oracle_registry.js +248 -27
  106. package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts +123 -40
  107. package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts.map +1 -1
  108. package/dest/contract_function_simulator/oracle/oracle_type_mappings.js +947 -264
  109. package/dest/contract_function_simulator/oracle/private_execution.d.ts +1 -1
  110. package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
  111. package/dest/contract_function_simulator/oracle/private_execution.js +2 -3
  112. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +21 -8
  113. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  114. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +128 -17
  115. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +73 -33
  116. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  117. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +220 -104
  118. package/dest/contract_function_simulator/transient_array_service.d.ts +31 -0
  119. package/dest/contract_function_simulator/transient_array_service.d.ts.map +1 -0
  120. package/dest/contract_function_simulator/transient_array_service.js +62 -0
  121. package/dest/debug/pxe_debug_utils.d.ts +2 -2
  122. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  123. package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
  124. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  125. package/dest/entrypoints/client/bundle/utils.js +8 -3
  126. package/dest/entrypoints/client/lazy/utils.d.ts +1 -1
  127. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  128. package/dest/entrypoints/client/lazy/utils.js +8 -3
  129. package/dest/entrypoints/pxe_creation_options.d.ts +9 -3
  130. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  131. package/dest/entrypoints/server/index.d.ts +5 -3
  132. package/dest/entrypoints/server/index.d.ts.map +1 -1
  133. package/dest/entrypoints/server/index.js +3 -2
  134. package/dest/entrypoints/server/utils.d.ts +1 -1
  135. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  136. package/dest/entrypoints/server/utils.js +8 -2
  137. package/dest/error_enriching.d.ts +5 -3
  138. package/dest/error_enriching.d.ts.map +1 -1
  139. package/dest/error_enriching.js +13 -11
  140. package/dest/hooks/execution_hooks.d.ts +31 -11
  141. package/dest/hooks/execution_hooks.d.ts.map +1 -1
  142. package/dest/hooks/execution_hooks.js +3 -3
  143. package/dest/hooks/index.d.ts +4 -3
  144. package/dest/hooks/index.d.ts.map +1 -1
  145. package/dest/hooks/index.js +1 -0
  146. package/dest/hooks/resolve_custom_request.d.ts +23 -0
  147. package/dest/hooks/resolve_custom_request.d.ts.map +1 -0
  148. package/dest/hooks/resolve_custom_request.js +3 -0
  149. package/dest/hooks/resolve_tagging_secret_strategy.d.ts +50 -0
  150. package/dest/hooks/resolve_tagging_secret_strategy.d.ts.map +1 -0
  151. package/dest/hooks/resolve_tagging_secret_strategy.js +3 -0
  152. package/dest/logs/log_service.d.ts +7 -6
  153. package/dest/logs/log_service.d.ts.map +1 -1
  154. package/dest/logs/log_service.js +79 -28
  155. package/dest/messages/tx_resolver_service.d.ts +17 -0
  156. package/dest/messages/tx_resolver_service.d.ts.map +1 -0
  157. package/dest/messages/{message_context_service.js → tx_resolver_service.js} +8 -8
  158. package/dest/oracle_version.d.ts +3 -3
  159. package/dest/oracle_version.js +5 -5
  160. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +1 -1
  161. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -1
  162. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.js +6 -2
  163. package/dest/private_kernel/hints/test_utils.js +1 -1
  164. package/dest/private_kernel/private_kernel_execution_prover.d.ts +1 -1
  165. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  166. package/dest/private_kernel/private_kernel_execution_prover.js +17 -36
  167. package/dest/private_kernel/private_kernel_oracle.d.ts +4 -2
  168. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  169. package/dest/private_kernel/private_kernel_oracle.js +17 -5
  170. package/dest/pxe.d.ts +114 -48
  171. package/dest/pxe.d.ts.map +1 -1
  172. package/dest/pxe.js +222 -139
  173. package/dest/storage/allowed_scopes.d.ts +6 -0
  174. package/dest/storage/allowed_scopes.d.ts.map +1 -0
  175. package/dest/storage/allowed_scopes.js +7 -0
  176. package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -6
  177. package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
  178. package/dest/storage/anchor_block_store/anchor_block_store.js +8 -6
  179. package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts +1 -1
  180. package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts.map +1 -1
  181. package/dest/storage/backwards_compatibility_tests/schema_tests.js +129 -49
  182. package/dest/storage/capsule_store/capsule_service.d.ts +1 -1
  183. package/dest/storage/capsule_store/capsule_service.d.ts.map +1 -1
  184. package/dest/storage/capsule_store/capsule_service.js +6 -9
  185. package/dest/storage/contract_store/contract_store.d.ts +27 -24
  186. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  187. package/dest/storage/contract_store/contract_store.js +64 -75
  188. package/dest/storage/fact_store/fact_service.d.ts +22 -0
  189. package/dest/storage/fact_store/fact_service.d.ts.map +1 -0
  190. package/dest/storage/fact_store/fact_service.js +45 -0
  191. package/dest/storage/fact_store/fact_store.d.ts +95 -0
  192. package/dest/storage/fact_store/fact_store.d.ts.map +1 -0
  193. package/dest/storage/fact_store/fact_store.js +408 -0
  194. package/dest/storage/fact_store/fact_store_keys.d.ts +34 -0
  195. package/dest/storage/fact_store/fact_store_keys.d.ts.map +1 -0
  196. package/dest/storage/fact_store/fact_store_keys.js +50 -0
  197. package/dest/storage/fact_store/index.d.ts +6 -0
  198. package/dest/storage/fact_store/index.d.ts.map +1 -0
  199. package/dest/storage/fact_store/index.js +4 -0
  200. package/dest/storage/fact_store/origin_state.d.ts +57 -0
  201. package/dest/storage/fact_store/origin_state.d.ts.map +1 -0
  202. package/dest/storage/fact_store/origin_state.js +53 -0
  203. package/dest/storage/fact_store/stored_fact.d.ts +32 -0
  204. package/dest/storage/fact_store/stored_fact.d.ts.map +1 -0
  205. package/dest/storage/fact_store/stored_fact.js +64 -0
  206. package/dest/storage/index.d.ts +3 -2
  207. package/dest/storage/index.d.ts.map +1 -1
  208. package/dest/storage/index.js +2 -1
  209. package/dest/storage/metadata.d.ts +2 -2
  210. package/dest/storage/metadata.d.ts.map +1 -1
  211. package/dest/storage/metadata.js +1 -1
  212. package/dest/storage/note_store/note_store.d.ts +42 -33
  213. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  214. package/dest/storage/note_store/note_store.js +197 -168
  215. package/dest/storage/note_store/stored_note.d.ts +3 -8
  216. package/dest/storage/note_store/stored_note.d.ts.map +1 -1
  217. package/dest/storage/note_store/stored_note.js +4 -20
  218. package/dest/storage/open_pxe_stores.d.ts +5 -3
  219. package/dest/storage/open_pxe_stores.d.ts.map +1 -1
  220. package/dest/storage/open_pxe_stores.js +5 -3
  221. package/dest/storage/private_event_store/private_event_store.d.ts +13 -16
  222. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  223. package/dest/storage/private_event_store/private_event_store.js +40 -43
  224. package/dest/storage/tagging_store/index.d.ts +2 -2
  225. package/dest/storage/tagging_store/index.d.ts.map +1 -1
  226. package/dest/storage/tagging_store/index.js +1 -1
  227. package/dest/storage/tagging_store/tagging_secret_sources_store.d.ts +51 -0
  228. package/dest/storage/tagging_store/tagging_secret_sources_store.d.ts.map +1 -0
  229. package/dest/storage/tagging_store/tagging_secret_sources_store.js +105 -0
  230. package/dest/tagging/constants.d.ts +2 -2
  231. package/dest/tagging/constants.d.ts.map +1 -1
  232. package/dest/tagging/constants.js +18 -9
  233. package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts +21 -8
  234. package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts.map +1 -1
  235. package/dest/tagging/recipient_sync/sync_tagged_private_logs.js +56 -16
  236. package/package.json +17 -17
  237. package/src/bin/check_oracle_version.ts +10 -19
  238. package/src/bin/index.ts +5 -1
  239. package/src/bin/oracle_version_helpers.ts +190 -0
  240. package/src/block_synchronizer/block_stream_source.ts +6 -45
  241. package/src/block_synchronizer/block_synchronizer.ts +70 -29
  242. package/src/config/index.ts +1 -0
  243. package/src/config/package_info.ts +1 -1
  244. package/src/contract/contract_class_service.ts +83 -0
  245. package/src/{contract_sync → contract}/contract_sync_service.ts +37 -50
  246. package/src/contract/helpers.ts +35 -0
  247. package/src/contract_function_simulator/anchored_contract_data.ts +74 -0
  248. package/src/contract_function_simulator/aztec_node_read_cache.ts +89 -0
  249. package/src/contract_function_simulator/contract_function_simulator.ts +97 -45
  250. package/src/contract_function_simulator/execution_note_cache.ts +7 -28
  251. package/src/contract_function_simulator/index.ts +26 -11
  252. package/src/contract_function_simulator/noir-structs/bounded_vec.ts +12 -24
  253. package/src/contract_function_simulator/noir-structs/contract_class_log_data.ts +9 -0
  254. package/src/contract_function_simulator/noir-structs/embedded_curve_point.ts +4 -0
  255. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +1 -1
  256. package/src/contract_function_simulator/noir-structs/fact.ts +13 -0
  257. package/src/contract_function_simulator/noir-structs/fact_collection.ts +64 -0
  258. package/src/contract_function_simulator/noir-structs/log_retrieval_request.ts +20 -46
  259. package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +13 -60
  260. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +2 -2
  261. package/src/contract_function_simulator/noir-structs/option.ts +17 -11
  262. package/src/contract_function_simulator/noir-structs/origin_block.ts +8 -0
  263. package/src/contract_function_simulator/noir-structs/pending_tagged_log.ts +12 -0
  264. package/src/contract_function_simulator/noir-structs/provided_secret.ts +4 -26
  265. package/src/contract_function_simulator/noir-structs/resolved_tagging_strategy.ts +66 -0
  266. package/src/contract_function_simulator/noir-structs/resolved_tx.ts +53 -0
  267. package/src/contract_function_simulator/noir-structs/tx_effect_data.ts +15 -0
  268. package/src/contract_function_simulator/noir-structs/utility_context.ts +5 -17
  269. package/src/contract_function_simulator/oracle/acir_callback.ts +154 -0
  270. package/src/contract_function_simulator/oracle/index.ts +1 -15
  271. package/src/contract_function_simulator/oracle/interfaces.ts +1 -2
  272. package/src/contract_function_simulator/oracle/legacy_oracle_registry.ts +147 -0
  273. package/src/contract_function_simulator/oracle/message_load_oracle_inputs.ts +6 -21
  274. package/src/contract_function_simulator/oracle/oracle_registry.ts +162 -41
  275. package/src/contract_function_simulator/oracle/oracle_type_mappings.ts +659 -248
  276. package/src/contract_function_simulator/oracle/private_execution.ts +2 -3
  277. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +156 -24
  278. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +357 -131
  279. package/src/contract_function_simulator/transient_array_service.ts +91 -0
  280. package/src/debug/pxe_debug_utils.ts +1 -1
  281. package/src/entrypoints/client/bundle/utils.ts +10 -3
  282. package/src/entrypoints/client/lazy/utils.ts +10 -3
  283. package/src/entrypoints/pxe_creation_options.ts +8 -2
  284. package/src/entrypoints/server/index.ts +5 -2
  285. package/src/entrypoints/server/utils.ts +10 -2
  286. package/src/error_enriching.ts +27 -11
  287. package/src/hooks/execution_hooks.ts +32 -12
  288. package/src/hooks/index.ts +8 -2
  289. package/src/hooks/resolve_custom_request.ts +24 -0
  290. package/src/hooks/resolve_tagging_secret_strategy.ts +60 -0
  291. package/src/logs/log_service.ts +91 -37
  292. package/src/messages/{message_context_service.ts → tx_resolver_service.ts} +16 -9
  293. package/src/oracle_version.ts +5 -5
  294. package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +11 -1
  295. package/src/private_kernel/hints/test_utils.ts +1 -1
  296. package/src/private_kernel/private_kernel_execution_prover.ts +22 -52
  297. package/src/private_kernel/private_kernel_oracle.ts +23 -4
  298. package/src/pxe.ts +325 -159
  299. package/src/storage/allowed_scopes.ts +14 -0
  300. package/src/storage/anchor_block_store/anchor_block_store.ts +8 -6
  301. package/src/storage/backwards_compatibility_tests/__snapshots__/AddressStore.json +6 -6
  302. package/src/storage/backwards_compatibility_tests/__snapshots__/ContractStore.json +1 -1
  303. package/src/storage/backwards_compatibility_tests/__snapshots__/FactStore.json +40 -0
  304. package/src/storage/backwards_compatibility_tests/__snapshots__/KeyStore.json +12 -12
  305. package/src/storage/backwards_compatibility_tests/__snapshots__/L2TipsKVStore.json +9 -15
  306. package/src/storage/backwards_compatibility_tests/__snapshots__/NoteStore.json +24 -4
  307. package/src/storage/backwards_compatibility_tests/__snapshots__/RecipientTaggingStore.json +11 -3
  308. package/src/storage/backwards_compatibility_tests/__snapshots__/SenderTaggingStore.json +12 -4
  309. package/src/storage/backwards_compatibility_tests/__snapshots__/TaggingSecretSourcesStore.json +30 -0
  310. package/src/storage/backwards_compatibility_tests/__snapshots__/opened_stores.json +29 -9
  311. package/src/storage/backwards_compatibility_tests/schema_tests.ts +141 -50
  312. package/src/storage/capsule_store/capsule_service.ts +8 -13
  313. package/src/storage/contract_store/contract_store.ts +86 -93
  314. package/src/storage/fact_store/fact_service.ts +69 -0
  315. package/src/storage/fact_store/fact_store.ts +487 -0
  316. package/src/storage/fact_store/fact_store_keys.ts +75 -0
  317. package/src/storage/fact_store/index.ts +14 -0
  318. package/src/storage/fact_store/origin_state.ts +75 -0
  319. package/src/storage/fact_store/stored_fact.ts +80 -0
  320. package/src/storage/index.ts +2 -1
  321. package/src/storage/metadata.ts +1 -1
  322. package/src/storage/note_store/note_store.ts +226 -187
  323. package/src/storage/note_store/stored_note.ts +5 -27
  324. package/src/storage/open_pxe_stores.ts +6 -3
  325. package/src/storage/private_event_store/private_event_store.ts +49 -55
  326. package/src/storage/tagging_store/index.ts +1 -1
  327. package/src/storage/tagging_store/tagging_secret_sources_store.ts +138 -0
  328. package/src/tagging/constants.ts +19 -9
  329. package/src/tagging/recipient_sync/sync_tagged_private_logs.ts +77 -16
  330. package/dest/contract_function_simulator/oracle/oracle.d.ts +0 -89
  331. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +0 -1
  332. package/dest/contract_function_simulator/oracle/oracle.js +0 -552
  333. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts +0 -6
  334. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts.map +0 -1
  335. package/dest/contract_function_simulator/proxied_contract_data_source.js +0 -51
  336. package/dest/contract_sync/contract_sync_service.d.ts +0 -42
  337. package/dest/contract_sync/contract_sync_service.d.ts.map +0 -1
  338. package/dest/contract_sync/helpers.d.ts +0 -27
  339. package/dest/contract_sync/helpers.d.ts.map +0 -1
  340. package/dest/contract_sync/helpers.js +0 -53
  341. package/dest/messages/message_context_service.d.ts +0 -17
  342. package/dest/messages/message_context_service.d.ts.map +0 -1
  343. package/dest/storage/tagging_store/sender_address_book_store.d.ts +0 -14
  344. package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +0 -1
  345. package/dest/storage/tagging_store/sender_address_book_store.js +0 -36
  346. package/src/contract_function_simulator/oracle/oracle.ts +0 -711
  347. package/src/contract_function_simulator/proxied_contract_data_source.ts +0 -60
  348. package/src/contract_sync/helpers.ts +0 -86
  349. package/src/storage/backwards_compatibility_tests/__snapshots__/SenderAddressBookStore.json +0 -16
  350. package/src/storage/tagging_store/sender_address_book_store.ts +0 -48
@@ -3,7 +3,7 @@ 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 type { Point } from '@aztec/foundation/curves/grumpkin';
6
+ import { Point } from '@aztec/foundation/curves/grumpkin';
7
7
  import { LogLevels, type Logger, createLogger } from '@aztec/foundation/log';
8
8
  import { MembershipWitness } from '@aztec/foundation/trees';
9
9
  import type { KeyStore } from '@aztec/key-store';
@@ -15,82 +15,87 @@ import {
15
15
  toACVMWitness,
16
16
  witnessMapToFields,
17
17
  } from '@aztec/simulator/client';
18
+ import { STANDARD_HANDSHAKE_REGISTRY_ADDRESS } from '@aztec/standard-contracts/handshake-registry/constants';
18
19
  import { type FunctionCall, FunctionSelector } from '@aztec/stdlib/abi';
19
20
  import type { AuthWitness } from '@aztec/stdlib/auth-witness';
20
21
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
21
22
  import { BlockHash, type L2TipsProvider } from '@aztec/stdlib/block';
22
- import type { CompleteAddress, ContractInstance, PartialAddress } from '@aztec/stdlib/contract';
23
+ import type { CompleteAddress, ContractInstancePreimageWithAddress, PartialAddress } from '@aztec/stdlib/contract';
23
24
  import { siloNullifier } from '@aztec/stdlib/hash';
24
25
  import type { AztecNode } from '@aztec/stdlib/interfaces/server';
25
26
  import type { KeyValidationRequest } from '@aztec/stdlib/kernel';
26
27
  import { PublicKeys, computeAddressSecret, hashPublicKey } from '@aztec/stdlib/keys';
27
- import {
28
- AppTaggingSecret,
29
- MessageContext,
30
- type PendingTaggedLog,
31
- deriveAppSiloedSharedSecret,
32
- } from '@aztec/stdlib/logs';
33
- import { getNonNullifiedL1ToL2MessageWitness } from '@aztec/stdlib/messaging';
28
+ import { AppTaggingSecret, FlatPublicLogs, appSiloEcdhSharedSecret } from '@aztec/stdlib/logs';
29
+ import { type UnsiloedMessageNullifier, getL1ToL2MessageWitness } from '@aztec/stdlib/messaging';
34
30
  import type { NoteStatus } from '@aztec/stdlib/note';
35
31
  import { MerkleTreeId, type NullifierMembershipWitness, PublicDataWitness } from '@aztec/stdlib/trees';
36
32
  import {
37
33
  type BlockHeader,
34
+ CallContext,
38
35
  type Capsule,
39
36
  type IndexedTxEffect,
40
37
  type OffchainEffect,
41
- TxEffect,
42
38
  type TxHash,
43
39
  } from '@aztec/stdlib/tx';
44
40
 
41
+ import type { ContractSyncService } from '../../contract/contract_sync_service.js';
45
42
  import { createContractLogger, logContractMessage, stripAztecnrLogPrefix } from '../../contract_logging.js';
46
- import type { ContractSyncService } from '../../contract_sync/contract_sync_service.js';
47
43
  import { EventService } from '../../events/event_service.js';
48
44
  import type { UtilityCallAuthorizationRequest } from '../../hooks/authorize_utility_call.js';
49
45
  import type { ExecutionHooks } from '../../hooks/index.js';
50
46
  import { LogService } from '../../logs/log_service.js';
51
- import { MessageContextService } from '../../messages/message_context_service.js';
47
+ import { TxResolverService } from '../../messages/tx_resolver_service.js';
52
48
  import { NoteService } from '../../notes/note_service.js';
53
49
  import { ORACLE_VERSION_MAJOR } from '../../oracle_version.js';
54
50
  import type { AddressStore } from '../../storage/address_store/address_store.js';
55
51
  import type { CapsuleService } from '../../storage/capsule_store/capsule_service.js';
56
- import type { ContractStore } from '../../storage/contract_store/contract_store.js';
52
+ import { FactCollectionKey, FactCollectionTypeKey, anchoredTipBlockNumbers } from '../../storage/fact_store/index.js';
53
+ import type { FactService, OriginBlock } from '../../storage/fact_store/index.js';
57
54
  import type { NoteStore } from '../../storage/note_store/note_store.js';
58
55
  import type { PrivateEventStore } from '../../storage/private_event_store/private_event_store.js';
59
56
  import type { RecipientTaggingStore } from '../../storage/tagging_store/recipient_tagging_store.js';
60
- import type { SenderAddressBookStore } from '../../storage/tagging_store/sender_address_book_store.js';
57
+ import type { TaggingSecretSourcesStore } from '../../storage/tagging_store/tagging_secret_sources_store.js';
58
+ import type { AnchoredContractData } from '../anchored_contract_data.js';
59
+ import { AztecNodeReadCache } from '../aztec_node_read_cache.js';
61
60
  import { EphemeralArrayService } from '../ephemeral_array_service.js';
62
61
  import { BoundedVec } from '../noir-structs/bounded_vec.js';
62
+ import type { EmbeddedCurvePoint } from '../noir-structs/embedded_curve_point.js';
63
63
  import { EphemeralArray } from '../noir-structs/ephemeral_array.js';
64
64
  import type { EventValidationRequest } from '../noir-structs/event_validation_request.js';
65
+ import { type FactCollection, emptyFactCollection, toNoirFactCollection } from '../noir-structs/fact_collection.js';
65
66
  import type { LogRetrievalRequest } from '../noir-structs/log_retrieval_request.js';
66
67
  import type { LogRetrievalResponse } from '../noir-structs/log_retrieval_response.js';
67
68
  import type { NoteData } from '../noir-structs/note_data.js';
68
69
  import type { NoteValidationRequest } from '../noir-structs/note_validation_request.js';
69
70
  import { Option } from '../noir-structs/option.js';
71
+ import type { PendingTaggedLog } from '../noir-structs/pending_tagged_log.js';
70
72
  import type { ProvidedSecret } from '../noir-structs/provided_secret.js';
71
- import { UtilityContext } from '../noir-structs/utility_context.js';
73
+ import type { ResolvedTx } from '../noir-structs/resolved_tx.js';
74
+ import type { TxEffectData } from '../noir-structs/tx_effect_data.js';
75
+ import type { UtilityContext } from '../noir-structs/utility_context.js';
72
76
  import { pickNotes } from '../pick_notes.js';
77
+ import type { TransientArrayService } from '../transient_array_service.js';
78
+ import { buildACIRCallback } from './acir_callback.js';
73
79
  import type { IMiscOracle, IUtilityExecutionOracle } from './interfaces.js';
74
- import { MessageLoadOracleInputs } from './message_load_oracle_inputs.js';
75
- import { Oracle } from './oracle.js';
76
80
 
77
81
  /** Args for UtilityExecutionOracle constructor. */
78
82
  export type UtilityExecutionOracleArgs = {
79
- contractAddress: AztecAddress;
83
+ callContext: CallContext;
80
84
  /** List of transient auth witnesses to be used during this simulation */
81
85
  authWitnesses: AuthWitness[];
82
86
  capsules: Capsule[]; // TODO(#12425): Rename to transientCapsules
83
87
  anchorBlockHeader: BlockHeader;
84
- contractStore: ContractStore;
88
+ anchoredContractData: AnchoredContractData;
85
89
  noteStore: NoteStore;
86
90
  keyStore: KeyStore;
87
91
  addressStore: AddressStore;
88
92
  aztecNode: AztecNode;
89
93
  recipientTaggingStore: RecipientTaggingStore;
90
- senderAddressBookStore: SenderAddressBookStore;
94
+ taggingSecretSourcesStore: TaggingSecretSourcesStore;
91
95
  capsuleService: CapsuleService;
96
+ factService: FactService;
92
97
  privateEventStore: PrivateEventStore;
93
- messageContextService: MessageContextService;
98
+ txResolver: TxResolverService;
94
99
  contractSyncService: ContractSyncService;
95
100
  l2TipsStore: L2TipsProvider;
96
101
  jobId: string;
@@ -100,6 +105,7 @@ export type UtilityExecutionOracleArgs = {
100
105
  hooks?: ExecutionHooks;
101
106
  /** Needed to trigger contract synchronization before nested cross-contract calls. */
102
107
  utilityExecutor: (call: FunctionCall, scopes: AztecAddress[]) => Promise<void>;
108
+ transientArrayService: TransientArrayService;
103
109
  };
104
110
 
105
111
  /**
@@ -113,24 +119,27 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
113
119
  private aztecnrLogger: Logger | undefined;
114
120
  private offchainEffects: OffchainEffect[] = [];
115
121
  private readonly ephemeralArrayService = new EphemeralArrayService();
122
+ protected readonly transientArrayService: TransientArrayService;
123
+ private readonly aztecNodeReadCache: AztecNodeReadCache;
116
124
 
117
125
  // We store oracle version to be able to show a nice error message when an oracle handler is missing.
118
126
  private contractOracleVersion: { major: number; minor: number } | undefined;
119
127
 
120
- protected readonly contractAddress: AztecAddress;
128
+ protected readonly callContext: CallContext;
121
129
  protected readonly authWitnesses: AuthWitness[];
122
130
  protected readonly capsules: Capsule[];
123
131
  protected readonly anchorBlockHeader: BlockHeader;
124
- protected readonly contractStore: ContractStore;
132
+ protected readonly anchoredContractData: AnchoredContractData;
125
133
  protected readonly noteStore: NoteStore;
126
134
  protected readonly keyStore: KeyStore;
127
135
  protected readonly addressStore: AddressStore;
128
136
  protected readonly aztecNode: AztecNode;
129
137
  protected readonly recipientTaggingStore: RecipientTaggingStore;
130
- protected readonly senderAddressBookStore: SenderAddressBookStore;
138
+ protected readonly taggingSecretSourcesStore: TaggingSecretSourcesStore;
131
139
  protected readonly capsuleService: CapsuleService;
140
+ protected readonly factService: FactService;
132
141
  protected readonly privateEventStore: PrivateEventStore;
133
- protected readonly messageContextService: MessageContextService;
142
+ protected readonly txResolver: TxResolverService;
134
143
  protected readonly contractSyncService: ContractSyncService;
135
144
  protected readonly l2TipsStore: L2TipsProvider;
136
145
  protected readonly jobId: string;
@@ -141,20 +150,21 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
141
150
  protected readonly utilityExecutor: (call: FunctionCall, scopes: AztecAddress[]) => Promise<void>;
142
151
 
143
152
  constructor(args: UtilityExecutionOracleArgs) {
144
- this.contractAddress = args.contractAddress;
153
+ this.callContext = args.callContext;
145
154
  this.authWitnesses = args.authWitnesses;
146
155
  this.capsules = args.capsules;
147
156
  this.anchorBlockHeader = args.anchorBlockHeader;
148
- this.contractStore = args.contractStore;
157
+ this.anchoredContractData = args.anchoredContractData;
149
158
  this.noteStore = args.noteStore;
150
159
  this.keyStore = args.keyStore;
151
160
  this.addressStore = args.addressStore;
152
161
  this.aztecNode = args.aztecNode;
153
162
  this.recipientTaggingStore = args.recipientTaggingStore;
154
- this.senderAddressBookStore = args.senderAddressBookStore;
163
+ this.taggingSecretSourcesStore = args.taggingSecretSourcesStore;
155
164
  this.capsuleService = args.capsuleService;
165
+ this.factService = args.factService;
156
166
  this.privateEventStore = args.privateEventStore;
157
- this.messageContextService = args.messageContextService;
167
+ this.txResolver = args.txResolver;
158
168
  this.contractSyncService = args.contractSyncService;
159
169
  this.l2TipsStore = args.l2TipsStore;
160
170
  this.jobId = args.jobId;
@@ -163,6 +173,8 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
163
173
  this.simulator = args.simulator;
164
174
  this.hooks = args.hooks;
165
175
  this.utilityExecutor = args.utilityExecutor;
176
+ this.transientArrayService = args.transientArrayService;
177
+ this.aztecNodeReadCache = new AztecNodeReadCache(args.aztecNode);
166
178
  }
167
179
 
168
180
  public assertCompatibleOracleVersion(major: number, minor: number): void {
@@ -189,17 +201,22 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
189
201
  }
190
202
 
191
203
  public getUtilityContext(): UtilityContext {
192
- return new UtilityContext(this.anchorBlockHeader, this.contractAddress);
204
+ return {
205
+ blockHeader: this.anchorBlockHeader,
206
+ contractAddress: this.callContext.contractAddress,
207
+ msgSender: this.callContext.msgSender,
208
+ };
193
209
  }
194
210
 
195
211
  /**
196
212
  * Retrieve keys associated with a specific master public key and app address.
197
213
  * @param pkMHash - The master public key hash.
214
+ * @param _keyIndex - Sent by the Noir oracle caller but unused here; kept to match the oracle signature.
198
215
  * @returns A Promise that resolves to nullifier keys.
199
216
  * @throws If the keys are not registered in the key store.
200
217
  * @throws If scopes are defined and the account is not in the scopes.
201
218
  */
202
- public async getKeyValidationRequest(pkMHash: Fr): Promise<KeyValidationRequest> {
219
+ public async getKeyValidationRequest(pkMHash: Fr, _keyIndex: Fr): Promise<KeyValidationRequest> {
203
220
  let hasAccess = false;
204
221
  for (let i = 0; i < this.scopes.length && !hasAccess; i++) {
205
222
  if (await this.keyStore.accountHasKey(this.scopes[i], pkMHash)) {
@@ -251,9 +268,25 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
251
268
  // hash at all. If the block hash did not exist by the reference block hash, then the node will not return the
252
269
  // membership witness as there is none.
253
270
  const witness = await this.#queryWithBlockHashNotAfterAnchor(referenceBlockHash, () =>
254
- this.aztecNode.getBlockHashMembershipWitness(referenceBlockHash, blockHash),
271
+ this.aztecNodeReadCache.getBlockHashMembershipWitness(referenceBlockHash, blockHash),
255
272
  );
256
- return witness ? Option.some(witness) : Option.none(MembershipWitness.empty(ARCHIVE_HEIGHT));
273
+ return witness ? Option.some(witness) : Option.none();
274
+ }
275
+
276
+ /** Returns whether each block hash is present in the archive tree at the referenced block. */
277
+ public async areBlockHashesInArchive(
278
+ referenceBlockHash: BlockHash,
279
+ blockHashes: EphemeralArray<BlockHash>,
280
+ ): Promise<EphemeralArray<boolean>> {
281
+ const hashes = blockHashes.readAll(this.ephemeralArrayService);
282
+ const memberships = await this.#queryWithBlockHashNotAfterAnchor(referenceBlockHash, () =>
283
+ Promise.all(
284
+ hashes.map(blockHash =>
285
+ this.aztecNodeReadCache.getBlockHashMembershipWitness(referenceBlockHash, blockHash).then(Boolean),
286
+ ),
287
+ ),
288
+ );
289
+ return EphemeralArray.fromValues(this.ephemeralArrayService, memberships);
257
290
  }
258
291
 
259
292
  /**
@@ -304,7 +337,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
304
337
  */
305
338
  public async getPublicDataWitness(blockHash: BlockHash, leafSlot: Fr): Promise<PublicDataWitness> {
306
339
  const witness = await this.#queryWithBlockHashNotAfterAnchor(blockHash, () =>
307
- this.aztecNode.getPublicDataWitness(blockHash, leafSlot),
340
+ this.aztecNodeReadCache.getPublicDataWitness(blockHash, leafSlot),
308
341
  );
309
342
  if (!witness) {
310
343
  throw new Error(`Public data witness not found for slot ${leafSlot} at block hash ${blockHash.toString()}.`);
@@ -345,7 +378,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
345
378
  ): Promise<Option<{ publicKeys: PublicKeys; partialAddress: PartialAddress }>> {
346
379
  const completeAddress = await this.addressStore.getCompleteAddress(account);
347
380
  if (!completeAddress) {
348
- return Option.none({ publicKeys: PublicKeys.default(), partialAddress: Fr.ZERO });
381
+ return Option.none();
349
382
  }
350
383
  return Option.some({ publicKeys: completeAddress.publicKeys, partialAddress: completeAddress.partialAddress });
351
384
  }
@@ -355,7 +388,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
355
388
  if (!completeAddress) {
356
389
  throw new Error(
357
390
  `No public key registered for address ${account}.
358
- 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`,
391
+ Register it by calling wallet.registerSender(...).\nSee docs for context: https://docs.aztec.network/errors/14`,
359
392
  );
360
393
  }
361
394
  return completeAddress;
@@ -366,8 +399,8 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
366
399
  * @param address - Address.
367
400
  * @returns A contract instance.
368
401
  */
369
- public async getContractInstance(address: AztecAddress): Promise<ContractInstance> {
370
- const instance = await this.contractStore.getContractInstance(address);
402
+ public async getContractInstance(address: AztecAddress): Promise<ContractInstancePreimageWithAddress> {
403
+ const instance = await this.anchoredContractData.getContractInstance(address);
371
404
  if (!instance) {
372
405
  throw new Error(`No contract instance found for address ${address.toString()}`);
373
406
  }
@@ -464,23 +497,21 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
464
497
  }
465
498
 
466
499
  /**
467
- * Returns the membership witness of an un-nullified L1 to L2 message.
468
- * @param contractAddress - Address of a contract by which the message was emitted.
500
+ * Returns the membership witness of an L1 to L2 message.
469
501
  * @param messageHash - Hash of the message.
470
- * @param secret - Secret used to compute a nullifier.
471
- * @dev Contract address and secret are only used to compute the nullifier to get non-nullified messages
502
+ * @param nullifier - When present, the unsiloed nullifier of the message and the address to silo it with. The witness
503
+ * is only returned if the siloed nullifier is absent from the nullifier tree, i.e. the message has not been consumed.
472
504
  * @returns The l1 to l2 membership witness (index of message in the tree and sibling path).
473
505
  */
474
- public async getL1ToL2MembershipWitness(contractAddress: AztecAddress, messageHash: Fr, secret: Fr) {
475
- const [messageIndex, siblingPath] = await getNonNullifiedL1ToL2MessageWitness(
506
+ public async getL1ToL2MembershipWitnessV2(messageHash: Fr, nullifier: Option<UnsiloedMessageNullifier>) {
507
+ const [messageIndex, siblingPath] = await getL1ToL2MessageWitness(
476
508
  this.aztecNode,
477
- contractAddress,
478
509
  messageHash,
479
- secret,
510
+ nullifier.value,
480
511
  await this.anchorBlockHeader.hash(),
481
512
  );
482
513
 
483
- return new MessageLoadOracleInputs(messageIndex, siblingPath);
514
+ return { index: messageIndex, siblingPath };
484
515
  }
485
516
 
486
517
  /**
@@ -497,16 +528,16 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
497
528
  numberOfElements: number,
498
529
  ) {
499
530
  return this.#queryWithBlockHashNotAfterAnchor(blockHash, async () => {
500
- const slots = Array(numberOfElements)
501
- .fill(0)
502
- .map((_, i) => new Fr(startStorageSlot.value + BigInt(i)));
503
-
504
- const values = await Promise.all(
505
- slots.map(storageSlot => this.aztecNode.getPublicStorageAt(blockHash, contractAddress, storageSlot)),
531
+ const values = await this.aztecNodeReadCache.getPublicStorageRange(
532
+ blockHash,
533
+ contractAddress,
534
+ startStorageSlot,
535
+ numberOfElements,
506
536
  );
507
537
 
508
538
  this.logger.debug(
509
- `Oracle storage read: slots=[${slots.map(slot => slot.toString()).join(', ')}] address=${contractAddress.toString()} values=[${values.join(', ')}]`,
539
+ `Oracle storage read: start=${startStorageSlot.toString()} count=${numberOfElements} ` +
540
+ `address=${contractAddress.toString()} values=[${values.join(', ')}]`,
510
541
  );
511
542
 
512
543
  return values;
@@ -522,7 +553,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
522
553
  // to re-use jobId as instanceId here as executions of different PXE jobs are isolated.
523
554
  this.contractLogger = await createContractLogger(
524
555
  this.contractAddress,
525
- addr => this.contractStore.getDebugContractName(addr),
556
+ addr => this.anchoredContractData.getDebugContractName(addr),
526
557
  'user',
527
558
  { instanceId: this.jobId },
528
559
  );
@@ -539,7 +570,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
539
570
  // to re-use jobId as instanceId here as executions of different PXE jobs are isolated.
540
571
  this.aztecnrLogger = await createContractLogger(
541
572
  this.contractAddress,
542
- addr => this.contractStore.getDebugContractName(addr),
573
+ addr => this.anchoredContractData.getDebugContractName(addr),
543
574
  'aztecnr',
544
575
  { instanceId: this.jobId },
545
576
  );
@@ -559,7 +590,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
559
590
  }
560
591
 
561
592
  /** Fetches pending tagged logs into a freshly allocated ephemeral array and returns it. */
562
- public async getPendingTaggedLogs(
593
+ public async getPendingTaggedLogsV2(
563
594
  scope: AztecAddress,
564
595
  providedSecrets: EphemeralArray<ProvidedSecret>,
565
596
  ): Promise<EphemeralArray<PendingTaggedLog>> {
@@ -579,7 +610,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
579
610
  this.l2TipsStore,
580
611
  this.keyStore,
581
612
  this.recipientTaggingStore,
582
- this.senderAddressBookStore,
613
+ this.taggingSecretSourcesStore,
583
614
  this.addressStore,
584
615
  this.jobId,
585
616
  this.logger.getBindings(),
@@ -617,7 +648,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
617
648
  ]);
618
649
  }
619
650
 
620
- public async getLogsByTag(
651
+ public async getLogsByTagV2(
621
652
  requests: EphemeralArray<LogRetrievalRequest>,
622
653
  ): Promise<EphemeralArray<EphemeralArray<LogRetrievalResponse>>> {
623
654
  const logRetrievalRequests = requests.readAll(this.ephemeralArrayService);
@@ -633,20 +664,13 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
633
664
  return EphemeralArray.fromValues(this.ephemeralArrayService, innerArrays);
634
665
  }
635
666
 
636
- /** Reads tx hash requests from an ephemeral array, resolves their contexts, and returns the response array. */
637
- public async getMessageContextsByTxHash(
638
- requests: EphemeralArray<Fr>,
639
- ): Promise<EphemeralArray<Option<MessageContext>>> {
667
+ /** Given an array of tx hashes, returns an aligned array of tx info if the tx is available. */
668
+ public async getResolvedTxs(requests: EphemeralArray<Fr>): Promise<EphemeralArray<Option<ResolvedTx>>> {
640
669
  const txHashes = requests.readAll(this.ephemeralArrayService);
641
670
 
642
- const maybeMessageContexts = await this.messageContextService.getMessageContextsByTxHash(
643
- txHashes,
644
- this.anchorBlockHeader.getBlockNumber(),
645
- );
671
+ const resolved = await this.txResolver.resolveTxs(txHashes, this.anchorBlockHeader.getBlockNumber());
646
672
 
647
- const options = maybeMessageContexts.map(mc =>
648
- mc ? Option.some(mc) : Option.none<MessageContext>(MessageContext.empty()),
649
- );
673
+ const options = resolved.map(r => (r ? Option.some(r) : Option.none<ResolvedTx>()));
650
674
  return EphemeralArray.fromValues(this.ephemeralArrayService, options);
651
675
  }
652
676
 
@@ -654,24 +678,30 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
654
678
  * Fetches the effects of a transaction by its hash. Returns null if the tx is not found or is beyond the anchor
655
679
  * block.
656
680
  */
657
- public async getTxEffect(txHash: TxHash): Promise<Option<TxEffect>> {
681
+ public async getTxEffect(txHash: TxHash): Promise<Option<TxEffectData>> {
658
682
  if (txHash.hash.isZero()) {
659
683
  throw new Error('Invalid tx hash passed into aztec_utl_getTxEffect oracle handler');
660
684
  }
661
685
 
662
- const receipt = await this.aztecNode.getTxReceipt(txHash, { includeTxEffect: true });
686
+ const receipt = await this.aztecNodeReadCache.getTxReceiptWithEffect(txHash);
663
687
  if (!receipt.isMined() || !receipt.txEffect || receipt.blockNumber > this.anchorBlockHeader.getBlockNumber()) {
664
- return Option.none(TxEffect.empty());
688
+ return Option.none();
665
689
  }
666
690
 
667
- return Option.some(receipt.txEffect);
691
+ const txEffect = receipt.txEffect;
692
+ return Option.some({
693
+ ...txEffect,
694
+ publicLogs: FlatPublicLogs.fromLogs(txEffect.publicLogs),
695
+ contractClassLogs: txEffect.contractClassLogs.map(log => ({
696
+ contractAddress: log.contractAddress,
697
+ fields: log.fields.toFields(),
698
+ emittedLength: log.emittedLength,
699
+ })),
700
+ });
668
701
  }
669
702
 
670
703
  public setCapsule(contractAddress: AztecAddress, slot: Fr, capsule: Fr[], scope: AztecAddress): void {
671
- if (!contractAddress.equals(this.contractAddress)) {
672
- // TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
673
- throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
674
- }
704
+ this.#assertOwnContract(contractAddress);
675
705
  this.capsuleService.setCapsule(contractAddress, slot, capsule, this.jobId, scope);
676
706
  }
677
707
 
@@ -681,19 +711,13 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
681
711
  tSize: number,
682
712
  scope: AztecAddress,
683
713
  ): Promise<Option<Fr[]>> {
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
- }
714
+ this.#assertOwnContract(contractAddress);
688
715
  const values = await this.capsuleService.getCapsule(contractAddress, slot, this.jobId, scope, this.capsules);
689
- return values ? Option.some(values) : Option.none(new Array(tSize).fill(Fr.ZERO));
716
+ return values ? Option.some(values) : Option.none({ length: tSize });
690
717
  }
691
718
 
692
719
  public deleteCapsule(contractAddress: AztecAddress, slot: Fr, scope: AztecAddress): void {
693
- if (!contractAddress.equals(this.contractAddress)) {
694
- // TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
695
- throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
696
- }
720
+ this.#assertOwnContract(contractAddress);
697
721
  this.capsuleService.deleteCapsule(contractAddress, slot, this.jobId, scope);
698
722
  }
699
723
 
@@ -704,11 +728,114 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
704
728
  numEntries: number,
705
729
  scope: AztecAddress,
706
730
  ): Promise<void> {
731
+ this.#assertOwnContract(contractAddress);
732
+ return this.capsuleService.copyCapsule(contractAddress, srcSlot, dstSlot, numEntries, this.jobId, scope);
733
+ }
734
+
735
+ /**
736
+ * Asserts the executing contract may only access its own slice of PXE DB.
737
+ */
738
+ #assertOwnContract(contractAddress: AztecAddress): void {
707
739
  if (!contractAddress.equals(this.contractAddress)) {
708
- // TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
709
740
  throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
710
741
  }
711
- return this.capsuleService.copyCapsule(contractAddress, srcSlot, dstSlot, numEntries, this.jobId, scope);
742
+ }
743
+
744
+ /**
745
+ * Records a fact into a collection. A `Some` origin block makes the fact retractable (pruned on reorg of that
746
+ * block), a `None` origin block makes it non-retractable, surviving reorgs.
747
+ */
748
+ public recordFact(
749
+ contractAddress: AztecAddress,
750
+ scope: AztecAddress,
751
+ factCollectionTypeId: Fr,
752
+ factCollectionId: Fr,
753
+ factTypeId: Fr,
754
+ payload: EphemeralArray<Fr>,
755
+ originBlock: Option<OriginBlock>,
756
+ ): Promise<void> {
757
+ this.#assertOwnContract(contractAddress);
758
+ return this.factService.recordFact(
759
+ new FactCollectionKey(contractAddress, scope, factCollectionTypeId, factCollectionId),
760
+ factTypeId,
761
+ payload.readAll(this.ephemeralArrayService),
762
+ originBlock.isSome() ? originBlock.value : undefined,
763
+ this.jobId,
764
+ );
765
+ }
766
+
767
+ /**
768
+ * Deletes a fact collection, removing all its facts. A no-op if no such collection exists.
769
+ */
770
+ public deleteFactCollection(
771
+ contractAddress: AztecAddress,
772
+ scope: AztecAddress,
773
+ factCollectionTypeId: Fr,
774
+ factCollectionId: Fr,
775
+ ): Promise<void> {
776
+ this.#assertOwnContract(contractAddress);
777
+ return this.factService.deleteFactCollection(
778
+ new FactCollectionKey(contractAddress, scope, factCollectionTypeId, factCollectionId),
779
+ this.jobId,
780
+ );
781
+ }
782
+
783
+ /**
784
+ * Returns a fact collection.
785
+ */
786
+ public async getFactCollection(
787
+ contractAddress: AztecAddress,
788
+ scope: AztecAddress,
789
+ factCollectionTypeId: Fr,
790
+ factCollectionId: Fr,
791
+ ): Promise<Option<FactCollection>> {
792
+ this.#assertOwnContract(contractAddress);
793
+ const tips = anchoredTipBlockNumbers(await this.l2TipsStore.getL2Tips(), this.anchorBlockHeader.getBlockNumber());
794
+ const collection = await this.factService.getFactCollection(
795
+ new FactCollectionKey(contractAddress, scope, factCollectionTypeId, factCollectionId),
796
+ tips,
797
+ this.jobId,
798
+ );
799
+ return collection
800
+ ? Option.some(
801
+ toNoirFactCollection(
802
+ this.ephemeralArrayService,
803
+ contractAddress,
804
+ scope,
805
+ factCollectionTypeId,
806
+ factCollectionId,
807
+ collection.facts,
808
+ ),
809
+ )
810
+ : Option.none(emptyFactCollection(this.ephemeralArrayService));
811
+ }
812
+
813
+ /** Returns every fact collection of `factCollectionTypeId`. */
814
+ public async getFactCollectionsByType(
815
+ contractAddress: AztecAddress,
816
+ scope: AztecAddress,
817
+ factCollectionTypeId: Fr,
818
+ ): Promise<EphemeralArray<FactCollection>> {
819
+ this.#assertOwnContract(contractAddress);
820
+ const tips = anchoredTipBlockNumbers(await this.l2TipsStore.getL2Tips(), this.anchorBlockHeader.getBlockNumber());
821
+ const collections = await this.factService.getFactCollectionsByType(
822
+ new FactCollectionTypeKey(contractAddress, scope, factCollectionTypeId),
823
+ tips,
824
+ this.jobId,
825
+ );
826
+ return EphemeralArray.fromValues(
827
+ this.ephemeralArrayService,
828
+ collections.map(collection =>
829
+ toNoirFactCollection(
830
+ this.ephemeralArrayService,
831
+ collection.key.contractAddress,
832
+ collection.key.scope,
833
+ collection.key.factCollectionTypeId,
834
+ collection.key.factCollectionId,
835
+ collection.facts,
836
+ ),
837
+ ),
838
+ );
712
839
  }
713
840
 
714
841
  /**
@@ -734,7 +861,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
734
861
  const plaintext = await aes128.decryptBufferCBC(Buffer.from(ciphertext.data), iv, symKey);
735
862
  return Option.some(BoundedVec.from<number>({ data: [...plaintext], maxLength: capacity }));
736
863
  } catch {
737
- return Option.none(BoundedVec.empty<number>({ maxLength: capacity }));
864
+ return Option.none({ maxLength: capacity });
738
865
  }
739
866
  }
740
867
 
@@ -743,11 +870,12 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
743
870
  * @param address - The recipient address.
744
871
  * @param ephPks - Ephemeral array containing the serialized Points.
745
872
  * @param contractAddress - The contract address for app-siloing (validated against execution context).
746
- * @returns A new ephemeral array containing the computed shared secrets.
873
+ * @returns A new ephemeral array containing the computed shared secrets, or an empty array when the PXE does not
874
+ * hold the keys for `address`, signaling that no secrets can be derived for it.
747
875
  */
748
876
  public async getSharedSecrets(
749
877
  address: AztecAddress,
750
- ephPks: EphemeralArray<Point>,
878
+ ephPks: EphemeralArray<EmbeddedCurvePoint>,
751
879
  contractAddress: AztecAddress,
752
880
  ): Promise<EphemeralArray<Fr>> {
753
881
  if (!contractAddress.equals(this.contractAddress)) {
@@ -755,14 +883,24 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
755
883
  `getSharedSecrets called with contract address ${contractAddress}, expected ${this.contractAddress}`,
756
884
  );
757
885
  }
758
- const recipientCompleteAddress = await this.getCompleteAddressOrFail(address);
886
+ const recipientCompleteAddress = await this.addressStore.getCompleteAddress(address);
887
+ if (!recipientCompleteAddress) {
888
+ this.logger.warn(
889
+ `Computing shared secrets for address ${address} whose keys are not held - returning no secrets`,
890
+ {
891
+ address,
892
+ contractAddress: this.contractAddress,
893
+ },
894
+ );
895
+ return EphemeralArray.fromValues<Fr>(this.ephemeralArrayService, []);
896
+ }
759
897
  const ivpkMHash = await hashPublicKey(recipientCompleteAddress.publicKeys.ivpkM);
760
898
  const ivskM = await this.keyStore.getMasterSecretKey(ivpkMHash);
761
899
  const addressSecret = await computeAddressSecret(await recipientCompleteAddress.getPreaddress(), ivskM);
762
900
 
763
901
  const ephPkPoints = ephPks.readAll(this.ephemeralArrayService);
764
902
  const secrets = await Promise.all(
765
- ephPkPoints.map(ephPk => deriveAppSiloedSharedSecret(addressSecret, ephPk, this.contractAddress)),
903
+ ephPkPoints.map(({ x, y }) => appSiloEcdhSharedSecret(addressSecret, new Point(x, y), this.contractAddress)),
766
904
  );
767
905
 
768
906
  return EphemeralArray.fromValues(this.ephemeralArrayService, secrets);
@@ -796,6 +934,34 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
796
934
  this.ephemeralArrayService.clear(slot);
797
935
  }
798
936
 
937
+ public pushTransient(slot: Fr, elements: Fr[]): number {
938
+ return this.transientArrayService.push(this.contractAddress, slot, elements);
939
+ }
940
+
941
+ public popTransient(slot: Fr): Fr[] {
942
+ return this.transientArrayService.pop(this.contractAddress, slot);
943
+ }
944
+
945
+ public getTransient(slot: Fr, index: number): Fr[] {
946
+ return this.transientArrayService.get(this.contractAddress, slot, index);
947
+ }
948
+
949
+ public setTransient(slot: Fr, index: number, elements: Fr[]): void {
950
+ this.transientArrayService.set(this.contractAddress, slot, index, elements);
951
+ }
952
+
953
+ public getTransientLen(slot: Fr): number {
954
+ return this.transientArrayService.len(this.contractAddress, slot);
955
+ }
956
+
957
+ public removeTransient(slot: Fr, index: number): void {
958
+ this.transientArrayService.remove(this.contractAddress, slot, index);
959
+ }
960
+
961
+ public clearTransient(slot: Fr): void {
962
+ this.transientArrayService.clear(this.contractAddress, slot);
963
+ }
964
+
799
965
  public emitOffchainEffect(data: Fr[]): Promise<void> {
800
966
  this.offchainEffects.push({ data, contractAddress: this.contractAddress });
801
967
  return Promise.resolve();
@@ -807,38 +973,53 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
807
973
  functionSelector: FunctionSelector,
808
974
  args: Fr[],
809
975
  ): Promise<Fr[]> {
810
- const targetArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(
976
+ const targetArtifact = await this.anchoredContractData.getFunctionArtifactWithDebugMetadata(
811
977
  targetContractAddress,
812
978
  functionSelector,
813
979
  );
980
+ if (!targetArtifact) {
981
+ throw new Error(
982
+ `Cannot call ${targetContractAddress}:${functionSelector}: the contract is not registered. ` +
983
+ `Register it via wallet.registerContract(...).`,
984
+ );
985
+ }
814
986
 
815
987
  if (!targetContractAddress.equals(this.contractAddress)) {
816
- const [callerInstance, targetInstance] = await Promise.all([
817
- this.getContractInstance(this.contractAddress),
818
- this.getContractInstance(targetContractAddress),
819
- ]);
820
- const request: UtilityCallAuthorizationRequest = {
821
- caller: this.contractAddress,
822
- callerClassId: callerInstance.currentContractClassId,
823
- target: targetContractAddress,
824
- targetClassId: targetInstance.currentContractClassId,
825
- functionSelector,
826
- functionName: targetArtifact.name,
827
- args,
828
- callerContext: this.callerContext,
829
- };
830
-
831
- const response = this.hooks
832
- ? await this.hooks.authorizeUtilityCall(request)
833
- : { authorized: false, reason: 'No execution hooks configured' };
834
-
835
- if (!response.authorized) {
836
- const reason = response.reason ? `: ${response.reason}` : '';
837
- throw new Error(
838
- `Cross-contract utility call denied${reason}. ${this.contractAddress} attempted to call ` +
839
- `${targetContractAddress}:${functionSelector} (${targetArtifact.name}). ` +
840
- `See https://docs.aztec.network/errors/11`,
841
- );
988
+ // Standard handshake registry reads are authorized by default; every other cross-contract call needs the hook.
989
+ if (!(await isStandardHandshakeRegistryUtilityRead(targetContractAddress, functionSelector))) {
990
+ const [callerClassId, targetClassId] = await Promise.all([
991
+ this.anchoredContractData.getCurrentClassId(this.contractAddress),
992
+ this.anchoredContractData.getCurrentClassId(targetContractAddress),
993
+ ]);
994
+ if (!callerClassId || !targetClassId) {
995
+ throw new Error(
996
+ `Cannot authorize utility call from ${this.contractAddress} to ${targetContractAddress}: ` +
997
+ `${!callerClassId ? this.contractAddress : targetContractAddress} is not registered.`,
998
+ );
999
+ }
1000
+ const request: UtilityCallAuthorizationRequest = {
1001
+ caller: this.contractAddress,
1002
+ callerClassId,
1003
+ target: targetContractAddress,
1004
+ targetClassId,
1005
+ functionSelector,
1006
+ functionName: targetArtifact.name,
1007
+ args,
1008
+ callerContext: this.callerContext,
1009
+ };
1010
+
1011
+ const response = this.hooks?.authorizeUtilityCall
1012
+ ? await this.hooks.authorizeUtilityCall(request)
1013
+ : { authorized: false, reason: 'No authorizeUtilityCall hook configured' };
1014
+
1015
+ if (!response.authorized) {
1016
+ const reason = response.reason ? `: ${response.reason}` : '';
1017
+ throw new Error(
1018
+ `Cross-contract utility call denied${reason}. ${this.contractAddress} attempted to call ` +
1019
+ `${targetContractAddress}:${functionSelector} (${targetArtifact.name}). ` +
1020
+ `See https://docs.aztec.network/errors/11`,
1021
+ );
1022
+ }
842
1023
  }
843
1024
 
844
1025
  await this.contractSyncService.ensureContractSynced(
@@ -856,20 +1037,26 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
856
1037
  );
857
1038
 
858
1039
  const nestedOracle = new UtilityExecutionOracle({
859
- contractAddress: targetContractAddress,
1040
+ callContext: CallContext.from({
1041
+ msgSender: this.contractAddress,
1042
+ contractAddress: targetContractAddress,
1043
+ functionSelector,
1044
+ isStaticCall: true,
1045
+ }),
860
1046
  authWitnesses: this.authWitnesses,
861
1047
  capsules: this.capsules,
862
1048
  anchorBlockHeader: this.anchorBlockHeader,
863
- contractStore: this.contractStore,
1049
+ anchoredContractData: this.anchoredContractData,
864
1050
  noteStore: this.noteStore,
865
1051
  keyStore: this.keyStore,
866
1052
  addressStore: this.addressStore,
867
1053
  aztecNode: this.aztecNode,
868
1054
  recipientTaggingStore: this.recipientTaggingStore,
869
- senderAddressBookStore: this.senderAddressBookStore,
1055
+ taggingSecretSourcesStore: this.taggingSecretSourcesStore,
870
1056
  capsuleService: this.capsuleService,
1057
+ factService: this.factService,
871
1058
  privateEventStore: this.privateEventStore,
872
- messageContextService: this.messageContextService,
1059
+ txResolver: this.txResolver,
873
1060
  contractSyncService: this.contractSyncService,
874
1061
  l2TipsStore: this.l2TipsStore,
875
1062
  jobId: this.jobId,
@@ -878,12 +1065,13 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
878
1065
  hooks: this.hooks,
879
1066
  utilityExecutor: this.utilityExecutor,
880
1067
  log: this.logger,
1068
+ // Shared across the whole execution tree: nested utility frames inherit the caller's transient-array store.
1069
+ transientArrayService: this.transientArrayService,
881
1070
  });
882
1071
 
883
1072
  const initialWitness = toACVMWitness(0, args);
884
- const acvmCallback = new Oracle(nestedOracle);
885
1073
  const acirExecutionResult = await this.simulator
886
- .executeUserCircuit(initialWitness, targetArtifact, acvmCallback.toACIRCallback())
1074
+ .executeUserCircuit(initialWitness, targetArtifact, buildACIRCallback(nestedOracle))
887
1075
  .catch((err: Error) => {
888
1076
  err.message = resolveAssertionMessageFromError(err, targetArtifact);
889
1077
  throw new ExecutionError(
@@ -908,9 +1096,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
908
1096
  */
909
1097
  async #fetchTxEffects(txHashes: TxHash[]): Promise<Map<string, IndexedTxEffect>> {
910
1098
  const uniqueTxHashes = uniqueBy(txHashes, h => h.toString());
911
- const fetched = await Promise.all(
912
- uniqueTxHashes.map(h => this.aztecNode.getTxReceipt(h, { includeTxEffect: true })),
913
- );
1099
+ const fetched = await Promise.all(uniqueTxHashes.map(h => this.aztecNodeReadCache.getTxReceiptWithEffect(h)));
914
1100
  return new Map(
915
1101
  uniqueTxHashes
916
1102
  .map((h, i): [string, IndexedTxEffect | undefined] => {
@@ -944,7 +1130,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
944
1130
  const [response] = await Promise.all([
945
1131
  query(),
946
1132
  (async () => {
947
- const block = await this.aztecNode.getBlock(blockHash);
1133
+ const block = await this.aztecNodeReadCache.getBlock(blockHash);
948
1134
  const header = block?.header;
949
1135
  if (!header) {
950
1136
  throw new Error(`Could not find block header for block hash ${blockHash}`);
@@ -964,4 +1150,44 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
964
1150
  protected get callerContext(): 'private' | 'private view' | 'utility' {
965
1151
  return 'utility';
966
1152
  }
1153
+
1154
+ /** The address of the contract whose function is being executed, from the call context. */
1155
+ protected get contractAddress(): AztecAddress {
1156
+ return this.callContext.contractAddress;
1157
+ }
1158
+ }
1159
+
1160
+ // Registry reads that any contract may issue without an `authorizeUtilityCall` hook. The constrained-delivery
1161
+ // library calls these implicitly for the app, and they are safe to default-authorize: `get_app_siloed_secrets`
1162
+ // siloes every returned secret to `msg_sender`, and `get_non_interactive_handshakes` only exposes ephemeral public
1163
+ // keys, from which the shared secret cannot be derived without the recipient's secret keys.
1164
+ const STANDARD_HANDSHAKE_REGISTRY_DEFAULT_AUTHORIZED_READ_SIGNATURES = [
1165
+ 'get_non_interactive_handshakes((Field),u32)',
1166
+ 'get_app_siloed_secrets((Field),(Field))',
1167
+ ];
1168
+
1169
+ async function doesSelectorHaveSignature(functionSelector: FunctionSelector, signature: string): Promise<boolean> {
1170
+ return functionSelector.equals(await FunctionSelector.fromSignature(signature));
1171
+ }
1172
+
1173
+ /**
1174
+ * Whether a cross-contract utility call targets one of the standard handshake registry's read functions.
1175
+ *
1176
+ * These reads are authorized by PXE for every wallet, without consulting the `authorizeUtilityCall` hook, so that
1177
+ * wallets don't need to know the handshake registry exists in order to deliver and discover messages through it.
1178
+ */
1179
+ async function isStandardHandshakeRegistryUtilityRead(
1180
+ targetContractAddress: AztecAddress,
1181
+ functionSelector: FunctionSelector,
1182
+ ): Promise<boolean> {
1183
+ if (!targetContractAddress.equals(STANDARD_HANDSHAKE_REGISTRY_ADDRESS)) {
1184
+ return false;
1185
+ }
1186
+
1187
+ const matches = await Promise.all(
1188
+ STANDARD_HANDSHAKE_REGISTRY_DEFAULT_AUTHORIZED_READ_SIGNATURES.map(signature =>
1189
+ doesSelectorHaveSignature(functionSelector, signature),
1190
+ ),
1191
+ );
1192
+ return matches.some(Boolean);
967
1193
  }