@aztec/sequencer-client 0.16.9 → 0.18.0

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 (41) hide show
  1. package/dest/block_builder/index.d.ts +1 -1
  2. package/dest/block_builder/index.d.ts.map +1 -1
  3. package/dest/block_builder/solo_block_builder.d.ts +18 -16
  4. package/dest/block_builder/solo_block_builder.d.ts.map +1 -1
  5. package/dest/block_builder/solo_block_builder.js +141 -160
  6. package/dest/block_builder/types.d.ts +2 -13
  7. package/dest/block_builder/types.d.ts.map +1 -1
  8. package/dest/client/sequencer-client.d.ts +1 -1
  9. package/dest/client/sequencer-client.d.ts.map +1 -1
  10. package/dest/config.d.ts.map +1 -1
  11. package/dest/config.js +3 -3
  12. package/dest/prover/empty.js +4 -4
  13. package/dest/publisher/l1-publisher.d.ts +12 -3
  14. package/dest/publisher/l1-publisher.d.ts.map +1 -1
  15. package/dest/publisher/l1-publisher.js +23 -23
  16. package/dest/publisher/viem-tx-sender.d.ts +2 -1
  17. package/dest/publisher/viem-tx-sender.d.ts.map +1 -1
  18. package/dest/publisher/viem-tx-sender.js +6 -2
  19. package/dest/receiver.d.ts +1 -1
  20. package/dest/receiver.d.ts.map +1 -1
  21. package/dest/sequencer/config.d.ts +1 -1
  22. package/dest/sequencer/config.d.ts.map +1 -1
  23. package/dest/sequencer/processed_tx.d.ts +1 -1
  24. package/dest/sequencer/processed_tx.d.ts.map +1 -1
  25. package/dest/sequencer/processed_tx.js +2 -2
  26. package/dest/sequencer/public_processor.d.ts +2 -1
  27. package/dest/sequencer/public_processor.d.ts.map +1 -1
  28. package/dest/sequencer/public_processor.js +30 -10
  29. package/dest/sequencer/sequencer.d.ts +1 -1
  30. package/dest/sequencer/sequencer.d.ts.map +1 -1
  31. package/dest/sequencer/sequencer.js +11 -10
  32. package/dest/sequencer/utils.d.ts +1 -1
  33. package/dest/sequencer/utils.js +3 -3
  34. package/dest/simulator/public_executor.d.ts +1 -1
  35. package/dest/simulator/public_executor.d.ts.map +1 -1
  36. package/dest/simulator/public_executor.js +15 -11
  37. package/dest/simulator/public_kernel.d.ts.map +1 -1
  38. package/dest/simulator/public_kernel.js +1 -1
  39. package/dest/simulator/rollup.d.ts.map +1 -1
  40. package/dest/simulator/rollup.js +1 -1
  41. package/package.json +12 -13
@@ -1,14 +1,13 @@
1
- import { ARCHIVE_HEIGHT, AppendOnlyTreeSnapshot, BaseRollupInputs, CONTRACT_SUBTREE_HEIGHT, CONTRACT_SUBTREE_SIBLING_PATH_LENGTH, ConstantRollupData, L1_TO_L2_MSG_SUBTREE_HEIGHT, L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH, MAX_NEW_NULLIFIERS_PER_BASE_ROLLUP, MAX_PUBLIC_DATA_READS_PER_BASE_ROLLUP, MAX_PUBLIC_DATA_READS_PER_TX, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_BASE_ROLLUP, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, MembershipWitness, MergeRollupInputs, NOTE_HASH_SUBTREE_HEIGHT, NOTE_HASH_SUBTREE_SIBLING_PATH_LENGTH, NULLIFIER_SUBTREE_HEIGHT, NULLIFIER_SUBTREE_SIBLING_PATH_LENGTH, NULLIFIER_TREE_HEIGHT, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, NullifierLeafPreimage, PUBLIC_DATA_TREE_HEIGHT, PreviousKernelData, PreviousRollupData, ROLLUP_VK_TREE_HEIGHT, RollupTypes, RootRollupInputs, RootRollupPublicInputs, VK_TREE_HEIGHT, makeTuple, } from '@aztec/circuits.js';
1
+ import { ContractData, L2Block, L2BlockL2Logs, MerkleTreeId, PublicDataWrite, TxL2Logs } from '@aztec/circuit-types';
2
+ import { ARCHIVE_HEIGHT, AppendOnlyTreeSnapshot, BaseRollupInputs, CONTRACT_SUBTREE_HEIGHT, CONTRACT_SUBTREE_SIBLING_PATH_LENGTH, ConstantRollupData, L1_TO_L2_MSG_SUBTREE_HEIGHT, L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH, MAX_NEW_NULLIFIERS_PER_TX, MAX_PUBLIC_DATA_READS_PER_TX, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, MembershipWitness, MergeRollupInputs, NOTE_HASH_SUBTREE_HEIGHT, NOTE_HASH_SUBTREE_SIBLING_PATH_LENGTH, NULLIFIER_SUBTREE_HEIGHT, NULLIFIER_SUBTREE_SIBLING_PATH_LENGTH, NULLIFIER_TREE_HEIGHT, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, NullifierLeafPreimage, PUBLIC_DATA_SUBTREE_HEIGHT, PUBLIC_DATA_SUBTREE_SIBLING_PATH_LENGTH, PUBLIC_DATA_TREE_HEIGHT, PartialStateReference, PreviousKernelData, PreviousRollupData, PublicDataTreeLeaf, PublicDataTreeLeafPreimage, ROLLUP_VK_TREE_HEIGHT, RollupTypes, RootRollupInputs, StateDiffHints, VK_TREE_HEIGHT, } from '@aztec/circuits.js';
2
3
  import { computeBlockHash, computeBlockHashWithGlobals, computeContractLeaf, computeGlobalsHash, } from '@aztec/circuits.js/abis';
3
- import { toFriendlyJSON } from '@aztec/circuits.js/utils';
4
+ import { makeTuple } from '@aztec/foundation/array';
4
5
  import { toBigIntBE } from '@aztec/foundation/bigint-buffer';
5
6
  import { padArrayEnd } from '@aztec/foundation/collection';
6
7
  import { Fr } from '@aztec/foundation/fields';
7
8
  import { createDebugLogger } from '@aztec/foundation/log';
8
- import { assertLength } from '@aztec/foundation/serialize';
9
- import { ContractData, L2Block, L2BlockL2Logs, MerkleTreeId, PublicDataWrite, TxL2Logs } from '@aztec/types';
9
+ import { assertLength, toFriendlyJSON } from '@aztec/foundation/serialize';
10
10
  import chunk from 'lodash.chunk';
11
- import flatMap from 'lodash.flatmap';
12
11
  const frToBigInt = (fr) => toBigIntBE(fr.toBuffer());
13
12
  // Denotes fields that are not used now, but will be in the future
14
13
  const FUTURE_FR = new Fr(0n);
@@ -36,26 +35,19 @@ export class SoloBlockBuilder {
36
35
  * @returns The new L2 block and a correctness proof as returned by the root rollup circuit.
37
36
  */
38
37
  async buildL2Block(globalVariables, txs, newL1ToL2Messages) {
39
- const [startNoteHashTreeSnapshot, startNullifierTreeSnapshot, startContractTreeSnapshot, startPublicDataTreeSnapshot, startL1ToL2MessageTreeSnapshot, startArchiveSnapshot,] = await Promise.all([
40
- MerkleTreeId.NOTE_HASH_TREE,
41
- MerkleTreeId.NULLIFIER_TREE,
42
- MerkleTreeId.CONTRACT_TREE,
43
- MerkleTreeId.PUBLIC_DATA_TREE,
44
- MerkleTreeId.L1_TO_L2_MESSAGES_TREE,
45
- MerkleTreeId.ARCHIVE,
46
- ].map(tree => this.getTreeSnapshot(tree)));
47
38
  // Check txs are good for processing
48
39
  this.validateTxs(txs);
49
40
  // We fill the tx batch with empty txs, we process only one tx at a time for now
50
41
  const [circuitsOutput, proof] = await this.runCircuits(globalVariables, txs, newL1ToL2Messages);
51
- const { endNoteHashTreeSnapshot, endNullifierTreeSnapshot, endContractTreeSnapshot, endPublicDataTreeRoot, endL1ToL2MessagesTreeSnapshot, endArchiveSnapshot, } = circuitsOutput;
52
42
  // Collect all new nullifiers, commitments, and contracts from all txs in this block
53
- const newNullifiers = flatMap(txs, tx => tx.data.end.newNullifiers);
54
- const newCommitments = flatMap(txs, tx => tx.data.end.newCommitments);
55
- const newContracts = flatMap(txs, tx => tx.data.end.newContracts).map(cd => computeContractLeaf(cd));
56
- const newContractData = flatMap(txs, tx => tx.data.end.newContracts).map(n => new ContractData(n.contractAddress, n.portalContractAddress));
57
- const newPublicDataWrites = flatMap(txs, tx => tx.data.end.publicDataUpdateRequests.map(t => new PublicDataWrite(t.leafIndex, t.newValue)));
58
- const newL2ToL1Msgs = flatMap(txs, tx => tx.data.end.newL2ToL1Msgs);
43
+ const newNullifiers = txs.flatMap(tx => tx.data.end.newNullifiers);
44
+ const newCommitments = txs.flatMap(tx => tx.data.end.newCommitments);
45
+ const newContracts = txs.flatMap(tx => tx.data.end.newContracts).map(cd => computeContractLeaf(cd));
46
+ const newContractData = txs
47
+ .flatMap(tx => tx.data.end.newContracts)
48
+ .map(n => new ContractData(n.contractAddress, n.portalContractAddress));
49
+ const newPublicDataWrites = txs.flatMap(tx => tx.data.end.publicDataUpdateRequests.map(t => new PublicDataWrite(t.leafSlot, t.newValue)));
50
+ const newL2ToL1Msgs = txs.flatMap(tx => tx.data.end.newL2ToL1Msgs);
59
51
  // Consolidate logs data from all txs
60
52
  const encryptedLogsArr = [];
61
53
  const unencryptedLogsArr = [];
@@ -68,22 +60,10 @@ export class SoloBlockBuilder {
68
60
  const newEncryptedLogs = new L2BlockL2Logs(encryptedLogsArr);
69
61
  const newUnencryptedLogs = new L2BlockL2Logs(unencryptedLogsArr);
70
62
  const l2Block = L2Block.fromFields({
71
- number: Number(globalVariables.blockNumber.value),
72
- globalVariables,
73
- startNoteHashTreeSnapshot,
74
- endNoteHashTreeSnapshot,
75
- startNullifierTreeSnapshot,
76
- endNullifierTreeSnapshot,
77
- startContractTreeSnapshot,
78
- endContractTreeSnapshot,
79
- startPublicDataTreeRoot: startPublicDataTreeSnapshot.root,
80
- endPublicDataTreeRoot,
81
- startL1ToL2MessagesTreeSnapshot: startL1ToL2MessageTreeSnapshot,
82
- endL1ToL2MessagesTreeSnapshot,
83
- startArchiveSnapshot,
84
- endArchiveSnapshot,
85
- newCommitments,
86
- newNullifiers,
63
+ archive: circuitsOutput.archive,
64
+ header: circuitsOutput.header,
65
+ newCommitments: newCommitments.map((c) => c.value),
66
+ newNullifiers: newNullifiers.map((n) => n.value),
87
67
  newL2ToL1Msgs,
88
68
  newContracts,
89
69
  newContractData,
@@ -92,10 +72,10 @@ export class SoloBlockBuilder {
92
72
  newEncryptedLogs,
93
73
  newUnencryptedLogs,
94
74
  });
95
- if (!l2Block.getCalldataHash().equals(circuitsOutput.sha256CalldataHash())) {
96
- throw new Error(`Calldata hash mismatch, ${l2Block.getCalldataHash().toString('hex')} == ${circuitsOutput
97
- .sha256CalldataHash()
98
- .toString('hex')} `);
75
+ if (!l2Block.getCalldataHash().equals(circuitsOutput.header.bodyHash)) {
76
+ throw new Error(`Calldata hash mismatch, ${l2Block
77
+ .getCalldataHash()
78
+ .toString('hex')} == ${circuitsOutput.header.bodyHash.toString('hex')} `);
99
79
  }
100
80
  return [l2Block, proof];
101
81
  }
@@ -105,7 +85,7 @@ export class SoloBlockBuilder {
105
85
  'noteHashTreeRoot',
106
86
  'contractTreeRoot',
107
87
  'nullifierTreeRoot',
108
- 'l1ToL2MessagesTreeRoot',
88
+ 'l1ToL2MessageTreeRoot',
109
89
  ]) {
110
90
  if (tx.data.constants.blockHeader[historicalTreeRoot].isZero()) {
111
91
  throw new Error(`Empty ${historicalTreeRoot} for tx: ${toFriendlyJSON(tx)}`);
@@ -120,16 +100,15 @@ export class SoloBlockBuilder {
120
100
  async runCircuits(globalVariables, txs, newL1ToL2Messages) {
121
101
  // Check that the length of the array of txs is a power of two
122
102
  // See https://graphics.stanford.edu/~seander/bithacks.html#DetermineIfPowerOf2
123
- if (txs.length < 4 || (txs.length & (txs.length - 1)) !== 0) {
124
- throw new Error(`Length of txs for the block should be a power of two and at least four (got ${txs.length})`);
103
+ if (txs.length < 2 || (txs.length & (txs.length - 1)) !== 0) {
104
+ throw new Error(`Length of txs for the block should be a power of two and at least two (got ${txs.length})`);
125
105
  }
126
106
  // padArrayEnd throws if the array is already full. Otherwise it pads till we reach the required size
127
107
  const newL1ToL2MessagesTuple = padArrayEnd(newL1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP);
128
108
  // Run the base rollup circuits for the txs
129
109
  const baseRollupOutputs = [];
130
- for (const pair of chunk(txs, 2)) {
131
- const [tx1, tx2] = pair;
132
- baseRollupOutputs.push(await this.baseRollupCircuit(tx1, tx2, globalVariables));
110
+ for (const tx of txs) {
111
+ baseRollupOutputs.push(await this.baseRollupCircuit(tx, globalVariables));
133
112
  }
134
113
  // Run merge rollups in layers until we have only two outputs
135
114
  let mergeRollupInputs = baseRollupOutputs;
@@ -146,11 +125,11 @@ export class SoloBlockBuilder {
146
125
  const [mergeOutputLeft, mergeOutputRight] = mergeRollupInputs;
147
126
  return this.rootRollupCircuit(mergeOutputLeft, mergeOutputRight, newL1ToL2MessagesTuple);
148
127
  }
149
- async baseRollupCircuit(tx1, tx2, globalVariables) {
150
- this.debug(`Running base rollup for ${tx1.hash} ${tx2.hash}`);
151
- const rollupInput = await this.buildBaseRollupInput(tx1, tx2, globalVariables);
128
+ async baseRollupCircuit(tx, globalVariables) {
129
+ this.debug(`Running base rollup for ${tx.hash}`);
130
+ const rollupInput = await this.buildBaseRollupInput(tx, globalVariables);
152
131
  const rollupOutput = await this.simulator.baseRollupCircuit(rollupInput);
153
- await this.validateTrees(rollupOutput);
132
+ await this.validatePartialState(rollupOutput.end);
154
133
  const proof = await this.prover.getBaseRollupProof(rollupInput, rollupOutput);
155
134
  return [rollupOutput, proof];
156
135
  }
@@ -179,7 +158,7 @@ export class SoloBlockBuilder {
179
158
  this.debug(`Running root rollup circuit`);
180
159
  const rootInput = await this.getRootRollupInput(...left, ...right, newL1ToL2Messages);
181
160
  // Update the local trees to include the new l1 to l2 messages
182
- await this.db.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGES_TREE, newL1ToL2Messages.map(m => m.toBuffer()));
161
+ await this.db.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, newL1ToL2Messages.map(m => m.toBuffer()));
183
162
  // Simulate and get proof for the root circuit
184
163
  const rootOutput = await this.simulator.rootRollupCircuit(rootInput);
185
164
  const rootProof = await this.prover.getRootRollupProof(rootInput, rootOutput);
@@ -203,50 +182,32 @@ export class SoloBlockBuilder {
203
182
  MerkleTreeId.NULLIFIER_TREE,
204
183
  MerkleTreeId.CONTRACT_TREE,
205
184
  MerkleTreeId.PUBLIC_DATA_TREE,
206
- MerkleTreeId.L1_TO_L2_MESSAGES_TREE,
185
+ MerkleTreeId.L1_TO_L2_MESSAGE_TREE,
207
186
  ].map(tree => this.getTreeSnapshot(tree)))).map(r => r.root);
208
187
  const blockHash = computeBlockHashWithGlobals(globals, noteHashTreeRoot, nullifierTreeRoot, contractTreeRoot, l1ToL2MessageTreeRoot, publicDataTreeRoot);
209
188
  return blockHash;
210
189
  }
211
- // Validate that the new roots we calculated from manual insertions match the outputs of the simulation
212
- async validateTrees(rollupOutput) {
190
+ async validatePartialState(partialState) {
191
+ await Promise.all([
192
+ this.validateSimulatedTree(await this.getTreeSnapshot(MerkleTreeId.NOTE_HASH_TREE), partialState.noteHashTree, 'NoteHashTree'),
193
+ this.validateSimulatedTree(await this.getTreeSnapshot(MerkleTreeId.NULLIFIER_TREE), partialState.nullifierTree, 'NullifierTree'),
194
+ this.validateSimulatedTree(await this.getTreeSnapshot(MerkleTreeId.CONTRACT_TREE), partialState.contractTree, 'ContractTree'),
195
+ this.validateSimulatedTree(await this.getTreeSnapshot(MerkleTreeId.PUBLIC_DATA_TREE), partialState.publicDataTree, 'PublicDataTree'),
196
+ ]);
197
+ }
198
+ async validateState(state) {
213
199
  await Promise.all([
214
- this.validateTree(rollupOutput, MerkleTreeId.CONTRACT_TREE, 'ContractTree'),
215
- this.validateTree(rollupOutput, MerkleTreeId.NOTE_HASH_TREE, 'NoteHashTree'),
216
- this.validateTree(rollupOutput, MerkleTreeId.NULLIFIER_TREE, 'NullifierTree'),
217
- this.validatePublicDataTreeRoot(rollupOutput),
200
+ this.validateSimulatedTree(await this.getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE), state.l1ToL2MessageTree, 'L1ToL2MessageTree'),
201
+ this.validatePartialState(state.partial),
218
202
  ]);
219
203
  }
220
204
  // Validate that the roots of all local trees match the output of the root circuit simulation
221
205
  async validateRootOutput(rootOutput) {
222
206
  await Promise.all([
223
- this.validateTrees(rootOutput),
224
- this.validateTree(rootOutput, MerkleTreeId.ARCHIVE, 'Archive'),
225
- this.validateTree(rootOutput, MerkleTreeId.L1_TO_L2_MESSAGES_TREE, 'L1ToL2MessagesTree'),
207
+ this.validateState(rootOutput.header.state),
208
+ this.validateSimulatedTree(await this.getTreeSnapshot(MerkleTreeId.ARCHIVE), rootOutput.archive, 'Archive'),
226
209
  ]);
227
210
  }
228
- /**
229
- * Validates that the root of the public data tree matches the output of the circuit simulation.
230
- * @param output - The output of the circuit simulation.
231
- * Note: Public data tree is sparse, so the "next available leaf index" doesn't make sense there.
232
- * For this reason we only validate root.
233
- */
234
- async validatePublicDataTreeRoot(output) {
235
- const localTree = await this.getTreeSnapshot(MerkleTreeId.PUBLIC_DATA_TREE);
236
- const simulatedTreeRoot = output[`endPublicDataTreeRoot`];
237
- if (!simulatedTreeRoot.toBuffer().equals(localTree.root.toBuffer())) {
238
- throw new Error(`PublicData tree root mismatch (local ${localTree.root}, simulated ${simulatedTreeRoot})`);
239
- }
240
- }
241
- // Helper for validating a non-roots tree against a circuit simulation output
242
- async validateTree(output, treeId, name) {
243
- if ('endL1ToL2MessageTreeSnapshot' in output && !(output instanceof RootRollupPublicInputs)) {
244
- throw new Error(`The name 'L1ToL2Message' can only be used when output is of type RootRollupPublicInputs`);
245
- }
246
- const localTree = await this.getTreeSnapshot(treeId);
247
- const simulatedTree = output[`end${name}Snapshot`];
248
- this.validateSimulatedTree(localTree, simulatedTree, name);
249
- }
250
211
  // Helper for comparing two trees snapshots
251
212
  validateSimulatedTree(localTree, simulatedTree, name, label) {
252
213
  if (!simulatedTree.root.toBuffer().equals(localTree.root.toBuffer())) {
@@ -270,10 +231,10 @@ export class SoloBlockBuilder {
270
231
  const path = await this.db.getSiblingPath(treeId, size);
271
232
  return path.toFieldArray();
272
233
  };
273
- const newL1ToL2MessagesTreeRootSiblingPathArray = await this.getSubtreeSiblingPath(MerkleTreeId.L1_TO_L2_MESSAGES_TREE, L1_TO_L2_MSG_SUBTREE_HEIGHT);
274
- const newL1ToL2MessagesTreeRootSiblingPath = makeTuple(L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH, i => i < newL1ToL2MessagesTreeRootSiblingPathArray.length ? newL1ToL2MessagesTreeRootSiblingPathArray[i] : Fr.ZERO, 0);
234
+ const newL1ToL2MessageTreeRootSiblingPathArray = await this.getSubtreeSiblingPath(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, L1_TO_L2_MSG_SUBTREE_HEIGHT);
235
+ const newL1ToL2MessageTreeRootSiblingPath = makeTuple(L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH, i => i < newL1ToL2MessageTreeRootSiblingPathArray.length ? newL1ToL2MessageTreeRootSiblingPathArray[i] : Fr.ZERO, 0);
275
236
  // Get tree snapshots
276
- const startL1ToL2MessagesTreeSnapshot = await this.getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGES_TREE);
237
+ const startL1ToL2MessageTreeSnapshot = await this.getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE);
277
238
  // Get blocks tree
278
239
  const startArchiveSnapshot = await this.getTreeSnapshot(MerkleTreeId.ARCHIVE);
279
240
  const newArchiveSiblingPathArray = await getRootTreeSiblingPath(MerkleTreeId.ARCHIVE);
@@ -281,8 +242,8 @@ export class SoloBlockBuilder {
281
242
  return RootRollupInputs.from({
282
243
  previousRollupData,
283
244
  newL1ToL2Messages,
284
- newL1ToL2MessagesTreeRootSiblingPath,
285
- startL1ToL2MessagesTreeSnapshot,
245
+ newL1ToL2MessageTreeRootSiblingPath,
246
+ startL1ToL2MessageTreeSnapshot,
286
247
  startArchiveSnapshot,
287
248
  newArchiveSiblingPath,
288
249
  });
@@ -314,8 +275,8 @@ export class SoloBlockBuilder {
314
275
  }
315
276
  getHistoricalTreesMembershipWitnessFor(tx) {
316
277
  const blockHeader = tx.data.constants.blockHeader;
317
- const { noteHashTreeRoot, nullifierTreeRoot, contractTreeRoot, l1ToL2MessagesTreeRoot, publicDataTreeRoot } = blockHeader;
318
- const blockHash = computeBlockHash(blockHeader.globalVariablesHash, noteHashTreeRoot, nullifierTreeRoot, contractTreeRoot, l1ToL2MessagesTreeRoot, publicDataTreeRoot);
278
+ const { noteHashTreeRoot, nullifierTreeRoot, contractTreeRoot, l1ToL2MessageTreeRoot, publicDataTreeRoot } = blockHeader;
279
+ const blockHash = computeBlockHash(blockHeader.globalVariablesHash, noteHashTreeRoot, nullifierTreeRoot, contractTreeRoot, l1ToL2MessageTreeRoot, publicDataTreeRoot);
319
280
  return this.getMembershipWitnessFor(blockHash, MerkleTreeId.ARCHIVE, ARCHIVE_HEIGHT);
320
281
  }
321
282
  async getConstantRollupData(globalVariables) {
@@ -324,7 +285,7 @@ export class SoloBlockBuilder {
324
285
  mergeRollupVkHash: DELETE_FR,
325
286
  privateKernelVkTreeRoot: FUTURE_FR,
326
287
  publicKernelVkTreeRoot: FUTURE_FR,
327
- archiveSnapshot: await this.getTreeSnapshot(MerkleTreeId.ARCHIVE),
288
+ lastArchive: await this.getTreeSnapshot(MerkleTreeId.ARCHIVE),
328
289
  globalVariables,
329
290
  });
330
291
  }
@@ -357,99 +318,119 @@ export class SoloBlockBuilder {
357
318
  return fullSiblingPath.getSubtreeSiblingPath(subtreeHeight).toFieldArray();
358
319
  }
359
320
  async processPublicDataUpdateRequests(tx) {
360
- const newPublicDataUpdateRequestsSiblingPaths = makeTuple(MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, () => makeTuple(PUBLIC_DATA_TREE_HEIGHT, Fr.zero));
361
- for (const i in tx.data.end.publicDataUpdateRequests) {
362
- const index = tx.data.end.publicDataUpdateRequests[i].leafIndex.value;
363
- await this.db.updateLeaf(MerkleTreeId.PUBLIC_DATA_TREE, tx.data.end.publicDataUpdateRequests[i].newValue.toBuffer(), index);
364
- const path = await this.db.getSiblingPath(MerkleTreeId.PUBLIC_DATA_TREE, index);
365
- const array = path.toFieldArray();
366
- newPublicDataUpdateRequestsSiblingPaths[i] = makeTuple(PUBLIC_DATA_TREE_HEIGHT, j => j < array.length ? array[j] : Fr.ZERO);
321
+ const { lowLeavesWitnessData, newSubtreeSiblingPath, sortedNewLeaves, sortedNewLeavesIndexes } = await this.db.batchInsert(MerkleTreeId.PUBLIC_DATA_TREE,
322
+ // TODO(#3675) remove oldValue from update requests
323
+ tx.data.end.publicDataUpdateRequests.map(updateRequest => {
324
+ return new PublicDataTreeLeaf(updateRequest.leafSlot, updateRequest.newValue).toBuffer();
325
+ }), PUBLIC_DATA_SUBTREE_HEIGHT);
326
+ if (lowLeavesWitnessData === undefined) {
327
+ throw new Error(`Could not craft public data batch insertion proofs`);
367
328
  }
368
- return newPublicDataUpdateRequestsSiblingPaths;
329
+ const sortedPublicDataWrites = makeTuple(MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, i => {
330
+ return PublicDataTreeLeaf.fromBuffer(sortedNewLeaves[i]);
331
+ });
332
+ const sortedPublicDataWritesIndexes = makeTuple(MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, i => {
333
+ return sortedNewLeavesIndexes[i];
334
+ });
335
+ const subtreeSiblingPathAsFields = newSubtreeSiblingPath.toFieldArray();
336
+ const newPublicDataSubtreeSiblingPath = makeTuple(PUBLIC_DATA_SUBTREE_SIBLING_PATH_LENGTH, i => {
337
+ return subtreeSiblingPathAsFields[i];
338
+ });
339
+ const lowPublicDataWritesMembershipWitnesses = makeTuple(MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, i => {
340
+ const witness = lowLeavesWitnessData[i];
341
+ return MembershipWitness.fromBufferArray(witness.index, assertLength(witness.siblingPath.toBufferArray(), PUBLIC_DATA_TREE_HEIGHT));
342
+ });
343
+ const lowPublicDataWritesPreimages = makeTuple(MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, i => {
344
+ return lowLeavesWitnessData[i].leafPreimage;
345
+ });
346
+ return {
347
+ lowPublicDataWritesPreimages,
348
+ lowPublicDataWritesMembershipWitnesses,
349
+ newPublicDataSubtreeSiblingPath,
350
+ sortedPublicDataWrites,
351
+ sortedPublicDataWritesIndexes,
352
+ };
369
353
  }
370
- async getPublicDataReadsSiblingPaths(tx) {
371
- const newPublicDataReadsSiblingPaths = makeTuple(MAX_PUBLIC_DATA_READS_PER_TX, () => makeTuple(PUBLIC_DATA_TREE_HEIGHT, Fr.zero));
354
+ async getPublicDataReadsInfo(tx) {
355
+ const newPublicDataReadsWitnesses = makeTuple(MAX_PUBLIC_DATA_READS_PER_TX, () => MembershipWitness.empty(PUBLIC_DATA_TREE_HEIGHT, 0n));
356
+ const newPublicDataReadsPreimages = makeTuple(MAX_PUBLIC_DATA_READS_PER_TX, () => PublicDataTreeLeafPreimage.empty());
372
357
  for (const i in tx.data.end.publicDataReads) {
373
- const index = tx.data.end.publicDataReads[i].leafIndex.value;
374
- const path = await this.db.getSiblingPath(MerkleTreeId.PUBLIC_DATA_TREE, index);
375
- const array = path.toFieldArray();
376
- newPublicDataReadsSiblingPaths[i] = makeTuple(PUBLIC_DATA_TREE_HEIGHT, j => j < array.length ? array[j] : Fr.ZERO);
358
+ const leafSlot = tx.data.end.publicDataReads[i].leafSlot.value;
359
+ const lowLeafResult = await this.db.getPreviousValueIndex(MerkleTreeId.PUBLIC_DATA_TREE, leafSlot);
360
+ if (!lowLeafResult) {
361
+ throw new Error(`Public data tree should have one initial leaf`);
362
+ }
363
+ const preimage = await this.db.getLeafPreimage(MerkleTreeId.PUBLIC_DATA_TREE, lowLeafResult.index);
364
+ const path = await this.db.getSiblingPath(MerkleTreeId.PUBLIC_DATA_TREE, lowLeafResult.index);
365
+ newPublicDataReadsWitnesses[i] = new MembershipWitness(PUBLIC_DATA_TREE_HEIGHT, BigInt(lowLeafResult.index), path.toTuple());
366
+ newPublicDataReadsPreimages[i] = preimage;
377
367
  }
378
- return newPublicDataReadsSiblingPaths;
368
+ return {
369
+ newPublicDataReadsWitnesses,
370
+ newPublicDataReadsPreimages,
371
+ };
379
372
  }
380
373
  // Builds the base rollup inputs, updating the contract, nullifier, and data trees in the process
381
- async buildBaseRollupInput(left, right, globalVariables) {
374
+ async buildBaseRollupInput(tx, globalVariables) {
382
375
  // Get trees info before any changes hit
383
376
  const constants = await this.getConstantRollupData(globalVariables);
384
- const startNullifierTreeSnapshot = await this.getTreeSnapshot(MerkleTreeId.NULLIFIER_TREE);
385
- const startContractTreeSnapshot = await this.getTreeSnapshot(MerkleTreeId.CONTRACT_TREE);
386
- const startNoteHashTreeSnapshot = await this.getTreeSnapshot(MerkleTreeId.NOTE_HASH_TREE);
387
- const startPublicDataTreeSnapshot = await this.getTreeSnapshot(MerkleTreeId.PUBLIC_DATA_TREE);
388
- const startArchiveSnapshot = await this.getTreeSnapshot(MerkleTreeId.ARCHIVE);
377
+ const start = new PartialStateReference(await this.getTreeSnapshot(MerkleTreeId.NOTE_HASH_TREE), await this.getTreeSnapshot(MerkleTreeId.NULLIFIER_TREE), await this.getTreeSnapshot(MerkleTreeId.CONTRACT_TREE), await this.getTreeSnapshot(MerkleTreeId.PUBLIC_DATA_TREE));
389
378
  // Get the subtree sibling paths for the circuit
390
- const newCommitmentsSubtreeSiblingPathArray = await this.getSubtreeSiblingPath(MerkleTreeId.NOTE_HASH_TREE, NOTE_HASH_SUBTREE_HEIGHT);
391
- const newCommitmentsSubtreeSiblingPath = makeTuple(NOTE_HASH_SUBTREE_SIBLING_PATH_LENGTH, i => i < newCommitmentsSubtreeSiblingPathArray.length ? newCommitmentsSubtreeSiblingPathArray[i] : Fr.ZERO);
392
- const newContractsSubtreeSiblingPathArray = await this.getSubtreeSiblingPath(MerkleTreeId.CONTRACT_TREE, CONTRACT_SUBTREE_HEIGHT);
393
- const newContractsSubtreeSiblingPath = makeTuple(CONTRACT_SUBTREE_SIBLING_PATH_LENGTH, i => i < newContractsSubtreeSiblingPathArray.length ? newContractsSubtreeSiblingPathArray[i] : Fr.ZERO);
379
+ const noteHashSubtreeSiblingPathArray = await this.getSubtreeSiblingPath(MerkleTreeId.NOTE_HASH_TREE, NOTE_HASH_SUBTREE_HEIGHT);
380
+ const noteHashSubtreeSiblingPath = makeTuple(NOTE_HASH_SUBTREE_SIBLING_PATH_LENGTH, i => i < noteHashSubtreeSiblingPathArray.length ? noteHashSubtreeSiblingPathArray[i] : Fr.ZERO);
381
+ const contractSubtreeSiblingPathArray = await this.getSubtreeSiblingPath(MerkleTreeId.CONTRACT_TREE, CONTRACT_SUBTREE_HEIGHT);
382
+ const contractSubtreeSiblingPath = makeTuple(CONTRACT_SUBTREE_SIBLING_PATH_LENGTH, i => i < contractSubtreeSiblingPathArray.length ? contractSubtreeSiblingPathArray[i] : Fr.ZERO);
394
383
  // Update the contract and note hash trees with the new items being inserted to get the new roots
395
384
  // that will be used by the next iteration of the base rollup circuit, skipping the empty ones
396
- const newContracts = flatMap([left, right], tx => tx.data.end.newContracts.map(cd => computeContractLeaf(cd)));
397
- const newCommitments = flatMap([left, right], tx => tx.data.end.newCommitments.map(x => x.toBuffer()));
385
+ const newContracts = tx.data.end.newContracts.map(cd => computeContractLeaf(cd));
386
+ const newCommitments = tx.data.end.newCommitments.map(x => x.value.toBuffer());
398
387
  await this.db.appendLeaves(MerkleTreeId.CONTRACT_TREE, newContracts.map(x => x.toBuffer()));
399
388
  await this.db.appendLeaves(MerkleTreeId.NOTE_HASH_TREE, newCommitments);
400
- // Update the public data tree and get membership witnesses.
401
- // All public data reads are checked against the unmodified data root when the corresponding tx started,
402
- // so it's the unmodified tree for tx1, and the one after applying tx1 update request for tx2.
403
- // Update requests are checked against the tree as it is iteratively updated.
404
- // See https://github.com/AztecProtocol/aztec3-packages/issues/270#issuecomment-1522258200
405
- const leftPublicDataReadSiblingPaths = await this.getPublicDataReadsSiblingPaths(left);
406
- const leftPublicDataUpdateRequestsSiblingPaths = await this.processPublicDataUpdateRequests(left);
407
- const rightPublicDataReadSiblingPaths = await this.getPublicDataReadsSiblingPaths(right);
408
- const rightPublicDataUpdateRequestsSiblingPaths = await this.processPublicDataUpdateRequests(right);
409
- const newPublicDataReadsSiblingPaths = makeTuple(MAX_PUBLIC_DATA_READS_PER_BASE_ROLLUP, i => i < MAX_PUBLIC_DATA_READS_PER_TX
410
- ? leftPublicDataReadSiblingPaths[i]
411
- : rightPublicDataReadSiblingPaths[i - MAX_PUBLIC_DATA_READS_PER_TX]);
412
- const newPublicDataUpdateRequestsSiblingPaths = makeTuple(MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_BASE_ROLLUP, i => i < MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX
413
- ? leftPublicDataUpdateRequestsSiblingPaths[i]
414
- : rightPublicDataUpdateRequestsSiblingPaths[i - MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX]);
389
+ // The read witnesses for a given TX should be generated before the writes of the same TX are applied.
390
+ // All reads that refer to writes in the same tx are transient and can be simplified out.
391
+ const txPublicDataReadsInfo = await this.getPublicDataReadsInfo(tx);
392
+ const txPublicDataUpdateRequestInfo = await this.processPublicDataUpdateRequests(tx);
415
393
  // Update the nullifier tree, capturing the low nullifier info for each individual operation
416
- const newNullifiers = [...left.data.end.newNullifiers, ...right.data.end.newNullifiers];
417
- const { lowLeavesWitnessData: nullifierWitnessLeaves, newSubtreeSiblingPath: newNullifiersSubtreeSiblingPath, sortedNewLeaves: sortedNewNullifiers, sortedNewLeavesIndexes: sortednewNullifiersIndexes, } = await this.db.batchInsert(MerkleTreeId.NULLIFIER_TREE, newNullifiers.map(fr => fr.toBuffer()), NULLIFIER_SUBTREE_HEIGHT);
394
+ const newNullifiers = tx.data.end.newNullifiers;
395
+ const { lowLeavesWitnessData: nullifierWitnessLeaves, newSubtreeSiblingPath: newNullifiersSubtreeSiblingPath, sortedNewLeaves: sortedNewNullifiers, sortedNewLeavesIndexes, } = await this.db.batchInsert(MerkleTreeId.NULLIFIER_TREE, newNullifiers.map(sideEffectLinkedToNoteHash => sideEffectLinkedToNoteHash.value.toBuffer()), NULLIFIER_SUBTREE_HEIGHT);
418
396
  if (nullifierWitnessLeaves === undefined) {
419
397
  throw new Error(`Could not craft nullifier batch insertion proofs`);
420
398
  }
421
399
  // Extract witness objects from returned data
422
- const lowNullifierMembershipWitnesses = nullifierWitnessLeaves.map(l => MembershipWitness.fromBufferArray(l.index, assertLength(l.siblingPath.toBufferArray(), NULLIFIER_TREE_HEIGHT)));
423
- const newNullifiersSubtreeSiblingPathArray = newNullifiersSubtreeSiblingPath.toFieldArray();
424
- return BaseRollupInputs.from({
425
- constants,
426
- startNullifierTreeSnapshot,
427
- startContractTreeSnapshot,
428
- startNoteHashTreeSnapshot,
429
- startPublicDataTreeRoot: startPublicDataTreeSnapshot.root,
430
- archiveSnapshot: startArchiveSnapshot,
431
- sortedNewNullifiers: makeTuple(MAX_NEW_NULLIFIERS_PER_BASE_ROLLUP, i => Fr.fromBuffer(sortedNewNullifiers[i])),
432
- sortednewNullifiersIndexes: makeTuple(MAX_NEW_NULLIFIERS_PER_BASE_ROLLUP, i => sortednewNullifiersIndexes[i]),
433
- newCommitmentsSubtreeSiblingPath,
434
- newContractsSubtreeSiblingPath,
435
- newNullifiersSubtreeSiblingPath: makeTuple(NULLIFIER_SUBTREE_SIBLING_PATH_LENGTH, i => i < newNullifiersSubtreeSiblingPathArray.length ? newNullifiersSubtreeSiblingPathArray[i] : Fr.ZERO),
436
- newPublicDataUpdateRequestsSiblingPaths,
437
- newPublicDataReadsSiblingPaths,
438
- lowNullifierLeafPreimages: makeTuple(MAX_NEW_NULLIFIERS_PER_BASE_ROLLUP, i => i < nullifierWitnessLeaves.length
400
+ const nullifierPredecessorMembershipWitnessesWithoutPadding = nullifierWitnessLeaves.map(l => MembershipWitness.fromBufferArray(l.index, assertLength(l.siblingPath.toBufferArray(), NULLIFIER_TREE_HEIGHT)));
401
+ const nullifierSubtreeSiblingPathArray = newNullifiersSubtreeSiblingPath.toFieldArray();
402
+ const nullifierSubtreeSiblingPath = makeTuple(NULLIFIER_SUBTREE_SIBLING_PATH_LENGTH, i => i < nullifierSubtreeSiblingPathArray.length ? nullifierSubtreeSiblingPathArray[i] : Fr.ZERO);
403
+ const publicDataSiblingPath = txPublicDataUpdateRequestInfo.newPublicDataSubtreeSiblingPath;
404
+ const stateDiffHints = StateDiffHints.from({
405
+ nullifierPredecessorPreimages: makeTuple(MAX_NEW_NULLIFIERS_PER_TX, i => i < nullifierWitnessLeaves.length
439
406
  ? nullifierWitnessLeaves[i].leafPreimage
440
407
  : NullifierLeafPreimage.empty()),
441
- lowNullifierMembershipWitness: makeTuple(MAX_NEW_NULLIFIERS_PER_BASE_ROLLUP, i => i < lowNullifierMembershipWitnesses.length
442
- ? lowNullifierMembershipWitnesses[i]
408
+ nullifierPredecessorMembershipWitnesses: makeTuple(MAX_NEW_NULLIFIERS_PER_TX, i => i < nullifierPredecessorMembershipWitnessesWithoutPadding.length
409
+ ? nullifierPredecessorMembershipWitnessesWithoutPadding[i]
443
410
  : this.makeEmptyMembershipWitness(NULLIFIER_TREE_HEIGHT)),
444
- kernelData: [this.getKernelDataFor(left), this.getKernelDataFor(right)],
445
- archiveRootMembershipWitnesses: [
446
- await this.getHistoricalTreesMembershipWitnessFor(left),
447
- await this.getHistoricalTreesMembershipWitnessFor(right),
448
- ],
411
+ sortedNullifiers: makeTuple(MAX_NEW_NULLIFIERS_PER_TX, i => Fr.fromBuffer(sortedNewNullifiers[i])),
412
+ sortedNullifierIndexes: makeTuple(MAX_NEW_NULLIFIERS_PER_TX, i => sortedNewLeavesIndexes[i]),
413
+ noteHashSubtreeSiblingPath,
414
+ nullifierSubtreeSiblingPath,
415
+ contractSubtreeSiblingPath,
416
+ publicDataSiblingPath,
417
+ });
418
+ return BaseRollupInputs.from({
419
+ kernelData: this.getKernelDataFor(tx),
420
+ start,
421
+ stateDiffHints,
422
+ sortedPublicDataWrites: txPublicDataUpdateRequestInfo.sortedPublicDataWrites,
423
+ sortedPublicDataWritesIndexes: txPublicDataUpdateRequestInfo.sortedPublicDataWritesIndexes,
424
+ lowPublicDataWritesPreimages: txPublicDataUpdateRequestInfo.lowPublicDataWritesPreimages,
425
+ lowPublicDataWritesMembershipWitnesses: txPublicDataUpdateRequestInfo.lowPublicDataWritesMembershipWitnesses,
426
+ publicDataReadsPreimages: txPublicDataReadsInfo.newPublicDataReadsPreimages,
427
+ publicDataReadsMembershipWitnesses: txPublicDataReadsInfo.newPublicDataReadsWitnesses,
428
+ archiveRootMembershipWitness: await this.getHistoricalTreesMembershipWitnessFor(tx),
429
+ constants,
449
430
  });
450
431
  }
451
432
  makeEmptyMembershipWitness(height) {
452
433
  return new MembershipWitness(height, 0n, makeTuple(height, () => Fr.ZERO));
453
434
  }
454
435
  }
455
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29sb19ibG9ja19idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jsb2NrX2J1aWxkZXIvc29sb19ibG9ja19idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxjQUFjLEVBQ2Qsc0JBQXNCLEVBRXRCLGdCQUFnQixFQUNoQix1QkFBdUIsRUFDdkIsb0NBQW9DLEVBQ3BDLGtCQUFrQixFQUVsQiwyQkFBMkIsRUFDM0Isd0NBQXdDLEVBQ3hDLGtDQUFrQyxFQUNsQyxxQ0FBcUMsRUFDckMsNEJBQTRCLEVBQzVCLCtDQUErQyxFQUMvQyxzQ0FBc0MsRUFDdEMsaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQix3QkFBd0IsRUFDeEIscUNBQXFDLEVBQ3JDLHdCQUF3QixFQUN4QixxQ0FBcUMsRUFDckMscUJBQXFCLEVBQ3JCLG1DQUFtQyxFQUNuQyxxQkFBcUIsRUFDckIsdUJBQXVCLEVBQ3ZCLGtCQUFrQixFQUNsQixrQkFBa0IsRUFFbEIscUJBQXFCLEVBQ3JCLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIsc0JBQXNCLEVBQ3RCLGNBQWMsRUFFZCxTQUFTLEdBQ1YsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLDJCQUEyQixFQUMzQixtQkFBbUIsRUFDbkIsa0JBQWtCLEdBQ25CLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM3RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBUyxZQUFZLEVBQUUsTUFBTSw2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
436
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29sb19ibG9ja19idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jsb2NrX2J1aWxkZXIvc29sb19ibG9ja19idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JILE9BQU8sRUFDTCxjQUFjLEVBQ2Qsc0JBQXNCLEVBRXRCLGdCQUFnQixFQUNoQix1QkFBdUIsRUFDdkIsb0NBQW9DLEVBQ3BDLGtCQUFrQixFQUVsQiwyQkFBMkIsRUFDM0Isd0NBQXdDLEVBQ3hDLHlCQUF5QixFQUN6Qiw0QkFBNEIsRUFDNUIsc0NBQXNDLEVBQ3RDLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsd0JBQXdCLEVBQ3hCLHFDQUFxQyxFQUNyQyx3QkFBd0IsRUFDeEIscUNBQXFDLEVBQ3JDLHFCQUFxQixFQUNyQixtQ0FBbUMsRUFDbkMscUJBQXFCLEVBQ3JCLDBCQUEwQixFQUMxQix1Q0FBdUMsRUFDdkMsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQixrQkFBa0IsRUFDbEIsa0JBQWtCLEVBRWxCLGtCQUFrQixFQUNsQiwwQkFBMEIsRUFDMUIscUJBQXFCLEVBQ3JCLFdBQVcsRUFDWCxnQkFBZ0IsRUFJaEIsY0FBYyxFQUVkLGNBQWMsR0FFZixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsMkJBQTJCLEVBQzNCLG1CQUFtQixFQUNuQixrQkFBa0IsR0FDbkIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztB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
@@ -1,21 +1,10 @@
1
- import { AppendOnlyTreeSnapshot, BaseOrMergeRollupPublicInputs, RootRollupPublicInputs } from '@aztec/circuits.js';
2
1
  /**
3
2
  * Type representing the names of the trees for the base rollup.
4
3
  */
5
- type BaseTreeNames = 'NoteHashTree' | 'ContractTree' | 'NullifierTree';
4
+ type BaseTreeNames = 'NoteHashTree' | 'ContractTree' | 'NullifierTree' | 'PublicDataTree';
6
5
  /**
7
6
  * Type representing the names of the trees.
8
7
  */
9
- export type TreeNames = BaseTreeNames | 'L1ToL2MessagesTree' | 'Archive';
10
- /**
11
- * Type to assert that only the correct trees are checked when validating rollup tree outputs.
12
- */
13
- export type AllowedTreeNames<T extends BaseOrMergeRollupPublicInputs | RootRollupPublicInputs> = T extends RootRollupPublicInputs ? TreeNames : BaseTreeNames;
14
- /**
15
- * Type to assert the correct object field is indexed when validating rollup tree outputs.
16
- */
17
- export type OutputWithTreeSnapshot<T extends BaseOrMergeRollupPublicInputs | RootRollupPublicInputs> = {
18
- [K in `end${AllowedTreeNames<T>}Snapshot`]: AppendOnlyTreeSnapshot;
19
- };
8
+ export type TreeNames = BaseTreeNames | 'L1ToL2MessageTree' | 'Archive';
20
9
  export {};
21
10
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/block_builder/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,6BAA6B,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAEnH;;GAEG;AACH,KAAK,aAAa,GAAG,cAAc,GAAG,cAAc,GAAG,eAAe,CAAC;AACvE;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,oBAAoB,GAAG,SAAS,CAAC;AAEzE;;GAEG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,6BAA6B,GAAG,sBAAsB,IAC3F,CAAC,SAAS,sBAAsB,GAAG,SAAS,GAAG,aAAa,CAAC;AAE/D;;GAEG;AACH,MAAM,MAAM,sBAAsB,CAAC,CAAC,SAAS,6BAA6B,GAAG,sBAAsB,IAAI;KACpG,CAAC,IAAI,MAAM,gBAAgB,CAAC,CAAC,CAAC,UAAU,GAAG,sBAAsB;CACnE,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/block_builder/types.ts"],"names":[],"mappings":"AAAA;;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"}