@aztec/archiver 3.0.3 → 4.0.0-devnet.1-patch.0

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 (204) hide show
  1. package/README.md +156 -22
  2. package/dest/archiver.d.ts +136 -0
  3. package/dest/archiver.d.ts.map +1 -0
  4. package/dest/archiver.js +781 -0
  5. package/dest/{archiver/config.d.ts → config.d.ts} +11 -3
  6. package/dest/config.d.ts.map +1 -0
  7. package/dest/{archiver/config.js → config.js} +13 -4
  8. package/dest/errors.d.ts +41 -0
  9. package/dest/errors.d.ts.map +1 -0
  10. package/dest/errors.js +62 -0
  11. package/dest/factory.d.ts +9 -7
  12. package/dest/factory.d.ts.map +1 -1
  13. package/dest/factory.js +91 -11
  14. package/dest/index.d.ts +10 -4
  15. package/dest/index.d.ts.map +1 -1
  16. package/dest/index.js +8 -3
  17. package/dest/interfaces.d.ts +9 -0
  18. package/dest/interfaces.d.ts.map +1 -0
  19. package/dest/interfaces.js +3 -0
  20. package/dest/{archiver/l1 → l1}/bin/retrieve-calldata.d.ts +1 -1
  21. package/dest/l1/bin/retrieve-calldata.d.ts.map +1 -0
  22. package/dest/{archiver/l1 → l1}/bin/retrieve-calldata.js +21 -20
  23. package/dest/{archiver/l1 → l1}/calldata_retriever.d.ts +18 -4
  24. package/dest/l1/calldata_retriever.d.ts.map +1 -0
  25. package/dest/{archiver/l1 → l1}/calldata_retriever.js +75 -7
  26. package/dest/l1/data_retrieval.d.ts +88 -0
  27. package/dest/l1/data_retrieval.d.ts.map +1 -0
  28. package/dest/{archiver/l1 → l1}/data_retrieval.js +61 -67
  29. package/dest/{archiver/l1 → l1}/debug_tx.d.ts +1 -1
  30. package/dest/l1/debug_tx.d.ts.map +1 -0
  31. package/dest/{archiver/l1 → l1}/spire_proposer.d.ts +1 -1
  32. package/dest/l1/spire_proposer.d.ts.map +1 -0
  33. package/dest/{archiver/l1 → l1}/trace_tx.d.ts +1 -1
  34. package/dest/l1/trace_tx.d.ts.map +1 -0
  35. package/dest/l1/types.d.ts +12 -0
  36. package/dest/l1/types.d.ts.map +1 -0
  37. package/dest/{archiver/l1 → l1}/validate_trace.d.ts +6 -3
  38. package/dest/l1/validate_trace.d.ts.map +1 -0
  39. package/dest/{archiver/l1 → l1}/validate_trace.js +14 -10
  40. package/dest/modules/data_source_base.d.ts +84 -0
  41. package/dest/modules/data_source_base.d.ts.map +1 -0
  42. package/dest/modules/data_source_base.js +260 -0
  43. package/dest/modules/data_store_updater.d.ts +73 -0
  44. package/dest/modules/data_store_updater.d.ts.map +1 -0
  45. package/dest/modules/data_store_updater.js +302 -0
  46. package/dest/modules/instrumentation.d.ts +37 -0
  47. package/dest/modules/instrumentation.d.ts.map +1 -0
  48. package/dest/{archiver → modules}/instrumentation.js +24 -65
  49. package/dest/modules/l1_synchronizer.d.ts +75 -0
  50. package/dest/modules/l1_synchronizer.d.ts.map +1 -0
  51. package/dest/modules/l1_synchronizer.js +1112 -0
  52. package/dest/modules/validation.d.ts +17 -0
  53. package/dest/modules/validation.d.ts.map +1 -0
  54. package/dest/{archiver → modules}/validation.js +7 -1
  55. package/dest/store/block_store.d.ts +192 -0
  56. package/dest/store/block_store.d.ts.map +1 -0
  57. package/dest/store/block_store.js +721 -0
  58. package/dest/store/contract_class_store.d.ts +18 -0
  59. package/dest/store/contract_class_store.d.ts.map +1 -0
  60. package/dest/{archiver/kv_archiver_store → store}/contract_class_store.js +12 -8
  61. package/dest/store/contract_instance_store.d.ts +24 -0
  62. package/dest/store/contract_instance_store.d.ts.map +1 -0
  63. package/dest/{archiver/kv_archiver_store → store}/contract_instance_store.js +1 -1
  64. package/dest/store/kv_archiver_store.d.ts +340 -0
  65. package/dest/store/kv_archiver_store.d.ts.map +1 -0
  66. package/dest/store/kv_archiver_store.js +446 -0
  67. package/dest/store/log_store.d.ts +54 -0
  68. package/dest/store/log_store.d.ts.map +1 -0
  69. package/dest/store/log_store.js +456 -0
  70. package/dest/{archiver/kv_archiver_store → store}/message_store.d.ts +1 -1
  71. package/dest/store/message_store.d.ts.map +1 -0
  72. package/dest/{archiver/structs → structs}/data_retrieval.d.ts +1 -1
  73. package/dest/structs/data_retrieval.d.ts.map +1 -0
  74. package/dest/structs/inbox_message.d.ts +15 -0
  75. package/dest/structs/inbox_message.d.ts.map +1 -0
  76. package/dest/structs/published.d.ts +2 -0
  77. package/dest/structs/published.d.ts.map +1 -0
  78. package/dest/test/fake_l1_state.d.ts +190 -0
  79. package/dest/test/fake_l1_state.d.ts.map +1 -0
  80. package/dest/test/fake_l1_state.js +383 -0
  81. package/dest/test/index.d.ts +2 -1
  82. package/dest/test/index.d.ts.map +1 -1
  83. package/dest/test/index.js +4 -1
  84. package/dest/test/mock_archiver.d.ts +2 -2
  85. package/dest/test/mock_archiver.d.ts.map +1 -1
  86. package/dest/test/mock_archiver.js +1 -2
  87. package/dest/test/mock_l1_to_l2_message_source.d.ts +2 -2
  88. package/dest/test/mock_l1_to_l2_message_source.d.ts.map +1 -1
  89. package/dest/test/mock_l1_to_l2_message_source.js +12 -3
  90. package/dest/test/mock_l2_block_source.d.ts +29 -15
  91. package/dest/test/mock_l2_block_source.d.ts.map +1 -1
  92. package/dest/test/mock_l2_block_source.js +173 -66
  93. package/dest/test/mock_structs.d.ts +78 -3
  94. package/dest/test/mock_structs.d.ts.map +1 -1
  95. package/dest/test/mock_structs.js +140 -7
  96. package/dest/test/noop_l1_archiver.d.ts +23 -0
  97. package/dest/test/noop_l1_archiver.d.ts.map +1 -0
  98. package/dest/test/noop_l1_archiver.js +68 -0
  99. package/package.json +16 -17
  100. package/src/archiver.ts +543 -0
  101. package/src/{archiver/config.ts → config.ts} +20 -5
  102. package/src/errors.ts +102 -0
  103. package/src/factory.ts +133 -11
  104. package/src/index.ts +10 -3
  105. package/src/interfaces.ts +9 -0
  106. package/src/{archiver/l1 → l1}/bin/retrieve-calldata.ts +18 -19
  107. package/src/{archiver/l1 → l1}/calldata_retriever.ts +119 -9
  108. package/src/{archiver/l1 → l1}/data_retrieval.ts +91 -87
  109. package/src/{archiver/l1 → l1}/validate_trace.ts +25 -7
  110. package/src/modules/data_source_base.ts +367 -0
  111. package/src/modules/data_store_updater.ts +423 -0
  112. package/src/{archiver → modules}/instrumentation.ts +24 -68
  113. package/src/modules/l1_synchronizer.ts +930 -0
  114. package/src/{archiver → modules}/validation.ts +11 -6
  115. package/src/store/block_store.ts +966 -0
  116. package/src/{archiver/kv_archiver_store → store}/contract_class_store.ts +12 -8
  117. package/src/{archiver/kv_archiver_store → store}/contract_instance_store.ts +1 -1
  118. package/src/store/kv_archiver_store.ts +639 -0
  119. package/src/store/log_store.ts +637 -0
  120. package/src/{archiver/structs → structs}/published.ts +0 -1
  121. package/src/test/fake_l1_state.ts +599 -0
  122. package/src/test/index.ts +4 -0
  123. package/src/test/mock_archiver.ts +2 -2
  124. package/src/test/mock_l1_to_l2_message_source.ts +10 -4
  125. package/src/test/mock_l2_block_source.ts +189 -79
  126. package/src/test/mock_structs.ts +269 -8
  127. package/src/test/noop_l1_archiver.ts +109 -0
  128. package/dest/archiver/archiver.d.ts +0 -284
  129. package/dest/archiver/archiver.d.ts.map +0 -1
  130. package/dest/archiver/archiver.js +0 -1454
  131. package/dest/archiver/archiver_store.d.ts +0 -249
  132. package/dest/archiver/archiver_store.d.ts.map +0 -1
  133. package/dest/archiver/archiver_store.js +0 -4
  134. package/dest/archiver/archiver_store_test_suite.d.ts +0 -8
  135. package/dest/archiver/archiver_store_test_suite.d.ts.map +0 -1
  136. package/dest/archiver/archiver_store_test_suite.js +0 -1273
  137. package/dest/archiver/config.d.ts.map +0 -1
  138. package/dest/archiver/errors.d.ts +0 -12
  139. package/dest/archiver/errors.d.ts.map +0 -1
  140. package/dest/archiver/errors.js +0 -17
  141. package/dest/archiver/index.d.ts +0 -7
  142. package/dest/archiver/index.d.ts.map +0 -1
  143. package/dest/archiver/index.js +0 -4
  144. package/dest/archiver/instrumentation.d.ts +0 -37
  145. package/dest/archiver/instrumentation.d.ts.map +0 -1
  146. package/dest/archiver/kv_archiver_store/block_store.d.ts +0 -125
  147. package/dest/archiver/kv_archiver_store/block_store.d.ts.map +0 -1
  148. package/dest/archiver/kv_archiver_store/block_store.js +0 -371
  149. package/dest/archiver/kv_archiver_store/contract_class_store.d.ts +0 -18
  150. package/dest/archiver/kv_archiver_store/contract_class_store.d.ts.map +0 -1
  151. package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts +0 -24
  152. package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts.map +0 -1
  153. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +0 -162
  154. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +0 -1
  155. package/dest/archiver/kv_archiver_store/kv_archiver_store.js +0 -288
  156. package/dest/archiver/kv_archiver_store/log_store.d.ts +0 -42
  157. package/dest/archiver/kv_archiver_store/log_store.d.ts.map +0 -1
  158. package/dest/archiver/kv_archiver_store/log_store.js +0 -314
  159. package/dest/archiver/kv_archiver_store/message_store.d.ts.map +0 -1
  160. package/dest/archiver/l1/bin/retrieve-calldata.d.ts.map +0 -1
  161. package/dest/archiver/l1/calldata_retriever.d.ts.map +0 -1
  162. package/dest/archiver/l1/data_retrieval.d.ts +0 -87
  163. package/dest/archiver/l1/data_retrieval.d.ts.map +0 -1
  164. package/dest/archiver/l1/debug_tx.d.ts.map +0 -1
  165. package/dest/archiver/l1/spire_proposer.d.ts.map +0 -1
  166. package/dest/archiver/l1/trace_tx.d.ts.map +0 -1
  167. package/dest/archiver/l1/types.d.ts +0 -12
  168. package/dest/archiver/l1/types.d.ts.map +0 -1
  169. package/dest/archiver/l1/validate_trace.d.ts.map +0 -1
  170. package/dest/archiver/structs/data_retrieval.d.ts.map +0 -1
  171. package/dest/archiver/structs/inbox_message.d.ts +0 -15
  172. package/dest/archiver/structs/inbox_message.d.ts.map +0 -1
  173. package/dest/archiver/structs/published.d.ts +0 -3
  174. package/dest/archiver/structs/published.d.ts.map +0 -1
  175. package/dest/archiver/validation.d.ts +0 -17
  176. package/dest/archiver/validation.d.ts.map +0 -1
  177. package/dest/rpc/index.d.ts +0 -9
  178. package/dest/rpc/index.d.ts.map +0 -1
  179. package/dest/rpc/index.js +0 -15
  180. package/src/archiver/archiver.ts +0 -1906
  181. package/src/archiver/archiver_store.ts +0 -302
  182. package/src/archiver/archiver_store_test_suite.ts +0 -1286
  183. package/src/archiver/errors.ts +0 -26
  184. package/src/archiver/index.ts +0 -6
  185. package/src/archiver/kv_archiver_store/block_store.ts +0 -482
  186. package/src/archiver/kv_archiver_store/kv_archiver_store.ts +0 -413
  187. package/src/archiver/kv_archiver_store/log_store.ts +0 -380
  188. package/src/rpc/index.ts +0 -16
  189. /package/dest/{archiver/l1 → l1}/debug_tx.js +0 -0
  190. /package/dest/{archiver/l1 → l1}/spire_proposer.js +0 -0
  191. /package/dest/{archiver/l1 → l1}/trace_tx.js +0 -0
  192. /package/dest/{archiver/l1 → l1}/types.js +0 -0
  193. /package/dest/{archiver/kv_archiver_store → store}/message_store.js +0 -0
  194. /package/dest/{archiver/structs → structs}/data_retrieval.js +0 -0
  195. /package/dest/{archiver/structs → structs}/inbox_message.js +0 -0
  196. /package/dest/{archiver/structs → structs}/published.js +0 -0
  197. /package/src/{archiver/l1 → l1}/README.md +0 -0
  198. /package/src/{archiver/l1 → l1}/debug_tx.ts +0 -0
  199. /package/src/{archiver/l1 → l1}/spire_proposer.ts +0 -0
  200. /package/src/{archiver/l1 → l1}/trace_tx.ts +0 -0
  201. /package/src/{archiver/l1 → l1}/types.ts +0 -0
  202. /package/src/{archiver/kv_archiver_store → store}/message_store.ts +0 -0
  203. /package/src/{archiver/structs → structs}/data_retrieval.ts +0 -0
  204. /package/src/{archiver/structs → structs}/inbox_message.ts +0 -0
@@ -1,3 +1,4 @@
1
+ import type { BlobClientInterface } from '@aztec/blob-client/client';
1
2
  import {
2
3
  BlobDeserializationError,
3
4
  type CheckpointBlobData,
@@ -5,37 +6,33 @@ import {
5
6
  decodeCheckpointBlobDataFromBlobs,
6
7
  encodeBlockBlobData,
7
8
  } from '@aztec/blob-lib';
8
- import type { BlobSinkClientInterface } from '@aztec/blob-sink/client';
9
- import type { EpochProofPublicInputArgs } from '@aztec/ethereum/contracts';
10
- import type { ViemClient, ViemPublicClient, ViemPublicDebugClient } from '@aztec/ethereum/types';
9
+ import type {
10
+ CheckpointProposedLog,
11
+ EpochProofPublicInputArgs,
12
+ InboxContract,
13
+ MessageSentLog,
14
+ RollupContract,
15
+ } from '@aztec/ethereum/contracts';
16
+ import type { ViemPublicClient, ViemPublicDebugClient } from '@aztec/ethereum/types';
11
17
  import { asyncPool } from '@aztec/foundation/async-pool';
12
- import { CheckpointNumber } from '@aztec/foundation/branded-types';
13
- import { Buffer16, Buffer32 } from '@aztec/foundation/buffer';
18
+ import { CheckpointNumber, IndexWithinCheckpoint } from '@aztec/foundation/branded-types';
14
19
  import { Fr } from '@aztec/foundation/curves/bn254';
15
20
  import { EthAddress } from '@aztec/foundation/eth-address';
16
21
  import { type Logger, createLogger } from '@aztec/foundation/log';
17
- import { type InboxAbi, RollupAbi } from '@aztec/l1-artifacts';
18
- import { Body, CommitteeAttestation, L2BlockNew } from '@aztec/stdlib/block';
19
- import { Checkpoint, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
22
+ import { RollupAbi } from '@aztec/l1-artifacts';
23
+ import { Body, CommitteeAttestation, L2Block } from '@aztec/stdlib/block';
24
+ import { Checkpoint, L1PublishedData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
20
25
  import { Proof } from '@aztec/stdlib/proofs';
21
26
  import { CheckpointHeader } from '@aztec/stdlib/rollup';
22
27
  import { AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
23
28
  import { BlockHeader, GlobalVariables, PartialStateReference, StateReference } from '@aztec/stdlib/tx';
24
29
 
25
- import {
26
- type GetContractEventsReturnType,
27
- type GetContractReturnType,
28
- type Hex,
29
- decodeFunctionData,
30
- getAbiItem,
31
- hexToBytes,
32
- } from 'viem';
30
+ import { type Hex, decodeFunctionData, getAbiItem, hexToBytes } from 'viem';
33
31
 
34
32
  import { NoBlobBodiesFoundError } from '../errors.js';
35
- import type { ArchiverInstrumentation } from '../instrumentation.js';
33
+ import type { ArchiverInstrumentation } from '../modules/instrumentation.js';
36
34
  import type { DataRetrieval } from '../structs/data_retrieval.js';
37
35
  import type { InboxMessage } from '../structs/inbox_message.js';
38
- import type { L1PublishedData } from '../structs/published.js';
39
36
  import { CalldataRetriever } from './calldata_retriever.js';
40
37
 
41
38
  export type RetrievedCheckpoint = {
@@ -72,7 +69,7 @@ export async function retrievedToPublishedCheckpoint({
72
69
  const l1toL2MessageTreeRoot = blocksBlobData[0].l1ToL2MessageRoot!;
73
70
 
74
71
  const spongeBlob = SpongeBlob.init();
75
- const l2Blocks: L2BlockNew[] = [];
72
+ const l2Blocks: L2Block[] = [];
76
73
  for (let i = 0; i < blocksBlobData.length; i++) {
77
74
  const blockBlobData = blocksBlobData[i];
78
75
  const { blockEndMarker, blockEndStateField, lastArchiveRoot, noteHashRoot, nullifierRoot, publicDataRoot } =
@@ -103,7 +100,7 @@ export async function retrievedToPublishedCheckpoint({
103
100
  }),
104
101
  });
105
102
 
106
- const body = Body.fromTxBlobData(checkpointBlobData.blocks[0].txs);
103
+ const body = Body.fromTxBlobData(blockBlobData.txs);
107
104
 
108
105
  const blobFields = encodeBlockBlobData(blockBlobData);
109
106
  await spongeBlob.absorb(blobFields);
@@ -122,7 +119,7 @@ export async function retrievedToPublishedCheckpoint({
122
119
 
123
120
  const newArchive = new AppendOnlyTreeSnapshot(newArchiveRoots[i], l2BlockNumber + 1);
124
121
 
125
- l2Blocks.push(new L2BlockNew(newArchive, header, body, checkpointNumber, i));
122
+ l2Blocks.push(new L2Block(newArchive, header, body, checkpointNumber, IndexWithinCheckpoint(i)));
126
123
  }
127
124
 
128
125
  const lastBlock = l2Blocks.at(-1)!;
@@ -138,19 +135,23 @@ export async function retrievedToPublishedCheckpoint({
138
135
 
139
136
  /**
140
137
  * Fetches new checkpoints.
138
+ * @param rollup - The rollup contract wrapper.
141
139
  * @param publicClient - The viem public client to use for transaction retrieval.
142
140
  * @param debugClient - The viem debug client to use for trace/debug RPC methods (optional).
143
- * @param rollupAddress - The address of the rollup contract.
141
+ * @param blobClient - The blob client client for fetching blob data.
144
142
  * @param searchStartBlock - The block number to use for starting the search.
145
143
  * @param searchEndBlock - The highest block number that we should search up to.
146
- * @param expectedNextL2BlockNum - The next L2 block number that we expect to find.
147
- * @returns An array of block; as well as the next eth block to search from.
144
+ * @param contractAddresses - The contract addresses (governanceProposerAddress, slashFactoryAddress, slashingProposerAddress).
145
+ * @param instrumentation - The archiver instrumentation instance.
146
+ * @param logger - The logger instance.
147
+ * @param isHistoricalSync - Whether this is a historical sync.
148
+ * @returns An array of retrieved checkpoints.
148
149
  */
149
150
  export async function retrieveCheckpointsFromRollup(
150
- rollup: GetContractReturnType<typeof RollupAbi, ViemPublicClient>,
151
+ rollup: RollupContract,
151
152
  publicClient: ViemPublicClient,
152
153
  debugClient: ViemPublicDebugClient,
153
- blobSinkClient: BlobSinkClientInterface,
154
+ blobClient: BlobClientInterface,
154
155
  searchStartBlock: bigint,
155
156
  searchEndBlock: bigint,
156
157
  contractAddresses: {
@@ -160,6 +161,7 @@ export async function retrieveCheckpointsFromRollup(
160
161
  },
161
162
  instrumentation: ArchiverInstrumentation,
162
163
  logger: Logger = createLogger('archiver'),
164
+ isHistoricalSync: boolean = false,
163
165
  ): Promise<RetrievedCheckpoint[]> {
164
166
  const retrievedCheckpoints: RetrievedCheckpoint[] = [];
165
167
 
@@ -169,15 +171,7 @@ export async function retrieveCheckpointsFromRollup(
169
171
  if (searchStartBlock > searchEndBlock) {
170
172
  break;
171
173
  }
172
- const checkpointProposedLogs = (
173
- await rollup.getEvents.CheckpointProposed(
174
- {},
175
- {
176
- fromBlock: searchStartBlock,
177
- toBlock: searchEndBlock,
178
- },
179
- )
180
- ).filter(log => log.blockNumber! >= searchStartBlock && log.blockNumber! <= searchEndBlock);
174
+ const checkpointProposedLogs = await rollup.getCheckpointProposedEvents(searchStartBlock, searchEndBlock);
181
175
 
182
176
  if (checkpointProposedLogs.length === 0) {
183
177
  break;
@@ -185,19 +179,19 @@ export async function retrieveCheckpointsFromRollup(
185
179
 
186
180
  const lastLog = checkpointProposedLogs.at(-1)!;
187
181
  logger.debug(
188
- `Got ${checkpointProposedLogs.length} processed logs for checkpoints ${checkpointProposedLogs[0].args.checkpointNumber}-${lastLog.args.checkpointNumber} between L1 blocks ${searchStartBlock}-${searchEndBlock}`,
182
+ `Got ${checkpointProposedLogs.length} processed logs for checkpoints ${checkpointProposedLogs[0].args.checkpointNumber}-${lastLog.args.checkpointNumber} between L1 blocks ${searchStartBlock}-${searchEndBlock}`,
189
183
  );
190
184
 
191
185
  if (rollupConstants === undefined) {
192
186
  const [chainId, version, targetCommitteeSize] = await Promise.all([
193
187
  publicClient.getChainId(),
194
- rollup.read.getVersion(),
195
- rollup.read.getTargetCommitteeSize(),
188
+ rollup.getVersion(),
189
+ rollup.getTargetCommitteeSize(),
196
190
  ]);
197
191
  rollupConstants = {
198
192
  chainId: new Fr(chainId),
199
193
  version: new Fr(version),
200
- targetCommitteeSize: Number(targetCommitteeSize),
194
+ targetCommitteeSize,
201
195
  };
202
196
  }
203
197
 
@@ -205,15 +199,16 @@ export async function retrieveCheckpointsFromRollup(
205
199
  rollup,
206
200
  publicClient,
207
201
  debugClient,
208
- blobSinkClient,
202
+ blobClient,
209
203
  checkpointProposedLogs,
210
204
  rollupConstants,
211
205
  contractAddresses,
212
206
  instrumentation,
213
207
  logger,
208
+ isHistoricalSync,
214
209
  );
215
210
  retrievedCheckpoints.push(...newCheckpoints);
216
- searchStartBlock = lastLog.blockNumber! + 1n;
211
+ searchStartBlock = lastLog.l1BlockNumber + 1n;
217
212
  } while (searchStartBlock <= searchEndBlock);
218
213
 
219
214
  // The asyncPool from processCheckpointProposedLogs will not necessarily return the checkpoints in order, so we sort them before returning.
@@ -222,18 +217,24 @@ export async function retrieveCheckpointsFromRollup(
222
217
 
223
218
  /**
224
219
  * Processes newly received CheckpointProposed logs.
225
- * @param rollup - The rollup contract
220
+ * @param rollup - The rollup contract wrapper.
226
221
  * @param publicClient - The viem public client to use for transaction retrieval.
227
222
  * @param debugClient - The viem debug client to use for trace/debug RPC methods (optional).
223
+ * @param blobClient - The blob client client for fetching blob data.
228
224
  * @param logs - CheckpointProposed logs.
229
- * @returns - An array of checkpoints.
225
+ * @param rollupConstants - The rollup constants (chainId, version, targetCommitteeSize).
226
+ * @param contractAddresses - The contract addresses (governanceProposerAddress, slashFactoryAddress, slashingProposerAddress).
227
+ * @param instrumentation - The archiver instrumentation instance.
228
+ * @param logger - The logger instance.
229
+ * @param isHistoricalSync - Whether this is a historical sync.
230
+ * @returns An array of retrieved checkpoints.
230
231
  */
231
232
  async function processCheckpointProposedLogs(
232
- rollup: GetContractReturnType<typeof RollupAbi, ViemPublicClient>,
233
+ rollup: RollupContract,
233
234
  publicClient: ViemPublicClient,
234
235
  debugClient: ViemPublicDebugClient,
235
- blobSinkClient: BlobSinkClientInterface,
236
- logs: GetContractEventsReturnType<typeof RollupAbi, 'CheckpointProposed'>,
236
+ blobClient: BlobClientInterface,
237
+ logs: CheckpointProposedLog[],
237
238
  { chainId, version, targetCommitteeSize }: { chainId: Fr; version: Fr; targetCommitteeSize: number },
238
239
  contractAddresses: {
239
240
  governanceProposerAddress: EthAddress;
@@ -242,6 +243,7 @@ async function processCheckpointProposedLogs(
242
243
  },
243
244
  instrumentation: ArchiverInstrumentation,
244
245
  logger: Logger,
246
+ isHistoricalSync: boolean,
245
247
  ): Promise<RetrievedCheckpoint[]> {
246
248
  const retrievedCheckpoints: RetrievedCheckpoint[] = [];
247
249
  const calldataRetriever = new CalldataRetriever(
@@ -254,43 +256,51 @@ async function processCheckpointProposedLogs(
254
256
  );
255
257
 
256
258
  await asyncPool(10, logs, async log => {
257
- const checkpointNumber = CheckpointNumber.fromBigInt(log.args.checkpointNumber!);
258
- const archive = log.args.archive!;
259
- const archiveFromChain = await rollup.read.archiveAt([BigInt(checkpointNumber)]);
260
- const blobHashes = log.args.versionedBlobHashes!.map(blobHash => Buffer.from(blobHash.slice(2), 'hex'));
259
+ const checkpointNumber = log.args.checkpointNumber;
260
+ const archive = log.args.archive;
261
+ const archiveFromChain = await rollup.archiveAt(checkpointNumber);
262
+ const blobHashes = log.args.versionedBlobHashes;
261
263
 
262
264
  // The value from the event and contract will match only if the checkpoint is in the chain.
263
- if (archive === archiveFromChain) {
265
+ if (archive.equals(archiveFromChain)) {
266
+ // Build expected hashes object (fields may be undefined for backwards compatibility with older events)
267
+ const expectedHashes = {
268
+ attestationsHash: log.args.attestationsHash?.toString(),
269
+ payloadDigest: log.args.payloadDigest?.toString(),
270
+ };
271
+
264
272
  const checkpoint = await calldataRetriever.getCheckpointFromRollupTx(
265
- log.transactionHash!,
273
+ log.l1TransactionHash,
266
274
  blobHashes,
267
275
  checkpointNumber,
276
+ expectedHashes,
268
277
  );
269
278
  const checkpointBlobData = await getCheckpointBlobDataFromBlobs(
270
- blobSinkClient,
279
+ blobClient,
271
280
  checkpoint.blockHash,
272
281
  blobHashes,
273
282
  checkpointNumber,
274
283
  logger,
284
+ isHistoricalSync,
275
285
  );
276
286
 
277
- const l1: L1PublishedData = {
278
- blockNumber: log.blockNumber,
279
- blockHash: log.blockHash,
280
- timestamp: await getL1BlockTime(publicClient, log.blockNumber),
281
- };
287
+ const l1 = new L1PublishedData(
288
+ log.l1BlockNumber,
289
+ await getL1BlockTime(publicClient, log.l1BlockNumber),
290
+ log.l1BlockHash.toString(),
291
+ );
282
292
 
283
293
  retrievedCheckpoints.push({ ...checkpoint, checkpointBlobData, l1, chainId, version });
284
- logger.trace(`Retrieved checkpoint ${checkpointNumber} from L1 tx ${log.transactionHash}`, {
285
- l1BlockNumber: log.blockNumber,
294
+ logger.trace(`Retrieved checkpoint ${checkpointNumber} from L1 tx ${log.l1TransactionHash}`, {
295
+ l1BlockNumber: log.l1BlockNumber,
286
296
  checkpointNumber,
287
297
  archive: archive.toString(),
288
298
  attestations: checkpoint.attestations,
289
299
  });
290
300
  } else {
291
301
  logger.warn(`Ignoring checkpoint ${checkpointNumber} due to archive root mismatch`, {
292
- actual: archive,
293
- expected: archiveFromChain,
302
+ actual: archive.toString(),
303
+ expected: archiveFromChain.toString(),
294
304
  });
295
305
  }
296
306
  });
@@ -304,13 +314,14 @@ export async function getL1BlockTime(publicClient: ViemPublicClient, blockNumber
304
314
  }
305
315
 
306
316
  export async function getCheckpointBlobDataFromBlobs(
307
- blobSinkClient: BlobSinkClientInterface,
317
+ blobClient: BlobClientInterface,
308
318
  blockHash: string,
309
319
  blobHashes: Buffer<ArrayBufferLike>[],
310
320
  checkpointNumber: CheckpointNumber,
311
321
  logger: Logger,
322
+ isHistoricalSync: boolean,
312
323
  ): Promise<CheckpointBlobData> {
313
- const blobBodies = await blobSinkClient.getBlobSidecar(blockHash, blobHashes);
324
+ const blobBodies = await blobClient.getBlobSidecar(blockHash, blobHashes, { isHistoricalSync });
314
325
  if (blobBodies.length === 0) {
315
326
  throw new NoBlobBodiesFoundError(checkpointNumber);
316
327
  }
@@ -318,7 +329,7 @@ export async function getCheckpointBlobDataFromBlobs(
318
329
  let checkpointBlobData: CheckpointBlobData;
319
330
  try {
320
331
  // Attempt to decode the checkpoint blob data.
321
- checkpointBlobData = decodeCheckpointBlobDataFromBlobs(blobBodies.map(b => b.blob));
332
+ checkpointBlobData = decodeCheckpointBlobDataFromBlobs(blobBodies);
322
333
  } catch (err: any) {
323
334
  if (err instanceof BlobDeserializationError) {
324
335
  logger.fatal(err.message);
@@ -334,12 +345,12 @@ export async function getCheckpointBlobDataFromBlobs(
334
345
 
335
346
  /** Given an L1 to L2 message, retrieves its corresponding event from the Inbox within a specific block range. */
336
347
  export async function retrieveL1ToL2Message(
337
- inbox: GetContractReturnType<typeof InboxAbi, ViemClient>,
348
+ inbox: InboxContract,
338
349
  leaf: Fr,
339
350
  fromBlock: bigint,
340
351
  toBlock: bigint,
341
352
  ): Promise<InboxMessage | undefined> {
342
- const logs = await inbox.getEvents.MessageSent({ hash: leaf.toString() }, { fromBlock, toBlock });
353
+ const logs = await inbox.getMessageSentEventByHash(leaf.toString(), fromBlock, toBlock);
343
354
 
344
355
  const messages = mapLogsInboxMessage(logs);
345
356
  return messages.length > 0 ? messages[0] : undefined;
@@ -347,47 +358,40 @@ export async function retrieveL1ToL2Message(
347
358
 
348
359
  /**
349
360
  * Fetch L1 to L2 messages.
350
- * @param publicClient - The viem public client to use for transaction retrieval.
351
- * @param inboxAddress - The address of the inbox contract to fetch messages from.
352
- * @param blockUntilSynced - If true, blocks until the archiver has fully synced.
361
+ * @param inbox - The inbox contract wrapper.
353
362
  * @param searchStartBlock - The block number to use for starting the search.
354
363
  * @param searchEndBlock - The highest block number that we should search up to.
355
364
  * @returns An array of InboxLeaf and next eth block to search from.
356
365
  */
357
366
  export async function retrieveL1ToL2Messages(
358
- inbox: GetContractReturnType<typeof InboxAbi, ViemClient>,
367
+ inbox: InboxContract,
359
368
  searchStartBlock: bigint,
360
369
  searchEndBlock: bigint,
361
370
  ): Promise<InboxMessage[]> {
362
371
  const retrievedL1ToL2Messages: InboxMessage[] = [];
363
372
  while (searchStartBlock <= searchEndBlock) {
364
- const messageSentLogs = (
365
- await inbox.getEvents.MessageSent({}, { fromBlock: searchStartBlock, toBlock: searchEndBlock })
366
- ).filter(log => log.blockNumber! >= searchStartBlock && log.blockNumber! <= searchEndBlock);
373
+ const messageSentLogs = await inbox.getMessageSentEvents(searchStartBlock, searchEndBlock);
367
374
 
368
375
  if (messageSentLogs.length === 0) {
369
376
  break;
370
377
  }
371
378
 
372
379
  retrievedL1ToL2Messages.push(...mapLogsInboxMessage(messageSentLogs));
373
- searchStartBlock = messageSentLogs.at(-1)!.blockNumber + 1n;
380
+ searchStartBlock = messageSentLogs.at(-1)!.l1BlockNumber + 1n;
374
381
  }
375
382
 
376
383
  return retrievedL1ToL2Messages;
377
384
  }
378
385
 
379
- function mapLogsInboxMessage(logs: GetContractEventsReturnType<typeof InboxAbi, 'MessageSent'>): InboxMessage[] {
380
- return logs.map(log => {
381
- const { index, hash, checkpointNumber, rollingHash } = log.args;
382
- return {
383
- index: index!,
384
- leaf: Fr.fromHexString(hash!),
385
- l1BlockNumber: log.blockNumber,
386
- l1BlockHash: Buffer32.fromString(log.blockHash),
387
- checkpointNumber: CheckpointNumber.fromBigInt(checkpointNumber!),
388
- rollingHash: Buffer16.fromString(rollingHash!),
389
- };
390
- });
386
+ function mapLogsInboxMessage(logs: MessageSentLog[]): InboxMessage[] {
387
+ return logs.map(log => ({
388
+ index: log.args.index,
389
+ leaf: log.args.leaf,
390
+ l1BlockNumber: log.l1BlockNumber,
391
+ l1BlockHash: log.l1BlockHash,
392
+ checkpointNumber: log.args.checkpointNumber,
393
+ rollingHash: log.args.rollingHash,
394
+ }));
391
395
  }
392
396
 
393
397
  /** Retrieves L2ProofVerified events from the rollup contract. */
@@ -1,5 +1,5 @@
1
1
  import type { ViemPublicDebugClient } from '@aztec/ethereum/types';
2
- import { createLogger } from '@aztec/foundation/log';
2
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
3
3
 
4
4
  import type { Hex } from 'viem';
5
5
  import type { ZodSchema } from 'zod';
@@ -7,8 +7,6 @@ import type { ZodSchema } from 'zod';
7
7
  import { callTraceSchema } from './debug_tx.js';
8
8
  import { traceTransactionResponseSchema } from './trace_tx.js';
9
9
 
10
- const logger = createLogger('aztec:archiver:validate_trace');
11
-
12
10
  /**
13
11
  * Helper function to test a trace method with validation
14
12
  *
@@ -17,6 +15,7 @@ const logger = createLogger('aztec:archiver:validate_trace');
17
15
  * @param schema - Zod schema to validate the response
18
16
  * @param method - Name of the RPC method ('debug_traceTransaction' or 'trace_transaction')
19
17
  * @param blockType - Type of block being tested ('recent' or 'old')
18
+ * @param logger - Logger instance
20
19
  * @returns true if the method works and validation passes, false otherwise
21
20
  */
22
21
  async function testTraceMethod(
@@ -25,6 +24,7 @@ async function testTraceMethod(
25
24
  schema: ZodSchema,
26
25
  method: 'debug_traceTransaction' | 'trace_transaction',
27
26
  blockType: string,
27
+ logger: Logger,
28
28
  ): Promise<boolean> {
29
29
  try {
30
30
  // Make request with appropriate params based on method name
@@ -59,9 +59,14 @@ export interface TraceAvailability {
59
59
  * Validates the availability of debug/trace methods on the Ethereum client.
60
60
  *
61
61
  * @param client - The Viem public debug client
62
+ * @param bindings - Optional logger bindings for context
62
63
  * @returns Object indicating which trace methods are available for recent and old blocks
63
64
  */
64
- export async function validateTraceAvailability(client: ViemPublicDebugClient): Promise<TraceAvailability> {
65
+ export async function validateTraceAvailability(
66
+ client: ViemPublicDebugClient,
67
+ bindings?: LoggerBindings,
68
+ ): Promise<TraceAvailability> {
69
+ const logger = createLogger('archiver:validate_trace', bindings);
65
70
  const result: TraceAvailability = {
66
71
  debugTraceRecent: false,
67
72
  traceTransactionRecent: false,
@@ -95,6 +100,7 @@ export async function validateTraceAvailability(client: ViemPublicDebugClient):
95
100
  callTraceSchema,
96
101
  'debug_traceTransaction',
97
102
  'recent',
103
+ logger,
98
104
  );
99
105
 
100
106
  // Test trace_transaction with recent block
@@ -104,6 +110,7 @@ export async function validateTraceAvailability(client: ViemPublicDebugClient):
104
110
  traceTransactionResponseSchema,
105
111
  'trace_transaction',
106
112
  'recent',
113
+ logger,
107
114
  );
108
115
 
109
116
  // Get a block from 512 blocks ago
@@ -132,7 +139,14 @@ export async function validateTraceAvailability(client: ViemPublicDebugClient):
132
139
  const oldTxHash = oldBlock.transactions[0] as Hex;
133
140
 
134
141
  // Test debug_traceTransaction with old block
135
- result.debugTraceOld = await testTraceMethod(client, oldTxHash, callTraceSchema, 'debug_traceTransaction', 'old');
142
+ result.debugTraceOld = await testTraceMethod(
143
+ client,
144
+ oldTxHash,
145
+ callTraceSchema,
146
+ 'debug_traceTransaction',
147
+ 'old',
148
+ logger,
149
+ );
136
150
 
137
151
  // Test trace_transaction with old block
138
152
  result.traceTransactionOld = await testTraceMethod(
@@ -141,6 +155,7 @@ export async function validateTraceAvailability(client: ViemPublicDebugClient):
141
155
  traceTransactionResponseSchema,
142
156
  'trace_transaction',
143
157
  'old',
158
+ logger,
144
159
  );
145
160
  } catch (error) {
146
161
  logger.warn(`Error validating debug_traceTransaction and trace_transaction availability: ${error}`);
@@ -159,15 +174,18 @@ function hasTxs(block: { transactions?: Hex[] }): boolean {
159
174
  *
160
175
  * @param client - The Viem public debug client
161
176
  * @param ethereumAllowNoDebugHosts - If false, throws an error when no trace methods are available
177
+ * @param bindings - Optional logger bindings for context
162
178
  * @throws Error if ethereumAllowNoDebugHosts is false and no trace methods are available
163
179
  */
164
180
  export async function validateAndLogTraceAvailability(
165
181
  client: ViemPublicDebugClient,
166
182
  ethereumAllowNoDebugHosts: boolean,
183
+ bindings?: LoggerBindings,
167
184
  ): Promise<void> {
168
- logger.info('Validating trace/debug method availability...');
185
+ const logger = createLogger('archiver:validate_trace', bindings);
186
+ logger.debug('Validating trace/debug method availability...');
169
187
 
170
- const availability = await validateTraceAvailability(client);
188
+ const availability = await validateTraceAvailability(client, bindings);
171
189
 
172
190
  // Check if we have support for old blocks (either debug or trace)
173
191
  const hasOldBlockSupport = availability.debugTraceOld || availability.traceTransactionOld;