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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (451) hide show
  1. package/dest/bin/check_oracle_version.d.ts +2 -12
  2. package/dest/bin/check_oracle_version.d.ts.map +1 -1
  3. package/dest/bin/check_oracle_version.js +9 -122
  4. package/dest/bin/index.d.ts +2 -2
  5. package/dest/bin/index.d.ts.map +1 -1
  6. package/dest/bin/index.js +1 -1
  7. package/dest/bin/oracle_version_helpers.d.ts +20 -0
  8. package/dest/bin/oracle_version_helpers.d.ts.map +1 -0
  9. package/dest/bin/oracle_version_helpers.js +25 -0
  10. package/dest/block_synchronizer/block_stream_source.d.ts +5 -5
  11. package/dest/block_synchronizer/block_stream_source.d.ts.map +1 -1
  12. package/dest/block_synchronizer/block_stream_source.js +4 -29
  13. package/dest/block_synchronizer/block_synchronizer.d.ts +17 -15
  14. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
  15. package/dest/block_synchronizer/block_synchronizer.js +41 -18
  16. package/dest/config/index.d.ts +2 -1
  17. package/dest/config/index.d.ts.map +1 -1
  18. package/dest/config/index.js +1 -0
  19. package/dest/config/package_info.js +1 -1
  20. package/dest/contract/contract_class_service.d.ts +24 -0
  21. package/dest/contract/contract_class_service.d.ts.map +1 -0
  22. package/dest/contract/contract_class_service.js +36 -0
  23. package/dest/contract/contract_sync_service.d.ts +48 -0
  24. package/dest/contract/contract_sync_service.d.ts.map +1 -0
  25. package/dest/{contract_sync → contract}/contract_sync_service.js +26 -45
  26. package/dest/contract/helpers.d.ts +7 -0
  27. package/dest/contract/helpers.d.ts.map +1 -0
  28. package/dest/contract/helpers.js +20 -0
  29. package/dest/contract/skip_sync_contracts.d.ts +11 -0
  30. package/dest/contract/skip_sync_contracts.d.ts.map +1 -0
  31. package/dest/contract/skip_sync_contracts.js +18 -0
  32. package/dest/contract_function_simulator/anchored_contract_data.d.ts +36 -0
  33. package/dest/contract_function_simulator/anchored_contract_data.d.ts.map +1 -0
  34. package/dest/contract_function_simulator/anchored_contract_data.js +54 -0
  35. package/dest/contract_function_simulator/contract_function_simulator.d.ts +19 -25
  36. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  37. package/dest/contract_function_simulator/contract_function_simulator.js +63 -49
  38. package/dest/contract_function_simulator/execution_note_cache.d.ts +4 -10
  39. package/dest/contract_function_simulator/execution_note_cache.d.ts.map +1 -1
  40. package/dest/contract_function_simulator/execution_note_cache.js +8 -28
  41. package/dest/contract_function_simulator/index.d.ts +24 -6
  42. package/dest/contract_function_simulator/index.d.ts.map +1 -1
  43. package/dest/contract_function_simulator/index.js +9 -4
  44. package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts +8 -27
  45. package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts.map +1 -1
  46. package/dest/contract_function_simulator/noir-structs/bounded_vec.js +8 -23
  47. package/dest/contract_function_simulator/noir-structs/contract_class_log_data.d.ts +9 -0
  48. package/dest/contract_function_simulator/noir-structs/contract_class_log_data.d.ts.map +1 -0
  49. package/dest/contract_function_simulator/noir-structs/contract_class_log_data.js +1 -0
  50. package/dest/contract_function_simulator/noir-structs/embedded_curve_point.d.ts +7 -0
  51. package/dest/contract_function_simulator/noir-structs/embedded_curve_point.d.ts.map +1 -0
  52. package/dest/contract_function_simulator/noir-structs/embedded_curve_point.js +1 -0
  53. package/dest/contract_function_simulator/noir-structs/ephemeral_array.d.ts +37 -0
  54. package/dest/contract_function_simulator/noir-structs/ephemeral_array.d.ts.map +1 -0
  55. package/dest/contract_function_simulator/noir-structs/ephemeral_array.js +59 -0
  56. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +3 -2
  57. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts.map +1 -1
  58. package/dest/contract_function_simulator/noir-structs/event_validation_request.js +2 -2
  59. package/dest/contract_function_simulator/noir-structs/fact.d.ts +16 -0
  60. package/dest/contract_function_simulator/noir-structs/fact.d.ts.map +1 -0
  61. package/dest/contract_function_simulator/noir-structs/fact.js +6 -0
  62. package/dest/contract_function_simulator/noir-structs/fact_collection.d.ts +27 -0
  63. package/dest/contract_function_simulator/noir-structs/fact_collection.d.ts.map +1 -0
  64. package/dest/contract_function_simulator/noir-structs/fact_collection.js +31 -0
  65. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts +11 -12
  66. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts.map +1 -1
  67. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.js +6 -49
  68. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts +10 -8
  69. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts.map +1 -1
  70. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.js +1 -60
  71. package/dest/contract_function_simulator/noir-structs/note_data.d.ts +27 -0
  72. package/dest/contract_function_simulator/noir-structs/note_data.d.ts.map +1 -0
  73. package/dest/contract_function_simulator/noir-structs/note_data.js +3 -0
  74. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +3 -2
  75. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts.map +1 -1
  76. package/dest/contract_function_simulator/noir-structs/note_validation_request.js +3 -3
  77. package/dest/contract_function_simulator/noir-structs/option.d.ts +9 -11
  78. package/dest/contract_function_simulator/noir-structs/option.d.ts.map +1 -1
  79. package/dest/contract_function_simulator/noir-structs/option.js +18 -13
  80. package/dest/contract_function_simulator/noir-structs/origin_block.d.ts +11 -0
  81. package/dest/contract_function_simulator/noir-structs/origin_block.d.ts.map +1 -0
  82. package/dest/contract_function_simulator/noir-structs/origin_block.js +5 -0
  83. package/dest/contract_function_simulator/noir-structs/pending_tagged_log.d.ts +11 -0
  84. package/dest/contract_function_simulator/noir-structs/pending_tagged_log.d.ts.map +1 -0
  85. package/dest/contract_function_simulator/noir-structs/pending_tagged_log.js +4 -0
  86. package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts +8 -0
  87. package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts.map +1 -0
  88. package/dest/contract_function_simulator/noir-structs/provided_secret.js +1 -0
  89. package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.d.ts +28 -0
  90. package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.d.ts.map +1 -0
  91. package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.js +50 -0
  92. package/dest/contract_function_simulator/noir-structs/resolved_tx.d.ts +19 -0
  93. package/dest/contract_function_simulator/noir-structs/resolved_tx.d.ts.map +1 -0
  94. package/dest/contract_function_simulator/noir-structs/resolved_tx.js +9 -0
  95. package/dest/contract_function_simulator/noir-structs/tx_effect_data.d.ts +15 -0
  96. package/dest/contract_function_simulator/noir-structs/tx_effect_data.d.ts.map +1 -0
  97. package/dest/contract_function_simulator/noir-structs/tx_effect_data.js +5 -0
  98. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts +6 -11
  99. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts.map +1 -1
  100. package/dest/contract_function_simulator/noir-structs/utility_context.js +1 -20
  101. package/dest/contract_function_simulator/oracle/acir_callback.d.ts +21 -0
  102. package/dest/contract_function_simulator/oracle/acir_callback.d.ts.map +1 -0
  103. package/dest/contract_function_simulator/oracle/acir_callback.js +115 -0
  104. package/dest/contract_function_simulator/oracle/index.d.ts +2 -13
  105. package/dest/contract_function_simulator/oracle/index.d.ts.map +1 -1
  106. package/dest/contract_function_simulator/oracle/index.js +1 -1
  107. package/dest/contract_function_simulator/oracle/interfaces.d.ts +15 -114
  108. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  109. package/dest/contract_function_simulator/oracle/interfaces.js +2 -2
  110. package/dest/contract_function_simulator/oracle/legacy_oracle_registry.d.ts +39 -0
  111. package/dest/contract_function_simulator/oracle/legacy_oracle_registry.d.ts.map +1 -0
  112. package/dest/contract_function_simulator/oracle/legacy_oracle_registry.js +107 -0
  113. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts +3 -14
  114. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts.map +1 -1
  115. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.js +1 -24
  116. package/dest/contract_function_simulator/oracle/oracle_registry.d.ts +92 -100
  117. package/dest/contract_function_simulator/oracle/oracle_registry.d.ts.map +1 -1
  118. package/dest/contract_function_simulator/oracle/oracle_registry.js +296 -479
  119. package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts +274 -0
  120. package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts.map +1 -0
  121. package/dest/contract_function_simulator/oracle/oracle_type_mappings.js +1253 -0
  122. package/dest/contract_function_simulator/oracle/private_execution.d.ts +1 -1
  123. package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
  124. package/dest/contract_function_simulator/oracle/private_execution.js +2 -3
  125. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +32 -21
  126. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  127. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +152 -49
  128. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +97 -37
  129. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  130. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +376 -138
  131. package/dest/contract_function_simulator/transient_array_service.d.ts +31 -0
  132. package/dest/contract_function_simulator/transient_array_service.d.ts.map +1 -0
  133. package/dest/contract_function_simulator/transient_array_service.js +62 -0
  134. package/dest/debug/pxe_debug_utils.d.ts +2 -2
  135. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  136. package/dest/entrypoints/client/bundle/index.d.ts +2 -1
  137. package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
  138. package/dest/entrypoints/client/bundle/index.js +1 -0
  139. package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
  140. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  141. package/dest/entrypoints/client/bundle/utils.js +17 -6
  142. package/dest/entrypoints/client/lazy/index.d.ts +2 -1
  143. package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
  144. package/dest/entrypoints/client/lazy/index.js +1 -0
  145. package/dest/entrypoints/client/lazy/utils.d.ts +1 -1
  146. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  147. package/dest/entrypoints/client/lazy/utils.js +17 -6
  148. package/dest/entrypoints/client/store.d.ts +14 -0
  149. package/dest/entrypoints/client/store.d.ts.map +1 -0
  150. package/dest/entrypoints/client/store.js +42 -0
  151. package/dest/entrypoints/pxe_creation_options.d.ts +9 -3
  152. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  153. package/dest/entrypoints/server/index.d.ts +6 -3
  154. package/dest/entrypoints/server/index.d.ts.map +1 -1
  155. package/dest/entrypoints/server/index.js +4 -2
  156. package/dest/entrypoints/server/store.d.ts +18 -0
  157. package/dest/entrypoints/server/store.d.ts.map +1 -0
  158. package/dest/entrypoints/server/store.js +28 -0
  159. package/dest/entrypoints/server/utils.d.ts +1 -1
  160. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  161. package/dest/entrypoints/server/utils.js +16 -4
  162. package/dest/error_enriching.d.ts +5 -3
  163. package/dest/error_enriching.d.ts.map +1 -1
  164. package/dest/error_enriching.js +13 -11
  165. package/dest/events/event_service.d.ts +13 -6
  166. package/dest/events/event_service.d.ts.map +1 -1
  167. package/dest/events/event_service.js +13 -13
  168. package/dest/hooks/execution_hooks.d.ts +31 -11
  169. package/dest/hooks/execution_hooks.d.ts.map +1 -1
  170. package/dest/hooks/execution_hooks.js +3 -3
  171. package/dest/hooks/index.d.ts +4 -3
  172. package/dest/hooks/index.d.ts.map +1 -1
  173. package/dest/hooks/index.js +1 -0
  174. package/dest/hooks/resolve_custom_request.d.ts +23 -0
  175. package/dest/hooks/resolve_custom_request.d.ts.map +1 -0
  176. package/dest/hooks/resolve_custom_request.js +3 -0
  177. package/dest/hooks/resolve_tagging_secret_strategy.d.ts +50 -0
  178. package/dest/hooks/resolve_tagging_secret_strategy.d.ts.map +1 -0
  179. package/dest/hooks/resolve_tagging_secret_strategy.js +3 -0
  180. package/dest/logs/log_service.d.ts +18 -8
  181. package/dest/logs/log_service.d.ts.map +1 -1
  182. package/dest/logs/log_service.js +93 -45
  183. package/dest/messages/tx_resolver_service.d.ts +28 -0
  184. package/dest/messages/tx_resolver_service.d.ts.map +1 -0
  185. package/dest/messages/tx_resolver_service.js +61 -0
  186. package/dest/node/benchmarked_node.d.ts +20 -0
  187. package/dest/node/benchmarked_node.d.ts.map +1 -0
  188. package/dest/node/benchmarked_node.js +94 -0
  189. package/dest/node/caching_aztec_node.d.ts +24 -0
  190. package/dest/node/caching_aztec_node.d.ts.map +1 -0
  191. package/dest/node/caching_aztec_node.js +267 -0
  192. package/dest/notes/note_service.d.ts +13 -7
  193. package/dest/notes/note_service.d.ts.map +1 -1
  194. package/dest/notes/note_service.js +10 -10
  195. package/dest/oracle_version.d.ts +3 -3
  196. package/dest/oracle_version.js +8 -8
  197. package/dest/private_kernel/batch_planner.d.ts +1 -1
  198. package/dest/private_kernel/batch_planner.d.ts.map +1 -1
  199. package/dest/private_kernel/batch_planner.js +1 -1
  200. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +1 -1
  201. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -1
  202. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.js +6 -2
  203. package/dest/private_kernel/hints/test_utils.js +1 -1
  204. package/dest/private_kernel/private_kernel_execution_prover.d.ts +1 -1
  205. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  206. package/dest/private_kernel/private_kernel_execution_prover.js +61 -40
  207. package/dest/private_kernel/private_kernel_oracle.d.ts +4 -2
  208. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  209. package/dest/private_kernel/private_kernel_oracle.js +17 -5
  210. package/dest/pxe.d.ts +114 -48
  211. package/dest/pxe.d.ts.map +1 -1
  212. package/dest/pxe.js +251 -148
  213. package/dest/storage/allowed_scopes.d.ts +6 -0
  214. package/dest/storage/allowed_scopes.d.ts.map +1 -0
  215. package/dest/storage/allowed_scopes.js +7 -0
  216. package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -6
  217. package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
  218. package/dest/storage/anchor_block_store/anchor_block_store.js +8 -6
  219. package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts +1 -1
  220. package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts.map +1 -1
  221. package/dest/storage/backwards_compatibility_tests/schema_tests.js +129 -49
  222. package/dest/storage/capsule_store/capsule_service.d.ts +1 -1
  223. package/dest/storage/capsule_store/capsule_service.d.ts.map +1 -1
  224. package/dest/storage/capsule_store/capsule_service.js +6 -9
  225. package/dest/storage/contract_store/contract_store.d.ts +27 -24
  226. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  227. package/dest/storage/contract_store/contract_store.js +66 -77
  228. package/dest/storage/fact_store/fact_service.d.ts +22 -0
  229. package/dest/storage/fact_store/fact_service.d.ts.map +1 -0
  230. package/dest/storage/fact_store/fact_service.js +45 -0
  231. package/dest/storage/fact_store/fact_store.d.ts +95 -0
  232. package/dest/storage/fact_store/fact_store.d.ts.map +1 -0
  233. package/dest/storage/fact_store/fact_store.js +408 -0
  234. package/dest/storage/fact_store/fact_store_keys.d.ts +34 -0
  235. package/dest/storage/fact_store/fact_store_keys.d.ts.map +1 -0
  236. package/dest/storage/fact_store/fact_store_keys.js +50 -0
  237. package/dest/storage/fact_store/index.d.ts +6 -0
  238. package/dest/storage/fact_store/index.d.ts.map +1 -0
  239. package/dest/storage/fact_store/index.js +4 -0
  240. package/dest/storage/fact_store/origin_state.d.ts +59 -0
  241. package/dest/storage/fact_store/origin_state.d.ts.map +1 -0
  242. package/dest/storage/fact_store/origin_state.js +60 -0
  243. package/dest/storage/fact_store/stored_fact.d.ts +32 -0
  244. package/dest/storage/fact_store/stored_fact.d.ts.map +1 -0
  245. package/dest/storage/fact_store/stored_fact.js +64 -0
  246. package/dest/storage/index.d.ts +3 -2
  247. package/dest/storage/index.d.ts.map +1 -1
  248. package/dest/storage/index.js +2 -1
  249. package/dest/storage/metadata.d.ts +2 -2
  250. package/dest/storage/metadata.d.ts.map +1 -1
  251. package/dest/storage/metadata.js +1 -1
  252. package/dest/storage/note_store/note_store.d.ts +42 -33
  253. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  254. package/dest/storage/note_store/note_store.js +197 -168
  255. package/dest/storage/note_store/stored_note.d.ts +3 -8
  256. package/dest/storage/note_store/stored_note.d.ts.map +1 -1
  257. package/dest/storage/note_store/stored_note.js +4 -20
  258. package/dest/storage/open_pxe_stores.d.ts +5 -3
  259. package/dest/storage/open_pxe_stores.d.ts.map +1 -1
  260. package/dest/storage/open_pxe_stores.js +5 -3
  261. package/dest/storage/private_event_store/private_event_store.d.ts +13 -16
  262. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  263. package/dest/storage/private_event_store/private_event_store.js +40 -43
  264. package/dest/storage/store_identity.d.ts +35 -0
  265. package/dest/storage/store_identity.d.ts.map +1 -0
  266. package/dest/storage/store_identity.js +44 -0
  267. package/dest/storage/tagging_store/index.d.ts +2 -2
  268. package/dest/storage/tagging_store/index.d.ts.map +1 -1
  269. package/dest/storage/tagging_store/index.js +1 -1
  270. package/dest/storage/tagging_store/sender_tagging_store.d.ts +41 -10
  271. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  272. package/dest/storage/tagging_store/sender_tagging_store.js +81 -29
  273. package/dest/storage/tagging_store/tagging_secret_sources_store.d.ts +51 -0
  274. package/dest/storage/tagging_store/tagging_secret_sources_store.d.ts.map +1 -0
  275. package/dest/storage/tagging_store/tagging_secret_sources_store.js +105 -0
  276. package/dest/tagging/constants.d.ts +11 -2
  277. package/dest/tagging/constants.d.ts.map +1 -1
  278. package/dest/tagging/constants.js +38 -10
  279. package/dest/tagging/get_all_logs_by_tags.d.ts +29 -8
  280. package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -1
  281. package/dest/tagging/get_all_logs_by_tags.js +29 -10
  282. package/dest/tagging/index.d.ts +3 -3
  283. package/dest/tagging/index.d.ts.map +1 -1
  284. package/dest/tagging/index.js +2 -2
  285. package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts +27 -9
  286. package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts.map +1 -1
  287. package/dest/tagging/recipient_sync/sync_tagged_private_logs.js +104 -33
  288. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +6 -3
  289. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
  290. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +23 -36
  291. package/dest/tagging/sender_sync/utils/classify_pending_txs.d.ts +22 -0
  292. package/dest/tagging/sender_sync/utils/classify_pending_txs.d.ts.map +1 -0
  293. package/dest/tagging/sender_sync/utils/classify_pending_txs.js +61 -0
  294. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +15 -5
  295. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
  296. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +36 -35
  297. package/dest/tagging/sender_sync/utils/resolve_pending_txs.d.ts +29 -0
  298. package/dest/tagging/sender_sync/utils/resolve_pending_txs.d.ts.map +1 -0
  299. package/dest/tagging/sender_sync/utils/resolve_pending_txs.js +41 -0
  300. package/dest/tagging/sender_sync/utils/test_utils.d.ts +16 -0
  301. package/dest/tagging/sender_sync/utils/test_utils.d.ts.map +1 -0
  302. package/dest/tagging/sender_sync/utils/test_utils.js +24 -0
  303. package/dest/tagging/testing/tag_query_test_utils.d.ts +6 -0
  304. package/dest/tagging/testing/tag_query_test_utils.d.ts.map +1 -0
  305. package/dest/tagging/testing/tag_query_test_utils.js +10 -0
  306. package/package.json +17 -17
  307. package/src/bin/check_oracle_version.ts +8 -151
  308. package/src/bin/index.ts +1 -1
  309. package/src/bin/oracle_version_helpers.ts +30 -0
  310. package/src/block_synchronizer/block_stream_source.ts +6 -45
  311. package/src/block_synchronizer/block_synchronizer.ts +54 -30
  312. package/src/config/index.ts +1 -0
  313. package/src/config/package_info.ts +1 -1
  314. package/src/contract/contract_class_service.ts +45 -0
  315. package/src/{contract_sync → contract}/contract_sync_service.ts +37 -50
  316. package/src/contract/helpers.ts +35 -0
  317. package/src/contract/skip_sync_contracts.ts +23 -0
  318. package/src/contract_function_simulator/anchored_contract_data.ts +74 -0
  319. package/src/contract_function_simulator/contract_function_simulator.ts +96 -59
  320. package/src/contract_function_simulator/execution_note_cache.ts +8 -29
  321. package/src/contract_function_simulator/index.ts +87 -5
  322. package/src/contract_function_simulator/noir-structs/bounded_vec.ts +12 -24
  323. package/src/contract_function_simulator/noir-structs/contract_class_log_data.ts +9 -0
  324. package/src/contract_function_simulator/noir-structs/embedded_curve_point.ts +4 -0
  325. package/src/contract_function_simulator/noir-structs/ephemeral_array.ts +66 -0
  326. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +3 -3
  327. package/src/contract_function_simulator/noir-structs/fact.ts +13 -0
  328. package/src/contract_function_simulator/noir-structs/fact_collection.ts +64 -0
  329. package/src/contract_function_simulator/noir-structs/log_retrieval_request.ts +20 -46
  330. package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +13 -60
  331. package/src/contract_function_simulator/noir-structs/note_data.ts +27 -0
  332. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +4 -4
  333. package/src/contract_function_simulator/noir-structs/option.ts +17 -11
  334. package/src/contract_function_simulator/noir-structs/origin_block.ts +8 -0
  335. package/src/contract_function_simulator/noir-structs/pending_tagged_log.ts +12 -0
  336. package/src/contract_function_simulator/noir-structs/provided_secret.ts +5 -0
  337. package/src/contract_function_simulator/noir-structs/resolved_tagging_strategy.ts +66 -0
  338. package/src/contract_function_simulator/noir-structs/resolved_tx.ts +19 -0
  339. package/src/contract_function_simulator/noir-structs/tx_effect_data.ts +16 -0
  340. package/src/contract_function_simulator/noir-structs/utility_context.ts +5 -17
  341. package/src/contract_function_simulator/oracle/acir_callback.ts +154 -0
  342. package/src/contract_function_simulator/oracle/index.ts +1 -15
  343. package/src/contract_function_simulator/oracle/interfaces.ts +11 -189
  344. package/src/contract_function_simulator/oracle/legacy_oracle_registry.ts +147 -0
  345. package/src/contract_function_simulator/oracle/message_load_oracle_inputs.ts +6 -21
  346. package/src/contract_function_simulator/oracle/oracle_registry.ts +289 -483
  347. package/src/contract_function_simulator/oracle/oracle_type_mappings.ts +1067 -0
  348. package/src/contract_function_simulator/oracle/private_execution.ts +2 -3
  349. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +190 -61
  350. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +556 -174
  351. package/src/contract_function_simulator/transient_array_service.ts +91 -0
  352. package/src/debug/pxe_debug_utils.ts +1 -1
  353. package/src/entrypoints/client/bundle/index.ts +1 -0
  354. package/src/entrypoints/client/bundle/utils.ts +24 -5
  355. package/src/entrypoints/client/lazy/index.ts +1 -0
  356. package/src/entrypoints/client/lazy/utils.ts +24 -5
  357. package/src/entrypoints/client/store.ts +54 -0
  358. package/src/entrypoints/pxe_creation_options.ts +8 -2
  359. package/src/entrypoints/server/index.ts +6 -2
  360. package/src/entrypoints/server/store.ts +47 -0
  361. package/src/entrypoints/server/utils.ts +31 -9
  362. package/src/error_enriching.ts +27 -11
  363. package/src/events/event_service.ts +24 -14
  364. package/src/hooks/execution_hooks.ts +32 -12
  365. package/src/hooks/index.ts +8 -2
  366. package/src/hooks/resolve_custom_request.ts +24 -0
  367. package/src/hooks/resolve_tagging_secret_strategy.ts +60 -0
  368. package/src/logs/log_service.ts +122 -61
  369. package/src/messages/tx_resolver_service.ts +80 -0
  370. package/src/node/benchmarked_node.ts +140 -0
  371. package/src/node/caching_aztec_node.ts +406 -0
  372. package/src/notes/note_service.ts +20 -14
  373. package/src/oracle_version.ts +8 -8
  374. package/src/private_kernel/batch_planner.ts +0 -1
  375. package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +11 -1
  376. package/src/private_kernel/hints/test_utils.ts +1 -1
  377. package/src/private_kernel/private_kernel_execution_prover.ts +112 -56
  378. package/src/private_kernel/private_kernel_oracle.ts +23 -4
  379. package/src/pxe.ts +357 -172
  380. package/src/storage/allowed_scopes.ts +14 -0
  381. package/src/storage/anchor_block_store/anchor_block_store.ts +8 -6
  382. package/src/storage/backwards_compatibility_tests/__snapshots__/AddressStore.json +6 -6
  383. package/src/storage/backwards_compatibility_tests/__snapshots__/ContractStore.json +1 -1
  384. package/src/storage/backwards_compatibility_tests/__snapshots__/FactStore.json +40 -0
  385. package/src/storage/backwards_compatibility_tests/__snapshots__/KeyStore.json +12 -12
  386. package/src/storage/backwards_compatibility_tests/__snapshots__/L2TipsKVStore.json +9 -15
  387. package/src/storage/backwards_compatibility_tests/__snapshots__/NoteStore.json +24 -4
  388. package/src/storage/backwards_compatibility_tests/__snapshots__/RecipientTaggingStore.json +11 -3
  389. package/src/storage/backwards_compatibility_tests/__snapshots__/SenderTaggingStore.json +12 -4
  390. package/src/storage/backwards_compatibility_tests/__snapshots__/TaggingSecretSourcesStore.json +30 -0
  391. package/src/storage/backwards_compatibility_tests/__snapshots__/opened_stores.json +29 -9
  392. package/src/storage/backwards_compatibility_tests/schema_tests.ts +141 -50
  393. package/src/storage/capsule_store/capsule_service.ts +8 -13
  394. package/src/storage/contract_store/contract_store.ts +88 -94
  395. package/src/storage/fact_store/fact_service.ts +69 -0
  396. package/src/storage/fact_store/fact_store.ts +487 -0
  397. package/src/storage/fact_store/fact_store_keys.ts +75 -0
  398. package/src/storage/fact_store/index.ts +15 -0
  399. package/src/storage/fact_store/origin_state.ts +84 -0
  400. package/src/storage/fact_store/stored_fact.ts +80 -0
  401. package/src/storage/index.ts +2 -1
  402. package/src/storage/metadata.ts +1 -1
  403. package/src/storage/note_store/note_store.ts +226 -187
  404. package/src/storage/note_store/stored_note.ts +5 -27
  405. package/src/storage/open_pxe_stores.ts +6 -3
  406. package/src/storage/private_event_store/private_event_store.ts +49 -55
  407. package/src/storage/store_identity.ts +72 -0
  408. package/src/storage/tagging_store/index.ts +1 -1
  409. package/src/storage/tagging_store/sender_tagging_store.ts +113 -41
  410. package/src/storage/tagging_store/tagging_secret_sources_store.ts +138 -0
  411. package/src/tagging/constants.ts +42 -10
  412. package/src/tagging/get_all_logs_by_tags.ts +47 -11
  413. package/src/tagging/index.ts +7 -2
  414. package/src/tagging/recipient_sync/sync_tagged_private_logs.ts +161 -46
  415. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +27 -57
  416. package/src/tagging/sender_sync/utils/classify_pending_txs.ts +91 -0
  417. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +46 -40
  418. package/src/tagging/sender_sync/utils/resolve_pending_txs.ts +64 -0
  419. package/src/tagging/sender_sync/utils/test_utils.ts +46 -0
  420. package/src/tagging/testing/tag_query_test_utils.ts +11 -0
  421. package/dest/contract_function_simulator/benchmarked_node.d.ts +0 -9
  422. package/dest/contract_function_simulator/benchmarked_node.d.ts.map +0 -1
  423. package/dest/contract_function_simulator/benchmarked_node.js +0 -77
  424. package/dest/contract_function_simulator/oracle/oracle.d.ts +0 -89
  425. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +0 -1
  426. package/dest/contract_function_simulator/oracle/oracle.js +0 -552
  427. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts +0 -6
  428. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts.map +0 -1
  429. package/dest/contract_function_simulator/proxied_contract_data_source.js +0 -51
  430. package/dest/contract_sync/contract_sync_service.d.ts +0 -42
  431. package/dest/contract_sync/contract_sync_service.d.ts.map +0 -1
  432. package/dest/contract_sync/helpers.d.ts +0 -27
  433. package/dest/contract_sync/helpers.d.ts.map +0 -1
  434. package/dest/contract_sync/helpers.js +0 -53
  435. package/dest/messages/message_context_service.d.ts +0 -17
  436. package/dest/messages/message_context_service.d.ts.map +0 -1
  437. package/dest/messages/message_context_service.js +0 -38
  438. package/dest/storage/tagging_store/sender_address_book_store.d.ts +0 -14
  439. package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +0 -1
  440. package/dest/storage/tagging_store/sender_address_book_store.js +0 -36
  441. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +0 -17
  442. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +0 -1
  443. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +0 -60
  444. package/src/contract_function_simulator/benchmarked_node.ts +0 -103
  445. package/src/contract_function_simulator/oracle/oracle.ts +0 -711
  446. package/src/contract_function_simulator/proxied_contract_data_source.ts +0 -60
  447. package/src/contract_sync/helpers.ts +0 -86
  448. package/src/messages/message_context_service.ts +0 -45
  449. package/src/storage/backwards_compatibility_tests/__snapshots__/SenderAddressBookStore.json +0 -16
  450. package/src/storage/tagging_store/sender_address_book_store.ts +0 -48
  451. package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +0 -66
@@ -0,0 +1,138 @@
1
+ import { Point } from '@aztec/foundation/curves/grumpkin';
2
+ import { toArray } from '@aztec/foundation/iterable';
3
+ import type { AztecAsyncKVStore, AztecAsyncMap, AztecAsyncMultiMap } from '@aztec/kv-store';
4
+ import { AztecAddress } from '@aztec/stdlib/aztec-address';
5
+
6
+ /**
7
+ * The kinds of shared secret an entry can hold.
8
+ */
9
+ export type SharedSecretKind = 'arbitrary-secret' | 'handshake';
10
+
11
+ /** A shared secret registered for a recipient, with the kind that determines which tag streams it backs. */
12
+ export type SharedSecret = { kind: SharedSecretKind; secret: Point };
13
+
14
+ /**
15
+ * Stores the sources from which directional app tagging secrets are derived during recipient log synchronization.
16
+ *
17
+ * Two kinds of source are held:
18
+ * - Sender addresses: combined with a recipient to derive a shared tagging secret via ECDH. These are global (not
19
+ * scoped to a recipient) because the per-recipient binding comes from re-mixing the recipient's keys during
20
+ * derivation, so each account only ever derives secrets meant for it.
21
+ * - Pre-shared tagging secrets: shared secret points registered directly, bypassing ECDH. These are scoped to a
22
+ * specific recipient, since the derivation of the directional app tagging secret does not require any secret
23
+ * recipient data: given the original secret anyone can derive a recipient's app-siloed directional tagging secret,
24
+ * and so these must not be reused across recipients to preserve privacy. Each carries the {@link SharedSecretKind}
25
+ * it was registered through, which determines the tag streams it is scanned under.
26
+ */
27
+ export class TaggingSecretSourcesStore {
28
+ #store: AztecAsyncKVStore;
29
+ #senders: AztecAsyncMap<string, true>;
30
+ #sharedSecretsByRecipient: AztecAsyncMultiMap<string, StoredSharedSecret>;
31
+
32
+ constructor(store: AztecAsyncKVStore) {
33
+ this.#store = store;
34
+
35
+ this.#senders = this.#store.openMap('senders');
36
+ this.#sharedSecretsByRecipient = this.#store.openMultiMap('recipient_shared_secrets');
37
+ }
38
+
39
+ addSender(address: AztecAddress): Promise<boolean> {
40
+ return this.#store.transactionAsync(async () => {
41
+ if (await this.#senders.hasAsync(address.toString())) {
42
+ return false;
43
+ }
44
+
45
+ await this.#senders.set(address.toString(), true);
46
+
47
+ return true;
48
+ });
49
+ }
50
+
51
+ getSenders(): Promise<AztecAddress[]> {
52
+ return this.#store.transactionAsync(async () => {
53
+ return (await toArray(this.#senders.keysAsync())).map(AztecAddress.fromStringUnsafe);
54
+ });
55
+ }
56
+
57
+ removeSender(address: AztecAddress): Promise<boolean> {
58
+ return this.#store.transactionAsync(async () => {
59
+ if (!(await this.#senders.hasAsync(address.toString()))) {
60
+ return false;
61
+ }
62
+
63
+ await this.#senders.delete(address.toString());
64
+
65
+ return true;
66
+ });
67
+ }
68
+
69
+ /**
70
+ * Registers a pre-shared tagging secret scoped to a recipient.
71
+ * @returns true if the secret was newly added, false if it was already registered for that recipient.
72
+ */
73
+ addSharedSecret(recipient: AztecAddress, kind: SharedSecretKind, secret: Point): Promise<boolean> {
74
+ return this.#store.transactionAsync(async () => {
75
+ const secretStr = secret.toString();
76
+ // MultiMap.set silently ignores an identical (key, value), so we scan to report whether this is a new secret.
77
+ for await (const existing of this.#sharedSecretsByRecipient.getValuesAsync(recipient.toString())) {
78
+ if (existing.secret === secretStr) {
79
+ if (existing.kind !== kind) {
80
+ throw new Error(
81
+ `Secret already registered for recipient with kind '${existing.kind}', cannot re-register it as '${kind}'.`,
82
+ );
83
+ }
84
+ return false;
85
+ }
86
+ }
87
+
88
+ await this.#sharedSecretsByRecipient.set(recipient.toString(), { kind, secret: secretStr });
89
+
90
+ return true;
91
+ });
92
+ }
93
+
94
+ /** Returns the pre-shared tagging secrets registered for a given recipient. */
95
+ getSharedSecretsForRecipient(recipient: AztecAddress): Promise<SharedSecret[]> {
96
+ return this.#store.transactionAsync(async () => {
97
+ return (await toArray(this.#sharedSecretsByRecipient.getValuesAsync(recipient.toString()))).map(
98
+ deserializeSharedSecret,
99
+ );
100
+ });
101
+ }
102
+
103
+ /** Returns every registered pre-shared tagging secret, each paired with the recipient it is scoped to. */
104
+ getAllSharedSecrets(): Promise<{ recipient: AztecAddress; kind: SharedSecretKind; secret: Point }[]> {
105
+ return this.#store.transactionAsync(async () => {
106
+ const entries = await toArray(this.#sharedSecretsByRecipient.entriesAsync());
107
+ return entries.map(([recipient, entry]) => ({
108
+ recipient: AztecAddress.fromStringUnsafe(recipient),
109
+ ...deserializeSharedSecret(entry),
110
+ }));
111
+ });
112
+ }
113
+
114
+ /**
115
+ * Removes a pre-shared tagging secret scoped to a recipient. Both the secret and its kind must match.
116
+ * @returns true if the secret was registered and removed, false if it was not registered for that recipient.
117
+ */
118
+ removeSharedSecret(recipient: AztecAddress, kind: SharedSecretKind, secret: Point): Promise<boolean> {
119
+ return this.#store.transactionAsync(async () => {
120
+ const secretStr = secret.toString();
121
+ for await (const existing of this.#sharedSecretsByRecipient.getValuesAsync(recipient.toString())) {
122
+ if (existing.kind === kind && existing.secret === secretStr) {
123
+ await this.#sharedSecretsByRecipient.deleteValue(recipient.toString(), existing);
124
+ return true;
125
+ }
126
+ }
127
+
128
+ return false;
129
+ });
130
+ }
131
+ }
132
+
133
+ /** The wire form a shared secret entry is persisted as. */
134
+ type StoredSharedSecret = { kind: SharedSecretKind; secret: string };
135
+
136
+ function deserializeSharedSecret(entry: StoredSharedSecret): SharedSecret {
137
+ return { kind: entry.kind, secret: Point.fromString(entry.secret) };
138
+ }
@@ -1,10 +1,42 @@
1
- // This window has to be as large as the largest expected number of logs emitted in a tx for a given directional app
2
- // tagging secret. If we get more tag indexes consumed than this window, an error is thrown in `PXE::proveTx` function.
3
- // This is set to a larger value than MAX_PRIVATE_LOGS_PER_TX (currently 64) because there could be more than
4
- // MAX_PRIVATE_LOGS_PER_TX indexes consumed in case the logs are squashed. This happens when the log contains a note
5
- // and the note is nullified in the same tx.
6
- //
7
- // Having a large window significantly slowed down `e2e_l1_with_wall_time` test as there we perform sync for more than
8
- // 1000 secrets. For this reason we set it to a relatively low value of 20. 20 should be sufficient for all the use
9
- // cases.
10
- export const UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN = 20;
1
+ import { MAX_PRIVATE_LOGS_PER_TX } from '@aztec/constants';
2
+
3
+ // This window bounds how far a sender's next tag index for a directional app tagging secret can run ahead of that
4
+ // secret's highest finalized index before `PXE::proveTx` throws.
5
+ //
6
+ // MAX_PRIVATE_LOGS_PER_TX is a floor for ordinary transaction patterns: the private kernel accumulates every
7
+ // surviving private log into a single tx-wide array of exactly this size, so a fresh secret's very first
8
+ // ordinary tx can consume that many indexes before anything is finalized.
9
+ //
10
+ // The +20 on top is headroom for multiple pending ordinary txs to the same counterparty stacking up
11
+ // before the first one is observed as mined. Only a run of near-MAX_PRIVATE_LOGS_PER_TX txs back-to-back would
12
+ // exhaust this; ordinary transfers use far fewer logs per tx, so the same margin covers many more of those. Keep the
13
+ // margin additive rather than another multiple of the floor. A larger window also makes recipient-side sync more
14
+ // expensive, since discovery has to probe ahead of the last finalized index for every active secret.
15
+ //
16
+ // TODO(F-783): MAX_PRIVATE_LOGS_PER_TX is not a hard ceiling in general — a tx that creates and nullifies (squashes)
17
+ // many notes/logs to the same secret can drive that secret's raw tag index arbitrarily higher, since indexes are
18
+ // reserved at log emission time, before squashing is decided, and the kernel's reset/squash loop is not bounded by
19
+ // MAX_PRIVATE_LOGS_PER_TX. No fixed window value closes that gap.
20
+ export const UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN = MAX_PRIVATE_LOGS_PER_TX + 20;
21
+
22
+ /**
23
+ * Exclusive upper bound of the tag indexes that can exist for a secret whose highest finalized index is
24
+ * `finalizedIndex` (undefined when nothing is finalized yet). The sender store refuses pending indexes at or past it,
25
+ * and both sender and recipient sync scan exactly up to it. Every absolute window bound must come from this helper:
26
+ * a site with a wider or narrower bound lets a tx land at an index the syncs never scan, so two stores sharing the
27
+ * secret could later pick a colliding index.
28
+ */
29
+ export function unfinalizedTaggingIndexesWindowEnd(finalizedIndex: number | undefined): number {
30
+ const windowStart = finalizedIndex === undefined ? 0 : finalizedIndex + 1;
31
+ return windowStart + UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN;
32
+ }
33
+
34
+ // The number of tags probed per constrained secret in the first round.
35
+ //
36
+ // The probe doubles each round (2, 4, 8, ..., capped at UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN) while every probed
37
+ // index is a hit, stopping at the first missing tag. Constrained delivery is gapless, so a single missing tag proves
38
+ // the stream has ended: at steady state this turns a full WINDOW_LEN probe into two tags. A secret K logs behind
39
+ // catches up in ~log2(K) round-trips while the probe is still doubling (2, 4, 8, 16, 32), but once it saturates the cap
40
+ // and advances WINDOW_LEN tags per round, deeper catch-up is linear at ~K/WINDOW_LEN rounds. Either way it beats both
41
+ // the full window every round and one round per log.
42
+ export const INITIAL_CONSTRAINED_PROBE_LEN = 2;
@@ -1,4 +1,4 @@
1
- import type { BlockNumber } from '@aztec/foundation/branded-types';
1
+ import { BlockNumber } from '@aztec/foundation/branded-types';
2
2
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
3
3
  import type { BlockHash } from '@aztec/stdlib/block';
4
4
  import { MAX_RPC_LEN } from '@aztec/stdlib/interfaces/api-limit';
@@ -11,6 +11,31 @@ import {
11
11
  queryAllPrivateLogsByTags,
12
12
  queryAllPublicLogsByTags,
13
13
  } from '@aztec/stdlib/logs';
14
+ import type { BlockHeader } from '@aztec/stdlib/tx';
15
+
16
+ /**
17
+ * The block a tag query is anchored to.
18
+ *
19
+ * Both fields come from one header (see {@link logQueryAnchorOf}), which is what keeps the bound and the reorg check
20
+ * talking about the same block.
21
+ */
22
+ export type LogQueryAnchor = {
23
+ /**
24
+ * Hash of the anchor block, naming the chain the query must be answered on: the node throws if that block is gone,
25
+ * which is how a reorg surfaces.
26
+ */
27
+ hash: BlockHash;
28
+ /** Height of the anchor block, bounding the query to blocks at or below it. */
29
+ number: BlockNumber;
30
+ };
31
+
32
+ /**
33
+ * The {@link LogQueryAnchor} naming `anchorBlockHeader`: its hash and its height. Callers build it once and reuse
34
+ * it across every query anchored to that block, so the header is hashed only once.
35
+ */
36
+ export async function logQueryAnchorOf(anchorBlockHeader: BlockHeader): Promise<LogQueryAnchor> {
37
+ return { hash: await anchorBlockHeader.hash(), number: anchorBlockHeader.getBlockNumber() };
38
+ }
14
39
 
15
40
  /** Optional block-range, effects opt-in, and pagination cap shared by both wrappers. */
16
41
  export type GetAllLogsByTagsOptions = {
@@ -61,15 +86,15 @@ async function getAllPagesInBatches<T extends Tag | SiloedTag, Opts extends LogI
61
86
  *
62
87
  * @param aztecNode - The Aztec node to query.
63
88
  * @param tags - The siloed tags to search for.
64
- * @param anchorBlockHash - Reference block for the Aztec node query, throws if block is not found there (typically
65
- * because of reorgs).
89
+ * @param anchor - Block the query is anchored to: results stop there, and the call throws if that block is not found
90
+ * (typically because of reorgs).
66
91
  * @param options - Optional `fromBlock`/`toBlock` range and `includeEffects` opt-in.
67
92
  * @returns An array of log arrays, one per tag, containing all logs across all pages.
68
93
  */
69
94
  export function getAllPrivateLogsByTags<Opts extends GetAllLogsByTagsOptions = GetAllLogsByTagsOptions>(
70
95
  aztecNode: AztecNode,
71
96
  tags: SiloedTag[],
72
- anchorBlockHash: BlockHash,
97
+ anchor: LogQueryAnchor,
73
98
  options: Opts = {} as Opts,
74
99
  ): Promise<LogResult<Opts>[][]> {
75
100
  return getAllPagesInBatches<SiloedTag, Opts>(
@@ -77,9 +102,9 @@ export function getAllPrivateLogsByTags<Opts extends GetAllLogsByTagsOptions = G
77
102
  batch =>
78
103
  queryAllPrivateLogsByTags(aztecNode, {
79
104
  tags: batch,
80
- referenceBlock: anchorBlockHash,
105
+ referenceBlock: anchor.hash,
81
106
  fromBlock: options.fromBlock,
82
- toBlock: options.toBlock,
107
+ toBlock: exclusiveUpperBound(anchor, options.toBlock),
83
108
  includeEffects: options.includeEffects ?? false,
84
109
  limitPerTag: options.limitPerTag,
85
110
  }) as Promise<LogResult<Opts>[][]>,
@@ -92,8 +117,8 @@ export function getAllPrivateLogsByTags<Opts extends GetAllLogsByTagsOptions = G
92
117
  * @param aztecNode - The Aztec node to query.
93
118
  * @param contractAddress - The contract address to search logs for.
94
119
  * @param tags - The tags to search for.
95
- * @param anchorBlockHash - Reference block for the Aztec node query, throws if block is not found there (typically
96
- * because of reorgs).
120
+ * @param anchor - Block the query is anchored to: results stop there, and the call throws if that block is not found
121
+ * (typically because of reorgs).
97
122
  * @param options - Optional `fromBlock`/`toBlock` range and `includeEffects` opt-in.
98
123
  * @returns An array of log arrays, one per tag, containing all logs across all pages.
99
124
  */
@@ -101,7 +126,7 @@ export function getAllPublicLogsByTagsFromContract<Opts extends GetAllLogsByTags
101
126
  aztecNode: AztecNode,
102
127
  contractAddress: AztecAddress,
103
128
  tags: Tag[],
104
- anchorBlockHash: BlockHash,
129
+ anchor: LogQueryAnchor,
105
130
  options: Opts = {} as Opts,
106
131
  ): Promise<LogResult<Opts>[][]> {
107
132
  return getAllPagesInBatches<Tag, Opts>(
@@ -110,11 +135,22 @@ export function getAllPublicLogsByTagsFromContract<Opts extends GetAllLogsByTags
110
135
  queryAllPublicLogsByTags(aztecNode, {
111
136
  contractAddress,
112
137
  tags: batch,
113
- referenceBlock: anchorBlockHash,
138
+ referenceBlock: anchor.hash,
114
139
  fromBlock: options.fromBlock,
115
- toBlock: options.toBlock,
140
+ toBlock: exclusiveUpperBound(anchor, options.toBlock),
116
141
  includeEffects: options.includeEffects ?? false,
117
142
  limitPerTag: options.limitPerTag,
118
143
  }) as Promise<LogResult<Opts>[][]>,
119
144
  );
120
145
  }
146
+
147
+ /**
148
+ * Exclusive upper block bound for a query anchored at `anchor`: one past the anchor block, or the caller's own
149
+ * `toBlock` when that is tighter.
150
+ *
151
+ * The bound is spelled out in the request rather than left implicit in `referenceBlock`, so the request itself
152
+ * names a fixed block range that no later block can widen.
153
+ */
154
+ function exclusiveUpperBound(anchor: LogQueryAnchor, toBlock: BlockNumber | undefined): BlockNumber {
155
+ return BlockNumber(Math.min(toBlock ?? Infinity, anchor.number + 1));
156
+ }
@@ -12,8 +12,13 @@
12
12
  export { syncTaggedPrivateLogs } from './recipient_sync/sync_tagged_private_logs.js';
13
13
  export { syncSenderTaggingIndexes } from './sender_sync/sync_sender_tagging_indexes.js';
14
14
  export { persistSenderTaggingIndexRangesForTx } from './persist_sender_tagging_index_ranges.js';
15
- export { UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN } from './constants.js';
16
- export { getAllPrivateLogsByTags, getAllPublicLogsByTagsFromContract } from './get_all_logs_by_tags.js';
15
+ export { UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN, INITIAL_CONSTRAINED_PROBE_LEN } from './constants.js';
16
+ export {
17
+ type LogQueryAnchor,
18
+ getAllPrivateLogsByTags,
19
+ getAllPublicLogsByTagsFromContract,
20
+ logQueryAnchorOf,
21
+ } from './get_all_logs_by_tags.js';
17
22
 
18
23
  // Re-export tagging-related types from stdlib
19
24
  export { AppTaggingSecret, Tag, SiloedTag } from '@aztec/stdlib/logs';
@@ -1,23 +1,27 @@
1
- import { BlockNumber } from '@aztec/foundation/branded-types';
1
+ import type { BlockNumber } from '@aztec/foundation/branded-types';
2
2
  import { isDefined } from '@aztec/foundation/types';
3
- import type { BlockHash } from '@aztec/stdlib/block';
4
3
  import type { AztecNode } from '@aztec/stdlib/interfaces/client';
5
4
  import type { AppTaggingSecret, LogResult } from '@aztec/stdlib/logs';
6
- import { SiloedTag } from '@aztec/stdlib/logs';
5
+ import { AppTaggingSecretKind, SiloedTag } from '@aztec/stdlib/logs';
7
6
  import type { BlockHeader } from '@aztec/stdlib/tx';
8
7
 
9
8
  import type { RecipientTaggingStore } from '../../storage/tagging_store/recipient_tagging_store.js';
10
- import { UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN } from '../constants.js';
11
- import { getAllPrivateLogsByTags } from '../get_all_logs_by_tags.js';
9
+ import {
10
+ INITIAL_CONSTRAINED_PROBE_LEN,
11
+ UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN,
12
+ unfinalizedTaggingIndexesWindowEnd,
13
+ } from '../constants.js';
14
+ import { type LogQueryAnchor, getAllPrivateLogsByTags, logQueryAnchorOf } from '../get_all_logs_by_tags.js';
12
15
  import { findHighestIndexes } from './utils/find_highest_indexes.js';
13
16
 
14
17
  /**
15
18
  * Fetches and syncs tagged private logs for multiple sender-recipient pairs, batching tag queries across all secrets
16
- * into shared RPC calls.
19
+ * into shared RPC calls. Handles both constrained and unconstrained secrets, which differ in their scan strategy
20
+ * but share the same batching infrastructure.
17
21
  *
18
- * # Explanation of how the algorithm works
22
+ * # Unconstrained secrets
19
23
  *
20
- * For each secret we sync logs that correspond to the tagging index range
24
+ * For each unconstrained secret we sync logs that correspond to the tagging index range
21
25
  * (highestAgedIndex, highestFinalizedIndex + WINDOW_LEN]
22
26
  *
23
27
  * highestAgedIndex is the highest index that was used in a tx that is included in a block at least
@@ -54,11 +58,28 @@ import { findHighestIndexes } from './utils/find_highest_indexes.js';
54
58
  * the highest finalized index. If that index was already used, they will throw an error. For this reason we
55
59
  * don't have to look further than `highestFinalizedIndex + WINDOW_LEN`.
56
60
  *
57
- * ## Batching across secrets
61
+ * # Constrained secrets
58
62
  *
59
- * Instead of running one RPC call per secret, we merge tags from all pending secrets into a single flat array,
60
- * make one batched `getAllPrivateLogsByTags` call (which internally chunks at MAX_RPC_LEN), then split results
61
- * back per secret using tracked offsets. Only secrets whose window advanced are kept for the next iteration.
63
+ * Constrained delivery enforces a contiguous index sequence (each send proves the predecessor's nullifier,
64
+ * chaining back to the handshake), so there is only one sender and indexes are sequential. This means:
65
+ * - The lower bound is `highestFinalizedIndex + 1`. The `highestAgedIndex` mechanism is unnecessary because
66
+ * the nullifier chain prevents out-of-order index usage: no device can fill in a lower index after a higher
67
+ * one is already on-chain.
68
+ * - Because the sequence is gapless, the scan stops at the first missing index: that gap proves the sequence has
69
+ * ended and no further logs exist. We exploit this with a doubling first-miss probe (see
70
+ * `INITIAL_CONSTRAINED_PROBE_LEN` in ../constants.ts), so a
71
+ * steady-state sync with no new logs costs two tags instead of the whole window. The probe length is in-memory
72
+ * state scoped to one sync call, so every sync restarts at the initial probe.
73
+ * - The upper bound is the same as unconstrained: `highestFinalizedIndex + WINDOW_LEN`. Advancing the probe is
74
+ * decoupled from persisting the finalized index, so unfinalized logs at the top of the run are still fetched
75
+ * while only the finalized prefix is persisted.
76
+ *
77
+ * # Batching across secrets
78
+ *
79
+ * Instead of running one RPC call per secret, we merge tags from all pending secrets (both constrained and
80
+ * unconstrained) into a single flat array, make one batched `getAllPrivateLogsByTags` call (which internally
81
+ * chunks at MAX_RPC_LEN), then split results back per secret using tracked offsets. Only secrets whose window
82
+ * advanced are kept for the next iteration.
62
83
  */
63
84
  export async function syncTaggedPrivateLogs(
64
85
  secrets: AppTaggingSecret[],
@@ -72,8 +93,7 @@ export async function syncTaggedPrivateLogs(
72
93
  return [];
73
94
  }
74
95
 
75
- const anchorBlockNumber = anchorBlockHeader.getBlockNumber();
76
- const anchorBlockHash = await anchorBlockHeader.hash();
96
+ const anchor = await logQueryAnchorOf(anchorBlockHeader);
77
97
  const currentTimestamp = anchorBlockHeader.globalVariables.timestamp;
78
98
 
79
99
  // Read stored indexes from the db and compute the initial [start, end) range for each secret
@@ -82,7 +102,7 @@ export async function syncTaggedPrivateLogs(
82
102
 
83
103
  while (pending.length > 0) {
84
104
  // Compute tags for all pending secrets and fetch logs in batched RPC calls
85
- const logsPerSecret = await fetchLogsForSecrets(pending, aztecNode, anchorBlockNumber, anchorBlockHash);
105
+ const logsPerSecret = await fetchLogsForSecrets(pending, aztecNode, anchor);
86
106
 
87
107
  const nextRound = await Promise.all(
88
108
  pending.map(async (pendingSecret, i) => {
@@ -96,14 +116,23 @@ export async function syncTaggedPrivateLogs(
96
116
 
97
117
  // Persist new indexes. If the finalized index moved forward, the window advances
98
118
  // and we need another round for this secret.
99
- return await updateIndexesAndAdvanceWindow(
100
- pendingSecret,
101
- logsFoundWithSecret,
102
- taggingStore,
103
- currentTimestamp,
104
- finalizedBlockNumber,
105
- jobId,
106
- );
119
+ return pendingSecret.kind === AppTaggingSecretKind.CONSTRAINED
120
+ ? await processConstrainedResults(
121
+ pendingSecret,
122
+ logsFoundWithSecret,
123
+ taggingStore,
124
+ currentTimestamp,
125
+ finalizedBlockNumber,
126
+ jobId,
127
+ )
128
+ : await processUnconstrainedResults(
129
+ pendingSecret,
130
+ logsFoundWithSecret,
131
+ taggingStore,
132
+ currentTimestamp,
133
+ finalizedBlockNumber,
134
+ jobId,
135
+ );
107
136
  }),
108
137
  );
109
138
 
@@ -120,16 +149,29 @@ function getIndexRangesForSecrets(
120
149
  jobId: string,
121
150
  ): Promise<PendingSecret[]> {
122
151
  return Promise.all(
123
- secrets.map(async secret => {
124
- const [currentHighestAgedIndex, currentHighestFinalizedIndex] = await Promise.all([
125
- taggingStore.getHighestAgedIndex(secret, jobId),
126
- taggingStore.getHighestFinalizedIndex(secret, jobId),
127
- ]);
152
+ secrets.map(async (secret): Promise<PendingSecret> => {
153
+ const currentHighestFinalizedIndex = await taggingStore.getHighestFinalizedIndex(secret, jobId);
154
+ const boundEnd = unfinalizedTaggingIndexesWindowEnd(currentHighestFinalizedIndex);
128
155
 
129
- const start = currentHighestAgedIndex === undefined ? 0 : currentHighestAgedIndex + 1;
130
- const end = (currentHighestFinalizedIndex ?? 0) + UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN + 1;
156
+ if (secret.kind === AppTaggingSecretKind.CONSTRAINED) {
157
+ // Constrained streams are gapless and resume at the finalized index, so probe a small initial window and stop
158
+ // at the first missing tag instead of always fetching the full window. The probe grows each round up to the
159
+ // window cap.
160
+ const start = currentHighestFinalizedIndex === undefined ? 0 : currentHighestFinalizedIndex + 1;
161
+ return {
162
+ kind: AppTaggingSecretKind.CONSTRAINED,
163
+ secret,
164
+ start,
165
+ end: Math.min(boundEnd, start + INITIAL_CONSTRAINED_PROBE_LEN),
166
+ boundEnd,
167
+ probeLen: INITIAL_CONSTRAINED_PROBE_LEN,
168
+ };
169
+ }
131
170
 
132
- return { secret, start, end };
171
+ // Unconstrained secrets can have gaps, so they scan the whole window starting past the highest aged index.
172
+ const highestAgedIndex = await taggingStore.getHighestAgedIndex(secret, jobId);
173
+ const start = highestAgedIndex === undefined ? 0 : highestAgedIndex + 1;
174
+ return { kind: AppTaggingSecretKind.UNCONSTRAINED, secret, start, end: boundEnd };
133
175
  }),
134
176
  );
135
177
  }
@@ -141,8 +183,7 @@ function getIndexRangesForSecrets(
141
183
  async function fetchLogsForSecrets(
142
184
  pending: PendingSecret[],
143
185
  aztecNode: AztecNode,
144
- anchorBlockNumber: BlockNumber,
145
- anchorBlockHash: BlockHash,
186
+ anchor: LogQueryAnchor,
146
187
  ): Promise<LogWithIndex[][]> {
147
188
  // Determine the index range for each secret
148
189
  const indexesPerSecret = pending.map(({ start, end }) => Array.from({ length: end - start }, (_, i) => start + i));
@@ -156,14 +197,10 @@ async function fetchLogsForSecrets(
156
197
 
157
198
  const allTags = tagsPerSecret.flat();
158
199
 
159
- // getAllPrivateLogsByTags handles MAX_RPC_LEN chunking internally. Recipient sync builds `PendingTaggedLog` from
160
- // each log's note hashes and first nullifier, so we opt into effects. The `toBlock` cap (anchor block + 1,
161
- // exclusive) tells the node to skip any logs in blocks past the anchor — the same guard previously enforced
162
- // by an in-memory filter on the response.
163
- const allResults = await getAllPrivateLogsByTags(aztecNode, allTags, anchorBlockHash, {
164
- includeEffects: true,
165
- toBlock: BlockNumber(anchorBlockNumber + 1),
166
- });
200
+ // getAllPrivateLogsByTags handles MAX_RPC_LEN chunking internally, and bounds the query at the anchor block so
201
+ // logs from later blocks are never returned. Recipient sync builds `PendingTaggedLog` from each log's note hashes
202
+ // and first nullifier, so we opt into effects.
203
+ const allResults = await getAllPrivateLogsByTags(aztecNode, allTags, anchor, { includeEffects: true });
167
204
 
168
205
  // Split flat results back per secret using the known lengths
169
206
  const logsPerSecret: LogWithIndex[][] = [];
@@ -183,11 +220,69 @@ async function fetchLogsForSecrets(
183
220
  }
184
221
 
185
222
  /**
186
- * Processes a single secret's fetched logs: updates stored indexes and returns a new PendingSecret
223
+ * Processes fetched logs for a constrained secret: persists the finalized index and advances the probe. See the
224
+ * "# Constrained secrets" section above for why the scan stops at the first missing index. Only `highestFinalizedIndex`
225
+ * is tracked (no aged index).
226
+ */
227
+ async function processConstrainedResults(
228
+ pending: PendingConstrained,
229
+ logsWithIndexes: LogWithIndex[],
230
+ taggingStore: RecipientTaggingStore,
231
+ currentTimestamp: bigint,
232
+ finalizedBlockNumber: BlockNumber,
233
+ jobId: string,
234
+ ): Promise<PendingSecret | undefined> {
235
+ // Find where the contiguous run of indexes ends; all logs in the batch fall within this prefix.
236
+ const indexesWithLogs = new Set(logsWithIndexes.map(l => l.taggingIndex));
237
+ let firstMissingIndex = pending.start;
238
+ while (firstMissingIndex < pending.end && indexesWithLogs.has(firstMissingIndex)) {
239
+ firstMissingIndex++;
240
+ }
241
+
242
+ // Persist the highest finalized index found. The nullifier for a constrained-delivery log is emitted in the same
243
+ // transaction, guaranteeing the log cannot disappear once included, so we persist even when a gap stops the scan.
244
+ // This lets the next sync round skip already-finalized indexes.
245
+ const { highestFinalizedIndex } = findHighestIndexes(logsWithIndexes, currentTimestamp, finalizedBlockNumber);
246
+ if (highestFinalizedIndex !== undefined) {
247
+ await taggingStore.updateHighestFinalizedIndex(pending.secret, highestFinalizedIndex, jobId);
248
+ }
249
+
250
+ // Advancing the probe is decoupled from persisting the finalized index: keep scanning as long as the probe was
251
+ // entirely hits (no gap) and there is room before the protocol bound, even if none of those hits is finalized yet.
252
+ // Gating this on finalization would drop logs in unfinalized blocks, which sit at the top of the contiguous run.
253
+ // The bound re-anchors to any finalized index found this round.
254
+ const probeFullyConsumed = firstMissingIndex >= pending.end;
255
+ const boundEnd =
256
+ highestFinalizedIndex !== undefined
257
+ ? Math.max(pending.boundEnd, unfinalizedTaggingIndexesWindowEnd(highestFinalizedIndex))
258
+ : pending.boundEnd;
259
+
260
+ // Double the probe each round, capped at the window (see INITIAL_CONSTRAINED_PROBE_LEN in ../constants.ts).
261
+ // The queried range is already bounded by boundEnd (a probe can never reach
262
+ // more than WINDOW_LEN past the finalized frontier); this cap just keeps the stored length from growing unbounded
263
+ // once the probe saturates the window.
264
+ const nextProbeLen = Math.min(pending.probeLen * 2, UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN);
265
+
266
+ if (probeFullyConsumed && pending.end < boundEnd) {
267
+ return {
268
+ kind: AppTaggingSecretKind.CONSTRAINED,
269
+ secret: pending.secret,
270
+ start: pending.end,
271
+ end: Math.min(boundEnd, pending.end + nextProbeLen),
272
+ boundEnd,
273
+ probeLen: nextProbeLen,
274
+ };
275
+ }
276
+
277
+ return undefined;
278
+ }
279
+
280
+ /**
281
+ * Processes a single unconstrained secret's fetched logs: updates stored indexes and returns a new PendingSecret
187
282
  * if the window needs to advance, or undefined if this secret is done.
188
283
  */
189
- async function updateIndexesAndAdvanceWindow(
190
- pending: PendingSecret,
284
+ async function processUnconstrainedResults(
285
+ pending: PendingUnconstrained,
191
286
  logsWithIndexes: LogWithIndex[],
192
287
  taggingStore: RecipientTaggingStore,
193
288
  currentTimestamp: bigint,
@@ -221,19 +316,39 @@ async function updateIndexesAndAdvanceWindow(
221
316
 
222
317
  // For the next iteration we want to look only at indexes for which we have not yet fetched logs while
223
318
  // ensuring that we do not look further than WINDOW_LEN ahead of the highest finalized index.
319
+ const end = unfinalizedTaggingIndexesWindowEnd(highestFinalizedIndex);
224
320
  return {
321
+ kind: AppTaggingSecretKind.UNCONSTRAINED,
225
322
  secret: pending.secret,
226
323
  start: pending.end,
227
- end: highestFinalizedIndex + UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN + 1,
324
+ end,
228
325
  };
229
326
  }
230
327
 
231
- type PendingSecret = {
328
+ /** Working scan state common to both secret kinds: the half-open [start, end) tag-index range to query this round. */
329
+ type PendingSecretBase = {
232
330
  secret: AppTaggingSecret;
233
331
  start: number;
234
332
  end: number;
235
333
  };
236
334
 
335
+ /** Constrained scan state, carrying the doubling-probe bookkeeping that only the gapless constrained scan uses. */
336
+ type PendingConstrained = PendingSecretBase & {
337
+ kind: typeof AppTaggingSecretKind.CONSTRAINED;
338
+ // Exclusive upper bound on the indexes this secret may probe this sync, from `unfinalizedTaggingIndexesWindowEnd`:
339
+ // the protocol bound on how far ahead of finalized a log can sit. `end` grows toward it each round.
340
+ boundEnd: number;
341
+ // Intended probe length for the round that produced `end`. The queried span can be smaller when boundEnd caps it.
342
+ probeLen: number;
343
+ };
344
+
345
+ /** Unconstrained scan state: a plain window with no probe bookkeeping, since the scan always covers the full window. */
346
+ type PendingUnconstrained = PendingSecretBase & {
347
+ kind: typeof AppTaggingSecretKind.UNCONSTRAINED;
348
+ };
349
+
350
+ type PendingSecret = PendingConstrained | PendingUnconstrained;
351
+
237
352
  type LogWithIndex = {
238
353
  log: LogResult;
239
354
  taggingIndex: number;