@aztec/archiver 0.0.0-test.0 → 0.0.1-commit.21caa21

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 (110) hide show
  1. package/README.md +27 -6
  2. package/dest/archiver/archiver.d.ts +147 -57
  3. package/dest/archiver/archiver.d.ts.map +1 -1
  4. package/dest/archiver/archiver.js +841 -333
  5. package/dest/archiver/archiver_store.d.ts +85 -50
  6. package/dest/archiver/archiver_store.d.ts.map +1 -1
  7. package/dest/archiver/archiver_store_test_suite.d.ts +1 -1
  8. package/dest/archiver/archiver_store_test_suite.d.ts.map +1 -1
  9. package/dest/archiver/archiver_store_test_suite.js +708 -213
  10. package/dest/archiver/config.d.ts +5 -21
  11. package/dest/archiver/config.d.ts.map +1 -1
  12. package/dest/archiver/config.js +21 -12
  13. package/dest/archiver/data_retrieval.d.ts +32 -27
  14. package/dest/archiver/data_retrieval.d.ts.map +1 -1
  15. package/dest/archiver/data_retrieval.js +197 -94
  16. package/dest/archiver/errors.d.ts +9 -1
  17. package/dest/archiver/errors.d.ts.map +1 -1
  18. package/dest/archiver/errors.js +12 -0
  19. package/dest/archiver/index.d.ts +3 -4
  20. package/dest/archiver/index.d.ts.map +1 -1
  21. package/dest/archiver/index.js +1 -2
  22. package/dest/archiver/instrumentation.d.ts +12 -6
  23. package/dest/archiver/instrumentation.d.ts.map +1 -1
  24. package/dest/archiver/instrumentation.js +58 -17
  25. package/dest/archiver/kv_archiver_store/block_store.d.ts +48 -11
  26. package/dest/archiver/kv_archiver_store/block_store.d.ts.map +1 -1
  27. package/dest/archiver/kv_archiver_store/block_store.js +216 -63
  28. package/dest/archiver/kv_archiver_store/contract_class_store.d.ts +3 -3
  29. package/dest/archiver/kv_archiver_store/contract_class_store.d.ts.map +1 -1
  30. package/dest/archiver/kv_archiver_store/contract_class_store.js +12 -18
  31. package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts +11 -8
  32. package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts.map +1 -1
  33. package/dest/archiver/kv_archiver_store/contract_instance_store.js +30 -16
  34. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +50 -35
  35. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +1 -1
  36. package/dest/archiver/kv_archiver_store/kv_archiver_store.js +88 -46
  37. package/dest/archiver/kv_archiver_store/log_store.d.ts +2 -2
  38. package/dest/archiver/kv_archiver_store/log_store.d.ts.map +1 -1
  39. package/dest/archiver/kv_archiver_store/log_store.js +18 -46
  40. package/dest/archiver/kv_archiver_store/message_store.d.ts +23 -17
  41. package/dest/archiver/kv_archiver_store/message_store.d.ts.map +1 -1
  42. package/dest/archiver/kv_archiver_store/message_store.js +150 -48
  43. package/dest/archiver/structs/data_retrieval.d.ts +1 -1
  44. package/dest/archiver/structs/inbox_message.d.ts +15 -0
  45. package/dest/archiver/structs/inbox_message.d.ts.map +1 -0
  46. package/dest/archiver/structs/inbox_message.js +38 -0
  47. package/dest/archiver/structs/published.d.ts +3 -11
  48. package/dest/archiver/structs/published.d.ts.map +1 -1
  49. package/dest/archiver/structs/published.js +1 -1
  50. package/dest/archiver/validation.d.ts +17 -0
  51. package/dest/archiver/validation.d.ts.map +1 -0
  52. package/dest/archiver/validation.js +98 -0
  53. package/dest/factory.d.ts +8 -13
  54. package/dest/factory.d.ts.map +1 -1
  55. package/dest/factory.js +18 -49
  56. package/dest/index.d.ts +2 -2
  57. package/dest/index.d.ts.map +1 -1
  58. package/dest/index.js +1 -1
  59. package/dest/rpc/index.d.ts +2 -3
  60. package/dest/rpc/index.d.ts.map +1 -1
  61. package/dest/rpc/index.js +1 -4
  62. package/dest/test/index.d.ts +1 -1
  63. package/dest/test/mock_archiver.d.ts +2 -2
  64. package/dest/test/mock_archiver.d.ts.map +1 -1
  65. package/dest/test/mock_l1_to_l2_message_source.d.ts +5 -3
  66. package/dest/test/mock_l1_to_l2_message_source.d.ts.map +1 -1
  67. package/dest/test/mock_l1_to_l2_message_source.js +14 -1
  68. package/dest/test/mock_l2_block_source.d.ts +38 -10
  69. package/dest/test/mock_l2_block_source.d.ts.map +1 -1
  70. package/dest/test/mock_l2_block_source.js +119 -8
  71. package/dest/test/mock_structs.d.ts +9 -0
  72. package/dest/test/mock_structs.d.ts.map +1 -0
  73. package/dest/test/mock_structs.js +37 -0
  74. package/package.json +28 -30
  75. package/src/archiver/archiver.ts +1087 -410
  76. package/src/archiver/archiver_store.ts +97 -55
  77. package/src/archiver/archiver_store_test_suite.ts +664 -210
  78. package/src/archiver/config.ts +28 -41
  79. package/src/archiver/data_retrieval.ts +279 -125
  80. package/src/archiver/errors.ts +21 -0
  81. package/src/archiver/index.ts +2 -3
  82. package/src/archiver/instrumentation.ts +77 -22
  83. package/src/archiver/kv_archiver_store/block_store.ts +270 -72
  84. package/src/archiver/kv_archiver_store/contract_class_store.ts +13 -23
  85. package/src/archiver/kv_archiver_store/contract_instance_store.ts +35 -27
  86. package/src/archiver/kv_archiver_store/kv_archiver_store.ts +127 -63
  87. package/src/archiver/kv_archiver_store/log_store.ts +24 -62
  88. package/src/archiver/kv_archiver_store/message_store.ts +209 -53
  89. package/src/archiver/structs/inbox_message.ts +41 -0
  90. package/src/archiver/structs/published.ts +2 -11
  91. package/src/archiver/validation.ts +124 -0
  92. package/src/factory.ts +24 -66
  93. package/src/index.ts +1 -1
  94. package/src/rpc/index.ts +1 -5
  95. package/src/test/mock_archiver.ts +1 -1
  96. package/src/test/mock_l1_to_l2_message_source.ts +14 -3
  97. package/src/test/mock_l2_block_source.ts +158 -13
  98. package/src/test/mock_structs.ts +49 -0
  99. package/dest/archiver/kv_archiver_store/nullifier_store.d.ts +0 -12
  100. package/dest/archiver/kv_archiver_store/nullifier_store.d.ts.map +0 -1
  101. package/dest/archiver/kv_archiver_store/nullifier_store.js +0 -73
  102. package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.d.ts +0 -23
  103. package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.d.ts.map +0 -1
  104. package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.js +0 -49
  105. package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts +0 -175
  106. package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts.map +0 -1
  107. package/dest/archiver/memory_archiver_store/memory_archiver_store.js +0 -636
  108. package/src/archiver/kv_archiver_store/nullifier_store.ts +0 -97
  109. package/src/archiver/memory_archiver_store/l1_to_l2_message_store.ts +0 -61
  110. package/src/archiver/memory_archiver_store/memory_archiver_store.ts +0 -801
@@ -1,81 +1,165 @@
1
- import { Blob, BlobDeserializationError } from '@aztec/blob-lib';
1
+ import { BlobDeserializationError, SpongeBlob, decodeCheckpointBlobDataFromBlobs, encodeBlockBlobData } from '@aztec/blob-lib';
2
2
  import { asyncPool } from '@aztec/foundation/async-pool';
3
+ import { Buffer16, Buffer32 } from '@aztec/foundation/buffer';
3
4
  import { Fr } from '@aztec/foundation/fields';
4
5
  import { createLogger } from '@aztec/foundation/log';
5
- import { numToUInt32BE } from '@aztec/foundation/serialize';
6
- import { ForwarderAbi, RollupAbi } from '@aztec/l1-artifacts';
7
- import { Body, L2Block } from '@aztec/stdlib/block';
8
- import { InboxLeaf } from '@aztec/stdlib/messaging';
6
+ import { RollupAbi } from '@aztec/l1-artifacts';
7
+ import { Body, CommitteeAttestation, L2BlockNew } from '@aztec/stdlib/block';
8
+ import { Checkpoint, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
9
9
  import { Proof } from '@aztec/stdlib/proofs';
10
+ import { CheckpointHeader } from '@aztec/stdlib/rollup';
10
11
  import { AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
11
- import { BlockHeader } from '@aztec/stdlib/tx';
12
- import { decodeFunctionData, getAbiItem, hexToBytes } from 'viem';
12
+ import { BlockHeader, GlobalVariables, PartialStateReference, StateReference } from '@aztec/stdlib/tx';
13
+ import { decodeFunctionData, getAbiItem, hexToBytes, multicall3Abi } from 'viem';
13
14
  import { NoBlobBodiesFoundError } from './errors.js';
15
+ export async function retrievedToPublishedCheckpoint({ checkpointNumber, archiveRoot, header: checkpointHeader, checkpointBlobData, l1, chainId, version, attestations }) {
16
+ const { blocks: blocksBlobData } = checkpointBlobData;
17
+ // The lastArchiveRoot of a block is the new archive for the previous block.
18
+ const newArchiveRoots = blocksBlobData.map((b)=>b.lastArchiveRoot).slice(1).concat([
19
+ archiveRoot
20
+ ]);
21
+ // `blocksBlobData` is created from `decodeCheckpointBlobDataFromBlobs`. An error will be thrown if it can't read a
22
+ // field for the `l1ToL2MessageRoot` of the first block. So below we can safely assume it exists:
23
+ const l1toL2MessageTreeRoot = blocksBlobData[0].l1ToL2MessageRoot;
24
+ const spongeBlob = SpongeBlob.init();
25
+ const l2Blocks = [];
26
+ for(let i = 0; i < blocksBlobData.length; i++){
27
+ const blockBlobData = blocksBlobData[i];
28
+ const { blockEndMarker, blockEndStateField, lastArchiveRoot, noteHashRoot, nullifierRoot, publicDataRoot } = blockBlobData;
29
+ const l2BlockNumber = blockEndMarker.blockNumber;
30
+ const globalVariables = GlobalVariables.from({
31
+ chainId,
32
+ version,
33
+ blockNumber: l2BlockNumber,
34
+ slotNumber: checkpointHeader.slotNumber,
35
+ timestamp: blockEndMarker.timestamp,
36
+ coinbase: checkpointHeader.coinbase,
37
+ feeRecipient: checkpointHeader.feeRecipient,
38
+ gasFees: checkpointHeader.gasFees
39
+ });
40
+ const state = StateReference.from({
41
+ l1ToL2MessageTree: new AppendOnlyTreeSnapshot(l1toL2MessageTreeRoot, blockEndStateField.l1ToL2MessageNextAvailableLeafIndex),
42
+ partial: PartialStateReference.from({
43
+ noteHashTree: new AppendOnlyTreeSnapshot(noteHashRoot, blockEndStateField.noteHashNextAvailableLeafIndex),
44
+ nullifierTree: new AppendOnlyTreeSnapshot(nullifierRoot, blockEndStateField.nullifierNextAvailableLeafIndex),
45
+ publicDataTree: new AppendOnlyTreeSnapshot(publicDataRoot, blockEndStateField.publicDataNextAvailableLeafIndex)
46
+ })
47
+ });
48
+ const body = Body.fromTxBlobData(checkpointBlobData.blocks[0].txs);
49
+ const blobFields = encodeBlockBlobData(blockBlobData);
50
+ await spongeBlob.absorb(blobFields);
51
+ const clonedSpongeBlob = spongeBlob.clone();
52
+ const spongeBlobHash = await clonedSpongeBlob.squeeze();
53
+ const header = BlockHeader.from({
54
+ lastArchive: new AppendOnlyTreeSnapshot(lastArchiveRoot, l2BlockNumber),
55
+ state,
56
+ spongeBlobHash,
57
+ globalVariables,
58
+ totalFees: body.txEffects.reduce((accum, txEffect)=>accum.add(txEffect.transactionFee), Fr.ZERO),
59
+ totalManaUsed: new Fr(blockEndStateField.totalManaUsed)
60
+ });
61
+ const newArchive = new AppendOnlyTreeSnapshot(newArchiveRoots[i], l2BlockNumber + 1);
62
+ l2Blocks.push(new L2BlockNew(newArchive, header, body));
63
+ }
64
+ const lastBlock = l2Blocks.at(-1);
65
+ const checkpoint = Checkpoint.from({
66
+ archive: new AppendOnlyTreeSnapshot(archiveRoot, lastBlock.number + 1),
67
+ header: checkpointHeader,
68
+ blocks: l2Blocks,
69
+ number: checkpointNumber
70
+ });
71
+ return PublishedCheckpoint.from({
72
+ checkpoint,
73
+ l1,
74
+ attestations
75
+ });
76
+ }
14
77
  /**
15
- * Fetches new L2 blocks.
78
+ * Fetches new checkpoints.
16
79
  * @param publicClient - The viem public client to use for transaction retrieval.
17
80
  * @param rollupAddress - The address of the rollup contract.
18
81
  * @param searchStartBlock - The block number to use for starting the search.
19
82
  * @param searchEndBlock - The highest block number that we should search up to.
20
83
  * @param expectedNextL2BlockNum - The next L2 block number that we expect to find.
21
84
  * @returns An array of block; as well as the next eth block to search from.
22
- */ export async function retrieveBlocksFromRollup(rollup, publicClient, blobSinkClient, searchStartBlock, searchEndBlock, logger = createLogger('archiver')) {
23
- const retrievedBlocks = [];
85
+ */ export async function retrieveCheckpointsFromRollup(rollup, publicClient, blobSinkClient, searchStartBlock, searchEndBlock, logger = createLogger('archiver')) {
86
+ const retrievedCheckpoints = [];
87
+ let rollupConstants;
24
88
  do {
25
89
  if (searchStartBlock > searchEndBlock) {
26
90
  break;
27
91
  }
28
- const l2BlockProposedLogs = (await rollup.getEvents.L2BlockProposed({}, {
92
+ const checkpointProposedLogs = (await rollup.getEvents.CheckpointProposed({}, {
29
93
  fromBlock: searchStartBlock,
30
94
  toBlock: searchEndBlock
31
95
  })).filter((log)=>log.blockNumber >= searchStartBlock && log.blockNumber <= searchEndBlock);
32
- if (l2BlockProposedLogs.length === 0) {
96
+ if (checkpointProposedLogs.length === 0) {
33
97
  break;
34
98
  }
35
- const lastLog = l2BlockProposedLogs[l2BlockProposedLogs.length - 1];
36
- logger.debug(`Got ${l2BlockProposedLogs.length} L2 block processed logs for L2 blocks ${l2BlockProposedLogs[0].args.blockNumber}-${lastLog.args.blockNumber} between L1 blocks ${searchStartBlock}-${searchEndBlock}`);
37
- const newBlocks = await processL2BlockProposedLogs(rollup, publicClient, blobSinkClient, l2BlockProposedLogs, logger);
38
- retrievedBlocks.push(...newBlocks);
99
+ const lastLog = checkpointProposedLogs.at(-1);
100
+ logger.debug(`Got ${checkpointProposedLogs.length} processed logs for checkpoints ${checkpointProposedLogs[0].args.checkpointNumber}-${lastLog.args.checkpointNumber} between L1 blocks ${searchStartBlock}-${searchEndBlock}`);
101
+ if (rollupConstants === undefined) {
102
+ const [chainId, version, targetCommitteeSize] = await Promise.all([
103
+ publicClient.getChainId(),
104
+ rollup.read.getVersion(),
105
+ rollup.read.getTargetCommitteeSize()
106
+ ]);
107
+ rollupConstants = {
108
+ chainId: new Fr(chainId),
109
+ version: new Fr(version),
110
+ targetCommitteeSize: Number(targetCommitteeSize)
111
+ };
112
+ }
113
+ const newCheckpoints = await processCheckpointProposedLogs(rollup, publicClient, blobSinkClient, checkpointProposedLogs, rollupConstants, logger);
114
+ retrievedCheckpoints.push(...newCheckpoints);
39
115
  searchStartBlock = lastLog.blockNumber + 1n;
40
116
  }while (searchStartBlock <= searchEndBlock)
41
- // The asyncpool from processL2BlockProposedLogs will not necessarily return the blocks in order, so we sort them before returning.
42
- return retrievedBlocks.sort((a, b)=>Number(a.l1.blockNumber - b.l1.blockNumber));
117
+ // The asyncPool from processCheckpointProposedLogs will not necessarily return the checkpoints in order, so we sort them before returning.
118
+ return retrievedCheckpoints.sort((a, b)=>Number(a.l1.blockNumber - b.l1.blockNumber));
43
119
  }
44
120
  /**
45
- * Processes newly received L2BlockProposed logs.
121
+ * Processes newly received CheckpointProposed logs.
46
122
  * @param rollup - The rollup contract
47
123
  * @param publicClient - The viem public client to use for transaction retrieval.
48
- * @param logs - L2BlockProposed logs.
49
- * @returns - An array blocks.
50
- */ export async function processL2BlockProposedLogs(rollup, publicClient, blobSinkClient, logs, logger) {
51
- const retrievedBlocks = [];
124
+ * @param logs - CheckpointProposed logs.
125
+ * @returns - An array of checkpoints.
126
+ */ async function processCheckpointProposedLogs(rollup, publicClient, blobSinkClient, logs, { chainId, version, targetCommitteeSize }, logger) {
127
+ const retrievedCheckpoints = [];
52
128
  await asyncPool(10, logs, async (log)=>{
53
- const l2BlockNumber = log.args.blockNumber;
129
+ const checkpointNumber = Number(log.args.checkpointNumber);
54
130
  const archive = log.args.archive;
55
131
  const archiveFromChain = await rollup.read.archiveAt([
56
- l2BlockNumber
132
+ BigInt(checkpointNumber)
57
133
  ]);
58
134
  const blobHashes = log.args.versionedBlobHashes.map((blobHash)=>Buffer.from(blobHash.slice(2), 'hex'));
59
- // The value from the event and contract will match only if the block is in the chain.
135
+ // The value from the event and contract will match only if the checkpoint is in the chain.
60
136
  if (archive === archiveFromChain) {
61
- const block = await getBlockFromRollupTx(publicClient, blobSinkClient, log.transactionHash, blobHashes, l2BlockNumber, rollup.address, logger);
137
+ const checkpoint = await getCheckpointFromRollupTx(publicClient, blobSinkClient, log.transactionHash, blobHashes, checkpointNumber, rollup.address, targetCommitteeSize, logger);
62
138
  const l1 = {
63
139
  blockNumber: log.blockNumber,
64
140
  blockHash: log.blockHash,
65
141
  timestamp: await getL1BlockTime(publicClient, log.blockNumber)
66
142
  };
67
- retrievedBlocks.push({
68
- data: block,
69
- l1
143
+ retrievedCheckpoints.push({
144
+ ...checkpoint,
145
+ l1,
146
+ chainId,
147
+ version
148
+ });
149
+ logger.trace(`Retrieved checkpoint ${checkpointNumber} from L1 tx ${log.transactionHash}`, {
150
+ l1BlockNumber: log.blockNumber,
151
+ checkpointNumber,
152
+ archive: archive.toString(),
153
+ attestations: checkpoint.attestations
70
154
  });
71
155
  } else {
72
- logger.warn(`Ignoring L2 block ${l2BlockNumber} due to archive root mismatch`, {
156
+ logger.warn(`Ignoring checkpoint ${checkpointNumber} due to archive root mismatch`, {
73
157
  actual: archive,
74
158
  expected: archiveFromChain
75
159
  });
76
160
  }
77
161
  });
78
- return retrievedBlocks;
162
+ return retrievedCheckpoints;
79
163
  }
80
164
  export async function getL1BlockTime(publicClient, blockNumber) {
81
165
  const block = await publicClient.getBlock({
@@ -85,31 +169,30 @@ export async function getL1BlockTime(publicClient, blockNumber) {
85
169
  return block.timestamp;
86
170
  }
87
171
  /**
88
- * Extracts the first 'propose' method calldata from a forwarder transaction's data.
89
- * @param forwarderData - The forwarder transaction input data
172
+ * Extracts the first 'propose' method calldata from a multicall3 transaction's data.
173
+ * @param multicall3Data - The multicall3 transaction input data
90
174
  * @param rollupAddress - The address of the rollup contract
91
175
  * @returns The calldata for the first 'propose' method call to the rollup contract
92
- */ function extractRollupProposeCalldata(forwarderData, rollupAddress) {
93
- // TODO(#11451): custom forwarders
94
- const { functionName: forwarderFunctionName, args: forwarderArgs } = decodeFunctionData({
95
- abi: ForwarderAbi,
96
- data: forwarderData
176
+ */ function extractRollupProposeCalldata(multicall3Data, rollupAddress) {
177
+ const { functionName: multicall3FunctionName, args: multicall3Args } = decodeFunctionData({
178
+ abi: multicall3Abi,
179
+ data: multicall3Data
97
180
  });
98
- if (forwarderFunctionName !== 'forward') {
99
- throw new Error(`Unexpected forwarder method called ${forwarderFunctionName}`);
181
+ if (multicall3FunctionName !== 'aggregate3') {
182
+ throw new Error(`Unexpected multicall3 method called ${multicall3FunctionName}`);
100
183
  }
101
- if (forwarderArgs.length !== 2) {
102
- throw new Error(`Unexpected number of arguments for forwarder`);
184
+ if (multicall3Args.length !== 1) {
185
+ throw new Error(`Unexpected number of arguments for multicall3`);
103
186
  }
104
- const [to, data] = forwarderArgs;
187
+ const [calls] = multicall3Args;
105
188
  // Find all rollup calls
106
189
  const rollupAddressLower = rollupAddress.toLowerCase();
107
- for(let i = 0; i < to.length; i++){
108
- const addr = to[i];
190
+ for(let i = 0; i < calls.length; i++){
191
+ const addr = calls[i].target;
109
192
  if (addr.toLowerCase() !== rollupAddressLower) {
110
193
  continue;
111
194
  }
112
- const callData = data[i];
195
+ const callData = calls[i].callData;
113
196
  try {
114
197
  const { functionName: rollupFunctionName } = decodeFunctionData({
115
198
  abi: RollupAbi,
@@ -118,21 +201,22 @@ export async function getL1BlockTime(publicClient, blockNumber) {
118
201
  if (rollupFunctionName === 'propose') {
119
202
  return callData;
120
203
  }
121
- } catch (err) {
204
+ } catch {
122
205
  continue;
123
206
  }
124
207
  }
125
- throw new Error(`Rollup address not found in forwarder args`);
208
+ throw new Error(`Rollup address not found in multicall3 args`);
126
209
  }
127
210
  /**
128
- * Gets block from the calldata of an L1 transaction.
129
- * Assumes that the block was published from an EOA.
211
+ * Gets checkpoint from the calldata of an L1 transaction.
212
+ * Assumes that the checkpoint was published from an EOA.
130
213
  * TODO: Add retries and error management.
131
214
  * @param publicClient - The viem public client to use for transaction retrieval.
132
215
  * @param txHash - Hash of the tx that published it.
133
- * @param l2BlockNum - L2 block number.
134
- * @returns L2 block from the calldata, deserialized
135
- */ async function getBlockFromRollupTx(publicClient, blobSinkClient, txHash, blobHashes, l2BlockNum, rollupAddress, logger) {
216
+ * @param checkpointNumber - Checkpoint number.
217
+ * @returns Checkpoint from the calldata, deserialized
218
+ */ async function getCheckpointFromRollupTx(publicClient, blobSinkClient, txHash, blobHashes, checkpointNumber, rollupAddress, targetCommitteeSize, logger) {
219
+ logger.trace(`Fetching checkpoint ${checkpointNumber} from rollup tx ${txHash}`);
136
220
  const { input: forwarderData, blockHash } = await publicClient.getTransaction({
137
221
  hash: txHash
138
222
  });
@@ -144,15 +228,27 @@ export async function getL1BlockTime(publicClient, blockNumber) {
144
228
  if (rollupFunctionName !== 'propose') {
145
229
  throw new Error(`Unexpected rollup method called ${rollupFunctionName}`);
146
230
  }
147
- const [decodedArgs] = rollupArgs;
148
- const header = BlockHeader.fromBuffer(Buffer.from(hexToBytes(decodedArgs.header)));
231
+ const [decodedArgs, packedAttestations, _signers, _blobInput] = rollupArgs;
232
+ const attestations = CommitteeAttestation.fromPacked(packedAttestations, targetCommitteeSize);
233
+ logger.trace(`Recovered propose calldata from tx ${txHash}`, {
234
+ checkpointNumber,
235
+ archive: decodedArgs.archive,
236
+ header: decodedArgs.header,
237
+ l1BlockHash: blockHash,
238
+ blobHashes,
239
+ attestations,
240
+ packedAttestations,
241
+ targetCommitteeSize
242
+ });
243
+ const header = CheckpointHeader.fromViem(decodedArgs.header);
149
244
  const blobBodies = await blobSinkClient.getBlobSidecar(blockHash, blobHashes);
150
245
  if (blobBodies.length === 0) {
151
- throw new NoBlobBodiesFoundError(Number(l2BlockNum));
246
+ throw new NoBlobBodiesFoundError(checkpointNumber);
152
247
  }
153
- let blockFields;
248
+ let checkpointBlobData;
154
249
  try {
155
- blockFields = Blob.toEncodedFields(blobBodies);
250
+ // Attempt to decode the checkpoint blob data.
251
+ checkpointBlobData = decodeCheckpointBlobDataFromBlobs(blobBodies.map((b)=>b.blob));
156
252
  } catch (err) {
157
253
  if (err instanceof BlobDeserializationError) {
158
254
  logger.fatal(err.message);
@@ -161,17 +257,24 @@ export async function getL1BlockTime(publicClient, blockNumber) {
161
257
  }
162
258
  throw err;
163
259
  }
164
- // The blob source gives us blockFields, and we must construct the body from them:
165
- const blockBody = Body.fromBlobFields(blockFields);
166
- const blockNumberFromHeader = header.globalVariables.blockNumber.toBigInt();
167
- if (blockNumberFromHeader !== l2BlockNum) {
168
- throw new Error(`Block number mismatch: expected ${l2BlockNum} but got ${blockNumberFromHeader}`);
169
- }
170
- const archive = AppendOnlyTreeSnapshot.fromBuffer(Buffer.concat([
171
- Buffer.from(hexToBytes(decodedArgs.archive)),
172
- numToUInt32BE(Number(l2BlockNum + 1n))
173
- ]));
174
- return new L2Block(archive, header, blockBody);
260
+ const archiveRoot = new Fr(Buffer.from(hexToBytes(decodedArgs.archive)));
261
+ return {
262
+ checkpointNumber,
263
+ archiveRoot,
264
+ header,
265
+ checkpointBlobData,
266
+ attestations
267
+ };
268
+ }
269
+ /** Given an L1 to L2 message, retrieves its corresponding event from the Inbox within a specific block range. */ export async function retrieveL1ToL2Message(inbox, leaf, fromBlock, toBlock) {
270
+ const logs = await inbox.getEvents.MessageSent({
271
+ hash: leaf.toString()
272
+ }, {
273
+ fromBlock,
274
+ toBlock
275
+ });
276
+ const messages = mapLogsInboxMessage(logs);
277
+ return messages.length > 0 ? messages[0] : undefined;
175
278
  }
176
279
  /**
177
280
  * Fetch L1 to L2 messages.
@@ -183,10 +286,7 @@ export async function getL1BlockTime(publicClient, blockNumber) {
183
286
  * @returns An array of InboxLeaf and next eth block to search from.
184
287
  */ export async function retrieveL1ToL2Messages(inbox, searchStartBlock, searchEndBlock) {
185
288
  const retrievedL1ToL2Messages = [];
186
- do {
187
- if (searchStartBlock > searchEndBlock) {
188
- break;
189
- }
289
+ while(searchStartBlock <= searchEndBlock){
190
290
  const messageSentLogs = (await inbox.getEvents.MessageSent({}, {
191
291
  fromBlock: searchStartBlock,
192
292
  toBlock: searchEndBlock
@@ -194,17 +294,23 @@ export async function getL1BlockTime(publicClient, blockNumber) {
194
294
  if (messageSentLogs.length === 0) {
195
295
  break;
196
296
  }
197
- for (const log of messageSentLogs){
198
- const { index, hash } = log.args;
199
- retrievedL1ToL2Messages.push(new InboxLeaf(index, Fr.fromHexString(hash)));
200
- }
201
- // handles the case when there are no new messages:
202
- searchStartBlock = (messageSentLogs.findLast((msgLog)=>!!msgLog)?.blockNumber || searchStartBlock) + 1n;
203
- }while (searchStartBlock <= searchEndBlock)
204
- return {
205
- lastProcessedL1BlockNumber: searchStartBlock - 1n,
206
- retrievedData: retrievedL1ToL2Messages
207
- };
297
+ retrievedL1ToL2Messages.push(...mapLogsInboxMessage(messageSentLogs));
298
+ searchStartBlock = messageSentLogs.at(-1).blockNumber + 1n;
299
+ }
300
+ return retrievedL1ToL2Messages;
301
+ }
302
+ function mapLogsInboxMessage(logs) {
303
+ return logs.map((log)=>{
304
+ const { index, hash, checkpointNumber, rollingHash } = log.args;
305
+ return {
306
+ index: index,
307
+ leaf: Fr.fromHexString(hash),
308
+ l1BlockNumber: log.blockNumber,
309
+ l1BlockHash: Buffer32.fromString(log.blockHash),
310
+ l2BlockNumber: Number(checkpointNumber),
311
+ rollingHash: Buffer16.fromString(rollingHash)
312
+ };
313
+ });
208
314
  }
209
315
  /** Retrieves L2ProofVerified events from the rollup contract. */ export async function retrieveL2ProofVerifiedEvents(publicClient, rollupAddress, searchStartBlock, searchEndBlock) {
210
316
  const logs = await publicClient.getLogs({
@@ -219,7 +325,7 @@ export async function getL1BlockTime(publicClient, blockNumber) {
219
325
  });
220
326
  return logs.map((log)=>({
221
327
  l1BlockNumber: log.blockNumber,
222
- l2BlockNumber: log.args.blockNumber,
328
+ checkpointNumber: Number(log.args.checkpointNumber),
223
329
  proverId: Fr.fromHexString(log.args.proverId),
224
330
  txHash: log.transactionHash
225
331
  }));
@@ -228,12 +334,12 @@ export async function getL1BlockTime(publicClient, blockNumber) {
228
334
  const logs = await retrieveL2ProofVerifiedEvents(publicClient, rollupAddress, searchStartBlock, searchEndBlock);
229
335
  const retrievedData = [];
230
336
  const lastProcessedL1BlockNumber = logs.length > 0 ? logs.at(-1).l1BlockNumber : searchStartBlock - 1n;
231
- for (const { txHash, proverId, l2BlockNumber } of logs){
337
+ for (const { txHash, proverId, checkpointNumber } of logs){
232
338
  const proofData = await getProofFromSubmitProofTx(publicClient, txHash, proverId);
233
339
  retrievedData.push({
234
340
  proof: proofData.proof,
235
341
  proverId: proofData.proverId,
236
- l2BlockNumber,
342
+ checkpointNumber,
237
343
  txHash
238
344
  });
239
345
  }
@@ -243,13 +349,13 @@ export async function getL1BlockTime(publicClient, blockNumber) {
243
349
  };
244
350
  }
245
351
  /**
246
- * Gets block metadata (header and archive snapshot) from the calldata of an L1 transaction.
352
+ * Gets epoch proof metadata (archive root and proof) from the calldata of an L1 transaction.
247
353
  * Assumes that the block was published from an EOA.
248
354
  * TODO: Add retries and error management.
249
355
  * @param publicClient - The viem public client to use for transaction retrieval.
250
356
  * @param txHash - Hash of the tx that published it.
251
- * @param l2BlockNum - L2 block number.
252
- * @returns L2 block metadata (header and archive) from the calldata, deserialized
357
+ * @param expectedProverId - Expected prover ID.
358
+ * @returns Epoch proof metadata from the calldata, deserialized.
253
359
  */ export async function getProofFromSubmitProofTx(publicClient, txHash, expectedProverId) {
254
360
  const { input: data } = await publicClient.getTransaction({
255
361
  hash: txHash
@@ -260,11 +366,9 @@ export async function getL1BlockTime(publicClient, blockNumber) {
260
366
  });
261
367
  let proverId;
262
368
  let archiveRoot;
263
- let aggregationObject;
264
369
  let proof;
265
370
  if (functionName === 'submitEpochRootProof') {
266
371
  const [decodedArgs] = args;
267
- aggregationObject = Buffer.from(hexToBytes(decodedArgs.aggregationObject));
268
372
  proverId = Fr.fromHexString(decodedArgs.args.proverId);
269
373
  archiveRoot = Fr.fromHexString(decodedArgs.args.endArchive);
270
374
  proof = Proof.fromBuffer(Buffer.from(hexToBytes(decodedArgs.proof)));
@@ -276,7 +380,6 @@ export async function getL1BlockTime(publicClient, blockNumber) {
276
380
  }
277
381
  return {
278
382
  proverId,
279
- aggregationObject,
280
383
  archiveRoot,
281
384
  proof
282
385
  };
@@ -1,4 +1,12 @@
1
1
  export declare class NoBlobBodiesFoundError extends Error {
2
2
  constructor(l2BlockNum: number);
3
3
  }
4
- //# sourceMappingURL=errors.d.ts.map
4
+ export declare class InitialBlockNumberNotSequentialError extends Error {
5
+ readonly newBlockNumber: number;
6
+ readonly previousBlockNumber: number | undefined;
7
+ constructor(newBlockNumber: number, previousBlockNumber: number | undefined);
8
+ }
9
+ export declare class BlockNumberNotSequentialError extends Error {
10
+ constructor(newBlockNumber: number, previous: number | undefined);
11
+ }
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXJjaGl2ZXIvZXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHFCQUFhLHNCQUF1QixTQUFRLEtBQUs7SUFDL0MsWUFBWSxVQUFVLEVBQUUsTUFBTSxFQUU3QjtDQUNGO0FBRUQscUJBQWEsb0NBQXFDLFNBQVEsS0FBSzthQUUzQyxjQUFjLEVBQUUsTUFBTTthQUN0QixtQkFBbUIsRUFBRSxNQUFNLEdBQUcsU0FBUztJQUZ6RCxZQUNrQixjQUFjLEVBQUUsTUFBTSxFQUN0QixtQkFBbUIsRUFBRSxNQUFNLEdBQUcsU0FBUyxFQU94RDtDQUNGO0FBRUQscUJBQWEsNkJBQThCLFNBQVEsS0FBSztJQUN0RCxZQUFZLGNBQWMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sR0FBRyxTQUFTLEVBSS9EO0NBQ0YifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/archiver/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,UAAU,EAAE,MAAM;CAG/B"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/archiver/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,YAAY,UAAU,EAAE,MAAM,EAE7B;CACF;AAED,qBAAa,oCAAqC,SAAQ,KAAK;aAE3C,cAAc,EAAE,MAAM;aACtB,mBAAmB,EAAE,MAAM,GAAG,SAAS;IAFzD,YACkB,cAAc,EAAE,MAAM,EACtB,mBAAmB,EAAE,MAAM,GAAG,SAAS,EAOxD;CACF;AAED,qBAAa,6BAA8B,SAAQ,KAAK;IACtD,YAAY,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,EAI/D;CACF"}
@@ -3,3 +3,15 @@ export class NoBlobBodiesFoundError extends Error {
3
3
  super(`No blob bodies found for block ${l2BlockNum}`);
4
4
  }
5
5
  }
6
+ export class InitialBlockNumberNotSequentialError extends Error {
7
+ newBlockNumber;
8
+ previousBlockNumber;
9
+ constructor(newBlockNumber, previousBlockNumber){
10
+ super(`Cannot insert new block ${newBlockNumber} given previous block number in store is ${previousBlockNumber ?? 'undefined'}`), this.newBlockNumber = newBlockNumber, this.previousBlockNumber = previousBlockNumber;
11
+ }
12
+ }
13
+ export class BlockNumberNotSequentialError extends Error {
14
+ constructor(newBlockNumber, previous){
15
+ super(`Cannot insert new block ${newBlockNumber} given previous block number in batch is ${previous ?? 'undefined'}`);
16
+ }
17
+ }
@@ -1,8 +1,7 @@
1
1
  export * from './archiver.js';
2
2
  export * from './config.js';
3
- export { type L1Published, type L1PublishedData } from './structs/published.js';
4
- export { MemoryArchiverStore } from './memory_archiver_store/memory_archiver_store.js';
3
+ export { type PublishedL2Block, type L1PublishedData } from './structs/published.js';
5
4
  export type { ArchiverDataStore } from './archiver_store.js';
6
- export { KVArchiverDataStore } from './kv_archiver_store/kv_archiver_store.js';
5
+ export { KVArchiverDataStore, ARCHIVER_DB_VERSION } from './kv_archiver_store/kv_archiver_store.js';
7
6
  export { ContractInstanceStore } from './kv_archiver_store/contract_instance_store.js';
8
- //# sourceMappingURL=index.d.ts.map
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcmNoaXZlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLGFBQWEsQ0FBQztBQUM1QixPQUFPLEVBQUUsS0FBSyxnQkFBZ0IsRUFBRSxLQUFLLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JGLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ3BHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/archiver/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kDAAkD,CAAC;AACvF,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,gDAAgD,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/archiver/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACrF,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AACpG,OAAO,EAAE,qBAAqB,EAAE,MAAM,gDAAgD,CAAC"}
@@ -1,5 +1,4 @@
1
1
  export * from './archiver.js';
2
2
  export * from './config.js';
3
- export { MemoryArchiverStore } from './memory_archiver_store/memory_archiver_store.js';
4
- export { KVArchiverDataStore } from './kv_archiver_store/kv_archiver_store.js';
3
+ export { KVArchiverDataStore, ARCHIVER_DB_VERSION } from './kv_archiver_store/kv_archiver_store.js';
5
4
  export { ContractInstanceStore } from './kv_archiver_store/contract_instance_store.js';
@@ -1,23 +1,29 @@
1
- import type { L2Block } from '@aztec/stdlib/block';
1
+ import type { L2BlockNew } from '@aztec/stdlib/block';
2
2
  import { type LmdbStatsCallback, type TelemetryClient, type Tracer } from '@aztec/telemetry-client';
3
3
  export declare class ArchiverInstrumentation {
4
4
  private telemetry;
5
5
  readonly tracer: Tracer;
6
6
  private blockHeight;
7
7
  private txCount;
8
- private syncDuration;
9
- private l1BlocksSynced;
10
8
  private l1BlockHeight;
11
9
  private proofsSubmittedDelay;
12
10
  private proofsSubmittedCount;
13
11
  private dbMetrics;
12
+ private pruneDuration;
14
13
  private pruneCount;
14
+ private syncDurationPerBlock;
15
+ private syncBlockCount;
16
+ private manaPerBlock;
17
+ private txsPerBlock;
18
+ private syncDurationPerMessage;
19
+ private syncMessageCount;
15
20
  private log;
16
21
  private constructor();
17
22
  static new(telemetry: TelemetryClient, lmdbStats?: LmdbStatsCallback): Promise<ArchiverInstrumentation>;
18
23
  isEnabled(): boolean;
19
- processNewBlocks(syncTimePerBlock: number, blocks: L2Block[]): void;
20
- processPrune(): void;
24
+ processNewBlocks(syncTimePerBlock: number, blocks: L2BlockNew[]): void;
25
+ processNewMessages(count: number, syncPerMessageMs: number): void;
26
+ processPrune(duration: number): void;
21
27
  updateLastProvenBlock(blockNumber: number): void;
22
28
  processProofsVerified(logs: {
23
29
  proverId: string;
@@ -26,4 +32,4 @@ export declare class ArchiverInstrumentation {
26
32
  }[]): void;
27
33
  updateL1BlockHeight(blockNumber: bigint): void;
28
34
  }
29
- //# sourceMappingURL=instrumentation.d.ts.map
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXJjaGl2ZXIvaW5zdHJ1bWVudGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFLTCxLQUFLLGlCQUFpQixFQUV0QixLQUFLLGVBQWUsRUFDcEIsS0FBSyxNQUFNLEVBR1osTUFBTSx5QkFBeUIsQ0FBQztBQUVqQyxxQkFBYSx1QkFBdUI7SUF3QmhDLE9BQU8sQ0FBQyxTQUFTO0lBdkJuQixTQUFnQixNQUFNLEVBQUUsTUFBTSxDQUFDO0lBRS9CLE9BQU8sQ0FBQyxXQUFXLENBQVE7SUFDM0IsT0FBTyxDQUFDLE9BQU8sQ0FBZ0I7SUFDL0IsT0FBTyxDQUFDLGFBQWEsQ0FBUTtJQUM3QixPQUFPLENBQUMsb0JBQW9CLENBQVk7SUFDeEMsT0FBTyxDQUFDLG9CQUFvQixDQUFnQjtJQUM1QyxPQUFPLENBQUMsU0FBUyxDQUFjO0lBRS9CLE9BQU8sQ0FBQyxhQUFhLENBQVk7SUFDakMsT0FBTyxDQUFDLFVBQVUsQ0FBZ0I7SUFFbEMsT0FBTyxDQUFDLG9CQUFvQixDQUFZO0lBQ3hDLE9BQU8sQ0FBQyxjQUFjLENBQWdCO0lBQ3RDLE9BQU8sQ0FBQyxZQUFZLENBQVk7SUFDaEMsT0FBTyxDQUFDLFdBQVcsQ0FBWTtJQUUvQixPQUFPLENBQUMsc0JBQXNCLENBQVk7SUFDMUMsT0FBTyxDQUFDLGdCQUFnQixDQUFnQjtJQUV4QyxPQUFPLENBQUMsR0FBRyxDQUE0QztJQUV2RCxPQUFPLGVBcUZOO0lBRUQsT0FBb0IsR0FBRyxDQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUUsU0FBUyxDQUFDLEVBQUUsaUJBQWlCLG9DQVVoRjtJQUVNLFNBQVMsSUFBSSxPQUFPLENBRTFCO0lBRU0sZ0JBQWdCLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFVckU7SUFFTSxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sUUFNaEU7SUFFTSxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sUUFHbkM7SUFFTSxxQkFBcUIsQ0FBQyxXQUFXLEVBQUUsTUFBTSxRQUUvQztJQUVNLHFCQUFxQixDQUFDLElBQUksRUFBRTtRQUFFLFFBQVEsRUFBRSxNQUFNLENBQUM7UUFBQyxhQUFhLEVBQUUsTUFBTSxDQUFDO1FBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQTtLQUFFLEVBQUUsUUFXOUY7SUFFTSxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsTUFBTSxRQUU3QztDQUNGIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/archiver/instrumentation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAKL,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EACpB,KAAK,MAAM,EAGZ,MAAM,yBAAyB,CAAC;AAEjC,qBAAa,uBAAuB;IAed,OAAO,CAAC,SAAS;IAdrC,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,YAAY,CAAY;IAChC,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,oBAAoB,CAAY;IACxC,OAAO,CAAC,oBAAoB,CAAgB;IAC5C,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,UAAU,CAAgB;IAElC,OAAO,CAAC,GAAG,CAA4C;IAEvD,OAAO;WAsDa,GAAG,CAAC,SAAS,EAAE,eAAe,EAAE,SAAS,CAAC,EAAE,iBAAiB;IAU1E,SAAS,IAAI,OAAO;IAIpB,gBAAgB,CAAC,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;IAS5D,YAAY;IAIZ,qBAAqB,CAAC,WAAW,EAAE,MAAM;IAIzC,qBAAqB,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE;IAaxF,mBAAmB,CAAC,WAAW,EAAE,MAAM;CAG/C"}
1
+ {"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/archiver/instrumentation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAKL,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EACpB,KAAK,MAAM,EAGZ,MAAM,yBAAyB,CAAC;AAEjC,qBAAa,uBAAuB;IAwBhC,OAAO,CAAC,SAAS;IAvBnB,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,oBAAoB,CAAY;IACxC,OAAO,CAAC,oBAAoB,CAAgB;IAC5C,OAAO,CAAC,SAAS,CAAc;IAE/B,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,UAAU,CAAgB;IAElC,OAAO,CAAC,oBAAoB,CAAY;IACxC,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,YAAY,CAAY;IAChC,OAAO,CAAC,WAAW,CAAY;IAE/B,OAAO,CAAC,sBAAsB,CAAY;IAC1C,OAAO,CAAC,gBAAgB,CAAgB;IAExC,OAAO,CAAC,GAAG,CAA4C;IAEvD,OAAO,eAqFN;IAED,OAAoB,GAAG,CAAC,SAAS,EAAE,eAAe,EAAE,SAAS,CAAC,EAAE,iBAAiB,oCAUhF;IAEM,SAAS,IAAI,OAAO,CAE1B;IAEM,gBAAgB,CAAC,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAUrE;IAEM,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,QAMhE;IAEM,YAAY,CAAC,QAAQ,EAAE,MAAM,QAGnC;IAEM,qBAAqB,CAAC,WAAW,EAAE,MAAM,QAE/C;IAEM,qBAAqB,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,QAW9F;IAEM,mBAAmB,CAAC,WAAW,EAAE,MAAM,QAE7C;CACF"}