@aztec/prover-client 3.0.0-nightly.20250917 → 3.0.0-nightly.20250919

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 (65) hide show
  1. package/dest/block-factory/light.d.ts +5 -3
  2. package/dest/block-factory/light.d.ts.map +1 -1
  3. package/dest/block-factory/light.js +16 -9
  4. package/dest/mocks/fixtures.d.ts +3 -1
  5. package/dest/mocks/fixtures.d.ts.map +1 -1
  6. package/dest/mocks/fixtures.js +19 -2
  7. package/dest/mocks/test_context.d.ts +30 -9
  8. package/dest/mocks/test_context.d.ts.map +1 -1
  9. package/dest/mocks/test_context.js +68 -15
  10. package/dest/orchestrator/block-building-helpers.d.ts +16 -14
  11. package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
  12. package/dest/orchestrator/block-building-helpers.js +69 -66
  13. package/dest/orchestrator/block-proving-state.d.ts +59 -52
  14. package/dest/orchestrator/block-proving-state.d.ts.map +1 -1
  15. package/dest/orchestrator/block-proving-state.js +215 -187
  16. package/dest/orchestrator/checkpoint-proving-state.d.ts +62 -0
  17. package/dest/orchestrator/checkpoint-proving-state.d.ts.map +1 -0
  18. package/dest/orchestrator/checkpoint-proving-state.js +208 -0
  19. package/dest/orchestrator/epoch-proving-state.d.ts +32 -25
  20. package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -1
  21. package/dest/orchestrator/epoch-proving-state.js +132 -81
  22. package/dest/orchestrator/orchestrator.d.ts +25 -24
  23. package/dest/orchestrator/orchestrator.d.ts.map +1 -1
  24. package/dest/orchestrator/orchestrator.js +331 -203
  25. package/dest/orchestrator/tx-proving-state.d.ts +3 -3
  26. package/dest/orchestrator/tx-proving-state.d.ts.map +1 -1
  27. package/dest/orchestrator/tx-proving-state.js +5 -5
  28. package/dest/prover-client/server-epoch-prover.d.ts +8 -7
  29. package/dest/prover-client/server-epoch-prover.d.ts.map +1 -1
  30. package/dest/prover-client/server-epoch-prover.js +7 -7
  31. package/dest/proving_broker/broker_prover_facade.d.ts +18 -13
  32. package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -1
  33. package/dest/proving_broker/broker_prover_facade.js +36 -21
  34. package/dest/proving_broker/fixtures.js +1 -1
  35. package/dest/proving_broker/proof_store/index.d.ts +1 -0
  36. package/dest/proving_broker/proof_store/index.d.ts.map +1 -1
  37. package/dest/proving_broker/proof_store/index.js +1 -0
  38. package/dest/proving_broker/proving_broker.d.ts.map +1 -1
  39. package/dest/proving_broker/proving_broker.js +27 -16
  40. package/dest/proving_broker/proving_job_controller.d.ts.map +1 -1
  41. package/dest/proving_broker/proving_job_controller.js +34 -14
  42. package/dest/test/mock_prover.d.ts +18 -13
  43. package/dest/test/mock_prover.d.ts.map +1 -1
  44. package/dest/test/mock_prover.js +31 -16
  45. package/package.json +16 -17
  46. package/src/block-factory/light.ts +33 -9
  47. package/src/mocks/fixtures.ts +25 -7
  48. package/src/mocks/test_context.ts +113 -21
  49. package/src/orchestrator/block-building-helpers.ts +107 -93
  50. package/src/orchestrator/block-proving-state.ts +232 -244
  51. package/src/orchestrator/checkpoint-proving-state.ts +294 -0
  52. package/src/orchestrator/epoch-proving-state.ts +169 -121
  53. package/src/orchestrator/orchestrator.ts +483 -262
  54. package/src/orchestrator/tx-proving-state.ts +6 -6
  55. package/src/prover-client/server-epoch-prover.ts +30 -16
  56. package/src/proving_broker/broker_prover_facade.ts +151 -83
  57. package/src/proving_broker/fixtures.ts +1 -1
  58. package/src/proving_broker/proof_store/index.ts +1 -0
  59. package/src/proving_broker/proving_broker.ts +34 -16
  60. package/src/proving_broker/proving_job_controller.ts +34 -14
  61. package/src/test/mock_prover.ts +125 -54
  62. package/dest/bin/get-proof-inputs.d.ts +0 -2
  63. package/dest/bin/get-proof-inputs.d.ts.map +0 -1
  64. package/dest/bin/get-proof-inputs.js +0 -51
  65. package/src/bin/get-proof-inputs.ts +0 -59
@@ -1,7 +1,8 @@
1
+ import { SpongeBlob } from '@aztec/blob-lib';
1
2
  import { Fr } from '@aztec/foundation/fields';
2
3
  import { L2Block } from '@aztec/stdlib/block';
3
4
  import type { IBlockFactory, MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
4
- import { type GlobalVariables, type ProcessedTx } from '@aztec/stdlib/tx';
5
+ import type { GlobalVariables, ProcessedTx } from '@aztec/stdlib/tx';
5
6
  import { type TelemetryClient } from '@aztec/telemetry-client';
6
7
  /**
7
8
  * Builds a block and its header from a set of processed tx without running any circuits.
@@ -20,10 +21,11 @@ export declare class LightweightBlockFactory implements IBlockFactory {
20
21
  private telemetry;
21
22
  private globalVariables?;
22
23
  private l1ToL2Messages?;
24
+ private startSpongeBlob?;
23
25
  private txs;
24
26
  private readonly logger;
25
27
  constructor(db: MerkleTreeWriteOperations, telemetry?: TelemetryClient);
26
- startNewBlock(globalVariables: GlobalVariables, l1ToL2Messages: Fr[]): Promise<void>;
28
+ startNewBlock(globalVariables: GlobalVariables, l1ToL2Messages: Fr[], startSpongeBlob?: SpongeBlob, isFirstBlock?: boolean): Promise<void>;
27
29
  addTxs(txs: ProcessedTx[]): Promise<void>;
28
30
  setBlockCompleted(): Promise<L2Block>;
29
31
  private buildBlock;
@@ -32,5 +34,5 @@ export declare class LightweightBlockFactory implements IBlockFactory {
32
34
  * Inserts the processed transactions into the DB, then creates a block.
33
35
  * @param db - A db fork to use for block building which WILL BE MODIFIED.
34
36
  */
35
- export declare function buildBlockWithCleanDB(txs: ProcessedTx[], globalVariables: GlobalVariables, l1ToL2Messages: Fr[], db: MerkleTreeWriteOperations, telemetry?: TelemetryClient): Promise<L2Block>;
37
+ export declare function buildBlockWithCleanDB(txs: ProcessedTx[], globalVariables: GlobalVariables, l1ToL2Messages: Fr[], db: MerkleTreeWriteOperations, startSpongeBlob?: SpongeBlob, isFirstBlock?: boolean, telemetry?: TelemetryClient): Promise<L2Block>;
36
38
  //# sourceMappingURL=light.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"light.d.ts","sourceRoot":"","sources":["../../src/block-factory/light.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAE9C,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAEhG,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,WAAW,EAAmB,MAAM,kBAAkB,CAAC;AAC3F,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAQnF;;;;;;;;;;;GAWG;AACH,qBAAa,uBAAwB,YAAW,aAAa;IASzD,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,SAAS;IATnB,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C,OAAO,CAAC,cAAc,CAAC,CAAO;IAE9B,OAAO,CAAC,GAAG,CAA4B;IAEvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6C;gBAG1D,EAAE,EAAE,yBAAyB,EAC7B,SAAS,GAAE,eAAsC;IAGrD,aAAa,CAAC,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAU1F,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAWzC,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC;YAIvB,UAAU;CAwBzB;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,WAAW,EAAE,EAClB,eAAe,EAAE,eAAe,EAChC,cAAc,EAAE,EAAE,EAAE,EACpB,EAAE,EAAE,yBAAyB,EAC7B,SAAS,GAAE,eAAsC,oBAWlD"}
1
+ {"version":3,"file":"light.d.ts","sourceRoot":"","sources":["../../src/block-factory/light.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAE9C,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAEhG,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAQnF;;;;;;;;;;;GAWG;AACH,qBAAa,uBAAwB,YAAW,aAAa;IASzD,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,SAAS;IATnB,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C,OAAO,CAAC,cAAc,CAAC,CAAO;IAC9B,OAAO,CAAC,eAAe,CAAC,CAAa;IACrC,OAAO,CAAC,GAAG,CAA4B;IAEvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6C;gBAG1D,EAAE,EAAE,yBAAyB,EAC7B,SAAS,GAAE,eAAsC;IAGrD,aAAa,CACjB,eAAe,EAAE,eAAe,EAChC,cAAc,EAAE,EAAE,EAAE,EAEpB,eAAe,CAAC,EAAE,UAAU,EAE5B,YAAY,UAAO,GAClB,OAAO,CAAC,IAAI,CAAC;IAUhB,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAWzC,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC;YAIvB,UAAU;CA2BzB;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,WAAW,EAAE,EAClB,eAAe,EAAE,eAAe,EAChC,cAAc,EAAE,EAAE,EAAE,EACpB,EAAE,EAAE,yBAAyB,EAC7B,eAAe,CAAC,EAAE,UAAU,EAC5B,YAAY,UAAO,EACnB,SAAS,GAAE,eAAsC,oBAuBlD"}
@@ -5,7 +5,6 @@ import { Fr } from '@aztec/foundation/fields';
5
5
  import { createLogger } from '@aztec/foundation/log';
6
6
  import { L2Block } from '@aztec/stdlib/block';
7
7
  import { MerkleTreeId } from '@aztec/stdlib/trees';
8
- import { toNumBlobFields } from '@aztec/stdlib/tx';
9
8
  import { getTelemetryClient } from '@aztec/telemetry-client';
10
9
  import { buildHeaderAndBodyFromTxs, getTreeSnapshot, insertSideEffectsAndBuildBaseRollupHints } from '../orchestrator/block-building-helpers.js';
11
10
  /**
@@ -24,6 +23,7 @@ import { buildHeaderAndBodyFromTxs, getTreeSnapshot, insertSideEffectsAndBuildBa
24
23
  telemetry;
25
24
  globalVariables;
26
25
  l1ToL2Messages;
26
+ startSpongeBlob;
27
27
  txs;
28
28
  logger;
29
29
  constructor(db, telemetry = getTelemetryClient()){
@@ -31,13 +31,16 @@ import { buildHeaderAndBodyFromTxs, getTreeSnapshot, insertSideEffectsAndBuildBa
31
31
  this.telemetry = telemetry;
32
32
  this.logger = createLogger('lightweight-block-factory');
33
33
  }
34
- async startNewBlock(globalVariables, l1ToL2Messages) {
34
+ async startNewBlock(globalVariables, l1ToL2Messages, // Must be provided to generate the correct spongeBlobHash for the block header if there's more than one block in the checkpoint.
35
+ startSpongeBlob, // Only insert l1 to l2 messages for the first block in a checkpoint.
36
+ isFirstBlock = true) {
35
37
  this.logger.debug('Starting new block', {
36
38
  globalVariables: globalVariables.toInspect(),
37
39
  l1ToL2Messages
38
40
  });
39
41
  this.globalVariables = globalVariables;
40
- this.l1ToL2Messages = padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP);
42
+ this.l1ToL2Messages = isFirstBlock ? padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP) : [];
43
+ this.startSpongeBlob = startSpongeBlob;
41
44
  this.txs = undefined;
42
45
  // Update L1 to L2 tree
43
46
  await this.db.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, this.l1ToL2Messages);
@@ -56,9 +59,10 @@ import { buildHeaderAndBodyFromTxs, getTreeSnapshot, insertSideEffectsAndBuildBa
56
59
  return this.buildBlock();
57
60
  }
58
61
  async buildBlock() {
59
- const { header, body } = await buildHeaderAndBodyFromTxs(this.txs ?? [], this.globalVariables, this.l1ToL2Messages, this.db);
62
+ const { header, body } = await buildHeaderAndBodyFromTxs(this.txs ?? [], this.globalVariables, this.l1ToL2Messages, this.db, this.startSpongeBlob);
60
63
  header.state.validate();
61
- await this.db.updateArchive(header);
64
+ const blockHeader = header.toBlockHeader();
65
+ await this.db.updateArchive(blockHeader);
62
66
  const newArchive = await getTreeSnapshot(MerkleTreeId.ARCHIVE, this.db);
63
67
  const block = new L2Block(newArchive, header, body);
64
68
  this.logger.debug(`Built block ${block.number}`, {
@@ -74,13 +78,16 @@ import { buildHeaderAndBodyFromTxs, getTreeSnapshot, insertSideEffectsAndBuildBa
74
78
  /**
75
79
  * Inserts the processed transactions into the DB, then creates a block.
76
80
  * @param db - A db fork to use for block building which WILL BE MODIFIED.
77
- */ export async function buildBlockWithCleanDB(txs, globalVariables, l1ToL2Messages, db, telemetry = getTelemetryClient()) {
78
- const spongeBlobState = SpongeBlob.init(toNumBlobFields(txs));
81
+ */ export async function buildBlockWithCleanDB(txs, globalVariables, l1ToL2Messages, db, startSpongeBlob, isFirstBlock = true, telemetry = getTelemetryClient()) {
82
+ const lastArchive = await getTreeSnapshot(MerkleTreeId.ARCHIVE, db);
79
83
  const builder = new LightweightBlockFactory(db, telemetry);
80
- await builder.startNewBlock(globalVariables, l1ToL2Messages);
84
+ await builder.startNewBlock(globalVariables, l1ToL2Messages, startSpongeBlob, isFirstBlock);
81
85
  const l1ToL2MessageTree = await getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, db);
82
86
  for (const tx of txs){
83
- await insertSideEffectsAndBuildBaseRollupHints(tx, globalVariables, l1ToL2MessageTree, db, spongeBlobState);
87
+ // startSpongeBlob and proverId are only used for constructing private inputs of the base rollup.
88
+ // Their values don't matter here because we are not using the return private inputs to build the block.
89
+ const proverId = Fr.ZERO;
90
+ await insertSideEffectsAndBuildBaseRollupHints(tx, lastArchive, l1ToL2MessageTree, startSpongeBlob?.clone() ?? SpongeBlob.init(0), proverId, db);
84
91
  }
85
92
  await builder.addTxs(txs);
86
93
  return await builder.setBlockCompleted();
@@ -1,6 +1,7 @@
1
1
  import type { Logger } from '@aztec/foundation/log';
2
2
  import { type CircuitSimulator } from '@aztec/simulator/server';
3
3
  import type { MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
4
+ import { CheckpointConstantData } from '@aztec/stdlib/rollup';
4
5
  import type { ProcessedTx } from '@aztec/stdlib/tx';
5
6
  import { GlobalVariables } from '@aztec/stdlib/tx';
6
7
  export declare const getEnvironmentConfig: (logger: Logger) => Promise<{
@@ -16,5 +17,6 @@ export declare function getSimulator(config: {
16
17
  acvmBinaryPath: string | undefined;
17
18
  }, logger?: Logger): Promise<CircuitSimulator>;
18
19
  export declare const updateExpectedTreesFromTxs: (db: MerkleTreeWriteOperations, txs: ProcessedTx[]) => Promise<void>;
19
- export declare const makeGlobals: (blockNumber: number) => GlobalVariables;
20
+ export declare const makeGlobals: (blockNumber: number, slotNumber?: number) => GlobalVariables;
21
+ export declare const makeCheckpointConstants: (slotNumber: number) => CheckpointConstantData;
20
22
  //# sourceMappingURL=fixtures.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../src/mocks/fixtures.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAE,KAAK,gBAAgB,EAA+C,MAAM,yBAAyB,CAAC;AAG7G,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAEjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAiBnD,eAAO,MAAM,oBAAoB,GAAU,QAAQ,MAAM;;;;;;;cAkCxD,CAAC;AAEF,wBAAsB,YAAY,CAChC,MAAM,EAAE;IAAE,oBAAoB,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,EACxF,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,gBAAgB,CAAC,CAe3B;AAGD,eAAO,MAAM,0BAA0B,GAAU,IAAI,yBAAyB,EAAE,KAAK,WAAW,EAAE,kBAgBjG,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,aAAa,MAAM,oBAW9C,CAAC"}
1
+ {"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../src/mocks/fixtures.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAIpD,OAAO,EAAE,KAAK,gBAAgB,EAA+C,MAAM,yBAAyB,CAAC;AAG7G,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAiBnD,eAAO,MAAM,oBAAoB,GAAU,QAAQ,MAAM;;;;;;;cAkCxD,CAAC;AAEF,wBAAsB,YAAY,CAChC,MAAM,EAAE;IAAE,oBAAoB,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,EACxF,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,gBAAgB,CAAC,CAe3B;AAGD,eAAO,MAAM,0BAA0B,GAAU,IAAI,yBAAyB,EAAE,KAAK,WAAW,EAAE,kBAgBjG,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,aAAa,MAAM,EAAE,mBAAwB,oBAYxE,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,YAAY,MAAM,2BAYzD,CAAC"}
@@ -4,9 +4,12 @@ import { randomBytes } from '@aztec/foundation/crypto';
4
4
  import { EthAddress } from '@aztec/foundation/eth-address';
5
5
  import { Fr } from '@aztec/foundation/fields';
6
6
  import { fileURLToPath } from '@aztec/foundation/url';
7
+ import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
8
+ import { protocolContractTreeRoot } from '@aztec/protocol-contracts';
7
9
  import { NativeACVMSimulator, WASMSimulatorWithBlobs } from '@aztec/simulator/server';
8
10
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
9
11
  import { GasFees } from '@aztec/stdlib/gas';
12
+ import { CheckpointConstantData } from '@aztec/stdlib/rollup';
10
13
  import { MerkleTreeId } from '@aztec/stdlib/trees';
11
14
  import { GlobalVariables } from '@aztec/stdlib/tx';
12
15
  import { promises as fs } from 'fs';
@@ -72,6 +75,20 @@ export const updateExpectedTreesFromTxs = async (db, txs)=>{
72
75
  await db.sequentialInsert(MerkleTreeId.PUBLIC_DATA_TREE, tx.txEffect.publicDataWrites.map((write)=>write.toBuffer()));
73
76
  }
74
77
  };
75
- export const makeGlobals = (blockNumber)=>{
76
- return new GlobalVariables(Fr.ZERO, Fr.ZERO, blockNumber /** block number */ , new Fr(blockNumber), BigInt(blockNumber), EthAddress.ZERO, AztecAddress.ZERO, GasFees.empty());
78
+ export const makeGlobals = (blockNumber, slotNumber = blockNumber)=>{
79
+ const checkpointConstants = makeCheckpointConstants(slotNumber);
80
+ return new GlobalVariables(checkpointConstants.chainId, checkpointConstants.version, blockNumber /** block number */ , new Fr(slotNumber), BigInt(blockNumber), checkpointConstants.coinbase, checkpointConstants.feeRecipient, checkpointConstants.gasFees);
81
+ };
82
+ export const makeCheckpointConstants = (slotNumber)=>{
83
+ return CheckpointConstantData.from({
84
+ chainId: Fr.ZERO,
85
+ version: Fr.ZERO,
86
+ vkTreeRoot: getVKTreeRoot(),
87
+ protocolContractTreeRoot,
88
+ proverId: Fr.ZERO,
89
+ slotNumber: new Fr(slotNumber),
90
+ coinbase: EthAddress.ZERO,
91
+ feeRecipient: AztecAddress.ZERO,
92
+ gasFees: GasFees.empty()
93
+ });
77
94
  };
@@ -3,17 +3,18 @@ import { Fr } from '@aztec/foundation/fields';
3
3
  import type { Logger } from '@aztec/foundation/log';
4
4
  import { SimpleContractDataSource } from '@aztec/simulator/public/fixtures';
5
5
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
6
- import { type L2Block } from '@aztec/stdlib/block';
7
6
  import type { ServerCircuitProver } from '@aztec/stdlib/interfaces/server';
7
+ import type { CheckpointConstantData } from '@aztec/stdlib/rollup';
8
8
  import { makeBloatedProcessedTx } from '@aztec/stdlib/testing';
9
- import { type AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
10
9
  import { type BlockHeader, type GlobalVariables, type ProcessedTx, type Tx } from '@aztec/stdlib/tx';
11
10
  import type { MerkleTreeAdminDatabase } from '@aztec/world-state';
11
+ import type { BlockProvingState } from '../orchestrator/block-proving-state.js';
12
12
  import { ProvingOrchestrator } from '../orchestrator/index.js';
13
13
  import { BrokerCircuitProverFacade } from '../proving_broker/broker_prover_facade.js';
14
14
  import { TestBroker } from '../test/mock_prover.js';
15
15
  export declare class TestContext {
16
16
  worldState: MerkleTreeAdminDatabase;
17
+ firstCheckpointNumber: Fr;
17
18
  globalVariables: GlobalVariables;
18
19
  prover: ServerCircuitProver;
19
20
  broker: TestBroker;
@@ -25,26 +26,46 @@ export declare class TestContext {
25
26
  logger: Logger;
26
27
  private headers;
27
28
  private feePayerBalance;
28
- constructor(worldState: MerkleTreeAdminDatabase, globalVariables: GlobalVariables, prover: ServerCircuitProver, broker: TestBroker, brokerProverFacade: BrokerCircuitProverFacade, orchestrator: TestProvingOrchestrator, blockNumber: number, feePayer: AztecAddress, initialFeePayerBalance: Fr, directoriesToCleanup: string[], logger: Logger);
29
+ constructor(worldState: MerkleTreeAdminDatabase, firstCheckpointNumber: Fr, globalVariables: GlobalVariables, prover: ServerCircuitProver, broker: TestBroker, brokerProverFacade: BrokerCircuitProverFacade, orchestrator: TestProvingOrchestrator, blockNumber: number, feePayer: AztecAddress, initialFeePayerBalance: Fr, directoriesToCleanup: string[], logger: Logger);
29
30
  get epochProver(): TestProvingOrchestrator;
30
- static new(logger: Logger, { proverCount, createProver, blockNumber, }?: {
31
+ getCheckpointConstants(checkpointIndex?: number): CheckpointConstantData;
32
+ static new(logger: Logger, { proverCount, createProver, slotNumber, blockNumber, }?: {
31
33
  proverCount?: number;
32
34
  createProver?: (bbConfig: BBProverConfig) => Promise<ServerCircuitProver>;
35
+ slotNumber?: number;
33
36
  blockNumber?: number;
34
37
  }): Promise<TestContext>;
35
38
  getFork(): Promise<import("@aztec/stdlib/trees").MerkleTreeWriteOperations>;
36
39
  getBlockHeader(blockNumber: 0): BlockHeader;
37
40
  getBlockHeader(blockNumber: number): BlockHeader | undefined;
38
- setBlockHeader(header: BlockHeader, blockNumber: number): void;
39
41
  getPreviousBlockHeader(currentBlockNumber?: number): BlockHeader;
40
42
  cleanup(): Promise<void>;
41
- private makeProcessedTx;
43
+ makeProcessedTx(opts?: Parameters<typeof makeBloatedProcessedTx>[0]): Promise<ProcessedTx>;
42
44
  /** Creates a block with the given number of txs and adds it to world-state */
43
- makePendingBlock(numTxs: number, numL1ToL2Messages?: number, blockNumOrGlobals?: GlobalVariables | number, makeProcessedTxOpts?: (index: number) => Partial<Parameters<typeof makeBloatedProcessedTx>[0]>): Promise<{
44
- block: L2Block;
45
+ makePendingBlock(numTxs: number, { checkpointIndex, numL1ToL2Messages, blockNumber, makeProcessedTxOpts, }?: {
46
+ checkpointIndex?: number;
47
+ numL1ToL2Messages?: number;
48
+ blockNumber?: number;
49
+ makeProcessedTxOpts?: (index: number) => Partial<Parameters<typeof makeBloatedProcessedTx>[0]>;
50
+ }): Promise<{
51
+ block: import("@aztec/stdlib/block").L2Block;
45
52
  txs: ProcessedTx[];
46
53
  l1ToL2Messages: Fr[];
47
54
  }>;
55
+ makePendingBlocksInCheckpoint(numBlocks: number, { checkpointIndex, numTxsPerBlock, numL1ToL2Messages, firstBlockNumber, makeProcessedTxOpts, }?: {
56
+ checkpointIndex?: number;
57
+ numTxsPerBlock?: number | number[];
58
+ numL1ToL2Messages?: number;
59
+ firstBlockNumber?: number;
60
+ makeProcessedTxOpts?: (index: number) => Partial<Parameters<typeof makeBloatedProcessedTx>[0]>;
61
+ }): Promise<{
62
+ blocks: {
63
+ header: BlockHeader;
64
+ txs: ProcessedTx[];
65
+ }[];
66
+ l1ToL2Messages: Fr[];
67
+ blobFields: Fr[];
68
+ }>;
48
69
  processPublicFunctions(txs: Tx[], { maxTransactions, numL1ToL2Messages, contractDataSource, }?: {
49
70
  maxTransactions?: number;
50
71
  numL1ToL2Messages?: number;
@@ -54,7 +75,7 @@ export declare class TestContext {
54
75
  }
55
76
  declare class TestProvingOrchestrator extends ProvingOrchestrator {
56
77
  isVerifyBuiltBlockAgainstSyncedStateEnabled: boolean;
57
- protected verifyBuiltBlockAgainstSyncedState(l2Block: L2Block, newArchive: AppendOnlyTreeSnapshot): Promise<void>;
78
+ protected verifyBuiltBlockAgainstSyncedState(provingState: BlockProvingState): Promise<void>;
58
79
  }
59
80
  export {};
60
81
  //# sourceMappingURL=test_context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"test_context.d.ts","sourceRoot":"","sources":["../../src/mocks/test_context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"test_context.d.ts","sourceRoot":"","sources":["../../src/mocks/test_context.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { SpongeBlob } from '@aztec/blob-lib';
1
2
  import { NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/constants';
2
3
  import { padArrayEnd, times, timesParallel } from '@aztec/foundation/collection';
3
4
  import { Fr } from '@aztec/foundation/fields';
@@ -9,7 +10,7 @@ import { SimpleContractDataSource } from '@aztec/simulator/public/fixtures';
9
10
  import { PublicProcessorFactory } from '@aztec/simulator/server';
10
11
  import { PublicDataWrite } from '@aztec/stdlib/avm';
11
12
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
12
- import { EthAddress } from '@aztec/stdlib/block';
13
+ import { EthAddress, getBlockBlobFields } from '@aztec/stdlib/block';
13
14
  import { makeBloatedProcessedTx } from '@aztec/stdlib/testing';
14
15
  import { MerkleTreeId, PublicDataTreeLeaf } from '@aztec/stdlib/trees';
15
16
  import { TreeSnapshots } from '@aztec/stdlib/tx';
@@ -23,9 +24,10 @@ import { getTreeSnapshot } from '../orchestrator/block-building-helpers.js';
23
24
  import { ProvingOrchestrator } from '../orchestrator/index.js';
24
25
  import { BrokerCircuitProverFacade } from '../proving_broker/broker_prover_facade.js';
25
26
  import { TestBroker } from '../test/mock_prover.js';
26
- import { getEnvironmentConfig, getSimulator, makeGlobals, updateExpectedTreesFromTxs } from './fixtures.js';
27
+ import { getEnvironmentConfig, getSimulator, makeCheckpointConstants, makeGlobals, updateExpectedTreesFromTxs } from './fixtures.js';
27
28
  export class TestContext {
28
29
  worldState;
30
+ firstCheckpointNumber;
29
31
  globalVariables;
30
32
  prover;
31
33
  broker;
@@ -37,8 +39,9 @@ export class TestContext {
37
39
  logger;
38
40
  headers;
39
41
  feePayerBalance;
40
- constructor(worldState, globalVariables, prover, broker, brokerProverFacade, orchestrator, blockNumber, feePayer, initialFeePayerBalance, directoriesToCleanup, logger){
42
+ constructor(worldState, firstCheckpointNumber, globalVariables, prover, broker, brokerProverFacade, orchestrator, blockNumber, feePayer, initialFeePayerBalance, directoriesToCleanup, logger){
41
43
  this.worldState = worldState;
44
+ this.firstCheckpointNumber = firstCheckpointNumber;
42
45
  this.globalVariables = globalVariables;
43
46
  this.prover = prover;
44
47
  this.broker = broker;
@@ -54,9 +57,13 @@ export class TestContext {
54
57
  get epochProver() {
55
58
  return this.orchestrator;
56
59
  }
57
- static async new(logger, { proverCount = 4, createProver = async (bbConfig)=>new TestCircuitProver(await getSimulator(bbConfig, logger)), blockNumber = 1 } = {}) {
60
+ getCheckpointConstants(checkpointIndex = 0) {
61
+ return makeCheckpointConstants(this.firstCheckpointNumber.toNumber() + checkpointIndex);
62
+ }
63
+ static async new(logger, { proverCount = 4, createProver = async (bbConfig)=>new TestCircuitProver(await getSimulator(bbConfig, logger)), slotNumber = 1, blockNumber = 1 } = {}) {
58
64
  const directoriesToCleanup = [];
59
- const globalVariables = makeGlobals(blockNumber);
65
+ const firstCheckpointNumber = new Fr(slotNumber);
66
+ const globalVariables = makeGlobals(blockNumber, slotNumber);
60
67
  const feePayer = AztecAddress.fromNumber(42222);
61
68
  const initialFeePayerBalance = new Fr(10n ** 20n);
62
69
  const feePayerSlot = await computeFeePayerBalanceLeafSlot(feePayer);
@@ -89,7 +96,7 @@ export class TestContext {
89
96
  const orchestrator = new TestProvingOrchestrator(ws, facade, EthAddress.ZERO);
90
97
  await broker.start();
91
98
  facade.start();
92
- return new this(ws, globalVariables, localProver, broker, facade, orchestrator, blockNumber, feePayer, initialFeePayerBalance, directoriesToCleanup, logger);
99
+ return new this(ws, firstCheckpointNumber, globalVariables, localProver, broker, facade, orchestrator, blockNumber, feePayer, initialFeePayerBalance, directoriesToCleanup, logger);
93
100
  }
94
101
  getFork() {
95
102
  return this.worldState.fork();
@@ -97,9 +104,6 @@ export class TestContext {
97
104
  getBlockHeader(blockNumber = 0) {
98
105
  return blockNumber === 0 ? this.worldState.getCommitted().getInitialHeader() : this.headers.get(blockNumber);
99
106
  }
100
- setBlockHeader(header, blockNumber) {
101
- this.headers.set(blockNumber, header);
102
- }
103
107
  getPreviousBlockHeader(currentBlockNumber = this.blockNumber) {
104
108
  return this.getBlockHeader(currentBlockNumber - 1);
105
109
  }
@@ -120,7 +124,7 @@ export class TestContext {
120
124
  }
121
125
  async makeProcessedTx(opts) {
122
126
  const blockNum = (opts?.globalVariables ?? this.globalVariables).blockNumber;
123
- const header = this.getBlockHeader(blockNum - 1);
127
+ const header = opts?.header ?? this.getBlockHeader(blockNum - 1);
124
128
  const tx = await makeBloatedProcessedTx({
125
129
  header,
126
130
  vkTreeRoot: getVKTreeRoot(),
@@ -136,8 +140,9 @@ export class TestContext {
136
140
  }
137
141
  return tx;
138
142
  }
139
- /** Creates a block with the given number of txs and adds it to world-state */ async makePendingBlock(numTxs, numL1ToL2Messages = 0, blockNumOrGlobals = this.globalVariables, makeProcessedTxOpts = ()=>({})) {
140
- const globalVariables = typeof blockNumOrGlobals === 'number' ? makeGlobals(blockNumOrGlobals) : blockNumOrGlobals;
143
+ /** Creates a block with the given number of txs and adds it to world-state */ async makePendingBlock(numTxs, { checkpointIndex = 0, numL1ToL2Messages = 0, blockNumber = this.blockNumber, makeProcessedTxOpts = ()=>({}) } = {}) {
144
+ const slotNumber = this.firstCheckpointNumber.toNumber() + checkpointIndex;
145
+ const globalVariables = makeGlobals(blockNumber, slotNumber);
141
146
  const blockNum = globalVariables.blockNumber;
142
147
  const db = await this.worldState.fork();
143
148
  const l1ToL2Messages = times(numL1ToL2Messages, (i)=>new Fr(blockNum * 100 + i));
@@ -152,7 +157,7 @@ export class TestContext {
152
157
  }));
153
158
  await this.setTreeRoots(txs);
154
159
  const block = await buildBlockWithCleanDB(txs, globalVariables, l1ToL2Messages, db);
155
- this.headers.set(blockNum, block.header);
160
+ this.headers.set(blockNum, block.getBlockHeader());
156
161
  await this.worldState.handleL2BlockAndMessages(block, l1ToL2Messages);
157
162
  return {
158
163
  block,
@@ -160,6 +165,54 @@ export class TestContext {
160
165
  l1ToL2Messages
161
166
  };
162
167
  }
168
+ async makePendingBlocksInCheckpoint(numBlocks, { checkpointIndex = 0, numTxsPerBlock = 1, numL1ToL2Messages = 0, firstBlockNumber = this.blockNumber + checkpointIndex * numBlocks, makeProcessedTxOpts = ()=>({}) } = {}) {
169
+ const slotNumber = this.firstCheckpointNumber.toNumber() + checkpointIndex;
170
+ const l1ToL2Messages = times(numL1ToL2Messages, (i)=>new Fr(slotNumber * 100 + i));
171
+ const merkleTrees = await this.worldState.fork();
172
+ await merkleTrees.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP));
173
+ const newL1ToL2Snapshot = await getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, merkleTrees);
174
+ const blockGlobalVariables = times(numBlocks, (i)=>makeGlobals(firstBlockNumber + i, slotNumber));
175
+ let totalTxs = 0;
176
+ const blockTxs = await timesParallel(numBlocks, (blockIndex)=>{
177
+ const txIndexOffset = totalTxs;
178
+ const numTxs = typeof numTxsPerBlock === 'number' ? numTxsPerBlock : numTxsPerBlock[blockIndex];
179
+ totalTxs += numTxs;
180
+ return timesParallel(numTxs, (txIndex)=>this.makeProcessedTx({
181
+ seed: (txIndexOffset + txIndex + 1) * 321 + (checkpointIndex + 1) * 123456,
182
+ globalVariables: blockGlobalVariables[blockIndex],
183
+ header: this.getBlockHeader(firstBlockNumber - 1),
184
+ newL1ToL2Snapshot,
185
+ ...makeProcessedTxOpts(txIndexOffset + txIndex)
186
+ }));
187
+ });
188
+ const blockBlobFields = blockTxs.map((txs)=>getBlockBlobFields(txs.map((tx)=>tx.txEffect)));
189
+ const totalNumBlobFields = blockBlobFields.reduce((acc, curr)=>acc + curr.length, 0);
190
+ const spongeBlobState = SpongeBlob.init(totalNumBlobFields);
191
+ const blocks = [];
192
+ for(let i = 0; i < numBlocks; i++){
193
+ const isFirstBlock = i === 0;
194
+ const blockNumber = firstBlockNumber + i;
195
+ const globalVariables = blockGlobalVariables[i];
196
+ const txs = blockTxs[i];
197
+ await this.setTreeRoots(txs);
198
+ const fork = await this.worldState.fork();
199
+ const blockMsgs = isFirstBlock ? l1ToL2Messages : [];
200
+ const block = await buildBlockWithCleanDB(txs, globalVariables, blockMsgs, fork, spongeBlobState, isFirstBlock);
201
+ const header = block.getBlockHeader();
202
+ this.headers.set(blockNumber, header);
203
+ await this.worldState.handleL2BlockAndMessages(block, blockMsgs, isFirstBlock);
204
+ await spongeBlobState.absorb(blockBlobFields[i]);
205
+ blocks.push({
206
+ header,
207
+ txs
208
+ });
209
+ }
210
+ return {
211
+ blocks,
212
+ l1ToL2Messages,
213
+ blobFields: blockBlobFields.flat()
214
+ };
215
+ }
163
216
  async processPublicFunctions(txs, { maxTransactions = txs.length, numL1ToL2Messages = 0, contractDataSource } = {}) {
164
217
  const l1ToL2Messages = times(numL1ToL2Messages, (i)=>new Fr(this.blockNumber * 100 + i));
165
218
  const merkleTrees = await this.worldState.fork();
@@ -190,9 +243,9 @@ class TestProvingOrchestrator extends ProvingOrchestrator {
190
243
  isVerifyBuiltBlockAgainstSyncedStateEnabled = false;
191
244
  // Disable this check by default, since it requires seeding world state with the block being built
192
245
  // This is only enabled in some tests with multiple blocks that populate the pending chain via makePendingBlock
193
- verifyBuiltBlockAgainstSyncedState(l2Block, newArchive) {
246
+ verifyBuiltBlockAgainstSyncedState(provingState) {
194
247
  if (this.isVerifyBuiltBlockAgainstSyncedStateEnabled) {
195
- return super.verifyBuiltBlockAgainstSyncedState(l2Block, newArchive);
248
+ return super.verifyBuiltBlockAgainstSyncedState(provingState);
196
249
  }
197
250
  return Promise.resolve();
198
251
  }
@@ -1,15 +1,14 @@
1
- import { BatchedBlobAccumulator, Blob, type SpongeBlob } from '@aztec/blob-lib';
1
+ import { BatchedBlobAccumulator, Blob, SpongeBlob } from '@aztec/blob-lib';
2
2
  import { BLS12Point, Fr } from '@aztec/foundation/fields';
3
3
  import { type Bufferable, type Tuple } from '@aztec/foundation/serialize';
4
4
  import { MembershipWitness } from '@aztec/foundation/trees';
5
5
  import { PublicDataHint } from '@aztec/stdlib/avm';
6
- import { Body } from '@aztec/stdlib/block';
6
+ import { Body, L2BlockHeader } from '@aztec/stdlib/block';
7
7
  import type { MerkleTreeWriteOperations, PublicInputsAndRecursiveProof } from '@aztec/stdlib/interfaces/server';
8
- import type { ParityPublicInputs } from '@aztec/stdlib/parity';
9
8
  import { ProofData, RecursiveProof } from '@aztec/stdlib/proofs';
10
- import { type BaseOrMergeRollupPublicInputs, type BlockRootOrBlockMergePublicInputs, PrivateBaseRollupHints, PublicBaseRollupHints, PublicTubePrivateInputs } from '@aztec/stdlib/rollup';
9
+ import { BlockRollupPublicInputs, PrivateBaseRollupHints, PublicBaseRollupHints, PublicTubePrivateInputs } from '@aztec/stdlib/rollup';
11
10
  import { AppendOnlyTreeSnapshot, MerkleTreeId } from '@aztec/stdlib/trees';
12
- import { BlockHeader, type GlobalVariables, PartialStateReference, type ProcessedTx, StateReference, Tx, TxEffect } from '@aztec/stdlib/tx';
11
+ import { BlockHeader, GlobalVariables, PartialStateReference, type ProcessedTx, Tx } from '@aztec/stdlib/tx';
13
12
  import type { MerkleTreeReadOperations } from '@aztec/world-state';
14
13
  /**
15
14
  * Type representing the names of the trees for the base rollup.
@@ -19,28 +18,31 @@ type BaseTreeNames = 'NoteHashTree' | 'ContractTree' | 'NullifierTree' | 'Public
19
18
  * Type representing the names of the trees.
20
19
  */
21
20
  export type TreeNames = BaseTreeNames | 'L1ToL2MessageTree' | 'Archive';
22
- export declare const insertSideEffectsAndBuildBaseRollupHints: (tx: ProcessedTx, globalVariables: GlobalVariables, newL1ToL2MessageTreeSnapshot: AppendOnlyTreeSnapshot, db: MerkleTreeWriteOperations, startSpongeBlob: SpongeBlob) => Promise<PublicBaseRollupHints | PrivateBaseRollupHints>;
21
+ export declare const insertSideEffectsAndBuildBaseRollupHints: (tx: ProcessedTx, lastArchive: AppendOnlyTreeSnapshot, newL1ToL2MessageTreeSnapshot: AppendOnlyTreeSnapshot, startSpongeBlob: SpongeBlob, proverId: Fr, db: MerkleTreeWriteOperations) => Promise<PublicBaseRollupHints | PrivateBaseRollupHints>;
23
22
  export declare function getPublicDataHint(db: MerkleTreeWriteOperations, leafSlot: bigint): Promise<PublicDataHint>;
24
23
  export declare function getCivcProofFromTx(tx: Tx | ProcessedTx): RecursiveProof<2076>;
25
24
  export declare function getPublicTubePrivateInputsFromTx(tx: Tx | ProcessedTx): PublicTubePrivateInputs;
26
- export declare const buildBlobHints: (txEffects: TxEffect[]) => Promise<{
27
- blobFields: Fr[];
25
+ export declare const buildBlobHints: (blobFields: Fr[]) => Promise<{
28
26
  blobCommitments: BLS12Point[];
29
27
  blobs: Blob[];
30
28
  blobsHash: Fr;
31
29
  }>;
32
- export declare const accumulateBlobs: (txs: ProcessedTx[], startBlobAccumulator: BatchedBlobAccumulator) => Promise<BatchedBlobAccumulator>;
33
- export declare const buildHeaderFromCircuitOutputs: (previousRollupData: BaseOrMergeRollupPublicInputs[], parityPublicInputs: ParityPublicInputs, rootRollupOutputs: BlockRootOrBlockMergePublicInputs, blobsHash: Fr, endState: StateReference) => BlockHeader;
34
- export declare const buildHeaderAndBodyFromTxs: (txs: ProcessedTx[], globalVariables: GlobalVariables, l1ToL2Messages: Fr[], db: MerkleTreeReadOperations) => Promise<{
35
- header: BlockHeader;
30
+ export declare const buildBlobDataFromTxs: (txsPerCheckpoint: ProcessedTx[][]) => Promise<{
31
+ blobFieldsLengths: number[];
32
+ finalBlobChallenges: import("@aztec/blob-lib").FinalBlobBatchingChallenges;
33
+ }>;
34
+ export declare const buildFinalBlobChallenges: (blobFieldsPerCheckpoint: Fr[][]) => Promise<import("@aztec/blob-lib").FinalBlobBatchingChallenges>;
35
+ export declare const accumulateBlobs: (blobFields: Fr[], startBlobAccumulator: BatchedBlobAccumulator) => Promise<BatchedBlobAccumulator>;
36
+ export declare const buildHeaderFromCircuitOutputs: (blockRootRollupOutput: BlockRollupPublicInputs) => Promise<BlockHeader>;
37
+ export declare const buildHeaderAndBodyFromTxs: (txs: ProcessedTx[], globalVariables: GlobalVariables, l1ToL2Messages: Fr[], db: MerkleTreeReadOperations, startSpongeBlob?: SpongeBlob | undefined) => Promise<{
38
+ header: L2BlockHeader;
36
39
  body: Body;
37
40
  }>;
41
+ export declare const buildBlockHeaderFromTxs: (txs: ProcessedTx[], globalVariables: GlobalVariables, startSpongeBlob: SpongeBlob, db: MerkleTreeReadOperations) => Promise<BlockHeader>;
38
42
  /** Computes the inHash for a block's ContentCommitment given its l1 to l2 messages. */
39
43
  export declare function computeInHashFromL1ToL2Messages(unpaddedL1ToL2Messages: Fr[]): Promise<Fr>;
40
44
  export declare function getBlobsHashFromBlobs(inputs: Blob[]): Fr;
41
45
  export declare function getEmptyBlockBlobsHash(): Promise<Fr>;
42
- export declare function validateBlockRootOutput(blockRootOutput: BlockRootOrBlockMergePublicInputs, blockHeader: BlockHeader, db: MerkleTreeReadOperations): Promise<void>;
43
- export declare const validateState: (state: StateReference, db: MerkleTreeReadOperations) => Promise<void>;
44
46
  export declare function getLastSiblingPath<TID extends MerkleTreeId>(treeId: TID, db: MerkleTreeReadOperations): Promise<Tuple<Fr, {
45
47
  readonly 1: 40;
46
48
  readonly 4: 29;
@@ -1 +1 @@
1
- {"version":3,"file":"block-building-helpers.d.ts","sourceRoot":"","sources":["../../src/orchestrator/block-building-helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"block-building-helpers.d.ts","sourceRoot":"","sources":["../../src/orchestrator/block-building-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,sBAAsB,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAkBxF,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,KAAK,EAAgC,MAAM,6BAA6B,CAAC;AACxG,OAAO,EAAE,iBAAiB,EAAyD,MAAM,yBAAyB,CAAC;AAInH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,aAAa,EAAsB,MAAM,qBAAqB,CAAC;AAC9E,OAAO,KAAK,EAAE,yBAAyB,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAEhH,OAAO,EAAS,SAAS,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAEL,uBAAuB,EACvB,sBAAsB,EAEtB,qBAAqB,EACrB,uBAAuB,EACxB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,sBAAsB,EACtB,YAAY,EAKb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,WAAW,EAEX,eAAe,EACf,qBAAqB,EACrB,KAAK,WAAW,EAEhB,EAAE,EACH,MAAM,kBAAkB,CAAC;AAG1B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAEnE;;GAEG;AACH,KAAK,aAAa,GAAG,cAAc,GAAG,cAAc,GAAG,eAAe,GAAG,gBAAgB,CAAC;AAC1F;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,mBAAmB,GAAG,SAAS,CAAC;AAGxE,eAAO,MAAM,wCAAwC,mPA8JpD,CAAC;AAEF,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,yBAAyB,EAAE,QAAQ,EAAE,MAAM,2BAkBtF;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,EAAE,GAAG,WAAW,wBAMtD;AAED,wBAAgB,gCAAgC,CAAC,EAAE,EAAE,EAAE,GAAG,WAAW,2BAOpE;AAKD,eAAO,MAAM,cAAc;;;;EAc1B,CAAC;AAGF,eAAO,MAAM,oBAAoB,GAAU,kBAAkB,WAAW,EAAE,EAAE;;;EAI3E,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAU,yBAAyB,EAAE,EAAE,EAAE,mEAG7E,CAAC;AAEF,eAAO,MAAM,eAAe,qGAQ3B,CAAC;AAEF,eAAO,MAAM,6BAA6B,0EA2BzC,CAAC;AAEF,eAAO,MAAM,yBAAyB;;;EAsDrC,CAAC;AAEF,eAAO,MAAM,uBAAuB,2IAiCnC,CAAC;AAEF,uFAAuF;AACvF,wBAAsB,+BAA+B,CAAC,sBAAsB,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC,CAO/F;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAExD;AAKD,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,EAAE,CAAC,CAG1D;AAED,wBAAsB,kBAAkB,CAAC,GAAG,SAAS,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,wBAAwB;;;;;;SAI3G;AAED,wBAAsB,sBAAsB,CAAC,GAAG,SAAS,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,wBAAwB;;;;;;SAI/G;AAED,wBAAsB,eAAe,CAAC,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,wBAAwB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAGrH;AAED,wBAAgB,0BAA0B,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,wBAMrE;AA4CD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,YAAY,EACpB,aAAa,EAAE,MAAM,EACrB,EAAE,EAAE,wBAAwB,GAC3B,OAAO,CAAC,EAAE,EAAE,CAAC,CAMf;AAGD,wBAAsB,uBAAuB,CAAC,CAAC,SAAS,MAAM,EAC5D,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,CAAC,EACT,EAAE,EAAE,wBAAwB,GAC3B,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAY/B;AAED,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,qBAAqB,EACnC,aAAa,EAAE,GAAG,CAAC,YAAY,EAAE,sBAAsB,CAAC,QASzD;AAqBD,wBAAgB,UAAU,CAAC,EAAE,EAAE,WAAW,QAczC;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,UAAU,EAAE,YAAY,SAAS,MAAM,EAC3E,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,6BAA6B,CAAC,CAAC,EAAE,YAAY,CAAC,EAClF,OAAO,CAAC,EAAE,MAAM,8BAKjB"}