@aztec/pxe 0.0.1-commit.c80b6263 → 0.0.1-commit.cd76b27

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