@aztec/pxe 0.0.1-commit.6c91f13 → 0.0.1-commit.6d63667d

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 (237) hide show
  1. package/dest/bin/check_oracle_version.js +1 -1
  2. package/dest/block_synchronizer/block_synchronizer.d.ts +13 -5
  3. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
  4. package/dest/block_synchronizer/block_synchronizer.js +74 -20
  5. package/dest/config/index.d.ts +3 -1
  6. package/dest/config/index.d.ts.map +1 -1
  7. package/dest/config/index.js +17 -0
  8. package/dest/config/package_info.js +1 -1
  9. package/dest/contract_function_simulator/benchmarked_node.d.ts +9 -0
  10. package/dest/contract_function_simulator/benchmarked_node.d.ts.map +1 -0
  11. package/dest/contract_function_simulator/benchmarked_node.js +77 -0
  12. package/dest/contract_function_simulator/contract_function_simulator.d.ts +11 -12
  13. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  14. package/dest/contract_function_simulator/contract_function_simulator.js +39 -28
  15. package/dest/contract_function_simulator/execution_note_cache.d.ts +18 -9
  16. package/dest/contract_function_simulator/execution_note_cache.d.ts.map +1 -1
  17. package/dest/contract_function_simulator/execution_note_cache.js +45 -28
  18. package/dest/contract_function_simulator/index.d.ts +2 -2
  19. package/dest/contract_function_simulator/index.d.ts.map +1 -1
  20. package/dest/contract_function_simulator/index.js +1 -1
  21. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +4 -3
  22. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts.map +1 -1
  23. package/dest/contract_function_simulator/noir-structs/event_validation_request.js +6 -3
  24. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +1 -1
  25. package/dest/contract_function_simulator/noir-structs/note_validation_request.js +1 -1
  26. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts +4 -10
  27. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts.map +1 -1
  28. package/dest/contract_function_simulator/noir-structs/utility_context.js +7 -18
  29. package/dest/contract_function_simulator/oracle/interfaces.d.ts +16 -12
  30. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  31. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts +3 -1
  32. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts.map +1 -1
  33. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts +6 -6
  34. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts.map +1 -1
  35. package/dest/contract_function_simulator/oracle/note_packing_utils.js +8 -8
  36. package/dest/contract_function_simulator/oracle/oracle.d.ts +11 -9
  37. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
  38. package/dest/contract_function_simulator/oracle/oracle.js +64 -41
  39. package/dest/contract_function_simulator/oracle/private_execution.d.ts +2 -26
  40. package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
  41. package/dest/contract_function_simulator/oracle/private_execution.js +1 -37
  42. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +13 -18
  43. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  44. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +24 -40
  45. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +38 -24
  46. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  47. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +86 -83
  48. package/dest/contract_sync/contract_sync_service.d.ts +41 -0
  49. package/dest/contract_sync/contract_sync_service.d.ts.map +1 -0
  50. package/dest/contract_sync/contract_sync_service.js +82 -0
  51. package/dest/contract_sync/helpers.d.ts +28 -0
  52. package/dest/contract_sync/helpers.d.ts.map +1 -0
  53. package/dest/contract_sync/helpers.js +55 -0
  54. package/dest/debug/pxe_debug_utils.d.ts +24 -9
  55. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  56. package/dest/debug/pxe_debug_utils.js +31 -17
  57. package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
  58. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  59. package/dest/entrypoints/client/bundle/utils.js +22 -7
  60. package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
  61. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  62. package/dest/entrypoints/client/lazy/utils.js +23 -8
  63. package/dest/entrypoints/pxe_creation_options.d.ts +5 -3
  64. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  65. package/dest/entrypoints/server/index.d.ts +3 -1
  66. package/dest/entrypoints/server/index.d.ts.map +1 -1
  67. package/dest/entrypoints/server/index.js +2 -0
  68. package/dest/entrypoints/server/utils.d.ts +1 -1
  69. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  70. package/dest/entrypoints/server/utils.js +30 -15
  71. package/dest/events/event_service.d.ts +6 -6
  72. package/dest/events/event_service.d.ts.map +1 -1
  73. package/dest/events/event_service.js +19 -22
  74. package/dest/events/private_event_filter_validator.d.ts +5 -5
  75. package/dest/events/private_event_filter_validator.d.ts.map +1 -1
  76. package/dest/events/private_event_filter_validator.js +5 -6
  77. package/dest/job_coordinator/job_coordinator.d.ts +75 -0
  78. package/dest/job_coordinator/job_coordinator.d.ts.map +1 -0
  79. package/dest/job_coordinator/job_coordinator.js +94 -0
  80. package/dest/logs/log_service.d.ts +7 -5
  81. package/dest/logs/log_service.d.ts.map +1 -1
  82. package/dest/logs/log_service.js +23 -20
  83. package/dest/notes/note_service.d.ts +7 -7
  84. package/dest/notes/note_service.d.ts.map +1 -1
  85. package/dest/notes/note_service.js +31 -36
  86. package/dest/oracle_version.d.ts +3 -3
  87. package/dest/oracle_version.d.ts.map +1 -1
  88. package/dest/oracle_version.js +4 -3
  89. package/dest/private_kernel/hints/index.d.ts +2 -2
  90. package/dest/private_kernel/hints/index.d.ts.map +1 -1
  91. package/dest/private_kernel/hints/index.js +1 -1
  92. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +28 -0
  93. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -0
  94. package/dest/private_kernel/hints/{build_private_kernel_reset_private_inputs.js → private_kernel_reset_private_inputs_builder.js} +13 -7
  95. package/dest/private_kernel/private_kernel_execution_prover.d.ts +3 -2
  96. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  97. package/dest/private_kernel/private_kernel_execution_prover.js +6 -7
  98. package/dest/private_kernel/private_kernel_oracle.d.ts +24 -28
  99. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  100. package/dest/private_kernel/private_kernel_oracle.js +90 -2
  101. package/dest/pxe.d.ts +9 -36
  102. package/dest/pxe.d.ts.map +1 -1
  103. package/dest/pxe.js +87 -97
  104. package/dest/storage/address_store/address_store.d.ts +1 -1
  105. package/dest/storage/address_store/address_store.d.ts.map +1 -1
  106. package/dest/storage/address_store/address_store.js +12 -11
  107. package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -1
  108. package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
  109. package/dest/storage/anchor_block_store/anchor_block_store.js +8 -1
  110. package/dest/storage/capsule_store/capsule_store.d.ts +24 -9
  111. package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
  112. package/dest/storage/capsule_store/capsule_store.js +130 -23
  113. package/dest/storage/contract_store/contract_store.d.ts +1 -2
  114. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  115. package/dest/storage/contract_store/contract_store.js +22 -25
  116. package/dest/storage/metadata.d.ts +1 -1
  117. package/dest/storage/metadata.js +1 -1
  118. package/dest/storage/note_store/note_store.d.ts +51 -52
  119. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  120. package/dest/storage/note_store/note_store.js +282 -263
  121. package/dest/storage/note_store/stored_note.d.ts +16 -0
  122. package/dest/storage/note_store/stored_note.d.ts.map +1 -0
  123. package/dest/storage/note_store/stored_note.js +43 -0
  124. package/dest/storage/private_event_store/private_event_store.d.ts +47 -7
  125. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  126. package/dest/storage/private_event_store/private_event_store.js +231 -73
  127. package/dest/storage/private_event_store/stored_private_event.d.ts +23 -0
  128. package/dest/storage/private_event_store/stored_private_event.d.ts.map +1 -0
  129. package/dest/storage/private_event_store/stored_private_event.js +56 -0
  130. package/dest/storage/tagging_store/recipient_tagging_store.d.ts +15 -8
  131. package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
  132. package/dest/storage/tagging_store/recipient_tagging_store.js +88 -19
  133. package/dest/storage/tagging_store/sender_address_book_store.d.ts +1 -1
  134. package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +1 -1
  135. package/dest/storage/tagging_store/sender_address_book_store.js +20 -14
  136. package/dest/storage/tagging_store/sender_tagging_store.d.ts +19 -9
  137. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  138. package/dest/storage/tagging_store/sender_tagging_store.js +253 -101
  139. package/dest/tagging/constants.d.ts +2 -0
  140. package/dest/tagging/constants.d.ts.map +1 -0
  141. package/dest/tagging/constants.js +10 -0
  142. package/dest/tagging/get_all_logs_by_tags.d.ts +24 -0
  143. package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -0
  144. package/dest/tagging/get_all_logs_by_tags.js +46 -0
  145. package/dest/tagging/index.d.ts +3 -2
  146. package/dest/tagging/index.d.ts.map +1 -1
  147. package/dest/tagging/index.js +2 -10
  148. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +3 -2
  149. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +1 -1
  150. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +8 -8
  151. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +3 -2
  152. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +1 -1
  153. package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +5 -2
  154. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +3 -2
  155. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
  156. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +8 -8
  157. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +1 -1
  158. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
  159. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +5 -8
  160. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +5 -2
  161. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
  162. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +10 -5
  163. package/package.json +27 -18
  164. package/src/bin/check_oracle_version.ts +1 -0
  165. package/src/block_synchronizer/block_synchronizer.ts +93 -32
  166. package/src/config/index.ts +14 -0
  167. package/src/config/package_info.ts +1 -1
  168. package/src/contract_function_simulator/benchmarked_node.ts +103 -0
  169. package/src/contract_function_simulator/contract_function_simulator.ts +46 -32
  170. package/src/contract_function_simulator/execution_note_cache.ts +44 -25
  171. package/src/contract_function_simulator/index.ts +1 -1
  172. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +5 -1
  173. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +1 -1
  174. package/src/contract_function_simulator/noir-structs/utility_context.ts +6 -25
  175. package/src/contract_function_simulator/oracle/interfaces.ts +21 -11
  176. package/src/contract_function_simulator/oracle/note_packing_utils.ts +10 -10
  177. package/src/contract_function_simulator/oracle/oracle.ts +76 -44
  178. package/src/contract_function_simulator/oracle/private_execution.ts +1 -69
  179. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +41 -49
  180. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +108 -90
  181. package/src/contract_sync/contract_sync_service.ts +129 -0
  182. package/src/contract_sync/helpers.ts +93 -0
  183. package/src/debug/pxe_debug_utils.ts +65 -17
  184. package/src/entrypoints/client/bundle/utils.ts +15 -16
  185. package/src/entrypoints/client/lazy/utils.ts +16 -17
  186. package/src/entrypoints/pxe_creation_options.ts +4 -2
  187. package/src/entrypoints/server/index.ts +2 -0
  188. package/src/entrypoints/server/utils.ts +26 -34
  189. package/src/events/event_service.ts +19 -25
  190. package/src/events/private_event_filter_validator.ts +3 -5
  191. package/src/job_coordinator/job_coordinator.ts +150 -0
  192. package/src/logs/log_service.ts +34 -16
  193. package/src/notes/note_service.ts +38 -43
  194. package/src/oracle_version.ts +4 -3
  195. package/src/private_kernel/hints/index.ts +1 -1
  196. package/src/private_kernel/hints/{build_private_kernel_reset_private_inputs.ts → private_kernel_reset_private_inputs_builder.ts} +33 -22
  197. package/src/private_kernel/private_kernel_execution_prover.ts +9 -8
  198. package/src/private_kernel/private_kernel_oracle.ts +116 -36
  199. package/src/pxe.ts +156 -132
  200. package/src/storage/address_store/address_store.ts +15 -15
  201. package/src/storage/anchor_block_store/anchor_block_store.ts +8 -0
  202. package/src/storage/capsule_store/capsule_store.ts +159 -23
  203. package/src/storage/contract_store/contract_store.ts +22 -31
  204. package/src/storage/metadata.ts +1 -1
  205. package/src/storage/note_store/note_store.ts +317 -318
  206. package/src/storage/note_store/stored_note.ts +48 -0
  207. package/src/storage/private_event_store/private_event_store.ts +301 -79
  208. package/src/storage/private_event_store/stored_private_event.ts +73 -0
  209. package/src/storage/tagging_store/recipient_tagging_store.ts +106 -20
  210. package/src/storage/tagging_store/sender_address_book_store.ts +20 -14
  211. package/src/storage/tagging_store/sender_tagging_store.ts +294 -109
  212. package/src/tagging/constants.ts +10 -0
  213. package/src/tagging/get_all_logs_by_tags.ts +68 -0
  214. package/src/tagging/index.ts +2 -11
  215. package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +21 -7
  216. package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +7 -1
  217. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +10 -7
  218. package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +5 -13
  219. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +16 -4
  220. package/dest/contract_function_simulator/proxied_node.d.ts +0 -9
  221. package/dest/contract_function_simulator/proxied_node.d.ts.map +0 -1
  222. package/dest/contract_function_simulator/proxied_node.js +0 -27
  223. package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.d.ts +0 -28
  224. package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.d.ts.map +0 -1
  225. package/dest/private_kernel/private_kernel_oracle_impl.d.ts +0 -46
  226. package/dest/private_kernel/private_kernel_oracle_impl.d.ts.map +0 -1
  227. package/dest/private_kernel/private_kernel_oracle_impl.js +0 -86
  228. package/dest/public_storage/public_storage_service.d.ts +0 -24
  229. package/dest/public_storage/public_storage_service.d.ts.map +0 -1
  230. package/dest/public_storage/public_storage_service.js +0 -26
  231. package/dest/tree_membership/tree_membership_service.d.ts +0 -52
  232. package/dest/tree_membership/tree_membership_service.d.ts.map +0 -1
  233. package/dest/tree_membership/tree_membership_service.js +0 -84
  234. package/src/contract_function_simulator/proxied_node.ts +0 -33
  235. package/src/private_kernel/private_kernel_oracle_impl.ts +0 -133
  236. package/src/public_storage/public_storage_service.ts +0 -33
  237. package/src/tree_membership/tree_membership_service.ts +0 -112
@@ -0,0 +1,103 @@
1
+ import { Timer } from '@aztec/foundation/timer';
2
+ import type { AztecNode } from '@aztec/stdlib/interfaces/client';
3
+ import type { NodeStats, RoundTripStats } from '@aztec/stdlib/tx';
4
+
5
+ /*
6
+ * Proxy generator for an AztecNode that tracks the time taken for each RPC call and the number of round trips (actual
7
+ * blocking waits for node responses).
8
+ *
9
+ * A round trip is counted when we transition from 0 to 1 in-flight calls, and ends when all concurrent calls complete.
10
+ * This means parallel calls in Promise.all count as a single round trip.
11
+ *
12
+ * Note that batching of RPC calls in `safe_json_rpc_client.ts` could affect the round trip counts but in places we
13
+ * currently use this information we do not even use HTTP as we have direct access to the Aztec Node instance in TS
14
+ * (i.e. not running against external node) so this is not a problem for now.
15
+ *
16
+ * If you want to use this against external node and the info gets skewed by batching you can set the `maxBatchSize`
17
+ * value in `safe_json_rpc_client.ts` to 1 (the main motivation for batching was to get around parallel http requests
18
+ * limits in web browsers which is not a problem when debugging in node.js).
19
+ */
20
+ export type BenchmarkedNode = AztecNode & { getStats(): NodeStats };
21
+
22
+ export class BenchmarkedNodeFactory {
23
+ static create(node: AztecNode): BenchmarkedNode {
24
+ // Per-method call stats
25
+ const perMethod: Partial<Record<keyof AztecNode, { times: number[] }>> = {};
26
+
27
+ // Round trip tracking
28
+ let inFlightCount = 0;
29
+ let currentRoundTripTimer: Timer | null = null;
30
+ let currentRoundTripMethods: string[] = [];
31
+ const roundTrips: RoundTripStats = {
32
+ roundTrips: 0,
33
+ totalBlockingTime: 0,
34
+ roundTripDurations: [],
35
+ roundTripMethods: [],
36
+ };
37
+
38
+ return new Proxy(node, {
39
+ get(target, prop: keyof BenchmarkedNode) {
40
+ if (prop === 'getStats') {
41
+ return (): NodeStats => {
42
+ return { perMethod, roundTrips };
43
+ };
44
+ } else {
45
+ return function (...args: any[]) {
46
+ // Track per-method stats
47
+ if (!perMethod[prop]) {
48
+ perMethod[prop] = { times: [] };
49
+ }
50
+
51
+ // Start of a new round trip batch?
52
+ if (inFlightCount === 0) {
53
+ roundTrips.roundTrips++;
54
+ currentRoundTripTimer = new Timer();
55
+ currentRoundTripMethods = [];
56
+ }
57
+ inFlightCount++;
58
+ currentRoundTripMethods.push(prop);
59
+
60
+ const callTimer = new Timer();
61
+ const result = (target[prop] as any).apply(target, args);
62
+
63
+ // Handle completion - called when the call finishes (after Promise resolves)
64
+ const handleCompletion = () => {
65
+ const callTime = callTimer.ms();
66
+ perMethod[prop]!.times.push(callTime);
67
+
68
+ inFlightCount--;
69
+
70
+ // End of round trip batch - all concurrent calls completed
71
+ if (inFlightCount === 0 && currentRoundTripTimer) {
72
+ const roundTripTime = currentRoundTripTimer.ms();
73
+ roundTrips.totalBlockingTime += roundTripTime;
74
+ roundTrips.roundTripDurations.push(roundTripTime);
75
+ roundTrips.roundTripMethods.push(currentRoundTripMethods);
76
+ currentRoundTripTimer = null;
77
+ currentRoundTripMethods = [];
78
+ }
79
+ };
80
+
81
+ // If the result is a Promise, chain the completion handler
82
+ if (result && typeof result.then === 'function') {
83
+ return result.then(
84
+ (value: any) => {
85
+ handleCompletion();
86
+ return value;
87
+ },
88
+ (error: any) => {
89
+ handleCompletion();
90
+ throw error;
91
+ },
92
+ );
93
+ } else {
94
+ // Synchronous method - handle completion immediately
95
+ handleCompletion();
96
+ return result;
97
+ }
98
+ };
99
+ }
100
+ },
101
+ }) as BenchmarkedNode;
102
+ }
103
+ }
@@ -7,6 +7,7 @@ import {
7
7
  FIXED_AVM_STARTUP_L2_GAS,
8
8
  FIXED_DA_GAS,
9
9
  FIXED_L2_GAS,
10
+ GeneratorIndex,
10
11
  L2_GAS_PER_CONTRACT_CLASS_LOG,
11
12
  L2_GAS_PER_PRIVATE_LOG,
12
13
  MAX_CONTRACT_CLASS_LOGS_PER_TX,
@@ -17,7 +18,7 @@ import {
17
18
  MAX_PRIVATE_LOGS_PER_TX,
18
19
  } from '@aztec/constants';
19
20
  import { arrayNonEmptyLength, padArrayEnd } from '@aztec/foundation/collection';
20
- import { poseidon2Hash } from '@aztec/foundation/crypto/poseidon';
21
+ import { poseidon2HashWithSeparator } from '@aztec/foundation/crypto/poseidon';
21
22
  import { Fr } from '@aztec/foundation/curves/bn254';
22
23
  import { type Logger, createLogger } from '@aztec/foundation/log';
23
24
  import { Timer } from '@aztec/foundation/timer';
@@ -71,8 +72,8 @@ import {
71
72
  getFinalMinRevertibleSideEffectCounter,
72
73
  } from '@aztec/stdlib/tx';
73
74
 
75
+ import type { ContractSyncService } from '../contract_sync/contract_sync_service.js';
74
76
  import type { AddressStore } from '../storage/address_store/address_store.js';
75
- import type { AnchorBlockStore } from '../storage/anchor_block_store/anchor_block_store.js';
76
77
  import type { CapsuleStore } from '../storage/capsule_store/capsule_store.js';
77
78
  import type { ContractStore } from '../storage/contract_store/contract_store.js';
78
79
  import type { NoteStore } from '../storage/note_store/note_store.js';
@@ -80,14 +81,14 @@ import type { PrivateEventStore } from '../storage/private_event_store/private_e
80
81
  import type { RecipientTaggingStore } from '../storage/tagging_store/recipient_tagging_store.js';
81
82
  import type { SenderAddressBookStore } from '../storage/tagging_store/sender_address_book_store.js';
82
83
  import type { SenderTaggingStore } from '../storage/tagging_store/sender_tagging_store.js';
84
+ import type { BenchmarkedNode } from './benchmarked_node.js';
83
85
  import { ExecutionNoteCache } from './execution_note_cache.js';
84
86
  import { ExecutionTaggingIndexCache } from './execution_tagging_index_cache.js';
85
87
  import { HashedValuesCache } from './hashed_values_cache.js';
86
88
  import { Oracle } from './oracle/oracle.js';
87
- import { executePrivateFunction, verifyCurrentClassId } from './oracle/private_execution.js';
89
+ import { executePrivateFunction } from './oracle/private_execution.js';
88
90
  import { PrivateExecutionOracle } from './oracle/private_execution_oracle.js';
89
91
  import { UtilityExecutionOracle } from './oracle/utility_execution_oracle.js';
90
- import type { ProxiedNode } from './proxied_node.js';
91
92
 
92
93
  /**
93
94
  * The contract function simulator.
@@ -101,13 +102,13 @@ export class ContractFunctionSimulator {
101
102
  private keyStore: KeyStore,
102
103
  private addressStore: AddressStore,
103
104
  private aztecNode: AztecNode,
104
- private anchorBlockStore: AnchorBlockStore,
105
105
  private senderTaggingStore: SenderTaggingStore,
106
106
  private recipientTaggingStore: RecipientTaggingStore,
107
107
  private senderAddressBookStore: SenderAddressBookStore,
108
108
  private capsuleStore: CapsuleStore,
109
109
  private privateEventStore: PrivateEventStore,
110
110
  private simulator: CircuitSimulator,
111
+ private contractSyncService: ContractSyncService,
111
112
  ) {
112
113
  this.log = createLogger('simulator');
113
114
  }
@@ -123,6 +124,7 @@ export class ContractFunctionSimulator {
123
124
  * @param senderForTags - The address that is used as a tagging sender when emitting private logs. Returned from
124
125
  * the `privateGetSenderForTags` oracle.
125
126
  * @param scopes - The accounts whose notes we can access in this call. Currently optional and will default to all.
127
+ * @param jobId - The job ID for staged writes.
126
128
  * @returns The result of the execution.
127
129
  */
128
130
  public async run(
@@ -131,17 +133,12 @@ export class ContractFunctionSimulator {
131
133
  selector: FunctionSelector,
132
134
  msgSender = AztecAddress.fromField(Fr.MAX_FIELD_VALUE),
133
135
  anchorBlockHeader: BlockHeader,
134
- senderForTags?: AztecAddress,
135
- scopes?: AztecAddress[],
136
+ senderForTags: AztecAddress | undefined,
137
+ scopes: AztecAddress[] | undefined,
138
+ jobId: string,
136
139
  ): Promise<PrivateExecutionResult> {
137
140
  const simulatorSetupTimer = new Timer();
138
141
 
139
- await this.contractStore.syncPrivateState(contractAddress, selector, privateSyncCall =>
140
- this.runUtility(privateSyncCall, [], anchorBlockHeader, scopes),
141
- );
142
-
143
- await verifyCurrentClassId(contractAddress, this.aztecNode, this.contractStore, anchorBlockHeader);
144
-
145
142
  const entryPointArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(contractAddress, selector);
146
143
 
147
144
  if (entryPointArtifact.functionType !== FunctionType.PRIVATE) {
@@ -174,7 +171,7 @@ export class ContractFunctionSimulator {
174
171
  callContext,
175
172
  anchorBlockHeader,
176
173
  async call => {
177
- await this.runUtility(call, [], anchorBlockHeader, scopes);
174
+ await this.runUtility(call, [], anchorBlockHeader, scopes, jobId);
178
175
  },
179
176
  request.authWitnesses,
180
177
  request.capsules,
@@ -186,12 +183,13 @@ export class ContractFunctionSimulator {
186
183
  this.keyStore,
187
184
  this.addressStore,
188
185
  this.aztecNode,
189
- this.anchorBlockStore,
190
186
  this.senderTaggingStore,
191
187
  this.recipientTaggingStore,
192
188
  this.senderAddressBookStore,
193
189
  this.capsuleStore,
194
190
  this.privateEventStore,
191
+ this.contractSyncService,
192
+ jobId,
195
193
  0, // totalPublicArgsCount
196
194
  startSideEffectCounter,
197
195
  undefined, // log
@@ -215,8 +213,9 @@ export class ContractFunctionSimulator {
215
213
  request.functionSelector,
216
214
  );
217
215
  const simulatorTeardownTimer = new Timer();
218
- const { usedProtocolNullifierForNonces } = noteCache.finish();
219
- const firstNullifierHint = usedProtocolNullifierForNonces ? Fr.ZERO : noteCache.getAllNullifiers()[0];
216
+
217
+ noteCache.finish();
218
+ const firstNullifierHint = noteCache.getNonceGenerator();
220
219
 
221
220
  const publicCallRequests = collectNested([executionResult], r =>
222
221
  r.publicInputs.publicCallRequests
@@ -261,10 +260,9 @@ export class ContractFunctionSimulator {
261
260
  call: FunctionCall,
262
261
  authwits: AuthWitness[],
263
262
  anchorBlockHeader: BlockHeader,
264
- scopes?: AztecAddress[],
263
+ scopes: AztecAddress[] | undefined,
264
+ jobId: string,
265
265
  ): Promise<Fr[]> {
266
- await verifyCurrentClassId(call.to, this.aztecNode, this.contractStore, anchorBlockHeader);
267
-
268
266
  const entryPointArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(call.to, call.selector);
269
267
 
270
268
  if (entryPointArtifact.functionType !== FunctionType.UTILITY) {
@@ -281,11 +279,11 @@ export class ContractFunctionSimulator {
281
279
  this.keyStore,
282
280
  this.addressStore,
283
281
  this.aztecNode,
284
- this.anchorBlockStore,
285
282
  this.recipientTaggingStore,
286
283
  this.senderAddressBookStore,
287
284
  this.capsuleStore,
288
285
  this.privateEventStore,
286
+ jobId,
289
287
  undefined,
290
288
  scopes,
291
289
  );
@@ -326,7 +324,12 @@ export class ContractFunctionSimulator {
326
324
  */
327
325
  getStats() {
328
326
  const nodeRPCCalls =
329
- typeof (this.aztecNode as ProxiedNode).getStats === 'function' ? (this.aztecNode as ProxiedNode).getStats() : {};
327
+ typeof (this.aztecNode as BenchmarkedNode).getStats === 'function'
328
+ ? (this.aztecNode as BenchmarkedNode).getStats()
329
+ : {
330
+ perMethod: {},
331
+ roundTrips: { roundTrips: 0, totalBlockingTime: 0, roundTripDurations: [], roundTripMethods: [] },
332
+ };
330
333
 
331
334
  return { nodeRPCCalls };
332
335
  }
@@ -349,15 +352,15 @@ class OrderedSideEffect<T> {
349
352
  * (allowing state overrides) and is much faster, while still generating a valid
350
353
  * output that can be sent to the node for public simulation
351
354
  * @param privateExecutionResult - The result of the private execution.
352
- * @param nonceGenerator - A nonce generator for note hashes. According to the protocol rules,
353
- * it can either be the first nullifier in the tx or the hash of the initial tx request if there are none.
354
355
  * @param contractStore - A provider for contract data in order to get function names and debug info.
356
+ * @param minRevertibleSideEffectCounterOverride - Optional override for the min revertible side effect counter.
357
+ * Used by TXE to simulate account contract behavior (setting the counter before app execution).
355
358
  * @returns The simulated proving result.
356
359
  */
357
360
  export async function generateSimulatedProvingResult(
358
361
  privateExecutionResult: PrivateExecutionResult,
359
- nonceGenerator: Fr,
360
362
  contractStore: ContractStore,
363
+ minRevertibleSideEffectCounterOverride?: number,
361
364
  ): Promise<PrivateKernelExecutionProofOutput<PrivateKernelTailCircuitPublicInputs>> {
362
365
  const siloedNoteHashes: OrderedSideEffect<Fr>[] = [];
363
366
  const nullifiers: OrderedSideEffect<Fr>[] = [];
@@ -398,7 +401,10 @@ export async function generateSimulatedProvingResult(
398
401
 
399
402
  const privateLogsFromExecution = await Promise.all(
400
403
  execution.publicInputs.privateLogs.getActiveItems().map(async metadata => {
401
- metadata.log.fields[0] = await poseidon2Hash([contractAddress, metadata.log.fields[0]]);
404
+ metadata.log.fields[0] = await poseidon2HashWithSeparator(
405
+ [contractAddress, metadata.log.fields[0]],
406
+ GeneratorIndex.PRIVATE_LOG_FIRST_FIELD,
407
+ );
402
408
  return new OrderedSideEffect(metadata.log, metadata.counter);
403
409
  }),
404
410
  );
@@ -461,16 +467,18 @@ export async function generateSimulatedProvingResult(
461
467
  const getEffect = <T>(orderedSideEffect: OrderedSideEffect<T>) => orderedSideEffect.sideEffect;
462
468
 
463
469
  const isPrivateOnlyTx = privateExecutionResult.publicFunctionCalldata.length === 0;
464
- const minRevertibleSideEffectCounter = getFinalMinRevertibleSideEffectCounter(privateExecutionResult);
470
+ const minRevertibleSideEffectCounter =
471
+ minRevertibleSideEffectCounterOverride ?? getFinalMinRevertibleSideEffectCounter(privateExecutionResult);
465
472
 
466
473
  const [nonRevertibleNullifiers, revertibleNullifiers] = splitOrderedSideEffects(
467
474
  nullifiers.sort(sortByCounter),
468
475
  minRevertibleSideEffectCounter,
469
476
  );
470
- if (nonRevertibleNullifiers.length > 0 && !nonRevertibleNullifiers[0].equals(nonceGenerator)) {
477
+ const nonceGenerator = privateExecutionResult.firstNullifier;
478
+ if (nonRevertibleNullifiers.length === 0) {
479
+ nonRevertibleNullifiers.push(nonceGenerator);
480
+ } else if (!nonRevertibleNullifiers[0].equals(nonceGenerator)) {
471
481
  throw new Error('The first non revertible nullifier should be equal to the nonce generator. This is a bug!');
472
- } else {
473
- nonRevertibleNullifiers.unshift(nonceGenerator);
474
482
  }
475
483
 
476
484
  if (isPrivateOnlyTx) {
@@ -506,6 +514,12 @@ export async function generateSimulatedProvingResult(
506
514
  siloedNoteHashes.sort(sortByCounter),
507
515
  minRevertibleSideEffectCounter,
508
516
  );
517
+ const nonRevertibleUniqueNoteHashes = await Promise.all(
518
+ nonRevertibleNoteHashes.map(async (noteHash, i) => {
519
+ const nonce = await computeNoteHashNonce(nonceGenerator, i);
520
+ return await computeUniqueNoteHash(nonce, noteHash);
521
+ }),
522
+ );
509
523
  const [nonRevertibleL2ToL1Messages, revertibleL2ToL1Messages] = splitOrderedSideEffects(
510
524
  l2ToL1Messages.sort(sortByCounter),
511
525
  minRevertibleSideEffectCounter,
@@ -524,7 +538,7 @@ export async function generateSimulatedProvingResult(
524
538
  );
525
539
 
526
540
  const nonRevertibleData = new PrivateToPublicAccumulatedData(
527
- padArrayEnd(nonRevertibleNoteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX),
541
+ padArrayEnd(nonRevertibleUniqueNoteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX),
528
542
  padArrayEnd(nonRevertibleNullifiers, Fr.ZERO, MAX_NULLIFIERS_PER_TX),
529
543
  padArrayEnd(nonRevertibleL2ToL1Messages, ScopedL2ToL1Message.empty(), MAX_L2_TO_L1_MSGS_PER_TX),
530
544
  padArrayEnd(nonRevertibleTaggedPrivateLogs, PrivateLog.empty(), MAX_PRIVATE_LOGS_PER_TX),
@@ -572,7 +586,7 @@ function splitOrderedSideEffects<T>(effects: OrderedSideEffect<T>[], minRevertib
572
586
  const revertibleSideEffects: T[] = [];
573
587
  const nonRevertibleSideEffects: T[] = [];
574
588
  effects.forEach(effect => {
575
- if (effect.counter < minRevertibleSideEffectCounter) {
589
+ if (minRevertibleSideEffectCounter === 0 || effect.counter < minRevertibleSideEffectCounter) {
576
590
  nonRevertibleSideEffects.push(effect.sideEffect);
577
591
  } else {
578
592
  revertibleSideEffects.push(effect.sideEffect);
@@ -32,19 +32,22 @@ export class ExecutionNoteCache {
32
32
  private nullifierMap: Map<bigint, Set<bigint>> = new Map();
33
33
 
34
34
  /**
35
- * All nullifiers emitted in this transaction.
35
+ * Nullifiers emitted by private calls in this transaction.
36
36
  */
37
- private allNullifiers: Set<bigint> = new Set();
37
+ private emittedNullifiers: Set<bigint> = new Set();
38
38
 
39
+ /**
40
+ * The counter that separates non-revertible side effects (which persist even if the tx reverts) from revertible ones.
41
+ */
39
42
  private minRevertibleSideEffectCounter = 0;
40
43
 
41
44
  private inRevertiblePhase = false;
42
45
 
43
46
  /**
44
- * We don't need to use the tx request hash for nonces if another non revertible nullifier is emitted.
45
- * In that case we disable injecting the tx request hash as a nullifier.
47
+ * Whether the protocol nullifier was used for nonce generation.
48
+ * We don't need to use the protocol nullifier if a non-revertible nullifier is emitted.
46
49
  */
47
- private usedProtocolNullifierForNonces = true;
50
+ private usedProtocolNullifierForNonces: boolean | undefined;
48
51
 
49
52
  constructor(private readonly protocolNullifier: Fr) {}
50
53
 
@@ -60,17 +63,18 @@ export class ExecutionNoteCache {
60
63
  }
61
64
  this.inRevertiblePhase = true;
62
65
  this.minRevertibleSideEffectCounter = minRevertibleSideEffectCounter;
63
- let nonceGenerator = this.protocolNullifier;
64
- const nullifiers = this.getAllNullifiers();
65
- if (nullifiers.length > 0) {
66
- nonceGenerator = new Fr(nullifiers[0]);
67
- this.usedProtocolNullifierForNonces = false;
68
- }
66
+
67
+ const nullifiers = this.getEmittedNullifiers();
68
+ // If there are no nullifiers emitted by private calls so far, we use the protocol nullifier as the nonce generator.
69
+ // Note: There could still be nullifiers emitted after the counter is set, but those nullifiers are revertible, so
70
+ // we don't want to use them as the nonce generator.
71
+ this.usedProtocolNullifierForNonces = nullifiers.length === 0;
72
+ const nonceGenerator = this.usedProtocolNullifierForNonces ? this.protocolNullifier : new Fr(nullifiers[0]);
69
73
 
70
74
  // The existing pending notes are all non-revertible.
71
75
  // They cannot be squashed by nullifiers emitted after minRevertibleSideEffectCounter is set.
72
76
  // Their indexes in the tx are known at this point and won't change. So we can assign a nonce to each one of them.
73
- // The nonces will be used to create the "complete" nullifier.
77
+ // The nonces will be used to create the "unique" note hashes.
74
78
  const updatedNotes = await Promise.all(
75
79
  this.notes.map(async ({ note, counter }, i) => {
76
80
  const noteNonce = await computeNoteHashNonce(nonceGenerator, i);
@@ -99,15 +103,11 @@ export class ExecutionNoteCache {
99
103
  }
100
104
 
101
105
  public finish() {
102
- // If we never entered the revertible phase, we need to use the protocol nullifier to compute the nonces for the
103
- // notes if no nullifiers have been emitted.
106
+ // If we never entered the revertible phase, and there are no nullifiers emitted, we need to use the protocol
107
+ // nullifier as the nonce generator.
104
108
  if (!this.inRevertiblePhase) {
105
- this.usedProtocolNullifierForNonces = this.getAllNullifiers().length === 0;
109
+ this.usedProtocolNullifierForNonces = this.getEmittedNullifiers().length === 0;
106
110
  }
107
- // If we entered the revertible phase, the nonce generator was decided based on wether or not a nullifier was emitted before entering.
108
- return {
109
- usedProtocolNullifierForNonces: this.usedProtocolNullifierForNonces,
110
- };
111
111
  }
112
112
 
113
113
  /**
@@ -150,11 +150,11 @@ export class ExecutionNoteCache {
150
150
 
151
151
  // If the note is non revertible and the nullifier was emitted in the revertible phase, both the note hash and the nullifier will be emitted
152
152
  if (this.inRevertiblePhase && note.counter < this.minRevertibleSideEffectCounter) {
153
- this.recordNullifier(contractAddress, siloedNullifier);
153
+ this.#recordNullifier(contractAddress, siloedNullifier);
154
154
  }
155
155
  } else {
156
156
  // If the note being nullified comes from a previous tx the nullifier will be emitted.
157
- this.recordNullifier(contractAddress, siloedNullifier);
157
+ this.#recordNullifier(contractAddress, siloedNullifier);
158
158
  }
159
159
  return nullifiedNoteHashCounter;
160
160
  }
@@ -166,7 +166,7 @@ export class ExecutionNoteCache {
166
166
  */
167
167
  public async nullifierCreated(contractAddress: AztecAddress, innerNullifier: Fr) {
168
168
  const siloedNullifier = (await siloNullifier(contractAddress, innerNullifier)).toBigInt();
169
- this.recordNullifier(contractAddress, siloedNullifier);
169
+ this.#recordNullifier(contractAddress, siloedNullifier);
170
170
  }
171
171
 
172
172
  /**
@@ -215,11 +215,30 @@ export class ExecutionNoteCache {
215
215
  return this.notes;
216
216
  }
217
217
 
218
+ /**
219
+ * @returns All nullifiers emitted by private calls in this transaction.
220
+ */
221
+ getEmittedNullifiers(): Fr[] {
222
+ return [...this.emittedNullifiers].map(n => new Fr(n));
223
+ }
224
+
225
+ /**
226
+ * @returns All nullifiers emitted by private calls in this transaction. If the protocol nullifier was used as the
227
+ * nonce generator, it is injected as the first nullifier.
228
+ */
218
229
  getAllNullifiers(): Fr[] {
219
- return [...this.allNullifiers].map(n => new Fr(n));
230
+ if (this.usedProtocolNullifierForNonces === undefined) {
231
+ throw new Error('usedProtocolNullifierForNonces is not set yet. Call finish() to complete the transaction.');
232
+ }
233
+ const allNullifiers = this.getEmittedNullifiers();
234
+ return [...(this.usedProtocolNullifierForNonces ? [this.protocolNullifier] : []), ...allNullifiers];
235
+ }
236
+
237
+ getNonceGenerator(): Fr {
238
+ return this.getAllNullifiers()[0];
220
239
  }
221
240
 
222
- recordNullifier(contractAddress: AztecAddress, siloedNullifier: bigint) {
241
+ #recordNullifier(contractAddress: AztecAddress, siloedNullifier: bigint) {
223
242
  const nullifiers = this.getNullifiers(contractAddress);
224
243
 
225
244
  if (nullifiers.has(siloedNullifier)) {
@@ -228,6 +247,6 @@ export class ExecutionNoteCache {
228
247
 
229
248
  nullifiers.add(siloedNullifier);
230
249
  this.nullifierMap.set(contractAddress.toBigInt(), nullifiers);
231
- this.allNullifiers.add(siloedNullifier);
250
+ this.emittedNullifiers.add(siloedNullifier);
232
251
  }
233
252
  }
@@ -9,5 +9,5 @@ export { PrivateExecutionOracle } from './oracle/private_execution_oracle.js';
9
9
  export { Oracle } from './oracle/oracle.js';
10
10
  export { executePrivateFunction, extractPrivateCircuitPublicInputs } from './oracle/private_execution.js';
11
11
  export { generateSimulatedProvingResult } from './contract_function_simulator.js';
12
- export { packAsRetrievedNote } from './oracle/note_packing_utils.js';
12
+ export { packAsHintedNote } from './oracle/note_packing_utils.js';
13
13
  export { UtilityContext } from './noir-structs/utility_context.js';
@@ -8,13 +8,14 @@ import { TxHash } from '@aztec/stdlib/tx';
8
8
  const MAX_EVENT_SERIALIZED_LEN = 12;
9
9
 
10
10
  /**
11
- * Intermediate struct used to perform batch event validation by PXE. The `utilityValidateEnqueuedNotesAndEvents` oracle
11
+ * Intermediate struct used to perform batch event validation by PXE. The `utilityValidateAndStoreEnqueuedNotesAndEvents` oracle
12
12
  * expects for values of this type to be stored in a `CapsuleArray`.
13
13
  */
14
14
  export class EventValidationRequest {
15
15
  constructor(
16
16
  public contractAddress: AztecAddress,
17
17
  public eventTypeId: EventSelector,
18
+ public randomness: Fr,
18
19
  public serializedEvent: Fr[],
19
20
  public eventCommitment: Fr,
20
21
  public txHash: TxHash,
@@ -27,6 +28,8 @@ export class EventValidationRequest {
27
28
  const contractAddress = AztecAddress.fromField(reader.readField());
28
29
  const eventTypeId = EventSelector.fromField(reader.readField());
29
30
 
31
+ const randomness = reader.readField();
32
+
30
33
  const eventStorage = reader.readFieldArray(MAX_EVENT_SERIALIZED_LEN);
31
34
  const eventLen = reader.readField().toNumber();
32
35
  const serializedEvent = eventStorage.slice(0, eventLen);
@@ -38,6 +41,7 @@ export class EventValidationRequest {
38
41
  return new EventValidationRequest(
39
42
  contractAddress,
40
43
  eventTypeId,
44
+ randomness,
41
45
  serializedEvent,
42
46
  eventCommitment,
43
47
  txHash,
@@ -7,7 +7,7 @@ import { TxHash } from '@aztec/stdlib/tx';
7
7
  export const MAX_NOTE_PACKED_LEN = 10;
8
8
 
9
9
  /**
10
- * Intermediate struct used to perform batch note validation by PXE. The `utilityValidateEnqueuedNotesAndEvents` oracle
10
+ * Intermediate struct used to perform batch note validation by PXE. The `utilityValidateAndStoreEnqueuedNotesAndEvents` oracle
11
11
  * expects for values of this type to be stored in a `CapsuleArray`.
12
12
  */
13
13
  export class NoteValidationRequest {
@@ -1,42 +1,23 @@
1
- import { Fr } from '@aztec/foundation/curves/bn254';
2
- import type { FieldsOf } from '@aztec/foundation/types';
1
+ import { toACVMField } from '@aztec/simulator/client';
3
2
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
4
- import type { UInt64 } from '@aztec/stdlib/types';
3
+ import type { BlockHeader } from '@aztec/stdlib/tx';
5
4
 
6
5
  /**
7
6
  * TypeScript counterpart of utility_context.nr. Used only as a return value for the utilityGetUtilityContext oracle.
8
7
  */
9
8
  export class UtilityContext {
10
- private constructor(
11
- public readonly blockNumber: number,
12
- public readonly timestamp: UInt64,
9
+ constructor(
10
+ public readonly blockHeader: BlockHeader,
13
11
  public readonly contractAddress: AztecAddress,
14
- public readonly version: Fr,
15
- public readonly chainId: Fr,
16
12
  ) {}
17
13
 
18
- static from(fields: FieldsOf<UtilityContext>) {
19
- return new UtilityContext(
20
- fields.blockNumber,
21
- fields.timestamp,
22
- fields.contractAddress,
23
- fields.version,
24
- fields.chainId,
25
- );
26
- }
27
-
28
14
  /**
29
15
  * Returns a representation of the utility context as expected by intrinsic Noir deserialization.
30
16
  * The order of the fields has to be the same as the order of the fields in the utility_context.nr.
31
17
  */
32
18
  public toNoirRepresentation(): (string | string[])[] {
33
19
  // TODO(#12874): remove the stupid as string conversion by modifying ForeignCallOutput type in acvm.js
34
- return [
35
- new Fr(this.blockNumber).toString() as string,
36
- new Fr(this.timestamp).toString() as string,
37
- this.contractAddress.toString() as string,
38
- this.version.toString() as string,
39
- this.chainId.toString() as string,
40
- ];
20
+ const blockHeaderFields = this.blockHeader.toFields().map(toACVMField);
21
+ return [...blockHeaderFields, this.contractAddress.toString() as string];
41
22
  }
42
23
  }