@aztec/pxe 0.0.1-commit.3469e52 → 0.0.1-commit.35158ae7e

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 (247) hide show
  1. package/dest/access_scopes.d.ts +9 -0
  2. package/dest/access_scopes.d.ts.map +1 -0
  3. package/dest/access_scopes.js +6 -0
  4. package/dest/bin/check_oracle_version.js +1 -1
  5. package/dest/block_synchronizer/block_synchronizer.d.ts +9 -5
  6. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
  7. package/dest/block_synchronizer/block_synchronizer.js +62 -16
  8. package/dest/config/index.d.ts +4 -2
  9. package/dest/config/index.d.ts.map +1 -1
  10. package/dest/config/index.js +18 -1
  11. package/dest/config/package_info.js +1 -1
  12. package/dest/contract_function_simulator/contract_function_simulator.d.ts +61 -31
  13. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  14. package/dest/contract_function_simulator/contract_function_simulator.js +201 -78
  15. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts +7 -7
  16. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts.map +1 -1
  17. package/dest/contract_function_simulator/execution_tagging_index_cache.js +19 -11
  18. package/dest/contract_function_simulator/index.d.ts +2 -1
  19. package/dest/contract_function_simulator/index.d.ts.map +1 -1
  20. package/dest/contract_function_simulator/index.js +1 -0
  21. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +3 -4
  22. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts.map +1 -1
  23. package/dest/contract_function_simulator/noir-structs/event_validation_request.js +6 -5
  24. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts +1 -1
  25. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts.map +1 -1
  26. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.js +1 -3
  27. package/dest/contract_function_simulator/noir-structs/message_tx_context.d.ts +16 -0
  28. package/dest/contract_function_simulator/noir-structs/message_tx_context.d.ts.map +1 -0
  29. package/dest/contract_function_simulator/noir-structs/message_tx_context.js +57 -0
  30. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +3 -5
  31. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts.map +1 -1
  32. package/dest/contract_function_simulator/noir-structs/note_validation_request.js +4 -6
  33. package/dest/contract_function_simulator/oracle/interfaces.d.ts +54 -46
  34. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  35. package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.d.ts +9 -0
  36. package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.d.ts.map +1 -0
  37. package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.js +42 -0
  38. package/dest/contract_function_simulator/oracle/oracle.d.ts +45 -42
  39. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
  40. package/dest/contract_function_simulator/oracle/oracle.js +201 -110
  41. package/dest/contract_function_simulator/oracle/private_execution.d.ts +2 -22
  42. package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
  43. package/dest/contract_function_simulator/oracle/private_execution.js +5 -40
  44. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +60 -77
  45. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  46. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +110 -86
  47. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +104 -54
  48. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  49. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +216 -119
  50. package/dest/contract_logging.d.ts +22 -0
  51. package/dest/contract_logging.d.ts.map +1 -0
  52. package/dest/contract_logging.js +23 -0
  53. package/dest/contract_sync/contract_sync_service.d.ts +45 -0
  54. package/dest/contract_sync/contract_sync_service.d.ts.map +1 -0
  55. package/dest/contract_sync/contract_sync_service.js +114 -0
  56. package/dest/contract_sync/helpers.d.ts +29 -0
  57. package/dest/contract_sync/helpers.d.ts.map +1 -0
  58. package/dest/contract_sync/helpers.js +55 -0
  59. package/dest/debug/pxe_debug_utils.d.ts +24 -10
  60. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  61. package/dest/debug/pxe_debug_utils.js +28 -17
  62. package/dest/entrypoints/client/bundle/index.d.ts +4 -1
  63. package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
  64. package/dest/entrypoints/client/bundle/index.js +3 -0
  65. package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
  66. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  67. package/dest/entrypoints/client/bundle/utils.js +21 -7
  68. package/dest/entrypoints/client/lazy/index.d.ts +4 -1
  69. package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
  70. package/dest/entrypoints/client/lazy/index.js +3 -0
  71. package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
  72. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  73. package/dest/entrypoints/client/lazy/utils.js +22 -8
  74. package/dest/entrypoints/pxe_creation_options.d.ts +3 -2
  75. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  76. package/dest/entrypoints/server/index.d.ts +4 -1
  77. package/dest/entrypoints/server/index.d.ts.map +1 -1
  78. package/dest/entrypoints/server/index.js +3 -0
  79. package/dest/entrypoints/server/utils.d.ts +1 -1
  80. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  81. package/dest/entrypoints/server/utils.js +28 -9
  82. package/dest/events/event_service.d.ts +5 -6
  83. package/dest/events/event_service.d.ts.map +1 -1
  84. package/dest/events/event_service.js +6 -7
  85. package/dest/job_coordinator/job_coordinator.d.ts +3 -2
  86. package/dest/job_coordinator/job_coordinator.d.ts.map +1 -1
  87. package/dest/job_coordinator/job_coordinator.js +3 -2
  88. package/dest/logs/log_service.d.ts +7 -5
  89. package/dest/logs/log_service.d.ts.map +1 -1
  90. package/dest/logs/log_service.js +28 -32
  91. package/dest/messages/message_context_service.d.ts +17 -0
  92. package/dest/messages/message_context_service.d.ts.map +1 -0
  93. package/dest/messages/message_context_service.js +36 -0
  94. package/dest/notes/note_service.d.ts +9 -8
  95. package/dest/notes/note_service.d.ts.map +1 -1
  96. package/dest/notes/note_service.js +17 -16
  97. package/dest/notes_filter.d.ts +25 -0
  98. package/dest/notes_filter.d.ts.map +1 -0
  99. package/dest/notes_filter.js +4 -0
  100. package/dest/oracle_version.d.ts +3 -3
  101. package/dest/oracle_version.d.ts.map +1 -1
  102. package/dest/oracle_version.js +5 -4
  103. package/dest/private_kernel/hints/compute_tx_expiration_timestamp.d.ts +4 -0
  104. package/dest/private_kernel/hints/compute_tx_expiration_timestamp.d.ts.map +1 -0
  105. package/dest/private_kernel/hints/{compute_tx_include_by_timestamp.js → compute_tx_expiration_timestamp.js} +12 -12
  106. package/dest/private_kernel/hints/index.d.ts +1 -1
  107. package/dest/private_kernel/hints/index.js +1 -1
  108. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +4 -3
  109. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -1
  110. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.js +129 -68
  111. package/dest/private_kernel/hints/test_utils.d.ts +122 -0
  112. package/dest/private_kernel/hints/test_utils.d.ts.map +1 -0
  113. package/dest/private_kernel/hints/test_utils.js +203 -0
  114. package/dest/private_kernel/private_kernel_execution_prover.d.ts +3 -2
  115. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  116. package/dest/private_kernel/private_kernel_execution_prover.js +21 -13
  117. package/dest/private_kernel/private_kernel_oracle.d.ts +8 -4
  118. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  119. package/dest/private_kernel/private_kernel_oracle.js +7 -3
  120. package/dest/pxe.d.ts +74 -24
  121. package/dest/pxe.d.ts.map +1 -1
  122. package/dest/pxe.js +134 -80
  123. package/dest/storage/address_store/address_store.d.ts +1 -1
  124. package/dest/storage/address_store/address_store.d.ts.map +1 -1
  125. package/dest/storage/address_store/address_store.js +12 -11
  126. package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -1
  127. package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
  128. package/dest/storage/anchor_block_store/anchor_block_store.js +8 -1
  129. package/dest/storage/capsule_store/capsule_store.js +6 -8
  130. package/dest/storage/contract_store/contract_store.d.ts +42 -16
  131. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  132. package/dest/storage/contract_store/contract_store.js +157 -84
  133. package/dest/storage/metadata.d.ts +1 -1
  134. package/dest/storage/metadata.js +1 -1
  135. package/dest/storage/note_store/note_store.d.ts +47 -49
  136. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  137. package/dest/storage/note_store/note_store.js +278 -252
  138. package/dest/storage/note_store/stored_note.d.ts +16 -0
  139. package/dest/storage/note_store/stored_note.d.ts.map +1 -0
  140. package/dest/storage/note_store/stored_note.js +43 -0
  141. package/dest/storage/private_event_store/private_event_store.d.ts +17 -4
  142. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  143. package/dest/storage/private_event_store/private_event_store.js +198 -147
  144. package/dest/storage/private_event_store/stored_private_event.d.ts +23 -0
  145. package/dest/storage/private_event_store/stored_private_event.d.ts.map +1 -0
  146. package/dest/storage/private_event_store/stored_private_event.js +56 -0
  147. package/dest/storage/tagging_store/recipient_tagging_store.d.ts +6 -6
  148. package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
  149. package/dest/storage/tagging_store/recipient_tagging_store.js +31 -19
  150. package/dest/storage/tagging_store/sender_address_book_store.d.ts +1 -1
  151. package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +1 -1
  152. package/dest/storage/tagging_store/sender_address_book_store.js +20 -14
  153. package/dest/storage/tagging_store/sender_tagging_store.d.ts +29 -28
  154. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  155. package/dest/storage/tagging_store/sender_tagging_store.js +233 -137
  156. package/dest/tagging/get_all_logs_by_tags.d.ts +24 -0
  157. package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -0
  158. package/dest/tagging/get_all_logs_by_tags.js +60 -0
  159. package/dest/tagging/index.d.ts +4 -3
  160. package/dest/tagging/index.d.ts.map +1 -1
  161. package/dest/tagging/index.js +2 -1
  162. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +5 -5
  163. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +1 -1
  164. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +7 -7
  165. package/dest/tagging/recipient_sync/utils/find_highest_indexes.js +2 -2
  166. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +7 -7
  167. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +1 -1
  168. package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +16 -12
  169. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +5 -8
  170. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
  171. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +13 -7
  172. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +4 -3
  173. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
  174. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +23 -16
  175. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +6 -7
  176. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
  177. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +42 -27
  178. package/package.json +25 -16
  179. package/src/access_scopes.ts +9 -0
  180. package/src/bin/check_oracle_version.ts +1 -0
  181. package/src/block_synchronizer/block_synchronizer.ts +76 -33
  182. package/src/config/index.ts +15 -1
  183. package/src/config/package_info.ts +1 -1
  184. package/src/contract_function_simulator/contract_function_simulator.ts +361 -142
  185. package/src/contract_function_simulator/execution_tagging_index_cache.ts +19 -14
  186. package/src/contract_function_simulator/index.ts +1 -0
  187. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +9 -6
  188. package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +1 -4
  189. package/src/contract_function_simulator/noir-structs/message_tx_context.ts +55 -0
  190. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +4 -7
  191. package/src/contract_function_simulator/oracle/interfaces.ts +67 -58
  192. package/src/contract_function_simulator/oracle/legacy_oracle_mappings.ts +135 -0
  193. package/src/contract_function_simulator/oracle/oracle.ts +217 -149
  194. package/src/contract_function_simulator/oracle/private_execution.ts +5 -64
  195. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +150 -182
  196. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +330 -134
  197. package/src/contract_logging.ts +39 -0
  198. package/src/contract_sync/contract_sync_service.ts +181 -0
  199. package/src/contract_sync/helpers.ts +98 -0
  200. package/src/debug/pxe_debug_utils.ts +63 -18
  201. package/src/entrypoints/client/bundle/index.ts +3 -0
  202. package/src/entrypoints/client/bundle/utils.ts +16 -15
  203. package/src/entrypoints/client/lazy/index.ts +3 -0
  204. package/src/entrypoints/client/lazy/utils.ts +17 -15
  205. package/src/entrypoints/pxe_creation_options.ts +2 -1
  206. package/src/entrypoints/server/index.ts +3 -0
  207. package/src/entrypoints/server/utils.ts +22 -26
  208. package/src/events/event_service.ts +5 -7
  209. package/src/job_coordinator/job_coordinator.ts +4 -3
  210. package/src/logs/log_service.ts +48 -39
  211. package/src/messages/message_context_service.ts +45 -0
  212. package/src/notes/note_service.ts +24 -22
  213. package/src/notes_filter.ts +26 -0
  214. package/src/oracle_version.ts +5 -4
  215. package/src/private_kernel/hints/{compute_tx_include_by_timestamp.ts → compute_tx_expiration_timestamp.ts} +13 -13
  216. package/src/private_kernel/hints/index.ts +1 -1
  217. package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +164 -117
  218. package/src/private_kernel/hints/test_utils.ts +325 -0
  219. package/src/private_kernel/private_kernel_execution_prover.ts +25 -15
  220. package/src/private_kernel/private_kernel_oracle.ts +9 -9
  221. package/src/pxe.ts +261 -126
  222. package/src/storage/address_store/address_store.ts +15 -15
  223. package/src/storage/anchor_block_store/anchor_block_store.ts +8 -0
  224. package/src/storage/capsule_store/capsule_store.ts +8 -8
  225. package/src/storage/contract_store/contract_store.ts +186 -96
  226. package/src/storage/metadata.ts +1 -1
  227. package/src/storage/note_store/note_store.ts +321 -318
  228. package/src/storage/note_store/stored_note.ts +48 -0
  229. package/src/storage/private_event_store/private_event_store.ts +250 -190
  230. package/src/storage/private_event_store/stored_private_event.ts +73 -0
  231. package/src/storage/tagging_store/recipient_tagging_store.ts +38 -24
  232. package/src/storage/tagging_store/sender_address_book_store.ts +20 -14
  233. package/src/storage/tagging_store/sender_tagging_store.ts +287 -156
  234. package/src/tagging/get_all_logs_by_tags.ts +92 -0
  235. package/src/tagging/index.ts +3 -2
  236. package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +17 -10
  237. package/src/tagging/recipient_sync/utils/find_highest_indexes.ts +2 -2
  238. package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +17 -16
  239. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +25 -10
  240. package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +29 -26
  241. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +39 -29
  242. package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts +0 -4
  243. package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts.map +0 -1
  244. package/dest/tree_membership/tree_membership_service.d.ts +0 -50
  245. package/dest/tree_membership/tree_membership_service.d.ts.map +0 -1
  246. package/dest/tree_membership/tree_membership_service.js +0 -75
  247. package/src/tree_membership/tree_membership_service.ts +0 -97
@@ -2,22 +2,27 @@ import {
2
2
  AVM_EMITNOTEHASH_BASE_L2_GAS,
3
3
  AVM_EMITNULLIFIER_BASE_L2_GAS,
4
4
  AVM_SENDL2TOL1MSG_BASE_L2_GAS,
5
- DA_BYTES_PER_FIELD,
6
- DA_GAS_PER_BYTE,
5
+ DA_GAS_PER_FIELD,
7
6
  FIXED_AVM_STARTUP_L2_GAS,
8
- FIXED_DA_GAS,
9
- FIXED_L2_GAS,
10
7
  L2_GAS_PER_CONTRACT_CLASS_LOG,
8
+ L2_GAS_PER_L2_TO_L1_MSG,
9
+ L2_GAS_PER_NOTE_HASH,
10
+ L2_GAS_PER_NULLIFIER,
11
11
  L2_GAS_PER_PRIVATE_LOG,
12
12
  MAX_CONTRACT_CLASS_LOGS_PER_TX,
13
13
  MAX_ENQUEUED_CALLS_PER_TX,
14
14
  MAX_L2_TO_L1_MSGS_PER_TX,
15
15
  MAX_NOTE_HASHES_PER_TX,
16
+ MAX_NOTE_HASH_READ_REQUESTS_PER_TX,
16
17
  MAX_NULLIFIERS_PER_TX,
18
+ MAX_NULLIFIER_READ_REQUESTS_PER_TX,
17
19
  MAX_PRIVATE_LOGS_PER_TX,
20
+ MAX_TX_LIFETIME,
21
+ PRIVATE_TX_L2_GAS_OVERHEAD,
22
+ PUBLIC_TX_L2_GAS_OVERHEAD,
23
+ TX_DA_GAS_OVERHEAD,
18
24
  } from '@aztec/constants';
19
25
  import { arrayNonEmptyLength, padArrayEnd } from '@aztec/foundation/collection';
20
- import { poseidon2Hash } from '@aztec/foundation/crypto/poseidon';
21
26
  import { Fr } from '@aztec/foundation/curves/bn254';
22
27
  import { type Logger, createLogger } from '@aztec/foundation/log';
23
28
  import { Timer } from '@aztec/foundation/timer';
@@ -37,25 +42,36 @@ import type { FunctionCall } from '@aztec/stdlib/abi';
37
42
  import { FunctionSelector, FunctionType } from '@aztec/stdlib/abi';
38
43
  import type { AuthWitness } from '@aztec/stdlib/auth-witness';
39
44
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
45
+ import type { BlockParameter } from '@aztec/stdlib/block';
40
46
  import { Gas } from '@aztec/stdlib/gas';
41
47
  import {
42
48
  computeNoteHashNonce,
43
49
  computeProtocolNullifier,
50
+ computeSiloedPrivateLogFirstField,
44
51
  computeUniqueNoteHash,
45
52
  siloNoteHash,
46
53
  siloNullifier,
47
54
  } from '@aztec/stdlib/hash';
48
55
  import type { AztecNode } from '@aztec/stdlib/interfaces/server';
49
56
  import {
57
+ ClaimedLengthArray,
50
58
  PartialPrivateTailPublicInputsForPublic,
51
59
  PartialPrivateTailPublicInputsForRollup,
52
60
  type PrivateExecutionStep,
53
61
  type PrivateKernelExecutionProofOutput,
54
62
  PrivateKernelTailCircuitPublicInputs,
63
+ PrivateLogData,
55
64
  PrivateToPublicAccumulatedData,
56
65
  PrivateToRollupAccumulatedData,
57
66
  PublicCallRequest,
67
+ ReadRequestActionEnum,
58
68
  ScopedLogHash,
69
+ ScopedNoteHash,
70
+ ScopedNullifier,
71
+ ScopedReadRequest,
72
+ buildTransientDataHints,
73
+ getNoteHashReadRequestResetActions,
74
+ getNullifierReadRequestResetActions,
59
75
  } from '@aztec/stdlib/kernel';
60
76
  import { PrivateLog } from '@aztec/stdlib/logs';
61
77
  import { ScopedL2ToL1Message } from '@aztec/stdlib/messaging';
@@ -64,15 +80,19 @@ import {
64
80
  BlockHeader,
65
81
  CallContext,
66
82
  HashedValues,
83
+ type OffchainEffect,
67
84
  PrivateExecutionResult,
68
85
  TxConstantData,
69
86
  TxExecutionRequest,
70
87
  collectNested,
88
+ collectNoteHashNullifierCounterMap,
71
89
  getFinalMinRevertibleSideEffectCounter,
72
90
  } from '@aztec/stdlib/tx';
73
91
 
92
+ import type { AccessScopes } from '../access_scopes.js';
93
+ import type { ContractSyncService } from '../contract_sync/contract_sync_service.js';
94
+ import type { MessageContextService } from '../messages/message_context_service.js';
74
95
  import type { AddressStore } from '../storage/address_store/address_store.js';
75
- import type { AnchorBlockStore } from '../storage/anchor_block_store/anchor_block_store.js';
76
96
  import type { CapsuleStore } from '../storage/capsule_store/capsule_store.js';
77
97
  import type { ContractStore } from '../storage/contract_store/contract_store.js';
78
98
  import type { NoteStore } from '../storage/note_store/note_store.js';
@@ -85,65 +105,99 @@ import { ExecutionNoteCache } from './execution_note_cache.js';
85
105
  import { ExecutionTaggingIndexCache } from './execution_tagging_index_cache.js';
86
106
  import { HashedValuesCache } from './hashed_values_cache.js';
87
107
  import { Oracle } from './oracle/oracle.js';
88
- import { executePrivateFunction, verifyCurrentClassId } from './oracle/private_execution.js';
108
+ import { executePrivateFunction } from './oracle/private_execution.js';
89
109
  import { PrivateExecutionOracle } from './oracle/private_execution_oracle.js';
90
110
  import { UtilityExecutionOracle } from './oracle/utility_execution_oracle.js';
91
111
 
112
+ /** Options for ContractFunctionSimulator.run. */
113
+ export type ContractSimulatorRunOpts = {
114
+ /** The address of the contract (should match request.origin). */
115
+ contractAddress: AztecAddress;
116
+ /** The function selector of the entry point. */
117
+ selector: FunctionSelector;
118
+ /** The address calling the function. Can be replaced to simulate a call from another contract or account. */
119
+ msgSender?: AztecAddress;
120
+ /** The block header to use as base state for this run. */
121
+ anchorBlockHeader: BlockHeader;
122
+ /** The address used as a tagging sender when emitting private logs. */
123
+ senderForTags?: AztecAddress;
124
+ /** The accounts whose notes we can access in this call. */
125
+ scopes: AccessScopes;
126
+ /** The job ID for staged writes. */
127
+ jobId: string;
128
+ };
129
+
130
+ /** Args for ContractFunctionSimulator constructor. */
131
+ export type ContractFunctionSimulatorArgs = {
132
+ contractStore: ContractStore;
133
+ noteStore: NoteStore;
134
+ keyStore: KeyStore;
135
+ addressStore: AddressStore;
136
+ aztecNode: AztecNode;
137
+ senderTaggingStore: SenderTaggingStore;
138
+ recipientTaggingStore: RecipientTaggingStore;
139
+ senderAddressBookStore: SenderAddressBookStore;
140
+ capsuleStore: CapsuleStore;
141
+ privateEventStore: PrivateEventStore;
142
+ simulator: CircuitSimulator;
143
+ contractSyncService: ContractSyncService;
144
+ messageContextService: MessageContextService;
145
+ };
146
+
92
147
  /**
93
148
  * The contract function simulator.
94
149
  */
95
150
  export class ContractFunctionSimulator {
96
- private log: Logger;
97
-
98
- constructor(
99
- private contractStore: ContractStore,
100
- private noteStore: NoteStore,
101
- private keyStore: KeyStore,
102
- private addressStore: AddressStore,
103
- private aztecNode: AztecNode,
104
- private anchorBlockStore: AnchorBlockStore,
105
- private senderTaggingStore: SenderTaggingStore,
106
- private recipientTaggingStore: RecipientTaggingStore,
107
- private senderAddressBookStore: SenderAddressBookStore,
108
- private capsuleStore: CapsuleStore,
109
- private privateEventStore: PrivateEventStore,
110
- private simulator: CircuitSimulator,
111
- ) {
151
+ private readonly log: Logger;
152
+ private readonly contractStore: ContractStore;
153
+ private readonly noteStore: NoteStore;
154
+ private readonly keyStore: KeyStore;
155
+ private readonly addressStore: AddressStore;
156
+ private readonly aztecNode: AztecNode;
157
+ private readonly senderTaggingStore: SenderTaggingStore;
158
+ private readonly recipientTaggingStore: RecipientTaggingStore;
159
+ private readonly senderAddressBookStore: SenderAddressBookStore;
160
+ private readonly capsuleStore: CapsuleStore;
161
+ private readonly privateEventStore: PrivateEventStore;
162
+ private readonly simulator: CircuitSimulator;
163
+ private readonly contractSyncService: ContractSyncService;
164
+ private readonly messageContextService: MessageContextService;
165
+
166
+ constructor(args: ContractFunctionSimulatorArgs) {
167
+ this.contractStore = args.contractStore;
168
+ this.noteStore = args.noteStore;
169
+ this.keyStore = args.keyStore;
170
+ this.addressStore = args.addressStore;
171
+ this.aztecNode = args.aztecNode;
172
+ this.senderTaggingStore = args.senderTaggingStore;
173
+ this.recipientTaggingStore = args.recipientTaggingStore;
174
+ this.senderAddressBookStore = args.senderAddressBookStore;
175
+ this.capsuleStore = args.capsuleStore;
176
+ this.privateEventStore = args.privateEventStore;
177
+ this.simulator = args.simulator;
178
+ this.contractSyncService = args.contractSyncService;
179
+ this.messageContextService = args.messageContextService;
112
180
  this.log = createLogger('simulator');
113
181
  }
114
182
 
115
183
  /**
116
184
  * Runs a private function.
117
185
  * @param request - The transaction request.
118
- * @param entryPointArtifact - The artifact of the entry point function.
119
- * @param contractAddress - The address of the contract (should match request.origin)
120
- * @param msgSender - The address calling the function. This can be replaced to simulate a call from another contract
121
- * or a specific account.
122
- * @param anchorBlockHeader - The block header to use as base state for this run.
123
- * @param senderForTags - The address that is used as a tagging sender when emitting private logs. Returned from
124
- * the `privateGetSenderForTags` oracle.
125
- * @param scopes - The accounts whose notes we can access in this call. Currently optional and will default to all.
126
- * @param jobId - The job ID for staged writes.
127
- * @returns The result of the execution.
128
186
  */
129
187
  public async run(
130
188
  request: TxExecutionRequest,
131
- contractAddress: AztecAddress,
132
- selector: FunctionSelector,
133
- msgSender = AztecAddress.fromField(Fr.MAX_FIELD_VALUE),
134
- anchorBlockHeader: BlockHeader,
135
- senderForTags: AztecAddress | undefined,
136
- scopes: AztecAddress[] | undefined,
137
- jobId: string,
189
+ {
190
+ contractAddress,
191
+ selector,
192
+ msgSender = AztecAddress.fromField(Fr.MAX_FIELD_VALUE),
193
+ anchorBlockHeader,
194
+ senderForTags,
195
+ scopes,
196
+ jobId,
197
+ }: ContractSimulatorRunOpts,
138
198
  ): Promise<PrivateExecutionResult> {
139
199
  const simulatorSetupTimer = new Timer();
140
200
 
141
- await this.contractStore.syncPrivateState(contractAddress, selector, privateSyncCall =>
142
- this.runUtility(privateSyncCall, [], anchorBlockHeader, scopes, jobId),
143
- );
144
-
145
- await verifyCurrentClassId(contractAddress, this.aztecNode, this.contractStore, anchorBlockHeader);
146
-
147
201
  const entryPointArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(contractAddress, selector);
148
202
 
149
203
  if (entryPointArtifact.functionType !== FunctionType.PRIVATE) {
@@ -170,38 +224,38 @@ export class ContractFunctionSimulator {
170
224
  const noteCache = new ExecutionNoteCache(protocolNullifier);
171
225
  const taggingIndexCache = new ExecutionTaggingIndexCache();
172
226
 
173
- const privateExecutionOracle = new PrivateExecutionOracle(
174
- request.firstCallArgsHash,
175
- request.txContext,
227
+ const privateExecutionOracle = new PrivateExecutionOracle({
228
+ argsHash: request.firstCallArgsHash,
229
+ txContext: request.txContext,
176
230
  callContext,
177
231
  anchorBlockHeader,
178
- async call => {
179
- await this.runUtility(call, [], anchorBlockHeader, scopes, jobId);
232
+ utilityExecutor: async (call, execScopes) => {
233
+ await this.runUtility(call, [], anchorBlockHeader, execScopes, jobId);
180
234
  },
181
- request.authWitnesses,
182
- request.capsules,
183
- HashedValuesCache.create(request.argsOfCalls),
235
+ authWitnesses: request.authWitnesses,
236
+ capsules: request.capsules,
237
+ executionCache: HashedValuesCache.create(request.argsOfCalls),
184
238
  noteCache,
185
239
  taggingIndexCache,
186
- this.contractStore,
187
- this.noteStore,
188
- this.keyStore,
189
- this.addressStore,
190
- this.aztecNode,
191
- this.anchorBlockStore,
192
- this.senderTaggingStore,
193
- this.recipientTaggingStore,
194
- this.senderAddressBookStore,
195
- this.capsuleStore,
196
- this.privateEventStore,
240
+ contractStore: this.contractStore,
241
+ noteStore: this.noteStore,
242
+ keyStore: this.keyStore,
243
+ addressStore: this.addressStore,
244
+ aztecNode: this.aztecNode,
245
+ senderTaggingStore: this.senderTaggingStore,
246
+ recipientTaggingStore: this.recipientTaggingStore,
247
+ senderAddressBookStore: this.senderAddressBookStore,
248
+ capsuleStore: this.capsuleStore,
249
+ privateEventStore: this.privateEventStore,
250
+ messageContextService: this.messageContextService,
251
+ contractSyncService: this.contractSyncService,
197
252
  jobId,
198
- 0, // totalPublicArgsCount
199
- startSideEffectCounter,
200
- undefined, // log
253
+ totalPublicCalldataCount: 0,
254
+ sideEffectCounter: startSideEffectCounter,
201
255
  scopes,
202
256
  senderForTags,
203
- this.simulator,
204
- );
257
+ simulator: this.simulator,
258
+ });
205
259
 
206
260
  const setupTime = simulatorSetupTimer.ms();
207
261
 
@@ -230,7 +284,7 @@ export class ContractFunctionSimulator {
230
284
  );
231
285
  const publicFunctionsCalldata = await Promise.all(
232
286
  publicCallRequests.map(async r => {
233
- const calldata = await privateExecutionOracle.privateLoadFromExecutionCache(r.calldataHash);
287
+ const calldata = await privateExecutionOracle.loadFromExecutionCache(r.calldataHash);
234
288
  return new HashedValues(calldata, r.calldataHash);
235
289
  }),
236
290
  );
@@ -265,36 +319,34 @@ export class ContractFunctionSimulator {
265
319
  call: FunctionCall,
266
320
  authwits: AuthWitness[],
267
321
  anchorBlockHeader: BlockHeader,
268
- scopes: AztecAddress[] | undefined,
322
+ scopes: AccessScopes,
269
323
  jobId: string,
270
- ): Promise<Fr[]> {
271
- await verifyCurrentClassId(call.to, this.aztecNode, this.contractStore, anchorBlockHeader);
272
-
324
+ ): Promise<{ result: Fr[]; offchainEffects: OffchainEffect[] }> {
273
325
  const entryPointArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(call.to, call.selector);
274
326
 
275
327
  if (entryPointArtifact.functionType !== FunctionType.UTILITY) {
276
328
  throw new Error(`Cannot run ${entryPointArtifact.functionType} function as utility`);
277
329
  }
278
330
 
279
- const oracle = new UtilityExecutionOracle(
280
- call.to,
281
- authwits,
282
- [],
331
+ const oracle = new UtilityExecutionOracle({
332
+ contractAddress: call.to,
333
+ authWitnesses: authwits,
334
+ capsules: [],
283
335
  anchorBlockHeader,
284
- this.contractStore,
285
- this.noteStore,
286
- this.keyStore,
287
- this.addressStore,
288
- this.aztecNode,
289
- this.anchorBlockStore,
290
- this.recipientTaggingStore,
291
- this.senderAddressBookStore,
292
- this.capsuleStore,
293
- this.privateEventStore,
336
+ contractStore: this.contractStore,
337
+ noteStore: this.noteStore,
338
+ keyStore: this.keyStore,
339
+ addressStore: this.addressStore,
340
+ aztecNode: this.aztecNode,
341
+ recipientTaggingStore: this.recipientTaggingStore,
342
+ senderAddressBookStore: this.senderAddressBookStore,
343
+ capsuleStore: this.capsuleStore,
344
+ privateEventStore: this.privateEventStore,
345
+ messageContextService: this.messageContextService,
346
+ contractSyncService: this.contractSyncService,
294
347
  jobId,
295
- undefined,
296
348
  scopes,
297
- );
349
+ });
298
350
 
299
351
  try {
300
352
  this.log.verbose(`Executing utility function ${entryPointArtifact.name}`, {
@@ -318,8 +370,11 @@ export class ContractFunctionSimulator {
318
370
  );
319
371
  });
320
372
 
321
- this.log.verbose(`Utility simulation for ${call.to}.${call.selector} completed`);
322
- return witnessMapToFields(acirExecutionResult.returnWitness);
373
+ this.log.verbose(`Utility execution for ${call.to}.${call.selector} completed`);
374
+ return {
375
+ result: witnessMapToFields(acirExecutionResult.returnWitness),
376
+ offchainEffects: oracle.getOffchainEffects(),
377
+ };
323
378
  } catch (err) {
324
379
  throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during private execution'));
325
380
  }
@@ -360,63 +415,82 @@ class OrderedSideEffect<T> {
360
415
  * (allowing state overrides) and is much faster, while still generating a valid
361
416
  * output that can be sent to the node for public simulation
362
417
  * @param privateExecutionResult - The result of the private execution.
363
- * @param contractStore - A provider for contract data in order to get function names and debug info.
418
+ * @param debugFunctionNameGetter - A provider for contract data in order to get function names and debug info.
419
+ * @param node - AztecNode for verifying settled read requests against the note hash and nullifier trees.
364
420
  * @param minRevertibleSideEffectCounterOverride - Optional override for the min revertible side effect counter.
365
421
  * Used by TXE to simulate account contract behavior (setting the counter before app execution).
366
422
  * @returns The simulated proving result.
367
423
  */
368
424
  export async function generateSimulatedProvingResult(
369
425
  privateExecutionResult: PrivateExecutionResult,
370
- contractStore: ContractStore,
426
+ debugFunctionNameGetter: (contractAddress: AztecAddress, functionSelector: FunctionSelector) => Promise<string>,
427
+ node: AztecNode,
371
428
  minRevertibleSideEffectCounterOverride?: number,
372
429
  ): Promise<PrivateKernelExecutionProofOutput<PrivateKernelTailCircuitPublicInputs>> {
373
- const siloedNoteHashes: OrderedSideEffect<Fr>[] = [];
374
- const nullifiers: OrderedSideEffect<Fr>[] = [];
375
- const taggedPrivateLogs: OrderedSideEffect<PrivateLog>[] = [];
430
+ const taggedPrivateLogs: OrderedSideEffect<PrivateLogData>[] = [];
376
431
  const l2ToL1Messages: OrderedSideEffect<ScopedL2ToL1Message>[] = [];
377
432
  const contractClassLogsHashes: OrderedSideEffect<ScopedLogHash>[] = [];
378
433
  const publicCallRequests: OrderedSideEffect<PublicCallRequest>[] = [];
379
434
  const executionSteps: PrivateExecutionStep[] = [];
380
435
 
436
+ // Unsiloed scoped arrays — used for squashing, read request verification,
437
+ // and siloed at the end only for the surviving items
438
+ const scopedNoteHashes: ScopedNoteHash[] = [];
439
+ const scopedNullifiers: ScopedNullifier[] = [];
440
+
441
+ // Read requests for verification
442
+ const noteHashReadRequests: ScopedReadRequest[] = [];
443
+ const nullifierReadRequests: ScopedReadRequest[] = [];
444
+
381
445
  let publicTeardownCallRequest;
382
446
 
447
+ // We set expiration timestamp to anchor_block_timestamp + MAX_TX_LIFETIME (24h) just like kernels do
448
+ let expirationTimestamp =
449
+ privateExecutionResult.entrypoint.publicInputs.anchorBlockHeader.globalVariables.timestamp +
450
+ BigInt(MAX_TX_LIFETIME);
451
+
452
+ let feePayer = AztecAddress.zero();
453
+
383
454
  const executions = [privateExecutionResult.entrypoint];
384
455
 
385
456
  while (executions.length !== 0) {
386
457
  const execution = executions.shift()!;
387
458
  executions.unshift(...execution!.nestedExecutionResults);
388
459
 
460
+ // Just like kernels we overwrite the default value if the call sets it.
461
+ const callExpirationTimestamp = execution.publicInputs.expirationTimestamp;
462
+ if (callExpirationTimestamp !== 0n && callExpirationTimestamp < expirationTimestamp) {
463
+ expirationTimestamp = callExpirationTimestamp;
464
+ }
465
+
389
466
  const { contractAddress } = execution.publicInputs.callContext;
390
467
 
391
- const noteHashesFromExecution = await Promise.all(
392
- execution.publicInputs.noteHashes
393
- .getActiveItems()
394
- .filter(noteHash => !noteHash.isEmpty())
395
- .map(
396
- async noteHash =>
397
- new OrderedSideEffect(await siloNoteHash(contractAddress, noteHash.value), noteHash.counter),
398
- ),
399
- );
468
+ if (execution.publicInputs.isFeePayer) {
469
+ if (!feePayer.isZero()) {
470
+ throw new Error('Multiple fee payers found in private execution result');
471
+ }
472
+ feePayer = contractAddress;
473
+ }
400
474
 
401
- const nullifiersFromExecution = await Promise.all(
402
- execution.publicInputs.nullifiers
475
+ scopedNoteHashes.push(
476
+ ...execution.publicInputs.noteHashes
403
477
  .getActiveItems()
404
- .map(
405
- async nullifier =>
406
- new OrderedSideEffect(await siloNullifier(contractAddress, nullifier.value), nullifier.counter),
407
- ),
478
+ .filter(nh => !nh.isEmpty())
479
+ .map(nh => nh.scope(contractAddress)),
408
480
  );
481
+ scopedNullifiers.push(...execution.publicInputs.nullifiers.getActiveItems().map(n => n.scope(contractAddress)));
409
482
 
410
- const privateLogsFromExecution = await Promise.all(
411
- execution.publicInputs.privateLogs.getActiveItems().map(async metadata => {
412
- metadata.log.fields[0] = await poseidon2Hash([contractAddress, metadata.log.fields[0]]);
413
- return new OrderedSideEffect(metadata.log, metadata.counter);
414
- }),
483
+ taggedPrivateLogs.push(
484
+ ...(await Promise.all(
485
+ execution.publicInputs.privateLogs.getActiveItems().map(async metadata => {
486
+ metadata.log.fields[0] = await computeSiloedPrivateLogFirstField(contractAddress, metadata.log.fields[0]);
487
+ return new OrderedSideEffect(metadata, metadata.counter);
488
+ }),
489
+ )),
415
490
  );
416
491
 
417
- siloedNoteHashes.push(...noteHashesFromExecution);
418
- taggedPrivateLogs.push(...privateLogsFromExecution);
419
- nullifiers.push(...nullifiersFromExecution);
492
+ noteHashReadRequests.push(...execution.publicInputs.noteHashReadRequests.getActiveItems());
493
+ nullifierReadRequests.push(...execution.publicInputs.nullifierReadRequests.getActiveItems());
420
494
  l2ToL1Messages.push(
421
495
  ...execution.publicInputs.l2ToL1Msgs
422
496
  .getActiveItems()
@@ -445,7 +519,7 @@ export async function generateSimulatedProvingResult(
445
519
  : execution.publicInputs.publicTeardownCallRequest;
446
520
 
447
521
  executionSteps.push({
448
- functionName: await contractStore.getDebugFunctionName(
522
+ functionName: await debugFunctionNameGetter(
449
523
  execution.publicInputs.callContext.contractAddress,
450
524
  execution.publicInputs.callContext.functionSelector,
451
525
  ),
@@ -456,6 +530,47 @@ export async function generateSimulatedProvingResult(
456
530
  });
457
531
  }
458
532
 
533
+ const noteHashNullifierCounterMap = collectNoteHashNullifierCounterMap(privateExecutionResult);
534
+ const minRevertibleSideEffectCounter =
535
+ minRevertibleSideEffectCounterOverride ?? getFinalMinRevertibleSideEffectCounter(privateExecutionResult);
536
+
537
+ const scopedNoteHashesCLA = new ClaimedLengthArray<ScopedNoteHash, typeof MAX_NOTE_HASHES_PER_TX>(
538
+ padArrayEnd(scopedNoteHashes, ScopedNoteHash.empty(), MAX_NOTE_HASHES_PER_TX),
539
+ scopedNoteHashes.length,
540
+ );
541
+ const scopedNullifiersCLA = new ClaimedLengthArray<ScopedNullifier, typeof MAX_NULLIFIERS_PER_TX>(
542
+ padArrayEnd(scopedNullifiers, ScopedNullifier.empty(), MAX_NULLIFIERS_PER_TX),
543
+ scopedNullifiers.length,
544
+ );
545
+
546
+ const { filteredNoteHashes, filteredNullifiers, filteredPrivateLogs } = squashTransientSideEffects(
547
+ taggedPrivateLogs,
548
+ scopedNoteHashesCLA,
549
+ scopedNullifiersCLA,
550
+ noteHashNullifierCounterMap,
551
+ minRevertibleSideEffectCounter,
552
+ );
553
+
554
+ await verifyReadRequests(
555
+ node,
556
+ await privateExecutionResult.entrypoint.publicInputs.anchorBlockHeader.hash(),
557
+ noteHashReadRequests,
558
+ nullifierReadRequests,
559
+ scopedNoteHashesCLA,
560
+ scopedNullifiersCLA,
561
+ );
562
+
563
+ const siloedNoteHashes = await Promise.all(
564
+ filteredNoteHashes
565
+ .sort((a, b) => a.counter - b.counter)
566
+ .map(async nh => new OrderedSideEffect(await siloNoteHash(nh.contractAddress, nh.value), nh.counter)),
567
+ );
568
+ const siloedNullifiers = await Promise.all(
569
+ filteredNullifiers
570
+ .sort((a, b) => a.counter - b.counter)
571
+ .map(async n => new OrderedSideEffect(await siloNullifier(n.contractAddress, n.value), n.counter)),
572
+ );
573
+
459
574
  const constantData = new TxConstantData(
460
575
  privateExecutionResult.entrypoint.publicInputs.anchorBlockHeader,
461
576
  privateExecutionResult.entrypoint.publicInputs.txContext,
@@ -472,11 +587,9 @@ export async function generateSimulatedProvingResult(
472
587
  const getEffect = <T>(orderedSideEffect: OrderedSideEffect<T>) => orderedSideEffect.sideEffect;
473
588
 
474
589
  const isPrivateOnlyTx = privateExecutionResult.publicFunctionCalldata.length === 0;
475
- const minRevertibleSideEffectCounter =
476
- minRevertibleSideEffectCounterOverride ?? getFinalMinRevertibleSideEffectCounter(privateExecutionResult);
477
590
 
478
591
  const [nonRevertibleNullifiers, revertibleNullifiers] = splitOrderedSideEffects(
479
- nullifiers.sort(sortByCounter),
592
+ siloedNullifiers,
480
593
  minRevertibleSideEffectCounter,
481
594
  );
482
595
  const nonceGenerator = privateExecutionResult.firstNullifier;
@@ -490,7 +603,7 @@ export async function generateSimulatedProvingResult(
490
603
  // We must make the note hashes unique by using the
491
604
  // nonce generator and their index in the tx.
492
605
  const uniqueNoteHashes = await Promise.all(
493
- siloedNoteHashes.sort(sortByCounter).map(async (orderedSideEffect, i) => {
606
+ siloedNoteHashes.map(async (orderedSideEffect, i) => {
494
607
  const siloedNoteHash = orderedSideEffect.sideEffect;
495
608
  const nonce = await computeNoteHashNonce(nonceGenerator, i);
496
609
  const uniqueNoteHash = await computeUniqueNoteHash(nonce, siloedNoteHash);
@@ -505,18 +618,18 @@ export async function generateSimulatedProvingResult(
505
618
  ScopedL2ToL1Message.empty(),
506
619
  MAX_L2_TO_L1_MSGS_PER_TX,
507
620
  ),
508
- padArrayEnd(taggedPrivateLogs.sort(sortByCounter).map(getEffect), PrivateLog.empty(), MAX_PRIVATE_LOGS_PER_TX),
621
+ padArrayEnd(filteredPrivateLogs.sort(sortByCounter).map(getEffect), PrivateLog.empty(), MAX_PRIVATE_LOGS_PER_TX),
509
622
  padArrayEnd(
510
623
  contractClassLogsHashes.sort(sortByCounter).map(getEffect),
511
624
  ScopedLogHash.empty(),
512
625
  MAX_CONTRACT_CLASS_LOGS_PER_TX,
513
626
  ),
514
627
  );
515
- gasUsed = meterGasUsed(accumulatedDataForRollup);
628
+ gasUsed = meterGasUsed(accumulatedDataForRollup, isPrivateOnlyTx);
516
629
  inputsForRollup = new PartialPrivateTailPublicInputsForRollup(accumulatedDataForRollup);
517
630
  } else {
518
631
  const [nonRevertibleNoteHashes, revertibleNoteHashes] = splitOrderedSideEffects(
519
- siloedNoteHashes.sort(sortByCounter),
632
+ siloedNoteHashes,
520
633
  minRevertibleSideEffectCounter,
521
634
  );
522
635
  const nonRevertibleUniqueNoteHashes = await Promise.all(
@@ -530,7 +643,7 @@ export async function generateSimulatedProvingResult(
530
643
  minRevertibleSideEffectCounter,
531
644
  );
532
645
  const [nonRevertibleTaggedPrivateLogs, revertibleTaggedPrivateLogs] = splitOrderedSideEffects(
533
- taggedPrivateLogs,
646
+ filteredPrivateLogs,
534
647
  minRevertibleSideEffectCounter,
535
648
  );
536
649
  const [nonRevertibleContractClassLogHashes, revertibleContractClassLogHashes] = splitOrderedSideEffects(
@@ -559,9 +672,9 @@ export async function generateSimulatedProvingResult(
559
672
  padArrayEnd(revertibleContractClassLogHashes, ScopedLogHash.empty(), MAX_CONTRACT_CLASS_LOGS_PER_TX),
560
673
  padArrayEnd(revertiblePublicCallRequests, PublicCallRequest.empty(), MAX_ENQUEUED_CALLS_PER_TX),
561
674
  );
562
- gasUsed = meterGasUsed(revertibleData).add(meterGasUsed(nonRevertibleData));
675
+ gasUsed = meterGasUsed(revertibleData, isPrivateOnlyTx).add(meterGasUsed(nonRevertibleData, isPrivateOnlyTx));
563
676
  if (publicTeardownCallRequest) {
564
- gasUsed.add(privateExecutionResult.entrypoint.publicInputs.txContext.gasSettings.teardownGasLimits);
677
+ gasUsed = gasUsed.add(privateExecutionResult.entrypoint.publicInputs.txContext.gasSettings.teardownGasLimits);
565
678
  }
566
679
 
567
680
  inputsForPublic = new PartialPrivateTailPublicInputsForPublic(
@@ -573,9 +686,14 @@ export async function generateSimulatedProvingResult(
573
686
 
574
687
  const publicInputs = new PrivateKernelTailCircuitPublicInputs(
575
688
  constantData,
576
- /*gasUsed=*/ gasUsed.add(Gas.from({ l2Gas: FIXED_L2_GAS, daGas: FIXED_DA_GAS })),
577
- /*feePayer=*/ AztecAddress.zero(),
578
- /*includeByTimestamp=*/ 0n,
689
+ /*gasUsed=*/ gasUsed.add(
690
+ Gas.from({
691
+ l2Gas: isPrivateOnlyTx ? PRIVATE_TX_L2_GAS_OVERHEAD : PUBLIC_TX_L2_GAS_OVERHEAD,
692
+ daGas: TX_DA_GAS_OVERHEAD,
693
+ }),
694
+ ),
695
+ /*feePayer=*/ feePayer,
696
+ /*expirationTimestamp=*/ expirationTimestamp,
579
697
  hasPublicCalls ? inputsForPublic : undefined,
580
698
  !hasPublicCalls ? inputsForRollup : undefined,
581
699
  );
@@ -587,6 +705,104 @@ export async function generateSimulatedProvingResult(
587
705
  };
588
706
  }
589
707
 
708
+ /**
709
+ * Squashes transient note hashes and nullifiers, mimicking the behavior
710
+ * of the reset kernels. Returns the filtered (surviving) scoped items and private logs.
711
+ */
712
+ function squashTransientSideEffects(
713
+ taggedPrivateLogs: OrderedSideEffect<PrivateLogData>[],
714
+ scopedNoteHashesCLA: ClaimedLengthArray<ScopedNoteHash, typeof MAX_NOTE_HASHES_PER_TX>,
715
+ scopedNullifiersCLA: ClaimedLengthArray<ScopedNullifier, typeof MAX_NULLIFIERS_PER_TX>,
716
+ noteHashNullifierCounterMap: Map<number, number>,
717
+ minRevertibleSideEffectCounter: number,
718
+ ) {
719
+ const { numTransientData, hints: transientDataHints } = buildTransientDataHints(
720
+ scopedNoteHashesCLA,
721
+ scopedNullifiersCLA,
722
+ /*futureNoteHashReads=*/ [],
723
+ /*futureNullifierReads=*/ [],
724
+ /*futureLogs=*/ [],
725
+ noteHashNullifierCounterMap,
726
+ minRevertibleSideEffectCounter,
727
+ );
728
+
729
+ const squashedNoteHashCounters = new Set<number>();
730
+ const squashedNullifierCounters = new Set<number>();
731
+ for (let i = 0; i < numTransientData; i++) {
732
+ const hint = transientDataHints[i];
733
+ squashedNoteHashCounters.add(scopedNoteHashesCLA.array[hint.noteHashIndex].counter);
734
+ squashedNullifierCounters.add(scopedNullifiersCLA.array[hint.nullifierIndex].counter);
735
+ }
736
+
737
+ return {
738
+ filteredNoteHashes: scopedNoteHashesCLA.getActiveItems().filter(nh => !squashedNoteHashCounters.has(nh.counter)),
739
+ filteredNullifiers: scopedNullifiersCLA.getActiveItems().filter(n => !squashedNullifierCounters.has(n.counter)),
740
+ filteredPrivateLogs: taggedPrivateLogs
741
+ .filter(item => !squashedNoteHashCounters.has(item.sideEffect.noteHashCounter))
742
+ .map(item => new OrderedSideEffect(item.sideEffect.log, item.counter)),
743
+ };
744
+ }
745
+
746
+ /**
747
+ * Verifies settled read requests by checking membership in the note hash and nullifier trees
748
+ * at the tx's anchor block, mimicking the behavior of the kernels
749
+ */
750
+ async function verifyReadRequests(
751
+ node: Pick<AztecNode, 'getNoteHashMembershipWitness' | 'getNullifierMembershipWitness'>,
752
+ anchorBlockHash: BlockParameter,
753
+ noteHashReadRequests: ScopedReadRequest[],
754
+ nullifierReadRequests: ScopedReadRequest[],
755
+ scopedNoteHashesCLA: ClaimedLengthArray<ScopedNoteHash, typeof MAX_NOTE_HASHES_PER_TX>,
756
+ scopedNullifiersCLA: ClaimedLengthArray<ScopedNullifier, typeof MAX_NULLIFIERS_PER_TX>,
757
+ ) {
758
+ const noteHashReadRequestsCLA = new ClaimedLengthArray<ScopedReadRequest, typeof MAX_NOTE_HASH_READ_REQUESTS_PER_TX>(
759
+ padArrayEnd(noteHashReadRequests, ScopedReadRequest.empty(), MAX_NOTE_HASH_READ_REQUESTS_PER_TX),
760
+ noteHashReadRequests.length,
761
+ );
762
+ const nullifierReadRequestsCLA = new ClaimedLengthArray<ScopedReadRequest, typeof MAX_NULLIFIER_READ_REQUESTS_PER_TX>(
763
+ padArrayEnd(nullifierReadRequests, ScopedReadRequest.empty(), MAX_NULLIFIER_READ_REQUESTS_PER_TX),
764
+ nullifierReadRequests.length,
765
+ );
766
+
767
+ const noteHashResetActions = getNoteHashReadRequestResetActions(noteHashReadRequestsCLA, scopedNoteHashesCLA);
768
+ const nullifierResetActions = getNullifierReadRequestResetActions(nullifierReadRequestsCLA, scopedNullifiersCLA);
769
+
770
+ const settledNoteHashReads: { index: number; value: Fr }[] = [];
771
+ for (let i = 0; i < noteHashResetActions.actions.length; i++) {
772
+ if (noteHashResetActions.actions[i] === ReadRequestActionEnum.READ_AS_SETTLED) {
773
+ settledNoteHashReads.push({ index: i, value: noteHashReadRequests[i].value });
774
+ }
775
+ }
776
+
777
+ const settledNullifierReads: { index: number; value: Fr }[] = [];
778
+ for (let i = 0; i < nullifierResetActions.actions.length; i++) {
779
+ if (nullifierResetActions.actions[i] === ReadRequestActionEnum.READ_AS_SETTLED) {
780
+ settledNullifierReads.push({ index: i, value: nullifierReadRequests[i].value });
781
+ }
782
+ }
783
+
784
+ const [noteHashWitnesses, nullifierWitnesses] = await Promise.all([
785
+ Promise.all(settledNoteHashReads.map(({ value }) => node.getNoteHashMembershipWitness(anchorBlockHash, value))),
786
+ Promise.all(settledNullifierReads.map(({ value }) => node.getNullifierMembershipWitness(anchorBlockHash, value))),
787
+ ]);
788
+
789
+ for (let i = 0; i < settledNoteHashReads.length; i++) {
790
+ if (!noteHashWitnesses[i]) {
791
+ throw new Error(
792
+ `Note hash read request at index ${settledNoteHashReads[i].index} is reading an unknown note hash: ${settledNoteHashReads[i].value}`,
793
+ );
794
+ }
795
+ }
796
+
797
+ for (let i = 0; i < settledNullifierReads.length; i++) {
798
+ if (!nullifierWitnesses[i]) {
799
+ throw new Error(
800
+ `Nullifier read request at index ${settledNullifierReads[i].index} is reading an unknown nullifier: ${settledNullifierReads[i].value}`,
801
+ );
802
+ }
803
+ }
804
+ }
805
+
590
806
  function splitOrderedSideEffects<T>(effects: OrderedSideEffect<T>[], minRevertibleSideEffectCounter: number) {
591
807
  const revertibleSideEffects: T[] = [];
592
808
  const nonRevertibleSideEffects: T[] = [];
@@ -600,21 +816,24 @@ function splitOrderedSideEffects<T>(effects: OrderedSideEffect<T>[], minRevertib
600
816
  return [nonRevertibleSideEffects, revertibleSideEffects];
601
817
  }
602
818
 
603
- function meterGasUsed(data: PrivateToRollupAccumulatedData | PrivateToPublicAccumulatedData) {
819
+ function meterGasUsed(data: PrivateToRollupAccumulatedData | PrivateToPublicAccumulatedData, isPrivateOnlyTx: boolean) {
604
820
  let meteredDAFields = 0;
605
821
  let meteredL2Gas = 0;
606
822
 
607
823
  const numNoteHashes = arrayNonEmptyLength(data.noteHashes, hash => hash.isEmpty());
608
824
  meteredDAFields += numNoteHashes;
609
- meteredL2Gas += numNoteHashes * AVM_EMITNOTEHASH_BASE_L2_GAS;
825
+ const noteHashBaseGas = isPrivateOnlyTx ? L2_GAS_PER_NOTE_HASH : AVM_EMITNOTEHASH_BASE_L2_GAS;
826
+ meteredL2Gas += numNoteHashes * noteHashBaseGas;
610
827
 
611
828
  const numNullifiers = arrayNonEmptyLength(data.nullifiers, nullifier => nullifier.isEmpty());
612
829
  meteredDAFields += numNullifiers;
613
- meteredL2Gas += numNullifiers * AVM_EMITNULLIFIER_BASE_L2_GAS;
830
+ const nullifierBaseGas = isPrivateOnlyTx ? L2_GAS_PER_NULLIFIER : AVM_EMITNULLIFIER_BASE_L2_GAS;
831
+ meteredL2Gas += numNullifiers * nullifierBaseGas;
614
832
 
615
833
  const numL2toL1Messages = arrayNonEmptyLength(data.l2ToL1Msgs, msg => msg.isEmpty());
616
834
  meteredDAFields += numL2toL1Messages;
617
- meteredL2Gas += numL2toL1Messages * AVM_SENDL2TOL1MSG_BASE_L2_GAS;
835
+ const l2ToL1MessageBaseGas = isPrivateOnlyTx ? L2_GAS_PER_L2_TO_L1_MSG : AVM_SENDL2TOL1MSG_BASE_L2_GAS;
836
+ meteredL2Gas += numL2toL1Messages * l2ToL1MessageBaseGas;
618
837
 
619
838
  const numPrivatelogs = arrayNonEmptyLength(data.privateLogs, log => log.isEmpty());
620
839
  // Every private log emits its length as an additional field
@@ -622,14 +841,14 @@ function meterGasUsed(data: PrivateToRollupAccumulatedData | PrivateToPublicAccu
622
841
  meteredL2Gas += numPrivatelogs * L2_GAS_PER_PRIVATE_LOG;
623
842
 
624
843
  const numContractClassLogs = arrayNonEmptyLength(data.contractClassLogsHashes, log => log.isEmpty());
625
- // Every contract class log emits its length and contract address as additional fields
844
+ // Every contract class log emits its contract address as an additional field
626
845
  meteredDAFields += data.contractClassLogsHashes.reduce(
627
- (acc, log) => (!log.isEmpty() ? acc + log.logHash.length + 2 : acc),
846
+ (acc, log) => (!log.isEmpty() ? acc + log.logHash.length + 1 : acc),
628
847
  0,
629
848
  );
630
849
  meteredL2Gas += numContractClassLogs * L2_GAS_PER_CONTRACT_CLASS_LOG;
631
850
 
632
- const meteredDAGas = meteredDAFields * DA_BYTES_PER_FIELD * DA_GAS_PER_BYTE;
851
+ const meteredDAGas = meteredDAFields * DA_GAS_PER_FIELD;
633
852
 
634
853
  if ((data as PrivateToPublicAccumulatedData).publicCallRequests) {
635
854
  const dataForPublic = data as PrivateToPublicAccumulatedData;