@aztec/pxe 0.0.1-commit.b9865e97 → 0.0.1-commit.be03c316

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 (397) hide show
  1. package/dest/bin/check_oracle_version.js +8 -23
  2. package/dest/bin/index.d.ts +2 -2
  3. package/dest/bin/index.d.ts.map +1 -1
  4. package/dest/bin/index.js +1 -1
  5. package/dest/bin/oracle_version_helpers.d.ts +16 -8
  6. package/dest/bin/oracle_version_helpers.d.ts.map +1 -1
  7. package/dest/bin/oracle_version_helpers.js +22 -69
  8. package/dest/block_synchronizer/block_stream_source.d.ts +5 -5
  9. package/dest/block_synchronizer/block_stream_source.d.ts.map +1 -1
  10. package/dest/block_synchronizer/block_stream_source.js +4 -29
  11. package/dest/block_synchronizer/block_synchronizer.d.ts +18 -14
  12. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
  13. package/dest/block_synchronizer/block_synchronizer.js +54 -18
  14. package/dest/config/index.d.ts +2 -1
  15. package/dest/config/index.d.ts.map +1 -1
  16. package/dest/config/index.js +1 -0
  17. package/dest/contract/contract_class_service.d.ts +31 -0
  18. package/dest/contract/contract_class_service.d.ts.map +1 -0
  19. package/dest/contract/contract_class_service.js +68 -0
  20. package/dest/contract/contract_sync_service.d.ts +48 -0
  21. package/dest/contract/contract_sync_service.d.ts.map +1 -0
  22. package/dest/{contract_sync → contract}/contract_sync_service.js +26 -45
  23. package/dest/contract/helpers.d.ts +7 -0
  24. package/dest/contract/helpers.d.ts.map +1 -0
  25. package/dest/contract/helpers.js +20 -0
  26. package/dest/contract/skip_sync_contracts.d.ts +11 -0
  27. package/dest/contract/skip_sync_contracts.d.ts.map +1 -0
  28. package/dest/contract/skip_sync_contracts.js +18 -0
  29. package/dest/contract_function_simulator/anchored_contract_data.d.ts +36 -0
  30. package/dest/contract_function_simulator/anchored_contract_data.d.ts.map +1 -0
  31. package/dest/contract_function_simulator/anchored_contract_data.js +54 -0
  32. package/dest/contract_function_simulator/aztec_node_read_cache.d.ts +39 -0
  33. package/dest/contract_function_simulator/aztec_node_read_cache.d.ts.map +1 -0
  34. package/dest/contract_function_simulator/aztec_node_read_cache.js +60 -0
  35. package/dest/contract_function_simulator/contract_function_simulator.d.ts +19 -18
  36. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  37. package/dest/contract_function_simulator/contract_function_simulator.js +63 -32
  38. package/dest/contract_function_simulator/execution_note_cache.d.ts +3 -9
  39. package/dest/contract_function_simulator/execution_note_cache.d.ts.map +1 -1
  40. package/dest/contract_function_simulator/execution_note_cache.js +8 -28
  41. package/dest/contract_function_simulator/index.d.ts +19 -10
  42. package/dest/contract_function_simulator/index.d.ts.map +1 -1
  43. package/dest/contract_function_simulator/index.js +6 -9
  44. package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts +8 -27
  45. package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts.map +1 -1
  46. package/dest/contract_function_simulator/noir-structs/bounded_vec.js +8 -23
  47. package/dest/contract_function_simulator/noir-structs/contract_class_log_data.d.ts +9 -0
  48. package/dest/contract_function_simulator/noir-structs/contract_class_log_data.d.ts.map +1 -0
  49. package/dest/contract_function_simulator/noir-structs/contract_class_log_data.js +1 -0
  50. package/dest/contract_function_simulator/noir-structs/embedded_curve_point.d.ts +7 -0
  51. package/dest/contract_function_simulator/noir-structs/embedded_curve_point.d.ts.map +1 -0
  52. package/dest/contract_function_simulator/noir-structs/embedded_curve_point.js +1 -0
  53. package/dest/contract_function_simulator/noir-structs/event_validation_request.js +1 -1
  54. package/dest/contract_function_simulator/noir-structs/fact.d.ts +16 -0
  55. package/dest/contract_function_simulator/noir-structs/fact.d.ts.map +1 -0
  56. package/dest/contract_function_simulator/noir-structs/fact.js +6 -0
  57. package/dest/contract_function_simulator/noir-structs/fact_collection.d.ts +27 -0
  58. package/dest/contract_function_simulator/noir-structs/fact_collection.d.ts.map +1 -0
  59. package/dest/contract_function_simulator/noir-structs/fact_collection.js +31 -0
  60. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts +11 -12
  61. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts.map +1 -1
  62. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.js +6 -49
  63. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts +10 -8
  64. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts.map +1 -1
  65. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.js +1 -60
  66. package/dest/contract_function_simulator/noir-structs/note_validation_request.js +2 -2
  67. package/dest/contract_function_simulator/noir-structs/option.d.ts +9 -11
  68. package/dest/contract_function_simulator/noir-structs/option.d.ts.map +1 -1
  69. package/dest/contract_function_simulator/noir-structs/option.js +18 -13
  70. package/dest/contract_function_simulator/noir-structs/origin_block.d.ts +11 -0
  71. package/dest/contract_function_simulator/noir-structs/origin_block.d.ts.map +1 -0
  72. package/dest/contract_function_simulator/noir-structs/origin_block.js +5 -0
  73. package/dest/contract_function_simulator/noir-structs/pending_tagged_log.d.ts +11 -0
  74. package/dest/contract_function_simulator/noir-structs/pending_tagged_log.d.ts.map +1 -0
  75. package/dest/contract_function_simulator/noir-structs/pending_tagged_log.js +4 -0
  76. package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts +6 -9
  77. package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts.map +1 -1
  78. package/dest/contract_function_simulator/noir-structs/provided_secret.js +1 -24
  79. package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.d.ts +28 -0
  80. package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.d.ts.map +1 -0
  81. package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.js +50 -0
  82. package/dest/contract_function_simulator/noir-structs/resolved_tx.d.ts +19 -0
  83. package/dest/contract_function_simulator/noir-structs/resolved_tx.d.ts.map +1 -0
  84. package/dest/contract_function_simulator/noir-structs/resolved_tx.js +9 -0
  85. package/dest/contract_function_simulator/noir-structs/tx_effect_data.d.ts +15 -0
  86. package/dest/contract_function_simulator/noir-structs/tx_effect_data.d.ts.map +1 -0
  87. package/dest/contract_function_simulator/noir-structs/tx_effect_data.js +5 -0
  88. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts +6 -11
  89. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts.map +1 -1
  90. package/dest/contract_function_simulator/noir-structs/utility_context.js +1 -20
  91. package/dest/contract_function_simulator/oracle/acir_callback.d.ts +21 -0
  92. package/dest/contract_function_simulator/oracle/acir_callback.d.ts.map +1 -0
  93. package/dest/contract_function_simulator/oracle/acir_callback.js +115 -0
  94. package/dest/contract_function_simulator/oracle/index.d.ts +2 -13
  95. package/dest/contract_function_simulator/oracle/index.d.ts.map +1 -1
  96. package/dest/contract_function_simulator/oracle/index.js +1 -1
  97. package/dest/contract_function_simulator/oracle/interfaces.d.ts +2 -3
  98. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  99. package/dest/contract_function_simulator/oracle/legacy_oracle_registry.d.ts +39 -0
  100. package/dest/contract_function_simulator/oracle/legacy_oracle_registry.d.ts.map +1 -0
  101. package/dest/contract_function_simulator/oracle/legacy_oracle_registry.js +107 -0
  102. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts +3 -14
  103. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts.map +1 -1
  104. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.js +1 -24
  105. package/dest/contract_function_simulator/oracle/oracle_registry.d.ts +43 -31
  106. package/dest/contract_function_simulator/oracle/oracle_registry.d.ts.map +1 -1
  107. package/dest/contract_function_simulator/oracle/oracle_registry.js +259 -29
  108. package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts +180 -45
  109. package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts.map +1 -1
  110. package/dest/contract_function_simulator/oracle/oracle_type_mappings.js +1024 -341
  111. package/dest/contract_function_simulator/oracle/private_execution.d.ts +1 -1
  112. package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
  113. package/dest/contract_function_simulator/oracle/private_execution.js +2 -3
  114. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +21 -8
  115. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  116. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +132 -22
  117. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +77 -34
  118. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  119. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +247 -106
  120. package/dest/contract_function_simulator/transient_array_service.d.ts +31 -0
  121. package/dest/contract_function_simulator/transient_array_service.d.ts.map +1 -0
  122. package/dest/contract_function_simulator/transient_array_service.js +62 -0
  123. package/dest/debug/pxe_debug_utils.d.ts +2 -2
  124. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  125. package/dest/entrypoints/client/bundle/index.d.ts +2 -1
  126. package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
  127. package/dest/entrypoints/client/bundle/index.js +1 -0
  128. package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
  129. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  130. package/dest/entrypoints/client/bundle/utils.js +17 -6
  131. package/dest/entrypoints/client/lazy/index.d.ts +2 -1
  132. package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
  133. package/dest/entrypoints/client/lazy/index.js +1 -0
  134. package/dest/entrypoints/client/lazy/utils.d.ts +1 -1
  135. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  136. package/dest/entrypoints/client/lazy/utils.js +17 -6
  137. package/dest/entrypoints/client/store.d.ts +14 -0
  138. package/dest/entrypoints/client/store.d.ts.map +1 -0
  139. package/dest/entrypoints/client/store.js +42 -0
  140. package/dest/entrypoints/pxe_creation_options.d.ts +9 -3
  141. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  142. package/dest/entrypoints/server/index.d.ts +6 -3
  143. package/dest/entrypoints/server/index.d.ts.map +1 -1
  144. package/dest/entrypoints/server/index.js +4 -2
  145. package/dest/entrypoints/server/store.d.ts +18 -0
  146. package/dest/entrypoints/server/store.d.ts.map +1 -0
  147. package/dest/entrypoints/server/store.js +28 -0
  148. package/dest/entrypoints/server/utils.d.ts +1 -1
  149. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  150. package/dest/entrypoints/server/utils.js +16 -4
  151. package/dest/error_enriching.d.ts +5 -3
  152. package/dest/error_enriching.d.ts.map +1 -1
  153. package/dest/error_enriching.js +13 -11
  154. package/dest/hooks/execution_hooks.d.ts +31 -11
  155. package/dest/hooks/execution_hooks.d.ts.map +1 -1
  156. package/dest/hooks/execution_hooks.js +3 -3
  157. package/dest/hooks/index.d.ts +4 -3
  158. package/dest/hooks/index.d.ts.map +1 -1
  159. package/dest/hooks/index.js +1 -0
  160. package/dest/hooks/resolve_custom_request.d.ts +23 -0
  161. package/dest/hooks/resolve_custom_request.d.ts.map +1 -0
  162. package/dest/hooks/resolve_custom_request.js +3 -0
  163. package/dest/hooks/resolve_tagging_secret_strategy.d.ts +50 -0
  164. package/dest/hooks/resolve_tagging_secret_strategy.d.ts.map +1 -0
  165. package/dest/hooks/resolve_tagging_secret_strategy.js +3 -0
  166. package/dest/logs/log_service.d.ts +8 -6
  167. package/dest/logs/log_service.d.ts.map +1 -1
  168. package/dest/logs/log_service.js +88 -28
  169. package/dest/messages/tx_resolver_service.d.ts +17 -0
  170. package/dest/messages/tx_resolver_service.d.ts.map +1 -0
  171. package/dest/messages/{message_context_service.js → tx_resolver_service.js} +13 -8
  172. package/dest/notes/note_service.d.ts +1 -1
  173. package/dest/notes/note_service.js +1 -1
  174. package/dest/oracle_version.d.ts +3 -3
  175. package/dest/oracle_version.js +5 -5
  176. package/dest/private_kernel/batch_planner.d.ts +1 -1
  177. package/dest/private_kernel/batch_planner.d.ts.map +1 -1
  178. package/dest/private_kernel/batch_planner.js +1 -1
  179. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +1 -1
  180. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -1
  181. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.js +6 -2
  182. package/dest/private_kernel/hints/test_utils.js +1 -1
  183. package/dest/private_kernel/private_kernel_execution_prover.d.ts +1 -1
  184. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  185. package/dest/private_kernel/private_kernel_execution_prover.js +61 -40
  186. package/dest/private_kernel/private_kernel_oracle.d.ts +4 -2
  187. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  188. package/dest/private_kernel/private_kernel_oracle.js +17 -5
  189. package/dest/pxe.d.ts +114 -48
  190. package/dest/pxe.d.ts.map +1 -1
  191. package/dest/pxe.js +225 -139
  192. package/dest/storage/allowed_scopes.d.ts +6 -0
  193. package/dest/storage/allowed_scopes.d.ts.map +1 -0
  194. package/dest/storage/allowed_scopes.js +7 -0
  195. package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -6
  196. package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
  197. package/dest/storage/anchor_block_store/anchor_block_store.js +8 -6
  198. package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts +1 -1
  199. package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts.map +1 -1
  200. package/dest/storage/backwards_compatibility_tests/schema_tests.js +129 -49
  201. package/dest/storage/capsule_store/capsule_service.d.ts +1 -1
  202. package/dest/storage/capsule_store/capsule_service.d.ts.map +1 -1
  203. package/dest/storage/capsule_store/capsule_service.js +6 -9
  204. package/dest/storage/contract_store/contract_store.d.ts +27 -24
  205. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  206. package/dest/storage/contract_store/contract_store.js +64 -75
  207. package/dest/storage/fact_store/fact_service.d.ts +22 -0
  208. package/dest/storage/fact_store/fact_service.d.ts.map +1 -0
  209. package/dest/storage/fact_store/fact_service.js +45 -0
  210. package/dest/storage/fact_store/fact_store.d.ts +95 -0
  211. package/dest/storage/fact_store/fact_store.d.ts.map +1 -0
  212. package/dest/storage/fact_store/fact_store.js +408 -0
  213. package/dest/storage/fact_store/fact_store_keys.d.ts +34 -0
  214. package/dest/storage/fact_store/fact_store_keys.d.ts.map +1 -0
  215. package/dest/storage/fact_store/fact_store_keys.js +50 -0
  216. package/dest/storage/fact_store/index.d.ts +6 -0
  217. package/dest/storage/fact_store/index.d.ts.map +1 -0
  218. package/dest/storage/fact_store/index.js +4 -0
  219. package/dest/storage/fact_store/origin_state.d.ts +59 -0
  220. package/dest/storage/fact_store/origin_state.d.ts.map +1 -0
  221. package/dest/storage/fact_store/origin_state.js +60 -0
  222. package/dest/storage/fact_store/stored_fact.d.ts +32 -0
  223. package/dest/storage/fact_store/stored_fact.d.ts.map +1 -0
  224. package/dest/storage/fact_store/stored_fact.js +64 -0
  225. package/dest/storage/index.d.ts +3 -2
  226. package/dest/storage/index.d.ts.map +1 -1
  227. package/dest/storage/index.js +2 -1
  228. package/dest/storage/metadata.d.ts +2 -2
  229. package/dest/storage/metadata.d.ts.map +1 -1
  230. package/dest/storage/metadata.js +1 -1
  231. package/dest/storage/note_store/note_store.d.ts +42 -33
  232. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  233. package/dest/storage/note_store/note_store.js +197 -168
  234. package/dest/storage/note_store/stored_note.d.ts +3 -8
  235. package/dest/storage/note_store/stored_note.d.ts.map +1 -1
  236. package/dest/storage/note_store/stored_note.js +4 -20
  237. package/dest/storage/open_pxe_stores.d.ts +5 -3
  238. package/dest/storage/open_pxe_stores.d.ts.map +1 -1
  239. package/dest/storage/open_pxe_stores.js +5 -3
  240. package/dest/storage/private_event_store/private_event_store.d.ts +13 -16
  241. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  242. package/dest/storage/private_event_store/private_event_store.js +40 -43
  243. package/dest/storage/store_identity.d.ts +35 -0
  244. package/dest/storage/store_identity.d.ts.map +1 -0
  245. package/dest/storage/store_identity.js +44 -0
  246. package/dest/storage/tagging_store/index.d.ts +2 -2
  247. package/dest/storage/tagging_store/index.d.ts.map +1 -1
  248. package/dest/storage/tagging_store/index.js +1 -1
  249. package/dest/storage/tagging_store/sender_tagging_store.d.ts +19 -3
  250. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  251. package/dest/storage/tagging_store/sender_tagging_store.js +48 -11
  252. package/dest/storage/tagging_store/tagging_secret_sources_store.d.ts +51 -0
  253. package/dest/storage/tagging_store/tagging_secret_sources_store.d.ts.map +1 -0
  254. package/dest/storage/tagging_store/tagging_secret_sources_store.js +105 -0
  255. package/dest/tagging/constants.d.ts +3 -2
  256. package/dest/tagging/constants.d.ts.map +1 -1
  257. package/dest/tagging/constants.js +28 -10
  258. package/dest/tagging/index.d.ts +2 -2
  259. package/dest/tagging/index.d.ts.map +1 -1
  260. package/dest/tagging/index.js +1 -1
  261. package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts +26 -8
  262. package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts.map +1 -1
  263. package/dest/tagging/recipient_sync/sync_tagged_private_logs.js +95 -20
  264. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +1 -1
  265. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +1 -1
  266. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
  267. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +6 -2
  268. package/dest/tagging/testing/tag_query_test_utils.d.ts +6 -0
  269. package/dest/tagging/testing/tag_query_test_utils.d.ts.map +1 -0
  270. package/dest/tagging/testing/tag_query_test_utils.js +10 -0
  271. package/package.json +17 -17
  272. package/src/bin/check_oracle_version.ts +8 -24
  273. package/src/bin/index.ts +1 -1
  274. package/src/bin/oracle_version_helpers.ts +23 -90
  275. package/src/block_synchronizer/block_stream_source.ts +6 -45
  276. package/src/block_synchronizer/block_synchronizer.ts +70 -29
  277. package/src/config/index.ts +1 -0
  278. package/src/contract/contract_class_service.ts +83 -0
  279. package/src/{contract_sync → contract}/contract_sync_service.ts +37 -50
  280. package/src/contract/helpers.ts +35 -0
  281. package/src/contract/skip_sync_contracts.ts +23 -0
  282. package/src/contract_function_simulator/anchored_contract_data.ts +74 -0
  283. package/src/contract_function_simulator/aztec_node_read_cache.ts +89 -0
  284. package/src/contract_function_simulator/contract_function_simulator.ts +96 -42
  285. package/src/contract_function_simulator/execution_note_cache.ts +7 -28
  286. package/src/contract_function_simulator/index.ts +48 -13
  287. package/src/contract_function_simulator/noir-structs/bounded_vec.ts +12 -24
  288. package/src/contract_function_simulator/noir-structs/contract_class_log_data.ts +9 -0
  289. package/src/contract_function_simulator/noir-structs/embedded_curve_point.ts +4 -0
  290. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +1 -1
  291. package/src/contract_function_simulator/noir-structs/fact.ts +13 -0
  292. package/src/contract_function_simulator/noir-structs/fact_collection.ts +64 -0
  293. package/src/contract_function_simulator/noir-structs/log_retrieval_request.ts +20 -46
  294. package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +13 -60
  295. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +2 -2
  296. package/src/contract_function_simulator/noir-structs/option.ts +17 -11
  297. package/src/contract_function_simulator/noir-structs/origin_block.ts +8 -0
  298. package/src/contract_function_simulator/noir-structs/pending_tagged_log.ts +12 -0
  299. package/src/contract_function_simulator/noir-structs/provided_secret.ts +4 -26
  300. package/src/contract_function_simulator/noir-structs/resolved_tagging_strategy.ts +66 -0
  301. package/src/contract_function_simulator/noir-structs/resolved_tx.ts +19 -0
  302. package/src/contract_function_simulator/noir-structs/tx_effect_data.ts +16 -0
  303. package/src/contract_function_simulator/noir-structs/utility_context.ts +5 -17
  304. package/src/contract_function_simulator/oracle/acir_callback.ts +154 -0
  305. package/src/contract_function_simulator/oracle/index.ts +1 -15
  306. package/src/contract_function_simulator/oracle/interfaces.ts +1 -2
  307. package/src/contract_function_simulator/oracle/legacy_oracle_registry.ts +147 -0
  308. package/src/contract_function_simulator/oracle/message_load_oracle_inputs.ts +6 -21
  309. package/src/contract_function_simulator/oracle/oracle_registry.ts +172 -47
  310. package/src/contract_function_simulator/oracle/oracle_type_mappings.ts +814 -315
  311. package/src/contract_function_simulator/oracle/private_execution.ts +2 -3
  312. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +167 -30
  313. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +399 -135
  314. package/src/contract_function_simulator/transient_array_service.ts +91 -0
  315. package/src/debug/pxe_debug_utils.ts +1 -1
  316. package/src/entrypoints/client/bundle/index.ts +1 -0
  317. package/src/entrypoints/client/bundle/utils.ts +24 -5
  318. package/src/entrypoints/client/lazy/index.ts +1 -0
  319. package/src/entrypoints/client/lazy/utils.ts +24 -5
  320. package/src/entrypoints/client/store.ts +54 -0
  321. package/src/entrypoints/pxe_creation_options.ts +8 -2
  322. package/src/entrypoints/server/index.ts +6 -2
  323. package/src/entrypoints/server/store.ts +47 -0
  324. package/src/entrypoints/server/utils.ts +31 -9
  325. package/src/error_enriching.ts +27 -11
  326. package/src/hooks/execution_hooks.ts +32 -12
  327. package/src/hooks/index.ts +8 -2
  328. package/src/hooks/resolve_custom_request.ts +24 -0
  329. package/src/hooks/resolve_tagging_secret_strategy.ts +60 -0
  330. package/src/logs/log_service.ts +100 -37
  331. package/src/messages/{message_context_service.ts → tx_resolver_service.ts} +16 -9
  332. package/src/notes/note_service.ts +1 -1
  333. package/src/oracle_version.ts +5 -5
  334. package/src/private_kernel/batch_planner.ts +0 -1
  335. package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +11 -1
  336. package/src/private_kernel/hints/test_utils.ts +1 -1
  337. package/src/private_kernel/private_kernel_execution_prover.ts +112 -56
  338. package/src/private_kernel/private_kernel_oracle.ts +23 -4
  339. package/src/pxe.ts +328 -159
  340. package/src/storage/allowed_scopes.ts +14 -0
  341. package/src/storage/anchor_block_store/anchor_block_store.ts +8 -6
  342. package/src/storage/backwards_compatibility_tests/__snapshots__/AddressStore.json +6 -6
  343. package/src/storage/backwards_compatibility_tests/__snapshots__/ContractStore.json +1 -1
  344. package/src/storage/backwards_compatibility_tests/__snapshots__/FactStore.json +40 -0
  345. package/src/storage/backwards_compatibility_tests/__snapshots__/KeyStore.json +12 -12
  346. package/src/storage/backwards_compatibility_tests/__snapshots__/L2TipsKVStore.json +9 -15
  347. package/src/storage/backwards_compatibility_tests/__snapshots__/NoteStore.json +24 -4
  348. package/src/storage/backwards_compatibility_tests/__snapshots__/RecipientTaggingStore.json +11 -3
  349. package/src/storage/backwards_compatibility_tests/__snapshots__/SenderTaggingStore.json +12 -4
  350. package/src/storage/backwards_compatibility_tests/__snapshots__/TaggingSecretSourcesStore.json +30 -0
  351. package/src/storage/backwards_compatibility_tests/__snapshots__/opened_stores.json +29 -9
  352. package/src/storage/backwards_compatibility_tests/schema_tests.ts +141 -50
  353. package/src/storage/capsule_store/capsule_service.ts +8 -13
  354. package/src/storage/contract_store/contract_store.ts +86 -93
  355. package/src/storage/fact_store/fact_service.ts +69 -0
  356. package/src/storage/fact_store/fact_store.ts +487 -0
  357. package/src/storage/fact_store/fact_store_keys.ts +75 -0
  358. package/src/storage/fact_store/index.ts +15 -0
  359. package/src/storage/fact_store/origin_state.ts +84 -0
  360. package/src/storage/fact_store/stored_fact.ts +80 -0
  361. package/src/storage/index.ts +2 -1
  362. package/src/storage/metadata.ts +1 -1
  363. package/src/storage/note_store/note_store.ts +226 -187
  364. package/src/storage/note_store/stored_note.ts +5 -27
  365. package/src/storage/open_pxe_stores.ts +6 -3
  366. package/src/storage/private_event_store/private_event_store.ts +49 -55
  367. package/src/storage/store_identity.ts +72 -0
  368. package/src/storage/tagging_store/index.ts +1 -1
  369. package/src/storage/tagging_store/sender_tagging_store.ts +62 -15
  370. package/src/storage/tagging_store/tagging_secret_sources_store.ts +138 -0
  371. package/src/tagging/constants.ts +30 -10
  372. package/src/tagging/index.ts +1 -1
  373. package/src/tagging/recipient_sync/sync_tagged_private_logs.ts +148 -30
  374. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +1 -1
  375. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +6 -2
  376. package/src/tagging/testing/tag_query_test_utils.ts +11 -0
  377. package/dest/contract_function_simulator/oracle/oracle.d.ts +0 -89
  378. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +0 -1
  379. package/dest/contract_function_simulator/oracle/oracle.js +0 -552
  380. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts +0 -6
  381. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts.map +0 -1
  382. package/dest/contract_function_simulator/proxied_contract_data_source.js +0 -51
  383. package/dest/contract_sync/contract_sync_service.d.ts +0 -42
  384. package/dest/contract_sync/contract_sync_service.d.ts.map +0 -1
  385. package/dest/contract_sync/helpers.d.ts +0 -27
  386. package/dest/contract_sync/helpers.d.ts.map +0 -1
  387. package/dest/contract_sync/helpers.js +0 -53
  388. package/dest/messages/message_context_service.d.ts +0 -17
  389. package/dest/messages/message_context_service.d.ts.map +0 -1
  390. package/dest/storage/tagging_store/sender_address_book_store.d.ts +0 -14
  391. package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +0 -1
  392. package/dest/storage/tagging_store/sender_address_book_store.js +0 -36
  393. package/src/contract_function_simulator/oracle/oracle.ts +0 -711
  394. package/src/contract_function_simulator/proxied_contract_data_source.ts +0 -60
  395. package/src/contract_sync/helpers.ts +0 -86
  396. package/src/storage/backwards_compatibility_tests/__snapshots__/SenderAddressBookStore.json +0 -16
  397. package/src/storage/tagging_store/sender_address_book_store.ts +0 -48
@@ -1,23 +1,22 @@
1
- import { BLOCK_HEADER_LENGTH, KEY_VALIDATION_REQUEST_LENGTH, MAX_CONTRACT_CLASS_LOGS_PER_TX, MAX_L2_TO_L1_MSGS_PER_TX, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_PRIVATE_LOGS_PER_TX, MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX } from '@aztec/constants';
1
+ import { CONTRACT_CLASS_LOG_SIZE_IN_FIELDS, FLAT_PUBLIC_LOGS_PAYLOAD_LENGTH, L1_TO_L2_MSG_TREE_HEIGHT, MAX_CONTRACT_CLASS_LOGS_PER_TX, MAX_L2_TO_L1_MSGS_PER_TX, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_PRIVATE_LOGS_PER_TX, MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, NULLIFIER_TREE_HEIGHT, PRIVATE_LOG_CIPHERTEXT_LEN, PRIVATE_LOG_SIZE_IN_FIELDS, PUBLIC_DATA_TREE_HEIGHT } from '@aztec/constants';
2
2
  import { BlockNumber } from '@aztec/foundation/branded-types';
3
3
  import { padArrayEnd } from '@aztec/foundation/collection';
4
4
  import { Fr } from '@aztec/foundation/curves/bn254';
5
- import { Point } from '@aztec/foundation/curves/grumpkin';
6
- import { fromUintArray } from '@aztec/simulator/client';
5
+ import { EthAddress } from '@aztec/foundation/eth-address';
6
+ import { FieldReader } from '@aztec/foundation/serialize';
7
7
  import { FunctionSelector, NoteSelector } from '@aztec/stdlib/abi';
8
- import { PublicDataWrite } from '@aztec/stdlib/avm';
9
8
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
10
9
  import { BlockHash } from '@aztec/stdlib/block';
11
- import { KeyValidationRequest } from '@aztec/stdlib/kernel';
12
- import { ContractClassLog, ContractClassLogFields, FlatPublicLogs, PrivateLog, Tag, appTaggingSecretKindFromDeliveryMode } from '@aztec/stdlib/logs';
13
- import { BlockHeader, TxHash } from '@aztec/stdlib/tx';
10
+ import { Tag, appTaggingSecretKindFromDeliveryMode } from '@aztec/stdlib/logs';
11
+ import { TxHash } from '@aztec/stdlib/tx';
12
+ import { originBlockStateFromNumber } from '../../storage/fact_store/index.js';
14
13
  import { BoundedVec } from '../noir-structs/bounded_vec.js';
15
14
  import { EphemeralArray } from '../noir-structs/ephemeral_array.js';
16
15
  import { EventValidationRequest } from '../noir-structs/event_validation_request.js';
17
- import { LogRetrievalRequest } from '../noir-structs/log_retrieval_request.js';
16
+ import { logSourceFromField } from '../noir-structs/log_retrieval_request.js';
18
17
  import { NoteValidationRequest } from '../noir-structs/note_validation_request.js';
19
18
  import { Option } from '../noir-structs/option.js';
20
- import { ProvidedSecret } from '../noir-structs/provided_secret.js';
19
+ import { resolvedTaggingStrategyFromFields, resolvedTaggingStrategyToFields } from '../noir-structs/resolved_tagging_strategy.js';
21
20
  import { packAsHintedNote } from './note_packing_utils.js';
22
21
  /**
23
22
  * Asserts that every reader was fully consumed by a deserialization, throwing on leftover fields.
@@ -29,92 +28,123 @@ import { packAsHintedNote } from './note_packing_utils.js';
29
28
  });
30
29
  }
31
30
  // ─── Scalar Type Mappings ────────────────────────────────────────────────────
32
- export const FIELD = {
31
+ /**
32
+ * A leaf mapping whose {@link TypeMapping.label} is just its bare {@link TypeMapping.kind}. Its wire shape is arbitrary
33
+ * (several fields, or a variable-width run); a single-field scalar uses the shorter {@link SCALAR} instead.
34
+ */ export function LEAF(mapping) {
35
+ return {
36
+ ...mapping,
37
+ label: mapping.kind
38
+ };
39
+ }
40
+ /** A {@link LEAF} occupying a single `'scalar'` wire slot, so callers omit the shape. */ export function SCALAR(mapping) {
41
+ return LEAF({
42
+ ...mapping,
43
+ shape: [
44
+ 'scalar'
45
+ ]
46
+ });
47
+ }
48
+ export const FIELD = SCALAR({
49
+ kind: 'field',
33
50
  serialization: {
34
51
  fn: (v)=>[
35
52
  v
36
53
  ]
37
54
  },
38
55
  deserialization: {
39
- fn: ([reader])=>reader.readField(),
40
- slots: 1
56
+ fn: ([reader])=>reader.readField()
41
57
  }
42
- };
43
- export const BOOL = {
58
+ });
59
+ export const BOOL = SCALAR({
60
+ kind: 'bool',
44
61
  serialization: {
45
62
  fn: (v)=>[
46
63
  new Fr(v ? 1n : 0n)
47
64
  ]
48
65
  },
49
66
  deserialization: {
50
- fn: ([reader])=>!reader.readField().isZero(),
51
- slots: 1
67
+ fn: ([reader])=>!reader.readField().isZero()
52
68
  }
53
- };
54
- export const U32 = {
69
+ });
70
+ export const U32 = SCALAR({
71
+ kind: 'u32',
55
72
  serialization: {
56
73
  fn: (v)=>[
57
74
  new Fr(v)
58
75
  ]
59
76
  },
60
77
  deserialization: {
61
- fn: ([reader])=>{
62
- const value = reader.readField().toBigInt();
63
- if (value > 0xffffffffn) {
64
- throw new Error(`U32 overflow: value ${value} exceeds u32 max (${0xffffffffn})`);
65
- }
66
- return Number(value);
67
- },
68
- slots: 1
78
+ fn: ([reader])=>Number(uintFromField(reader.readField(), 32))
69
79
  }
70
- };
71
- export const BLOCK_NUMBER = {
72
- serialization: {
73
- fn: (v)=>[
74
- new Fr(v)
75
- ]
76
- },
77
- deserialization: {
78
- fn: ([reader])=>BlockNumber(reader.readField().toNumber()),
79
- slots: 1
80
- }
81
- };
82
- /** A u8 byte: serializes to a single Fr; deserializes from a single Fr to a number in [0, 255]. */ export const BYTE = {
80
+ });
81
+ export const BLOCK_NUMBER = ALIAS(U32, {
82
+ wrap: (v)=>BlockNumber(v),
83
+ unwrap: (v)=>v
84
+ });
85
+ export const U8 = SCALAR({
86
+ kind: 'u8',
83
87
  serialization: {
84
88
  fn: (byte)=>[
85
89
  new Fr(byte)
86
90
  ]
87
91
  },
88
92
  deserialization: {
89
- fn: ([reader])=>{
90
- const value = reader.readField().toBigInt();
91
- if (value > 0xffn) {
92
- throw new Error(`BYTE overflow: value ${value} exceeds u8 max (255)`);
93
- }
94
- return Number(value);
95
- },
96
- slots: 1
93
+ fn: ([reader])=>Number(uintFromField(reader.readField(), 8))
97
94
  }
98
- };
95
+ });
99
96
  // Noir passes `MessageDelivery` onchain variants here.
100
- export const DELIVERY_MODE = {
97
+ export const DELIVERY_MODE = SCALAR({
98
+ kind: 'onchain-delivery-mode',
101
99
  deserialization: {
102
- fn: (readers)=>appTaggingSecretKindFromDeliveryMode(BYTE.deserialization.fn(readers)),
103
- slots: BYTE.deserialization.slots
100
+ fn: (readers)=>appTaggingSecretKindFromDeliveryMode(U8.deserialization.fn(readers))
104
101
  }
105
- };
106
- export const BIGINT = {
102
+ });
103
+ export const RESOLVED_TAGGING_STRATEGY = LEAF({
104
+ kind: 'resolved-tagging-strategy',
105
+ serialization: {
106
+ fn: (resolved)=>resolvedTaggingStrategyToFields(resolved)
107
+ },
108
+ deserialization: {
109
+ fn: ([kindReader, secretReader])=>resolvedTaggingStrategyFromFields(kindReader.readField().toNumber(), secretReader.readField())
110
+ },
111
+ shape: [
112
+ 'scalar',
113
+ 'scalar'
114
+ ]
115
+ });
116
+ export const BIGINT = ALIAS(FIELD, {
117
+ wrap: (f)=>f.toBigInt(),
118
+ unwrap: (v)=>new Fr(v)
119
+ });
120
+ export const U64 = SCALAR({
121
+ kind: 'u64',
107
122
  serialization: {
108
123
  fn: (v)=>[
109
124
  new Fr(v)
110
125
  ]
111
126
  },
112
127
  deserialization: {
113
- fn: ([reader])=>reader.readField().toBigInt(),
114
- slots: 1
128
+ fn: ([reader])=>uintFromField(reader.readField(), 64)
115
129
  }
116
- };
117
- /** Reads every field in the slot as a UTF-8 character code. */ export const STR = {
130
+ });
131
+ export const U128 = SCALAR({
132
+ kind: 'u128',
133
+ serialization: {
134
+ fn: (v)=>[
135
+ new Fr(v)
136
+ ]
137
+ },
138
+ deserialization: {
139
+ fn: ([reader])=>uintFromField(reader.readField(), 128)
140
+ }
141
+ });
142
+ export const LEAF_INDEX = ALIAS(FIELD, {
143
+ wrap: (f)=>f.toNumber(),
144
+ unwrap: (v)=>new Fr(v)
145
+ });
146
+ /** Reads every field in the slot as a UTF-8 character code. */ export const STR = LEAF({
147
+ kind: 'str',
118
148
  serialization: {
119
149
  fn: (str)=>[
120
150
  Array.from(Buffer.from(str, 'utf-8')).map((b)=>new Fr(b))
@@ -127,203 +157,471 @@ export const BIGINT = {
127
157
  chars.push(String.fromCharCode(reader.readField().toNumber()));
128
158
  }
129
159
  return chars.join('');
130
- },
131
- slots: 1
132
- }
133
- };
134
- export const AZTEC_ADDRESS = {
160
+ }
161
+ },
162
+ shape: [
163
+ 'variable'
164
+ ]
165
+ });
166
+ export const AZTEC_ADDRESS = SCALAR({
167
+ kind: 'aztec-address',
135
168
  serialization: {
136
169
  fn: (v)=>[
137
170
  v.toField()
138
171
  ]
139
172
  },
140
173
  deserialization: {
141
- fn: ([reader])=>AztecAddress.fromField(reader.readField()),
142
- slots: 1
174
+ fn: ([reader])=>AztecAddress.fromFieldUnsafe(reader.readField())
143
175
  }
144
- };
145
- export const BLOCK_HASH = {
176
+ });
177
+ export const BLOCK_HASH = ALIAS(FIELD, {
178
+ wrap: (f)=>new BlockHash(f),
179
+ unwrap: (v)=>new Fr(v.toBuffer())
180
+ });
181
+ export const FUNCTION_SELECTOR = SCALAR({
182
+ kind: 'function-selector',
146
183
  serialization: {
147
184
  fn: (v)=>[
148
- new Fr(v.toBuffer())
185
+ v.toField()
149
186
  ]
150
187
  },
151
188
  deserialization: {
152
- fn: ([reader])=>new BlockHash(reader.readField()),
153
- slots: 1
189
+ fn: ([reader])=>FunctionSelector.fromField(reader.readField())
190
+ }
191
+ });
192
+ export const NOTE_SELECTOR = ALIAS(FIELD, {
193
+ wrap: (f)=>NoteSelector.fromField(f),
194
+ unwrap: (v)=>v.toField()
195
+ });
196
+ export const TX_HASH = ALIAS(FIELD, {
197
+ wrap: (f)=>TxHash.fromField(f),
198
+ unwrap: (v)=>v.hash
199
+ });
200
+ const TAG = ALIAS(FIELD, {
201
+ wrap: (f)=>new Tag(f),
202
+ unwrap: (v)=>v.value
203
+ });
204
+ export const POINT = STRUCT([
205
+ {
206
+ name: 'x',
207
+ type: FIELD
208
+ },
209
+ {
210
+ name: 'y',
211
+ type: FIELD
154
212
  }
155
- };
156
- export const FUNCTION_SELECTOR = {
213
+ ]);
214
+ const LOG_SOURCE = SCALAR({
215
+ kind: 'log-source',
157
216
  serialization: {
158
217
  fn: (v)=>[
159
- v.toField()
218
+ new Fr(v)
160
219
  ]
161
220
  },
162
221
  deserialization: {
163
- fn: ([reader])=>FunctionSelector.fromField(reader.readField()),
164
- slots: 1
222
+ fn: ([reader])=>logSourceFromField(reader.readField())
165
223
  }
166
- };
167
- export const NOTE_SELECTOR = {
224
+ });
225
+ export const ETH_ADDRESS = SCALAR({
226
+ kind: 'eth-address',
168
227
  serialization: {
169
228
  fn: (v)=>[
170
229
  v.toField()
171
230
  ]
172
231
  },
173
232
  deserialization: {
174
- fn: ([reader])=>NoteSelector.fromField(reader.readField()),
175
- slots: 1
233
+ fn: ([reader])=>EthAddress.fromField(reader.readField())
176
234
  }
177
- };
178
- export const TX_HASH = {
179
- serialization: {
180
- fn: (v)=>[
181
- v.hash
182
- ]
235
+ });
236
+ export const SLOT_NUMBER = ALIAS(FIELD, {
237
+ unwrap: (v)=>new Fr(v)
238
+ });
239
+ const APPEND_ONLY_TREE_SNAPSHOT = STRUCT([
240
+ {
241
+ name: 'root',
242
+ type: FIELD
183
243
  },
184
- deserialization: {
185
- fn: ([reader])=>TxHash.fromField(reader.readField()),
186
- slots: 1
244
+ {
245
+ name: 'nextAvailableLeafIndex',
246
+ type: LEAF_INDEX
187
247
  }
188
- };
189
- export const TAG = {
190
- serialization: {
191
- fn: (v)=>[
192
- v.value
193
- ]
248
+ ]);
249
+ const PARTIAL_STATE_REFERENCE = STRUCT([
250
+ {
251
+ name: 'noteHashTree',
252
+ type: APPEND_ONLY_TREE_SNAPSHOT
194
253
  },
195
- deserialization: {
196
- fn: ([reader])=>new Tag(reader.readField()),
197
- slots: 1
254
+ {
255
+ name: 'nullifierTree',
256
+ type: APPEND_ONLY_TREE_SNAPSHOT
257
+ },
258
+ {
259
+ name: 'publicDataTree',
260
+ type: APPEND_ONLY_TREE_SNAPSHOT
198
261
  }
199
- };
200
- export const POINT = {
201
- serialization: {
202
- fn: (p)=>[
203
- p.toFields()
204
- ]
262
+ ]);
263
+ const STATE_REFERENCE = STRUCT([
264
+ {
265
+ name: 'l1ToL2MessageTree',
266
+ type: APPEND_ONLY_TREE_SNAPSHOT
205
267
  },
206
- deserialization: {
207
- fn: ([reader])=>Point.fromFields([
208
- reader.readField(),
209
- reader.readField()
210
- ]),
211
- slots: 1
212
- }
213
- };
214
- // ─── Struct Type Mappings ────────────────────────────────────────────────────
215
- export const BLOCK_HEADER = {
216
- serialization: {
217
- fn: (v)=>v.toFields()
268
+ {
269
+ name: 'partial',
270
+ type: PARTIAL_STATE_REFERENCE
271
+ }
272
+ ]);
273
+ const GAS_FEES = STRUCT([
274
+ {
275
+ name: 'feePerDaGas',
276
+ type: U128
218
277
  },
219
- deserialization: {
220
- fn: ([reader])=>BlockHeader.fromFields(reader.readFieldArray(BLOCK_HEADER_LENGTH)),
221
- slots: 1
278
+ {
279
+ name: 'feePerL2Gas',
280
+ type: U128
222
281
  }
223
- };
224
- export const KEY_VALIDATION_REQUEST = {
225
- serialization: {
226
- fn: (v)=>v.toFields()
282
+ ]);
283
+ const GLOBAL_VARIABLES = STRUCT([
284
+ {
285
+ name: 'chainId',
286
+ type: FIELD
227
287
  },
228
- deserialization: {
229
- fn: ([reader])=>KeyValidationRequest.fromFields(reader.readFieldArray(KEY_VALIDATION_REQUEST_LENGTH)),
230
- slots: 1
288
+ {
289
+ name: 'version',
290
+ type: FIELD
291
+ },
292
+ {
293
+ name: 'blockNumber',
294
+ type: BLOCK_NUMBER
295
+ },
296
+ {
297
+ name: 'slotNumber',
298
+ type: SLOT_NUMBER
299
+ },
300
+ {
301
+ name: 'timestamp',
302
+ type: U64
303
+ },
304
+ {
305
+ name: 'coinbase',
306
+ type: ETH_ADDRESS
307
+ },
308
+ {
309
+ name: 'feeRecipient',
310
+ type: AZTEC_ADDRESS
311
+ },
312
+ {
313
+ name: 'gasFees',
314
+ type: GAS_FEES
231
315
  }
232
- };
233
- export const CONTRACT_INSTANCE = {
234
- serialization: {
235
- fn: (v)=>[
236
- v.salt,
237
- v.deployer.toField(),
238
- v.currentContractClassId,
239
- v.initializationHash,
240
- v.immutablesHash,
241
- ...v.publicKeys.toFields()
242
- ]
316
+ ]);
317
+ export const BLOCK_HEADER = STRUCT([
318
+ {
319
+ name: 'lastArchive',
320
+ type: APPEND_ONLY_TREE_SNAPSHOT
321
+ },
322
+ {
323
+ name: 'state',
324
+ type: STATE_REFERENCE
325
+ },
326
+ {
327
+ name: 'spongeBlobHash',
328
+ type: FIELD
329
+ },
330
+ {
331
+ name: 'globalVariables',
332
+ type: GLOBAL_VARIABLES
333
+ },
334
+ {
335
+ name: 'totalFees',
336
+ type: FIELD
337
+ },
338
+ {
339
+ name: 'totalManaUsed',
340
+ type: FIELD
243
341
  }
244
- };
245
- export const NULLIFIER_MEMBERSHIP_WITNESS = {
246
- serialization: {
247
- fn: (w)=>w.toNoirRepresentation().map((slot)=>Array.isArray(slot) ? slot.map((s)=>Fr.fromString(s)) : Fr.fromString(slot))
342
+ ]);
343
+ export const KEY_VALIDATION_REQUEST = STRUCT([
344
+ {
345
+ name: 'pkMHash',
346
+ type: FIELD
347
+ },
348
+ {
349
+ name: 'skApp',
350
+ type: FIELD
248
351
  }
249
- };
250
- export const PUBLIC_DATA_WITNESS = {
251
- serialization: {
252
- fn: (w)=>w.toNoirRepresentation().map((slot)=>Array.isArray(slot) ? slot.map((s)=>Fr.fromString(s)) : Fr.fromString(slot))
352
+ ]);
353
+ const PUBLIC_KEYS = STRUCT([
354
+ {
355
+ name: 'npkMHash',
356
+ type: FIELD
357
+ },
358
+ {
359
+ name: 'ivpkM',
360
+ type: POINT
361
+ },
362
+ {
363
+ name: 'ovpkMHash',
364
+ type: FIELD
365
+ },
366
+ {
367
+ name: 'tpkMHash',
368
+ type: FIELD
369
+ },
370
+ {
371
+ name: 'mspkMHash',
372
+ type: FIELD
373
+ },
374
+ {
375
+ name: 'fbpkMHash',
376
+ type: FIELD
253
377
  }
254
- };
255
- export const MESSAGE_LOAD_ORACLE_INPUTS = {
256
- serialization: {
257
- fn: (m)=>m.toNoirRepresentation().map((slot)=>Array.isArray(slot) ? slot.map((s)=>Fr.fromString(s)) : Fr.fromString(slot))
378
+ ]);
379
+ export const CONTRACT_INSTANCE = STRUCT([
380
+ {
381
+ name: 'salt',
382
+ type: FIELD
383
+ },
384
+ {
385
+ name: 'deployer',
386
+ type: AZTEC_ADDRESS
387
+ },
388
+ // Note that the nr side of this struct does not contain the current class, only original
389
+ {
390
+ name: 'originalContractClassId',
391
+ type: FIELD
392
+ },
393
+ {
394
+ name: 'initializationHash',
395
+ type: FIELD
396
+ },
397
+ {
398
+ name: 'immutablesHash',
399
+ type: FIELD
400
+ },
401
+ {
402
+ name: 'publicKeys',
403
+ type: PUBLIC_KEYS
258
404
  }
259
- };
260
- export const UTILITY_CONTEXT = {
261
- serialization: {
262
- fn: (ctx)=>[
263
- ...ctx.blockHeader.toFields(),
264
- ctx.contractAddress.toField()
265
- ]
405
+ ]);
406
+ const NULLIFIER_LEAF = STRUCT([
407
+ {
408
+ name: 'nullifier',
409
+ type: FIELD
266
410
  }
267
- };
268
- export const CALL_PRIVATE_RESULT = {
269
- serialization: {
270
- fn: (v)=>[
271
- [
272
- v.endSideEffectCounter,
273
- v.returnsHash
274
- ]
275
- ]
411
+ ]);
412
+ const NULLIFIER_LEAF_PREIMAGE = STRUCT([
413
+ {
414
+ name: 'leaf',
415
+ type: NULLIFIER_LEAF
416
+ },
417
+ {
418
+ name: 'nextKey',
419
+ type: FIELD
420
+ },
421
+ {
422
+ name: 'nextIndex',
423
+ type: BIGINT
276
424
  }
277
- };
278
- export const PUBLIC_KEYS_AND_PARTIAL_ADDRESS = {
279
- serialization: {
280
- fn: (v)=>[
281
- [
282
- ...v.publicKeys.toFields(),
283
- v.partialAddress
284
- ]
285
- ]
425
+ ]);
426
+ export const NULLIFIER_MEMBERSHIP_WITNESS = STRUCT([
427
+ {
428
+ name: 'leafPreimage',
429
+ type: NULLIFIER_LEAF_PREIMAGE
430
+ },
431
+ {
432
+ name: 'index',
433
+ type: BIGINT
434
+ },
435
+ {
436
+ name: 'siblingPath',
437
+ type: SIBLING_PATH(NULLIFIER_TREE_HEIGHT)
286
438
  }
287
- };
288
- export const CONTRACT_CLASS_LOG_INPUT = {
289
- deserialization: {
290
- fn: ([addrReader, fieldsReader, lengthReader])=>{
291
- const addr = AztecAddress.fromField(addrReader.readField());
292
- const fields = new ContractClassLogFields([
293
- ...fieldsReader.readFieldArray(fieldsReader.remainingFields())
294
- ]);
295
- const length = lengthReader.readField().toNumber();
296
- return new ContractClassLog(addr, fields, length);
297
- },
298
- // ContractClassLog input occupies 3 ACVM slots: [contractAddress], [message fields...], [length].
299
- slots: 3
439
+ ]);
440
+ const PUBLIC_DATA_LEAF = STRUCT([
441
+ {
442
+ name: 'slot',
443
+ type: FIELD
444
+ },
445
+ {
446
+ name: 'value',
447
+ type: FIELD
300
448
  }
301
- };
302
- export const TX_EFFECT = {
303
- serialization: {
304
- fn: (effect)=>{
305
- const flatPublicLogs = FlatPublicLogs.fromLogs(effect.publicLogs);
306
- return [
307
- effect.revertCode.toField(),
308
- effect.txHash.hash,
309
- effect.transactionFee,
310
- padArrayEnd(effect.noteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX),
311
- padArrayEnd(effect.nullifiers, Fr.ZERO, MAX_NULLIFIERS_PER_TX),
312
- padArrayEnd(effect.l2ToL1Msgs, Fr.ZERO, MAX_L2_TO_L1_MSGS_PER_TX),
313
- padArrayEnd(effect.publicDataWrites, PublicDataWrite.empty(), MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX).flatMap((w)=>w.toFields()),
314
- padArrayEnd(effect.privateLogs, PrivateLog.empty(), MAX_PRIVATE_LOGS_PER_TX).flatMap((l)=>l.toFields()),
315
- new Fr(flatPublicLogs.length),
316
- flatPublicLogs.payload,
317
- padArrayEnd(effect.contractClassLogs, ContractClassLog.empty(), MAX_CONTRACT_CLASS_LOGS_PER_TX).flatMap((l)=>[
318
- ...l.fields.toFields(),
319
- new Fr(l.emittedLength),
320
- l.contractAddress.toField()
321
- ])
322
- ];
323
- }
449
+ ]);
450
+ const PUBLIC_DATA_LEAF_PREIMAGE = STRUCT([
451
+ {
452
+ name: 'leaf',
453
+ type: PUBLIC_DATA_LEAF
454
+ },
455
+ {
456
+ name: 'nextKey',
457
+ type: FIELD
458
+ },
459
+ {
460
+ name: 'nextIndex',
461
+ type: BIGINT
462
+ }
463
+ ]);
464
+ export const PUBLIC_DATA_WITNESS = STRUCT([
465
+ {
466
+ name: 'index',
467
+ type: BIGINT
468
+ },
469
+ {
470
+ name: 'leafPreimage',
471
+ type: PUBLIC_DATA_LEAF_PREIMAGE
472
+ },
473
+ {
474
+ name: 'siblingPath',
475
+ type: SIBLING_PATH(PUBLIC_DATA_TREE_HEIGHT)
476
+ }
477
+ ]);
478
+ export const MESSAGE_LOAD_ORACLE_INPUTS = STRUCT([
479
+ {
480
+ name: 'index',
481
+ type: BIGINT
482
+ },
483
+ {
484
+ name: 'siblingPath',
485
+ type: SIBLING_PATH(L1_TO_L2_MSG_TREE_HEIGHT)
486
+ }
487
+ ]);
488
+ export const UTILITY_CONTEXT = STRUCT([
489
+ {
490
+ name: 'blockHeader',
491
+ type: BLOCK_HEADER
492
+ },
493
+ {
494
+ name: 'contractAddress',
495
+ type: AZTEC_ADDRESS
496
+ },
497
+ {
498
+ name: 'msgSender',
499
+ type: AZTEC_ADDRESS
500
+ }
501
+ ]);
502
+ export const CALL_PRIVATE_RESULT = STRUCT([
503
+ {
504
+ name: 'endSideEffectCounter',
505
+ type: FIELD
506
+ },
507
+ {
508
+ name: 'returnsHash',
509
+ type: FIELD
510
+ }
511
+ ]);
512
+ export const PUBLIC_KEYS_AND_PARTIAL_ADDRESS = STRUCT([
513
+ {
514
+ name: 'publicKeys',
515
+ type: PUBLIC_KEYS
516
+ },
517
+ {
518
+ name: 'partialAddress',
519
+ type: FIELD
520
+ }
521
+ ]);
522
+ export const CONTRACT_CLASS_LOG = STRUCT([
523
+ {
524
+ name: 'contractAddress',
525
+ type: AZTEC_ADDRESS
526
+ },
527
+ {
528
+ name: 'fields',
529
+ type: FIXED_ARRAY(FIELD, CONTRACT_CLASS_LOG_SIZE_IN_FIELDS)
530
+ },
531
+ {
532
+ name: 'emittedLength',
533
+ type: U32
534
+ }
535
+ ]);
536
+ const PUBLIC_DATA_WRITE = STRUCT([
537
+ {
538
+ name: 'leafSlot',
539
+ type: FIELD
540
+ },
541
+ {
542
+ name: 'value',
543
+ type: FIELD
324
544
  }
325
- };
326
- export const NOTE = {
545
+ ]);
546
+ const PRIVATE_LOG = STRUCT([
547
+ {
548
+ name: 'fields',
549
+ type: FIXED_ARRAY(FIELD, PRIVATE_LOG_SIZE_IN_FIELDS)
550
+ },
551
+ {
552
+ name: 'emittedLength',
553
+ type: U32
554
+ }
555
+ ]);
556
+ const FLAT_PUBLIC_LOGS = STRUCT([
557
+ {
558
+ name: 'length',
559
+ type: U32
560
+ },
561
+ {
562
+ name: 'payload',
563
+ type: FIXED_ARRAY(FIELD, FLAT_PUBLIC_LOGS_PAYLOAD_LENGTH)
564
+ }
565
+ ]);
566
+ const CONTRACT_CLASS_LOG_ENTRY = STRUCT([
567
+ {
568
+ name: 'fields',
569
+ type: FIXED_ARRAY(FIELD, CONTRACT_CLASS_LOG_SIZE_IN_FIELDS)
570
+ },
571
+ {
572
+ name: 'emittedLength',
573
+ type: U32
574
+ },
575
+ {
576
+ name: 'contractAddress',
577
+ type: AZTEC_ADDRESS
578
+ }
579
+ ]);
580
+ const CONTRACT_CLASS_LOGS = FIXED_ARRAY(CONTRACT_CLASS_LOG_ENTRY, MAX_CONTRACT_CLASS_LOGS_PER_TX);
581
+ export const TX_EFFECT = STRUCT([
582
+ {
583
+ name: 'revertCode',
584
+ type: U8
585
+ },
586
+ {
587
+ name: 'txHash',
588
+ type: TX_HASH
589
+ },
590
+ {
591
+ name: 'transactionFee',
592
+ type: FIELD
593
+ },
594
+ {
595
+ name: 'noteHashes',
596
+ type: FIXED_ARRAY(FIELD, MAX_NOTE_HASHES_PER_TX)
597
+ },
598
+ {
599
+ name: 'nullifiers',
600
+ type: FIXED_ARRAY(FIELD, MAX_NULLIFIERS_PER_TX)
601
+ },
602
+ {
603
+ name: 'l2ToL1Msgs',
604
+ type: FIXED_ARRAY(FIELD, MAX_L2_TO_L1_MSGS_PER_TX)
605
+ },
606
+ {
607
+ name: 'publicDataWrites',
608
+ type: FIXED_ARRAY(PUBLIC_DATA_WRITE, MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX)
609
+ },
610
+ {
611
+ name: 'privateLogs',
612
+ type: FIXED_ARRAY(PRIVATE_LOG, MAX_PRIVATE_LOGS_PER_TX)
613
+ },
614
+ {
615
+ name: 'publicLogs',
616
+ type: FLAT_PUBLIC_LOGS
617
+ },
618
+ {
619
+ name: 'contractClassLogs',
620
+ type: CONTRACT_CLASS_LOGS
621
+ }
622
+ ]);
623
+ export const NOTE = LEAF({
624
+ kind: 'note',
327
625
  serialization: {
328
626
  fn: (noteData)=>packAsHintedNote({
329
627
  contractAddress: noteData.contractAddress,
@@ -334,90 +632,288 @@ export const NOTE = {
334
632
  isPending: noteData.isPending,
335
633
  note: noteData.note
336
634
  })
635
+ },
636
+ // A packed note is the note's (variable-count) field items followed by 6 metadata scalars, emitted as one field
637
+ // output per element. Its length depends on the note, so it is described as a single variable-width run.
638
+ shape: [
639
+ 'variable'
640
+ ]
641
+ });
642
+ export const NOTE_VALIDATION_REQUEST = LEAF({
643
+ kind: 'note-validation-request',
644
+ deserialization: {
645
+ fn: ([reader])=>NoteValidationRequest.fromFields(reader)
646
+ },
647
+ shape: [
648
+ 'variable'
649
+ ]
650
+ });
651
+ export const EVENT_VALIDATION_REQUEST = LEAF({
652
+ kind: 'event-validation-request',
653
+ deserialization: {
654
+ fn: ([reader])=>EventValidationRequest.fromFields(reader)
655
+ },
656
+ shape: [
657
+ 'variable'
658
+ ]
659
+ });
660
+ export const LOG_RETRIEVAL_REQUEST = STRUCT([
661
+ {
662
+ name: 'contractAddress',
663
+ type: AZTEC_ADDRESS
664
+ },
665
+ {
666
+ name: 'tag',
667
+ type: TAG
668
+ },
669
+ {
670
+ name: 'source',
671
+ type: LOG_SOURCE
672
+ },
673
+ {
674
+ name: 'fromBlock',
675
+ type: OPTION(BLOCK_NUMBER)
676
+ },
677
+ {
678
+ name: 'toBlock',
679
+ type: OPTION(BLOCK_NUMBER)
337
680
  }
338
- };
339
- export const PENDING_TAGGED_LOG = {
340
- serialization: {
341
- fn: (log)=>[
342
- log.toFields()
343
- ]
681
+ ]);
682
+ export const LOG_RETRIEVAL_RESPONSE = STRUCT([
683
+ {
684
+ name: 'logPayload',
685
+ type: FIXED_BOUNDED_VEC(FIELD, PRIVATE_LOG_CIPHERTEXT_LEN)
686
+ },
687
+ {
688
+ name: 'txHash',
689
+ type: TX_HASH
690
+ },
691
+ {
692
+ name: 'uniqueNoteHashesInTx',
693
+ type: FIXED_BOUNDED_VEC(FIELD, MAX_NOTE_HASHES_PER_TX)
694
+ },
695
+ {
696
+ name: 'firstNullifierInTx',
697
+ type: FIELD
698
+ },
699
+ {
700
+ name: 'blockNumber',
701
+ type: BLOCK_NUMBER
702
+ },
703
+ {
704
+ name: 'blockTimestamp',
705
+ type: U64
706
+ },
707
+ {
708
+ name: 'blockHash',
709
+ type: BLOCK_HASH
344
710
  }
345
- };
346
- export const NOTE_VALIDATION_REQUEST = {
347
- deserialization: {
348
- fn: ([reader])=>NoteValidationRequest.fromFields(reader),
349
- slots: 1
711
+ ]);
712
+ export const RESOLVED_TX = STRUCT([
713
+ {
714
+ name: 'txHash',
715
+ type: TX_HASH
716
+ },
717
+ {
718
+ name: 'uniqueNoteHashesInTx',
719
+ type: FIXED_BOUNDED_VEC(FIELD, MAX_NOTE_HASHES_PER_TX)
720
+ },
721
+ {
722
+ name: 'firstNullifierInTx',
723
+ type: FIELD
724
+ },
725
+ {
726
+ name: 'blockNumber',
727
+ type: U32
728
+ },
729
+ {
730
+ name: 'blockHash',
731
+ type: FIELD
350
732
  }
351
- };
352
- export const EVENT_VALIDATION_REQUEST = {
353
- deserialization: {
354
- fn: ([reader])=>EventValidationRequest.fromFields(reader),
355
- slots: 1
733
+ ]);
734
+ export const PENDING_TAGGED_LOG = STRUCT([
735
+ {
736
+ name: 'log',
737
+ type: FIXED_BOUNDED_VEC(FIELD, PRIVATE_LOG_SIZE_IN_FIELDS)
738
+ },
739
+ {
740
+ name: 'context',
741
+ type: RESOLVED_TX
356
742
  }
357
- };
358
- export const LOG_RETRIEVAL_REQUEST = {
743
+ ]);
744
+ export const ORIGIN_BLOCK = STRUCT([
745
+ {
746
+ name: 'blockNumber',
747
+ type: U32
748
+ },
749
+ {
750
+ name: 'blockHash',
751
+ type: FIELD
752
+ }
753
+ ]);
754
+ const ORIGIN_BLOCK_STATE = SCALAR({
755
+ kind: 'origin-block-state',
359
756
  serialization: {
360
- fn: (req)=>[
361
- req.toFields()
757
+ fn: (v)=>[
758
+ new Fr(v)
362
759
  ]
363
760
  },
364
761
  deserialization: {
365
- fn: ([reader])=>LogRetrievalRequest.fromFields(reader),
366
- slots: 1
762
+ fn: ([reader])=>originBlockStateFromNumber(reader.readField().toNumber())
367
763
  }
368
- };
369
- export const LOG_RETRIEVAL_RESPONSE = {
370
- serialization: {
371
- fn: (resp)=>[
372
- resp.toFields()
373
- ]
764
+ });
765
+ /** Read-side origin of a retractable fact, carrying the chain state of its origin block. */ export const RETRACTABLE_FACT_ORIGIN = STRUCT([
766
+ {
767
+ name: 'blockNumber',
768
+ type: U32
769
+ },
770
+ {
771
+ name: 'blockHash',
772
+ type: FIELD
773
+ },
774
+ {
775
+ name: 'blockState',
776
+ type: ORIGIN_BLOCK_STATE
374
777
  }
375
- };
376
- export const MESSAGE_CONTEXT = {
377
- serialization: {
378
- fn: (mc)=>[
379
- mc.toFields()
380
- ]
778
+ ]);
779
+ export const FACT = STRUCT([
780
+ {
781
+ name: 'factTypeId',
782
+ type: FIELD
783
+ },
784
+ {
785
+ name: 'payload',
786
+ type: EPHEMERAL_ARRAY(FIELD)
787
+ },
788
+ {
789
+ name: 'originBlock',
790
+ type: OPTION(RETRACTABLE_FACT_ORIGIN)
381
791
  }
382
- };
383
- export const PROVIDED_SECRET = {
384
- deserialization: {
385
- fn: ([reader])=>ProvidedSecret.fromFields(reader),
386
- slots: 1
792
+ ]);
793
+ export const FACT_COLLECTION = STRUCT([
794
+ {
795
+ name: 'contractAddress',
796
+ type: AZTEC_ADDRESS
797
+ },
798
+ {
799
+ name: 'scope',
800
+ type: AZTEC_ADDRESS
801
+ },
802
+ {
803
+ name: 'factCollectionTypeId',
804
+ type: FIELD
805
+ },
806
+ {
807
+ name: 'factCollectionId',
808
+ type: FIELD
809
+ },
810
+ {
811
+ name: 'facts',
812
+ type: EPHEMERAL_ARRAY(FACT)
813
+ }
814
+ ]);
815
+ export const PROVIDED_SECRET = STRUCT([
816
+ {
817
+ name: 'secret',
818
+ type: FIELD
819
+ },
820
+ {
821
+ name: 'mode',
822
+ type: DELIVERY_MODE
387
823
  }
388
- };
824
+ ]);
389
825
  // ─── Combinator Type Mappings ────────────────────────────────────────────────
390
- /** `_height` is unused at runtime but lets TypeScript infer the exact `N` for `MembershipWitness<N>`. */ export function MEMBERSHIP_WITNESS(_height) {
826
+ /**
827
+ * A TS-side alias of `base`: the same Noir type on the wire (it inherits `base`'s `kind`, `label`, and `shape`) but a
828
+ * richer TS value. `wrap` maps a base value to the alias, `unwrap` back; a serialize-only alias passes only `unwrap`.
829
+ */ export function ALIAS(base, conversions) {
830
+ const { wrap, unwrap } = conversions;
391
831
  return {
832
+ kind: base.kind,
833
+ label: base.label,
834
+ serialization: base.serialization && unwrap ? {
835
+ fn: (value)=>base.serialization.fn(unwrap(value))
836
+ } : undefined,
837
+ deserialization: base.deserialization && wrap ? {
838
+ fn: (readers)=>wrap(base.deserialization.fn(readers))
839
+ } : undefined,
840
+ shape: base.shape
841
+ };
842
+ }
843
+ function SIBLING_PATH(height) {
844
+ return LEAF({
845
+ // On the wire (and in Noir) a sibling path is a plain `[Field; height]`, so it shares the fixed-array kind.
846
+ kind: `array(field,${height})`,
392
847
  serialization: {
393
- fn: (witness)=>[
394
- new Fr(witness.leafIndex),
395
- [
396
- ...witness.siblingPath
397
- ]
848
+ fn: (sp)=>[
849
+ sp.toFields()
398
850
  ]
851
+ },
852
+ shape: [
853
+ {
854
+ len: height
855
+ }
856
+ ]
857
+ });
858
+ }
859
+ export function MEMBERSHIP_WITNESS(height) {
860
+ return STRUCT([
861
+ {
862
+ name: 'leafIndex',
863
+ type: BIGINT
864
+ },
865
+ {
866
+ name: 'siblingPath',
867
+ type: FIXED_ARRAY(FIELD, height)
399
868
  }
869
+ ]);
870
+ }
871
+ export function ARRAY(inner) {
872
+ return {
873
+ kind: 'array',
874
+ label: `array(${inner.label})`,
875
+ inner,
876
+ serialization: inner.serialization ? {
877
+ fn: (values)=>[
878
+ packElements(inner, values)
879
+ ]
880
+ } : undefined,
881
+ deserialization: inner.deserialization ? {
882
+ // The whole slot is the array, so read as many elements as its fields hold.
883
+ fn: ([reader])=>unpackElements(inner, reader, reader.remainingFields() / fieldWidth(inner.shape))
884
+ } : undefined,
885
+ // One slot of variable length (all elements flattened into it).
886
+ shape: [
887
+ {
888
+ lenFrom: (size)=>size.length * fieldWidth(inner.shape)
889
+ }
890
+ ]
400
891
  };
401
892
  }
402
- export function ARRAY(element) {
893
+ /**
894
+ * Noir's fixed-length array `[T; length]` in one slot: serializes `values` (each flattened via `element`)
895
+ * zero-padded to exactly `length * elementWidth` fields, and deserializes all `length` elements back. An absent
896
+ * element is the zero encoding, so the padding is derived from the shape.
897
+ */ export function FIXED_ARRAY(element, length) {
898
+ const elementWidth = fieldWidth(element.shape);
403
899
  return {
900
+ kind: 'fixed-array',
901
+ label: `array(${element.label},${length})`,
902
+ inner: element,
903
+ length,
404
904
  serialization: element.serialization ? {
405
905
  fn: (values)=>[
406
- values.flatMap((v)=>element.serialization.fn(v).flat())
906
+ padArrayEnd(packElements(element, values), Fr.ZERO, length * elementWidth)
407
907
  ]
408
908
  } : undefined,
409
909
  deserialization: element.deserialization ? {
410
- fn: ([reader])=>{
411
- const result = [];
412
- while(!reader.isFinished()){
413
- result.push(element.deserialization.fn([
414
- reader
415
- ]));
416
- }
417
- return result;
418
- },
419
- slots: 1
420
- } : undefined
910
+ fn: ([reader])=>unpackElements(element, reader, length)
911
+ } : undefined,
912
+ shape: [
913
+ {
914
+ len: length * elementWidth
915
+ }
916
+ ]
421
917
  };
422
918
  }
423
919
  /**
@@ -427,134 +923,321 @@ export function ARRAY(element) {
427
923
  *
428
924
  * Both directions are derived from `element`: bidirectional iff `element` has both serialization and deserialization.
429
925
  *
430
- * @example Serializing `BoundedVec.from({ data: [0x41, 0x42], maxLength: 4 })` with `BOUNDED_VEC(BYTE)`:
926
+ * @example Serializing `BoundedVec.from({ data: [0x41, 0x42], maxLength: 4 })` with `BOUNDED_VEC(U8)`:
431
927
  * ```
432
928
  * slot 0: [Fr(0x41), Fr(0x42), Fr(0), Fr(0)] // data padded to maxLength
433
929
  * slot 1: Fr(2) // actual length
434
930
  * ```
435
- */ export function BOUNDED_VEC(element) {
931
+ */ export function BOUNDED_VEC(inner) {
436
932
  return {
437
- serialization: element.serialization ? {
933
+ kind: 'bounded-vec',
934
+ label: `bounded-vec(${inner.label})`,
935
+ inner,
936
+ serialization: inner.serialization ? {
438
937
  fn: (bv)=>{
439
938
  if (bv.data.length > bv.maxLength) {
440
939
  throw new Error(`Got ${bv.data.length} items, but maxLength is ${bv.maxLength}`);
441
940
  }
442
- const flat = bv.data.flatMap((item)=>element.serialization.fn(item).flat());
941
+ // Fixed-width elements take their width from the shape (consistent with deserialization); only a
942
+ // variable-width element (e.g. a packed note) falls back to the runtime `elementSize` the value carries.
943
+ const elementWidth = tryFieldWidth(inner.shape) ?? bv.elementSize;
944
+ const flat = padArrayEnd(packElements(inner, bv.data), Fr.ZERO, bv.maxLength * elementWidth);
443
945
  return [
444
- padArrayEnd(flat, Fr.ZERO, bv.maxLength * bv.elementSize),
946
+ flat,
445
947
  new Fr(bv.data.length)
446
948
  ];
447
949
  }
448
950
  } : undefined,
449
- deserialization: element.deserialization ? {
951
+ deserialization: inner.deserialization ? {
450
952
  fn: ([storageReader, lengthReader])=>{
451
- const maxLength = storageReader.remainingFields();
953
+ // slot 0 is the padded storage, slot 1 the actual length. Parse only the first `length` elements out of
954
+ // storage, then drain the trailing zero-padding so the storage reader is fully consumed.
955
+ const maxLength = storageReader.remainingFields() / fieldWidth(inner.shape);
452
956
  const length = lengthReader.readField().toNumber();
453
- const elements = [];
454
- for(let i = 0; i < length; i++){
455
- elements.push(element.deserialization.fn([
456
- storageReader
457
- ]));
458
- }
459
- // Drain the trailing zero-padding (maxLength - length unused element slots) so the storage reader is
460
- // fully consumed.
957
+ const elements = unpackElements(inner, storageReader, length);
461
958
  storageReader.skip(storageReader.remainingFields());
462
959
  return BoundedVec.from({
463
960
  data: elements,
464
961
  maxLength
465
962
  });
963
+ }
964
+ } : undefined,
965
+ // slot 0: variable-length storage; slot 1: the length scalar.
966
+ shape: [
967
+ {
968
+ lenFrom: (size)=>size.maxLength * fieldWidth(inner.shape)
466
969
  },
467
- slots: 2
468
- } : undefined
970
+ 'scalar'
971
+ ]
972
+ };
973
+ }
974
+ /**
975
+ * Noir's `BoundedVec<T, MaxLen>` in its padded form (one fixed-width slot): `maxLength * elementWidth` storage fields
976
+ * (zero-padded) followed by the actual length, with no length prefix, so the width is statically known. Serialize-only.
977
+ * Throws if the input exceeds `maxLength`.
978
+ */ export function FIXED_BOUNDED_VEC(element, maxLength) {
979
+ const width = fieldWidth(element.shape);
980
+ return {
981
+ kind: 'fixed-bounded-vec',
982
+ label: `bounded-vec(${element.label},${maxLength})`,
983
+ inner: element,
984
+ maxLength,
985
+ serialization: element.serialization ? {
986
+ fn: (values)=>{
987
+ if (values.length > maxLength) {
988
+ throw new Error(`Got ${values.length} items, but maxLength is ${maxLength}`);
989
+ }
990
+ const flat = padArrayEnd(packElements(element, values), Fr.ZERO, maxLength * width);
991
+ return [
992
+ [
993
+ ...flat,
994
+ new Fr(values.length)
995
+ ]
996
+ ];
997
+ }
998
+ } : undefined,
999
+ shape: [
1000
+ {
1001
+ len: maxLength * width + 1
1002
+ }
1003
+ ]
469
1004
  };
470
1005
  }
471
1006
  /**
472
- * Wraps an inner TypeMapping in Noir-style `Option<T>`. Adds a discriminant slot and uses the handler-provided
473
- * `Option.none(shape)` template to produce a correctly-sized zero-filled output for the None case.
1007
+ * Wraps an inner TypeMapping in Noir-style `Option<T>`, adding a leading discriminant slot.
474
1008
  *
475
- * @example Serializing `Option.some(AztecAddress.fromField(Fr(42)))` with `OPTION(AZTEC_ADDRESS)`:
1009
+ * For the `None` case, the inner's slots must still be present on the wire as zero-padding (so `Some` and `None` have
1010
+ * identical size). That padding is derived entirely from `inner.shape`.
1011
+ *
1012
+ * @example Serializing `Option.some(AztecAddress.fromFieldUnsafe(Fr(42)))` with `OPTION(AZTEC_ADDRESS)`:
476
1013
  * ```
477
1014
  * slot 0: Fr(1) // discriminant: Some
478
1015
  * slot 1: Fr(42) // inner value
479
1016
  * ```
480
1017
  *
481
- * @example Serializing `Option.empty(AztecAddress.ZERO)` with `OPTION(AZTEC_ADDRESS)`:
1018
+ * @example Serializing `Option.none()` with `OPTION(AZTEC_ADDRESS)`:
482
1019
  * ```
483
1020
  * slot 0: Fr(0) // discriminant: None
484
- * slot 1: Fr(0) // zero-filled using shape
1021
+ * slot 1: Fr(0) // zero-filled from AZTEC_ADDRESS.shape
485
1022
  * ```
486
1023
  */ export function OPTION(inner) {
487
1024
  return {
1025
+ kind: 'option',
1026
+ label: `option(${inner.label})`,
1027
+ inner,
488
1028
  serialization: inner.serialization ? {
489
- fn: (opt)=>{
490
- if (opt.isSome()) {
491
- return [
492
- Fr.ONE,
493
- ...inner.serialization.fn(opt.value)
494
- ];
495
- }
496
- if (opt.template === undefined) {
497
- throw new Error('Cannot serialize Option.empty() without an emptyTemplate — provide one via Option.empty(emptyTemplate)');
498
- }
499
- const zeroSlots = inner.serialization.fn(opt.template).map((s)=>Array.isArray(s) ? Array(s.length).fill(Fr.ZERO) : Fr.ZERO);
500
- return [
1029
+ fn: (opt)=>opt.isSome() ? [
1030
+ Fr.ONE,
1031
+ ...inner.serialization.fn(opt.value)
1032
+ ] : [
501
1033
  Fr.ZERO,
502
- ...zeroSlots
503
- ];
504
- }
1034
+ ...zeroSlotsFromShape(inner.shape, opt.size)
1035
+ ]
505
1036
  } : undefined,
506
1037
  deserialization: inner.deserialization ? {
507
1038
  fn: ([discriminant, ...innerReaders])=>{
508
1039
  if (discriminant.readField().isZero()) {
509
- // None still carries zero-filled inner slots on the wire; drain them so the inner readers are fully
510
- // consumed.
1040
+ // None still carries the inner's zero-padded slots; consume them without parsing, since an inner that
1041
+ // validates its fields would reject the zeros.
511
1042
  innerReaders.forEach((reader)=>reader.skip(reader.remainingFields()));
512
- return Option.none(undefined);
1043
+ return Option.none();
513
1044
  }
514
1045
  return Option.some(inner.deserialization.fn(innerReaders));
515
- },
516
- slots: inner.deserialization.slots + 1
517
- } : undefined
518
- };
519
- }
520
- /** A packed uint buffer (e.g. `[u8; N]` in Noir): 1 slot of packed uint values ↔ `Buffer`. */ export function BUFFER(bitSize) {
521
- return {
522
- serialization: {
523
- fn: (buf)=>[
524
- Array.from(buf).map((b)=>new Fr(b))
525
- ]
526
- },
527
- deserialization: {
528
- fn: ([reader])=>{
529
- const fields = reader.readFieldArray(reader.remainingFields()).map((f)=>f.toString());
530
- return fromUintArray(fields, bitSize);
531
- },
532
- slots: 1
533
- }
1046
+ }
1047
+ } : undefined,
1048
+ // A leading discriminant slot followed by the inner's slots.
1049
+ shape: [
1050
+ 'scalar',
1051
+ ...inner.shape
1052
+ ]
534
1053
  };
535
1054
  }
536
1055
  export function EPHEMERAL_ARRAY(element) {
537
- // An EphemeralArray param is a single slot; the per-param assert covers that slot but never sees the
538
- // per-row readers materialized in readAll(). Assert full consumption per row here.
1056
+ // EphemeralArray.readAll hands each row's flat fields in as a single reader; reconstruct the element's per-slot
1057
+ // readers from its shape, deserialize, and assert the row was fully consumed so a row with trailing fields is
1058
+ // rejected.
539
1059
  const rowElement = element.deserialization ? {
1060
+ kind: element.kind,
1061
+ label: element.label,
540
1062
  deserialization: {
541
- fn: (readers)=>{
542
- const value = element.deserialization.fn(readers);
543
- assertReadersConsumed(readers);
544
- return value;
545
- },
546
- slots: element.deserialization.slots
547
- }
1063
+ fn: ([rowReader])=>deserializeElement(element, rowReader.readFieldArray(rowReader.remainingFields()))
1064
+ },
1065
+ // `fn` reads the whole row from one reader, so this is one variable-width slot, not the element's multi-slot
1066
+ // shape.
1067
+ shape: [
1068
+ 'variable'
1069
+ ]
548
1070
  } : undefined;
549
1071
  return {
1072
+ kind: 'ephemeral-array',
1073
+ label: `ephemeral-array(${element.label})`,
1074
+ inner: element,
550
1075
  serialization: element.serialization ? {
551
1076
  fn: (ea)=>[
552
- ea.materializeSlot((v)=>element.serialization.fn(v).flat())
1077
+ ea.materializeSlot((v)=>serializeElement(element, v))
553
1078
  ]
554
1079
  } : undefined,
555
1080
  deserialization: rowElement ? {
556
- fn: ([reader])=>EphemeralArray.fromSlot(reader.readField(), rowElement),
557
- slots: 1
558
- } : undefined
1081
+ fn: ([reader])=>EphemeralArray.fromSlot(reader.readField(), rowElement)
1082
+ } : undefined,
1083
+ // A single slot carrying the array's service-slot id.
1084
+ shape: [
1085
+ 'scalar'
1086
+ ]
1087
+ };
1088
+ }
1089
+ /**
1090
+ * A Noir struct: its `shape` and (de)serialization are the concatenation of its fields', so callers never hand-write a
1091
+ * `shape`. `T` is the struct's TS value type and must match the field layout — serialization reads each field by name
1092
+ * off the value, deserialization returns the decoded bag as `T`; convert in the handler, not here, when `T` differs.
1093
+ */ export function STRUCT(fields) {
1094
+ return {
1095
+ kind: 'struct',
1096
+ label: `{${structFieldLabels(fields)}}`,
1097
+ fields,
1098
+ serialization: fields.every((f)=>f.type.serialization) ? {
1099
+ fn: (value)=>{
1100
+ const props = value;
1101
+ return fields.flatMap((f)=>f.type.serialization.fn(props[f.name]));
1102
+ }
1103
+ } : undefined,
1104
+ deserialization: fields.every((f)=>f.type.deserialization) ? {
1105
+ fn: (readers)=>{
1106
+ const props = {};
1107
+ let slot = 0;
1108
+ for (const f of fields){
1109
+ const slotCount = f.type.shape.length;
1110
+ props[f.name] = f.type.deserialization.fn(readers.slice(slot, slot + slotCount));
1111
+ slot += slotCount;
1112
+ }
1113
+ return props;
1114
+ }
1115
+ } : undefined,
1116
+ shape: fields.flatMap((f)=>f.type.shape)
559
1117
  };
560
1118
  }
1119
+ export function isArrayMapping(type) {
1120
+ return type.kind === 'array';
1121
+ }
1122
+ export function isBoundedVecMapping(type) {
1123
+ return type.kind === 'bounded-vec';
1124
+ }
1125
+ export function isOptionMapping(type) {
1126
+ return type.kind === 'option';
1127
+ }
1128
+ export function isStructMapping(type) {
1129
+ return type.kind === 'struct';
1130
+ }
1131
+ export function isFixedArrayMapping(type) {
1132
+ return type.kind === 'fixed-array';
1133
+ }
1134
+ export function isFixedBoundedVecMapping(type) {
1135
+ return type.kind === 'fixed-bounded-vec';
1136
+ }
1137
+ export function isEphemeralArrayMapping(type) {
1138
+ return type.kind === 'ephemeral-array';
1139
+ }
1140
+ /**
1141
+ * The comma-joined labels of a struct's fields, with nested struct labels spliced into the parent: nesting affects
1142
+ * neither the wire (struct slots concatenate) nor the interface, so the label treats nested and flat declarations as
1143
+ * the same type.
1144
+ */ function structFieldLabels(fields) {
1145
+ return fields.map((f)=>isStructMapping(f.type) ? structFieldLabels(f.type.fields) : f.type.label).join(',');
1146
+ }
1147
+ /** The field's value as a bigint, asserted to fit a `bits`-wide uint. */ function uintFromField(field, bits) {
1148
+ const max = 2n ** BigInt(bits) - 1n;
1149
+ const value = field.toBigInt();
1150
+ if (value > max) {
1151
+ throw new Error(`u${bits} overflow: value ${value} exceeds max (${max})`);
1152
+ }
1153
+ return value;
1154
+ }
1155
+ /** Number of InputSlots a deserializable type spans, derived from its {@link TypeMapping.shape}. */ export function slotsOf(mapping) {
1156
+ return mapping.shape.length;
1157
+ }
1158
+ /** Number of fields a fully-static shape occupies, or `undefined` if any slot is variable-width. */ export function tryFieldWidth(shape) {
1159
+ let total = 0;
1160
+ for (const slot of shape){
1161
+ if (slot === 'scalar') {
1162
+ total += 1;
1163
+ } else if (typeof slot === 'object' && 'len' in slot) {
1164
+ total += slot.len;
1165
+ } else {
1166
+ return undefined;
1167
+ }
1168
+ }
1169
+ return total;
1170
+ }
1171
+ /** Number of fields a fully-static shape occupies. Throws on a variable-width shape, whose field count isn't known. */ function fieldWidth(shape) {
1172
+ const width = tryFieldWidth(shape);
1173
+ if (width === undefined) {
1174
+ throw new Error('Cannot compute a fixed field width for a variable-width shape');
1175
+ }
1176
+ return width;
1177
+ }
1178
+ /** Reconstructs a value's per-slot readers from a flat run of fields, using its shape (inverse of slot-flattening). */ function splitByShape(fields, shape) {
1179
+ const readers = [];
1180
+ let cursor = 0;
1181
+ shape.forEach((slot, i)=>{
1182
+ if (slot === 'scalar' || typeof slot === 'object' && 'len' in slot) {
1183
+ const width = slot === 'scalar' ? 1 : slot.len;
1184
+ if (cursor + width > fields.length) {
1185
+ throw new Error(`Not enough fields to reconstruct shape: needed ${width}, had ${fields.length - cursor}`);
1186
+ }
1187
+ readers.push(new FieldReader(fields.slice(cursor, cursor + width)));
1188
+ cursor += width;
1189
+ } else {
1190
+ // A variable slot (sized or not) takes whatever remains, so it must be last.
1191
+ if (i !== shape.length - 1) {
1192
+ throw new Error('A variable-width slot must be last to be reconstructed from a flat field array');
1193
+ }
1194
+ readers.push(new FieldReader(fields.slice(cursor)));
1195
+ cursor = fields.length;
1196
+ }
1197
+ });
1198
+ if (cursor !== fields.length) {
1199
+ throw new Error(`Malformed flattened value: ${fields.length - cursor} unexpected trailing field(s)`);
1200
+ }
1201
+ return readers;
1202
+ }
1203
+ /** Serializes one element to its flat fields. Element must be serializable. */ function serializeElement(element, value) {
1204
+ return element.serialization.fn(value).flat();
1205
+ }
1206
+ /**
1207
+ * Deserializes one element from its exact flat fields, reconstructing its per-slot readers from its shape and asserting
1208
+ * they are fully consumed (so trailing fields are rejected). Element must be deserializable.
1209
+ */ function deserializeElement(element, fields) {
1210
+ const readers = splitByShape(fields, element.shape);
1211
+ const value = element.deserialization.fn(readers);
1212
+ assertReadersConsumed(readers);
1213
+ return value;
1214
+ }
1215
+ /** Flattens `values` into one contiguous run of fields by serializing each element. Element must be serializable. */ function packElements(element, values) {
1216
+ return values.flatMap((v)=>serializeElement(element, v));
1217
+ }
1218
+ /**
1219
+ * Reads `count` fixed-width elements out of a packed run (the inverse of {@link packElements}). Element must be
1220
+ * deserializable.
1221
+ */ function unpackElements(element, reader, count) {
1222
+ const elementWidth = fieldWidth(element.shape);
1223
+ return Array.from({
1224
+ length: count
1225
+ }, ()=>deserializeElement(element, reader.readFieldArray(elementWidth)));
1226
+ }
1227
+ /** Builds the zero-filled slots for a `None`, matching a `Some`'s wire shape (variable slots sized from `size`). */ function zeroSlotsFromShape(shape, size) {
1228
+ return shape.map((slot)=>{
1229
+ if (slot === 'scalar') {
1230
+ return Fr.ZERO;
1231
+ }
1232
+ if (slot === 'variable') {
1233
+ throw new Error('Cannot zero-fill an unsized variable-width slot');
1234
+ }
1235
+ if ('len' in slot) {
1236
+ return Array(slot.len).fill(Fr.ZERO);
1237
+ }
1238
+ if (size === undefined) {
1239
+ throw new Error('Serializing Option.none() over a variable-size inner needs a size, e.g. Option.none({ length: n })');
1240
+ }
1241
+ return Array(slot.lenFrom(size)).fill(Fr.ZERO);
1242
+ });
1243
+ }