@aztec/archiver 0.7.10 → 0.8.6
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 -1
- package/dest/archiver/archiver.d.ts.map +1 -1
- package/dest/archiver/archiver.js +38 -7
- package/dest/archiver/config.d.ts +10 -2
- package/dest/archiver/config.d.ts.map +1 -1
- package/dest/archiver/config.js +15 -7
- package/dest/archiver/data_retrieval.d.ts +8 -8
- package/dest/archiver/data_retrieval.d.ts.map +1 -1
- package/dest/archiver/data_retrieval.js +21 -21
- package/dest/archiver/eth_log_handlers.d.ts +8 -4
- package/dest/archiver/eth_log_handlers.d.ts.map +1 -1
- package/dest/archiver/eth_log_handlers.js +13 -5
- package/dest/index.js +3 -3
- package/package.json +60 -7
- package/src/archiver/archiver.ts +41 -7
- package/src/archiver/config.ts +27 -7
- package/src/archiver/data_retrieval.ts +30 -18
- package/src/archiver/eth_log_handlers.ts +12 -0
- package/src/index.ts +5 -4
- package/.eslintrc.cjs +0 -1
- package/.tsbuildinfo +0 -1
- package/dest/archiver/archiver.test.d.ts +0 -2
- package/dest/archiver/archiver.test.d.ts.map +0 -1
- package/dest/archiver/archiver.test.js +0 -184
- package/dest/archiver/archiver_store.test.d.ts +0 -2
- package/dest/archiver/archiver_store.test.d.ts.map +0 -1
- package/dest/archiver/archiver_store.test.js +0 -61
- package/dest/archiver/l1_to_l2_message_store.test.d.ts +0 -2
- package/dest/archiver/l1_to_l2_message_store.test.d.ts.map +0 -1
- package/dest/archiver/l1_to_l2_message_store.test.js +0 -77
- package/src/archiver/archiver.test.ts +0 -223
- package/src/archiver/archiver_store.test.ts +0 -74
- package/src/archiver/l1_to_l2_message_store.test.ts +0 -98
- package/tsconfig.json +0 -26
|
@@ -79,9 +79,10 @@ async function getBlockFromCallData(publicClient, txHash, l2BlockNum) {
|
|
|
79
79
|
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
80
80
|
* @param rollupAddress - The address of the rollup contract.
|
|
81
81
|
* @param fromBlock - First block to get logs from (inclusive).
|
|
82
|
+
* @param toBlock - Last block to get logs from (inclusive).
|
|
82
83
|
* @returns An array of `L2BlockProcessed` logs.
|
|
83
84
|
*/
|
|
84
|
-
export async function getL2BlockProcessedLogs(publicClient, rollupAddress, fromBlock) {
|
|
85
|
+
export async function getL2BlockProcessedLogs(publicClient, rollupAddress, fromBlock, toBlock) {
|
|
85
86
|
// Note: For some reason the return type of `getLogs` would not get correctly derived if I didn't set the abiItem
|
|
86
87
|
// as a standalone constant.
|
|
87
88
|
const abiItem = getAbiItem({
|
|
@@ -92,6 +93,7 @@ export async function getL2BlockProcessedLogs(publicClient, rollupAddress, fromB
|
|
|
92
93
|
address: getAddress(rollupAddress.toString()),
|
|
93
94
|
event: abiItem,
|
|
94
95
|
fromBlock,
|
|
96
|
+
toBlock: toBlock + 1n, // the toBlock argument in getLogs is exclusive
|
|
95
97
|
});
|
|
96
98
|
}
|
|
97
99
|
/**
|
|
@@ -99,9 +101,10 @@ export async function getL2BlockProcessedLogs(publicClient, rollupAddress, fromB
|
|
|
99
101
|
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
100
102
|
* @param contractDeploymentEmitterAddress - The address of the L2 contract deployment emitter contract.
|
|
101
103
|
* @param fromBlock - First block to get logs from (inclusive).
|
|
104
|
+
* @param toBlock - Last block to get logs from (inclusive).
|
|
102
105
|
* @returns An array of `ContractDeployment` logs.
|
|
103
106
|
*/
|
|
104
|
-
export async function getContractDeploymentLogs(publicClient, contractDeploymentEmitterAddress, fromBlock) {
|
|
107
|
+
export async function getContractDeploymentLogs(publicClient, contractDeploymentEmitterAddress, fromBlock, toBlock) {
|
|
105
108
|
const abiItem = getAbiItem({
|
|
106
109
|
abi: ContractDeploymentEmitterAbi,
|
|
107
110
|
name: 'ContractDeployment',
|
|
@@ -110,6 +113,7 @@ export async function getContractDeploymentLogs(publicClient, contractDeployment
|
|
|
110
113
|
address: getAddress(contractDeploymentEmitterAddress.toString()),
|
|
111
114
|
event: abiItem,
|
|
112
115
|
fromBlock,
|
|
116
|
+
toBlock: toBlock + 1n, // the toBlock argument in getLogs is exclusive
|
|
113
117
|
});
|
|
114
118
|
}
|
|
115
119
|
/**
|
|
@@ -146,9 +150,10 @@ export function processContractDeploymentLogs(blockHashMapping, logs) {
|
|
|
146
150
|
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
147
151
|
* @param inboxAddress - The address of the inbox contract.
|
|
148
152
|
* @param fromBlock - First block to get logs from (inclusive).
|
|
153
|
+
* @param toBlock - Last block to get logs from (inclusive).
|
|
149
154
|
* @returns An array of `MessageAdded` logs.
|
|
150
155
|
*/
|
|
151
|
-
export async function getPendingL1ToL2MessageLogs(publicClient, inboxAddress, fromBlock) {
|
|
156
|
+
export async function getPendingL1ToL2MessageLogs(publicClient, inboxAddress, fromBlock, toBlock) {
|
|
152
157
|
const abiItem = getAbiItem({
|
|
153
158
|
abi: InboxAbi,
|
|
154
159
|
name: 'MessageAdded',
|
|
@@ -157,6 +162,7 @@ export async function getPendingL1ToL2MessageLogs(publicClient, inboxAddress, fr
|
|
|
157
162
|
address: getAddress(inboxAddress.toString()),
|
|
158
163
|
event: abiItem,
|
|
159
164
|
fromBlock,
|
|
165
|
+
toBlock: toBlock + 1n, // the toBlock argument in getLogs is exclusive
|
|
160
166
|
});
|
|
161
167
|
}
|
|
162
168
|
/**
|
|
@@ -164,9 +170,10 @@ export async function getPendingL1ToL2MessageLogs(publicClient, inboxAddress, fr
|
|
|
164
170
|
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
165
171
|
* @param inboxAddress - The address of the inbox contract.
|
|
166
172
|
* @param fromBlock - First block to get logs from (inclusive).
|
|
173
|
+
* @param toBlock - Last block to get logs from (inclusive).
|
|
167
174
|
* @returns An array of `L1ToL2MessageCancelled` logs.
|
|
168
175
|
*/
|
|
169
|
-
export async function getL1ToL2MessageCancelledLogs(publicClient, inboxAddress, fromBlock) {
|
|
176
|
+
export async function getL1ToL2MessageCancelledLogs(publicClient, inboxAddress, fromBlock, toBlock) {
|
|
170
177
|
const abiItem = getAbiItem({
|
|
171
178
|
abi: InboxAbi,
|
|
172
179
|
name: 'L1ToL2MessageCancelled',
|
|
@@ -175,6 +182,7 @@ export async function getL1ToL2MessageCancelledLogs(publicClient, inboxAddress,
|
|
|
175
182
|
address: getAddress(inboxAddress.toString()),
|
|
176
183
|
event: abiItem,
|
|
177
184
|
fromBlock,
|
|
185
|
+
toBlock: toBlock + 1n, // the toBlock argument in getLogs is exclusive
|
|
178
186
|
});
|
|
179
187
|
}
|
|
180
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
188
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXRoX2xvZ19oYW5kbGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcmNoaXZlci9ldGhfbG9nX2hhbmRsZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hGLE9BQU8sRUFDTCxZQUFZLEVBQ1osWUFBWSxFQUNaLHVCQUF1QixFQUN2QixvQkFBb0IsRUFDcEIsT0FBTyxFQUNQLGFBQWEsRUFDYixPQUFPLEVBQ1AsT0FBTyxHQUNSLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBMEIsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdEc7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxvQ0FBb0MsQ0FDbEQsSUFBNkU7SUFFN0UsTUFBTSxjQUFjLEdBQW9CLEVBQUUsQ0FBQztJQUMzQyxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRTtRQUN0QixNQUFNLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUN4RyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ1gsY0FBYyxDQUFDLElBQUksQ0FDakIsSUFBSSxhQUFhLENBQ2YsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsRUFDakUsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUN6RSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUN0QixFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUN6QixRQUFRLEVBQ1IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUNYLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQ3hCLENBQ0YsQ0FBQztLQUNIO0lBQ0QsT0FBTyxjQUFjLENBQUM7QUFDeEIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsa0NBQWtDLENBQ2hELElBQXVGO0lBRXZGLE1BQU0sdUJBQXVCLEdBQVMsRUFBRSxDQUFDO0lBQ3pDLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO1FBQ3RCLHVCQUF1QixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztLQUNoRTtJQUNELE9BQU8sdUJBQXVCLENBQUM7QUFDakMsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FDcEMsWUFBMEIsRUFDMUIscUJBQTZCLEVBQzdCLElBQWtGO0lBRWxGLE1BQU0sZUFBZSxHQUFjLEVBQUUsQ0FBQztJQUN0QyxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRTtRQUN0QixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNuQyxJQUFJLFFBQVEsS0FBSyxxQkFBcUIsRUFBRTtZQUN0QyxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxHQUFHLHFCQUFxQixHQUFHLFlBQVksR0FBRyxRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUM7U0FDOUc7UUFDRCwrQ0FBK0M7UUFDL0MsTUFBTSxRQUFRLEdBQUcsTUFBTSxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLGVBQWdCLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9CLHFCQUFxQixFQUFFLENBQUM7S0FDekI7SUFDRCxPQUFPLGVBQWUsQ0FBQztBQUN6QixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxLQUFLLFVBQVUsb0JBQW9CLENBQ2pDLFlBQTBCLEVBQzFCLE1BQXFCLEVBQ3JCLFVBQWtCO0lBRWxCLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxZQUFZLENBQUMsY0FBYyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDNUUsc0ZBQXNGO0lBQ3RGLE1BQU0sRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsa0JBQWtCLENBQUM7UUFDaEQsR0FBRyxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLGFBQWEsQ0FBQztRQUNyRSxJQUFJO0tBQ0wsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxZQUFZLEtBQUssU0FBUztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDNUYsTUFBTSxDQUFDLEVBQUUsVUFBVSxDQUFDLEdBQUcsSUFBbUIsQ0FBQztJQUMzQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssVUFBVSxFQUFFO1FBQ3ZDLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLFVBQVUsWUFBWSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztLQUMxRjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHVCQUF1QixDQUMzQyxZQUEwQixFQUMxQixhQUF5QixFQUN6QixTQUFpQixFQUNqQixPQUFlO0lBRWYsaUhBQWlIO0lBQ2pILGtDQUFrQztJQUNsQyxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUM7UUFDekIsR0FBRyxFQUFFLFNBQVM7UUFDZCxJQUFJLEVBQUUsa0JBQWtCO0tBQ3pCLENBQUMsQ0FBQztJQUNILE9BQU8sTUFBTSxZQUFZLENBQUMsT0FBTyxDQUF1QjtRQUN0RCxPQUFPLEVBQUUsVUFBVSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM3QyxLQUFLLEVBQUUsT0FBTztRQUNkLFNBQVM7UUFDVCxPQUFPLEVBQUUsT0FBTyxHQUFHLEVBQUUsRUFBRSwrQ0FBK0M7S0FDdkUsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHlCQUF5QixDQUM3QyxZQUEwQixFQUMxQixnQ0FBNEMsRUFDNUMsU0FBaUIsRUFDakIsT0FBZTtJQUVmLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQztRQUN6QixHQUFHLEVBQUUsNEJBQTRCO1FBQ2pDLElBQUksRUFBRSxvQkFBb0I7S0FDM0IsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxNQUFNLFlBQVksQ0FBQyxPQUFPLENBQUM7UUFDaEMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxnQ0FBZ0MsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoRSxLQUFLLEVBQUUsT0FBTztRQUNkLFNBQVM7UUFDVCxPQUFPLEVBQUUsT0FBTyxHQUFHLEVBQUUsRUFBRSwrQ0FBK0M7S0FDdkUsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLDZCQUE2QixDQUMzQyxnQkFBdUQsRUFDdkQsSUFBdUc7SUFFdkcsTUFBTSxvQkFBb0IsR0FBdUMsRUFBRSxDQUFDO0lBQ3BFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3BDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvQyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDaEUsTUFBTSxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN2RCxJQUFJLGlCQUFpQixLQUFLLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsRUFBRTtZQUMzRSxTQUFTO1NBQ1Y7UUFDRCxNQUFNLGVBQWUsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDMUYsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RixNQUFNLFNBQVMsR0FBRyxJQUFJLEtBQUssQ0FDekIsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFDeEQsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FDekQsQ0FBQztRQUVGLE1BQU0sWUFBWSxHQUFHLElBQUksb0JBQW9CLENBQzNDLElBQUksWUFBWSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsRUFDL0csZUFBZSxDQUFDLFVBQVUsQ0FBQyx1QkFBdUIsQ0FBQyxFQUNuRCxjQUFjLEVBQ2QsU0FBUyxDQUNWLENBQUM7UUFDRixJQUFJLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzNCLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUMvQzthQUFNO1lBQ0wsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQ3hEO0tBQ0Y7SUFDRCxPQUFPLG9CQUFvQixDQUFDO0FBQzlCLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSwyQkFBMkIsQ0FDL0MsWUFBMEIsRUFDMUIsWUFBd0IsRUFDeEIsU0FBaUIsRUFDakIsT0FBZTtJQUVmLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQztRQUN6QixHQUFHLEVBQUUsUUFBUTtRQUNiLElBQUksRUFBRSxjQUFjO0tBQ3JCLENBQUMsQ0FBQztJQUNILE9BQU8sTUFBTSxZQUFZLENBQUMsT0FBTyxDQUFDO1FBQ2hDLE9BQU8sRUFBRSxVQUFVLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzVDLEtBQUssRUFBRSxPQUFPO1FBQ2QsU0FBUztRQUNULE9BQU8sRUFBRSxPQUFPLEdBQUcsRUFBRSxFQUFFLCtDQUErQztLQUN2RSxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsNkJBQTZCLENBQ2pELFlBQTBCLEVBQzFCLFlBQXdCLEVBQ3hCLFNBQWlCLEVBQ2pCLE9BQWU7SUFFZixNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUM7UUFDekIsR0FBRyxFQUFFLFFBQVE7UUFDYixJQUFJLEVBQUUsd0JBQXdCO0tBQy9CLENBQUMsQ0FBQztJQUNILE9BQU8sTUFBTSxZQUFZLENBQUMsT0FBTyxDQUFDO1FBQ2hDLE9BQU8sRUFBRSxVQUFVLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzVDLEtBQUssRUFBRSxPQUFPO1FBQ2QsU0FBUztRQUNULE9BQU8sRUFBRSxPQUFPLEdBQUcsRUFBRSxFQUFFLCtDQUErQztLQUN2RSxDQUFDLENBQUM7QUFDTCxDQUFDIn0=
|
package/dest/index.js
CHANGED
|
@@ -12,13 +12,13 @@ const log = createDebugLogger('aztec:archiver');
|
|
|
12
12
|
// eslint-disable-next-line require-await
|
|
13
13
|
async function main() {
|
|
14
14
|
const config = getConfigEnvVars();
|
|
15
|
-
const { rpcUrl,
|
|
15
|
+
const { rpcUrl, l1Contracts, searchStartBlock } = config;
|
|
16
16
|
const publicClient = createPublicClient({
|
|
17
17
|
chain: localhost,
|
|
18
18
|
transport: http(rpcUrl),
|
|
19
19
|
});
|
|
20
20
|
const archiverStore = new MemoryArchiverStore();
|
|
21
|
-
const archiver = new Archiver(publicClient,
|
|
21
|
+
const archiver = new Archiver(publicClient, l1Contracts.rollupAddress, l1Contracts.inboxAddress, l1Contracts.registryAddress, l1Contracts.contractDeploymentEmitterAddress, searchStartBlock, archiverStore);
|
|
22
22
|
const shutdown = async () => {
|
|
23
23
|
await archiver.stop();
|
|
24
24
|
process.exit(0);
|
|
@@ -34,4 +34,4 @@ if (process.argv[1] === fileURLToPath(import.meta.url).replace(/\/index\.js$/, '
|
|
|
34
34
|
process.exit(1);
|
|
35
35
|
});
|
|
36
36
|
}
|
|
37
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXRELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV4QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFakUsY0FBYyxxQkFBcUIsQ0FBQztBQUVwQyxNQUFNLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRWhEOztHQUVHO0FBQ0gseUNBQXlDO0FBQ3pDLEtBQUssVUFBVSxJQUFJO0lBQ2pCLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixFQUFFLENBQUM7SUFDbEMsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFFekQsTUFBTSxZQUFZLEdBQUcsa0JBQWtCLENBQUM7UUFDdEMsS0FBSyxFQUFFLFNBQVM7UUFDaEIsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUM7S0FDeEIsQ0FBQyxDQUFDO0lBRUgsTUFBTSxhQUFhLEdBQUcsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO0lBRWhELE1BQU0sUUFBUSxHQUFHLElBQUksUUFBUSxDQUMzQixZQUFZLEVBQ1osV0FBVyxDQUFDLGFBQWEsRUFDekIsV0FBVyxDQUFDLFlBQVksRUFDeEIsV0FBVyxDQUFDLGVBQWUsRUFDM0IsV0FBVyxDQUFDLGdDQUFnQyxFQUM1QyxnQkFBZ0IsRUFDaEIsYUFBYSxDQUNkLENBQUM7SUFFRixNQUFNLFFBQVEsR0FBRyxLQUFLLElBQUksRUFBRTtRQUMxQixNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUMsQ0FBQztJQUNGLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFFRCxpRUFBaUU7QUFDakUsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLEVBQUU7SUFDbEYsbUVBQW1FO0lBQ25FLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNqQixHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQixDQUFDLENBQUMsQ0FBQztDQUNKIn0=
|
package/package.json
CHANGED
|
@@ -1,14 +1,44 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/archiver",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"exports": "./dest/index.js",
|
|
3
|
+
"version": "0.8.6",
|
|
5
4
|
"type": "module",
|
|
5
|
+
"exports": "./dest/index.js",
|
|
6
|
+
"typedocOptions": {
|
|
7
|
+
"entryPoints": [
|
|
8
|
+
"./src/index.ts"
|
|
9
|
+
],
|
|
10
|
+
"name": "Archiver",
|
|
11
|
+
"tsconfig": "./tsconfig.json"
|
|
12
|
+
},
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "yarn clean && tsc -b",
|
|
15
|
+
"build:dev": "tsc -b --watch",
|
|
16
|
+
"clean": "rm -rf ./dest .tsbuildinfo",
|
|
17
|
+
"formatting": "run -T prettier --check ./src && run -T eslint ./src",
|
|
18
|
+
"formatting:fix": "run -T prettier -w ./src",
|
|
19
|
+
"test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --passWithNoTests",
|
|
20
|
+
"start": "node ./dest",
|
|
21
|
+
"start:dev": "tsc-watch -p tsconfig.json --onSuccess 'yarn start'",
|
|
22
|
+
"test:integration": "concurrently -k -s first -c reset,dim -n test,anvil \"yarn test:integration:run\" \"anvil\"",
|
|
23
|
+
"test:integration:run": "NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --no-cache --config jest.integration.config.json"
|
|
24
|
+
},
|
|
25
|
+
"inherits": [
|
|
26
|
+
"../package.common.json"
|
|
27
|
+
],
|
|
28
|
+
"jest": {
|
|
29
|
+
"preset": "ts-jest/presets/default-esm",
|
|
30
|
+
"moduleNameMapper": {
|
|
31
|
+
"^(\\.{1,2}/.*)\\.m?js$": "$1"
|
|
32
|
+
},
|
|
33
|
+
"testRegex": "./src/.*\\.test\\.(js|mjs|ts)$",
|
|
34
|
+
"rootDir": "./src"
|
|
35
|
+
},
|
|
6
36
|
"dependencies": {
|
|
7
|
-
"@aztec/circuits.js": "0.
|
|
8
|
-
"@aztec/ethereum": "0.
|
|
9
|
-
"@aztec/foundation": "0.
|
|
10
|
-
"@aztec/l1-artifacts": "0.
|
|
11
|
-
"@aztec/types": "0.
|
|
37
|
+
"@aztec/circuits.js": "0.8.6",
|
|
38
|
+
"@aztec/ethereum": "0.8.6",
|
|
39
|
+
"@aztec/foundation": "0.8.6",
|
|
40
|
+
"@aztec/l1-artifacts": "0.8.6",
|
|
41
|
+
"@aztec/types": "0.8.6",
|
|
12
42
|
"@types/lodash.omit": "^4.5.7",
|
|
13
43
|
"debug": "^4.3.4",
|
|
14
44
|
"lodash.omit": "^4.5.0",
|
|
@@ -16,5 +46,28 @@
|
|
|
16
46
|
"tslib": "^2.5.0",
|
|
17
47
|
"viem": "1.4.2",
|
|
18
48
|
"ws": "^8.13.0"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@jest/globals": "^29.5.0",
|
|
52
|
+
"@rushstack/eslint-patch": "^1.2.0",
|
|
53
|
+
"@types/debug": "^4.1.7",
|
|
54
|
+
"@types/jest": "^29.5.0",
|
|
55
|
+
"@types/node": "^18.15.11",
|
|
56
|
+
"@types/ws": "^8.5.4",
|
|
57
|
+
"concurrently": "^8.0.1",
|
|
58
|
+
"jest": "^29.5.0",
|
|
59
|
+
"jest-mock-extended": "^3.0.4",
|
|
60
|
+
"ts-jest": "^29.1.0",
|
|
61
|
+
"ts-node": "^10.9.1",
|
|
62
|
+
"typescript": "^5.0.4"
|
|
63
|
+
},
|
|
64
|
+
"files": [
|
|
65
|
+
"dest",
|
|
66
|
+
"src",
|
|
67
|
+
"!*.test.*"
|
|
68
|
+
],
|
|
69
|
+
"types": "./dest/index.d.ts",
|
|
70
|
+
"engines": {
|
|
71
|
+
"node": ">=18"
|
|
19
72
|
}
|
|
20
73
|
}
|
package/src/archiver/archiver.ts
CHANGED
|
@@ -65,6 +65,7 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
|
|
|
65
65
|
* @param publicClient - A client for interacting with the Ethereum node.
|
|
66
66
|
* @param rollupAddress - Ethereum address of the rollup contract.
|
|
67
67
|
* @param inboxAddress - Ethereum address of the inbox contract.
|
|
68
|
+
* @param registryAddress - Ethereum address of the registry contract.
|
|
68
69
|
* @param contractDeploymentEmitterAddress - Ethereum address of the contractDeploymentEmitter contract.
|
|
69
70
|
* @param searchStartBlock - The L1 block from which to start searching for new blocks.
|
|
70
71
|
* @param pollingIntervalMs - The interval for polling for L1 logs (in milliseconds).
|
|
@@ -75,6 +76,7 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
|
|
|
75
76
|
private readonly publicClient: PublicClient<HttpTransport, Chain>,
|
|
76
77
|
private readonly rollupAddress: EthAddress,
|
|
77
78
|
private readonly inboxAddress: EthAddress,
|
|
79
|
+
private readonly registryAddress: EthAddress,
|
|
78
80
|
private readonly contractDeploymentEmitterAddress: EthAddress,
|
|
79
81
|
searchStartBlock: number,
|
|
80
82
|
private readonly store: ArchiverDataStore,
|
|
@@ -101,9 +103,10 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
|
|
|
101
103
|
const archiverStore = new MemoryArchiverStore();
|
|
102
104
|
const archiver = new Archiver(
|
|
103
105
|
publicClient,
|
|
104
|
-
config.
|
|
105
|
-
config.
|
|
106
|
-
config.
|
|
106
|
+
config.l1Contracts.rollupAddress,
|
|
107
|
+
config.l1Contracts.inboxAddress,
|
|
108
|
+
config.l1Contracts.registryAddress,
|
|
109
|
+
config.l1Contracts.contractDeploymentEmitterAddress,
|
|
107
110
|
config.searchStartBlock,
|
|
108
111
|
archiverStore,
|
|
109
112
|
config.archiverPollingIntervalMS,
|
|
@@ -145,6 +148,33 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
|
|
|
145
148
|
return;
|
|
146
149
|
}
|
|
147
150
|
|
|
151
|
+
// ********** Ensuring Consistency of data pulled from L1 **********
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* There are a number of calls in this sync operation to L1 for retrieving
|
|
155
|
+
* events and transaction data. There are a couple of things we need to bear in mind
|
|
156
|
+
* to ensure that data is read exactly once.
|
|
157
|
+
*
|
|
158
|
+
* The first is the problem of eventually consistent ETH service providers like Infura.
|
|
159
|
+
* We are not currently handling this correctly in the case of L1 to L2 messages and we will
|
|
160
|
+
* want to re-visit L2 Block and contract data retrieval at a later stage. This is not
|
|
161
|
+
* currently a problem but will need to be addressed before a mainnet release.
|
|
162
|
+
*
|
|
163
|
+
* The second is that in between the various calls to L1, the block number can move meaning some
|
|
164
|
+
* of the following calls will return data for blocks that were not present during earlier calls.
|
|
165
|
+
* This is a problem for example when setting the last block number marker for L1 to L2 messages -
|
|
166
|
+
* this.lastProcessedBlockNumber = currentBlockNumber;
|
|
167
|
+
* It's possible that we actually received messages in block currentBlockNumber + 1 meaning the next time
|
|
168
|
+
* we do this sync we get the same message again. Addtionally, the call to get cancelled L1 to L2 messages
|
|
169
|
+
* could read from a block not present when retrieving pending messages. If a message was added and cancelled
|
|
170
|
+
* in the same eth block then we could try and cancel a non-existent pending message.
|
|
171
|
+
*
|
|
172
|
+
* To combat this for the time being we simply ensure that all data retrieval methods only retrieve
|
|
173
|
+
* data up to the currentBlockNumber captured at the top of this function. We might want to improve on this
|
|
174
|
+
* in future but for the time being it should give us the guarantees that we need
|
|
175
|
+
*
|
|
176
|
+
*/
|
|
177
|
+
|
|
148
178
|
// ********** Events that are processed in between blocks **********
|
|
149
179
|
|
|
150
180
|
// Process l1ToL2Messages, these are consumed as time passes, not each block
|
|
@@ -152,15 +182,15 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
|
|
|
152
182
|
this.publicClient,
|
|
153
183
|
this.inboxAddress,
|
|
154
184
|
blockUntilSynced,
|
|
155
|
-
currentBlockNumber,
|
|
156
185
|
this.lastProcessedBlockNumber + 1n, // + 1 to prevent re-including messages from the last processed block
|
|
186
|
+
currentBlockNumber,
|
|
157
187
|
);
|
|
158
188
|
const retrievedCancelledL1ToL2Messages = await retrieveNewCancelledL1ToL2Messages(
|
|
159
189
|
this.publicClient,
|
|
160
190
|
this.inboxAddress,
|
|
161
191
|
blockUntilSynced,
|
|
162
|
-
currentBlockNumber,
|
|
163
192
|
this.lastProcessedBlockNumber + 1n,
|
|
193
|
+
currentBlockNumber,
|
|
164
194
|
);
|
|
165
195
|
|
|
166
196
|
// TODO (#717): optimise this - there could be messages in confirmed that are also in pending.
|
|
@@ -185,8 +215,8 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
|
|
|
185
215
|
this.publicClient,
|
|
186
216
|
this.rollupAddress,
|
|
187
217
|
blockUntilSynced,
|
|
188
|
-
currentBlockNumber,
|
|
189
218
|
this.nextL2BlockFromBlock,
|
|
219
|
+
currentBlockNumber,
|
|
190
220
|
nextExpectedL2BlockNum,
|
|
191
221
|
);
|
|
192
222
|
|
|
@@ -199,8 +229,8 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
|
|
|
199
229
|
this.publicClient,
|
|
200
230
|
this.contractDeploymentEmitterAddress,
|
|
201
231
|
blockUntilSynced,
|
|
202
|
-
currentBlockNumber,
|
|
203
232
|
this.nextL2BlockFromBlock,
|
|
233
|
+
currentBlockNumber,
|
|
204
234
|
blockHashMapping,
|
|
205
235
|
);
|
|
206
236
|
if (retrievedBlocks.retrievedData.length === 0) {
|
|
@@ -264,6 +294,10 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
|
|
|
264
294
|
return Promise.resolve(this.rollupAddress);
|
|
265
295
|
}
|
|
266
296
|
|
|
297
|
+
public getRegistryAddress(): Promise<EthAddress> {
|
|
298
|
+
return Promise.resolve(this.registryAddress);
|
|
299
|
+
}
|
|
300
|
+
|
|
267
301
|
/**
|
|
268
302
|
* Gets up to `limit` amount of L2 blocks starting from `from`.
|
|
269
303
|
* @param from - Number of the first block to return (inclusive).
|
package/src/archiver/config.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { L1ContractAddresses } from '@aztec/ethereum';
|
|
1
2
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
2
|
-
import { L1Addresses } from '@aztec/types';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* There are 2 polling intervals used in this configuration. The first is the archiver polling interval, archiverPollingIntervalMS.
|
|
@@ -11,7 +11,7 @@ import { L1Addresses } from '@aztec/types';
|
|
|
11
11
|
/**
|
|
12
12
|
* The archiver configuration.
|
|
13
13
|
*/
|
|
14
|
-
export interface ArchiverConfig
|
|
14
|
+
export interface ArchiverConfig {
|
|
15
15
|
/**
|
|
16
16
|
* The url of the Ethereum RPC node.
|
|
17
17
|
*/
|
|
@@ -36,6 +36,16 @@ export interface ArchiverConfig extends L1Addresses {
|
|
|
36
36
|
* Eth block from which we start scanning for L2Blocks.
|
|
37
37
|
*/
|
|
38
38
|
searchStartBlock: number;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* The deployed L1 contract addresses
|
|
42
|
+
*/
|
|
43
|
+
l1Contracts: L1ContractAddresses;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Optional dir to store data. If omitted will store in memory.
|
|
47
|
+
*/
|
|
48
|
+
dataDirectory?: string;
|
|
39
49
|
}
|
|
40
50
|
|
|
41
51
|
/**
|
|
@@ -53,17 +63,27 @@ export function getConfigEnvVars(): ArchiverConfig {
|
|
|
53
63
|
SEARCH_START_BLOCK,
|
|
54
64
|
API_KEY,
|
|
55
65
|
INBOX_CONTRACT_ADDRESS,
|
|
66
|
+
REGISTRY_CONTRACT_ADDRESS,
|
|
67
|
+
DATA_DIRECTORY,
|
|
56
68
|
} = process.env;
|
|
69
|
+
// Populate the relevant addresses for use by the archiver.
|
|
70
|
+
const addresses: L1ContractAddresses = {
|
|
71
|
+
rollupAddress: ROLLUP_CONTRACT_ADDRESS ? EthAddress.fromString(ROLLUP_CONTRACT_ADDRESS) : EthAddress.ZERO,
|
|
72
|
+
registryAddress: REGISTRY_CONTRACT_ADDRESS ? EthAddress.fromString(REGISTRY_CONTRACT_ADDRESS) : EthAddress.ZERO,
|
|
73
|
+
inboxAddress: INBOX_CONTRACT_ADDRESS ? EthAddress.fromString(INBOX_CONTRACT_ADDRESS) : EthAddress.ZERO,
|
|
74
|
+
outboxAddress: EthAddress.ZERO,
|
|
75
|
+
contractDeploymentEmitterAddress: CONTRACT_DEPLOYMENT_EMITTER_ADDRESS
|
|
76
|
+
? EthAddress.fromString(CONTRACT_DEPLOYMENT_EMITTER_ADDRESS)
|
|
77
|
+
: EthAddress.ZERO,
|
|
78
|
+
decoderHelperAddress: EthAddress.ZERO,
|
|
79
|
+
};
|
|
57
80
|
return {
|
|
58
81
|
rpcUrl: ETHEREUM_HOST || 'http://127.0.0.1:8545/',
|
|
59
82
|
archiverPollingIntervalMS: ARCHIVER_POLLING_INTERVAL_MS ? +ARCHIVER_POLLING_INTERVAL_MS : 1_000,
|
|
60
83
|
viemPollingIntervalMS: ARCHIVER_VIEM_POLLING_INTERVAL_MS ? +ARCHIVER_VIEM_POLLING_INTERVAL_MS : 1_000,
|
|
61
|
-
rollupContract: ROLLUP_CONTRACT_ADDRESS ? EthAddress.fromString(ROLLUP_CONTRACT_ADDRESS) : EthAddress.ZERO,
|
|
62
|
-
inboxContract: INBOX_CONTRACT_ADDRESS ? EthAddress.fromString(INBOX_CONTRACT_ADDRESS) : EthAddress.ZERO,
|
|
63
|
-
contractDeploymentEmitterContract: CONTRACT_DEPLOYMENT_EMITTER_ADDRESS
|
|
64
|
-
? EthAddress.fromString(CONTRACT_DEPLOYMENT_EMITTER_ADDRESS)
|
|
65
|
-
: EthAddress.ZERO,
|
|
66
84
|
searchStartBlock: SEARCH_START_BLOCK ? +SEARCH_START_BLOCK : 0,
|
|
67
85
|
apiKey: API_KEY,
|
|
86
|
+
l1Contracts: addresses,
|
|
87
|
+
dataDirectory: DATA_DIRECTORY,
|
|
68
88
|
};
|
|
69
89
|
}
|
|
@@ -34,8 +34,8 @@ type DataRetrieval<T> = {
|
|
|
34
34
|
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
35
35
|
* @param rollupAddress - The address of the rollup contract.
|
|
36
36
|
* @param blockUntilSynced - If true, blocks until the archiver has fully synced.
|
|
37
|
-
* @param currentL1BlockNum - Latest available block number in the ETH node.
|
|
38
37
|
* @param searchStartBlock - The block number to use for starting the search.
|
|
38
|
+
* @param searchEndBlock - The highest block number that we should search up to.
|
|
39
39
|
* @param expectedNextL2BlockNum - The next L2 block number that we expect to find.
|
|
40
40
|
* @returns An array of L2 Blocks and the next eth block to search from
|
|
41
41
|
*/
|
|
@@ -43,16 +43,21 @@ export async function retrieveBlocks(
|
|
|
43
43
|
publicClient: PublicClient,
|
|
44
44
|
rollupAddress: EthAddress,
|
|
45
45
|
blockUntilSynced: boolean,
|
|
46
|
-
currentL1BlockNum: bigint,
|
|
47
46
|
searchStartBlock: bigint,
|
|
47
|
+
searchEndBlock: bigint,
|
|
48
48
|
expectedNextL2BlockNum: bigint,
|
|
49
49
|
): Promise<DataRetrieval<L2Block>> {
|
|
50
50
|
const retrievedBlocks: L2Block[] = [];
|
|
51
51
|
do {
|
|
52
|
-
if (searchStartBlock >
|
|
52
|
+
if (searchStartBlock > searchEndBlock) {
|
|
53
53
|
break;
|
|
54
54
|
}
|
|
55
|
-
const l2BlockProcessedLogs = await getL2BlockProcessedLogs(
|
|
55
|
+
const l2BlockProcessedLogs = await getL2BlockProcessedLogs(
|
|
56
|
+
publicClient,
|
|
57
|
+
rollupAddress,
|
|
58
|
+
searchStartBlock,
|
|
59
|
+
searchEndBlock,
|
|
60
|
+
);
|
|
56
61
|
if (l2BlockProcessedLogs.length === 0) {
|
|
57
62
|
break;
|
|
58
63
|
}
|
|
@@ -61,7 +66,7 @@ export async function retrieveBlocks(
|
|
|
61
66
|
retrievedBlocks.push(...newBlocks);
|
|
62
67
|
searchStartBlock = l2BlockProcessedLogs[l2BlockProcessedLogs.length - 1].blockNumber! + 1n;
|
|
63
68
|
expectedNextL2BlockNum += BigInt(newBlocks.length);
|
|
64
|
-
} while (blockUntilSynced && searchStartBlock <=
|
|
69
|
+
} while (blockUntilSynced && searchStartBlock <= searchEndBlock);
|
|
65
70
|
return { nextEthBlockNumber: searchStartBlock, retrievedData: retrievedBlocks };
|
|
66
71
|
}
|
|
67
72
|
|
|
@@ -70,8 +75,8 @@ export async function retrieveBlocks(
|
|
|
70
75
|
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
71
76
|
* @param contractDeploymentEmitterAddress - The address of the contract deployment emitter contract.
|
|
72
77
|
* @param blockUntilSynced - If true, blocks until the archiver has fully synced.
|
|
73
|
-
* @param currentBlockNumber - Latest available block number in the ETH node.
|
|
74
78
|
* @param searchStartBlock - The block number to use for starting the search.
|
|
79
|
+
* @param searchEndBlock - The highest block number that we should search up to.
|
|
75
80
|
* @param blockHashMapping - A mapping from block number to relevant block hash.
|
|
76
81
|
* @returns An array of ExtendedContractData and their equivalent L2 Block number along with the next eth block to search from..
|
|
77
82
|
*/
|
|
@@ -79,19 +84,20 @@ export async function retrieveNewContractData(
|
|
|
79
84
|
publicClient: PublicClient,
|
|
80
85
|
contractDeploymentEmitterAddress: EthAddress,
|
|
81
86
|
blockUntilSynced: boolean,
|
|
82
|
-
currentBlockNumber: bigint,
|
|
83
87
|
searchStartBlock: bigint,
|
|
88
|
+
searchEndBlock: bigint,
|
|
84
89
|
blockHashMapping: { [key: number]: Buffer | undefined },
|
|
85
90
|
): Promise<DataRetrieval<[ExtendedContractData[], number]>> {
|
|
86
91
|
let retrievedNewContracts: [ExtendedContractData[], number][] = [];
|
|
87
92
|
do {
|
|
88
|
-
if (searchStartBlock >
|
|
93
|
+
if (searchStartBlock > searchEndBlock) {
|
|
89
94
|
break;
|
|
90
95
|
}
|
|
91
96
|
const contractDataLogs = await getContractDeploymentLogs(
|
|
92
97
|
publicClient,
|
|
93
98
|
contractDeploymentEmitterAddress,
|
|
94
99
|
searchStartBlock,
|
|
100
|
+
searchEndBlock,
|
|
95
101
|
);
|
|
96
102
|
if (contractDataLogs.length === 0) {
|
|
97
103
|
break;
|
|
@@ -99,7 +105,7 @@ export async function retrieveNewContractData(
|
|
|
99
105
|
const newContracts = processContractDeploymentLogs(blockHashMapping, contractDataLogs);
|
|
100
106
|
retrievedNewContracts = retrievedNewContracts.concat(newContracts);
|
|
101
107
|
searchStartBlock = (contractDataLogs.findLast(cd => !!cd)?.blockNumber || searchStartBlock) + 1n;
|
|
102
|
-
} while (blockUntilSynced && searchStartBlock <=
|
|
108
|
+
} while (blockUntilSynced && searchStartBlock <= searchEndBlock);
|
|
103
109
|
return { nextEthBlockNumber: searchStartBlock, retrievedData: retrievedNewContracts };
|
|
104
110
|
}
|
|
105
111
|
|
|
@@ -108,28 +114,33 @@ export async function retrieveNewContractData(
|
|
|
108
114
|
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
109
115
|
* @param inboxAddress - The address of the inbox contract to fetch messages from.
|
|
110
116
|
* @param blockUntilSynced - If true, blocks until the archiver has fully synced.
|
|
111
|
-
* @param currentBlockNumber - Latest available block number in the ETH node.
|
|
112
117
|
* @param searchStartBlock - The block number to use for starting the search.
|
|
118
|
+
* @param searchEndBlock - The highest block number that we should search up to.
|
|
113
119
|
* @returns An array of L1ToL2Message and next eth block to search from.
|
|
114
120
|
*/
|
|
115
121
|
export async function retrieveNewPendingL1ToL2Messages(
|
|
116
122
|
publicClient: PublicClient,
|
|
117
123
|
inboxAddress: EthAddress,
|
|
118
124
|
blockUntilSynced: boolean,
|
|
119
|
-
currentBlockNumber: bigint,
|
|
120
125
|
searchStartBlock: bigint,
|
|
126
|
+
searchEndBlock: bigint,
|
|
121
127
|
): Promise<DataRetrieval<L1ToL2Message>> {
|
|
122
128
|
const retrievedNewL1ToL2Messages: L1ToL2Message[] = [];
|
|
123
129
|
do {
|
|
124
|
-
if (searchStartBlock >
|
|
130
|
+
if (searchStartBlock > searchEndBlock) {
|
|
125
131
|
break;
|
|
126
132
|
}
|
|
127
|
-
const newL1ToL2MessageLogs = await getPendingL1ToL2MessageLogs(
|
|
133
|
+
const newL1ToL2MessageLogs = await getPendingL1ToL2MessageLogs(
|
|
134
|
+
publicClient,
|
|
135
|
+
inboxAddress,
|
|
136
|
+
searchStartBlock,
|
|
137
|
+
searchEndBlock,
|
|
138
|
+
);
|
|
128
139
|
const newL1ToL2Messages = processPendingL1ToL2MessageAddedLogs(newL1ToL2MessageLogs);
|
|
129
140
|
retrievedNewL1ToL2Messages.push(...newL1ToL2Messages);
|
|
130
141
|
// handles the case when there are no new messages:
|
|
131
142
|
searchStartBlock = (newL1ToL2MessageLogs.findLast(msgLog => !!msgLog)?.blockNumber || searchStartBlock) + 1n;
|
|
132
|
-
} while (blockUntilSynced && searchStartBlock <=
|
|
143
|
+
} while (blockUntilSynced && searchStartBlock <= searchEndBlock);
|
|
133
144
|
return { nextEthBlockNumber: searchStartBlock, retrievedData: retrievedNewL1ToL2Messages };
|
|
134
145
|
}
|
|
135
146
|
|
|
@@ -138,32 +149,33 @@ export async function retrieveNewPendingL1ToL2Messages(
|
|
|
138
149
|
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
139
150
|
* @param inboxAddress - The address of the inbox contract to fetch messages from.
|
|
140
151
|
* @param blockUntilSynced - If true, blocks until the archiver has fully synced.
|
|
141
|
-
* @param currentBlockNumber - Latest available block number in the ETH node.
|
|
142
152
|
* @param searchStartBlock - The block number to use for starting the search.
|
|
153
|
+
* @param searchEndBlock - The highest block number that we should search up to.
|
|
143
154
|
* @returns An array of message keys that were cancelled and next eth block to search from.
|
|
144
155
|
*/
|
|
145
156
|
export async function retrieveNewCancelledL1ToL2Messages(
|
|
146
157
|
publicClient: PublicClient,
|
|
147
158
|
inboxAddress: EthAddress,
|
|
148
159
|
blockUntilSynced: boolean,
|
|
149
|
-
currentBlockNumber: bigint,
|
|
150
160
|
searchStartBlock: bigint,
|
|
161
|
+
searchEndBlock: bigint,
|
|
151
162
|
): Promise<DataRetrieval<Fr>> {
|
|
152
163
|
const retrievedNewCancelledL1ToL2Messages: Fr[] = [];
|
|
153
164
|
do {
|
|
154
|
-
if (searchStartBlock >
|
|
165
|
+
if (searchStartBlock > searchEndBlock) {
|
|
155
166
|
break;
|
|
156
167
|
}
|
|
157
168
|
const newL1ToL2MessageCancelledLogs = await getL1ToL2MessageCancelledLogs(
|
|
158
169
|
publicClient,
|
|
159
170
|
inboxAddress,
|
|
160
171
|
searchStartBlock,
|
|
172
|
+
searchEndBlock,
|
|
161
173
|
);
|
|
162
174
|
const newCancelledL1ToL2Messages = processCancelledL1ToL2MessagesLogs(newL1ToL2MessageCancelledLogs);
|
|
163
175
|
retrievedNewCancelledL1ToL2Messages.push(...newCancelledL1ToL2Messages);
|
|
164
176
|
// handles the case when there are no new messages:
|
|
165
177
|
searchStartBlock =
|
|
166
178
|
(newL1ToL2MessageCancelledLogs.findLast(msgLog => !!msgLog)?.blockNumber || searchStartBlock) + 1n;
|
|
167
|
-
} while (blockUntilSynced && searchStartBlock <=
|
|
179
|
+
} while (blockUntilSynced && searchStartBlock <= searchEndBlock);
|
|
168
180
|
return { nextEthBlockNumber: searchStartBlock, retrievedData: retrievedNewCancelledL1ToL2Messages };
|
|
169
181
|
}
|
|
@@ -116,12 +116,14 @@ async function getBlockFromCallData(
|
|
|
116
116
|
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
117
117
|
* @param rollupAddress - The address of the rollup contract.
|
|
118
118
|
* @param fromBlock - First block to get logs from (inclusive).
|
|
119
|
+
* @param toBlock - Last block to get logs from (inclusive).
|
|
119
120
|
* @returns An array of `L2BlockProcessed` logs.
|
|
120
121
|
*/
|
|
121
122
|
export async function getL2BlockProcessedLogs(
|
|
122
123
|
publicClient: PublicClient,
|
|
123
124
|
rollupAddress: EthAddress,
|
|
124
125
|
fromBlock: bigint,
|
|
126
|
+
toBlock: bigint,
|
|
125
127
|
) {
|
|
126
128
|
// Note: For some reason the return type of `getLogs` would not get correctly derived if I didn't set the abiItem
|
|
127
129
|
// as a standalone constant.
|
|
@@ -133,6 +135,7 @@ export async function getL2BlockProcessedLogs(
|
|
|
133
135
|
address: getAddress(rollupAddress.toString()),
|
|
134
136
|
event: abiItem,
|
|
135
137
|
fromBlock,
|
|
138
|
+
toBlock: toBlock + 1n, // the toBlock argument in getLogs is exclusive
|
|
136
139
|
});
|
|
137
140
|
}
|
|
138
141
|
|
|
@@ -141,12 +144,14 @@ export async function getL2BlockProcessedLogs(
|
|
|
141
144
|
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
142
145
|
* @param contractDeploymentEmitterAddress - The address of the L2 contract deployment emitter contract.
|
|
143
146
|
* @param fromBlock - First block to get logs from (inclusive).
|
|
147
|
+
* @param toBlock - Last block to get logs from (inclusive).
|
|
144
148
|
* @returns An array of `ContractDeployment` logs.
|
|
145
149
|
*/
|
|
146
150
|
export async function getContractDeploymentLogs(
|
|
147
151
|
publicClient: PublicClient,
|
|
148
152
|
contractDeploymentEmitterAddress: EthAddress,
|
|
149
153
|
fromBlock: bigint,
|
|
154
|
+
toBlock: bigint,
|
|
150
155
|
): Promise<Log<bigint, number, undefined, true, typeof ContractDeploymentEmitterAbi, 'ContractDeployment'>[]> {
|
|
151
156
|
const abiItem = getAbiItem({
|
|
152
157
|
abi: ContractDeploymentEmitterAbi,
|
|
@@ -156,6 +161,7 @@ export async function getContractDeploymentLogs(
|
|
|
156
161
|
address: getAddress(contractDeploymentEmitterAddress.toString()),
|
|
157
162
|
event: abiItem,
|
|
158
163
|
fromBlock,
|
|
164
|
+
toBlock: toBlock + 1n, // the toBlock argument in getLogs is exclusive
|
|
159
165
|
});
|
|
160
166
|
}
|
|
161
167
|
|
|
@@ -205,12 +211,14 @@ export function processContractDeploymentLogs(
|
|
|
205
211
|
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
206
212
|
* @param inboxAddress - The address of the inbox contract.
|
|
207
213
|
* @param fromBlock - First block to get logs from (inclusive).
|
|
214
|
+
* @param toBlock - Last block to get logs from (inclusive).
|
|
208
215
|
* @returns An array of `MessageAdded` logs.
|
|
209
216
|
*/
|
|
210
217
|
export async function getPendingL1ToL2MessageLogs(
|
|
211
218
|
publicClient: PublicClient,
|
|
212
219
|
inboxAddress: EthAddress,
|
|
213
220
|
fromBlock: bigint,
|
|
221
|
+
toBlock: bigint,
|
|
214
222
|
): Promise<Log<bigint, number, undefined, true, typeof InboxAbi, 'MessageAdded'>[]> {
|
|
215
223
|
const abiItem = getAbiItem({
|
|
216
224
|
abi: InboxAbi,
|
|
@@ -220,6 +228,7 @@ export async function getPendingL1ToL2MessageLogs(
|
|
|
220
228
|
address: getAddress(inboxAddress.toString()),
|
|
221
229
|
event: abiItem,
|
|
222
230
|
fromBlock,
|
|
231
|
+
toBlock: toBlock + 1n, // the toBlock argument in getLogs is exclusive
|
|
223
232
|
});
|
|
224
233
|
}
|
|
225
234
|
|
|
@@ -228,12 +237,14 @@ export async function getPendingL1ToL2MessageLogs(
|
|
|
228
237
|
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
229
238
|
* @param inboxAddress - The address of the inbox contract.
|
|
230
239
|
* @param fromBlock - First block to get logs from (inclusive).
|
|
240
|
+
* @param toBlock - Last block to get logs from (inclusive).
|
|
231
241
|
* @returns An array of `L1ToL2MessageCancelled` logs.
|
|
232
242
|
*/
|
|
233
243
|
export async function getL1ToL2MessageCancelledLogs(
|
|
234
244
|
publicClient: PublicClient,
|
|
235
245
|
inboxAddress: EthAddress,
|
|
236
246
|
fromBlock: bigint,
|
|
247
|
+
toBlock: bigint,
|
|
237
248
|
): Promise<Log<bigint, number, undefined, true, typeof InboxAbi, 'L1ToL2MessageCancelled'>[]> {
|
|
238
249
|
const abiItem = getAbiItem({
|
|
239
250
|
abi: InboxAbi,
|
|
@@ -243,5 +254,6 @@ export async function getL1ToL2MessageCancelledLogs(
|
|
|
243
254
|
address: getAddress(inboxAddress.toString()),
|
|
244
255
|
event: abiItem,
|
|
245
256
|
fromBlock,
|
|
257
|
+
toBlock: toBlock + 1n, // the toBlock argument in getLogs is exclusive
|
|
246
258
|
});
|
|
247
259
|
}
|