@aztec/pxe 0.0.1-commit.e6bd8901 → 0.0.1-commit.ec7ac5448

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 (257) hide show
  1. package/dest/bin/check_oracle_version.js +4 -4
  2. package/dest/block_synchronizer/block_synchronizer.d.ts +5 -3
  3. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
  4. package/dest/block_synchronizer/block_synchronizer.js +17 -5
  5. package/dest/config/index.d.ts +2 -2
  6. package/dest/config/index.d.ts.map +1 -1
  7. package/dest/config/index.js +1 -1
  8. package/dest/config/package_info.js +1 -1
  9. package/dest/contract_function_simulator/contract_function_simulator.d.ts +60 -31
  10. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  11. package/dest/contract_function_simulator/contract_function_simulator.js +201 -74
  12. package/dest/contract_function_simulator/ephemeral_array_service.d.ts +28 -0
  13. package/dest/contract_function_simulator/ephemeral_array_service.d.ts.map +1 -0
  14. package/dest/contract_function_simulator/ephemeral_array_service.js +78 -0
  15. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts +7 -7
  16. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts.map +1 -1
  17. package/dest/contract_function_simulator/execution_tagging_index_cache.js +19 -11
  18. package/dest/contract_function_simulator/index.d.ts +2 -1
  19. package/dest/contract_function_simulator/index.d.ts.map +1 -1
  20. package/dest/contract_function_simulator/index.js +1 -0
  21. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +4 -6
  22. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts.map +1 -1
  23. package/dest/contract_function_simulator/noir-structs/event_validation_request.js +8 -10
  24. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts +1 -1
  25. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.js +1 -1
  26. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts +2 -2
  27. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts.map +1 -1
  28. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.js +2 -4
  29. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +4 -7
  30. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts.map +1 -1
  31. package/dest/contract_function_simulator/noir-structs/note_validation_request.js +6 -11
  32. package/dest/contract_function_simulator/oracle/interfaces.d.ts +62 -46
  33. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  34. package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.d.ts +9 -0
  35. package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.d.ts.map +1 -0
  36. package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.js +47 -0
  37. package/dest/contract_function_simulator/oracle/oracle.d.ts +75 -44
  38. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
  39. package/dest/contract_function_simulator/oracle/oracle.js +310 -113
  40. package/dest/contract_function_simulator/oracle/private_execution.js +5 -3
  41. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +53 -79
  42. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  43. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +109 -89
  44. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +124 -67
  45. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  46. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +326 -140
  47. package/dest/contract_function_simulator/pick_notes.d.ts +1 -1
  48. package/dest/contract_function_simulator/pick_notes.d.ts.map +1 -1
  49. package/dest/contract_function_simulator/pick_notes.js +9 -2
  50. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts +1 -1
  51. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts.map +1 -1
  52. package/dest/contract_function_simulator/proxied_contract_data_source.js +3 -0
  53. package/dest/contract_logging.d.ts +27 -0
  54. package/dest/contract_logging.d.ts.map +1 -0
  55. package/dest/contract_logging.js +38 -0
  56. package/dest/contract_sync/contract_sync_service.d.ts +44 -0
  57. package/dest/contract_sync/contract_sync_service.d.ts.map +1 -0
  58. package/dest/contract_sync/contract_sync_service.js +104 -0
  59. package/dest/contract_sync/helpers.d.ts +28 -0
  60. package/dest/contract_sync/helpers.d.ts.map +1 -0
  61. package/dest/contract_sync/{index.js → helpers.js} +20 -16
  62. package/dest/debug/pxe_debug_utils.d.ts +24 -10
  63. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  64. package/dest/debug/pxe_debug_utils.js +28 -18
  65. package/dest/entrypoints/client/bundle/index.d.ts +3 -1
  66. package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
  67. package/dest/entrypoints/client/bundle/index.js +2 -0
  68. package/dest/entrypoints/client/bundle/utils.d.ts +2 -2
  69. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  70. package/dest/entrypoints/client/bundle/utils.js +23 -9
  71. package/dest/entrypoints/client/lazy/index.d.ts +3 -1
  72. package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
  73. package/dest/entrypoints/client/lazy/index.js +2 -0
  74. package/dest/entrypoints/client/lazy/utils.d.ts +3 -3
  75. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  76. package/dest/entrypoints/client/lazy/utils.js +24 -10
  77. package/dest/entrypoints/pxe_creation_options.d.ts +5 -2
  78. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  79. package/dest/entrypoints/pxe_creation_options.js +3 -1
  80. package/dest/entrypoints/server/index.d.ts +4 -3
  81. package/dest/entrypoints/server/index.d.ts.map +1 -1
  82. package/dest/entrypoints/server/index.js +3 -2
  83. package/dest/entrypoints/server/utils.d.ts +2 -2
  84. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  85. package/dest/entrypoints/server/utils.js +30 -11
  86. package/dest/events/event_service.d.ts +5 -5
  87. package/dest/events/event_service.d.ts.map +1 -1
  88. package/dest/events/event_service.js +20 -9
  89. package/dest/job_coordinator/job_coordinator.d.ts +3 -2
  90. package/dest/job_coordinator/job_coordinator.d.ts.map +1 -1
  91. package/dest/job_coordinator/job_coordinator.js +3 -2
  92. package/dest/logs/log_service.d.ts +8 -9
  93. package/dest/logs/log_service.d.ts.map +1 -1
  94. package/dest/logs/log_service.js +38 -62
  95. package/dest/messages/message_context_service.d.ts +17 -0
  96. package/dest/messages/message_context_service.d.ts.map +1 -0
  97. package/dest/messages/message_context_service.js +36 -0
  98. package/dest/notes/note_service.d.ts +7 -8
  99. package/dest/notes/note_service.d.ts.map +1 -1
  100. package/dest/notes/note_service.js +23 -15
  101. package/dest/notes_filter.d.ts +24 -0
  102. package/dest/notes_filter.d.ts.map +1 -0
  103. package/dest/notes_filter.js +4 -0
  104. package/dest/oracle_version.d.ts +4 -3
  105. package/dest/oracle_version.d.ts.map +1 -1
  106. package/dest/oracle_version.js +20 -10
  107. package/dest/private_kernel/hints/compute_tx_expiration_timestamp.d.ts +4 -0
  108. package/dest/private_kernel/hints/compute_tx_expiration_timestamp.d.ts.map +1 -0
  109. package/dest/private_kernel/hints/{compute_tx_include_by_timestamp.js → compute_tx_expiration_timestamp.js} +12 -12
  110. package/dest/private_kernel/hints/index.d.ts +1 -1
  111. package/dest/private_kernel/hints/index.js +1 -1
  112. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +4 -3
  113. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -1
  114. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.js +129 -68
  115. package/dest/private_kernel/hints/test_utils.d.ts +122 -0
  116. package/dest/private_kernel/hints/test_utils.d.ts.map +1 -0
  117. package/dest/private_kernel/hints/test_utils.js +203 -0
  118. package/dest/private_kernel/private_kernel_execution_prover.d.ts +3 -2
  119. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  120. package/dest/private_kernel/private_kernel_execution_prover.js +21 -13
  121. package/dest/private_kernel/private_kernel_oracle.d.ts +8 -4
  122. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  123. package/dest/private_kernel/private_kernel_oracle.js +7 -3
  124. package/dest/pxe.d.ts +73 -24
  125. package/dest/pxe.d.ts.map +1 -1
  126. package/dest/pxe.js +131 -78
  127. package/dest/storage/address_store/address_store.d.ts +1 -1
  128. package/dest/storage/address_store/address_store.d.ts.map +1 -1
  129. package/dest/storage/address_store/address_store.js +12 -11
  130. package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -1
  131. package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
  132. package/dest/storage/anchor_block_store/anchor_block_store.js +8 -1
  133. package/dest/storage/capsule_store/capsule_service.d.ts +21 -0
  134. package/dest/storage/capsule_store/capsule_service.d.ts.map +1 -0
  135. package/dest/storage/capsule_store/capsule_service.js +50 -0
  136. package/dest/storage/capsule_store/capsule_store.d.ts +9 -9
  137. package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
  138. package/dest/storage/capsule_store/capsule_store.js +39 -36
  139. package/dest/storage/capsule_store/index.d.ts +2 -1
  140. package/dest/storage/capsule_store/index.d.ts.map +1 -1
  141. package/dest/storage/capsule_store/index.js +1 -0
  142. package/dest/storage/contract_store/contract_store.d.ts +42 -15
  143. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  144. package/dest/storage/contract_store/contract_store.js +157 -72
  145. package/dest/storage/metadata.d.ts +1 -1
  146. package/dest/storage/metadata.js +1 -1
  147. package/dest/storage/note_store/note_store.d.ts +13 -3
  148. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  149. package/dest/storage/note_store/note_store.js +147 -107
  150. package/dest/storage/private_event_store/private_event_store.d.ts +1 -1
  151. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  152. package/dest/storage/private_event_store/private_event_store.js +84 -61
  153. package/dest/storage/private_event_store/stored_private_event.d.ts +4 -4
  154. package/dest/storage/private_event_store/stored_private_event.d.ts.map +1 -1
  155. package/dest/storage/private_event_store/stored_private_event.js +2 -2
  156. package/dest/storage/tagging_store/recipient_tagging_store.d.ts +6 -6
  157. package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
  158. package/dest/storage/tagging_store/recipient_tagging_store.js +31 -19
  159. package/dest/storage/tagging_store/sender_address_book_store.d.ts +1 -1
  160. package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +1 -1
  161. package/dest/storage/tagging_store/sender_address_book_store.js +20 -14
  162. package/dest/storage/tagging_store/sender_tagging_store.d.ts +29 -28
  163. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  164. package/dest/storage/tagging_store/sender_tagging_store.js +233 -137
  165. package/dest/tagging/get_all_logs_by_tags.d.ts +4 -4
  166. package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -1
  167. package/dest/tagging/get_all_logs_by_tags.js +17 -3
  168. package/dest/tagging/index.d.ts +3 -3
  169. package/dest/tagging/index.d.ts.map +1 -1
  170. package/dest/tagging/index.js +1 -1
  171. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +5 -6
  172. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +1 -1
  173. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +7 -7
  174. package/dest/tagging/recipient_sync/utils/find_highest_indexes.js +2 -2
  175. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +7 -8
  176. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +1 -1
  177. package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +12 -11
  178. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +5 -9
  179. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
  180. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +13 -7
  181. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +4 -3
  182. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
  183. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +20 -10
  184. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +6 -8
  185. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
  186. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +36 -24
  187. package/package.json +25 -16
  188. package/src/bin/check_oracle_version.ts +4 -4
  189. package/src/block_synchronizer/block_synchronizer.ts +29 -19
  190. package/src/config/index.ts +1 -1
  191. package/src/config/package_info.ts +1 -1
  192. package/src/contract_function_simulator/contract_function_simulator.ts +360 -133
  193. package/src/contract_function_simulator/ephemeral_array_service.ts +110 -0
  194. package/src/contract_function_simulator/execution_tagging_index_cache.ts +19 -14
  195. package/src/contract_function_simulator/index.ts +1 -0
  196. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +9 -9
  197. package/src/contract_function_simulator/noir-structs/log_retrieval_request.ts +1 -1
  198. package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +2 -5
  199. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +4 -10
  200. package/src/contract_function_simulator/oracle/interfaces.ts +90 -62
  201. package/src/contract_function_simulator/oracle/legacy_oracle_mappings.ts +104 -0
  202. package/src/contract_function_simulator/oracle/oracle.ts +391 -150
  203. package/src/contract_function_simulator/oracle/private_execution.ts +4 -4
  204. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +136 -187
  205. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +544 -174
  206. package/src/contract_function_simulator/pick_notes.ts +9 -2
  207. package/src/contract_function_simulator/proxied_contract_data_source.ts +8 -1
  208. package/src/contract_logging.ts +52 -0
  209. package/src/contract_sync/contract_sync_service.ts +170 -0
  210. package/src/contract_sync/{index.ts → helpers.ts} +23 -25
  211. package/src/debug/pxe_debug_utils.ts +63 -19
  212. package/src/entrypoints/client/bundle/index.ts +2 -0
  213. package/src/entrypoints/client/bundle/utils.ts +18 -18
  214. package/src/entrypoints/client/lazy/index.ts +2 -0
  215. package/src/entrypoints/client/lazy/utils.ts +19 -18
  216. package/src/entrypoints/pxe_creation_options.ts +9 -1
  217. package/src/entrypoints/server/index.ts +3 -2
  218. package/src/entrypoints/server/utils.ts +24 -29
  219. package/src/events/event_service.ts +21 -10
  220. package/src/job_coordinator/job_coordinator.ts +4 -3
  221. package/src/logs/log_service.ts +72 -106
  222. package/src/messages/message_context_service.ts +44 -0
  223. package/src/notes/note_service.ts +24 -16
  224. package/src/notes_filter.ts +24 -0
  225. package/src/oracle_version.ts +20 -10
  226. package/src/private_kernel/hints/{compute_tx_include_by_timestamp.ts → compute_tx_expiration_timestamp.ts} +13 -13
  227. package/src/private_kernel/hints/index.ts +1 -1
  228. package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +164 -117
  229. package/src/private_kernel/hints/test_utils.ts +325 -0
  230. package/src/private_kernel/private_kernel_execution_prover.ts +25 -15
  231. package/src/private_kernel/private_kernel_oracle.ts +9 -9
  232. package/src/pxe.ts +243 -131
  233. package/src/storage/address_store/address_store.ts +15 -15
  234. package/src/storage/anchor_block_store/anchor_block_store.ts +8 -0
  235. package/src/storage/capsule_store/capsule_service.ts +90 -0
  236. package/src/storage/capsule_store/capsule_store.ts +42 -34
  237. package/src/storage/capsule_store/index.ts +1 -0
  238. package/src/storage/contract_store/contract_store.ts +186 -76
  239. package/src/storage/metadata.ts +1 -1
  240. package/src/storage/note_store/note_store.ts +166 -132
  241. package/src/storage/private_event_store/private_event_store.ts +102 -81
  242. package/src/storage/private_event_store/stored_private_event.ts +3 -3
  243. package/src/storage/tagging_store/recipient_tagging_store.ts +38 -24
  244. package/src/storage/tagging_store/sender_address_book_store.ts +20 -14
  245. package/src/storage/tagging_store/sender_tagging_store.ts +287 -156
  246. package/src/tagging/get_all_logs_by_tags.ts +31 -7
  247. package/src/tagging/index.ts +2 -2
  248. package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +9 -12
  249. package/src/tagging/recipient_sync/utils/find_highest_indexes.ts +2 -2
  250. package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +12 -17
  251. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +25 -12
  252. package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +26 -11
  253. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +30 -29
  254. package/dest/contract_sync/index.d.ts +0 -23
  255. package/dest/contract_sync/index.d.ts.map +0 -1
  256. package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts +0 -4
  257. package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts.map +0 -1
@@ -1,45 +1,46 @@
1
1
  import { createLogger } from '@aztec/foundation/log';
2
2
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
3
- import { L2BlockHash } from '@aztec/stdlib/block';
4
- import { DirectionalAppTaggingSecret, PendingTaggedLog, SiloedTag } from '@aztec/stdlib/logs';
3
+ import { ExtendedDirectionalAppTaggingSecret, PendingTaggedLog, SiloedTag } from '@aztec/stdlib/logs';
5
4
  import { LogRetrievalResponse } from '../contract_function_simulator/noir-structs/log_retrieval_response.js';
6
5
  import { getAllPrivateLogsByTags, getAllPublicLogsByTagsFromContract, loadPrivateLogsForSenderRecipientPair } from '../tagging/index.js';
7
6
  export class LogService {
8
7
  aztecNode;
9
- anchorBlockStore;
8
+ anchorBlockHeader;
10
9
  keyStore;
11
- capsuleStore;
12
10
  recipientTaggingStore;
13
11
  senderAddressBookStore;
14
12
  addressStore;
15
13
  jobId;
16
14
  log;
17
- constructor(aztecNode, anchorBlockStore, keyStore, capsuleStore, recipientTaggingStore, senderAddressBookStore, addressStore, jobId){
15
+ constructor(aztecNode, anchorBlockHeader, keyStore, recipientTaggingStore, senderAddressBookStore, addressStore, jobId, bindings){
18
16
  this.aztecNode = aztecNode;
19
- this.anchorBlockStore = anchorBlockStore;
17
+ this.anchorBlockHeader = anchorBlockHeader;
20
18
  this.keyStore = keyStore;
21
- this.capsuleStore = capsuleStore;
22
19
  this.recipientTaggingStore = recipientTaggingStore;
23
20
  this.senderAddressBookStore = senderAddressBookStore;
24
21
  this.addressStore = addressStore;
25
22
  this.jobId = jobId;
26
- this.log = createLogger('log_service');
23
+ this.log = createLogger('pxe:log_service', bindings);
27
24
  }
28
- async bulkRetrieveLogs(logRetrievalRequests) {
25
+ async fetchLogsByTag(contractAddress, logRetrievalRequests) {
26
+ for (const request of logRetrievalRequests){
27
+ if (!contractAddress.equals(request.contractAddress)) {
28
+ throw new Error(`Got a log retrieval request from ${request.contractAddress}, expected ${contractAddress}`);
29
+ }
30
+ }
29
31
  return await Promise.all(logRetrievalRequests.map(async (request)=>{
30
32
  const [publicLog, privateLog] = await Promise.all([
31
33
  this.#getPublicLogByTag(request.tag, request.contractAddress),
32
- this.#getPrivateLogByTag(await SiloedTag.compute(request.tag, request.contractAddress))
34
+ this.#getPrivateLogByTag(await SiloedTag.computeFromTagAndApp(request.tag, request.contractAddress))
33
35
  ]);
34
36
  if (publicLog !== null && privateLog !== null) {
35
- throw new Error(`Found both a public and private log when searching for tag ${request.tag} from contract ${request.contractAddress}`);
37
+ this.log.warn(`Found both a public and private log for tag ${request.tag} from contract ${request.contractAddress}. This may indicate a contract bug. Returning the public log.`);
36
38
  }
37
39
  return publicLog ?? privateLog;
38
40
  }));
39
41
  }
40
42
  async #getPublicLogByTag(tag, contractAddress) {
41
- const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
42
- const anchorBlockHash = L2BlockHash.fromField(await anchorBlockHeader.hash());
43
+ const anchorBlockHash = await this.anchorBlockHeader.hash();
43
44
  const allLogsPerTag = await getAllPublicLogsByTagsFromContract(this.aztecNode, contractAddress, [
44
45
  tag
45
46
  ], anchorBlockHash);
@@ -47,15 +48,13 @@ export class LogService {
47
48
  if (logsForTag.length === 0) {
48
49
  return null;
49
50
  } else if (logsForTag.length > 1) {
50
- // TODO(#11627): handle this case
51
- throw new Error(`Got ${logsForTag.length} logs for tag ${tag} and contract ${contractAddress.toString()}. getPublicLogByTag currently only supports a single log per tag`);
51
+ this.log.warn(`Expected at most 1 public log for tag ${tag} and contract ${contractAddress.toString()}, got ${logsForTag.length}. This may indicate a contract bug. Returning the first log.`);
52
52
  }
53
53
  const scopedLog = logsForTag[0];
54
54
  return new LogRetrievalResponse(scopedLog.logData.slice(1), scopedLog.txHash, scopedLog.noteHashes, scopedLog.firstNullifier);
55
55
  }
56
56
  async #getPrivateLogByTag(siloedTag) {
57
- const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
58
- const anchorBlockHash = L2BlockHash.fromField(await anchorBlockHeader.hash());
57
+ const anchorBlockHash = await this.anchorBlockHeader.hash();
59
58
  const allLogsPerTag = await getAllPrivateLogsByTags(this.aztecNode, [
60
59
  siloedTag
61
60
  ], anchorBlockHash);
@@ -63,39 +62,27 @@ export class LogService {
63
62
  if (logsForTag.length === 0) {
64
63
  return null;
65
64
  } else if (logsForTag.length > 1) {
66
- // TODO(#11627): handle this case
67
- throw new Error(`Got ${logsForTag.length} logs for tag ${siloedTag}. getPrivateLogByTag currently only supports a single log per tag`);
65
+ this.log.warn(`Expected at most 1 private log for tag ${siloedTag}, got ${logsForTag.length}. This may indicate a contract bug. Returning the first log.`);
68
66
  }
69
67
  const scopedLog = logsForTag[0];
70
68
  return new LogRetrievalResponse(scopedLog.logData.slice(1), scopedLog.txHash, scopedLog.noteHashes, scopedLog.firstNullifier);
71
69
  }
72
- async syncTaggedLogs(contractAddress, pendingTaggedLogArrayBaseSlot, scopes) {
73
- this.log.verbose('Searching for tagged logs', {
74
- contract: contractAddress
75
- });
70
+ async fetchTaggedLogs(contractAddress, recipient) {
71
+ this.log.verbose(`Fetching tagged logs for ${contractAddress.toString()}`);
76
72
  // We only load logs from block up to and including the anchor block number
77
- const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
78
- const anchorBlockNumber = anchorBlockHeader.getBlockNumber();
79
- const anchorBlockHash = L2BlockHash.fromField(await anchorBlockHeader.hash());
80
- // Determine recipients: use scopes if provided, otherwise get all accounts
81
- const recipients = scopes && scopes.length > 0 ? scopes : await this.keyStore.getAccounts();
82
- // For each recipient, fetch secrets, load logs, and store them.
83
- // We run these per-recipient tasks in parallel so that logs are loaded for all recipients concurrently.
84
- await Promise.all(recipients.map(async (recipient)=>{
85
- // Get all secrets for this recipient (one per sender)
86
- const secrets = await this.#getSecretsForSenders(contractAddress, recipient);
87
- // Load logs for all sender-recipient pairs in parallel
88
- const logArrays = await Promise.all(secrets.map((secret)=>loadPrivateLogsForSenderRecipientPair(secret, contractAddress, this.aztecNode, this.recipientTaggingStore, anchorBlockNumber, anchorBlockHash, this.jobId)));
89
- // Flatten all logs from all secrets
90
- const allLogs = logArrays.flat();
91
- // Store the logs for this recipient
92
- if (allLogs.length > 0) {
93
- await this.#storePendingTaggedLogs(contractAddress, pendingTaggedLogArrayBaseSlot, recipient, allLogs);
94
- }
95
- }));
73
+ const anchorBlockNumber = this.anchorBlockHeader.getBlockNumber();
74
+ const anchorBlockHash = await this.anchorBlockHeader.hash();
75
+ // Get all secrets for this recipient (one per sender)
76
+ const secrets = await this.#getSecretsForSenders(contractAddress, recipient);
77
+ // Load logs for all sender-recipient pairs in parallel
78
+ const logArrays = await Promise.all(secrets.map((secret)=>loadPrivateLogsForSenderRecipientPair(secret, this.aztecNode, this.recipientTaggingStore, anchorBlockNumber, anchorBlockHash, this.jobId)));
79
+ return logArrays.flat().map((scopedLog)=>new PendingTaggedLog(scopedLog.logData, scopedLog.txHash, scopedLog.noteHashes, scopedLog.firstNullifier));
96
80
  }
97
81
  async #getSecretsForSenders(contractAddress, recipient) {
98
- const recipientCompleteAddress = await this.#getCompleteAddress(recipient);
82
+ const recipientCompleteAddress = await this.addressStore.getCompleteAddress(recipient);
83
+ if (!recipientCompleteAddress) {
84
+ return [];
85
+ }
99
86
  const recipientIvsk = await this.keyStore.getMasterIncomingViewingSecretKey(recipient);
100
87
  // We implicitly add all PXE accounts as senders, this helps us decrypt tags on notes that we send to ourselves
101
88
  // (recipient = us, sender = us)
@@ -105,25 +92,14 @@ export class LogService {
105
92
  ];
106
93
  // We deduplicate the senders by adding them to a set and then converting the set back to an array
107
94
  const deduplicatedSenders = Array.from(new Set(allSenders.map((sender)=>sender.toString()))).map((sender)=>AztecAddress.fromString(sender));
108
- return Promise.all(deduplicatedSenders.map((sender)=>{
109
- return DirectionalAppTaggingSecret.compute(recipientCompleteAddress, recipientIvsk, sender, contractAddress, recipient);
95
+ return Promise.all(deduplicatedSenders.map(async (sender)=>{
96
+ const secret = await ExtendedDirectionalAppTaggingSecret.compute(recipientCompleteAddress, recipientIvsk, sender, contractAddress, recipient);
97
+ if (!secret) {
98
+ // Note that all senders originate from either the SenderAddressBookStore or the KeyStore.
99
+ // TODO(F-512): make sure we actually prevent registering invalid senders.
100
+ throw new Error(`Failed to compute a tagging secret for sender ${sender} - this implies this is an invalid address, which should not happen as they have been previously registered in PXE.`);
101
+ }
102
+ return secret;
110
103
  }));
111
104
  }
112
- #storePendingTaggedLogs(contractAddress, capsuleArrayBaseSlot, recipient, privateLogs) {
113
- // Build all pending tagged logs from the scoped logs
114
- const pendingTaggedLogs = privateLogs.map((scopedLog)=>{
115
- const pendingTaggedLog = new PendingTaggedLog(scopedLog.logData, scopedLog.txHash, scopedLog.noteHashes, scopedLog.firstNullifier, recipient);
116
- return pendingTaggedLog.toFields();
117
- });
118
- // TODO: This looks like it could belong more at the oracle interface level
119
- return this.capsuleStore.appendToCapsuleArray(contractAddress, capsuleArrayBaseSlot, pendingTaggedLogs, this.jobId);
120
- }
121
- async #getCompleteAddress(account) {
122
- const completeAddress = await this.addressStore.getCompleteAddress(account);
123
- if (!completeAddress) {
124
- throw new Error(`No public key registered for address ${account}.
125
- Register it by calling pxe.addAccount(...).\nSee docs for context: https://docs.aztec.network/developers/resources/debugging/aztecnr-errors#simulation-error-no-public-key-registered-for-address-0x0-register-it-by-calling-pxeregisterrecipient-or-pxeregisteraccount`);
126
- }
127
- return completeAddress;
128
- }
129
105
  }
@@ -0,0 +1,17 @@
1
+ import { Fr } from '@aztec/foundation/curves/bn254';
2
+ import type { AztecNode } from '@aztec/stdlib/interfaces/server';
3
+ import { MessageContext } from '@aztec/stdlib/logs';
4
+ /** Resolves transaction hashes into the context needed to process messages. */
5
+ export declare class MessageContextService {
6
+ private readonly aztecNode;
7
+ constructor(aztecNode: AztecNode);
8
+ /**
9
+ * Resolves a list of tx hashes into their message contexts.
10
+ *
11
+ * For each tx hash, looks up the corresponding tx effect and extracts the note hashes and first nullifier needed to
12
+ * process messages that originated from that transaction. Returns `null` for tx hashes that are zero, not yet
13
+ * available, or in blocks beyond the anchor block.
14
+ */
15
+ getMessageContextsByTxHash(txHashes: Fr[], anchorBlockNumber: number): Promise<(MessageContext | null)[]>;
16
+ }
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZV9jb250ZXh0X3NlcnZpY2UuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tZXNzYWdlcy9tZXNzYWdlX2NvbnRleHRfc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEQsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBR3BELCtFQUErRTtBQUMvRSxxQkFBYSxxQkFBcUI7SUFDcEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTO0lBQXRDLFlBQTZCLFNBQVMsRUFBRSxTQUFTLEVBQUk7SUFFckQ7Ozs7OztPQU1HO0lBQ0gsMEJBQTBCLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQTBCeEc7Q0FDRiJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message_context_service.d.ts","sourceRoot":"","sources":["../../src/messages/message_context_service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGpD,+EAA+E;AAC/E,qBAAa,qBAAqB;IACpB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAAtC,YAA6B,SAAS,EAAE,SAAS,EAAI;IAErD;;;;;;OAMG;IACH,0BAA0B,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,cAAc,GAAG,IAAI,CAAC,EAAE,CAAC,CA0BxG;CACF"}
@@ -0,0 +1,36 @@
1
+ import { MessageContext } from '@aztec/stdlib/logs';
2
+ import { TxHash } from '@aztec/stdlib/tx';
3
+ /** Resolves transaction hashes into the context needed to process messages. */ export class MessageContextService {
4
+ aztecNode;
5
+ constructor(aztecNode){
6
+ this.aztecNode = aztecNode;
7
+ }
8
+ /**
9
+ * Resolves a list of tx hashes into their message contexts.
10
+ *
11
+ * For each tx hash, looks up the corresponding tx effect and extracts the note hashes and first nullifier needed to
12
+ * process messages that originated from that transaction. Returns `null` for tx hashes that are zero, not yet
13
+ * available, or in blocks beyond the anchor block.
14
+ */ getMessageContextsByTxHash(txHashes, anchorBlockNumber) {
15
+ // TODO: optimize, we might be hitting the node to get the same txHash repeatedly
16
+ return Promise.all(txHashes.map(async (txHashField)=>{
17
+ // A zero tx hash indicates a tx-less offchain message (e.g. one not tied to any onchain transaction).
18
+ // These messages don't have a transaction context to resolve, so we return null.
19
+ if (txHashField.isZero()) {
20
+ return null;
21
+ }
22
+ const txHash = TxHash.fromField(txHashField);
23
+ const txEffect = await this.aztecNode.getTxEffect(txHash);
24
+ if (!txEffect || txEffect.l2BlockNumber > anchorBlockNumber) {
25
+ return null;
26
+ }
27
+ // Every tx has at least one nullifier (the first nullifier derived from the tx hash). Hitting this condition
28
+ // would mean a buggy node, but since we need to access data.nullifiers[0], the defensive check does no harm.
29
+ const data = txEffect.data;
30
+ if (data.nullifiers.length === 0) {
31
+ throw new Error(`Tx effect for ${txHash} has no nullifiers`);
32
+ }
33
+ return new MessageContext(data.txHash, data.noteHashes, data.nullifiers[0]);
34
+ }));
35
+ }
36
+ }
@@ -2,15 +2,14 @@ import { Fr } from '@aztec/foundation/curves/bn254';
2
2
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
3
3
  import { type AztecNode } from '@aztec/stdlib/interfaces/client';
4
4
  import { Note, NoteStatus } from '@aztec/stdlib/note';
5
- import type { TxHash } from '@aztec/stdlib/tx';
6
- import type { AnchorBlockStore } from '../storage/anchor_block_store/anchor_block_store.js';
5
+ import type { BlockHeader, TxHash } from '@aztec/stdlib/tx';
7
6
  import type { NoteStore } from '../storage/note_store/note_store.js';
8
7
  export declare class NoteService {
9
8
  private readonly noteStore;
10
9
  private readonly aztecNode;
11
- private readonly anchorBlockStore;
10
+ private readonly anchorBlockHeader;
12
11
  private readonly jobId;
13
- constructor(noteStore: NoteStore, aztecNode: AztecNode, anchorBlockStore: AnchorBlockStore, jobId: string);
12
+ constructor(noteStore: NoteStore, aztecNode: AztecNode, anchorBlockHeader: BlockHeader, jobId: string);
14
13
  /**
15
14
  * Retrieves a set of notes stored in the database for a given contract address and storage slot.
16
15
  * The query result is paginated using 'limit' and 'offset' values.
@@ -20,7 +19,7 @@ export declare class NoteService {
20
19
  * @param status - The status of notes to fetch.
21
20
  * @param scopes - The accounts whose notes we can access in this call. Currently optional and will default to all.
22
21
  */
23
- getNotes(contractAddress: AztecAddress, owner: AztecAddress | undefined, storageSlot: Fr, status: NoteStatus, scopes?: AztecAddress[]): Promise<{
22
+ getNotes(contractAddress: AztecAddress, owner: AztecAddress | undefined, storageSlot: Fr, status: NoteStatus, scopes: AztecAddress[]): Promise<{
24
23
  contractAddress: AztecAddress;
25
24
  owner: AztecAddress;
26
25
  storageSlot: Fr;
@@ -43,7 +42,7 @@ export declare class NoteService {
43
42
  *
44
43
  * @param contractAddress - The contract whose notes should be checked and nullified.
45
44
  */
46
- syncNoteNullifiers(contractAddress: AztecAddress): Promise<void>;
47
- validateAndStoreNote(contractAddress: AztecAddress, owner: AztecAddress, storageSlot: Fr, randomness: Fr, noteNonce: Fr, content: Fr[], noteHash: Fr, nullifier: Fr, txHash: TxHash, recipient: AztecAddress): Promise<void>;
45
+ syncNoteNullifiers(contractAddress: AztecAddress, scopes: AztecAddress[]): Promise<void>;
46
+ validateAndStoreNote(contractAddress: AztecAddress, owner: AztecAddress, storageSlot: Fr, randomness: Fr, noteNonce: Fr, content: Fr[], noteHash: Fr, nullifier: Fr, txHash: TxHash, scope: AztecAddress): Promise<void>;
48
47
  }
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90ZV9zZXJ2aWNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbm90ZXMvbm90ZV9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUloRSxPQUFPLEVBQUUsS0FBSyxTQUFTLEVBQWUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsSUFBSSxFQUFXLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRS9ELE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRS9DLE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDNUYsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFckUscUJBQWEsV0FBVztJQUVwQixPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVM7SUFDMUIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTO0lBQzFCLE9BQU8sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCO0lBQ2pDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSztJQUp4QixZQUNtQixTQUFTLEVBQUUsU0FBUyxFQUNwQixTQUFTLEVBQUUsU0FBUyxFQUNwQixnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFDbEMsS0FBSyxFQUFFLE1BQU0sRUFDNUI7SUFFSjs7Ozs7Ozs7T0FRRztJQUNVLFFBQVEsQ0FDbkIsZUFBZSxFQUFFLFlBQVksRUFDN0IsS0FBSyxFQUFFLFlBQVksR0FBRyxTQUFTLEVBQy9CLFdBQVcsRUFBRSxFQUFFLEVBQ2YsTUFBTSxFQUFFLFVBQVUsRUFDbEIsTUFBTSxDQUFDLEVBQUUsWUFBWSxFQUFFOzs7Ozs7Ozs7O1NBeUJ4QjtJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ1Usa0JBQWtCLENBQUMsZUFBZSxFQUFFLFlBQVksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBc0M1RTtJQUVZLG9CQUFvQixDQUMvQixlQUFlLEVBQUUsWUFBWSxFQUM3QixLQUFLLEVBQUUsWUFBWSxFQUNuQixXQUFXLEVBQUUsRUFBRSxFQUNmLFVBQVUsRUFBRSxFQUFFLEVBQ2QsU0FBUyxFQUFFLEVBQUUsRUFDYixPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQ2IsUUFBUSxFQUFFLEVBQUUsRUFDWixTQUFTLEVBQUUsRUFBRSxFQUNiLE1BQU0sRUFBRSxNQUFNLEVBQ2QsU0FBUyxFQUFFLFlBQVksR0FDdEIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQXVFZjtDQUNGIn0=
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90ZV9zZXJ2aWNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbm90ZXMvbm90ZV9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUdoRSxPQUFPLEVBQUUsS0FBSyxTQUFTLEVBQWUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsSUFBSSxFQUFXLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRS9ELE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUU1RCxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUVyRSxxQkFBYSxXQUFXO0lBRXBCLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUztJQUMxQixPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVM7SUFDMUIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUI7SUFDbEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLO0lBSnhCLFlBQ21CLFNBQVMsRUFBRSxTQUFTLEVBQ3BCLFNBQVMsRUFBRSxTQUFTLEVBQ3BCLGlCQUFpQixFQUFFLFdBQVcsRUFDOUIsS0FBSyxFQUFFLE1BQU0sRUFDNUI7SUFFSjs7Ozs7Ozs7T0FRRztJQUNVLFFBQVEsQ0FDbkIsZUFBZSxFQUFFLFlBQVksRUFDN0IsS0FBSyxFQUFFLFlBQVksR0FBRyxTQUFTLEVBQy9CLFdBQVcsRUFBRSxFQUFFLEVBQ2YsTUFBTSxFQUFFLFVBQVUsRUFDbEIsTUFBTSxFQUFFLFlBQVksRUFBRTs7Ozs7Ozs7OztTQXlCdkI7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNVLGtCQUFrQixDQUFDLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FzQ3BHO0lBRVksb0JBQW9CLENBQy9CLGVBQWUsRUFBRSxZQUFZLEVBQzdCLEtBQUssRUFBRSxZQUFZLEVBQ25CLFdBQVcsRUFBRSxFQUFFLEVBQ2YsVUFBVSxFQUFFLEVBQUUsRUFDZCxTQUFTLEVBQUUsRUFBRSxFQUNiLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFDYixRQUFRLEVBQUUsRUFBRSxFQUNaLFNBQVMsRUFBRSxFQUFFLEVBQ2IsTUFBTSxFQUFFLE1BQU0sRUFDZCxLQUFLLEVBQUUsWUFBWSxHQUNsQixPQUFPLENBQUMsSUFBSSxDQUFDLENBaUZmO0NBQ0YifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"note_service.d.ts","sourceRoot":"","sources":["../../src/notes/note_service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAIhE,OAAO,EAAE,KAAK,SAAS,EAAe,MAAM,iCAAiC,CAAC;AAC9E,OAAO,EAAE,IAAI,EAAW,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAE/D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qDAAqD,CAAC;AAC5F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAErE,qBAAa,WAAW;IAEpB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJxB,YACmB,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,EACpB,gBAAgB,EAAE,gBAAgB,EAClC,KAAK,EAAE,MAAM,EAC5B;IAEJ;;;;;;;;OAQG;IACU,QAAQ,CACnB,eAAe,EAAE,YAAY,EAC7B,KAAK,EAAE,YAAY,GAAG,SAAS,EAC/B,WAAW,EAAE,EAAE,EACf,MAAM,EAAE,UAAU,EAClB,MAAM,CAAC,EAAE,YAAY,EAAE;;;;;;;;;;SAyBxB;IAED;;;;;;;;;;;OAWG;IACU,kBAAkB,CAAC,eAAe,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAsC5E;IAEY,oBAAoB,CAC/B,eAAe,EAAE,YAAY,EAC7B,KAAK,EAAE,YAAY,EACnB,WAAW,EAAE,EAAE,EACf,UAAU,EAAE,EAAE,EACd,SAAS,EAAE,EAAE,EACb,OAAO,EAAE,EAAE,EAAE,EACb,QAAQ,EAAE,EAAE,EACZ,SAAS,EAAE,EAAE,EACb,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,YAAY,GACtB,OAAO,CAAC,IAAI,CAAC,CAuEf;CACF"}
1
+ {"version":3,"file":"note_service.d.ts","sourceRoot":"","sources":["../../src/notes/note_service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAGhE,OAAO,EAAE,KAAK,SAAS,EAAe,MAAM,iCAAiC,CAAC;AAC9E,OAAO,EAAE,IAAI,EAAW,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAE/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAErE,qBAAa,WAAW;IAEpB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJxB,YACmB,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,EACpB,iBAAiB,EAAE,WAAW,EAC9B,KAAK,EAAE,MAAM,EAC5B;IAEJ;;;;;;;;OAQG;IACU,QAAQ,CACnB,eAAe,EAAE,YAAY,EAC7B,KAAK,EAAE,YAAY,GAAG,SAAS,EAC/B,WAAW,EAAE,EAAE,EACf,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,YAAY,EAAE;;;;;;;;;;SAyBvB;IAED;;;;;;;;;;;OAWG;IACU,kBAAkB,CAAC,eAAe,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsCpG;IAEY,oBAAoB,CAC/B,eAAe,EAAE,YAAY,EAC7B,KAAK,EAAE,YAAY,EACnB,WAAW,EAAE,EAAE,EACf,UAAU,EAAE,EAAE,EACd,SAAS,EAAE,EAAE,EACb,OAAO,EAAE,EAAE,EAAE,EACb,QAAQ,EAAE,EAAE,EACZ,SAAS,EAAE,EAAE,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,IAAI,CAAC,CAiFf;CACF"}
@@ -1,4 +1,3 @@
1
- import { L2BlockHash } from '@aztec/stdlib/block';
2
1
  import { computeUniqueNoteHash, siloNoteHash, siloNullifier } from '@aztec/stdlib/hash';
3
2
  import { MAX_RPC_LEN } from '@aztec/stdlib/interfaces/client';
4
3
  import { Note, NoteDao } from '@aztec/stdlib/note';
@@ -6,12 +5,12 @@ import { MerkleTreeId } from '@aztec/stdlib/trees';
6
5
  export class NoteService {
7
6
  noteStore;
8
7
  aztecNode;
9
- anchorBlockStore;
8
+ anchorBlockHeader;
10
9
  jobId;
11
- constructor(noteStore, aztecNode, anchorBlockStore, jobId){
10
+ constructor(noteStore, aztecNode, anchorBlockHeader, jobId){
12
11
  this.noteStore = noteStore;
13
12
  this.aztecNode = aztecNode;
14
- this.anchorBlockStore = anchorBlockStore;
13
+ this.anchorBlockHeader = anchorBlockHeader;
15
14
  this.jobId = jobId;
16
15
  }
17
16
  /**
@@ -53,10 +52,11 @@ export class NoteService {
53
52
  * This allows recent nullifications to be processed even if the node is not an archive node.
54
53
  *
55
54
  * @param contractAddress - The contract whose notes should be checked and nullified.
56
- */ async syncNoteNullifiers(contractAddress) {
57
- const anchorBlockHash = L2BlockHash.fromField(await (await this.anchorBlockStore.getBlockHeader()).hash());
55
+ */ async syncNoteNullifiers(contractAddress, scopes) {
56
+ const anchorBlockHash = await this.anchorBlockHeader.hash();
58
57
  const contractNotes = await this.noteStore.getNotes({
59
- contractAddress
58
+ contractAddress,
59
+ scopes
60
60
  }, this.jobId);
61
61
  if (contractNotes.length === 0) {
62
62
  return;
@@ -87,7 +87,7 @@ export class NoteService {
87
87
  }).filter((nullifier)=>nullifier !== undefined);
88
88
  await this.noteStore.applyNullifiers(foundNullifiers, this.jobId);
89
89
  }
90
- async validateAndStoreNote(contractAddress, owner, storageSlot, randomness, noteNonce, content, noteHash, nullifier, txHash, recipient) {
90
+ async validateAndStoreNote(contractAddress, owner, storageSlot, randomness, noteNonce, content, noteHash, nullifier, txHash, scope) {
91
91
  // We are going to store the new note in the NoteStore, which will let us later return it via `getNotes`.
92
92
  // There's two things we need to check before we do this however:
93
93
  // - we must make sure the note does actually exist in the note hash tree
@@ -106,9 +106,8 @@ export class NoteService {
106
106
  // number which *should* be recent enough to be available, even for non-archive nodes.
107
107
  // Also note that the note should never be ahead of the synced block here since `fetchTaggedLogs` only processes
108
108
  // logs up to the synced block making this only an additional safety check.
109
- const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
110
- const anchorBlockNumber = anchorBlockHeader.getBlockNumber();
111
- const anchorBlockHash = L2BlockHash.fromField(await anchorBlockHeader.hash());
109
+ const anchorBlockNumber = this.anchorBlockHeader.getBlockNumber();
110
+ const anchorBlockHash = await this.anchorBlockHeader.hash();
112
111
  // By computing siloed and unique note hashes ourselves we prevent contracts from interfering with the note storage
113
112
  // of other contracts, which would constitute a security breach.
114
113
  const uniqueNoteHash = await computeUniqueNoteHash(noteNonce, await siloNoteHash(contractAddress, noteHash));
@@ -120,21 +119,30 @@ export class NoteService {
120
119
  ])
121
120
  ]);
122
121
  if (!txEffect) {
123
- throw new Error(`Could not find tx effect for tx hash ${txHash}`);
122
+ // We error out instead of just logging a warning and skipping the note because this would indicate a bug. This
123
+ // is because the node has already served info about this tx either when obtaining the log (TxScopedL2Log contain
124
+ // tx info) or when getting metadata for the offchain message (before the message got passed to `process_log`).
125
+ throw new Error(`Could not find tx effect for tx hash ${txHash} when processing a note.`);
124
126
  }
125
127
  if (txEffect.l2BlockNumber > anchorBlockNumber) {
126
- throw new Error(`Could not find tx effect for tx hash ${txHash} as of block number ${anchorBlockNumber}`);
128
+ // If the message was delivered onchain, this would indicate a bug: log sync should never load logs from blocks
129
+ // newer than the anchor block. If the note came via an offchain message, it would likely also be a bug, since we
130
+ // sync a new anchor block before calling `process_message`. For this not to be a bug, the message would need to
131
+ // come from a newer block than the anchor served by the node, implying the node isn't properly synced.
132
+ // We therefore error out here rather than assuming the offchain message was constructed by a malicious
133
+ // sender with the intention of bricking recipient's PXE (if we assumed that we would just ignore the message).
134
+ throw new Error(`Obtained a newer tx effect for ${txHash} for a note validation request than the anchor block ${anchorBlockNumber}. This is a bug as we should not ever be processing a note from a newer block than the anchor block.`);
127
135
  }
128
136
  // Find the index of the note hash in the noteHashes array to determine note ordering within the tx
129
137
  const noteIndexInTx = txEffect.data.noteHashes.findIndex((nh)=>nh.equals(uniqueNoteHash));
130
138
  if (noteIndexInTx === -1) {
139
+ // Similar to the comment above - we error out as this would indicate a bug in nonce discovery.
131
140
  throw new Error(`Note hash ${noteHash} (uniqued as ${uniqueNoteHash}) is not present in tx ${txHash}`);
132
141
  }
133
142
  const noteDao = new NoteDao(new Note(content), contractAddress, owner, storageSlot, randomness, noteNonce, noteHash, siloedNullifier, txHash, txEffect.l2BlockNumber, txEffect.l2BlockHash.toString(), txEffect.txIndexInBlock, noteIndexInTx);
134
- // The note was found by `recipient`, so we use that as the scope when storing the note.
135
143
  await this.noteStore.addNotes([
136
144
  noteDao
137
- ], recipient, this.jobId);
145
+ ], scope, this.jobId);
138
146
  if (nullifierIndex !== undefined) {
139
147
  // We found nullifier index which implies that the note has already been nullified.
140
148
  const { data: _, ...blockHashAndNum } = nullifierIndex;
@@ -0,0 +1,24 @@
1
+ import type { Fr } from '@aztec/foundation/curves/bn254';
2
+ import type { AztecAddress } from '@aztec/stdlib/aztec-address';
3
+ import type { NoteStatus } from '@aztec/stdlib/note';
4
+ /**
5
+ * A filter used to fetch notes.
6
+ * @remarks This filter is applied as an intersection of all its params.
7
+ */
8
+ export type NotesFilter = {
9
+ /**
10
+ * The contract address the note belongs to.
11
+ * @remarks Providing a contract address is required as we need that information to trigger private state sync.
12
+ */
13
+ contractAddress: AztecAddress;
14
+ /** The owner of the note. */
15
+ owner?: AztecAddress;
16
+ /** The specific storage location of the note on the contract. */
17
+ storageSlot?: Fr;
18
+ /** The status of the note. Defaults to 'ACTIVE'. */
19
+ status?: NoteStatus;
20
+ /** The siloed nullifier for the note. */
21
+ siloedNullifier?: Fr;
22
+ scopes: AztecAddress[];
23
+ };
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90ZXNfZmlsdGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbm90ZXNfZmlsdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3pELE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXJEOzs7R0FHRztBQUNILE1BQU0sTUFBTSxXQUFXLEdBQUc7SUFDeEI7OztPQUdHO0lBQ0gsZUFBZSxFQUFFLFlBQVksQ0FBQztJQUM5Qiw2QkFBNkI7SUFDN0IsS0FBSyxDQUFDLEVBQUUsWUFBWSxDQUFDO0lBQ3JCLGlFQUFpRTtJQUNqRSxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDakIsb0RBQW9EO0lBQ3BELE1BQU0sQ0FBQyxFQUFFLFVBQVUsQ0FBQztJQUNwQix5Q0FBeUM7SUFDekMsZUFBZSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQ3JCLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQztDQUN4QixDQUFDIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notes_filter.d.ts","sourceRoot":"","sources":["../src/notes_filter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB;;;OAGG;IACH,eAAe,EAAE,YAAY,CAAC;IAC9B,6BAA6B;IAC7B,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,iEAAiE;IACjE,WAAW,CAAC,EAAE,EAAE,CAAC;IACjB,oDAAoD;IACpD,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,yCAAyC;IACzC,eAAe,CAAC,EAAE,EAAE,CAAC;IACrB,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB,CAAC"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * A filter used to fetch notes.
3
+ * @remarks This filter is applied as an intersection of all its params.
4
+ */ export { };
@@ -1,3 +1,4 @@
1
- export declare const ORACLE_VERSION = 9;
2
- export declare const ORACLE_INTERFACE_HASH = "9866cc52510acaef75a3d47a0ed501fd9ff92b9d53b2c8a88c8a3ffd04ced81f";
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JhY2xlX3ZlcnNpb24uZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcmFjbGVfdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxlQUFPLE1BQU0sY0FBYyxJQUFJLENBQUM7QUFLaEMsZUFBTyxNQUFNLHFCQUFxQixxRUFBcUUsQ0FBQyJ9
1
+ export declare const ORACLE_VERSION_MAJOR = 22;
2
+ export declare const ORACLE_VERSION_MINOR = 1;
3
+ export declare const ORACLE_INTERFACE_HASH = "efafa0db2cc1f94e26d794d0079c8f71115261df0c3d0fa8cb5b64f17a12db92";
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JhY2xlX3ZlcnNpb24uZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcmFjbGVfdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFZQSxlQUFPLE1BQU0sb0JBQW9CLEtBQUssQ0FBQztBQUN2QyxlQUFPLE1BQU0sb0JBQW9CLElBQUksQ0FBQztBQVF0QyxlQUFPLE1BQU0scUJBQXFCLHFFQUFxRSxDQUFDIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"oracle_version.d.ts","sourceRoot":"","sources":["../src/oracle_version.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,cAAc,IAAI,CAAC;AAKhC,eAAO,MAAM,qBAAqB,qEAAqE,CAAC"}
1
+ {"version":3,"file":"oracle_version.d.ts","sourceRoot":"","sources":["../src/oracle_version.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAQtC,eAAO,MAAM,qBAAqB,qEAAqE,CAAC"}
@@ -1,11 +1,21 @@
1
- /// The ORACLE_VERSION constant is used to check that the oracle interface is in sync between PXE and Aztec.nr. We need
2
- /// to version the oracle interface to ensure that developers get a reasonable error message if they use incompatible
3
- /// versions of Aztec.nr and PXE. The Noir counterpart is in `noir-projects/aztec-nr/aztec/src/oracle/version.nr`.
1
+ /// The oracle version constants are used to check that the oracle interface is in sync between PXE and Aztec.nr.
2
+ /// We version the oracle interface as `major.minor` where:
3
+ /// - `major` = backward-breaking changes (must match exactly between PXE and Aztec.nr)
4
+ /// - `minor` = oracle additions (non-breaking; PXE minor >= contract minor)
4
5
  ///
5
- /// @dev Whenever a contract function or Noir test is run, the `utilityAssertCompatibleOracleVersion` oracle is called
6
- /// and if the oracle version is incompatible an error is thrown.
7
- export const ORACLE_VERSION = 9;
8
- /// This hash is computed as by hashing the Oracle interface and it is used to detect when the Oracle interface changes,
9
- /// which in turn implies that you need to update the ORACLE_VERSION constant in this file and in
10
- /// `noir-projects/aztec-nr/aztec/src/oracle/version.nr`.
11
- export const ORACLE_INTERFACE_HASH = '9866cc52510acaef75a3d47a0ed501fd9ff92b9d53b2c8a88c8a3ffd04ced81f';
6
+ /// The Noir counterparts are in `noir-projects/aztec-nr/aztec/src/oracle/version.nr`.
7
+ ///
8
+ /// @dev Whenever a contract function or Noir test is run, the `aztec_utl_assertCompatibleOracleVersion` oracle is called.
9
+ /// If the major version is incompatible, an error is thrown immediately. The minor version is recorded by the PXE and
10
+ /// used to provide helpful error messages if a contract calls an oracle that doesn't exist. We don't throw immediately
11
+ /// if AZTEC_NR_MINOR > PXE_MINOR because if a contract is updated to use a newer Aztec.nr dependency without actually
12
+ /// using any of the new oracles then there is no reason to throw.
13
+ export const ORACLE_VERSION_MAJOR = 22;
14
+ export const ORACLE_VERSION_MINOR = 1;
15
+ /// This hash is computed from the Oracle interface and is used to detect when that interface changes. When it does,
16
+ /// you need to either:
17
+ /// - increment `ORACLE_VERSION_MAJOR` and reset `ORACLE_VERSION_MINOR` to zero if the change is breaking, or
18
+ /// - increment only `ORACLE_VERSION_MINOR` if the change is additive (a new oracle was added).
19
+ ///
20
+ /// These constants must be kept in sync between this file and `noir-projects/aztec-nr/aztec/src/oracle/version.nr`.
21
+ export const ORACLE_INTERFACE_HASH = 'efafa0db2cc1f94e26d794d0079c8f71115261df0c3d0fa8cb5b64f17a12db92';
@@ -0,0 +1,4 @@
1
+ import type { PrivateKernelCircuitPublicInputs } from '@aztec/stdlib/kernel';
2
+ import type { UInt64 } from '@aztec/stdlib/types';
3
+ export declare function computeTxExpirationTimestamp(previousKernel: PrivateKernelCircuitPublicInputs, txLifetime?: number): UInt64;
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHV0ZV90eF9leHBpcmF0aW9uX3RpbWVzdGFtcC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3ByaXZhdGVfa2VybmVsL2hpbnRzL2NvbXB1dGVfdHhfZXhwaXJhdGlvbl90aW1lc3RhbXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RSxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQXFCbEQsd0JBQWdCLDRCQUE0QixDQUMxQyxjQUFjLEVBQUUsZ0NBQWdDLEVBQ2hELFVBQVUsU0FBa0IsR0FDM0IsTUFBTSxDQStCUiJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute_tx_expiration_timestamp.d.ts","sourceRoot":"","sources":["../../../src/private_kernel/hints/compute_tx_expiration_timestamp.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAqBlD,wBAAgB,4BAA4B,CAC1C,cAAc,EAAE,gCAAgC,EAChD,UAAU,SAAkB,GAC3B,MAAM,CA+BR"}
@@ -1,41 +1,41 @@
1
- import { MAX_INCLUDE_BY_TIMESTAMP_DURATION } from '@aztec/constants';
1
+ import { MAX_TX_LIFETIME } from '@aztec/constants';
2
2
  const ROUNDED_DURATIONS = [
3
3
  3600,
4
4
  1800,
5
5
  1
6
6
  ];
7
- function roundTimestamp(blockTimestamp, includeByTimestamp) {
7
+ function roundTimestamp(blockTimestamp, expirationTimestamp) {
8
8
  return ROUNDED_DURATIONS.reduce((timestamp, duration)=>{
9
9
  if (timestamp <= blockTimestamp) {
10
10
  // The timestamp must be greater than the block timestamp.
11
11
  // If it is too small, round it down again using a smaller duration.
12
- const totalDuration = includeByTimestamp - blockTimestamp;
12
+ const totalDuration = expirationTimestamp - blockTimestamp;
13
13
  const roundedDuration = totalDuration - totalDuration % BigInt(duration);
14
14
  return blockTimestamp + roundedDuration;
15
15
  }
16
16
  return timestamp;
17
17
  }, 0n);
18
18
  }
19
- export function computeTxIncludeByTimestamp(previousKernel, maxDuration = MAX_INCLUDE_BY_TIMESTAMP_DURATION) {
20
- if (maxDuration > MAX_INCLUDE_BY_TIMESTAMP_DURATION) {
21
- throw new Error(`Custom max duration cannot be greater than the max allowed. Max allowed: ${MAX_INCLUDE_BY_TIMESTAMP_DURATION}. Custom value: ${maxDuration}.`);
19
+ export function computeTxExpirationTimestamp(previousKernel, txLifetime = MAX_TX_LIFETIME) {
20
+ if (txLifetime > MAX_TX_LIFETIME) {
21
+ throw new Error(`Custom tx lifetime cannot be greater than the max allowed. Max allowed: ${MAX_TX_LIFETIME}. Custom value: ${txLifetime}.`);
22
22
  }
23
23
  const anchorBlockTimestamp = previousKernel.constants.anchorBlockHeader.globalVariables.timestamp;
24
- const maxTimestamp = anchorBlockTimestamp + BigInt(maxDuration);
25
- const includeByTimestamp = previousKernel.includeByTimestamp;
26
- // If the includeByTimestamp set during the tx execution is greater than or equal to the max allowed duration,
24
+ const maxTimestamp = anchorBlockTimestamp + BigInt(txLifetime);
25
+ const expirationTimestamp = previousKernel.expirationTimestamp;
26
+ // If the expirationTimestamp set during the tx execution is greater than or equal to the max allowed duration,
27
27
  // use the maximum allowed timestamp.
28
28
  // Note: It shouldn't be larger than the max allowed duration, but we check for it anyway.
29
- if (includeByTimestamp >= maxTimestamp) {
29
+ if (expirationTimestamp >= maxTimestamp) {
30
30
  return maxTimestamp;
31
31
  }
32
32
  // Round it down to the nearest hour/min/second to reduce precision and avoid revealing the exact value.
33
33
  // This makes it harder for others to infer what function calls may have been used to produce a specific timestamp.
34
- const roundedTimestamp = roundTimestamp(anchorBlockTimestamp, includeByTimestamp);
34
+ const roundedTimestamp = roundTimestamp(anchorBlockTimestamp, expirationTimestamp);
35
35
  // The tx can't be published if the timestamp is the same or less than the anchor block's timestamp.
36
36
  // Future blocks will have a greater timestamp, so the tx would never be included.
37
37
  if (roundedTimestamp <= anchorBlockTimestamp) {
38
- throw new Error(`Include-by timestamp must be greater than the anchor block timestamp. Anchor block timestamp: ${anchorBlockTimestamp}. Include-by timestamp: ${includeByTimestamp}.`);
38
+ throw new Error(`Include-by timestamp must be greater than the anchor block timestamp. Anchor block timestamp: ${anchorBlockTimestamp}. Include-by timestamp: ${expirationTimestamp}.`);
39
39
  }
40
40
  return roundedTimestamp;
41
41
  }
@@ -1,3 +1,3 @@
1
1
  export * from './private_kernel_reset_private_inputs_builder.js';
2
- export * from './compute_tx_include_by_timestamp.js';
2
+ export * from './compute_tx_expiration_timestamp.js';
3
3
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wcml2YXRlX2tlcm5lbC9oaW50cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGtEQUFrRCxDQUFDO0FBQ2pFLGNBQWMsc0NBQXNDLENBQUMifQ==
@@ -1,2 +1,2 @@
1
1
  export * from './private_kernel_reset_private_inputs_builder.js';
2
- export * from './compute_tx_include_by_timestamp.js';
2
+ export * from './compute_tx_expiration_timestamp.js';
@@ -1,4 +1,4 @@
1
- import { type PrivateKernelCircuitPublicInputs, PrivateKernelResetCircuitPrivateInputs, type PrivateKernelSimulateOutput } from '@aztec/stdlib/kernel';
1
+ import { type PrivateKernelCircuitPublicInputs, PrivateKernelResetCircuitPrivateInputs, PrivateKernelResetDimensions, type PrivateKernelSimulateOutput } from '@aztec/stdlib/kernel';
2
2
  import { type PrivateCallExecutionResult } from '@aztec/stdlib/tx';
3
3
  import type { PrivateKernelOracle } from '../private_kernel_oracle.js';
4
4
  export declare class PrivateKernelResetPrivateInputsBuilder {
@@ -14,15 +14,16 @@ export declare class PrivateKernelResetPrivateInputsBuilder {
14
14
  private transientDataSquashingHints;
15
15
  private requestedDimensions;
16
16
  constructor(previousKernelOutput: PrivateKernelSimulateOutput<PrivateKernelCircuitPublicInputs>, executionStack: PrivateCallExecutionResult[], noteHashNullifierCounterMap: Map<number, number>, splitCounter: number);
17
+ getRequestedDimensions(): PrivateKernelResetDimensions;
17
18
  needsReset(): boolean;
18
19
  build(oracle: PrivateKernelOracle): Promise<PrivateKernelResetCircuitPrivateInputs>;
19
20
  private reduceReadRequestActions;
20
21
  private needsResetNoteHashReadRequests;
21
22
  private needsResetNullifierReadRequests;
22
- private needsResetNullifierKeys;
23
+ private needsResetKeyValidationRequests;
23
24
  private needsResetTransientData;
24
25
  private needsSiloNoteHashes;
25
26
  private needsSiloNullifiers;
26
27
  private needsSiloPrivateLogs;
27
28
  }
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpdmF0ZV9rZXJuZWxfcmVzZXRfcHJpdmF0ZV9pbnB1dHNfYnVpbGRlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3ByaXZhdGVfa2VybmVsL2hpbnRzL3ByaXZhdGVfa2VybmVsX3Jlc2V0X3ByaXZhdGVfaW5wdXRzX2J1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBZUEsT0FBTyxFQUtMLEtBQUssZ0NBQWdDLEVBRXJDLHNDQUFzQyxFQUd0QyxLQUFLLDJCQUEyQixFQWVqQyxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxLQUFLLDBCQUEwQixFQUFpQixNQUFNLGtCQUFrQixDQUFDO0FBR2xGLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUE0Q3ZFLHFCQUFhLHNDQUFzQztJQVkvQyxPQUFPLENBQUMsb0JBQW9CO0lBQzVCLE9BQU8sQ0FBQyxjQUFjO0lBQ3RCLE9BQU8sQ0FBQywyQkFBMkI7SUFDbkMsT0FBTyxDQUFDLFlBQVk7SUFkdEIsT0FBTyxDQUFDLGNBQWMsQ0FBbUM7SUFFekQsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUE2QjtJQUVuRCxPQUFPLENBQUMsb0JBQW9CLENBQXFFO0lBQ2pHLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBcUU7SUFDbEcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQVM7SUFDbEMsT0FBTyxDQUFDLDJCQUEyQixDQUFrRTtJQUNyRyxPQUFPLENBQUMsbUJBQW1CLENBQStCO0lBRTFELFlBQ1Usb0JBQW9CLEVBQUUsMkJBQTJCLENBQUMsZ0NBQWdDLENBQUMsRUFDbkYsY0FBYyxFQUFFLDBCQUEwQixFQUFFLEVBQzVDLDJCQUEyQixFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQ2hELFlBQVksRUFBRSxNQUFNLEVBVzdCO0lBRUQsVUFBVSxJQUFJLE9BQU8sQ0FzQnBCO0lBRUssS0FBSyxDQUFDLE1BQU0sRUFBRSxtQkFBbUIsbURBK0V0QztJQUVELE9BQU8sQ0FBQyx3QkFBd0I7SUEyQmhDLE9BQU8sQ0FBQyw4QkFBOEI7SUF1RHRDLE9BQU8sQ0FBQywrQkFBK0I7SUF1RHZDLE9BQU8sQ0FBQyx1QkFBdUI7SUFhL0IsT0FBTyxDQUFDLHVCQUF1QjtJQXNFL0IsT0FBTyxDQUFDLG1CQUFtQjtJQWMzQixPQUFPLENBQUMsbUJBQW1CO0lBa0IzQixPQUFPLENBQUMsb0JBQW9CO0NBcUI3QiJ9
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpdmF0ZV9rZXJuZWxfcmVzZXRfcHJpdmF0ZV9pbnB1dHNfYnVpbGRlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3ByaXZhdGVfa2VybmVsL2hpbnRzL3ByaXZhdGVfa2VybmVsX3Jlc2V0X3ByaXZhdGVfaW5wdXRzX2J1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBZUEsT0FBTyxFQUtMLEtBQUssZ0NBQWdDLEVBRXJDLHNDQUFzQyxFQUN0Qyw0QkFBNEIsRUFFNUIsS0FBSywyQkFBMkIsRUFhakMsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsS0FBSywwQkFBMEIsRUFBaUIsTUFBTSxrQkFBa0IsQ0FBQztBQUdsRixPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBbUN2RSxxQkFBYSxzQ0FBc0M7SUFlL0MsT0FBTyxDQUFDLG9CQUFvQjtJQUM1QixPQUFPLENBQUMsY0FBYztJQUN0QixPQUFPLENBQUMsMkJBQTJCO0lBQ25DLE9BQU8sQ0FBQyxZQUFZO0lBakJ0QixPQUFPLENBQUMsY0FBYyxDQUFtQztJQUV6RCxPQUFPLENBQUMsYUFBYSxDQUFDLENBQTZCO0lBRW5ELE9BQU8sQ0FBQyxvQkFBb0IsQ0FBcUU7SUFDakcsT0FBTyxDQUFDLHFCQUFxQixDQUFxRTtJQUNsRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBUztJQUNsQyxPQUFPLENBQUMsMkJBQTJCLENBR2pDO0lBQ0YsT0FBTyxDQUFDLG1CQUFtQixDQUF3QztJQUVuRSxZQUNVLG9CQUFvQixFQUFFLDJCQUEyQixDQUFDLGdDQUFnQyxDQUFDLEVBQ25GLGNBQWMsRUFBRSwwQkFBMEIsRUFBRSxFQUM1QywyQkFBMkIsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUNoRCxZQUFZLEVBQUUsTUFBTSxFQUk3QjtJQUVELHNCQUFzQixJQUFJLDRCQUE0QixDQUVyRDtJQUVELFVBQVUsSUFBSSxPQUFPLENBc0JwQjtJQUVLLEtBQUssQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLG1EQThFdEM7SUFFRCxPQUFPLENBQUMsd0JBQXdCO0lBMkJoQyxPQUFPLENBQUMsOEJBQThCO0lBMEV0QyxPQUFPLENBQUMsK0JBQStCO0lBeUV2QyxPQUFPLENBQUMsK0JBQStCO0lBYXZDLE9BQU8sQ0FBQyx1QkFBdUI7SUEwRi9CLE9BQU8sQ0FBQyxtQkFBbUI7SUFpQjNCLE9BQU8sQ0FBQyxtQkFBbUI7SUFpQjNCLE9BQU8sQ0FBQyxvQkFBb0I7Q0FxQjdCIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"private_kernel_reset_private_inputs_builder.d.ts","sourceRoot":"","sources":["../../../src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts"],"names":[],"mappings":"AAeA,OAAO,EAKL,KAAK,gCAAgC,EAErC,sCAAsC,EAGtC,KAAK,2BAA2B,EAejC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,KAAK,0BAA0B,EAAiB,MAAM,kBAAkB,CAAC;AAGlF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AA4CvE,qBAAa,sCAAsC;IAY/C,OAAO,CAAC,oBAAoB;IAC5B,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,2BAA2B;IACnC,OAAO,CAAC,YAAY;IAdtB,OAAO,CAAC,cAAc,CAAmC;IAEzD,OAAO,CAAC,aAAa,CAAC,CAA6B;IAEnD,OAAO,CAAC,oBAAoB,CAAqE;IACjG,OAAO,CAAC,qBAAqB,CAAqE;IAClG,OAAO,CAAC,gBAAgB,CAAC,CAAS;IAClC,OAAO,CAAC,2BAA2B,CAAkE;IACrG,OAAO,CAAC,mBAAmB,CAA+B;IAE1D,YACU,oBAAoB,EAAE,2BAA2B,CAAC,gCAAgC,CAAC,EACnF,cAAc,EAAE,0BAA0B,EAAE,EAC5C,2BAA2B,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAChD,YAAY,EAAE,MAAM,EAW7B;IAED,UAAU,IAAI,OAAO,CAsBpB;IAEK,KAAK,CAAC,MAAM,EAAE,mBAAmB,mDA+EtC;IAED,OAAO,CAAC,wBAAwB;IA2BhC,OAAO,CAAC,8BAA8B;IAuDtC,OAAO,CAAC,+BAA+B;IAuDvC,OAAO,CAAC,uBAAuB;IAa/B,OAAO,CAAC,uBAAuB;IAsE/B,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,mBAAmB;IAkB3B,OAAO,CAAC,oBAAoB;CAqB7B"}
1
+ {"version":3,"file":"private_kernel_reset_private_inputs_builder.d.ts","sourceRoot":"","sources":["../../../src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts"],"names":[],"mappings":"AAeA,OAAO,EAKL,KAAK,gCAAgC,EAErC,sCAAsC,EACtC,4BAA4B,EAE5B,KAAK,2BAA2B,EAajC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,KAAK,0BAA0B,EAAiB,MAAM,kBAAkB,CAAC;AAGlF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAmCvE,qBAAa,sCAAsC;IAe/C,OAAO,CAAC,oBAAoB;IAC5B,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,2BAA2B;IACnC,OAAO,CAAC,YAAY;IAjBtB,OAAO,CAAC,cAAc,CAAmC;IAEzD,OAAO,CAAC,aAAa,CAAC,CAA6B;IAEnD,OAAO,CAAC,oBAAoB,CAAqE;IACjG,OAAO,CAAC,qBAAqB,CAAqE;IAClG,OAAO,CAAC,gBAAgB,CAAC,CAAS;IAClC,OAAO,CAAC,2BAA2B,CAGjC;IACF,OAAO,CAAC,mBAAmB,CAAwC;IAEnE,YACU,oBAAoB,EAAE,2BAA2B,CAAC,gCAAgC,CAAC,EACnF,cAAc,EAAE,0BAA0B,EAAE,EAC5C,2BAA2B,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAChD,YAAY,EAAE,MAAM,EAI7B;IAED,sBAAsB,IAAI,4BAA4B,CAErD;IAED,UAAU,IAAI,OAAO,CAsBpB;IAEK,KAAK,CAAC,MAAM,EAAE,mBAAmB,mDA8EtC;IAED,OAAO,CAAC,wBAAwB;IA2BhC,OAAO,CAAC,8BAA8B;IA0EtC,OAAO,CAAC,+BAA+B;IAyEvC,OAAO,CAAC,+BAA+B;IAavC,OAAO,CAAC,uBAAuB;IA0F/B,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,oBAAoB;CAqB7B"}