@aztec/pxe 0.0.1-commit.64b6bbb → 0.0.1-commit.69c59a8b3

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