@aztec/archiver 0.0.1-commit.9593d84 → 0.0.1-commit.96bb3f7

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 (128) hide show
  1. package/README.md +14 -14
  2. package/dest/archiver/archiver.d.ts +105 -85
  3. package/dest/archiver/archiver.d.ts.map +1 -1
  4. package/dest/archiver/archiver.js +949 -255
  5. package/dest/archiver/archiver_store.d.ts +109 -49
  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 +1871 -390
  10. package/dest/archiver/config.d.ts +5 -4
  11. package/dest/archiver/config.d.ts.map +1 -1
  12. package/dest/archiver/config.js +12 -5
  13. package/dest/archiver/errors.d.ts +25 -1
  14. package/dest/archiver/errors.d.ts.map +1 -1
  15. package/dest/archiver/errors.js +37 -0
  16. package/dest/archiver/index.d.ts +2 -2
  17. package/dest/archiver/index.d.ts.map +1 -1
  18. package/dest/archiver/instrumentation.d.ts +3 -1
  19. package/dest/archiver/instrumentation.d.ts.map +1 -1
  20. package/dest/archiver/instrumentation.js +22 -59
  21. package/dest/archiver/kv_archiver_store/block_store.d.ts +60 -20
  22. package/dest/archiver/kv_archiver_store/block_store.d.ts.map +1 -1
  23. package/dest/archiver/kv_archiver_store/block_store.js +345 -89
  24. package/dest/archiver/kv_archiver_store/contract_class_store.d.ts +2 -2
  25. package/dest/archiver/kv_archiver_store/contract_class_store.d.ts.map +1 -1
  26. package/dest/archiver/kv_archiver_store/contract_class_store.js +1 -1
  27. package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts +2 -2
  28. package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts.map +1 -1
  29. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +49 -58
  30. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +1 -1
  31. package/dest/archiver/kv_archiver_store/kv_archiver_store.js +68 -48
  32. package/dest/archiver/kv_archiver_store/log_store.d.ts +12 -16
  33. package/dest/archiver/kv_archiver_store/log_store.d.ts.map +1 -1
  34. package/dest/archiver/kv_archiver_store/log_store.js +149 -84
  35. package/dest/archiver/kv_archiver_store/message_store.d.ts +6 -5
  36. package/dest/archiver/kv_archiver_store/message_store.d.ts.map +1 -1
  37. package/dest/archiver/kv_archiver_store/message_store.js +15 -14
  38. package/dest/archiver/l1/bin/retrieve-calldata.d.ts +3 -0
  39. package/dest/archiver/l1/bin/retrieve-calldata.d.ts.map +1 -0
  40. package/dest/archiver/l1/bin/retrieve-calldata.js +149 -0
  41. package/dest/archiver/l1/calldata_retriever.d.ts +112 -0
  42. package/dest/archiver/l1/calldata_retriever.d.ts.map +1 -0
  43. package/dest/archiver/l1/calldata_retriever.js +471 -0
  44. package/dest/archiver/l1/data_retrieval.d.ts +90 -0
  45. package/dest/archiver/l1/data_retrieval.d.ts.map +1 -0
  46. package/dest/archiver/{data_retrieval.js → l1/data_retrieval.js} +52 -107
  47. package/dest/archiver/l1/debug_tx.d.ts +19 -0
  48. package/dest/archiver/l1/debug_tx.d.ts.map +1 -0
  49. package/dest/archiver/l1/debug_tx.js +73 -0
  50. package/dest/archiver/l1/spire_proposer.d.ts +70 -0
  51. package/dest/archiver/l1/spire_proposer.d.ts.map +1 -0
  52. package/dest/archiver/l1/spire_proposer.js +157 -0
  53. package/dest/archiver/l1/trace_tx.d.ts +97 -0
  54. package/dest/archiver/l1/trace_tx.d.ts.map +1 -0
  55. package/dest/archiver/l1/trace_tx.js +91 -0
  56. package/dest/archiver/l1/types.d.ts +12 -0
  57. package/dest/archiver/l1/types.d.ts.map +1 -0
  58. package/dest/archiver/l1/types.js +3 -0
  59. package/dest/archiver/l1/validate_trace.d.ts +29 -0
  60. package/dest/archiver/l1/validate_trace.d.ts.map +1 -0
  61. package/dest/archiver/l1/validate_trace.js +150 -0
  62. package/dest/archiver/structs/inbox_message.d.ts +4 -4
  63. package/dest/archiver/structs/inbox_message.d.ts.map +1 -1
  64. package/dest/archiver/structs/inbox_message.js +6 -5
  65. package/dest/archiver/structs/published.d.ts +1 -2
  66. package/dest/archiver/structs/published.d.ts.map +1 -1
  67. package/dest/archiver/validation.d.ts +4 -4
  68. package/dest/archiver/validation.d.ts.map +1 -1
  69. package/dest/archiver/validation.js +1 -1
  70. package/dest/factory.d.ts +2 -2
  71. package/dest/factory.d.ts.map +1 -1
  72. package/dest/factory.js +4 -3
  73. package/dest/index.d.ts +2 -2
  74. package/dest/index.d.ts.map +1 -1
  75. package/dest/index.js +1 -1
  76. package/dest/test/mock_archiver.d.ts +16 -8
  77. package/dest/test/mock_archiver.d.ts.map +1 -1
  78. package/dest/test/mock_archiver.js +19 -14
  79. package/dest/test/mock_l1_to_l2_message_source.d.ts +7 -6
  80. package/dest/test/mock_l1_to_l2_message_source.d.ts.map +1 -1
  81. package/dest/test/mock_l1_to_l2_message_source.js +21 -11
  82. package/dest/test/mock_l2_block_source.d.ts +23 -8
  83. package/dest/test/mock_l2_block_source.d.ts.map +1 -1
  84. package/dest/test/mock_l2_block_source.js +95 -35
  85. package/dest/test/mock_structs.d.ts +3 -2
  86. package/dest/test/mock_structs.d.ts.map +1 -1
  87. package/dest/test/mock_structs.js +9 -8
  88. package/package.json +17 -16
  89. package/src/archiver/archiver.ts +751 -344
  90. package/src/archiver/archiver_store.ts +123 -48
  91. package/src/archiver/archiver_store_test_suite.ts +1943 -365
  92. package/src/archiver/config.ts +17 -12
  93. package/src/archiver/errors.ts +64 -0
  94. package/src/archiver/index.ts +1 -1
  95. package/src/archiver/instrumentation.ts +24 -59
  96. package/src/archiver/kv_archiver_store/block_store.ts +475 -106
  97. package/src/archiver/kv_archiver_store/contract_class_store.ts +1 -1
  98. package/src/archiver/kv_archiver_store/contract_instance_store.ts +1 -1
  99. package/src/archiver/kv_archiver_store/kv_archiver_store.ts +92 -72
  100. package/src/archiver/kv_archiver_store/log_store.ts +209 -99
  101. package/src/archiver/kv_archiver_store/message_store.ts +21 -18
  102. package/src/archiver/l1/README.md +98 -0
  103. package/src/archiver/l1/bin/retrieve-calldata.ts +182 -0
  104. package/src/archiver/l1/calldata_retriever.ts +641 -0
  105. package/src/archiver/{data_retrieval.ts → l1/data_retrieval.ts} +101 -165
  106. package/src/archiver/l1/debug_tx.ts +99 -0
  107. package/src/archiver/l1/spire_proposer.ts +160 -0
  108. package/src/archiver/l1/trace_tx.ts +128 -0
  109. package/src/archiver/l1/types.ts +13 -0
  110. package/src/archiver/l1/validate_trace.ts +211 -0
  111. package/src/archiver/structs/inbox_message.ts +8 -8
  112. package/src/archiver/structs/published.ts +0 -1
  113. package/src/archiver/validation.ts +6 -6
  114. package/src/factory.ts +4 -3
  115. package/src/index.ts +1 -1
  116. package/src/test/fixtures/debug_traceTransaction-multicall3.json +88 -0
  117. package/src/test/fixtures/debug_traceTransaction-multiplePropose.json +153 -0
  118. package/src/test/fixtures/debug_traceTransaction-proxied.json +122 -0
  119. package/src/test/fixtures/trace_transaction-multicall3.json +65 -0
  120. package/src/test/fixtures/trace_transaction-multiplePropose.json +319 -0
  121. package/src/test/fixtures/trace_transaction-proxied.json +128 -0
  122. package/src/test/fixtures/trace_transaction-randomRevert.json +216 -0
  123. package/src/test/mock_archiver.ts +22 -16
  124. package/src/test/mock_l1_to_l2_message_source.ts +18 -11
  125. package/src/test/mock_l2_block_source.ts +115 -37
  126. package/src/test/mock_structs.ts +10 -9
  127. package/dest/archiver/data_retrieval.d.ts +0 -79
  128. package/dest/archiver/data_retrieval.d.ts.map +0 -1
@@ -0,0 +1,90 @@
1
+ import type { BlobClientInterface } from '@aztec/blob-client/client';
2
+ import { type CheckpointBlobData } from '@aztec/blob-lib';
3
+ import type { ViemClient, ViemPublicClient, ViemPublicDebugClient } from '@aztec/ethereum/types';
4
+ import { CheckpointNumber } from '@aztec/foundation/branded-types';
5
+ import { Fr } from '@aztec/foundation/curves/bn254';
6
+ import { EthAddress } from '@aztec/foundation/eth-address';
7
+ import { type Logger } from '@aztec/foundation/log';
8
+ import { type InboxAbi, RollupAbi } from '@aztec/l1-artifacts';
9
+ import { CommitteeAttestation } from '@aztec/stdlib/block';
10
+ import { L1PublishedData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
11
+ import { Proof } from '@aztec/stdlib/proofs';
12
+ import { CheckpointHeader } from '@aztec/stdlib/rollup';
13
+ import { type GetContractReturnType, type Hex } from 'viem';
14
+ import type { ArchiverInstrumentation } from '../instrumentation.js';
15
+ import type { DataRetrieval } from '../structs/data_retrieval.js';
16
+ import type { InboxMessage } from '../structs/inbox_message.js';
17
+ export type RetrievedCheckpoint = {
18
+ checkpointNumber: CheckpointNumber;
19
+ archiveRoot: Fr;
20
+ header: CheckpointHeader;
21
+ checkpointBlobData: CheckpointBlobData;
22
+ l1: L1PublishedData;
23
+ chainId: Fr;
24
+ version: Fr;
25
+ attestations: CommitteeAttestation[];
26
+ };
27
+ export declare function retrievedToPublishedCheckpoint({ checkpointNumber, archiveRoot, header: checkpointHeader, checkpointBlobData, l1, chainId, version, attestations }: RetrievedCheckpoint): Promise<PublishedCheckpoint>;
28
+ /**
29
+ * Fetches new checkpoints.
30
+ * @param rollup - The rollup contract instance.
31
+ * @param publicClient - The viem public client to use for transaction retrieval.
32
+ * @param debugClient - The viem debug client to use for trace/debug RPC methods (optional).
33
+ * @param blobClient - The blob client client for fetching blob data.
34
+ * @param searchStartBlock - The block number to use for starting the search.
35
+ * @param searchEndBlock - The highest block number that we should search up to.
36
+ * @param contractAddresses - The contract addresses (governanceProposerAddress, slashFactoryAddress, slashingProposerAddress).
37
+ * @param instrumentation - The archiver instrumentation instance.
38
+ * @param logger - The logger instance.
39
+ * @param isHistoricalSync - Whether this is a historical sync.
40
+ * @returns An array of retrieved checkpoints.
41
+ */
42
+ export declare function retrieveCheckpointsFromRollup(rollup: GetContractReturnType<typeof RollupAbi, ViemPublicClient>, publicClient: ViemPublicClient, debugClient: ViemPublicDebugClient, blobClient: BlobClientInterface, searchStartBlock: bigint, searchEndBlock: bigint, contractAddresses: {
43
+ governanceProposerAddress: EthAddress;
44
+ slashFactoryAddress?: EthAddress;
45
+ slashingProposerAddress: EthAddress;
46
+ }, instrumentation: ArchiverInstrumentation, logger?: Logger, isHistoricalSync?: boolean): Promise<RetrievedCheckpoint[]>;
47
+ export declare function getL1BlockTime(publicClient: ViemPublicClient, blockNumber: bigint): Promise<bigint>;
48
+ export declare function getCheckpointBlobDataFromBlobs(blobClient: BlobClientInterface, blockHash: string, blobHashes: Buffer<ArrayBufferLike>[], checkpointNumber: CheckpointNumber, logger: Logger, isHistoricalSync: boolean): Promise<CheckpointBlobData>;
49
+ /** Given an L1 to L2 message, retrieves its corresponding event from the Inbox within a specific block range. */
50
+ export declare function retrieveL1ToL2Message(inbox: GetContractReturnType<typeof InboxAbi, ViemClient>, leaf: Fr, fromBlock: bigint, toBlock: bigint): Promise<InboxMessage | undefined>;
51
+ /**
52
+ * Fetch L1 to L2 messages.
53
+ * @param publicClient - The viem public client to use for transaction retrieval.
54
+ * @param inboxAddress - The address of the inbox contract to fetch messages from.
55
+ * @param blockUntilSynced - If true, blocks until the archiver has fully synced.
56
+ * @param searchStartBlock - The block number to use for starting the search.
57
+ * @param searchEndBlock - The highest block number that we should search up to.
58
+ * @returns An array of InboxLeaf and next eth block to search from.
59
+ */
60
+ export declare function retrieveL1ToL2Messages(inbox: GetContractReturnType<typeof InboxAbi, ViemClient>, searchStartBlock: bigint, searchEndBlock: bigint): Promise<InboxMessage[]>;
61
+ /** Retrieves L2ProofVerified events from the rollup contract. */
62
+ export declare function retrieveL2ProofVerifiedEvents(publicClient: ViemPublicClient, rollupAddress: EthAddress, searchStartBlock: bigint, searchEndBlock?: bigint): Promise<{
63
+ l1BlockNumber: bigint;
64
+ checkpointNumber: CheckpointNumber;
65
+ proverId: Fr;
66
+ txHash: Hex;
67
+ }[]>;
68
+ /** Retrieve submitted proofs from the rollup contract */
69
+ export declare function retrieveL2ProofsFromRollup(publicClient: ViemPublicClient, rollupAddress: EthAddress, searchStartBlock: bigint, searchEndBlock?: bigint): Promise<DataRetrieval<{
70
+ proof: Proof;
71
+ proverId: Fr;
72
+ checkpointNumber: number;
73
+ txHash: `0x${string}`;
74
+ }>>;
75
+ export type SubmitEpochProof = {
76
+ archiveRoot: Fr;
77
+ proverId: Fr;
78
+ proof: Proof;
79
+ };
80
+ /**
81
+ * Gets epoch proof metadata (archive root and proof) from the calldata of an L1 transaction.
82
+ * Assumes that the block was published from an EOA.
83
+ * TODO: Add retries and error management.
84
+ * @param publicClient - The viem public client to use for transaction retrieval.
85
+ * @param txHash - Hash of the tx that published it.
86
+ * @param expectedProverId - Expected prover ID.
87
+ * @returns Epoch proof metadata from the calldata, deserialized.
88
+ */
89
+ export declare function getProofFromSubmitProofTx(publicClient: ViemPublicClient, txHash: `0x${string}`, expectedProverId: Fr): Promise<SubmitEpochProof>;
90
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YV9yZXRyaWV2YWwuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcmNoaXZlci9sMS9kYXRhX3JldHJpZXZhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JFLE9BQU8sRUFFTCxLQUFLLGtCQUFrQixFQUl4QixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRWpHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRW5FLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxLQUFLLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMvRCxPQUFPLEVBQVEsb0JBQW9CLEVBQWMsTUFBTSxxQkFBcUIsQ0FBQztBQUM3RSxPQUFPLEVBQWMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUYsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBSXhELE9BQU8sRUFFTCxLQUFLLHFCQUFxQixFQUMxQixLQUFLLEdBQUcsRUFJVCxNQUFNLE1BQU0sQ0FBQztBQUdkLE9BQU8sS0FBSyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckUsT0FBTyxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFD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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data_retrieval.d.ts","sourceRoot":"","sources":["../../../src/archiver/l1/data_retrieval.ts"],"names":[],"mappings":"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"}
@@ -1,25 +1,27 @@
1
1
  import { BlobDeserializationError, SpongeBlob, decodeCheckpointBlobDataFromBlobs, encodeBlockBlobData } from '@aztec/blob-lib';
2
2
  import { asyncPool } from '@aztec/foundation/async-pool';
3
+ import { CheckpointNumber } from '@aztec/foundation/branded-types';
3
4
  import { Buffer16, Buffer32 } from '@aztec/foundation/buffer';
4
- import { Fr } from '@aztec/foundation/fields';
5
+ import { Fr } from '@aztec/foundation/curves/bn254';
6
+ import { EthAddress } from '@aztec/foundation/eth-address';
5
7
  import { createLogger } from '@aztec/foundation/log';
6
8
  import { RollupAbi } from '@aztec/l1-artifacts';
7
- import { Body, CommitteeAttestation, L2BlockNew } from '@aztec/stdlib/block';
8
- import { Checkpoint, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
9
+ import { Body, L2BlockNew } from '@aztec/stdlib/block';
10
+ import { Checkpoint, L1PublishedData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
9
11
  import { Proof } from '@aztec/stdlib/proofs';
10
- import { CheckpointHeader } from '@aztec/stdlib/rollup';
11
12
  import { AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
12
13
  import { BlockHeader, GlobalVariables, PartialStateReference, StateReference } from '@aztec/stdlib/tx';
13
- import { decodeFunctionData, getAbiItem, hexToBytes, multicall3Abi } from 'viem';
14
- import { NoBlobBodiesFoundError } from './errors.js';
14
+ import { decodeFunctionData, getAbiItem, hexToBytes } from 'viem';
15
+ import { NoBlobBodiesFoundError } from '../errors.js';
16
+ import { CalldataRetriever } from './calldata_retriever.js';
15
17
  export async function retrievedToPublishedCheckpoint({ checkpointNumber, archiveRoot, header: checkpointHeader, checkpointBlobData, l1, chainId, version, attestations }) {
16
18
  const { blocks: blocksBlobData } = checkpointBlobData;
17
19
  // The lastArchiveRoot of a block is the new archive for the previous block.
18
20
  const newArchiveRoots = blocksBlobData.map((b)=>b.lastArchiveRoot).slice(1).concat([
19
21
  archiveRoot
20
22
  ]);
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
+ // An error will be thrown from `decodeCheckpointBlobDataFromBlobs` if it can't read a field for the
24
+ // `l1ToL2MessageRoot` of the first block. So below we can safely assume it exists:
23
25
  const l1toL2MessageTreeRoot = blocksBlobData[0].l1ToL2MessageRoot;
24
26
  const spongeBlob = SpongeBlob.init();
25
27
  const l2Blocks = [];
@@ -59,7 +61,7 @@ export async function retrievedToPublishedCheckpoint({ checkpointNumber, archive
59
61
  totalManaUsed: new Fr(blockEndStateField.totalManaUsed)
60
62
  });
61
63
  const newArchive = new AppendOnlyTreeSnapshot(newArchiveRoots[i], l2BlockNumber + 1);
62
- l2Blocks.push(new L2BlockNew(newArchive, header, body));
64
+ l2Blocks.push(new L2BlockNew(newArchive, header, body, checkpointNumber, i));
63
65
  }
64
66
  const lastBlock = l2Blocks.at(-1);
65
67
  const checkpoint = Checkpoint.from({
@@ -76,13 +78,18 @@ export async function retrievedToPublishedCheckpoint({ checkpointNumber, archive
76
78
  }
77
79
  /**
78
80
  * Fetches new checkpoints.
81
+ * @param rollup - The rollup contract instance.
79
82
  * @param publicClient - The viem public client to use for transaction retrieval.
80
- * @param rollupAddress - The address of the rollup contract.
83
+ * @param debugClient - The viem debug client to use for trace/debug RPC methods (optional).
84
+ * @param blobClient - The blob client client for fetching blob data.
81
85
  * @param searchStartBlock - The block number to use for starting the search.
82
86
  * @param searchEndBlock - The highest block number that we should search up to.
83
- * @param expectedNextL2BlockNum - The next L2 block number that we expect to find.
84
- * @returns An array of block; as well as the next eth block to search from.
85
- */ export async function retrieveCheckpointsFromRollup(rollup, publicClient, blobSinkClient, searchStartBlock, searchEndBlock, logger = createLogger('archiver')) {
87
+ * @param contractAddresses - The contract addresses (governanceProposerAddress, slashFactoryAddress, slashingProposerAddress).
88
+ * @param instrumentation - The archiver instrumentation instance.
89
+ * @param logger - The logger instance.
90
+ * @param isHistoricalSync - Whether this is a historical sync.
91
+ * @returns An array of retrieved checkpoints.
92
+ */ export async function retrieveCheckpointsFromRollup(rollup, publicClient, debugClient, blobClient, searchStartBlock, searchEndBlock, contractAddresses, instrumentation, logger = createLogger('archiver'), isHistoricalSync = false) {
86
93
  const retrievedCheckpoints = [];
87
94
  let rollupConstants;
88
95
  do {
@@ -110,7 +117,7 @@ export async function retrievedToPublishedCheckpoint({ checkpointNumber, archive
110
117
  targetCommitteeSize: Number(targetCommitteeSize)
111
118
  };
112
119
  }
113
- const newCheckpoints = await processCheckpointProposedLogs(rollup, publicClient, blobSinkClient, checkpointProposedLogs, rollupConstants, logger);
120
+ const newCheckpoints = await processCheckpointProposedLogs(rollup, publicClient, debugClient, blobClient, checkpointProposedLogs, rollupConstants, contractAddresses, instrumentation, logger, isHistoricalSync);
114
121
  retrievedCheckpoints.push(...newCheckpoints);
115
122
  searchStartBlock = lastLog.blockNumber + 1n;
116
123
  }while (searchStartBlock <= searchEndBlock)
@@ -119,14 +126,25 @@ export async function retrievedToPublishedCheckpoint({ checkpointNumber, archive
119
126
  }
120
127
  /**
121
128
  * Processes newly received CheckpointProposed logs.
122
- * @param rollup - The rollup contract
129
+ * @param rollup - The rollup contract instance.
123
130
  * @param publicClient - The viem public client to use for transaction retrieval.
131
+ * @param debugClient - The viem debug client to use for trace/debug RPC methods (optional).
132
+ * @param blobClient - The blob client client for fetching blob data.
124
133
  * @param logs - CheckpointProposed logs.
125
- * @returns - An array of checkpoints.
126
- */ async function processCheckpointProposedLogs(rollup, publicClient, blobSinkClient, logs, { chainId, version, targetCommitteeSize }, logger) {
134
+ * @param rollupConstants - The rollup constants (chainId, version, targetCommitteeSize).
135
+ * @param contractAddresses - The contract addresses (governanceProposerAddress, slashFactoryAddress, slashingProposerAddress).
136
+ * @param instrumentation - The archiver instrumentation instance.
137
+ * @param logger - The logger instance.
138
+ * @param isHistoricalSync - Whether this is a historical sync.
139
+ * @returns An array of retrieved checkpoints.
140
+ */ async function processCheckpointProposedLogs(rollup, publicClient, debugClient, blobClient, logs, { chainId, version, targetCommitteeSize }, contractAddresses, instrumentation, logger, isHistoricalSync) {
127
141
  const retrievedCheckpoints = [];
142
+ const calldataRetriever = new CalldataRetriever(publicClient, debugClient, targetCommitteeSize, instrumentation, logger, {
143
+ ...contractAddresses,
144
+ rollupAddress: EthAddress.fromString(rollup.address)
145
+ });
128
146
  await asyncPool(10, logs, async (log)=>{
129
- const checkpointNumber = Number(log.args.checkpointNumber);
147
+ const checkpointNumber = CheckpointNumber.fromBigInt(log.args.checkpointNumber);
130
148
  const archive = log.args.archive;
131
149
  const archiveFromChain = await rollup.read.archiveAt([
132
150
  BigInt(checkpointNumber)
@@ -134,14 +152,17 @@ export async function retrievedToPublishedCheckpoint({ checkpointNumber, archive
134
152
  const blobHashes = log.args.versionedBlobHashes.map((blobHash)=>Buffer.from(blobHash.slice(2), 'hex'));
135
153
  // The value from the event and contract will match only if the checkpoint is in the chain.
136
154
  if (archive === archiveFromChain) {
137
- const checkpoint = await getCheckpointFromRollupTx(publicClient, blobSinkClient, log.transactionHash, blobHashes, checkpointNumber, rollup.address, targetCommitteeSize, logger);
138
- const l1 = {
139
- blockNumber: log.blockNumber,
140
- blockHash: log.blockHash,
141
- timestamp: await getL1BlockTime(publicClient, log.blockNumber)
155
+ // Build expected hashes object (fields may be undefined for backwards compatibility with older events)
156
+ const expectedHashes = {
157
+ attestationsHash: log.args.attestationsHash,
158
+ payloadDigest: log.args.payloadDigest
142
159
  };
160
+ const checkpoint = await calldataRetriever.getCheckpointFromRollupTx(log.transactionHash, blobHashes, checkpointNumber, expectedHashes);
161
+ const checkpointBlobData = await getCheckpointBlobDataFromBlobs(blobClient, checkpoint.blockHash, blobHashes, checkpointNumber, logger, isHistoricalSync);
162
+ const l1 = new L1PublishedData(log.blockNumber, await getL1BlockTime(publicClient, log.blockNumber), log.blockHash);
143
163
  retrievedCheckpoints.push({
144
164
  ...checkpoint,
165
+ checkpointBlobData,
145
166
  l1,
146
167
  chainId,
147
168
  version
@@ -168,103 +189,27 @@ export async function getL1BlockTime(publicClient, blockNumber) {
168
189
  });
169
190
  return block.timestamp;
170
191
  }
171
- /**
172
- * Extracts the first 'propose' method calldata from a multicall3 transaction's data.
173
- * @param multicall3Data - The multicall3 transaction input data
174
- * @param rollupAddress - The address of the rollup contract
175
- * @returns The calldata for the first 'propose' method call to the rollup contract
176
- */ function extractRollupProposeCalldata(multicall3Data, rollupAddress) {
177
- const { functionName: multicall3FunctionName, args: multicall3Args } = decodeFunctionData({
178
- abi: multicall3Abi,
179
- data: multicall3Data
192
+ export async function getCheckpointBlobDataFromBlobs(blobClient, blockHash, blobHashes, checkpointNumber, logger, isHistoricalSync) {
193
+ const blobBodies = await blobClient.getBlobSidecar(blockHash, blobHashes, {
194
+ isHistoricalSync
180
195
  });
181
- if (multicall3FunctionName !== 'aggregate3') {
182
- throw new Error(`Unexpected multicall3 method called ${multicall3FunctionName}`);
183
- }
184
- if (multicall3Args.length !== 1) {
185
- throw new Error(`Unexpected number of arguments for multicall3`);
186
- }
187
- const [calls] = multicall3Args;
188
- // Find all rollup calls
189
- const rollupAddressLower = rollupAddress.toLowerCase();
190
- for(let i = 0; i < calls.length; i++){
191
- const addr = calls[i].target;
192
- if (addr.toLowerCase() !== rollupAddressLower) {
193
- continue;
194
- }
195
- const callData = calls[i].callData;
196
- try {
197
- const { functionName: rollupFunctionName } = decodeFunctionData({
198
- abi: RollupAbi,
199
- data: callData
200
- });
201
- if (rollupFunctionName === 'propose') {
202
- return callData;
203
- }
204
- } catch {
205
- continue;
206
- }
207
- }
208
- throw new Error(`Rollup address not found in multicall3 args`);
209
- }
210
- /**
211
- * Gets checkpoint from the calldata of an L1 transaction.
212
- * Assumes that the checkpoint was published from an EOA.
213
- * TODO: Add retries and error management.
214
- * @param publicClient - The viem public client to use for transaction retrieval.
215
- * @param txHash - Hash of the tx that published it.
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}`);
220
- const { input: forwarderData, blockHash } = await publicClient.getTransaction({
221
- hash: txHash
222
- });
223
- const rollupData = extractRollupProposeCalldata(forwarderData, rollupAddress);
224
- const { functionName: rollupFunctionName, args: rollupArgs } = decodeFunctionData({
225
- abi: RollupAbi,
226
- data: rollupData
227
- });
228
- if (rollupFunctionName !== 'propose') {
229
- throw new Error(`Unexpected rollup method called ${rollupFunctionName}`);
230
- }
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);
244
- const blobBodies = await blobSinkClient.getBlobSidecar(blockHash, blobHashes);
245
196
  if (blobBodies.length === 0) {
246
197
  throw new NoBlobBodiesFoundError(checkpointNumber);
247
198
  }
248
199
  let checkpointBlobData;
249
200
  try {
250
201
  // Attempt to decode the checkpoint blob data.
251
- checkpointBlobData = decodeCheckpointBlobDataFromBlobs(blobBodies.map((b)=>b.blob));
202
+ checkpointBlobData = decodeCheckpointBlobDataFromBlobs(blobBodies);
252
203
  } catch (err) {
253
204
  if (err instanceof BlobDeserializationError) {
254
205
  logger.fatal(err.message);
255
206
  } else {
256
207
  logger.fatal('Unable to sync: failed to decode fetched blob, this blob was likely not created by us');
257
208
  }
209
+ // Throwing an error since this is most likely caused by a bug.
258
210
  throw err;
259
211
  }
260
- const archiveRoot = new Fr(Buffer.from(hexToBytes(decodedArgs.archive)));
261
- return {
262
- checkpointNumber,
263
- archiveRoot,
264
- header,
265
- checkpointBlobData,
266
- attestations
267
- };
212
+ return checkpointBlobData;
268
213
  }
269
214
  /** 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
215
  const logs = await inbox.getEvents.MessageSent({
@@ -307,7 +252,7 @@ function mapLogsInboxMessage(logs) {
307
252
  leaf: Fr.fromHexString(hash),
308
253
  l1BlockNumber: log.blockNumber,
309
254
  l1BlockHash: Buffer32.fromString(log.blockHash),
310
- l2BlockNumber: Number(checkpointNumber),
255
+ checkpointNumber: CheckpointNumber.fromBigInt(checkpointNumber),
311
256
  rollingHash: Buffer16.fromString(rollingHash)
312
257
  };
313
258
  });
@@ -325,7 +270,7 @@ function mapLogsInboxMessage(logs) {
325
270
  });
326
271
  return logs.map((log)=>({
327
272
  l1BlockNumber: log.blockNumber,
328
- checkpointNumber: Number(log.args.checkpointNumber),
273
+ checkpointNumber: CheckpointNumber.fromBigInt(log.args.checkpointNumber),
329
274
  proverId: Fr.fromHexString(log.args.proverId),
330
275
  txHash: log.transactionHash
331
276
  }));
@@ -0,0 +1,19 @@
1
+ import type { DebugCallTrace, ViemPublicDebugClient } from '@aztec/ethereum/types';
2
+ import { EthAddress } from '@aztec/foundation/eth-address';
3
+ import type { Logger } from '@aztec/foundation/log';
4
+ import { type ZodFor } from '@aztec/foundation/schemas';
5
+ import type { Hex } from 'viem';
6
+ import type { CallInfo } from './types.js';
7
+ /** Zod schema for validating call trace from debug_traceTransaction */
8
+ export declare const callTraceSchema: ZodFor<DebugCallTrace>;
9
+ /**
10
+ * Traces a transaction and extracts all CALL operations to a specific contract and function selector.
11
+ *
12
+ * @param client - The Viem public client
13
+ * @param txHash - The transaction hash to trace
14
+ * @param targetAddress - The contract address to filter for
15
+ * @param functionSelector - The 4-byte function selector to filter for (with or without 0x prefix)
16
+ * @returns Array of CallInfo objects containing from, gasUsed, input, and value for matching calls
17
+ */
18
+ export declare function getSuccessfulCallsFromDebug(client: ViemPublicDebugClient, txHash: Hex, targetAddress: EthAddress, functionSelector: string, logger?: Logger): Promise<CallInfo[]>;
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVidWdfdHguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcmNoaXZlci9sMS9kZWJ1Z190eC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxjQUFjLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFXLE1BQU0sMkJBQTJCLENBQUM7QUFHakUsT0FBTyxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBR2hDLE9BQU8sS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUUzQyx1RUFBdUU7QUFDdkUsZUFBTyxNQUFNLGVBQWUsRUFBRSxNQUFNLENBQUMsY0FBYyxDQWFsRCxDQUFDO0FBRUY7Ozs7Ozs7O0dBUUc7QUFDSCx3QkFBc0IsMkJBQTJCLENBQy9DLE1BQU0sRUFBRSxxQkFBcUIsRUFDN0IsTUFBTSxFQUFFLEdBQUcsRUFDWCxhQUFhLEVBQUUsVUFBVSxFQUN6QixnQkFBZ0IsRUFBRSxNQUFNLEVBQ3hCLE1BQU0sQ0FBQyxFQUFFLE1BQU0sR0FDZCxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0F3RHJCIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug_tx.d.ts","sourceRoot":"","sources":["../../../src/archiver/l1/debug_tx.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,KAAK,MAAM,EAAW,MAAM,2BAA2B,CAAC;AAGjE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAGhC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,uEAAuE;AACvE,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,cAAc,CAalD,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,qBAAqB,EAC7B,MAAM,EAAE,GAAG,EACX,aAAa,EAAE,UAAU,EACzB,gBAAgB,EAAE,MAAM,EACxB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,QAAQ,EAAE,CAAC,CAwDrB"}
@@ -0,0 +1,73 @@
1
+ import { EthAddress } from '@aztec/foundation/eth-address';
2
+ import { schemas } from '@aztec/foundation/schemas';
3
+ import { withHexPrefix } from '@aztec/foundation/string';
4
+ import { z } from 'zod';
5
+ /** Zod schema for validating call trace from debug_traceTransaction */ export const callTraceSchema = z.lazy(()=>z.object({
6
+ from: schemas.HexStringWith0x,
7
+ to: schemas.HexStringWith0x.optional(),
8
+ type: z.string(),
9
+ input: schemas.HexStringWith0x.optional(),
10
+ output: schemas.HexStringWith0x.optional(),
11
+ gas: schemas.HexStringWith0x.optional(),
12
+ gasUsed: schemas.HexStringWith0x.optional(),
13
+ value: schemas.HexStringWith0x.optional(),
14
+ error: z.string().optional(),
15
+ calls: z.array(callTraceSchema).optional()
16
+ }));
17
+ /**
18
+ * Traces a transaction and extracts all CALL operations to a specific contract and function selector.
19
+ *
20
+ * @param client - The Viem public client
21
+ * @param txHash - The transaction hash to trace
22
+ * @param targetAddress - The contract address to filter for
23
+ * @param functionSelector - The 4-byte function selector to filter for (with or without 0x prefix)
24
+ * @returns Array of CallInfo objects containing from, gasUsed, input, and value for matching calls
25
+ */ export async function getSuccessfulCallsFromDebug(client, txHash, targetAddress, functionSelector, logger) {
26
+ // Normalize inputs for comparison
27
+ const normalizedTarget = targetAddress.toString().toLowerCase();
28
+ const normalizedSelector = withHexPrefix(functionSelector.toLowerCase());
29
+ // Call debug_traceTransaction with callTracer
30
+ // Using 'any' here because debug_traceTransaction is not in viem's standard RPC types
31
+ const rawTrace = await client.request({
32
+ method: 'debug_traceTransaction',
33
+ params: [
34
+ txHash,
35
+ {
36
+ tracer: 'callTracer'
37
+ }
38
+ ]
39
+ });
40
+ if (rawTrace === null || rawTrace === undefined) {
41
+ throw new Error(`Failed to retrieve debug_traceTransaction for ${txHash}`);
42
+ }
43
+ logger?.trace(`Retrieved debug_traceTransaction for ${txHash}`, {
44
+ trace: rawTrace
45
+ });
46
+ // Validate the response with zod
47
+ const trace = callTraceSchema.parse(rawTrace);
48
+ const results = [];
49
+ /**
50
+ * Recursively traverse the call trace tree
51
+ */ function traverseCalls(callTrace) {
52
+ // Skip calls that have errors, and all its descendants
53
+ if (callTrace.error) {
54
+ return;
55
+ }
56
+ // Check if this is a CALL (not DELEGATECALL or STATICCALL) to the target address with matching selector
57
+ if (callTrace.type.toUpperCase() === 'CALL' && callTrace.to?.toLowerCase() === normalizedTarget && callTrace.input?.toLowerCase().startsWith(normalizedSelector)) {
58
+ results.push({
59
+ from: EthAddress.fromString(callTrace.from),
60
+ gasUsed: callTrace.gasUsed === undefined ? undefined : BigInt(callTrace.gasUsed),
61
+ input: callTrace.input,
62
+ value: callTrace.value ? BigInt(callTrace.value) : 0n
63
+ });
64
+ }
65
+ // Recursively process nested calls
66
+ for (const nestedCall of callTrace.calls ?? []){
67
+ traverseCalls(nestedCall);
68
+ }
69
+ }
70
+ // Start traversal from the root trace
71
+ traverseCalls(trace);
72
+ return results;
73
+ }
@@ -0,0 +1,70 @@
1
+ import type { Logger } from '@aztec/foundation/log';
2
+ import { type Hex, type Transaction } from 'viem';
3
+ export declare const SPIRE_PROPOSER_ADDRESS = "0x9ccc2f3ecde026230e11a5c8799ac7524f2bb294";
4
+ export declare const SPIRE_PROPOSER_EXPECTED_IMPLEMENTATION = "0x7d38d47e7c82195e6e607d3b0f1c20c615c7bf42";
5
+ export declare const EIP1967_IMPLEMENTATION_SLOT: "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
6
+ export declare const SpireProposerAbi: readonly [{
7
+ readonly inputs: readonly [{
8
+ readonly components: readonly [{
9
+ readonly internalType: "address";
10
+ readonly name: "proposer";
11
+ readonly type: "address";
12
+ }, {
13
+ readonly internalType: "address";
14
+ readonly name: "target";
15
+ readonly type: "address";
16
+ }, {
17
+ readonly internalType: "bytes";
18
+ readonly name: "data";
19
+ readonly type: "bytes";
20
+ }, {
21
+ readonly internalType: "uint256";
22
+ readonly name: "value";
23
+ readonly type: "uint256";
24
+ }, {
25
+ readonly internalType: "uint256";
26
+ readonly name: "gasLimit";
27
+ readonly type: "uint256";
28
+ }];
29
+ readonly internalType: "struct IProposerMulticall.Call[]";
30
+ readonly name: "_calls";
31
+ readonly type: "tuple[]";
32
+ }];
33
+ readonly name: "multicall";
34
+ readonly outputs: readonly [];
35
+ readonly stateMutability: "nonpayable";
36
+ readonly type: "function";
37
+ }];
38
+ /**
39
+ * Verifies that a proxy contract points to the expected implementation using EIP-1967.
40
+ * @param publicClient - The viem public client
41
+ * @param proxyAddress - The proxy contract address
42
+ * @param expectedImplementation - The expected implementation address
43
+ * @param logger - Logger instance
44
+ * @returns True if the proxy points to the expected implementation
45
+ */
46
+ export declare function verifyProxyImplementation(publicClient: {
47
+ getStorageAt: (params: {
48
+ address: Hex;
49
+ slot: Hex;
50
+ }) => Promise<Hex | undefined>;
51
+ }, proxyAddress: Hex, expectedImplementation: Hex, logger: Logger): Promise<boolean>;
52
+ /**
53
+ * Attempts to decode transaction as a Spire Proposer Multicall.
54
+ * Spire Proposer is a proxy contract that wraps multiple calls.
55
+ * Returns the target address and calldata of the wrapped call if validation succeeds and there is a single call.
56
+ * @param tx - The transaction to decode
57
+ * @param publicClient - The viem public client for proxy verification
58
+ * @param logger - Logger instance
59
+ * @returns Object with 'to' and 'data' of the wrapped call, or undefined if validation fails
60
+ */
61
+ export declare function getCallFromSpireProposer(tx: Transaction, publicClient: {
62
+ getStorageAt: (params: {
63
+ address: Hex;
64
+ slot: Hex;
65
+ }) => Promise<Hex | undefined>;
66
+ }, logger: Logger): Promise<{
67
+ to: Hex;
68
+ data: Hex;
69
+ } | undefined>;
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BpcmVfcHJvcG9zZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcmNoaXZlci9sMS9zcGlyZV9wcm9wb3Nlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVwRCxPQUFPLEVBQUUsS0FBSyxHQUFHLEVBQUUsS0FBSyxXQUFXLEVBQXdDLE1BQU0sTUFBTSxDQUFDO0FBR3hGLGVBQU8sTUFBTSxzQkFBc0IsK0NBQStDLENBQUM7QUFDbkYsZUFBTyxNQUFNLHNDQUFzQywrQ0FBK0MsQ0FBQztBQUluRyxlQUFPLE1BQU0sMkJBQTJCLHNFQUN1QyxDQUFDO0FBR2hGLGVBQU8sTUFBTSxnQkFBZ0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFxQm5CLENBQUM7QUFFWDs7Ozs7OztHQU9HO0FBQ0gsd0JBQXNCLHlCQUF5QixDQUM3QyxZQUFZLEVBQUU7SUFBRSxZQUFZLEVBQUUsQ0FBQyxNQUFNLEVBQUU7UUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDO1FBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQTtLQUFFLEtBQUssT0FBTyxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUMsQ0FBQTtDQUFFLEVBQ2pHLFlBQVksRUFBRSxHQUFHLEVBQ2pCLHNCQUFzQixFQUFFLEdBQUcsRUFDM0IsTUFBTSxFQUFFLE1BQU0sR0FDYixPQUFPLENBQUMsT0FBTyxDQUFDLENBaUNsQjtBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsd0JBQXNCLHdCQUF3QixDQUM1QyxFQUFFLEVBQUUsV0FBVyxFQUNmLFlBQVksRUFBRTtJQUFFLFlBQVksRUFBRSxDQUFDLE1BQU0sRUFBRTtRQUFFLE9BQU8sRUFBRSxHQUFHLENBQUM7UUFBQyxJQUFJLEVBQUUsR0FBRyxDQUFBO0tBQUUsS0FBSyxPQUFPLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQyxDQUFBO0NBQUUsRUFDakcsTUFBTSxFQUFFLE1BQU0sR0FDYixPQUFPLENBQUM7SUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDO0lBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQTtDQUFFLEdBQUcsU0FBUyxDQUFDLENBNEQ3QyJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spire_proposer.d.ts","sourceRoot":"","sources":["../../../src/archiver/l1/spire_proposer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,WAAW,EAAwC,MAAM,MAAM,CAAC;AAGxF,eAAO,MAAM,sBAAsB,+CAA+C,CAAC;AACnF,eAAO,MAAM,sCAAsC,+CAA+C,CAAC;AAInG,eAAO,MAAM,2BAA2B,sEACuC,CAAC;AAGhF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqBnB,CAAC;AAEX;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,CAC7C,YAAY,EAAE;IAAE,YAAY,EAAE,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,GAAG,CAAC;QAAC,IAAI,EAAE,GAAG,CAAA;KAAE,KAAK,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC,CAAA;CAAE,EACjG,YAAY,EAAE,GAAG,EACjB,sBAAsB,EAAE,GAAG,EAC3B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,CAiClB;AAED;;;;;;;;GAQG;AACH,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,WAAW,EACf,YAAY,EAAE;IAAE,YAAY,EAAE,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,GAAG,CAAC;QAAC,IAAI,EAAE,GAAG,CAAA;KAAE,KAAK,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC,CAAA;CAAE,EACjG,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,EAAE,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,GAAG,CAAA;CAAE,GAAG,SAAS,CAAC,CA4D7C"}