@aztec/archiver 0.0.1-commit.7ac86ea28 → 0.0.1-commit.7b86788

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.
@@ -1,37 +1,36 @@
1
1
  import { MULTI_CALL_3_ADDRESS } from '@aztec/ethereum/contracts';
2
2
  import { Fr } from '@aztec/foundation/curves/bn254';
3
3
  import { EthAddress } from '@aztec/foundation/eth-address';
4
- import { EmpireSlashingProposerAbi, GovernanceProposerAbi, RollupAbi, SlashFactoryAbi, TallySlashingProposerAbi } from '@aztec/l1-artifacts';
4
+ import { RollupAbi } from '@aztec/l1-artifacts';
5
5
  import { CommitteeAttestation } from '@aztec/stdlib/block';
6
6
  import { ConsensusPayload, SignatureDomainSeparator } from '@aztec/stdlib/p2p';
7
7
  import { CheckpointHeader } from '@aztec/stdlib/rollup';
8
8
  import { decodeFunctionData, encodeAbiParameters, hexToBytes, keccak256, multicall3Abi, toFunctionSelector } from 'viem';
9
9
  import { getSuccessfulCallsFromDebug } from './debug_tx.js';
10
- import { getCallFromSpireProposer } from './spire_proposer.js';
10
+ import { getCallsFromSpireProposer } from './spire_proposer.js';
11
11
  import { getSuccessfulCallsFromTrace } from './trace_tx.js';
12
12
  /**
13
13
  * Extracts calldata to the `propose` method of the rollup contract from an L1 transaction
14
- * in order to reconstruct an L2 block header.
14
+ * in order to reconstruct an L2 block header. Uses hash matching against expected hashes
15
+ * from the CheckpointProposed event to verify the correct propose calldata.
15
16
  */ export class CalldataRetriever {
16
17
  publicClient;
17
18
  debugClient;
18
19
  targetCommitteeSize;
19
20
  instrumentation;
20
21
  logger;
22
+ rollupAddress;
21
23
  /** Tx hashes we've already logged for trace+debug failure (log once per tx per process). */ static traceFailureWarnedTxHashes = new Set();
22
24
  /** Clears the trace-failure warned set. For testing only. */ static resetTraceFailureWarnedForTesting() {
23
25
  CalldataRetriever.traceFailureWarnedTxHashes.clear();
24
26
  }
25
- /** Pre-computed valid contract calls for validation */ validContractCalls;
26
- rollupAddress;
27
- constructor(publicClient, debugClient, targetCommitteeSize, instrumentation, logger, contractAddresses){
27
+ constructor(publicClient, debugClient, targetCommitteeSize, instrumentation, logger, rollupAddress){
28
28
  this.publicClient = publicClient;
29
29
  this.debugClient = debugClient;
30
30
  this.targetCommitteeSize = targetCommitteeSize;
31
31
  this.instrumentation = instrumentation;
32
32
  this.logger = logger;
33
- this.rollupAddress = contractAddresses.rollupAddress;
34
- this.validContractCalls = computeValidContractCalls(contractAddresses);
33
+ this.rollupAddress = rollupAddress;
35
34
  }
36
35
  /**
37
36
  * Gets checkpoint header and metadata from the calldata of an L1 transaction.
@@ -39,84 +38,94 @@ import { getSuccessfulCallsFromTrace } from './trace_tx.js';
39
38
  * @param txHash - Hash of the tx that published it.
40
39
  * @param blobHashes - Blob hashes for the checkpoint.
41
40
  * @param checkpointNumber - Checkpoint number.
42
- * @param expectedHashes - Optional expected hashes from the CheckpointProposed event for validation
41
+ * @param expectedHashes - Expected hashes from the CheckpointProposed event for validation
43
42
  * @returns Checkpoint header and metadata from the calldata, deserialized
44
43
  */ async getCheckpointFromRollupTx(txHash, _blobHashes, checkpointNumber, expectedHashes) {
45
- this.logger.trace(`Fetching checkpoint ${checkpointNumber} from rollup tx ${txHash}`, {
46
- willValidateHashes: !!expectedHashes.attestationsHash || !!expectedHashes.payloadDigest,
47
- hasAttestationsHash: !!expectedHashes.attestationsHash,
48
- hasPayloadDigest: !!expectedHashes.payloadDigest
49
- });
44
+ this.logger.trace(`Fetching checkpoint ${checkpointNumber} from rollup tx ${txHash}`);
50
45
  const tx = await this.publicClient.getTransaction({
51
46
  hash: txHash
52
47
  });
53
- const proposeCalldata = await this.getProposeCallData(tx, checkpointNumber);
54
- return this.decodeAndBuildCheckpoint(proposeCalldata, tx.blockHash, checkpointNumber, expectedHashes);
48
+ return this.getCheckpointFromTx(tx, checkpointNumber, expectedHashes);
55
49
  }
56
- /** Gets rollup propose calldata from a transaction */ async getProposeCallData(tx, checkpointNumber) {
57
- // Try to decode as multicall3 with validation
58
- const proposeCalldata = this.tryDecodeMulticall3(tx);
59
- if (proposeCalldata) {
50
+ /** Gets checkpoint data from a transaction by trying decode strategies then falling back to trace. */ async getCheckpointFromTx(tx, checkpointNumber, expectedHashes) {
51
+ // Try to decode as multicall3 with hash-verified matching
52
+ const multicall3Result = this.tryDecodeMulticall3(tx, expectedHashes, checkpointNumber, tx.blockHash);
53
+ if (multicall3Result) {
60
54
  this.logger.trace(`Decoded propose calldata from multicall3 for tx ${tx.hash}`);
61
55
  this.instrumentation?.recordBlockProposalTxTarget(tx.to, false);
62
- return proposeCalldata;
56
+ return multicall3Result;
63
57
  }
64
58
  // Try to decode as direct propose call
65
- const directProposeCalldata = this.tryDecodeDirectPropose(tx);
66
- if (directProposeCalldata) {
59
+ const directResult = this.tryDecodeDirectPropose(tx, expectedHashes, checkpointNumber, tx.blockHash);
60
+ if (directResult) {
67
61
  this.logger.trace(`Decoded propose calldata from direct call for tx ${tx.hash}`);
68
62
  this.instrumentation?.recordBlockProposalTxTarget(tx.to, false);
69
- return directProposeCalldata;
63
+ return directResult;
70
64
  }
71
65
  // Try to decode as Spire Proposer multicall wrapper
72
- const spireProposeCalldata = await this.tryDecodeSpireProposer(tx);
73
- if (spireProposeCalldata) {
66
+ const spireResult = await this.tryDecodeSpireProposer(tx, expectedHashes, checkpointNumber, tx.blockHash);
67
+ if (spireResult) {
74
68
  this.logger.trace(`Decoded propose calldata from Spire Proposer for tx ${tx.hash}`);
75
69
  this.instrumentation?.recordBlockProposalTxTarget(tx.to, false);
76
- return spireProposeCalldata;
70
+ return spireResult;
77
71
  }
78
72
  // Fall back to trace-based extraction
79
73
  this.logger.warn(`Failed to decode multicall3, direct propose, or Spire proposer for L1 tx ${tx.hash}, falling back to trace for checkpoint ${checkpointNumber}`);
80
74
  this.instrumentation?.recordBlockProposalTxTarget(tx.to ?? EthAddress.ZERO.toString(), true);
81
- return await this.extractCalldataViaTrace(tx.hash);
75
+ const tracedCalldata = await this.extractCalldataViaTrace(tx.hash);
76
+ const tracedResult = this.tryDecodeAndVerifyPropose(tracedCalldata, expectedHashes, checkpointNumber, tx.blockHash);
77
+ if (!tracedResult) {
78
+ throw new Error(`Hash mismatch for traced propose calldata in tx ${tx.hash} for checkpoint ${checkpointNumber}`);
79
+ }
80
+ return tracedResult;
82
81
  }
83
82
  /**
84
83
  * Attempts to decode a transaction as a Spire Proposer multicall wrapper.
85
- * If successful, extracts the wrapped call and validates it as either multicall3 or direct propose.
84
+ * If successful, iterates all wrapped calls and validates each as either multicall3
85
+ * or direct propose, verifying against expected hashes.
86
86
  * @param tx - The transaction to decode
87
- * @returns The propose calldata if successfully decoded and validated, undefined otherwise
88
- */ async tryDecodeSpireProposer(tx) {
89
- // Try to decode as Spire Proposer multicall (extracts the wrapped call)
90
- const spireWrappedCall = await getCallFromSpireProposer(tx, this.publicClient, this.logger);
91
- if (!spireWrappedCall) {
87
+ * @param expectedHashes - Expected hashes for hash-verified matching
88
+ * @param checkpointNumber - The checkpoint number
89
+ * @param blockHash - The L1 block hash
90
+ * @returns The checkpoint data if successfully decoded and validated, undefined otherwise
91
+ */ async tryDecodeSpireProposer(tx, expectedHashes, checkpointNumber, blockHash) {
92
+ // Try to decode as Spire Proposer multicall (extracts all wrapped calls)
93
+ const spireWrappedCalls = await getCallsFromSpireProposer(tx, this.publicClient, this.logger);
94
+ if (!spireWrappedCalls) {
92
95
  return undefined;
93
96
  }
94
- this.logger.trace(`Decoded Spire Proposer wrapping for tx ${tx.hash}, inner call to ${spireWrappedCall.to}`);
95
- // Now try to decode the wrapped call as either multicall3 or direct propose
96
- const wrappedTx = {
97
- to: spireWrappedCall.to,
98
- input: spireWrappedCall.data,
99
- hash: tx.hash
100
- };
101
- const multicall3Calldata = this.tryDecodeMulticall3(wrappedTx);
102
- if (multicall3Calldata) {
103
- this.logger.trace(`Decoded propose calldata from Spire Proposer to multicall3 for tx ${tx.hash}`);
104
- return multicall3Calldata;
105
- }
106
- const directProposeCalldata = this.tryDecodeDirectPropose(wrappedTx);
107
- if (directProposeCalldata) {
108
- this.logger.trace(`Decoded propose calldata from Spire Proposer to direct propose for tx ${tx.hash}`);
109
- return directProposeCalldata;
97
+ this.logger.trace(`Decoded Spire Proposer wrapping for tx ${tx.hash}, ${spireWrappedCalls.length} inner call(s)`);
98
+ // Try each wrapped call as either multicall3 or direct propose
99
+ for (const spireWrappedCall of spireWrappedCalls){
100
+ const wrappedTx = {
101
+ to: spireWrappedCall.to,
102
+ input: spireWrappedCall.data,
103
+ hash: tx.hash
104
+ };
105
+ const multicall3Result = this.tryDecodeMulticall3(wrappedTx, expectedHashes, checkpointNumber, blockHash);
106
+ if (multicall3Result) {
107
+ this.logger.trace(`Decoded propose calldata from Spire Proposer to multicall3 for tx ${tx.hash}`);
108
+ return multicall3Result;
109
+ }
110
+ const directResult = this.tryDecodeDirectPropose(wrappedTx, expectedHashes, checkpointNumber, blockHash);
111
+ if (directResult) {
112
+ this.logger.trace(`Decoded propose calldata from Spire Proposer to direct propose for tx ${tx.hash}`);
113
+ return directResult;
114
+ }
110
115
  }
111
- this.logger.warn(`Spire Proposer wrapped call could not be decoded as multicall3 or direct propose for tx ${tx.hash}`);
116
+ this.logger.warn(`Spire Proposer wrapped calls could not be decoded as multicall3 or direct propose for tx ${tx.hash}`);
112
117
  return undefined;
113
118
  }
114
119
  /**
115
120
  * Attempts to decode transaction input as multicall3 and extract propose calldata.
116
- * Returns undefined if validation fails.
121
+ * Finds all calls matching the rollup address and propose selector, then decodes
122
+ * and verifies each candidate against expected hashes from the CheckpointProposed event.
117
123
  * @param tx - The transaction-like object with to, input, and hash
118
- * @returns The propose calldata if successfully validated, undefined otherwise
119
- */ tryDecodeMulticall3(tx) {
124
+ * @param expectedHashes - Expected hashes from CheckpointProposed event
125
+ * @param checkpointNumber - The checkpoint number
126
+ * @param blockHash - The L1 block hash
127
+ * @returns The checkpoint data if successfully validated, undefined otherwise
128
+ */ tryDecodeMulticall3(tx, expectedHashes, checkpointNumber, blockHash) {
120
129
  const txHash = tx.hash;
121
130
  try {
122
131
  // Check if transaction is to Multicall3 address
@@ -146,59 +155,51 @@ import { getSuccessfulCallsFromTrace } from './trace_tx.js';
146
155
  return undefined;
147
156
  }
148
157
  const [calls] = multicall3Args;
149
- // Validate all calls and find propose calls
158
+ // Find all calls matching rollup address + propose selector
150
159
  const rollupAddressLower = this.rollupAddress.toString().toLowerCase();
151
- const proposeCalls = [];
152
- for(let i = 0; i < calls.length; i++){
153
- const addr = calls[i].target.toLowerCase();
154
- const callData = calls[i].callData;
155
- // Extract function selector (first 4 bytes)
160
+ const proposeSelectorLower = PROPOSE_SELECTOR.toLowerCase();
161
+ const candidates = [];
162
+ for (const call of calls){
163
+ const addr = call.target.toLowerCase();
164
+ const callData = call.callData;
156
165
  if (callData.length < 10) {
157
- // "0x" + 8 hex chars = 10 chars minimum for a valid function call
158
- this.logger.warn(`Invalid calldata length at index ${i} (${callData.length})`, {
159
- txHash
160
- });
161
- return undefined;
166
+ continue;
162
167
  }
163
- const functionSelector = callData.slice(0, 10);
164
- // Validate this call is allowed by searching through valid calls
165
- const validCall = this.validContractCalls.find((vc)=>vc.address === addr && vc.functionSelector === functionSelector);
166
- if (!validCall) {
167
- this.logger.warn(`Invalid contract call detected in multicall3`, {
168
- index: i,
169
- targetAddress: addr,
170
- functionSelector,
171
- validCalls: this.validContractCalls.map((c)=>({
172
- address: c.address,
173
- selector: c.functionSelector
174
- })),
175
- txHash
176
- });
177
- return undefined;
168
+ const selector = callData.slice(0, 10).toLowerCase();
169
+ if (addr === rollupAddressLower && selector === proposeSelectorLower) {
170
+ candidates.push(callData);
178
171
  }
179
- this.logger.trace(`Valid call found to ${addr}`, {
180
- validCall
172
+ }
173
+ if (candidates.length === 0) {
174
+ this.logger.debug(`No propose candidates found in multicall3`, {
175
+ txHash
181
176
  });
182
- // Collect propose calls specifically
183
- if (addr === rollupAddressLower && validCall.functionName === 'propose') {
184
- proposeCalls.push(callData);
177
+ return undefined;
178
+ }
179
+ // Decode, verify, and build for each candidate
180
+ const verified = [];
181
+ for (const candidate of candidates){
182
+ const result = this.tryDecodeAndVerifyPropose(candidate, expectedHashes, checkpointNumber, blockHash);
183
+ if (result) {
184
+ verified.push(result);
185
185
  }
186
186
  }
187
- // Validate exactly ONE propose call
188
- if (proposeCalls.length === 0) {
189
- this.logger.warn(`No propose calls found in multicall3`, {
187
+ if (verified.length === 1) {
188
+ this.logger.trace(`Verified single propose candidate via hash matching`, {
190
189
  txHash
191
190
  });
192
- return undefined;
191
+ return verified[0];
193
192
  }
194
- if (proposeCalls.length > 1) {
195
- this.logger.warn(`Multiple propose calls found in multicall3 (${proposeCalls.length})`, {
193
+ if (verified.length > 1) {
194
+ this.logger.warn(`Multiple propose candidates verified (${verified.length}), returning first (identical data)`, {
196
195
  txHash
197
196
  });
198
- return undefined;
197
+ return verified[0];
199
198
  }
200
- // Successfully extracted single propose call
201
- return proposeCalls[0];
199
+ this.logger.debug(`No candidates verified against expected hashes`, {
200
+ txHash
201
+ });
202
+ return undefined;
202
203
  } catch (err) {
203
204
  // Any decoding error triggers fallback to trace
204
205
  this.logger.warn(`Failed to decode multicall3: ${err}`, {
@@ -209,10 +210,13 @@ import { getSuccessfulCallsFromTrace } from './trace_tx.js';
209
210
  }
210
211
  /**
211
212
  * Attempts to decode transaction as a direct propose call to the rollup contract.
212
- * Returns undefined if validation fails.
213
+ * Decodes, verifies hashes, and builds checkpoint data in a single pass.
213
214
  * @param tx - The transaction-like object with to, input, and hash
214
- * @returns The propose calldata if successfully validated, undefined otherwise
215
- */ tryDecodeDirectPropose(tx) {
215
+ * @param expectedHashes - Expected hashes from CheckpointProposed event
216
+ * @param checkpointNumber - The checkpoint number
217
+ * @param blockHash - The L1 block hash
218
+ * @returns The checkpoint data if successfully validated, undefined otherwise
219
+ */ tryDecodeDirectPropose(tx, expectedHashes, checkpointNumber, blockHash) {
216
220
  const txHash = tx.hash;
217
221
  try {
218
222
  // Check if transaction is to the rollup address
@@ -222,23 +226,22 @@ import { getSuccessfulCallsFromTrace } from './trace_tx.js';
222
226
  });
223
227
  return undefined;
224
228
  }
225
- // Try to decode as propose call
229
+ // Validate it's a propose call before full decode+verify
226
230
  const { functionName } = decodeFunctionData({
227
231
  abi: RollupAbi,
228
232
  data: tx.input
229
233
  });
230
- // If not propose, return undefined
231
234
  if (functionName !== 'propose') {
232
235
  this.logger.warn(`Transaction to rollup is not propose (got ${functionName})`, {
233
236
  txHash
234
237
  });
235
238
  return undefined;
236
239
  }
237
- // Successfully validated direct propose call
240
+ // Decode, verify hashes, and build checkpoint data
238
241
  this.logger.trace(`Validated direct propose call to rollup`, {
239
242
  txHash
240
243
  });
241
- return tx.input;
244
+ return this.tryDecodeAndVerifyPropose(tx.input, expectedHashes, checkpointNumber, blockHash);
242
245
  } catch (err) {
243
246
  // Any decoding error means it's not a valid propose call
244
247
  this.logger.warn(`Failed to decode as direct propose: ${err}`, {
@@ -300,9 +303,81 @@ import { getSuccessfulCallsFromTrace } from './trace_tx.js';
300
303
  return calls[0].input;
301
304
  }
302
305
  /**
306
+ * Decodes propose calldata, verifies against expected hashes, and builds checkpoint data.
307
+ * Returns undefined on decode errors or hash mismatches (soft failure for try-based callers).
308
+ * @param proposeCalldata - The propose function calldata
309
+ * @param expectedHashes - Expected hashes from the CheckpointProposed event
310
+ * @param checkpointNumber - The checkpoint number
311
+ * @param blockHash - The L1 block hash
312
+ * @returns The decoded checkpoint data, or undefined on failure
313
+ */ tryDecodeAndVerifyPropose(proposeCalldata, expectedHashes, checkpointNumber, blockHash) {
314
+ try {
315
+ const { functionName, args } = decodeFunctionData({
316
+ abi: RollupAbi,
317
+ data: proposeCalldata
318
+ });
319
+ if (functionName !== 'propose') {
320
+ return undefined;
321
+ }
322
+ const [decodedArgs, packedAttestations] = args;
323
+ // Verify attestationsHash
324
+ const computedAttestationsHash = this.computeAttestationsHash(packedAttestations);
325
+ if (!Buffer.from(hexToBytes(computedAttestationsHash)).equals(Buffer.from(hexToBytes(expectedHashes.attestationsHash)))) {
326
+ this.logger.warn(`Attestations hash mismatch during verification`, {
327
+ computed: computedAttestationsHash,
328
+ expected: expectedHashes.attestationsHash
329
+ });
330
+ return undefined;
331
+ }
332
+ // Verify payloadDigest
333
+ const header = CheckpointHeader.fromViem(decodedArgs.header);
334
+ const archiveRoot = new Fr(Buffer.from(hexToBytes(decodedArgs.archive)));
335
+ const feeAssetPriceModifier = decodedArgs.oracleInput.feeAssetPriceModifier;
336
+ const computedPayloadDigest = this.computePayloadDigest(header, archiveRoot, feeAssetPriceModifier);
337
+ if (!Buffer.from(hexToBytes(computedPayloadDigest)).equals(Buffer.from(hexToBytes(expectedHashes.payloadDigest)))) {
338
+ this.logger.warn(`Payload digest mismatch during verification`, {
339
+ computed: computedPayloadDigest,
340
+ expected: expectedHashes.payloadDigest
341
+ });
342
+ return undefined;
343
+ }
344
+ const attestations = CommitteeAttestation.fromPacked(packedAttestations, this.targetCommitteeSize);
345
+ this.logger.trace(`Validated and decoded propose calldata for checkpoint ${checkpointNumber}`, {
346
+ checkpointNumber,
347
+ archive: decodedArgs.archive,
348
+ header: decodedArgs.header,
349
+ l1BlockHash: blockHash,
350
+ attestations,
351
+ packedAttestations,
352
+ targetCommitteeSize: this.targetCommitteeSize
353
+ });
354
+ return {
355
+ checkpointNumber,
356
+ archiveRoot,
357
+ header,
358
+ attestations,
359
+ blockHash,
360
+ feeAssetPriceModifier
361
+ };
362
+ } catch {
363
+ return undefined;
364
+ }
365
+ }
366
+ /** Computes the keccak256 hash of ABI-encoded CommitteeAttestations. */ computeAttestationsHash(packedAttestations) {
367
+ return keccak256(encodeAbiParameters([
368
+ this.getCommitteeAttestationsStructDef()
369
+ ], [
370
+ packedAttestations
371
+ ]));
372
+ }
373
+ /** Computes the keccak256 payload digest from the checkpoint header, archive root, and fee asset price modifier. */ computePayloadDigest(header, archiveRoot, feeAssetPriceModifier) {
374
+ const consensusPayload = new ConsensusPayload(header, archiveRoot, feeAssetPriceModifier);
375
+ const payloadToSign = consensusPayload.getPayloadToSign(SignatureDomainSeparator.checkpointAttestation);
376
+ return keccak256(payloadToSign);
377
+ }
378
+ /**
303
379
  * Extracts the CommitteeAttestations struct definition from RollupAbi.
304
380
  * Finds the _attestations parameter by name in the propose function.
305
- * Lazy-loaded to avoid issues during module initialization.
306
381
  */ getCommitteeAttestationsStructDef() {
307
382
  const proposeFunction = RollupAbi.find((item)=>item.type === 'function' && item.name === 'propose');
308
383
  if (!proposeFunction) {
@@ -323,162 +398,5 @@ import { getSuccessfulCallsFromTrace } from './trace_tx.js';
323
398
  components: tupleParam.components || []
324
399
  };
325
400
  }
326
- /**
327
- * Decodes propose calldata and builds the checkpoint header structure.
328
- * @param proposeCalldata - The propose function calldata
329
- * @param blockHash - The L1 block hash containing this transaction
330
- * @param checkpointNumber - The checkpoint number
331
- * @param expectedHashes - Optional expected hashes from the CheckpointProposed event for validation
332
- * @returns The decoded checkpoint header and metadata
333
- */ decodeAndBuildCheckpoint(proposeCalldata, blockHash, checkpointNumber, expectedHashes) {
334
- const { functionName: rollupFunctionName, args: rollupArgs } = decodeFunctionData({
335
- abi: RollupAbi,
336
- data: proposeCalldata
337
- });
338
- if (rollupFunctionName !== 'propose') {
339
- throw new Error(`Unexpected rollup method called ${rollupFunctionName}`);
340
- }
341
- const [decodedArgs, packedAttestations, _signers, _attestationsAndSignersSignature, _blobInput] = rollupArgs;
342
- const attestations = CommitteeAttestation.fromPacked(packedAttestations, this.targetCommitteeSize);
343
- const header = CheckpointHeader.fromViem(decodedArgs.header);
344
- const archiveRoot = new Fr(Buffer.from(hexToBytes(decodedArgs.archive)));
345
- // Validate attestationsHash if provided (skip for backwards compatibility with older events)
346
- if (expectedHashes.attestationsHash) {
347
- // Compute attestationsHash: keccak256(abi.encode(CommitteeAttestations))
348
- const computedAttestationsHash = keccak256(encodeAbiParameters([
349
- this.getCommitteeAttestationsStructDef()
350
- ], [
351
- packedAttestations
352
- ]));
353
- // Compare as buffers to avoid case-sensitivity and string comparison issues
354
- const computedBuffer = Buffer.from(hexToBytes(computedAttestationsHash));
355
- const expectedBuffer = Buffer.from(hexToBytes(expectedHashes.attestationsHash));
356
- if (!computedBuffer.equals(expectedBuffer)) {
357
- throw new Error(`Attestations hash mismatch for checkpoint ${checkpointNumber}: ` + `computed=${computedAttestationsHash}, expected=${expectedHashes.attestationsHash}`);
358
- }
359
- this.logger.trace(`Validated attestationsHash for checkpoint ${checkpointNumber}`, {
360
- computedAttestationsHash,
361
- expectedAttestationsHash: expectedHashes.attestationsHash
362
- });
363
- }
364
- // Validate payloadDigest if provided (skip for backwards compatibility with older events)
365
- if (expectedHashes.payloadDigest) {
366
- // Use ConsensusPayload to compute the digest - this ensures we match the exact logic
367
- // used by the network for signing and verification
368
- const feeAssetPriceModifier = decodedArgs.oracleInput.feeAssetPriceModifier;
369
- const consensusPayload = new ConsensusPayload(header, archiveRoot, feeAssetPriceModifier);
370
- const payloadToSign = consensusPayload.getPayloadToSign(SignatureDomainSeparator.checkpointAttestation);
371
- const computedPayloadDigest = keccak256(payloadToSign);
372
- // Compare as buffers to avoid case-sensitivity and string comparison issues
373
- const computedBuffer = Buffer.from(hexToBytes(computedPayloadDigest));
374
- const expectedBuffer = Buffer.from(hexToBytes(expectedHashes.payloadDigest));
375
- if (!computedBuffer.equals(expectedBuffer)) {
376
- throw new Error(`Payload digest mismatch for checkpoint ${checkpointNumber}: ` + `computed=${computedPayloadDigest}, expected=${expectedHashes.payloadDigest}`);
377
- }
378
- this.logger.trace(`Validated payloadDigest for checkpoint ${checkpointNumber}`, {
379
- computedPayloadDigest,
380
- expectedPayloadDigest: expectedHashes.payloadDigest
381
- });
382
- }
383
- this.logger.trace(`Decoded propose calldata`, {
384
- checkpointNumber,
385
- archive: decodedArgs.archive,
386
- header: decodedArgs.header,
387
- l1BlockHash: blockHash,
388
- attestations,
389
- packedAttestations,
390
- targetCommitteeSize: this.targetCommitteeSize
391
- });
392
- return {
393
- checkpointNumber,
394
- archiveRoot,
395
- header,
396
- attestations,
397
- blockHash,
398
- feeAssetPriceModifier: decodedArgs.oracleInput.feeAssetPriceModifier
399
- };
400
- }
401
- }
402
- /**
403
- * Pre-computed function selectors for all valid contract calls.
404
- * These are computed once at module load time from the ABIs.
405
- * Based on analysis of sequencer-client/src/publisher/sequencer-publisher.ts
406
- */ // Rollup contract function selectors (always valid)
407
- const PROPOSE_SELECTOR = toFunctionSelector(RollupAbi.find((x)=>x.type === 'function' && x.name === 'propose'));
408
- const INVALIDATE_BAD_ATTESTATION_SELECTOR = toFunctionSelector(RollupAbi.find((x)=>x.type === 'function' && x.name === 'invalidateBadAttestation'));
409
- const INVALIDATE_INSUFFICIENT_ATTESTATIONS_SELECTOR = toFunctionSelector(RollupAbi.find((x)=>x.type === 'function' && x.name === 'invalidateInsufficientAttestations'));
410
- // Governance proposer function selectors
411
- const GOVERNANCE_SIGNAL_WITH_SIG_SELECTOR = toFunctionSelector(GovernanceProposerAbi.find((x)=>x.type === 'function' && x.name === 'signalWithSig'));
412
- // Slash factory function selectors
413
- const CREATE_SLASH_PAYLOAD_SELECTOR = toFunctionSelector(SlashFactoryAbi.find((x)=>x.type === 'function' && x.name === 'createSlashPayload'));
414
- // Empire slashing proposer function selectors
415
- const EMPIRE_SIGNAL_WITH_SIG_SELECTOR = toFunctionSelector(EmpireSlashingProposerAbi.find((x)=>x.type === 'function' && x.name === 'signalWithSig'));
416
- const EMPIRE_SUBMIT_ROUND_WINNER_SELECTOR = toFunctionSelector(EmpireSlashingProposerAbi.find((x)=>x.type === 'function' && x.name === 'submitRoundWinner'));
417
- // Tally slashing proposer function selectors
418
- const TALLY_VOTE_SELECTOR = toFunctionSelector(TallySlashingProposerAbi.find((x)=>x.type === 'function' && x.name === 'vote'));
419
- const TALLY_EXECUTE_ROUND_SELECTOR = toFunctionSelector(TallySlashingProposerAbi.find((x)=>x.type === 'function' && x.name === 'executeRound'));
420
- /**
421
- * All valid contract calls that the sequencer publisher can make.
422
- * Builds the list of valid (address, selector) pairs for validation.
423
- *
424
- * Alternatively, if we are absolutely sure that no code path from any of these
425
- * contracts can eventually land on another call to `propose`, we can remove the
426
- * function selectors.
427
- */ function computeValidContractCalls(addresses) {
428
- const { rollupAddress, governanceProposerAddress, slashFactoryAddress, slashingProposerAddress } = addresses;
429
- const calls = [];
430
- // Rollup contract calls (always present)
431
- calls.push({
432
- address: rollupAddress.toString().toLowerCase(),
433
- functionSelector: PROPOSE_SELECTOR,
434
- functionName: 'propose'
435
- }, {
436
- address: rollupAddress.toString().toLowerCase(),
437
- functionSelector: INVALIDATE_BAD_ATTESTATION_SELECTOR,
438
- functionName: 'invalidateBadAttestation'
439
- }, {
440
- address: rollupAddress.toString().toLowerCase(),
441
- functionSelector: INVALIDATE_INSUFFICIENT_ATTESTATIONS_SELECTOR,
442
- functionName: 'invalidateInsufficientAttestations'
443
- });
444
- // Governance proposer calls (optional)
445
- if (governanceProposerAddress && !governanceProposerAddress.isZero()) {
446
- calls.push({
447
- address: governanceProposerAddress.toString().toLowerCase(),
448
- functionSelector: GOVERNANCE_SIGNAL_WITH_SIG_SELECTOR,
449
- functionName: 'signalWithSig'
450
- });
451
- }
452
- // Slash factory calls (optional)
453
- if (slashFactoryAddress && !slashFactoryAddress.isZero()) {
454
- calls.push({
455
- address: slashFactoryAddress.toString().toLowerCase(),
456
- functionSelector: CREATE_SLASH_PAYLOAD_SELECTOR,
457
- functionName: 'createSlashPayload'
458
- });
459
- }
460
- // Slashing proposer calls (optional, can be either Empire or Tally)
461
- if (slashingProposerAddress && !slashingProposerAddress.isZero()) {
462
- // Empire calls
463
- calls.push({
464
- address: slashingProposerAddress.toString().toLowerCase(),
465
- functionSelector: EMPIRE_SIGNAL_WITH_SIG_SELECTOR,
466
- functionName: 'signalWithSig (empire)'
467
- }, {
468
- address: slashingProposerAddress.toString().toLowerCase(),
469
- functionSelector: EMPIRE_SUBMIT_ROUND_WINNER_SELECTOR,
470
- functionName: 'submitRoundWinner'
471
- });
472
- // Tally calls
473
- calls.push({
474
- address: slashingProposerAddress.toString().toLowerCase(),
475
- functionSelector: TALLY_VOTE_SELECTOR,
476
- functionName: 'vote'
477
- }, {
478
- address: slashingProposerAddress.toString().toLowerCase(),
479
- functionSelector: TALLY_EXECUTE_ROUND_SELECTOR,
480
- functionName: 'executeRound'
481
- });
482
- }
483
- return calls;
484
401
  }
402
+ /** Function selector for the `propose` method of the rollup contract. */ const PROPOSE_SELECTOR = toFunctionSelector(RollupAbi.find((x)=>x.type === 'function' && x.name === 'propose'));
@@ -40,13 +40,12 @@ export declare function retrievedToPublishedCheckpoint({ checkpointNumber, archi
40
40
  * @param isHistoricalSync - Whether this is a historical sync.
41
41
  * @returns An array of retrieved checkpoints.
42
42
  */
43
- export declare function retrieveCheckpointsFromRollup(rollup: RollupContract, publicClient: ViemPublicClient, debugClient: ViemPublicDebugClient, blobClient: BlobClientInterface, searchStartBlock: bigint, searchEndBlock: bigint, contractAddresses: {
44
- governanceProposerAddress: EthAddress;
45
- slashFactoryAddress?: EthAddress;
46
- slashingProposerAddress: EthAddress;
47
- }, instrumentation: ArchiverInstrumentation, logger?: Logger, isHistoricalSync?: boolean): Promise<RetrievedCheckpoint[]>;
48
- export declare function getL1BlockTime(publicClient: ViemPublicClient, blockNumber: bigint): Promise<bigint>;
49
- export declare function getCheckpointBlobDataFromBlobs(blobClient: BlobClientInterface, blockHash: string, blobHashes: Buffer<ArrayBufferLike>[], checkpointNumber: CheckpointNumber, logger: Logger, isHistoricalSync: boolean): Promise<CheckpointBlobData>;
43
+ export declare function retrieveCheckpointsFromRollup(rollup: RollupContract, publicClient: ViemPublicClient, debugClient: ViemPublicDebugClient, blobClient: BlobClientInterface, searchStartBlock: bigint, searchEndBlock: bigint, instrumentation: ArchiverInstrumentation, logger?: Logger, isHistoricalSync?: boolean): Promise<RetrievedCheckpoint[]>;
44
+ export declare function getL1Block(publicClient: ViemPublicClient, blockNumber: bigint): Promise<{
45
+ timestamp: bigint;
46
+ parentBeaconBlockRoot: string | undefined;
47
+ }>;
48
+ export declare function getCheckpointBlobDataFromBlobs(blobClient: BlobClientInterface, blockHash: string, blobHashes: Buffer<ArrayBufferLike>[], checkpointNumber: CheckpointNumber, logger: Logger, isHistoricalSync: boolean, parentBeaconBlockRoot?: string, l1BlockTimestamp?: bigint): Promise<CheckpointBlobData>;
50
49
  /** Given an L1 to L2 message, retrieves its corresponding event from the Inbox within a specific block range. */
51
50
  export declare function retrieveL1ToL2Message(inbox: InboxContract, leaf: Fr, fromBlock: bigint, toBlock: bigint): Promise<InboxMessage | undefined>;
52
51
  /**
@@ -86,4 +85,4 @@ export type SubmitEpochProof = {
86
85
  * @returns Epoch proof metadata from the calldata, deserialized.
87
86
  */
88
87
  export declare function getProofFromSubmitProofTx(publicClient: ViemPublicClient, txHash: `0x${string}`, expectedProverId: Fr): Promise<SubmitEpochProof>;
89
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YV9yZXRyaWV2YWwuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sMS9kYXRhX3JldHJpZXZhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JFLE9BQU8sRUFFTCxLQUFLLGtCQUFrQixFQUl4QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sS0FBSyxFQUdWLGFBQWEsRUFFYixjQUFjLEVBQ2YsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXJGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBeUIsTUFBTSxpQ0FBaUMsQ0FBQztBQUMxRixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzNELE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUVsRSxPQUFPLEVBQVEsb0JBQW9CLEVBQVcsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRSxPQUFPLEVBQWMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUYsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBSXhELE9BQU8sRUFBRSxLQUFLLEdBQUcsRUFBOEMsTUFBTSxNQUFNLENBQUM7QUFHNUUsT0FBTyxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM3RSxPQUFPLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUdoRSxNQUFNLE1BQU0sbUJBQW1CLEdBQUc7SUFDaEMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUM7SUFDbkMsV0FBVyxFQUFFLEVBQUUsQ0FBQztJQUNoQixxQkFBcUIsRUFBRSxNQUFNLENBQUM7SUFDOUIsTUFBTSxFQUFFLGdCQUFnQixDQUFDO0lBQ3pCLGtCQUFrQixFQUFFLGtCQUFrQixDQUFDO0lBQ3ZDLEVBQUUsRUFBRSxlQUFlLENBQUM7SUFDcEIsT0FBTyxFQUFFLEVBQUUsQ0FBQztJQUNaLE9BQU8sRUFBRSxFQUFFLENBQUM7SUFDWixZQUFZLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQztDQUN0QyxDQUFDO0FBRUYsd0JBQXNCLDhCQUE4QixDQUFDLEVBQ25ELGdCQUFnQixFQUNoQixXQUFXLEVBQ1gscUJBQXFCLEVBQ3JCLE1BQU0sRUFBRSxnQkFBZ0IsRUFDeEIsa0JBQWtCLEVBQ2xCLEVBQUUsRUFDRixPQUFPLEVBQ1AsT0FBTyxFQUNQLFlBQVksRUFDYixFQUFFLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQTZFcEQ7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsd0JBQXNCLDZCQUE2QixDQUNqRCxNQUFNLEVBQUUsY0FBYyxFQUN0QixZQUFZLEVBQUUsZ0JBQWdCLEVBQzlCLFdBQVcsRUFBRSxxQkFBcUIsRUFDbEMsVUFBVSxFQUFFLG1CQUFtQixFQUMvQixnQkFBZ0IsRUFBRSxNQUFNLEVBQ3hCLGNBQWMsRUFBRSxNQUFNLEVBQ3RCLGlCQUFpQixFQUFFO0lBQ2pCLHlCQUF5QixFQUFFLFVBQVUsQ0FBQztJQUN0QyxtQkFBbUIsQ0FBQyxFQUFFLFVBQVUsQ0FBQztJQUNqQyx1QkFBdUIsRUFBRSxVQUFVLENBQUM7Q0FDckMsRUFDRCxlQUFlLEVBQUUsdUJBQXVCLEVBQ3hDLE1BQU0sR0FBRSxNQUFpQyxFQUN6QyxnQkFBZ0IsR0FBRSxPQUFlLEdBQ2hDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBbURoQztBQStGRCx3QkFBc0IsY0FBYyxDQUFDLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FHekc7QUFFRCx3QkFBc0IsOEJBQThCLENBQ2xELFVBQVUsRUFBRSxtQkFBbUIsRUFDL0IsU0FBUyxFQUFFLE1BQU0sRUFDakIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxlQUFlLENBQUMsRUFBRSxFQUNyQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFDbEMsTUFBTSxFQUFFLE1BQU0sRUFDZCxnQkFBZ0IsRUFBRSxPQUFPLEdBQ3hCLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQXFCN0I7QUFFRCxpSEFBaUg7QUFDakgsd0JBQXNCLHFCQUFxQixDQUN6QyxLQUFLLEVBQUUsYUFBYSxFQUNwQixJQUFJLEVBQUUsRUFBRSxFQUNSLFNBQVMsRUFBRSxNQUFNLEVBQ2pCLE9BQU8sRUFBRSxNQUFNLEdBQ2QsT0FBTyxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUMsQ0FLbkM7QUFFRDs7Ozs7O0dBTUc7QUFDSCx3QkFBc0Isc0JBQXNCLENBQzFDLEtBQUssRUFBRSxhQUFhLEVBQ3BCLGdCQUFnQixFQUFFLE1BQU0sRUFDeEIsY0FBYyxFQUFFLE1BQU0sR0FDckIsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDLENBY3pCO0FBYUQsaUVBQWlFO0FBQ2pFLHdCQUFzQiw2QkFBNkIsQ0FDakQsWUFBWSxFQUFFLGdCQUFnQixFQUM5QixhQUFhLEVBQUUsVUFBVSxFQUN6QixnQkFBZ0IsRUFBRSxNQUFNLEVBQ3hCLGNBQWMsQ0FBQyxFQUFFLE1BQU0sR0FDdEIsT0FBTyxDQUFDO0lBQUUsYUFBYSxFQUFFLE1BQU0sQ0FBQztJQUFDLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDO0lBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztJQUFDLE1BQU0sRUFBRSxHQUFHLENBQUE7Q0FBRSxFQUFFLENBQUMsQ0Flckc7QUFFRCx5REFBeUQ7QUFDekQsd0JBQXNCLDBCQUEwQixDQUM5QyxZQUFZLEVBQUUsZ0JBQWdCLEVBQzlCLGFBQWEsRUFBRSxVQUFVLEVBQ3pCLGdCQUFnQixFQUFFLE1BQU0sRUFDeEIsY0FBYyxDQUFDLEVBQUUsTUFBTSxHQUN0QixPQUFPLENBQUMsYUFBYSxDQUFDO0lBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQztJQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7SUFBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUM7SUFBQyxNQUFNLEVBQUUsS0FBSyxNQUFNLEVBQUUsQ0FBQTtDQUFFLENBQUMsQ0FBQyxDQWF6RztBQUVELE1BQU0sTUFBTSxnQkFBZ0IsR0FBRztJQUM3QixXQUFXLEVBQUUsRUFBRSxDQUFDO0lBQ2hCLFFBQVEsRUFBRSxFQUFFLENBQUM7SUFDYixLQUFLLEVBQUUsS0FBSyxDQUFDO0NBQ2QsQ0FBQztBQUVGOzs7Ozs7OztHQVFHO0FBQ0gsd0JBQXNCLHlCQUF5QixDQUM3QyxZQUFZLEVBQUUsZ0JBQWdCLEVBQzlCLE1BQU0sRUFBRSxLQUFLLE1BQU0sRUFBRSxFQUNyQixnQkFBZ0IsRUFBRSxFQUFFLEdBQ25CLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQW1DM0IifQ==
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YV9yZXRyaWV2YWwuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sMS9kYXRhX3JldHJpZXZhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JFLE9BQU8sRUFFTCxLQUFLLGtCQUFrQixFQUl4QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sS0FBSyxFQUdWLGFBQWEsRUFFYixjQUFjLEVBQ2YsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXJGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBeUIsTUFBTSxpQ0FBaUMsQ0FBQztBQUMxRixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzNELE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUVsRSxPQUFPLEVBQVEsb0JBQW9CLEVBQVcsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRSxPQUFPLEVBQWMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUYsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBSXhELE9BQU8sRUFBRSxLQUFLLEdBQUcsRUFBOEMsTUFBTSxNQUFNLENBQUM7QUFHNUUsT0FBTyxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM3RSxPQUFPLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFB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
@@ -1 +1 @@
1
- {"version":3,"file":"data_retrieval.d.ts","sourceRoot":"","sources":["../../src/l1/data_retrieval.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"data_retrieval.d.ts","sourceRoot":"","sources":["../../src/l1/data_retrieval.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAEL,KAAK,kBAAkB,EAIxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAGV,aAAa,EAEb,cAAc,EACf,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAErF,OAAO,EAAE,gBAAgB,EAAyB,MAAM,iCAAiC,CAAC;AAC1F,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAElE,OAAO,EAAQ,oBAAoB,EAAW,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAc,eAAe,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC5F,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAIxD,OAAO,EAAE,KAAK,GAAG,EAA8C,MAAM,MAAM,CAAC;AAG5E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAGhE,MAAM,MAAM,mBAAmB,GAAG;IAChC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,WAAW,EAAE,EAAE,CAAC;IAChB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,MAAM,EAAE,gBAAgB,CAAC;IACzB,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,EAAE,EAAE,eAAe,CAAC;IACpB,OAAO,EAAE,EAAE,CAAC;IACZ,OAAO,EAAE,EAAE,CAAC;IACZ,YAAY,EAAE,oBAAoB,EAAE,CAAC;CACtC,CAAC;AAEF,wBAAsB,8BAA8B,CAAC,EACnD,gBAAgB,EAChB,WAAW,EACX,qBAAqB,EACrB,MAAM,EAAE,gBAAgB,EACxB,kBAAkB,EAClB,EAAE,EACF,OAAO,EACP,OAAO,EACP,YAAY,EACb,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA6EpD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,cAAc,EACtB,YAAY,EAAE,gBAAgB,EAC9B,WAAW,EAAE,qBAAqB,EAClC,UAAU,EAAE,mBAAmB,EAC/B,gBAAgB,EAAE,MAAM,EACxB,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,uBAAuB,EACxC,MAAM,GAAE,MAAiC,EACzC,gBAAgB,GAAE,OAAe,GAChC,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAkDhC;AAuFD,wBAAsB,UAAU,CAC9B,YAAY,EAAE,gBAAgB,EAC9B,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,qBAAqB,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC,CAG3E;AAED,wBAAsB,8BAA8B,CAClD,UAAU,EAAE,mBAAmB,EAC/B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,CAAC,eAAe,CAAC,EAAE,EACrC,gBAAgB,EAAE,gBAAgB,EAClC,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,OAAO,EACzB,qBAAqB,CAAC,EAAE,MAAM,EAC9B,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,kBAAkB,CAAC,CAyB7B;AAED,iHAAiH;AACjH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,aAAa,EACpB,IAAI,EAAE,EAAE,EACR,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAKnC;AAED;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,aAAa,EACpB,gBAAgB,EAAE,MAAM,EACxB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,YAAY,EAAE,CAAC,CAczB;AAaD,iEAAiE;AACjE,wBAAsB,6BAA6B,CACjD,YAAY,EAAE,gBAAgB,EAC9B,aAAa,EAAE,UAAU,EACzB,gBAAgB,EAAE,MAAM,EACxB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAAC,QAAQ,EAAE,EAAE,CAAC;IAAC,MAAM,EAAE,GAAG,CAAA;CAAE,EAAE,CAAC,CAerG;AAED,yDAAyD;AACzD,wBAAsB,0BAA0B,CAC9C,YAAY,EAAE,gBAAgB,EAC9B,aAAa,EAAE,UAAU,EACzB,gBAAgB,EAAE,MAAM,EACxB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,aAAa,CAAC;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,EAAE,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,KAAK,MAAM,EAAE,CAAA;CAAE,CAAC,CAAC,CAazG;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,EAAE,EAAE,CAAC;IAChB,QAAQ,EAAE,EAAE,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;CACd,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAsB,yBAAyB,CAC7C,YAAY,EAAE,gBAAgB,EAC9B,MAAM,EAAE,KAAK,MAAM,EAAE,EACrB,gBAAgB,EAAE,EAAE,GACnB,OAAO,CAAC,gBAAgB,CAAC,CAmC3B"}