@aztec/pxe 0.0.1-commit.18ccd8f0 → 0.0.1-commit.1a421b1a1

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