@aztec/pxe 0.0.1-commit.c31f2472 → 0.0.1-commit.c52d6e7

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 (535) hide show
  1. package/dest/bin/check_oracle_version.js +11 -118
  2. package/dest/bin/index.d.ts +2 -0
  3. package/dest/bin/index.d.ts.map +1 -0
  4. package/dest/bin/index.js +1 -0
  5. package/dest/bin/oracle_version_helpers.d.ts +20 -0
  6. package/dest/bin/oracle_version_helpers.d.ts.map +1 -0
  7. package/dest/bin/oracle_version_helpers.js +25 -0
  8. package/dest/block_synchronizer/block_stream_source.d.ts +10 -0
  9. package/dest/block_synchronizer/block_stream_source.d.ts.map +1 -0
  10. package/dest/block_synchronizer/block_stream_source.js +37 -0
  11. package/dest/block_synchronizer/block_synchronizer.d.ts +22 -14
  12. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
  13. package/dest/block_synchronizer/block_synchronizer.js +77 -28
  14. package/dest/config/index.d.ts +9 -2
  15. package/dest/config/index.d.ts.map +1 -1
  16. package/dest/config/index.js +14 -15
  17. package/dest/config/package_info.js +1 -1
  18. package/dest/contract/contract_class_service.d.ts +24 -0
  19. package/dest/contract/contract_class_service.d.ts.map +1 -0
  20. package/dest/contract/contract_class_service.js +36 -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/contract_sync_service.js +116 -0
  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/skip_sync_contracts.d.ts +11 -0
  28. package/dest/contract/skip_sync_contracts.d.ts.map +1 -0
  29. package/dest/contract/skip_sync_contracts.js +18 -0
  30. package/dest/contract_function_simulator/anchored_contract_data.d.ts +36 -0
  31. package/dest/contract_function_simulator/anchored_contract_data.d.ts.map +1 -0
  32. package/dest/contract_function_simulator/anchored_contract_data.js +54 -0
  33. package/dest/contract_function_simulator/contract_function_simulator.d.ts +72 -43
  34. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  35. package/dest/contract_function_simulator/contract_function_simulator.js +264 -111
  36. package/dest/contract_function_simulator/ephemeral_array_service.d.ts +28 -0
  37. package/dest/contract_function_simulator/ephemeral_array_service.d.ts.map +1 -0
  38. package/dest/contract_function_simulator/ephemeral_array_service.js +78 -0
  39. package/dest/contract_function_simulator/execution_note_cache.d.ts +4 -10
  40. package/dest/contract_function_simulator/execution_note_cache.d.ts.map +1 -1
  41. package/dest/contract_function_simulator/execution_note_cache.js +8 -28
  42. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts +7 -11
  43. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts.map +1 -1
  44. package/dest/contract_function_simulator/execution_tagging_index_cache.js +19 -15
  45. package/dest/contract_function_simulator/index.d.ts +26 -5
  46. package/dest/contract_function_simulator/index.d.ts.map +1 -1
  47. package/dest/contract_function_simulator/index.js +11 -3
  48. package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts +29 -0
  49. package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts.map +1 -0
  50. package/dest/contract_function_simulator/noir-structs/bounded_vec.js +30 -0
  51. package/dest/contract_function_simulator/noir-structs/contract_class_log_data.d.ts +9 -0
  52. package/dest/contract_function_simulator/noir-structs/contract_class_log_data.d.ts.map +1 -0
  53. package/dest/contract_function_simulator/noir-structs/contract_class_log_data.js +1 -0
  54. package/dest/contract_function_simulator/noir-structs/embedded_curve_point.d.ts +7 -0
  55. package/dest/contract_function_simulator/noir-structs/embedded_curve_point.d.ts.map +1 -0
  56. package/dest/contract_function_simulator/noir-structs/embedded_curve_point.js +1 -0
  57. package/dest/contract_function_simulator/noir-structs/ephemeral_array.d.ts +37 -0
  58. package/dest/contract_function_simulator/noir-structs/ephemeral_array.d.ts.map +1 -0
  59. package/dest/contract_function_simulator/noir-structs/ephemeral_array.js +59 -0
  60. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +3 -4
  61. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts.map +1 -1
  62. package/dest/contract_function_simulator/noir-structs/event_validation_request.js +9 -10
  63. package/dest/contract_function_simulator/noir-structs/fact.d.ts +16 -0
  64. package/dest/contract_function_simulator/noir-structs/fact.d.ts.map +1 -0
  65. package/dest/contract_function_simulator/noir-structs/fact.js +6 -0
  66. package/dest/contract_function_simulator/noir-structs/fact_collection.d.ts +27 -0
  67. package/dest/contract_function_simulator/noir-structs/fact_collection.d.ts.map +1 -0
  68. package/dest/contract_function_simulator/noir-structs/fact_collection.js +31 -0
  69. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts +19 -10
  70. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts.map +1 -1
  71. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.js +12 -24
  72. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts +11 -9
  73. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts.map +1 -1
  74. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.js +2 -63
  75. package/dest/contract_function_simulator/noir-structs/note_data.d.ts +27 -0
  76. package/dest/contract_function_simulator/noir-structs/note_data.d.ts.map +1 -0
  77. package/dest/contract_function_simulator/noir-structs/note_data.js +3 -0
  78. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +3 -5
  79. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts.map +1 -1
  80. package/dest/contract_function_simulator/noir-structs/note_validation_request.js +8 -12
  81. package/dest/contract_function_simulator/noir-structs/option.d.ts +59 -0
  82. package/dest/contract_function_simulator/noir-structs/option.d.ts.map +1 -0
  83. package/dest/contract_function_simulator/noir-structs/option.js +67 -0
  84. package/dest/contract_function_simulator/noir-structs/origin_block.d.ts +11 -0
  85. package/dest/contract_function_simulator/noir-structs/origin_block.d.ts.map +1 -0
  86. package/dest/contract_function_simulator/noir-structs/origin_block.js +5 -0
  87. package/dest/contract_function_simulator/noir-structs/pending_tagged_log.d.ts +11 -0
  88. package/dest/contract_function_simulator/noir-structs/pending_tagged_log.d.ts.map +1 -0
  89. package/dest/contract_function_simulator/noir-structs/pending_tagged_log.js +4 -0
  90. package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts +8 -0
  91. package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts.map +1 -0
  92. package/dest/contract_function_simulator/noir-structs/provided_secret.js +1 -0
  93. package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.d.ts +28 -0
  94. package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.d.ts.map +1 -0
  95. package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.js +50 -0
  96. package/dest/contract_function_simulator/noir-structs/resolved_tx.d.ts +19 -0
  97. package/dest/contract_function_simulator/noir-structs/resolved_tx.d.ts.map +1 -0
  98. package/dest/contract_function_simulator/noir-structs/resolved_tx.js +9 -0
  99. package/dest/contract_function_simulator/noir-structs/tx_effect_data.d.ts +15 -0
  100. package/dest/contract_function_simulator/noir-structs/tx_effect_data.d.ts.map +1 -0
  101. package/dest/contract_function_simulator/noir-structs/tx_effect_data.js +5 -0
  102. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts +6 -11
  103. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts.map +1 -1
  104. package/dest/contract_function_simulator/noir-structs/utility_context.js +1 -20
  105. package/dest/contract_function_simulator/oracle/acir_callback.d.ts +21 -0
  106. package/dest/contract_function_simulator/oracle/acir_callback.d.ts.map +1 -0
  107. package/dest/contract_function_simulator/oracle/acir_callback.js +115 -0
  108. package/dest/contract_function_simulator/oracle/index.d.ts +2 -13
  109. package/dest/contract_function_simulator/oracle/index.d.ts.map +1 -1
  110. package/dest/contract_function_simulator/oracle/index.js +1 -1
  111. package/dest/contract_function_simulator/oracle/interfaces.d.ts +15 -98
  112. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  113. package/dest/contract_function_simulator/oracle/interfaces.js +2 -2
  114. package/dest/contract_function_simulator/oracle/legacy_oracle_registry.d.ts +39 -0
  115. package/dest/contract_function_simulator/oracle/legacy_oracle_registry.d.ts.map +1 -0
  116. package/dest/contract_function_simulator/oracle/legacy_oracle_registry.js +107 -0
  117. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts +3 -14
  118. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts.map +1 -1
  119. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.js +1 -24
  120. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts +2 -2
  121. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts.map +1 -1
  122. package/dest/contract_function_simulator/oracle/note_packing_utils.js +2 -2
  123. package/dest/contract_function_simulator/oracle/oracle_registry.d.ts +139 -0
  124. package/dest/contract_function_simulator/oracle/oracle_registry.d.ts.map +1 -0
  125. package/dest/contract_function_simulator/oracle/oracle_registry.js +1016 -0
  126. package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts +274 -0
  127. package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts.map +1 -0
  128. package/dest/contract_function_simulator/oracle/oracle_type_mappings.js +1253 -0
  129. package/dest/contract_function_simulator/oracle/private_execution.d.ts +1 -1
  130. package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
  131. package/dest/contract_function_simulator/oracle/private_execution.js +7 -6
  132. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +82 -97
  133. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  134. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +263 -118
  135. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +217 -88
  136. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  137. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +707 -194
  138. package/dest/contract_function_simulator/pick_notes.d.ts +1 -1
  139. package/dest/contract_function_simulator/pick_notes.d.ts.map +1 -1
  140. package/dest/contract_function_simulator/pick_notes.js +20 -3
  141. package/dest/contract_function_simulator/transient_array_service.d.ts +31 -0
  142. package/dest/contract_function_simulator/transient_array_service.d.ts.map +1 -0
  143. package/dest/contract_function_simulator/transient_array_service.js +62 -0
  144. package/dest/contract_logging.d.ts +27 -0
  145. package/dest/contract_logging.d.ts.map +1 -0
  146. package/dest/contract_logging.js +38 -0
  147. package/dest/debug/pxe_debug_utils.d.ts +14 -15
  148. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  149. package/dest/debug/pxe_debug_utils.js +16 -21
  150. package/dest/entrypoints/client/bundle/index.d.ts +4 -1
  151. package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
  152. package/dest/entrypoints/client/bundle/index.js +3 -0
  153. package/dest/entrypoints/client/bundle/utils.d.ts +2 -2
  154. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  155. package/dest/entrypoints/client/bundle/utils.js +36 -8
  156. package/dest/entrypoints/client/lazy/index.d.ts +4 -1
  157. package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
  158. package/dest/entrypoints/client/lazy/index.js +3 -0
  159. package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
  160. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  161. package/dest/entrypoints/client/lazy/utils.js +36 -8
  162. package/dest/entrypoints/client/store.d.ts +14 -0
  163. package/dest/entrypoints/client/store.d.ts.map +1 -0
  164. package/dest/entrypoints/client/store.js +42 -0
  165. package/dest/entrypoints/pxe_creation_options.d.ts +16 -2
  166. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  167. package/dest/entrypoints/pxe_creation_options.js +3 -1
  168. package/dest/entrypoints/server/index.d.ts +8 -3
  169. package/dest/entrypoints/server/index.d.ts.map +1 -1
  170. package/dest/entrypoints/server/index.js +6 -2
  171. package/dest/entrypoints/server/store.d.ts +18 -0
  172. package/dest/entrypoints/server/store.d.ts.map +1 -0
  173. package/dest/entrypoints/server/store.js +28 -0
  174. package/dest/entrypoints/server/utils.d.ts +4 -3
  175. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  176. package/dest/entrypoints/server/utils.js +36 -8
  177. package/dest/error_enriching.d.ts +5 -3
  178. package/dest/error_enriching.d.ts.map +1 -1
  179. package/dest/error_enriching.js +13 -11
  180. package/dest/events/event_service.d.ts +22 -7
  181. package/dest/events/event_service.d.ts.map +1 -1
  182. package/dest/events/event_service.js +52 -20
  183. package/dest/events/private_event_filter_validator.d.ts +3 -2
  184. package/dest/events/private_event_filter_validator.d.ts.map +1 -1
  185. package/dest/events/private_event_filter_validator.js +15 -0
  186. package/dest/hooks/authorize_utility_call.d.ts +41 -0
  187. package/dest/hooks/authorize_utility_call.d.ts.map +1 -0
  188. package/dest/hooks/authorize_utility_call.js +4 -0
  189. package/dest/hooks/execution_hooks.d.ts +62 -0
  190. package/dest/hooks/execution_hooks.d.ts.map +1 -0
  191. package/dest/hooks/execution_hooks.js +9 -0
  192. package/dest/hooks/index.d.ts +5 -0
  193. package/dest/hooks/index.d.ts.map +1 -0
  194. package/dest/hooks/index.js +2 -0
  195. package/dest/hooks/resolve_custom_request.d.ts +23 -0
  196. package/dest/hooks/resolve_custom_request.d.ts.map +1 -0
  197. package/dest/hooks/resolve_custom_request.js +3 -0
  198. package/dest/hooks/resolve_tagging_secret_strategy.d.ts +50 -0
  199. package/dest/hooks/resolve_tagging_secret_strategy.d.ts.map +1 -0
  200. package/dest/hooks/resolve_tagging_secret_strategy.js +3 -0
  201. package/dest/logs/log_service.d.ts +23 -12
  202. package/dest/logs/log_service.d.ts.map +1 -1
  203. package/dest/logs/log_service.js +185 -97
  204. package/dest/messages/tx_resolver_service.d.ts +28 -0
  205. package/dest/messages/tx_resolver_service.d.ts.map +1 -0
  206. package/dest/messages/tx_resolver_service.js +61 -0
  207. package/dest/node/benchmarked_node.d.ts +20 -0
  208. package/dest/node/benchmarked_node.d.ts.map +1 -0
  209. package/dest/node/benchmarked_node.js +94 -0
  210. package/dest/node/caching_aztec_node.d.ts +24 -0
  211. package/dest/node/caching_aztec_node.d.ts.map +1 -0
  212. package/dest/node/caching_aztec_node.js +267 -0
  213. package/dest/notes/note_service.d.ts +36 -9
  214. package/dest/notes/note_service.d.ts.map +1 -1
  215. package/dest/notes/note_service.js +90 -66
  216. package/dest/notes_filter.d.ts +24 -0
  217. package/dest/notes_filter.d.ts.map +1 -0
  218. package/dest/notes_filter.js +4 -0
  219. package/dest/oracle_version.d.ts +4 -3
  220. package/dest/oracle_version.d.ts.map +1 -1
  221. package/dest/oracle_version.js +20 -10
  222. package/dest/private_kernel/batch_planner.d.ts +47 -0
  223. package/dest/private_kernel/batch_planner.d.ts.map +1 -0
  224. package/dest/private_kernel/batch_planner.js +104 -0
  225. package/dest/private_kernel/hints/compute_tx_expiration_timestamp.d.ts +4 -0
  226. package/dest/private_kernel/hints/compute_tx_expiration_timestamp.d.ts.map +1 -0
  227. package/dest/private_kernel/hints/{compute_tx_include_by_timestamp.js → compute_tx_expiration_timestamp.js} +12 -12
  228. package/dest/private_kernel/hints/index.d.ts +1 -1
  229. package/dest/private_kernel/hints/index.js +1 -1
  230. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +4 -3
  231. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -1
  232. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.js +135 -70
  233. package/dest/private_kernel/hints/test_utils.d.ts +122 -0
  234. package/dest/private_kernel/hints/test_utils.d.ts.map +1 -0
  235. package/dest/private_kernel/hints/test_utils.js +202 -0
  236. package/dest/private_kernel/private_kernel_execution_prover.d.ts +6 -2
  237. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  238. package/dest/private_kernel/private_kernel_execution_prover.js +208 -86
  239. package/dest/private_kernel/private_kernel_oracle.d.ts +17 -11
  240. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  241. package/dest/private_kernel/private_kernel_oracle.js +47 -29
  242. package/dest/pxe.d.ts +228 -66
  243. package/dest/pxe.d.ts.map +1 -1
  244. package/dest/pxe.js +435 -235
  245. package/dest/storage/address_store/address_store.d.ts +1 -1
  246. package/dest/storage/address_store/address_store.d.ts.map +1 -1
  247. package/dest/storage/address_store/address_store.js +12 -11
  248. package/dest/storage/allowed_scopes.d.ts +6 -0
  249. package/dest/storage/allowed_scopes.d.ts.map +1 -0
  250. package/dest/storage/allowed_scopes.js +7 -0
  251. package/dest/storage/anchor_block_store/anchor_block_store.d.ts +12 -1
  252. package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
  253. package/dest/storage/anchor_block_store/anchor_block_store.js +12 -3
  254. package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.d.ts +42 -0
  255. package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.d.ts.map +1 -0
  256. package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.js +93 -0
  257. package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts +15 -0
  258. package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts.map +1 -0
  259. package/dest/storage/backwards_compatibility_tests/schema_tests.js +671 -0
  260. package/dest/storage/backwards_compatibility_tests/store_spy.d.ts +19 -0
  261. package/dest/storage/backwards_compatibility_tests/store_spy.d.ts.map +1 -0
  262. package/dest/storage/backwards_compatibility_tests/store_spy.js +63 -0
  263. package/dest/storage/capsule_store/capsule_service.d.ts +21 -0
  264. package/dest/storage/capsule_store/capsule_service.d.ts.map +1 -0
  265. package/dest/storage/capsule_store/capsule_service.js +47 -0
  266. package/dest/storage/capsule_store/capsule_store.d.ts +9 -9
  267. package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
  268. package/dest/storage/capsule_store/capsule_store.js +42 -36
  269. package/dest/storage/capsule_store/index.d.ts +2 -1
  270. package/dest/storage/capsule_store/index.d.ts.map +1 -1
  271. package/dest/storage/capsule_store/index.js +1 -0
  272. package/dest/storage/contract_store/contract_store.d.ts +63 -33
  273. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  274. package/dest/storage/contract_store/contract_store.js +193 -136
  275. package/dest/storage/fact_store/fact_service.d.ts +22 -0
  276. package/dest/storage/fact_store/fact_service.d.ts.map +1 -0
  277. package/dest/storage/fact_store/fact_service.js +45 -0
  278. package/dest/storage/fact_store/fact_store.d.ts +95 -0
  279. package/dest/storage/fact_store/fact_store.d.ts.map +1 -0
  280. package/dest/storage/fact_store/fact_store.js +408 -0
  281. package/dest/storage/fact_store/fact_store_keys.d.ts +34 -0
  282. package/dest/storage/fact_store/fact_store_keys.d.ts.map +1 -0
  283. package/dest/storage/fact_store/fact_store_keys.js +50 -0
  284. package/dest/storage/fact_store/index.d.ts +6 -0
  285. package/dest/storage/fact_store/index.d.ts.map +1 -0
  286. package/dest/storage/fact_store/index.js +4 -0
  287. package/dest/storage/fact_store/origin_state.d.ts +59 -0
  288. package/dest/storage/fact_store/origin_state.d.ts.map +1 -0
  289. package/dest/storage/fact_store/origin_state.js +60 -0
  290. package/dest/storage/fact_store/stored_fact.d.ts +32 -0
  291. package/dest/storage/fact_store/stored_fact.d.ts.map +1 -0
  292. package/dest/storage/fact_store/stored_fact.js +64 -0
  293. package/dest/storage/index.d.ts +3 -2
  294. package/dest/storage/index.d.ts.map +1 -1
  295. package/dest/storage/index.js +2 -1
  296. package/dest/storage/metadata.d.ts +2 -2
  297. package/dest/storage/metadata.d.ts.map +1 -1
  298. package/dest/storage/metadata.js +1 -1
  299. package/dest/storage/note_store/note_store.d.ts +48 -29
  300. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  301. package/dest/storage/note_store/note_store.js +270 -199
  302. package/dest/storage/note_store/stored_note.d.ts +3 -8
  303. package/dest/storage/note_store/stored_note.d.ts.map +1 -1
  304. package/dest/storage/note_store/stored_note.js +4 -20
  305. package/dest/storage/open_pxe_stores.d.ts +35 -0
  306. package/dest/storage/open_pxe_stores.d.ts.map +1 -0
  307. package/dest/storage/open_pxe_stores.js +29 -0
  308. package/dest/storage/private_event_store/private_event_store.d.ts +13 -16
  309. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  310. package/dest/storage/private_event_store/private_event_store.js +144 -119
  311. package/dest/storage/store_identity.d.ts +35 -0
  312. package/dest/storage/store_identity.d.ts.map +1 -0
  313. package/dest/storage/store_identity.js +44 -0
  314. package/dest/storage/tagging_store/index.d.ts +2 -2
  315. package/dest/storage/tagging_store/index.d.ts.map +1 -1
  316. package/dest/storage/tagging_store/index.js +1 -1
  317. package/dest/storage/tagging_store/recipient_tagging_store.d.ts +6 -6
  318. package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
  319. package/dest/storage/tagging_store/recipient_tagging_store.js +31 -19
  320. package/dest/storage/tagging_store/sender_tagging_store.d.ts +63 -31
  321. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  322. package/dest/storage/tagging_store/sender_tagging_store.js +291 -143
  323. package/dest/storage/tagging_store/tagging_secret_sources_store.d.ts +51 -0
  324. package/dest/storage/tagging_store/tagging_secret_sources_store.d.ts.map +1 -0
  325. package/dest/storage/tagging_store/tagging_secret_sources_store.js +105 -0
  326. package/dest/tagging/constants.d.ts +11 -2
  327. package/dest/tagging/constants.d.ts.map +1 -1
  328. package/dest/tagging/constants.js +38 -10
  329. package/dest/tagging/get_all_logs_by_tags.d.ts +55 -10
  330. package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -1
  331. package/dest/tagging/get_all_logs_by_tags.js +64 -32
  332. package/dest/tagging/index.d.ts +8 -7
  333. package/dest/tagging/index.d.ts.map +1 -1
  334. package/dest/tagging/index.js +6 -5
  335. package/dest/tagging/persist_sender_tagging_index_ranges.d.ts +29 -0
  336. package/dest/tagging/persist_sender_tagging_index_ranges.d.ts.map +1 -0
  337. package/dest/tagging/persist_sender_tagging_index_ranges.js +42 -0
  338. package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts +74 -0
  339. package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts.map +1 -0
  340. package/dest/tagging/recipient_sync/sync_tagged_private_logs.js +234 -0
  341. package/dest/tagging/recipient_sync/utils/find_highest_indexes.d.ts +3 -3
  342. package/dest/tagging/recipient_sync/utils/find_highest_indexes.d.ts.map +1 -1
  343. package/dest/tagging/recipient_sync/utils/find_highest_indexes.js +2 -2
  344. package/dest/tagging/reconcile_tagging_index_ranges.d.ts +36 -0
  345. package/dest/tagging/reconcile_tagging_index_ranges.d.ts.map +1 -0
  346. package/dest/tagging/reconcile_tagging_index_ranges.js +74 -0
  347. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +8 -10
  348. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
  349. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +25 -22
  350. package/dest/tagging/sender_sync/utils/classify_pending_txs.d.ts +22 -0
  351. package/dest/tagging/sender_sync/utils/classify_pending_txs.d.ts.map +1 -0
  352. package/dest/tagging/sender_sync/utils/classify_pending_txs.js +61 -0
  353. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +17 -9
  354. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
  355. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +52 -39
  356. package/dest/tagging/sender_sync/utils/resolve_pending_txs.d.ts +29 -0
  357. package/dest/tagging/sender_sync/utils/resolve_pending_txs.d.ts.map +1 -0
  358. package/dest/tagging/sender_sync/utils/resolve_pending_txs.js +41 -0
  359. package/dest/tagging/sender_sync/utils/test_utils.d.ts +16 -0
  360. package/dest/tagging/sender_sync/utils/test_utils.d.ts.map +1 -0
  361. package/dest/tagging/sender_sync/utils/test_utils.js +24 -0
  362. package/dest/tagging/testing/tag_query_test_utils.d.ts +6 -0
  363. package/dest/tagging/testing/tag_query_test_utils.d.ts.map +1 -0
  364. package/dest/tagging/testing/tag_query_test_utils.js +10 -0
  365. package/package.json +29 -17
  366. package/src/bin/check_oracle_version.ts +10 -143
  367. package/src/bin/index.ts +1 -0
  368. package/src/bin/oracle_version_helpers.ts +30 -0
  369. package/src/block_synchronizer/block_stream_source.ts +42 -0
  370. package/src/block_synchronizer/block_synchronizer.ts +90 -38
  371. package/src/config/index.ts +16 -9
  372. package/src/config/package_info.ts +1 -1
  373. package/src/contract/contract_class_service.ts +45 -0
  374. package/src/contract/contract_sync_service.ts +176 -0
  375. package/src/contract/helpers.ts +35 -0
  376. package/src/contract/skip_sync_contracts.ts +23 -0
  377. package/src/contract_function_simulator/anchored_contract_data.ts +74 -0
  378. package/src/contract_function_simulator/contract_function_simulator.ts +465 -177
  379. package/src/contract_function_simulator/ephemeral_array_service.ts +110 -0
  380. package/src/contract_function_simulator/execution_note_cache.ts +8 -29
  381. package/src/contract_function_simulator/execution_tagging_index_cache.ts +19 -18
  382. package/src/contract_function_simulator/index.ts +89 -4
  383. package/src/contract_function_simulator/noir-structs/bounded_vec.ts +43 -0
  384. package/src/contract_function_simulator/noir-structs/contract_class_log_data.ts +9 -0
  385. package/src/contract_function_simulator/noir-structs/embedded_curve_point.ts +4 -0
  386. package/src/contract_function_simulator/noir-structs/ephemeral_array.ts +66 -0
  387. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +10 -9
  388. package/src/contract_function_simulator/noir-structs/fact.ts +13 -0
  389. package/src/contract_function_simulator/noir-structs/fact_collection.ts +64 -0
  390. package/src/contract_function_simulator/noir-structs/log_retrieval_request.ts +27 -20
  391. package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +14 -64
  392. package/src/contract_function_simulator/noir-structs/note_data.ts +27 -0
  393. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +6 -11
  394. package/src/contract_function_simulator/noir-structs/option.ts +75 -0
  395. package/src/contract_function_simulator/noir-structs/origin_block.ts +8 -0
  396. package/src/contract_function_simulator/noir-structs/pending_tagged_log.ts +12 -0
  397. package/src/contract_function_simulator/noir-structs/provided_secret.ts +5 -0
  398. package/src/contract_function_simulator/noir-structs/resolved_tagging_strategy.ts +66 -0
  399. package/src/contract_function_simulator/noir-structs/resolved_tx.ts +19 -0
  400. package/src/contract_function_simulator/noir-structs/tx_effect_data.ts +16 -0
  401. package/src/contract_function_simulator/noir-structs/utility_context.ts +5 -17
  402. package/src/contract_function_simulator/oracle/acir_callback.ts +154 -0
  403. package/src/contract_function_simulator/oracle/index.ts +1 -15
  404. package/src/contract_function_simulator/oracle/interfaces.ts +11 -176
  405. package/src/contract_function_simulator/oracle/legacy_oracle_registry.ts +147 -0
  406. package/src/contract_function_simulator/oracle/message_load_oracle_inputs.ts +6 -21
  407. package/src/contract_function_simulator/oracle/note_packing_utils.ts +3 -3
  408. package/src/contract_function_simulator/oracle/oracle_registry.ts +710 -0
  409. package/src/contract_function_simulator/oracle/oracle_type_mappings.ts +1067 -0
  410. package/src/contract_function_simulator/oracle/private_execution.ts +6 -7
  411. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +323 -217
  412. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +1047 -276
  413. package/src/contract_function_simulator/pick_notes.ts +22 -3
  414. package/src/contract_function_simulator/transient_array_service.ts +91 -0
  415. package/src/contract_logging.ts +52 -0
  416. package/src/debug/pxe_debug_utils.ts +47 -25
  417. package/src/entrypoints/client/bundle/index.ts +3 -0
  418. package/src/entrypoints/client/bundle/utils.ts +43 -9
  419. package/src/entrypoints/client/lazy/index.ts +3 -0
  420. package/src/entrypoints/client/lazy/utils.ts +43 -9
  421. package/src/entrypoints/client/store.ts +54 -0
  422. package/src/entrypoints/pxe_creation_options.ts +21 -1
  423. package/src/entrypoints/server/index.ts +8 -2
  424. package/src/entrypoints/server/store.ts +47 -0
  425. package/src/entrypoints/server/utils.ts +52 -21
  426. package/src/error_enriching.ts +27 -11
  427. package/src/events/event_service.ts +85 -29
  428. package/src/events/private_event_filter_validator.ts +21 -1
  429. package/src/hooks/authorize_utility_call.ts +44 -0
  430. package/src/hooks/execution_hooks.ts +68 -0
  431. package/src/hooks/index.ts +13 -0
  432. package/src/hooks/resolve_custom_request.ts +24 -0
  433. package/src/hooks/resolve_tagging_secret_strategy.ts +60 -0
  434. package/src/logs/log_service.ts +230 -160
  435. package/src/messages/tx_resolver_service.ts +80 -0
  436. package/src/node/benchmarked_node.ts +140 -0
  437. package/src/node/caching_aztec_node.ts +406 -0
  438. package/src/notes/note_service.ts +131 -92
  439. package/src/notes_filter.ts +24 -0
  440. package/src/oracle_version.ts +20 -10
  441. package/src/private_kernel/batch_planner.ts +168 -0
  442. package/src/private_kernel/hints/{compute_tx_include_by_timestamp.ts → compute_tx_expiration_timestamp.ts} +13 -13
  443. package/src/private_kernel/hints/index.ts +1 -1
  444. package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +176 -119
  445. package/src/private_kernel/hints/test_utils.ts +318 -0
  446. package/src/private_kernel/private_kernel_execution_prover.ts +341 -120
  447. package/src/private_kernel/private_kernel_oracle.ts +65 -36
  448. package/src/pxe.ts +728 -309
  449. package/src/storage/address_store/address_store.ts +15 -15
  450. package/src/storage/allowed_scopes.ts +14 -0
  451. package/src/storage/anchor_block_store/anchor_block_store.ts +12 -2
  452. package/src/storage/backwards_compatibility_tests/__snapshots__/AddressStore.json +22 -0
  453. package/src/storage/backwards_compatibility_tests/__snapshots__/AnchorBlockStore.json +3 -0
  454. package/src/storage/backwards_compatibility_tests/__snapshots__/CapsuleStore.json +16 -0
  455. package/src/storage/backwards_compatibility_tests/__snapshots__/ContractStore.json +28 -0
  456. package/src/storage/backwards_compatibility_tests/__snapshots__/FactStore.json +40 -0
  457. package/src/storage/backwards_compatibility_tests/__snapshots__/KeyStore.json +52 -0
  458. package/src/storage/backwards_compatibility_tests/__snapshots__/L2TipsKVStore.json +40 -0
  459. package/src/storage/backwards_compatibility_tests/__snapshots__/NoteStore.json +56 -0
  460. package/src/storage/backwards_compatibility_tests/__snapshots__/PrivateEventStore.json +44 -0
  461. package/src/storage/backwards_compatibility_tests/__snapshots__/RecipientTaggingStore.json +26 -0
  462. package/src/storage/backwards_compatibility_tests/__snapshots__/SenderTaggingStore.json +30 -0
  463. package/src/storage/backwards_compatibility_tests/__snapshots__/TaggingSecretSourcesStore.json +30 -0
  464. package/src/storage/backwards_compatibility_tests/__snapshots__/opened_stores.json +117 -0
  465. package/src/storage/backwards_compatibility_tests/kv_store_snapshot.ts +122 -0
  466. package/src/storage/backwards_compatibility_tests/schema_tests.ts +803 -0
  467. package/src/storage/backwards_compatibility_tests/store_spy.ts +73 -0
  468. package/src/storage/capsule_store/capsule_service.ts +85 -0
  469. package/src/storage/capsule_store/capsule_store.ts +52 -34
  470. package/src/storage/capsule_store/index.ts +1 -0
  471. package/src/storage/contract_store/contract_store.ts +251 -168
  472. package/src/storage/fact_store/fact_service.ts +69 -0
  473. package/src/storage/fact_store/fact_store.ts +487 -0
  474. package/src/storage/fact_store/fact_store_keys.ts +75 -0
  475. package/src/storage/fact_store/index.ts +15 -0
  476. package/src/storage/fact_store/origin_state.ts +84 -0
  477. package/src/storage/fact_store/stored_fact.ts +80 -0
  478. package/src/storage/index.ts +2 -1
  479. package/src/storage/metadata.ts +1 -1
  480. package/src/storage/note_store/note_store.ts +306 -228
  481. package/src/storage/note_store/stored_note.ts +5 -27
  482. package/src/storage/open_pxe_stores.ts +52 -0
  483. package/src/storage/private_event_store/private_event_store.ts +179 -158
  484. package/src/storage/store_identity.ts +72 -0
  485. package/src/storage/tagging_store/index.ts +1 -1
  486. package/src/storage/tagging_store/recipient_tagging_store.ts +34 -24
  487. package/src/storage/tagging_store/sender_tagging_store.ts +366 -163
  488. package/src/storage/tagging_store/tagging_secret_sources_store.ts +138 -0
  489. package/src/tagging/constants.ts +42 -10
  490. package/src/tagging/get_all_logs_by_tags.ts +124 -36
  491. package/src/tagging/index.ts +12 -6
  492. package/src/tagging/persist_sender_tagging_index_ranges.ts +57 -0
  493. package/src/tagging/recipient_sync/sync_tagged_private_logs.ts +355 -0
  494. package/src/tagging/recipient_sync/utils/find_highest_indexes.ts +4 -4
  495. package/src/tagging/reconcile_tagging_index_ranges.ts +102 -0
  496. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +32 -27
  497. package/src/tagging/sender_sync/utils/classify_pending_txs.ts +91 -0
  498. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +55 -49
  499. package/src/tagging/sender_sync/utils/resolve_pending_txs.ts +64 -0
  500. package/src/tagging/sender_sync/utils/test_utils.ts +46 -0
  501. package/src/tagging/testing/tag_query_test_utils.ts +11 -0
  502. package/dest/contract_function_simulator/benchmarked_node.d.ts +0 -9
  503. package/dest/contract_function_simulator/benchmarked_node.d.ts.map +0 -1
  504. package/dest/contract_function_simulator/benchmarked_node.js +0 -77
  505. package/dest/contract_function_simulator/oracle/oracle.d.ts +0 -60
  506. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +0 -1
  507. package/dest/contract_function_simulator/oracle/oracle.js +0 -356
  508. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts +0 -6
  509. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts.map +0 -1
  510. package/dest/contract_function_simulator/proxied_contract_data_source.js +0 -80
  511. package/dest/contract_sync/index.d.ts +0 -23
  512. package/dest/contract_sync/index.d.ts.map +0 -1
  513. package/dest/contract_sync/index.js +0 -54
  514. package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts +0 -4
  515. package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts.map +0 -1
  516. package/dest/storage/tagging_store/sender_address_book_store.d.ts +0 -14
  517. package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +0 -1
  518. package/dest/storage/tagging_store/sender_address_book_store.js +0 -30
  519. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +0 -15
  520. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +0 -1
  521. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +0 -99
  522. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +0 -15
  523. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +0 -1
  524. package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +0 -32
  525. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +0 -11
  526. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +0 -1
  527. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +0 -29
  528. package/src/contract_function_simulator/benchmarked_node.ts +0 -103
  529. package/src/contract_function_simulator/oracle/oracle.ts +0 -620
  530. package/src/contract_function_simulator/proxied_contract_data_source.ts +0 -83
  531. package/src/contract_sync/index.ts +0 -98
  532. package/src/storage/tagging_store/sender_address_book_store.ts +0 -42
  533. package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +0 -143
  534. package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +0 -49
  535. package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +0 -36
@@ -0,0 +1,267 @@
1
+ import { BlockHash } from '@aztec/stdlib/block';
2
+ import { withRecording } from './benchmarked_node.js';
3
+ /**
4
+ * Wraps `node`, serving repeated reads from a cache the wrapper owns. Consumers share cached reads by sharing the
5
+ * wrapper.
6
+ *
7
+ * Only hash-pinned reads are cached. A block hash names immutable content, so the same call can never correctly answer
8
+ * differently, and even an `undefined` witness or leaf index is kept as a non-membership fact. That makes the wrapper
9
+ * safe for any consumer, whatever its anchor block. Uncached methods, and reads that name a block any other way (see
10
+ * {@link hashReferenceOf}), pass straight through. A few entries below opt out even when hash-pinned, where the answer
11
+ * can still change, and the tag queries opt in only once the request also stops short of blocks yet to be produced
12
+ * (see {@link hasImmutableAnswer}).
13
+ *
14
+ * Wiping (see {@link CachingAztecNode.wipeCache}) bounds memory. Correctness does not depend on it.
15
+ */ export function withCache(node) {
16
+ const cache = new AztecNodeCache();
17
+ // The recording wrapper sits below the cache, so a recording sees only the reads the node answered: a read served
18
+ // from the cache appears nowhere in it. Every read below goes to `source` rather than to `node`, and
19
+ // `startRecording` passes through this wrapper untouched.
20
+ const source = withRecording(node);
21
+ /** Runs `read` through `cache` when `block` pins a chain position by hash. Everything else goes to the node. */ const readCachedIfBlockIsHashPinned = (block, key, read, options)=>{
22
+ const blockHash = hashReferenceOf(block);
23
+ return blockHash === undefined ? read() : cache.fetch(key(blockHash.toString()), read, options);
24
+ };
25
+ const cachedReads = {
26
+ getBlock: (block, options)=>{
27
+ if (options?.includeL1PublishInfo || options?.includeAttestations) {
28
+ // These payloads keep changing after a block is fixed (its L1 publication status, its incoming committee
29
+ // attestations), so a repeat can correctly differ; read straight from the node.
30
+ return source.getBlock(block, options);
31
+ }
32
+ return readCachedIfBlockIsHashPinned(block, (blockHash)=>`block:${blockHash}:${keyPart(options)}`, ()=>source.getBlock(block, options), {
33
+ // PXE only asks for pinned blocks it has already observed, so an undefined answer means the node has not
34
+ // served the block yet, not that it never will.
35
+ shouldCache: (response)=>response !== undefined
36
+ });
37
+ },
38
+ getContract: (address, referenceBlock)=>readCachedIfBlockIsHashPinned(referenceBlock, (blockHash)=>`contract:${blockHash}:${address.toString()}`, ()=>source.getContract(address, referenceBlock)),
39
+ getBlockHashMembershipWitness: (referenceBlock, blockHash)=>readCachedIfBlockIsHashPinned(referenceBlock, (referenceHash)=>`block-hash-membership-witness:${referenceHash}:${blockHash.toString()}`, ()=>source.getBlockHashMembershipWitness(referenceBlock, blockHash)),
40
+ getPublicDataWitness: (referenceBlock, leafSlot)=>readCachedIfBlockIsHashPinned(referenceBlock, (blockHash)=>`public-data-witness:${blockHash}:${leafSlot.toString()}`, ()=>source.getPublicDataWitness(referenceBlock, leafSlot)),
41
+ getNoteHashMembershipWitness: (referenceBlock, noteHash)=>readCachedIfBlockIsHashPinned(referenceBlock, (blockHash)=>`note-hash-membership-witness:${blockHash}:${noteHash.toString()}`, ()=>source.getNoteHashMembershipWitness(referenceBlock, noteHash)),
42
+ getNullifierMembershipWitness: (referenceBlock, nullifier)=>readCachedIfBlockIsHashPinned(referenceBlock, (blockHash)=>`nullifier-membership-witness:${blockHash}:${nullifier.toString()}`, ()=>source.getNullifierMembershipWitness(referenceBlock, nullifier)),
43
+ getLowNullifierMembershipWitness: (referenceBlock, nullifier)=>readCachedIfBlockIsHashPinned(referenceBlock, (blockHash)=>`low-nullifier-membership-witness:${blockHash}:${nullifier.toString()}`, ()=>source.getLowNullifierMembershipWitness(referenceBlock, nullifier)),
44
+ getL1ToL2MessageMembershipWitness: (referenceBlock, l1ToL2Message)=>readCachedIfBlockIsHashPinned(referenceBlock, (blockHash)=>`l1-to-l2-message-membership-witness:${blockHash}:${l1ToL2Message.toString()}`, ()=>source.getL1ToL2MessageMembershipWitness(referenceBlock, l1ToL2Message)),
45
+ getPublicStorageAt: (referenceBlock, contractAddress, storageSlot)=>readCachedIfBlockIsHashPinned(referenceBlock, (blockHash)=>`public-storage:${blockHash}:${contractAddress.toString()}:${storageSlot.toString()}`, ()=>source.getPublicStorageAt(referenceBlock, contractAddress, storageSlot)),
46
+ findLeavesIndexes: (referenceBlock, treeId, leafValues)=>{
47
+ // Cached per leaf: only leaves without a cached result are fetched, in a single batched node call. The per-leaf
48
+ // keys don't fit single-key readCachedIfBlockIsHashPinned, so the hash gate is inline.
49
+ const referenceHash = hashReferenceOf(referenceBlock);
50
+ if (referenceHash === undefined) {
51
+ return source.findLeavesIndexes(referenceBlock, treeId, leafValues);
52
+ }
53
+ return readBatchedPerKey(cache, leafValues.map((leaf)=>`leaf-index:${referenceHash.toString()}:${treeId}:${leaf.toString()}`), (missing)=>source.findLeavesIndexes(referenceBlock, treeId, missing.map((i)=>leafValues[i])), {
54
+ method: 'findLeavesIndexes',
55
+ requested: 'leaves'
56
+ });
57
+ },
58
+ getPrivateLogsByTags: (query)=>{
59
+ if (!hasImmutableAnswer(query)) {
60
+ return source.getPrivateLogsByTags(query);
61
+ }
62
+ const keyPrefix = `private-logs:${privateLogsQueryKey(query)}`;
63
+ return readBatchedPerKey(cache, query.tags.map((tag)=>`${keyPrefix}:${tagQueryKey(tag)}`), (missing)=>source.getPrivateLogsByTags({
64
+ ...query,
65
+ tags: missing.map((i)=>query.tags[i])
66
+ }), {
67
+ method: 'getPrivateLogsByTags',
68
+ requested: 'tags'
69
+ });
70
+ },
71
+ getPublicLogsByTags: (query)=>{
72
+ if (!hasImmutableAnswer(query)) {
73
+ return source.getPublicLogsByTags(query);
74
+ }
75
+ const keyPrefix = `public-logs:${publicLogsQueryKey(query)}`;
76
+ return readBatchedPerKey(cache, query.tags.map((tag)=>`${keyPrefix}:${tagQueryKey(tag)}`), (missing)=>source.getPublicLogsByTags({
77
+ ...query,
78
+ tags: missing.map((i)=>query.tags[i])
79
+ }), {
80
+ method: 'getPublicLogsByTags',
81
+ requested: 'tags'
82
+ });
83
+ }
84
+ };
85
+ return new Proxy(source, {
86
+ get (target, prop) {
87
+ if (prop === 'wipeCache') {
88
+ return ()=>cache.wipe();
89
+ }
90
+ if (Object.hasOwn(cachedReads, prop)) {
91
+ return cachedReads[prop];
92
+ }
93
+ const value = Reflect.get(target, prop);
94
+ return typeof value === 'function' ? value.bind(target) : value;
95
+ }
96
+ });
97
+ }
98
+ /**
99
+ * Store of node read promises keyed by method and arguments.
100
+ *
101
+ * Holds no node reference of its own: it only memoizes promises handed to it by the {@link withCache} wrapper that
102
+ * owns it. Rejected promises are evicted so callers can retry. A settled value is kept unless the caller's
103
+ * `shouldCache` turns it away.
104
+ */ class AztecNodeCache {
105
+ cache = new Map();
106
+ /**
107
+ * Returns the cached promise for `key`, or runs `read` and caches the in-flight promise.
108
+ *
109
+ * `shouldCache` runs once the promise settles and answers whether its value is kept. Every settled value is kept by
110
+ * default. Callers waiting on a value that is then turned away still share the one in-flight read, so declining to
111
+ * keep a value costs nothing on concurrent reads.
112
+ */ fetch(key, read, { shouldCache } = {}) {
113
+ return this.#get(key) ?? this.#set(key, read(), shouldCache);
114
+ }
115
+ /**
116
+ * The cached promise for each of `keys`, `undefined` where there is none. For callers that batch their own misses
117
+ * rather than reading one key.
118
+ */ peekAll(keys) {
119
+ return keys.map((key)=>this.#get(key));
120
+ }
121
+ /**
122
+ * Clears the store.
123
+ */ wipe() {
124
+ this.cache.clear();
125
+ }
126
+ #get(key) {
127
+ return this.cache.get(key);
128
+ }
129
+ #set(key, promise, shouldCache) {
130
+ const evict = ()=>{
131
+ if (this.cache.get(key) === promise) {
132
+ this.cache.delete(key);
133
+ }
134
+ };
135
+ // A rejected read is evicted so callers can retry; a `shouldCache` that throws is treated the same way. The
136
+ // trailing catch keeps a throwing predicate from surfacing as an unhandled rejection on this detached promise.
137
+ promise.then((value)=>{
138
+ if (shouldCache && !shouldCache(value)) {
139
+ evict();
140
+ }
141
+ }, evict).catch(evict);
142
+ this.cache.set(key, promise);
143
+ return promise;
144
+ }
145
+ }
146
+ /**
147
+ * The block hash `block` pins to (a `BlockHash` or `{ hash }` reference), or `undefined` for every other way of naming
148
+ * a block.
149
+ *
150
+ * A number or a tag names a moving chain position, as does naming no block at all: a reorg can put a different block
151
+ * at the same number, and tags follow the growing chain. An `{ archive }` root is different, since it commits to every
152
+ * block hash up to its own block and so pins content as tightly as a hash. It stays uncached because no PXE read uses
153
+ * one: keeping an `undefined` answer as a non-membership fact is only sound because PXE pins blocks it has already
154
+ * seen, and that holds for the references PXE actually builds.
155
+ */ function hashReferenceOf(block) {
156
+ if (block instanceof BlockHash) {
157
+ return block;
158
+ }
159
+ if (typeof block === 'object' && block !== null && 'hash' in block) {
160
+ return block.hash;
161
+ }
162
+ return undefined;
163
+ }
164
+ /**
165
+ * Answers one result per entry of `keys`, taking whatever the cache already holds and fetching the rest in a single
166
+ * batched call. Each fetched result is cached under its own key, so a later call that overlaps this one fetches only
167
+ * the entries it has not seen, and a key repeated within `keys` is asked of the node once.
168
+ *
169
+ * `fetchMissing` receives the indexes still missing, in order, and must answer one result per requested index.
170
+ * `shortResponse` names the method and what it requests, for the error raised when it does not.
171
+ */ function readBatchedPerKey(cache, keys, fetchMissing, shortResponse) {
172
+ const cached = cache.peekAll(keys);
173
+ // One request per missing key rather than per missing position, so a key repeated in `keys` seeds a single entry
174
+ // that every position carrying it then reads.
175
+ const requestIndexByKey = new Map();
176
+ cached.forEach((result, index)=>{
177
+ if (result === undefined && !requestIndexByKey.has(keys[index])) {
178
+ requestIndexByKey.set(keys[index], index);
179
+ }
180
+ });
181
+ const fetchedByKey = new Map();
182
+ if (requestIndexByKey.size > 0) {
183
+ const requestedIndexes = [
184
+ ...requestIndexByKey.values()
185
+ ];
186
+ const batch = fetchMissing(requestedIndexes).then((fetched)=>{
187
+ if (fetched.length !== requestedIndexes.length) {
188
+ // Each entry is filled from the batch response by position. If the node returned fewer results than we asked
189
+ // for, the positions past the end would read undefined, which the cache keeps as a genuine answer, so a
190
+ // truncated response would be cached as fact. Rejecting the whole batch evicts those entries instead, so a
191
+ // retry re-fetches every one of them.
192
+ throw new Error(`${shortResponse.method} returned ${fetched.length} results for ${requestedIndexes.length} requested ` + `${shortResponse.requested}`);
193
+ }
194
+ return fetched;
195
+ });
196
+ [
197
+ ...requestIndexByKey.keys()
198
+ ].forEach((key, batchIndex)=>{
199
+ fetchedByKey.set(key, cache.fetch(key, ()=>batch.then((fetched)=>fetched[batchIndex])));
200
+ });
201
+ }
202
+ // Every position is answered: a cache hit, or the entry its key's request seeded just above.
203
+ return Promise.all(keys.map((key, index)=>cached[index] ?? fetchedByKey.get(key)));
204
+ }
205
+ /**
206
+ * Whether a tag query's answer can no longer change, and so can be cached.
207
+ *
208
+ * Two things would let it change, and the query has to rule out both. `referenceBlock` names the chain the answer
209
+ * belongs to, so the call fails once that block is gone rather than answering from a chain that reorged. `toBlock`
210
+ * stops the query below the tip, so blocks yet to be produced cannot add logs to the answer. Where the query starts
211
+ * does not matter: an open lower end reaches only blocks that are already behind it, which no longer move. PXE's tag
212
+ * queries get both from the `getAll*LogsByTags` helpers, which take them from the anchor block the query is pinned to.
213
+ */ function hasImmutableAnswer(query) {
214
+ return query.referenceBlock !== undefined && query.toBlock !== undefined;
215
+ }
216
+ /** Cache-key segment for the parts of a private tag query that every tag in it shares. */ function privateLogsQueryKey(query) {
217
+ const parts = {
218
+ ...sharedQueryKeyParts(query)
219
+ };
220
+ return Object.values(parts).map(keyPart).join(':');
221
+ }
222
+ /** Cache-key segment for the parts of a public tag query that every tag in it shares. */ function publicLogsQueryKey(query) {
223
+ const parts = {
224
+ ...sharedQueryKeyParts(query),
225
+ contractAddress: query.contractAddress
226
+ };
227
+ return Object.values(parts).map(keyPart).join(':');
228
+ }
229
+ /** The key parts {@link PrivateLogsQuery} and {@link PublicLogsQuery} have in common. */ function sharedQueryKeyParts(query) {
230
+ return {
231
+ referenceBlock: query.referenceBlock,
232
+ fromBlock: query.fromBlock,
233
+ toBlock: query.toBlock,
234
+ txHash: query.txHash,
235
+ includeEffects: query.includeEffects,
236
+ limitPerTag: query.limitPerTag
237
+ };
238
+ }
239
+ /**
240
+ * Cache-key segment for one tag entry, covering the pagination cursor as well as the tag: each page of a tag's stream
241
+ * is a read of its own, and a repeated query asks for the same pages in the same order.
242
+ */ function tagQueryKey(entry) {
243
+ return 'tag' in entry ? `${keyPart(entry.tag)}@${keyPart(entry.afterLog)}` : keyPart(entry);
244
+ }
245
+ /**
246
+ * Renders a call argument as a stable cache-key segment, via its own `toString` when it has one, else as JSON.
247
+ *
248
+ * Example: the options object `{ includeTransactions: true }` renders as `'{"includeTransactions":true}'`, and an
249
+ * absent optional argument as `'undefined'`.
250
+ */ function keyPart(value) {
251
+ if ([
252
+ 'string',
253
+ 'number',
254
+ 'bigint',
255
+ 'boolean'
256
+ ].includes(typeof value)) {
257
+ return String(value);
258
+ }
259
+ if (value && typeof value === 'object') {
260
+ const toString = value.toString;
261
+ if (toString && toString !== Object.prototype.toString) {
262
+ return toString.call(value);
263
+ }
264
+ return JSON.stringify(value, (_key, nested)=>typeof nested === 'bigint' ? nested.toString() : nested);
265
+ }
266
+ return String(value);
267
+ }
@@ -1,16 +1,18 @@
1
1
  import { Fr } from '@aztec/foundation/curves/bn254';
2
2
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
3
+ import { type InBlock } from '@aztec/stdlib/block';
3
4
  import { type AztecNode } from '@aztec/stdlib/interfaces/client';
4
5
  import { Note, NoteStatus } from '@aztec/stdlib/note';
5
- import type { TxHash } from '@aztec/stdlib/tx';
6
- import type { AnchorBlockStore } from '../storage/anchor_block_store/anchor_block_store.js';
6
+ import type { BlockHeader } from '@aztec/stdlib/tx';
7
+ import type { NoteValidationRequest } from '../contract_function_simulator/noir-structs/note_validation_request.js';
7
8
  import type { NoteStore } from '../storage/note_store/note_store.js';
8
9
  export declare class NoteService {
10
+ #private;
9
11
  private readonly noteStore;
10
12
  private readonly aztecNode;
11
- private readonly anchorBlockStore;
13
+ private readonly anchorBlockHeader;
12
14
  private readonly jobId;
13
- constructor(noteStore: NoteStore, aztecNode: AztecNode, anchorBlockStore: AnchorBlockStore, jobId: string);
15
+ constructor(noteStore: NoteStore, aztecNode: AztecNode, anchorBlockHeader: BlockHeader, jobId: string);
14
16
  /**
15
17
  * Retrieves a set of notes stored in the database for a given contract address and storage slot.
16
18
  * The query result is paginated using 'limit' and 'offset' values.
@@ -18,9 +20,9 @@ export declare class NoteService {
18
20
  *
19
21
  * @param owner - The owner of the notes. If undefined, returns notes for all known owners.
20
22
  * @param status - The status of notes to fetch.
21
- * @param scopes - The accounts whose notes we can access in this call. Currently optional and will default to all.
23
+ * @param scopes - The accounts whose notes we can access in this call. An empty list matches no notes.
22
24
  */
23
- getNotes(contractAddress: AztecAddress, owner: AztecAddress | undefined, storageSlot: Fr, status: NoteStatus, scopes?: AztecAddress[]): Promise<{
25
+ getNotes(contractAddress: AztecAddress, owner: AztecAddress | undefined, storageSlot: Fr, status: NoteStatus, scopes: AztecAddress[]): Promise<{
24
26
  contractAddress: AztecAddress;
25
27
  owner: AztecAddress;
26
28
  storageSlot: Fr;
@@ -43,7 +45,32 @@ export declare class NoteService {
43
45
  *
44
46
  * @param contractAddress - The contract whose notes should be checked and nullified.
45
47
  */
46
- syncNoteNullifiers(contractAddress: AztecAddress): Promise<void>;
47
- validateAndStoreNote(contractAddress: AztecAddress, owner: AztecAddress, storageSlot: Fr, randomness: Fr, noteNonce: Fr, content: Fr[], noteHash: Fr, nullifier: Fr, txHash: TxHash, recipient: AztecAddress): Promise<void>;
48
+ syncNoteNullifiers(contractAddress: AztecAddress, scopes: AztecAddress[]): Promise<void>;
49
+ /**
50
+ * Validates and stores a batch of notes against the pre-fetched onchain context of their txs.
51
+ *
52
+ * For each request we must verify that:
53
+ * - the note actually exists in the corresponding tx effect (and thus in the note hash tree), and
54
+ * - the note has not already been nullified.
55
+ *
56
+ * Failing to do either would result in circuits getting either non-existent notes and failing to produce inclusion
57
+ * proofs for them, or getting nullified notes and producing duplicate nullifiers, both of which are catastrophic
58
+ * failure modes.
59
+ *
60
+ * Note that adding a note and removing it is *not* equivalent to never adding it in the first place. A nullifier
61
+ * emitted in a block that comes after note creation might result in the note being de-nullified by a chain reorg,
62
+ * so we must store both the note hash and nullifier block information.
63
+ *
64
+ * @param requests - The notes to validate and store.
65
+ * @param scope - The scope under which the notes are being stored.
66
+ * @param validationTxData - The onchain context of each request's tx, keyed by `TxHash.toString()`. Must contain
67
+ * entries for every request's txHash; missing entries are treated as a node bug and cause an error.
68
+ */
69
+ validateAndStoreNotes(requests: NoteValidationRequest[], scope: AztecAddress, validationTxData: ReadonlyMap<string, NoteValidationTxData>): Promise<void>;
48
70
  }
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90ZV9zZXJ2aWNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbm90ZXMvbm90ZV9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUdoRSxPQUFPLEVBQUUsS0FBSyxTQUFTLEVBQWUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsSUFBSSxFQUFXLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRS9ELE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRS9DLE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDNUYsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFckUscUJBQWEsV0FBVztJQUVwQixPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVM7SUFDMUIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTO0lBQzFCLE9BQU8sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCO0lBQ2pDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSztJQUp4QixZQUNtQixTQUFTLEVBQUUsU0FBUyxFQUNwQixTQUFTLEVBQUUsU0FBUyxFQUNwQixnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFDbEMsS0FBSyxFQUFFLE1BQU0sRUFDNUI7SUFFSjs7Ozs7Ozs7T0FRRztJQUNVLFFBQVEsQ0FDbkIsZUFBZSxFQUFFLFlBQVksRUFDN0IsS0FBSyxFQUFFLFlBQVksR0FBRyxTQUFTLEVBQy9CLFdBQVcsRUFBRSxFQUFFLEVBQ2YsTUFBTSxFQUFFLFVBQVUsRUFDbEIsTUFBTSxDQUFDLEVBQUUsWUFBWSxFQUFFOzs7Ozs7Ozs7O1NBeUJ4QjtJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ1Usa0JBQWtCLENBQUMsZUFBZSxFQUFFLFlBQVksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBc0M1RTtJQUVZLG9CQUFvQixDQUMvQixlQUFlLEVBQUUsWUFBWSxFQUM3QixLQUFLLEVBQUUsWUFBWSxFQUNuQixXQUFXLEVBQUUsRUFBRSxFQUNmLFVBQVUsRUFBRSxFQUFFLEVBQ2QsU0FBUyxFQUFFLEVBQUUsRUFDYixPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQ2IsUUFBUSxFQUFFLEVBQUUsRUFDWixTQUFTLEVBQUUsRUFBRSxFQUNiLE1BQU0sRUFBRSxNQUFNLEVBQ2QsU0FBUyxFQUFFLFlBQVksR0FDdEIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQXVFZjtDQUNGIn0=
71
+ /** The onchain context of the tx a note validation request points at: where it was mined and its note hashes. */
72
+ export type NoteValidationTxData = InBlock & {
73
+ noteHashes: Fr[];
74
+ txIndexInBlock: number;
75
+ };
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90ZV9zZXJ2aWNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbm90ZXMvbm90ZV9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEVBQStCLEtBQUssT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFaEYsT0FBTyxFQUFFLEtBQUssU0FBUyxFQUFlLE1BQU0saUNBQWlDLENBQUM7QUFDOUUsT0FBTyxFQUFFLElBQUksRUFBVyxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUUvRCxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVwRCxPQUFPLEtBQUssRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHdFQUF3RSxDQUFDO0FBQ3BILE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRXJFLHFCQUFhLFdBQVc7O0lBRXBCLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUztJQUMxQixPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVM7SUFDMUIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUI7SUFDbEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLO0lBSnhCLFlBQ21CLFNBQVMsRUFBRSxTQUFTLEVBQ3BCLFNBQVMsRUFBRSxTQUFTLEVBQ3BCLGlCQUFpQixFQUFFLFdBQVcsRUFDOUIsS0FBSyxFQUFFLE1BQU0sRUFDNUI7SUFFSjs7Ozs7Ozs7T0FRRztJQUNVLFFBQVEsQ0FDbkIsZUFBZSxFQUFFLFlBQVksRUFDN0IsS0FBSyxFQUFFLFlBQVksR0FBRyxTQUFTLEVBQy9CLFdBQVcsRUFBRSxFQUFFLEVBQ2YsTUFBTSxFQUFFLFVBQVUsRUFDbEIsTUFBTSxFQUFFLFlBQVksRUFBRTs7Ozs7Ozs7OztTQXlCdkI7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNVLGtCQUFrQixDQUFDLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FxQnBHO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FtQkc7SUFDVSxxQkFBcUIsQ0FDaEMsUUFBUSxFQUFFLHFCQUFxQixFQUFFLEVBQ2pDLEtBQUssRUFBRSxZQUFZLEVBQ25CLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxNQUFNLEVBQUUsb0JBQW9CLENBQUMsR0FDMUQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQWtHZjtDQVVGO0FBRUQsaUhBQWlIO0FBQ2pILE1BQU0sTUFBTSxvQkFBb0IsR0FBRyxPQUFPLEdBQUc7SUFDM0MsVUFBVSxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ2pCLGNBQWMsRUFBRSxNQUFNLENBQUM7Q0FDeEIsQ0FBQyJ9
@@ -1 +1 @@
1
- {"version":3,"file":"note_service.d.ts","sourceRoot":"","sources":["../../src/notes/note_service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAGhE,OAAO,EAAE,KAAK,SAAS,EAAe,MAAM,iCAAiC,CAAC;AAC9E,OAAO,EAAE,IAAI,EAAW,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAE/D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qDAAqD,CAAC;AAC5F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAErE,qBAAa,WAAW;IAEpB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJxB,YACmB,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,EACpB,gBAAgB,EAAE,gBAAgB,EAClC,KAAK,EAAE,MAAM,EAC5B;IAEJ;;;;;;;;OAQG;IACU,QAAQ,CACnB,eAAe,EAAE,YAAY,EAC7B,KAAK,EAAE,YAAY,GAAG,SAAS,EAC/B,WAAW,EAAE,EAAE,EACf,MAAM,EAAE,UAAU,EAClB,MAAM,CAAC,EAAE,YAAY,EAAE;;;;;;;;;;SAyBxB;IAED;;;;;;;;;;;OAWG;IACU,kBAAkB,CAAC,eAAe,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAsC5E;IAEY,oBAAoB,CAC/B,eAAe,EAAE,YAAY,EAC7B,KAAK,EAAE,YAAY,EACnB,WAAW,EAAE,EAAE,EACf,UAAU,EAAE,EAAE,EACd,SAAS,EAAE,EAAE,EACb,OAAO,EAAE,EAAE,EAAE,EACb,QAAQ,EAAE,EAAE,EACZ,SAAS,EAAE,EAAE,EACb,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,YAAY,GACtB,OAAO,CAAC,IAAI,CAAC,CAuEf;CACF"}
1
+ {"version":3,"file":"note_service.d.ts","sourceRoot":"","sources":["../../src/notes/note_service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAA+B,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEhF,OAAO,EAAE,KAAK,SAAS,EAAe,MAAM,iCAAiC,CAAC;AAC9E,OAAO,EAAE,IAAI,EAAW,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAE/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wEAAwE,CAAC;AACpH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAErE,qBAAa,WAAW;;IAEpB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJxB,YACmB,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,EACpB,iBAAiB,EAAE,WAAW,EAC9B,KAAK,EAAE,MAAM,EAC5B;IAEJ;;;;;;;;OAQG;IACU,QAAQ,CACnB,eAAe,EAAE,YAAY,EAC7B,KAAK,EAAE,YAAY,GAAG,SAAS,EAC/B,WAAW,EAAE,EAAE,EACf,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,YAAY,EAAE;;;;;;;;;;SAyBvB;IAED;;;;;;;;;;;OAWG;IACU,kBAAkB,CAAC,eAAe,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBpG;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACU,qBAAqB,CAChC,QAAQ,EAAE,qBAAqB,EAAE,EACjC,KAAK,EAAE,YAAY,EACnB,gBAAgB,EAAE,WAAW,CAAC,MAAM,EAAE,oBAAoB,CAAC,GAC1D,OAAO,CAAC,IAAI,CAAC,CAkGf;CAUF;AAED,iHAAiH;AACjH,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG;IAC3C,UAAU,EAAE,EAAE,EAAE,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { chunk } from '@aztec/foundation/collection';
1
2
  import { computeUniqueNoteHash, siloNoteHash, siloNullifier } from '@aztec/stdlib/hash';
2
3
  import { MAX_RPC_LEN } from '@aztec/stdlib/interfaces/client';
3
4
  import { Note, NoteDao } from '@aztec/stdlib/note';
@@ -5,12 +6,12 @@ import { MerkleTreeId } from '@aztec/stdlib/trees';
5
6
  export class NoteService {
6
7
  noteStore;
7
8
  aztecNode;
8
- anchorBlockStore;
9
+ anchorBlockHeader;
9
10
  jobId;
10
- constructor(noteStore, aztecNode, anchorBlockStore, jobId){
11
+ constructor(noteStore, aztecNode, anchorBlockHeader, jobId){
11
12
  this.noteStore = noteStore;
12
13
  this.aztecNode = aztecNode;
13
- this.anchorBlockStore = anchorBlockStore;
14
+ this.anchorBlockHeader = anchorBlockHeader;
14
15
  this.jobId = jobId;
15
16
  }
16
17
  /**
@@ -20,7 +21,7 @@ export class NoteService {
20
21
  *
21
22
  * @param owner - The owner of the notes. If undefined, returns notes for all known owners.
22
23
  * @param status - The status of notes to fetch.
23
- * @param scopes - The accounts whose notes we can access in this call. Currently optional and will default to all.
24
+ * @param scopes - The accounts whose notes we can access in this call. An empty list matches no notes.
24
25
  */ async getNotes(contractAddress, owner, storageSlot, status, scopes) {
25
26
  const noteDaos = await this.noteStore.getNotes({
26
27
  contractAddress,
@@ -52,28 +53,17 @@ export class NoteService {
52
53
  * This allows recent nullifications to be processed even if the node is not an archive node.
53
54
  *
54
55
  * @param contractAddress - The contract whose notes should be checked and nullified.
55
- */ async syncNoteNullifiers(contractAddress) {
56
- const anchorBlockHash = await (await this.anchorBlockStore.getBlockHeader()).hash();
56
+ */ async syncNoteNullifiers(contractAddress, scopes) {
57
+ const anchorBlockHash = await this.anchorBlockHeader.hash();
57
58
  const contractNotes = await this.noteStore.getNotes({
58
- contractAddress
59
+ contractAddress,
60
+ scopes
59
61
  }, this.jobId);
60
62
  if (contractNotes.length === 0) {
61
63
  return;
62
64
  }
63
65
  const nullifiersToCheck = contractNotes.map((note)=>note.siloedNullifier);
64
- const nullifierBatches = nullifiersToCheck.reduce((acc, nullifier)=>{
65
- if (acc[acc.length - 1].length < MAX_RPC_LEN) {
66
- acc[acc.length - 1].push(nullifier);
67
- } else {
68
- acc.push([
69
- nullifier
70
- ]);
71
- }
72
- return acc;
73
- }, [
74
- []
75
- ]);
76
- const nullifierIndexes = (await Promise.all(nullifierBatches.map((batch)=>this.aztecNode.findLeavesIndexes(anchorBlockHash, MerkleTreeId.NULLIFIER_TREE, batch)))).flat();
66
+ const nullifierIndexes = await this.#findNullifierIndexes(anchorBlockHash, nullifiersToCheck);
77
67
  const foundNullifiers = nullifiersToCheck.map((nullifier, i)=>{
78
68
  if (nullifierIndexes[i] !== undefined) {
79
69
  return {
@@ -86,63 +76,97 @@ export class NoteService {
86
76
  }).filter((nullifier)=>nullifier !== undefined);
87
77
  await this.noteStore.applyNullifiers(foundNullifiers, this.jobId);
88
78
  }
89
- async validateAndStoreNote(contractAddress, owner, storageSlot, randomness, noteNonce, content, noteHash, nullifier, txHash, recipient) {
90
- // We are going to store the new note in the NoteStore, which will let us later return it via `getNotes`.
91
- // There's two things we need to check before we do this however:
92
- // - we must make sure the note does actually exist in the note hash tree
93
- // - we need to check if the note has already been nullified
94
- //
95
- // Failing to do either of the above would result in circuits getting either non-existent notes and failing to
96
- // produce inclusion proofs for them, or getting nullified notes and producing duplicate nullifiers, both of which
97
- // are catastrophic failure modes.
98
- //
99
- // Note that adding a note and removing it is *not* equivalent to never adding it in the first place. A nullifier
100
- // emitted in a block that comes after note creation might result in the note being de-nullified by a chain reorg,
101
- // so we must store both the note hash and nullifier block information.
79
+ /**
80
+ * Validates and stores a batch of notes against the pre-fetched onchain context of their txs.
81
+ *
82
+ * For each request we must verify that:
83
+ * - the note actually exists in the corresponding tx effect (and thus in the note hash tree), and
84
+ * - the note has not already been nullified.
85
+ *
86
+ * Failing to do either would result in circuits getting either non-existent notes and failing to produce inclusion
87
+ * proofs for them, or getting nullified notes and producing duplicate nullifiers, both of which are catastrophic
88
+ * failure modes.
89
+ *
90
+ * Note that adding a note and removing it is *not* equivalent to never adding it in the first place. A nullifier
91
+ * emitted in a block that comes after note creation might result in the note being de-nullified by a chain reorg,
92
+ * so we must store both the note hash and nullifier block information.
93
+ *
94
+ * @param requests - The notes to validate and store.
95
+ * @param scope - The scope under which the notes are being stored.
96
+ * @param validationTxData - The onchain context of each request's tx, keyed by `TxHash.toString()`. Must contain
97
+ * entries for every request's txHash; missing entries are treated as a node bug and cause an error.
98
+ */ async validateAndStoreNotes(requests, scope, validationTxData) {
99
+ if (requests.length === 0) {
100
+ return;
101
+ }
102
102
  // We avoid making node queries at 'latest' since we don't want to process notes or nullifiers that only exist ahead
103
103
  // in time of the locally synced state.
104
104
  // Note that while this technically results in historical queries, we perform it at the latest locally synced block
105
105
  // number which *should* be recent enough to be available, even for non-archive nodes.
106
106
  // Also note that the note should never be ahead of the synced block here since `fetchTaggedLogs` only processes
107
107
  // logs up to the synced block making this only an additional safety check.
108
- const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
109
- const anchorBlockNumber = anchorBlockHeader.getBlockNumber();
110
- const anchorBlockHash = await anchorBlockHeader.hash();
108
+ const anchorBlockNumber = this.anchorBlockHeader.getBlockNumber();
109
+ const anchorBlockHash = await this.anchorBlockHeader.hash();
111
110
  // By computing siloed and unique note hashes ourselves we prevent contracts from interfering with the note storage
112
111
  // of other contracts, which would constitute a security breach.
113
- const uniqueNoteHash = await computeUniqueNoteHash(noteNonce, await siloNoteHash(contractAddress, noteHash));
114
- const siloedNullifier = await siloNullifier(contractAddress, nullifier);
115
- const [txEffect, [nullifierIndex]] = await Promise.all([
116
- this.aztecNode.getTxEffect(txHash),
117
- this.aztecNode.findLeavesIndexes(anchorBlockHash, MerkleTreeId.NULLIFIER_TREE, [
112
+ const computed = await Promise.all(requests.map(async ({ contractAddress, noteHash, nullifier, noteNonce })=>{
113
+ const [siloedNoteHash, siloedNullifier] = await Promise.all([
114
+ siloNoteHash(contractAddress, noteHash),
115
+ siloNullifier(contractAddress, nullifier)
116
+ ]);
117
+ const uniqueNoteHash = await computeUniqueNoteHash(noteNonce, siloedNoteHash);
118
+ return {
119
+ uniqueNoteHash,
118
120
  siloedNullifier
119
- ])
120
- ]);
121
- if (!txEffect) {
122
- throw new Error(`Could not find tx effect for tx hash ${txHash}`);
123
- }
124
- if (txEffect.l2BlockNumber > anchorBlockNumber) {
125
- throw new Error(`Could not find tx effect for tx hash ${txHash} as of block number ${anchorBlockNumber}`);
126
- }
127
- // Find the index of the note hash in the noteHashes array to determine note ordering within the tx
128
- const noteIndexInTx = txEffect.data.noteHashes.findIndex((nh)=>nh.equals(uniqueNoteHash));
129
- if (noteIndexInTx === -1) {
130
- throw new Error(`Note hash ${noteHash} (uniqued as ${uniqueNoteHash}) is not present in tx ${txHash}`);
131
- }
132
- const noteDao = new NoteDao(new Note(content), contractAddress, owner, storageSlot, randomness, noteNonce, noteHash, siloedNullifier, txHash, txEffect.l2BlockNumber, txEffect.l2BlockHash.toString(), txEffect.txIndexInBlock, noteIndexInTx);
133
- // The note was found by `recipient`, so we use that as the scope when storing the note.
134
- await this.noteStore.addNotes([
135
- noteDao
136
- ], recipient, this.jobId);
137
- if (nullifierIndex !== undefined) {
138
- // We found nullifier index which implies that the note has already been nullified.
139
- const { data: _, ...blockHashAndNum } = nullifierIndex;
140
- await this.noteStore.applyNullifiers([
141
- {
121
+ };
122
+ }));
123
+ const nullifierIndexes = await this.#findNullifierIndexes(anchorBlockHash, computed.map((c)=>c.siloedNullifier));
124
+ const noteDaos = [];
125
+ const foundNullifiers = [];
126
+ for(let i = 0; i < requests.length; i++){
127
+ const { contractAddress, owner, storageSlot, randomness, noteNonce, content, noteHash, txHash } = requests[i];
128
+ const { uniqueNoteHash, siloedNullifier } = computed[i];
129
+ const nullifierIndex = nullifierIndexes[i];
130
+ const txData = validationTxData.get(txHash.toString());
131
+ if (!txData) {
132
+ // We error out instead of just logging a warning and skipping the note because this would indicate a bug. This
133
+ // is because the node has already served info about this tx either when obtaining the log (LogResult carries
134
+ // the tx info) or when getting metadata for the offchain message (before the message got passed to
135
+ // `process_log`).
136
+ throw new Error(`Could not find tx effect for tx hash ${txHash} when processing a note.`);
137
+ }
138
+ if (txData.l2BlockNumber > anchorBlockNumber) {
139
+ // If the message was delivered onchain, this would indicate a bug: log sync should never load logs from blocks
140
+ // newer than the anchor block. If the note came via an offchain message, it would likely also be a bug, since
141
+ // we sync a new anchor block before calling `process_message`. For this not to be a bug, the message would
142
+ // need to come from a newer block than the anchor served by the node, implying the node isn't properly synced.
143
+ // We therefore error out here rather than assuming the offchain message was constructed by a malicious
144
+ // sender with the intention of bricking recipient's PXE (if we assumed that we would just ignore the message).
145
+ throw new Error(`Obtained a newer tx effect for ${txHash} for a note validation request than the anchor block ${anchorBlockNumber}. This is a bug as we should not ever be processing a note from a newer block than the anchor block.`);
146
+ }
147
+ // Find the index of the note hash in the noteHashes array to determine note ordering within the tx
148
+ const noteIndexInTx = txData.noteHashes.findIndex((nh)=>nh.equals(uniqueNoteHash));
149
+ if (noteIndexInTx === -1) {
150
+ // Similar to the comment above - we error out as this would indicate a bug in nonce discovery.
151
+ throw new Error(`Note hash ${noteHash} (uniqued as ${uniqueNoteHash}) is not present in tx ${txHash}`);
152
+ }
153
+ noteDaos.push(new NoteDao(new Note(content), contractAddress, owner, storageSlot, randomness, noteNonce, noteHash, siloedNullifier, txHash, txData.l2BlockNumber, txData.l2BlockHash.toString(), txData.txIndexInBlock, noteIndexInTx));
154
+ if (nullifierIndex !== undefined) {
155
+ // We found a nullifier index which implies that the note has already been nullified.
156
+ const { data: _, ...blockHashAndNum } = nullifierIndex;
157
+ foundNullifiers.push({
142
158
  data: siloedNullifier,
143
159
  ...blockHashAndNum
144
- }
145
- ], this.jobId);
160
+ });
161
+ }
146
162
  }
163
+ await this.noteStore.addNotes(noteDaos, scope, this.jobId);
164
+ if (foundNullifiers.length > 0) {
165
+ await this.noteStore.applyNullifiers(foundNullifiers, this.jobId);
166
+ }
167
+ }
168
+ async #findNullifierIndexes(anchorBlockHash, siloedNullifiers) {
169
+ const batches = chunk(siloedNullifiers, MAX_RPC_LEN);
170
+ return (await Promise.all(batches.map((batch)=>this.aztecNode.findLeavesIndexes(anchorBlockHash, MerkleTreeId.NULLIFIER_TREE, batch)))).flat();
147
171
  }
148
172
  }
@@ -0,0 +1,24 @@
1
+ import type { Fr } from '@aztec/foundation/curves/bn254';
2
+ import type { AztecAddress } from '@aztec/stdlib/aztec-address';
3
+ import type { NoteStatus } from '@aztec/stdlib/note';
4
+ /**
5
+ * A filter used to fetch notes.
6
+ * @remarks This filter is applied as an intersection of all its params.
7
+ */
8
+ export type NotesFilter = {
9
+ /**
10
+ * The contract address the note belongs to.
11
+ * @remarks Providing a contract address is required as we need that information to trigger private state sync.
12
+ */
13
+ contractAddress: AztecAddress;
14
+ /** The owner of the note. */
15
+ owner?: AztecAddress;
16
+ /** The specific storage location of the note on the contract. */
17
+ storageSlot?: Fr;
18
+ /** The status of the note. Defaults to 'ACTIVE'. */
19
+ status?: NoteStatus;
20
+ /** The siloed nullifier for the note. */
21
+ siloedNullifier?: Fr;
22
+ scopes: AztecAddress[];
23
+ };
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90ZXNfZmlsdGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbm90ZXNfZmlsdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3pELE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXJEOzs7R0FHRztBQUNILE1BQU0sTUFBTSxXQUFXLEdBQUc7SUFDeEI7OztPQUdHO0lBQ0gsZUFBZSxFQUFFLFlBQVksQ0FBQztJQUM5Qiw2QkFBNkI7SUFDN0IsS0FBSyxDQUFDLEVBQUUsWUFBWSxDQUFDO0lBQ3JCLGlFQUFpRTtJQUNqRSxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDakIsb0RBQW9EO0lBQ3BELE1BQU0sQ0FBQyxFQUFFLFVBQVUsQ0FBQztJQUNwQix5Q0FBeUM7SUFDekMsZUFBZSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQ3JCLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQztDQUN4QixDQUFDIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notes_filter.d.ts","sourceRoot":"","sources":["../src/notes_filter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB;;;OAGG;IACH,eAAe,EAAE,YAAY,CAAC;IAC9B,6BAA6B;IAC7B,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,iEAAiE;IACjE,WAAW,CAAC,EAAE,EAAE,CAAC;IACjB,oDAAoD;IACpD,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,yCAAyC;IACzC,eAAe,CAAC,EAAE,EAAE,CAAC;IACrB,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB,CAAC"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * A filter used to fetch notes.
3
+ * @remarks This filter is applied as an intersection of all its params.
4
+ */ export { };
@@ -1,3 +1,4 @@
1
- export declare const ORACLE_VERSION = 9;
2
- export declare const ORACLE_INTERFACE_HASH = "9866cc52510acaef75a3d47a0ed501fd9ff92b9d53b2c8a88c8a3ffd04ced81f";
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JhY2xlX3ZlcnNpb24uZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcmFjbGVfdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxlQUFPLE1BQU0sY0FBYyxJQUFJLENBQUM7QUFLaEMsZUFBTyxNQUFNLHFCQUFxQixxRUFBcUUsQ0FBQyJ9
1
+ export declare const ORACLE_VERSION_MAJOR = 30;
2
+ export declare const ORACLE_VERSION_MINOR = 8;
3
+ export declare const ORACLE_INTERFACE_HASH = "fec4d3a95fc57a62a20bfeb659bb3bfd91b31cd93e07f8cf97b368f9f55cc67b";
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JhY2xlX3ZlcnNpb24uZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcmFjbGVfdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFZQSxlQUFPLE1BQU0sb0JBQW9CLEtBQUssQ0FBQztBQUN2QyxlQUFPLE1BQU0sb0JBQW9CLElBQUksQ0FBQztBQVF0QyxlQUFPLE1BQU0scUJBQXFCLHFFQUFxRSxDQUFDIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"oracle_version.d.ts","sourceRoot":"","sources":["../src/oracle_version.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,cAAc,IAAI,CAAC;AAKhC,eAAO,MAAM,qBAAqB,qEAAqE,CAAC"}
1
+ {"version":3,"file":"oracle_version.d.ts","sourceRoot":"","sources":["../src/oracle_version.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAQtC,eAAO,MAAM,qBAAqB,qEAAqE,CAAC"}