@aztec/archiver 0.28.1 → 0.29.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.
Files changed (52) hide show
  1. package/dest/archiver/archiver.d.ts +13 -53
  2. package/dest/archiver/archiver.d.ts.map +1 -1
  3. package/dest/archiver/archiver.js +42 -180
  4. package/dest/archiver/archiver_store.d.ts +17 -63
  5. package/dest/archiver/archiver_store.d.ts.map +1 -1
  6. package/dest/archiver/archiver_store_test_suite.d.ts.map +1 -1
  7. package/dest/archiver/archiver_store_test_suite.js +26 -168
  8. package/dest/archiver/data_retrieval.d.ts +5 -26
  9. package/dest/archiver/data_retrieval.d.ts.map +1 -1
  10. package/dest/archiver/data_retrieval.js +10 -64
  11. package/dest/archiver/eth_log_handlers.d.ts +5 -36
  12. package/dest/archiver/eth_log_handlers.d.ts.map +1 -1
  13. package/dest/archiver/eth_log_handlers.js +7 -75
  14. package/dest/archiver/kv_archiver_store/block_store.d.ts +2 -2
  15. package/dest/archiver/kv_archiver_store/block_store.d.ts.map +1 -1
  16. package/dest/archiver/kv_archiver_store/block_store.js +3 -3
  17. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +11 -52
  18. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +1 -1
  19. package/dest/archiver/kv_archiver_store/kv_archiver_store.js +21 -84
  20. package/dest/archiver/kv_archiver_store/message_store.d.ts +10 -41
  21. package/dest/archiver/kv_archiver_store/message_store.d.ts.map +1 -1
  22. package/dest/archiver/kv_archiver_store/message_store.js +31 -136
  23. package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.d.ts +8 -41
  24. package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.d.ts.map +1 -1
  25. package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.js +22 -79
  26. package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts +14 -76
  27. package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts.map +1 -1
  28. package/dest/archiver/memory_archiver_store/memory_archiver_store.js +22 -134
  29. package/dest/index.d.ts.map +1 -1
  30. package/dest/index.js +3 -15
  31. package/dest/rpc/archiver_client.d.ts.map +1 -1
  32. package/dest/rpc/archiver_client.js +2 -6
  33. package/dest/rpc/archiver_server.d.ts.map +1 -1
  34. package/dest/rpc/archiver_server.js +2 -6
  35. package/package.json +9 -9
  36. package/src/archiver/archiver.ts +47 -230
  37. package/src/archiver/archiver_store.ts +17 -72
  38. package/src/archiver/archiver_store_test_suite.ts +25 -208
  39. package/src/archiver/data_retrieval.ts +11 -93
  40. package/src/archiver/eth_log_handlers.ts +10 -104
  41. package/src/archiver/kv_archiver_store/block_store.ts +2 -2
  42. package/src/archiver/kv_archiver_store/kv_archiver_store.ts +19 -89
  43. package/src/archiver/kv_archiver_store/message_store.ts +36 -165
  44. package/src/archiver/memory_archiver_store/l1_to_l2_message_store.ts +21 -90
  45. package/src/archiver/memory_archiver_store/memory_archiver_store.ts +23 -150
  46. package/src/index.ts +1 -15
  47. package/src/rpc/archiver_client.ts +0 -8
  48. package/src/rpc/archiver_server.ts +0 -8
  49. package/dest/archiver/kv_archiver_store/contract_store.d.ts +0 -26
  50. package/dest/archiver/kv_archiver_store/contract_store.d.ts.map +0 -1
  51. package/dest/archiver/kv_archiver_store/contract_store.js +0 -49
  52. package/src/archiver/kv_archiver_store/contract_store.ts +0 -55
@@ -1,10 +1,10 @@
1
- import { ContractData, ContractDataSource, EncodedContractFunction, ExtendedContractData, GetUnencryptedLogsResponse, L1ToL2Message, L1ToL2MessageSource, L2Block, L2BlockL2Logs, L2BlockSource, L2LogsSource, LogFilter, LogType, TxEffect, TxHash, TxReceipt } from '@aztec/circuit-types';
1
+ import { GetUnencryptedLogsResponse, L1ToL2MessageSource, L2Block, L2BlockL2Logs, L2BlockSource, L2LogsSource, LogFilter, LogType, TxEffect, TxHash, TxReceipt } from '@aztec/circuit-types';
2
2
  import { FunctionSelector } from '@aztec/circuits.js';
3
3
  import { AztecAddress } from '@aztec/foundation/aztec-address';
4
4
  import { EthAddress } from '@aztec/foundation/eth-address';
5
5
  import { Fr } from '@aztec/foundation/fields';
6
6
  import { DebugLogger } from '@aztec/foundation/log';
7
- import { ContractClassPublic, ContractInstanceWithAddress } from '@aztec/types/contracts';
7
+ import { ContractClassPublic, ContractDataSource, ContractInstanceWithAddress, PublicFunction } from '@aztec/types/contracts';
8
8
  import { Chain, HttpTransport, PublicClient } from 'viem';
9
9
  import { ArchiverDataStore } from './archiver_store.js';
10
10
  import { ArchiverConfig } from './config.js';
@@ -22,7 +22,6 @@ export declare class Archiver implements ArchiveSource {
22
22
  private readonly rollupAddress;
23
23
  private readonly availabilityOracleAddress;
24
24
  private readonly inboxAddress;
25
- private readonly newInboxAddress;
26
25
  private readonly registryAddress;
27
26
  private readonly store;
28
27
  private readonly pollingIntervalMs;
@@ -40,13 +39,12 @@ export declare class Archiver implements ArchiveSource {
40
39
  * @param publicClient - A client for interacting with the Ethereum node.
41
40
  * @param rollupAddress - Ethereum address of the rollup contract.
42
41
  * @param inboxAddress - Ethereum address of the inbox contract.
43
- * @param newInboxAddress - Ethereum address of the new inbox contract.
44
42
  * @param registryAddress - Ethereum address of the registry contract.
45
43
  * @param pollingIntervalMs - The interval for polling for L1 logs (in milliseconds).
46
44
  * @param store - An archiver data store for storage & retrieval of blocks, encrypted logs & contract data.
47
45
  * @param log - A logger.
48
46
  */
49
- constructor(publicClient: PublicClient<HttpTransport, Chain>, rollupAddress: EthAddress, availabilityOracleAddress: EthAddress, inboxAddress: EthAddress, newInboxAddress: EthAddress, registryAddress: EthAddress, store: ArchiverDataStore, pollingIntervalMs?: number, log?: DebugLogger);
47
+ constructor(publicClient: PublicClient<HttpTransport, Chain>, rollupAddress: EthAddress, availabilityOracleAddress: EthAddress, inboxAddress: EthAddress, registryAddress: EthAddress, store: ArchiverDataStore, pollingIntervalMs?: number, log?: DebugLogger);
50
48
  /**
51
49
  * Creates a new instance of the Archiver and blocks until it syncs from chain.
52
50
  * @param config - The archiver's desired configuration.
@@ -75,14 +73,6 @@ export declare class Archiver implements ArchiveSource {
75
73
  * @param allLogs - All logs emitted in a bunch of blocks.
76
74
  */
77
75
  private storeDeployedContractInstances;
78
- /**
79
- * Stores extended contract data as classes and instances.
80
- * Temporary solution until we source this data from the contract class registerer and instance deployer.
81
- * @param contracts - The extended contract data to be stored.
82
- * @param l2BlockNum - The L2 block number to which the contract data corresponds.
83
- * TODO(palla/purge-old-contract-deploy): Delete this method
84
- */
85
- storeContractDataAsClassesAndInstances(contracts: ExtendedContractData[], l2BlockNum: number): Promise<void>;
86
76
  /**
87
77
  * Stops the archiver.
88
78
  * @returns A promise signalling completion of the stop process.
@@ -105,37 +95,13 @@ export declare class Archiver implements ArchiveSource {
105
95
  getBlock(number: number): Promise<L2Block | undefined>;
106
96
  getTxEffect(txHash: TxHash): Promise<TxEffect | undefined>;
107
97
  getSettledTxReceipt(txHash: TxHash): Promise<TxReceipt | undefined>;
108
- /**
109
- * Get the extended contract data for this contract.
110
- * @param contractAddress - The contract data address.
111
- * @returns The extended contract data or undefined if not found.
112
- */
113
- getExtendedContractData(contractAddress: AztecAddress): Promise<ExtendedContractData | undefined>;
114
- /**
115
- * Temporary method for creating a fake extended contract data out of classes and instances registered in the node.
116
- * Used as a fallback if the extended contract data is not found.
117
- * TODO(palla/purge-old-contract-deploy): Use proper classes
118
- */
119
- private makeExtendedContractDataFor;
120
- /**
121
- * Lookup the contract data for this contract.
122
- * Contains contract address & the ethereum portal address.
123
- * @param contractAddress - The contract data address.
124
- * @returns ContractData with the portal address (if we didn't throw an error).
125
- */
126
- getContractData(contractAddress: AztecAddress): Promise<ContractData | undefined>;
127
- /**
128
- * Temporary method for creating a fake contract data out of classes and instances registered in the node.
129
- * Used as a fallback if the extended contract data is not found.
130
- */
131
- private makeContractDataFor;
132
98
  /**
133
99
  * Gets the public function data for a contract.
134
- * @param contractAddress - The contract address containing the function to fetch.
100
+ * @param address - The contract address containing the function to fetch.
135
101
  * @param selector - The function selector of the function to fetch.
136
102
  * @returns The public function data (if found).
137
103
  */
138
- getPublicFunction(contractAddress: AztecAddress, selector: FunctionSelector): Promise<EncodedContractFunction | undefined>;
104
+ getPublicFunction(address: AztecAddress, selector: FunctionSelector): Promise<PublicFunction | undefined>;
139
105
  /**
140
106
  * Gets up to `limit` amount of logs starting from `from`.
141
107
  * @param from - Number of the L2 block to which corresponds the first logs to be returned.
@@ -158,23 +124,17 @@ export declare class Archiver implements ArchiveSource {
158
124
  getContractClass(id: Fr): Promise<ContractClassPublic | undefined>;
159
125
  getContract(address: AztecAddress): Promise<ContractInstanceWithAddress | undefined>;
160
126
  /**
161
- * Gets up to `limit` amount of pending L1 to L2 messages.
162
- * @param limit - The number of messages to return.
163
- * @returns The requested L1 to L2 messages' keys.
164
- */
165
- getPendingL1ToL2EntryKeys(limit: number): Promise<Fr[]>;
166
- /**
167
- * Gets the confirmed/consumed L1 to L2 message associated with the given entry key
168
- * @param entryKey - The entry key.
169
- * @returns The L1 to L2 message (throws if not found).
170
- */
171
- getConfirmedL1ToL2Message(entryKey: Fr): Promise<L1ToL2Message>;
172
- /**
173
- * Gets new L1 to L2 message (to be) included in a given block.
127
+ * Gets L1 to L2 message (to be) included in a given block.
174
128
  * @param blockNumber - L2 block number to get messages for.
175
129
  * @returns The L1 to L2 messages/leaves of the messages subtree (throws if not found).
176
130
  */
177
- getNewL1ToL2Messages(blockNumber: bigint): Promise<Fr[]>;
131
+ getL1ToL2Messages(blockNumber: bigint): Promise<Fr[]>;
132
+ /**
133
+ * Gets the L1 to L2 message index in the L1 to L2 message tree.
134
+ * @param l1ToL2Message - The L1 to L2 message.
135
+ * @returns The index of the L1 to L2 message in the L1 to L2 message tree.
136
+ */
137
+ getL1ToL2MessageIndex(l1ToL2Message: Fr): Promise<bigint>;
178
138
  getContractClassIds(): Promise<Fr[]>;
179
139
  }
180
140
  //# sourceMappingURL=archiver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"archiver.d.ts","sourceRoot":"","sources":["../../src/archiver/archiver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"archiver.d.ts","sourceRoot":"","sources":["../../src/archiver/archiver.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,12 @@
1
- import { ContractData, ExtendedContractData, L2Block, UnencryptedL2Log, } from '@aztec/circuit-types';
1
+ import { L2Block, UnencryptedL2Log, } from '@aztec/circuit-types';
2
2
  import { ContractClassRegisteredEvent } from '@aztec/circuits.js';
3
3
  import { ContractInstanceDeployedEvent } from '@aztec/circuits.js/contract';
4
4
  import { createEthereumChain } from '@aztec/ethereum';
5
- import { EthAddress } from '@aztec/foundation/eth-address';
6
- import { Fr } from '@aztec/foundation/fields';
7
5
  import { createDebugLogger } from '@aztec/foundation/log';
8
6
  import { RunningPromise } from '@aztec/foundation/running-promise';
9
- import { RollupAbi } from '@aztec/l1-artifacts';
10
7
  import { ClassRegistererAddress } from '@aztec/protocol-contracts/class-registerer';
11
- import { InstanceDeployerAddress } from '@aztec/protocol-contracts/instance-deployer';
12
- import { createPublicClient, getAddress, getContract, http } from 'viem';
13
- import { retrieveBlockBodiesFromAvailabilityOracle, retrieveBlockMetadataFromRollup, retrieveNewCancelledL1ToL2Messages, retrieveNewL1ToL2Messages, retrieveNewPendingL1ToL2Messages, } from './data_retrieval.js';
8
+ import { createPublicClient, http } from 'viem';
9
+ import { retrieveBlockBodiesFromAvailabilityOracle, retrieveBlockMetadataFromRollup, retrieveL1ToL2Messages, } from './data_retrieval.js';
14
10
  /**
15
11
  * Pulls L2 blocks in a non-blocking manner and provides interface for their retrieval.
16
12
  * Responsible for handling robust L1 polling so that other components do not need to
@@ -22,18 +18,16 @@ export class Archiver {
22
18
  * @param publicClient - A client for interacting with the Ethereum node.
23
19
  * @param rollupAddress - Ethereum address of the rollup contract.
24
20
  * @param inboxAddress - Ethereum address of the inbox contract.
25
- * @param newInboxAddress - Ethereum address of the new inbox contract.
26
21
  * @param registryAddress - Ethereum address of the registry contract.
27
22
  * @param pollingIntervalMs - The interval for polling for L1 logs (in milliseconds).
28
23
  * @param store - An archiver data store for storage & retrieval of blocks, encrypted logs & contract data.
29
24
  * @param log - A logger.
30
25
  */
31
- constructor(publicClient, rollupAddress, availabilityOracleAddress, inboxAddress, newInboxAddress, registryAddress, store, pollingIntervalMs = 10000, log = createDebugLogger('aztec:archiver')) {
26
+ constructor(publicClient, rollupAddress, availabilityOracleAddress, inboxAddress, registryAddress, store, pollingIntervalMs = 10000, log = createDebugLogger('aztec:archiver')) {
32
27
  this.publicClient = publicClient;
33
28
  this.rollupAddress = rollupAddress;
34
29
  this.availabilityOracleAddress = availabilityOracleAddress;
35
30
  this.inboxAddress = inboxAddress;
36
- this.newInboxAddress = newInboxAddress;
37
31
  this.registryAddress = registryAddress;
38
32
  this.store = store;
39
33
  this.pollingIntervalMs = pollingIntervalMs;
@@ -57,17 +51,7 @@ export class Archiver {
57
51
  transport: http(chain.rpcUrl),
58
52
  pollingInterval: config.viemPollingIntervalMS,
59
53
  });
60
- // TODO(#4492): Nuke this once the old inbox is purged
61
- let newInboxAddress;
62
- {
63
- const rollup = getContract({
64
- address: getAddress(config.l1Contracts.rollupAddress.toString()),
65
- abi: RollupAbi,
66
- client: publicClient,
67
- });
68
- newInboxAddress = EthAddress.fromString(await rollup.read.NEW_INBOX());
69
- }
70
- const archiver = new Archiver(publicClient, config.l1Contracts.rollupAddress, config.l1Contracts.availabilityOracleAddress, config.l1Contracts.inboxAddress, newInboxAddress, config.l1Contracts.registryAddress, archiverStore, config.archiverPollingIntervalMS);
54
+ const archiver = new Archiver(publicClient, config.l1Contracts.rollupAddress, config.l1Contracts.availabilityOracleAddress, config.l1Contracts.inboxAddress, config.l1Contracts.registryAddress, archiverStore, config.archiverPollingIntervalMS);
71
55
  await archiver.start(blockUntilSynced);
72
56
  return archiver;
73
57
  }
@@ -103,12 +87,9 @@ export class Archiver {
103
87
  *
104
88
  * This code does not handle reorgs.
105
89
  */
106
- const lastL1Blocks = await this.store.getL1BlockNumber();
90
+ const lastL1Blocks = await this.store.getSynchedL1BlockNumbers();
107
91
  const currentL1BlockNumber = await this.publicClient.getBlockNumber();
108
- if (currentL1BlockNumber <= lastL1Blocks.addedBlock &&
109
- currentL1BlockNumber <= lastL1Blocks.newMessages &&
110
- currentL1BlockNumber <= lastL1Blocks.addedMessages &&
111
- currentL1BlockNumber <= lastL1Blocks.cancelledMessages) {
92
+ if (currentL1BlockNumber <= lastL1Blocks.blocks && currentL1BlockNumber <= lastL1Blocks.messages) {
112
93
  // chain hasn't moved forward
113
94
  // or it's been rolled back
114
95
  return;
@@ -131,42 +112,21 @@ export class Archiver {
131
112
  * in future but for the time being it should give us the guarantees that we need
132
113
  */
133
114
  // ********** Events that are processed per L1 block **********
134
- // TODO(#4492): Nuke the following when purging the old inbox
135
- // Process l1ToL2Messages, these are consumed as time passes, not each block
136
- const retrievedPendingL1ToL2Messages = await retrieveNewPendingL1ToL2Messages(this.publicClient, this.inboxAddress, blockUntilSynced, lastL1Blocks.addedMessages + 1n, currentL1BlockNumber);
137
- const retrievedCancelledL1ToL2Messages = await retrieveNewCancelledL1ToL2Messages(this.publicClient, this.inboxAddress, blockUntilSynced, lastL1Blocks.cancelledMessages + 1n, currentL1BlockNumber);
138
- // group pending messages and cancelled messages by their L1 block number
139
- const messagesByBlock = new Map();
140
- for (const [message, blockNumber] of retrievedPendingL1ToL2Messages.retrievedData) {
141
- const messages = messagesByBlock.get(blockNumber) || [[], []];
142
- messages[0].push(message);
143
- messagesByBlock.set(blockNumber, messages);
144
- }
145
- for (const [entryKey, blockNumber] of retrievedCancelledL1ToL2Messages.retrievedData) {
146
- const messages = messagesByBlock.get(blockNumber) || [[], []];
147
- messages[1].push(entryKey);
148
- messagesByBlock.set(blockNumber, messages);
149
- }
150
- // process messages from each L1 block in sequence
151
- const l1BlocksWithMessages = Array.from(messagesByBlock.keys()).sort((a, b) => (a < b ? -1 : a === b ? 0 : 1));
152
- for (const l1Block of l1BlocksWithMessages) {
153
- const [newMessages, cancelledMessages] = messagesByBlock.get(l1Block);
154
- this.log(`Adding ${newMessages.length} new messages and ${cancelledMessages.length} cancelled messages in L1 block ${l1Block}`);
155
- await this.store.addPendingL1ToL2Messages(newMessages, l1Block);
156
- await this.store.cancelPendingL1ToL2EntryKeys(cancelledMessages, l1Block);
157
- }
158
115
  // ********** Events that are processed per L2 block **********
159
- const retrievedNewL1ToL2Messages = await retrieveNewL1ToL2Messages(this.publicClient, this.newInboxAddress, blockUntilSynced, lastL1Blocks.newMessages + 1n, currentL1BlockNumber);
160
- await this.store.addNewL1ToL2Messages(retrievedNewL1ToL2Messages.retrievedData,
116
+ const retrievedL1ToL2Messages = await retrieveL1ToL2Messages(this.publicClient, this.inboxAddress, blockUntilSynced, lastL1Blocks.messages + 1n, currentL1BlockNumber);
117
+ if (retrievedL1ToL2Messages.retrievedData.length !== 0) {
118
+ this.log(`Retrieved ${retrievedL1ToL2Messages.retrievedData.length} new L1 -> L2 messages between L1 blocks ${lastL1Blocks.messages + 1n} and ${currentL1BlockNumber}.`);
119
+ }
120
+ await this.store.addL1ToL2Messages(retrievedL1ToL2Messages.retrievedData,
161
121
  // -1n because the function expects the last block in which the message was emitted and not the one after next
162
- // TODO(#4492): Check whether this could be cleaned up - `nextEthBlockNumber` value doesn't seem to be used much
163
- retrievedNewL1ToL2Messages.nextEthBlockNumber - 1n);
122
+ // TODO(#5264): Check whether this could be cleaned up - `nextEthBlockNumber` value doesn't seem to be used much
123
+ retrievedL1ToL2Messages.nextEthBlockNumber - 1n);
164
124
  // Read all data from chain and then write to our stores at the end
165
- const nextExpectedL2BlockNum = BigInt((await this.store.getBlockNumber()) + 1);
166
- const retrievedBlockBodies = await retrieveBlockBodiesFromAvailabilityOracle(this.publicClient, this.availabilityOracleAddress, blockUntilSynced, lastL1Blocks.addedBlock + 1n, currentL1BlockNumber);
125
+ const nextExpectedL2BlockNum = BigInt((await this.store.getSynchedL2BlockNumber()) + 1);
126
+ const retrievedBlockBodies = await retrieveBlockBodiesFromAvailabilityOracle(this.publicClient, this.availabilityOracleAddress, blockUntilSynced, lastL1Blocks.blocks + 1n, currentL1BlockNumber);
167
127
  const blockBodies = retrievedBlockBodies.retrievedData.map(([blockBody]) => blockBody);
168
128
  await this.store.addBlockBodies(blockBodies);
169
- const retrievedBlockMetadata = await retrieveBlockMetadataFromRollup(this.publicClient, this.rollupAddress, blockUntilSynced, lastL1Blocks.addedBlock + 1n, currentL1BlockNumber, nextExpectedL2BlockNum);
129
+ const retrievedBlockMetadata = await retrieveBlockMetadataFromRollup(this.publicClient, this.rollupAddress, blockUntilSynced, lastL1Blocks.blocks + 1n, currentL1BlockNumber, nextExpectedL2BlockNum);
170
130
  const retrievedBodyHashes = retrievedBlockMetadata.retrievedData.map(([header]) => header.contentCommitment.txsEffectsHash);
171
131
  const blockBodiesFromStore = await this.store.getBlockBodies(retrievedBodyHashes);
172
132
  if (retrievedBlockMetadata.retrievedData.length !== blockBodiesFromStore.length) {
@@ -179,14 +139,13 @@ export class Archiver {
179
139
  return;
180
140
  }
181
141
  else {
182
- this.log(`Retrieved ${retrievedBlocks.retrievedData.length} new L2 blocks between L1 blocks ${lastL1Blocks.addedBlock + 1n} and ${currentL1BlockNumber}.`);
142
+ this.log(`Retrieved ${retrievedBlocks.retrievedData.length} new L2 blocks between L1 blocks ${lastL1Blocks.blocks + 1n} and ${currentL1BlockNumber}.`);
183
143
  }
184
144
  // create the block number -> block hash mapping to ensure we retrieve the appropriate events
185
145
  const blockNumberToBodyHash = {};
186
146
  retrievedBlocks.retrievedData.forEach((block) => {
187
147
  blockNumberToBodyHash[block.number] = block.header.contentCommitment.txsEffectsHash;
188
148
  });
189
- this.log(`Retrieved ${retrievedBlocks.retrievedData.length} block(s) from chain`);
190
149
  await Promise.all(retrievedBlocks.retrievedData.map(block => {
191
150
  const encryptedLogs = block.body.encryptedLogs;
192
151
  const unencryptedLogs = block.body.unencryptedLogs;
@@ -201,12 +160,6 @@ export class Archiver {
201
160
  await this.storeRegisteredContractClasses(blockLogs, block.number);
202
161
  await this.storeDeployedContractInstances(blockLogs, block.number);
203
162
  }));
204
- // from retrieved L2Blocks, confirm L1 to L2 messages that have been published
205
- // from each l2block fetch all entryKeys in a flattened array:
206
- this.log(`Confirming l1 to l2 messages in store`);
207
- for (const block of retrievedBlocks.retrievedData) {
208
- await this.store.confirmL1ToL2EntryKeys(block.body.l1ToL2Messages);
209
- }
210
163
  await this.store.addBlocks(retrievedBlocks.retrievedData);
211
164
  }
212
165
  /**
@@ -225,24 +178,12 @@ export class Archiver {
225
178
  * @param allLogs - All logs emitted in a bunch of blocks.
226
179
  */
227
180
  async storeDeployedContractInstances(allLogs, blockNum) {
228
- const contractInstances = ContractInstanceDeployedEvent.fromLogs(allLogs, InstanceDeployerAddress).map(e => e.toContractInstance());
181
+ const contractInstances = ContractInstanceDeployedEvent.fromLogs(allLogs).map(e => e.toContractInstance());
229
182
  if (contractInstances.length > 0) {
230
183
  contractInstances.forEach(c => this.log(`Storing contract instance at ${c.address.toString()}`));
231
184
  await this.store.addContractInstances(contractInstances, blockNum);
232
185
  }
233
186
  }
234
- /**
235
- * Stores extended contract data as classes and instances.
236
- * Temporary solution until we source this data from the contract class registerer and instance deployer.
237
- * @param contracts - The extended contract data to be stored.
238
- * @param l2BlockNum - The L2 block number to which the contract data corresponds.
239
- * TODO(palla/purge-old-contract-deploy): Delete this method
240
- */
241
- async storeContractDataAsClassesAndInstances(contracts, l2BlockNum) {
242
- const classesAndInstances = contracts.map(extendedContractDataToContractClassAndInstance);
243
- await this.store.addContractClasses(classesAndInstances.map(([c, _]) => c), l2BlockNum);
244
- await this.store.addContractInstances(classesAndInstances.map(([_, i]) => i), l2BlockNum);
245
- }
246
187
  /**
247
188
  * Stops the archiver.
248
189
  * @returns A promise signalling completion of the stop process.
@@ -276,7 +217,7 @@ export class Archiver {
276
217
  async getBlock(number) {
277
218
  // If the number provided is -ve, then return the latest block.
278
219
  if (number < 0) {
279
- number = await this.store.getBlockNumber();
220
+ number = await this.store.getSynchedL2BlockNumber();
280
221
  }
281
222
  const blocks = await this.store.getBlocks(number, 1);
282
223
  return blocks.length === 0 ? undefined : blocks[0];
@@ -288,59 +229,21 @@ export class Archiver {
288
229
  return this.store.getSettledTxReceipt(txHash);
289
230
  }
290
231
  /**
291
- * Get the extended contract data for this contract.
292
- * @param contractAddress - The contract data address.
293
- * @returns The extended contract data or undefined if not found.
294
- */
295
- async getExtendedContractData(contractAddress) {
296
- return ((await this.store.getExtendedContractData(contractAddress)) ?? this.makeExtendedContractDataFor(contractAddress));
297
- }
298
- /**
299
- * Temporary method for creating a fake extended contract data out of classes and instances registered in the node.
300
- * Used as a fallback if the extended contract data is not found.
301
- * TODO(palla/purge-old-contract-deploy): Use proper classes
232
+ * Gets the public function data for a contract.
233
+ * @param address - The contract address containing the function to fetch.
234
+ * @param selector - The function selector of the function to fetch.
235
+ * @returns The public function data (if found).
302
236
  */
303
- async makeExtendedContractDataFor(address) {
304
- const instance = await this.store.getContractInstance(address);
237
+ async getPublicFunction(address, selector) {
238
+ const instance = await this.getContract(address);
305
239
  if (!instance) {
306
- return undefined;
240
+ throw new Error(`Contract ${address.toString()} not found`);
307
241
  }
308
- const contractClass = await this.store.getContractClass(instance.contractClassId);
242
+ const contractClass = await this.getContractClass(instance.contractClassId);
309
243
  if (!contractClass) {
310
- this.log.warn(`Class ${instance.contractClassId.toString()} for address ${address.toString()} not found`);
311
- return undefined;
244
+ throw new Error(`Contract class ${instance.contractClassId.toString()} for ${address.toString()} not found`);
312
245
  }
313
- return ExtendedContractData.fromClassAndInstance(contractClass, instance);
314
- }
315
- /**
316
- * Lookup the contract data for this contract.
317
- * Contains contract address & the ethereum portal address.
318
- * @param contractAddress - The contract data address.
319
- * @returns ContractData with the portal address (if we didn't throw an error).
320
- */
321
- getContractData(contractAddress) {
322
- return this.makeContractDataFor(contractAddress);
323
- }
324
- /**
325
- * Temporary method for creating a fake contract data out of classes and instances registered in the node.
326
- * Used as a fallback if the extended contract data is not found.
327
- */
328
- async makeContractDataFor(address) {
329
- const instance = await this.store.getContractInstance(address);
330
- if (!instance) {
331
- return undefined;
332
- }
333
- return new ContractData(address, instance.portalContractAddress);
334
- }
335
- /**
336
- * Gets the public function data for a contract.
337
- * @param contractAddress - The contract address containing the function to fetch.
338
- * @param selector - The function selector of the function to fetch.
339
- * @returns The public function data (if found).
340
- */
341
- async getPublicFunction(contractAddress, selector) {
342
- const contractData = await this.getExtendedContractData(contractAddress);
343
- return contractData?.getPublicFunction(selector);
246
+ return contractClass.publicFunctions.find(f => f.selector.equals(selector));
344
247
  }
345
248
  /**
346
249
  * Gets up to `limit` amount of logs starting from `from`.
@@ -365,7 +268,7 @@ export class Archiver {
365
268
  * @returns The number of the latest L2 block processed by the block source implementation.
366
269
  */
367
270
  getBlockNumber() {
368
- return this.store.getBlockNumber();
271
+ return this.store.getSynchedL2BlockNumber();
369
272
  }
370
273
  getContractClass(id) {
371
274
  return this.store.getContractClass(id);
@@ -374,64 +277,23 @@ export class Archiver {
374
277
  return this.store.getContractInstance(address);
375
278
  }
376
279
  /**
377
- * Gets up to `limit` amount of pending L1 to L2 messages.
378
- * @param limit - The number of messages to return.
379
- * @returns The requested L1 to L2 messages' keys.
380
- */
381
- getPendingL1ToL2EntryKeys(limit) {
382
- return this.store.getPendingL1ToL2EntryKeys(limit);
383
- }
384
- /**
385
- * Gets the confirmed/consumed L1 to L2 message associated with the given entry key
386
- * @param entryKey - The entry key.
387
- * @returns The L1 to L2 message (throws if not found).
280
+ * Gets L1 to L2 message (to be) included in a given block.
281
+ * @param blockNumber - L2 block number to get messages for.
282
+ * @returns The L1 to L2 messages/leaves of the messages subtree (throws if not found).
388
283
  */
389
- getConfirmedL1ToL2Message(entryKey) {
390
- return this.store.getConfirmedL1ToL2Message(entryKey);
284
+ getL1ToL2Messages(blockNumber) {
285
+ return this.store.getL1ToL2Messages(blockNumber);
391
286
  }
392
287
  /**
393
- * Gets new L1 to L2 message (to be) included in a given block.
394
- * @param blockNumber - L2 block number to get messages for.
395
- * @returns The L1 to L2 messages/leaves of the messages subtree (throws if not found).
288
+ * Gets the L1 to L2 message index in the L1 to L2 message tree.
289
+ * @param l1ToL2Message - The L1 to L2 message.
290
+ * @returns The index of the L1 to L2 message in the L1 to L2 message tree.
396
291
  */
397
- getNewL1ToL2Messages(blockNumber) {
398
- return this.store.getNewL1ToL2Messages(blockNumber);
292
+ getL1ToL2MessageIndex(l1ToL2Message) {
293
+ return this.store.getL1ToL2MessageIndex(l1ToL2Message);
399
294
  }
400
295
  getContractClassIds() {
401
296
  return this.store.getContractClassIds();
402
297
  }
403
298
  }
404
- /**
405
- * Converts ExtendedContractData into contract classes and instances.
406
- * Note that the conversion is not correct, since there is some data missing from the broadcasted ExtendedContractData.
407
- * The archiver will trust the ids broadcasted instead of trying to recompute them.
408
- * Eventually this function and ExtendedContractData altogether will be removed.
409
- */
410
- function extendedContractDataToContractClassAndInstance(data) {
411
- const contractClass = {
412
- version: 1,
413
- artifactHash: Fr.ZERO,
414
- publicFunctions: data.publicFunctions.map(f => ({
415
- selector: f.selector,
416
- bytecode: f.bytecode,
417
- isInternal: f.isInternal,
418
- })),
419
- privateFunctions: [],
420
- packedBytecode: data.bytecode,
421
- };
422
- const contractClassId = data.contractClassId;
423
- const contractInstance = {
424
- version: 1,
425
- salt: data.saltedInitializationHash,
426
- contractClassId,
427
- initializationHash: data.saltedInitializationHash,
428
- portalContractAddress: data.contractData.portalContractAddress,
429
- publicKeysHash: data.publicKeyHash,
430
- };
431
- const address = data.contractData.contractAddress;
432
- return [
433
- { ...contractClass, id: contractClassId, privateFunctionsRoot: Fr.ZERO },
434
- { ...contractInstance, address },
435
- ];
436
- }
437
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJjaGl2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXJjaGl2ZXIvYXJjaGl2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFlBQVksRUFHWixvQkFBb0IsRUFJcEIsT0FBTyxFQVNQLGdCQUFnQixHQUNqQixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSw0QkFBNEIsRUFBb0IsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlDLE9BQU8sRUFBZSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDcEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFRdEYsT0FBTyxFQUFzQyxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUk3RyxPQUFPLEVBQ0wseUNBQXlDLEVBQ3pDLCtCQUErQixFQUMvQixrQ0FBa0MsRUFDbEMseUJBQXlCLEVBQ3pCLGdDQUFnQyxHQUNqQyxNQUFNLHFCQUFxQixDQUFDO0FBTzdCOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sUUFBUTtJQVduQjs7Ozs7Ozs7OztPQVVHO0lBQ0gsWUFDbUIsWUFBZ0QsRUFDaEQsYUFBeUIsRUFDekIs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
299
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJjaGl2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXJjaGl2ZXIvYXJjaGl2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLE9BQU8sRUFTUCxnQkFBZ0IsR0FDakIsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsNEJBQTRCLEVBQW9CLE1BQU0sb0JBQW9CLENBQUM7QUFDcEYsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDNUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFJdEQsT0FBTyxFQUFlLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBUXBGLE9BQU8sRUFBc0Msa0JBQWtCLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSXBGLE9BQU8sRUFDTCx5Q0FBeUMsRUFDekMsK0JBQStCLEVBQy9CLHNCQUFzQixHQUN2QixNQUFNLHFCQUFxQixDQUFDO0FBTzdCOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sUUFBUTtJQVduQjs7Ozs7Ozs7O09BU0c7SUFDSCxZQUNtQixZQUFnRCxFQUNoRCxhQUF5QixFQUN6Qix5QkFBcUMsRUFDckMsWUFBd0IsRUFDeEIsZUFBMkIsRUFDM0IsS0FBd0IsRUFDeEIsb0JBQW9CLEtBQU0sRUFDMUIsTUFBbUIsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUM7UUFQdEQsaUJBQVksR0FBWixZQUFZLENBQW9DO1FBQ2hELGtCQUFhLEdBQWIsYUFBYSxDQUFZO1FBQ3pCLDhCQUF5QixHQUF6Qix5QkFBeUIsQ0FBWTtRQUNyQyxpQkFBWSxHQUFaLFlBQVksQ0FBWTtRQUN4QixvQkFBZSxHQUFmLGVBQWUsQ0FBWTtRQUMzQixV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