@aztec/aztec-node 5.0.0-rc.1 → 5.0.0-rc.2

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 (48) hide show
  1. package/dest/aztec-node/config.d.ts +3 -1
  2. package/dest/aztec-node/config.d.ts.map +1 -1
  3. package/dest/aztec-node/config.js +5 -0
  4. package/dest/aztec-node/node_public_calls_simulator.d.ts +90 -0
  5. package/dest/aztec-node/node_public_calls_simulator.d.ts.map +1 -0
  6. package/dest/aztec-node/node_public_calls_simulator.js +346 -0
  7. package/dest/aztec-node/server.d.ts +68 -65
  8. package/dest/aztec-node/server.d.ts.map +1 -1
  9. package/dest/aztec-node/server.js +153 -1161
  10. package/dest/bin/index.js +2 -2
  11. package/dest/factory.d.ts +33 -0
  12. package/dest/factory.d.ts.map +1 -0
  13. package/dest/factory.js +496 -0
  14. package/dest/index.d.ts +2 -1
  15. package/dest/index.d.ts.map +1 -1
  16. package/dest/index.js +1 -0
  17. package/dest/modules/block_parameter.d.ts +25 -0
  18. package/dest/modules/block_parameter.d.ts.map +1 -0
  19. package/dest/modules/block_parameter.js +100 -0
  20. package/dest/modules/node_block_provider.d.ts +19 -0
  21. package/dest/modules/node_block_provider.d.ts.map +1 -0
  22. package/dest/modules/node_block_provider.js +112 -0
  23. package/dest/modules/node_tx_receipt.d.ts +24 -0
  24. package/dest/modules/node_tx_receipt.d.ts.map +1 -0
  25. package/dest/modules/node_tx_receipt.js +70 -0
  26. package/dest/modules/node_world_state_queries.d.ts +61 -0
  27. package/dest/modules/node_world_state_queries.d.ts.map +1 -0
  28. package/dest/modules/node_world_state_queries.js +257 -0
  29. package/dest/sentinel/factory.d.ts +3 -3
  30. package/dest/sentinel/factory.d.ts.map +1 -1
  31. package/dest/sentinel/factory.js +8 -1
  32. package/dest/sentinel/sentinel.d.ts +21 -21
  33. package/dest/sentinel/sentinel.d.ts.map +1 -1
  34. package/dest/sentinel/sentinel.js +27 -47
  35. package/package.json +28 -27
  36. package/src/aztec-node/config.ts +7 -0
  37. package/src/aztec-node/node_public_calls_simulator.ts +383 -0
  38. package/src/aztec-node/server.ts +221 -1342
  39. package/src/bin/index.ts +7 -2
  40. package/src/factory.ts +656 -0
  41. package/src/index.ts +1 -0
  42. package/src/modules/block_parameter.ts +93 -0
  43. package/src/modules/node_block_provider.ts +149 -0
  44. package/src/modules/node_tx_receipt.ts +115 -0
  45. package/src/modules/node_world_state_queries.ts +360 -0
  46. package/src/sentinel/README.md +3 -3
  47. package/src/sentinel/factory.ts +15 -3
  48. package/src/sentinel/sentinel.ts +34 -72
@@ -0,0 +1,100 @@
1
+ import { BadRequestError } from '@aztec/foundation/json-rpc';
2
+ import { BlockHash, BlockTag } from '@aztec/stdlib/block';
3
+ /** True when `value` is a {@link BlockTag}. */ export function isBlockTag(value) {
4
+ return BlockTag.includes(value);
5
+ }
6
+ /** True when `value` is a {@link CheckpointTag}. */ export function isCheckpointTag(value) {
7
+ return value === 'checkpointed' || value === 'proven' || value === 'finalized';
8
+ }
9
+ /**
10
+ * Normalizes a {@link BlockParameter} (which may be a bare value) into a {@link NormalizedBlockParameter}
11
+ * object form. Performs no chain-tip resolution — tag lookups are deferred to the underlying block source.
12
+ */ export function normalizeBlockParameter(param) {
13
+ if (BlockHash.isBlockHash(param)) {
14
+ return {
15
+ hash: param
16
+ };
17
+ }
18
+ if (typeof param === 'number') {
19
+ return {
20
+ number: param
21
+ };
22
+ }
23
+ if (typeof param === 'string') {
24
+ if (isBlockTag(param)) {
25
+ return {
26
+ tag: param === 'latest' ? 'proposed' : param
27
+ };
28
+ }
29
+ throw new BadRequestError(`Invalid BlockParameter tag: ${param}`);
30
+ }
31
+ if (typeof param === 'object' && param !== null) {
32
+ if ('number' in param) {
33
+ return {
34
+ number: param.number
35
+ };
36
+ }
37
+ if ('hash' in param) {
38
+ return {
39
+ hash: param.hash
40
+ };
41
+ }
42
+ if ('archive' in param) {
43
+ return {
44
+ archive: param.archive
45
+ };
46
+ }
47
+ if ('tag' in param) {
48
+ if (isBlockTag(param.tag)) {
49
+ return {
50
+ tag: param.tag
51
+ };
52
+ }
53
+ throw new BadRequestError(`Invalid BlockParameter tag: ${param.tag}`);
54
+ }
55
+ }
56
+ throw new BadRequestError(`Invalid BlockParameter: ${JSON.stringify(param)}`);
57
+ }
58
+ /**
59
+ * Resolves a {@link CheckpointParameter} into a concrete `{ number }` or `{ slot }` query.
60
+ *
61
+ * Tag-based parameters (`'checkpointed'`, `'proven'`, `'finalized'`) are translated up-front to the
62
+ * corresponding tip's checkpoint number via {@link L2BlockSource.getL2Tips}. After resolution the unified
63
+ * `getCheckpoint` flow can perform a single confirmed→proposed lookup against either store.
64
+ */ export async function resolveCheckpointParameter(param, blockSource) {
65
+ if (typeof param === 'number') {
66
+ return {
67
+ number: param
68
+ };
69
+ }
70
+ if (isCheckpointTag(param)) {
71
+ const tips = await blockSource.getL2Tips();
72
+ switch(param){
73
+ case 'checkpointed':
74
+ return {
75
+ number: tips.checkpointed.checkpoint.number
76
+ };
77
+ case 'proven':
78
+ return {
79
+ number: tips.proven.checkpoint.number
80
+ };
81
+ case 'finalized':
82
+ return {
83
+ number: tips.finalized.checkpoint.number
84
+ };
85
+ }
86
+ }
87
+ if (typeof param === 'object' && param !== null) {
88
+ if ('number' in param) {
89
+ return {
90
+ number: param.number
91
+ };
92
+ }
93
+ if ('slot' in param) {
94
+ return {
95
+ slot: param.slot
96
+ };
97
+ }
98
+ }
99
+ throw new BadRequestError(`Invalid CheckpointParameter: ${JSON.stringify(param)}`);
100
+ }
@@ -0,0 +1,19 @@
1
+ import type { BlockNumber, CheckpointNumber } from '@aztec/foundation/branded-types';
2
+ import type { BlockData, BlockParameter, L2BlockSource } from '@aztec/stdlib/block';
3
+ import type { BlockIncludeOptions, BlockResponse, BlocksIncludeOptions, CheckpointIncludeOptions, CheckpointParameter, CheckpointResponse } from '@aztec/stdlib/interfaces/client';
4
+ /**
5
+ * Serves the node's block and checkpoint read queries, assembling RPC responses (optionally including
6
+ * transactions, L1 publish info, and attestations) from the underlying block source. Extracted from
7
+ * `AztecNodeService` to keep `server.ts` smaller.
8
+ */
9
+ export declare class NodeBlockProvider {
10
+ #private;
11
+ private readonly blockSource;
12
+ constructor(blockSource: L2BlockSource);
13
+ getBlock<Opts extends BlockIncludeOptions = {}>(param: BlockParameter, options?: Opts): Promise<BlockResponse<Opts> | undefined>;
14
+ getBlockData(param: BlockParameter): Promise<BlockData | undefined>;
15
+ getBlocks<Opts extends BlocksIncludeOptions = {}>(from: BlockNumber, limit: number, options?: Opts): Promise<BlockResponse<Opts>[]>;
16
+ getCheckpoint<Opts extends CheckpointIncludeOptions = {}>(param: CheckpointParameter, options?: Opts): Promise<CheckpointResponse<Opts> | undefined>;
17
+ getCheckpoints<Opts extends CheckpointIncludeOptions = {}>(from: CheckpointNumber, limit: number, options?: Opts): Promise<CheckpointResponse<Opts>[]>;
18
+ }
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZV9ibG9ja19wcm92aWRlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZHVsZXMvbm9kZV9ibG9ja19wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVyRixPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUF3QixhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUUxRyxPQUFPLEtBQUssRUFDVixtQkFBbUIsRUFDbkIsYUFBYSxFQUNiLG9CQUFvQixFQUNwQix3QkFBd0IsRUFDeEIsbUJBQW1CLEVBQ25CLGtCQUFrQixFQUNuQixNQUFNLGlDQUFpQyxDQUFDO0FBV3pDOzs7O0dBSUc7QUFDSCxxQkFBYSxpQkFBaUI7O0lBQ2hCLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVztJQUF4QyxZQUE2QixXQUFXLEVBQUUsYUFBYSxFQUFJO0lBRTlDLFFBQVEsQ0FBQyxJQUFJLFNBQVMsbUJBQW1CLEdBQUcsRUFBRSxFQUN6RCxLQUFLLEVBQUUsY0FBYyxFQUNyQixPQUFPLEdBQUUsSUFBaUIsR0FDekIsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FtQjFDO0lBRU0sWUFBWSxDQUFDLEtBQUssRUFBRSxjQUFjLEdBQUcsT0FBTyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsQ0FHekU7SUFFWSxTQUFTLENBQUMsSUFBSSxTQUFTLG9CQUFvQixHQUFHLEVBQUUsRUFDM0QsSUFBSSxFQUFFLFdBQVcsRUFDakIsS0FBSyxFQUFFLE1BQU0sRUFDYixPQUFPLEdBQUUsSUFBaUIsR0FDekIsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBZ0JoQztJQUVZLGFBQWEsQ0FBQyxJQUFJLFNBQVMsd0JBQXdCLEdBQUcsRUFBRSxFQUNuRSxLQUFLLEVBQUUsbUJBQW1CLEVBQzFCLE9BQU8sR0FBRSxJQUFpQixHQUN6QixPQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBNEIvQztJQUVZLGNBQWMsQ0FBQyxJQUFJLFNBQVMsd0JBQXdCLEdBQUcsRUFBRSxFQUNwRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQ3RCLEtBQUssRUFBRSxNQUFNLEVBQ2IsT0FBTyxHQUFFLElBQWlCLEdBQ3pCLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBU3JDO0NBcUJGIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node_block_provider.d.ts","sourceRoot":"","sources":["../../src/modules/node_block_provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAErF,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAwB,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE1G,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,iCAAiC,CAAC;AAWzC;;;;GAIG;AACH,qBAAa,iBAAiB;;IAChB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAAxC,YAA6B,WAAW,EAAE,aAAa,EAAI;IAE9C,QAAQ,CAAC,IAAI,SAAS,mBAAmB,GAAG,EAAE,EACzD,KAAK,EAAE,cAAc,EACrB,OAAO,GAAE,IAAiB,GACzB,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAmB1C;IAEM,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAGzE;IAEY,SAAS,CAAC,IAAI,SAAS,oBAAoB,GAAG,EAAE,EAC3D,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,IAAiB,GACzB,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAgBhC;IAEY,aAAa,CAAC,IAAI,SAAS,wBAAwB,GAAG,EAAE,EACnE,KAAK,EAAE,mBAAmB,EAC1B,OAAO,GAAE,IAAiB,GACzB,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CA4B/C;IAEY,cAAc,CAAC,IAAI,SAAS,wBAAwB,GAAG,EAAE,EACpE,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,IAAiB,GACzB,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CASrC;CAqBF"}
@@ -0,0 +1,112 @@
1
+ import { BadRequestError } from '@aztec/foundation/json-rpc';
2
+ import { blockResponseFromBlockData, blockResponseFromL2Block, checkpointResponseFromCheckpointData, checkpointResponseFromPublishedCheckpoint, projectProposedToCheckpointResponse } from '../aztec-node/block_response_helpers.js';
3
+ import { normalizeBlockParameter, resolveCheckpointParameter } from './block_parameter.js';
4
+ /**
5
+ * Serves the node's block and checkpoint read queries, assembling RPC responses (optionally including
6
+ * transactions, L1 publish info, and attestations) from the underlying block source. Extracted from
7
+ * `AztecNodeService` to keep `server.ts` smaller.
8
+ */ export class NodeBlockProvider {
9
+ blockSource;
10
+ constructor(blockSource){
11
+ this.blockSource = blockSource;
12
+ }
13
+ async getBlock(param, options = {}) {
14
+ const query = normalizeBlockParameter(param);
15
+ const wantTxs = !!options.includeTransactions;
16
+ const wantContext = !!options.includeL1PublishInfo || !!options.includeAttestations;
17
+ if (wantTxs) {
18
+ const block = await this.blockSource.getBlock(query);
19
+ if (!block) {
20
+ return undefined;
21
+ }
22
+ const ctx = wantContext ? await this.#getCheckpointContext(block.checkpointNumber) : undefined;
23
+ return await blockResponseFromL2Block(block, options, ctx);
24
+ }
25
+ const data = await this.blockSource.getBlockData(query);
26
+ if (!data) {
27
+ return undefined;
28
+ }
29
+ const ctx = wantContext ? await this.#getCheckpointContext(data.checkpointNumber) : undefined;
30
+ return blockResponseFromBlockData(data, options, ctx);
31
+ }
32
+ getBlockData(param) {
33
+ const query = normalizeBlockParameter(param);
34
+ return this.blockSource.getBlockData(query);
35
+ }
36
+ async getBlocks(from, limit, options = {}) {
37
+ const wantTxs = !!options.includeTransactions;
38
+ const wantContext = !!options.includeL1PublishInfo || !!options.includeAttestations;
39
+ const onlyCheckpointed = !!options.onlyCheckpointed;
40
+ if (wantTxs) {
41
+ const blocks = await this.blockSource.getBlocks({
42
+ from,
43
+ limit,
44
+ onlyCheckpointed
45
+ });
46
+ const ctxByCheckpoint = await this.#getCheckpointContextsForBlocks(wantContext ? blocks : []);
47
+ return await Promise.all(blocks.map((block)=>blockResponseFromL2Block(block, options, ctxByCheckpoint.get(block.checkpointNumber))));
48
+ }
49
+ const dataItems = await this.blockSource.getBlocksData({
50
+ from,
51
+ limit,
52
+ onlyCheckpointed
53
+ });
54
+ const ctxByCheckpoint = await this.#getCheckpointContextsForBlocks(wantContext ? dataItems : []);
55
+ return await Promise.all(dataItems.map((data)=>blockResponseFromBlockData(data, options, ctxByCheckpoint.get(data.checkpointNumber))));
56
+ }
57
+ async getCheckpoint(param, options = {}) {
58
+ const query = await resolveCheckpointParameter(param, this.blockSource);
59
+ // Try the confirmed store first.
60
+ const confirmed = options.includeBlocks ? await this.blockSource.getCheckpoint(query) : await this.blockSource.getCheckpointData(query);
61
+ if (confirmed) {
62
+ return await (options.includeBlocks ? checkpointResponseFromPublishedCheckpoint(confirmed, options) : checkpointResponseFromCheckpointData(confirmed, options));
63
+ }
64
+ // Fall back to the proposed store.
65
+ const proposed = await this.blockSource.getProposedCheckpointData(query);
66
+ if (proposed) {
67
+ if (options.includeAttestations || options.includeL1PublishInfo) {
68
+ throw new BadRequestError(`Options includeL1PublishInfo or includeAttestations cannot be satisfied for a proposed checkpoint`);
69
+ }
70
+ const blocks = options.includeBlocks ? await this.blockSource.getBlocks({
71
+ from: proposed.startBlock,
72
+ limit: proposed.blockCount
73
+ }) : undefined;
74
+ return await projectProposedToCheckpointResponse(proposed, options, blocks);
75
+ }
76
+ return undefined;
77
+ }
78
+ async getCheckpoints(from, limit, options = {}) {
79
+ if (options.includeBlocks) {
80
+ const checkpoints = await this.blockSource.getCheckpoints({
81
+ from,
82
+ limit
83
+ });
84
+ return await Promise.all(checkpoints.map((cp)=>checkpointResponseFromPublishedCheckpoint(cp, options)));
85
+ }
86
+ const datas = await this.blockSource.getCheckpointsData({
87
+ from,
88
+ limit
89
+ });
90
+ return datas.map((d)=>checkpointResponseFromCheckpointData(d, options));
91
+ }
92
+ /** Fetches checkpoint-level L1 and attestation data for use as block response context. */ async #getCheckpointContext(checkpointNumber) {
93
+ const checkpoint = await this.blockSource.getCheckpointData({
94
+ number: checkpointNumber
95
+ });
96
+ if (!checkpoint) {
97
+ return undefined;
98
+ }
99
+ return {
100
+ l1: checkpoint.l1,
101
+ attestations: checkpoint.attestations
102
+ };
103
+ }
104
+ /** Fetches checkpoint context for a set of blocks, deduplicating shared checkpoints. */ async #getCheckpointContextsForBlocks(blocks) {
105
+ const unique = Array.from(new Set(blocks.map((b)=>b.checkpointNumber)));
106
+ const entries = await Promise.all(unique.map(async (n)=>[
107
+ n,
108
+ await this.#getCheckpointContext(n)
109
+ ]));
110
+ return new Map(entries);
111
+ }
112
+ }
@@ -0,0 +1,24 @@
1
+ import type { P2P } from '@aztec/p2p';
2
+ import type { L2BlockSource } from '@aztec/stdlib/block';
3
+ import type { DebugLogStore } from '@aztec/stdlib/logs';
4
+ import { type GetTxReceiptOptions, type TxHash, type TxReceipt } from '@aztec/stdlib/tx';
5
+ /** Dependencies required to build a {@link NodeTxReceiptBuilder}. */
6
+ export interface NodeTxReceiptBuilderDeps {
7
+ p2pClient: P2P;
8
+ blockSource: L2BlockSource;
9
+ debugLogStore: DebugLogStore;
10
+ }
11
+ /**
12
+ * Builds transaction receipts by reconciling the archiver's mined tx effects with the tx pool's view,
13
+ * deriving the finalization status from the cached L2 tips. Extracted from `AztecNodeService` to keep
14
+ * `server.ts` smaller.
15
+ */
16
+ export declare class NodeTxReceiptBuilder {
17
+ #private;
18
+ private readonly p2pClient;
19
+ private readonly blockSource;
20
+ private readonly debugLogStore;
21
+ constructor(deps: NodeTxReceiptBuilderDeps);
22
+ getTxReceipt<TGetTxReceiptOptions extends GetTxReceiptOptions = {}>(txHash: TxHash, options?: TGetTxReceiptOptions): Promise<TxReceipt<TGetTxReceiptOptions>>;
23
+ }
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZV90eF9yZWNlaXB0LmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kdWxlcy9ub2RlX3R4X3JlY2VpcHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBVSxNQUFNLHFCQUFxQixDQUFDO0FBRWpFLE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hELE9BQU8sRUFFTCxLQUFLLG1CQUFtQixFQU14QixLQUFLLE1BQU0sRUFDWCxLQUFLLFNBQVMsRUFFZixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLHFFQUFxRTtBQUNyRSxNQUFNLFdBQVcsd0JBQXdCO0lBQ3ZDLFNBQVMsRUFBRSxHQUFHLENBQUM7SUFDZixXQUFXLEVBQUUsYUFBYSxDQUFDO0lBQzNCLGFBQWEsRUFBRSxhQUFhLENBQUM7Q0FDOUI7QUFFRDs7OztHQUlHO0FBQ0gscUJBQWEsb0JBQW9COztJQUMvQixPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBTTtJQUNoQyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBZ0I7SUFDNUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQWdCO0lBRTlDLFlBQVksSUFBSSxFQUFFLHdCQUF3QixFQUl6QztJQUVZLFlBQVksQ0FBQyxvQkFBb0IsU0FBUyxtQkFBbUIsR0FBRyxFQUFFLEVBQzdFLE1BQU0sRUFBRSxNQUFNLEVBQ2QsT0FBTyxDQUFDLEVBQUUsb0JBQW9CLEdBQzdCLE9BQU8sQ0FBQyxTQUFTLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQStCMUM7Q0F1Q0YifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node_tx_receipt.d.ts","sourceRoot":"","sources":["../../src/modules/node_tx_receipt.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,aAAa,EAAU,MAAM,qBAAqB,CAAC;AAEjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAEL,KAAK,mBAAmB,EAMxB,KAAK,MAAM,EACX,KAAK,SAAS,EAEf,MAAM,kBAAkB,CAAC;AAE1B,qEAAqE;AACrE,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,GAAG,CAAC;IACf,WAAW,EAAE,aAAa,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED;;;;GAIG;AACH,qBAAa,oBAAoB;;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAM;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAE9C,YAAY,IAAI,EAAE,wBAAwB,EAIzC;IAEY,YAAY,CAAC,oBAAoB,SAAS,mBAAmB,GAAG,EAAE,EAC7E,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC,CA+B1C;CAuCF"}
@@ -0,0 +1,70 @@
1
+ import { getEpochAtSlot } from '@aztec/stdlib/epoch-helpers';
2
+ import { DroppedTxReceipt, MinedTxReceipt, PendingTxReceipt, TxStatus } from '@aztec/stdlib/tx';
3
+ /**
4
+ * Builds transaction receipts by reconciling the archiver's mined tx effects with the tx pool's view,
5
+ * deriving the finalization status from the cached L2 tips. Extracted from `AztecNodeService` to keep
6
+ * `server.ts` smaller.
7
+ */ export class NodeTxReceiptBuilder {
8
+ p2pClient;
9
+ blockSource;
10
+ debugLogStore;
11
+ constructor(deps){
12
+ this.p2pClient = deps.p2pClient;
13
+ this.blockSource = deps.blockSource;
14
+ this.debugLogStore = deps.debugLogStore;
15
+ }
16
+ async getTxReceipt(txHash, options) {
17
+ // Check the tx pool status first. If the tx is known to the pool (pending or mined), we'll use that
18
+ // as a fallback if we don't find a mined tx effect in the archiver.
19
+ const txPoolStatus = await this.p2pClient.getTxStatus(txHash);
20
+ const isKnownToPool = txPoolStatus === 'pending' || txPoolStatus === 'mined';
21
+ // Then get the raw tx effect from the archiver, which tracks every tx in a mined block.
22
+ const indexed = await this.blockSource.getTxEffect(txHash);
23
+ let receipt;
24
+ if (indexed) {
25
+ receipt = await this.#assembleMinedReceipt(indexed, options);
26
+ } else if (isKnownToPool) {
27
+ // If the tx is in the pool but not in the archiver, it's pending.
28
+ // This handles race conditions between archiver and p2p, where the archiver
29
+ // has pruned the block in which a tx was mined, but p2p has not caught up yet.
30
+ let tx;
31
+ if (options?.includePendingTx) {
32
+ // The tx may have left the pool since we checked its status (mined or dropped); in that case we
33
+ // leave `tx` unset and still return a pending receipt.
34
+ tx = await this.p2pClient.getTxByHashFromPool(txHash, {
35
+ includeProof: !!options.includeProof
36
+ });
37
+ }
38
+ receipt = new PendingTxReceipt(txHash, tx);
39
+ } else {
40
+ // Otherwise, if we don't know the tx, we consider it dropped.
41
+ receipt = new DroppedTxReceipt(txHash, 'Tx dropped by P2P node');
42
+ }
43
+ this.debugLogStore.decorateReceiptWithLogs(txHash.toString(), receipt);
44
+ return receipt;
45
+ }
46
+ /**
47
+ * Assembles a {@link MinedTxReceipt} from a raw {@link IndexedTxEffect}, deriving the finalization status from the
48
+ * cached L2 tips and the epoch from the block's slot number.
49
+ */ async #assembleMinedReceipt(indexed, options) {
50
+ const blockNumber = indexed.l2BlockNumber;
51
+ const [tips, l1Constants] = await Promise.all([
52
+ this.blockSource.getL2Tips(),
53
+ this.blockSource.getL1Constants()
54
+ ]);
55
+ const status = this.#deriveMinedStatus(blockNumber, tips);
56
+ const epochNumber = getEpochAtSlot(indexed.slotNumber, l1Constants);
57
+ return new MinedTxReceipt(indexed.data.txHash, status, MinedTxReceipt.executionResultFromRevertCode(indexed.data.revertCode), indexed.data.transactionFee.toBigInt(), indexed.l2BlockHash, blockNumber, indexed.slotNumber, indexed.txIndexInBlock, epochNumber, options?.includeTxEffect ? indexed.data : undefined, /*debugLogs=*/ undefined);
58
+ }
59
+ #deriveMinedStatus(blockNumber, tips) {
60
+ if (blockNumber <= tips.finalized.block.number) {
61
+ return TxStatus.FINALIZED;
62
+ } else if (blockNumber <= tips.proven.block.number) {
63
+ return TxStatus.PROVEN;
64
+ } else if (blockNumber <= tips.checkpointed.block.number) {
65
+ return TxStatus.CHECKPOINTED;
66
+ } else {
67
+ return TxStatus.PROPOSED;
68
+ }
69
+ }
70
+ }
@@ -0,0 +1,61 @@
1
+ import { ARCHIVE_HEIGHT, type L1_TO_L2_MSG_TREE_HEIGHT, type NOTE_HASH_TREE_HEIGHT } from '@aztec/constants';
2
+ import { BlockNumber, type CheckpointNumber, type EpochNumber } from '@aztec/foundation/branded-types';
3
+ import { Fr } from '@aztec/foundation/curves/bn254';
4
+ import { type Logger } from '@aztec/foundation/log';
5
+ import { MembershipWitness, type SiblingPath } from '@aztec/foundation/trees';
6
+ import type { AztecAddress } from '@aztec/stdlib/aztec-address';
7
+ import { type BlockHash, type BlockParameter, type DataInBlock, type L2BlockSource } from '@aztec/stdlib/block';
8
+ import type { WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
9
+ import { type L1ToL2MessageSource, type L2ToL1MembershipWitness } from '@aztec/stdlib/messaging';
10
+ import { MerkleTreeId, NullifierMembershipWitness, PublicDataWitness } from '@aztec/stdlib/trees';
11
+ import type { TxHash } from '@aztec/stdlib/tx';
12
+ /** Dependencies required to build a {@link NodeWorldStateQueries}. */
13
+ export interface NodeWorldStateQueriesDeps {
14
+ worldStateSynchronizer: WorldStateSynchronizer;
15
+ blockSource: L2BlockSource;
16
+ l1ToL2MessageSource: L1ToL2MessageSource;
17
+ log?: Logger;
18
+ }
19
+ /**
20
+ * Serves the node's Merkle-tree and membership-witness queries against committed world-state at a
21
+ * requested block. Extracted from `AztecNodeService` so the block-resolution and reorg-aware sync logic
22
+ * can be unit-tested without standing up the whole node, and to keep `server.ts` smaller.
23
+ */
24
+ export declare class NodeWorldStateQueries {
25
+ #private;
26
+ private readonly worldStateSynchronizer;
27
+ private readonly blockSource;
28
+ private readonly l1ToL2MessageSource;
29
+ private readonly log;
30
+ constructor(deps: NodeWorldStateQueriesDeps);
31
+ findLeavesIndexes(referenceBlock: BlockParameter, treeId: MerkleTreeId, leafValues: Fr[]): Promise<(DataInBlock<bigint> | undefined)[]>;
32
+ getBlockHashMembershipWitness(referenceBlock: BlockParameter, blockHash: BlockHash): Promise<MembershipWitness<typeof ARCHIVE_HEIGHT> | undefined>;
33
+ getNoteHashMembershipWitness(referenceBlock: BlockParameter, noteHash: Fr): Promise<MembershipWitness<typeof NOTE_HASH_TREE_HEIGHT> | undefined>;
34
+ getL1ToL2MessageMembershipWitness(referenceBlock: BlockParameter, l1ToL2Message: Fr): Promise<[bigint, SiblingPath<typeof L1_TO_L2_MSG_TREE_HEIGHT>] | undefined>;
35
+ getL1ToL2MessageCheckpoint(l1ToL2Message: Fr): Promise<CheckpointNumber | undefined>;
36
+ /**
37
+ * Returns all the L2 to L1 messages in an epoch (empty array if the epoch is not found). The public
38
+ * `AztecNodeService.getL2ToL1Messages` that delegates here is deprecated in favor of
39
+ * {@link getL2ToL1MembershipWitness}.
40
+ * @param epoch - The epoch at which to get the data.
41
+ */
42
+ getL2ToL1Messages(epoch: EpochNumber): Promise<Fr[][][][]>;
43
+ /**
44
+ * Returns the L2-to-L1 membership witness for a message in `txHash`. Passthrough to the
45
+ * archiver's locally-cached resolver — see {@link Archiver.getL2ToL1MembershipWitness}.
46
+ */
47
+ getL2ToL1MembershipWitness(txHash: TxHash, message: Fr, messageIndexInTx?: number): Promise<L2ToL1MembershipWitness | undefined>;
48
+ getNullifierMembershipWitness(referenceBlock: BlockParameter, nullifier: Fr): Promise<NullifierMembershipWitness | undefined>;
49
+ getLowNullifierMembershipWitness(referenceBlock: BlockParameter, nullifier: Fr): Promise<NullifierMembershipWitness | undefined>;
50
+ getPublicDataWitness(referenceBlock: BlockParameter, leafSlot: Fr): Promise<PublicDataWitness | undefined>;
51
+ getPublicStorageAt(referenceBlock: BlockParameter, contract: AztecAddress, slot: Fr): Promise<Fr>;
52
+ /**
53
+ * Returns an instance of MerkleTreeOperations having first ensured the world state is fully synched
54
+ * @param block - The block parameter (block number, block hash, or 'latest') at which to get the data.
55
+ * @returns An instance of a committed MerkleTreeOperations
56
+ */
57
+ getWorldState(block: BlockParameter): Promise<import("@aztec/stdlib/trees").MerkleTreeReadOperations>;
58
+ /** Resolves any {@link BlockParameter} variant to a concrete block number. */
59
+ resolveBlockNumber(block: BlockParameter): Promise<BlockNumber>;
60
+ }
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZV93b3JsZF9zdGF0ZV9xdWVyaWVzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kdWxlcy9ub2RlX3dvcmxkX3N0YXRlX3F1ZXJpZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxLQUFLLHdCQUF3QixFQUFFLEtBQUsscUJBQXFCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RyxPQUFPLEVBQUUsV0FBVyxFQUFFLEtBQUssZ0JBQWdCLEVBQUUsS0FBSyxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUV2RyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEQsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxLQUFLLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlFLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sRUFDTCxLQUFLLFNBQVMsRUFDZCxLQUFLLGNBQWMsRUFDbkIsS0FBSyxXQUFXLEVBQ2hCLEtBQUssYUFBYSxFQUVuQixNQUFNLHFCQUFxQixDQUFDO0FBRTdCLE9BQU8sS0FBSyxFQUFFLHNCQUFzQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDOUUsT0FBTyxFQUFhLEtBQUssbUJBQW1CLEVBQUUsS0FBSyx1QkFBdUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzVHLE9BQU8sRUFDTCxZQUFZLEVBRVosMEJBQTBCLEVBRTFCLGlCQUFpQixFQUNsQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBSS9DLHNFQUFzRTtBQUN0RSxNQUFNLFdBQVcseUJBQXlCO0lBQ3hDLHNCQUFzQixFQUFFLHNCQUFzQixDQUFDO0lB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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node_world_state_queries.d.ts","sourceRoot":"","sources":["../../src/modules/node_world_state_queries.ts"],"names":[],"mappings":"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"}