@aztec/stdlib 6.0.0-nightly.20260604 → 6.0.0-nightly.20260721

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 (499) hide show
  1. package/dest/abi/buffer.d.ts +6 -2
  2. package/dest/abi/buffer.d.ts.map +1 -1
  3. package/dest/abi/buffer.js +13 -1
  4. package/dest/avm/avm.js +1 -1
  5. package/dest/avm/avm_proving_request.d.ts +70 -70
  6. package/dest/avm/index.d.ts +1 -6
  7. package/dest/avm/index.d.ts.map +1 -1
  8. package/dest/avm/index.js +0 -5
  9. package/dest/aztec-address/index.d.ts +35 -5
  10. package/dest/aztec-address/index.d.ts.map +1 -1
  11. package/dest/aztec-address/index.js +32 -8
  12. package/dest/block/attestation_info.d.ts +1 -1
  13. package/dest/block/attestation_info.d.ts.map +1 -1
  14. package/dest/block/attestation_info.js +7 -4
  15. package/dest/block/l2_block_source.d.ts +46 -23
  16. package/dest/block/l2_block_source.d.ts.map +1 -1
  17. package/dest/block/l2_block_source.js +15 -1
  18. package/dest/block/l2_block_stream/event_driven_l2_block_stream.d.ts +39 -0
  19. package/dest/block/l2_block_stream/event_driven_l2_block_stream.d.ts.map +1 -0
  20. package/dest/block/l2_block_stream/event_driven_l2_block_stream.js +165 -0
  21. package/dest/block/l2_block_stream/index.d.ts +2 -1
  22. package/dest/block/l2_block_stream/index.d.ts.map +1 -1
  23. package/dest/block/l2_block_stream/index.js +1 -0
  24. package/dest/block/l2_block_stream/interfaces.d.ts +81 -11
  25. package/dest/block/l2_block_stream/interfaces.d.ts.map +1 -1
  26. package/dest/block/l2_block_stream/interfaces.js +25 -1
  27. package/dest/block/l2_block_stream/l2_block_stream.d.ts +23 -15
  28. package/dest/block/l2_block_stream/l2_block_stream.d.ts.map +1 -1
  29. package/dest/block/l2_block_stream/l2_block_stream.js +149 -152
  30. package/dest/block/l2_block_stream/l2_tips_memory_store.d.ts +6 -12
  31. package/dest/block/l2_block_stream/l2_tips_memory_store.d.ts.map +1 -1
  32. package/dest/block/l2_block_stream/l2_tips_memory_store.js +8 -32
  33. package/dest/block/l2_block_stream/l2_tips_store_base.d.ts +17 -18
  34. package/dest/block/l2_block_stream/l2_tips_store_base.d.ts.map +1 -1
  35. package/dest/block/l2_block_stream/l2_tips_store_base.js +70 -58
  36. package/dest/block/proposal/attestations_and_signers.d.ts +19 -1
  37. package/dest/block/proposal/attestations_and_signers.d.ts.map +1 -1
  38. package/dest/block/proposal/attestations_and_signers.js +47 -7
  39. package/dest/block/test/l2_tips_store_test_suite.d.ts +1 -1
  40. package/dest/block/test/l2_tips_store_test_suite.d.ts.map +1 -1
  41. package/dest/block/test/l2_tips_store_test_suite.js +296 -37
  42. package/dest/block/validate_block_result.d.ts +16 -1
  43. package/dest/block/validate_block_result.d.ts.map +1 -1
  44. package/dest/block/validate_block_result.js +18 -3
  45. package/dest/checkpoint/checkpoint.js +2 -2
  46. package/dest/checkpoint/index.d.ts +2 -1
  47. package/dest/checkpoint/index.d.ts.map +1 -1
  48. package/dest/checkpoint/index.js +1 -0
  49. package/dest/checkpoint/simulation_overrides.d.ts +61 -0
  50. package/dest/checkpoint/simulation_overrides.d.ts.map +1 -0
  51. package/dest/checkpoint/simulation_overrides.js +98 -0
  52. package/dest/checkpoint/validate.d.ts +11 -3
  53. package/dest/checkpoint/validate.d.ts.map +1 -1
  54. package/dest/checkpoint/validate.js +9 -6
  55. package/dest/config/index.d.ts +2 -1
  56. package/dest/config/index.d.ts.map +1 -1
  57. package/dest/config/index.js +1 -0
  58. package/dest/config/network-consensus-config.d.ts +72 -0
  59. package/dest/config/network-consensus-config.d.ts.map +1 -0
  60. package/dest/config/network-consensus-config.js +223 -0
  61. package/dest/config/sequencer-config.d.ts +4 -2
  62. package/dest/config/sequencer-config.d.ts.map +1 -1
  63. package/dest/config/sequencer-config.js +22 -3
  64. package/dest/contract/contract_address.d.ts +5 -4
  65. package/dest/contract/contract_address.d.ts.map +1 -1
  66. package/dest/contract/contract_class.d.ts +1 -1
  67. package/dest/contract/contract_class.d.ts.map +1 -1
  68. package/dest/contract/contract_class.js +3 -2
  69. package/dest/contract/contract_instance.d.ts +16 -2
  70. package/dest/contract/contract_instance.d.ts.map +1 -1
  71. package/dest/contract/contract_instance.js +45 -0
  72. package/dest/contract/index.d.ts +1 -2
  73. package/dest/contract/index.d.ts.map +1 -1
  74. package/dest/contract/index.js +0 -1
  75. package/dest/contract/interfaces/contract_data_source.d.ts +3 -5
  76. package/dest/contract/interfaces/contract_data_source.d.ts.map +1 -1
  77. package/dest/contract/interfaces/contract_instance.d.ts +71 -10
  78. package/dest/contract/interfaces/contract_instance.d.ts.map +1 -1
  79. package/dest/contract/interfaces/contract_instance.js +7 -2
  80. package/dest/contract/interfaces/node-info.d.ts +11 -1
  81. package/dest/contract/interfaces/node-info.d.ts.map +1 -1
  82. package/dest/contract/interfaces/node-info.js +7 -1
  83. package/dest/contract/partial_address.d.ts +9 -3
  84. package/dest/contract/partial_address.d.ts.map +1 -1
  85. package/dest/contract/partial_address.js +8 -2
  86. package/dest/database-version/version_manager.d.ts +18 -4
  87. package/dest/database-version/version_manager.d.ts.map +1 -1
  88. package/dest/database-version/version_manager.js +76 -6
  89. package/dest/deserialization/index.d.ts +35 -3
  90. package/dest/deserialization/index.d.ts.map +1 -1
  91. package/dest/deserialization/index.js +32 -1
  92. package/dest/file-store/factory.d.ts +1 -1
  93. package/dest/file-store/factory.d.ts.map +1 -1
  94. package/dest/file-store/factory.js +7 -0
  95. package/dest/file-store/index.d.ts +2 -1
  96. package/dest/file-store/index.d.ts.map +1 -1
  97. package/dest/file-store/index.js +1 -0
  98. package/dest/file-store/memory.d.ts +24 -0
  99. package/dest/file-store/memory.d.ts.map +1 -0
  100. package/dest/file-store/memory.js +80 -0
  101. package/dest/gas/gas_settings.d.ts +7 -13
  102. package/dest/gas/gas_settings.d.ts.map +1 -1
  103. package/dest/gas/gas_settings.js +9 -16
  104. package/dest/gas/index.d.ts +2 -1
  105. package/dest/gas/index.d.ts.map +1 -1
  106. package/dest/gas/index.js +1 -0
  107. package/dest/gas/tx_gas_limits.d.ts +72 -0
  108. package/dest/gas/tx_gas_limits.d.ts.map +1 -0
  109. package/dest/gas/tx_gas_limits.js +85 -0
  110. package/dest/ha-signing/config.d.ts +19 -5
  111. package/dest/ha-signing/config.d.ts.map +1 -1
  112. package/dest/ha-signing/config.js +9 -3
  113. package/dest/ha-signing/local_config.d.ts +10 -2
  114. package/dest/ha-signing/local_config.d.ts.map +1 -1
  115. package/dest/ha-signing/local_config.js +8 -2
  116. package/dest/interfaces/archiver.d.ts +7 -9
  117. package/dest/interfaces/archiver.d.ts.map +1 -1
  118. package/dest/interfaces/archiver.js +3 -2
  119. package/dest/interfaces/aztec-node-admin.d.ts +24 -17
  120. package/dest/interfaces/aztec-node-admin.d.ts.map +1 -1
  121. package/dest/interfaces/aztec-node-admin.js +1 -1
  122. package/dest/interfaces/aztec-node-debug.d.ts +40 -2
  123. package/dest/interfaces/aztec-node-debug.d.ts.map +1 -1
  124. package/dest/interfaces/aztec-node-debug.js +29 -1
  125. package/dest/interfaces/aztec-node.d.ts +69 -28
  126. package/dest/interfaces/aztec-node.d.ts.map +1 -1
  127. package/dest/interfaces/aztec-node.js +56 -20
  128. package/dest/interfaces/block-builder.d.ts +3 -1
  129. package/dest/interfaces/block-builder.d.ts.map +1 -1
  130. package/dest/interfaces/chain_tips.d.ts +8 -47
  131. package/dest/interfaces/chain_tips.d.ts.map +1 -1
  132. package/dest/interfaces/chain_tips.js +1 -6
  133. package/dest/interfaces/checkpoint_parameter.d.ts +3 -3
  134. package/dest/interfaces/checkpoint_parameter.d.ts.map +1 -1
  135. package/dest/interfaces/checkpoint_parameter.js +3 -3
  136. package/dest/interfaces/client.d.ts +2 -1
  137. package/dest/interfaces/client.d.ts.map +1 -1
  138. package/dest/interfaces/configs.d.ts +27 -6
  139. package/dest/interfaces/configs.d.ts.map +1 -1
  140. package/dest/interfaces/configs.js +5 -1
  141. package/dest/interfaces/get_tx_by_hash_options.d.ts +9 -0
  142. package/dest/interfaces/get_tx_by_hash_options.d.ts.map +1 -0
  143. package/dest/interfaces/get_tx_by_hash_options.js +4 -0
  144. package/dest/interfaces/merkle_tree_operations.d.ts +8 -3
  145. package/dest/interfaces/merkle_tree_operations.d.ts.map +1 -1
  146. package/dest/interfaces/p2p.d.ts +38 -9
  147. package/dest/interfaces/p2p.d.ts.map +1 -1
  148. package/dest/interfaces/p2p.js +14 -2
  149. package/dest/interfaces/private_kernel_prover.d.ts +71 -12
  150. package/dest/interfaces/private_kernel_prover.d.ts.map +1 -1
  151. package/dest/interfaces/prover-client.d.ts +2 -3
  152. package/dest/interfaces/prover-client.d.ts.map +1 -1
  153. package/dest/interfaces/prover-node.d.ts +12 -8
  154. package/dest/interfaces/prover-node.d.ts.map +1 -1
  155. package/dest/interfaces/prover-node.js +24 -17
  156. package/dest/interfaces/proving-job.d.ts +4 -4
  157. package/dest/interfaces/proving-job.d.ts.map +1 -1
  158. package/dest/interfaces/proving-job.js +2 -2
  159. package/dest/interfaces/server.d.ts +1 -3
  160. package/dest/interfaces/server.d.ts.map +1 -1
  161. package/dest/interfaces/server.js +0 -2
  162. package/dest/interfaces/server_circuit_prover.d.ts +3 -3
  163. package/dest/interfaces/server_circuit_prover.d.ts.map +1 -1
  164. package/dest/interfaces/validator.d.ts +15 -4
  165. package/dest/interfaces/validator.d.ts.map +1 -1
  166. package/dest/interfaces/validator.js +3 -1
  167. package/dest/interfaces/world_state.d.ts +14 -1
  168. package/dest/interfaces/world_state.d.ts.map +1 -1
  169. package/dest/kernel/hints/find_private_kernel_reset_dimensions.d.ts +8 -2
  170. package/dest/kernel/hints/find_private_kernel_reset_dimensions.d.ts.map +1 -1
  171. package/dest/kernel/hints/find_private_kernel_reset_dimensions.js +12 -74
  172. package/dest/kernel/hints/index.d.ts +1 -2
  173. package/dest/kernel/hints/index.d.ts.map +1 -1
  174. package/dest/kernel/hints/index.js +0 -1
  175. package/dest/kernel/hints/read_request.js +1 -1
  176. package/dest/kernel/index.d.ts +6 -2
  177. package/dest/kernel/index.d.ts.map +1 -1
  178. package/dest/kernel/index.js +5 -1
  179. package/dest/kernel/log_hash.d.ts +1 -1
  180. package/dest/kernel/log_hash.d.ts.map +1 -1
  181. package/dest/kernel/log_hash.js +2 -2
  182. package/dest/kernel/note_hash.js +1 -1
  183. package/dest/kernel/nullifier.js +1 -1
  184. package/dest/kernel/private_circuit_public_inputs.d.ts +13 -3
  185. package/dest/kernel/private_circuit_public_inputs.d.ts.map +1 -1
  186. package/dest/kernel/private_circuit_public_inputs.js +14 -7
  187. package/dest/kernel/private_context_inputs.d.ts +4 -3
  188. package/dest/kernel/private_context_inputs.d.ts.map +1 -1
  189. package/dest/kernel/private_context_inputs.js +7 -3
  190. package/dest/kernel/private_kernel_circuit_public_inputs.d.ts +7 -9
  191. package/dest/kernel/private_kernel_circuit_public_inputs.d.ts.map +1 -1
  192. package/dest/kernel/private_kernel_circuit_public_inputs.js +10 -7
  193. package/dest/kernel/private_kernel_init_2_circuit_private_inputs.d.ts +2 -3
  194. package/dest/kernel/private_kernel_init_2_circuit_private_inputs.d.ts.map +1 -1
  195. package/dest/kernel/private_kernel_init_2_circuit_private_inputs.js +3 -5
  196. package/dest/kernel/private_kernel_init_3_circuit_private_inputs.d.ts +2 -3
  197. package/dest/kernel/private_kernel_init_3_circuit_private_inputs.d.ts.map +1 -1
  198. package/dest/kernel/private_kernel_init_3_circuit_private_inputs.js +3 -5
  199. package/dest/kernel/private_kernel_init_4_circuit_private_inputs.d.ts +24 -0
  200. package/dest/kernel/private_kernel_init_4_circuit_private_inputs.d.ts.map +1 -0
  201. package/dest/kernel/private_kernel_init_4_circuit_private_inputs.js +37 -0
  202. package/dest/kernel/private_kernel_init_5_circuit_private_inputs.d.ts +25 -0
  203. package/dest/kernel/private_kernel_init_5_circuit_private_inputs.d.ts.map +1 -0
  204. package/dest/kernel/private_kernel_init_5_circuit_private_inputs.js +39 -0
  205. package/dest/kernel/private_kernel_init_circuit_private_inputs.d.ts +1 -9
  206. package/dest/kernel/private_kernel_init_circuit_private_inputs.d.ts.map +1 -1
  207. package/dest/kernel/private_kernel_init_circuit_private_inputs.js +2 -6
  208. package/dest/kernel/private_kernel_inner_4_circuit_private_inputs.d.ts +18 -0
  209. package/dest/kernel/private_kernel_inner_4_circuit_private_inputs.d.ts.map +1 -0
  210. package/dest/kernel/private_kernel_inner_4_circuit_private_inputs.js +27 -0
  211. package/dest/kernel/private_kernel_inner_5_circuit_private_inputs.d.ts +19 -0
  212. package/dest/kernel/private_kernel_inner_5_circuit_private_inputs.d.ts.map +1 -0
  213. package/dest/kernel/private_kernel_inner_5_circuit_private_inputs.js +29 -0
  214. package/dest/kernel/private_kernel_prover_output.d.ts +4 -1
  215. package/dest/kernel/private_kernel_prover_output.d.ts.map +1 -1
  216. package/dest/kernel/private_kernel_prover_output.js +4 -1
  217. package/dest/kernel/private_kernel_reset_dimensions.d.ts +7 -8
  218. package/dest/kernel/private_kernel_reset_dimensions.d.ts.map +1 -1
  219. package/dest/kernel/private_kernel_reset_tail_circuit_private_inputs.d.ts +29 -0
  220. package/dest/kernel/private_kernel_reset_tail_circuit_private_inputs.d.ts.map +1 -0
  221. package/dest/kernel/private_kernel_reset_tail_circuit_private_inputs.js +36 -0
  222. package/dest/kernel/private_kernel_simulated_output.d.ts +1 -7
  223. package/dest/kernel/private_kernel_simulated_output.d.ts.map +1 -1
  224. package/dest/kernel/private_kernel_simulated_output.js +2 -1
  225. package/dest/kernel/private_log_data.d.ts +1 -1
  226. package/dest/kernel/private_log_data.d.ts.map +1 -1
  227. package/dest/kernel/private_log_data.js +1 -1
  228. package/dest/kernel/utils/index.d.ts +1 -2
  229. package/dest/kernel/utils/index.d.ts.map +1 -1
  230. package/dest/kernel/utils/index.js +0 -1
  231. package/dest/keys/derivation.d.ts +41 -5
  232. package/dest/keys/derivation.d.ts.map +1 -1
  233. package/dest/keys/derivation.js +53 -23
  234. package/dest/logs/app_tagging_secret.d.ts +30 -7
  235. package/dest/logs/app_tagging_secret.d.ts.map +1 -1
  236. package/dest/logs/app_tagging_secret.js +44 -28
  237. package/dest/logs/app_tagging_secret_kind.js +1 -1
  238. package/dest/logs/contract_class_log.d.ts +1 -2
  239. package/dest/logs/contract_class_log.d.ts.map +1 -1
  240. package/dest/logs/contract_class_log.js +0 -4
  241. package/dest/logs/message_context.d.ts +5 -15
  242. package/dest/logs/message_context.d.ts.map +1 -1
  243. package/dest/logs/message_context.js +1 -66
  244. package/dest/logs/pending_tagged_log.d.ts +6 -8
  245. package/dest/logs/pending_tagged_log.d.ts.map +1 -1
  246. package/dest/logs/pending_tagged_log.js +1 -31
  247. package/dest/logs/shared_secret_derivation.d.ts +19 -6
  248. package/dest/logs/shared_secret_derivation.d.ts.map +1 -1
  249. package/dest/logs/shared_secret_derivation.js +26 -11
  250. package/dest/p2p/attestation_utils.d.ts +1 -1
  251. package/dest/p2p/attestation_utils.d.ts.map +1 -1
  252. package/dest/p2p/attestation_utils.js +8 -1
  253. package/dest/p2p/checkpoint_attestation.d.ts +10 -1
  254. package/dest/p2p/checkpoint_attestation.d.ts.map +1 -1
  255. package/dest/p2p/checkpoint_attestation.js +10 -0
  256. package/dest/p2p/checkpoint_proposal.d.ts +2 -1
  257. package/dest/p2p/checkpoint_proposal.d.ts.map +1 -1
  258. package/dest/p2p/consensus_payload.d.ts +2 -1
  259. package/dest/p2p/consensus_payload.d.ts.map +1 -1
  260. package/dest/p2p/index.d.ts +1 -2
  261. package/dest/p2p/index.d.ts.map +1 -1
  262. package/dest/p2p/index.js +0 -1
  263. package/dest/p2p/signature_utils.d.ts +10 -1
  264. package/dest/p2p/signature_utils.d.ts.map +1 -1
  265. package/dest/p2p/signature_utils.js +9 -1
  266. package/dest/rollup/avm_proof_data.d.ts +3 -3
  267. package/dest/rollup/avm_proof_data.d.ts.map +1 -1
  268. package/dest/rollup/checkpoint_header.d.ts +8 -3
  269. package/dest/rollup/checkpoint_header.d.ts.map +1 -1
  270. package/dest/rollup/checkpoint_header.js +20 -10
  271. package/dest/stats/stats.d.ts +2 -2
  272. package/dest/stats/stats.d.ts.map +1 -1
  273. package/dest/tests/factories.d.ts +1 -27
  274. package/dest/tests/factories.d.ts.map +1 -1
  275. package/dest/tests/factories.js +10 -45
  276. package/dest/tests/mocks.d.ts +1 -1
  277. package/dest/tests/mocks.d.ts.map +1 -1
  278. package/dest/tests/mocks.js +3 -2
  279. package/dest/timetable/budgets.d.ts +57 -0
  280. package/dest/timetable/budgets.d.ts.map +1 -0
  281. package/dest/timetable/budgets.js +56 -0
  282. package/dest/timetable/build_proposer_timetable.d.ts +21 -0
  283. package/dest/timetable/build_proposer_timetable.d.ts.map +1 -0
  284. package/dest/timetable/build_proposer_timetable.js +17 -0
  285. package/dest/timetable/consensus_timetable.d.ts +70 -0
  286. package/dest/timetable/consensus_timetable.d.ts.map +1 -0
  287. package/dest/timetable/consensus_timetable.js +89 -0
  288. package/dest/timetable/index.d.ts +5 -84
  289. package/dest/timetable/index.d.ts.map +1 -1
  290. package/dest/timetable/index.js +4 -209
  291. package/dest/timetable/proposer_timetable.d.ts +106 -0
  292. package/dest/timetable/proposer_timetable.d.ts.map +1 -0
  293. package/dest/timetable/proposer_timetable.js +132 -0
  294. package/dest/trees/nullifier_membership_witness.d.ts +5 -8
  295. package/dest/trees/nullifier_membership_witness.d.ts.map +1 -1
  296. package/dest/trees/nullifier_membership_witness.js +0 -9
  297. package/dest/trees/public_data_witness.d.ts +7 -17
  298. package/dest/trees/public_data_witness.d.ts.map +1 -1
  299. package/dest/trees/public_data_witness.js +0 -27
  300. package/dest/tx/execution_payload.d.ts +1 -1
  301. package/dest/tx/execution_payload.d.ts.map +1 -1
  302. package/dest/tx/execution_payload.js +1 -1
  303. package/dest/tx/fee_provider.d.ts +2 -2
  304. package/dest/tx/fee_provider.d.ts.map +1 -1
  305. package/dest/tx/global_variable_builder.d.ts +2 -12
  306. package/dest/tx/global_variable_builder.d.ts.map +1 -1
  307. package/dest/tx/global_variables.js +2 -2
  308. package/dest/tx/index.d.ts +1 -2
  309. package/dest/tx/index.d.ts.map +1 -1
  310. package/dest/tx/index.js +0 -1
  311. package/dest/tx/private_tx_constant_data.d.ts +18 -2
  312. package/dest/tx/private_tx_constant_data.d.ts.map +1 -1
  313. package/dest/tx/private_tx_constant_data.js +13 -4
  314. package/dest/tx/profiling.d.ts +1 -1
  315. package/dest/tx/profiling.d.ts.map +1 -1
  316. package/dest/tx/profiling.js +2 -0
  317. package/dest/tx/simulated_tx.d.ts +10 -6
  318. package/dest/tx/simulated_tx.d.ts.map +1 -1
  319. package/dest/tx/tx.d.ts +9 -1
  320. package/dest/tx/tx.d.ts.map +1 -1
  321. package/dest/tx/tx.js +15 -0
  322. package/dest/tx/validator/error_texts.d.ts +2 -2
  323. package/dest/tx/validator/error_texts.d.ts.map +1 -1
  324. package/dest/tx/validator/error_texts.js +1 -1
  325. package/dest/world-state/world_state_revision.d.ts +1 -18
  326. package/dest/world-state/world_state_revision.d.ts.map +1 -1
  327. package/dest/world-state/world_state_revision.js +0 -20
  328. package/package.json +8 -8
  329. package/src/abi/buffer.ts +13 -1
  330. package/src/avm/avm.ts +1 -1
  331. package/src/avm/index.ts +0 -5
  332. package/src/aztec-address/index.ts +36 -6
  333. package/src/block/attestation_info.ts +7 -2
  334. package/src/block/l2_block_source.ts +67 -13
  335. package/src/block/l2_block_stream/event_driven_l2_block_stream.ts +207 -0
  336. package/src/block/l2_block_stream/index.ts +1 -0
  337. package/src/block/l2_block_stream/interfaces.ts +96 -10
  338. package/src/block/l2_block_stream/l2_block_stream.ts +216 -175
  339. package/src/block/l2_block_stream/l2_tips_memory_store.ts +12 -41
  340. package/src/block/l2_block_stream/l2_tips_store_base.ts +84 -93
  341. package/src/block/proposal/attestations_and_signers.ts +53 -7
  342. package/src/block/test/l2_tips_store_test_suite.ts +270 -28
  343. package/src/block/validate_block_result.ts +48 -2
  344. package/src/checkpoint/checkpoint.ts +2 -2
  345. package/src/checkpoint/index.ts +1 -0
  346. package/src/checkpoint/simulation_overrides.ts +171 -0
  347. package/src/checkpoint/validate.ts +16 -6
  348. package/src/config/index.ts +1 -0
  349. package/src/config/network-consensus-config.ts +291 -0
  350. package/src/config/sequencer-config.ts +36 -5
  351. package/src/contract/contract_address.ts +4 -3
  352. package/src/contract/contract_class.ts +3 -2
  353. package/src/contract/contract_instance.ts +62 -1
  354. package/src/contract/index.ts +0 -1
  355. package/src/contract/interfaces/contract_data_source.ts +2 -4
  356. package/src/contract/interfaces/contract_instance.ts +26 -8
  357. package/src/contract/interfaces/node-info.ts +11 -0
  358. package/src/contract/partial_address.ts +8 -2
  359. package/src/database-version/version_manager.ts +96 -6
  360. package/src/deserialization/index.ts +35 -2
  361. package/src/file-store/factory.ts +7 -0
  362. package/src/file-store/index.ts +1 -0
  363. package/src/file-store/memory.ts +94 -0
  364. package/src/gas/README.md +92 -0
  365. package/src/gas/gas_settings.ts +11 -21
  366. package/src/gas/index.ts +1 -0
  367. package/src/gas/tx_gas_limits.ts +123 -0
  368. package/src/ha-signing/config.ts +23 -5
  369. package/src/ha-signing/local_config.ts +20 -1
  370. package/src/interfaces/archiver.ts +8 -9
  371. package/src/interfaces/aztec-node-admin.ts +1 -1
  372. package/src/interfaces/aztec-node-debug.ts +54 -2
  373. package/src/interfaces/aztec-node.ts +121 -43
  374. package/src/interfaces/block-builder.ts +2 -0
  375. package/src/interfaces/chain_tips.ts +8 -16
  376. package/src/interfaces/checkpoint_parameter.ts +3 -3
  377. package/src/interfaces/client.ts +1 -0
  378. package/src/interfaces/configs.ts +27 -6
  379. package/src/interfaces/get_tx_by_hash_options.ts +14 -0
  380. package/src/interfaces/merkle_tree_operations.ts +8 -2
  381. package/src/interfaces/p2p.ts +29 -9
  382. package/src/interfaces/private_kernel_prover.ts +104 -13
  383. package/src/interfaces/prover-client.ts +1 -3
  384. package/src/interfaces/prover-node.ts +32 -17
  385. package/src/interfaces/proving-job.ts +3 -3
  386. package/src/interfaces/server.ts +0 -2
  387. package/src/interfaces/server_circuit_prover.ts +2 -2
  388. package/src/interfaces/validator.ts +11 -0
  389. package/src/interfaces/world_state.ts +14 -0
  390. package/src/kernel/hints/find_private_kernel_reset_dimensions.ts +22 -112
  391. package/src/kernel/hints/index.ts +0 -1
  392. package/src/kernel/hints/read_request.ts +1 -1
  393. package/src/kernel/index.ts +5 -1
  394. package/src/kernel/log_hash.ts +5 -2
  395. package/src/kernel/note_hash.ts +1 -1
  396. package/src/kernel/nullifier.ts +1 -1
  397. package/src/kernel/private_circuit_public_inputs.ts +12 -1
  398. package/src/kernel/private_context_inputs.ts +10 -3
  399. package/src/kernel/private_kernel_circuit_public_inputs.ts +9 -7
  400. package/src/kernel/private_kernel_init_2_circuit_private_inputs.ts +0 -3
  401. package/src/kernel/private_kernel_init_3_circuit_private_inputs.ts +0 -3
  402. package/src/kernel/private_kernel_init_4_circuit_private_inputs.ts +52 -0
  403. package/src/kernel/private_kernel_init_5_circuit_private_inputs.ts +55 -0
  404. package/src/kernel/private_kernel_init_circuit_private_inputs.ts +0 -6
  405. package/src/kernel/private_kernel_inner_4_circuit_private_inputs.ts +39 -0
  406. package/src/kernel/private_kernel_inner_5_circuit_private_inputs.ts +42 -0
  407. package/src/kernel/private_kernel_prover_output.ts +4 -0
  408. package/src/kernel/private_kernel_reset_dimensions.ts +15 -5
  409. package/src/kernel/private_kernel_reset_tail_circuit_private_inputs.ts +69 -0
  410. package/src/kernel/private_kernel_simulated_output.ts +0 -7
  411. package/src/kernel/private_log_data.ts +4 -1
  412. package/src/kernel/utils/index.ts +0 -1
  413. package/src/keys/derivation.ts +71 -21
  414. package/src/logs/app_tagging_secret.ts +56 -24
  415. package/src/logs/app_tagging_secret_kind.ts +1 -1
  416. package/src/logs/contract_class_log.ts +0 -9
  417. package/src/logs/message_context.ts +7 -65
  418. package/src/logs/pending_tagged_log.ts +6 -33
  419. package/src/logs/shared_secret_derivation.ts +31 -15
  420. package/src/p2p/attestation_utils.ts +8 -1
  421. package/src/p2p/checkpoint_attestation.ts +12 -0
  422. package/src/p2p/index.ts +0 -1
  423. package/src/p2p/signature_utils.ts +9 -0
  424. package/src/rollup/avm_proof_data.ts +2 -2
  425. package/src/rollup/checkpoint_header.ts +16 -2
  426. package/src/stats/stats.ts +6 -2
  427. package/src/tests/factories.ts +13 -51
  428. package/src/tests/mocks.ts +7 -2
  429. package/src/timetable/README.md +609 -0
  430. package/src/timetable/budgets.ts +87 -0
  431. package/src/timetable/build_proposer_timetable.ts +42 -0
  432. package/src/timetable/consensus_timetable.ts +126 -0
  433. package/src/timetable/index.ts +4 -304
  434. package/src/timetable/proposer_timetable.ts +190 -0
  435. package/src/timetable/timetable-example.svg +108 -0
  436. package/src/trees/nullifier_membership_witness.ts +0 -11
  437. package/src/trees/public_data_witness.ts +0 -31
  438. package/src/tx/execution_payload.ts +2 -1
  439. package/src/tx/fee_provider.ts +1 -1
  440. package/src/tx/global_variable_builder.ts +1 -17
  441. package/src/tx/global_variables.ts +2 -2
  442. package/src/tx/index.ts +0 -1
  443. package/src/tx/private_tx_constant_data.ts +25 -2
  444. package/src/tx/profiling.ts +2 -0
  445. package/src/tx/tx.ts +17 -0
  446. package/src/tx/validator/error_texts.ts +2 -1
  447. package/src/world-state/world_state_revision.ts +0 -33
  448. package/dest/avm/contract_storage_read.d.ts +0 -58
  449. package/dest/avm/contract_storage_read.d.ts.map +0 -1
  450. package/dest/avm/contract_storage_read.js +0 -65
  451. package/dest/avm/contract_storage_update_request.d.ts +0 -65
  452. package/dest/avm/contract_storage_update_request.d.ts.map +0 -1
  453. package/dest/avm/contract_storage_update_request.js +0 -80
  454. package/dest/avm/public_call_stack_item_compressed.d.ts +0 -43
  455. package/dest/avm/public_call_stack_item_compressed.d.ts.map +0 -1
  456. package/dest/avm/public_call_stack_item_compressed.js +0 -70
  457. package/dest/avm/public_data_update_request.d.ts +0 -62
  458. package/dest/avm/public_data_update_request.d.ts.map +0 -1
  459. package/dest/avm/public_data_update_request.js +0 -67
  460. package/dest/avm/public_inner_call_request.d.ts +0 -50
  461. package/dest/avm/public_inner_call_request.d.ts.map +0 -1
  462. package/dest/avm/public_inner_call_request.js +0 -74
  463. package/dest/contract/deployment_info.d.ts +0 -24
  464. package/dest/contract/deployment_info.d.ts.map +0 -1
  465. package/dest/contract/deployment_info.js +0 -3
  466. package/dest/interfaces/epoch-prover.d.ts +0 -57
  467. package/dest/interfaces/epoch-prover.d.ts.map +0 -1
  468. package/dest/interfaces/epoch-prover.js +0 -1
  469. package/dest/interfaces/prover-coordination.d.ts +0 -15
  470. package/dest/interfaces/prover-coordination.d.ts.map +0 -1
  471. package/dest/interfaces/prover-coordination.js +0 -1
  472. package/dest/kernel/hints/tree_leaf_read_request.d.ts +0 -14
  473. package/dest/kernel/hints/tree_leaf_read_request.d.ts.map +0 -1
  474. package/dest/kernel/hints/tree_leaf_read_request.js +0 -33
  475. package/dest/kernel/private_kernel_tail_circuit_private_inputs.d.ts +0 -47
  476. package/dest/kernel/private_kernel_tail_circuit_private_inputs.d.ts.map +0 -1
  477. package/dest/kernel/private_kernel_tail_circuit_private_inputs.js +0 -38
  478. package/dest/kernel/utils/optional_number.d.ts +0 -31
  479. package/dest/kernel/utils/optional_number.d.ts.map +0 -1
  480. package/dest/kernel/utils/optional_number.js +0 -42
  481. package/dest/p2p/interface.d.ts +0 -5
  482. package/dest/p2p/interface.d.ts.map +0 -1
  483. package/dest/p2p/interface.js +0 -1
  484. package/dest/tx/validator/empty_validator.d.ts +0 -5
  485. package/dest/tx/validator/empty_validator.d.ts.map +0 -1
  486. package/dest/tx/validator/empty_validator.js +0 -7
  487. package/src/avm/contract_storage_read.ts +0 -77
  488. package/src/avm/contract_storage_update_request.ts +0 -93
  489. package/src/avm/public_call_stack_item_compressed.ts +0 -113
  490. package/src/avm/public_data_update_request.ts +0 -106
  491. package/src/avm/public_inner_call_request.ts +0 -85
  492. package/src/contract/deployment_info.ts +0 -25
  493. package/src/interfaces/epoch-prover.ts +0 -72
  494. package/src/interfaces/prover-coordination.ts +0 -17
  495. package/src/kernel/hints/tree_leaf_read_request.ts +0 -35
  496. package/src/kernel/private_kernel_tail_circuit_private_inputs.ts +0 -58
  497. package/src/kernel/utils/optional_number.ts +0 -50
  498. package/src/p2p/interface.ts +0 -4
  499. package/src/tx/validator/empty_validator.ts +0 -7
@@ -1 +1,25 @@
1
- export { };
1
+ /**
2
+ * Returns whether a local block id differs from a source block id. Compares block number and, when the local hash is
3
+ * known, block hash. The hash comparison is skipped when the local hash is undefined: world-state legitimately
4
+ * reports `undefined` hashes for tips ahead of its synced range, and comparing against an undefined hash would treat
5
+ * such a tip as different on every poll. An `undefined` local block (no local tip yet) always counts as differing.
6
+ */ export function localBlockIdDiffers(localBlock, sourceBlock) {
7
+ if (localBlock === undefined) {
8
+ return true;
9
+ }
10
+ if (sourceBlock.number !== localBlock.number) {
11
+ return true;
12
+ }
13
+ if (localBlock.hash === undefined) {
14
+ return false;
15
+ }
16
+ return sourceBlock.hash !== localBlock.hash;
17
+ }
18
+ /**
19
+ * Returns whether the local chain tips agree with the given source tips on every tier the local provider exposes.
20
+ * Each tier is compared at the block level via {@link localBlockIdDiffers} (so an unresolved local hash matches on
21
+ * number alone); checkpoint ids are not compared, mirroring the stream's own tier reconciliation. The optional
22
+ * `checkpointed` tier is only compared when present (it is absent when the stream ignores checkpoints).
23
+ */ export function localTipsMatch(local, source) {
24
+ return !localBlockIdDiffers(local.proposed, source.proposed) && (local.checkpointed === undefined || !localBlockIdDiffers(local.checkpointed.block, source.checkpointed.block)) && !localBlockIdDiffers(local.proven.block, source.proven.block) && !localBlockIdDiffers(local.finalized.block, source.finalized.block);
25
+ }
@@ -1,7 +1,24 @@
1
1
  import { type L2BlockSource } from '../l2_block_source.js';
2
- import type { L2BlockStreamEventHandler, L2BlockStreamLocalDataProvider } from './interfaces.js';
3
- /** Maximum number of checkpoints to prefetch at once during sync. Matches MAX_RPC_CHECKPOINTS_LEN. */
4
- export declare const CHECKPOINT_PREFETCH_LIMIT = 50;
2
+ import { type L2BlockStreamEventHandler, type L2BlockStreamLocalDataProvider } from './interfaces.js';
3
+ /** Subset of the block source the stream depends on. Checkpoint payloads are no longer fetched here. */
4
+ export type L2BlockStreamSource = Pick<L2BlockSource, 'getBlocks' | 'getBlockData' | 'getL2Tips'>;
5
+ /** Options accepted by {@link L2BlockStream} and {@link EventDrivenL2BlockStream}. */
6
+ export type L2BlockStreamOptions = {
7
+ pollIntervalMS?: number;
8
+ batchSize?: number;
9
+ startingBlock?: number;
10
+ /** Instead of downloading all blocks, only fetch the smallest subset that results in reliable reorg detection. */
11
+ skipFinalized?: boolean;
12
+ /** When true, checkpoint events will not be emitted. Blocks are still fetched but only blocks-added events are emitted. */
13
+ ignoreCheckpoints?: boolean;
14
+ /**
15
+ * When true, the block download loop is skipped entirely: `getBlocks` is never called and `blocks-added` is
16
+ * never emitted. Only the tip events (`chain-proposed`/`chain-checkpointed`/`chain-proven`/`chain-finalized`)
17
+ * and `chain-pruned` are emitted, driven by the `getL2Tips` snapshot. For consumers that track tips but never
18
+ * consume block payloads.
19
+ */
20
+ tipsOnly?: boolean;
21
+ };
5
22
  /** Creates a stream of events for new blocks, chain tips updates, and reorgs, out of polling an archiver or a node. */
6
23
  export declare class L2BlockStream {
7
24
  private l2BlockSource;
@@ -12,17 +29,7 @@ export declare class L2BlockStream {
12
29
  private readonly runningPromise;
13
30
  private isSyncing;
14
31
  private hasStarted;
15
- constructor(l2BlockSource: Pick<L2BlockSource, 'getBlocks' | 'getBlockData' | 'getL2Tips' | 'getCheckpoints'>, localData: L2BlockStreamLocalDataProvider, handler: L2BlockStreamEventHandler, log?: import("@aztec/foundation/log").Logger, opts?: {
16
- pollIntervalMS?: number;
17
- batchSize?: number;
18
- startingBlock?: number;
19
- /** Instead of downloading all blocks, only fetch the smallest subset that results in reliable reorg detection. */
20
- skipFinalized?: boolean;
21
- /** When true, checkpoint events will not be emitted. Blocks are still fetched via checkpoints but only blocks-added events are emitted. */
22
- ignoreCheckpoints?: boolean;
23
- /** Maximum number of checkpoints to prefetch at once during sync. Defaults to CHECKPOINT_PREFETCH_LIMIT (50). */
24
- checkpointPrefetchLimit?: number;
25
- });
32
+ constructor(l2BlockSource: L2BlockStreamSource, localData: L2BlockStreamLocalDataProvider, handler: L2BlockStreamEventHandler, log?: import("@aztec/foundation/log").Logger, opts?: L2BlockStreamOptions);
26
33
  start(): void;
27
34
  stop(): Promise<void>;
28
35
  isRunning(): boolean;
@@ -33,8 +40,9 @@ export declare class L2BlockStream {
33
40
  */
34
41
  sync(): Promise<void>;
35
42
  protected work(): Promise<void>;
43
+ private downloadBlocks;
36
44
  private areBlockHashesEqualAt;
37
45
  private getBlockHashFromSource;
38
46
  private emitEvent;
39
47
  }
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDJfYmxvY2tfc3RyZWFtLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmxvY2svbDJfYmxvY2tfc3RyZWFtL2wyX2Jsb2NrX3N0cmVhbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxPQUFPLEVBQWtCLEtBQUssYUFBYSxFQUFpQixNQUFNLHVCQUF1QixDQUFDO0FBQzFGLE9BQU8sS0FBSyxFQUFzQix5QkFBeUIsRUFBRSw4QkFBOEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXJILHNHQUFzRztBQUN0RyxlQUFPLE1BQU0seUJBQXlCLEtBQUssQ0FBQztBQUU1Qyx1SEFBdUg7QUFDdkgscUJBQWEsYUFBYTtJQU10QixPQUFPLENBQUMsYUFBYTtJQUNyQixPQUFPLENBQUMsU0FBUztJQUNqQixPQUFPLENBQUMsT0FBTztJQUNmLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRztJQUNwQixPQUFPLENBQUMsSUFBSTtJQVRkLE9BQU8sQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFpQjtJQUNoRCxPQUFPLENBQUMsU0FBUyxDQUFTO0lBQzFCLE9BQU8sQ0FBQyxVQUFVLENBQVM7SUFFM0IsWUFDVSxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxXQUFXLEdBQUcsY0FBYyxHQUFHLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxFQUNqRyxTQUFTLEVBQUUsOEJBQThCLEVBQ3pDLE9BQU8sRUFBRSx5QkFBeUIsRUFDekIsR0FBRyx5Q0FBcUMsRUFDakQsSUFBSSxHQUFFO1FBQ1osY0FBYyxDQUFDLEVBQUUsTUFBTSxDQUFDO1FBQ3hCLFNBQVMsQ0FBQyxFQUFFLE1BQU0sQ0FBQztRQUNuQixhQUFhLENBQUMsRUFBRSxNQUFNLENBQUM7UUFDdkIsa0hBQWtIO1FBQ2xILGFBQWEsQ0FBQyxFQUFFLE9BQU8sQ0FBQztRQUN4QiwySUFBMkk7UUFDM0ksaUJBQWlCLENBQUMsRUFBRSxPQUFPLENBQUM7UUFDNUIsaUhBQWlIO1FBQ2pILHVCQUF1QixDQUFDLEVBQUUsTUFBTSxDQUFDO0tBQzdCLEVBT1A7SUFFTSxLQUFLLFNBR1g7SUFFWSxJQUFJLGtCQUVoQjtJQUVNLFNBQVMsWUFFZjtJQUVEOzs7O09BSUc7SUFDVSxJQUFJLGtCQUloQjtJQUVELFVBQWdCLElBQUksa0JBZ05uQjtZQU9hLHFCQUFxQjtJQXFCbkMsT0FBTyxDQUFDLHNCQUFzQjtZQU9oQixTQUFTO0NBU3hCIn0=
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDJfYmxvY2tfc3RyZWFtLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmxvY2svbDJfYmxvY2tfc3RyZWFtL2wyX2Jsb2NrX3N0cmVhbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxPQUFPLEVBQWtCLEtBQUssYUFBYSxFQUFtQyxNQUFNLHVCQUF1QixDQUFDO0FBQzVHLE9BQU8sRUFFTCxLQUFLLHlCQUF5QixFQUM5QixLQUFLLDhCQUE4QixFQUVwQyxNQUFNLGlCQUFpQixDQUFDO0FBRXpCLHdHQUF3RztBQUN4RyxNQUFNLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxXQUFXLEdBQUcsY0FBYyxHQUFHLFdBQVcsQ0FBQyxDQUFDO0FBRWxHLHNGQUFzRjtBQUN0RixNQUFNLE1BQU0sb0JBQW9CLEdBQUc7SUFDakMsY0FBYyxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ3hCLFNBQVMsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNuQixhQUFhLENBQUMsRUFBRSxNQUFNLENBQUM7SUFDdkIsa0hBQWtIO0lBQ2xILGFBQWEsQ0FBQyxFQUFFLE9BQU8sQ0FBQztJQUN4QiwySEFBMkg7SUFDM0gsaUJBQWlCLENBQUMsRUFBRSxPQUFPLENBQUM7SUFDNUI7Ozs7O09BS0c7SUFDSCxRQUFRLENBQUMsRUFBRSxPQUFPLENBQUM7Q0FDcEIsQ0FBQztBQUVGLHVIQUF1SDtBQUN2SCxxQkFBYSxhQUFhO0lBTXRCLE9BQU8sQ0FBQyxhQUFhO0lBQ3JCLE9BQU8sQ0FBQyxTQUFTO0lBQ2pCLE9BQU8sQ0FBQyxPQUFPO0lBQ2YsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHO0lBQ3BCLE9BQU8sQ0FBQyxJQUFJO0lBVGQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQWlCO0lBQ2hELE9BQU8sQ0FBQyxTQUFTLENBQVM7SUFDMUIsT0FBTyxDQUFDLFVBQVUsQ0FBUztJQUUzQixZQUNVLGFBQWEsRUFBRSxtQkFBbUIsRUFDbEMsU0FBUyxFQUFFLDhCQUE4QixFQUN6QyxPQUFPLEVBQUUseUJBQXlCLEVBQ3pCLEdBQUcseUNBQXFDLEVBQ2pELElBQUksR0FBRSxvQkFBeUIsRUFheEM7SUFFTSxLQUFLLFNBR1g7SUFFWSxJQUFJLGtCQUVoQjtJQUVNLFNBQVMsWUFFZjtJQUVEOzs7O09BSUc7SUFDVSxJQUFJLGtCQUloQjtJQUVELFVBQWdCLElBQUksa0JBd0luQjtZQVNhLGNBQWM7WUFtRWQscUJBQXFCO0lBd0NuQyxPQUFPLENBQUMsc0JBQXNCO1lBT2hCLFNBQVM7Q0FleEIifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"l2_block_stream.d.ts","sourceRoot":"","sources":["../../../src/block/l2_block_stream/l2_block_stream.ts"],"names":[],"mappings":"AAMA,OAAO,EAAkB,KAAK,aAAa,EAAiB,MAAM,uBAAuB,CAAC;AAC1F,OAAO,KAAK,EAAsB,yBAAyB,EAAE,8BAA8B,EAAE,MAAM,iBAAiB,CAAC;AAErH,sGAAsG;AACtG,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C,uHAAuH;AACvH,qBAAa,aAAa;IAMtB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,IAAI;IATd,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAE3B,YACU,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,GAAG,cAAc,GAAG,WAAW,GAAG,gBAAgB,CAAC,EACjG,SAAS,EAAE,8BAA8B,EACzC,OAAO,EAAE,yBAAyB,EACzB,GAAG,yCAAqC,EACjD,IAAI,GAAE;QACZ,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,kHAAkH;QAClH,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,2IAA2I;QAC3I,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,iHAAiH;QACjH,uBAAuB,CAAC,EAAE,MAAM,CAAC;KAC7B,EAOP;IAEM,KAAK,SAGX;IAEY,IAAI,kBAEhB;IAEM,SAAS,YAEf;IAED;;;;OAIG;IACU,IAAI,kBAIhB;IAED,UAAgB,IAAI,kBAgNnB;YAOa,qBAAqB;IAqBnC,OAAO,CAAC,sBAAsB;YAOhB,SAAS;CASxB"}
1
+ {"version":3,"file":"l2_block_stream.d.ts","sourceRoot":"","sources":["../../../src/block/l2_block_stream/l2_block_stream.ts"],"names":[],"mappings":"AAMA,OAAO,EAAkB,KAAK,aAAa,EAAmC,MAAM,uBAAuB,CAAC;AAC5G,OAAO,EAEL,KAAK,yBAAyB,EAC9B,KAAK,8BAA8B,EAEpC,MAAM,iBAAiB,CAAC;AAEzB,wGAAwG;AACxG,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,GAAG,cAAc,GAAG,WAAW,CAAC,CAAC;AAElG,sFAAsF;AACtF,MAAM,MAAM,oBAAoB,GAAG;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kHAAkH;IAClH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,2HAA2H;IAC3H,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,uHAAuH;AACvH,qBAAa,aAAa;IAMtB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,IAAI;IATd,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAE3B,YACU,aAAa,EAAE,mBAAmB,EAClC,SAAS,EAAE,8BAA8B,EACzC,OAAO,EAAE,yBAAyB,EACzB,GAAG,yCAAqC,EACjD,IAAI,GAAE,oBAAyB,EAaxC;IAEM,KAAK,SAGX;IAEY,IAAI,kBAEhB;IAEM,SAAS,YAEf;IAED;;;;OAIG;IACU,IAAI,kBAIhB;IAED,UAAgB,IAAI,kBAwInB;YASa,cAAc;YAmEd,qBAAqB;IAwCnC,OAAO,CAAC,sBAAsB;YAOhB,SAAS;CAexB"}
@@ -1,9 +1,9 @@
1
- import { BlockNumber, CheckpointNumber } from '@aztec/foundation/branded-types';
1
+ import { BlockNumber } from '@aztec/foundation/branded-types';
2
2
  import { AbortError } from '@aztec/foundation/error';
3
3
  import { createLogger } from '@aztec/foundation/log';
4
4
  import { RunningPromise } from '@aztec/foundation/running-promise';
5
5
  import { makeL2BlockId } from '../l2_block_source.js';
6
- /** Maximum number of checkpoints to prefetch at once during sync. Matches MAX_RPC_CHECKPOINTS_LEN. */ export const CHECKPOINT_PREFETCH_LIMIT = 50;
6
+ import { localBlockIdDiffers } from './interfaces.js';
7
7
  /** Creates a stream of events for new blocks, chain tips updates, and reorgs, out of polling an archiver or a node. */ export class L2BlockStream {
8
8
  l2BlockSource;
9
9
  localData;
@@ -21,6 +21,9 @@ import { makeL2BlockId } from '../l2_block_source.js';
21
21
  this.opts = opts;
22
22
  this.isSyncing = false;
23
23
  this.hasStarted = false;
24
+ if (opts.tipsOnly && (opts.startingBlock !== undefined || opts.batchSize !== undefined || opts.skipFinalized)) {
25
+ throw new Error('tipsOnly is incompatible with startingBlock, batchSize, and skipFinalized: all three are ' + 'block-download options and there is no download loop in tips-only mode.');
26
+ }
24
27
  // Note that RunningPromise is in stopped state by default. This promise won't run until someone invokes `start`,
25
28
  // which makes it run periodically, or `sync`, which triggers it once.
26
29
  // Users of L2BlockStream decide what mode to run it in (_periodically_ vs _manually triggered_).
@@ -48,35 +51,62 @@ import { makeL2BlockId } from '../l2_block_source.js';
48
51
  }
49
52
  async work() {
50
53
  try {
51
- const sourceTips = await this.l2BlockSource.getL2Tips();
54
+ // The source tips snapshot is the plan for this pass; it is re-read after the walk-back if a divergence is found.
55
+ let sourceTips = await this.l2BlockSource.getL2Tips();
52
56
  const localTips = await this.localData.getL2Tips();
53
57
  this.log.trace(`Running L2 block stream`, {
54
58
  sourceTips,
55
59
  localTips
56
60
  });
57
- // Check if there was a reorg and emit a chain-pruned event if so.
61
+ if (!this.opts.ignoreCheckpoints && localTips.checkpointed === undefined) {
62
+ throw new Error('Local data provider does not expose a checkpointed tip; checkpoint events require one ' + '(set ignoreCheckpoints or provide checkpointed tips).');
63
+ }
64
+ // Baseline for the chain-proposed event; captured before the local store mutates during the pass.
65
+ const prePassProposed = localTips.proposed;
66
+ // Walk back to find a reorg, floored at the local finalized tip (a legitimate reorg can never reach it, since
67
+ // finalized means the proving tx is itself L1-finalized). Seed the cache with ONLY the proposed tip: a stale
68
+ // tier seed at a reorged height equals the local old-fork hash, faking agreement and stopping the walk above the
69
+ // true divergence (an under-deep prune no later pass re-detects), whereas a stale proposed seed only masks the
70
+ // tip for one pass.
58
71
  let latestBlockNumber = localTips.proposed.number;
59
72
  const sourceCache = new BlockHashCache([
60
73
  sourceTips.proposed
61
74
  ]);
75
+ const walkFloor = localTips.finalized.block.number;
62
76
  while(!await this.areBlockHashesEqualAt(latestBlockNumber, {
63
- sourceCache
77
+ sourceCache,
78
+ sourceProposed: sourceTips.proposed.number
64
79
  })){
65
80
  if (latestBlockNumber === 0) {
66
- // We walked all the way back to genesis and the hashes still differ. This means the
67
- // local store and the source disagree on the genesis block itself — typically because
68
- // they were configured with different `genesisTimestamp`/prefilled state. Continuing
69
- // would underflow into negative block numbers and surface as "block hash not found
70
- // for -1" further down. Fail loudly with a meaningful error instead.
81
+ // Walked back to genesis and the hashes still differ: the two sides disagree on block 0 itself (usually
82
+ // different genesisTimestamp/prefilled state). Fail loudly rather than underflow into negative heights.
71
83
  this.log.error(`Genesis block hash mismatch between local store and source`, {
72
84
  localBlockHash: await this.localData.getL2BlockHash(BlockNumber.ZERO),
73
85
  sourceBlockHash: sourceCache.get(0) ?? await this.getBlockHashFromSource(BlockNumber.ZERO)
74
86
  });
75
87
  throw new Error('Genesis block hash mismatch between local store and source: refusing to walk past block 0. ' + 'This usually indicates the two sides were configured with different genesis values ' + '(e.g. genesisTimestamp or prefilled public data).');
76
88
  }
89
+ if (latestBlockNumber <= walkFloor) {
90
+ // A mismatch at or below the finalized tip cannot be a reorg (it contradicts L1-finalized state), so stop
91
+ // here and prune at most to the finalized tip rather than pruning finalized state on non-reorg evidence.
92
+ this.log.warn(`Block hash mismatch at or below the local finalized tip; stopping the walk-back here`, {
93
+ blockNumber: latestBlockNumber,
94
+ finalizedBlockNumber: walkFloor,
95
+ localBlockHash: await this.localData.getL2BlockHash(latestBlockNumber),
96
+ sourceBlockHash: sourceCache.get(latestBlockNumber) ?? await this.getBlockHashFromSource(latestBlockNumber)
97
+ });
98
+ break;
99
+ }
77
100
  latestBlockNumber--;
78
101
  }
102
+ let pruned = false;
79
103
  if (latestBlockNumber < localTips.proposed.number) {
104
+ // Re-read the source tips after the (possibly slow) walk-back so the prune event carries fresh checkpointed
105
+ // and proven tips, and the prune-target clamp, download plan, and tier reconciliation track the post-prune
106
+ // source chain. Append only the re-read proposed tip: it is a fresh entry that cannot poison the (already
107
+ // finished) walk and serves the prune-event hash lookup below.
108
+ sourceTips = await this.l2BlockSource.getL2Tips();
109
+ sourceCache.add(sourceTips.proposed);
80
110
  latestBlockNumber = BlockNumber(Math.min(latestBlockNumber, sourceTips.proposed.number)); // see #13471
81
111
  const hash = sourceCache.get(latestBlockNumber) ?? await this.getBlockHashFromSource(latestBlockNumber);
82
112
  if (latestBlockNumber !== 0 && !hash) {
@@ -86,161 +116,46 @@ import { makeL2BlockId } from '../l2_block_source.js';
86
116
  await this.emitEvent({
87
117
  type: 'chain-pruned',
88
118
  block: makeL2BlockId(latestBlockNumber, hash),
89
- checkpoint: sourceTips.checkpointed.checkpoint
119
+ checkpointed: sourceTips.checkpointed,
120
+ proven: sourceTips.proven
90
121
  });
122
+ pruned = true;
91
123
  }
92
- // If we are just starting, use the starting block number from the options.
93
- const startingBlock = this.opts.startingBlock !== undefined ? BlockNumber(this.opts.startingBlock) : undefined;
94
- if (latestBlockNumber === 0 && startingBlock !== undefined) {
95
- latestBlockNumber = BlockNumber(Math.max(startingBlock - 1, 0));
96
- }
97
- // Only log this entry once (for sanity)
98
- if (!this.hasStarted) {
99
- this.log.verbose(`Starting sync from block number ${latestBlockNumber}`);
100
- this.hasStarted = true;
101
- }
102
- let nextBlockNumber = latestBlockNumber + 1;
103
- let nextCheckpointToEmit = CheckpointNumber(localTips.checkpointed.checkpoint.number + 1);
104
- // When startingBlock is set, also skip ahead for checkpoints.
105
- if (startingBlock !== undefined && startingBlock >= 1 && nextCheckpointToEmit <= sourceTips.checkpointed.checkpoint.number) {
106
- if (startingBlock > sourceTips.checkpointed.block.number) {
107
- // startingBlock is past all checkpointed blocks; skip Loop 1 entirely.
108
- nextCheckpointToEmit = CheckpointNumber(sourceTips.checkpointed.checkpoint.number + 1);
109
- } else {
110
- const startingBlockData = await this.l2BlockSource.getBlockData({
111
- number: startingBlock
112
- });
113
- if (startingBlockData) {
114
- nextCheckpointToEmit = CheckpointNumber(Math.max(nextCheckpointToEmit, startingBlockData.checkpointNumber));
115
- }
116
- }
117
- }
118
- if (this.opts.skipFinalized) {
119
- // When skipping finalized blocks we need to provide reliable reorg detection while fetching as few blocks as
120
- // possible. Finalized blocks cannot be reorged by definition, so we can skip most of them. We do need the very
121
- // last finalized block however in order to guarantee that we will eventually find a block in which our local
122
- // store matches the source.
123
- // If the last finalized block is behind our local tip, there is nothing to skip.
124
- nextBlockNumber = Math.max(sourceTips.finalized.block.number, nextBlockNumber);
125
- // If the next checkpoint to emit is behind the finalized tip then skip forward
126
- nextCheckpointToEmit = CheckpointNumber(Math.max(nextCheckpointToEmit, sourceTips.finalized.checkpoint.number));
127
- }
128
- // Loop 1: Emit checkpoint events for checkpoints whose blocks are already in local storage.
129
- // This handles the case where blocks were synced as uncheckpointed and later became checkpointed.
130
- // The guard `lastBlockInCheckpoint.number > localTips.proposed.number` ensures we don't emit
131
- // checkpoints for blocks we don't have (e.g., when startingBlock skips earlier blocks).
132
- // Since only one checkpoint can ever be uncheckpointed, this loop should iterate at most once.
133
- if (!this.opts.ignoreCheckpoints) {
134
- let loop1Iterations = 0;
135
- while(nextCheckpointToEmit <= sourceTips.checkpointed.checkpoint.number){
136
- const checkpoints = await this.l2BlockSource.getCheckpoints({
137
- from: nextCheckpointToEmit,
138
- limit: 1
139
- });
140
- if (checkpoints.length === 0) {
141
- break;
142
- }
143
- const lastBlockInCheckpoint = checkpoints[0].checkpoint.blocks.at(-1);
144
- // If this checkpoint has blocks we haven't seen yet, stop - they need to be fetched first
145
- if (lastBlockInCheckpoint.number > localTips.proposed.number) {
146
- break;
147
- }
148
- loop1Iterations++;
149
- if (loop1Iterations > 1) {
150
- this.log.warn(`Emitting multiple checkpoints (${loop1Iterations}) for already-local blocks. ` + `Next checkpoint: ${nextCheckpointToEmit}, source checkpointed: ${sourceTips.checkpointed.checkpoint.number}`);
151
- }
152
- const lastBlockHash = await lastBlockInCheckpoint.hash();
153
- await this.emitEvent({
154
- type: 'chain-checkpointed',
155
- checkpoint: checkpoints[0],
156
- block: makeL2BlockId(lastBlockInCheckpoint.number, lastBlockHash.toString())
157
- });
158
- nextCheckpointToEmit = CheckpointNumber(nextCheckpointToEmit + 1);
159
- }
160
- }
161
- // Loop 2: Fetch new checkpointed blocks. For each checkpoint, emit all blocks
162
- // from that checkpoint that we need, then emit the checkpoint event.
163
- // We prefetch multiple checkpoints, then process them one by one.
164
- let prefetchedCheckpoints = [];
165
- let prefetchIdx = 0;
166
- let nextCheckpointNumber;
167
- // Find the starting checkpoint number
168
- if (nextBlockNumber <= sourceTips.checkpointed.block.number) {
169
- const blockData = await this.l2BlockSource.getBlockData({
170
- number: BlockNumber(nextBlockNumber)
171
- });
172
- if (blockData) {
173
- nextCheckpointNumber = blockData.checkpointNumber;
174
- }
124
+ // Pass atomicity: a prune mid-download leaves the source unable to serve the planned blocks, so the snapshot's
125
+ // tier tips may reference blocks the consumer never saw — skip tier reconciliation in that case. Tips-only mode
126
+ // has no download plan (the snapshot is one atomic getL2Tips read), so it always reconciles.
127
+ if (!this.opts.tipsOnly && !await this.downloadBlocks(latestBlockNumber, sourceTips)) {
128
+ return;
175
129
  }
176
- while(nextBlockNumber <= sourceTips.checkpointed.block.number && nextCheckpointNumber !== undefined){
177
- // Refill the prefetch buffer when exhausted
178
- if (prefetchIdx >= prefetchedCheckpoints.length) {
179
- const prefetchLimit = this.opts.checkpointPrefetchLimit ?? CHECKPOINT_PREFETCH_LIMIT;
180
- prefetchedCheckpoints = await this.l2BlockSource.getCheckpoints({
181
- from: nextCheckpointNumber,
182
- limit: prefetchLimit
183
- });
184
- prefetchIdx = 0;
185
- if (prefetchedCheckpoints.length === 0) {
186
- break;
187
- }
188
- }
189
- const checkpoint = prefetchedCheckpoints[prefetchIdx];
190
- // Get all blocks from this checkpoint that we need, respecting batchSize
191
- const limit = Math.min(this.opts.batchSize ?? 50, sourceTips.checkpointed.block.number - nextBlockNumber + 1);
192
- const blocksForCheckpoint = checkpoint.checkpoint.blocks.filter((b)=>b.number >= nextBlockNumber).slice(0, limit);
193
- if (blocksForCheckpoint.length === 0) {
194
- break;
195
- }
130
+ // End-of-pass reconciliation: chain-proposed fires against the pre-pass baseline (a post-prune re-read would
131
+ // equal the source tip and suppress it), then the tiers highest-to-lowest so the finalized <= proven <=
132
+ // checkpointed <= proposed invariant holds mid-pass.
133
+ if (localBlockIdDiffers(prePassProposed, sourceTips.proposed)) {
196
134
  await this.emitEvent({
197
- type: 'blocks-added',
198
- blocks: blocksForCheckpoint
135
+ type: 'chain-proposed',
136
+ block: sourceTips.proposed
199
137
  });
200
- nextBlockNumber = blocksForCheckpoint.at(-1).number + 1;
201
- // If we've reached the end of this checkpoint, emit the checkpoint event and move to next
202
- const lastBlockInCheckpoint = checkpoint.checkpoint.blocks.at(-1);
203
- if (nextBlockNumber > lastBlockInCheckpoint.number) {
204
- if (!this.opts.ignoreCheckpoints) {
205
- const lastBlockHash = await lastBlockInCheckpoint.hash();
206
- await this.emitEvent({
207
- type: 'chain-checkpointed',
208
- checkpoint,
209
- block: makeL2BlockId(lastBlockInCheckpoint.number, lastBlockHash.toString())
210
- });
211
- }
212
- prefetchIdx++;
213
- nextCheckpointNumber = CheckpointNumber(nextCheckpointNumber + 1);
214
- }
215
138
  }
216
- // Loop 3: Fetch any remaining uncheckpointed (proposed) blocks.
217
- while(nextBlockNumber <= sourceTips.proposed.number){
218
- const limit = Math.min(this.opts.batchSize ?? 50, sourceTips.proposed.number - nextBlockNumber + 1);
219
- this.log.trace(`Requesting blocks from ${nextBlockNumber} limit ${limit}`);
220
- const blocks = await this.l2BlockSource.getBlocks({
221
- from: BlockNumber(nextBlockNumber),
222
- limit
223
- });
224
- if (blocks.length === 0) {
225
- break;
226
- }
139
+ const reconcileTips = pruned ? await this.localData.getL2Tips() : localTips;
140
+ if (!this.opts.ignoreCheckpoints && localBlockIdDiffers(reconcileTips.checkpointed?.block, sourceTips.checkpointed.block)) {
227
141
  await this.emitEvent({
228
- type: 'blocks-added',
229
- blocks
142
+ type: 'chain-checkpointed',
143
+ block: sourceTips.checkpointed.block,
144
+ checkpoint: sourceTips.checkpointed.checkpoint
230
145
  });
231
- nextBlockNumber = blocks.at(-1).number + 1;
232
146
  }
233
- // Update the proven and finalized tips.
234
- if (localTips.proven !== undefined && sourceTips.proven.block.number !== localTips.proven.block.number) {
147
+ if (reconcileTips.proven !== undefined && localBlockIdDiffers(reconcileTips.proven.block, sourceTips.proven.block)) {
235
148
  await this.emitEvent({
236
149
  type: 'chain-proven',
237
- block: sourceTips.proven.block
150
+ block: sourceTips.proven.block,
151
+ checkpoint: sourceTips.proven.checkpoint
238
152
  });
239
153
  }
240
- if (localTips.finalized !== undefined && sourceTips.finalized.block.number !== localTips.finalized.block.number) {
154
+ if (reconcileTips.finalized !== undefined && localBlockIdDiffers(reconcileTips.finalized.block, sourceTips.finalized.block)) {
241
155
  await this.emitEvent({
242
156
  type: 'chain-finalized',
243
- block: sourceTips.finalized.block
157
+ block: sourceTips.finalized.block,
158
+ checkpoint: sourceTips.finalized.checkpoint
244
159
  });
245
160
  }
246
161
  } catch (err) {
@@ -251,9 +166,75 @@ import { makeL2BlockId } from '../l2_block_source.js';
251
166
  }
252
167
  }
253
168
  /**
169
+ * Downloads every block from the post-prune cursor through the source's proposed tip, emitting `blocks-added`
170
+ * events. The return value gates tier-cursor advancement (pass atomicity): tier tips may only be reconciled when
171
+ * the plan that backs them ran to the proposed tip.
172
+ * @returns `true` if the plan completed (caught up, or delivered the proposed tip with a matching hash); `false` if
173
+ * the source no longer has a promised block, or served a fork at the proposed height mid-pass.
174
+ */ async downloadBlocks(latestBlockNumber, sourceTips) {
175
+ // The post-prune cursor: the highest block number both sides agree on. Block downloads resume from here.
176
+ let nextBlockNumber = latestBlockNumber + 1;
177
+ // From a fresh local store, fast-forward past history the consumer doesn't care about.
178
+ const startingBlock = this.opts.startingBlock !== undefined ? BlockNumber(this.opts.startingBlock) : undefined;
179
+ if (latestBlockNumber === 0 && startingBlock !== undefined) {
180
+ nextBlockNumber = Math.max(startingBlock, 1);
181
+ }
182
+ if (this.opts.skipFinalized) {
183
+ // Finalized blocks cannot be reorged, so skip them — but keep the last finalized block as the guaranteed point
184
+ // where local and source agree, the floor the walk-back terminates against.
185
+ nextBlockNumber = Math.max(sourceTips.finalized.block.number, nextBlockNumber);
186
+ }
187
+ if (!this.hasStarted) {
188
+ this.log.verbose(`Starting sync from block number ${nextBlockNumber - 1}`);
189
+ this.hasStarted = true;
190
+ }
191
+ let lastDeliveredBlock;
192
+ while(nextBlockNumber <= sourceTips.proposed.number){
193
+ const limit = Math.min(this.opts.batchSize ?? 50, sourceTips.proposed.number - nextBlockNumber + 1);
194
+ this.log.trace(`Requesting blocks from ${nextBlockNumber} limit ${limit}`);
195
+ const blocks = await this.l2BlockSource.getBlocks({
196
+ from: BlockNumber(nextBlockNumber),
197
+ limit
198
+ });
199
+ if (blocks.length === 0) {
200
+ // The source no longer has a block the snapshot promised: the snapshot is provably stale, so report the plan
201
+ // incomplete and skip reconciliation this pass.
202
+ this.log.warn(`Block source returned no blocks for a promised range; skipping reconciliation this pass`, {
203
+ from: nextBlockNumber,
204
+ limit,
205
+ sourceProposed: sourceTips.proposed.number
206
+ });
207
+ return false;
208
+ }
209
+ await this.emitEvent({
210
+ type: 'blocks-added',
211
+ blocks
212
+ });
213
+ lastDeliveredBlock = blocks.at(-1);
214
+ nextBlockNumber = lastDeliveredBlock.number + 1;
215
+ }
216
+ if (lastDeliveredBlock === undefined) {
217
+ // Loop never ran: caught up before the plan started, or startingBlock past the tip (A-1061). Trivially complete.
218
+ return true;
219
+ }
220
+ // Complete iff the block delivered at the proposed height carries the snapshot's proposed hash; a different hash
221
+ // means a same-height fork swap happened mid-pass, so the snapshot is stale.
222
+ const deliveredHash = (await lastDeliveredBlock.hash()).toString();
223
+ if (deliveredHash !== sourceTips.proposed.hash) {
224
+ this.log.warn(`Delivered proposed-block hash differs from snapshot; skipping reconciliation this pass`, {
225
+ blockNumber: lastDeliveredBlock.number,
226
+ deliveredHash,
227
+ snapshotHash: sourceTips.proposed.hash
228
+ });
229
+ return false;
230
+ }
231
+ return true;
232
+ }
233
+ /**
254
234
  * Returns whether the source and local agree on the block hash at a given height.
255
235
  * @param blockNumber - The block number to test.
256
- * @param args - A cache of data already requested from source, to avoid re-requesting it.
236
+ * @param args - A cache of data already requested from source (to avoid re-requesting it) and the source's
237
+ * advertised proposed tip from the pass snapshot (to detect an incoherent source).
257
238
  */ async areBlockHashesEqualAt(blockNumber, args) {
258
239
  const localBlockHash = await this.localData.getL2BlockHash(blockNumber);
259
240
  if (!localBlockHash && this.opts.skipFinalized) {
@@ -264,6 +245,13 @@ import { makeL2BlockId } from '../l2_block_source.js';
264
245
  this.log.error(`No local block hash for block number ${blockNumber}`);
265
246
  throw new AbortError();
266
247
  }
248
+ if (!localBlockHash) {
249
+ // A missing local hash compares UNEQUAL: treating both-undefined as equal would stop the walk above the true
250
+ // divergence (an under-deep prune no later pass re-detects). Over-deep is the safe direction, and block 0 always
251
+ // resolves via the store's initialBlockHash so the walk always terminates.
252
+ this.log.trace(`No local block hash for block number ${blockNumber}; treating as unequal`);
253
+ return false;
254
+ }
267
255
  const sourceBlockHashFromCache = args.sourceCache.get(blockNumber);
268
256
  const sourceBlockHash = args.sourceCache.get(blockNumber) ?? await this.getBlockHashFromSource(blockNumber);
269
257
  if (!sourceBlockHashFromCache && sourceBlockHash) {
@@ -272,6 +260,15 @@ import { makeL2BlockId } from '../l2_block_source.js';
272
260
  hash: sourceBlockHash
273
261
  });
274
262
  }
263
+ if (!sourceBlockHash && blockNumber !== 0 && blockNumber <= args.sourceProposed) {
264
+ // No source data at or below the source's own proposed tip: the source contradicts itself (mid-reorg unwind or
265
+ // a transient read failure), so skip this pass.
266
+ this.log.warn(`Source has no data for a block at or below its proposed tip; skipping this sync pass`, {
267
+ blockNumber,
268
+ sourceProposed: args.sourceProposed
269
+ });
270
+ throw new AbortError();
271
+ }
275
272
  this.log.trace(`Comparing block hashes for block ${blockNumber}`, {
276
273
  localBlockHash,
277
274
  sourceBlockHash
@@ -284,7 +281,7 @@ import { makeL2BlockId } from '../l2_block_source.js';
284
281
  }).then((d)=>d?.header.hash()).then((hash)=>hash?.toString());
285
282
  }
286
283
  async emitEvent(event) {
287
- this.log.debug(`Emitting ${event.type} (${event.type === 'blocks-added' ? event.blocks.length : event.type === 'chain-checkpointed' ? event.checkpoint.checkpoint.number : event.block.number})`);
284
+ this.log.debug(`Emitting ${event.type} (${event.type === 'blocks-added' ? event.blocks.length : event.type === 'chain-checkpointed' ? event.checkpoint.number : event.block.number})`);
288
285
  await this.handler.handleBlockStreamEvent(event);
289
286
  if (!this.isRunning() && !this.isSyncing) {
290
287
  throw new AbortError();
@@ -1,7 +1,6 @@
1
- import { BlockNumber, CheckpointNumber } from '@aztec/foundation/branded-types';
2
- import type { PublishedCheckpoint } from '../../checkpoint/published_checkpoint.js';
1
+ import type { BlockNumber } from '@aztec/foundation/branded-types';
3
2
  import type { BlockHash } from '../block_hash.js';
4
- import type { L2BlockTag } from '../l2_block_source.js';
3
+ import type { CheckpointId, L2BlockTag } from '../l2_block_source.js';
5
4
  import { L2TipsStoreBase } from './l2_tips_store_base.js';
6
5
  /**
7
6
  * In-memory implementation of L2 tips store. Useful for testing and lightweight clients.
@@ -10,20 +9,15 @@ import { L2TipsStoreBase } from './l2_tips_store_base.js';
10
9
  export declare class L2TipsMemoryStore extends L2TipsStoreBase {
11
10
  constructor(initialBlockHash: BlockHash);
12
11
  private readonly tips;
12
+ private readonly tipCheckpoints;
13
13
  private readonly blockHashes;
14
- private readonly blockToCheckpoint;
15
- private readonly checkpoints;
16
14
  protected getTip(tag: L2BlockTag): Promise<BlockNumber | undefined>;
17
15
  protected setTip(tag: L2BlockTag, blockNumber: BlockNumber): Promise<void>;
16
+ protected getTipCheckpoint(tag: L2BlockTag): Promise<CheckpointId | undefined>;
17
+ protected setTipCheckpoint(tag: L2BlockTag, checkpoint: CheckpointId): Promise<void>;
18
18
  protected getStoredBlockHash(blockNumber: BlockNumber): Promise<string | undefined>;
19
19
  protected setBlockHash(blockNumber: BlockNumber, hash: string): Promise<void>;
20
20
  protected deleteBlockHashesBefore(blockNumber: BlockNumber): Promise<void>;
21
- protected getCheckpointNumberForBlock(blockNumber: BlockNumber): Promise<CheckpointNumber | undefined>;
22
- protected setCheckpointNumberForBlock(blockNumber: BlockNumber, checkpointNumber: CheckpointNumber): Promise<void>;
23
- protected deleteBlockToCheckpointBefore(blockNumber: BlockNumber): Promise<void>;
24
- protected getCheckpoint(checkpointNumber: CheckpointNumber): Promise<PublishedCheckpoint | undefined>;
25
- protected saveCheckpointData(checkpoint: PublishedCheckpoint): Promise<void>;
26
- protected deleteCheckpointsBefore(checkpointNumber: CheckpointNumber): Promise<void>;
27
21
  protected runInTransaction<T>(fn: () => Promise<T>): Promise<T>;
28
22
  }
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDJfdGlwc19tZW1vcnlfc3RvcmUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ibG9jay9sMl9ibG9ja19zdHJlYW0vbDJfdGlwc19tZW1vcnlfc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRWhGLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDcEYsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTFEOzs7R0FHRztBQUNILHFCQUFhLGlCQUFrQixTQUFRLGVBQWU7SUFDcEQsWUFBWSxnQkFBZ0IsRUFBRSxTQUFTLEVBRXRDO0lBRUQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQXNDO0lBQzNELE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUE2QjtJQUN6RCxPQUFPLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUF1QztJQUN6RSxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBMEM7SUFFdEUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsVUFBVSxHQUFHLE9BQU8sQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDLENBRWxFO0lBRUQsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUd6RTtJQUVELFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBRWxGO0lBRUQsU0FBUyxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUc1RTtJQUVELFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FPekU7SUFFRCxTQUFTLENBQUMsMkJBQTJCLENBQUMsV0FBVyxFQUFFLFdBQVcsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLENBRXJHO0lBRUQsU0FBUyxDQUFDLDJCQUEyQixDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUdqSDtJQUVELFNBQVMsQ0FBQyw2QkFBNkIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FPL0U7SUFFRCxTQUFTLENBQUMsYUFBYSxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsR0FBRyxTQUFTLENBQUMsQ0FFcEc7SUFFRCxTQUFTLENBQUMsa0JBQWtCLENBQUMsVUFBVSxFQUFFLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FHM0U7SUFFRCxTQUFTLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQU9uRjtJQUVELFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FHOUQ7Q0FDRiJ9
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDJfdGlwc19tZW1vcnlfc3RvcmUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ibG9jay9sMl9ibG9ja19zdHJlYW0vbDJfdGlwc19tZW1vcnlfc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFbkUsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUxRDs7O0dBR0c7QUFDSCxxQkFBYSxpQkFBa0IsU0FBUSxlQUFlO0lBQ3BELFlBQVksZ0JBQWdCLEVBQUUsU0FBUyxFQUV0QztJQUVELE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFzQztJQUMzRCxPQUFPLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBdUM7SUFDdEUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQTZCO0lBRXpELFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLFVBQVUsR0FBRyxPQUFPLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxDQUVsRTtJQUVELFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FHekU7SUFFRCxTQUFTLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLFVBQVUsR0FBRyxPQUFPLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQyxDQUU3RTtJQUVELFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxZQUFZLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUduRjtJQUVELFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBRWxGO0lBRUQsU0FBUyxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUc1RTtJQUVELFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FPekU7SUFFRCxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBRzlEO0NBQ0YifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"l2_tips_memory_store.d.ts","sourceRoot":"","sources":["../../../src/block/l2_block_stream/l2_tips_memory_store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEhF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,eAAe;IACpD,YAAY,gBAAgB,EAAE,SAAS,EAEtC;IAED,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAsC;IAC3D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IACzD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAuC;IACzE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0C;IAEtE,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAElE;IAED,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzE;IAED,SAAS,CAAC,kBAAkB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAElF;IAED,SAAS,CAAC,YAAY,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG5E;IAED,SAAS,CAAC,uBAAuB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAOzE;IAED,SAAS,CAAC,2BAA2B,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAErG;IAED,SAAS,CAAC,2BAA2B,CAAC,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAGjH;IAED,SAAS,CAAC,6BAA6B,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAO/E;IAED,SAAS,CAAC,aAAa,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAEpG;IAED,SAAS,CAAC,kBAAkB,CAAC,UAAU,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAG3E;IAED,SAAS,CAAC,uBAAuB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAOnF;IAED,SAAS,CAAC,gBAAgB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAG9D;CACF"}
1
+ {"version":3,"file":"l2_tips_memory_store.d.ts","sourceRoot":"","sources":["../../../src/block/l2_block_stream/l2_tips_memory_store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAEnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,eAAe;IACpD,YAAY,gBAAgB,EAAE,SAAS,EAEtC;IAED,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAsC;IAC3D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAuC;IACtE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IAEzD,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAElE;IAED,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzE;IAED,SAAS,CAAC,gBAAgB,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAE7E;IAED,SAAS,CAAC,gBAAgB,CAAC,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAGnF;IAED,SAAS,CAAC,kBAAkB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAElF;IAED,SAAS,CAAC,YAAY,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG5E;IAED,SAAS,CAAC,uBAAuB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAOzE;IAED,SAAS,CAAC,gBAAgB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAG9D;CACF"}
@@ -7,9 +7,8 @@ import { L2TipsStoreBase } from './l2_tips_store_base.js';
7
7
  super(initialBlockHash);
8
8
  }
9
9
  tips = new Map();
10
+ tipCheckpoints = new Map();
10
11
  blockHashes = new Map();
11
- blockToCheckpoint = new Map();
12
- checkpoints = new Map();
13
12
  getTip(tag) {
14
13
  return Promise.resolve(this.tips.get(tag));
15
14
  }
@@ -17,6 +16,13 @@ import { L2TipsStoreBase } from './l2_tips_store_base.js';
17
16
  this.tips.set(tag, blockNumber);
18
17
  return Promise.resolve();
19
18
  }
19
+ getTipCheckpoint(tag) {
20
+ return Promise.resolve(this.tipCheckpoints.get(tag));
21
+ }
22
+ setTipCheckpoint(tag, checkpoint) {
23
+ this.tipCheckpoints.set(tag, checkpoint);
24
+ return Promise.resolve();
25
+ }
20
26
  getStoredBlockHash(blockNumber) {
21
27
  return Promise.resolve(this.blockHashes.get(blockNumber));
22
28
  }
@@ -32,36 +38,6 @@ import { L2TipsStoreBase } from './l2_tips_store_base.js';
32
38
  }
33
39
  return Promise.resolve();
34
40
  }
35
- getCheckpointNumberForBlock(blockNumber) {
36
- return Promise.resolve(this.blockToCheckpoint.get(blockNumber));
37
- }
38
- setCheckpointNumberForBlock(blockNumber, checkpointNumber) {
39
- this.blockToCheckpoint.set(blockNumber, checkpointNumber);
40
- return Promise.resolve();
41
- }
42
- deleteBlockToCheckpointBefore(blockNumber) {
43
- for (const key of this.blockToCheckpoint.keys()){
44
- if (key < blockNumber) {
45
- this.blockToCheckpoint.delete(key);
46
- }
47
- }
48
- return Promise.resolve();
49
- }
50
- getCheckpoint(checkpointNumber) {
51
- return Promise.resolve(this.checkpoints.get(checkpointNumber));
52
- }
53
- saveCheckpointData(checkpoint) {
54
- this.checkpoints.set(checkpoint.checkpoint.number, checkpoint);
55
- return Promise.resolve();
56
- }
57
- deleteCheckpointsBefore(checkpointNumber) {
58
- for (const key of this.checkpoints.keys()){
59
- if (key < checkpointNumber) {
60
- this.checkpoints.delete(key);
61
- }
62
- }
63
- return Promise.resolve();
64
- }
65
41
  runInTransaction(fn) {
66
42
  // Memory store doesn't need transactions - just execute immediately
67
43
  return fn();