@aztec/aztec-node 5.0.0-nightly.20260504 → 5.0.0-nightly.20260512

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.
@@ -398,11 +398,11 @@ import { ProtocolContractAddress } from '@aztec/protocol-contracts';
398
398
  import { createProverNode } from '@aztec/prover-node';
399
399
  import { createKeyStoreForProver } from '@aztec/prover-node/config';
400
400
  import { FeeProviderImpl, GlobalVariableBuilder, SequencerClient } from '@aztec/sequencer-client';
401
- import { PublicProcessorFactory } from '@aztec/simulator/server';
401
+ import { PublicContractsDB, PublicProcessorFactory } from '@aztec/simulator/server';
402
402
  import { AttestationsBlockWatcher, EpochPruneWatcher, createSlasher } from '@aztec/slasher';
403
403
  import { CollectionLimitsConfig, PublicSimulatorConfig } from '@aztec/stdlib/avm';
404
404
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
405
- import { BlockHash, L2Block, inspectBlockParameter } from '@aztec/stdlib/block';
405
+ import { BlockHash, BlockTag, inspectBlockParameter } from '@aztec/stdlib/block';
406
406
  import { GasFees } from '@aztec/stdlib/gas';
407
407
  import { computePublicDataTreeLeafSlot } from '@aztec/stdlib/hash';
408
408
  import { AztecNodeAdminConfigSchema } from '@aztec/stdlib/interfaces/client';
@@ -414,12 +414,13 @@ import { PublicSimulationOutput, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
414
414
  import { getPackageVersion } from '@aztec/stdlib/update-checker';
415
415
  import { Attributes, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
416
416
  import { FullNodeCheckpointsBuilder as CheckpointsBuilder, FullNodeCheckpointsBuilder, NodeKeystoreAdapter, ValidatorClient, createProposalHandler, createValidatorClient } from '@aztec/validator-client';
417
- import { createWorldStateSynchronizer } from '@aztec/world-state';
417
+ import { createWorldState, createWorldStateSynchronizer } from '@aztec/world-state';
418
418
  import { createPublicClient } from 'viem';
419
419
  import { createSentinel } from '../sentinel/factory.js';
420
420
  import { blockResponseFromBlockData, blockResponseFromL2Block, checkpointResponseFromCheckpointData, checkpointResponseFromPublishedCheckpoint } from './block_response_helpers.js';
421
421
  import { createKeyStoreForValidator } from './config.js';
422
422
  import { NodeMetrics } from './node_metrics.js';
423
+ import { applyPublicDataOverrides } from './public_data_overrides.js';
423
424
  _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
424
425
  [Attributes.TX_HASH]: tx.getTxHash().toString()
425
426
  }));
@@ -463,7 +464,6 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
463
464
  ], []));
464
465
  }
465
466
  metrics;
466
- initialHeaderHashPromise;
467
467
  // Prevent two snapshot operations to happen simultaneously
468
468
  isUploadingSnapshot;
469
469
  tracer;
@@ -495,8 +495,7 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
495
495
  this.validatorClient = validatorClient;
496
496
  this.keyStoreManager = keyStoreManager;
497
497
  this.debugLogStore = debugLogStore;
498
- this.initialHeaderHashPromise = (_initProto(this), undefined);
499
- this.isUploadingSnapshot = false;
498
+ this.isUploadingSnapshot = (_initProto(this), false);
500
499
  this.metrics = new NodeMetrics(telemetry, 'AztecNodeService');
501
500
  this.tracer = telemetry.getTracer('AztecNodeService');
502
501
  this.log.info(`Aztec Node version: ${this.packageVersion}`);
@@ -528,14 +527,27 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
528
527
  return this.blockSource.getL2Tips();
529
528
  }
530
529
  async getBlockHeader(number) {
531
- const resolvedNumber = number === 'latest' ? await this.blockSource.getBlockNumber() : number;
532
- if (resolvedNumber === BlockNumber.ZERO) {
533
- return this.worldStateSynchronizer.getCommitted().getInitialHeader();
530
+ if (number === 'latest') {
531
+ return (await this.blockSource.getBlockData({
532
+ tag: 'proposed'
533
+ }))?.header;
534
534
  }
535
- return this.blockSource.getBlockHeader(resolvedNumber);
535
+ return (await this.blockSource.getBlockData({
536
+ number
537
+ }))?.header;
536
538
  }
537
539
  async getCheckpointedBlocks(from, limit) {
538
- return await this.blockSource.getCheckpointedBlocks(from, limit) ?? [];
540
+ const blocks = await this.blockSource.getBlocks({
541
+ from,
542
+ limit,
543
+ onlyCheckpointed: true
544
+ });
545
+ const ctxByCheckpoint = await this.#getCheckpointContextsForBlocks(blocks);
546
+ return Promise.all(blocks.map((block)=>blockResponseFromL2Block(block, {
547
+ includeTransactions: true,
548
+ includeL1PublishInfo: true,
549
+ includeAttestations: true
550
+ }, ctxByCheckpoint.get(block.checkpointNumber))));
539
551
  }
540
552
  getCheckpointsDataForEpoch(epoch) {
541
553
  return this.blockSource.getCheckpointsDataForEpoch(epoch);
@@ -570,7 +582,11 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
570
582
  isChainTip(value) {
571
583
  return value === 'proposed' || value === 'checkpointed' || value === 'proven' || value === 'finalized';
572
584
  }
573
- async resolveBlockParameter(param) {
585
+ /**
586
+ * Normalizes a {@link BlockParameter} (which may be a bare value) into a
587
+ * {@link NormalizedBlockParameter} object form. Performs no chain-tip resolution — tag
588
+ * lookups are deferred to the underlying block source.
589
+ */ normalizeBlockParameter(param) {
574
590
  if (BlockHash.isBlockHash(param)) {
575
591
  return {
576
592
  hash: param
@@ -581,15 +597,13 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
581
597
  number: param
582
598
  };
583
599
  }
584
- if (param === 'latest') {
585
- return {
586
- number: await this.blockSource.getBlockNumber()
587
- };
588
- }
589
- if (this.isChainTip(param)) {
590
- return {
591
- number: await this.getBlockNumber(param)
592
- };
600
+ if (typeof param === 'string') {
601
+ if (this.isBlockTag(param)) {
602
+ return {
603
+ tag: param === 'latest' ? 'proposed' : param
604
+ };
605
+ }
606
+ throw new BadRequestError(`Invalid BlockParameter tag: ${param}`);
593
607
  }
594
608
  if (typeof param === 'object' && param !== null) {
595
609
  if ('number' in param) {
@@ -607,9 +621,20 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
607
621
  archive: param.archive
608
622
  };
609
623
  }
624
+ if ('tag' in param) {
625
+ if (this.isBlockTag(param.tag)) {
626
+ return {
627
+ tag: param.tag
628
+ };
629
+ }
630
+ throw new BadRequestError(`Invalid BlockParameter tag: ${param.tag}`);
631
+ }
610
632
  }
611
633
  throw new BadRequestError(`Invalid BlockParameter: ${JSON.stringify(param)}`);
612
634
  }
635
+ isBlockTag(value) {
636
+ return BlockTag.includes(value);
637
+ }
613
638
  async resolveCheckpointParameter(param) {
614
639
  if (typeof param === 'number') {
615
640
  return {
@@ -640,93 +665,60 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
640
665
  }
641
666
  throw new BadRequestError(`Invalid CheckpointParameter: ${JSON.stringify(param)}`);
642
667
  }
668
+ /** Fetches checkpoint-level L1 and attestation data for use as block response context. */ async #getCheckpointContext(checkpointNumber) {
669
+ const checkpoint = await this.blockSource.getCheckpointData(checkpointNumber);
670
+ if (!checkpoint) {
671
+ return undefined;
672
+ }
673
+ return {
674
+ l1: checkpoint.l1,
675
+ attestations: checkpoint.attestations
676
+ };
677
+ }
643
678
  async getBlock(param, options = {}) {
644
- const resolved = await this.resolveBlockParameter(param);
679
+ const query = this.normalizeBlockParameter(param);
645
680
  const wantTxs = !!options.includeTransactions;
646
681
  const wantContext = !!options.includeL1PublishInfo || !!options.includeAttestations;
647
- if (resolved.hash !== undefined) {
648
- const initial = await this.#getInitialHeaderHash();
649
- if (resolved.hash.equals(initial)) {
650
- return await this.buildGenesisBlockResponse(options);
651
- }
652
- if (wantTxs) {
653
- const block = await this.blockSource.getL2BlockByHash(resolved.hash);
654
- if (!block) {
655
- return undefined;
656
- }
657
- const ctx = wantContext ? await this.blockSource.getBlockDataWithCheckpointContext(block.number) : undefined;
658
- return await blockResponseFromL2Block(block, options, ctx);
659
- }
660
- const data = await this.blockSource.getBlockHeaderByHash(resolved.hash);
661
- if (!data) {
662
- return undefined;
663
- }
664
- const blockNumber = data.globalVariables.blockNumber;
665
- const ctx = wantContext ? await this.blockSource.getBlockDataWithCheckpointContext(blockNumber) : undefined;
666
- if (ctx) {
667
- return blockResponseFromBlockData(ctx.data, blockNumber, options, ctx);
668
- }
669
- const blockData = await this.blockSource.getBlockData(blockNumber);
670
- if (!blockData) {
671
- return undefined;
672
- }
673
- return blockResponseFromBlockData(blockData, blockNumber, options);
674
- }
675
- if (resolved.archive !== undefined) {
676
- if (wantTxs) {
677
- const block = await this.blockSource.getL2BlockByArchive(resolved.archive);
678
- if (!block) {
679
- return undefined;
680
- }
681
- const ctx = wantContext ? await this.blockSource.getBlockDataWithCheckpointContext(block.number) : undefined;
682
- return await blockResponseFromL2Block(block, options, ctx);
683
- }
684
- const data = await this.blockSource.getBlockDataByArchive(resolved.archive);
685
- if (!data) {
686
- return undefined;
687
- }
688
- const blockNumber = data.header.globalVariables.blockNumber;
689
- const ctx = wantContext ? await this.blockSource.getBlockDataWithCheckpointContext(blockNumber) : undefined;
690
- return blockResponseFromBlockData(data, blockNumber, options, ctx);
691
- }
692
- const blockNumber = resolved.number;
693
- if (blockNumber === BlockNumber.ZERO) {
694
- return await this.buildGenesisBlockResponse(options);
695
- }
696
682
  if (wantTxs) {
697
- const block = await this.blockSource.getL2Block(blockNumber);
683
+ const block = await this.blockSource.getBlock(query);
698
684
  if (!block) {
699
685
  return undefined;
700
686
  }
701
- const ctx = wantContext ? await this.blockSource.getBlockDataWithCheckpointContext(blockNumber) : undefined;
687
+ const ctx = wantContext ? await this.#getCheckpointContext(block.checkpointNumber) : undefined;
702
688
  return await blockResponseFromL2Block(block, options, ctx);
703
689
  }
704
- const ctx = await this.blockSource.getBlockDataWithCheckpointContext(blockNumber);
705
- if (!ctx) {
690
+ const data = await this.blockSource.getBlockData(query);
691
+ if (!data) {
706
692
  return undefined;
707
693
  }
708
- return blockResponseFromBlockData(ctx.data, blockNumber, options, ctx);
694
+ const ctx = wantContext ? await this.#getCheckpointContext(data.checkpointNumber) : undefined;
695
+ return blockResponseFromBlockData(data, options, ctx);
709
696
  }
710
697
  async getBlocks(from, limit, options = {}) {
711
698
  const wantTxs = !!options.includeTransactions;
712
699
  const wantContext = !!options.includeL1PublishInfo || !!options.includeAttestations;
713
700
  if (wantTxs) {
714
- const blocks = await this.blockSource.getBlocks(from, limit);
715
- return await Promise.all(blocks.map(async (block)=>{
716
- const ctx = wantContext ? await this.blockSource.getBlockDataWithCheckpointContext(block.number) : undefined;
717
- return blockResponseFromL2Block(block, options, ctx);
718
- }));
719
- }
720
- const results = [];
721
- for(let i = 0; i < limit; i++){
722
- const blockNumber = BlockNumber(from + i);
723
- const ctx = await this.blockSource.getBlockDataWithCheckpointContext(blockNumber);
724
- if (!ctx) {
725
- break;
726
- }
727
- results.push(blockResponseFromBlockData(ctx.data, blockNumber, options, ctx));
701
+ const blocks = await this.blockSource.getBlocks({
702
+ from,
703
+ limit
704
+ });
705
+ const ctxByCheckpoint = await this.#getCheckpointContextsForBlocks(wantContext ? blocks : []);
706
+ return await Promise.all(blocks.map((block)=>blockResponseFromL2Block(block, options, ctxByCheckpoint.get(block.checkpointNumber))));
728
707
  }
729
- return results;
708
+ const dataItems = await this.blockSource.getBlocksData({
709
+ from,
710
+ limit
711
+ });
712
+ const ctxByCheckpoint = await this.#getCheckpointContextsForBlocks(wantContext ? dataItems : []);
713
+ return await Promise.all(dataItems.map((data)=>blockResponseFromBlockData(data, options, ctxByCheckpoint.get(data.checkpointNumber))));
714
+ }
715
+ /** Fetches checkpoint context for a set of blocks, deduplicating shared checkpoints. */ async #getCheckpointContextsForBlocks(blocks) {
716
+ const unique = Array.from(new Set(blocks.map((b)=>b.checkpointNumber)));
717
+ const entries = await Promise.all(unique.map(async (n)=>[
718
+ n,
719
+ await this.#getCheckpointContext(n)
720
+ ]));
721
+ return new Map(entries);
730
722
  }
731
723
  async getCheckpoint(param, options = {}) {
732
724
  const resolved = await this.resolveCheckpointParameter(param);
@@ -758,30 +750,6 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
758
750
  const datas = await this.blockSource.getCheckpointDataRange(from, limit);
759
751
  return datas.map((d)=>checkpointResponseFromCheckpointData(d, options));
760
752
  }
761
- async buildGenesisBlockResponse(options) {
762
- const initial = this.worldStateSynchronizer.getCommitted().getInitialHeader();
763
- const empty = L2Block.empty(initial);
764
- const response = {
765
- header: empty.header,
766
- archive: empty.archive,
767
- hash: await this.#getInitialHeaderHash(),
768
- checkpointNumber: empty.checkpointNumber,
769
- indexWithinCheckpoint: empty.indexWithinCheckpoint,
770
- number: empty.number
771
- };
772
- if (options.includeTransactions) {
773
- response.body = empty.body;
774
- }
775
- if (options.includeL1PublishInfo) {
776
- response.l1 = {
777
- published: false
778
- };
779
- }
780
- if (options.includeAttestations) {
781
- response.attestations = [];
782
- }
783
- return response;
784
- }
785
753
  /**
786
754
  * initializes the Aztec Node, wait for component to sync.
787
755
  * @param config - The configuration to be used by the aztec node.
@@ -791,7 +759,7 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
791
759
  ...inputConfig
792
760
  }; // Copy the config so we dont mutate the input object
793
761
  const log = deps.logger ?? createLogger('node');
794
- const packageVersion = getPackageVersion() ?? '';
762
+ const packageVersion = getPackageVersion();
795
763
  const telemetry = deps.telemetry ?? getTelemetryClient();
796
764
  const dateProvider = deps.dateProvider ?? new DateProvider();
797
765
  const ethereumChain = createEthereumChain(config.l1RpcUrls, config.l1ChainId);
@@ -866,6 +834,10 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
866
834
  // Track started resources so we can clean up on partial failure during node creation.
867
835
  const started = [];
868
836
  try {
837
+ // Create world-state first so we can retrieve the initial header before constructing the archiver.
838
+ const nativeWs = await createWorldState(config, options.genesis);
839
+ const initialHeader = nativeWs.getInitialHeader();
840
+ const initialBlockHash = await initialHeader.hash();
869
841
  const archiver = await createArchiver(config, {
870
842
  blobClient,
871
843
  epochCache,
@@ -873,10 +845,10 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
873
845
  dateProvider
874
846
  }, {
875
847
  blockUntilSync: !config.skipArchiverInitialSync
876
- });
848
+ }, initialHeader, initialBlockHash);
877
849
  started.push(archiver);
878
- // now create the merkle trees and the world state synchronizer
879
- const worldStateSynchronizer = await createWorldStateSynchronizer(config, archiver, options.genesis, telemetry);
850
+ // The synchronizer takes ownership of the native world-state from here
851
+ const worldStateSynchronizer = await createWorldStateSynchronizer(config, archiver, nativeWs, telemetry);
880
852
  started.push(worldStateSynchronizer);
881
853
  const useRealVerifiers = config.realProofs || config.debugForceTxProofVerification;
882
854
  let peerProofVerifier;
@@ -912,7 +884,7 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
912
884
  log.info('Starting in prover-only mode: skipping validator, sequencer, sentinel, and slasher subsystems');
913
885
  }
914
886
  // create the tx pool and the p2p client, which will need the l2 block source
915
- const p2pClient = await createP2PClient(config, archiver, peerProofVerifier, worldStateSynchronizer, epochCache, feeProvider, packageVersion, dateProvider, telemetry, deps.p2pClientDeps);
887
+ const p2pClient = await createP2PClient(config, archiver, peerProofVerifier, worldStateSynchronizer, epochCache, feeProvider, packageVersion, dateProvider, telemetry, deps.p2pClientDeps, initialBlockHash);
916
888
  started.push(p2pClient);
917
889
  // We'll accumulate sentinel watchers here
918
890
  const watchers = [];
@@ -1220,32 +1192,26 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
1220
1192
  async getPrivateLogsByTags(tags, page, referenceBlock) {
1221
1193
  let upToBlockNumber;
1222
1194
  if (referenceBlock) {
1223
- const initialBlockHash = await this.#getInitialHeaderHash();
1224
- if (referenceBlock.equals(initialBlockHash)) {
1225
- upToBlockNumber = BlockNumber(0);
1226
- } else {
1227
- const header = await this.blockSource.getBlockHeaderByHash(referenceBlock);
1228
- if (!header) {
1229
- throw new Error(`Block ${referenceBlock.toString()} not found in the node. This might indicate a reorg has occurred.`);
1230
- }
1231
- upToBlockNumber = header.globalVariables.blockNumber;
1195
+ const data = await this.blockSource.getBlockData({
1196
+ hash: referenceBlock
1197
+ });
1198
+ if (!data) {
1199
+ throw new Error(`Block ${referenceBlock.toString()} not found in the node. This might indicate a reorg has occurred.`);
1232
1200
  }
1201
+ upToBlockNumber = data.header.globalVariables.blockNumber;
1233
1202
  }
1234
1203
  return this.logsSource.getPrivateLogsByTags(tags, page, upToBlockNumber);
1235
1204
  }
1236
1205
  async getPublicLogsByTagsFromContract(contractAddress, tags, page, referenceBlock) {
1237
1206
  let upToBlockNumber;
1238
1207
  if (referenceBlock) {
1239
- const initialBlockHash = await this.#getInitialHeaderHash();
1240
- if (referenceBlock.equals(initialBlockHash)) {
1241
- upToBlockNumber = BlockNumber(0);
1242
- } else {
1243
- const header = await this.blockSource.getBlockHeaderByHash(referenceBlock);
1244
- if (!header) {
1245
- throw new Error(`Block ${referenceBlock.toString()} not found in the node. This might indicate a reorg has occurred.`);
1246
- }
1247
- upToBlockNumber = header.globalVariables.blockNumber;
1208
+ const data = await this.blockSource.getBlockData({
1209
+ hash: referenceBlock
1210
+ });
1211
+ if (!data) {
1212
+ throw new Error(`Block ${referenceBlock.toString()} not found in the node. This might indicate a reorg has occurred.`);
1248
1213
  }
1214
+ upToBlockNumber = data.header.globalVariables.blockNumber;
1249
1215
  }
1250
1216
  return this.logsSource.getPublicLogsByTagsFromContract(contractAddress, tags, page, upToBlockNumber);
1251
1217
  }
@@ -1479,10 +1445,12 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
1479
1445
  * @param epoch - The epoch at which to get the data.
1480
1446
  * @returns The L2 to L1 messages (empty array if the epoch is not found).
1481
1447
  */ async getL2ToL1Messages(epoch) {
1482
- // Assumes `getCheckpointedBlocksForEpoch` returns blocks in ascending order of block number.
1483
- const checkpointedBlocks = await this.blockSource.getCheckpointedBlocksForEpoch(epoch);
1484
- const blocksInCheckpoints = chunkBy(checkpointedBlocks, (cb)=>cb.block.header.globalVariables.slotNumber).map((group)=>group.map((cb)=>cb.block));
1485
- return blocksInCheckpoints.map((blocks)=>blocks.map((block)=>block.body.txEffects.map((txEffect)=>txEffect.l2ToL1Msgs)));
1448
+ const blocks = await this.blockSource.getBlocks({
1449
+ epoch,
1450
+ onlyCheckpointed: true
1451
+ });
1452
+ const blocksInCheckpoints = chunkBy(blocks, (block)=>block.header.globalVariables.slotNumber);
1453
+ return blocksInCheckpoints.map((slotBlocks)=>slotBlocks.map((block)=>block.body.txEffects.map((txEffect)=>txEffect.l2ToL1Msgs)));
1486
1454
  }
1487
1455
  async getNullifierMembershipWitness(referenceBlock, nullifier) {
1488
1456
  const db = await this.getWorldState(referenceBlock);
@@ -1537,7 +1505,9 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
1537
1505
  /**
1538
1506
  * Simulates the public part of a transaction with the current state.
1539
1507
  * @param tx - The transaction to simulate.
1540
- **/ async simulatePublicCalls(tx, skipFeeEnforcement = false) {
1508
+ * @param skipFeeEnforcement - If true, fee enforcement is skipped.
1509
+ * @param overrides - Optional pre-simulation overrides applied to the ephemeral fork and contract DB.
1510
+ **/ async simulatePublicCalls(tx, skipFeeEnforcement = false, overrides) {
1541
1511
  // Check total gas limit for simulation
1542
1512
  const gasSettings = tx.data.constants.txContext.gasSettings;
1543
1513
  const txGasLimit = gasSettings.gasLimits.l2Gas;
@@ -1562,6 +1532,7 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
1562
1532
  await this.worldStateSynchronizer.syncImmediate(latestBlockNumber);
1563
1533
  const merkleTreeFork = await this.worldStateSynchronizer.fork();
1564
1534
  try {
1535
+ await applyPublicDataOverrides(merkleTreeFork, overrides?.publicStorage);
1565
1536
  const config = PublicSimulatorConfig.from({
1566
1537
  skipFeeEnforcement,
1567
1538
  collectDebugLogs: true,
@@ -1572,7 +1543,11 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
1572
1543
  maxDebugLogMemoryReads: this.config.rpcSimulatePublicMaxDebugLogMemoryReads
1573
1544
  })
1574
1545
  });
1575
- const processor = publicProcessorFactory.create(merkleTreeFork, newGlobalVariables, config);
1546
+ const contractsDB = new PublicContractsDB(this.contractDataSource, this.log.getBindings());
1547
+ if (overrides?.contracts) {
1548
+ contractsDB.addContracts(Object.values(overrides.contracts).map(({ instance })=>instance));
1549
+ }
1550
+ const processor = publicProcessorFactory.create(merkleTreeFork, newGlobalVariables, config, contractsDB);
1576
1551
  // REFACTOR: Consider merging ProcessReturnValues into ProcessedTx
1577
1552
  const [processedTxs, failedTxs, _usedTxs, returns, debugLogs] = await processor.process([
1578
1553
  tx
@@ -1857,12 +1832,6 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
1857
1832
  });
1858
1833
  }
1859
1834
  }
1860
- #getInitialHeaderHash() {
1861
- if (!this.initialHeaderHashPromise) {
1862
- this.initialHeaderHashPromise = this.worldStateSynchronizer.getCommitted().getInitialHeader().hash();
1863
- }
1864
- return this.initialHeaderHashPromise;
1865
- }
1866
1835
  /**
1867
1836
  * Returns an instance of MerkleTreeOperations having first ensured the world state is fully synched
1868
1837
  * @param block - The block parameter (block number, block hash, or 'latest') at which to get the data.
@@ -1875,69 +1844,45 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
1875
1844
  } catch (err) {
1876
1845
  this.log.error(`Error getting world state: ${err}`);
1877
1846
  }
1878
- if (block === 'latest') {
1879
- this.log.debug(`Using committed db for block 'latest', world state synced upto ${blockSyncedTo}`);
1847
+ const query = this.normalizeBlockParameter(block);
1848
+ if ('tag' in query && query.tag === 'proposed') {
1849
+ this.log.debug(`Using committed db for latest block, world state synced upto ${blockSyncedTo}`);
1880
1850
  return this.worldStateSynchronizer.getCommitted();
1881
1851
  }
1882
- // Get the block number, either directly from the parameter or by quering the archiver with the block hash
1883
- let blockNumber;
1884
- if (BlockHash.isBlockHash(block)) {
1885
- const initialBlockHash = await this.#getInitialHeaderHash();
1886
- if (block.equals(initialBlockHash)) {
1887
- // Block 0 is a first-class historical block: its state lives in the trees' persisted
1888
- // block-0 payload. Resolving the genesis hash to block number 0 lets the snapshot path
1889
- // pin reads to genesis state even after the node has advanced past it.
1890
- blockNumber = BlockNumber.ZERO;
1891
- } else {
1892
- const header = await this.blockSource.getBlockHeaderByHash(block);
1893
- if (!header) {
1894
- throw new Error(`Block hash ${block.toString()} not found when querying world state. If the node API has been queried with anchor block hash possibly a reorg has occurred.`);
1895
- }
1896
- blockNumber = header.getBlockNumber();
1897
- }
1898
- } else {
1899
- blockNumber = block;
1900
- }
1852
+ const blockNumber = await this.resolveBlockNumber(block);
1901
1853
  // Check it's within world state sync range
1902
1854
  if (blockNumber > blockSyncedTo) {
1903
1855
  throw new Error(`Queried block ${inspectBlockParameter(block)} not yet synced by the node (node is synced upto ${blockSyncedTo}).`);
1904
1856
  }
1905
1857
  this.log.debug(`Using snapshot for block ${blockNumber}, world state synced upto ${blockSyncedTo}`);
1906
1858
  const snapshot = this.worldStateSynchronizer.getSnapshot(blockNumber);
1907
- // Double-check world-state synced to the same block hash as was requested
1908
- if (BlockHash.isBlockHash(block)) {
1859
+ // Double-check world-state synced to the same block hash as was requested.
1860
+ // Block 0 is skipped: the snapshot returned by `getSnapshot(0)` is the *pre*-genesis archive
1861
+ // (size 0), so leaf 0 is not yet inserted from that snapshot's view even though block 0's hash
1862
+ // does live at archive index 0 in the committed tree. The genesis hash is already validated by
1863
+ // the archiver when it resolves the hash query to block number 0.
1864
+ const requestedHash = 'hash' in query ? query.hash : undefined;
1865
+ if (requestedHash !== undefined && blockNumber !== BlockNumber.ZERO) {
1909
1866
  const blockHash = await snapshot.getLeafValue(MerkleTreeId.ARCHIVE, BigInt(blockNumber));
1910
- if (!blockHash || !block.equals(blockHash)) {
1911
- const initialBlockHash = await this.#getInitialHeaderHash();
1912
- throw new Error(`Block hash ${block.toString()} not found in world state at block number ${blockNumber} (world state has ${blockHash?.toString() ?? 'no hash'} at that index, genesis header hash is ${initialBlockHash.toString()}). If the node API has been queried with anchor block hash possibly a reorg has occurred.`);
1867
+ if (!blockHash || !requestedHash.equals(blockHash)) {
1868
+ throw new Error(`Block hash ${requestedHash.toString()} not found in world state at block number ${blockNumber} (world state has ${blockHash?.toString() ?? 'no hash'} at that index, genesis header hash is ${this.blockSource.getGenesisBlockHash().toString()}). If the node API has been queried with anchor block hash possibly a reorg has occurred.`);
1913
1869
  }
1914
1870
  }
1915
1871
  return snapshot;
1916
1872
  }
1917
1873
  /** Resolves any {@link BlockParameter} variant to a concrete block number. */ async resolveBlockNumber(block) {
1918
- const resolved = await this.resolveBlockParameter(block);
1919
- if (resolved.number !== undefined) {
1920
- return resolved.number;
1921
- }
1922
- if (resolved.hash !== undefined) {
1923
- const initialBlockHash = await this.#getInitialHeaderHash();
1924
- if (resolved.hash.equals(initialBlockHash)) {
1925
- return BlockNumber.ZERO;
1874
+ const query = this.normalizeBlockParameter(block);
1875
+ const blockNumber = await this.blockSource.getBlockNumber(query);
1876
+ if (blockNumber === undefined) {
1877
+ if ('hash' in query) {
1878
+ throw new Error(`Block hash ${query.hash.toString()} not found when querying world state. If the node API has been queried with anchor block hash possibly a reorg has occurred.`);
1926
1879
  }
1927
- const header = await this.blockSource.getBlockHeaderByHash(resolved.hash);
1928
- if (!header) {
1929
- throw new Error(`Block hash ${resolved.hash.toString()} not found.`);
1930
- }
1931
- return header.getBlockNumber();
1932
- }
1933
- if (resolved.archive !== undefined) {
1934
- const header = await this.blockSource.getBlockHeaderByArchive(resolved.archive);
1935
- if (!header) {
1936
- throw new Error(`Block with archive ${resolved.archive.toString()} not found.`);
1880
+ if ('archive' in query) {
1881
+ throw new Error(`Block with archive ${query.archive.toString()} not found.`);
1937
1882
  }
1938
- return header.getBlockNumber();
1883
+ throw new Error(`Block not found for ${inspectBlockParameter(block)}.`);
1939
1884
  }
1940
- throw new BadRequestError(`Invalid BlockParameter: ${JSON.stringify(block)}`);
1885
+ return blockNumber;
1941
1886
  }
1942
1887
  /**
1943
1888
  * Ensure we fully sync the world state
@@ -1,5 +1,5 @@
1
1
  import type { EpochCache } from '@aztec/epoch-cache';
2
- import { CheckpointNumber, EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
2
+ import { CheckpointNumber, CheckpointProposalHash, EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
3
3
  import { EthAddress } from '@aztec/foundation/eth-address';
4
4
  import { RunningPromise } from '@aztec/foundation/running-promise';
5
5
  import { type L2TipsStore } from '@aztec/kv-store/stores';
@@ -27,6 +27,8 @@ export declare class Sentinel extends Sentinel_base implements L2BlockStreamEven
27
27
  protected slotNumberToCheckpoint: Map<SlotNumber, {
28
28
  checkpointNumber: CheckpointNumber;
29
29
  archive: string;
30
+ /** Hex keccak256 of the consensus payload bytes; used to fetch matching p2p attestations. */
31
+ proposalPayloadHash: CheckpointProposalHash;
30
32
  attestors: EthAddress[];
31
33
  }>;
32
34
  constructor(epochCache: EpochCache, archiver: L2BlockSource, p2p: P2PClient, store: SentinelStore, config: SentinelRuntimeConfig, logger?: import("@aztec/foundation/log").Logger);
@@ -93,4 +95,4 @@ export declare class Sentinel extends Sentinel_base implements L2BlockStreamEven
93
95
  } | undefined;
94
96
  }
95
97
  export {};
96
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VudGluZWwuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZW50aW5lbC9zZW50aW5lbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBQWUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRXpHLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUUzRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkUsT0FBTyxFQUFxQixLQUFLLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdFLE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM1QyxPQUFPLEVBSUwsS0FBSyxPQUFPLEVBQ1osS0FBSyxjQUFjLEVBQ3BCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDM0QsT0FBTyxFQUNMLEtBQUssYUFBYSxFQUNsQixhQUFhLEVBQ2IsS0FBSyxrQkFBa0IsRUFDdkIsS0FBSyx5QkFBeUIsRUFFL0IsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUd4RCxPQUFPLEtBQUssRUFDVixvQkFBb0IsRUFDcEIsY0FBYyxFQUNkLHNCQUFzQixFQUN0QixxQkFBcUIsRUFDckIsbUJBQW1CLEVBQ25CLDBCQUEwQixFQUMxQixlQUFlLEVBQ2hCLE1BQU0sMEJBQTBCLENBQUM7QUFJbEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUUzQyxNQUFNLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUN0QyxhQUFhLEVBQ2IsaUNBQWlDLEdBQUcsd0JBQXdC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
98
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VudGluZWwuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZW50aW5lbC9zZW50aW5lbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBRUwsZ0JBQWdCLEVBQ2hCLHNCQUFzQixFQUN0QixXQUFXLEVBQ1gsVUFBVSxFQUNYLE1BQU0saUNBQWlDLENBQUM7QUFFekMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRSxPQUFPLEVBQXFCLEtBQUssV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0UsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzVDLE9BQU8sRUFJTCxLQUFLLE9BQU8sRUFDWixLQUFLLGNBQWMsRUFDcEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMzRCxPQUFPLEVBQ0wsS0FBSyxhQUFhLEVBQ2xCLGFBQWEsRUFDYixLQUFLLGtCQUFrQixFQUN2QixLQUFLLHlCQUF5QixFQUUvQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBR3hELE9BQU8sS0FBSyxFQUNWLG9CQUFvQixFQUNwQixjQUFjLEVBQ2Qsc0JBQXNCLEVBQ3RCLHFCQUFxQixFQUNyQixtQkFBbUIsRUFDbkIsMEJBQTBCLEVBQzFCLGVBQWUsRUFDaEIsTUFBTSwwQkFBMEIsQ0FBQztBQUlsQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRTNDLE1BQU0sTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQ3RDLGFBQWEsRUFDYixpQ0FB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
@@ -1 +1 @@
1
- {"version":3,"file":"sentinel.d.ts","sourceRoot":"","sources":["../../src/sentinel/sentinel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sentinel.d.ts","sourceRoot":"","sources":["../../src/sentinel/sentinel.ts"],"names":[],"mappings":"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"}