@aztec/aztec-node 0.1.0-alpha13

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.
@@ -0,0 +1,306 @@
1
+ import { Fr, KernelCircuitPublicInputs, Proof, PublicCallRequest, } from '@aztec/circuits.js';
2
+ import { SiblingPath } from '@aztec/merkle-tree';
3
+ import { ContractData, ContractPublicData, EncodedContractFunction, L1ToL2Message, L2Block, L2BlockL2Logs, MerkleTreeId, Tx, TxL2Logs, } from '@aztec/types';
4
+ /**
5
+ * Serialises a transaction to JSON representation.
6
+ * @param tx - The transaction to serialise.
7
+ * @returns The serialsied transaction.
8
+ */
9
+ export function txToJson(tx) {
10
+ return {
11
+ data: tx.data?.toBuffer().toString('hex'),
12
+ encryptedLogs: tx.encryptedLogs?.toBuffer().toString('hex'),
13
+ unencryptedLogs: tx.unencryptedLogs?.toBuffer().toString('hex'),
14
+ proof: tx.proof?.toBuffer().toString('hex'),
15
+ newContractPublicFunctions: tx.newContractPublicFunctions?.map(f => f.toBuffer().toString('hex')) ?? [],
16
+ enqueuedPublicFunctions: tx.enqueuedPublicFunctionCalls?.map(f => f.toBuffer().toString('hex')) ?? [],
17
+ };
18
+ }
19
+ /**
20
+ * Deserialises a transaction from JSON.
21
+ * @param json - The JSON representation of the transaction.
22
+ * @returns The deserialised transaction.
23
+ */
24
+ export function txFromJson(json) {
25
+ const publicInputs = KernelCircuitPublicInputs.fromBuffer(Buffer.from(json.data, 'hex'));
26
+ const encryptedLogs = TxL2Logs.fromBuffer(Buffer.from(json.encryptedLogs, 'hex'));
27
+ const unencryptedLogs = TxL2Logs.fromBuffer(Buffer.from(json.unencryptedLogs, 'hex'));
28
+ const proof = Buffer.from(json.proof, 'hex');
29
+ const newContractPublicFunctions = json.newContractPublicFunctions?.length
30
+ ? json.newContractPublicFunctions.map((x) => EncodedContractFunction.fromBuffer(Buffer.from(x, 'hex')))
31
+ : [];
32
+ const enqueuedPublicFunctions = json.enqueuedPublicFunctions?.length
33
+ ? json.enqueuedPublicFunctions.map((x) => PublicCallRequest.fromBuffer(Buffer.from(x, 'hex')))
34
+ : [];
35
+ return new Tx(publicInputs, Proof.fromBuffer(proof), encryptedLogs, unencryptedLogs, newContractPublicFunctions, enqueuedPublicFunctions);
36
+ }
37
+ /**
38
+ * A Http client based implementation of Aztec Node.
39
+ */
40
+ export class HttpNode {
41
+ constructor(baseUrl) {
42
+ this.baseUrl = baseUrl.toString().replace(/\/$/, '');
43
+ }
44
+ /**
45
+ * Method to determine if the node is ready to accept transactions.
46
+ * @returns - Flag indicating the readiness for tx submission.
47
+ */
48
+ async isReady() {
49
+ const url = new URL(this.baseUrl);
50
+ const response = await fetch(url.toString());
51
+ const respJson = await response.json();
52
+ return respJson.isReady;
53
+ }
54
+ /**
55
+ * Method to request blocks. Will attempt to return all requested blocks but will return only those available.
56
+ * @param from - The start of the range of blocks to return.
57
+ * @param take - The number of blocks desired.
58
+ * @returns The blocks requested.
59
+ */
60
+ async getBlocks(from, take) {
61
+ const url = new URL(`${this.baseUrl}/get-blocks`);
62
+ url.searchParams.append('from', from.toString());
63
+ if (take !== undefined) {
64
+ url.searchParams.append('take', take.toString());
65
+ }
66
+ const response = await (await fetch(url.toString())).json();
67
+ const blocks = response.blocks;
68
+ if (!blocks) {
69
+ return Promise.resolve([]);
70
+ }
71
+ return Promise.resolve(blocks.map(x => L2Block.decode(Buffer.from(x, 'hex'))));
72
+ }
73
+ /**
74
+ * Method to fetch the current block height.
75
+ * @returns The block height as a number.
76
+ */
77
+ async getBlockHeight() {
78
+ const url = new URL(`${this.baseUrl}/get-block-height`);
79
+ const response = await fetch(url.toString());
80
+ const respJson = await response.json();
81
+ return respJson.blockHeight;
82
+ }
83
+ /**
84
+ * Method to fetch the version of the rollup the node is connected to.
85
+ * @returns The rollup version.
86
+ */
87
+ async getVersion() {
88
+ const url = new URL(`${this.baseUrl}/get-version`);
89
+ const response = await fetch(url.toString());
90
+ const respJson = await response.json();
91
+ return respJson.version;
92
+ }
93
+ /**
94
+ * Method to fetch the chain id of the base-layer for the rollup.
95
+ * @returns The chain id.
96
+ */
97
+ async getChainId() {
98
+ const url = new URL(`${this.baseUrl}/get-chain-id`);
99
+ const response = await fetch(url.toString());
100
+ const respJson = await response.json();
101
+ return respJson.chainId;
102
+ }
103
+ /**
104
+ * Lookup the L2 contract data for this contract.
105
+ * Contains the ethereum portal address and bytecode.
106
+ * @param contractAddress - The contract data address.
107
+ * @returns The complete contract data including portal address & bytecode (if we didn't throw an error).
108
+ */
109
+ async getContractData(contractAddress) {
110
+ const url = new URL(`${this.baseUrl}/contract-data`);
111
+ url.searchParams.append('address', contractAddress.toString());
112
+ const response = await (await fetch(url.toString())).json();
113
+ const contract = response.contractData;
114
+ return Promise.resolve(ContractPublicData.fromBuffer(Buffer.from(contract, 'hex')));
115
+ }
116
+ /**
117
+ * Gets the `take` amount of encrypted logs starting from `from`.
118
+ * @param from - Number of the L2 block to which corresponds the first encrypted logs to be returned.
119
+ * @param take - The number of encrypted logs to return.
120
+ * @returns The requested encrypted logs.
121
+ */
122
+ async getEncryptedLogs(from, take) {
123
+ const url = new URL(`${this.baseUrl}/get-encrypted-logs`);
124
+ url.searchParams.append('from', from.toString());
125
+ if (take !== undefined) {
126
+ url.searchParams.append('take', take.toString());
127
+ }
128
+ const response = await (await fetch(url.toString())).json();
129
+ const encryptedLogs = response.encryptedLogs;
130
+ if (!encryptedLogs) {
131
+ return Promise.resolve([]);
132
+ }
133
+ return Promise.resolve(encryptedLogs.map(x => L2BlockL2Logs.fromBuffer(Buffer.from(x, 'hex'))));
134
+ }
135
+ /**
136
+ * Gets the `take` amount of unencrypted logs starting from `from`.
137
+ * @param from - Number of the L2 block to which corresponds the first unencrypted logs to be returned.
138
+ * @param take - The number of unencrypted logs to return.
139
+ * @returns The requested unencrypted logs.
140
+ */
141
+ async getUnencryptedLogs(from, take) {
142
+ const url = new URL(`${this.baseUrl}/get-unencrypted-logs`);
143
+ url.searchParams.append('from', from.toString());
144
+ if (take !== undefined) {
145
+ url.searchParams.append('take', take.toString());
146
+ }
147
+ const response = await (await fetch(url.toString())).json();
148
+ const unencryptedLogs = response.unencryptedLogs;
149
+ if (!unencryptedLogs) {
150
+ return Promise.resolve([]);
151
+ }
152
+ return Promise.resolve(unencryptedLogs.map(x => L2BlockL2Logs.fromBuffer(Buffer.from(x, 'hex'))));
153
+ }
154
+ /**
155
+ * Lookup the L2 contract info for this contract.
156
+ * Contains the ethereum portal address .
157
+ * @param contractAddress - The contract data address.
158
+ * @returns The contract's address & portal address.
159
+ */
160
+ async getContractInfo(contractAddress) {
161
+ const url = new URL(`${this.baseUrl}/contract-info`);
162
+ url.searchParams.append('address', contractAddress.toString());
163
+ const response = await (await fetch(url.toString())).json();
164
+ const contract = response.contractInfo;
165
+ return Promise.resolve(ContractData.fromBuffer(Buffer.from(contract, 'hex')));
166
+ }
167
+ /**
168
+ * Method to submit a transaction to the p2p pool.
169
+ * @param tx - The transaction to be submitted.
170
+ */
171
+ async sendTx(tx) {
172
+ const url = new URL(`${this.baseUrl}/tx`);
173
+ const json = txToJson(tx);
174
+ const init = {};
175
+ init['method'] = 'POST';
176
+ init['body'] = JSON.stringify(json);
177
+ await fetch(url, init);
178
+ }
179
+ /**
180
+ * Method to retrieve pending txs.
181
+ * @returns - The pending txs.
182
+ */
183
+ getPendingTxs() {
184
+ return Promise.resolve([]);
185
+ }
186
+ /**
187
+ * Method to retrieve a single pending tx.
188
+ * @param txHash - The transaction hash to return.
189
+ * @returns - The pending tx if it exists.
190
+ */
191
+ async getPendingTxByHash(txHash) {
192
+ const url = new URL(`${this.baseUrl}/get-pending-tx`);
193
+ url.searchParams.append('hash', txHash.toString());
194
+ const response = await (await fetch(url.toString())).json();
195
+ return Promise.resolve(txFromJson(response));
196
+ }
197
+ /**
198
+ * Find the index of the given contract.
199
+ * @param leafValue - The value to search for.
200
+ * @returns The index of the given leaf in the contracts tree or undefined if not found.
201
+ */
202
+ async findContractIndex(leafValue) {
203
+ const url = new URL(`${this.baseUrl}/contract-index`);
204
+ url.searchParams.append('leaf', leafValue.toString('hex'));
205
+ const response = await (await fetch(url.toString())).json();
206
+ const index = response.index;
207
+ return Promise.resolve(BigInt(index));
208
+ }
209
+ /**
210
+ * Returns the sibling path for the given index in the contract tree.
211
+ * @param leafIndex - The index of the leaf for which the sibling path is required.
212
+ * @returns The sibling path for the leaf index.
213
+ */
214
+ async getContractPath(leafIndex) {
215
+ const url = new URL(`${this.baseUrl}/contract-path`);
216
+ url.searchParams.append('leaf', leafIndex.toString());
217
+ const response = await (await fetch(url.toString())).json();
218
+ const path = response.path;
219
+ return Promise.resolve(SiblingPath.fromString(path));
220
+ }
221
+ /**
222
+ * Find the index of the given piece of data.
223
+ * @param leafValue - The value to search for.
224
+ * @returns The index of the given leaf in the data tree or undefined if not found.
225
+ */
226
+ async findCommitmentIndex(leafValue) {
227
+ const url = new URL(`${this.baseUrl}/commitment-index`);
228
+ url.searchParams.append('leaf', leafValue.toString('hex'));
229
+ const response = await (await fetch(url.toString())).json();
230
+ const index = response.index;
231
+ return Promise.resolve(BigInt(index));
232
+ }
233
+ /**
234
+ * Returns the sibling path for the given index in the data tree.
235
+ * @param leafIndex - The index of the leaf for which the sibling path is required.
236
+ * @returns The sibling path for the leaf index.
237
+ */
238
+ async getDataTreePath(leafIndex) {
239
+ const url = new URL(`${this.baseUrl}/data-path`);
240
+ url.searchParams.append('leaf', leafIndex.toString());
241
+ const response = await (await fetch(url.toString())).json();
242
+ const path = response.path;
243
+ return Promise.resolve(SiblingPath.fromString(path));
244
+ }
245
+ /**
246
+ * Gets a consumed/confirmed L1 to L2 message for the given message key and its index in the merkle tree.
247
+ * @param messageKey - The message key.
248
+ * @returns the message (or throws if not found)
249
+ */
250
+ async getL1ToL2MessageAndIndex(messageKey) {
251
+ const url = new URL(`${this.baseUrl}/l1-l2-message`);
252
+ url.searchParams.append('messageKey', messageKey.toString());
253
+ const response = await (await fetch(url.toString())).json();
254
+ return Promise.resolve({
255
+ message: L1ToL2Message.fromBuffer(Buffer.from(response.message, 'hex')),
256
+ index: BigInt(response.index),
257
+ });
258
+ }
259
+ /**
260
+ * Returns the sibling path for a leaf in the committed l1 to l2 data tree.
261
+ * @param leafIndex - Index of the leaf in the tree.
262
+ * @returns The sibling path.
263
+ */
264
+ async getL1ToL2MessagesTreePath(leafIndex) {
265
+ const url = new URL(`${this.baseUrl}/l1-l2-path`);
266
+ url.searchParams.append('leaf', leafIndex.toString());
267
+ const response = await (await fetch(url.toString())).json();
268
+ const path = response.path;
269
+ return Promise.resolve(SiblingPath.fromString(path));
270
+ }
271
+ /**
272
+ * Gets the storage value at the given contract slot.
273
+ * @param contract - Address of the contract to query.
274
+ * @param slot - Slot to query.
275
+ * @returns Storage value at the given contract slot (or undefined if not found).
276
+ * Note: Aztec's version of `eth_getStorageAt`.
277
+ */
278
+ async getStorageAt(contract, slot) {
279
+ const url = new URL(`${this.baseUrl}/storage-at`);
280
+ url.searchParams.append('address', contract.toString());
281
+ url.searchParams.append('slot', slot.toString());
282
+ const response = await (await fetch(url.toString())).json();
283
+ const value = response.value;
284
+ return Promise.resolve(Buffer.from(value, 'hex'));
285
+ }
286
+ /**
287
+ * Returns the current committed roots for the data trees.
288
+ * @returns The current committed roots for the data trees.
289
+ */
290
+ async getTreeRoots() {
291
+ const url = new URL(`${this.baseUrl}/tree-roots`);
292
+ const response = await (await fetch(url.toString())).json();
293
+ const extractRoot = (treeId) => Fr.fromBuffer(Buffer.from(response.roots[`${treeId}`], 'hex'));
294
+ return {
295
+ [MerkleTreeId.CONTRACT_TREE]: extractRoot(MerkleTreeId.CONTRACT_TREE),
296
+ [MerkleTreeId.PRIVATE_DATA_TREE]: extractRoot(MerkleTreeId.PRIVATE_DATA_TREE),
297
+ [MerkleTreeId.NULLIFIER_TREE]: extractRoot(MerkleTreeId.NULLIFIER_TREE),
298
+ [MerkleTreeId.PUBLIC_DATA_TREE]: extractRoot(MerkleTreeId.PUBLIC_DATA_TREE),
299
+ [MerkleTreeId.L1_TO_L2_MESSAGES_TREE]: extractRoot(MerkleTreeId.L1_TO_L2_MESSAGES_TREE),
300
+ [MerkleTreeId.L1_TO_L2_MESSAGES_ROOTS_TREE]: extractRoot(MerkleTreeId.L1_TO_L2_MESSAGES_ROOTS_TREE),
301
+ [MerkleTreeId.CONTRACT_TREE_ROOTS_TREE]: extractRoot(MerkleTreeId.CONTRACT_TREE_ROOTS_TREE),
302
+ [MerkleTreeId.PRIVATE_DATA_TREE_ROOTS_TREE]: extractRoot(MerkleTreeId.PRIVATE_DATA_TREE_ROOTS_TREE),
303
+ };
304
+ }
305
+ }
306
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1ub2RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F6dGVjLW5vZGUvaHR0cC1ub2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFHTCxFQUFFLEVBQ0YseUJBQXlCLEVBR3pCLEtBQUssRUFDTCxpQkFBaUIsR0FDbEIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDakQsT0FBTyxFQUNMLFlBQVksRUFDWixrQkFBa0IsRUFDbEIsdUJBQXVCLEVBQ3ZCLGFBQWEsRUFFYixPQUFPLEVBQ1AsYUFBYSxFQUNiLFlBQVksRUFDWixFQUFFLEVBRUYsUUFBUSxHQUNULE1BQU0sY0FBYyxDQUFDO0FBRXRCOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUFDLEVBQU07SUFDN0IsT0FBTztRQUNMLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDekMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxhQUFhLEVBQUUsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUMzRCxlQUFlLEVBQUUsRUFBRSxDQUFDLGVBQWUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQy9ELEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDM0MsMEJBQTBCLEVBQUUsRUFBRSxDQUFDLDBCQUEwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFO1FBQ3ZHLHVCQUF1QixFQUFFLEVBQUUsQ0FBQywyQkFBMkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVB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
@@ -0,0 +1,161 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ import { CONTRACT_TREE_HEIGHT, Fr, L1_TO_L2_MESSAGES_TREE_HEIGHT, PRIVATE_DATA_TREE_HEIGHT } from '@aztec/circuits.js';
3
+ import { AztecAddress } from '@aztec/foundation/aztec-address';
4
+ import { SiblingPath } from '@aztec/merkle-tree';
5
+ import { P2P } from '@aztec/p2p';
6
+ import { SequencerClient } from '@aztec/sequencer-client';
7
+ import { ContractData, ContractDataSource, ContractPublicData, L1ToL2MessageAndIndex, L1ToL2MessageSource, L2Block, L2BlockL2Logs, L2BlockSource, L2LogsSource, MerkleTreeId, Tx, TxHash } from '@aztec/types';
8
+ import { MerkleTrees, WorldStateSynchroniser } from '@aztec/world-state';
9
+ import { MemDown } from 'memdown';
10
+ import { AztecNode } from './aztec-node.js';
11
+ import { AztecNodeConfig } from './config.js';
12
+ export declare const createMemDown: () => MemDown<any, any>;
13
+ /**
14
+ * The aztec node.
15
+ */
16
+ export declare class AztecNodeService implements AztecNode {
17
+ protected p2pClient: P2P;
18
+ protected blockSource: L2BlockSource;
19
+ protected encryptedLogsSource: L2LogsSource;
20
+ protected unencryptedLogsSource: L2LogsSource;
21
+ protected contractDataSource: ContractDataSource;
22
+ protected l1ToL2MessageSource: L1ToL2MessageSource;
23
+ protected merkleTreeDB: MerkleTrees;
24
+ protected worldStateSynchroniser: WorldStateSynchroniser;
25
+ protected sequencer: SequencerClient;
26
+ protected chainId: Fr;
27
+ protected version: Fr;
28
+ constructor(p2pClient: P2P, blockSource: L2BlockSource, encryptedLogsSource: L2LogsSource, unencryptedLogsSource: L2LogsSource, contractDataSource: ContractDataSource, l1ToL2MessageSource: L1ToL2MessageSource, merkleTreeDB: MerkleTrees, worldStateSynchroniser: WorldStateSynchroniser, sequencer: SequencerClient, chainId: Fr, version: Fr);
29
+ /**
30
+ * Initialises the Aztec Node, wait for component to sync.
31
+ * @param config - The configuration to be used by the aztec node.
32
+ * @returns - A fully synced Aztec Node for use in development/testing.
33
+ */
34
+ static createAndSync(config: AztecNodeConfig): Promise<AztecNodeService>;
35
+ /**
36
+ * Method to determine if the node is ready to accept transactions.
37
+ * @returns - Flag indicating the readiness for tx submission.
38
+ */
39
+ isReady(): Promise<boolean>;
40
+ /**
41
+ * Method to request blocks. Will attempt to return all requested blocks but will return only those available.
42
+ * @param from - The start of the range of blocks to return.
43
+ * @param take - The number of blocks desired.
44
+ * @returns The blocks requested.
45
+ */
46
+ getBlocks(from: number, take: number): Promise<L2Block[]>;
47
+ /**
48
+ * Method to fetch the current block height.
49
+ * @returns The block height as a number.
50
+ */
51
+ getBlockHeight(): Promise<number>;
52
+ /**
53
+ * Method to fetch the version of the rollup the node is connected to.
54
+ * @returns The rollup version.
55
+ */
56
+ getVersion(): Promise<Fr>;
57
+ /**
58
+ * Method to fetch the chain id of the base-layer for the rollup.
59
+ * @returns The chain id.
60
+ */
61
+ getChainId(): Promise<Fr>;
62
+ /**
63
+ * Lookup the L2 contract data for this contract.
64
+ * Contains the ethereum portal address and bytecode.
65
+ * @param contractAddress - The contract data address.
66
+ * @returns The complete contract data including portal address & bytecode (if we didn't throw an error).
67
+ */
68
+ getContractData(contractAddress: AztecAddress): Promise<ContractPublicData | undefined>;
69
+ /**
70
+ * Lookup the L2 contract info for this contract.
71
+ * Contains the ethereum portal address .
72
+ * @param contractAddress - The contract data address.
73
+ * @returns The contract's address & portal address.
74
+ */
75
+ getContractInfo(contractAddress: AztecAddress): Promise<ContractData | undefined>;
76
+ /**
77
+ * Gets the `take` amount of encrypted logs starting from `from`.
78
+ * @param from - Number of the L2 block to which corresponds the first encrypted log to be returned.
79
+ * @param take - The number of encrypted logs to return.
80
+ * @returns The requested encrypted logs.
81
+ */
82
+ getEncryptedLogs(from: number, take: number): Promise<L2BlockL2Logs[]>;
83
+ /**
84
+ * Gets the `take` amount of unencrypted logs starting from `from`.
85
+ * @param from - Number of the L2 block to which corresponds the first unencrypted log to be returned.
86
+ * @param take - The number of unencrypted logs to return.
87
+ * @returns The requested unencrypted logs.
88
+ */
89
+ getUnencryptedLogs(from: number, take: number): Promise<L2BlockL2Logs[]>;
90
+ /**
91
+ * Method to submit a transaction to the p2p pool.
92
+ * @param tx - The transaction to be submitted.
93
+ */
94
+ sendTx(tx: Tx): Promise<void>;
95
+ /**
96
+ * Method to stop the aztec node.
97
+ */
98
+ stop(): Promise<void>;
99
+ /**
100
+ * Method to retrieve pending txs.
101
+ * @returns - The pending txs.
102
+ */
103
+ getPendingTxs(): Promise<Tx[]>;
104
+ /**
105
+ * Method to retrieve a single pending tx.
106
+ * @param txHash - The transaction hash to return.
107
+ * @returns - The pending tx if it exists.
108
+ */
109
+ getPendingTxByHash(txHash: TxHash): Promise<Tx | undefined>;
110
+ /**
111
+ * Find the index of the given contract.
112
+ * @param leafValue - The value to search for.
113
+ * @returns The index of the given leaf in the contracts tree or undefined if not found.
114
+ */
115
+ findContractIndex(leafValue: Buffer): Promise<bigint | undefined>;
116
+ /**
117
+ * Returns the sibling path for the given index in the contract tree.
118
+ * @param leafIndex - The index of the leaf for which the sibling path is required.
119
+ * @returns The sibling path for the leaf index.
120
+ */
121
+ getContractPath(leafIndex: bigint): Promise<SiblingPath<typeof CONTRACT_TREE_HEIGHT>>;
122
+ /**
123
+ * Find the index of the given commitment.
124
+ * @param leafValue - The value to search for.
125
+ * @returns The index of the given leaf in the private data tree or undefined if not found.
126
+ */
127
+ findCommitmentIndex(leafValue: Buffer): Promise<bigint | undefined>;
128
+ /**
129
+ * Returns the sibling path for the given index in the data tree.
130
+ * @param leafIndex - The index of the leaf for which the sibling path is required.
131
+ * @returns The sibling path for the leaf index.
132
+ */
133
+ getDataTreePath(leafIndex: bigint): Promise<SiblingPath<typeof PRIVATE_DATA_TREE_HEIGHT>>;
134
+ /**
135
+ * Gets a confirmed/consumed L1 to L2 message for the given message key
136
+ * and its index in the merkle tree.
137
+ * @param messageKey - The message key.
138
+ * @returns The map containing the message and index.
139
+ */
140
+ getL1ToL2MessageAndIndex(messageKey: Fr): Promise<L1ToL2MessageAndIndex>;
141
+ /**
142
+ * Returns the sibling path for a leaf in the committed l1 to l2 data tree.
143
+ * @param leafIndex - Index of the leaf in the tree.
144
+ * @returns The sibling path.
145
+ */
146
+ getL1ToL2MessagesTreePath(leafIndex: bigint): Promise<SiblingPath<typeof L1_TO_L2_MESSAGES_TREE_HEIGHT>>;
147
+ /**
148
+ * Gets the storage value at the given contract slot.
149
+ * @param contract - Address of the contract to query.
150
+ * @param slot - Slot to query.
151
+ * @returns Storage value at the given contract slot (or undefined if not found).
152
+ * Note: Aztec's version of `eth_getStorageAt`.
153
+ */
154
+ getStorageAt(contract: AztecAddress, slot: bigint): Promise<Buffer | undefined>;
155
+ /**
156
+ * Returns the current committed roots for the data trees.
157
+ * @returns The current committed roots for the data trees.
158
+ */
159
+ getTreeRoots(): Promise<Record<MerkleTreeId, Fr>>;
160
+ }
161
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/aztec-node/server.ts"],"names":[],"mappings":"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"}