@aztec/pxe 0.0.1-commit.e558bd1c → 0.0.1-commit.e5a3663dd

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