@aztec/aztec-node 0.0.0-test.1 → 0.0.1-commit.017a351

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 (57) hide show
  1. package/dest/aztec-node/block_response_helpers.d.ts +25 -0
  2. package/dest/aztec-node/block_response_helpers.d.ts.map +1 -0
  3. package/dest/aztec-node/block_response_helpers.js +112 -0
  4. package/dest/aztec-node/config.d.ts +25 -11
  5. package/dest/aztec-node/config.d.ts.map +1 -1
  6. package/dest/aztec-node/config.js +90 -15
  7. package/dest/aztec-node/node_metrics.d.ts +5 -1
  8. package/dest/aztec-node/node_metrics.d.ts.map +1 -1
  9. package/dest/aztec-node/node_metrics.js +20 -6
  10. package/dest/aztec-node/public_data_overrides.d.ts +13 -0
  11. package/dest/aztec-node/public_data_overrides.d.ts.map +1 -0
  12. package/dest/aztec-node/public_data_overrides.js +21 -0
  13. package/dest/aztec-node/server.d.ts +139 -189
  14. package/dest/aztec-node/server.d.ts.map +1 -1
  15. package/dest/aztec-node/server.js +1842 -438
  16. package/dest/bin/index.d.ts +1 -1
  17. package/dest/bin/index.js +4 -2
  18. package/dest/index.d.ts +1 -2
  19. package/dest/index.d.ts.map +1 -1
  20. package/dest/index.js +0 -1
  21. package/dest/sentinel/config.d.ts +9 -0
  22. package/dest/sentinel/config.d.ts.map +1 -0
  23. package/dest/sentinel/config.js +39 -0
  24. package/dest/sentinel/factory.d.ts +11 -0
  25. package/dest/sentinel/factory.d.ts.map +1 -0
  26. package/dest/sentinel/factory.js +17 -0
  27. package/dest/sentinel/index.d.ts +3 -0
  28. package/dest/sentinel/index.d.ts.map +1 -0
  29. package/dest/sentinel/index.js +1 -0
  30. package/dest/sentinel/sentinel.d.ts +217 -0
  31. package/dest/sentinel/sentinel.d.ts.map +1 -0
  32. package/dest/sentinel/sentinel.js +571 -0
  33. package/dest/sentinel/store.d.ts +35 -0
  34. package/dest/sentinel/store.d.ts.map +1 -0
  35. package/dest/sentinel/store.js +182 -0
  36. package/dest/test/index.d.ts +31 -0
  37. package/dest/test/index.d.ts.map +1 -0
  38. package/dest/test/index.js +1 -0
  39. package/package.json +48 -35
  40. package/src/aztec-node/block_response_helpers.ts +161 -0
  41. package/src/aztec-node/config.ts +153 -26
  42. package/src/aztec-node/node_metrics.ts +23 -6
  43. package/src/aztec-node/public_data_overrides.ts +35 -0
  44. package/src/aztec-node/server.ts +1724 -573
  45. package/src/bin/index.ts +4 -2
  46. package/src/index.ts +0 -1
  47. package/src/sentinel/README.md +103 -0
  48. package/src/sentinel/config.ts +49 -0
  49. package/src/sentinel/factory.ts +34 -0
  50. package/src/sentinel/index.ts +8 -0
  51. package/src/sentinel/sentinel.ts +728 -0
  52. package/src/sentinel/store.ts +193 -0
  53. package/src/test/index.ts +32 -0
  54. package/dest/aztec-node/http_rpc_server.d.ts +0 -8
  55. package/dest/aztec-node/http_rpc_server.d.ts.map +0 -1
  56. package/dest/aztec-node/http_rpc_server.js +0 -9
  57. package/src/aztec-node/http_rpc_server.ts +0 -11
@@ -0,0 +1,25 @@
1
+ import { type BlockData, type CommitteeAttestation, L2Block } from '@aztec/stdlib/block';
2
+ import type { CheckpointData, L1PublishedData, ProposedCheckpointData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
3
+ import { type BlockIncludeOptions, type BlockResponse, type CheckpointIncludeOptions, type CheckpointResponse } from '@aztec/stdlib/interfaces/client';
4
+ /** Projects a full {@link L2Block} into a {@link BlockResponse}, attaching L1 / attestation context when provided. */
5
+ export declare function blockResponseFromL2Block(block: L2Block, options: BlockIncludeOptions, context?: {
6
+ l1?: L1PublishedData;
7
+ attestations?: CommitteeAttestation[];
8
+ }): Promise<BlockResponse>;
9
+ /** Projects metadata-only {@link BlockData} into a {@link BlockResponse}. */
10
+ export declare function blockResponseFromBlockData(data: BlockData, options: BlockIncludeOptions, context?: {
11
+ l1?: L1PublishedData;
12
+ attestations?: CommitteeAttestation[];
13
+ }): BlockResponse;
14
+ /** Projects a {@link PublishedCheckpoint} into a {@link CheckpointResponse}. */
15
+ export declare function checkpointResponseFromPublishedCheckpoint(pc: PublishedCheckpoint, options: CheckpointIncludeOptions): Promise<CheckpointResponse>;
16
+ /** Projects metadata-only {@link CheckpointData} into a {@link CheckpointResponse}. `includeBlocks` is ignored (no blocks loaded). */
17
+ export declare function checkpointResponseFromCheckpointData(cd: CheckpointData, options: CheckpointIncludeOptions): CheckpointResponse;
18
+ /**
19
+ * Projects a {@link ProposedCheckpointData} into a {@link CheckpointResponse}.
20
+ * Pure projection — caller pre-fetches `blocks` via `blockSource.getBlocks(...)` when
21
+ * `options.includeBlocks` is true. Throws if `includeL1PublishInfo` or `includeAttestations`
22
+ * is requested (proposed checkpoints have no L1 publish info or attestations).
23
+ */
24
+ export declare function projectProposedToCheckpointResponse(proposed: ProposedCheckpointData, options: CheckpointIncludeOptions, blocks?: L2Block[]): Promise<CheckpointResponse>;
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tfcmVzcG9uc2VfaGVscGVycy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F6dGVjLW5vZGUvYmxvY2tfcmVzcG9uc2VfaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsS0FBSyxTQUFTLEVBQUUsS0FBSyxvQkFBb0IsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN6RixPQUFPLEtBQUssRUFDVixjQUFjLEVBQ2QsZUFBZSxFQUNmLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDcEIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQ0wsS0FBSyxtQkFBbUIsRUFDeEIsS0FBSyxhQUFhLEVBQ2xCLEtBQUssd0JBQXdCLEVBQzdCLEtBQUssa0JBQWtCLEVBRXhCLE1BQU0saUNBQWlDLENBQUM7QUFFekMsc0hBQXNIO0FBQ3RILHdCQUFzQix3QkFBd0IsQ0FDNUMsS0FBSyxFQUFFLE9BQU8sRUFDZCxPQUFPLEVBQUUsbUJBQW1CLEVBQzVCLE9BQU8sQ0FBQyxFQUFFO0lBQUUsRUFBRSxDQUFDLEVBQUUsZUFBZSxDQUFDO0lBQUMsWUFBWSxDQUFDLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQTtDQUFFLEdBQ3hFLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FtQnhCO0FBRUQsNkVBQTZFO0FBQzdFLHdCQUFnQiwwQkFBMEIsQ0FDeEMsSUFBSSxFQUFFLFNBQVMsRUFDZixPQUFPLEVBQUUsbUJBQW1CLEVBQzVCLE9BQU8sQ0FBQyxFQUFFO0lBQUUsRUFBRSxDQUFDLEVBQUUsZUFBZSxDQUFDO0lBQUMsWUFBWSxDQUFDLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQTtDQUFFLEdBQ3hFLGFBQWEsQ0FnQmY7QUFFRCxnRkFBZ0Y7QUFDaEYsd0JBQXNCLHlDQUF5QyxDQUM3RCxFQUFFLEVBQUUsbUJBQW1CLEVBQ3ZCLE9BQU8sRUFBRSx3QkFBd0IsR0FDaEMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBNEI3QjtBQUVELHNJQUFzSTtBQUN0SSx3QkFBZ0Isb0NBQW9DLENBQ2xELEVBQUUsRUFBRSxjQUFjLEVBQ2xCLE9BQU8sRUFBRSx3QkFBd0IsR0FDaEMsa0JBQWtCLENBaUJwQjtBQUVEOzs7OztHQUtHO0FBQ0gsd0JBQXNCLG1DQUFtQyxDQUN2RCxRQUFRLEVBQUUsc0JBQXNCLEVBQ2hDLE9BQU8sRUFBRSx3QkFBd0IsRUFDakMsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQ2pCLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQTRCN0IifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block_response_helpers.d.ts","sourceRoot":"","sources":["../../src/aztec-node/block_response_helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,oBAAoB,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACzF,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,sBAAsB,EACtB,mBAAmB,EACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,wBAAwB,EAC7B,KAAK,kBAAkB,EAExB,MAAM,iCAAiC,CAAC;AAEzC,sHAAsH;AACtH,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,mBAAmB,EAC5B,OAAO,CAAC,EAAE;IAAE,EAAE,CAAC,EAAE,eAAe,CAAC;IAAC,YAAY,CAAC,EAAE,oBAAoB,EAAE,CAAA;CAAE,GACxE,OAAO,CAAC,aAAa,CAAC,CAmBxB;AAED,6EAA6E;AAC7E,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,mBAAmB,EAC5B,OAAO,CAAC,EAAE;IAAE,EAAE,CAAC,EAAE,eAAe,CAAC;IAAC,YAAY,CAAC,EAAE,oBAAoB,EAAE,CAAA;CAAE,GACxE,aAAa,CAgBf;AAED,gFAAgF;AAChF,wBAAsB,yCAAyC,CAC7D,EAAE,EAAE,mBAAmB,EACvB,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CA4B7B;AAED,sIAAsI;AACtI,wBAAgB,oCAAoC,CAClD,EAAE,EAAE,cAAc,EAClB,OAAO,EAAE,wBAAwB,GAChC,kBAAkB,CAiBpB;AAED;;;;;GAKG;AACH,wBAAsB,mCAAmC,CACvD,QAAQ,EAAE,sBAAsB,EAChC,OAAO,EAAE,wBAAwB,EACjC,MAAM,CAAC,EAAE,OAAO,EAAE,GACjB,OAAO,CAAC,kBAAkB,CAAC,CA4B7B"}
@@ -0,0 +1,112 @@
1
+ import { BlockNumber } from '@aztec/foundation/branded-types';
2
+ import { l1PublishInfoFromL1PublishedData } from '@aztec/stdlib/interfaces/client';
3
+ /** Projects a full {@link L2Block} into a {@link BlockResponse}, attaching L1 / attestation context when provided. */ export async function blockResponseFromL2Block(block, options, context) {
4
+ const response = {
5
+ header: block.header,
6
+ archive: block.archive,
7
+ hash: await block.hash(),
8
+ checkpointNumber: block.checkpointNumber,
9
+ indexWithinCheckpoint: block.indexWithinCheckpoint,
10
+ number: block.number
11
+ };
12
+ if (options.includeTransactions) {
13
+ response.body = block.body;
14
+ }
15
+ if (options.includeL1PublishInfo) {
16
+ response.l1 = l1PublishInfoFromL1PublishedData(context?.l1);
17
+ }
18
+ if (options.includeAttestations) {
19
+ response.attestations = context?.attestations ?? [];
20
+ }
21
+ return response;
22
+ }
23
+ /** Projects metadata-only {@link BlockData} into a {@link BlockResponse}. */ export function blockResponseFromBlockData(data, options, context) {
24
+ const response = {
25
+ header: data.header,
26
+ archive: data.archive,
27
+ hash: data.blockHash,
28
+ checkpointNumber: data.checkpointNumber,
29
+ indexWithinCheckpoint: data.indexWithinCheckpoint,
30
+ number: data.header.getBlockNumber()
31
+ };
32
+ if (options.includeL1PublishInfo) {
33
+ response.l1 = l1PublishInfoFromL1PublishedData(context?.l1);
34
+ }
35
+ if (options.includeAttestations) {
36
+ response.attestations = context?.attestations ?? [];
37
+ }
38
+ return response;
39
+ }
40
+ /** Projects a {@link PublishedCheckpoint} into a {@link CheckpointResponse}. */ export async function checkpointResponseFromPublishedCheckpoint(pc, options) {
41
+ const response = {
42
+ number: pc.checkpoint.number,
43
+ header: pc.checkpoint.header,
44
+ archive: pc.checkpoint.archive,
45
+ checkpointOutHash: pc.checkpoint.getCheckpointOutHash(),
46
+ startBlock: pc.checkpoint.blocks[0]?.number ?? BlockNumber.ZERO,
47
+ blockCount: pc.checkpoint.blocks.length,
48
+ feeAssetPriceModifier: pc.checkpoint.feeAssetPriceModifier
49
+ };
50
+ if (options.includeBlocks) {
51
+ response.blocks = await Promise.all(pc.checkpoint.blocks.map((block)=>blockResponseFromL2Block(block, {
52
+ includeTransactions: options.includeTransactions,
53
+ includeL1PublishInfo: false,
54
+ includeAttestations: false
55
+ })));
56
+ }
57
+ if (options.includeL1PublishInfo) {
58
+ response.l1 = l1PublishInfoFromL1PublishedData(pc.l1);
59
+ }
60
+ if (options.includeAttestations) {
61
+ response.attestations = pc.attestations;
62
+ }
63
+ return response;
64
+ }
65
+ /** Projects metadata-only {@link CheckpointData} into a {@link CheckpointResponse}. `includeBlocks` is ignored (no blocks loaded). */ export function checkpointResponseFromCheckpointData(cd, options) {
66
+ const response = {
67
+ number: cd.checkpointNumber,
68
+ header: cd.header,
69
+ archive: cd.archive,
70
+ checkpointOutHash: cd.checkpointOutHash,
71
+ startBlock: cd.startBlock,
72
+ blockCount: cd.blockCount,
73
+ feeAssetPriceModifier: cd.feeAssetPriceModifier
74
+ };
75
+ if (options.includeL1PublishInfo) {
76
+ response.l1 = l1PublishInfoFromL1PublishedData(cd.l1);
77
+ }
78
+ if (options.includeAttestations) {
79
+ response.attestations = cd.attestations;
80
+ }
81
+ return response;
82
+ }
83
+ /**
84
+ * Projects a {@link ProposedCheckpointData} into a {@link CheckpointResponse}.
85
+ * Pure projection — caller pre-fetches `blocks` via `blockSource.getBlocks(...)` when
86
+ * `options.includeBlocks` is true. Throws if `includeL1PublishInfo` or `includeAttestations`
87
+ * is requested (proposed checkpoints have no L1 publish info or attestations).
88
+ */ export async function projectProposedToCheckpointResponse(proposed, options, blocks) {
89
+ if (options.includeL1PublishInfo || options.includeAttestations) {
90
+ throw new Error('Proposed checkpoints have no L1 publish info or attestations');
91
+ }
92
+ const response = {
93
+ number: proposed.checkpointNumber,
94
+ header: proposed.header,
95
+ archive: proposed.archive,
96
+ checkpointOutHash: proposed.checkpointOutHash,
97
+ startBlock: proposed.startBlock,
98
+ blockCount: proposed.blockCount,
99
+ feeAssetPriceModifier: proposed.feeAssetPriceModifier
100
+ };
101
+ if (options.includeBlocks) {
102
+ if (!blocks) {
103
+ throw new Error('Blocks must be supplied when includeBlocks is true');
104
+ }
105
+ response.blocks = await Promise.all(blocks.map((block)=>blockResponseFromL2Block(block, {
106
+ includeTransactions: options.includeTransactions,
107
+ includeL1PublishInfo: false,
108
+ includeAttestations: false
109
+ })));
110
+ }
111
+ return response;
112
+ }
@@ -1,20 +1,37 @@
1
1
  import { type ArchiverConfig } from '@aztec/archiver/config';
2
+ import { type GenesisStateConfig } from '@aztec/ethereum/config';
2
3
  import { type ConfigMappingsType } from '@aztec/foundation/config';
3
- import { type DataStoreConfig } from '@aztec/kv-store/config';
4
+ import { type KeyStore } from '@aztec/node-keystore';
5
+ import { type SharedNodeConfig } from '@aztec/node-lib/config';
4
6
  import { type P2PConfig } from '@aztec/p2p/config';
5
- import { type ProverClientConfig } from '@aztec/prover-client/config';
6
- import { type SequencerClientConfig, sequencerClientConfigMappings } from '@aztec/sequencer-client/config';
7
+ import { type ProverClientUserConfig } from '@aztec/prover-client/config';
8
+ import { type ProverNodeConfig } from '@aztec/prover-node/config';
9
+ import { type SequencerClientConfig, type SequencerTxSenderConfig, sequencerClientConfigMappings } from '@aztec/sequencer-client/config';
10
+ import { type NodeRPCConfig } from '@aztec/stdlib/config';
11
+ import type { SlasherConfig } from '@aztec/stdlib/interfaces/server';
12
+ import { type DataStoreConfig } from '@aztec/stdlib/kv-store';
7
13
  import { type ValidatorClientConfig } from '@aztec/validator-client/config';
8
14
  import { type WorldStateConfig } from '@aztec/world-state/config';
15
+ import { type SentinelConfig } from '../sentinel/config.js';
9
16
  export { sequencerClientConfigMappings, type SequencerClientConfig };
10
17
  /**
11
18
  * The configuration the aztec node.
12
19
  */
13
- export type AztecNodeConfig = ArchiverConfig & SequencerClientConfig & ValidatorClientConfig & ProverClientConfig & WorldStateConfig & Pick<ProverClientConfig, 'bbBinaryPath' | 'bbWorkingDirectory' | 'realProofs'> & P2PConfig & DataStoreConfig & {
20
+ export type AztecNodeConfig = ArchiverConfig & SequencerClientConfig & ValidatorClientConfig & ProverClientUserConfig & WorldStateConfig & Pick<ProverClientUserConfig, 'bbBinaryPath' | 'bbWorkingDirectory' | 'realProofs'> & P2PConfig & DataStoreConfig & SentinelConfig & SharedNodeConfig & GenesisStateConfig & NodeRPCConfig & SlasherConfig & ProverNodeConfig & {
14
21
  /** Whether the validator is disabled for this node */
15
22
  disableValidator: boolean;
16
- /** Whether to populate the genesis state with initial fee juice for the test accounts */
17
- testAccounts: boolean;
23
+ /** Whether to skip waiting for the archiver to be fully synced before starting other services */
24
+ skipArchiverInitialSync: boolean;
25
+ /** A flag to force verification of tx Chonk proofs. Only used for testnet */
26
+ debugForceTxProofVerification: boolean;
27
+ /** Whether to enable the prover node as a subsystem. */
28
+ enableProverNode: boolean;
29
+ /**
30
+ * Test-only: use the deterministic AutomineSequencer instead of the production Sequencer.
31
+ * Requires `aztecTargetCommitteeSize === 0` on the deployed rollup and anvil-backed L1.
32
+ * See `AUTOMINE_E2E_OPTS` in `end-to-end/src/fixtures/fixtures.ts`.
33
+ */
34
+ useAutomineSequencer?: boolean;
18
35
  };
19
36
  export declare const aztecNodeConfigMappings: ConfigMappingsType<AztecNodeConfig>;
20
37
  /**
@@ -22,8 +39,5 @@ export declare const aztecNodeConfigMappings: ConfigMappingsType<AztecNodeConfig
22
39
  * @returns A valid aztec node config.
23
40
  */
24
41
  export declare function getConfigEnvVars(): AztecNodeConfig;
25
- /**
26
- * Returns package version.
27
- */
28
- export declare function getPackageVersion(): any;
29
- //# sourceMappingURL=config.d.ts.map
42
+ export declare function createKeyStoreForValidator(config: SequencerTxSenderConfig & SequencerClientConfig & SharedNodeConfig): KeyStore | undefined;
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXp0ZWMtbm9kZS9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssY0FBYyxFQUEwQixNQUFNLHdCQUF3QixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxLQUFLLGtCQUFrQixFQUE4QixNQUFNLHdCQUF3QixDQUFDO0FBQzdGLE9BQU8sRUFBRSxLQUFLLGtCQUFrQixFQUE4QyxNQUFNLDBCQUEwQixDQUFDO0FBRS9HLE9BQU8sRUFDTCxLQUFLLFFBQVEsRUFJZCxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxLQUFLLGdCQUFnQixFQUE0QixNQUFNLHdCQUF3QixDQUFDO0FBQ3pGLE9BQU8sRUFBRSxLQUFLLFNBQVMsRUFBcUIsTUFBTSxtQkFBbUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsS0FBSyxzQkFBc0IsRUFBOEIsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RyxPQUFPLEVBQ0wsS0FBSyxnQkFBZ0IsRUFHdEIsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQ0wsS0FBSyxxQkFBcUIsRUFDMUIsS0FBSyx1QkFBdUIsRUFDNUIsNkJBQTZCLEVBQzlCLE1BQU0sZ0NBQWdDLENBQUM7QUFHeEMsT0FBTyxFQUFFLEtBQUssYUFBYSxFQUF5QixNQUFNLHNCQUFzQixDQUFDO0FBQ2pGLE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBc0IsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRixPQUFPLEVBQUUsS0FBSyxxQkFBcUIsRUFBaUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzRyxPQUFPLEVBQUUsS0FBSyxnQkFBZ0IsRUFBNEIsTUFBTSwyQkFBMkIsQ0FBQztBQUk1RixPQUFPLEVBQUUsS0FBSyxjQUFjLEVBQTBCLE1BQU0sdUJBQXVCLENBQUM7QUFFcEYsT0FBTyxFQUFFLDZCQUE2QixFQUFFLEtBQUsscUJBQXFCLEVBQUUsQ0FBQztBQUVyRTs7R0FFRztBQUNILE1BQU0sTUFBTSxlQUFlLEdBQUcsY0FBYyxHQUMxQyxxQkFBcUIsR0FDckIscUJBQXFCLEdBQ3JCLHNCQUFzQixHQUN0QixnQkFBZ0IsR0FDaEIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLGNBQWMsR0FBRyxvQkFBb0IsR0FBRyxZQUFZLENBQUMsR0FDbEYsU0FBUyxHQUNULGVBQWUsR0FDZixjQUFjLEdBQ2QsZ0JBQWdCLEdBQ2hCLGtCQUFrQixHQUNsQixhQUFhLEdBQ2IsYUFBYSxHQUNiLGdCQUFnQixHQUFHO0lBQ2pCLHNEQUFzRDtJQUN0RCxnQkFBZ0IsRUFBRSxPQUFPLENBQUM7SUFDMUIsaUdBQWlHO0lBQ2pHLHVCQUF1QixFQUFFLE9BQU8sQ0FBQztJQUNqQyw2RUFBNkU7SUFDN0UsNkJBQTZCLEVBQUUsT0FBTyxDQUFDO0lBQ3ZDLHdEQUF3RDtJQUN4RCxnQkFBZ0IsRUFBRSxPQUFPLENBQUM7SUFDMUI7Ozs7T0FJRztJQUNILG9CQUFvQixDQUFDLEVBQUUsT0FBTyxDQUFDO0NBQ2hDLENBQUM7QUFFSixlQUFPLE1BQU0sdUJBQXVCLEVBQUUsa0JBQWtCLENBQUMsZUFBZSxDQXlDdkUsQ0FBQztBQUVGOzs7R0FHRztBQUNILHdCQUFnQixnQkFBZ0IsSUFBSSxlQUFlLENBRWxEO0FBc0VELHdCQUFnQiwwQkFBMEIsQ0FDeEMsTUFBTSxFQUFFLHVCQUF1QixHQUFHLHFCQUFxQixHQUFHLGdCQUFnQixHQUN6RSxRQUFRLEdBQUcsU0FBUyxDQU10QiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/aztec-node/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAA0B,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAE,KAAK,kBAAkB,EAA8C,MAAM,0BAA0B,CAAC;AAC/G,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAE,KAAK,SAAS,EAAqB,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,KAAK,kBAAkB,EAA8B,MAAM,6BAA6B,CAAC;AAClG,OAAO,EAAE,KAAK,qBAAqB,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AAC3G,OAAO,EAAE,KAAK,qBAAqB,EAAiC,MAAM,gCAAgC,CAAC;AAC3G,OAAO,EAAE,KAAK,gBAAgB,EAA4B,MAAM,2BAA2B,CAAC;AAM5F,OAAO,EAAE,6BAA6B,EAAE,KAAK,qBAAqB,EAAE,CAAC;AAErE;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,cAAc,GAC1C,qBAAqB,GACrB,qBAAqB,GACrB,kBAAkB,GAClB,gBAAgB,GAChB,IAAI,CAAC,kBAAkB,EAAE,cAAc,GAAG,oBAAoB,GAAG,YAAY,CAAC,GAC9E,SAAS,GACT,eAAe,GAAG;IAChB,sDAAsD;IACtD,gBAAgB,EAAE,OAAO,CAAC;IAC1B,yFAAyF;IACzF,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAEJ,eAAO,MAAM,uBAAuB,EAAE,kBAAkB,CAAC,eAAe,CAkBvE,CAAC;AAEF;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,eAAe,CAElD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,QAOhC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/aztec-node/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAA0B,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAE,KAAK,kBAAkB,EAA8B,MAAM,wBAAwB,CAAC;AAC7F,OAAO,EAAE,KAAK,kBAAkB,EAA8C,MAAM,0BAA0B,CAAC;AAE/G,OAAO,EACL,KAAK,QAAQ,EAId,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,KAAK,gBAAgB,EAA4B,MAAM,wBAAwB,CAAC;AACzF,OAAO,EAAE,KAAK,SAAS,EAAqB,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,KAAK,sBAAsB,EAA8B,MAAM,6BAA6B,CAAC;AACtG,OAAO,EACL,KAAK,gBAAgB,EAGtB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC5B,6BAA6B,EAC9B,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EAAE,KAAK,aAAa,EAAyB,MAAM,sBAAsB,CAAC;AACjF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAE,KAAK,qBAAqB,EAAiC,MAAM,gCAAgC,CAAC;AAC3G,OAAO,EAAE,KAAK,gBAAgB,EAA4B,MAAM,2BAA2B,CAAC;AAI5F,OAAO,EAAE,KAAK,cAAc,EAA0B,MAAM,uBAAuB,CAAC;AAEpF,OAAO,EAAE,6BAA6B,EAAE,KAAK,qBAAqB,EAAE,CAAC;AAErE;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,cAAc,GAC1C,qBAAqB,GACrB,qBAAqB,GACrB,sBAAsB,GACtB,gBAAgB,GAChB,IAAI,CAAC,sBAAsB,EAAE,cAAc,GAAG,oBAAoB,GAAG,YAAY,CAAC,GAClF,SAAS,GACT,eAAe,GACf,cAAc,GACd,gBAAgB,GAChB,kBAAkB,GAClB,aAAa,GACb,aAAa,GACb,gBAAgB,GAAG;IACjB,sDAAsD;IACtD,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iGAAiG;IACjG,uBAAuB,EAAE,OAAO,CAAC;IACjC,6EAA6E;IAC7E,6BAA6B,EAAE,OAAO,CAAC;IACvC,wDAAwD;IACxD,gBAAgB,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC,CAAC;AAEJ,eAAO,MAAM,uBAAuB,EAAE,kBAAkB,CAAC,eAAe,CAyCvE,CAAC;AAEF;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,eAAe,CAElD;AAsED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,uBAAuB,GAAG,qBAAqB,GAAG,gBAAgB,GACzE,QAAQ,GAAG,SAAS,CAMtB"}
@@ -1,32 +1,62 @@
1
1
  import { archiverConfigMappings } from '@aztec/archiver/config';
2
+ import { genesisStateConfigMappings } from '@aztec/ethereum/config';
2
3
  import { booleanConfigHelper, getConfigFromMappings } from '@aztec/foundation/config';
3
- import { dataConfigMappings } from '@aztec/kv-store/config';
4
+ import { EthAddress } from '@aztec/foundation/eth-address';
5
+ import { ethPrivateKeySchema, keyStoreConfigMappings } from '@aztec/node-keystore';
6
+ import { sharedNodeConfigMappings } from '@aztec/node-lib/config';
4
7
  import { p2pConfigMappings } from '@aztec/p2p/config';
5
8
  import { proverClientConfigMappings } from '@aztec/prover-client/config';
9
+ import { proverNodeConfigMappings, specificProverNodeConfigMappings } from '@aztec/prover-node/config';
6
10
  import { sequencerClientConfigMappings } from '@aztec/sequencer-client/config';
11
+ import { slasherConfigMappings } from '@aztec/slasher';
12
+ import { AztecAddress } from '@aztec/stdlib/aztec-address';
13
+ import { nodeRpcConfigMappings } from '@aztec/stdlib/config';
14
+ import { dataConfigMappings } from '@aztec/stdlib/kv-store';
7
15
  import { validatorClientConfigMappings } from '@aztec/validator-client/config';
8
16
  import { worldStateConfigMappings } from '@aztec/world-state/config';
9
- import { readFileSync } from 'fs';
10
- import { dirname, resolve } from 'path';
11
- import { fileURLToPath } from 'url';
17
+ import { privateKeyToAddress } from 'viem/accounts';
18
+ import { sentinelConfigMappings } from '../sentinel/config.js';
12
19
  export { sequencerClientConfigMappings };
13
20
  export const aztecNodeConfigMappings = {
21
+ ...dataConfigMappings,
22
+ ...keyStoreConfigMappings,
14
23
  ...archiverConfigMappings,
15
24
  ...sequencerClientConfigMappings,
25
+ ...proverNodeConfigMappings,
16
26
  ...validatorClientConfigMappings,
17
27
  ...proverClientConfigMappings,
18
28
  ...worldStateConfigMappings,
19
29
  ...p2pConfigMappings,
20
- ...dataConfigMappings,
30
+ ...sentinelConfigMappings,
31
+ ...sharedNodeConfigMappings,
32
+ ...genesisStateConfigMappings,
33
+ ...nodeRpcConfigMappings,
34
+ ...slasherConfigMappings,
35
+ ...specificProverNodeConfigMappings,
21
36
  disableValidator: {
22
37
  env: 'VALIDATOR_DISABLED',
23
38
  description: 'Whether the validator is disabled for this node.',
24
39
  ...booleanConfigHelper()
25
40
  },
26
- testAccounts: {
27
- env: 'TEST_ACCOUNTS',
28
- description: 'Whether to populate the genesis state with initial fee juice for the test accounts.',
29
- ...booleanConfigHelper()
41
+ skipArchiverInitialSync: {
42
+ env: 'SKIP_ARCHIVER_INITIAL_SYNC',
43
+ description: 'Whether to skip waiting for the archiver to be fully synced before starting other services.',
44
+ ...booleanConfigHelper(false)
45
+ },
46
+ debugForceTxProofVerification: {
47
+ env: 'DEBUG_FORCE_TX_PROOF_VERIFICATION',
48
+ description: 'Whether to skip waiting for the archiver to be fully synced before starting other services.',
49
+ ...booleanConfigHelper(false)
50
+ },
51
+ enableProverNode: {
52
+ env: 'ENABLE_PROVER_NODE',
53
+ description: 'Whether to enable the prover node as a subsystem.',
54
+ ...booleanConfigHelper(false)
55
+ },
56
+ useAutomineSequencer: {
57
+ env: 'USE_AUTOMINE_SEQUENCER',
58
+ description: 'Test-only: use AutomineSequencer instead of the production Sequencer.',
59
+ ...booleanConfigHelper(false)
30
60
  }
31
61
  };
32
62
  /**
@@ -35,10 +65,55 @@ export const aztecNodeConfigMappings = {
35
65
  */ export function getConfigEnvVars() {
36
66
  return getConfigFromMappings(aztecNodeConfigMappings);
37
67
  }
38
- /**
39
- * Returns package version.
40
- */ export function getPackageVersion() {
41
- const releasePleaseManifestPath = resolve(dirname(fileURLToPath(import.meta.url)), '../../../../.release-please-manifest.json');
42
- const version = JSON.parse(readFileSync(releasePleaseManifestPath).toString());
43
- return version['.'];
68
+ function createKeyStoreFromWeb3Signer(config) {
69
+ const validatorKeyStores = [];
70
+ if (config.web3SignerUrl === undefined || config.web3SignerUrl.length === 0 || config.validatorAddresses === undefined || config.validatorAddresses.length === 0) {
71
+ return undefined;
72
+ }
73
+ validatorKeyStores.push({
74
+ attester: config.validatorAddresses,
75
+ feeRecipient: config.feeRecipient ?? AztecAddress.ZERO,
76
+ coinbase: config.coinbase ?? config.validatorAddresses[0],
77
+ remoteSigner: config.web3SignerUrl,
78
+ publisher: config.sequencerPublisherAddresses ?? []
79
+ });
80
+ const keyStore = {
81
+ schemaVersion: 1,
82
+ slasher: undefined,
83
+ prover: undefined,
84
+ remoteSigner: undefined,
85
+ validators: validatorKeyStores
86
+ };
87
+ return keyStore;
88
+ }
89
+ function createKeyStoreFromPrivateKeys(config) {
90
+ const validatorKeyStores = [];
91
+ const ethPrivateKeys = config.validatorPrivateKeys ? config.validatorPrivateKeys.getValue().map((x)=>ethPrivateKeySchema.parse(x)) : [];
92
+ if (!ethPrivateKeys.length) {
93
+ return undefined;
94
+ }
95
+ const coinbase = config.coinbase ?? EthAddress.fromString(privateKeyToAddress(ethPrivateKeys[0]));
96
+ const feeRecipient = config.feeRecipient ?? AztecAddress.ZERO;
97
+ const publisherKeys = config.sequencerPublisherPrivateKeys ? config.sequencerPublisherPrivateKeys.map((k)=>ethPrivateKeySchema.parse(k.getValue())) : [];
98
+ validatorKeyStores.push({
99
+ attester: ethPrivateKeys,
100
+ feeRecipient: feeRecipient,
101
+ coinbase: coinbase,
102
+ remoteSigner: undefined,
103
+ publisher: publisherKeys
104
+ });
105
+ const keyStore = {
106
+ schemaVersion: 1,
107
+ slasher: undefined,
108
+ prover: undefined,
109
+ remoteSigner: undefined,
110
+ validators: validatorKeyStores
111
+ };
112
+ return keyStore;
113
+ }
114
+ export function createKeyStoreForValidator(config) {
115
+ if (config.web3SignerUrl !== undefined && config.web3SignerUrl.length > 0) {
116
+ return createKeyStoreFromWeb3Signer(config);
117
+ }
118
+ return createKeyStoreFromPrivateKeys(config);
44
119
  }
@@ -2,7 +2,11 @@ import { type TelemetryClient } from '@aztec/telemetry-client';
2
2
  export declare class NodeMetrics {
3
3
  private receiveTxCount;
4
4
  private receiveTxDuration;
5
+ private snapshotErrorCount;
6
+ private snapshotDuration;
5
7
  constructor(client: TelemetryClient, name?: string);
6
8
  receivedTx(durationMs: number, isAccepted: boolean): void;
9
+ recordSnapshot(durationMs: number): void;
10
+ recordSnapshotError(): void;
7
11
  }
8
- //# sourceMappingURL=node_metrics.d.ts.map
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZV9tZXRyaWNzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXp0ZWMtbm9kZS9ub2RlX21ldHJpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUlMLEtBQUssZUFBZSxFQUdyQixNQUFNLHlCQUF5QixDQUFDO0FBRWpDLHFCQUFhLFdBQVc7SUFDdEIsT0FBTyxDQUFDLGNBQWMsQ0FBZ0I7SUFDdEMsT0FBTyxDQUFDLGlCQUFpQixDQUFZO0lBRXJDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBZ0I7SUFDMUMsT0FBTyxDQUFDLGdCQUFnQixDQUFZO0lBRXBDLFlBQVksTUFBTSxFQUFFLGVBQWUsRUFBRSxJQUFJLFNBQWMsRUFVdEQ7SUFFRCxVQUFVLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxRQU9qRDtJQUVELGNBQWMsQ0FBQyxVQUFVLEVBQUUsTUFBTSxRQU1oQztJQUVELG1CQUFtQixTQUVsQjtDQUNGIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"node_metrics.d.ts","sourceRoot":"","sources":["../../src/aztec-node/node_metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,eAAe,EAGrB,MAAM,yBAAyB,CAAC;AAEjC,qBAAa,WAAW;IACtB,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,iBAAiB,CAAY;gBAEzB,MAAM,EAAE,eAAe,EAAE,IAAI,SAAc;IAUvD,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO;CAQnD"}
1
+ {"version":3,"file":"node_metrics.d.ts","sourceRoot":"","sources":["../../src/aztec-node/node_metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,eAAe,EAGrB,MAAM,yBAAyB,CAAC;AAEjC,qBAAa,WAAW;IACtB,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,iBAAiB,CAAY;IAErC,OAAO,CAAC,kBAAkB,CAAgB;IAC1C,OAAO,CAAC,gBAAgB,CAAY;IAEpC,YAAY,MAAM,EAAE,eAAe,EAAE,IAAI,SAAc,EAUtD;IAED,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,QAOjD;IAED,cAAc,CAAC,UAAU,EAAE,MAAM,QAMhC;IAED,mBAAmB,SAElB;CACF"}
@@ -1,15 +1,20 @@
1
- import { Attributes, Metrics, ValueType } from '@aztec/telemetry-client';
1
+ import { Attributes, Metrics, createUpDownCounterWithDefault } from '@aztec/telemetry-client';
2
2
  export class NodeMetrics {
3
3
  receiveTxCount;
4
4
  receiveTxDuration;
5
+ snapshotErrorCount;
6
+ snapshotDuration;
5
7
  constructor(client, name = 'AztecNode'){
6
8
  const meter = client.getMeter(name);
7
- this.receiveTxCount = meter.createUpDownCounter(Metrics.NODE_RECEIVE_TX_COUNT, {});
8
- this.receiveTxDuration = meter.createHistogram(Metrics.NODE_RECEIVE_TX_DURATION, {
9
- description: 'The duration of the receiveTx method',
10
- unit: 'ms',
11
- valueType: ValueType.INT
9
+ this.receiveTxCount = createUpDownCounterWithDefault(meter, Metrics.NODE_RECEIVE_TX_COUNT, {
10
+ [Attributes.OK]: [
11
+ true,
12
+ false
13
+ ]
12
14
  });
15
+ this.receiveTxDuration = meter.createHistogram(Metrics.NODE_RECEIVE_TX_DURATION);
16
+ this.snapshotDuration = meter.createHistogram(Metrics.NODE_SNAPSHOT_DURATION);
17
+ this.snapshotErrorCount = createUpDownCounterWithDefault(meter, Metrics.NODE_SNAPSHOT_ERROR_COUNT);
13
18
  }
14
19
  receivedTx(durationMs, isAccepted) {
15
20
  this.receiveTxDuration.record(Math.ceil(durationMs), {
@@ -19,4 +24,13 @@ export class NodeMetrics {
19
24
  [Attributes.OK]: isAccepted
20
25
  });
21
26
  }
27
+ recordSnapshot(durationMs) {
28
+ if (isNaN(durationMs)) {
29
+ return;
30
+ }
31
+ this.snapshotDuration.record(Math.ceil(durationMs));
32
+ }
33
+ recordSnapshotError() {
34
+ this.snapshotErrorCount.add(1);
35
+ }
22
36
  }
@@ -0,0 +1,13 @@
1
+ import type { PublicStorageOverride } from '@aztec/stdlib/interfaces/client';
2
+ import type { MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
3
+ /**
4
+ * Injects public-state overrides into an (ephemeral) world-state fork before simulation.
5
+ *
6
+ * Each override is written via the same `sequentialInsert` path the public processor
7
+ * uses during real transaction execution, so low-leaf updates and root coherence are
8
+ * handled identically for both simulation and proof generation.
9
+ *
10
+ * Writes never reach committed world state — the fork is thrown away after simulation.
11
+ */
12
+ export declare function applyPublicDataOverrides(fork: MerkleTreeWriteOperations, publicStorage: PublicStorageOverride[] | undefined): Promise<void>;
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2RhdGFfb3ZlcnJpZGVzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXp0ZWMtbm9kZS9wdWJsaWNfZGF0YV9vdmVycmlkZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxLQUFLLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM3RSxPQUFPLEtBQUssRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBR2pGOzs7Ozs7OztHQVFHO0FBQ0gsd0JBQXNCLHdCQUF3QixDQUM1QyxJQUFJLEVBQUUseUJBQXlCLEVBQy9CLGFBQWEsRUFBRSxxQkFBcUIsRUFBRSxHQUFHLFNBQVMsR0FDakQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQWdCZiJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public_data_overrides.d.ts","sourceRoot":"","sources":["../../src/aztec-node/public_data_overrides.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAGjF;;;;;;;;GAQG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,yBAAyB,EAC/B,aAAa,EAAE,qBAAqB,EAAE,GAAG,SAAS,GACjD,OAAO,CAAC,IAAI,CAAC,CAgBf"}
@@ -0,0 +1,21 @@
1
+ import { PublicDataWrite } from '@aztec/stdlib/avm';
2
+ import { computePublicDataTreeLeafSlot } from '@aztec/stdlib/hash';
3
+ import { MerkleTreeId } from '@aztec/stdlib/trees';
4
+ /**
5
+ * Injects public-state overrides into an (ephemeral) world-state fork before simulation.
6
+ *
7
+ * Each override is written via the same `sequentialInsert` path the public processor
8
+ * uses during real transaction execution, so low-leaf updates and root coherence are
9
+ * handled identically for both simulation and proof generation.
10
+ *
11
+ * Writes never reach committed world state — the fork is thrown away after simulation.
12
+ */ export async function applyPublicDataOverrides(fork, publicStorage) {
13
+ if (!publicStorage?.length) {
14
+ return;
15
+ }
16
+ const writes = await Promise.all(publicStorage.map(async (o)=>{
17
+ const leafSlot = await computePublicDataTreeLeafSlot(o.contract, o.slot);
18
+ return new PublicDataWrite(leafSlot, o.value);
19
+ }));
20
+ await fork.sequentialInsert(MerkleTreeId.PUBLIC_DATA_TREE, writes.map((w)=>w.toBuffer()));
21
+ }