@aztec-labs/archiver 6.0.0-nightly.20260829

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 (174) hide show
  1. package/README.md +178 -0
  2. package/dest/archiver.d.ts +194 -0
  3. package/dest/archiver.d.ts.map +1 -0
  4. package/dest/archiver.js +948 -0
  5. package/dest/config.d.ts +34 -0
  6. package/dest/config.d.ts.map +1 -0
  7. package/dest/config.js +100 -0
  8. package/dest/errors.d.ts +97 -0
  9. package/dest/errors.d.ts.map +1 -0
  10. package/dest/errors.js +141 -0
  11. package/dest/factory.d.ts +32 -0
  12. package/dest/factory.d.ts.map +1 -0
  13. package/dest/factory.js +183 -0
  14. package/dest/index.d.ts +20 -0
  15. package/dest/index.d.ts.map +1 -0
  16. package/dest/index.js +18 -0
  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/l1/bin/retrieve-calldata.d.ts +3 -0
  21. package/dest/l1/bin/retrieve-calldata.d.ts.map +1 -0
  22. package/dest/l1/bin/retrieve-calldata.js +152 -0
  23. package/dest/l1/calldata_retriever.d.ts +143 -0
  24. package/dest/l1/calldata_retriever.d.ts.map +1 -0
  25. package/dest/l1/calldata_retriever.js +413 -0
  26. package/dest/l1/data_retrieval.d.ts +102 -0
  27. package/dest/l1/data_retrieval.d.ts.map +1 -0
  28. package/dest/l1/data_retrieval.js +308 -0
  29. package/dest/l1/debug_tx.d.ts +19 -0
  30. package/dest/l1/debug_tx.d.ts.map +1 -0
  31. package/dest/l1/debug_tx.js +73 -0
  32. package/dest/l1/spire_proposer.d.ts +70 -0
  33. package/dest/l1/spire_proposer.d.ts.map +1 -0
  34. package/dest/l1/spire_proposer.js +149 -0
  35. package/dest/l1/trace_tx.d.ts +43 -0
  36. package/dest/l1/trace_tx.d.ts.map +1 -0
  37. package/dest/l1/trace_tx.js +91 -0
  38. package/dest/l1/types.d.ts +12 -0
  39. package/dest/l1/types.d.ts.map +1 -0
  40. package/dest/l1/types.js +3 -0
  41. package/dest/l1/validate_historical_logs.d.ts +23 -0
  42. package/dest/l1/validate_historical_logs.d.ts.map +1 -0
  43. package/dest/l1/validate_historical_logs.js +108 -0
  44. package/dest/l1/validate_trace.d.ts +32 -0
  45. package/dest/l1/validate_trace.d.ts.map +1 -0
  46. package/dest/l1/validate_trace.js +154 -0
  47. package/dest/modules/contract_data_source_adapter.d.ts +25 -0
  48. package/dest/modules/contract_data_source_adapter.d.ts.map +1 -0
  49. package/dest/modules/contract_data_source_adapter.js +32 -0
  50. package/dest/modules/data_source_base.d.ts +116 -0
  51. package/dest/modules/data_source_base.d.ts.map +1 -0
  52. package/dest/modules/data_source_base.js +334 -0
  53. package/dest/modules/data_store_updater.d.ts +105 -0
  54. package/dest/modules/data_store_updater.d.ts.map +1 -0
  55. package/dest/modules/data_store_updater.js +392 -0
  56. package/dest/modules/instrumentation.d.ts +63 -0
  57. package/dest/modules/instrumentation.d.ts.map +1 -0
  58. package/dest/modules/instrumentation.js +166 -0
  59. package/dest/modules/l1_synchronizer.d.ts +77 -0
  60. package/dest/modules/l1_synchronizer.d.ts.map +1 -0
  61. package/dest/modules/l1_synchronizer.js +1369 -0
  62. package/dest/modules/outbox_trees_resolver.d.ts +64 -0
  63. package/dest/modules/outbox_trees_resolver.d.ts.map +1 -0
  64. package/dest/modules/outbox_trees_resolver.js +184 -0
  65. package/dest/modules/validation.d.ts +40 -0
  66. package/dest/modules/validation.d.ts.map +1 -0
  67. package/dest/modules/validation.js +122 -0
  68. package/dest/store/block_store.d.ts +304 -0
  69. package/dest/store/block_store.d.ts.map +1 -0
  70. package/dest/store/block_store.js +1252 -0
  71. package/dest/store/contract_class_store.d.ts +31 -0
  72. package/dest/store/contract_class_store.d.ts.map +1 -0
  73. package/dest/store/contract_class_store.js +98 -0
  74. package/dest/store/contract_instance_store.d.ts +51 -0
  75. package/dest/store/contract_instance_store.d.ts.map +1 -0
  76. package/dest/store/contract_instance_store.js +129 -0
  77. package/dest/store/data_stores.d.ts +68 -0
  78. package/dest/store/data_stores.d.ts.map +1 -0
  79. package/dest/store/data_stores.js +54 -0
  80. package/dest/store/function_names_cache.d.ts +17 -0
  81. package/dest/store/function_names_cache.d.ts.map +1 -0
  82. package/dest/store/function_names_cache.js +30 -0
  83. package/dest/store/l2_tips_cache.d.ts +25 -0
  84. package/dest/store/l2_tips_cache.d.ts.map +1 -0
  85. package/dest/store/l2_tips_cache.js +26 -0
  86. package/dest/store/log_store.d.ts +59 -0
  87. package/dest/store/log_store.d.ts.map +1 -0
  88. package/dest/store/log_store.js +310 -0
  89. package/dest/store/log_store_codec.d.ts +78 -0
  90. package/dest/store/log_store_codec.d.ts.map +1 -0
  91. package/dest/store/log_store_codec.js +110 -0
  92. package/dest/store/message_store.d.ts +111 -0
  93. package/dest/store/message_store.d.ts.map +1 -0
  94. package/dest/store/message_store.js +522 -0
  95. package/dest/structs/data_retrieval.d.ts +27 -0
  96. package/dest/structs/data_retrieval.d.ts.map +1 -0
  97. package/dest/structs/data_retrieval.js +5 -0
  98. package/dest/structs/inbox_message.d.ts +17 -0
  99. package/dest/structs/inbox_message.d.ts.map +1 -0
  100. package/dest/structs/inbox_message.js +33 -0
  101. package/dest/structs/published.d.ts +2 -0
  102. package/dest/structs/published.d.ts.map +1 -0
  103. package/dest/structs/published.js +1 -0
  104. package/dest/test/fake_l1_state.d.ts +220 -0
  105. package/dest/test/fake_l1_state.d.ts.map +1 -0
  106. package/dest/test/fake_l1_state.js +565 -0
  107. package/dest/test/index.d.ts +5 -0
  108. package/dest/test/index.d.ts.map +1 -0
  109. package/dest/test/index.js +6 -0
  110. package/dest/test/mock_archiver.d.ts +35 -0
  111. package/dest/test/mock_archiver.d.ts.map +1 -0
  112. package/dest/test/mock_archiver.js +93 -0
  113. package/dest/test/mock_l1_to_l2_message_source.d.ts +24 -0
  114. package/dest/test/mock_l1_to_l2_message_source.d.ts.map +1 -0
  115. package/dest/test/mock_l1_to_l2_message_source.js +79 -0
  116. package/dest/test/mock_l2_block_source.d.ts +139 -0
  117. package/dest/test/mock_l2_block_source.d.ts.map +1 -0
  118. package/dest/test/mock_l2_block_source.js +489 -0
  119. package/dest/test/mock_structs.d.ts +92 -0
  120. package/dest/test/mock_structs.d.ts.map +1 -0
  121. package/dest/test/mock_structs.js +188 -0
  122. package/dest/test/noop_l1_archiver.d.ts +34 -0
  123. package/dest/test/noop_l1_archiver.d.ts.map +1 -0
  124. package/dest/test/noop_l1_archiver.js +88 -0
  125. package/package.json +108 -0
  126. package/src/archiver.ts +785 -0
  127. package/src/config.ts +133 -0
  128. package/src/errors.ts +211 -0
  129. package/src/factory.ts +262 -0
  130. package/src/index.ts +29 -0
  131. package/src/interfaces.ts +9 -0
  132. package/src/l1/README.md +55 -0
  133. package/src/l1/bin/retrieve-calldata.ts +194 -0
  134. package/src/l1/calldata_retriever.ts +529 -0
  135. package/src/l1/data_retrieval.ts +498 -0
  136. package/src/l1/debug_tx.ts +98 -0
  137. package/src/l1/spire_proposer.ts +151 -0
  138. package/src/l1/trace_tx.ts +127 -0
  139. package/src/l1/types.ts +12 -0
  140. package/src/l1/validate_historical_logs.ts +140 -0
  141. package/src/l1/validate_trace.ts +228 -0
  142. package/src/modules/contract_data_source_adapter.ts +46 -0
  143. package/src/modules/data_source_base.ts +482 -0
  144. package/src/modules/data_store_updater.ts +520 -0
  145. package/src/modules/instrumentation.ts +217 -0
  146. package/src/modules/l1_synchronizer.ts +1296 -0
  147. package/src/modules/outbox_trees_resolver.ts +220 -0
  148. package/src/modules/validation.ts +186 -0
  149. package/src/store/block_store.ts +1604 -0
  150. package/src/store/contract_class_store.ts +126 -0
  151. package/src/store/contract_instance_store.ts +178 -0
  152. package/src/store/data_stores.ts +103 -0
  153. package/src/store/function_names_cache.ts +37 -0
  154. package/src/store/l2_tips_cache.ts +35 -0
  155. package/src/store/log_store.ts +380 -0
  156. package/src/store/log_store_codec.ts +143 -0
  157. package/src/store/message_store.ts +621 -0
  158. package/src/structs/data_retrieval.ts +27 -0
  159. package/src/structs/inbox_message.ts +48 -0
  160. package/src/structs/published.ts +1 -0
  161. package/src/test/fake_l1_state.ts +807 -0
  162. package/src/test/fixtures/debug_traceTransaction-multicall3.json +88 -0
  163. package/src/test/fixtures/debug_traceTransaction-multiplePropose.json +153 -0
  164. package/src/test/fixtures/debug_traceTransaction-proxied.json +122 -0
  165. package/src/test/fixtures/trace_transaction-multicall3.json +65 -0
  166. package/src/test/fixtures/trace_transaction-multiplePropose.json +319 -0
  167. package/src/test/fixtures/trace_transaction-proxied.json +128 -0
  168. package/src/test/fixtures/trace_transaction-randomRevert.json +216 -0
  169. package/src/test/index.ts +7 -0
  170. package/src/test/mock_archiver.ts +122 -0
  171. package/src/test/mock_l1_to_l2_message_source.ts +81 -0
  172. package/src/test/mock_l2_block_source.ts +620 -0
  173. package/src/test/mock_structs.ts +317 -0
  174. package/src/test/noop_l1_archiver.ts +157 -0
@@ -0,0 +1,565 @@
1
+ import { RollupAbi } from '@aztec/l1-artifacts';
2
+ import { getBlobsPerL1Block, getPrefixedEthBlobCommitments } from '@aztec-labs/blob-lib';
3
+ import { MULTI_CALL_3_ADDRESS } from '@aztec-labs/ethereum/contracts';
4
+ import { CheckpointNumber } from '@aztec-labs/foundation/branded-types';
5
+ import { Buffer32 } from '@aztec-labs/foundation/buffer';
6
+ import { Secp256k1Signer } from '@aztec-labs/foundation/crypto/secp256k1-signer';
7
+ import { Fr } from '@aztec-labs/foundation/curves/bn254';
8
+ import { createLogger } from '@aztec-labs/foundation/log';
9
+ import { CommitteeAttestation, CommitteeAttestationsAndSigners } from '@aztec-labs/stdlib/block';
10
+ import { getSlotAtTimestamp } from '@aztec-labs/stdlib/epoch-helpers';
11
+ import { updateInboxRollingHash } from '@aztec-labs/stdlib/messaging';
12
+ import { ConsensusPayload, getHashedSignaturePayloadTypedData } from '@aztec-labs/stdlib/p2p';
13
+ import { mockCheckpointAndMessages } from '@aztec-labs/stdlib/testing';
14
+ import { AppendOnlyTreeSnapshot } from '@aztec-labs/stdlib/trees';
15
+ import { mock } from 'jest-mock-extended';
16
+ import { encodeAbiParameters, encodeFunctionData, keccak256, multicall3Abi, toHex } from 'viem';
17
+ // Mirror of the on-chain per-bucket message cap: further messages in the same L1 block spill into the next bucket.
18
+ const MAX_MSGS_PER_BUCKET = 256;
19
+ /**
20
+ * Stateful fake for L1 data used by the archiver.
21
+ *
22
+ * This class simulates the L1 blockchain state that the archiver reads from:
23
+ * - RollupContract: status(), archiveAt(), getVersion(), getTargetCommitteeSize(), CheckpointProposed events
24
+ * - InboxContract: getState(), MessageSent events
25
+ * - PublicClient: getBlockNumber(), getBlock(), getTransaction()
26
+ * - BlobClient: getBlobSidecar()
27
+ *
28
+ * @example
29
+ * ```ts
30
+ * const fake = new FakeL1State(config);
31
+ *
32
+ * // Add checkpoint (creates messages automatically)
33
+ * const { checkpoint, messages } = await fake.addCheckpoint(CheckpointNumber(1), { l1BlockNumber: 101n });
34
+ * fake.setL1BlockNumber(105n);
35
+ *
36
+ * // Status auto-updated
37
+ * expect(fake.getRollupStatus().pendingCheckpointNumber).toEqual(CheckpointNumber(1));
38
+ * ```
39
+ */ export class FakeL1State {
40
+ config;
41
+ log;
42
+ l1BlockNumber;
43
+ checkpoints;
44
+ messages;
45
+ // Consensus rolling-hash and bucket-ring state, mirroring the on-chain Inbox.
46
+ messagesConsensusRollingHash;
47
+ currentBucketSeq;
48
+ currentBucketTimestamp;
49
+ currentBucketMsgCount;
50
+ lastArchive;
51
+ provenCheckpointNumber;
52
+ targetCommitteeSize;
53
+ version;
54
+ canPruneResult;
55
+ // Computed from checkpoints based on L1 block visibility
56
+ pendingCheckpointNumber;
57
+ // The L1 block number reported as "finalized" (defaults to the start block).
58
+ // `undefined` simulates the startup window on a fresh devnet where
59
+ // `getBlock({ blockTag: 'finalized' })` fails with "finalized block not found".
60
+ finalizedL1BlockNumber;
61
+ constructor(config){
62
+ this.config = config;
63
+ this.log = createLogger('archiver:test:fake-l1');
64
+ this.checkpoints = [];
65
+ this.messages = [];
66
+ this.messagesConsensusRollingHash = Fr.ZERO;
67
+ this.currentBucketSeq = 0n;
68
+ this.currentBucketTimestamp = 0n;
69
+ this.currentBucketMsgCount = 0;
70
+ this.provenCheckpointNumber = CheckpointNumber(0);
71
+ this.targetCommitteeSize = 0;
72
+ this.version = 1n;
73
+ this.canPruneResult = false;
74
+ this.pendingCheckpointNumber = CheckpointNumber(0);
75
+ this.l1BlockNumber = config.l1StartBlock;
76
+ this.finalizedL1BlockNumber = config.l1StartBlock;
77
+ this.lastArchive = new AppendOnlyTreeSnapshot(config.genesisArchiveRoot, 1);
78
+ }
79
+ /**
80
+ * Adds messages for a checkpoint. Returns the message leaves.
81
+ * Auto-updates rolling hash.
82
+ *
83
+ * Note: For most use cases, use `addCheckpoint` which creates both checkpoint and messages.
84
+ * Use this method only when you need to add messages without creating a checkpoint (e.g., for reorg tests).
85
+ */ addMessages(_checkpointNumber, l1BlockNumber, messageLeaves) {
86
+ const timestamp = this.getTimestampAtL1Block(l1BlockNumber);
87
+ messageLeaves.forEach((leaf)=>{
88
+ // Compact global insertion index: the position in the Inbox's insertion order.
89
+ const index = BigInt(this.messages.length);
90
+ const { bucketSeq, inboxRollingHash } = this.absorbIntoBucket(leaf, timestamp);
91
+ this.messages.push({
92
+ l1BlockNumber,
93
+ index,
94
+ leaf,
95
+ inboxRollingHash,
96
+ bucketSeq
97
+ });
98
+ });
99
+ }
100
+ /** Mirrors the on-chain `_absorbIntoBucket`: opens a new bucket on a strictly larger timestamp or a full bucket. */ absorbIntoBucket(leaf, timestamp) {
101
+ if (this.currentBucketSeq === 0n || this.currentBucketTimestamp < timestamp || this.currentBucketMsgCount === MAX_MSGS_PER_BUCKET) {
102
+ this.currentBucketSeq += 1n;
103
+ this.currentBucketTimestamp = timestamp;
104
+ this.currentBucketMsgCount = 0;
105
+ }
106
+ this.messagesConsensusRollingHash = updateInboxRollingHash(this.messagesConsensusRollingHash, leaf);
107
+ this.currentBucketMsgCount += 1;
108
+ return {
109
+ bucketSeq: this.currentBucketSeq,
110
+ inboxRollingHash: this.messagesConsensusRollingHash
111
+ };
112
+ }
113
+ /** Rebuilds all per-message derived state (rolling hashes and bucket assignments) after the message set changes. */ recomputeDerivedMessageState() {
114
+ this.messagesConsensusRollingHash = Fr.ZERO;
115
+ this.currentBucketSeq = 0n;
116
+ this.currentBucketTimestamp = 0n;
117
+ this.currentBucketMsgCount = 0;
118
+ this.messages.forEach((msg, i)=>{
119
+ const { bucketSeq, inboxRollingHash } = this.absorbIntoBucket(msg.leaf, this.getTimestampAtL1Block(msg.l1BlockNumber));
120
+ msg.index = BigInt(i);
121
+ msg.inboxRollingHash = inboxRollingHash;
122
+ msg.bucketSeq = bucketSeq;
123
+ });
124
+ }
125
+ /**
126
+ * Creates blocks for a checkpoint without adding them to L1 state.
127
+ * Useful for creating blocks to pass to addBlock() for testing provisional block handling.
128
+ * Returns the blocks directly.
129
+ */ async makeBlocks(checkpointNumber, options) {
130
+ return (await this.makeCheckpointAndMessages(checkpointNumber, options)).checkpoint.blocks;
131
+ }
132
+ /**
133
+ * Creates and adds a checkpoint with its L1-to-L2 messages.
134
+ * Returns both the checkpoint and the message leaves.
135
+ * Auto-chains from lastArchive, auto-updates pending status if L1 block >= checkpoint's L1 block.
136
+ */ async addCheckpoint(checkpointNumber, options) {
137
+ this.log.warn(`Adding checkpoint ${checkpointNumber}`);
138
+ const { l1BlockNumber, signers = [], messagesL1BlockNumber = l1BlockNumber - 3n } = options;
139
+ // Create the checkpoint using the stdlib helper
140
+ const { checkpoint, messages, lastArchive } = await this.makeCheckpointAndMessages(checkpointNumber, {
141
+ ...options,
142
+ numL1ToL2Messages: options.numL1ToL2Messages ?? 3
143
+ });
144
+ // Store the messages internally so they match the checkpoint's inHash
145
+ this.addMessages(checkpointNumber, messagesL1BlockNumber, messages);
146
+ // Create the transaction, blobs, and event hashes
147
+ const { tx, attestationsHash, payloadDigest } = await this.makeRollupTx(checkpoint, signers);
148
+ const blobHashes = await this.makeVersionedBlobHashes(checkpoint);
149
+ const blobs = await this.makeBlobsFromCheckpoint(checkpoint);
150
+ // Store the checkpoint data
151
+ this.checkpoints.push({
152
+ checkpointNumber,
153
+ checkpoint,
154
+ l1BlockNumber,
155
+ tx,
156
+ blobHashes,
157
+ blobs,
158
+ signers,
159
+ attestationsHash,
160
+ payloadDigest
161
+ });
162
+ // Update last archive for auto-chaining
163
+ this.lastArchive = lastArchive ?? checkpoint.blocks.at(-1).archive;
164
+ // Auto-update pending checkpoint number
165
+ this.updatePendingCheckpointNumber();
166
+ return {
167
+ checkpoint,
168
+ messages
169
+ };
170
+ }
171
+ /** Creates a checkpoint and messages without adding them to L1 state. */ makeCheckpointAndMessages(checkpointNumber, options) {
172
+ const { numBlocks = 1, txsPerBlock = 4, maxEffects, slotNumber, previousArchive = this.lastArchive, timestamp, l1BlockNumber, numL1ToL2Messages = 0, blocks } = options;
173
+ return mockCheckpointAndMessages(checkpointNumber, {
174
+ startBlockNumber: this.getNextBlockNumber(checkpointNumber),
175
+ numBlocks,
176
+ blocks,
177
+ numTxsPerBlock: txsPerBlock,
178
+ numL1ToL2Messages,
179
+ previousArchive,
180
+ slotNumber: slotNumber ?? (l1BlockNumber !== undefined ? this.getL2SlotAtL1Block(l1BlockNumber) : undefined),
181
+ timestamp: timestamp ?? (l1BlockNumber !== undefined ? this.getTimestampAtL1Block(l1BlockNumber) : undefined),
182
+ ...maxEffects !== undefined ? {
183
+ maxEffects
184
+ } : {}
185
+ });
186
+ }
187
+ /** Returns the L2 slot at the given L1 block (assuming all L1 blocks are mined) */ getL2SlotAtL1Block(l1BlockNumber) {
188
+ const timestamp = this.getTimestampAtL1Block(l1BlockNumber);
189
+ return getSlotAtTimestamp(timestamp, this.config);
190
+ }
191
+ /** Returns the timestamp at the given L1 block (assuming all L1 blocks are mined) */ getTimestampAtL1Block(l1BlockNumber) {
192
+ const { l1GenesisTime, l1StartBlock, ethereumSlotDuration } = this.config;
193
+ return l1GenesisTime + (l1BlockNumber - l1StartBlock) * BigInt(ethereumSlotDuration);
194
+ }
195
+ /**
196
+ * Sets the current L1 block number.
197
+ * Auto-updates pending checkpoint number based on visible checkpoints.
198
+ */ setL1BlockNumber(blockNumber) {
199
+ this.l1BlockNumber = blockNumber;
200
+ this.updatePendingCheckpointNumber();
201
+ }
202
+ /**
203
+ * Sets the L1 block number that will be reported as "finalized". Pass `undefined` to
204
+ * simulate a chain that does not yet have a finalized block (devnet startup).
205
+ */ setFinalizedL1BlockNumber(blockNumber) {
206
+ this.finalizedL1BlockNumber = blockNumber;
207
+ }
208
+ /** Marks a checkpoint as proven. Updates provenCheckpointNumber. */ markCheckpointAsProven(checkpointNumber) {
209
+ this.provenCheckpointNumber = checkpointNumber;
210
+ }
211
+ /**
212
+ * Simulates what `rollup.getProvenCheckpointNumber({ blockNumber: atL1Block })` would return.
213
+ */ getProvenCheckpointNumberAtL1Block(atL1Block) {
214
+ if (this.provenCheckpointNumber === 0) {
215
+ return CheckpointNumber(0);
216
+ }
217
+ const checkpoint = this.checkpoints.find((cp)=>cp.checkpointNumber === this.provenCheckpointNumber);
218
+ if (checkpoint && checkpoint.l1BlockNumber <= atL1Block) {
219
+ return this.provenCheckpointNumber;
220
+ }
221
+ return CheckpointNumber(0);
222
+ }
223
+ /** Sets the target committee size for attestation validation. */ setTargetCommitteeSize(size) {
224
+ this.targetCommitteeSize = size;
225
+ }
226
+ /** Sets whether the rollup contract would allow pruning at the next block. */ setCanPrune(value) {
227
+ this.canPruneResult = value;
228
+ }
229
+ /**
230
+ * Removes all entries for a checkpoint number (simulates L1 reorg or prune).
231
+ * Note: Does NOT remove messages for this checkpoint (use numL1ToL2Messages: 0 when re-adding).
232
+ * Auto-updates pending status.
233
+ */ removeCheckpoint(checkpointNumber) {
234
+ this.checkpoints = this.checkpoints.filter((cpData)=>cpData.checkpointNumber !== checkpointNumber);
235
+ this.updatePendingCheckpointNumber();
236
+ }
237
+ /**
238
+ * Moves a checkpoint to a different L1 block number (simulates L1 reorg that
239
+ * re-includes the same checkpoint transaction in a different block).
240
+ * The checkpoint content stays the same — only the L1 metadata changes.
241
+ * Auto-updates pending status.
242
+ */ moveCheckpointToL1Block(checkpointNumber, newL1BlockNumber) {
243
+ for (const cpData of this.checkpoints){
244
+ if (cpData.checkpointNumber === checkpointNumber) {
245
+ cpData.l1BlockNumber = newL1BlockNumber;
246
+ }
247
+ }
248
+ this.updatePendingCheckpointNumber();
249
+ }
250
+ /**
251
+ * Removes messages after a given total index (simulates L1 reorg).
252
+ * Auto-updates rolling hash.
253
+ */ removeMessagesAfter(totalIndex) {
254
+ this.messages = this.messages.slice(0, totalIndex);
255
+ this.recomputeDerivedMessageState();
256
+ }
257
+ /**
258
+ * Simulates a pruned checkpoint by marking all entries with this number as pruned.
259
+ * The event will still be returned, but archiveAt() will return the previous checkpoint's archive
260
+ * (or genesis if no previous checkpoint), causing a mismatch that the archiver will detect.
261
+ */ markCheckpointAsPruned(checkpointNumber) {
262
+ for (const cpData of this.checkpoints){
263
+ if (cpData.checkpointNumber === checkpointNumber) {
264
+ cpData.pruned = true;
265
+ }
266
+ }
267
+ this.updatePendingCheckpointNumber();
268
+ }
269
+ /**
270
+ * Moves messages at a given L1 block to a new L1 block.
271
+ * Useful for simulating partial message visibility (messages at higher L1 blocks won't be fetched).
272
+ */ moveMessagesToL1Block(fromL1Block, toL1Block) {
273
+ this.messages.forEach((msg)=>{
274
+ if (msg.l1BlockNumber === fromL1Block) {
275
+ msg.l1BlockNumber = toL1Block;
276
+ }
277
+ });
278
+ }
279
+ /**
280
+ * Moves a specific message (by index in the messages array) to a new L1 block.
281
+ */ moveMessageAtIndexToL1Block(index, toL1Block) {
282
+ if (this.messages[index]) {
283
+ this.messages[index].l1BlockNumber = toL1Block;
284
+ }
285
+ }
286
+ /** Gets current rollup status. */ getRollupStatus() {
287
+ return {
288
+ provenCheckpointNumber: this.provenCheckpointNumber,
289
+ pendingCheckpointNumber: this.pendingCheckpointNumber,
290
+ provenArchive: this.getArchiveAt(this.provenCheckpointNumber),
291
+ pendingArchive: this.getArchiveAt(this.pendingCheckpointNumber)
292
+ };
293
+ }
294
+ /** Gets the last archive (for manual chaining if needed). */ getLastArchive() {
295
+ return this.lastArchive;
296
+ }
297
+ /** Gets the latest checkpoint entry by number (returns the last added one). */ getCheckpoint(checkpointNumber) {
298
+ return this.checkpoints.findLast((cpData)=>cpData.checkpointNumber === checkpointNumber)?.checkpoint;
299
+ }
300
+ /** Gets the blobs for a checkpoint. */ getCheckpointBlobs(checkpointNumber) {
301
+ return this.checkpoints.findLast((cpData)=>cpData.checkpointNumber === checkpointNumber)?.blobs ?? [];
302
+ }
303
+ /** Creates mock RollupContract that reads from this fake state. */ createMockRollupContract(_publicClient) {
304
+ const mockRollup = mock();
305
+ mockRollup.getVersion.mockImplementation(()=>Promise.resolve(this.version));
306
+ mockRollup.getTargetCommitteeSize.mockImplementation(()=>Promise.resolve(this.targetCommitteeSize));
307
+ mockRollup.archiveAt.mockImplementation((cpNum)=>Promise.resolve(this.getArchiveAt(cpNum)));
308
+ mockRollup.status.mockImplementation((localCheckpointNum)=>{
309
+ const status = this.getRollupStatus();
310
+ return Promise.resolve({
311
+ provenCheckpointNumber: status.provenCheckpointNumber,
312
+ provenArchive: status.provenArchive,
313
+ pendingCheckpointNumber: status.pendingCheckpointNumber,
314
+ pendingArchive: status.pendingArchive,
315
+ archiveOfMyCheckpoint: this.getArchiveAt(localCheckpointNum)
316
+ });
317
+ });
318
+ mockRollup.getProvenCheckpointNumber.mockImplementation((options)=>{
319
+ const atBlock = options?.blockNumber ?? this.l1BlockNumber;
320
+ return Promise.resolve(this.getProvenCheckpointNumberAtL1Block(atBlock));
321
+ });
322
+ mockRollup.canPruneAtTime.mockImplementation(()=>Promise.resolve(this.canPruneResult));
323
+ // Mock the wrapper method for fetching checkpoint events
324
+ mockRollup.getCheckpointProposedEvents.mockImplementation((fromBlock, toBlock)=>Promise.resolve(this.getCheckpointProposedLogs(fromBlock, toBlock)));
325
+ Object.defineProperty(mockRollup, 'address', {
326
+ get: ()=>this.config.rollupAddress.toString()
327
+ });
328
+ return mockRollup;
329
+ }
330
+ /** Creates mock InboxContract that reads from this fake state. */ createMockInboxContract(_publicClient) {
331
+ const mockInbox = mock();
332
+ // Mirror the on-chain Inbox live state: its consensus rolling hash and cumulative total are the chain
333
+ // position the archiver's message sync compares against, read atomically.
334
+ mockInbox.getState.mockImplementation((opts = {})=>{
335
+ const blockNumber = opts.blockNumber ?? this.l1BlockNumber;
336
+ const visibleMessages = this.messages.filter((m)=>m.l1BlockNumber <= blockNumber);
337
+ const last = visibleMessages.at(-1);
338
+ return Promise.resolve({
339
+ rollingHash: last?.inboxRollingHash ?? Fr.ZERO,
340
+ totalMessagesInserted: BigInt(visibleMessages.length),
341
+ currentBucketSeq: last?.bucketSeq ?? 0n
342
+ });
343
+ });
344
+ // Mock the wrapper methods for fetching message events
345
+ mockInbox.getMessageSentEvents.mockImplementation((fromBlock, toBlock)=>Promise.resolve(this.getMessageSentLogs(fromBlock, toBlock)));
346
+ mockInbox.getMessageSentEventByHash.mockImplementation((msgHash, aroundL1BlockNumber)=>Promise.resolve(this.getMessageSentLogByHash(msgHash, aroundL1BlockNumber)));
347
+ return mockInbox;
348
+ }
349
+ /** Creates mock PublicClient that reads from this fake state. */ createMockPublicClient() {
350
+ const publicClient = mock();
351
+ publicClient.getChainId.mockResolvedValue(1);
352
+ // Several consumers (CalldataRetriever, ArchiverL1Synchronizer) derive the EIP-712 signing
353
+ // context from `publicClient.chain.id`. Pin it so it matches `getSignatureContext()` below.
354
+ publicClient.chain = {
355
+ id: 1
356
+ };
357
+ publicClient.getBlockNumber.mockImplementation(()=>Promise.resolve(this.l1BlockNumber));
358
+ publicClient.getBlock.mockImplementation(async (args = {})=>{
359
+ let blockNum;
360
+ if (args.blockTag === 'finalized') {
361
+ if (this.finalizedL1BlockNumber === undefined) {
362
+ throw Object.assign(new Error('finalized block not found'), {
363
+ details: 'finalized block not found'
364
+ });
365
+ }
366
+ blockNum = this.finalizedL1BlockNumber;
367
+ } else {
368
+ blockNum = args.blockNumber ?? await publicClient.getBlockNumber();
369
+ }
370
+ return {
371
+ number: blockNum,
372
+ timestamp: BigInt(blockNum) * BigInt(this.config.ethereumSlotDuration) + this.config.l1GenesisTime,
373
+ hash: Buffer32.fromBigInt(blockNum).toString()
374
+ };
375
+ });
376
+ // Use the same pattern as existing test for getTransaction
377
+ publicClient.getTransaction.mockImplementation((args)=>Promise.resolve(args.hash ? this.checkpoints.find((cpData)=>cpData.tx.hash === args.hash)?.tx : undefined));
378
+ return publicClient;
379
+ }
380
+ /** Creates mock BlobClient that reads from this fake state. */ createMockBlobClient() {
381
+ const blobClient = mock();
382
+ // The blockId is the L1 block hash, which we derive from the L1 block number
383
+ blobClient.getBlobSidecar.mockImplementation((blockId)=>Promise.resolve(this.checkpoints.find((cpData)=>Buffer32.fromBigInt(cpData.l1BlockNumber).toString() === blockId)?.blobs ?? []));
384
+ blobClient.testSources.mockResolvedValue(undefined);
385
+ return blobClient;
386
+ }
387
+ updatePendingCheckpointNumber() {
388
+ this.pendingCheckpointNumber = this.checkpoints.filter((cpData)=>cpData.l1BlockNumber <= this.l1BlockNumber && !cpData.pruned).reduce((max, cpData)=>cpData.checkpointNumber > max ? cpData.checkpointNumber : max, CheckpointNumber(0));
389
+ }
390
+ getArchiveAt(checkpointNumber) {
391
+ if (checkpointNumber === 0) {
392
+ return this.config.genesisArchiveRoot;
393
+ }
394
+ // Find the latest non-pruned entry for this checkpoint number
395
+ const entries = this.checkpoints.filter((cpData)=>cpData.checkpointNumber === checkpointNumber);
396
+ const latestEntry = entries.at(-1);
397
+ if (!latestEntry || latestEntry.pruned) {
398
+ // For pruned or missing checkpoints, return the previous non-pruned checkpoint's archive
399
+ return this.getArchiveAt(CheckpointNumber(checkpointNumber - 1));
400
+ }
401
+ return latestEntry.checkpoint.archive.root;
402
+ }
403
+ getNextBlockNumber(checkpointNumber) {
404
+ const lastBlockNumber = this.checkpoints.filter((cpData)=>cpData.checkpointNumber < checkpointNumber).flatMap((cpData)=>cpData.checkpoint.blocks.map((b)=>b.number)).reduce((max, num)=>Math.max(max, num), 0);
405
+ return lastBlockNumber + 1;
406
+ }
407
+ getCheckpointProposedLogs(fromBlock, toBlock) {
408
+ return this.checkpoints.filter((cpData)=>cpData.l1BlockNumber >= fromBlock && cpData.l1BlockNumber <= toBlock).map((cpData)=>({
409
+ l1BlockNumber: cpData.l1BlockNumber,
410
+ l1BlockHash: Buffer32.fromBigInt(cpData.l1BlockNumber),
411
+ l1TransactionHash: cpData.tx.hash,
412
+ args: {
413
+ checkpointNumber: cpData.checkpointNumber,
414
+ archive: cpData.checkpoint.archive.root,
415
+ versionedBlobHashes: cpData.blobHashes.map((h)=>Buffer.from(h.slice(2), 'hex')),
416
+ attestationsHash: cpData.attestationsHash,
417
+ payloadDigest: cpData.payloadDigest
418
+ }
419
+ }));
420
+ }
421
+ getMessageSentLogs(fromBlock, toBlock, hashFilter) {
422
+ return this.messages.filter((msg)=>(!hashFilter || msg.leaf.toString() === hashFilter) && (!fromBlock || msg.l1BlockNumber >= fromBlock) && (!toBlock || msg.l1BlockNumber <= toBlock)).map((msg)=>({
423
+ l1BlockNumber: msg.l1BlockNumber,
424
+ l1BlockHash: Buffer32.fromBigInt(msg.l1BlockNumber),
425
+ l1TransactionHash: `0x${msg.l1BlockNumber.toString(16)}`,
426
+ l1BlockTimestamp: this.getTimestampAtL1Block(msg.l1BlockNumber),
427
+ args: {
428
+ index: msg.index,
429
+ leaf: msg.leaf,
430
+ inboxRollingHash: msg.inboxRollingHash,
431
+ bucketSeq: msg.bucketSeq,
432
+ message: this.makeFakeMessageSentMessage(msg.index)
433
+ }
434
+ }));
435
+ }
436
+ getMessageSentLogByHash(msgHash, aroundL1BlockNumber) {
437
+ const msg = this.messages.find((msg)=>msg.leaf.toString() === msgHash && msg.l1BlockNumber >= aroundL1BlockNumber - 5n && msg.l1BlockNumber <= aroundL1BlockNumber + 5n);
438
+ if (!msg) {
439
+ return undefined;
440
+ }
441
+ return {
442
+ l1BlockNumber: msg.l1BlockNumber,
443
+ l1BlockHash: Buffer32.fromBigInt(msg.l1BlockNumber),
444
+ l1TransactionHash: `0x${msg.l1BlockNumber.toString(16)}`,
445
+ l1BlockTimestamp: this.getTimestampAtL1Block(msg.l1BlockNumber),
446
+ args: {
447
+ index: msg.index,
448
+ leaf: msg.leaf,
449
+ inboxRollingHash: msg.inboxRollingHash,
450
+ bucketSeq: msg.bucketSeq,
451
+ message: this.makeFakeMessageSentMessage(msg.index)
452
+ }
453
+ };
454
+ }
455
+ // The fake tracks only leaves, so the emitted message carries placeholder fields; nothing in the archiver
456
+ // consumes them (it stores leaf and consensus metadata only).
457
+ makeFakeMessageSentMessage(index) {
458
+ return {
459
+ sender: {
460
+ actor: `0x${'0'.repeat(40)}`,
461
+ chainId: 1n
462
+ },
463
+ recipient: {
464
+ actor: Fr.ZERO,
465
+ version: 1n
466
+ },
467
+ content: Fr.ZERO,
468
+ secretHash: Fr.ZERO,
469
+ index
470
+ };
471
+ }
472
+ async makeRollupTx(checkpoint, signers) {
473
+ const signatureContext = this.getSignatureContext();
474
+ const consensusPayload = ConsensusPayload.fromCheckpoint(checkpoint, signatureContext);
475
+ const attestationDigest = getHashedSignaturePayloadTypedData(consensusPayload);
476
+ const attestations = signers.map((signer)=>CommitteeAttestation.fromSignature(signer.sign(attestationDigest))).map((committeeAttestation)=>committeeAttestation.toViem());
477
+ const header = checkpoint.header.toViem();
478
+ const blobInput = getPrefixedEthBlobCommitments(await getBlobsPerL1Block(checkpoint.toBlobFields()));
479
+ const archive = toHex(checkpoint.archive.root.toBuffer());
480
+ const attestationsAndSigners = new CommitteeAttestationsAndSigners(attestations.map((attestation)=>CommitteeAttestation.fromViem(attestation)), signatureContext);
481
+ // Fall back to a random signer when no attesters are provided, so tests that
482
+ // don't care about the proposer identity (e.g. sync tests) still produce a
483
+ // valid-looking signature for the attestationsAndSigners struct.
484
+ const proposerSigner = signers[0] ?? Secp256k1Signer.random();
485
+ const attestationsAndSignersSignature = proposerSigner.sign(getHashedSignaturePayloadTypedData(attestationsAndSigners));
486
+ const verbatimAttestations = attestationsAndSigners.getPackedAttestations();
487
+ const rollupInput = encodeFunctionData({
488
+ abi: RollupAbi,
489
+ functionName: 'propose',
490
+ args: [
491
+ {
492
+ header,
493
+ archive,
494
+ oracleInput: {
495
+ feeAssetPriceModifier: 0n
496
+ },
497
+ bucketHint: 0n
498
+ },
499
+ verbatimAttestations,
500
+ attestationsAndSigners.getSigners().map((signer)=>signer.toString()),
501
+ attestationsAndSignersSignature.toViemSignature(),
502
+ blobInput
503
+ ]
504
+ });
505
+ const multiCallInput = encodeFunctionData({
506
+ abi: multicall3Abi,
507
+ functionName: 'aggregate3',
508
+ args: [
509
+ [
510
+ {
511
+ target: this.config.rollupAddress.toString(),
512
+ callData: rollupInput,
513
+ allowFailure: false
514
+ }
515
+ ]
516
+ ]
517
+ });
518
+ // Compute attestationsHash (same logic as CalldataRetriever)
519
+ const attestationsHash = Buffer32.fromString(keccak256(encodeAbiParameters([
520
+ this.getCommitteeAttestationsStructDef()
521
+ ], [
522
+ verbatimAttestations
523
+ ])));
524
+ // Compute payloadDigest (same logic as CalldataRetriever)
525
+ const payloadDigest = getHashedSignaturePayloadTypedData(consensusPayload);
526
+ const tx = {
527
+ input: multiCallInput,
528
+ hash: archive,
529
+ blockHash: archive,
530
+ to: MULTI_CALL_3_ADDRESS
531
+ };
532
+ return {
533
+ tx,
534
+ attestationsHash,
535
+ payloadDigest
536
+ };
537
+ }
538
+ getSignatureContext() {
539
+ return {
540
+ chainId: 1,
541
+ rollupAddress: this.config.rollupAddress
542
+ };
543
+ }
544
+ /** Extracts the CommitteeAttestations struct definition from RollupAbi for hash computation. */ getCommitteeAttestationsStructDef() {
545
+ const proposeFunction = RollupAbi.find((item)=>item.type === 'function' && item.name === 'propose');
546
+ if (!proposeFunction) {
547
+ throw new Error('propose function not found in RollupAbi');
548
+ }
549
+ const attestationsParam = proposeFunction.inputs.find((param)=>param.name === '_attestations');
550
+ if (!attestationsParam) {
551
+ throw new Error('_attestations parameter not found in propose function');
552
+ }
553
+ const tupleParam = attestationsParam;
554
+ return {
555
+ type: 'tuple',
556
+ components: tupleParam.components || []
557
+ };
558
+ }
559
+ async makeVersionedBlobHashes(checkpoint) {
560
+ return (await getBlobsPerL1Block(checkpoint.toBlobFields())).map((b)=>`0x${b.getEthVersionedBlobHash().toString('hex')}`);
561
+ }
562
+ async makeBlobsFromCheckpoint(checkpoint) {
563
+ return await getBlobsPerL1Block(checkpoint.toBlobFields());
564
+ }
565
+ }
@@ -0,0 +1,5 @@
1
+ export * from './mock_structs.js';
2
+ export * from './mock_l2_block_source.js';
3
+ export * from './mock_l1_to_l2_message_source.js';
4
+ export * from './mock_archiver.js';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLG1DQUFtQyxDQUFDO0FBQ2xELGNBQWMsb0JBQW9CLENBQUMifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mCAAmC,CAAC;AAClD,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from './mock_structs.js';
2
+ export * from './mock_l2_block_source.js';
3
+ export * from './mock_l1_to_l2_message_source.js';
4
+ export * from './mock_archiver.js'; // NOTE: noop_l1_archiver.js is intentionally NOT exported here because it imports
5
+ // jest-mock-extended, which depends on @jest/globals and can only run inside Jest.
6
+ // Import it directly: import { NoopL1Archiver } from '@aztec-labs/archiver/test/noop-l1';
@@ -0,0 +1,35 @@
1
+ import { Fr } from '@aztec-labs/foundation/curves/bn254';
2
+ import type { L2BlockSource } from '@aztec-labs/stdlib/block';
3
+ import type { Checkpoint } from '@aztec-labs/stdlib/checkpoint';
4
+ import type { InboxBucket, L1ToL2MessageSource } from '@aztec-labs/stdlib/messaging';
5
+ import { MockL2BlockSource } from './mock_l2_block_source.js';
6
+ /**
7
+ * A mocked implementation of the archiver that implements L2BlockSource and L1ToL2MessageSource.
8
+ */
9
+ export declare class MockArchiver extends MockL2BlockSource implements L2BlockSource, L1ToL2MessageSource {
10
+ private messageSource;
11
+ setInboxBucket(bucket: InboxBucket, msgs?: Fr[]): void;
12
+ getL1ToL2MessageIndex(_l1ToL2Message: Fr): Promise<bigint | undefined>;
13
+ getLatestInboxBucketAtOrBefore(timestamp: bigint): Promise<InboxBucket | undefined>;
14
+ getInboxBucket(seq: bigint): Promise<InboxBucket | undefined>;
15
+ getInboxBucketByTotalMsgCount(totalMsgCount: bigint): Promise<InboxBucket | undefined>;
16
+ getL1ToL2MessagesBetweenBuckets(fromExclusive: bigint, toInclusive: bigint): Promise<Fr[]>;
17
+ getL1ToL2MessagesBetweenLeafCounts(startLeafCount: bigint, endLeafCount: bigint): Promise<Fr[]>;
18
+ }
19
+ /**
20
+ * A mocked implementation of the archiver with a set of precomputed blocks and messages.
21
+ */
22
+ export declare class MockPrefilledArchiver extends MockArchiver {
23
+ private prefilled;
24
+ private prefilledMessages;
25
+ constructor(prefilled: {
26
+ checkpoint: Checkpoint;
27
+ messages: Fr[];
28
+ }[]);
29
+ setPrefilled(prefilled: {
30
+ checkpoint: Checkpoint;
31
+ messages: Fr[];
32
+ }[]): void;
33
+ createBlocks(numBlocks: number): Promise<void>;
34
+ }
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja19hcmNoaXZlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3QvbW9ja19hcmNoaXZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDekQsT0FBTyxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDOUQsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFHckYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFOUQ7O0dBRUc7QUFDSCxxQkFBYSxZQUFhLFNBQVEsaUJBQWtCLFlBQVcsYUFBYSxFQUFFLG1CQUFtQjtJQUMvRixPQUFPLENBQUMsYUFBYSxDQUFrQztJQUVoRCxjQUFjLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxJQUFJLEdBQUUsRUFBRSxFQUFPLFFBRXpEO0lBRUQscUJBQXFCLENBQUMsY0FBYyxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUVyRTtJQUVELDhCQUE4QixDQUFDLFNBQVMsRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsQ0FFbEY7SUFFRCxjQUFjLENBQUMsR0FBRyxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxDQUU1RDtJQUVELDZCQUE2QixDQUFDLGFBQWEsRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsQ0FFckY7SUFFRCwrQkFBK0IsQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBRXpGO0lBRUQsa0NBQWtDLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUU5RjtDQUNGO0FBRUQ7O0dBRUc7QUFDSCxxQkFBYSxxQkFBc0IsU0FBUSxZQUFZO0lBQ3JELE9BQU8sQ0FBQyxTQUFTLENBQW9CO0lBQ3JDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBYztJQUV2QyxZQUFZLFNBQVMsRUFBRTtRQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7UUFBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUE7S0FBRSxFQUFFLEVBR2xFO0lBRU0sWUFBWSxDQUFDLFNBQVMsRUFBRTtRQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7UUFBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUE7S0FBRSxFQUFFLFFBa0QxRTtJQUVlLFlBQVksQ0FBQyxTQUFTLEVBQUUsTUFBTSxpQkFhN0M7Q0FDRiJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock_archiver.d.ts","sourceRoot":"","sources":["../../src/test/mock_archiver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,qCAAqC,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAGrF,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D;;GAEG;AACH,qBAAa,YAAa,SAAQ,iBAAkB,YAAW,aAAa,EAAE,mBAAmB;IAC/F,OAAO,CAAC,aAAa,CAAkC;IAEhD,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,GAAE,EAAE,EAAO,QAEzD;IAED,qBAAqB,CAAC,cAAc,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAErE;IAED,8BAA8B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAElF;IAED,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAE5D;IAED,6BAA6B,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAErF;IAED,+BAA+B,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CAEzF;IAED,kCAAkC,CAAC,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CAE9F;CACF;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,YAAY;IACrD,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,iBAAiB,CAAc;IAEvC,YAAY,SAAS,EAAE;QAAE,UAAU,EAAE,UAAU,CAAC;QAAC,QAAQ,EAAE,EAAE,EAAE,CAAA;KAAE,EAAE,EAGlE;IAEM,YAAY,CAAC,SAAS,EAAE;QAAE,UAAU,EAAE,UAAU,CAAC;QAAC,QAAQ,EAAE,EAAE,EAAE,CAAA;KAAE,EAAE,QAkD1E;IAEe,YAAY,CAAC,SAAS,EAAE,MAAM,iBAa7C;CACF"}