@aztec/stdlib 4.0.0-nightly.20260113 → 4.0.0-nightly.20260115

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 (318) hide show
  1. package/dest/abi/function_call.d.ts +9 -1
  2. package/dest/abi/function_call.d.ts.map +1 -1
  3. package/dest/abi/utils.d.ts +7 -1
  4. package/dest/abi/utils.d.ts.map +1 -1
  5. package/dest/abi/utils.js +7 -0
  6. package/dest/auth_witness/auth_witness.d.ts +2 -1
  7. package/dest/auth_witness/auth_witness.d.ts.map +1 -1
  8. package/dest/avm/avm.d.ts +362 -362
  9. package/dest/avm/avm_accumulated_data.d.ts +30 -3
  10. package/dest/avm/avm_accumulated_data.d.ts.map +1 -1
  11. package/dest/avm/avm_circuit_public_inputs.d.ts +9 -9
  12. package/dest/avm/avm_proving_request.d.ts +299 -299
  13. package/dest/avm/contract_storage_read.d.ts +13 -1
  14. package/dest/avm/contract_storage_read.d.ts.map +1 -1
  15. package/dest/avm/contract_storage_update_request.d.ts +13 -1
  16. package/dest/avm/contract_storage_update_request.d.ts.map +1 -1
  17. package/dest/avm/public_call_stack_item_compressed.d.ts +3 -1
  18. package/dest/avm/public_call_stack_item_compressed.d.ts.map +1 -1
  19. package/dest/avm/public_data_read.d.ts +10 -1
  20. package/dest/avm/public_data_read.d.ts.map +1 -1
  21. package/dest/avm/public_data_update_request.d.ts +10 -1
  22. package/dest/avm/public_data_update_request.d.ts.map +1 -1
  23. package/dest/avm/public_data_write.d.ts +7 -1
  24. package/dest/avm/public_data_write.d.ts.map +1 -1
  25. package/dest/avm/public_inner_call_request.d.ts +4 -1
  26. package/dest/avm/public_inner_call_request.d.ts.map +1 -1
  27. package/dest/avm/revert_code.d.ts +4 -4
  28. package/dest/avm/revert_code.d.ts.map +1 -1
  29. package/dest/block/body.d.ts +1 -1
  30. package/dest/block/body.d.ts.map +1 -1
  31. package/dest/block/body.js +2 -1
  32. package/dest/block/checkpointed_l2_block.d.ts +13 -13
  33. package/dest/block/checkpointed_l2_block.d.ts.map +1 -1
  34. package/dest/block/checkpointed_l2_block.js +5 -4
  35. package/dest/block/l2_block.d.ts +8 -4
  36. package/dest/block/l2_block.d.ts.map +1 -1
  37. package/dest/block/l2_block.js +4 -3
  38. package/dest/block/l2_block_code_to_purge.d.ts +1 -1
  39. package/dest/block/l2_block_code_to_purge.d.ts.map +1 -1
  40. package/dest/block/l2_block_code_to_purge.js +1 -1
  41. package/dest/block/l2_block_header.d.ts +14 -2
  42. package/dest/block/l2_block_header.d.ts.map +1 -1
  43. package/dest/block/l2_block_header.js +14 -7
  44. package/dest/block/l2_block_new.d.ts +9 -4
  45. package/dest/block/l2_block_new.d.ts.map +1 -1
  46. package/dest/block/l2_block_new.js +2 -2
  47. package/dest/block/l2_block_source.d.ts +3 -2
  48. package/dest/block/l2_block_source.d.ts.map +1 -1
  49. package/dest/block/validate_block_result.d.ts +1 -1
  50. package/dest/block/validate_block_result.d.ts.map +1 -1
  51. package/dest/block/validate_block_result.js +5 -4
  52. package/dest/checkpoint/checkpoint.d.ts +9 -4
  53. package/dest/checkpoint/checkpoint.d.ts.map +1 -1
  54. package/dest/checkpoint/checkpoint.js +10 -1
  55. package/dest/checkpoint/published_checkpoint.d.ts +5 -5
  56. package/dest/checkpoint/published_checkpoint.d.ts.map +1 -1
  57. package/dest/checkpoint/published_checkpoint.js +4 -3
  58. package/dest/contract/complete_address.d.ts +4 -1
  59. package/dest/contract/complete_address.d.ts.map +1 -1
  60. package/dest/contract/contract_deployment_data.d.ts +5 -5
  61. package/dest/contract/index.d.ts +1 -3
  62. package/dest/contract/index.d.ts.map +1 -1
  63. package/dest/contract/index.js +0 -2
  64. package/dest/contract/interfaces/contract_instance.d.ts +16 -16
  65. package/dest/database-version/version_manager.d.ts +4 -2
  66. package/dest/database-version/version_manager.d.ts.map +1 -1
  67. package/dest/deserialization/index.d.ts +11 -0
  68. package/dest/deserialization/index.d.ts.map +1 -0
  69. package/dest/deserialization/index.js +10 -0
  70. package/dest/errors/proving_error.d.ts +2 -2
  71. package/dest/errors/proving_error.d.ts.map +1 -1
  72. package/dest/interfaces/aztec-node-admin.d.ts +23 -26
  73. package/dest/interfaces/aztec-node-admin.d.ts.map +1 -1
  74. package/dest/interfaces/block-builder.d.ts +2 -2
  75. package/dest/interfaces/block-builder.d.ts.map +1 -1
  76. package/dest/interfaces/configs.d.ts +6 -6
  77. package/dest/interfaces/get_logs_response.d.ts +1 -1
  78. package/dest/interfaces/proving-job.d.ts +180 -180
  79. package/dest/interfaces/validator.d.ts +1 -9
  80. package/dest/interfaces/validator.d.ts.map +1 -1
  81. package/dest/interfaces/validator.js +0 -1
  82. package/dest/kernel/hints/key_validation_hint.d.ts +2 -1
  83. package/dest/kernel/hints/key_validation_hint.d.ts.map +1 -1
  84. package/dest/kernel/hints/key_validation_request.d.ts +2 -1
  85. package/dest/kernel/hints/key_validation_request.d.ts.map +1 -1
  86. package/dest/kernel/hints/key_validation_request_and_generator.d.ts +6 -1
  87. package/dest/kernel/hints/key_validation_request_and_generator.d.ts.map +1 -1
  88. package/dest/kernel/hints/private_kernel_reset_hints.d.ts +13 -1
  89. package/dest/kernel/hints/private_kernel_reset_hints.d.ts.map +1 -1
  90. package/dest/kernel/hints/read_request.d.ts +7 -1
  91. package/dest/kernel/hints/read_request.d.ts.map +1 -1
  92. package/dest/kernel/hints/read_request_hints.d.ts +7 -1
  93. package/dest/kernel/hints/read_request_hints.d.ts.map +1 -1
  94. package/dest/kernel/private_accumulated_data.d.ts +23 -1
  95. package/dest/kernel/private_accumulated_data.d.ts.map +1 -1
  96. package/dest/kernel/private_call_data.d.ts +25 -1
  97. package/dest/kernel/private_call_data.d.ts.map +1 -1
  98. package/dest/kernel/private_call_request.d.ts +16 -1
  99. package/dest/kernel/private_call_request.d.ts.map +1 -1
  100. package/dest/kernel/private_circuit_public_inputs.d.ts +74 -1
  101. package/dest/kernel/private_circuit_public_inputs.d.ts.map +1 -1
  102. package/dest/kernel/private_kernel_circuit_public_inputs.d.ts +31 -1
  103. package/dest/kernel/private_kernel_circuit_public_inputs.d.ts.map +1 -1
  104. package/dest/kernel/private_kernel_data.d.ts +7 -1
  105. package/dest/kernel/private_kernel_data.d.ts.map +1 -1
  106. package/dest/kernel/private_kernel_init_circuit_private_inputs.d.ts +22 -1
  107. package/dest/kernel/private_kernel_init_circuit_private_inputs.d.ts.map +1 -1
  108. package/dest/kernel/private_kernel_inner_circuit_private_inputs.d.ts +7 -1
  109. package/dest/kernel/private_kernel_inner_circuit_private_inputs.d.ts.map +1 -1
  110. package/dest/kernel/private_kernel_reset_circuit_private_inputs.d.ts +4 -1
  111. package/dest/kernel/private_kernel_reset_circuit_private_inputs.d.ts.map +1 -1
  112. package/dest/kernel/private_kernel_tail_circuit_private_inputs.d.ts +10 -1
  113. package/dest/kernel/private_kernel_tail_circuit_private_inputs.d.ts.map +1 -1
  114. package/dest/kernel/private_kernel_tail_circuit_public_inputs.d.ts +23 -1
  115. package/dest/kernel/private_kernel_tail_circuit_public_inputs.d.ts.map +1 -1
  116. package/dest/kernel/private_to_avm_accumulated_data.d.ts +2 -2
  117. package/dest/kernel/private_to_rollup_accumulated_data.d.ts +17 -1
  118. package/dest/kernel/private_to_rollup_accumulated_data.d.ts.map +1 -1
  119. package/dest/kernel/private_to_rollup_kernel_circuit_public_inputs.d.ts +16 -1
  120. package/dest/kernel/private_to_rollup_kernel_circuit_public_inputs.d.ts.map +1 -1
  121. package/dest/kernel/private_validation_requests.d.ts +10 -1
  122. package/dest/kernel/private_validation_requests.d.ts.map +1 -1
  123. package/dest/kernel/public_call_request.d.ts +22 -1
  124. package/dest/kernel/public_call_request.d.ts.map +1 -1
  125. package/dest/kernel/utils/optional_number.d.ts +7 -1
  126. package/dest/kernel/utils/optional_number.d.ts.map +1 -1
  127. package/dest/keys/public_keys.d.ts +5 -1
  128. package/dest/keys/public_keys.d.ts.map +1 -1
  129. package/dest/logs/extended_contract_class_log.d.ts +3 -1
  130. package/dest/logs/extended_contract_class_log.d.ts.map +1 -1
  131. package/dest/logs/extended_public_log.d.ts +5 -3
  132. package/dest/logs/extended_public_log.d.ts.map +1 -1
  133. package/dest/logs/log_id.d.ts +5 -1
  134. package/dest/logs/log_id.d.ts.map +1 -1
  135. package/dest/messaging/inbox_leaf.d.ts +3 -1
  136. package/dest/messaging/inbox_leaf.d.ts.map +1 -1
  137. package/dest/messaging/l1_actor.d.ts +7 -1
  138. package/dest/messaging/l1_actor.d.ts.map +1 -1
  139. package/dest/messaging/l1_to_l2_message.d.ts +6 -1
  140. package/dest/messaging/l1_to_l2_message.d.ts.map +1 -1
  141. package/dest/messaging/l2_actor.d.ts +7 -1
  142. package/dest/messaging/l2_actor.d.ts.map +1 -1
  143. package/dest/messaging/l2_to_l1_membership.d.ts +1 -1
  144. package/dest/messaging/l2_to_l1_membership.d.ts.map +1 -1
  145. package/dest/messaging/l2_to_l1_membership.js +5 -3
  146. package/dest/messaging/out_hash.d.ts +41 -4
  147. package/dest/messaging/out_hash.d.ts.map +1 -1
  148. package/dest/messaging/out_hash.js +52 -26
  149. package/dest/note/note_dao.d.ts +36 -5
  150. package/dest/note/note_dao.d.ts.map +1 -1
  151. package/dest/note/note_dao.js +15 -12
  152. package/dest/p2p/block_proposal.d.ts +8 -1
  153. package/dest/p2p/block_proposal.d.ts.map +1 -1
  154. package/dest/p2p/block_proposal.js +6 -1
  155. package/dest/p2p/checkpoint_attestation.d.ts +5 -1
  156. package/dest/p2p/checkpoint_attestation.d.ts.map +1 -1
  157. package/dest/p2p/checkpoint_proposal.d.ts +6 -1
  158. package/dest/p2p/checkpoint_proposal.d.ts.map +1 -1
  159. package/dest/p2p/checkpoint_proposal.js +6 -1
  160. package/dest/p2p/consensus_payload.d.ts +4 -1
  161. package/dest/p2p/consensus_payload.d.ts.map +1 -1
  162. package/dest/p2p/signed_txs.d.ts +3 -1
  163. package/dest/p2p/signed_txs.d.ts.map +1 -1
  164. package/dest/p2p/signed_txs.js +6 -1
  165. package/dest/p2p/topic_type.js +2 -1
  166. package/dest/parity/parity_base_private_inputs.d.ts +3 -1
  167. package/dest/parity/parity_base_private_inputs.d.ts.map +1 -1
  168. package/dest/parity/parity_public_inputs.d.ts +4 -1
  169. package/dest/parity/parity_public_inputs.d.ts.map +1 -1
  170. package/dest/parity/parity_root_private_inputs.d.ts +2 -1
  171. package/dest/parity/parity_root_private_inputs.d.ts.map +1 -1
  172. package/dest/proofs/chonk_proof.d.ts +1 -1
  173. package/dest/proofs/chonk_proof.d.ts.map +1 -1
  174. package/dest/proofs/chonk_proof.js +9 -4
  175. package/dest/proofs/proof.d.ts +4 -1
  176. package/dest/proofs/proof.d.ts.map +1 -1
  177. package/dest/proofs/recursive_proof.d.ts +10 -1
  178. package/dest/proofs/recursive_proof.d.ts.map +1 -1
  179. package/dest/rollup/base_rollup_hints.d.ts +34 -1
  180. package/dest/rollup/base_rollup_hints.d.ts.map +1 -1
  181. package/dest/rollup/block_constant_data.d.ts +12 -1
  182. package/dest/rollup/block_constant_data.d.ts.map +1 -1
  183. package/dest/rollup/block_headers_hash.js +1 -1
  184. package/dest/rollup/block_merge_rollup_private_inputs.d.ts +4 -1
  185. package/dest/rollup/block_merge_rollup_private_inputs.d.ts.map +1 -1
  186. package/dest/rollup/block_rollup_public_inputs.d.ts +44 -3
  187. package/dest/rollup/block_rollup_public_inputs.d.ts.map +1 -1
  188. package/dest/rollup/block_rollup_public_inputs.js +2 -2
  189. package/dest/rollup/block_root_rollup_private_inputs.d.ts +64 -1
  190. package/dest/rollup/block_root_rollup_private_inputs.d.ts.map +1 -1
  191. package/dest/rollup/checkpoint_constant_data.d.ts +10 -1
  192. package/dest/rollup/checkpoint_constant_data.d.ts.map +1 -1
  193. package/dest/rollup/checkpoint_header.d.ts +29 -2
  194. package/dest/rollup/checkpoint_header.d.ts.map +1 -1
  195. package/dest/rollup/checkpoint_header.js +21 -5
  196. package/dest/rollup/checkpoint_merge_rollup_private_inputs.d.ts +4 -1
  197. package/dest/rollup/checkpoint_merge_rollup_private_inputs.d.ts.map +1 -1
  198. package/dest/rollup/checkpoint_rollup_public_inputs.d.ts +41 -6
  199. package/dest/rollup/checkpoint_rollup_public_inputs.d.ts.map +1 -1
  200. package/dest/rollup/checkpoint_rollup_public_inputs.js +10 -6
  201. package/dest/rollup/checkpoint_root_rollup_private_inputs.d.ts +44 -3
  202. package/dest/rollup/checkpoint_root_rollup_private_inputs.d.ts.map +1 -1
  203. package/dest/rollup/checkpoint_root_rollup_private_inputs.js +13 -2
  204. package/dest/rollup/epoch_constant_data.d.ts +16 -1
  205. package/dest/rollup/epoch_constant_data.d.ts.map +1 -1
  206. package/dest/rollup/root_rollup_private_inputs.d.ts +6 -1
  207. package/dest/rollup/root_rollup_private_inputs.d.ts.map +1 -1
  208. package/dest/rollup/root_rollup_public_inputs.d.ts +12 -2
  209. package/dest/rollup/root_rollup_public_inputs.d.ts.map +1 -1
  210. package/dest/rollup/root_rollup_public_inputs.js +4 -1
  211. package/dest/rollup/tree_snapshot_diff_hints.d.ts +24 -1
  212. package/dest/rollup/tree_snapshot_diff_hints.d.ts.map +1 -1
  213. package/dest/rollup/tx_merge_rollup_private_inputs.d.ts +4 -1
  214. package/dest/rollup/tx_merge_rollup_private_inputs.d.ts.map +1 -1
  215. package/dest/rollup/tx_rollup_public_inputs.d.ts +29 -1
  216. package/dest/rollup/tx_rollup_public_inputs.d.ts.map +1 -1
  217. package/dest/schemas/schemas.d.ts +1 -1
  218. package/dest/tests/factories.d.ts +1 -1
  219. package/dest/tests/factories.d.ts.map +1 -1
  220. package/dest/tests/factories.js +3 -2
  221. package/dest/trees/append_only_tree_snapshot.d.ts +13 -1
  222. package/dest/trees/append_only_tree_snapshot.d.ts.map +1 -1
  223. package/dest/trees/nullifier_leaf.d.ts +13 -1
  224. package/dest/trees/nullifier_leaf.d.ts.map +1 -1
  225. package/dest/trees/nullifier_membership_witness.d.ts +10 -1
  226. package/dest/trees/nullifier_membership_witness.d.ts.map +1 -1
  227. package/dest/trees/public_data_leaf.d.ts +16 -1
  228. package/dest/trees/public_data_leaf.d.ts.map +1 -1
  229. package/dest/trees/public_data_witness.d.ts +11 -1
  230. package/dest/trees/public_data_witness.d.ts.map +1 -1
  231. package/dest/tx/block_header.d.ts +10 -1
  232. package/dest/tx/block_header.d.ts.map +1 -1
  233. package/dest/tx/call_context.d.ts +13 -1
  234. package/dest/tx/call_context.d.ts.map +1 -1
  235. package/dest/tx/capsule.d.ts +4 -1
  236. package/dest/tx/capsule.d.ts.map +1 -1
  237. package/dest/tx/execution_payload.d.ts +9 -1
  238. package/dest/tx/execution_payload.d.ts.map +1 -1
  239. package/dest/tx/function_data.d.ts +4 -2
  240. package/dest/tx/function_data.d.ts.map +1 -1
  241. package/dest/tx/global_variables.d.ts +9 -1
  242. package/dest/tx/global_variables.d.ts.map +1 -1
  243. package/dest/tx/hashed_values.d.ts +7 -1
  244. package/dest/tx/hashed_values.d.ts.map +1 -1
  245. package/dest/tx/in_tx.d.ts +1 -1
  246. package/dest/tx/partial_state_reference.d.ts +4 -1
  247. package/dest/tx/partial_state_reference.d.ts.map +1 -1
  248. package/dest/tx/private_execution_result.d.ts +22 -1
  249. package/dest/tx/private_execution_result.d.ts.map +1 -1
  250. package/dest/tx/private_tx_constant_data.d.ts +16 -1
  251. package/dest/tx/private_tx_constant_data.d.ts.map +1 -1
  252. package/dest/tx/protocol_contracts.d.ts +1 -1
  253. package/dest/tx/public_call_request_with_calldata.d.ts +7 -1
  254. package/dest/tx/public_call_request_with_calldata.d.ts.map +1 -1
  255. package/dest/tx/state_reference.d.ts +3 -1
  256. package/dest/tx/state_reference.d.ts.map +1 -1
  257. package/dest/tx/tx.d.ts +23 -1
  258. package/dest/tx/tx.d.ts.map +1 -1
  259. package/dest/tx/tx_context.d.ts +2 -1
  260. package/dest/tx/tx_context.d.ts.map +1 -1
  261. package/dest/tx/tx_effect.d.ts +32 -6
  262. package/dest/tx/tx_effect.d.ts.map +1 -1
  263. package/dest/tx/tx_effect.js +0 -7
  264. package/dest/tx/tx_execution_request.d.ts +30 -1
  265. package/dest/tx/tx_execution_request.d.ts.map +1 -1
  266. package/dest/tx/tx_hash.d.ts +2 -1
  267. package/dest/tx/tx_hash.d.ts.map +1 -1
  268. package/dest/tx/tx_receipt.d.ts +7 -1
  269. package/dest/tx/tx_receipt.d.ts.map +1 -1
  270. package/dest/tx/tx_request.d.ts +6 -1
  271. package/dest/tx/tx_request.d.ts.map +1 -1
  272. package/dest/types/shared.d.ts +4 -1
  273. package/dest/types/shared.d.ts.map +1 -1
  274. package/dest/validators/schemas.d.ts +8 -8
  275. package/dest/vks/verification_key.d.ts +22 -1
  276. package/dest/vks/verification_key.d.ts.map +1 -1
  277. package/dest/vks/vk_data.d.ts +7 -1
  278. package/dest/vks/vk_data.d.ts.map +1 -1
  279. package/package.json +11 -10
  280. package/src/abi/utils.ts +17 -0
  281. package/src/block/body.ts +2 -1
  282. package/src/block/checkpointed_l2_block.ts +5 -4
  283. package/src/block/l2_block.ts +4 -2
  284. package/src/block/l2_block_code_to_purge.ts +1 -0
  285. package/src/block/l2_block_header.ts +13 -0
  286. package/src/block/l2_block_new.ts +8 -2
  287. package/src/block/l2_block_source.ts +3 -1
  288. package/src/block/validate_block_result.ts +5 -4
  289. package/src/checkpoint/checkpoint.ts +11 -1
  290. package/src/checkpoint/published_checkpoint.ts +4 -3
  291. package/src/contract/index.ts +0 -2
  292. package/src/deserialization/index.ts +21 -0
  293. package/src/interfaces/block-builder.ts +1 -0
  294. package/src/interfaces/validator.ts +0 -4
  295. package/src/messaging/l2_to_l1_membership.ts +5 -3
  296. package/src/messaging/out_hash.ts +60 -29
  297. package/src/note/note_dao.ts +18 -13
  298. package/src/p2p/block_proposal.ts +6 -1
  299. package/src/p2p/checkpoint_proposal.ts +6 -1
  300. package/src/p2p/signed_txs.ts +6 -1
  301. package/src/p2p/topic_type.ts +1 -1
  302. package/src/proofs/chonk_proof.ts +9 -5
  303. package/src/rollup/block_headers_hash.ts +1 -1
  304. package/src/rollup/block_rollup_public_inputs.ts +2 -2
  305. package/src/rollup/checkpoint_header.ts +20 -0
  306. package/src/rollup/checkpoint_rollup_public_inputs.ts +12 -6
  307. package/src/rollup/checkpoint_root_rollup_private_inputs.ts +14 -1
  308. package/src/rollup/root_rollup_public_inputs.ts +4 -1
  309. package/src/tests/factories.ts +4 -1
  310. package/src/tx/tx_effect.ts +0 -9
  311. package/dest/contract/contract_class_metadata.d.ts +0 -8
  312. package/dest/contract/contract_class_metadata.d.ts.map +0 -1
  313. package/dest/contract/contract_class_metadata.js +0 -1
  314. package/dest/contract/contract_metadata.d.ts +0 -7
  315. package/dest/contract/contract_metadata.d.ts.map +0 -1
  316. package/dest/contract/contract_metadata.js +0 -1
  317. package/src/contract/contract_class_metadata.ts +0 -8
  318. package/src/contract/contract_metadata.ts +0 -7
@@ -1,46 +1,77 @@
1
- import { AZTEC_MAX_EPOCH_DURATION } from '@aztec/constants';
1
+ import { OUT_HASH_TREE_LEAF_COUNT } from '@aztec/constants';
2
2
  import { padArrayEnd } from '@aztec/foundation/collection';
3
3
  import { Fr } from '@aztec/foundation/curves/bn254';
4
- import { computeCompressedUnbalancedShaRoot, computeUnbalancedShaRoot } from '@aztec/foundation/trees';
4
+ import { computeBalancedShaRoot, computeUnbalancedShaRoot, computeWonkyShaRoot } from '@aztec/foundation/trees';
5
5
 
6
+ /**
7
+ * Computes the out hash of a tx. It's the root of the unbalanced tree of all the L2-to-L1 messages emitted by the tx.
8
+ * @param messages - The L2-to-L1 messages emitted by the tx.
9
+ * @returns The out hash of the tx.
10
+ */
6
11
  export function computeTxOutHash(messages: Fr[]): Fr {
12
+ // Must match the implementation in `tx_base_public_inputs_composer.nr > compute_kernel_out_hash()`
7
13
  if (!messages.length) {
8
14
  return Fr.ZERO;
9
15
  }
10
- // Tx out hash is the root of the unbalanced merkle tree of all the messages.
11
- // Zero hashes (which should not happen) are not compressed.
16
+ // It's an unbalanced tree because zero hashes (which should not happen) will be included.
12
17
  return Fr.fromBuffer(computeUnbalancedShaRoot(messages.map(msg => msg.toBuffer())));
13
18
  }
14
19
 
15
- export function computeBlockOutHash(messagesPerBlock: Fr[][]): Fr {
16
- const txOutHashes = messagesPerBlock.map(messages => computeTxOutHash(messages));
17
- return aggregateOutHashes(txOutHashes);
20
+ /**
21
+ * Computes the out hash of a block. It's the root of the wonky tree of all the tx out hashes.
22
+ * @param messagesPerTx - The L2-to-L1 messages emitted by the txs in the block. This is an array of message arrays.
23
+ * The array at index 0 contains the messages emitted by the first tx, the array at index 1 contains the messages
24
+ * emitted by the second tx, and so on.
25
+ * @returns The out hash of the block.
26
+ */
27
+ export function computeBlockOutHash(messagesPerTx: Fr[][]): Fr {
28
+ // See how the tx out hashes are aggregated into a block out hash in `merge_tx_rollups.nr > accumulate_out_hash()`.
29
+ const txOutHashes = messagesPerTx.map(messages => computeTxOutHash(messages));
30
+ return Fr.fromBuffer(computeWonkyShaRoot(txOutHashes.map(hash => hash.toBuffer())));
18
31
  }
19
32
 
20
- export function computeCheckpointOutHash(messagesForAllTxs: Fr[][][]): Fr {
21
- const blockOutHashes = messagesForAllTxs.map(block => computeBlockOutHash(block));
22
- return aggregateOutHashes(blockOutHashes);
33
+ /**
34
+ * Computes the out hash of a checkpoint. It's the root of the wonky tree of all the block out hashes.
35
+ * @param messagesPerBlock - The L2-to-L1 messages emitted by the txs in the blocks in the checkpoint. This is an array
36
+ * of arrays of messages. The array at index 0 contains the arrays of messages emitted by the first block, the array at
37
+ * index 1 contains the arrays of messages emitted by the second block, and so on.
38
+ * @returns The out hash of the checkpoint.
39
+ */
40
+ export function computeCheckpointOutHash(messagesPerBlock: Fr[][][]): Fr {
41
+ // See how the block out hashes are aggregated into a checkpoint out hash in `merge_block_rollups.nr > accumulate_out_hash()`.
42
+ const blockOutHashes = messagesPerBlock.map(block => computeBlockOutHash(block));
43
+ return Fr.fromBuffer(computeWonkyShaRoot(blockOutHashes.map(hash => hash.toBuffer())));
23
44
  }
24
45
 
25
- export function computeEpochOutHash(messagesInEpoch: Fr[][][][]): Fr {
26
- // Must match the implementation in `compute_epoch_out_hash.nr`.
27
- const checkpointOutHashes = messagesInEpoch
28
- .map(checkpoint => computeCheckpointOutHash(checkpoint))
29
- .map(hash => hash.toBuffer());
30
- if (checkpointOutHashes.every(hash => hash.equals(Buffer.alloc(32)))) {
31
- return Fr.ZERO;
32
- }
33
-
34
- const paddedOutHashes = padArrayEnd(checkpointOutHashes, Buffer.alloc(32), AZTEC_MAX_EPOCH_DURATION);
35
- return Fr.fromBuffer(computeUnbalancedShaRoot(paddedOutHashes));
46
+ /**
47
+ * Computes the accumulated (epoch) out hash of a checkpoint. It's the root of the balanced tree of all the out hashes
48
+ * from the first checkpoint in an epoch to the current checkpoint.
49
+ * It's this value that's set to the checkpoint header and validated on L1 instead of the checkpoint out hash.
50
+ * @param checkpointOutHashes - The out hashes of all checkpoints in the epoch.
51
+ * @returns The accumulated (epoch) out hash.
52
+ */
53
+ export function accumulateCheckpointOutHashes(checkpointOutHashes: Fr[]): Fr {
54
+ // See how the checkpoint out hashes are accumulated in `checkpoint_rollup_public_inputs_composer.nr > accumulate_checkpoint_out_hash()`.
55
+ const paddedOutHashes = padArrayEnd(
56
+ checkpointOutHashes.map(hash => hash.toBuffer()),
57
+ Buffer.alloc(32),
58
+ OUT_HASH_TREE_LEAF_COUNT,
59
+ );
60
+ return Fr.fromBuffer(computeBalancedShaRoot(paddedOutHashes));
36
61
  }
37
62
 
38
- // The root of this tree should match the `out_hash` calculated in the circuits. Zero hashes are compressed to reduce
39
- // cost if the non-zero leaves result in a shorter path.
40
- function aggregateOutHashes(outHashes: Fr[]): Fr {
41
- if (!outHashes.length) {
42
- return Fr.ZERO;
43
- }
44
-
45
- return Fr.fromBuffer(computeCompressedUnbalancedShaRoot(outHashes.map(hash => hash.toBuffer())));
63
+ /**
64
+ * Computes the epoch out hash. It's the root of the balanced tree of all the checkpoint out hashes.
65
+ * It should match the **accumulated** out hash of the last checkpoint in the epoch.
66
+ * This value will be inserted into the Outbox on L1.
67
+ * @param messagesPerCheckpoint - The L2-to-L1 messages emitted by the txs in the blocks in the checkpoints in the epoch.
68
+ * This is an array of arrays of arrays of messages. The array at index 0 contains the arrays of arrays of messages
69
+ * emitted by the first checkpoint, the array at index 1 contains the arrays of arrays of messages emitted by the second
70
+ * checkpoint, and so on.
71
+ * @returns The epoch out hash.
72
+ */
73
+ export function computeEpochOutHash(messagesPerCheckpoint: Fr[][][][]): Fr {
74
+ // See how the accumulated out hash is assigned to the root rollup's public inputs in `root_rollup.nr`.
75
+ const checkpointOutHashes = messagesPerCheckpoint.map(checkpoint => computeCheckpointOutHash(checkpoint));
76
+ return accumulateCheckpointOutHashes(checkpointOutHashes);
46
77
  }
@@ -1,4 +1,3 @@
1
- import { toBigIntBE } from '@aztec/foundation/bigint-buffer';
2
1
  import { BlockNumber } from '@aztec/foundation/branded-types';
3
2
  import { Fr } from '@aztec/foundation/curves/bn254';
4
3
  import { Point } from '@aztec/foundation/curves/grumpkin';
@@ -56,8 +55,10 @@ export class NoteDao {
56
55
  /** The L2 block hash in which the tx with this note was included. Used for note management while processing
57
56
  * reorgs.*/
58
57
  public l2BlockHash: string,
59
- /** The index of the leaf in the global note hash tree the note is stored at */
60
- public index: bigint,
58
+ /** The index of the tx within the block, used for ordering notes. */
59
+ public txIndexInBlock: number,
60
+ /** The index of the note within the tx (based on note hash position), used for ordering notes. */
61
+ public noteIndexInTx: number,
61
62
  ) {}
62
63
 
63
64
  toBuffer(): Buffer {
@@ -73,7 +74,8 @@ export class NoteDao {
73
74
  this.txHash,
74
75
  this.l2BlockNumber,
75
76
  Fr.fromHexString(this.l2BlockHash),
76
- this.index,
77
+ this.txIndexInBlock,
78
+ this.noteIndexInTx,
77
79
  ]);
78
80
  }
79
81
 
@@ -91,7 +93,8 @@ export class NoteDao {
91
93
  const txHash = reader.readObject(TxHash);
92
94
  const l2BlockNumber = BlockNumber(reader.readNumber());
93
95
  const l2BlockHash = Fr.fromBuffer(reader).toString();
94
- const index = toBigIntBE(reader.readBytes(32));
96
+ const txIndexInBlock = reader.readNumber();
97
+ const noteIndexInTx = reader.readNumber();
95
98
 
96
99
  return new NoteDao(
97
100
  note,
@@ -105,7 +108,8 @@ export class NoteDao {
105
108
  txHash,
106
109
  l2BlockNumber,
107
110
  l2BlockHash,
108
- index,
111
+ txIndexInBlock,
112
+ noteIndexInTx,
109
113
  );
110
114
  }
111
115
 
@@ -134,7 +138,8 @@ export class NoteDao {
134
138
  this.txHash.equals(other.txHash) &&
135
139
  this.l2BlockNumber === other.l2BlockNumber &&
136
140
  this.l2BlockHash === other.l2BlockHash &&
137
- this.index === other.index
141
+ this.txIndexInBlock === other.txIndexInBlock &&
142
+ this.noteIndexInTx === other.noteIndexInTx
138
143
  );
139
144
  }
140
145
 
@@ -143,11 +148,9 @@ export class NoteDao {
143
148
  * @returns - Its size in bytes.
144
149
  */
145
150
  public getSize() {
146
- const indexSize = Math.ceil(Math.log2(Number(this.index)));
147
151
  const noteSize = 4 + this.note.items.length * Fr.SIZE_IN_BYTES;
148
- return (
149
- noteSize + AztecAddress.SIZE_IN_BYTES * 2 + Fr.SIZE_IN_BYTES * 4 + TxHash.SIZE + Point.SIZE_IN_BYTES + indexSize
150
- );
152
+ // 2 numbers for txIndexInBlock and noteIndexInTx (4 bytes each)
153
+ return noteSize + AztecAddress.SIZE_IN_BYTES * 2 + Fr.SIZE_IN_BYTES * 4 + TxHash.SIZE + Point.SIZE_IN_BYTES + 8;
151
154
  }
152
155
 
153
156
  static async random({
@@ -162,7 +165,8 @@ export class NoteDao {
162
165
  txHash = TxHash.random(),
163
166
  l2BlockNumber = BlockNumber(Math.floor(Math.random() * 1000)),
164
167
  l2BlockHash = Fr.random().toString(),
165
- index = Fr.random().toBigInt(),
168
+ txIndexInBlock = Math.floor(Math.random() * 100),
169
+ noteIndexInTx = Math.floor(Math.random() * 100),
166
170
  }: Partial<NoteDao> = {}) {
167
171
  return new NoteDao(
168
172
  note,
@@ -176,7 +180,8 @@ export class NoteDao {
176
180
  txHash,
177
181
  l2BlockNumber,
178
182
  l2BlockHash,
179
- index,
183
+ txIndexInBlock,
184
+ noteIndexInTx,
180
185
  );
181
186
  }
182
187
  }
@@ -9,6 +9,7 @@ import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
9
9
 
10
10
  import type { L2Block } from '../block/l2_block.js';
11
11
  import type { L2BlockInfo } from '../block/l2_block_info.js';
12
+ import { MAX_TXS_PER_BLOCK } from '../deserialization/index.js';
12
13
  import { BlockHeader } from '../tx/block_header.js';
13
14
  import { TxHash } from '../tx/index.js';
14
15
  import type { Tx } from '../tx/tx.js';
@@ -204,7 +205,11 @@ export class BlockProposal extends Gossipable {
204
205
  const inHash = reader.readObject(Fr);
205
206
  const archiveRoot = reader.readObject(Fr);
206
207
  const signature = reader.readObject(Signature);
207
- const txHashes = reader.readArray(reader.readNumber(), TxHash);
208
+ const txHashCount = reader.readNumber();
209
+ if (txHashCount > MAX_TXS_PER_BLOCK) {
210
+ throw new Error(`txHashes count ${txHashCount} exceeds maximum ${MAX_TXS_PER_BLOCK}`);
211
+ }
212
+ const txHashes = reader.readArray(txHashCount, TxHash);
208
213
 
209
214
  if (!reader.isEmpty()) {
210
215
  const hasSignedTxs = reader.readNumber();
@@ -8,6 +8,7 @@ import { Signature } from '@aztec/foundation/eth-signature';
8
8
  import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
9
9
 
10
10
  import type { L2BlockInfo } from '../block/l2_block_info.js';
11
+ import { MAX_TXS_PER_BLOCK } from '../deserialization/index.js';
11
12
  import { CheckpointHeader } from '../rollup/checkpoint_header.js';
12
13
  import { BlockHeader } from '../tx/block_header.js';
13
14
  import { TxHash } from '../tx/index.js';
@@ -248,7 +249,11 @@ export class CheckpointProposal extends Gossipable {
248
249
  const blockHeader = reader.readObject(BlockHeader);
249
250
  const indexWithinCheckpoint = reader.readNumber();
250
251
  const blockSignature = reader.readObject(Signature);
251
- const txHashes = reader.readArray(reader.readNumber(), TxHash);
252
+ const txHashCount = reader.readNumber();
253
+ if (txHashCount > MAX_TXS_PER_BLOCK) {
254
+ throw new Error(`txHashes count ${txHashCount} exceeds maximum ${MAX_TXS_PER_BLOCK}`);
255
+ }
256
+ const txHashes = reader.readArray(txHashCount, TxHash);
252
257
 
253
258
  let signedTxs: SignedTxs | undefined;
254
259
  if (!reader.isEmpty()) {
@@ -4,6 +4,7 @@ import type { EthAddress } from '@aztec/foundation/eth-address';
4
4
  import { Signature } from '@aztec/foundation/eth-signature';
5
5
  import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
6
6
 
7
+ import { MAX_TXS_PER_BLOCK } from '../deserialization/index.js';
7
8
  import { Tx } from '../tx/tx.js';
8
9
  import {
9
10
  SignatureDomainSeparator,
@@ -64,7 +65,11 @@ export class SignedTxs {
64
65
 
65
66
  static fromBuffer(buf: Buffer | BufferReader): SignedTxs {
66
67
  const reader = BufferReader.asReader(buf);
67
- const txs = reader.readArray(reader.readNumber(), Tx);
68
+ const txCount = reader.readNumber();
69
+ if (txCount > MAX_TXS_PER_BLOCK) {
70
+ throw new Error(`txs count ${txCount} exceeds maximum ${MAX_TXS_PER_BLOCK}`);
71
+ }
72
+ const txs = reader.readArray(txCount, Tx);
68
73
  const signature = reader.readObject(Signature);
69
74
  return new SignedTxs(txs, signature);
70
75
  }
@@ -31,7 +31,7 @@ export function getTopicTypeForClientType(clientType: P2PClientType) {
31
31
  if (clientType === P2PClientType.Full) {
32
32
  return [TopicType.tx, TopicType.block_proposal, TopicType.checkpoint_proposal, TopicType.checkpoint_attestation];
33
33
  } else if (clientType === P2PClientType.Prover) {
34
- return [TopicType.tx, TopicType.block_proposal];
34
+ return [TopicType.tx, TopicType.block_proposal, TopicType.checkpoint_proposal];
35
35
  } else {
36
36
  const _: never = clientType;
37
37
  return [TopicType.tx];
@@ -1,4 +1,5 @@
1
1
  import { CHONK_PROOF_LENGTH } from '@aztec/constants';
2
+ import { times } from '@aztec/foundation/collection';
2
3
  import { randomBytes } from '@aztec/foundation/crypto/random';
3
4
  import { Fr } from '@aztec/foundation/curves/bn254';
4
5
  import { bufferSchemaFor } from '@aztec/foundation/schemas';
@@ -31,12 +32,15 @@ export class ChonkProof {
31
32
 
32
33
  static random() {
33
34
  // NB: Not using Fr.random here because it slows down some tests that require a large number of txs significantly.
35
+ // NB2: generate one fewer random bytes to not have to deal with buffers representing numbers greater than the field modulus
36
+ // NB3: a chonk proof can be compressed. Simulate this by filling 1/4 of the proof with zero data
34
37
  const reducedFrSize = Fr.SIZE_IN_BYTES - 1;
35
- const randomFields = randomBytes(CHONK_PROOF_LENGTH * reducedFrSize);
36
- const proof = Array.from(
37
- { length: CHONK_PROOF_LENGTH },
38
- (_, i) => new Fr(randomFields.subarray(i * reducedFrSize, (i + 1) * reducedFrSize)),
39
- );
38
+ const nonZeroFields = Math.floor((3 * CHONK_PROOF_LENGTH) / 4);
39
+ const randomFields = randomBytes(nonZeroFields * Fr.SIZE_IN_BYTES);
40
+ const proof = [
41
+ ...times(nonZeroFields, i => new Fr(randomFields.subarray(i * reducedFrSize, (i + 1) * reducedFrSize))),
42
+ ...times(CHONK_PROOF_LENGTH - nonZeroFields, () => Fr.ZERO),
43
+ ];
40
44
  return new ChonkProof(proof);
41
45
  }
42
46
 
@@ -5,7 +5,7 @@ import type { BlockHeader } from '../tx/block_header.js';
5
5
 
6
6
  export async function computeBlockHeadersHash(blockHeaders: BlockHeader[]): Promise<Fr> {
7
7
  const blockHeaderHashes = await Promise.all(blockHeaders.map(header => header.hash()));
8
- // Must match the implementation in merge_block_rollups.nr, with the **wonky** rollup structure
8
+ // Must match the implementation in merge_block_rollups.nr, with the **unbalanced** rollup structure
9
9
  // (see validate_consecutive_block_rollups.nr > assert_rollups_filled_greedily.nr).
10
10
  const blockHeadersHash = await computeUnbalancedPoseidonRoot(blockHeaderHashes.map(hash => hash.toBuffer()));
11
11
  return Fr.fromBuffer(blockHeadersHash);
@@ -48,8 +48,8 @@ export class BlockRollupPublicInputs {
48
48
  public timestamp: UInt64,
49
49
  /**
50
50
  * Hash of the headers of all blocks in this block range. It will be combined with the `blockHeadersHash` from
51
- * other blocks in the same checkpoint to form a wonky tree. The root of that tree becomes the final hash stored in
52
- * the checkpoint header, enabling validation of the blocks included in a checkpoint given their headers.
51
+ * other blocks in the same checkpoint to form an unbalanced tree. The root of that tree becomes the final hash
52
+ * stored in the checkpoint header, enabling validation of the blocks included in a checkpoint given their headers.
53
53
  */
54
54
  public blockHeadersHash: Fr,
55
55
  /**
@@ -32,6 +32,14 @@ export class CheckpointHeader {
32
32
  public blobsHash: Fr,
33
33
  /** Root of the l1 to l2 messages subtree. */
34
34
  public inHash: Fr,
35
+ /**
36
+ * The root of the epoch out hash balanced tree. The out hash of the first checkpoint in the epoch is inserted at
37
+ * index 0, the second at index 1, and so on.
38
+ * Note: This is not necessarily the final epoch out hash. It includes only the out hashes of checkpoints up to and
39
+ * including the current checkpoint. Any subsequent checkpoints added to the same epoch are not reflected in this
40
+ * value.
41
+ */
42
+ public epochOutHash: Fr,
35
43
  /** Slot number of the L2 block */
36
44
  public slotNumber: SlotNumber,
37
45
  /** Timestamp of the L2 block. */
@@ -53,6 +61,7 @@ export class CheckpointHeader {
53
61
  blockHeadersHash: schemas.Fr,
54
62
  blobsHash: schemas.Fr,
55
63
  inHash: schemas.Fr,
64
+ epochOutHash: schemas.Fr,
56
65
  slotNumber: schemas.SlotNumber,
57
66
  timestamp: schemas.BigInt,
58
67
  coinbase: schemas.EthAddress,
@@ -69,6 +78,7 @@ export class CheckpointHeader {
69
78
  fields.blockHeadersHash,
70
79
  fields.blobsHash,
71
80
  fields.inHash,
81
+ fields.epochOutHash,
72
82
  fields.slotNumber,
73
83
  fields.timestamp,
74
84
  fields.coinbase,
@@ -90,6 +100,7 @@ export class CheckpointHeader {
90
100
  reader.readObject(Fr),
91
101
  reader.readObject(Fr),
92
102
  reader.readObject(Fr),
103
+ reader.readObject(Fr),
93
104
  SlotNumber(Fr.fromBuffer(reader).toNumber()),
94
105
  reader.readUInt64(),
95
106
  reader.readObject(EthAddress),
@@ -105,6 +116,7 @@ export class CheckpointHeader {
105
116
  this.blockHeadersHash.equals(other.blockHeadersHash) &&
106
117
  this.blobsHash.equals(other.blobsHash) &&
107
118
  this.inHash.equals(other.inHash) &&
119
+ this.epochOutHash.equals(other.epochOutHash) &&
108
120
  this.slotNumber === other.slotNumber &&
109
121
  this.timestamp === other.timestamp &&
110
122
  this.coinbase.equals(other.coinbase) &&
@@ -132,6 +144,7 @@ export class CheckpointHeader {
132
144
  this.blockHeadersHash,
133
145
  this.blobsHash,
134
146
  this.inHash,
147
+ this.epochOutHash,
135
148
  new Fr(this.slotNumber),
136
149
  bigintToUInt64BE(this.timestamp),
137
150
  this.coinbase,
@@ -151,6 +164,7 @@ export class CheckpointHeader {
151
164
  blockHeadersHash: Fr.ZERO,
152
165
  blobsHash: Fr.ZERO,
153
166
  inHash: Fr.ZERO,
167
+ epochOutHash: Fr.ZERO,
154
168
  slotNumber: SlotNumber.ZERO,
155
169
  timestamp: 0n,
156
170
  coinbase: EthAddress.ZERO,
@@ -167,6 +181,7 @@ export class CheckpointHeader {
167
181
  blockHeadersHash: Fr.random(),
168
182
  blobsHash: Fr.random(),
169
183
  inHash: Fr.random(),
184
+ epochOutHash: Fr.random(),
170
185
  slotNumber: SlotNumber(Math.floor(Math.random() * 1000) + 1),
171
186
  timestamp: BigInt(Math.floor(Date.now() / 1000)),
172
187
  coinbase: EthAddress.random(),
@@ -183,6 +198,7 @@ export class CheckpointHeader {
183
198
  this.blockHeadersHash.isZero() &&
184
199
  this.blobsHash.isZero() &&
185
200
  this.inHash.isZero() &&
201
+ this.epochOutHash.isZero() &&
186
202
  this.slotNumber === 0 &&
187
203
  this.timestamp === 0n &&
188
204
  this.coinbase.isZero() &&
@@ -210,6 +226,7 @@ export class CheckpointHeader {
210
226
  Fr.fromString(header.blockHeadersHash),
211
227
  Fr.fromString(header.blobsHash),
212
228
  Fr.fromString(header.inHash),
229
+ Fr.fromString(header.outHash),
213
230
  SlotNumber.fromBigInt(header.slotNumber),
214
231
  header.timestamp,
215
232
  new EthAddress(hexToBuffer(header.coinbase)),
@@ -233,6 +250,7 @@ export class CheckpointHeader {
233
250
  blockHeadersHash: this.blockHeadersHash.toString(),
234
251
  blobsHash: this.blobsHash.toString(),
235
252
  inHash: this.inHash.toString(),
253
+ outHash: this.epochOutHash.toString(),
236
254
  slotNumber: BigInt(this.slotNumber),
237
255
  timestamp: this.timestamp,
238
256
  coinbase: this.coinbase.toString(),
@@ -251,6 +269,7 @@ export class CheckpointHeader {
251
269
  blockHeadersHash: this.blockHeadersHash.toString(),
252
270
  blobsHash: this.blobsHash.toString(),
253
271
  inHash: this.inHash.toString(),
272
+ epochOutHash: this.epochOutHash.toString(),
254
273
  slotNumber: this.slotNumber,
255
274
  timestamp: this.timestamp,
256
275
  coinbase: this.coinbase.toString(),
@@ -266,6 +285,7 @@ export class CheckpointHeader {
266
285
  blockHeadersHash: ${this.blockHeadersHash.toString()},
267
286
  blobsHash: ${inspect(this.blobsHash)},
268
287
  inHash: ${inspect(this.inHash)},
288
+ epochOutHash: ${inspect(this.epochOutHash)},
269
289
  slotNumber: ${this.slotNumber},
270
290
  timestamp: ${this.timestamp},
271
291
  coinbase: ${this.coinbase.toString()},
@@ -28,13 +28,17 @@ export class CheckpointRollupPublicInputs {
28
28
  */
29
29
  public newArchive: AppendOnlyTreeSnapshot,
30
30
  /**
31
- * The hashes of the headers of the constituent checkpoints.
31
+ * The out hash tree snapshot immediately before this checkpoint range.
32
32
  */
33
- public checkpointHeaderHashes: Tuple<Fr, typeof AZTEC_MAX_EPOCH_DURATION>,
33
+ public previousOutHash: AppendOnlyTreeSnapshot,
34
34
  /**
35
- * The `out_hash` values from all checkpoints in this checkpoint range.
35
+ * The out hash tree snapshot after applying this checkpoint range.
36
36
  */
37
- public outHashes: Tuple<Fr, typeof AZTEC_MAX_EPOCH_DURATION>,
37
+ public newOutHash: AppendOnlyTreeSnapshot,
38
+ /**
39
+ * The hashes of the headers of the constituent checkpoints.
40
+ */
41
+ public checkpointHeaderHashes: Tuple<Fr, typeof AZTEC_MAX_EPOCH_DURATION>,
38
42
  /**
39
43
  * The summed transaction fees and recipients of the constituent checkpoints.
40
44
  */
@@ -59,7 +63,8 @@ export class CheckpointRollupPublicInputs {
59
63
  reader.readObject(EpochConstantData),
60
64
  reader.readObject(AppendOnlyTreeSnapshot),
61
65
  reader.readObject(AppendOnlyTreeSnapshot),
62
- reader.readArray(AZTEC_MAX_EPOCH_DURATION, Fr),
66
+ reader.readObject(AppendOnlyTreeSnapshot),
67
+ reader.readObject(AppendOnlyTreeSnapshot),
63
68
  reader.readArray(AZTEC_MAX_EPOCH_DURATION, Fr),
64
69
  reader.readArray(AZTEC_MAX_EPOCH_DURATION, FeeRecipient),
65
70
  reader.readObject(BlobAccumulator),
@@ -73,8 +78,9 @@ export class CheckpointRollupPublicInputs {
73
78
  this.constants,
74
79
  this.previousArchive,
75
80
  this.newArchive,
81
+ this.previousOutHash,
82
+ this.newOutHash,
76
83
  this.checkpointHeaderHashes,
77
- this.outHashes,
78
84
  this.fees,
79
85
  this.startBlobAccumulator,
80
86
  this.endBlobAccumulator,
@@ -1,5 +1,5 @@
1
1
  import { BlobAccumulator, FinalBlobBatchingChallenges } from '@aztec/blob-lib/types';
2
- import { ARCHIVE_HEIGHT, BLOBS_PER_CHECKPOINT, FIELDS_PER_BLOB } from '@aztec/constants';
2
+ import { ARCHIVE_HEIGHT, BLOBS_PER_CHECKPOINT, FIELDS_PER_BLOB, OUT_HASH_TREE_HEIGHT } from '@aztec/constants';
3
3
  import { BLS12Point } from '@aztec/foundation/curves/bls12';
4
4
  import { Fr } from '@aztec/foundation/curves/bn254';
5
5
  import { bufferSchemaFor } from '@aztec/foundation/schemas';
@@ -8,6 +8,7 @@ import { bufferToHex, hexToBuffer } from '@aztec/foundation/string';
8
8
  import type { FieldsOf } from '@aztec/foundation/types';
9
9
 
10
10
  import { ProofData, type RollupHonkProofData } from '../proofs/proof_data.js';
11
+ import { AppendOnlyTreeSnapshot } from '../trees/append_only_tree_snapshot.js';
11
12
  import { BlockHeader } from '../tx/block_header.js';
12
13
  import { BlockRollupPublicInputs } from './block_rollup_public_inputs.js';
13
14
 
@@ -21,6 +22,14 @@ export class CheckpointRootRollupHints {
21
22
  * Hint for checking the hash of previous_block_header is the last leaf of the previous archive.
22
23
  */
23
24
  public previousArchiveSiblingPath: Tuple<Fr, typeof ARCHIVE_HEIGHT>,
25
+ /**
26
+ * The out hash tree snapshot immediately before this checkpoint.
27
+ */
28
+ public previousOutHash: AppendOnlyTreeSnapshot,
29
+ /**
30
+ * Hint for inserting the new out hash into the out hash tree.
31
+ */
32
+ public newOutHashSiblingPath: Tuple<Fr, typeof OUT_HASH_TREE_HEIGHT>,
24
33
  /**
25
34
  * The current blob accumulation state across the epoch.
26
35
  */
@@ -54,6 +63,8 @@ export class CheckpointRootRollupHints {
54
63
  return [
55
64
  fields.previousBlockHeader,
56
65
  fields.previousArchiveSiblingPath,
66
+ fields.previousOutHash,
67
+ fields.newOutHashSiblingPath,
57
68
  fields.startBlobAccumulator,
58
69
  fields.finalBlobChallenges,
59
70
  fields.blobFields,
@@ -71,6 +82,8 @@ export class CheckpointRootRollupHints {
71
82
  return new CheckpointRootRollupHints(
72
83
  BlockHeader.fromBuffer(reader),
73
84
  reader.readArray(ARCHIVE_HEIGHT, Fr),
85
+ reader.readObject(AppendOnlyTreeSnapshot),
86
+ reader.readArray(OUT_HASH_TREE_HEIGHT, Fr),
74
87
  reader.readObject(BlobAccumulator),
75
88
  reader.readObject(FinalBlobBatchingChallenges),
76
89
  // Below line gives error 'Type instantiation is excessively deep and possibly infinite. ts(2589)'
@@ -21,7 +21,10 @@ export class RootRollupPublicInputs {
21
21
  public previousArchiveRoot: Fr,
22
22
  /** Root of the archive tree after this rollup is processed */
23
23
  public endArchiveRoot: Fr,
24
- /** Root of the unbalanced merkle tree consisting of the `out_hash` values from all checkpoints in this rollup. */
24
+ /**
25
+ * Root of the balanced merkle tree consisting of the out hashes of all checkpoints in this epoch.
26
+ * The out hash of the first checkpoint in the epoch is inserted at index 0, the second at index 1, and so on.
27
+ */
25
28
  public outHash: Fr,
26
29
  /** Hashes of checkpoint headers for this rollup. */
27
30
  public checkpointHeaderHashes: Tuple<Fr, typeof AZTEC_MAX_EPOCH_DURATION>,
@@ -850,7 +850,8 @@ export function makeCheckpointRollupPublicInputs(seed = 0) {
850
850
  makeEpochConstantData(seed),
851
851
  makeAppendOnlyTreeSnapshot(seed + 0x100),
852
852
  makeAppendOnlyTreeSnapshot(seed + 0x200),
853
- makeTuple(AZTEC_MAX_EPOCH_DURATION, () => fr(seed), 0x300),
853
+ makeAppendOnlyTreeSnapshot(seed + 0x300),
854
+ makeAppendOnlyTreeSnapshot(seed + 0x350),
854
855
  makeTuple(AZTEC_MAX_EPOCH_DURATION, () => fr(seed), 0x400),
855
856
  makeTuple(AZTEC_MAX_EPOCH_DURATION, () => makeFeeRecipient(seed), 0x500),
856
857
  makeBlobAccumulator(seed + 0x600),
@@ -920,6 +921,7 @@ export function makeL2BlockHeader(
920
921
  makeAppendOnlyTreeSnapshot(seed + 0x100),
921
922
  overrides?.blobsHash ?? fr(seed + 0x200),
922
923
  overrides?.inHash ?? fr(seed + 0x300),
924
+ overrides?.epochOutHash ?? fr(seed + 0x400),
923
925
  overrides?.state ?? makeStateReference(seed + 0x600),
924
926
  makeGlobalVariables((seed += 0x700), {
925
927
  ...(blockNumber !== undefined ? { blockNumber: BlockNumber(blockNumber) } : {}),
@@ -938,6 +940,7 @@ export function makeCheckpointHeader(seed = 0) {
938
940
  blockHeadersHash: fr(seed + 0x150),
939
941
  blobsHash: fr(seed + 0x200),
940
942
  inHash: fr(seed + 0x210),
943
+ epochOutHash: fr(seed + 0x220),
941
944
  slotNumber: SlotNumber(seed + 0x300),
942
945
  timestamp: BigInt(seed + 0x400),
943
946
  coinbase: makeEthAddress(seed + 0x500),
@@ -28,7 +28,6 @@ import { RevertCode } from '../avm/revert_code.js';
28
28
  import { ContractClassLog } from '../logs/contract_class_log.js';
29
29
  import { PrivateLog } from '../logs/private_log.js';
30
30
  import { FlatPublicLogs, PublicLog } from '../logs/public_log.js';
31
- import { computeTxOutHash } from '../messaging/out_hash.js';
32
31
  import { TxHash } from './tx_hash.js';
33
32
 
34
33
  export class TxEffect {
@@ -184,14 +183,6 @@ export class TxEffect {
184
183
  );
185
184
  }
186
185
 
187
- /**
188
- * Computes txOutHash of this tx effect.
189
- * @dev Follows new_sha in unbalanced_merkle_tree.nr
190
- */
191
- txOutHash(): Fr {
192
- return computeTxOutHash(this.l2ToL1Msgs);
193
- }
194
-
195
186
  static async random({
196
187
  numNoteHashes,
197
188
  numNullifiers,
@@ -1,8 +0,0 @@
1
- import type { ContractArtifact } from '../abi/abi.js';
2
- import type { ContractClassWithId } from './interfaces/contract_class.js';
3
- export interface ContractClassMetadata {
4
- contractClass?: ContractClassWithId | undefined;
5
- isContractClassPubliclyRegistered: boolean;
6
- artifact?: ContractArtifact | undefined;
7
- }
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJhY3RfY2xhc3NfbWV0YWRhdGEuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250cmFjdC9jb250cmFjdF9jbGFzc19tZXRhZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RCxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRTFFLE1BQU0sV0FBVyxxQkFBcUI7SUFDcEMsYUFBYSxDQUFDLEVBQUUsbUJBQW1CLEdBQUcsU0FBUyxDQUFDO0lBQ2hELGlDQUFpQyxFQUFFLE9BQU8sQ0FBQztJQUMzQyxRQUFRLENBQUMsRUFBRSxnQkFBZ0IsR0FBRyxTQUFTLENBQUM7Q0FDekMifQ==
@@ -1 +0,0 @@
1
- {"version":3,"file":"contract_class_metadata.d.ts","sourceRoot":"","sources":["../../src/contract/contract_class_metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAE1E,MAAM,WAAW,qBAAqB;IACpC,aAAa,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAChD,iCAAiC,EAAE,OAAO,CAAC;IAC3C,QAAQ,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;CACzC"}
@@ -1 +0,0 @@
1
- export { };
@@ -1,7 +0,0 @@
1
- import type { ContractInstanceWithAddress } from './interfaces/contract_instance.js';
2
- export interface ContractMetadata {
3
- contractInstance?: ContractInstanceWithAddress | undefined;
4
- isContractInitialized: boolean;
5
- isContractPublished: boolean;
6
- }
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJhY3RfbWV0YWRhdGEuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250cmFjdC9jb250cmFjdF9tZXRhZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSwyQkFBMkIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRXJGLE1BQU0sV0FBVyxnQkFBZ0I7SUFDL0IsZ0JBQWdCLENBQUMsRUFBRSwyQkFBMkIsR0FBRyxTQUFTLENBQUM7SUFDM0QscUJBQXFCLEVBQUUsT0FBTyxDQUFDO0lBQy9CLG1CQUFtQixFQUFFLE9BQU8sQ0FBQztDQUM5QiJ9
@@ -1 +0,0 @@
1
- {"version":3,"file":"contract_metadata.d.ts","sourceRoot":"","sources":["../../src/contract/contract_metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AAErF,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,CAAC,EAAE,2BAA2B,GAAG,SAAS,CAAC;IAC3D,qBAAqB,EAAE,OAAO,CAAC;IAC/B,mBAAmB,EAAE,OAAO,CAAC;CAC9B"}
@@ -1 +0,0 @@
1
- export { };
@@ -1,8 +0,0 @@
1
- import type { ContractArtifact } from '../abi/abi.js';
2
- import type { ContractClassWithId } from './interfaces/contract_class.js';
3
-
4
- export interface ContractClassMetadata {
5
- contractClass?: ContractClassWithId | undefined;
6
- isContractClassPubliclyRegistered: boolean;
7
- artifact?: ContractArtifact | undefined;
8
- }
@@ -1,7 +0,0 @@
1
- import type { ContractInstanceWithAddress } from './interfaces/contract_instance.js';
2
-
3
- export interface ContractMetadata {
4
- contractInstance?: ContractInstanceWithAddress | undefined;
5
- isContractInitialized: boolean;
6
- isContractPublished: boolean;
7
- }