@aztec/pxe 5.0.0-rc.1 → 5.0.0

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 (297) hide show
  1. package/dest/block_synchronizer/block_stream_source.d.ts +5 -5
  2. package/dest/block_synchronizer/block_stream_source.d.ts.map +1 -1
  3. package/dest/block_synchronizer/block_stream_source.js +4 -29
  4. package/dest/block_synchronizer/block_synchronizer.d.ts +16 -12
  5. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
  6. package/dest/block_synchronizer/block_synchronizer.js +49 -15
  7. package/dest/config/index.d.ts +2 -1
  8. package/dest/config/index.d.ts.map +1 -1
  9. package/dest/config/index.js +1 -0
  10. package/dest/contract/contract_class_service.d.ts +31 -0
  11. package/dest/contract/contract_class_service.d.ts.map +1 -0
  12. package/dest/contract/contract_class_service.js +68 -0
  13. package/dest/{contract_sync → contract}/contract_sync_service.d.ts +7 -6
  14. package/dest/contract/contract_sync_service.d.ts.map +1 -0
  15. package/dest/{contract_sync → contract}/contract_sync_service.js +10 -30
  16. package/dest/contract/helpers.d.ts +7 -0
  17. package/dest/contract/helpers.d.ts.map +1 -0
  18. package/dest/contract/helpers.js +20 -0
  19. package/dest/contract_function_simulator/anchored_contract_data.d.ts +36 -0
  20. package/dest/contract_function_simulator/anchored_contract_data.d.ts.map +1 -0
  21. package/dest/contract_function_simulator/anchored_contract_data.js +54 -0
  22. package/dest/contract_function_simulator/aztec_node_read_cache.d.ts +39 -0
  23. package/dest/contract_function_simulator/aztec_node_read_cache.d.ts.map +1 -0
  24. package/dest/contract_function_simulator/aztec_node_read_cache.js +60 -0
  25. package/dest/contract_function_simulator/contract_function_simulator.d.ts +19 -18
  26. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  27. package/dest/contract_function_simulator/contract_function_simulator.js +52 -31
  28. package/dest/contract_function_simulator/execution_note_cache.d.ts +3 -9
  29. package/dest/contract_function_simulator/execution_note_cache.d.ts.map +1 -1
  30. package/dest/contract_function_simulator/execution_note_cache.js +8 -28
  31. package/dest/contract_function_simulator/index.d.ts +17 -9
  32. package/dest/contract_function_simulator/index.d.ts.map +1 -1
  33. package/dest/contract_function_simulator/index.js +4 -7
  34. package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts +8 -27
  35. package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts.map +1 -1
  36. package/dest/contract_function_simulator/noir-structs/bounded_vec.js +8 -23
  37. package/dest/contract_function_simulator/noir-structs/contract_class_log_data.d.ts +9 -0
  38. package/dest/contract_function_simulator/noir-structs/contract_class_log_data.d.ts.map +1 -0
  39. package/dest/contract_function_simulator/noir-structs/contract_class_log_data.js +1 -0
  40. package/dest/contract_function_simulator/noir-structs/embedded_curve_point.d.ts +7 -0
  41. package/dest/contract_function_simulator/noir-structs/embedded_curve_point.d.ts.map +1 -0
  42. package/dest/contract_function_simulator/noir-structs/embedded_curve_point.js +1 -0
  43. package/dest/contract_function_simulator/noir-structs/event_validation_request.js +1 -1
  44. package/dest/contract_function_simulator/noir-structs/fact.d.ts +16 -0
  45. package/dest/contract_function_simulator/noir-structs/fact.d.ts.map +1 -0
  46. package/dest/contract_function_simulator/noir-structs/fact.js +6 -0
  47. package/dest/contract_function_simulator/noir-structs/fact_collection.d.ts +27 -0
  48. package/dest/contract_function_simulator/noir-structs/fact_collection.d.ts.map +1 -0
  49. package/dest/contract_function_simulator/noir-structs/fact_collection.js +31 -0
  50. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts +11 -12
  51. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts.map +1 -1
  52. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.js +6 -49
  53. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts +10 -8
  54. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts.map +1 -1
  55. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.js +1 -60
  56. package/dest/contract_function_simulator/noir-structs/note_validation_request.js +2 -2
  57. package/dest/contract_function_simulator/noir-structs/option.d.ts +9 -11
  58. package/dest/contract_function_simulator/noir-structs/option.d.ts.map +1 -1
  59. package/dest/contract_function_simulator/noir-structs/option.js +18 -13
  60. package/dest/contract_function_simulator/noir-structs/origin_block.d.ts +11 -0
  61. package/dest/contract_function_simulator/noir-structs/origin_block.d.ts.map +1 -0
  62. package/dest/contract_function_simulator/noir-structs/origin_block.js +5 -0
  63. package/dest/contract_function_simulator/noir-structs/pending_tagged_log.d.ts +11 -0
  64. package/dest/contract_function_simulator/noir-structs/pending_tagged_log.d.ts.map +1 -0
  65. package/dest/contract_function_simulator/noir-structs/pending_tagged_log.js +4 -0
  66. package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts +6 -9
  67. package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts.map +1 -1
  68. package/dest/contract_function_simulator/noir-structs/provided_secret.js +1 -14
  69. package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.d.ts +28 -0
  70. package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.d.ts.map +1 -0
  71. package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.js +50 -0
  72. package/dest/contract_function_simulator/noir-structs/resolved_tx.d.ts +21 -0
  73. package/dest/contract_function_simulator/noir-structs/resolved_tx.d.ts.map +1 -0
  74. package/dest/contract_function_simulator/noir-structs/resolved_tx.js +50 -0
  75. package/dest/contract_function_simulator/noir-structs/tx_effect_data.d.ts +14 -0
  76. package/dest/contract_function_simulator/noir-structs/tx_effect_data.d.ts.map +1 -0
  77. package/dest/contract_function_simulator/noir-structs/tx_effect_data.js +5 -0
  78. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts +6 -11
  79. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts.map +1 -1
  80. package/dest/contract_function_simulator/noir-structs/utility_context.js +1 -20
  81. package/dest/contract_function_simulator/oracle/acir_callback.d.ts +7 -2
  82. package/dest/contract_function_simulator/oracle/acir_callback.d.ts.map +1 -1
  83. package/dest/contract_function_simulator/oracle/acir_callback.js +55 -11
  84. package/dest/contract_function_simulator/oracle/legacy_oracle_registry.d.ts +39 -0
  85. package/dest/contract_function_simulator/oracle/legacy_oracle_registry.d.ts.map +1 -0
  86. package/dest/contract_function_simulator/oracle/legacy_oracle_registry.js +107 -0
  87. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts +3 -14
  88. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts.map +1 -1
  89. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.js +1 -24
  90. package/dest/contract_function_simulator/oracle/oracle_registry.d.ts +86 -8
  91. package/dest/contract_function_simulator/oracle/oracle_registry.d.ts.map +1 -1
  92. package/dest/contract_function_simulator/oracle/oracle_registry.js +168 -18
  93. package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts +123 -40
  94. package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts.map +1 -1
  95. package/dest/contract_function_simulator/oracle/oracle_type_mappings.js +947 -264
  96. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +21 -8
  97. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  98. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +126 -16
  99. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +63 -33
  100. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  101. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +175 -90
  102. package/dest/debug/pxe_debug_utils.d.ts +2 -2
  103. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  104. package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
  105. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  106. package/dest/entrypoints/client/bundle/utils.js +3 -2
  107. package/dest/entrypoints/client/lazy/utils.d.ts +1 -1
  108. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  109. package/dest/entrypoints/client/lazy/utils.js +3 -2
  110. package/dest/entrypoints/pxe_creation_options.d.ts +8 -2
  111. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  112. package/dest/entrypoints/server/index.d.ts +5 -3
  113. package/dest/entrypoints/server/index.d.ts.map +1 -1
  114. package/dest/entrypoints/server/index.js +3 -2
  115. package/dest/entrypoints/server/utils.d.ts +1 -1
  116. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  117. package/dest/entrypoints/server/utils.js +3 -1
  118. package/dest/error_enriching.d.ts +5 -3
  119. package/dest/error_enriching.d.ts.map +1 -1
  120. package/dest/error_enriching.js +13 -11
  121. package/dest/hooks/execution_hooks.d.ts +27 -7
  122. package/dest/hooks/execution_hooks.d.ts.map +1 -1
  123. package/dest/hooks/execution_hooks.js +3 -3
  124. package/dest/hooks/index.d.ts +4 -3
  125. package/dest/hooks/index.d.ts.map +1 -1
  126. package/dest/hooks/index.js +1 -0
  127. package/dest/hooks/resolve_custom_request.d.ts +23 -0
  128. package/dest/hooks/resolve_custom_request.d.ts.map +1 -0
  129. package/dest/hooks/resolve_custom_request.js +3 -0
  130. package/dest/hooks/resolve_tagging_secret_strategy.d.ts +50 -0
  131. package/dest/hooks/resolve_tagging_secret_strategy.d.ts.map +1 -0
  132. package/dest/hooks/resolve_tagging_secret_strategy.js +3 -0
  133. package/dest/logs/log_service.d.ts +7 -6
  134. package/dest/logs/log_service.d.ts.map +1 -1
  135. package/dest/logs/log_service.js +79 -28
  136. package/dest/messages/tx_resolver_service.d.ts +17 -0
  137. package/dest/messages/tx_resolver_service.d.ts.map +1 -0
  138. package/dest/messages/{message_context_service.js → tx_resolver_service.js} +8 -8
  139. package/dest/oracle_version.d.ts +3 -3
  140. package/dest/oracle_version.js +3 -3
  141. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +1 -1
  142. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -1
  143. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.js +6 -2
  144. package/dest/private_kernel/hints/test_utils.js +1 -1
  145. package/dest/private_kernel/private_kernel_execution_prover.d.ts +1 -1
  146. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  147. package/dest/private_kernel/private_kernel_execution_prover.js +17 -36
  148. package/dest/private_kernel/private_kernel_oracle.d.ts +4 -2
  149. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  150. package/dest/private_kernel/private_kernel_oracle.js +17 -5
  151. package/dest/pxe.d.ts +109 -47
  152. package/dest/pxe.d.ts.map +1 -1
  153. package/dest/pxe.js +222 -139
  154. package/dest/storage/allowed_scopes.d.ts +6 -0
  155. package/dest/storage/allowed_scopes.d.ts.map +1 -0
  156. package/dest/storage/allowed_scopes.js +7 -0
  157. package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts +1 -1
  158. package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts.map +1 -1
  159. package/dest/storage/backwards_compatibility_tests/schema_tests.js +114 -37
  160. package/dest/storage/capsule_store/capsule_service.d.ts +1 -1
  161. package/dest/storage/capsule_store/capsule_service.d.ts.map +1 -1
  162. package/dest/storage/capsule_store/capsule_service.js +6 -9
  163. package/dest/storage/contract_store/contract_store.d.ts +27 -24
  164. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  165. package/dest/storage/contract_store/contract_store.js +64 -75
  166. package/dest/storage/fact_store/fact_service.d.ts +22 -0
  167. package/dest/storage/fact_store/fact_service.d.ts.map +1 -0
  168. package/dest/storage/fact_store/fact_service.js +45 -0
  169. package/dest/storage/fact_store/fact_store.d.ts +95 -0
  170. package/dest/storage/fact_store/fact_store.d.ts.map +1 -0
  171. package/dest/storage/fact_store/fact_store.js +408 -0
  172. package/dest/storage/fact_store/fact_store_keys.d.ts +34 -0
  173. package/dest/storage/fact_store/fact_store_keys.d.ts.map +1 -0
  174. package/dest/storage/fact_store/fact_store_keys.js +50 -0
  175. package/dest/storage/fact_store/index.d.ts +6 -0
  176. package/dest/storage/fact_store/index.d.ts.map +1 -0
  177. package/dest/storage/fact_store/index.js +4 -0
  178. package/dest/storage/fact_store/origin_state.d.ts +57 -0
  179. package/dest/storage/fact_store/origin_state.d.ts.map +1 -0
  180. package/dest/storage/fact_store/origin_state.js +53 -0
  181. package/dest/storage/fact_store/stored_fact.d.ts +32 -0
  182. package/dest/storage/fact_store/stored_fact.d.ts.map +1 -0
  183. package/dest/storage/fact_store/stored_fact.js +64 -0
  184. package/dest/storage/index.d.ts +2 -1
  185. package/dest/storage/index.d.ts.map +1 -1
  186. package/dest/storage/index.js +1 -0
  187. package/dest/storage/metadata.d.ts +2 -2
  188. package/dest/storage/metadata.d.ts.map +1 -1
  189. package/dest/storage/metadata.js +1 -1
  190. package/dest/storage/open_pxe_stores.d.ts +5 -3
  191. package/dest/storage/open_pxe_stores.d.ts.map +1 -1
  192. package/dest/storage/open_pxe_stores.js +5 -3
  193. package/dest/storage/tagging_store/index.d.ts +2 -2
  194. package/dest/storage/tagging_store/index.d.ts.map +1 -1
  195. package/dest/storage/tagging_store/index.js +1 -1
  196. package/dest/storage/tagging_store/tagging_secret_sources_store.d.ts +51 -0
  197. package/dest/storage/tagging_store/tagging_secret_sources_store.d.ts.map +1 -0
  198. package/dest/storage/tagging_store/tagging_secret_sources_store.js +105 -0
  199. package/dest/tagging/constants.d.ts +2 -2
  200. package/dest/tagging/constants.d.ts.map +1 -1
  201. package/dest/tagging/constants.js +18 -9
  202. package/package.json +17 -17
  203. package/src/block_synchronizer/block_stream_source.ts +6 -45
  204. package/src/block_synchronizer/block_synchronizer.ts +65 -24
  205. package/src/config/index.ts +1 -0
  206. package/src/contract/contract_class_service.ts +83 -0
  207. package/src/{contract_sync → contract}/contract_sync_service.ts +18 -37
  208. package/src/contract/helpers.ts +35 -0
  209. package/src/contract_function_simulator/anchored_contract_data.ts +74 -0
  210. package/src/contract_function_simulator/aztec_node_read_cache.ts +89 -0
  211. package/src/contract_function_simulator/contract_function_simulator.ts +86 -43
  212. package/src/contract_function_simulator/execution_note_cache.ts +7 -28
  213. package/src/contract_function_simulator/index.ts +24 -9
  214. package/src/contract_function_simulator/noir-structs/bounded_vec.ts +12 -24
  215. package/src/contract_function_simulator/noir-structs/contract_class_log_data.ts +9 -0
  216. package/src/contract_function_simulator/noir-structs/embedded_curve_point.ts +4 -0
  217. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +1 -1
  218. package/src/contract_function_simulator/noir-structs/fact.ts +13 -0
  219. package/src/contract_function_simulator/noir-structs/fact_collection.ts +64 -0
  220. package/src/contract_function_simulator/noir-structs/log_retrieval_request.ts +20 -46
  221. package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +13 -60
  222. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +2 -2
  223. package/src/contract_function_simulator/noir-structs/option.ts +17 -11
  224. package/src/contract_function_simulator/noir-structs/origin_block.ts +8 -0
  225. package/src/contract_function_simulator/noir-structs/pending_tagged_log.ts +12 -0
  226. package/src/contract_function_simulator/noir-structs/provided_secret.ts +4 -15
  227. package/src/contract_function_simulator/noir-structs/resolved_tagging_strategy.ts +66 -0
  228. package/src/contract_function_simulator/noir-structs/resolved_tx.ts +53 -0
  229. package/src/contract_function_simulator/noir-structs/tx_effect_data.ts +15 -0
  230. package/src/contract_function_simulator/noir-structs/utility_context.ts +5 -17
  231. package/src/contract_function_simulator/oracle/acir_callback.ts +58 -12
  232. package/src/contract_function_simulator/oracle/legacy_oracle_registry.ts +147 -0
  233. package/src/contract_function_simulator/oracle/message_load_oracle_inputs.ts +6 -21
  234. package/src/contract_function_simulator/oracle/oracle_registry.ts +119 -86
  235. package/src/contract_function_simulator/oracle/oracle_type_mappings.ts +659 -248
  236. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +155 -24
  237. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +300 -115
  238. package/src/debug/pxe_debug_utils.ts +1 -1
  239. package/src/entrypoints/client/bundle/utils.ts +3 -2
  240. package/src/entrypoints/client/lazy/utils.ts +3 -2
  241. package/src/entrypoints/pxe_creation_options.ts +7 -1
  242. package/src/entrypoints/server/index.ts +5 -2
  243. package/src/entrypoints/server/utils.ts +3 -1
  244. package/src/error_enriching.ts +27 -11
  245. package/src/hooks/execution_hooks.ts +28 -8
  246. package/src/hooks/index.ts +8 -2
  247. package/src/hooks/resolve_custom_request.ts +24 -0
  248. package/src/hooks/resolve_tagging_secret_strategy.ts +60 -0
  249. package/src/logs/log_service.ts +91 -37
  250. package/src/messages/{message_context_service.ts → tx_resolver_service.ts} +16 -9
  251. package/src/oracle_version.ts +3 -3
  252. package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +11 -1
  253. package/src/private_kernel/hints/test_utils.ts +1 -1
  254. package/src/private_kernel/private_kernel_execution_prover.ts +22 -52
  255. package/src/private_kernel/private_kernel_oracle.ts +23 -4
  256. package/src/pxe.ts +320 -158
  257. package/src/storage/allowed_scopes.ts +14 -0
  258. package/src/storage/backwards_compatibility_tests/__snapshots__/AddressStore.json +6 -6
  259. package/src/storage/backwards_compatibility_tests/__snapshots__/ContractStore.json +1 -1
  260. package/src/storage/backwards_compatibility_tests/__snapshots__/FactStore.json +40 -0
  261. package/src/storage/backwards_compatibility_tests/__snapshots__/KeyStore.json +12 -12
  262. package/src/storage/backwards_compatibility_tests/__snapshots__/L2TipsKVStore.json +1 -1
  263. package/src/storage/backwards_compatibility_tests/__snapshots__/RecipientTaggingStore.json +11 -3
  264. package/src/storage/backwards_compatibility_tests/__snapshots__/SenderTaggingStore.json +12 -4
  265. package/src/storage/backwards_compatibility_tests/__snapshots__/TaggingSecretSourcesStore.json +30 -0
  266. package/src/storage/backwards_compatibility_tests/__snapshots__/opened_stores.json +21 -5
  267. package/src/storage/backwards_compatibility_tests/schema_tests.ts +125 -36
  268. package/src/storage/capsule_store/capsule_service.ts +8 -13
  269. package/src/storage/contract_store/contract_store.ts +86 -93
  270. package/src/storage/fact_store/fact_service.ts +69 -0
  271. package/src/storage/fact_store/fact_store.ts +487 -0
  272. package/src/storage/fact_store/fact_store_keys.ts +75 -0
  273. package/src/storage/fact_store/index.ts +14 -0
  274. package/src/storage/fact_store/origin_state.ts +75 -0
  275. package/src/storage/fact_store/stored_fact.ts +80 -0
  276. package/src/storage/index.ts +1 -0
  277. package/src/storage/metadata.ts +1 -1
  278. package/src/storage/open_pxe_stores.ts +6 -3
  279. package/src/storage/tagging_store/index.ts +1 -1
  280. package/src/storage/tagging_store/tagging_secret_sources_store.ts +138 -0
  281. package/src/tagging/constants.ts +19 -9
  282. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts +0 -6
  283. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts.map +0 -1
  284. package/dest/contract_function_simulator/proxied_contract_data_source.js +0 -51
  285. package/dest/contract_sync/contract_sync_service.d.ts.map +0 -1
  286. package/dest/contract_sync/helpers.d.ts +0 -27
  287. package/dest/contract_sync/helpers.d.ts.map +0 -1
  288. package/dest/contract_sync/helpers.js +0 -53
  289. package/dest/messages/message_context_service.d.ts +0 -17
  290. package/dest/messages/message_context_service.d.ts.map +0 -1
  291. package/dest/storage/tagging_store/sender_address_book_store.d.ts +0 -14
  292. package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +0 -1
  293. package/dest/storage/tagging_store/sender_address_book_store.js +0 -36
  294. package/src/contract_function_simulator/proxied_contract_data_source.ts +0 -60
  295. package/src/contract_sync/helpers.ts +0 -86
  296. package/src/storage/backwards_compatibility_tests/__snapshots__/SenderAddressBookStore.json +0 -16
  297. 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';
@@ -20,79 +20,82 @@ import { type FunctionCall, FunctionSelector } from '@aztec/stdlib/abi';
20
20
  import type { AuthWitness } from '@aztec/stdlib/auth-witness';
21
21
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
22
22
  import { BlockHash, type L2TipsProvider } from '@aztec/stdlib/block';
23
- import type { CompleteAddress, ContractInstance, PartialAddress } from '@aztec/stdlib/contract';
23
+ import type { CompleteAddress, ContractInstancePreimageWithAddress, PartialAddress } from '@aztec/stdlib/contract';
24
24
  import { siloNullifier } from '@aztec/stdlib/hash';
25
25
  import type { AztecNode } from '@aztec/stdlib/interfaces/server';
26
26
  import type { KeyValidationRequest } from '@aztec/stdlib/kernel';
27
27
  import { PublicKeys, computeAddressSecret, hashPublicKey } from '@aztec/stdlib/keys';
28
- import {
29
- AppTaggingSecret,
30
- MessageContext,
31
- type PendingTaggedLog,
32
- deriveAppSiloedSharedSecret,
33
- } from '@aztec/stdlib/logs';
34
- import { getNonNullifiedL1ToL2MessageWitness } from '@aztec/stdlib/messaging';
28
+ import { AppTaggingSecret, FlatPublicLogs, appSiloEcdhSharedSecret } from '@aztec/stdlib/logs';
29
+ import { type UnsiloedMessageNullifier, getL1ToL2MessageWitness } from '@aztec/stdlib/messaging';
35
30
  import type { NoteStatus } from '@aztec/stdlib/note';
36
31
  import { MerkleTreeId, type NullifierMembershipWitness, PublicDataWitness } from '@aztec/stdlib/trees';
37
32
  import {
38
33
  type BlockHeader,
34
+ CallContext,
39
35
  type Capsule,
40
36
  type IndexedTxEffect,
41
37
  type OffchainEffect,
42
- TxEffect,
43
38
  type TxHash,
44
39
  } from '@aztec/stdlib/tx';
45
40
 
41
+ import type { ContractSyncService } from '../../contract/contract_sync_service.js';
46
42
  import { createContractLogger, logContractMessage, stripAztecnrLogPrefix } from '../../contract_logging.js';
47
- import type { ContractSyncService } from '../../contract_sync/contract_sync_service.js';
48
43
  import { EventService } from '../../events/event_service.js';
49
44
  import type { UtilityCallAuthorizationRequest } from '../../hooks/authorize_utility_call.js';
50
45
  import type { ExecutionHooks } from '../../hooks/index.js';
51
46
  import { LogService } from '../../logs/log_service.js';
52
- import { MessageContextService } from '../../messages/message_context_service.js';
47
+ import { TxResolverService } from '../../messages/tx_resolver_service.js';
53
48
  import { NoteService } from '../../notes/note_service.js';
54
49
  import { ORACLE_VERSION_MAJOR } from '../../oracle_version.js';
55
50
  import type { AddressStore } from '../../storage/address_store/address_store.js';
56
51
  import type { CapsuleService } from '../../storage/capsule_store/capsule_service.js';
57
- 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';
58
54
  import type { NoteStore } from '../../storage/note_store/note_store.js';
59
55
  import type { PrivateEventStore } from '../../storage/private_event_store/private_event_store.js';
60
56
  import type { RecipientTaggingStore } from '../../storage/tagging_store/recipient_tagging_store.js';
61
- 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';
62
60
  import { EphemeralArrayService } from '../ephemeral_array_service.js';
63
61
  import { BoundedVec } from '../noir-structs/bounded_vec.js';
62
+ import type { EmbeddedCurvePoint } from '../noir-structs/embedded_curve_point.js';
64
63
  import { EphemeralArray } from '../noir-structs/ephemeral_array.js';
65
64
  import type { EventValidationRequest } from '../noir-structs/event_validation_request.js';
65
+ import { type FactCollection, emptyFactCollection, toNoirFactCollection } from '../noir-structs/fact_collection.js';
66
66
  import type { LogRetrievalRequest } from '../noir-structs/log_retrieval_request.js';
67
67
  import type { LogRetrievalResponse } from '../noir-structs/log_retrieval_response.js';
68
68
  import type { NoteData } from '../noir-structs/note_data.js';
69
69
  import type { NoteValidationRequest } from '../noir-structs/note_validation_request.js';
70
70
  import { Option } from '../noir-structs/option.js';
71
+ import type { PendingTaggedLog } from '../noir-structs/pending_tagged_log.js';
71
72
  import type { ProvidedSecret } from '../noir-structs/provided_secret.js';
72
- 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';
73
76
  import { pickNotes } from '../pick_notes.js';
74
77
  import type { TransientArrayService } from '../transient_array_service.js';
75
78
  import { buildACIRCallback } from './acir_callback.js';
76
79
  import type { IMiscOracle, IUtilityExecutionOracle } from './interfaces.js';
77
- import { MessageLoadOracleInputs } from './message_load_oracle_inputs.js';
78
80
 
79
81
  /** Args for UtilityExecutionOracle constructor. */
80
82
  export type UtilityExecutionOracleArgs = {
81
- contractAddress: AztecAddress;
83
+ callContext: CallContext;
82
84
  /** List of transient auth witnesses to be used during this simulation */
83
85
  authWitnesses: AuthWitness[];
84
86
  capsules: Capsule[]; // TODO(#12425): Rename to transientCapsules
85
87
  anchorBlockHeader: BlockHeader;
86
- contractStore: ContractStore;
88
+ anchoredContractData: AnchoredContractData;
87
89
  noteStore: NoteStore;
88
90
  keyStore: KeyStore;
89
91
  addressStore: AddressStore;
90
92
  aztecNode: AztecNode;
91
93
  recipientTaggingStore: RecipientTaggingStore;
92
- senderAddressBookStore: SenderAddressBookStore;
94
+ taggingSecretSourcesStore: TaggingSecretSourcesStore;
93
95
  capsuleService: CapsuleService;
96
+ factService: FactService;
94
97
  privateEventStore: PrivateEventStore;
95
- messageContextService: MessageContextService;
98
+ txResolver: TxResolverService;
96
99
  contractSyncService: ContractSyncService;
97
100
  l2TipsStore: L2TipsProvider;
98
101
  jobId: string;
@@ -117,24 +120,26 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
117
120
  private offchainEffects: OffchainEffect[] = [];
118
121
  private readonly ephemeralArrayService = new EphemeralArrayService();
119
122
  protected readonly transientArrayService: TransientArrayService;
123
+ private readonly aztecNodeReadCache: AztecNodeReadCache;
120
124
 
121
125
  // We store oracle version to be able to show a nice error message when an oracle handler is missing.
122
126
  private contractOracleVersion: { major: number; minor: number } | undefined;
123
127
 
124
- protected readonly contractAddress: AztecAddress;
128
+ protected readonly callContext: CallContext;
125
129
  protected readonly authWitnesses: AuthWitness[];
126
130
  protected readonly capsules: Capsule[];
127
131
  protected readonly anchorBlockHeader: BlockHeader;
128
- protected readonly contractStore: ContractStore;
132
+ protected readonly anchoredContractData: AnchoredContractData;
129
133
  protected readonly noteStore: NoteStore;
130
134
  protected readonly keyStore: KeyStore;
131
135
  protected readonly addressStore: AddressStore;
132
136
  protected readonly aztecNode: AztecNode;
133
137
  protected readonly recipientTaggingStore: RecipientTaggingStore;
134
- protected readonly senderAddressBookStore: SenderAddressBookStore;
138
+ protected readonly taggingSecretSourcesStore: TaggingSecretSourcesStore;
135
139
  protected readonly capsuleService: CapsuleService;
140
+ protected readonly factService: FactService;
136
141
  protected readonly privateEventStore: PrivateEventStore;
137
- protected readonly messageContextService: MessageContextService;
142
+ protected readonly txResolver: TxResolverService;
138
143
  protected readonly contractSyncService: ContractSyncService;
139
144
  protected readonly l2TipsStore: L2TipsProvider;
140
145
  protected readonly jobId: string;
@@ -145,20 +150,21 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
145
150
  protected readonly utilityExecutor: (call: FunctionCall, scopes: AztecAddress[]) => Promise<void>;
146
151
 
147
152
  constructor(args: UtilityExecutionOracleArgs) {
148
- this.contractAddress = args.contractAddress;
153
+ this.callContext = args.callContext;
149
154
  this.authWitnesses = args.authWitnesses;
150
155
  this.capsules = args.capsules;
151
156
  this.anchorBlockHeader = args.anchorBlockHeader;
152
- this.contractStore = args.contractStore;
157
+ this.anchoredContractData = args.anchoredContractData;
153
158
  this.noteStore = args.noteStore;
154
159
  this.keyStore = args.keyStore;
155
160
  this.addressStore = args.addressStore;
156
161
  this.aztecNode = args.aztecNode;
157
162
  this.recipientTaggingStore = args.recipientTaggingStore;
158
- this.senderAddressBookStore = args.senderAddressBookStore;
163
+ this.taggingSecretSourcesStore = args.taggingSecretSourcesStore;
159
164
  this.capsuleService = args.capsuleService;
165
+ this.factService = args.factService;
160
166
  this.privateEventStore = args.privateEventStore;
161
- this.messageContextService = args.messageContextService;
167
+ this.txResolver = args.txResolver;
162
168
  this.contractSyncService = args.contractSyncService;
163
169
  this.l2TipsStore = args.l2TipsStore;
164
170
  this.jobId = args.jobId;
@@ -168,6 +174,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
168
174
  this.hooks = args.hooks;
169
175
  this.utilityExecutor = args.utilityExecutor;
170
176
  this.transientArrayService = args.transientArrayService;
177
+ this.aztecNodeReadCache = new AztecNodeReadCache(args.aztecNode);
171
178
  }
172
179
 
173
180
  public assertCompatibleOracleVersion(major: number, minor: number): void {
@@ -194,17 +201,22 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
194
201
  }
195
202
 
196
203
  public getUtilityContext(): UtilityContext {
197
- return new UtilityContext(this.anchorBlockHeader, this.contractAddress);
204
+ return {
205
+ blockHeader: this.anchorBlockHeader,
206
+ contractAddress: this.callContext.contractAddress,
207
+ msgSender: this.callContext.msgSender,
208
+ };
198
209
  }
199
210
 
200
211
  /**
201
212
  * Retrieve keys associated with a specific master public key and app address.
202
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.
203
215
  * @returns A Promise that resolves to nullifier keys.
204
216
  * @throws If the keys are not registered in the key store.
205
217
  * @throws If scopes are defined and the account is not in the scopes.
206
218
  */
207
- public async getKeyValidationRequest(pkMHash: Fr): Promise<KeyValidationRequest> {
219
+ public async getKeyValidationRequest(pkMHash: Fr, _keyIndex: Fr): Promise<KeyValidationRequest> {
208
220
  let hasAccess = false;
209
221
  for (let i = 0; i < this.scopes.length && !hasAccess; i++) {
210
222
  if (await this.keyStore.accountHasKey(this.scopes[i], pkMHash)) {
@@ -256,9 +268,25 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
256
268
  // hash at all. If the block hash did not exist by the reference block hash, then the node will not return the
257
269
  // membership witness as there is none.
258
270
  const witness = await this.#queryWithBlockHashNotAfterAnchor(referenceBlockHash, () =>
259
- this.aztecNode.getBlockHashMembershipWitness(referenceBlockHash, blockHash),
271
+ this.aztecNodeReadCache.getBlockHashMembershipWitness(referenceBlockHash, blockHash),
272
+ );
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
+ ),
260
288
  );
261
- return witness ? Option.some(witness) : Option.none(MembershipWitness.empty(ARCHIVE_HEIGHT));
289
+ return EphemeralArray.fromValues(this.ephemeralArrayService, memberships);
262
290
  }
263
291
 
264
292
  /**
@@ -309,7 +337,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
309
337
  */
310
338
  public async getPublicDataWitness(blockHash: BlockHash, leafSlot: Fr): Promise<PublicDataWitness> {
311
339
  const witness = await this.#queryWithBlockHashNotAfterAnchor(blockHash, () =>
312
- this.aztecNode.getPublicDataWitness(blockHash, leafSlot),
340
+ this.aztecNodeReadCache.getPublicDataWitness(blockHash, leafSlot),
313
341
  );
314
342
  if (!witness) {
315
343
  throw new Error(`Public data witness not found for slot ${leafSlot} at block hash ${blockHash.toString()}.`);
@@ -350,7 +378,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
350
378
  ): Promise<Option<{ publicKeys: PublicKeys; partialAddress: PartialAddress }>> {
351
379
  const completeAddress = await this.addressStore.getCompleteAddress(account);
352
380
  if (!completeAddress) {
353
- return Option.none({ publicKeys: PublicKeys.default(), partialAddress: Fr.ZERO });
381
+ return Option.none();
354
382
  }
355
383
  return Option.some({ publicKeys: completeAddress.publicKeys, partialAddress: completeAddress.partialAddress });
356
384
  }
@@ -360,7 +388,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
360
388
  if (!completeAddress) {
361
389
  throw new Error(
362
390
  `No public key registered for address ${account}.
363
- 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`,
364
392
  );
365
393
  }
366
394
  return completeAddress;
@@ -371,8 +399,8 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
371
399
  * @param address - Address.
372
400
  * @returns A contract instance.
373
401
  */
374
- public async getContractInstance(address: AztecAddress): Promise<ContractInstance> {
375
- const instance = await this.contractStore.getContractInstance(address);
402
+ public async getContractInstance(address: AztecAddress): Promise<ContractInstancePreimageWithAddress> {
403
+ const instance = await this.anchoredContractData.getContractInstance(address);
376
404
  if (!instance) {
377
405
  throw new Error(`No contract instance found for address ${address.toString()}`);
378
406
  }
@@ -469,23 +497,21 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
469
497
  }
470
498
 
471
499
  /**
472
- * Returns the membership witness of an un-nullified L1 to L2 message.
473
- * @param contractAddress - Address of a contract by which the message was emitted.
500
+ * Returns the membership witness of an L1 to L2 message.
474
501
  * @param messageHash - Hash of the message.
475
- * @param secret - Secret used to compute a nullifier.
476
- * @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.
477
504
  * @returns The l1 to l2 membership witness (index of message in the tree and sibling path).
478
505
  */
479
- public async getL1ToL2MembershipWitness(contractAddress: AztecAddress, messageHash: Fr, secret: Fr) {
480
- const [messageIndex, siblingPath] = await getNonNullifiedL1ToL2MessageWitness(
506
+ public async getL1ToL2MembershipWitnessV2(messageHash: Fr, nullifier: Option<UnsiloedMessageNullifier>) {
507
+ const [messageIndex, siblingPath] = await getL1ToL2MessageWitness(
481
508
  this.aztecNode,
482
- contractAddress,
483
509
  messageHash,
484
- secret,
510
+ nullifier.value,
485
511
  await this.anchorBlockHeader.hash(),
486
512
  );
487
513
 
488
- return new MessageLoadOracleInputs(messageIndex, siblingPath);
514
+ return { index: messageIndex, siblingPath };
489
515
  }
490
516
 
491
517
  /**
@@ -502,16 +528,16 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
502
528
  numberOfElements: number,
503
529
  ) {
504
530
  return this.#queryWithBlockHashNotAfterAnchor(blockHash, async () => {
505
- const slots = Array(numberOfElements)
506
- .fill(0)
507
- .map((_, i) => new Fr(startStorageSlot.value + BigInt(i)));
508
-
509
- const values = await Promise.all(
510
- slots.map(storageSlot => this.aztecNode.getPublicStorageAt(blockHash, contractAddress, storageSlot)),
531
+ const values = await this.aztecNodeReadCache.getPublicStorageRange(
532
+ blockHash,
533
+ contractAddress,
534
+ startStorageSlot,
535
+ numberOfElements,
511
536
  );
512
537
 
513
538
  this.logger.debug(
514
- `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(', ')}]`,
515
541
  );
516
542
 
517
543
  return values;
@@ -527,7 +553,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
527
553
  // to re-use jobId as instanceId here as executions of different PXE jobs are isolated.
528
554
  this.contractLogger = await createContractLogger(
529
555
  this.contractAddress,
530
- addr => this.contractStore.getDebugContractName(addr),
556
+ addr => this.anchoredContractData.getDebugContractName(addr),
531
557
  'user',
532
558
  { instanceId: this.jobId },
533
559
  );
@@ -544,7 +570,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
544
570
  // to re-use jobId as instanceId here as executions of different PXE jobs are isolated.
545
571
  this.aztecnrLogger = await createContractLogger(
546
572
  this.contractAddress,
547
- addr => this.contractStore.getDebugContractName(addr),
573
+ addr => this.anchoredContractData.getDebugContractName(addr),
548
574
  'aztecnr',
549
575
  { instanceId: this.jobId },
550
576
  );
@@ -564,7 +590,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
564
590
  }
565
591
 
566
592
  /** Fetches pending tagged logs into a freshly allocated ephemeral array and returns it. */
567
- public async getPendingTaggedLogs(
593
+ public async getPendingTaggedLogsV2(
568
594
  scope: AztecAddress,
569
595
  providedSecrets: EphemeralArray<ProvidedSecret>,
570
596
  ): Promise<EphemeralArray<PendingTaggedLog>> {
@@ -584,7 +610,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
584
610
  this.l2TipsStore,
585
611
  this.keyStore,
586
612
  this.recipientTaggingStore,
587
- this.senderAddressBookStore,
613
+ this.taggingSecretSourcesStore,
588
614
  this.addressStore,
589
615
  this.jobId,
590
616
  this.logger.getBindings(),
@@ -622,7 +648,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
622
648
  ]);
623
649
  }
624
650
 
625
- public async getLogsByTag(
651
+ public async getLogsByTagV2(
626
652
  requests: EphemeralArray<LogRetrievalRequest>,
627
653
  ): Promise<EphemeralArray<EphemeralArray<LogRetrievalResponse>>> {
628
654
  const logRetrievalRequests = requests.readAll(this.ephemeralArrayService);
@@ -638,20 +664,13 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
638
664
  return EphemeralArray.fromValues(this.ephemeralArrayService, innerArrays);
639
665
  }
640
666
 
641
- /** Reads tx hash requests from an ephemeral array, resolves their contexts, and returns the response array. */
642
- public async getMessageContextsByTxHash(
643
- requests: EphemeralArray<Fr>,
644
- ): 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>>> {
645
669
  const txHashes = requests.readAll(this.ephemeralArrayService);
646
670
 
647
- const maybeMessageContexts = await this.messageContextService.getMessageContextsByTxHash(
648
- txHashes,
649
- this.anchorBlockHeader.getBlockNumber(),
650
- );
671
+ const resolved = await this.txResolver.resolveTxs(txHashes, this.anchorBlockHeader.getBlockNumber());
651
672
 
652
- const options = maybeMessageContexts.map(mc =>
653
- mc ? Option.some(mc) : Option.none<MessageContext>(MessageContext.empty()),
654
- );
673
+ const options = resolved.map(r => (r ? Option.some(r) : Option.none<ResolvedTx>()));
655
674
  return EphemeralArray.fromValues(this.ephemeralArrayService, options);
656
675
  }
657
676
 
@@ -659,24 +678,30 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
659
678
  * Fetches the effects of a transaction by its hash. Returns null if the tx is not found or is beyond the anchor
660
679
  * block.
661
680
  */
662
- public async getTxEffect(txHash: TxHash): Promise<Option<TxEffect>> {
681
+ public async getTxEffect(txHash: TxHash): Promise<Option<TxEffectData>> {
663
682
  if (txHash.hash.isZero()) {
664
683
  throw new Error('Invalid tx hash passed into aztec_utl_getTxEffect oracle handler');
665
684
  }
666
685
 
667
- const receipt = await this.aztecNode.getTxReceipt(txHash, { includeTxEffect: true });
686
+ const receipt = await this.aztecNodeReadCache.getTxReceiptWithEffect(txHash);
668
687
  if (!receipt.isMined() || !receipt.txEffect || receipt.blockNumber > this.anchorBlockHeader.getBlockNumber()) {
669
- return Option.none(TxEffect.empty());
688
+ return Option.none();
670
689
  }
671
690
 
672
- 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
+ });
673
701
  }
674
702
 
675
703
  public setCapsule(contractAddress: AztecAddress, slot: Fr, capsule: Fr[], scope: AztecAddress): void {
676
- if (!contractAddress.equals(this.contractAddress)) {
677
- // TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
678
- throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
679
- }
704
+ this.#assertOwnContract(contractAddress);
680
705
  this.capsuleService.setCapsule(contractAddress, slot, capsule, this.jobId, scope);
681
706
  }
682
707
 
@@ -686,19 +711,13 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
686
711
  tSize: number,
687
712
  scope: AztecAddress,
688
713
  ): Promise<Option<Fr[]>> {
689
- if (!contractAddress.equals(this.contractAddress)) {
690
- // TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
691
- throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
692
- }
714
+ this.#assertOwnContract(contractAddress);
693
715
  const values = await this.capsuleService.getCapsule(contractAddress, slot, this.jobId, scope, this.capsules);
694
- return values ? Option.some(values) : Option.none(new Array(tSize).fill(Fr.ZERO));
716
+ return values ? Option.some(values) : Option.none({ length: tSize });
695
717
  }
696
718
 
697
719
  public deleteCapsule(contractAddress: AztecAddress, slot: Fr, scope: AztecAddress): void {
698
- if (!contractAddress.equals(this.contractAddress)) {
699
- // TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
700
- throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
701
- }
720
+ this.#assertOwnContract(contractAddress);
702
721
  this.capsuleService.deleteCapsule(contractAddress, slot, this.jobId, scope);
703
722
  }
704
723
 
@@ -709,11 +728,114 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
709
728
  numEntries: number,
710
729
  scope: AztecAddress,
711
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 {
712
739
  if (!contractAddress.equals(this.contractAddress)) {
713
- // TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
714
740
  throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
715
741
  }
716
- 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
+ );
717
839
  }
718
840
 
719
841
  /**
@@ -739,7 +861,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
739
861
  const plaintext = await aes128.decryptBufferCBC(Buffer.from(ciphertext.data), iv, symKey);
740
862
  return Option.some(BoundedVec.from<number>({ data: [...plaintext], maxLength: capacity }));
741
863
  } catch {
742
- return Option.none(BoundedVec.empty<number>({ maxLength: capacity }));
864
+ return Option.none({ maxLength: capacity });
743
865
  }
744
866
  }
745
867
 
@@ -748,11 +870,12 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
748
870
  * @param address - The recipient address.
749
871
  * @param ephPks - Ephemeral array containing the serialized Points.
750
872
  * @param contractAddress - The contract address for app-siloing (validated against execution context).
751
- * @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.
752
875
  */
753
876
  public async getSharedSecrets(
754
877
  address: AztecAddress,
755
- ephPks: EphemeralArray<Point>,
878
+ ephPks: EphemeralArray<EmbeddedCurvePoint>,
756
879
  contractAddress: AztecAddress,
757
880
  ): Promise<EphemeralArray<Fr>> {
758
881
  if (!contractAddress.equals(this.contractAddress)) {
@@ -760,14 +883,24 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
760
883
  `getSharedSecrets called with contract address ${contractAddress}, expected ${this.contractAddress}`,
761
884
  );
762
885
  }
763
- 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
+ }
764
897
  const ivpkMHash = await hashPublicKey(recipientCompleteAddress.publicKeys.ivpkM);
765
898
  const ivskM = await this.keyStore.getMasterSecretKey(ivpkMHash);
766
899
  const addressSecret = await computeAddressSecret(await recipientCompleteAddress.getPreaddress(), ivskM);
767
900
 
768
901
  const ephPkPoints = ephPks.readAll(this.ephemeralArrayService);
769
902
  const secrets = await Promise.all(
770
- ephPkPoints.map(ephPk => deriveAppSiloedSharedSecret(addressSecret, ephPk, this.contractAddress)),
903
+ ephPkPoints.map(({ x, y }) => appSiloEcdhSharedSecret(addressSecret, new Point(x, y), this.contractAddress)),
771
904
  );
772
905
 
773
906
  return EphemeralArray.fromValues(this.ephemeralArrayService, secrets);
@@ -840,36 +973,44 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
840
973
  functionSelector: FunctionSelector,
841
974
  args: Fr[],
842
975
  ): Promise<Fr[]> {
843
- const targetArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(
976
+ const targetArtifact = await this.anchoredContractData.getFunctionArtifactWithDebugMetadata(
844
977
  targetContractAddress,
845
978
  functionSelector,
846
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
+ }
847
986
 
848
987
  if (!targetContractAddress.equals(this.contractAddress)) {
849
- // The HandshakeRegistry is called during every contract's sync to discover handshake secrets.
850
- // It is a standard contract that only reads its own state, so it is always authorized.
851
- const isHandshakeRegistryRead =
852
- targetContractAddress.equals(STANDARD_HANDSHAKE_REGISTRY_ADDRESS) &&
853
- functionSelector.equals(await FunctionSelector.fromSignature('get_handshakes((Field),u32)'));
854
- if (!isHandshakeRegistryRead) {
855
- const [callerInstance, targetInstance] = await Promise.all([
856
- this.getContractInstance(this.contractAddress),
857
- this.getContractInstance(targetContractAddress),
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),
858
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
+ }
859
1000
  const request: UtilityCallAuthorizationRequest = {
860
1001
  caller: this.contractAddress,
861
- callerClassId: callerInstance.currentContractClassId,
1002
+ callerClassId,
862
1003
  target: targetContractAddress,
863
- targetClassId: targetInstance.currentContractClassId,
1004
+ targetClassId,
864
1005
  functionSelector,
865
1006
  functionName: targetArtifact.name,
866
1007
  args,
867
1008
  callerContext: this.callerContext,
868
1009
  };
869
1010
 
870
- const response = this.hooks
1011
+ const response = this.hooks?.authorizeUtilityCall
871
1012
  ? await this.hooks.authorizeUtilityCall(request)
872
- : { authorized: false, reason: 'No execution hooks configured' };
1013
+ : { authorized: false, reason: 'No authorizeUtilityCall hook configured' };
873
1014
 
874
1015
  if (!response.authorized) {
875
1016
  const reason = response.reason ? `: ${response.reason}` : '';
@@ -896,20 +1037,26 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
896
1037
  );
897
1038
 
898
1039
  const nestedOracle = new UtilityExecutionOracle({
899
- contractAddress: targetContractAddress,
1040
+ callContext: CallContext.from({
1041
+ msgSender: this.contractAddress,
1042
+ contractAddress: targetContractAddress,
1043
+ functionSelector,
1044
+ isStaticCall: true,
1045
+ }),
900
1046
  authWitnesses: this.authWitnesses,
901
1047
  capsules: this.capsules,
902
1048
  anchorBlockHeader: this.anchorBlockHeader,
903
- contractStore: this.contractStore,
1049
+ anchoredContractData: this.anchoredContractData,
904
1050
  noteStore: this.noteStore,
905
1051
  keyStore: this.keyStore,
906
1052
  addressStore: this.addressStore,
907
1053
  aztecNode: this.aztecNode,
908
1054
  recipientTaggingStore: this.recipientTaggingStore,
909
- senderAddressBookStore: this.senderAddressBookStore,
1055
+ taggingSecretSourcesStore: this.taggingSecretSourcesStore,
910
1056
  capsuleService: this.capsuleService,
1057
+ factService: this.factService,
911
1058
  privateEventStore: this.privateEventStore,
912
- messageContextService: this.messageContextService,
1059
+ txResolver: this.txResolver,
913
1060
  contractSyncService: this.contractSyncService,
914
1061
  l2TipsStore: this.l2TipsStore,
915
1062
  jobId: this.jobId,
@@ -949,9 +1096,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
949
1096
  */
950
1097
  async #fetchTxEffects(txHashes: TxHash[]): Promise<Map<string, IndexedTxEffect>> {
951
1098
  const uniqueTxHashes = uniqueBy(txHashes, h => h.toString());
952
- const fetched = await Promise.all(
953
- uniqueTxHashes.map(h => this.aztecNode.getTxReceipt(h, { includeTxEffect: true })),
954
- );
1099
+ const fetched = await Promise.all(uniqueTxHashes.map(h => this.aztecNodeReadCache.getTxReceiptWithEffect(h)));
955
1100
  return new Map(
956
1101
  uniqueTxHashes
957
1102
  .map((h, i): [string, IndexedTxEffect | undefined] => {
@@ -985,7 +1130,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
985
1130
  const [response] = await Promise.all([
986
1131
  query(),
987
1132
  (async () => {
988
- const block = await this.aztecNode.getBlock(blockHash);
1133
+ const block = await this.aztecNodeReadCache.getBlock(blockHash);
989
1134
  const header = block?.header;
990
1135
  if (!header) {
991
1136
  throw new Error(`Could not find block header for block hash ${blockHash}`);
@@ -1005,4 +1150,44 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
1005
1150
  protected get callerContext(): 'private' | 'private view' | 'utility' {
1006
1151
  return 'utility';
1007
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);
1008
1193
  }