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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (350) hide show
  1. package/dest/bin/check_oracle_version.js +10 -20
  2. package/dest/bin/index.d.ts +2 -2
  3. package/dest/bin/index.d.ts.map +1 -1
  4. package/dest/bin/index.js +1 -1
  5. package/dest/bin/oracle_version_helpers.d.ts +26 -1
  6. package/dest/bin/oracle_version_helpers.d.ts.map +1 -1
  7. package/dest/bin/oracle_version_helpers.js +162 -1
  8. package/dest/block_synchronizer/block_stream_source.d.ts +5 -5
  9. package/dest/block_synchronizer/block_stream_source.d.ts.map +1 -1
  10. package/dest/block_synchronizer/block_stream_source.js +4 -29
  11. package/dest/block_synchronizer/block_synchronizer.d.ts +18 -14
  12. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
  13. package/dest/block_synchronizer/block_synchronizer.js +54 -18
  14. package/dest/config/index.d.ts +2 -1
  15. package/dest/config/index.d.ts.map +1 -1
  16. package/dest/config/index.js +1 -0
  17. package/dest/config/package_info.js +1 -1
  18. package/dest/contract/contract_class_service.d.ts +31 -0
  19. package/dest/contract/contract_class_service.d.ts.map +1 -0
  20. package/dest/contract/contract_class_service.js +68 -0
  21. package/dest/contract/contract_sync_service.d.ts +48 -0
  22. package/dest/contract/contract_sync_service.d.ts.map +1 -0
  23. package/dest/{contract_sync → contract}/contract_sync_service.js +26 -45
  24. package/dest/contract/helpers.d.ts +7 -0
  25. package/dest/contract/helpers.d.ts.map +1 -0
  26. package/dest/contract/helpers.js +20 -0
  27. package/dest/contract_function_simulator/anchored_contract_data.d.ts +36 -0
  28. package/dest/contract_function_simulator/anchored_contract_data.d.ts.map +1 -0
  29. package/dest/contract_function_simulator/anchored_contract_data.js +54 -0
  30. package/dest/contract_function_simulator/aztec_node_read_cache.d.ts +39 -0
  31. package/dest/contract_function_simulator/aztec_node_read_cache.d.ts.map +1 -0
  32. package/dest/contract_function_simulator/aztec_node_read_cache.js +60 -0
  33. package/dest/contract_function_simulator/contract_function_simulator.d.ts +19 -18
  34. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  35. package/dest/contract_function_simulator/contract_function_simulator.js +64 -35
  36. package/dest/contract_function_simulator/execution_note_cache.d.ts +3 -9
  37. package/dest/contract_function_simulator/execution_note_cache.d.ts.map +1 -1
  38. package/dest/contract_function_simulator/execution_note_cache.js +8 -28
  39. package/dest/contract_function_simulator/index.d.ts +19 -10
  40. package/dest/contract_function_simulator/index.d.ts.map +1 -1
  41. package/dest/contract_function_simulator/index.js +7 -9
  42. package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts +8 -27
  43. package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts.map +1 -1
  44. package/dest/contract_function_simulator/noir-structs/bounded_vec.js +8 -23
  45. package/dest/contract_function_simulator/noir-structs/contract_class_log_data.d.ts +9 -0
  46. package/dest/contract_function_simulator/noir-structs/contract_class_log_data.d.ts.map +1 -0
  47. package/dest/contract_function_simulator/noir-structs/contract_class_log_data.js +1 -0
  48. package/dest/contract_function_simulator/noir-structs/embedded_curve_point.d.ts +7 -0
  49. package/dest/contract_function_simulator/noir-structs/embedded_curve_point.d.ts.map +1 -0
  50. package/dest/contract_function_simulator/noir-structs/embedded_curve_point.js +1 -0
  51. package/dest/contract_function_simulator/noir-structs/event_validation_request.js +1 -1
  52. package/dest/contract_function_simulator/noir-structs/fact.d.ts +16 -0
  53. package/dest/contract_function_simulator/noir-structs/fact.d.ts.map +1 -0
  54. package/dest/contract_function_simulator/noir-structs/fact.js +6 -0
  55. package/dest/contract_function_simulator/noir-structs/fact_collection.d.ts +27 -0
  56. package/dest/contract_function_simulator/noir-structs/fact_collection.d.ts.map +1 -0
  57. package/dest/contract_function_simulator/noir-structs/fact_collection.js +31 -0
  58. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts +11 -12
  59. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts.map +1 -1
  60. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.js +6 -49
  61. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts +10 -8
  62. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts.map +1 -1
  63. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.js +1 -60
  64. package/dest/contract_function_simulator/noir-structs/note_validation_request.js +2 -2
  65. package/dest/contract_function_simulator/noir-structs/option.d.ts +9 -11
  66. package/dest/contract_function_simulator/noir-structs/option.d.ts.map +1 -1
  67. package/dest/contract_function_simulator/noir-structs/option.js +18 -13
  68. package/dest/contract_function_simulator/noir-structs/origin_block.d.ts +11 -0
  69. package/dest/contract_function_simulator/noir-structs/origin_block.d.ts.map +1 -0
  70. package/dest/contract_function_simulator/noir-structs/origin_block.js +5 -0
  71. package/dest/contract_function_simulator/noir-structs/pending_tagged_log.d.ts +11 -0
  72. package/dest/contract_function_simulator/noir-structs/pending_tagged_log.d.ts.map +1 -0
  73. package/dest/contract_function_simulator/noir-structs/pending_tagged_log.js +4 -0
  74. package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts +6 -9
  75. package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts.map +1 -1
  76. package/dest/contract_function_simulator/noir-structs/provided_secret.js +1 -24
  77. package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.d.ts +28 -0
  78. package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.d.ts.map +1 -0
  79. package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.js +50 -0
  80. package/dest/contract_function_simulator/noir-structs/resolved_tx.d.ts +21 -0
  81. package/dest/contract_function_simulator/noir-structs/resolved_tx.d.ts.map +1 -0
  82. package/dest/contract_function_simulator/noir-structs/resolved_tx.js +50 -0
  83. package/dest/contract_function_simulator/noir-structs/tx_effect_data.d.ts +14 -0
  84. package/dest/contract_function_simulator/noir-structs/tx_effect_data.d.ts.map +1 -0
  85. package/dest/contract_function_simulator/noir-structs/tx_effect_data.js +5 -0
  86. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts +6 -11
  87. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts.map +1 -1
  88. package/dest/contract_function_simulator/noir-structs/utility_context.js +1 -20
  89. package/dest/contract_function_simulator/oracle/acir_callback.d.ts +21 -0
  90. package/dest/contract_function_simulator/oracle/acir_callback.d.ts.map +1 -0
  91. package/dest/contract_function_simulator/oracle/acir_callback.js +115 -0
  92. package/dest/contract_function_simulator/oracle/index.d.ts +2 -13
  93. package/dest/contract_function_simulator/oracle/index.d.ts.map +1 -1
  94. package/dest/contract_function_simulator/oracle/index.js +1 -1
  95. package/dest/contract_function_simulator/oracle/interfaces.d.ts +2 -3
  96. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  97. package/dest/contract_function_simulator/oracle/legacy_oracle_registry.d.ts +39 -0
  98. package/dest/contract_function_simulator/oracle/legacy_oracle_registry.d.ts.map +1 -0
  99. package/dest/contract_function_simulator/oracle/legacy_oracle_registry.js +107 -0
  100. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts +3 -14
  101. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts.map +1 -1
  102. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.js +1 -24
  103. package/dest/contract_function_simulator/oracle/oracle_registry.d.ts +41 -30
  104. package/dest/contract_function_simulator/oracle/oracle_registry.d.ts.map +1 -1
  105. package/dest/contract_function_simulator/oracle/oracle_registry.js +248 -27
  106. package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts +123 -40
  107. package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts.map +1 -1
  108. package/dest/contract_function_simulator/oracle/oracle_type_mappings.js +947 -264
  109. package/dest/contract_function_simulator/oracle/private_execution.d.ts +1 -1
  110. package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
  111. package/dest/contract_function_simulator/oracle/private_execution.js +2 -3
  112. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +21 -8
  113. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  114. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +128 -17
  115. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +73 -33
  116. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  117. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +220 -104
  118. package/dest/contract_function_simulator/transient_array_service.d.ts +31 -0
  119. package/dest/contract_function_simulator/transient_array_service.d.ts.map +1 -0
  120. package/dest/contract_function_simulator/transient_array_service.js +62 -0
  121. package/dest/debug/pxe_debug_utils.d.ts +2 -2
  122. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  123. package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
  124. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  125. package/dest/entrypoints/client/bundle/utils.js +8 -3
  126. package/dest/entrypoints/client/lazy/utils.d.ts +1 -1
  127. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  128. package/dest/entrypoints/client/lazy/utils.js +8 -3
  129. package/dest/entrypoints/pxe_creation_options.d.ts +9 -3
  130. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  131. package/dest/entrypoints/server/index.d.ts +5 -3
  132. package/dest/entrypoints/server/index.d.ts.map +1 -1
  133. package/dest/entrypoints/server/index.js +3 -2
  134. package/dest/entrypoints/server/utils.d.ts +1 -1
  135. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  136. package/dest/entrypoints/server/utils.js +8 -2
  137. package/dest/error_enriching.d.ts +5 -3
  138. package/dest/error_enriching.d.ts.map +1 -1
  139. package/dest/error_enriching.js +13 -11
  140. package/dest/hooks/execution_hooks.d.ts +31 -11
  141. package/dest/hooks/execution_hooks.d.ts.map +1 -1
  142. package/dest/hooks/execution_hooks.js +3 -3
  143. package/dest/hooks/index.d.ts +4 -3
  144. package/dest/hooks/index.d.ts.map +1 -1
  145. package/dest/hooks/index.js +1 -0
  146. package/dest/hooks/resolve_custom_request.d.ts +23 -0
  147. package/dest/hooks/resolve_custom_request.d.ts.map +1 -0
  148. package/dest/hooks/resolve_custom_request.js +3 -0
  149. package/dest/hooks/resolve_tagging_secret_strategy.d.ts +50 -0
  150. package/dest/hooks/resolve_tagging_secret_strategy.d.ts.map +1 -0
  151. package/dest/hooks/resolve_tagging_secret_strategy.js +3 -0
  152. package/dest/logs/log_service.d.ts +7 -6
  153. package/dest/logs/log_service.d.ts.map +1 -1
  154. package/dest/logs/log_service.js +79 -28
  155. package/dest/messages/tx_resolver_service.d.ts +17 -0
  156. package/dest/messages/tx_resolver_service.d.ts.map +1 -0
  157. package/dest/messages/{message_context_service.js → tx_resolver_service.js} +8 -8
  158. package/dest/oracle_version.d.ts +3 -3
  159. package/dest/oracle_version.js +5 -5
  160. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +1 -1
  161. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -1
  162. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.js +6 -2
  163. package/dest/private_kernel/hints/test_utils.js +1 -1
  164. package/dest/private_kernel/private_kernel_execution_prover.d.ts +1 -1
  165. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  166. package/dest/private_kernel/private_kernel_execution_prover.js +17 -36
  167. package/dest/private_kernel/private_kernel_oracle.d.ts +4 -2
  168. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  169. package/dest/private_kernel/private_kernel_oracle.js +17 -5
  170. package/dest/pxe.d.ts +114 -48
  171. package/dest/pxe.d.ts.map +1 -1
  172. package/dest/pxe.js +222 -139
  173. package/dest/storage/allowed_scopes.d.ts +6 -0
  174. package/dest/storage/allowed_scopes.d.ts.map +1 -0
  175. package/dest/storage/allowed_scopes.js +7 -0
  176. package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -6
  177. package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
  178. package/dest/storage/anchor_block_store/anchor_block_store.js +8 -6
  179. package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts +1 -1
  180. package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts.map +1 -1
  181. package/dest/storage/backwards_compatibility_tests/schema_tests.js +129 -49
  182. package/dest/storage/capsule_store/capsule_service.d.ts +1 -1
  183. package/dest/storage/capsule_store/capsule_service.d.ts.map +1 -1
  184. package/dest/storage/capsule_store/capsule_service.js +6 -9
  185. package/dest/storage/contract_store/contract_store.d.ts +27 -24
  186. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  187. package/dest/storage/contract_store/contract_store.js +64 -75
  188. package/dest/storage/fact_store/fact_service.d.ts +22 -0
  189. package/dest/storage/fact_store/fact_service.d.ts.map +1 -0
  190. package/dest/storage/fact_store/fact_service.js +45 -0
  191. package/dest/storage/fact_store/fact_store.d.ts +95 -0
  192. package/dest/storage/fact_store/fact_store.d.ts.map +1 -0
  193. package/dest/storage/fact_store/fact_store.js +408 -0
  194. package/dest/storage/fact_store/fact_store_keys.d.ts +34 -0
  195. package/dest/storage/fact_store/fact_store_keys.d.ts.map +1 -0
  196. package/dest/storage/fact_store/fact_store_keys.js +50 -0
  197. package/dest/storage/fact_store/index.d.ts +6 -0
  198. package/dest/storage/fact_store/index.d.ts.map +1 -0
  199. package/dest/storage/fact_store/index.js +4 -0
  200. package/dest/storage/fact_store/origin_state.d.ts +57 -0
  201. package/dest/storage/fact_store/origin_state.d.ts.map +1 -0
  202. package/dest/storage/fact_store/origin_state.js +53 -0
  203. package/dest/storage/fact_store/stored_fact.d.ts +32 -0
  204. package/dest/storage/fact_store/stored_fact.d.ts.map +1 -0
  205. package/dest/storage/fact_store/stored_fact.js +64 -0
  206. package/dest/storage/index.d.ts +3 -2
  207. package/dest/storage/index.d.ts.map +1 -1
  208. package/dest/storage/index.js +2 -1
  209. package/dest/storage/metadata.d.ts +2 -2
  210. package/dest/storage/metadata.d.ts.map +1 -1
  211. package/dest/storage/metadata.js +1 -1
  212. package/dest/storage/note_store/note_store.d.ts +42 -33
  213. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  214. package/dest/storage/note_store/note_store.js +197 -168
  215. package/dest/storage/note_store/stored_note.d.ts +3 -8
  216. package/dest/storage/note_store/stored_note.d.ts.map +1 -1
  217. package/dest/storage/note_store/stored_note.js +4 -20
  218. package/dest/storage/open_pxe_stores.d.ts +5 -3
  219. package/dest/storage/open_pxe_stores.d.ts.map +1 -1
  220. package/dest/storage/open_pxe_stores.js +5 -3
  221. package/dest/storage/private_event_store/private_event_store.d.ts +13 -16
  222. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  223. package/dest/storage/private_event_store/private_event_store.js +40 -43
  224. package/dest/storage/tagging_store/index.d.ts +2 -2
  225. package/dest/storage/tagging_store/index.d.ts.map +1 -1
  226. package/dest/storage/tagging_store/index.js +1 -1
  227. package/dest/storage/tagging_store/tagging_secret_sources_store.d.ts +51 -0
  228. package/dest/storage/tagging_store/tagging_secret_sources_store.d.ts.map +1 -0
  229. package/dest/storage/tagging_store/tagging_secret_sources_store.js +105 -0
  230. package/dest/tagging/constants.d.ts +2 -2
  231. package/dest/tagging/constants.d.ts.map +1 -1
  232. package/dest/tagging/constants.js +18 -9
  233. package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts +21 -8
  234. package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts.map +1 -1
  235. package/dest/tagging/recipient_sync/sync_tagged_private_logs.js +56 -16
  236. package/package.json +17 -17
  237. package/src/bin/check_oracle_version.ts +10 -19
  238. package/src/bin/index.ts +5 -1
  239. package/src/bin/oracle_version_helpers.ts +190 -0
  240. package/src/block_synchronizer/block_stream_source.ts +6 -45
  241. package/src/block_synchronizer/block_synchronizer.ts +70 -29
  242. package/src/config/index.ts +1 -0
  243. package/src/config/package_info.ts +1 -1
  244. package/src/contract/contract_class_service.ts +83 -0
  245. package/src/{contract_sync → contract}/contract_sync_service.ts +37 -50
  246. package/src/contract/helpers.ts +35 -0
  247. package/src/contract_function_simulator/anchored_contract_data.ts +74 -0
  248. package/src/contract_function_simulator/aztec_node_read_cache.ts +89 -0
  249. package/src/contract_function_simulator/contract_function_simulator.ts +97 -45
  250. package/src/contract_function_simulator/execution_note_cache.ts +7 -28
  251. package/src/contract_function_simulator/index.ts +26 -11
  252. package/src/contract_function_simulator/noir-structs/bounded_vec.ts +12 -24
  253. package/src/contract_function_simulator/noir-structs/contract_class_log_data.ts +9 -0
  254. package/src/contract_function_simulator/noir-structs/embedded_curve_point.ts +4 -0
  255. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +1 -1
  256. package/src/contract_function_simulator/noir-structs/fact.ts +13 -0
  257. package/src/contract_function_simulator/noir-structs/fact_collection.ts +64 -0
  258. package/src/contract_function_simulator/noir-structs/log_retrieval_request.ts +20 -46
  259. package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +13 -60
  260. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +2 -2
  261. package/src/contract_function_simulator/noir-structs/option.ts +17 -11
  262. package/src/contract_function_simulator/noir-structs/origin_block.ts +8 -0
  263. package/src/contract_function_simulator/noir-structs/pending_tagged_log.ts +12 -0
  264. package/src/contract_function_simulator/noir-structs/provided_secret.ts +4 -26
  265. package/src/contract_function_simulator/noir-structs/resolved_tagging_strategy.ts +66 -0
  266. package/src/contract_function_simulator/noir-structs/resolved_tx.ts +53 -0
  267. package/src/contract_function_simulator/noir-structs/tx_effect_data.ts +15 -0
  268. package/src/contract_function_simulator/noir-structs/utility_context.ts +5 -17
  269. package/src/contract_function_simulator/oracle/acir_callback.ts +154 -0
  270. package/src/contract_function_simulator/oracle/index.ts +1 -15
  271. package/src/contract_function_simulator/oracle/interfaces.ts +1 -2
  272. package/src/contract_function_simulator/oracle/legacy_oracle_registry.ts +147 -0
  273. package/src/contract_function_simulator/oracle/message_load_oracle_inputs.ts +6 -21
  274. package/src/contract_function_simulator/oracle/oracle_registry.ts +162 -41
  275. package/src/contract_function_simulator/oracle/oracle_type_mappings.ts +659 -248
  276. package/src/contract_function_simulator/oracle/private_execution.ts +2 -3
  277. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +156 -24
  278. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +357 -131
  279. package/src/contract_function_simulator/transient_array_service.ts +91 -0
  280. package/src/debug/pxe_debug_utils.ts +1 -1
  281. package/src/entrypoints/client/bundle/utils.ts +10 -3
  282. package/src/entrypoints/client/lazy/utils.ts +10 -3
  283. package/src/entrypoints/pxe_creation_options.ts +8 -2
  284. package/src/entrypoints/server/index.ts +5 -2
  285. package/src/entrypoints/server/utils.ts +10 -2
  286. package/src/error_enriching.ts +27 -11
  287. package/src/hooks/execution_hooks.ts +32 -12
  288. package/src/hooks/index.ts +8 -2
  289. package/src/hooks/resolve_custom_request.ts +24 -0
  290. package/src/hooks/resolve_tagging_secret_strategy.ts +60 -0
  291. package/src/logs/log_service.ts +91 -37
  292. package/src/messages/{message_context_service.ts → tx_resolver_service.ts} +16 -9
  293. package/src/oracle_version.ts +5 -5
  294. package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +11 -1
  295. package/src/private_kernel/hints/test_utils.ts +1 -1
  296. package/src/private_kernel/private_kernel_execution_prover.ts +22 -52
  297. package/src/private_kernel/private_kernel_oracle.ts +23 -4
  298. package/src/pxe.ts +325 -159
  299. package/src/storage/allowed_scopes.ts +14 -0
  300. package/src/storage/anchor_block_store/anchor_block_store.ts +8 -6
  301. package/src/storage/backwards_compatibility_tests/__snapshots__/AddressStore.json +6 -6
  302. package/src/storage/backwards_compatibility_tests/__snapshots__/ContractStore.json +1 -1
  303. package/src/storage/backwards_compatibility_tests/__snapshots__/FactStore.json +40 -0
  304. package/src/storage/backwards_compatibility_tests/__snapshots__/KeyStore.json +12 -12
  305. package/src/storage/backwards_compatibility_tests/__snapshots__/L2TipsKVStore.json +9 -15
  306. package/src/storage/backwards_compatibility_tests/__snapshots__/NoteStore.json +24 -4
  307. package/src/storage/backwards_compatibility_tests/__snapshots__/RecipientTaggingStore.json +11 -3
  308. package/src/storage/backwards_compatibility_tests/__snapshots__/SenderTaggingStore.json +12 -4
  309. package/src/storage/backwards_compatibility_tests/__snapshots__/TaggingSecretSourcesStore.json +30 -0
  310. package/src/storage/backwards_compatibility_tests/__snapshots__/opened_stores.json +29 -9
  311. package/src/storage/backwards_compatibility_tests/schema_tests.ts +141 -50
  312. package/src/storage/capsule_store/capsule_service.ts +8 -13
  313. package/src/storage/contract_store/contract_store.ts +86 -93
  314. package/src/storage/fact_store/fact_service.ts +69 -0
  315. package/src/storage/fact_store/fact_store.ts +487 -0
  316. package/src/storage/fact_store/fact_store_keys.ts +75 -0
  317. package/src/storage/fact_store/index.ts +14 -0
  318. package/src/storage/fact_store/origin_state.ts +75 -0
  319. package/src/storage/fact_store/stored_fact.ts +80 -0
  320. package/src/storage/index.ts +2 -1
  321. package/src/storage/metadata.ts +1 -1
  322. package/src/storage/note_store/note_store.ts +226 -187
  323. package/src/storage/note_store/stored_note.ts +5 -27
  324. package/src/storage/open_pxe_stores.ts +6 -3
  325. package/src/storage/private_event_store/private_event_store.ts +49 -55
  326. package/src/storage/tagging_store/index.ts +1 -1
  327. package/src/storage/tagging_store/tagging_secret_sources_store.ts +138 -0
  328. package/src/tagging/constants.ts +19 -9
  329. package/src/tagging/recipient_sync/sync_tagged_private_logs.ts +77 -16
  330. package/dest/contract_function_simulator/oracle/oracle.d.ts +0 -89
  331. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +0 -1
  332. package/dest/contract_function_simulator/oracle/oracle.js +0 -552
  333. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts +0 -6
  334. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts.map +0 -1
  335. package/dest/contract_function_simulator/proxied_contract_data_source.js +0 -51
  336. package/dest/contract_sync/contract_sync_service.d.ts +0 -42
  337. package/dest/contract_sync/contract_sync_service.d.ts.map +0 -1
  338. package/dest/contract_sync/helpers.d.ts +0 -27
  339. package/dest/contract_sync/helpers.d.ts.map +0 -1
  340. package/dest/contract_sync/helpers.js +0 -53
  341. package/dest/messages/message_context_service.d.ts +0 -17
  342. package/dest/messages/message_context_service.d.ts.map +0 -1
  343. package/dest/storage/tagging_store/sender_address_book_store.d.ts +0 -14
  344. package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +0 -1
  345. package/dest/storage/tagging_store/sender_address_book_store.js +0 -36
  346. package/src/contract_function_simulator/oracle/oracle.ts +0 -711
  347. package/src/contract_function_simulator/proxied_contract_data_source.ts +0 -60
  348. package/src/contract_sync/helpers.ts +0 -86
  349. package/src/storage/backwards_compatibility_tests/__snapshots__/SenderAddressBookStore.json +0 -16
  350. package/src/storage/tagging_store/sender_address_book_store.ts +0 -48
@@ -1,48 +1,26 @@
1
- import { BlockNumber } from '@aztec/foundation/branded-types';
2
1
  import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
3
2
  import { NoteDao } from '@aztec/stdlib/note';
4
3
 
4
+ /** A note as stored by the PXE: the note DAO plus the scopes that observed it. Append-only — never mutated. */
5
5
  export class StoredNote {
6
6
  constructor(
7
7
  readonly noteDao: NoteDao,
8
8
  readonly scopes: Set<string>,
9
- private _nullifiedAt: BlockNumber | undefined = undefined,
10
9
  ) {}
11
10
 
12
- static fromBuffer(buffer: Buffer) {
11
+ static fromBuffer(buffer: Buffer): StoredNote {
13
12
  const reader = BufferReader.asReader(buffer);
14
-
15
13
  const noteDao = NoteDao.fromBuffer(reader);
16
14
  const scopes = reader.readVector({ fromBuffer: (r: BufferReader) => r.readString() });
17
-
18
- const nullifiedAtRaw = reader.readNumber();
19
- const nullifiedAt = nullifiedAtRaw === 0 ? undefined : (nullifiedAtRaw as BlockNumber);
20
-
21
- return new StoredNote(noteDao, new Set(scopes), nullifiedAt);
15
+ return new StoredNote(noteDao, new Set(scopes));
22
16
  }
23
17
 
24
18
  toBuffer(): Buffer {
25
19
  const scopesArray = [...this.scopes];
26
- return serializeToBuffer(this.noteDao, scopesArray.length, ...scopesArray, this._nullifiedAt ?? 0);
20
+ return serializeToBuffer(this.noteDao, scopesArray.length, ...scopesArray);
27
21
  }
28
22
 
29
- addScope(scope: string) {
23
+ addScope(scope: string): void {
30
24
  this.scopes.add(scope);
31
25
  }
32
-
33
- markAsNullified(blockNumber: BlockNumber) {
34
- this._nullifiedAt = blockNumber;
35
- }
36
-
37
- markAsActive() {
38
- this._nullifiedAt = undefined;
39
- }
40
-
41
- isNullified() {
42
- return this._nullifiedAt !== undefined;
43
- }
44
-
45
- get nullifiedAt() {
46
- return this._nullifiedAt;
47
- }
48
26
  }
@@ -7,9 +7,10 @@ import { AddressStore } from './address_store/address_store.js';
7
7
  import { AnchorBlockStore } from './anchor_block_store/anchor_block_store.js';
8
8
  import { CapsuleStore } from './capsule_store/capsule_store.js';
9
9
  import { ContractStore } from './contract_store/contract_store.js';
10
+ import { FactStore } from './fact_store/fact_store.js';
10
11
  import { NoteStore } from './note_store/note_store.js';
11
12
  import { PrivateEventStore } from './private_event_store/private_event_store.js';
12
- import { RecipientTaggingStore, SenderAddressBookStore, SenderTaggingStore } from './tagging_store/index.js';
13
+ import { RecipientTaggingStore, SenderTaggingStore, TaggingSecretSourcesStore } from './tagging_store/index.js';
13
14
 
14
15
  /**
15
16
  * The set of sub-stores opened against a single `AztecAsyncKVStore` to back PXE state.
@@ -21,11 +22,12 @@ export type PxeStores = {
21
22
  noteStore: NoteStore;
22
23
  anchorBlockStore: AnchorBlockStore;
23
24
  senderTaggingStore: SenderTaggingStore;
24
- senderAddressBookStore: SenderAddressBookStore;
25
+ taggingSecretSourcesStore: TaggingSecretSourcesStore;
25
26
  recipientTaggingStore: RecipientTaggingStore;
26
27
  capsuleStore: CapsuleStore;
27
28
  keyStore: KeyStore;
28
29
  l2TipsStore: L2TipsKVStore;
30
+ factStore: FactStore;
29
31
  };
30
32
 
31
33
  /**
@@ -40,10 +42,11 @@ export function openPxeStores(store: AztecAsyncKVStore, initialBlockHash: BlockH
40
42
  noteStore: new NoteStore(store),
41
43
  anchorBlockStore: new AnchorBlockStore(store),
42
44
  senderTaggingStore: new SenderTaggingStore(store),
43
- senderAddressBookStore: new SenderAddressBookStore(store),
45
+ taggingSecretSourcesStore: new TaggingSecretSourcesStore(store),
44
46
  recipientTaggingStore: new RecipientTaggingStore(store),
45
47
  capsuleStore: new CapsuleStore(store),
46
48
  keyStore: new KeyStore(store),
47
49
  l2TipsStore: new L2TipsKVStore(store, 'pxe', initialBlockHash),
50
+ factStore: new FactStore(store),
48
51
  };
49
52
  }
@@ -28,25 +28,35 @@ type PrivateEventMetadata = InTx & {
28
28
  eventIndexInTx: number;
29
29
  };
30
30
 
31
+ /// Alias types for kv map readability
32
+ type EventId = string; // the siloedEventCommitment, stringified
33
+ type JobId = string;
34
+ type ContractAndSelectorKey = string;
35
+ type BlockNum = number;
36
+ type StoredEventBuffer = Buffer;
37
+
31
38
  /**
32
39
  * Stores decrypted private event logs.
40
+ *
41
+ * Append-only: events are never deleted during normal operation. Reorgs are handled by delete-on-prune, which removes
42
+ * every event originating on a reorg'd block.
33
43
  */
34
44
  export class PrivateEventStore implements StagedStore {
35
45
  readonly storeName: string = 'private_event';
36
46
 
37
47
  #store: AztecAsyncKVStore;
38
48
  /** Actual private event log entries, keyed by siloedEventCommitment */
39
- #events: AztecAsyncMap<string, Buffer>;
49
+ #events: AztecAsyncMap<EventId, StoredEventBuffer>;
40
50
  /** Multi-map from contractAddress_eventSelector to siloedEventCommitment for efficient lookup */
41
- #eventsByContractAndEventSelector: AztecAsyncMultiMap<string, string>;
42
- /** Multi-map from block number to siloedEventCommitment for rollback support */
43
- #eventsByBlockNumber: AztecAsyncMultiMap<number, string>;
51
+ #eventsByContractAndEventSelector: AztecAsyncMultiMap<ContractAndSelectorKey, EventId>;
52
+ /** Multi-map from block number to siloedEventCommitment, for delete-on-prune. */
53
+ #eventsByBlockNumber: AztecAsyncMultiMap<BlockNum, EventId>;
44
54
 
45
55
  /** jobId => eventId (event siloed nullifier) => StoredPrivateEvent */
46
- #eventsForJob: Map<string, Map<string, StoredPrivateEvent>>;
56
+ #eventsForJob: Map<JobId, Map<EventId, StoredPrivateEvent>>;
47
57
 
48
58
  /** Per-job locks to prevent concurrent writes from affecting each other. */
49
- #jobLocks: Map<string, Semaphore>;
59
+ #jobLocks: Map<JobId, Semaphore>;
50
60
 
51
61
  logger = createLogger('private_event_store');
52
62
 
@@ -216,65 +226,49 @@ export class PrivateEventStore implements StagedStore {
216
226
  });
217
227
  }
218
228
 
229
+ /** Returns the ids (siloed event commitments) of all events emitted at the given block number. Used by delete-on-prune. */
230
+ public async eventIdsAtBlock(blockNumber: number): Promise<string[]> {
231
+ const eventIds: string[] = [];
232
+ for await (const eventId of this.#eventsByBlockNumber.getValuesAsync(blockNumber)) {
233
+ eventIds.push(eventId);
234
+ }
235
+ return eventIds;
236
+ }
237
+
219
238
  /**
220
- * Rolls back private events that were stored after a given `blockNumber` and up to `synchedBlockNumber` (the block
221
- * number up to which PXE managed to sync before the reorg happened).
222
- *
223
- * We don't need staged writes for a rollback since it's handled in the context of a blockchain rewind.
239
+ * Rolls the store back to `toBlock`: deletes every event anchored to a block strictly above it, as if nothing past
240
+ * that block height ever happened. Used by the reorg (`chain-pruned`) path to truncate the orphaned tail. Scanning
241
+ * from `toBlock + 1` upward covers everything above the rollback target without needing to know the chain tip.
224
242
  *
225
- * Rollbacks are handled by the BlockSynchronizer, which runs a DB transaction across stores when it detects a
226
- * re-org, including setting the new anchor block after rolling back.
227
- *
228
- * So if anything fails in the process of rolling back any store, all DB changes occurring during rollbacks will be
229
- * lost and the anchor block will not be updated; which means this code will eventually need to run again
230
- * (i.e.: PXE will detect it's basing it work on an invalid block hash, then which re-triggers rewind).
231
- *
232
- * For further details, refer to `BlockSynchronizer#handleBlockStreamEvent`.
233
- *
234
- * IMPORTANT: This method must be called within a transaction to ensure atomicity.
243
+ * Must be called inside a transaction owned by the caller (it issues no `transactionAsync` of its own, the reorg
244
+ * path wraps it together with the anchor update, and IndexedDB has no nested transactions). Throws if any job has
245
+ * uncommitted staged writes, since rolling back mid-job could later re-introduce events anchored to deleted blocks.
235
246
  */
236
- public async rollback(blockNumber: number, synchedBlockNumber: number): Promise<void> {
247
+ public async rollback(toBlock: number): Promise<void> {
237
248
  if (this.#eventsForJob.size > 0) {
238
249
  throw new Error('PXE private event store rollback is not allowed while jobs are running');
239
250
  }
240
-
241
- // First pass: collect all event IDs for all blocks, starting reads during iteration to keep tx alive.
242
- const eventsByBlock: Map<number, { eventId: string; eventReadPromise: Promise<Buffer | undefined> }[]> = new Map();
243
-
244
- for (let block = blockNumber + 1; block <= synchedBlockNumber; block++) {
245
- const blockEvents: { eventId: string; eventReadPromise: Promise<Buffer | undefined> }[] = [];
246
- for await (const eventId of this.#eventsByBlockNumber.getValuesAsync(block)) {
247
- // Start read immediately during iteration to keep IndexedDB transaction alive
248
- blockEvents.push({ eventId, eventReadPromise: this.#events.getAsync(eventId) });
249
- }
250
- if (blockEvents.length > 0) {
251
- eventsByBlock.set(block, blockEvents);
252
- }
251
+ // Snapshot before mutating so we never delete from the multimap we are iterating.
252
+ const orphaned: { block: number; eventId: string }[] = [];
253
+ for await (const [block, eventId] of this.#eventsByBlockNumber.entriesAsync({ start: toBlock + 1 })) {
254
+ orphaned.push({ block, eventId });
253
255
  }
254
-
255
- // Second pass: await reads and perform deletes
256
256
  let removedCount = 0;
257
- for (const [block, events] of eventsByBlock) {
258
- await this.#eventsByBlockNumber.delete(block);
259
-
260
- for (const { eventId, eventReadPromise } of events) {
261
- const buffer = await eventReadPromise;
262
- if (!buffer) {
263
- throw new Error(`Event not found for eventId ${eventId}`);
264
- }
265
-
266
- const entry = StoredPrivateEvent.fromBuffer(buffer);
267
- await this.#events.delete(eventId);
268
- await this.#eventsByContractAndEventSelector.deleteValue(
269
- this.#keyFor(entry.contractAddress, entry.eventSelector),
270
- eventId,
271
- );
272
-
273
- removedCount++;
257
+ for (const { block, eventId } of orphaned) {
258
+ const buf = await this.#events.getAsync(eventId);
259
+ if (!buf) {
260
+ throw new Error(`Event not found for eventId ${eventId}`);
274
261
  }
262
+ const stored = StoredPrivateEvent.fromBuffer(buf);
263
+ await this.#events.delete(eventId);
264
+ await this.#eventsByContractAndEventSelector.deleteValue(
265
+ this.#keyFor(stored.contractAddress, stored.eventSelector),
266
+ eventId,
267
+ );
268
+ await this.#eventsByBlockNumber.deleteValue(block, eventId);
269
+ removedCount++;
275
270
  }
276
-
277
- this.logger.verbose(`Rolled back ${removedCount} private events after block ${blockNumber}`);
271
+ this.logger.verbose('rolled back private events', { removedCount, toBlock });
278
272
  }
279
273
 
280
274
  /**
@@ -1,3 +1,3 @@
1
1
  export { SenderTaggingStore } from './sender_tagging_store.js';
2
- export { SenderAddressBookStore } from './sender_address_book_store.js';
2
+ export { TaggingSecretSourcesStore } from './tagging_secret_sources_store.js';
3
3
  export { RecipientTaggingStore } from './recipient_tagging_store.js';
@@ -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,20 @@
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.
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.
6
5
  //
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;
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;
@@ -3,7 +3,7 @@ import { isDefined } from '@aztec/foundation/types';
3
3
  import type { BlockHash } from '@aztec/stdlib/block';
4
4
  import type { AztecNode } from '@aztec/stdlib/interfaces/client';
5
5
  import type { AppTaggingSecret, LogResult } from '@aztec/stdlib/logs';
6
- import { SiloedTag } from '@aztec/stdlib/logs';
6
+ import { AppTaggingSecretKind, SiloedTag } from '@aztec/stdlib/logs';
7
7
  import type { BlockHeader } from '@aztec/stdlib/tx';
8
8
 
9
9
  import type { RecipientTaggingStore } from '../../storage/tagging_store/recipient_tagging_store.js';
@@ -13,11 +13,12 @@ import { findHighestIndexes } from './utils/find_highest_indexes.js';
13
13
 
14
14
  /**
15
15
  * Fetches and syncs tagged private logs for multiple sender-recipient pairs, batching tag queries across all secrets
16
- * into shared RPC calls.
16
+ * into shared RPC calls. Handles both constrained and unconstrained secrets, which differ in their scan strategy
17
+ * but share the same batching infrastructure.
17
18
  *
18
- * # Explanation of how the algorithm works
19
+ * # Unconstrained secrets
19
20
  *
20
- * For each secret we sync logs that correspond to the tagging index range
21
+ * For each unconstrained secret we sync logs that correspond to the tagging index range
21
22
  * (highestAgedIndex, highestFinalizedIndex + WINDOW_LEN]
22
23
  *
23
24
  * highestAgedIndex is the highest index that was used in a tx that is included in a block at least
@@ -54,11 +55,23 @@ import { findHighestIndexes } from './utils/find_highest_indexes.js';
54
55
  * the highest finalized index. If that index was already used, they will throw an error. For this reason we
55
56
  * don't have to look further than `highestFinalizedIndex + WINDOW_LEN`.
56
57
  *
57
- * ## Batching across secrets
58
+ * # Constrained secrets
58
59
  *
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.
60
+ * Constrained delivery enforces a contiguous index sequence (each send proves the predecessor's nullifier,
61
+ * chaining back to the handshake), so there is only one sender and indexes are sequential. This means:
62
+ * - The lower bound is `highestFinalizedIndex + 1`. The `highestAgedIndex` mechanism is unnecessary because
63
+ * the nullifier chain prevents out-of-order index usage: no device can fill in a lower index after a higher
64
+ * one is already on-chain.
65
+ * - The scan stops at the first gap in the index sequence. If all indexes in the batch have logs, the window
66
+ * advances. If a gap is found, the sequence has ended and no further logs exist.
67
+ * - The upper bound is the same as unconstrained: `highestFinalizedIndex + WINDOW_LEN`.
68
+ *
69
+ * # Batching across secrets
70
+ *
71
+ * Instead of running one RPC call per secret, we merge tags from all pending secrets (both constrained and
72
+ * unconstrained) into a single flat array, make one batched `getAllPrivateLogsByTags` call (which internally
73
+ * chunks at MAX_RPC_LEN), then split results back per secret using tracked offsets. Only secrets whose window
74
+ * advanced are kept for the next iteration.
62
75
  */
63
76
  export async function syncTaggedPrivateLogs(
64
77
  secrets: AppTaggingSecret[],
@@ -96,7 +109,12 @@ export async function syncTaggedPrivateLogs(
96
109
 
97
110
  // Persist new indexes. If the finalized index moved forward, the window advances
98
111
  // and we need another round for this secret.
99
- return await updateIndexesAndAdvanceWindow(
112
+ const processForKind =
113
+ pendingSecret.secret.kind === AppTaggingSecretKind.CONSTRAINED
114
+ ? processConstrainedResults
115
+ : processUnconstrainedResults;
116
+
117
+ return await processForKind(
100
118
  pendingSecret,
101
119
  logsFoundWithSecret,
102
120
  taggingStore,
@@ -121,12 +139,14 @@ function getIndexRangesForSecrets(
121
139
  ): Promise<PendingSecret[]> {
122
140
  return Promise.all(
123
141
  secrets.map(async secret => {
124
- const [currentHighestAgedIndex, currentHighestFinalizedIndex] = await Promise.all([
125
- taggingStore.getHighestAgedIndex(secret, jobId),
126
- taggingStore.getHighestFinalizedIndex(secret, jobId),
127
- ]);
142
+ const currentHighestFinalizedIndex = await taggingStore.getHighestFinalizedIndex(secret, jobId);
143
+
144
+ const highestIndexBeforeStart =
145
+ secret.kind === AppTaggingSecretKind.CONSTRAINED
146
+ ? currentHighestFinalizedIndex
147
+ : await taggingStore.getHighestAgedIndex(secret, jobId);
148
+ const start = highestIndexBeforeStart === undefined ? 0 : highestIndexBeforeStart + 1;
128
149
 
129
- const start = currentHighestAgedIndex === undefined ? 0 : currentHighestAgedIndex + 1;
130
150
  const end = (currentHighestFinalizedIndex ?? 0) + UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN + 1;
131
151
 
132
152
  return { secret, start, end };
@@ -183,10 +203,51 @@ async function fetchLogsForSecrets(
183
203
  }
184
204
 
185
205
  /**
186
- * Processes a single secret's fetched logs: updates stored indexes and returns a new PendingSecret
206
+ * Processes fetched logs for a constrained secret. Constrained delivery guarantees contiguous index sequences,
207
+ * so we scan from the start of the queried range and stop at the first missing index. Only `highestFinalizedIndex`
208
+ * is tracked (no aged index).
209
+ */
210
+ async function processConstrainedResults(
211
+ pending: PendingSecret,
212
+ logsWithIndexes: LogWithIndex[],
213
+ taggingStore: RecipientTaggingStore,
214
+ currentTimestamp: bigint,
215
+ finalizedBlockNumber: BlockNumber,
216
+ jobId: string,
217
+ ): Promise<PendingSecret | undefined> {
218
+ // Find where the contiguous run of indexes ends. Constrained delivery guarantees there are no logs after the
219
+ // first gap, so all logs in the batch are within this prefix.
220
+ const indexesWithLogs = new Set(logsWithIndexes.map(l => l.taggingIndex));
221
+ let firstMissingIndex = pending.start;
222
+ while (firstMissingIndex < pending.end && indexesWithLogs.has(firstMissingIndex)) {
223
+ firstMissingIndex++;
224
+ }
225
+
226
+ // Finalize any logs before the gap. The nullifier for a constrained-delivery log is emitted in the same
227
+ // transaction, guaranteeing the log cannot disappear once included, so we persist the highest finalized
228
+ // index even when a gap stops the scan. This lets the next sync round skip already-finalized indexes.
229
+ const { highestFinalizedIndex } = findHighestIndexes(logsWithIndexes, currentTimestamp, finalizedBlockNumber);
230
+
231
+ if (highestFinalizedIndex !== undefined) {
232
+ await taggingStore.updateHighestFinalizedIndex(pending.secret, highestFinalizedIndex, jobId);
233
+
234
+ if (firstMissingIndex >= pending.end) {
235
+ return {
236
+ secret: pending.secret,
237
+ start: pending.end,
238
+ end: highestFinalizedIndex + UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN + 1,
239
+ };
240
+ }
241
+ }
242
+
243
+ return undefined;
244
+ }
245
+
246
+ /**
247
+ * Processes a single unconstrained secret's fetched logs: updates stored indexes and returns a new PendingSecret
187
248
  * if the window needs to advance, or undefined if this secret is done.
188
249
  */
189
- async function updateIndexesAndAdvanceWindow(
250
+ async function processUnconstrainedResults(
190
251
  pending: PendingSecret,
191
252
  logsWithIndexes: LogWithIndex[],
192
253
  taggingStore: RecipientTaggingStore,