@aztec/archiver 0.7.2 → 0.7.3
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/.tsbuildinfo +1 -0
- package/dest/archiver/archiver.d.ts +147 -0
- package/dest/archiver/archiver.d.ts.map +1 -0
- package/dest/archiver/archiver.js +269 -0
- package/dest/archiver/archiver.test.d.ts +2 -0
- package/dest/archiver/archiver.test.d.ts.map +1 -0
- package/dest/archiver/archiver.test.js +184 -0
- package/dest/archiver/archiver_store.d.ts +267 -0
- package/dest/archiver/archiver_store.d.ts.map +1 -0
- package/dest/archiver/archiver_store.js +256 -0
- package/dest/archiver/archiver_store.test.d.ts +2 -0
- package/dest/archiver/archiver_store.test.d.ts.map +1 -0
- package/dest/archiver/archiver_store.test.js +61 -0
- package/dest/archiver/config.d.ts +39 -0
- package/dest/archiver/config.d.ts.map +1 -0
- package/dest/archiver/config.js +22 -0
- package/dest/archiver/data_retrieval.d.ts +64 -0
- package/dest/archiver/data_retrieval.d.ts.map +1 -0
- package/dest/archiver/data_retrieval.js +102 -0
- package/dest/archiver/eth_log_handlers.d.ts +77 -0
- package/dest/archiver/eth_log_handlers.d.ts.map +1 -0
- package/dest/archiver/eth_log_handlers.js +180 -0
- package/dest/archiver/index.d.ts +3 -0
- package/dest/archiver/index.d.ts.map +1 -0
- package/dest/archiver/index.js +3 -0
- package/dest/archiver/l1_to_l2_message_store.d.ts +40 -0
- package/dest/archiver/l1_to_l2_message_store.d.ts.map +1 -0
- package/dest/archiver/l1_to_l2_message_store.js +71 -0
- package/dest/archiver/l1_to_l2_message_store.test.d.ts +2 -0
- package/dest/archiver/l1_to_l2_message_store.test.d.ts.map +1 -0
- package/dest/archiver/l1_to_l2_message_store.test.js +77 -0
- package/dest/index.d.ts +2 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/index.js +37 -0
- package/package.json +6 -6
- package/Dockerfile +0 -15
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
2
|
+
/**
|
|
3
|
+
* Returns the archiver configuration from the environment variables.
|
|
4
|
+
* Note: If an environment variable is not set, the default value is used.
|
|
5
|
+
* @returns The archiver configuration.
|
|
6
|
+
*/
|
|
7
|
+
export function getConfigEnvVars() {
|
|
8
|
+
const { ETHEREUM_HOST, ARCHIVER_POLLING_INTERVAL_MS, ARCHIVER_VIEM_POLLING_INTERVAL_MS, ROLLUP_CONTRACT_ADDRESS, CONTRACT_DEPLOYMENT_EMITTER_ADDRESS, SEARCH_START_BLOCK, API_KEY, INBOX_CONTRACT_ADDRESS, } = process.env;
|
|
9
|
+
return {
|
|
10
|
+
rpcUrl: ETHEREUM_HOST || 'http://127.0.0.1:8545/',
|
|
11
|
+
archiverPollingIntervalMS: ARCHIVER_POLLING_INTERVAL_MS ? +ARCHIVER_POLLING_INTERVAL_MS : 1000,
|
|
12
|
+
viemPollingIntervalMS: ARCHIVER_VIEM_POLLING_INTERVAL_MS ? +ARCHIVER_VIEM_POLLING_INTERVAL_MS : 1000,
|
|
13
|
+
rollupContract: ROLLUP_CONTRACT_ADDRESS ? EthAddress.fromString(ROLLUP_CONTRACT_ADDRESS) : EthAddress.ZERO,
|
|
14
|
+
inboxContract: INBOX_CONTRACT_ADDRESS ? EthAddress.fromString(INBOX_CONTRACT_ADDRESS) : EthAddress.ZERO,
|
|
15
|
+
contractDeploymentEmitterContract: CONTRACT_DEPLOYMENT_EMITTER_ADDRESS
|
|
16
|
+
? EthAddress.fromString(CONTRACT_DEPLOYMENT_EMITTER_ADDRESS)
|
|
17
|
+
: EthAddress.ZERO,
|
|
18
|
+
searchStartBlock: SEARCH_START_BLOCK ? +SEARCH_START_BLOCK : 0,
|
|
19
|
+
apiKey: API_KEY,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FyY2hpdmVyL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUF3QzNEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCO0lBQzlCLE1BQU0sRUFDSixhQUFhLEVBQ2IsNEJBQTRCLEVBQzVCLGlDQUFpQyxFQUNqQyx1QkFBdUIsRUFDdkIsbUNBQW1DLEVBQ25DLGtCQUFrQixFQUNsQixPQUFPLEVBQ1Asc0JBQXNCLEdBQ3ZCLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztJQUNoQixPQUFPO1FBQ0wsTUFBTSxFQUFFLGFBQWEsSUFBSSx3QkFBd0I7UUFDakQseUJBQXlCLEVBQUUsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLElBQUs7UUFDL0YscUJBQXFCLEVBQUUsaUNBQWlDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxDQUFDLElBQUs7UUFDckcsY0FBYyxFQUFFLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJO1FBQzFHLGFBQWEsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSTtRQUN2RyxpQ0FBaUMsRUFBRSxtQ0FBbUM7WUFDcEUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsbUNBQW1DLENBQUM7WUFDNUQsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJO1FBQ25CLGdCQUFnQixFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlELE1BQU0sRUFBRSxPQUFPO0tBQ2hCLENBQUM7QUFDSixDQUFDIn0=
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
3
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
4
|
+
import { ExtendedContractData, L1ToL2Message, L2Block } from '@aztec/types';
|
|
5
|
+
import { PublicClient } from 'viem';
|
|
6
|
+
/**
|
|
7
|
+
* Data retrieved from logs
|
|
8
|
+
*/
|
|
9
|
+
type DataRetrieval<T> = {
|
|
10
|
+
/**
|
|
11
|
+
* The next block number.
|
|
12
|
+
*/
|
|
13
|
+
nextEthBlockNumber: bigint;
|
|
14
|
+
/**
|
|
15
|
+
* The data returned.
|
|
16
|
+
*/
|
|
17
|
+
retrievedData: T[];
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Fetches new L2 Blocks.
|
|
21
|
+
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
22
|
+
* @param rollupAddress - The address of the rollup contract.
|
|
23
|
+
* @param blockUntilSynced - If true, blocks until the archiver has fully synced.
|
|
24
|
+
* @param currentL1BlockNum - Latest available block number in the ETH node.
|
|
25
|
+
* @param searchStartBlock - The block number to use for starting the search.
|
|
26
|
+
* @param expectedNextL2BlockNum - The next L2 block number that we expect to find.
|
|
27
|
+
* @returns An array of L2 Blocks and the next eth block to search from
|
|
28
|
+
*/
|
|
29
|
+
export declare function retrieveBlocks(publicClient: PublicClient, rollupAddress: EthAddress, blockUntilSynced: boolean, currentL1BlockNum: bigint, searchStartBlock: bigint, expectedNextL2BlockNum: bigint): Promise<DataRetrieval<L2Block>>;
|
|
30
|
+
/**
|
|
31
|
+
* Fetches new contract data.
|
|
32
|
+
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
33
|
+
* @param contractDeploymentEmitterAddress - The address of the contract deployment emitter contract.
|
|
34
|
+
* @param blockUntilSynced - If true, blocks until the archiver has fully synced.
|
|
35
|
+
* @param currentBlockNumber - Latest available block number in the ETH node.
|
|
36
|
+
* @param searchStartBlock - The block number to use for starting the search.
|
|
37
|
+
* @param blockHashMapping - A mapping from block number to relevant block hash.
|
|
38
|
+
* @returns An array of ExtendedContractData and their equivalent L2 Block number along with the next eth block to search from..
|
|
39
|
+
*/
|
|
40
|
+
export declare function retrieveNewContractData(publicClient: PublicClient, contractDeploymentEmitterAddress: EthAddress, blockUntilSynced: boolean, currentBlockNumber: bigint, searchStartBlock: bigint, blockHashMapping: {
|
|
41
|
+
[key: number]: Buffer | undefined;
|
|
42
|
+
}): Promise<DataRetrieval<[ExtendedContractData[], number]>>;
|
|
43
|
+
/**
|
|
44
|
+
* Fetch new pending L1 to L2 messages.
|
|
45
|
+
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
46
|
+
* @param inboxAddress - The address of the inbox contract to fetch messages from.
|
|
47
|
+
* @param blockUntilSynced - If true, blocks until the archiver has fully synced.
|
|
48
|
+
* @param currentBlockNumber - Latest available block number in the ETH node.
|
|
49
|
+
* @param searchStartBlock - The block number to use for starting the search.
|
|
50
|
+
* @returns An array of L1ToL2Message and next eth block to search from.
|
|
51
|
+
*/
|
|
52
|
+
export declare function retrieveNewPendingL1ToL2Messages(publicClient: PublicClient, inboxAddress: EthAddress, blockUntilSynced: boolean, currentBlockNumber: bigint, searchStartBlock: bigint): Promise<DataRetrieval<L1ToL2Message>>;
|
|
53
|
+
/**
|
|
54
|
+
* Fetch newly cancelled L1 to L2 messages.
|
|
55
|
+
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
56
|
+
* @param inboxAddress - The address of the inbox contract to fetch messages from.
|
|
57
|
+
* @param blockUntilSynced - If true, blocks until the archiver has fully synced.
|
|
58
|
+
* @param currentBlockNumber - Latest available block number in the ETH node.
|
|
59
|
+
* @param searchStartBlock - The block number to use for starting the search.
|
|
60
|
+
* @returns An array of message keys that were cancelled and next eth block to search from.
|
|
61
|
+
*/
|
|
62
|
+
export declare function retrieveNewCancelledL1ToL2Messages(publicClient: PublicClient, inboxAddress: EthAddress, blockUntilSynced: boolean, currentBlockNumber: bigint, searchStartBlock: bigint): Promise<DataRetrieval<Fr>>;
|
|
63
|
+
export {};
|
|
64
|
+
//# sourceMappingURL=data_retrieval.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data_retrieval.d.ts","sourceRoot":"","sources":["../../src/archiver/data_retrieval.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5E,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAapC;;GAEG;AACH,KAAK,aAAa,CAAC,CAAC,IAAI;IACtB;;OAEG;IACH,kBAAkB,EAAE,MAAM,CAAC;IAC3B;;OAEG;IACH,aAAa,EAAE,CAAC,EAAE,CAAC;CACpB,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAClC,YAAY,EAAE,YAAY,EAC1B,aAAa,EAAE,UAAU,EACzB,gBAAgB,EAAE,OAAO,EACzB,iBAAiB,EAAE,MAAM,EACzB,gBAAgB,EAAE,MAAM,EACxB,sBAAsB,EAAE,MAAM,GAC7B,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAiBjC;AAED;;;;;;;;;GASG;AACH,wBAAsB,uBAAuB,CAC3C,YAAY,EAAE,YAAY,EAC1B,gCAAgC,EAAE,UAAU,EAC5C,gBAAgB,EAAE,OAAO,EACzB,kBAAkB,EAAE,MAAM,EAC1B,gBAAgB,EAAE,MAAM,EACxB,gBAAgB,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;CAAE,GACtD,OAAO,CAAC,aAAa,CAAC,CAAC,oBAAoB,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAmB1D;AAED;;;;;;;;GAQG;AACH,wBAAsB,gCAAgC,CACpD,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,UAAU,EACxB,gBAAgB,EAAE,OAAO,EACzB,kBAAkB,EAAE,MAAM,EAC1B,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAavC;AAED;;;;;;;;GAQG;AACH,wBAAsB,kCAAkC,CACtD,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,UAAU,EACxB,gBAAgB,EAAE,OAAO,EACzB,kBAAkB,EAAE,MAAM,EAC1B,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAkB5B"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { getContractDeploymentLogs, getL1ToL2MessageCancelledLogs, getL2BlockProcessedLogs, getPendingL1ToL2MessageLogs, processBlockLogs, processCancelledL1ToL2MessagesLogs, processContractDeploymentLogs, processPendingL1ToL2MessageAddedLogs, } from './eth_log_handlers.js';
|
|
2
|
+
/**
|
|
3
|
+
* Fetches new L2 Blocks.
|
|
4
|
+
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
5
|
+
* @param rollupAddress - The address of the rollup contract.
|
|
6
|
+
* @param blockUntilSynced - If true, blocks until the archiver has fully synced.
|
|
7
|
+
* @param currentL1BlockNum - Latest available block number in the ETH node.
|
|
8
|
+
* @param searchStartBlock - The block number to use for starting the search.
|
|
9
|
+
* @param expectedNextL2BlockNum - The next L2 block number that we expect to find.
|
|
10
|
+
* @returns An array of L2 Blocks and the next eth block to search from
|
|
11
|
+
*/
|
|
12
|
+
export async function retrieveBlocks(publicClient, rollupAddress, blockUntilSynced, currentL1BlockNum, searchStartBlock, expectedNextL2BlockNum) {
|
|
13
|
+
const retrievedBlocks = [];
|
|
14
|
+
do {
|
|
15
|
+
if (searchStartBlock > currentL1BlockNum) {
|
|
16
|
+
break;
|
|
17
|
+
}
|
|
18
|
+
const l2BlockProcessedLogs = await getL2BlockProcessedLogs(publicClient, rollupAddress, searchStartBlock);
|
|
19
|
+
if (l2BlockProcessedLogs.length === 0) {
|
|
20
|
+
break;
|
|
21
|
+
}
|
|
22
|
+
const newBlocks = await processBlockLogs(publicClient, expectedNextL2BlockNum, l2BlockProcessedLogs);
|
|
23
|
+
retrievedBlocks.push(...newBlocks);
|
|
24
|
+
searchStartBlock = l2BlockProcessedLogs[l2BlockProcessedLogs.length - 1].blockNumber + 1n;
|
|
25
|
+
expectedNextL2BlockNum += BigInt(newBlocks.length);
|
|
26
|
+
} while (blockUntilSynced && searchStartBlock <= currentL1BlockNum);
|
|
27
|
+
return { nextEthBlockNumber: searchStartBlock, retrievedData: retrievedBlocks };
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Fetches new contract data.
|
|
31
|
+
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
32
|
+
* @param contractDeploymentEmitterAddress - The address of the contract deployment emitter contract.
|
|
33
|
+
* @param blockUntilSynced - If true, blocks until the archiver has fully synced.
|
|
34
|
+
* @param currentBlockNumber - Latest available block number in the ETH node.
|
|
35
|
+
* @param searchStartBlock - The block number to use for starting the search.
|
|
36
|
+
* @param blockHashMapping - A mapping from block number to relevant block hash.
|
|
37
|
+
* @returns An array of ExtendedContractData and their equivalent L2 Block number along with the next eth block to search from..
|
|
38
|
+
*/
|
|
39
|
+
export async function retrieveNewContractData(publicClient, contractDeploymentEmitterAddress, blockUntilSynced, currentBlockNumber, searchStartBlock, blockHashMapping) {
|
|
40
|
+
let retrievedNewContracts = [];
|
|
41
|
+
do {
|
|
42
|
+
if (searchStartBlock > currentBlockNumber) {
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
const contractDataLogs = await getContractDeploymentLogs(publicClient, contractDeploymentEmitterAddress, searchStartBlock);
|
|
46
|
+
if (contractDataLogs.length === 0) {
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
const newContracts = processContractDeploymentLogs(blockHashMapping, contractDataLogs);
|
|
50
|
+
retrievedNewContracts = retrievedNewContracts.concat(newContracts);
|
|
51
|
+
searchStartBlock = (contractDataLogs.findLast(cd => !!cd)?.blockNumber || searchStartBlock) + 1n;
|
|
52
|
+
} while (blockUntilSynced && searchStartBlock <= currentBlockNumber);
|
|
53
|
+
return { nextEthBlockNumber: searchStartBlock, retrievedData: retrievedNewContracts };
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Fetch new pending L1 to L2 messages.
|
|
57
|
+
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
58
|
+
* @param inboxAddress - The address of the inbox contract to fetch messages from.
|
|
59
|
+
* @param blockUntilSynced - If true, blocks until the archiver has fully synced.
|
|
60
|
+
* @param currentBlockNumber - Latest available block number in the ETH node.
|
|
61
|
+
* @param searchStartBlock - The block number to use for starting the search.
|
|
62
|
+
* @returns An array of L1ToL2Message and next eth block to search from.
|
|
63
|
+
*/
|
|
64
|
+
export async function retrieveNewPendingL1ToL2Messages(publicClient, inboxAddress, blockUntilSynced, currentBlockNumber, searchStartBlock) {
|
|
65
|
+
const retrievedNewL1ToL2Messages = [];
|
|
66
|
+
do {
|
|
67
|
+
if (searchStartBlock > currentBlockNumber) {
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
const newL1ToL2MessageLogs = await getPendingL1ToL2MessageLogs(publicClient, inboxAddress, searchStartBlock);
|
|
71
|
+
const newL1ToL2Messages = processPendingL1ToL2MessageAddedLogs(newL1ToL2MessageLogs);
|
|
72
|
+
retrievedNewL1ToL2Messages.push(...newL1ToL2Messages);
|
|
73
|
+
// handles the case when there are no new messages:
|
|
74
|
+
searchStartBlock = (newL1ToL2MessageLogs.findLast(msgLog => !!msgLog)?.blockNumber || searchStartBlock) + 1n;
|
|
75
|
+
} while (blockUntilSynced && searchStartBlock <= currentBlockNumber);
|
|
76
|
+
return { nextEthBlockNumber: searchStartBlock, retrievedData: retrievedNewL1ToL2Messages };
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Fetch newly cancelled L1 to L2 messages.
|
|
80
|
+
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
81
|
+
* @param inboxAddress - The address of the inbox contract to fetch messages from.
|
|
82
|
+
* @param blockUntilSynced - If true, blocks until the archiver has fully synced.
|
|
83
|
+
* @param currentBlockNumber - Latest available block number in the ETH node.
|
|
84
|
+
* @param searchStartBlock - The block number to use for starting the search.
|
|
85
|
+
* @returns An array of message keys that were cancelled and next eth block to search from.
|
|
86
|
+
*/
|
|
87
|
+
export async function retrieveNewCancelledL1ToL2Messages(publicClient, inboxAddress, blockUntilSynced, currentBlockNumber, searchStartBlock) {
|
|
88
|
+
const retrievedNewCancelledL1ToL2Messages = [];
|
|
89
|
+
do {
|
|
90
|
+
if (searchStartBlock > currentBlockNumber) {
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
const newL1ToL2MessageCancelledLogs = await getL1ToL2MessageCancelledLogs(publicClient, inboxAddress, searchStartBlock);
|
|
94
|
+
const newCancelledL1ToL2Messages = processCancelledL1ToL2MessagesLogs(newL1ToL2MessageCancelledLogs);
|
|
95
|
+
retrievedNewCancelledL1ToL2Messages.push(...newCancelledL1ToL2Messages);
|
|
96
|
+
// handles the case when there are no new messages:
|
|
97
|
+
searchStartBlock =
|
|
98
|
+
(newL1ToL2MessageCancelledLogs.findLast(msgLog => !!msgLog)?.blockNumber || searchStartBlock) + 1n;
|
|
99
|
+
} while (blockUntilSynced && searchStartBlock <= currentBlockNumber);
|
|
100
|
+
return { nextEthBlockNumber: searchStartBlock, retrievedData: retrievedNewCancelledL1ToL2Messages };
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YV9yZXRyaWV2YWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXJjaGl2ZXIvZGF0YV9yZXRyaWV2YWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsT0FBTyxFQUNMLHlCQUF5QixFQUN6Qiw2QkFBNkIsRUFDN0IsdUJBQXVCLEVBQ3ZCLDJCQUEyQixFQUMzQixnQkFBZ0IsRUFDaEIsa0NBQWtDLEVBQ2xDLDZCQUE2QixFQUM3QixvQ0FBb0MsR0FDckMsTUFBTSx1QkFBdUIsQ0FBQztBQWdCL0I7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxjQUFjLENBQ2xDLFlBQTBCLEVBQzFCLGFBQXlCLEVBQ3pCLGdCQUF5QixFQUN6QixpQkFBeUIsRUFDekIsZ0JBQXdCLEVBQ3hCLHNCQUE4QjtJQUU5QixNQUFNLGVBQWUsR0FBYyxFQUFFLENBQUM7SUFDdEMsR0FBRztRQUNELElBQUksZ0JBQWdCLEdBQUcsaUJBQWlCLEVBQUU7WUFDeEMsTUFBTTtTQUNQO1FBQ0QsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLHVCQUF1QixDQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUMxRyxJQUFJLG9CQUFvQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDckMsTUFBTTtTQUNQO1FBRUQsTUFBTSxTQUFTLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUNyRyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7UUFDbkMsZ0JBQWdCLEdBQUcsb0JBQW9CLENBQUMsb0JBQW9CLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVksR0FBRyxFQUFFLENBQUM7UUFDM0Ysc0JBQXNCLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUNwRCxRQUFRLGdCQUFnQixJ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
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
3
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
4
|
+
import { ContractDeploymentEmitterAbi, InboxAbi, RollupAbi } from '@aztec/l1-artifacts';
|
|
5
|
+
import { ExtendedContractData, L1ToL2Message, L2Block } from '@aztec/types';
|
|
6
|
+
import { Log, PublicClient } from 'viem';
|
|
7
|
+
/**
|
|
8
|
+
* Processes newly received MessageAdded (L1 to L2) logs.
|
|
9
|
+
* @param logs - MessageAdded logs.
|
|
10
|
+
* @returns Array of all Pending L1 to L2 messages that were processed
|
|
11
|
+
*/
|
|
12
|
+
export declare function processPendingL1ToL2MessageAddedLogs(logs: Log<bigint, number, undefined, true, typeof InboxAbi, 'MessageAdded'>[]): L1ToL2Message[];
|
|
13
|
+
/**
|
|
14
|
+
* Process newly received L1ToL2MessageCancelled logs.
|
|
15
|
+
* @param logs - L1ToL2MessageCancelled logs.
|
|
16
|
+
* @returns Array of message keys of the L1 to L2 messages that were cancelled
|
|
17
|
+
*/
|
|
18
|
+
export declare function processCancelledL1ToL2MessagesLogs(logs: Log<bigint, number, undefined, true, typeof InboxAbi, 'L1ToL2MessageCancelled'>[]): Fr[];
|
|
19
|
+
/**
|
|
20
|
+
* Processes newly received L2BlockProcessed logs.
|
|
21
|
+
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
22
|
+
* @param expectedL2BlockNumber - The next expected L2 block number.
|
|
23
|
+
* @param logs - L2BlockProcessed logs.
|
|
24
|
+
*/
|
|
25
|
+
export declare function processBlockLogs(publicClient: PublicClient, expectedL2BlockNumber: bigint, logs: Log<bigint, number, undefined, true, typeof RollupAbi, 'L2BlockProcessed'>[]): Promise<L2Block[]>;
|
|
26
|
+
/**
|
|
27
|
+
* Gets relevant `L2BlockProcessed` logs from chain.
|
|
28
|
+
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
29
|
+
* @param rollupAddress - The address of the rollup contract.
|
|
30
|
+
* @param fromBlock - First block to get logs from (inclusive).
|
|
31
|
+
* @returns An array of `L2BlockProcessed` logs.
|
|
32
|
+
*/
|
|
33
|
+
export declare function getL2BlockProcessedLogs(publicClient: PublicClient, rollupAddress: EthAddress, fromBlock: bigint): Promise<import("viem").GetLogsReturnType<{
|
|
34
|
+
readonly anonymous: false;
|
|
35
|
+
readonly inputs: readonly [{
|
|
36
|
+
readonly indexed: true;
|
|
37
|
+
readonly internalType: "uint256";
|
|
38
|
+
readonly name: "blockNum";
|
|
39
|
+
readonly type: "uint256";
|
|
40
|
+
}];
|
|
41
|
+
readonly name: "L2BlockProcessed";
|
|
42
|
+
readonly type: "event";
|
|
43
|
+
}, true>>;
|
|
44
|
+
/**
|
|
45
|
+
* Gets relevant `ContractDeployment` logs from chain.
|
|
46
|
+
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
47
|
+
* @param contractDeploymentEmitterAddress - The address of the L2 contract deployment emitter contract.
|
|
48
|
+
* @param fromBlock - First block to get logs from (inclusive).
|
|
49
|
+
* @returns An array of `ContractDeployment` logs.
|
|
50
|
+
*/
|
|
51
|
+
export declare function getContractDeploymentLogs(publicClient: PublicClient, contractDeploymentEmitterAddress: EthAddress, fromBlock: bigint): Promise<Log<bigint, number, undefined, true, typeof ContractDeploymentEmitterAbi, 'ContractDeployment'>[]>;
|
|
52
|
+
/**
|
|
53
|
+
* Processes newly received ContractDeployment logs.
|
|
54
|
+
* @param blockHashMapping - A mapping from block number to relevant block hash.
|
|
55
|
+
* @param logs - ContractDeployment logs.
|
|
56
|
+
* @returns The set of retrieved extended contract data items.
|
|
57
|
+
*/
|
|
58
|
+
export declare function processContractDeploymentLogs(blockHashMapping: {
|
|
59
|
+
[key: number]: Buffer | undefined;
|
|
60
|
+
}, logs: Log<bigint, number, undefined, true, typeof ContractDeploymentEmitterAbi, 'ContractDeployment'>[]): [ExtendedContractData[], number][];
|
|
61
|
+
/**
|
|
62
|
+
* Get relevant `MessageAdded` logs emitted by Inbox on chain.
|
|
63
|
+
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
64
|
+
* @param inboxAddress - The address of the inbox contract.
|
|
65
|
+
* @param fromBlock - First block to get logs from (inclusive).
|
|
66
|
+
* @returns An array of `MessageAdded` logs.
|
|
67
|
+
*/
|
|
68
|
+
export declare function getPendingL1ToL2MessageLogs(publicClient: PublicClient, inboxAddress: EthAddress, fromBlock: bigint): Promise<Log<bigint, number, undefined, true, typeof InboxAbi, 'MessageAdded'>[]>;
|
|
69
|
+
/**
|
|
70
|
+
* Get relevant `L1ToL2MessageCancelled` logs emitted by Inbox on chain when pending messages are cancelled
|
|
71
|
+
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
72
|
+
* @param inboxAddress - The address of the inbox contract.
|
|
73
|
+
* @param fromBlock - First block to get logs from (inclusive).
|
|
74
|
+
* @returns An array of `L1ToL2MessageCancelled` logs.
|
|
75
|
+
*/
|
|
76
|
+
export declare function getL1ToL2MessageCancelledLogs(publicClient: PublicClient, inboxAddress: EthAddress, fromBlock: bigint): Promise<Log<bigint, number, undefined, true, typeof InboxAbi, 'L1ToL2MessageCancelled'>[]>;
|
|
77
|
+
//# sourceMappingURL=eth_log_handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eth_log_handlers.d.ts","sourceRoot":"","sources":["../../src/archiver/eth_log_handlers.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,EAAE,EAAS,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,4BAA4B,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACxF,OAAO,EAIL,oBAAoB,EAEpB,aAAa,EAEb,OAAO,EACR,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAO,GAAG,EAAE,YAAY,EAA0D,MAAM,MAAM,CAAC;AAEtG;;;;GAIG;AACH,wBAAgB,oCAAoC,CAClD,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,QAAQ,EAAE,cAAc,CAAC,EAAE,GAC5E,aAAa,EAAE,CAkBjB;AAED;;;;GAIG;AACH,wBAAgB,kCAAkC,CAChD,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,QAAQ,EAAE,wBAAwB,CAAC,EAAE,GACtF,EAAE,EAAE,CAMN;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,YAAY,EAAE,YAAY,EAC1B,qBAAqB,EAAE,MAAM,EAC7B,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,SAAS,EAAE,kBAAkB,CAAC,EAAE,sBAcnF;AA+BD;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAC3C,YAAY,EAAE,YAAY,EAC1B,aAAa,EAAE,UAAU,EACzB,SAAS,EAAE,MAAM;;;;;;;;;;UAalB;AAED;;;;;;GAMG;AACH,wBAAsB,yBAAyB,CAC7C,YAAY,EAAE,YAAY,EAC1B,gCAAgC,EAAE,UAAU,EAC5C,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,4BAA4B,EAAE,oBAAoB,CAAC,EAAE,CAAC,CAU5G;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,gBAAgB,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;CAAE,EACvD,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,4BAA4B,EAAE,oBAAoB,CAAC,EAAE,GACtG,CAAC,oBAAoB,EAAE,EAAE,MAAM,CAAC,EAAE,CA8BpC;AAED;;;;;;GAMG;AACH,wBAAsB,2BAA2B,CAC/C,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,UAAU,EACxB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,QAAQ,EAAE,cAAc,CAAC,EAAE,CAAC,CAUlF;AAED;;;;;;GAMG;AACH,wBAAsB,6BAA6B,CACjD,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,UAAU,EACxB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,QAAQ,EAAE,wBAAwB,CAAC,EAAE,CAAC,CAU5F"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { AztecAddress } from '@aztec/foundation/aztec-address';
|
|
2
|
+
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
3
|
+
import { Fr, Point } from '@aztec/foundation/fields';
|
|
4
|
+
import { ContractDeploymentEmitterAbi, InboxAbi, RollupAbi } from '@aztec/l1-artifacts';
|
|
5
|
+
import { BufferReader, ContractData, EncodedContractFunction, ExtendedContractData, L1Actor, L1ToL2Message, L2Actor, L2Block, } from '@aztec/types';
|
|
6
|
+
import { decodeFunctionData, getAbiItem, getAddress, hexToBytes } from 'viem';
|
|
7
|
+
/**
|
|
8
|
+
* Processes newly received MessageAdded (L1 to L2) logs.
|
|
9
|
+
* @param logs - MessageAdded logs.
|
|
10
|
+
* @returns Array of all Pending L1 to L2 messages that were processed
|
|
11
|
+
*/
|
|
12
|
+
export function processPendingL1ToL2MessageAddedLogs(logs) {
|
|
13
|
+
const l1ToL2Messages = [];
|
|
14
|
+
for (const log of logs) {
|
|
15
|
+
const { sender, senderChainId, recipient, recipientVersion, content, secretHash, deadline, fee, entryKey } = log.args;
|
|
16
|
+
l1ToL2Messages.push(new L1ToL2Message(new L1Actor(EthAddress.fromString(sender), Number(senderChainId)), new L2Actor(AztecAddress.fromString(recipient), Number(recipientVersion)), Fr.fromString(content), Fr.fromString(secretHash), deadline, Number(fee), Fr.fromString(entryKey)));
|
|
17
|
+
}
|
|
18
|
+
return l1ToL2Messages;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Process newly received L1ToL2MessageCancelled logs.
|
|
22
|
+
* @param logs - L1ToL2MessageCancelled logs.
|
|
23
|
+
* @returns Array of message keys of the L1 to L2 messages that were cancelled
|
|
24
|
+
*/
|
|
25
|
+
export function processCancelledL1ToL2MessagesLogs(logs) {
|
|
26
|
+
const cancelledL1ToL2Messages = [];
|
|
27
|
+
for (const log of logs) {
|
|
28
|
+
cancelledL1ToL2Messages.push(Fr.fromString(log.args.entryKey));
|
|
29
|
+
}
|
|
30
|
+
return cancelledL1ToL2Messages;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Processes newly received L2BlockProcessed logs.
|
|
34
|
+
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
35
|
+
* @param expectedL2BlockNumber - The next expected L2 block number.
|
|
36
|
+
* @param logs - L2BlockProcessed logs.
|
|
37
|
+
*/
|
|
38
|
+
export async function processBlockLogs(publicClient, expectedL2BlockNumber, logs) {
|
|
39
|
+
const retrievedBlocks = [];
|
|
40
|
+
for (const log of logs) {
|
|
41
|
+
const blockNum = log.args.blockNum;
|
|
42
|
+
if (blockNum !== expectedL2BlockNumber) {
|
|
43
|
+
throw new Error('Block number mismatch. Expected: ' + expectedL2BlockNumber + ' but got: ' + blockNum + '.');
|
|
44
|
+
}
|
|
45
|
+
// TODO: Fetch blocks from calldata in parallel
|
|
46
|
+
const newBlock = await getBlockFromCallData(publicClient, log.transactionHash, log.args.blockNum);
|
|
47
|
+
retrievedBlocks.push(newBlock);
|
|
48
|
+
expectedL2BlockNumber++;
|
|
49
|
+
}
|
|
50
|
+
return retrievedBlocks;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Builds an L2 block out of calldata from the tx that published it.
|
|
54
|
+
* Assumes that the block was published from an EOA.
|
|
55
|
+
* TODO: Add retries and error management.
|
|
56
|
+
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
57
|
+
* @param txHash - Hash of the tx that published it.
|
|
58
|
+
* @param l2BlockNum - L2 block number.
|
|
59
|
+
* @returns An L2 block deserialized from the calldata.
|
|
60
|
+
*/
|
|
61
|
+
async function getBlockFromCallData(publicClient, txHash, l2BlockNum) {
|
|
62
|
+
const { input: data } = await publicClient.getTransaction({ hash: txHash });
|
|
63
|
+
// TODO: File a bug in viem who complains if we dont remove the ctor from the abi here
|
|
64
|
+
const { functionName, args } = decodeFunctionData({
|
|
65
|
+
abi: RollupAbi.filter(item => item.type.toString() !== 'constructor'),
|
|
66
|
+
data,
|
|
67
|
+
});
|
|
68
|
+
if (functionName !== 'process')
|
|
69
|
+
throw new Error(`Unexpected method called ${functionName}`);
|
|
70
|
+
const [, l2BlockHex] = args;
|
|
71
|
+
const block = L2Block.decode(Buffer.from(hexToBytes(l2BlockHex)));
|
|
72
|
+
if (BigInt(block.number) !== l2BlockNum) {
|
|
73
|
+
throw new Error(`Block number mismatch: expected ${l2BlockNum} but got ${block.number}`);
|
|
74
|
+
}
|
|
75
|
+
return block;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Gets relevant `L2BlockProcessed` logs from chain.
|
|
79
|
+
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
80
|
+
* @param rollupAddress - The address of the rollup contract.
|
|
81
|
+
* @param fromBlock - First block to get logs from (inclusive).
|
|
82
|
+
* @returns An array of `L2BlockProcessed` logs.
|
|
83
|
+
*/
|
|
84
|
+
export async function getL2BlockProcessedLogs(publicClient, rollupAddress, fromBlock) {
|
|
85
|
+
// Note: For some reason the return type of `getLogs` would not get correctly derived if I didn't set the abiItem
|
|
86
|
+
// as a standalone constant.
|
|
87
|
+
const abiItem = getAbiItem({
|
|
88
|
+
abi: RollupAbi,
|
|
89
|
+
name: 'L2BlockProcessed',
|
|
90
|
+
});
|
|
91
|
+
return await publicClient.getLogs({
|
|
92
|
+
address: getAddress(rollupAddress.toString()),
|
|
93
|
+
event: abiItem,
|
|
94
|
+
fromBlock,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Gets relevant `ContractDeployment` logs from chain.
|
|
99
|
+
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
100
|
+
* @param contractDeploymentEmitterAddress - The address of the L2 contract deployment emitter contract.
|
|
101
|
+
* @param fromBlock - First block to get logs from (inclusive).
|
|
102
|
+
* @returns An array of `ContractDeployment` logs.
|
|
103
|
+
*/
|
|
104
|
+
export async function getContractDeploymentLogs(publicClient, contractDeploymentEmitterAddress, fromBlock) {
|
|
105
|
+
const abiItem = getAbiItem({
|
|
106
|
+
abi: ContractDeploymentEmitterAbi,
|
|
107
|
+
name: 'ContractDeployment',
|
|
108
|
+
});
|
|
109
|
+
return await publicClient.getLogs({
|
|
110
|
+
address: getAddress(contractDeploymentEmitterAddress.toString()),
|
|
111
|
+
event: abiItem,
|
|
112
|
+
fromBlock,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Processes newly received ContractDeployment logs.
|
|
117
|
+
* @param blockHashMapping - A mapping from block number to relevant block hash.
|
|
118
|
+
* @param logs - ContractDeployment logs.
|
|
119
|
+
* @returns The set of retrieved extended contract data items.
|
|
120
|
+
*/
|
|
121
|
+
export function processContractDeploymentLogs(blockHashMapping, logs) {
|
|
122
|
+
const extendedContractData = [];
|
|
123
|
+
for (let i = 0; i < logs.length; i++) {
|
|
124
|
+
const log = logs[i];
|
|
125
|
+
const l2BlockNum = Number(log.args.l2BlockNum);
|
|
126
|
+
const blockHash = Buffer.from(hexToBytes(log.args.l2BlockHash));
|
|
127
|
+
const expectedBlockHash = blockHashMapping[l2BlockNum];
|
|
128
|
+
if (expectedBlockHash === undefined || !blockHash.equals(expectedBlockHash)) {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
const publicFnsReader = BufferReader.asReader(Buffer.from(log.args.acir.slice(2), 'hex'));
|
|
132
|
+
const partialAddress = Fr.fromBuffer(Buffer.from(hexToBytes(log.args.partialAddress)));
|
|
133
|
+
const publicKey = new Point(Fr.fromBuffer(Buffer.from(hexToBytes(log.args.pubKeyX))), Fr.fromBuffer(Buffer.from(hexToBytes(log.args.pubKeyY))));
|
|
134
|
+
const contractData = new ExtendedContractData(new ContractData(AztecAddress.fromString(log.args.aztecAddress), EthAddress.fromString(log.args.portalAddress)), publicFnsReader.readVector(EncodedContractFunction), partialAddress, publicKey);
|
|
135
|
+
if (extendedContractData[i]) {
|
|
136
|
+
extendedContractData[i][0].push(contractData);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
extendedContractData[i] = [[contractData], l2BlockNum];
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return extendedContractData;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get relevant `MessageAdded` logs emitted by Inbox on chain.
|
|
146
|
+
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
147
|
+
* @param inboxAddress - The address of the inbox contract.
|
|
148
|
+
* @param fromBlock - First block to get logs from (inclusive).
|
|
149
|
+
* @returns An array of `MessageAdded` logs.
|
|
150
|
+
*/
|
|
151
|
+
export async function getPendingL1ToL2MessageLogs(publicClient, inboxAddress, fromBlock) {
|
|
152
|
+
const abiItem = getAbiItem({
|
|
153
|
+
abi: InboxAbi,
|
|
154
|
+
name: 'MessageAdded',
|
|
155
|
+
});
|
|
156
|
+
return await publicClient.getLogs({
|
|
157
|
+
address: getAddress(inboxAddress.toString()),
|
|
158
|
+
event: abiItem,
|
|
159
|
+
fromBlock,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Get relevant `L1ToL2MessageCancelled` logs emitted by Inbox on chain when pending messages are cancelled
|
|
164
|
+
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
165
|
+
* @param inboxAddress - The address of the inbox contract.
|
|
166
|
+
* @param fromBlock - First block to get logs from (inclusive).
|
|
167
|
+
* @returns An array of `L1ToL2MessageCancelled` logs.
|
|
168
|
+
*/
|
|
169
|
+
export async function getL1ToL2MessageCancelledLogs(publicClient, inboxAddress, fromBlock) {
|
|
170
|
+
const abiItem = getAbiItem({
|
|
171
|
+
abi: InboxAbi,
|
|
172
|
+
name: 'L1ToL2MessageCancelled',
|
|
173
|
+
});
|
|
174
|
+
return await publicClient.getLogs({
|
|
175
|
+
address: getAddress(inboxAddress.toString()),
|
|
176
|
+
event: abiItem,
|
|
177
|
+
fromBlock,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXRoX2xvZ19oYW5kbGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcmNoaXZlci9ldGhfbG9nX2hhbmRsZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hGLE9BQU8sRUFDTCxZQUFZLEVBQ1osWUFBWSxFQUNaLHVCQUF1QixFQUN2QixvQkFBb0IsRUFDcEIsT0FBTyxFQUNQLGFBQWEsRUFDYixPQUFPLEVBQ1AsT0FBTyxHQUNSLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBMEIsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdEc7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxvQ0FBb0MsQ0FDbEQsSUFBNkU7SUFFN0UsTUFBTSxjQUFjLEdBQW9CLEVBQUUsQ0FBQztJQUMzQyxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRTtRQUN0QixNQUFNLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUN4RyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ1gsY0FBYyxDQUFDLElBQUksQ0FDakIsSUFBSSxhQUFhLENBQ2YsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsRUFDakUs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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/archiver/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export * from './archiver.js';
|
|
2
|
+
export * from './config.js';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXJjaGl2ZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyxhQUFhLENBQUMifQ==
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
2
|
+
import { L1ToL2Message } from '@aztec/types';
|
|
3
|
+
/**
|
|
4
|
+
* A simple in-memory implementation of an L1 to L2 message store
|
|
5
|
+
* that handles message duplication.
|
|
6
|
+
*/
|
|
7
|
+
export declare class L1ToL2MessageStore {
|
|
8
|
+
/**
|
|
9
|
+
* A map containing the message key to the corresponding L1 to L2
|
|
10
|
+
* messages (and the number of times the message has been seen).
|
|
11
|
+
*/
|
|
12
|
+
protected store: Map<bigint, L1ToL2MessageAndCount>;
|
|
13
|
+
constructor();
|
|
14
|
+
addMessage(messageKey: Fr, msg: L1ToL2Message): void;
|
|
15
|
+
getMessage(messageKey: Fr): L1ToL2Message | undefined;
|
|
16
|
+
getMessageAndCount(messageKey: Fr): L1ToL2MessageAndCount | undefined;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Specifically for the store that will hold pending messages
|
|
20
|
+
* for removing messages or fetching multiple messages.
|
|
21
|
+
*/
|
|
22
|
+
export declare class PendingL1ToL2MessageStore extends L1ToL2MessageStore {
|
|
23
|
+
getMessageKeys(limit: number): Fr[];
|
|
24
|
+
removeMessage(messageKey: Fr): void;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Useful to keep track of the number of times a message has been seen.
|
|
28
|
+
*/
|
|
29
|
+
type L1ToL2MessageAndCount = {
|
|
30
|
+
/**
|
|
31
|
+
* The message.
|
|
32
|
+
*/
|
|
33
|
+
message: L1ToL2Message;
|
|
34
|
+
/**
|
|
35
|
+
* The number of times the message has been seen.
|
|
36
|
+
*/
|
|
37
|
+
count: number;
|
|
38
|
+
};
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=l1_to_l2_message_store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"l1_to_l2_message_store.d.ts","sourceRoot":"","sources":["../../src/archiver/l1_to_l2_message_store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAa;;IAIhE,UAAU,CAAC,UAAU,EAAE,EAAE,EAAE,GAAG,EAAE,aAAa;IAU7C,UAAU,CAAC,UAAU,EAAE,EAAE,GAAG,aAAa,GAAG,SAAS;IAIrD,kBAAkB,CAAC,UAAU,EAAE,EAAE,GAAG,qBAAqB,GAAG,SAAS;CAGtE;AAED;;;GAGG;AACH,qBAAa,yBAA0B,SAAQ,kBAAkB;IAC/D,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,EAAE,EAAE;IAmBnC,aAAa,CAAC,UAAU,EAAE,EAAE;CAc7B;AAED;;GAEG;AACH,KAAK,qBAAqB,GAAG;IAC3B;;OAEG;IACH,OAAO,EAAE,aAAa,CAAC;IACvB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;CACf,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
2
|
+
/**
|
|
3
|
+
* A simple in-memory implementation of an L1 to L2 message store
|
|
4
|
+
* that handles message duplication.
|
|
5
|
+
*/
|
|
6
|
+
export class L1ToL2MessageStore {
|
|
7
|
+
constructor() {
|
|
8
|
+
/**
|
|
9
|
+
* A map containing the message key to the corresponding L1 to L2
|
|
10
|
+
* messages (and the number of times the message has been seen).
|
|
11
|
+
*/
|
|
12
|
+
this.store = new Map();
|
|
13
|
+
}
|
|
14
|
+
addMessage(messageKey, msg) {
|
|
15
|
+
const messageKeyBigInt = messageKey.value;
|
|
16
|
+
const msgAndCount = this.store.get(messageKeyBigInt);
|
|
17
|
+
if (msgAndCount) {
|
|
18
|
+
msgAndCount.count++;
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
this.store.set(messageKeyBigInt, { message: msg, count: 1 });
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
getMessage(messageKey) {
|
|
25
|
+
return this.store.get(messageKey.value)?.message;
|
|
26
|
+
}
|
|
27
|
+
getMessageAndCount(messageKey) {
|
|
28
|
+
return this.store.get(messageKey.value);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Specifically for the store that will hold pending messages
|
|
33
|
+
* for removing messages or fetching multiple messages.
|
|
34
|
+
*/
|
|
35
|
+
export class PendingL1ToL2MessageStore extends L1ToL2MessageStore {
|
|
36
|
+
getMessageKeys(limit) {
|
|
37
|
+
if (limit < 1) {
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
// fetch `limit` number of messages from the store with the highest fee.
|
|
41
|
+
// Note the store has multiple of the same message. So if a message has count 2, include both of them in the result:
|
|
42
|
+
const messages = [];
|
|
43
|
+
const sortedMessages = Array.from(this.store.values()).sort((a, b) => b.message.fee - a.message.fee);
|
|
44
|
+
for (const messageAndCount of sortedMessages) {
|
|
45
|
+
for (let i = 0; i < messageAndCount.count; i++) {
|
|
46
|
+
messages.push(messageAndCount.message.entryKey);
|
|
47
|
+
if (messages.length === limit) {
|
|
48
|
+
return messages;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return messages;
|
|
53
|
+
}
|
|
54
|
+
removeMessage(messageKey) {
|
|
55
|
+
// ignore 0 - messageKey is a hash, so a 0 can probabilistically never occur. It is best to skip it.
|
|
56
|
+
if (messageKey.equals(Fr.ZERO))
|
|
57
|
+
return;
|
|
58
|
+
const messageKeyBigInt = messageKey.value;
|
|
59
|
+
const msgAndCount = this.store.get(messageKeyBigInt);
|
|
60
|
+
if (!msgAndCount) {
|
|
61
|
+
throw new Error(`Unable to remove message: L1 to L2 Message with key ${messageKeyBigInt} not found in store`);
|
|
62
|
+
}
|
|
63
|
+
if (msgAndCount.count > 1) {
|
|
64
|
+
msgAndCount.count--;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
this.store.delete(messageKeyBigInt);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDFfdG9fbDJfbWVzc2FnZV9zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcmNoaXZlci9sMV90b19sMl9tZXNzYWdlX3N0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUc5Qzs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBTzdCO1FBTkE7OztXQUdHO1FBQ08sVUFBSyxHQUF1QyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRWpELENBQUM7SUFFaEIsVUFBVSxDQUFDLFVBQWMsRUFBRSxHQUFrQjtRQUMzQyxNQUFNLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDMUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNyRCxJQUFJLFdBQVcsRUFBRTtZQUNmLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUNyQjthQUFNO1lBQ0wsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzlEO0lBQ0gsQ0FBQztJQUVELFVBQVUsQ0FBQyxVQUFjO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sQ0FBQztJQUNuRCxDQUFDO0lBRUQsa0JBQWtCLENBQUMsVUFBYztRQUMvQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxDQUFDO0NBQ0Y7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8seUJBQTBCLFNBQVEsa0JBQWtCO0lBQy9ELGNBQWMsQ0FBQyxLQUFhO1FBQzFCLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRTtZQUNiLE9BQU8sRUFBRSxDQUFDO1NBQ1g7UUFDRCx3RUFBd0U7UUFDeEUsb0hBQW9IO1FBQ3BILE1BQU0sUUFBUSxHQUFTLEVBQUUsQ0FBQztRQUMxQixNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JHLEtBQUssTUFBTSxlQUFlLElBQUksY0FBYyxFQUFFO1lBQzVDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUM5QyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsUUFBUyxDQUFDLENBQUM7Z0JBQ2pELElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxLQUFLLEVBQUU7b0JBQzdCLE9BQU8sUUFBUSxDQUFDO2lCQUNqQjthQUNGO1NBQ0Y7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsYUFBYSxDQUFDLFVBQWM7UUFDMUIsb0dBQW9HO1FBQ3BHLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQUUsT0FBTztRQUN2QyxNQUFNLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDMUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsdURBQXVELGdCQUFnQixxQkFBcUIsQ0FBQyxDQUFDO1NBQy9HO1FBQ0QsSUFBSSxXQUFXLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRTtZQUN6QixXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDckI7YUFBTTtZQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7U0FDckM7SUFDSCxDQUFDO0NBQ0YifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"l1_to_l2_message_store.test.d.ts","sourceRoot":"","sources":["../../src/archiver/l1_to_l2_message_store.test.ts"],"names":[],"mappings":""}
|