@aztec/pxe 0.0.1-commit.87a0206 → 0.0.1-commit.88c5703d4

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 (194) 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/config/index.d.ts +2 -2
  5. package/dest/config/index.d.ts.map +1 -1
  6. package/dest/config/index.js +1 -1
  7. package/dest/config/package_info.js +1 -1
  8. package/dest/contract_function_simulator/contract_function_simulator.d.ts +60 -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 +183 -72
  11. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts +7 -7
  12. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts.map +1 -1
  13. package/dest/contract_function_simulator/execution_tagging_index_cache.js +19 -11
  14. package/dest/contract_function_simulator/index.d.ts +2 -1
  15. package/dest/contract_function_simulator/index.d.ts.map +1 -1
  16. package/dest/contract_function_simulator/index.js +1 -0
  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/message_tx_context.d.ts +16 -0
  24. package/dest/contract_function_simulator/noir-structs/message_tx_context.d.ts.map +1 -0
  25. package/dest/contract_function_simulator/noir-structs/message_tx_context.js +57 -0
  26. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +2 -4
  27. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts.map +1 -1
  28. package/dest/contract_function_simulator/noir-structs/note_validation_request.js +3 -5
  29. package/dest/contract_function_simulator/oracle/interfaces.d.ts +49 -45
  30. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  31. package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.d.ts +9 -0
  32. package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.d.ts.map +1 -0
  33. package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.js +52 -0
  34. package/dest/contract_function_simulator/oracle/oracle.d.ts +44 -44
  35. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
  36. package/dest/contract_function_simulator/oracle/oracle.js +143 -94
  37. package/dest/contract_function_simulator/oracle/private_execution.js +5 -3
  38. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +56 -79
  39. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  40. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +99 -84
  41. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +73 -43
  42. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  43. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +137 -75
  44. package/dest/contract_logging.d.ts +22 -0
  45. package/dest/contract_logging.d.ts.map +1 -0
  46. package/dest/contract_logging.js +23 -0
  47. package/dest/contract_sync/contract_sync_service.d.ts +4 -2
  48. package/dest/contract_sync/contract_sync_service.d.ts.map +1 -1
  49. package/dest/contract_sync/contract_sync_service.js +34 -19
  50. package/dest/contract_sync/helpers.d.ts +3 -2
  51. package/dest/contract_sync/helpers.d.ts.map +1 -1
  52. package/dest/contract_sync/helpers.js +3 -3
  53. package/dest/debug/pxe_debug_utils.d.ts +5 -4
  54. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  55. package/dest/debug/pxe_debug_utils.js +4 -4
  56. package/dest/entrypoints/client/bundle/index.d.ts +4 -1
  57. package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
  58. package/dest/entrypoints/client/bundle/index.js +3 -0
  59. package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
  60. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  61. package/dest/entrypoints/client/bundle/utils.js +9 -1
  62. package/dest/entrypoints/client/lazy/index.d.ts +4 -1
  63. package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
  64. package/dest/entrypoints/client/lazy/index.js +3 -0
  65. package/dest/entrypoints/client/lazy/utils.d.ts +1 -1
  66. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  67. package/dest/entrypoints/client/lazy/utils.js +9 -1
  68. package/dest/entrypoints/server/index.d.ts +3 -1
  69. package/dest/entrypoints/server/index.d.ts.map +1 -1
  70. package/dest/entrypoints/server/index.js +2 -0
  71. package/dest/entrypoints/server/utils.js +9 -1
  72. package/dest/logs/log_service.d.ts +3 -2
  73. package/dest/logs/log_service.d.ts.map +1 -1
  74. package/dest/logs/log_service.js +9 -14
  75. package/dest/messages/message_context_service.d.ts +17 -0
  76. package/dest/messages/message_context_service.d.ts.map +1 -0
  77. package/dest/messages/message_context_service.js +36 -0
  78. package/dest/notes/note_service.d.ts +4 -3
  79. package/dest/notes/note_service.d.ts.map +1 -1
  80. package/dest/notes/note_service.js +3 -2
  81. package/dest/notes_filter.d.ts +25 -0
  82. package/dest/notes_filter.d.ts.map +1 -0
  83. package/dest/notes_filter.js +4 -0
  84. package/dest/oracle_version.d.ts +2 -2
  85. package/dest/oracle_version.js +3 -3
  86. package/dest/private_kernel/hints/compute_tx_expiration_timestamp.d.ts +4 -0
  87. package/dest/private_kernel/hints/compute_tx_expiration_timestamp.d.ts.map +1 -0
  88. package/dest/private_kernel/hints/{compute_tx_include_by_timestamp.js → compute_tx_expiration_timestamp.js} +12 -12
  89. package/dest/private_kernel/hints/index.d.ts +1 -1
  90. package/dest/private_kernel/hints/index.js +1 -1
  91. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +4 -3
  92. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -1
  93. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.js +129 -68
  94. package/dest/private_kernel/hints/test_utils.d.ts +122 -0
  95. package/dest/private_kernel/hints/test_utils.d.ts.map +1 -0
  96. package/dest/private_kernel/hints/test_utils.js +203 -0
  97. package/dest/private_kernel/private_kernel_execution_prover.d.ts +1 -1
  98. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  99. package/dest/private_kernel/private_kernel_execution_prover.js +19 -11
  100. package/dest/private_kernel/private_kernel_oracle.d.ts +6 -2
  101. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  102. package/dest/private_kernel/private_kernel_oracle.js +7 -3
  103. package/dest/pxe.d.ts +61 -24
  104. package/dest/pxe.d.ts.map +1 -1
  105. package/dest/pxe.js +91 -65
  106. package/dest/storage/contract_store/contract_store.d.ts +42 -15
  107. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  108. package/dest/storage/contract_store/contract_store.js +140 -64
  109. package/dest/storage/metadata.d.ts +1 -1
  110. package/dest/storage/metadata.js +1 -1
  111. package/dest/storage/note_store/note_store.d.ts +3 -3
  112. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  113. package/dest/storage/note_store/note_store.js +3 -4
  114. package/dest/storage/tagging_store/recipient_tagging_store.d.ts +6 -6
  115. package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
  116. package/dest/storage/tagging_store/sender_tagging_store.d.ts +29 -28
  117. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  118. package/dest/storage/tagging_store/sender_tagging_store.js +141 -115
  119. package/dest/tagging/get_all_logs_by_tags.d.ts +1 -1
  120. package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -1
  121. package/dest/tagging/get_all_logs_by_tags.js +17 -3
  122. package/dest/tagging/index.d.ts +3 -3
  123. package/dest/tagging/index.d.ts.map +1 -1
  124. package/dest/tagging/index.js +1 -1
  125. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +4 -5
  126. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +1 -1
  127. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +7 -7
  128. package/dest/tagging/recipient_sync/utils/find_highest_indexes.js +2 -2
  129. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +6 -7
  130. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +1 -1
  131. package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +12 -11
  132. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +4 -8
  133. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
  134. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +13 -7
  135. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +4 -3
  136. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
  137. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +20 -10
  138. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +5 -7
  139. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
  140. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +36 -24
  141. package/package.json +16 -16
  142. package/src/access_scopes.ts +9 -0
  143. package/src/config/index.ts +1 -1
  144. package/src/config/package_info.ts +1 -1
  145. package/src/contract_function_simulator/contract_function_simulator.ts +335 -133
  146. package/src/contract_function_simulator/execution_tagging_index_cache.ts +19 -14
  147. package/src/contract_function_simulator/index.ts +1 -0
  148. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +8 -5
  149. package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +1 -4
  150. package/src/contract_function_simulator/noir-structs/message_tx_context.ts +55 -0
  151. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +3 -6
  152. package/src/contract_function_simulator/oracle/interfaces.ts +53 -54
  153. package/src/contract_function_simulator/oracle/legacy_oracle_mappings.ts +77 -0
  154. package/src/contract_function_simulator/oracle/oracle.ts +156 -138
  155. package/src/contract_function_simulator/oracle/private_execution.ts +4 -4
  156. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +125 -176
  157. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +210 -82
  158. package/src/contract_logging.ts +39 -0
  159. package/src/contract_sync/contract_sync_service.ts +49 -26
  160. package/src/contract_sync/helpers.ts +7 -2
  161. package/src/debug/pxe_debug_utils.ts +11 -9
  162. package/src/entrypoints/client/bundle/index.ts +3 -0
  163. package/src/entrypoints/client/bundle/utils.ts +9 -1
  164. package/src/entrypoints/client/lazy/index.ts +3 -0
  165. package/src/entrypoints/client/lazy/utils.ts +9 -1
  166. package/src/entrypoints/server/index.ts +2 -0
  167. package/src/entrypoints/server/utils.ts +7 -7
  168. package/src/logs/log_service.ts +17 -24
  169. package/src/messages/message_context_service.ts +45 -0
  170. package/src/notes/note_service.ts +4 -3
  171. package/src/notes_filter.ts +26 -0
  172. package/src/oracle_version.ts +3 -3
  173. package/src/private_kernel/hints/{compute_tx_include_by_timestamp.ts → compute_tx_expiration_timestamp.ts} +13 -13
  174. package/src/private_kernel/hints/index.ts +1 -1
  175. package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +164 -117
  176. package/src/private_kernel/hints/test_utils.ts +325 -0
  177. package/src/private_kernel/private_kernel_execution_prover.ts +19 -12
  178. package/src/private_kernel/private_kernel_oracle.ts +7 -7
  179. package/src/pxe.ts +164 -109
  180. package/src/storage/contract_store/contract_store.ts +170 -71
  181. package/src/storage/metadata.ts +1 -1
  182. package/src/storage/note_store/note_store.ts +8 -5
  183. package/src/storage/tagging_store/recipient_tagging_store.ts +9 -5
  184. package/src/storage/tagging_store/sender_tagging_store.ts +185 -138
  185. package/src/tagging/get_all_logs_by_tags.ts +28 -4
  186. package/src/tagging/index.ts +2 -2
  187. package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +7 -10
  188. package/src/tagging/recipient_sync/utils/find_highest_indexes.ts +2 -2
  189. package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +10 -15
  190. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +23 -10
  191. package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +26 -11
  192. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +27 -26
  193. package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts +0 -4
  194. package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts.map +0 -1
@@ -1,6 +1,5 @@
1
- import { AVM_EMITNOTEHASH_BASE_L2_GAS, AVM_EMITNULLIFIER_BASE_L2_GAS, AVM_SENDL2TOL1MSG_BASE_L2_GAS, DA_BYTES_PER_FIELD, DA_GAS_PER_BYTE, FIXED_AVM_STARTUP_L2_GAS, FIXED_DA_GAS, FIXED_L2_GAS, GeneratorIndex, L2_GAS_PER_CONTRACT_CLASS_LOG, L2_GAS_PER_PRIVATE_LOG, MAX_CONTRACT_CLASS_LOGS_PER_TX, MAX_ENQUEUED_CALLS_PER_TX, MAX_L2_TO_L1_MSGS_PER_TX, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_PRIVATE_LOGS_PER_TX } from '@aztec/constants';
1
+ import { AVM_EMITNOTEHASH_BASE_L2_GAS, AVM_EMITNULLIFIER_BASE_L2_GAS, AVM_SENDL2TOL1MSG_BASE_L2_GAS, DA_GAS_PER_FIELD, FIXED_AVM_STARTUP_L2_GAS, L2_GAS_PER_CONTRACT_CLASS_LOG, L2_GAS_PER_L2_TO_L1_MSG, L2_GAS_PER_NOTE_HASH, L2_GAS_PER_NULLIFIER, L2_GAS_PER_PRIVATE_LOG, MAX_CONTRACT_CLASS_LOGS_PER_TX, MAX_ENQUEUED_CALLS_PER_TX, MAX_L2_TO_L1_MSGS_PER_TX, MAX_NOTE_HASHES_PER_TX, MAX_NOTE_HASH_READ_REQUESTS_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_NULLIFIER_READ_REQUESTS_PER_TX, MAX_PRIVATE_LOGS_PER_TX, PRIVATE_TX_L2_GAS_OVERHEAD, PUBLIC_TX_L2_GAS_OVERHEAD, TX_DA_GAS_OVERHEAD } from '@aztec/constants';
2
2
  import { arrayNonEmptyLength, padArrayEnd } from '@aztec/foundation/collection';
3
- import { poseidon2HashWithSeparator } from '@aztec/foundation/crypto/poseidon';
4
3
  import { Fr } from '@aztec/foundation/curves/bn254';
5
4
  import { createLogger } from '@aztec/foundation/log';
6
5
  import { Timer } from '@aztec/foundation/timer';
@@ -10,12 +9,12 @@ import { ExecutionError, createSimulationError, extractCallStack, resolveAsserti
10
9
  import { FunctionSelector, FunctionType } from '@aztec/stdlib/abi';
11
10
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
12
11
  import { Gas } from '@aztec/stdlib/gas';
13
- import { computeNoteHashNonce, computeProtocolNullifier, computeUniqueNoteHash, siloNoteHash, siloNullifier } from '@aztec/stdlib/hash';
14
- import { PartialPrivateTailPublicInputsForPublic, PartialPrivateTailPublicInputsForRollup, PrivateKernelTailCircuitPublicInputs, PrivateToPublicAccumulatedData, PrivateToRollupAccumulatedData, PublicCallRequest, ScopedLogHash } from '@aztec/stdlib/kernel';
12
+ import { computeNoteHashNonce, computeProtocolNullifier, computeSiloedPrivateLogFirstField, computeUniqueNoteHash, siloNoteHash, siloNullifier } from '@aztec/stdlib/hash';
13
+ import { ClaimedLengthArray, PartialPrivateTailPublicInputsForPublic, PartialPrivateTailPublicInputsForRollup, PrivateKernelTailCircuitPublicInputs, PrivateToPublicAccumulatedData, PrivateToRollupAccumulatedData, PublicCallRequest, ReadRequestActionEnum, ScopedLogHash, ScopedNoteHash, ScopedNullifier, ScopedReadRequest, buildTransientDataHints, getNoteHashReadRequestResetActions, getNullifierReadRequestResetActions } from '@aztec/stdlib/kernel';
15
14
  import { PrivateLog } from '@aztec/stdlib/logs';
16
15
  import { ScopedL2ToL1Message } from '@aztec/stdlib/messaging';
17
16
  import { ChonkProof } from '@aztec/stdlib/proofs';
18
- import { CallContext, HashedValues, PrivateExecutionResult, TxConstantData, collectNested, getFinalMinRevertibleSideEffectCounter } from '@aztec/stdlib/tx';
17
+ import { CallContext, HashedValues, PrivateExecutionResult, TxConstantData, collectNested, collectNoteHashNullifierCounterMap, getFinalMinRevertibleSideEffectCounter } from '@aztec/stdlib/tx';
19
18
  import { ExecutionNoteCache } from './execution_note_cache.js';
20
19
  import { ExecutionTaggingIndexCache } from './execution_tagging_index_cache.js';
21
20
  import { HashedValuesCache } from './hashed_values_cache.js';
@@ -26,6 +25,7 @@ import { UtilityExecutionOracle } from './oracle/utility_execution_oracle.js';
26
25
  /**
27
26
  * The contract function simulator.
28
27
  */ export class ContractFunctionSimulator {
28
+ log;
29
29
  contractStore;
30
30
  noteStore;
31
31
  keyStore;
@@ -38,36 +38,27 @@ import { UtilityExecutionOracle } from './oracle/utility_execution_oracle.js';
38
38
  privateEventStore;
39
39
  simulator;
40
40
  contractSyncService;
41
- log;
42
- constructor(contractStore, noteStore, keyStore, addressStore, aztecNode, senderTaggingStore, recipientTaggingStore, senderAddressBookStore, capsuleStore, privateEventStore, simulator, contractSyncService){
43
- this.contractStore = contractStore;
44
- this.noteStore = noteStore;
45
- this.keyStore = keyStore;
46
- this.addressStore = addressStore;
47
- this.aztecNode = aztecNode;
48
- this.senderTaggingStore = senderTaggingStore;
49
- this.recipientTaggingStore = recipientTaggingStore;
50
- this.senderAddressBookStore = senderAddressBookStore;
51
- this.capsuleStore = capsuleStore;
52
- this.privateEventStore = privateEventStore;
53
- this.simulator = simulator;
54
- this.contractSyncService = contractSyncService;
41
+ messageContextService;
42
+ constructor(args){
43
+ this.contractStore = args.contractStore;
44
+ this.noteStore = args.noteStore;
45
+ this.keyStore = args.keyStore;
46
+ this.addressStore = args.addressStore;
47
+ this.aztecNode = args.aztecNode;
48
+ this.senderTaggingStore = args.senderTaggingStore;
49
+ this.recipientTaggingStore = args.recipientTaggingStore;
50
+ this.senderAddressBookStore = args.senderAddressBookStore;
51
+ this.capsuleStore = args.capsuleStore;
52
+ this.privateEventStore = args.privateEventStore;
53
+ this.simulator = args.simulator;
54
+ this.contractSyncService = args.contractSyncService;
55
+ this.messageContextService = args.messageContextService;
55
56
  this.log = createLogger('simulator');
56
57
  }
57
58
  /**
58
59
  * Runs a private function.
59
60
  * @param request - The transaction request.
60
- * @param entryPointArtifact - The artifact of the entry point function.
61
- * @param contractAddress - The address of the contract (should match request.origin)
62
- * @param msgSender - The address calling the function. This can be replaced to simulate a call from another contract
63
- * or a specific account.
64
- * @param anchorBlockHeader - The block header to use as base state for this run.
65
- * @param senderForTags - The address that is used as a tagging sender when emitting private logs. Returned from
66
- * the `privateGetSenderForTags` oracle.
67
- * @param scopes - The accounts whose notes we can access in this call. Currently optional and will default to all.
68
- * @param jobId - The job ID for staged writes.
69
- * @returns The result of the execution.
70
- */ async run(request, contractAddress, selector, msgSender = AztecAddress.fromField(Fr.MAX_FIELD_VALUE), anchorBlockHeader, senderForTags, scopes, jobId) {
61
+ */ async run(request, { contractAddress, selector, msgSender = AztecAddress.fromField(Fr.MAX_FIELD_VALUE), anchorBlockHeader, senderForTags, scopes, jobId }) {
71
62
  const simulatorSetupTimer = new Timer();
72
63
  const entryPointArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(contractAddress, selector);
73
64
  if (entryPointArtifact.functionType !== FunctionType.PRIVATE) {
@@ -82,9 +73,38 @@ import { UtilityExecutionOracle } from './oracle/utility_execution_oracle.js';
82
73
  const protocolNullifier = await computeProtocolNullifier(await request.toTxRequest().hash());
83
74
  const noteCache = new ExecutionNoteCache(protocolNullifier);
84
75
  const taggingIndexCache = new ExecutionTaggingIndexCache();
85
- const privateExecutionOracle = new PrivateExecutionOracle(request.firstCallArgsHash, request.txContext, callContext, anchorBlockHeader, async (call)=>{
86
- await this.runUtility(call, [], anchorBlockHeader, scopes, jobId);
87
- }, request.authWitnesses, request.capsules, HashedValuesCache.create(request.argsOfCalls), noteCache, taggingIndexCache, this.contractStore, this.noteStore, this.keyStore, this.addressStore, this.aztecNode, this.senderTaggingStore, this.recipientTaggingStore, this.senderAddressBookStore, this.capsuleStore, this.privateEventStore, this.contractSyncService, jobId, 0, startSideEffectCounter, undefined, scopes, senderForTags, this.simulator);
76
+ const privateExecutionOracle = new PrivateExecutionOracle({
77
+ argsHash: request.firstCallArgsHash,
78
+ txContext: request.txContext,
79
+ callContext,
80
+ anchorBlockHeader,
81
+ utilityExecutor: async (call, execScopes)=>{
82
+ await this.runUtility(call, [], anchorBlockHeader, execScopes, jobId);
83
+ },
84
+ authWitnesses: request.authWitnesses,
85
+ capsules: request.capsules,
86
+ executionCache: HashedValuesCache.create(request.argsOfCalls),
87
+ noteCache,
88
+ taggingIndexCache,
89
+ contractStore: this.contractStore,
90
+ noteStore: this.noteStore,
91
+ keyStore: this.keyStore,
92
+ addressStore: this.addressStore,
93
+ aztecNode: this.aztecNode,
94
+ senderTaggingStore: this.senderTaggingStore,
95
+ recipientTaggingStore: this.recipientTaggingStore,
96
+ senderAddressBookStore: this.senderAddressBookStore,
97
+ capsuleStore: this.capsuleStore,
98
+ privateEventStore: this.privateEventStore,
99
+ messageContextService: this.messageContextService,
100
+ contractSyncService: this.contractSyncService,
101
+ jobId,
102
+ totalPublicCalldataCount: 0,
103
+ sideEffectCounter: startSideEffectCounter,
104
+ scopes,
105
+ senderForTags,
106
+ simulator: this.simulator
107
+ });
88
108
  const setupTime = simulatorSetupTimer.ms();
89
109
  try {
90
110
  // Note: any nested private function calls are made recursively within this
@@ -101,7 +121,7 @@ import { UtilityExecutionOracle } from './oracle/utility_execution_oracle.js';
101
121
  r.publicInputs.publicTeardownCallRequest
102
122
  ]));
103
123
  const publicFunctionsCalldata = await Promise.all(publicCallRequests.map(async (r)=>{
104
- const calldata = await privateExecutionOracle.privateLoadFromExecutionCache(r.calldataHash);
124
+ const calldata = await privateExecutionOracle.loadFromExecutionCache(r.calldataHash);
105
125
  return new HashedValues(calldata, r.calldataHash);
106
126
  }));
107
127
  const teardownTime = simulatorTeardownTimer.ms();
@@ -131,7 +151,24 @@ import { UtilityExecutionOracle } from './oracle/utility_execution_oracle.js';
131
151
  if (entryPointArtifact.functionType !== FunctionType.UTILITY) {
132
152
  throw new Error(`Cannot run ${entryPointArtifact.functionType} function as utility`);
133
153
  }
134
- const oracle = new UtilityExecutionOracle(call.to, authwits, [], anchorBlockHeader, this.contractStore, this.noteStore, this.keyStore, this.addressStore, this.aztecNode, this.recipientTaggingStore, this.senderAddressBookStore, this.capsuleStore, this.privateEventStore, jobId, undefined, scopes);
154
+ const oracle = new UtilityExecutionOracle({
155
+ contractAddress: call.to,
156
+ authWitnesses: authwits,
157
+ capsules: [],
158
+ anchorBlockHeader,
159
+ contractStore: this.contractStore,
160
+ noteStore: this.noteStore,
161
+ keyStore: this.keyStore,
162
+ addressStore: this.addressStore,
163
+ aztecNode: this.aztecNode,
164
+ recipientTaggingStore: this.recipientTaggingStore,
165
+ senderAddressBookStore: this.senderAddressBookStore,
166
+ capsuleStore: this.capsuleStore,
167
+ privateEventStore: this.privateEventStore,
168
+ messageContextService: this.messageContextService,
169
+ jobId,
170
+ scopes
171
+ });
135
172
  try {
136
173
  this.log.verbose(`Executing utility function ${entryPointArtifact.name}`, {
137
174
  contract: call.to,
@@ -147,8 +184,11 @@ import { UtilityExecutionOracle } from './oracle/utility_execution_oracle.js';
147
184
  cause: err
148
185
  });
149
186
  });
150
- this.log.verbose(`Utility simulation for ${call.to}.${call.selector} completed`);
151
- return witnessMapToFields(acirExecutionResult.returnWitness);
187
+ this.log.verbose(`Utility execution for ${call.to}.${call.selector} completed`);
188
+ return {
189
+ result: witnessMapToFields(acirExecutionResult.returnWitness),
190
+ offchainEffects: oracle.getOffchainEffects()
191
+ };
152
192
  } catch (err) {
153
193
  throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during private execution'));
154
194
  }
@@ -187,18 +227,24 @@ class OrderedSideEffect {
187
227
  * (allowing state overrides) and is much faster, while still generating a valid
188
228
  * output that can be sent to the node for public simulation
189
229
  * @param privateExecutionResult - The result of the private execution.
190
- * @param contractStore - A provider for contract data in order to get function names and debug info.
230
+ * @param debugFunctionNameGetter - A provider for contract data in order to get function names and debug info.
231
+ * @param node - AztecNode for verifying settled read requests against the note hash and nullifier trees.
191
232
  * @param minRevertibleSideEffectCounterOverride - Optional override for the min revertible side effect counter.
192
233
  * Used by TXE to simulate account contract behavior (setting the counter before app execution).
193
234
  * @returns The simulated proving result.
194
- */ export async function generateSimulatedProvingResult(privateExecutionResult, debugFunctionNameGetter, minRevertibleSideEffectCounterOverride) {
195
- const siloedNoteHashes = [];
196
- const nullifiers = [];
235
+ */ export async function generateSimulatedProvingResult(privateExecutionResult, debugFunctionNameGetter, node, minRevertibleSideEffectCounterOverride) {
197
236
  const taggedPrivateLogs = [];
198
237
  const l2ToL1Messages = [];
199
238
  const contractClassLogsHashes = [];
200
239
  const publicCallRequests = [];
201
240
  const executionSteps = [];
241
+ // Unsiloed scoped arrays — used for squashing, read request verification,
242
+ // and siloed at the end only for the surviving items
243
+ const scopedNoteHashes = [];
244
+ const scopedNullifiers = [];
245
+ // Read requests for verification
246
+ const noteHashReadRequests = [];
247
+ const nullifierReadRequests = [];
202
248
  let publicTeardownCallRequest;
203
249
  const executions = [
204
250
  privateExecutionResult.entrypoint
@@ -207,18 +253,14 @@ class OrderedSideEffect {
207
253
  const execution = executions.shift();
208
254
  executions.unshift(...execution.nestedExecutionResults);
209
255
  const { contractAddress } = execution.publicInputs.callContext;
210
- const noteHashesFromExecution = await Promise.all(execution.publicInputs.noteHashes.getActiveItems().filter((noteHash)=>!noteHash.isEmpty()).map(async (noteHash)=>new OrderedSideEffect(await siloNoteHash(contractAddress, noteHash.value), noteHash.counter)));
211
- const nullifiersFromExecution = await Promise.all(execution.publicInputs.nullifiers.getActiveItems().map(async (nullifier)=>new OrderedSideEffect(await siloNullifier(contractAddress, nullifier.value), nullifier.counter)));
212
- const privateLogsFromExecution = await Promise.all(execution.publicInputs.privateLogs.getActiveItems().map(async (metadata)=>{
213
- metadata.log.fields[0] = await poseidon2HashWithSeparator([
214
- contractAddress,
215
- metadata.log.fields[0]
216
- ], GeneratorIndex.PRIVATE_LOG_FIRST_FIELD);
217
- return new OrderedSideEffect(metadata.log, metadata.counter);
218
- }));
219
- siloedNoteHashes.push(...noteHashesFromExecution);
220
- taggedPrivateLogs.push(...privateLogsFromExecution);
221
- nullifiers.push(...nullifiersFromExecution);
256
+ scopedNoteHashes.push(...execution.publicInputs.noteHashes.getActiveItems().filter((nh)=>!nh.isEmpty()).map((nh)=>nh.scope(contractAddress)));
257
+ scopedNullifiers.push(...execution.publicInputs.nullifiers.getActiveItems().map((n)=>n.scope(contractAddress)));
258
+ taggedPrivateLogs.push(...await Promise.all(execution.publicInputs.privateLogs.getActiveItems().map(async (metadata)=>{
259
+ metadata.log.fields[0] = await computeSiloedPrivateLogFirstField(contractAddress, metadata.log.fields[0]);
260
+ return new OrderedSideEffect(metadata, metadata.counter);
261
+ })));
262
+ noteHashReadRequests.push(...execution.publicInputs.noteHashReadRequests.getActiveItems());
263
+ nullifierReadRequests.push(...execution.publicInputs.nullifierReadRequests.getActiveItems());
222
264
  l2ToL1Messages.push(...execution.publicInputs.l2ToL1Msgs.getActiveItems().map((message)=>new OrderedSideEffect(message.message.scope(contractAddress), message.counter)));
223
265
  contractClassLogsHashes.push(...execution.publicInputs.contractClassLogsHashes.getActiveItems().map((contractClassLogHash)=>new OrderedSideEffect(contractClassLogHash.logHash.scope(contractAddress), contractClassLogHash.counter)));
224
266
  publicCallRequests.push(...execution.publicInputs.publicCallRequests.getActiveItems().map((callRequest)=>new OrderedSideEffect(callRequest.inner, callRequest.counter)));
@@ -237,6 +279,14 @@ class OrderedSideEffect {
237
279
  witness: execution.partialWitness
238
280
  });
239
281
  }
282
+ const noteHashNullifierCounterMap = collectNoteHashNullifierCounterMap(privateExecutionResult);
283
+ const minRevertibleSideEffectCounter = minRevertibleSideEffectCounterOverride ?? getFinalMinRevertibleSideEffectCounter(privateExecutionResult);
284
+ const scopedNoteHashesCLA = new ClaimedLengthArray(padArrayEnd(scopedNoteHashes, ScopedNoteHash.empty(), MAX_NOTE_HASHES_PER_TX), scopedNoteHashes.length);
285
+ const scopedNullifiersCLA = new ClaimedLengthArray(padArrayEnd(scopedNullifiers, ScopedNullifier.empty(), MAX_NULLIFIERS_PER_TX), scopedNullifiers.length);
286
+ const { filteredNoteHashes, filteredNullifiers, filteredPrivateLogs } = squashTransientSideEffects(taggedPrivateLogs, scopedNoteHashesCLA, scopedNullifiersCLA, noteHashNullifierCounterMap, minRevertibleSideEffectCounter);
287
+ await verifyReadRequests(node, await privateExecutionResult.entrypoint.publicInputs.anchorBlockHeader.hash(), noteHashReadRequests, nullifierReadRequests, scopedNoteHashesCLA, scopedNullifiersCLA);
288
+ const siloedNoteHashes = await Promise.all(filteredNoteHashes.sort((a, b)=>a.counter - b.counter).map(async (nh)=>new OrderedSideEffect(await siloNoteHash(nh.contractAddress, nh.value), nh.counter)));
289
+ const siloedNullifiers = await Promise.all(filteredNullifiers.sort((a, b)=>a.counter - b.counter).map(async (n)=>new OrderedSideEffect(await siloNullifier(n.contractAddress, n.value), n.counter)));
240
290
  const constantData = new TxConstantData(privateExecutionResult.entrypoint.publicInputs.anchorBlockHeader, privateExecutionResult.entrypoint.publicInputs.txContext, getVKTreeRoot(), protocolContractsHash);
241
291
  const hasPublicCalls = privateExecutionResult.publicFunctionCalldata.length !== 0;
242
292
  let inputsForRollup;
@@ -245,8 +295,7 @@ class OrderedSideEffect {
245
295
  const sortByCounter = (a, b)=>a.counter - b.counter;
246
296
  const getEffect = (orderedSideEffect)=>orderedSideEffect.sideEffect;
247
297
  const isPrivateOnlyTx = privateExecutionResult.publicFunctionCalldata.length === 0;
248
- const minRevertibleSideEffectCounter = minRevertibleSideEffectCounterOverride ?? getFinalMinRevertibleSideEffectCounter(privateExecutionResult);
249
- const [nonRevertibleNullifiers, revertibleNullifiers] = splitOrderedSideEffects(nullifiers.sort(sortByCounter), minRevertibleSideEffectCounter);
298
+ const [nonRevertibleNullifiers, revertibleNullifiers] = splitOrderedSideEffects(siloedNullifiers, minRevertibleSideEffectCounter);
250
299
  const nonceGenerator = privateExecutionResult.firstNullifier;
251
300
  if (nonRevertibleNullifiers.length === 0) {
252
301
  nonRevertibleNullifiers.push(nonceGenerator);
@@ -256,43 +305,102 @@ class OrderedSideEffect {
256
305
  if (isPrivateOnlyTx) {
257
306
  // We must make the note hashes unique by using the
258
307
  // nonce generator and their index in the tx.
259
- const uniqueNoteHashes = await Promise.all(siloedNoteHashes.sort(sortByCounter).map(async (orderedSideEffect, i)=>{
308
+ const uniqueNoteHashes = await Promise.all(siloedNoteHashes.map(async (orderedSideEffect, i)=>{
260
309
  const siloedNoteHash = orderedSideEffect.sideEffect;
261
310
  const nonce = await computeNoteHashNonce(nonceGenerator, i);
262
311
  const uniqueNoteHash = await computeUniqueNoteHash(nonce, siloedNoteHash);
263
312
  return uniqueNoteHash;
264
313
  }));
265
- const accumulatedDataForRollup = new PrivateToRollupAccumulatedData(padArrayEnd(uniqueNoteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX), padArrayEnd(nonRevertibleNullifiers.concat(revertibleNullifiers), Fr.ZERO, MAX_NULLIFIERS_PER_TX), padArrayEnd(l2ToL1Messages.sort(sortByCounter).map(getEffect), ScopedL2ToL1Message.empty(), MAX_L2_TO_L1_MSGS_PER_TX), padArrayEnd(taggedPrivateLogs.sort(sortByCounter).map(getEffect), PrivateLog.empty(), MAX_PRIVATE_LOGS_PER_TX), padArrayEnd(contractClassLogsHashes.sort(sortByCounter).map(getEffect), ScopedLogHash.empty(), MAX_CONTRACT_CLASS_LOGS_PER_TX));
266
- gasUsed = meterGasUsed(accumulatedDataForRollup);
314
+ const accumulatedDataForRollup = new PrivateToRollupAccumulatedData(padArrayEnd(uniqueNoteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX), padArrayEnd(nonRevertibleNullifiers.concat(revertibleNullifiers), Fr.ZERO, MAX_NULLIFIERS_PER_TX), padArrayEnd(l2ToL1Messages.sort(sortByCounter).map(getEffect), ScopedL2ToL1Message.empty(), MAX_L2_TO_L1_MSGS_PER_TX), padArrayEnd(filteredPrivateLogs.sort(sortByCounter).map(getEffect), PrivateLog.empty(), MAX_PRIVATE_LOGS_PER_TX), padArrayEnd(contractClassLogsHashes.sort(sortByCounter).map(getEffect), ScopedLogHash.empty(), MAX_CONTRACT_CLASS_LOGS_PER_TX));
315
+ gasUsed = meterGasUsed(accumulatedDataForRollup, isPrivateOnlyTx);
267
316
  inputsForRollup = new PartialPrivateTailPublicInputsForRollup(accumulatedDataForRollup);
268
317
  } else {
269
- const [nonRevertibleNoteHashes, revertibleNoteHashes] = splitOrderedSideEffects(siloedNoteHashes.sort(sortByCounter), minRevertibleSideEffectCounter);
318
+ const [nonRevertibleNoteHashes, revertibleNoteHashes] = splitOrderedSideEffects(siloedNoteHashes, minRevertibleSideEffectCounter);
270
319
  const nonRevertibleUniqueNoteHashes = await Promise.all(nonRevertibleNoteHashes.map(async (noteHash, i)=>{
271
320
  const nonce = await computeNoteHashNonce(nonceGenerator, i);
272
321
  return await computeUniqueNoteHash(nonce, noteHash);
273
322
  }));
274
323
  const [nonRevertibleL2ToL1Messages, revertibleL2ToL1Messages] = splitOrderedSideEffects(l2ToL1Messages.sort(sortByCounter), minRevertibleSideEffectCounter);
275
- const [nonRevertibleTaggedPrivateLogs, revertibleTaggedPrivateLogs] = splitOrderedSideEffects(taggedPrivateLogs, minRevertibleSideEffectCounter);
324
+ const [nonRevertibleTaggedPrivateLogs, revertibleTaggedPrivateLogs] = splitOrderedSideEffects(filteredPrivateLogs, minRevertibleSideEffectCounter);
276
325
  const [nonRevertibleContractClassLogHashes, revertibleContractClassLogHashes] = splitOrderedSideEffects(contractClassLogsHashes.sort(sortByCounter), minRevertibleSideEffectCounter);
277
326
  const [nonRevertiblePublicCallRequests, revertiblePublicCallRequests] = splitOrderedSideEffects(publicCallRequests.sort(sortByCounter), minRevertibleSideEffectCounter);
278
327
  const nonRevertibleData = new PrivateToPublicAccumulatedData(padArrayEnd(nonRevertibleUniqueNoteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX), padArrayEnd(nonRevertibleNullifiers, Fr.ZERO, MAX_NULLIFIERS_PER_TX), padArrayEnd(nonRevertibleL2ToL1Messages, ScopedL2ToL1Message.empty(), MAX_L2_TO_L1_MSGS_PER_TX), padArrayEnd(nonRevertibleTaggedPrivateLogs, PrivateLog.empty(), MAX_PRIVATE_LOGS_PER_TX), padArrayEnd(nonRevertibleContractClassLogHashes, ScopedLogHash.empty(), MAX_CONTRACT_CLASS_LOGS_PER_TX), padArrayEnd(nonRevertiblePublicCallRequests, PublicCallRequest.empty(), MAX_ENQUEUED_CALLS_PER_TX));
279
328
  const revertibleData = new PrivateToPublicAccumulatedData(padArrayEnd(revertibleNoteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX), padArrayEnd(revertibleNullifiers, Fr.ZERO, MAX_NULLIFIERS_PER_TX), padArrayEnd(revertibleL2ToL1Messages, ScopedL2ToL1Message.empty(), MAX_L2_TO_L1_MSGS_PER_TX), padArrayEnd(revertibleTaggedPrivateLogs, PrivateLog.empty(), MAX_PRIVATE_LOGS_PER_TX), padArrayEnd(revertibleContractClassLogHashes, ScopedLogHash.empty(), MAX_CONTRACT_CLASS_LOGS_PER_TX), padArrayEnd(revertiblePublicCallRequests, PublicCallRequest.empty(), MAX_ENQUEUED_CALLS_PER_TX));
280
- gasUsed = meterGasUsed(revertibleData).add(meterGasUsed(nonRevertibleData));
329
+ gasUsed = meterGasUsed(revertibleData, isPrivateOnlyTx).add(meterGasUsed(nonRevertibleData, isPrivateOnlyTx));
281
330
  if (publicTeardownCallRequest) {
282
- gasUsed.add(privateExecutionResult.entrypoint.publicInputs.txContext.gasSettings.teardownGasLimits);
331
+ gasUsed = gasUsed.add(privateExecutionResult.entrypoint.publicInputs.txContext.gasSettings.teardownGasLimits);
283
332
  }
284
333
  inputsForPublic = new PartialPrivateTailPublicInputsForPublic(nonRevertibleData, revertibleData, publicTeardownCallRequest ?? PublicCallRequest.empty());
285
334
  }
286
335
  const publicInputs = new PrivateKernelTailCircuitPublicInputs(constantData, /*gasUsed=*/ gasUsed.add(Gas.from({
287
- l2Gas: FIXED_L2_GAS,
288
- daGas: FIXED_DA_GAS
289
- })), /*feePayer=*/ AztecAddress.zero(), /*includeByTimestamp=*/ 0n, hasPublicCalls ? inputsForPublic : undefined, !hasPublicCalls ? inputsForRollup : undefined);
336
+ l2Gas: isPrivateOnlyTx ? PRIVATE_TX_L2_GAS_OVERHEAD : PUBLIC_TX_L2_GAS_OVERHEAD,
337
+ daGas: TX_DA_GAS_OVERHEAD
338
+ })), /*feePayer=*/ AztecAddress.zero(), /*expirationTimestamp=*/ 0n, hasPublicCalls ? inputsForPublic : undefined, !hasPublicCalls ? inputsForRollup : undefined);
290
339
  return {
291
340
  publicInputs,
292
341
  chonkProof: ChonkProof.empty(),
293
342
  executionSteps
294
343
  };
295
344
  }
345
+ /**
346
+ * Squashes transient note hashes and nullifiers, mimicking the behavior
347
+ * of the reset kernels. Returns the filtered (surviving) scoped items and private logs.
348
+ */ function squashTransientSideEffects(taggedPrivateLogs, scopedNoteHashesCLA, scopedNullifiersCLA, noteHashNullifierCounterMap, minRevertibleSideEffectCounter) {
349
+ const { numTransientData, hints: transientDataHints } = buildTransientDataHints(scopedNoteHashesCLA, scopedNullifiersCLA, /*futureNoteHashReads=*/ [], /*futureNullifierReads=*/ [], /*futureLogs=*/ [], noteHashNullifierCounterMap, minRevertibleSideEffectCounter);
350
+ const squashedNoteHashCounters = new Set();
351
+ const squashedNullifierCounters = new Set();
352
+ for(let i = 0; i < numTransientData; i++){
353
+ const hint = transientDataHints[i];
354
+ squashedNoteHashCounters.add(scopedNoteHashesCLA.array[hint.noteHashIndex].counter);
355
+ squashedNullifierCounters.add(scopedNullifiersCLA.array[hint.nullifierIndex].counter);
356
+ }
357
+ return {
358
+ filteredNoteHashes: scopedNoteHashesCLA.getActiveItems().filter((nh)=>!squashedNoteHashCounters.has(nh.counter)),
359
+ filteredNullifiers: scopedNullifiersCLA.getActiveItems().filter((n)=>!squashedNullifierCounters.has(n.counter)),
360
+ filteredPrivateLogs: taggedPrivateLogs.filter((item)=>!squashedNoteHashCounters.has(item.sideEffect.noteHashCounter)).map((item)=>new OrderedSideEffect(item.sideEffect.log, item.counter))
361
+ };
362
+ }
363
+ /**
364
+ * Verifies settled read requests by checking membership in the note hash and nullifier trees
365
+ * at the tx's anchor block, mimicking the behavior of the kernels
366
+ */ async function verifyReadRequests(node, anchorBlockHash, noteHashReadRequests, nullifierReadRequests, scopedNoteHashesCLA, scopedNullifiersCLA) {
367
+ const noteHashReadRequestsCLA = new ClaimedLengthArray(padArrayEnd(noteHashReadRequests, ScopedReadRequest.empty(), MAX_NOTE_HASH_READ_REQUESTS_PER_TX), noteHashReadRequests.length);
368
+ const nullifierReadRequestsCLA = new ClaimedLengthArray(padArrayEnd(nullifierReadRequests, ScopedReadRequest.empty(), MAX_NULLIFIER_READ_REQUESTS_PER_TX), nullifierReadRequests.length);
369
+ const noteHashResetActions = getNoteHashReadRequestResetActions(noteHashReadRequestsCLA, scopedNoteHashesCLA);
370
+ const nullifierResetActions = getNullifierReadRequestResetActions(nullifierReadRequestsCLA, scopedNullifiersCLA);
371
+ const settledNoteHashReads = [];
372
+ for(let i = 0; i < noteHashResetActions.actions.length; i++){
373
+ if (noteHashResetActions.actions[i] === ReadRequestActionEnum.READ_AS_SETTLED) {
374
+ settledNoteHashReads.push({
375
+ index: i,
376
+ value: noteHashReadRequests[i].value
377
+ });
378
+ }
379
+ }
380
+ const settledNullifierReads = [];
381
+ for(let i = 0; i < nullifierResetActions.actions.length; i++){
382
+ if (nullifierResetActions.actions[i] === ReadRequestActionEnum.READ_AS_SETTLED) {
383
+ settledNullifierReads.push({
384
+ index: i,
385
+ value: nullifierReadRequests[i].value
386
+ });
387
+ }
388
+ }
389
+ const [noteHashWitnesses, nullifierWitnesses] = await Promise.all([
390
+ Promise.all(settledNoteHashReads.map(({ value })=>node.getNoteHashMembershipWitness(anchorBlockHash, value))),
391
+ Promise.all(settledNullifierReads.map(({ value })=>node.getNullifierMembershipWitness(anchorBlockHash, value)))
392
+ ]);
393
+ for(let i = 0; i < settledNoteHashReads.length; i++){
394
+ if (!noteHashWitnesses[i]) {
395
+ throw new Error(`Note hash read request at index ${settledNoteHashReads[i].index} is reading an unknown note hash: ${settledNoteHashReads[i].value}`);
396
+ }
397
+ }
398
+ for(let i = 0; i < settledNullifierReads.length; i++){
399
+ if (!nullifierWitnesses[i]) {
400
+ throw new Error(`Nullifier read request at index ${settledNullifierReads[i].index} is reading an unknown nullifier: ${settledNullifierReads[i].value}`);
401
+ }
402
+ }
403
+ }
296
404
  function splitOrderedSideEffects(effects, minRevertibleSideEffectCounter) {
297
405
  const revertibleSideEffects = [];
298
406
  const nonRevertibleSideEffects = [];
@@ -308,27 +416,30 @@ function splitOrderedSideEffects(effects, minRevertibleSideEffectCounter) {
308
416
  revertibleSideEffects
309
417
  ];
310
418
  }
311
- function meterGasUsed(data) {
419
+ function meterGasUsed(data, isPrivateOnlyTx) {
312
420
  let meteredDAFields = 0;
313
421
  let meteredL2Gas = 0;
314
422
  const numNoteHashes = arrayNonEmptyLength(data.noteHashes, (hash)=>hash.isEmpty());
315
423
  meteredDAFields += numNoteHashes;
316
- meteredL2Gas += numNoteHashes * AVM_EMITNOTEHASH_BASE_L2_GAS;
424
+ const noteHashBaseGas = isPrivateOnlyTx ? L2_GAS_PER_NOTE_HASH : AVM_EMITNOTEHASH_BASE_L2_GAS;
425
+ meteredL2Gas += numNoteHashes * noteHashBaseGas;
317
426
  const numNullifiers = arrayNonEmptyLength(data.nullifiers, (nullifier)=>nullifier.isEmpty());
318
427
  meteredDAFields += numNullifiers;
319
- meteredL2Gas += numNullifiers * AVM_EMITNULLIFIER_BASE_L2_GAS;
428
+ const nullifierBaseGas = isPrivateOnlyTx ? L2_GAS_PER_NULLIFIER : AVM_EMITNULLIFIER_BASE_L2_GAS;
429
+ meteredL2Gas += numNullifiers * nullifierBaseGas;
320
430
  const numL2toL1Messages = arrayNonEmptyLength(data.l2ToL1Msgs, (msg)=>msg.isEmpty());
321
431
  meteredDAFields += numL2toL1Messages;
322
- meteredL2Gas += numL2toL1Messages * AVM_SENDL2TOL1MSG_BASE_L2_GAS;
432
+ const l2ToL1MessageBaseGas = isPrivateOnlyTx ? L2_GAS_PER_L2_TO_L1_MSG : AVM_SENDL2TOL1MSG_BASE_L2_GAS;
433
+ meteredL2Gas += numL2toL1Messages * l2ToL1MessageBaseGas;
323
434
  const numPrivatelogs = arrayNonEmptyLength(data.privateLogs, (log)=>log.isEmpty());
324
435
  // Every private log emits its length as an additional field
325
436
  meteredDAFields += data.privateLogs.reduce((acc, log)=>!log.isEmpty() ? acc + log.emittedLength + 1 : acc, 0);
326
437
  meteredL2Gas += numPrivatelogs * L2_GAS_PER_PRIVATE_LOG;
327
438
  const numContractClassLogs = arrayNonEmptyLength(data.contractClassLogsHashes, (log)=>log.isEmpty());
328
- // Every contract class log emits its length and contract address as additional fields
329
- meteredDAFields += data.contractClassLogsHashes.reduce((acc, log)=>!log.isEmpty() ? acc + log.logHash.length + 2 : acc, 0);
439
+ // Every contract class log emits its contract address as an additional field
440
+ meteredDAFields += data.contractClassLogsHashes.reduce((acc, log)=>!log.isEmpty() ? acc + log.logHash.length + 1 : acc, 0);
330
441
  meteredL2Gas += numContractClassLogs * L2_GAS_PER_CONTRACT_CLASS_LOG;
331
- const meteredDAGas = meteredDAFields * DA_BYTES_PER_FIELD * DA_GAS_PER_BYTE;
442
+ const meteredDAGas = meteredDAFields * DA_GAS_PER_FIELD;
332
443
  if (data.publicCallRequests) {
333
444
  const dataForPublic = data;
334
445
  const numPublicCallRequests = arrayNonEmptyLength(dataForPublic.publicCallRequests, (req)=>req.isEmpty());
@@ -1,16 +1,16 @@
1
- import { DirectionalAppTaggingSecret, type PreTag } from '@aztec/stdlib/logs';
1
+ import { ExtendedDirectionalAppTaggingSecret, type TaggingIndexRange } from '@aztec/stdlib/logs';
2
2
  /**
3
- * A map that stores the tagging index for a given directional app tagging secret.
3
+ * A map that stores the tagging index range for a given extended directional app tagging secret.
4
4
  * Note: The directional app tagging secret is unique for a (sender, recipient, contract) tuple while the direction
5
5
  * of sender -> recipient matters.
6
6
  */
7
7
  export declare class ExecutionTaggingIndexCache {
8
8
  private taggingIndexMap;
9
- getLastUsedIndex(secret: DirectionalAppTaggingSecret): number | undefined;
10
- setLastUsedIndex(secret: DirectionalAppTaggingSecret, index: number): void;
9
+ getLastUsedIndex(secret: ExtendedDirectionalAppTaggingSecret): number | undefined;
10
+ setLastUsedIndex(secret: ExtendedDirectionalAppTaggingSecret, index: number): void;
11
11
  /**
12
- * Returns the pre-tags that were used in this execution (and that need to be stored in the db).
12
+ * Returns the tagging index ranges that were used in this execution (and that need to be stored in the db).
13
13
  */
14
- getUsedPreTags(): PreTag[];
14
+ getUsedTaggingIndexRanges(): TaggingIndexRange[];
15
15
  }
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0aW9uX3RhZ2dpbmdfaW5kZXhfY2FjaGUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250cmFjdF9mdW5jdGlvbl9zaW11bGF0b3IvZXhlY3V0aW9uX3RhZ2dpbmdfaW5kZXhfY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLDJCQUEyQixFQUFFLEtBQUssTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFOUU7Ozs7R0FJRztBQUNILHFCQUFhLDBCQUEwQjtJQUNyQyxPQUFPLENBQUMsZUFBZSxDQUFrQztJQUVsRCxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsMkJBQTJCLEdBQUcsTUFBTSxHQUFHLFNBQVMsQ0FFL0U7SUFFTSxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsMkJBQTJCLEVBQUUsS0FBSyxFQUFFLE1BQU0sUUFNekU7SUFFRDs7T0FFRztJQUNJLGNBQWMsSUFBSSxNQUFNLEVBQUUsQ0FLaEM7Q0FDRiJ9
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0aW9uX3RhZ2dpbmdfaW5kZXhfY2FjaGUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250cmFjdF9mdW5jdGlvbl9zaW11bGF0b3IvZXhlY3V0aW9uX3RhZ2dpbmdfaW5kZXhfY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLEtBQUssaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVqRzs7OztHQUlHO0FBQ0gscUJBQWEsMEJBQTBCO0lBQ3JDLE9BQU8sQ0FBQyxlQUFlLENBQXlFO0lBRXpGLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxtQ0FBbUMsR0FBRyxNQUFNLEdBQUcsU0FBUyxDQUV2RjtJQUVNLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxtQ0FBbUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxRQVVqRjtJQUVEOztPQUVHO0lBQ0kseUJBQXlCLElBQUksaUJBQWlCLEVBQUUsQ0FNdEQ7Q0FDRiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"execution_tagging_index_cache.d.ts","sourceRoot":"","sources":["../../src/contract_function_simulator/execution_tagging_index_cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE9E;;;;GAIG;AACH,qBAAa,0BAA0B;IACrC,OAAO,CAAC,eAAe,CAAkC;IAElD,gBAAgB,CAAC,MAAM,EAAE,2BAA2B,GAAG,MAAM,GAAG,SAAS,CAE/E;IAEM,gBAAgB,CAAC,MAAM,EAAE,2BAA2B,EAAE,KAAK,EAAE,MAAM,QAMzE;IAED;;OAEG;IACI,cAAc,IAAI,MAAM,EAAE,CAKhC;CACF"}
1
+ {"version":3,"file":"execution_tagging_index_cache.d.ts","sourceRoot":"","sources":["../../src/contract_function_simulator/execution_tagging_index_cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mCAAmC,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEjG;;;;GAIG;AACH,qBAAa,0BAA0B;IACrC,OAAO,CAAC,eAAe,CAAyE;IAEzF,gBAAgB,CAAC,MAAM,EAAE,mCAAmC,GAAG,MAAM,GAAG,SAAS,CAEvF;IAEM,gBAAgB,CAAC,MAAM,EAAE,mCAAmC,EAAE,KAAK,EAAE,MAAM,QAUjF;IAED;;OAEG;IACI,yBAAyB,IAAI,iBAAiB,EAAE,CAMtD;CACF"}
@@ -1,26 +1,34 @@
1
- import { DirectionalAppTaggingSecret } from '@aztec/stdlib/logs';
1
+ import { ExtendedDirectionalAppTaggingSecret } from '@aztec/stdlib/logs';
2
2
  /**
3
- * A map that stores the tagging index for a given directional app tagging secret.
3
+ * A map that stores the tagging index range for a given extended directional app tagging secret.
4
4
  * Note: The directional app tagging secret is unique for a (sender, recipient, contract) tuple while the direction
5
5
  * of sender -> recipient matters.
6
6
  */ export class ExecutionTaggingIndexCache {
7
7
  taggingIndexMap = new Map();
8
8
  getLastUsedIndex(secret) {
9
- return this.taggingIndexMap.get(secret.toString());
9
+ return this.taggingIndexMap.get(secret.toString())?.highestIndex;
10
10
  }
11
11
  setLastUsedIndex(secret, index) {
12
12
  const currentValue = this.taggingIndexMap.get(secret.toString());
13
- if (currentValue !== undefined && currentValue !== index - 1) {
14
- throw new Error(`Invalid tagging index update. Current value: ${currentValue}, new value: ${index}`);
13
+ if (currentValue !== undefined && currentValue.highestIndex !== index - 1) {
14
+ throw new Error(`Invalid tagging index update. Current value: ${currentValue.highestIndex}, new value: ${index}`);
15
+ }
16
+ if (currentValue !== undefined) {
17
+ currentValue.highestIndex = index;
18
+ } else {
19
+ this.taggingIndexMap.set(secret.toString(), {
20
+ lowestIndex: index,
21
+ highestIndex: index
22
+ });
15
23
  }
16
- this.taggingIndexMap.set(secret.toString(), index);
17
24
  }
18
25
  /**
19
- * Returns the pre-tags that were used in this execution (and that need to be stored in the db).
20
- */ getUsedPreTags() {
21
- return Array.from(this.taggingIndexMap.entries()).map(([secret, index])=>({
22
- secret: DirectionalAppTaggingSecret.fromString(secret),
23
- index
26
+ * Returns the tagging index ranges that were used in this execution (and that need to be stored in the db).
27
+ */ getUsedTaggingIndexRanges() {
28
+ return Array.from(this.taggingIndexMap.entries()).map(([secret, { lowestIndex, highestIndex }])=>({
29
+ extendedSecret: ExtendedDirectionalAppTaggingSecret.fromString(secret),
30
+ lowestIndex,
31
+ highestIndex
24
32
  }));
25
33
  }
26
34
  }
@@ -4,6 +4,7 @@ export { HashedValuesCache } from './hashed_values_cache.js';
4
4
  export { pickNotes } from './pick_notes.js';
5
5
  export type { NoteData, IMiscOracle, IUtilityExecutionOracle, IPrivateExecutionOracle } from './oracle/interfaces.js';
6
6
  export { MessageLoadOracleInputs } from './oracle/message_load_oracle_inputs.js';
7
+ export { MessageContextService } from '../messages/message_context_service.js';
7
8
  export { UtilityExecutionOracle } from './oracle/utility_execution_oracle.js';
8
9
  export { PrivateExecutionOracle } from './oracle/private_execution_oracle.js';
9
10
  export { Oracle } from './oracle/oracle.js';
@@ -11,4 +12,4 @@ export { executePrivateFunction, extractPrivateCircuitPublicInputs } from './ora
11
12
  export { generateSimulatedProvingResult } from './contract_function_simulator.js';
12
13
  export { packAsHintedNote } from './oracle/note_packing_utils.js';
13
14
  export { UtilityContext } from './noir-structs/utility_context.js';
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250cmFjdF9mdW5jdGlvbl9zaW11bGF0b3IvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDL0QsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDaEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLFlBQVksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLHVCQUF1QixFQUFFLHVCQUF1QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEgsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDakYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDOUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDOUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzFHLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQyJ9
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250cmFjdF9mdW5jdGlvbl9zaW11bGF0b3IvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDL0QsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDaEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLFlBQVksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLHVCQUF1QixFQUFFLHVCQUF1QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEgsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDakYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDL0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDOUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDOUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzFHLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQyJ9
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contract_function_simulator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtH,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,iCAAiC,EAAE,MAAM,+BAA+B,CAAC;AAC1G,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contract_function_simulator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtH,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,iCAAiC,EAAE,MAAM,+BAA+B,CAAC;AAC1G,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC"}
@@ -3,6 +3,7 @@ export { ExecutionTaggingIndexCache } from './execution_tagging_index_cache.js';
3
3
  export { HashedValuesCache } from './hashed_values_cache.js';
4
4
  export { pickNotes } from './pick_notes.js';
5
5
  export { MessageLoadOracleInputs } from './oracle/message_load_oracle_inputs.js';
6
+ export { MessageContextService } from '../messages/message_context_service.js';
6
7
  export { UtilityExecutionOracle } from './oracle/utility_execution_oracle.js';
7
8
  export { PrivateExecutionOracle } from './oracle/private_execution_oracle.js';
8
9
  export { Oracle } from './oracle/oracle.js';
@@ -1,5 +1,4 @@
1
1
  import { Fr } from '@aztec/foundation/curves/bn254';
2
- import { FieldReader } from '@aztec/foundation/serialize';
3
2
  import { EventSelector } from '@aztec/stdlib/abi';
4
3
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
5
4
  import { TxHash } from '@aztec/stdlib/tx';
@@ -16,6 +15,6 @@ export declare class EventValidationRequest {
16
15
  txHash: TxHash;
17
16
  recipient: AztecAddress;
18
17
  constructor(contractAddress: AztecAddress, eventTypeId: EventSelector, randomness: Fr, serializedEvent: Fr[], eventCommitment: Fr, txHash: TxHash, recipient: AztecAddress);
19
- static fromFields(fields: Fr[] | FieldReader): EventValidationRequest;
18
+ static fromFields(fields: Fr[], maxEventSerializedLen: number): EventValidationRequest;
20
19
  }
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRfdmFsaWRhdGlvbl9yZXF1ZXN0LmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29udHJhY3RfZnVuY3Rpb25fc2ltdWxhdG9yL25vaXItc3RydWN0cy9ldmVudF92YWxpZGF0aW9uX3JlcXVlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUsxQzs7O0dBR0c7QUFDSCxxQkFBYSxzQkFBc0I7SUFFeEIsZUFBZSxFQUFFLFlBQVk7SUFDN0IsV0FBVyxFQUFFLGFBQWE7SUFDMUIsVUFBVSxFQUFFLEVBQUU7SUFDZCxlQUFlLEVBQUUsRUFBRSxFQUFFO0lBQ3JCLGVBQWUsRUFBRSxFQUFFO0lBQ25CLE1BQU0sRUFBRSxNQUFNO0lBQ2QsU0FBUyxFQUFFLFlBQVk7SUFQaEMsWUFDUyxlQUFlLEVBQUUsWUFBWSxFQUM3QixXQUFXLEVBQUUsYUFBYSxFQUMxQixVQUFVLEVBQUUsRUFBRSxFQUNkLGVBQWUsRUFBRSxFQUFFLEVBQUUsRUFDckIsZUFBZSxFQUFFLEVBQUUsRUFDbkIsTUFBTSxFQUFFLE1BQU0sRUFDZCxTQUFTLEVBQUUsWUFBWSxFQUM1QjtJQUVKLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLFdBQVcsR0FBRyxzQkFBc0IsQ0F5QnBFO0NBQ0YifQ==
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRfdmFsaWRhdGlvbl9yZXF1ZXN0LmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29udHJhY3RfZnVuY3Rpb25fc2ltdWxhdG9yL25vaXItc3RydWN0cy9ldmVudF92YWxpZGF0aW9uX3JlcXVlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXBELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTFDOzs7R0FHRztBQUNILHFCQUFhLHNCQUFzQjtJQUV4QixlQUFlLEVBQUUsWUFBWTtJQUM3QixXQUFXLEVBQUUsYUFBYTtJQUMxQixVQUFVLEVBQUUsRUFBRTtJQUNkLGVBQWUsRUFBRSxFQUFFLEVBQUU7SUFDckIsZUFBZSxFQUFFLEVBQUU7SUFDbkIsTUFBTSxFQUFFLE1BQU07SUFDZCxTQUFTLEVBQUUsWUFBWTtJQVBoQyxZQUNTLGVBQWUsRUFBRSxZQUFZLEVBQzdCLFdBQVcsRUFBRSxhQUFhLEVBQzFCLFVBQVUsRUFBRSxFQUFFLEVBQ2QsZUFBZSxFQUFFLEVBQUUsRUFBRSxFQUNyQixlQUFlLEVBQUUsRUFBRSxFQUNuQixNQUFNLEVBQUUsTUFBTSxFQUNkLFNBQVMsRUFBRSxZQUFZLEVBQzVCO0lBRUosTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxHQUFHLHNCQUFzQixDQStCckY7Q0FDRiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"event_validation_request.d.ts","sourceRoot":"","sources":["../../../src/contract_function_simulator/noir-structs/event_validation_request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAK1C;;;GAGG;AACH,qBAAa,sBAAsB;IAExB,eAAe,EAAE,YAAY;IAC7B,WAAW,EAAE,aAAa;IAC1B,UAAU,EAAE,EAAE;IACd,eAAe,EAAE,EAAE,EAAE;IACrB,eAAe,EAAE,EAAE;IACnB,MAAM,EAAE,MAAM;IACd,SAAS,EAAE,YAAY;IAPhC,YACS,eAAe,EAAE,YAAY,EAC7B,WAAW,EAAE,aAAa,EAC1B,UAAU,EAAE,EAAE,EACd,eAAe,EAAE,EAAE,EAAE,EACrB,eAAe,EAAE,EAAE,EACnB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,YAAY,EAC5B;IAEJ,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,WAAW,GAAG,sBAAsB,CAyBpE;CACF"}
1
+ {"version":3,"file":"event_validation_request.d.ts","sourceRoot":"","sources":["../../../src/contract_function_simulator/noir-structs/event_validation_request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C;;;GAGG;AACH,qBAAa,sBAAsB;IAExB,eAAe,EAAE,YAAY;IAC7B,WAAW,EAAE,aAAa;IAC1B,UAAU,EAAE,EAAE;IACd,eAAe,EAAE,EAAE,EAAE;IACrB,eAAe,EAAE,EAAE;IACnB,MAAM,EAAE,MAAM;IACd,SAAS,EAAE,YAAY;IAPhC,YACS,eAAe,EAAE,YAAY,EAC7B,WAAW,EAAE,aAAa,EAC1B,UAAU,EAAE,EAAE,EACd,eAAe,EAAE,EAAE,EAAE,EACrB,eAAe,EAAE,EAAE,EACnB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,YAAY,EAC5B;IAEJ,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,qBAAqB,EAAE,MAAM,GAAG,sBAAsB,CA+BrF;CACF"}
@@ -2,8 +2,6 @@ import { FieldReader } from '@aztec/foundation/serialize';
2
2
  import { EventSelector } from '@aztec/stdlib/abi';
3
3
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
4
4
  import { TxHash } from '@aztec/stdlib/tx';
5
- // TODO(#14617): should we compute this from constants? This value is aztec-nr specific.
6
- const MAX_EVENT_SERIALIZED_LEN = 12;
7
5
  /**
8
6
  * Intermediate struct used to perform batch event validation by PXE. The `utilityValidateAndStoreEnqueuedNotesAndEvents` oracle
9
7
  * expects for values of this type to be stored in a `CapsuleArray`.
@@ -24,17 +22,20 @@ const MAX_EVENT_SERIALIZED_LEN = 12;
24
22
  this.txHash = txHash;
25
23
  this.recipient = recipient;
26
24
  }
27
- static fromFields(fields) {
25
+ static fromFields(fields, maxEventSerializedLen) {
28
26
  const reader = FieldReader.asReader(fields);
29
27
  const contractAddress = AztecAddress.fromField(reader.readField());
30
28
  const eventTypeId = EventSelector.fromField(reader.readField());
31
29
  const randomness = reader.readField();
32
- const eventStorage = reader.readFieldArray(MAX_EVENT_SERIALIZED_LEN);
30
+ const eventStorage = reader.readFieldArray(maxEventSerializedLen);
33
31
  const eventLen = reader.readField().toNumber();
34
32
  const serializedEvent = eventStorage.slice(0, eventLen);
35
33
  const eventCommitment = reader.readField();
36
34
  const txHash = TxHash.fromField(reader.readField());
37
35
  const recipient = AztecAddress.fromField(reader.readField());
36
+ if (reader.remainingFields() !== 0) {
37
+ throw new Error(`Error converting array of fields to EventValidationRequest: expected ${reader.cursor} fields but received ${fields.length} (maxEventSerializedLen=${maxEventSerializedLen}).`);
38
+ }
38
39
  return new EventValidationRequest(contractAddress, eventTypeId, randomness, serializedEvent, eventCommitment, txHash, recipient);
39
40
  }
40
41
  }
@@ -14,4 +14,4 @@ export declare class LogRetrievalResponse {
14
14
  static toEmptyFields(): Fr[];
15
15
  static toSerializedOption(response: LogRetrievalResponse | null): Fr[];
16
16
  }
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nX3JldHJpZXZhbF9yZXNwb25zZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbnRyYWN0X2Z1bmN0aW9uX3NpbXVsYXRvci9ub2lyLXN0cnVjdHMvbG9nX3JldHJpZXZhbF9yZXNwb25zZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEQsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFPL0M7OztHQUdHO0FBQ0gscUJBQWEsb0JBQW9CO0lBRXRCLFVBQVUsRUFBRSxFQUFFLEVBQUU7SUFDaEIsTUFBTSxFQUFFLE1BQU07SUFDZCxvQkFBb0IsRUFBRSxFQUFFLEVBQUU7SUFDMUIsa0JBQWtCLEVBQUUsRUFBRTtJQUovQixZQUNTLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFDaEIsTUFBTSxFQUFFLE1BQU0sRUFDZCxvQkFBb0IsRUFBRSxFQUFFLEVBQUUsRUFDMUIsa0JBQWtCLEVBQUUsRUFBRSxFQUMzQjtJQUVKLFFBQVEsSUFBSSxFQUFFLEVBQUUsQ0FTZjtJQUVELE1BQU0sQ0FBQyxhQUFhLElBQUksRUFBRSxFQUFFLENBUzNCO0lBRUQsTUFBTSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxFQUFFLENBTXJFO0NBQ0YifQ==
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nX3JldHJpZXZhbF9yZXNwb25zZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbnRyYWN0X2Z1bmN0aW9uX3NpbXVsYXRvci9ub2lyLXN0cnVjdHMvbG9nX3JldHJpZXZhbF9yZXNwb25zZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEQsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFJL0M7OztHQUdHO0FBQ0gscUJBQWEsb0JBQW9CO0lBRXRCLFVBQVUsRUFBRSxFQUFFLEVBQUU7SUFDaEIsTUFBTSxFQUFFLE1BQU07SUFDZCxvQkFBb0IsRUFBRSxFQUFFLEVBQUU7SUFDMUIsa0JBQWtCLEVBQUUsRUFBRTtJQUovQixZQUNTLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFDaEIsTUFBTSxFQUFFLE1BQU0sRUFDZCxvQkFBb0IsRUFBRSxFQUFFLEVBQUUsRUFDMUIsa0JBQWtCLEVBQUUsRUFBRSxFQUMzQjtJQUVKLFFBQVEsSUFBSSxFQUFFLEVBQUUsQ0FTZjtJQUVELE1BQU0sQ0FBQyxhQUFhLElBQUksRUFBRSxFQUFFLENBUzNCO0lBRUQsTUFBTSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxFQUFFLENBTXJFO0NBQ0YifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"log_retrieval_response.d.ts","sourceRoot":"","sources":["../../../src/contract_function_simulator/noir-structs/log_retrieval_response.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAO/C;;;GAGG;AACH,qBAAa,oBAAoB;IAEtB,UAAU,EAAE,EAAE,EAAE;IAChB,MAAM,EAAE,MAAM;IACd,oBAAoB,EAAE,EAAE,EAAE;IAC1B,kBAAkB,EAAE,EAAE;IAJ/B,YACS,UAAU,EAAE,EAAE,EAAE,EAChB,MAAM,EAAE,MAAM,EACd,oBAAoB,EAAE,EAAE,EAAE,EAC1B,kBAAkB,EAAE,EAAE,EAC3B;IAEJ,QAAQ,IAAI,EAAE,EAAE,CASf;IAED,MAAM,CAAC,aAAa,IAAI,EAAE,EAAE,CAS3B;IAED,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI,GAAG,EAAE,EAAE,CAMrE;CACF"}
1
+ {"version":3,"file":"log_retrieval_response.d.ts","sourceRoot":"","sources":["../../../src/contract_function_simulator/noir-structs/log_retrieval_response.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAI/C;;;GAGG;AACH,qBAAa,oBAAoB;IAEtB,UAAU,EAAE,EAAE,EAAE;IAChB,MAAM,EAAE,MAAM;IACd,oBAAoB,EAAE,EAAE,EAAE;IAC1B,kBAAkB,EAAE,EAAE;IAJ/B,YACS,UAAU,EAAE,EAAE,EAAE,EAChB,MAAM,EAAE,MAAM,EACd,oBAAoB,EAAE,EAAE,EAAE,EAC1B,kBAAkB,EAAE,EAAE,EAC3B;IAEJ,QAAQ,IAAI,EAAE,EAAE,CASf;IAED,MAAM,CAAC,aAAa,IAAI,EAAE,EAAE,CAS3B;IAED,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI,GAAG,EAAE,EAAE,CAMrE;CACF"}
@@ -1,9 +1,7 @@
1
1
  import { MAX_NOTE_HASHES_PER_TX, PRIVATE_LOG_CIPHERTEXT_LEN } from '@aztec/constants';
2
2
  import { range } from '@aztec/foundation/array';
3
3
  import { Fr } from '@aztec/foundation/curves/bn254';
4
- import { MAX_NOTE_PACKED_LEN } from './note_validation_request.js';
5
- const MAX_PUBLIC_LOG_LEN_FOR_NOTE_COMPLETION = MAX_NOTE_PACKED_LEN;
6
- const MAX_LOG_CONTENT_LEN = Math.max(MAX_PUBLIC_LOG_LEN_FOR_NOTE_COMPLETION, PRIVATE_LOG_CIPHERTEXT_LEN);
4
+ const MAX_LOG_CONTENT_LEN = PRIVATE_LOG_CIPHERTEXT_LEN;
7
5
  /**
8
6
  * Intermediate struct used to perform batch log retrieval by PXE. The `utilityBulkRetrieveLogs` oracle stores values of this
9
7
  * type in a `CapsuleArray`.