@aztec/archiver 0.55.0 → 0.56.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/archiver/archiver.d.ts +4 -5
- package/dest/archiver/archiver.d.ts.map +1 -1
- package/dest/archiver/archiver.js +89 -110
- package/dest/archiver/archiver_store.d.ts +11 -17
- package/dest/archiver/archiver_store.d.ts.map +1 -1
- package/dest/archiver/archiver_store_test_suite.d.ts.map +1 -1
- package/dest/archiver/archiver_store_test_suite.js +1 -25
- package/dest/archiver/config.d.ts +0 -4
- package/dest/archiver/config.d.ts.map +1 -1
- package/dest/archiver/config.js +1 -6
- package/dest/archiver/data_retrieval.d.ts +33 -5
- package/dest/archiver/data_retrieval.d.ts.map +1 -1
- package/dest/archiver/data_retrieval.js +124 -15
- package/dest/archiver/kv_archiver_store/block_store.d.ts +2 -2
- package/dest/archiver/kv_archiver_store/block_store.d.ts.map +1 -1
- package/dest/archiver/kv_archiver_store/block_store.js +16 -10
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +3 -15
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +1 -1
- package/dest/archiver/kv_archiver_store/kv_archiver_store.js +12 -25
- package/dest/archiver/kv_archiver_store/message_store.d.ts +1 -0
- package/dest/archiver/kv_archiver_store/message_store.d.ts.map +1 -1
- package/dest/archiver/kv_archiver_store/message_store.js +11 -8
- package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts +3 -20
- package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts.map +1 -1
- package/dest/archiver/memory_archiver_store/memory_archiver_store.js +9 -28
- package/dest/index.d.ts +0 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -2
- package/package.json +10 -10
- package/src/archiver/archiver.ts +140 -156
- package/src/archiver/archiver_store.ts +12 -18
- package/src/archiver/archiver_store_test_suite.ts +1 -28
- package/src/archiver/config.ts +0 -10
- package/src/archiver/data_retrieval.ts +189 -29
- package/src/archiver/kv_archiver_store/block_store.ts +17 -10
- package/src/archiver/kv_archiver_store/kv_archiver_store.ts +11 -25
- package/src/archiver/kv_archiver_store/message_store.ts +9 -5
- package/src/archiver/memory_archiver_store/memory_archiver_store.ts +10 -32
- package/src/index.ts +0 -2
- package/dest/archiver/eth_log_handlers.d.ts +0 -59
- package/dest/archiver/eth_log_handlers.d.ts.map +0 -1
- package/dest/archiver/eth_log_handlers.js +0 -155
- package/dest/archiver/kv_archiver_store/block_body_store.d.ts +0 -34
- package/dest/archiver/kv_archiver_store/block_body_store.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/block_body_store.js +0 -65
- package/src/archiver/eth_log_handlers.ts +0 -213
- package/src/archiver/kv_archiver_store/block_body_store.ts +0 -74
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
import { Body, InboxLeaf, L2Block } from '@aztec/circuit-types';
|
|
2
|
-
import { AppendOnlyTreeSnapshot, Header, Proof } from '@aztec/circuits.js';
|
|
3
|
-
import { Fr } from '@aztec/foundation/fields';
|
|
4
|
-
import { numToUInt32BE } from '@aztec/foundation/serialize';
|
|
5
|
-
import { InboxAbi, RollupAbi } from '@aztec/l1-artifacts';
|
|
6
|
-
import { decodeFunctionData, getAbiItem, getAddress, hexToBytes } from 'viem';
|
|
7
|
-
/**
|
|
8
|
-
* Processes newly received MessageSent (L1 to L2) logs.
|
|
9
|
-
* @param logs - MessageSent logs.
|
|
10
|
-
* @returns Array of all processed MessageSent logs
|
|
11
|
-
*/
|
|
12
|
-
export function processMessageSentLogs(logs) {
|
|
13
|
-
const leaves = [];
|
|
14
|
-
for (const log of logs) {
|
|
15
|
-
const { l2BlockNumber, index, hash } = log.args;
|
|
16
|
-
leaves.push(new InboxLeaf(l2BlockNumber, index, Fr.fromString(hash)));
|
|
17
|
-
}
|
|
18
|
-
return leaves;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Processes newly received L2BlockProposed logs.
|
|
22
|
-
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
23
|
-
* @param expectedL2BlockNumber - The next expected L2 block number.
|
|
24
|
-
* @param logs - L2BlockProposed logs.
|
|
25
|
-
* @returns - An array blocks.
|
|
26
|
-
*/
|
|
27
|
-
export async function processL2BlockProposedLogs(publicClient, expectedL2BlockNumber, logs) {
|
|
28
|
-
const retrievedBlocks = [];
|
|
29
|
-
for (const log of logs) {
|
|
30
|
-
const blockNum = log.args.blockNumber;
|
|
31
|
-
if (blockNum !== expectedL2BlockNumber) {
|
|
32
|
-
throw new Error('Block number mismatch. Expected: ' + expectedL2BlockNumber + ' but got: ' + blockNum + '.');
|
|
33
|
-
}
|
|
34
|
-
// TODO: Fetch blocks from calldata in parallel
|
|
35
|
-
const block = await getBlockFromRollupTx(publicClient, log.transactionHash, log.args.blockNumber);
|
|
36
|
-
const l1 = {
|
|
37
|
-
blockNumber: log.blockNumber,
|
|
38
|
-
blockHash: log.blockHash,
|
|
39
|
-
timestamp: await getL1BlockTime(publicClient, log.blockNumber),
|
|
40
|
-
};
|
|
41
|
-
retrievedBlocks.push({ data: block, l1 });
|
|
42
|
-
expectedL2BlockNumber++;
|
|
43
|
-
}
|
|
44
|
-
return retrievedBlocks;
|
|
45
|
-
}
|
|
46
|
-
export async function getL1BlockTime(publicClient, blockNumber) {
|
|
47
|
-
const block = await publicClient.getBlock({ blockNumber, includeTransactions: false });
|
|
48
|
-
return block.timestamp;
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Gets block from the calldata of an L1 transaction.
|
|
52
|
-
* Assumes that the block was published from an EOA.
|
|
53
|
-
* TODO: Add retries and error management.
|
|
54
|
-
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
55
|
-
* @param txHash - Hash of the tx that published it.
|
|
56
|
-
* @param l2BlockNum - L2 block number.
|
|
57
|
-
* @returns L2 block from the calldata, deserialized
|
|
58
|
-
*/
|
|
59
|
-
async function getBlockFromRollupTx(publicClient, txHash, l2BlockNum) {
|
|
60
|
-
const { input: data } = await publicClient.getTransaction({ hash: txHash });
|
|
61
|
-
const { functionName, args } = decodeFunctionData({
|
|
62
|
-
abi: RollupAbi,
|
|
63
|
-
data,
|
|
64
|
-
});
|
|
65
|
-
if (!(functionName === 'propose')) {
|
|
66
|
-
throw new Error(`Unexpected method called ${functionName}`);
|
|
67
|
-
}
|
|
68
|
-
const [headerHex, archiveRootHex, , , , bodyHex] = args;
|
|
69
|
-
const header = Header.fromBuffer(Buffer.from(hexToBytes(headerHex)));
|
|
70
|
-
const blockBody = Body.fromBuffer(Buffer.from(hexToBytes(bodyHex)));
|
|
71
|
-
const blockNumberFromHeader = header.globalVariables.blockNumber.toBigInt();
|
|
72
|
-
if (blockNumberFromHeader !== l2BlockNum) {
|
|
73
|
-
throw new Error(`Block number mismatch: expected ${l2BlockNum} but got ${blockNumberFromHeader}`);
|
|
74
|
-
}
|
|
75
|
-
const archive = AppendOnlyTreeSnapshot.fromBuffer(Buffer.concat([
|
|
76
|
-
Buffer.from(hexToBytes(archiveRootHex)), // L2Block.archive.root
|
|
77
|
-
numToUInt32BE(Number(l2BlockNum)), // L2Block.archive.nextAvailableLeafIndex
|
|
78
|
-
]));
|
|
79
|
-
return new L2Block(archive, header, blockBody);
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Gets relevant `L2BlockProposed` logs from chain.
|
|
83
|
-
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
84
|
-
* @param rollupAddress - The address of the rollup contract.
|
|
85
|
-
* @param fromBlock - First block to get logs from (inclusive).
|
|
86
|
-
* @param toBlock - Last block to get logs from (inclusive).
|
|
87
|
-
* @returns An array of `L2BlockProposed` logs.
|
|
88
|
-
*/
|
|
89
|
-
export function getL2BlockProposedLogs(publicClient, rollupAddress, fromBlock, toBlock) {
|
|
90
|
-
return publicClient.getLogs({
|
|
91
|
-
address: getAddress(rollupAddress.toString()),
|
|
92
|
-
event: getAbiItem({
|
|
93
|
-
abi: RollupAbi,
|
|
94
|
-
name: 'L2BlockProposed',
|
|
95
|
-
}),
|
|
96
|
-
fromBlock,
|
|
97
|
-
toBlock: toBlock + 1n, // the toBlock argument in getLogs is exclusive
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Get relevant `MessageSent` logs emitted by Inbox on chain.
|
|
102
|
-
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
103
|
-
* @param inboxAddress - The address of the inbox contract.
|
|
104
|
-
* @param fromBlock - First block to get logs from (inclusive).
|
|
105
|
-
* @param toBlock - Last block to get logs from (inclusive).
|
|
106
|
-
* @returns An array of `MessageSent` logs.
|
|
107
|
-
*/
|
|
108
|
-
export function getMessageSentLogs(publicClient, inboxAddress, fromBlock, toBlock) {
|
|
109
|
-
return publicClient.getLogs({
|
|
110
|
-
address: getAddress(inboxAddress.toString()),
|
|
111
|
-
event: getAbiItem({
|
|
112
|
-
abi: InboxAbi,
|
|
113
|
-
name: 'MessageSent',
|
|
114
|
-
}),
|
|
115
|
-
fromBlock,
|
|
116
|
-
toBlock: toBlock + 1n, // the toBlock argument in getLogs is exclusive
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* Gets block metadata (header and archive snapshot) from the calldata of an L1 transaction.
|
|
121
|
-
* Assumes that the block was published from an EOA.
|
|
122
|
-
* TODO: Add retries and error management.
|
|
123
|
-
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
124
|
-
* @param txHash - Hash of the tx that published it.
|
|
125
|
-
* @param l2BlockNum - L2 block number.
|
|
126
|
-
* @returns L2 block metadata (header and archive) from the calldata, deserialized
|
|
127
|
-
*/
|
|
128
|
-
export async function getBlockProofFromSubmitProofTx(publicClient, txHash, l2BlockNum, expectedProverId) {
|
|
129
|
-
const { input: data } = await publicClient.getTransaction({ hash: txHash });
|
|
130
|
-
const { functionName, args } = decodeFunctionData({
|
|
131
|
-
abi: RollupAbi,
|
|
132
|
-
data,
|
|
133
|
-
});
|
|
134
|
-
if (!(functionName === 'submitBlockRootProof')) {
|
|
135
|
-
throw new Error(`Unexpected method called ${functionName}`);
|
|
136
|
-
}
|
|
137
|
-
const [headerHex, archiveHex, proverIdHex, aggregationObjectHex, proofHex] = args;
|
|
138
|
-
const header = Header.fromBuffer(Buffer.from(hexToBytes(headerHex)));
|
|
139
|
-
const proverId = Fr.fromString(proverIdHex);
|
|
140
|
-
const blockNumberFromHeader = header.globalVariables.blockNumber.toBigInt();
|
|
141
|
-
if (blockNumberFromHeader !== l2BlockNum) {
|
|
142
|
-
throw new Error(`Block number mismatch: expected ${l2BlockNum} but got ${blockNumberFromHeader}`);
|
|
143
|
-
}
|
|
144
|
-
if (!proverId.equals(expectedProverId)) {
|
|
145
|
-
throw new Error(`Prover ID mismatch: expected ${expectedProverId} but got ${proverId}`);
|
|
146
|
-
}
|
|
147
|
-
return {
|
|
148
|
-
header,
|
|
149
|
-
proverId,
|
|
150
|
-
aggregationObject: Buffer.from(hexToBytes(aggregationObjectHex)),
|
|
151
|
-
archiveRoot: Fr.fromString(archiveHex),
|
|
152
|
-
proof: Proof.fromBuffer(Buffer.from(hexToBytes(proofHex))),
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXRoX2xvZ19oYW5kbGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcmNoaXZlci9ldGhfbG9nX2hhbmRsZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBc0IsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTNFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUUxRCxPQUFPLEVBQXlDLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSXJIOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQ3BDLElBQW1GO0lBRW5GLE1BQU0sTUFBTSxHQUFnQixFQUFFLENBQUM7SUFDL0IsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixNQUFNLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsYUFBYSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsMEJBQTBCLENBQzlDLFlBQTBCLEVBQzFCLHFCQUE2QixFQUM3QixJQUF3RjtJ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
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
-
import { Body } from '@aztec/circuit-types';
|
|
3
|
-
import { type AztecKVStore } from '@aztec/kv-store';
|
|
4
|
-
import { type DataRetrieval } from '../structs/data_retrieval.js';
|
|
5
|
-
export declare class BlockBodyStore {
|
|
6
|
-
#private;
|
|
7
|
-
private db;
|
|
8
|
-
private log;
|
|
9
|
-
constructor(db: AztecKVStore, log?: import("@aztec/foundation/log").Logger);
|
|
10
|
-
/**
|
|
11
|
-
* Append new block bodies to the store's map.
|
|
12
|
-
* @param blockBodies - The L2 block bodies to be added to the store.
|
|
13
|
-
* @returns True if the operation is successful.
|
|
14
|
-
*/
|
|
15
|
-
addBlockBodies(blockBodies: DataRetrieval<Body>): Promise<boolean>;
|
|
16
|
-
/**
|
|
17
|
-
* Gets a list of L2 block bodies with its associated txsEffectsHashes
|
|
18
|
-
* @param txsEffectsHashes - The txsEffectsHashes list that corresponds to the blockBodies we want to retrieve
|
|
19
|
-
* @returns The requested L2 block bodies
|
|
20
|
-
*/
|
|
21
|
-
getBlockBodies(txsEffectsHashes: Buffer[]): Promise<(Body | undefined)[]>;
|
|
22
|
-
/**
|
|
23
|
-
* Gets an L2 block body.
|
|
24
|
-
* @param txsEffectsHash - The txHash of the block body to return
|
|
25
|
-
* @returns The requested L2 block body
|
|
26
|
-
*/
|
|
27
|
-
getBlockBody(txsEffectsHash: Buffer): Body | undefined;
|
|
28
|
-
/**
|
|
29
|
-
* Gets the last L1 block number in which a L2 block body was included
|
|
30
|
-
* @returns The L1 block number
|
|
31
|
-
*/
|
|
32
|
-
getSynchedL1BlockNumber(): bigint | undefined;
|
|
33
|
-
}
|
|
34
|
-
//# sourceMappingURL=block_body_store.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"block_body_store.d.ts","sourceRoot":"","sources":["../../../src/archiver/kv_archiver_store/block_body_store.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE5C,OAAO,EAAE,KAAK,YAAY,EAAsC,MAAM,iBAAiB,CAAC;AAExF,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,qBAAa,cAAc;;IAOb,OAAO,CAAC,EAAE;IAAgB,OAAO,CAAC,GAAG;gBAA7B,EAAE,EAAE,YAAY,EAAU,GAAG,yCAAuD;IAKxG;;;;OAIG;IACH,cAAc,CAAC,WAAW,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAUlE;;;;OAIG;IACG,cAAc,CAAC,gBAAgB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC;IAiB/E;;;;OAIG;IACH,YAAY,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAMtD;;;OAGG;IACH,uBAAuB,IAAI,MAAM,GAAG,SAAS;CAG9C"}
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
var _BlockBodyStore_blockBodies, _BlockBodyStore_lastSynchedL1Block;
|
|
2
|
-
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
|
-
import { Body } from '@aztec/circuit-types';
|
|
4
|
-
import { createDebugLogger } from '@aztec/foundation/log';
|
|
5
|
-
export class BlockBodyStore {
|
|
6
|
-
constructor(db, log = createDebugLogger('aztec:archiver:block_body_store')) {
|
|
7
|
-
this.db = db;
|
|
8
|
-
this.log = log;
|
|
9
|
-
/** Map block body hash to block body */
|
|
10
|
-
_BlockBodyStore_blockBodies.set(this, void 0);
|
|
11
|
-
/** Stores L1 block number in which the last processed L2 block body was included */
|
|
12
|
-
_BlockBodyStore_lastSynchedL1Block.set(this, void 0);
|
|
13
|
-
__classPrivateFieldSet(this, _BlockBodyStore_blockBodies, db.openMap('archiver_block_bodies'), "f");
|
|
14
|
-
__classPrivateFieldSet(this, _BlockBodyStore_lastSynchedL1Block, db.openSingleton('archiver_block_bodies_last_synched_l1_block'), "f");
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Append new block bodies to the store's map.
|
|
18
|
-
* @param blockBodies - The L2 block bodies to be added to the store.
|
|
19
|
-
* @returns True if the operation is successful.
|
|
20
|
-
*/
|
|
21
|
-
addBlockBodies(blockBodies) {
|
|
22
|
-
return this.db.transaction(() => {
|
|
23
|
-
for (const body of blockBodies.retrievedData) {
|
|
24
|
-
void __classPrivateFieldGet(this, _BlockBodyStore_blockBodies, "f").set(body.getTxsEffectsHash().toString('hex'), body.toBuffer());
|
|
25
|
-
}
|
|
26
|
-
void __classPrivateFieldGet(this, _BlockBodyStore_lastSynchedL1Block, "f").set(blockBodies.lastProcessedL1BlockNumber);
|
|
27
|
-
return true;
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Gets a list of L2 block bodies with its associated txsEffectsHashes
|
|
32
|
-
* @param txsEffectsHashes - The txsEffectsHashes list that corresponds to the blockBodies we want to retrieve
|
|
33
|
-
* @returns The requested L2 block bodies
|
|
34
|
-
*/
|
|
35
|
-
async getBlockBodies(txsEffectsHashes) {
|
|
36
|
-
const blockBodiesBuffer = await this.db.transaction(() => txsEffectsHashes.map(txsEffectsHash => __classPrivateFieldGet(this, _BlockBodyStore_blockBodies, "f").get(txsEffectsHash.toString('hex'))));
|
|
37
|
-
const blockBodies = [];
|
|
38
|
-
for (let i = 0; i < blockBodiesBuffer.length; i++) {
|
|
39
|
-
const blockBodyBuffer = blockBodiesBuffer[i];
|
|
40
|
-
if (blockBodyBuffer === undefined) {
|
|
41
|
-
this.log.warn(`Block body buffer is undefined for txsEffectsHash: ${txsEffectsHashes[i].toString('hex')}`);
|
|
42
|
-
}
|
|
43
|
-
blockBodies.push(blockBodyBuffer ? Body.fromBuffer(blockBodyBuffer) : undefined);
|
|
44
|
-
}
|
|
45
|
-
return blockBodies;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Gets an L2 block body.
|
|
49
|
-
* @param txsEffectsHash - The txHash of the block body to return
|
|
50
|
-
* @returns The requested L2 block body
|
|
51
|
-
*/
|
|
52
|
-
getBlockBody(txsEffectsHash) {
|
|
53
|
-
const blockBody = __classPrivateFieldGet(this, _BlockBodyStore_blockBodies, "f").get(txsEffectsHash.toString('hex'));
|
|
54
|
-
return blockBody && Body.fromBuffer(blockBody);
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Gets the last L1 block number in which a L2 block body was included
|
|
58
|
-
* @returns The L1 block number
|
|
59
|
-
*/
|
|
60
|
-
getSynchedL1BlockNumber() {
|
|
61
|
-
return __classPrivateFieldGet(this, _BlockBodyStore_lastSynchedL1Block, "f").get();
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
_BlockBodyStore_blockBodies = new WeakMap(), _BlockBodyStore_lastSynchedL1Block = new WeakMap();
|
|
65
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tfYm9keV9zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcmNoaXZlci9rdl9hcmNoaXZlcl9zdG9yZS9ibG9ja19ib2R5X3N0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBSzFELE1BQU0sT0FBTyxjQUFjO0lBT3pCLFlBQW9CLEVBQWdCLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQyxpQ0FBaUMsQ0FBQztRQUFwRixPQUFFLEdBQUYsRUFBRSxDQUFjO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBdUQ7UUFOeEcsd0NBQXdDO1FBQ3hDLDhDQUF1QztRQUV2QyxvRkFBb0Y7UUFDcEYscURBQTRDO1FBRzFDLHVCQUFBLElBQUksK0JBQWdCLEVBQUUsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsTUFBQSxDQUFDO1FBQ3hELHVCQUFBLElBQUksc0NBQXVCLEVBQUUsQ0FBQyxhQUFhLENBQUMsNkNBQTZDLENBQUMsTUFBQSxDQUFDO0lBQzdGLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsY0FBYyxDQUFDLFdBQWdDO1FBQzdDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQzlCLEtBQUssTUFBTSxJQUFJLElBQUksV0FBVyxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUM3QyxLQUFLLHVCQUFBLElBQUksbUNBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ3hGLENBQUM7WUFDRCxLQUFLLHVCQUFBLElBQUksMENBQW9CLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1lBQzFFLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxjQUFjLENBQUMsZ0JBQTBCO1FBQzdDLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FDdkQsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsdUJBQUEsSUFBSSxtQ0FBYSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FDOUYsQ0FBQztRQUVGLE1BQU0sV0FBVyxHQUF5QixFQUFFLENBQUM7UUFDN0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2xELE1BQU0sZUFBZSxHQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdDLElBQUksZUFBZSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxzREFBc0QsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM3RyxDQUFDO1lBQ0QsV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ25GLENBQUM7UUFFRCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFlBQVksQ0FBQyxjQUFzQjtRQUNqQyxNQUFNLFNBQVMsR0FBRyx1QkFBQSxJQUFJLG1DQUFhLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUV4RSxPQUFPLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7O09BR0c7SUFDSCx1QkFBdUI7UUFDckIsT0FBTyx1QkFBQSxJQUFJLDBDQUFvQixDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3hDLENBQUM7Q0FDRiJ9
|
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
import { Body, InboxLeaf, L2Block, type ViemSignature } from '@aztec/circuit-types';
|
|
2
|
-
import { AppendOnlyTreeSnapshot, Header, Proof } from '@aztec/circuits.js';
|
|
3
|
-
import { type EthAddress } from '@aztec/foundation/eth-address';
|
|
4
|
-
import { Fr } from '@aztec/foundation/fields';
|
|
5
|
-
import { numToUInt32BE } from '@aztec/foundation/serialize';
|
|
6
|
-
import { InboxAbi, RollupAbi } from '@aztec/l1-artifacts';
|
|
7
|
-
|
|
8
|
-
import { type Hex, type Log, type PublicClient, decodeFunctionData, getAbiItem, getAddress, hexToBytes } from 'viem';
|
|
9
|
-
|
|
10
|
-
import { type L1Published, type L1PublishedData } from './structs/published.js';
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Processes newly received MessageSent (L1 to L2) logs.
|
|
14
|
-
* @param logs - MessageSent logs.
|
|
15
|
-
* @returns Array of all processed MessageSent logs
|
|
16
|
-
*/
|
|
17
|
-
export function processMessageSentLogs(
|
|
18
|
-
logs: Log<bigint, number, false, undefined, true, typeof InboxAbi, 'MessageSent'>[],
|
|
19
|
-
): InboxLeaf[] {
|
|
20
|
-
const leaves: InboxLeaf[] = [];
|
|
21
|
-
for (const log of logs) {
|
|
22
|
-
const { l2BlockNumber, index, hash } = log.args;
|
|
23
|
-
leaves.push(new InboxLeaf(l2BlockNumber, index, Fr.fromString(hash)));
|
|
24
|
-
}
|
|
25
|
-
return leaves;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Processes newly received L2BlockProposed logs.
|
|
30
|
-
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
31
|
-
* @param expectedL2BlockNumber - The next expected L2 block number.
|
|
32
|
-
* @param logs - L2BlockProposed logs.
|
|
33
|
-
* @returns - An array blocks.
|
|
34
|
-
*/
|
|
35
|
-
export async function processL2BlockProposedLogs(
|
|
36
|
-
publicClient: PublicClient,
|
|
37
|
-
expectedL2BlockNumber: bigint,
|
|
38
|
-
logs: Log<bigint, number, false, undefined, true, typeof RollupAbi, 'L2BlockProposed'>[],
|
|
39
|
-
): Promise<L1Published<L2Block>[]> {
|
|
40
|
-
const retrievedBlocks: L1Published<L2Block>[] = [];
|
|
41
|
-
for (const log of logs) {
|
|
42
|
-
const blockNum = log.args.blockNumber;
|
|
43
|
-
if (blockNum !== expectedL2BlockNumber) {
|
|
44
|
-
throw new Error('Block number mismatch. Expected: ' + expectedL2BlockNumber + ' but got: ' + blockNum + '.');
|
|
45
|
-
}
|
|
46
|
-
// TODO: Fetch blocks from calldata in parallel
|
|
47
|
-
const block = await getBlockFromRollupTx(publicClient, log.transactionHash!, log.args.blockNumber);
|
|
48
|
-
|
|
49
|
-
const l1: L1PublishedData = {
|
|
50
|
-
blockNumber: log.blockNumber,
|
|
51
|
-
blockHash: log.blockHash,
|
|
52
|
-
timestamp: await getL1BlockTime(publicClient, log.blockNumber),
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
retrievedBlocks.push({ data: block, l1 });
|
|
56
|
-
expectedL2BlockNumber++;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
return retrievedBlocks;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export async function getL1BlockTime(publicClient: PublicClient, blockNumber: bigint): Promise<bigint> {
|
|
63
|
-
const block = await publicClient.getBlock({ blockNumber, includeTransactions: false });
|
|
64
|
-
return block.timestamp;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Gets block from the calldata of an L1 transaction.
|
|
69
|
-
* Assumes that the block was published from an EOA.
|
|
70
|
-
* TODO: Add retries and error management.
|
|
71
|
-
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
72
|
-
* @param txHash - Hash of the tx that published it.
|
|
73
|
-
* @param l2BlockNum - L2 block number.
|
|
74
|
-
* @returns L2 block from the calldata, deserialized
|
|
75
|
-
*/
|
|
76
|
-
async function getBlockFromRollupTx(
|
|
77
|
-
publicClient: PublicClient,
|
|
78
|
-
txHash: `0x${string}`,
|
|
79
|
-
l2BlockNum: bigint,
|
|
80
|
-
): Promise<L2Block> {
|
|
81
|
-
const { input: data } = await publicClient.getTransaction({ hash: txHash });
|
|
82
|
-
const { functionName, args } = decodeFunctionData({
|
|
83
|
-
abi: RollupAbi,
|
|
84
|
-
data,
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
if (!(functionName === 'propose')) {
|
|
88
|
-
throw new Error(`Unexpected method called ${functionName}`);
|
|
89
|
-
}
|
|
90
|
-
const [headerHex, archiveRootHex, , , , bodyHex] = args! as readonly [Hex, Hex, Hex, Hex[], ViemSignature[], Hex];
|
|
91
|
-
|
|
92
|
-
const header = Header.fromBuffer(Buffer.from(hexToBytes(headerHex)));
|
|
93
|
-
const blockBody = Body.fromBuffer(Buffer.from(hexToBytes(bodyHex)));
|
|
94
|
-
|
|
95
|
-
const blockNumberFromHeader = header.globalVariables.blockNumber.toBigInt();
|
|
96
|
-
|
|
97
|
-
if (blockNumberFromHeader !== l2BlockNum) {
|
|
98
|
-
throw new Error(`Block number mismatch: expected ${l2BlockNum} but got ${blockNumberFromHeader}`);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
const archive = AppendOnlyTreeSnapshot.fromBuffer(
|
|
102
|
-
Buffer.concat([
|
|
103
|
-
Buffer.from(hexToBytes(archiveRootHex)), // L2Block.archive.root
|
|
104
|
-
numToUInt32BE(Number(l2BlockNum)), // L2Block.archive.nextAvailableLeafIndex
|
|
105
|
-
]),
|
|
106
|
-
);
|
|
107
|
-
|
|
108
|
-
return new L2Block(archive, header, blockBody);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* Gets relevant `L2BlockProposed` logs from chain.
|
|
113
|
-
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
114
|
-
* @param rollupAddress - The address of the rollup contract.
|
|
115
|
-
* @param fromBlock - First block to get logs from (inclusive).
|
|
116
|
-
* @param toBlock - Last block to get logs from (inclusive).
|
|
117
|
-
* @returns An array of `L2BlockProposed` logs.
|
|
118
|
-
*/
|
|
119
|
-
export function getL2BlockProposedLogs(
|
|
120
|
-
publicClient: PublicClient,
|
|
121
|
-
rollupAddress: EthAddress,
|
|
122
|
-
fromBlock: bigint,
|
|
123
|
-
toBlock: bigint,
|
|
124
|
-
): Promise<Log<bigint, number, false, undefined, true, typeof RollupAbi, 'L2BlockProposed'>[]> {
|
|
125
|
-
return publicClient.getLogs({
|
|
126
|
-
address: getAddress(rollupAddress.toString()),
|
|
127
|
-
event: getAbiItem({
|
|
128
|
-
abi: RollupAbi,
|
|
129
|
-
name: 'L2BlockProposed',
|
|
130
|
-
}),
|
|
131
|
-
fromBlock,
|
|
132
|
-
toBlock: toBlock + 1n, // the toBlock argument in getLogs is exclusive
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* Get relevant `MessageSent` logs emitted by Inbox on chain.
|
|
138
|
-
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
139
|
-
* @param inboxAddress - The address of the inbox contract.
|
|
140
|
-
* @param fromBlock - First block to get logs from (inclusive).
|
|
141
|
-
* @param toBlock - Last block to get logs from (inclusive).
|
|
142
|
-
* @returns An array of `MessageSent` logs.
|
|
143
|
-
*/
|
|
144
|
-
export function getMessageSentLogs(
|
|
145
|
-
publicClient: PublicClient,
|
|
146
|
-
inboxAddress: EthAddress,
|
|
147
|
-
fromBlock: bigint,
|
|
148
|
-
toBlock: bigint,
|
|
149
|
-
): Promise<Log<bigint, number, false, undefined, true, typeof InboxAbi, 'MessageSent'>[]> {
|
|
150
|
-
return publicClient.getLogs({
|
|
151
|
-
address: getAddress(inboxAddress.toString()),
|
|
152
|
-
event: getAbiItem({
|
|
153
|
-
abi: InboxAbi,
|
|
154
|
-
name: 'MessageSent',
|
|
155
|
-
}),
|
|
156
|
-
fromBlock,
|
|
157
|
-
toBlock: toBlock + 1n, // the toBlock argument in getLogs is exclusive
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
export type SubmitBlockProof = {
|
|
162
|
-
header: Header;
|
|
163
|
-
archiveRoot: Fr;
|
|
164
|
-
proverId: Fr;
|
|
165
|
-
aggregationObject: Buffer;
|
|
166
|
-
proof: Proof;
|
|
167
|
-
};
|
|
168
|
-
|
|
169
|
-
/**
|
|
170
|
-
* Gets block metadata (header and archive snapshot) from the calldata of an L1 transaction.
|
|
171
|
-
* Assumes that the block was published from an EOA.
|
|
172
|
-
* TODO: Add retries and error management.
|
|
173
|
-
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
174
|
-
* @param txHash - Hash of the tx that published it.
|
|
175
|
-
* @param l2BlockNum - L2 block number.
|
|
176
|
-
* @returns L2 block metadata (header and archive) from the calldata, deserialized
|
|
177
|
-
*/
|
|
178
|
-
export async function getBlockProofFromSubmitProofTx(
|
|
179
|
-
publicClient: PublicClient,
|
|
180
|
-
txHash: `0x${string}`,
|
|
181
|
-
l2BlockNum: bigint,
|
|
182
|
-
expectedProverId: Fr,
|
|
183
|
-
): Promise<SubmitBlockProof> {
|
|
184
|
-
const { input: data } = await publicClient.getTransaction({ hash: txHash });
|
|
185
|
-
const { functionName, args } = decodeFunctionData({
|
|
186
|
-
abi: RollupAbi,
|
|
187
|
-
data,
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
if (!(functionName === 'submitBlockRootProof')) {
|
|
191
|
-
throw new Error(`Unexpected method called ${functionName}`);
|
|
192
|
-
}
|
|
193
|
-
const [headerHex, archiveHex, proverIdHex, aggregationObjectHex, proofHex] = args!;
|
|
194
|
-
|
|
195
|
-
const header = Header.fromBuffer(Buffer.from(hexToBytes(headerHex)));
|
|
196
|
-
const proverId = Fr.fromString(proverIdHex);
|
|
197
|
-
|
|
198
|
-
const blockNumberFromHeader = header.globalVariables.blockNumber.toBigInt();
|
|
199
|
-
if (blockNumberFromHeader !== l2BlockNum) {
|
|
200
|
-
throw new Error(`Block number mismatch: expected ${l2BlockNum} but got ${blockNumberFromHeader}`);
|
|
201
|
-
}
|
|
202
|
-
if (!proverId.equals(expectedProverId)) {
|
|
203
|
-
throw new Error(`Prover ID mismatch: expected ${expectedProverId} but got ${proverId}`);
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
return {
|
|
207
|
-
header,
|
|
208
|
-
proverId,
|
|
209
|
-
aggregationObject: Buffer.from(hexToBytes(aggregationObjectHex)),
|
|
210
|
-
archiveRoot: Fr.fromString(archiveHex),
|
|
211
|
-
proof: Proof.fromBuffer(Buffer.from(hexToBytes(proofHex))),
|
|
212
|
-
};
|
|
213
|
-
}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { Body } from '@aztec/circuit-types';
|
|
2
|
-
import { createDebugLogger } from '@aztec/foundation/log';
|
|
3
|
-
import { type AztecKVStore, type AztecMap, type AztecSingleton } from '@aztec/kv-store';
|
|
4
|
-
|
|
5
|
-
import { type DataRetrieval } from '../structs/data_retrieval.js';
|
|
6
|
-
|
|
7
|
-
export class BlockBodyStore {
|
|
8
|
-
/** Map block body hash to block body */
|
|
9
|
-
#blockBodies: AztecMap<string, Buffer>;
|
|
10
|
-
|
|
11
|
-
/** Stores L1 block number in which the last processed L2 block body was included */
|
|
12
|
-
#lastSynchedL1Block: AztecSingleton<bigint>;
|
|
13
|
-
|
|
14
|
-
constructor(private db: AztecKVStore, private log = createDebugLogger('aztec:archiver:block_body_store')) {
|
|
15
|
-
this.#blockBodies = db.openMap('archiver_block_bodies');
|
|
16
|
-
this.#lastSynchedL1Block = db.openSingleton('archiver_block_bodies_last_synched_l1_block');
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Append new block bodies to the store's map.
|
|
21
|
-
* @param blockBodies - The L2 block bodies to be added to the store.
|
|
22
|
-
* @returns True if the operation is successful.
|
|
23
|
-
*/
|
|
24
|
-
addBlockBodies(blockBodies: DataRetrieval<Body>): Promise<boolean> {
|
|
25
|
-
return this.db.transaction(() => {
|
|
26
|
-
for (const body of blockBodies.retrievedData) {
|
|
27
|
-
void this.#blockBodies.set(body.getTxsEffectsHash().toString('hex'), body.toBuffer());
|
|
28
|
-
}
|
|
29
|
-
void this.#lastSynchedL1Block.set(blockBodies.lastProcessedL1BlockNumber);
|
|
30
|
-
return true;
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Gets a list of L2 block bodies with its associated txsEffectsHashes
|
|
36
|
-
* @param txsEffectsHashes - The txsEffectsHashes list that corresponds to the blockBodies we want to retrieve
|
|
37
|
-
* @returns The requested L2 block bodies
|
|
38
|
-
*/
|
|
39
|
-
async getBlockBodies(txsEffectsHashes: Buffer[]): Promise<(Body | undefined)[]> {
|
|
40
|
-
const blockBodiesBuffer = await this.db.transaction(() =>
|
|
41
|
-
txsEffectsHashes.map(txsEffectsHash => this.#blockBodies.get(txsEffectsHash.toString('hex'))),
|
|
42
|
-
);
|
|
43
|
-
|
|
44
|
-
const blockBodies: (Body | undefined)[] = [];
|
|
45
|
-
for (let i = 0; i < blockBodiesBuffer.length; i++) {
|
|
46
|
-
const blockBodyBuffer = blockBodiesBuffer[i];
|
|
47
|
-
if (blockBodyBuffer === undefined) {
|
|
48
|
-
this.log.warn(`Block body buffer is undefined for txsEffectsHash: ${txsEffectsHashes[i].toString('hex')}`);
|
|
49
|
-
}
|
|
50
|
-
blockBodies.push(blockBodyBuffer ? Body.fromBuffer(blockBodyBuffer) : undefined);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
return blockBodies;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Gets an L2 block body.
|
|
58
|
-
* @param txsEffectsHash - The txHash of the block body to return
|
|
59
|
-
* @returns The requested L2 block body
|
|
60
|
-
*/
|
|
61
|
-
getBlockBody(txsEffectsHash: Buffer): Body | undefined {
|
|
62
|
-
const blockBody = this.#blockBodies.get(txsEffectsHash.toString('hex'));
|
|
63
|
-
|
|
64
|
-
return blockBody && Body.fromBuffer(blockBody);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Gets the last L1 block number in which a L2 block body was included
|
|
69
|
-
* @returns The L1 block number
|
|
70
|
-
*/
|
|
71
|
-
getSynchedL1BlockNumber(): bigint | undefined {
|
|
72
|
-
return this.#lastSynchedL1Block.get();
|
|
73
|
-
}
|
|
74
|
-
}
|