@aztec/stdlib 6.0.0-nightly.20260605 → 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,8 +1,7 @@
1
- import { BlockNumber, CheckpointNumber } from '@aztec/foundation/branded-types';
1
+ import type { BlockNumber } from '@aztec/foundation/branded-types';
2
2
 
3
- import type { PublishedCheckpoint } from '../../checkpoint/published_checkpoint.js';
4
3
  import type { BlockHash } from '../block_hash.js';
5
- import type { L2BlockTag } from '../l2_block_source.js';
4
+ import type { CheckpointId, L2BlockTag } from '../l2_block_source.js';
6
5
  import { L2TipsStoreBase } from './l2_tips_store_base.js';
7
6
 
8
7
  /**
@@ -15,9 +14,8 @@ export class L2TipsMemoryStore extends L2TipsStoreBase {
15
14
  }
16
15
 
17
16
  private readonly tips = new Map<L2BlockTag, BlockNumber>();
17
+ private readonly tipCheckpoints = new Map<L2BlockTag, CheckpointId>();
18
18
  private readonly blockHashes = new Map<number, string>();
19
- private readonly blockToCheckpoint = new Map<number, CheckpointNumber>();
20
- private readonly checkpoints = new Map<number, PublishedCheckpoint>();
21
19
 
22
20
  protected getTip(tag: L2BlockTag): Promise<BlockNumber | undefined> {
23
21
  return Promise.resolve(this.tips.get(tag));
@@ -28,6 +26,15 @@ export class L2TipsMemoryStore extends L2TipsStoreBase {
28
26
  return Promise.resolve();
29
27
  }
30
28
 
29
+ protected getTipCheckpoint(tag: L2BlockTag): Promise<CheckpointId | undefined> {
30
+ return Promise.resolve(this.tipCheckpoints.get(tag));
31
+ }
32
+
33
+ protected setTipCheckpoint(tag: L2BlockTag, checkpoint: CheckpointId): Promise<void> {
34
+ this.tipCheckpoints.set(tag, checkpoint);
35
+ return Promise.resolve();
36
+ }
37
+
31
38
  protected getStoredBlockHash(blockNumber: BlockNumber): Promise<string | undefined> {
32
39
  return Promise.resolve(this.blockHashes.get(blockNumber));
33
40
  }
@@ -46,42 +53,6 @@ export class L2TipsMemoryStore extends L2TipsStoreBase {
46
53
  return Promise.resolve();
47
54
  }
48
55
 
49
- protected getCheckpointNumberForBlock(blockNumber: BlockNumber): Promise<CheckpointNumber | undefined> {
50
- return Promise.resolve(this.blockToCheckpoint.get(blockNumber));
51
- }
52
-
53
- protected setCheckpointNumberForBlock(blockNumber: BlockNumber, checkpointNumber: CheckpointNumber): Promise<void> {
54
- this.blockToCheckpoint.set(blockNumber, checkpointNumber);
55
- return Promise.resolve();
56
- }
57
-
58
- protected deleteBlockToCheckpointBefore(blockNumber: BlockNumber): Promise<void> {
59
- for (const key of this.blockToCheckpoint.keys()) {
60
- if (key < blockNumber) {
61
- this.blockToCheckpoint.delete(key);
62
- }
63
- }
64
- return Promise.resolve();
65
- }
66
-
67
- protected getCheckpoint(checkpointNumber: CheckpointNumber): Promise<PublishedCheckpoint | undefined> {
68
- return Promise.resolve(this.checkpoints.get(checkpointNumber));
69
- }
70
-
71
- protected saveCheckpointData(checkpoint: PublishedCheckpoint): Promise<void> {
72
- this.checkpoints.set(checkpoint.checkpoint.number, checkpoint);
73
- return Promise.resolve();
74
- }
75
-
76
- protected deleteCheckpointsBefore(checkpointNumber: CheckpointNumber): Promise<void> {
77
- for (const key of this.checkpoints.keys()) {
78
- if (key < checkpointNumber) {
79
- this.checkpoints.delete(key);
80
- }
81
- }
82
- return Promise.resolve();
83
- }
84
-
85
56
  protected runInTransaction<T>(fn: () => Promise<T>): Promise<T> {
86
57
  // Memory store doesn't need transactions - just execute immediately
87
58
  return fn();
@@ -1,6 +1,5 @@
1
1
  import { BlockNumber, CheckpointNumber } from '@aztec/foundation/branded-types';
2
2
 
3
- import type { PublishedCheckpoint } from '../../checkpoint/published_checkpoint.js';
4
3
  import type { BlockHash } from '../block_hash.js';
5
4
  import type { L2Block } from '../l2_block.js';
6
5
  import {
@@ -8,7 +7,7 @@ import {
8
7
  GENESIS_CHECKPOINT_HEADER_HASH,
9
8
  type L2BlockId,
10
9
  type L2BlockTag,
11
- type L2Tips,
10
+ type LocalL2Tips,
12
11
  } from '../l2_block_source.js';
13
12
  import type { L2BlockStreamEvent, L2BlockStreamEventHandler, L2BlockStreamLocalDataProvider } from './interfaces.js';
14
13
 
@@ -26,6 +25,12 @@ export abstract class L2TipsStoreBase implements L2BlockStreamEventHandler, L2Bl
26
25
  /** Sets the block number for a given tag. */
27
26
  protected abstract setTip(tag: L2BlockTag, blockNumber: BlockNumber): Promise<void>;
28
27
 
28
+ /** Gets the checkpoint id recorded for a given tag, if any. */
29
+ protected abstract getTipCheckpoint(tag: L2BlockTag): Promise<CheckpointId | undefined>;
30
+
31
+ /** Records the checkpoint id for a given tag. */
32
+ protected abstract setTipCheckpoint(tag: L2BlockTag, checkpoint: CheckpointId): Promise<void>;
33
+
29
34
  /** Gets the block hash for a given block number. */
30
35
  protected abstract getStoredBlockHash(blockNumber: BlockNumber): Promise<string | undefined>;
31
36
 
@@ -35,27 +40,6 @@ export abstract class L2TipsStoreBase implements L2BlockStreamEventHandler, L2Bl
35
40
  /** Deletes all block hashes for blocks before the given block number. */
36
41
  protected abstract deleteBlockHashesBefore(blockNumber: BlockNumber): Promise<void>;
37
42
 
38
- /** Gets the checkpoint number for a given block number. */
39
- protected abstract getCheckpointNumberForBlock(blockNumber: BlockNumber): Promise<CheckpointNumber | undefined>;
40
-
41
- /** Sets the checkpoint number for a given block number. */
42
- protected abstract setCheckpointNumberForBlock(
43
- blockNumber: BlockNumber,
44
- checkpointNumber: CheckpointNumber,
45
- ): Promise<void>;
46
-
47
- /** Deletes all block-to-checkpoint mappings for blocks before the given block number. */
48
- protected abstract deleteBlockToCheckpointBefore(blockNumber: BlockNumber): Promise<void>;
49
-
50
- /** Gets a checkpoint by its number. */
51
- protected abstract getCheckpoint(checkpointNumber: CheckpointNumber): Promise<PublishedCheckpoint | undefined>;
52
-
53
- /** Saves a checkpoint. */
54
- protected abstract saveCheckpointData(checkpoint: PublishedCheckpoint): Promise<void>;
55
-
56
- /** Deletes all checkpoints before the given checkpoint number. */
57
- protected abstract deleteCheckpointsBefore(checkpointNumber: CheckpointNumber): Promise<void>;
58
-
59
43
  /** Runs the given function in a transaction. Memory stores can just execute immediately. */
60
44
  protected abstract runInTransaction<T>(fn: () => Promise<T>): Promise<T>;
61
45
 
@@ -68,40 +52,54 @@ export abstract class L2TipsStoreBase implements L2BlockStreamEventHandler, L2Bl
68
52
  return this.getStoredBlockHash(number);
69
53
  }
70
54
 
71
- public getL2Tips(): Promise<L2Tips> {
55
+ public getL2Tips(): Promise<LocalL2Tips> {
72
56
  return this.runInTransaction(async () => {
73
- const [proposedBlockId, finalizedBlockId, provenBlockId, checkpointedBlockId, proposedCheckpointBlockId] =
74
- await Promise.all([
75
- this.getBlockId('proposed'),
76
- this.getBlockId('finalized'),
77
- this.getBlockId('proven'),
78
- this.getBlockId('checkpointed'),
79
- this.getBlockId('proposedCheckpoint'),
80
- ]);
57
+ const [proposedBlockId, finalizedBlockId, provenBlockId, checkpointedBlockId] = await Promise.all([
58
+ this.getBlockId('proposed'),
59
+ this.getBlockId('finalized'),
60
+ this.getBlockId('proven'),
61
+ this.getBlockId('checkpointed'),
62
+ ]);
81
63
 
82
- const [finalizedCheckpointId, provenCheckpointId, checkpointedCheckpointId, proposedCheckpointId] =
83
- await Promise.all([
84
- this.getCheckpointId('finalized'),
85
- this.getCheckpointId('proven'),
86
- this.getCheckpointId('checkpointed'),
87
- this.getCheckpointId('proposedCheckpoint'),
88
- ]);
64
+ const [finalizedCheckpointId, provenCheckpointId, checkpointedCheckpointId] = await Promise.all([
65
+ this.getCheckpointId('finalized'),
66
+ this.getCheckpointId('proven'),
67
+ this.getCheckpointId('checkpointed'),
68
+ ]);
89
69
 
90
70
  return {
91
71
  proposed: proposedBlockId,
92
72
  finalized: { block: finalizedBlockId, checkpoint: finalizedCheckpointId },
93
73
  proven: { block: provenBlockId, checkpoint: provenCheckpointId },
94
74
  checkpointed: { block: checkpointedBlockId, checkpoint: checkpointedCheckpointId },
95
- proposedCheckpoint: { block: proposedCheckpointBlockId, checkpoint: proposedCheckpointId },
96
75
  };
97
76
  });
98
77
  }
99
78
 
79
+ /**
80
+ * Records `(number → hash)` witnesses into the block-hash index without moving any tip cursor. In tips-only mode
81
+ * the hash history is sparse (one anchor per tip-moving poll), so a consumer that materializes per-height state
82
+ * should witness those heights or its prunes are over-deep by the gap to the nearest anchor. Witnesses are compared
83
+ * against the source, not trusted, so they cannot cause under-deep prunes; this is always safe to call.
84
+ */
85
+ public async recordBlockHashes(blocks: L2BlockId[]): Promise<void> {
86
+ await this.runInTransaction(async () => {
87
+ for (const block of blocks) {
88
+ if (block.hash) {
89
+ await this.setBlockHash(block.number, block.hash);
90
+ }
91
+ }
92
+ });
93
+ }
94
+
100
95
  public async handleBlockStreamEvent(event: L2BlockStreamEvent): Promise<void> {
101
96
  switch (event.type) {
102
97
  case 'blocks-added':
103
98
  await this.handleBlocksAdded(event);
104
99
  break;
100
+ case 'chain-proposed':
101
+ await this.handleChainProposed(event);
102
+ break;
105
103
  case 'chain-checkpointed':
106
104
  await this.handleChainCheckpointed(event);
107
105
  break;
@@ -139,17 +137,21 @@ export abstract class L2TipsStoreBase implements L2BlockStreamEventHandler, L2Bl
139
137
  private async getCheckpointId(tag: L2BlockTag): Promise<CheckpointId> {
140
138
  const blockNumber = await this.getTip(tag);
141
139
  if (blockNumber === undefined || blockNumber === 0) {
142
- return { number: CheckpointNumber.ZERO, hash: GENESIS_CHECKPOINT_HEADER_HASH.toString() };
143
- }
144
- const checkpointNumber = await this.getCheckpointNumberForBlock(blockNumber);
145
- if (checkpointNumber === undefined) {
146
- return { number: CheckpointNumber.ZERO, hash: GENESIS_CHECKPOINT_HEADER_HASH.toString() };
140
+ return this.genesisCheckpointId();
147
141
  }
148
- const checkpoint = await this.getCheckpoint(checkpointNumber);
149
- if (!checkpoint) {
150
- throw new Error(`Checkpoint not found for checkpoint number ${checkpointNumber}`);
142
+ // The checkpoint id recorded for this cursor when it was last advanced is the single source of truth.
143
+ // The writers (handleChainCheckpointed/Proven/Finalized/Pruned) always record an id alongside any
144
+ // non-genesis cursor advance, so a missing id on a real block is genuine store corruption. Fail loudly
145
+ // rather than silently reporting checkpoint zero, which would drive a checkpoint-replay storm.
146
+ const storedCheckpoint = await this.getTipCheckpoint(tag);
147
+ if (storedCheckpoint !== undefined) {
148
+ return storedCheckpoint;
151
149
  }
152
- return { number: checkpointNumber, hash: checkpoint.checkpoint.hash().toString() };
150
+ throw new Error(`No checkpoint id recorded for ${tag} tip at block ${blockNumber}; the L2 tips store is corrupted`);
151
+ }
152
+
153
+ private genesisCheckpointId(): CheckpointId {
154
+ return { number: CheckpointNumber.ZERO, hash: GENESIS_CHECKPOINT_HEADER_HASH.toString() };
153
155
  }
154
156
 
155
157
  private async handleBlocksAdded(event: L2BlockStreamEvent): Promise<void> {
@@ -165,19 +167,22 @@ export abstract class L2TipsStoreBase implements L2BlockStreamEventHandler, L2Bl
165
167
  });
166
168
  }
167
169
 
170
+ private async handleChainProposed(event: L2BlockStreamEvent): Promise<void> {
171
+ if (event.type !== 'chain-proposed') {
172
+ return;
173
+ }
174
+ // Records the proposed tip into the block-hash index the walk-back reads. In tips-only mode this is the sole
175
+ // writer of proposed-tip history, leaving one sparse anchor per tip-moving pass for reorg detection.
176
+ await this.runInTransaction(() => this.saveTag('proposed', event.block));
177
+ }
178
+
168
179
  private async handleChainCheckpointed(event: L2BlockStreamEvent): Promise<void> {
169
180
  if (event.type !== 'chain-checkpointed') {
170
181
  return;
171
182
  }
172
183
  await this.runInTransaction(async () => {
173
184
  await this.saveTag('checkpointed', event.block);
174
- await this.saveCheckpoint(event.checkpoint);
175
- // proposedCheckpoint is always >= checkpointed. If checkpointed has caught up
176
- // or surpassed it, advance proposedCheckpoint to match.
177
- const proposedCheckpointBlock = await this.getBlockId('proposedCheckpoint');
178
- if (event.block.number > proposedCheckpointBlock.number) {
179
- await this.saveTag('proposedCheckpoint', event.block);
180
- }
185
+ await this.setTipCheckpoint('checkpointed', event.checkpoint);
181
186
  });
182
187
  }
183
188
 
@@ -186,12 +191,24 @@ export abstract class L2TipsStoreBase implements L2BlockStreamEventHandler, L2Bl
186
191
  return;
187
192
  }
188
193
  await this.runInTransaction(async () => {
194
+ // A prune is a rollback: the proposed tip moves to the prune target unconditionally, but checkpoint-bearing
195
+ // cursors may only move backward (advancing one onto an uncheckpointed block would leave it without a recorded
196
+ // checkpoint id, which getCheckpointId throws on).
189
197
  await this.saveTag('proposed', event.block);
190
- await this.saveTag('checkpointed', event.block);
191
- await this.saveTag('proposedCheckpoint', event.block);
192
- const storeProven = await this.getBlockId('proven');
193
- if (storeProven.number > event.block.number) {
194
- await this.saveTag('proven', event.block);
198
+
199
+ // Clamp each checkpoint-bearing cursor down to its OWN source tip when it leads it; the event carries a valid
200
+ // (block, id) pair for each. Clamping the proven cursor onto the (possibly higher) checkpointed tip instead
201
+ // would transiently report unproven blocks as proven. The source guarantees proven <= checkpointed, so per-tip
202
+ // clamping preserves the local invariant.
203
+ for (const { tag, sourceTip } of [
204
+ { tag: 'checkpointed', sourceTip: event.checkpointed },
205
+ { tag: 'proven', sourceTip: event.proven },
206
+ ] as const) {
207
+ const current = await this.getTip(tag);
208
+ if (current !== undefined && current > sourceTip.block.number) {
209
+ await this.saveTag(tag, sourceTip.block);
210
+ await this.setTipCheckpoint(tag, sourceTip.checkpoint);
211
+ }
195
212
  }
196
213
  });
197
214
  }
@@ -202,6 +219,7 @@ export abstract class L2TipsStoreBase implements L2BlockStreamEventHandler, L2Bl
202
219
  }
203
220
  await this.runInTransaction(async () => {
204
221
  await this.saveTag('proven', event.block);
222
+ await this.setTipCheckpoint('proven', event.checkpoint);
205
223
  });
206
224
  }
207
225
 
@@ -211,33 +229,16 @@ export abstract class L2TipsStoreBase implements L2BlockStreamEventHandler, L2Bl
211
229
  }
212
230
  await this.runInTransaction(async () => {
213
231
  await this.saveTag('finalized', event.block);
214
- const finalizedCheckpointNumber = await this.getCheckpointNumberForBlock(event.block.number);
232
+ await this.setTipCheckpoint('finalized', event.checkpoint);
215
233
 
216
- // Cap the deletion bound at the lowest live tip. This should always be the finalized tip, but
217
- // we have hit bugs where this is not the case. Deleting the block hash, block-to-checkpoint mapping,
218
- // or enclosing checkpoint object for a live tip would dangle subsequent `getBlockId`/`getCheckpointId`
234
+ // Prune block hashes below the lowest live tip. Cap the deletion bound at the lowest live tip rather
235
+ // than the finalized tip alone: this should always be the finalized tip, but we have hit bugs where
236
+ // this is not the case. Deleting the block hash for a live tip would dangle subsequent `getBlockId`
219
237
  // lookups and lock the block stream into an error loop.
220
- const tips = await Promise.all([
221
- this.getTip('proposed'),
222
- this.getTip('proposedCheckpoint'),
223
- this.getTip('checkpointed'),
224
- this.getTip('proven'),
225
- ]);
238
+ const tips = await Promise.all([this.getTip('proposed'), this.getTip('checkpointed'), this.getTip('proven')]);
226
239
  const liveTipBlocks = tips.filter((t): t is BlockNumber => t !== undefined && t > 0);
227
240
  const safeBlockBound = BlockNumber(Math.min(event.block.number, ...liveTipBlocks));
228
241
  await this.deleteBlockHashesBefore(safeBlockBound);
229
- await this.deleteBlockToCheckpointBefore(safeBlockBound);
230
-
231
- if (finalizedCheckpointNumber !== undefined) {
232
- const tipCheckpoints = await Promise.all(liveTipBlocks.map(b => this.getCheckpointNumberForBlock(b)));
233
- const safeCheckpointBound = CheckpointNumber(
234
- Math.min(
235
- finalizedCheckpointNumber,
236
- ...tipCheckpoints.filter((c): c is CheckpointNumber => c !== undefined && c > 0),
237
- ),
238
- );
239
- await this.deleteCheckpointsBefore(safeCheckpointBound);
240
- }
241
242
  });
242
243
  }
243
244
 
@@ -247,14 +248,4 @@ export abstract class L2TipsStoreBase implements L2BlockStreamEventHandler, L2Bl
247
248
  await this.setBlockHash(block.number, block.hash);
248
249
  }
249
250
  }
250
-
251
- private async saveCheckpoint(publishedCheckpoint: PublishedCheckpoint): Promise<void> {
252
- const checkpoint = publishedCheckpoint.checkpoint;
253
- const lastBlock = checkpoint.blocks.at(-1)!;
254
- // Only store the mapping for the last block since tips only point to checkpoint boundaries
255
- await Promise.all([
256
- this.setCheckpointNumberForBlock(lastBlock.number, checkpoint.number),
257
- this.saveCheckpointData(publishedCheckpoint),
258
- ]);
259
- }
260
251
  }
@@ -1,5 +1,5 @@
1
1
  import type { ViemCommitteeAttestations } from '@aztec/ethereum/contracts';
2
- import { hexToBuffer } from '@aztec/foundation/string';
2
+ import { bufferToHex, hexToBuffer } from '@aztec/foundation/string';
3
3
 
4
4
  import { encodeAbiParameters, parseAbiParameters } from 'viem';
5
5
  import { z } from 'zod';
@@ -76,8 +76,10 @@ export class CommitteeAttestationsAndSigners implements Signable {
76
76
  let totalDataSize = 0;
77
77
  for (const attestation of viemAttestations) {
78
78
  const signature = attestation.signature;
79
- // Check if signature is empty (v = 0)
80
- const isEmpty = signature.v === 0;
79
+ // A slot is empty (a non-signing member, packed as its address) only when r, s and v are all zero
80
+ // matching Signature.isEmpty() and getSigners(), so the bitmap popcount and the signers list can
81
+ // never disagree (which would revert propose() with SignersSizeMismatch).
82
+ const isEmpty = signature.v === 0 && BigInt(signature.r) === 0n && BigInt(signature.s) === 0n;
81
83
 
82
84
  if (!isEmpty) {
83
85
  totalDataSize += 65; // v (1) + r (32) + s (32)
@@ -93,8 +95,8 @@ export class CommitteeAttestationsAndSigners implements Signable {
93
95
  for (const [i, attestation] of viemAttestations.entries()) {
94
96
  const signature = attestation.signature;
95
97
 
96
- // Check if signature is empty
97
- const isEmpty = signature.v === 0;
98
+ // Empty iff r, s and v are all zero (see the size-tally loop above).
99
+ const isEmpty = signature.v === 0 && BigInt(signature.r) === 0n && BigInt(signature.s) === 0n;
98
100
 
99
101
  if (!isEmpty) {
100
102
  // Set bit in bitmap (bit 7-0 in each byte, left to right)
@@ -102,8 +104,10 @@ export class CommitteeAttestationsAndSigners implements Signable {
102
104
  const bitIndex = 7 - (i % 8);
103
105
  signatureIndices[byteIndex] = (signatureIndices[byteIndex] ?? 0) | (1 << bitIndex);
104
106
 
105
- // Pack signature: v + r + s
106
- signaturesOrAddresses[dataIndex] = signature.v;
107
+ // Pack signature: v + r + s. Canonicalize a yParity recovery byte (v = 0/1) to 27/28 — it
108
+ // recovers to the same signer, but L1 ECDSA.recover only accepts 27/28. Any other value is left
109
+ // as-is so a genuinely malformed signature still fails on L1 rather than being silently rewritten.
110
+ signaturesOrAddresses[dataIndex] = signature.v === 0 || signature.v === 1 ? signature.v + 27 : signature.v;
107
111
  dataIndex++;
108
112
 
109
113
  // Pack r (32 bytes)
@@ -153,3 +157,45 @@ export class MaliciousCommitteeAttestationsAndSigners extends CommitteeAttestati
153
157
  return this.signers;
154
158
  }
155
159
  }
160
+
161
+ /**
162
+ * Malicious extension of CommitteeAttestationsAndSigners that rewrites every non-proposer signature slot's
163
+ * recovery byte to yParity form (v ∈ {0, 1}) in the packed output, after the honest `packAttestations` has
164
+ * already canonicalized it to v ∈ {27, 28}. Models a malicious selected proposer that hand-crafts
165
+ * `propose()` calldata L1 accepts but no honest node can byte-replay: each rewritten signature still
166
+ * recovers to the same member (r, s and the recovery parity are preserved), the bitmap bits stay set, and
167
+ * `getSigners()` stays consistent, so `propose()` does not revert `SignersSizeMismatch` -- yet the
168
+ * checkpoint can never be proven (`ECDSA.recover` rejects v ∉ {27, 28}). The proposer's own slot is left
169
+ * canonical so L1 `verifyProposer` (which recovers that slot) still accepts the checkpoint. For testing only.
170
+ */
171
+ export class MaliciousYParityCommitteeAttestationsAndSigners extends CommitteeAttestationsAndSigners {
172
+ constructor(
173
+ attestations: CommitteeAttestation[],
174
+ /** Committee index of the proposer's own slot, left canonical so `propose()` passes `verifyProposer`. */
175
+ private proposerIndex: number,
176
+ signatureContext: CoordinationSignatureContext,
177
+ ) {
178
+ super(attestations, signatureContext);
179
+ }
180
+
181
+ override getPackedAttestations(): ViemCommitteeAttestations {
182
+ const packed = super.getPackedAttestations();
183
+ const data = hexToBuffer(packed.signaturesOrAddresses);
184
+
185
+ // Walk the packed byte-vector and rewrite every non-proposer signed slot's v-byte to yParity form. A
186
+ // signed slot occupies 65 bytes (v, r, s); an empty slot occupies 20 bytes (address only).
187
+ let offset = 0;
188
+ for (let i = 0; i < this.attestations.length; i++) {
189
+ const isSigned = !this.attestations[i].signature.isEmpty();
190
+ if (isSigned && i !== this.proposerIndex) {
191
+ // `packAttestations` canonicalized v to 27/28; rewrite back to the equivalent yParity byte (0/1),
192
+ // preserving the recovery parity so the signature still recovers to the same member.
193
+ const v = data[offset];
194
+ data[offset] = v >= 27 ? v - 27 : v;
195
+ }
196
+ offset += isSigned ? 65 : 20;
197
+ }
198
+
199
+ return { signatureIndices: packed.signatureIndices, signaturesOrAddresses: bufferToHex(data) };
200
+ }
201
+ }