@aztec/pxe 0.0.1-commit.2448fdb → 0.0.1-commit.2606882

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 (279) hide show
  1. package/dest/bin/check_oracle_version.js +40 -96
  2. package/dest/bin/index.d.ts +2 -0
  3. package/dest/bin/index.d.ts.map +1 -0
  4. package/dest/bin/index.js +1 -0
  5. package/dest/bin/oracle_version_helpers.d.ts +26 -0
  6. package/dest/bin/oracle_version_helpers.d.ts.map +1 -0
  7. package/dest/bin/oracle_version_helpers.js +93 -0
  8. package/dest/block_synchronizer/block_stream_source.d.ts +10 -0
  9. package/dest/block_synchronizer/block_stream_source.d.ts.map +1 -0
  10. package/dest/block_synchronizer/block_stream_source.js +62 -0
  11. package/dest/block_synchronizer/block_synchronizer.d.ts +5 -3
  12. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
  13. package/dest/block_synchronizer/block_synchronizer.js +21 -11
  14. package/dest/config/index.d.ts +8 -2
  15. package/dest/config/index.d.ts.map +1 -1
  16. package/dest/config/index.js +13 -15
  17. package/dest/config/package_info.js +1 -1
  18. package/dest/contract_function_simulator/contract_function_simulator.d.ts +4 -1
  19. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  20. package/dest/contract_function_simulator/contract_function_simulator.js +20 -12
  21. package/dest/contract_function_simulator/execution_note_cache.d.ts +2 -2
  22. package/dest/contract_function_simulator/execution_note_cache.d.ts.map +1 -1
  23. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts +5 -9
  24. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts.map +1 -1
  25. package/dest/contract_function_simulator/execution_tagging_index_cache.js +3 -7
  26. package/dest/contract_function_simulator/index.d.ts +13 -2
  27. package/dest/contract_function_simulator/index.d.ts.map +1 -1
  28. package/dest/contract_function_simulator/index.js +10 -0
  29. package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts +48 -0
  30. package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts.map +1 -0
  31. package/dest/contract_function_simulator/noir-structs/bounded_vec.js +45 -0
  32. package/dest/contract_function_simulator/noir-structs/ephemeral_array.d.ts +37 -0
  33. package/dest/contract_function_simulator/noir-structs/ephemeral_array.d.ts.map +1 -0
  34. package/dest/contract_function_simulator/noir-structs/ephemeral_array.js +59 -0
  35. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +3 -2
  36. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts.map +1 -1
  37. package/dest/contract_function_simulator/noir-structs/event_validation_request.js +3 -2
  38. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts +12 -2
  39. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts.map +1 -1
  40. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.js +34 -3
  41. package/dest/contract_function_simulator/noir-structs/note_data.d.ts +27 -0
  42. package/dest/contract_function_simulator/noir-structs/note_data.d.ts.map +1 -0
  43. package/dest/contract_function_simulator/noir-structs/note_data.js +3 -0
  44. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +3 -2
  45. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts.map +1 -1
  46. package/dest/contract_function_simulator/noir-structs/note_validation_request.js +3 -2
  47. package/dest/contract_function_simulator/noir-structs/option.d.ts +61 -0
  48. package/dest/contract_function_simulator/noir-structs/option.d.ts.map +1 -0
  49. package/dest/contract_function_simulator/noir-structs/option.js +62 -0
  50. package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts +11 -0
  51. package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts.map +1 -0
  52. package/dest/contract_function_simulator/noir-structs/provided_secret.js +24 -0
  53. package/dest/contract_function_simulator/oracle/interfaces.d.ts +16 -114
  54. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  55. package/dest/contract_function_simulator/oracle/interfaces.js +2 -2
  56. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts +2 -2
  57. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts.map +1 -1
  58. package/dest/contract_function_simulator/oracle/note_packing_utils.js +2 -2
  59. package/dest/contract_function_simulator/oracle/oracle.d.ts +55 -57
  60. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
  61. package/dest/contract_function_simulator/oracle/oracle.js +343 -344
  62. package/dest/contract_function_simulator/oracle/oracle_registry.d.ts +127 -0
  63. package/dest/contract_function_simulator/oracle/oracle_registry.d.ts.map +1 -0
  64. package/dest/contract_function_simulator/oracle/oracle_registry.js +786 -0
  65. package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts +139 -0
  66. package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts.map +1 -0
  67. package/dest/contract_function_simulator/oracle/oracle_type_mappings.js +560 -0
  68. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +27 -29
  69. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  70. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +55 -47
  71. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +59 -39
  72. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  73. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +244 -149
  74. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts +1 -1
  75. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts.map +1 -1
  76. package/dest/contract_function_simulator/proxied_contract_data_source.js +35 -67
  77. package/dest/contract_sync/contract_sync_service.d.ts +4 -6
  78. package/dest/contract_sync/contract_sync_service.d.ts.map +1 -1
  79. package/dest/contract_sync/contract_sync_service.js +43 -24
  80. package/dest/contract_sync/helpers.d.ts +2 -3
  81. package/dest/contract_sync/helpers.d.ts.map +1 -1
  82. package/dest/contract_sync/helpers.js +12 -19
  83. package/dest/debug/pxe_debug_utils.d.ts +1 -6
  84. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  85. package/dest/debug/pxe_debug_utils.js +0 -6
  86. package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
  87. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  88. package/dest/entrypoints/client/bundle/utils.js +11 -3
  89. package/dest/entrypoints/client/lazy/utils.d.ts +1 -1
  90. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  91. package/dest/entrypoints/client/lazy/utils.js +11 -3
  92. package/dest/entrypoints/pxe_creation_options.d.ts +7 -1
  93. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  94. package/dest/entrypoints/server/index.d.ts +2 -1
  95. package/dest/entrypoints/server/index.d.ts.map +1 -1
  96. package/dest/entrypoints/server/index.js +1 -0
  97. package/dest/entrypoints/server/utils.d.ts +3 -2
  98. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  99. package/dest/entrypoints/server/utils.js +11 -3
  100. package/dest/events/event_service.d.ts +13 -5
  101. package/dest/events/event_service.d.ts.map +1 -1
  102. package/dest/events/event_service.js +30 -9
  103. package/dest/hooks/authorize_utility_call.d.ts +41 -0
  104. package/dest/hooks/authorize_utility_call.d.ts.map +1 -0
  105. package/dest/hooks/authorize_utility_call.js +4 -0
  106. package/dest/hooks/execution_hooks.d.ts +42 -0
  107. package/dest/hooks/execution_hooks.d.ts.map +1 -0
  108. package/dest/hooks/execution_hooks.js +9 -0
  109. package/dest/hooks/index.d.ts +4 -0
  110. package/dest/hooks/index.d.ts.map +1 -0
  111. package/dest/hooks/index.js +1 -0
  112. package/dest/logs/log_service.d.ts +6 -5
  113. package/dest/logs/log_service.d.ts.map +1 -1
  114. package/dest/logs/log_service.js +112 -48
  115. package/dest/messages/message_context_service.d.ts +1 -1
  116. package/dest/messages/message_context_service.d.ts.map +1 -1
  117. package/dest/messages/message_context_service.js +28 -9
  118. package/dest/notes/note_service.d.ts +25 -3
  119. package/dest/notes/note_service.d.ts.map +1 -1
  120. package/dest/notes/note_service.js +80 -65
  121. package/dest/oracle_version.d.ts +3 -3
  122. package/dest/oracle_version.js +4 -4
  123. package/dest/private_kernel/batch_planner.d.ts +47 -0
  124. package/dest/private_kernel/batch_planner.d.ts.map +1 -0
  125. package/dest/private_kernel/batch_planner.js +104 -0
  126. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.js +1 -1
  127. package/dest/private_kernel/hints/test_utils.d.ts +1 -1
  128. package/dest/private_kernel/hints/test_utils.d.ts.map +1 -1
  129. package/dest/private_kernel/hints/test_utils.js +2 -3
  130. package/dest/private_kernel/private_kernel_execution_prover.d.ts +6 -2
  131. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  132. package/dest/private_kernel/private_kernel_execution_prover.js +148 -52
  133. package/dest/private_kernel/private_kernel_oracle.d.ts +6 -6
  134. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  135. package/dest/private_kernel/private_kernel_oracle.js +12 -7
  136. package/dest/pxe.d.ts +54 -7
  137. package/dest/pxe.d.ts.map +1 -1
  138. package/dest/pxe.js +126 -84
  139. package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.d.ts +42 -0
  140. package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.d.ts.map +1 -0
  141. package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.js +93 -0
  142. package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts +15 -0
  143. package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts.map +1 -0
  144. package/dest/storage/backwards_compatibility_tests/schema_tests.js +591 -0
  145. package/dest/storage/backwards_compatibility_tests/store_spy.d.ts +19 -0
  146. package/dest/storage/backwards_compatibility_tests/store_spy.d.ts.map +1 -0
  147. package/dest/storage/backwards_compatibility_tests/store_spy.js +63 -0
  148. package/dest/storage/contract_store/contract_store.d.ts +1 -1
  149. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  150. package/dest/storage/contract_store/contract_store.js +5 -24
  151. package/dest/storage/metadata.d.ts +1 -1
  152. package/dest/storage/metadata.js +1 -1
  153. package/dest/storage/open_pxe_stores.d.ts +33 -0
  154. package/dest/storage/open_pxe_stores.d.ts.map +1 -0
  155. package/dest/storage/open_pxe_stores.js +27 -0
  156. package/dest/storage/private_event_store/stored_private_event.js +1 -1
  157. package/dest/storage/tagging_store/recipient_tagging_store.d.ts +6 -6
  158. package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
  159. package/dest/storage/tagging_store/sender_tagging_store.d.ts +5 -5
  160. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  161. package/dest/storage/tagging_store/sender_tagging_store.js +3 -3
  162. package/dest/tagging/get_all_logs_by_tags.d.ts +34 -10
  163. package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -1
  164. package/dest/tagging/get_all_logs_by_tags.js +36 -37
  165. package/dest/tagging/index.d.ts +5 -4
  166. package/dest/tagging/index.d.ts.map +1 -1
  167. package/dest/tagging/index.js +4 -3
  168. package/dest/tagging/persist_sender_tagging_index_ranges.d.ts +29 -0
  169. package/dest/tagging/persist_sender_tagging_index_ranges.d.ts.map +1 -0
  170. package/dest/tagging/persist_sender_tagging_index_ranges.js +42 -0
  171. package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts +56 -0
  172. package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts.map +1 -0
  173. package/dest/tagging/recipient_sync/sync_tagged_private_logs.js +163 -0
  174. package/dest/tagging/recipient_sync/utils/find_highest_indexes.d.ts +3 -3
  175. package/dest/tagging/recipient_sync/utils/find_highest_indexes.d.ts.map +1 -1
  176. package/dest/tagging/reconcile_tagging_index_ranges.d.ts +36 -0
  177. package/dest/tagging/reconcile_tagging_index_ranges.d.ts.map +1 -0
  178. package/dest/tagging/reconcile_tagging_index_ranges.js +74 -0
  179. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +4 -5
  180. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
  181. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +26 -14
  182. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +11 -6
  183. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
  184. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +21 -0
  185. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +4 -4
  186. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
  187. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +2 -2
  188. package/package.json +20 -17
  189. package/src/bin/check_oracle_version.ts +46 -119
  190. package/src/bin/index.ts +1 -0
  191. package/src/bin/oracle_version_helpers.ts +121 -0
  192. package/src/block_synchronizer/block_stream_source.ts +81 -0
  193. package/src/block_synchronizer/block_synchronizer.ts +22 -12
  194. package/src/config/index.ts +15 -9
  195. package/src/config/package_info.ts +1 -1
  196. package/src/contract_function_simulator/contract_function_simulator.ts +34 -11
  197. package/src/contract_function_simulator/execution_note_cache.ts +1 -1
  198. package/src/contract_function_simulator/execution_tagging_index_cache.ts +5 -9
  199. package/src/contract_function_simulator/index.ts +50 -1
  200. package/src/contract_function_simulator/noir-structs/bounded_vec.ts +55 -0
  201. package/src/contract_function_simulator/noir-structs/ephemeral_array.ts +66 -0
  202. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +3 -2
  203. package/src/contract_function_simulator/noir-structs/log_retrieval_request.ts +35 -2
  204. package/src/contract_function_simulator/noir-structs/note_data.ts +27 -0
  205. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +3 -2
  206. package/src/contract_function_simulator/noir-structs/option.ts +69 -0
  207. package/src/contract_function_simulator/noir-structs/provided_secret.ts +27 -0
  208. package/src/contract_function_simulator/oracle/interfaces.ts +12 -204
  209. package/src/contract_function_simulator/oracle/note_packing_utils.ts +3 -3
  210. package/src/contract_function_simulator/oracle/oracle.ts +406 -556
  211. package/src/contract_function_simulator/oracle/oracle_registry.ts +585 -0
  212. package/src/contract_function_simulator/oracle/oracle_type_mappings.ts +553 -0
  213. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +74 -67
  214. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +350 -304
  215. package/src/contract_function_simulator/proxied_contract_data_source.ts +40 -70
  216. package/src/contract_sync/contract_sync_service.ts +56 -43
  217. package/src/contract_sync/helpers.ts +11 -23
  218. package/src/debug/pxe_debug_utils.ts +0 -8
  219. package/src/entrypoints/client/bundle/utils.ts +8 -2
  220. package/src/entrypoints/client/lazy/utils.ts +8 -2
  221. package/src/entrypoints/pxe_creation_options.ts +7 -0
  222. package/src/entrypoints/server/index.ts +1 -0
  223. package/src/entrypoints/server/utils.ts +13 -3
  224. package/src/events/event_service.ts +54 -19
  225. package/src/hooks/authorize_utility_call.ts +44 -0
  226. package/src/hooks/execution_hooks.ts +48 -0
  227. package/src/hooks/index.ts +7 -0
  228. package/src/logs/log_service.ts +137 -92
  229. package/src/messages/message_context_service.ts +42 -24
  230. package/src/notes/note_service.ts +115 -91
  231. package/src/oracle_version.ts +4 -4
  232. package/src/private_kernel/batch_planner.ts +169 -0
  233. package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +1 -1
  234. package/src/private_kernel/hints/test_utils.ts +2 -9
  235. package/src/private_kernel/private_kernel_execution_prover.ts +236 -73
  236. package/src/private_kernel/private_kernel_oracle.ts +21 -11
  237. package/src/pxe.ts +208 -85
  238. package/src/storage/backwards_compatibility_tests/__snapshots__/AddressStore.json +22 -0
  239. package/src/storage/backwards_compatibility_tests/__snapshots__/AnchorBlockStore.json +3 -0
  240. package/src/storage/backwards_compatibility_tests/__snapshots__/CapsuleStore.json +16 -0
  241. package/src/storage/backwards_compatibility_tests/__snapshots__/ContractStore.json +28 -0
  242. package/src/storage/backwards_compatibility_tests/__snapshots__/KeyStore.json +52 -0
  243. package/src/storage/backwards_compatibility_tests/__snapshots__/L2TipsKVStore.json +46 -0
  244. package/src/storage/backwards_compatibility_tests/__snapshots__/NoteStore.json +36 -0
  245. package/src/storage/backwards_compatibility_tests/__snapshots__/PrivateEventStore.json +44 -0
  246. package/src/storage/backwards_compatibility_tests/__snapshots__/RecipientTaggingStore.json +18 -0
  247. package/src/storage/backwards_compatibility_tests/__snapshots__/SenderAddressBookStore.json +16 -0
  248. package/src/storage/backwards_compatibility_tests/__snapshots__/SenderTaggingStore.json +22 -0
  249. package/src/storage/backwards_compatibility_tests/__snapshots__/opened_stores.json +97 -0
  250. package/src/storage/backwards_compatibility_tests/kv_store_snapshot.ts +122 -0
  251. package/src/storage/backwards_compatibility_tests/schema_tests.ts +712 -0
  252. package/src/storage/backwards_compatibility_tests/store_spy.ts +73 -0
  253. package/src/storage/contract_store/contract_store.ts +6 -29
  254. package/src/storage/metadata.ts +1 -1
  255. package/src/storage/open_pxe_stores.ts +49 -0
  256. package/src/storage/private_event_store/stored_private_event.ts +1 -1
  257. package/src/storage/tagging_store/recipient_tagging_store.ts +5 -9
  258. package/src/storage/tagging_store/sender_tagging_store.ts +6 -6
  259. package/src/tagging/get_all_logs_by_tags.ts +78 -50
  260. package/src/tagging/index.ts +4 -3
  261. package/src/tagging/persist_sender_tagging_index_ranges.ts +57 -0
  262. package/src/tagging/recipient_sync/sync_tagged_private_logs.ts +240 -0
  263. package/src/tagging/recipient_sync/utils/find_highest_indexes.ts +2 -2
  264. package/src/tagging/reconcile_tagging_index_ranges.ts +102 -0
  265. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +41 -19
  266. package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +23 -8
  267. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +4 -5
  268. package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.d.ts +0 -9
  269. package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.d.ts.map +0 -1
  270. package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.js +0 -47
  271. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +0 -14
  272. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +0 -1
  273. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +0 -85
  274. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +0 -14
  275. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +0 -1
  276. package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +0 -33
  277. package/src/contract_function_simulator/oracle/legacy_oracle_mappings.ts +0 -104
  278. package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +0 -130
  279. package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +0 -44
@@ -76,6 +76,7 @@ import {
76
76
  import { PrivateLog } from '@aztec/stdlib/logs';
77
77
  import { ScopedL2ToL1Message } from '@aztec/stdlib/messaging';
78
78
  import { ChonkProof } from '@aztec/stdlib/proofs';
79
+ import { MerkleTreeId } from '@aztec/stdlib/trees';
79
80
  import {
80
81
  BlockHeader,
81
82
  CallContext,
@@ -90,6 +91,7 @@ import {
90
91
  } from '@aztec/stdlib/tx';
91
92
 
92
93
  import type { ContractSyncService } from '../contract_sync/contract_sync_service.js';
94
+ import type { ExecutionHooks } from '../hooks/index.js';
93
95
  import type { MessageContextService } from '../messages/message_context_service.js';
94
96
  import type { AddressStore } from '../storage/address_store/address_store.js';
95
97
  import { CapsuleService } from '../storage/capsule_store/capsule_service.js';
@@ -143,6 +145,7 @@ export type ContractFunctionSimulatorArgs = {
143
145
  simulator: CircuitSimulator;
144
146
  contractSyncService: ContractSyncService;
145
147
  messageContextService: MessageContextService;
148
+ hooks?: ExecutionHooks;
146
149
  };
147
150
 
148
151
  /**
@@ -164,6 +167,7 @@ export class ContractFunctionSimulator {
164
167
  private readonly simulator: CircuitSimulator;
165
168
  private readonly contractSyncService: ContractSyncService;
166
169
  private readonly messageContextService: MessageContextService;
170
+ private readonly hooks: ExecutionHooks | undefined;
167
171
 
168
172
  constructor(args: ContractFunctionSimulatorArgs) {
169
173
  this.contractStore = args.contractStore;
@@ -180,6 +184,7 @@ export class ContractFunctionSimulator {
180
184
  this.simulator = args.simulator;
181
185
  this.contractSyncService = args.contractSyncService;
182
186
  this.messageContextService = args.messageContextService;
187
+ this.hooks = args.hooks;
183
188
  this.log = createLogger('simulator');
184
189
  }
185
190
 
@@ -208,7 +213,7 @@ export class ContractFunctionSimulator {
208
213
  }
209
214
 
210
215
  if (request.origin !== contractAddress) {
211
- this.log.warn(
216
+ throw new Error(
212
217
  `Request origin does not match contract address in simulation. Request origin: ${request.origin}, contract address: ${contractAddress}`,
213
218
  );
214
219
  }
@@ -259,6 +264,7 @@ export class ContractFunctionSimulator {
259
264
  senderForTags,
260
265
  simulator: this.simulator,
261
266
  l2TipsStore: this.l2TipsStore,
267
+ hooks: this.hooks,
262
268
  });
263
269
 
264
270
  const setupTime = simulatorSetupTimer.ms();
@@ -309,7 +315,6 @@ export class ContractFunctionSimulator {
309
315
  }
310
316
  }
311
317
 
312
- // docs:start:execute_utility_function
313
318
  /**
314
319
  * Runs a utility function.
315
320
  * @param call - The function call to execute.
@@ -332,6 +337,10 @@ export class ContractFunctionSimulator {
332
337
  throw new Error(`Cannot run ${entryPointArtifact.functionType} function as utility`);
333
338
  }
334
339
 
340
+ const utilityExecutor = async (syncCall: FunctionCall, execScopes: AztecAddress[]) => {
341
+ await this.runUtility(syncCall, [], anchorBlockHeader, execScopes, jobId);
342
+ };
343
+
335
344
  const oracle = new UtilityExecutionOracle({
336
345
  contractAddress: call.to,
337
346
  authWitnesses: authwits,
@@ -351,6 +360,9 @@ export class ContractFunctionSimulator {
351
360
  l2TipsStore: this.l2TipsStore,
352
361
  jobId,
353
362
  scopes,
363
+ simulator: this.simulator,
364
+ hooks: this.hooks,
365
+ utilityExecutor,
354
366
  });
355
367
 
356
368
  try {
@@ -384,7 +396,6 @@ export class ContractFunctionSimulator {
384
396
  throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during private execution'));
385
397
  }
386
398
  }
387
- // docs:end:execute_utility_function
388
399
 
389
400
  /**
390
401
  * Returns the execution statistics collected during the simulator run.
@@ -753,7 +764,7 @@ function squashTransientSideEffects(
753
764
  * at the tx's anchor block, mimicking the behavior of the kernels
754
765
  */
755
766
  async function verifyReadRequests(
756
- node: Pick<AztecNode, 'getNoteHashMembershipWitness' | 'getNullifierMembershipWitness'>,
767
+ node: Pick<AztecNode, 'findLeavesIndexes'>,
757
768
  anchorBlockHash: BlockParameter,
758
769
  noteHashReadRequests: ScopedReadRequest[],
759
770
  nullifierReadRequests: ScopedReadRequest[],
@@ -786,13 +797,25 @@ async function verifyReadRequests(
786
797
  }
787
798
  }
788
799
 
789
- const [noteHashWitnesses, nullifierWitnesses] = await Promise.all([
790
- Promise.all(settledNoteHashReads.map(({ value }) => node.getNoteHashMembershipWitness(anchorBlockHash, value))),
791
- Promise.all(settledNullifierReads.map(({ value }) => node.getNullifierMembershipWitness(anchorBlockHash, value))),
800
+ const [noteHashResults, nullifierResults] = await Promise.all([
801
+ settledNoteHashReads.length > 0
802
+ ? node.findLeavesIndexes(
803
+ anchorBlockHash,
804
+ MerkleTreeId.NOTE_HASH_TREE,
805
+ settledNoteHashReads.map(({ value }) => value),
806
+ )
807
+ : [],
808
+ settledNullifierReads.length > 0
809
+ ? node.findLeavesIndexes(
810
+ anchorBlockHash,
811
+ MerkleTreeId.NULLIFIER_TREE,
812
+ settledNullifierReads.map(({ value }) => value),
813
+ )
814
+ : [],
792
815
  ]);
793
816
 
794
817
  for (let i = 0; i < settledNoteHashReads.length; i++) {
795
- if (!noteHashWitnesses[i]) {
818
+ if (!noteHashResults[i]) {
796
819
  throw new Error(
797
820
  `Note hash read request at index ${settledNoteHashReads[i].index} is reading an unknown note hash: ${settledNoteHashReads[i].value}`,
798
821
  );
@@ -800,7 +823,7 @@ async function verifyReadRequests(
800
823
  }
801
824
 
802
825
  for (let i = 0; i < settledNullifierReads.length; i++) {
803
- if (!nullifierWitnesses[i]) {
826
+ if (!nullifierResults[i]) {
804
827
  throw new Error(
805
828
  `Nullifier read request at index ${settledNullifierReads[i].index} is reading an unknown nullifier: ${settledNullifierReads[i].value}`,
806
829
  );
@@ -846,9 +869,9 @@ function meterGasUsed(data: PrivateToRollupAccumulatedData | PrivateToPublicAccu
846
869
  meteredL2Gas += numPrivatelogs * L2_GAS_PER_PRIVATE_LOG;
847
870
 
848
871
  const numContractClassLogs = arrayNonEmptyLength(data.contractClassLogsHashes, log => log.isEmpty());
849
- // Every contract class log emits its length and contract address as additional fields
872
+ // Every contract class log emits its contract address as an additional field
850
873
  meteredDAFields += data.contractClassLogsHashes.reduce(
851
- (acc, log) => (!log.isEmpty() ? acc + log.logHash.length + 2 : acc),
874
+ (acc, log) => (!log.isEmpty() ? acc + log.logHash.length + 1 : acc),
852
875
  0,
853
876
  );
854
877
  meteredL2Gas += numContractClassLogs * L2_GAS_PER_CONTRACT_CLASS_LOG;
@@ -2,7 +2,7 @@ import { Fr } from '@aztec/foundation/curves/bn254';
2
2
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
3
3
  import { computeNoteHashNonce, computeUniqueNoteHash, siloNoteHash, siloNullifier } from '@aztec/stdlib/hash';
4
4
 
5
- import type { NoteData } from './oracle/interfaces.js';
5
+ import type { NoteData } from './noir-structs/note_data.js';
6
6
 
7
7
  interface PendingNote {
8
8
  note: NoteData;
@@ -1,18 +1,14 @@
1
- import { ExtendedDirectionalAppTaggingSecret, type TaggingIndexRange } from '@aztec/stdlib/logs';
1
+ import { AppTaggingSecret, type TaggingIndexRange } from '@aztec/stdlib/logs';
2
2
 
3
- /**
4
- * A map that stores the tagging index range for a given extended directional app tagging secret.
5
- * Note: The directional app tagging secret is unique for a (sender, recipient, contract) tuple while the direction
6
- * of sender -> recipient matters.
7
- */
3
+ /** A map that stores the tagging index range for a given app tagging secret. */
8
4
  export class ExecutionTaggingIndexCache {
9
5
  private taggingIndexMap: Map<string, { lowestIndex: number; highestIndex: number }> = new Map();
10
6
 
11
- public getLastUsedIndex(secret: ExtendedDirectionalAppTaggingSecret): number | undefined {
7
+ public getLastUsedIndex(secret: AppTaggingSecret): number | undefined {
12
8
  return this.taggingIndexMap.get(secret.toString())?.highestIndex;
13
9
  }
14
10
 
15
- public setLastUsedIndex(secret: ExtendedDirectionalAppTaggingSecret, index: number) {
11
+ public setLastUsedIndex(secret: AppTaggingSecret, index: number) {
16
12
  const currentValue = this.taggingIndexMap.get(secret.toString());
17
13
  if (currentValue !== undefined && currentValue.highestIndex !== index - 1) {
18
14
  throw new Error(`Invalid tagging index update. Current value: ${currentValue.highestIndex}, new value: ${index}`);
@@ -29,7 +25,7 @@ export class ExecutionTaggingIndexCache {
29
25
  */
30
26
  public getUsedTaggingIndexRanges(): TaggingIndexRange[] {
31
27
  return Array.from(this.taggingIndexMap.entries()).map(([secret, { lowestIndex, highestIndex }]) => ({
32
- extendedSecret: ExtendedDirectionalAppTaggingSecret.fromString(secret),
28
+ extendedSecret: AppTaggingSecret.fromString(secret),
33
29
  lowestIndex,
34
30
  highestIndex,
35
31
  }));
@@ -1,8 +1,49 @@
1
+ export {
2
+ ORACLE_REGISTRY,
3
+ callHandler,
4
+ makeEntry,
5
+ type HandlersForPrefix,
6
+ type NamedValue,
7
+ type OracleRegistryEntry,
8
+ type ParamTypes,
9
+ type StripOraclePrefix,
10
+ } from './oracle/oracle_registry.js';
11
+ export {
12
+ ARRAY,
13
+ AZTEC_ADDRESS,
14
+ BIGINT,
15
+ BLOCK_NUMBER,
16
+ BOOL,
17
+ BOUNDED_VEC,
18
+ BUFFER,
19
+ BYTE,
20
+ DELIVERY_MODE,
21
+ EPHEMERAL_ARRAY,
22
+ EVENT_VALIDATION_REQUEST,
23
+ FIELD,
24
+ FUNCTION_SELECTOR,
25
+ LOG_RETRIEVAL_REQUEST,
26
+ LOG_RETRIEVAL_RESPONSE,
27
+ MEMBERSHIP_WITNESS,
28
+ MESSAGE_CONTEXT,
29
+ NOTE_VALIDATION_REQUEST,
30
+ OPTION,
31
+ PENDING_TAGGED_LOG,
32
+ POINT,
33
+ PROVIDED_SECRET,
34
+ STR,
35
+ U32,
36
+ type InputSlot,
37
+ type MaybePromise,
38
+ type OutputSlot,
39
+ type TypeMapping,
40
+ } from './oracle/oracle_type_mappings.js';
1
41
  export { ExecutionNoteCache } from './execution_note_cache.js';
2
42
  export { ExecutionTaggingIndexCache } from './execution_tagging_index_cache.js';
3
43
  export { HashedValuesCache } from './hashed_values_cache.js';
4
44
  export { pickNotes } from './pick_notes.js';
5
- export type { NoteData, IMiscOracle, IUtilityExecutionOracle, IPrivateExecutionOracle } from './oracle/interfaces.js';
45
+ export type { IMiscOracle, IUtilityExecutionOracle, IPrivateExecutionOracle } from './oracle/interfaces.js';
46
+ export type { NoteData } from './noir-structs/note_data.js';
6
47
  export { MessageLoadOracleInputs } from './oracle/message_load_oracle_inputs.js';
7
48
  export { MessageContextService } from '../messages/message_context_service.js';
8
49
  export { UtilityExecutionOracle } from './oracle/utility_execution_oracle.js';
@@ -11,4 +52,12 @@ export { Oracle } from './oracle/oracle.js';
11
52
  export { executePrivateFunction, extractPrivateCircuitPublicInputs } from './oracle/private_execution.js';
12
53
  export { generateSimulatedProvingResult } from './contract_function_simulator.js';
13
54
  export { packAsHintedNote } from './oracle/note_packing_utils.js';
55
+ export { BoundedVec } from './noir-structs/bounded_vec.js';
56
+ export { EphemeralArray } from './noir-structs/ephemeral_array.js';
57
+ export { Option } from './noir-structs/option.js';
14
58
  export { UtilityContext } from './noir-structs/utility_context.js';
59
+ export { EventValidationRequest } from './noir-structs/event_validation_request.js';
60
+ export { LogRetrievalRequest } from './noir-structs/log_retrieval_request.js';
61
+ export { LogRetrievalResponse } from './noir-structs/log_retrieval_response.js';
62
+ export { NoteValidationRequest } from './noir-structs/note_validation_request.js';
63
+ export { ProvidedSecret } from './noir-structs/provided_secret.js';
@@ -0,0 +1,55 @@
1
+ /**
2
+ * TypeScript counterpart of Noir's `BoundedVec<T, MaxLen>`.
3
+ *
4
+ * Carries the actual `data` plus wire-format metadata (`maxLength`, `elementSize`) so the ACVM
5
+ * serializer can pad the storage slot to exactly `maxLength * elementSize` fields.
6
+ */
7
+ export class BoundedVec<T> {
8
+ private constructor(
9
+ public readonly data: T[],
10
+ public readonly maxLength: number,
11
+ public readonly elementSize: number,
12
+ ) {}
13
+
14
+ /**
15
+ * Construct a BoundedVec with data.
16
+ *
17
+ * @param data - Actual elements. Length must be `<= maxLength`.
18
+ * @param maxLength - Maximum capacity declared at the Noir call site.
19
+ * The storage slot is padded to this many elements.
20
+ * @param elementSize - Number of Fr fields each element contributes when serialized.
21
+ * `1` for scalar elements (u8, Field) — this is the default.
22
+ * `> 1` for compound elements (e.g. a packed note that spans multiple fields).
23
+ *
24
+ * @example A bounded vec of bytes (elementSize defaults to 1):
25
+ * ```ts
26
+ * BoundedVec.from({ data: plaintext, maxLength: ciphertext.maxLength })
27
+ * ```
28
+ *
29
+ * @example A bounded vec of packed notes, each spanning `packedHintedNoteLength` fields:
30
+ * ```ts
31
+ * BoundedVec.from({ data: notes, maxLength: maxNotes, elementSize: packedHintedNoteLength })
32
+ * ```
33
+ */
34
+ static from<T>({
35
+ data,
36
+ maxLength,
37
+ elementSize = 1,
38
+ }: {
39
+ data: T[];
40
+ maxLength: number;
41
+ elementSize?: number;
42
+ }): BoundedVec<T> {
43
+ return new BoundedVec<T>(data, maxLength, elementSize);
44
+ }
45
+
46
+ /**
47
+ * Construct an empty BoundedVec, typically used as a shape template for `Option.empty(...)`.
48
+ *
49
+ * @param maxLength - Maximum capacity declared at the Noir call site.
50
+ * @param elementSize - Number of Fr fields each element contributes when serialized (default 1).
51
+ */
52
+ static empty<T>({ maxLength, elementSize = 1 }: { maxLength: number; elementSize?: number }): BoundedVec<T> {
53
+ return new BoundedVec<T>([], maxLength, elementSize);
54
+ }
55
+ }
@@ -0,0 +1,66 @@
1
+ import type { Fr } from '@aztec/foundation/curves/bn254';
2
+ import { FieldReader } from '@aztec/foundation/serialize';
3
+
4
+ import type { EphemeralArrayService } from '../ephemeral_array_service.js';
5
+ import type { TypeMapping } from '../oracle/oracle_registry.js';
6
+
7
+ /**
8
+ * TypeScript counterpart of Noir's `EphemeralArray<T>`.
9
+ *
10
+ * An ephemeral array looks very different depending on whether it's being produced (as an oracle return value) or
11
+ * consumed (as an oracle parameter), so we use a discriminated state to model both without leaking those details to
12
+ * callers:
13
+ *
14
+ * - As a return value (`output` mode), what we have are the typed values the oracle just computed. The slot is just
15
+ * an implementation detail of how those values get handed back to ACVM, so we hold onto the values and the service
16
+ * they will eventually live in, and only materialize a slot when something actually asks for it.
17
+ *
18
+ * - As a parameter (`input` mode), what we have is a slot pointing at fields ACVM already wrote into the service,
19
+ * plus the TypeMapping that knows how to interpret those fields. We hold onto both so callers can later ask for
20
+ * the typed values without having to think about deserialization.
21
+ *
22
+ * In both modes the idea is the same: store everything we already know at construction time, so the rest of the
23
+ * code can work with typed values and never touch slots, services, or TypeMappings directly.
24
+ */
25
+ export class EphemeralArray<T> {
26
+ private constructor(private readonly state: EphemeralArrayState<T>) {}
27
+
28
+ /** Create an output-mode array carrying typed values. The service is only used if/when the slot is materialized. */
29
+ static fromValues<T>(service: EphemeralArrayService, values: T[]): EphemeralArray<T> {
30
+ return new EphemeralArray({ kind: 'output', service, values });
31
+ }
32
+
33
+ /** Wrap an existing slot. Intended for the EPHEMERAL_ARRAY combinator during ACVM deserialization. */
34
+ static fromSlot<T>(slot: Fr, mapping: TypeMapping<T>): EphemeralArray<T> {
35
+ return new EphemeralArray({ kind: 'input', slot, mapping });
36
+ }
37
+
38
+ /**
39
+ * Returns the slot, materializing values into the service on first call for output-mode arrays.
40
+ * Intended for the EPHEMERAL_ARRAY combinator during ACVM serialization.
41
+ */
42
+ materializeSlot(serializeItem: (v: T) => Fr[]): Fr {
43
+ if (this.state.kind === 'input') {
44
+ return this.state.slot;
45
+ }
46
+ if (this.state.cachedSlot === undefined) {
47
+ this.state.cachedSlot = this.state.service.newArray(this.state.values.map(serializeItem));
48
+ }
49
+ return this.state.cachedSlot;
50
+ }
51
+
52
+ /** Read all elements: returns stored values for output-mode arrays, deserializes from the service for input-mode. */
53
+ readAll(service: EphemeralArrayService): T[] {
54
+ if (this.state.kind === 'output') {
55
+ return this.state.values;
56
+ }
57
+ const mapping = this.state.mapping;
58
+ return service
59
+ .readArrayAt(this.state.slot)
60
+ .map(fields => mapping.deserialization!.fn([FieldReader.asReader(fields)]));
61
+ }
62
+ }
63
+
64
+ type EphemeralArrayState<T> =
65
+ | { kind: 'output'; service: EphemeralArrayService; values: T[]; cachedSlot?: Fr }
66
+ | { kind: 'input'; slot: Fr; mapping: TypeMapping<T> };
@@ -18,7 +18,7 @@ export class EventValidationRequest {
18
18
  public txHash: TxHash,
19
19
  ) {}
20
20
 
21
- static fromFields(fields: Fr[], maxEventSerializedLen: number): EventValidationRequest {
21
+ static fromFields(fields: Fr[] | FieldReader): EventValidationRequest {
22
22
  const reader = FieldReader.asReader(fields);
23
23
 
24
24
  const contractAddress = AztecAddress.fromField(reader.readField());
@@ -26,6 +26,7 @@ export class EventValidationRequest {
26
26
 
27
27
  const randomness = reader.readField();
28
28
 
29
+ const maxEventSerializedLen = reader.readField().toNumber();
29
30
  const eventStorage = reader.readFieldArray(maxEventSerializedLen);
30
31
  const eventLen = reader.readField().toNumber();
31
32
  const serializedEvent = eventStorage.slice(0, eventLen);
@@ -35,7 +36,7 @@ export class EventValidationRequest {
35
36
 
36
37
  if (reader.remainingFields() !== 0) {
37
38
  throw new Error(
38
- `Error converting array of fields to EventValidationRequest: expected ${reader.cursor} fields but received ${fields.length} (maxEventSerializedLen=${maxEventSerializedLen}).`,
39
+ `Error converting array of fields to EventValidationRequest: expected ${reader.cursor} fields but received ${reader.cursor + reader.remainingFields()} (maxEventSerializedLen=${maxEventSerializedLen}).`,
39
40
  );
40
41
  }
41
42
 
@@ -1,8 +1,16 @@
1
+ import { BlockNumber } from '@aztec/foundation/branded-types';
1
2
  import { Fr } from '@aztec/foundation/curves/bn254';
2
3
  import { FieldReader } from '@aztec/foundation/serialize';
3
4
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
4
5
  import { Tag } from '@aztec/stdlib/logs';
5
6
 
7
+ /** Discriminant for which log source to query. */
8
+ export enum LogSource {
9
+ PRIVATE = 0,
10
+ PUBLIC = 1,
11
+ PUBLIC_AND_PRIVATE = 2,
12
+ }
13
+
6
14
  /**
7
15
  * Intermediate struct used to perform batch log retrieval by PXE. The `utilityBulkRetrieveLogs` oracle expects values of this
8
16
  * type to be stored in a `EphemeralArray`.
@@ -11,10 +19,21 @@ export class LogRetrievalRequest {
11
19
  constructor(
12
20
  public contractAddress: AztecAddress,
13
21
  public tag: Tag,
22
+ public source: LogSource = LogSource.PUBLIC_AND_PRIVATE,
23
+ public fromBlock?: BlockNumber,
24
+ public toBlock?: BlockNumber,
14
25
  ) {}
15
26
 
16
27
  toFields(): Fr[] {
17
- return [this.contractAddress.toField(), this.tag.value];
28
+ return [
29
+ this.contractAddress.toField(),
30
+ this.tag.value,
31
+ new Fr(this.source),
32
+ new Fr(this.fromBlock !== undefined ? 1 : 0),
33
+ new Fr(this.fromBlock ?? 0),
34
+ new Fr(this.toBlock !== undefined ? 1 : 0),
35
+ new Fr(this.toBlock ?? 0),
36
+ ];
18
37
  }
19
38
 
20
39
  static fromFields(fields: Fr[] | FieldReader): LogRetrievalRequest {
@@ -22,7 +41,21 @@ export class LogRetrievalRequest {
22
41
 
23
42
  const contractAddress = AztecAddress.fromField(reader.readField());
24
43
  const tag = new Tag(reader.readField());
44
+ const sourceNum = reader.readField().toNumber();
45
+ if (!(sourceNum in LogSource)) {
46
+ const validNames = Object.keys(LogSource).filter(k => isNaN(Number(k)));
47
+ throw new Error(`Invalid LogSource value ${sourceNum}, expected one of ${validNames.join(', ')}`);
48
+ }
49
+ const source = sourceNum as LogSource;
50
+
51
+ const fromBlockIsSome = reader.readBoolean();
52
+ const fromBlockValue = reader.readField();
53
+ const fromBlock = fromBlockIsSome ? BlockNumber(fromBlockValue.toNumber()) : undefined;
54
+
55
+ const toBlockIsSome = reader.readBoolean();
56
+ const toBlockValue = reader.readField();
57
+ const toBlock = toBlockIsSome ? BlockNumber(toBlockValue.toNumber()) : undefined;
25
58
 
26
- return new LogRetrievalRequest(contractAddress, tag);
59
+ return new LogRetrievalRequest(contractAddress, tag, source, fromBlock, toBlock);
27
60
  }
28
61
  }
@@ -0,0 +1,27 @@
1
+ import type { Fr } from '@aztec/foundation/curves/bn254';
2
+ import type { AztecAddress } from '@aztec/stdlib/aztec-address';
3
+ import type { Note } from '@aztec/stdlib/note';
4
+
5
+ /**
6
+ * Information about a note needed during execution.
7
+ */
8
+ export interface NoteData {
9
+ /** The actual note content (the fields of the Noir #[note] struct). */
10
+ note: Note;
11
+ /** The address of the contract that owns the note. */
12
+ contractAddress: AztecAddress;
13
+ /** The owner of the note. */
14
+ owner: AztecAddress;
15
+ /** The storage slot of the note. */
16
+ storageSlot: Fr;
17
+ /** The randomness injected to the note */
18
+ randomness: Fr;
19
+ /** The nonce injected into the note hash preimage by kernels. */
20
+ noteNonce: Fr;
21
+ /** A hash of the note as it gets stored in the note hash tree. */
22
+ noteHash: Fr;
23
+ /** True if the note is pending, false if settled. */
24
+ isPending: boolean;
25
+ /** The corresponding nullifier of the note. Undefined for pending notes. */
26
+ siloedNullifier?: Fr;
27
+ }
@@ -20,7 +20,7 @@ export class NoteValidationRequest {
20
20
  public txHash: TxHash,
21
21
  ) {}
22
22
 
23
- static fromFields(fields: Fr[], maxNotePackedLen: number): NoteValidationRequest {
23
+ static fromFields(fields: Fr[] | FieldReader): NoteValidationRequest {
24
24
  const reader = FieldReader.asReader(fields);
25
25
 
26
26
  const contractAddress = AztecAddress.fromField(reader.readField());
@@ -29,6 +29,7 @@ export class NoteValidationRequest {
29
29
  const randomness = reader.readField();
30
30
  const noteNonce = reader.readField();
31
31
 
32
+ const maxNotePackedLen = reader.readField().toNumber();
32
33
  const contentStorage = reader.readFieldArray(maxNotePackedLen);
33
34
  const contentLen = reader.readField().toNumber();
34
35
  const content = contentStorage.slice(0, contentLen);
@@ -39,7 +40,7 @@ export class NoteValidationRequest {
39
40
 
40
41
  if (reader.remainingFields() !== 0) {
41
42
  throw new Error(
42
- `Error converting array of fields to NoteValidationRequest: expected ${reader.cursor} fields but received ${fields.length} (maxNotePackedLen=${maxNotePackedLen}).`,
43
+ `Error converting array of fields to NoteValidationRequest: expected ${reader.cursor} fields but received ${reader.cursor + reader.remainingFields()} (maxNotePackedLen=${maxNotePackedLen}).`,
43
44
  );
44
45
  }
45
46
 
@@ -0,0 +1,69 @@
1
+ /**
2
+ * TypeScript counterpart of Noir's `Option<T>`.
3
+ *
4
+ * Wraps a value that may or may not be present. Use {@link Option.some} to wrap a present value and
5
+ * {@link Option.none} for an absent one. The type guards {@link isSome} and {@link isNone} narrow
6
+ * `value` in conditional branches.
7
+ */
8
+ export class Option<T> {
9
+ private constructor(
10
+ public readonly value: T | undefined,
11
+ public readonly template: T | undefined,
12
+ ) {}
13
+
14
+ /**
15
+ * Wrap a present value.
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * return Option.some(values);
20
+ * ```
21
+ */
22
+ static some<T>(value: T): Option<T> {
23
+ return new Option<T>(value, undefined);
24
+ }
25
+
26
+ /**
27
+ * Construct an absent Option.
28
+ *
29
+ * When serialized back to ACVM, the `None` case must produce the same number of fields as `Some`.
30
+ * For types whose wire size varies per call site (`BoundedVec`, `FixedArray`), pass a `template` so the
31
+ * serializer knows how many zero fields to emit. Omit the template when the Option will not be
32
+ * re-serialized (e.g. deserialized input params).
33
+ *
34
+ * @param template - A representative empty `T` whose serialization determines the zero-filled wire format.
35
+ *
36
+ * @example None for a fixed-size type:
37
+ * ```ts
38
+ * return Option.none(AztecAddress.ZERO);
39
+ * ```
40
+ *
41
+ * @example None for a dynamic-size type:
42
+ * ```ts
43
+ * return Option.none(BoundedVec.empty<number>({ maxLength: ciphertext.maxLength }));
44
+ * ```
45
+ */
46
+ static none<T>(template?: T): Option<T> {
47
+ return new Option<T>(undefined, template);
48
+ }
49
+
50
+ /**
51
+ * Type guard: narrows `value` to `T` in the truthy branch.
52
+ *
53
+ * @example
54
+ * ```ts
55
+ * const opt = await handler.getSenderForTags();
56
+ * if (opt.isSome()) {
57
+ * console.log(opt.value); // narrowed to T
58
+ * }
59
+ * ```
60
+ */
61
+ isSome(): this is Option<T> & { value: T } {
62
+ return this.value !== undefined;
63
+ }
64
+
65
+ /** Type guard: narrows `value` to `undefined` in the truthy branch. */
66
+ isNone(): this is Option<T> & { value: undefined } {
67
+ return this.value === undefined;
68
+ }
69
+ }
@@ -0,0 +1,27 @@
1
+ import { Fr } from '@aztec/foundation/curves/bn254';
2
+ import { FieldReader } from '@aztec/foundation/serialize';
3
+ import { AppTaggingSecretKind } from '@aztec/stdlib/logs';
4
+
5
+ /** A tagging secret an app supplies explicitly to `getPendingTaggedLogs` when PXE cannot derive it internally. */
6
+ export class ProvidedSecret {
7
+ constructor(
8
+ public secret: Fr,
9
+ public mode: AppTaggingSecretKind,
10
+ ) {}
11
+
12
+ static fromFields(fields: Fr[] | FieldReader): ProvidedSecret {
13
+ const reader = FieldReader.asReader(fields);
14
+ return new ProvidedSecret(reader.readField(), kindFromField(reader.readField()));
15
+ }
16
+ }
17
+
18
+ function kindFromField(mode: Fr): AppTaggingSecretKind {
19
+ switch (mode.toBigInt()) {
20
+ case 0n:
21
+ return AppTaggingSecretKind.UNCONSTRAINED;
22
+ case 1n:
23
+ return AppTaggingSecretKind.CONSTRAINED;
24
+ default:
25
+ throw new Error(`Invalid app tagging secret kind: ${mode.toString()}`);
26
+ }
27
+ }