@aztec/sequencer-client 0.7.0 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/Dockerfile +21 -0
  2. package/package.json +10 -10
  3. package/src/block_builder/solo_block_builder.test.ts +4 -4
  4. package/src/block_builder/solo_block_builder.ts +80 -24
  5. package/src/publisher/viem-tx-sender.ts +4 -1
  6. package/src/sequencer/sequencer.ts +15 -4
  7. package/src/simulator/public_executor.ts +2 -16
  8. package/src/simulator/rollup.ts +7 -4
  9. package/.tsbuildinfo +0 -1
  10. package/dest/block_builder/index.d.ts +0 -19
  11. package/dest/block_builder/index.d.ts.map +0 -1
  12. package/dest/block_builder/index.js +0 -2
  13. package/dest/block_builder/solo_block_builder.d.ts +0 -77
  14. package/dest/block_builder/solo_block_builder.d.ts.map +0 -1
  15. package/dest/block_builder/solo_block_builder.js +0 -454
  16. package/dest/block_builder/solo_block_builder.test.d.ts +0 -3
  17. package/dest/block_builder/solo_block_builder.test.d.ts.map +0 -1
  18. package/dest/block_builder/solo_block_builder.test.js +0 -277
  19. package/dest/block_builder/types.d.ts +0 -12
  20. package/dest/block_builder/types.d.ts.map +0 -1
  21. package/dest/block_builder/types.js +0 -2
  22. package/dest/client/index.d.ts +0 -2
  23. package/dest/client/index.d.ts.map +0 -1
  24. package/dest/client/index.js +0 -2
  25. package/dest/client/sequencer-client.d.ts +0 -32
  26. package/dest/client/sequencer-client.d.ts.map +0 -1
  27. package/dest/client/sequencer-client.js +0 -47
  28. package/dest/config.d.ts +0 -12
  29. package/dest/config.d.ts.map +0 -1
  30. package/dest/config.js +0 -28
  31. package/dest/global_variable_builder/config.d.ts +0 -19
  32. package/dest/global_variable_builder/config.d.ts.map +0 -1
  33. package/dest/global_variable_builder/config.js +0 -2
  34. package/dest/global_variable_builder/global_builder.d.ts +0 -58
  35. package/dest/global_variable_builder/global_builder.d.ts.map +0 -1
  36. package/dest/global_variable_builder/global_builder.js +0 -36
  37. package/dest/global_variable_builder/index.d.ts +0 -12
  38. package/dest/global_variable_builder/index.d.ts.map +0 -1
  39. package/dest/global_variable_builder/index.js +0 -12
  40. package/dest/global_variable_builder/viem-reader.d.ts +0 -16
  41. package/dest/global_variable_builder/viem-reader.d.ts.map +0 -1
  42. package/dest/global_variable_builder/viem-reader.js +0 -37
  43. package/dest/index.d.ts +0 -12
  44. package/dest/index.d.ts.map +0 -1
  45. package/dest/index.js +0 -14
  46. package/dest/mocks/verification_keys.d.ts +0 -28
  47. package/dest/mocks/verification_keys.d.ts.map +0 -1
  48. package/dest/mocks/verification_keys.js +0 -14
  49. package/dest/prover/empty.d.ts +0 -41
  50. package/dest/prover/empty.d.ts.map +0 -1
  51. package/dest/prover/empty.js +0 -57
  52. package/dest/prover/index.d.ts +0 -40
  53. package/dest/prover/index.d.ts.map +0 -1
  54. package/dest/prover/index.js +0 -2
  55. package/dest/publisher/config.d.ts +0 -32
  56. package/dest/publisher/config.d.ts.map +0 -1
  57. package/dest/publisher/config.js +0 -2
  58. package/dest/publisher/index.d.ts +0 -10
  59. package/dest/publisher/index.d.ts.map +0 -1
  60. package/dest/publisher/index.js +0 -11
  61. package/dest/publisher/l1-publisher.d.ts +0 -105
  62. package/dest/publisher/l1-publisher.d.ts.map +0 -1
  63. package/dest/publisher/l1-publisher.js +0 -156
  64. package/dest/publisher/l1-publisher.test.d.ts +0 -2
  65. package/dest/publisher/l1-publisher.test.d.ts.map +0 -1
  66. package/dest/publisher/l1-publisher.test.js +0 -58
  67. package/dest/publisher/viem-tx-sender.d.ts +0 -42
  68. package/dest/publisher/viem-tx-sender.d.ts.map +0 -1
  69. package/dest/publisher/viem-tx-sender.js +0 -118
  70. package/dest/receiver.d.ts +0 -13
  71. package/dest/receiver.d.ts.map +0 -1
  72. package/dest/receiver.js +0 -2
  73. package/dest/sequencer/config.d.ts +0 -26
  74. package/dest/sequencer/config.d.ts.map +0 -1
  75. package/dest/sequencer/config.js +0 -2
  76. package/dest/sequencer/index.d.ts +0 -4
  77. package/dest/sequencer/index.d.ts.map +0 -1
  78. package/dest/sequencer/index.js +0 -4
  79. package/dest/sequencer/processed_tx.d.ts +0 -51
  80. package/dest/sequencer/processed_tx.d.ts.map +0 -1
  81. package/dest/sequencer/processed_tx.js +0 -40
  82. package/dest/sequencer/public_processor.d.ts +0 -75
  83. package/dest/sequencer/public_processor.d.ts.map +0 -1
  84. package/dest/sequencer/public_processor.js +0 -269
  85. package/dest/sequencer/public_processor.test.d.ts +0 -2
  86. package/dest/sequencer/public_processor.test.d.ts.map +0 -1
  87. package/dest/sequencer/public_processor.test.js +0 -164
  88. package/dest/sequencer/sequencer.d.ts +0 -133
  89. package/dest/sequencer/sequencer.d.ts.map +0 -1
  90. package/dest/sequencer/sequencer.js +0 -297
  91. package/dest/sequencer/sequencer.test.d.ts +0 -2
  92. package/dest/sequencer/sequencer.test.d.ts.map +0 -1
  93. package/dest/sequencer/sequencer.test.js +0 -99
  94. package/dest/sequencer/utils.d.ts +0 -7
  95. package/dest/sequencer/utils.d.ts.map +0 -1
  96. package/dest/sequencer/utils.js +0 -12
  97. package/dest/simulator/index.d.ts +0 -43
  98. package/dest/simulator/index.d.ts.map +0 -1
  99. package/dest/simulator/index.js +0 -2
  100. package/dest/simulator/public_executor.d.ts +0 -22
  101. package/dest/simulator/public_executor.d.ts.map +0 -1
  102. package/dest/simulator/public_executor.js +0 -99
  103. package/dest/simulator/public_kernel.d.ts +0 -20
  104. package/dest/simulator/public_kernel.d.ts.map +0 -1
  105. package/dest/simulator/public_kernel.js +0 -27
  106. package/dest/simulator/rollup.d.ts +0 -34
  107. package/dest/simulator/rollup.d.ts.map +0 -1
  108. package/dest/simulator/rollup.js +0 -50
  109. package/dest/utils.d.ts +0 -12
  110. package/dest/utils.d.ts.map +0 -1
  111. package/dest/utils.js +0 -16
@@ -1,77 +0,0 @@
1
- import { AppendOnlyTreeSnapshot, BaseOrMergeRollupPublicInputs, BaseRollupInputs, ConstantRollupData, GlobalVariables, MembershipWitness, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, NullifierLeafPreimage, PreviousKernelData, PreviousRollupData, Proof, RollupTypes, RootRollupInputs, RootRollupPublicInputs, VerificationKey } from '@aztec/circuits.js';
2
- import { Fr } from '@aztec/foundation/fields';
3
- import { Tuple } from '@aztec/foundation/serialize';
4
- import { L2Block, MerkleTreeId } from '@aztec/types';
5
- import { MerkleTreeOperations } from '@aztec/world-state';
6
- import { VerificationKeys } from '../mocks/verification_keys.js';
7
- import { RollupProver } from '../prover/index.js';
8
- import { ProcessedTx } from '../sequencer/processed_tx.js';
9
- import { RollupSimulator } from '../simulator/index.js';
10
- import { BlockBuilder } from './index.js';
11
- import { AllowedTreeNames } from './types.js';
12
- /**
13
- * Builds an L2 block out of a set of ProcessedTx's,
14
- * using the base, merge, and root rollup circuits.
15
- */
16
- export declare class SoloBlockBuilder implements BlockBuilder {
17
- protected db: MerkleTreeOperations;
18
- protected vks: VerificationKeys;
19
- protected simulator: RollupSimulator;
20
- protected prover: RollupProver;
21
- protected debug: import("@aztec/foundation/log").DebugLogger;
22
- constructor(db: MerkleTreeOperations, vks: VerificationKeys, simulator: RollupSimulator, prover: RollupProver, debug?: import("@aztec/foundation/log").DebugLogger);
23
- /**
24
- * Builds an L2 block with the given number containing the given txs, updating state trees.
25
- * @param globalVariables - Global variables to be used in the block.
26
- * @param txs - Processed transactions to include in the block.
27
- * @param newL1ToL2Messages - L1 to L2 messages to be part of the block.
28
- * @param timestamp - Timestamp of the block.
29
- * @returns The new L2 block and a correctness proof as returned by the root rollup circuit.
30
- */
31
- buildL2Block(globalVariables: GlobalVariables, txs: ProcessedTx[], newL1ToL2Messages: Fr[]): Promise<[L2Block, Proof]>;
32
- protected validateTxs(txs: ProcessedTx[]): void;
33
- protected getTreeSnapshot(id: MerkleTreeId): Promise<AppendOnlyTreeSnapshot>;
34
- protected runCircuits(globalVariables: GlobalVariables, txs: ProcessedTx[], newL1ToL2Messages: Fr[]): Promise<[RootRollupPublicInputs, Proof]>;
35
- protected baseRollupCircuit(tx1: ProcessedTx, tx2: ProcessedTx, globalVariables: GlobalVariables): Promise<[BaseOrMergeRollupPublicInputs, Proof]>;
36
- protected mergeRollupCircuit(left: [BaseOrMergeRollupPublicInputs, Proof], right: [BaseOrMergeRollupPublicInputs, Proof]): Promise<[BaseOrMergeRollupPublicInputs, Proof]>;
37
- protected getVerificationKey(type: RollupTypes): VerificationKey;
38
- protected rootRollupCircuit(left: [BaseOrMergeRollupPublicInputs, Proof], right: [BaseOrMergeRollupPublicInputs, Proof], newL1ToL2Messages: Tuple<Fr, typeof NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP>): Promise<[RootRollupPublicInputs, Proof]>;
39
- updateHistoricBlocksTree(globalVariables: GlobalVariables): Promise<void>;
40
- protected calculateBlockHash(globals: GlobalVariables): Promise<Fr>;
41
- protected validateTrees(rollupOutput: BaseOrMergeRollupPublicInputs | RootRollupPublicInputs): Promise<void>;
42
- protected validateRootOutput(rootOutput: RootRollupPublicInputs): Promise<void>;
43
- protected validateRootTree(rootOutput: RootRollupPublicInputs, treeId: MerkleTreeId, name: 'Contract' | 'PrivateData' | 'L1ToL2Messages'): Promise<void>;
44
- /**
45
- * Validates that the root of the public data tree matches the output of the circuit simulation.
46
- * @param output - The output of the circuit simulation.
47
- * Note: Public data tree is sparse, so the "next available leaf index" doesn't make sense there.
48
- * For this reason we only validate root.
49
- */
50
- protected validatePublicDataTreeRoot(output: BaseOrMergeRollupPublicInputs | RootRollupPublicInputs): Promise<void>;
51
- protected validateTree<T extends BaseOrMergeRollupPublicInputs | RootRollupPublicInputs>(output: T, treeId: MerkleTreeId, name: AllowedTreeNames<T>): Promise<void>;
52
- protected validateSimulatedTree(localTree: AppendOnlyTreeSnapshot, simulatedTree: AppendOnlyTreeSnapshot, name: 'PrivateData' | 'Contract' | 'Nullifier' | 'L1ToL2Messages' | 'HistoricBlocks', label?: string): void;
53
- protected getRootRollupInput(rollupOutputLeft: BaseOrMergeRollupPublicInputs, rollupProofLeft: Proof, rollupOutputRight: BaseOrMergeRollupPublicInputs, rollupProofRight: Proof, newL1ToL2Messages: Tuple<Fr, typeof NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP>): Promise<RootRollupInputs>;
54
- protected getPreviousRollupDataFromPublicInputs(rollupOutput: BaseOrMergeRollupPublicInputs, rollupProof: Proof, vk: VerificationKey): PreviousRollupData;
55
- protected getKernelDataFor(tx: ProcessedTx): PreviousKernelData;
56
- protected getMembershipWitnessFor<N extends number>(value: Fr, treeId: MerkleTreeId, height: N): Promise<MembershipWitness<N>>;
57
- protected getHistoricTreesMembershipWitnessFor(tx: ProcessedTx): Promise<MembershipWitness<16>>;
58
- protected getConstantRollupData(globalVariables: GlobalVariables): Promise<ConstantRollupData>;
59
- protected getLowNullifierInfo(nullifier: Fr): Promise<{
60
- index: number;
61
- leafPreimage: NullifierLeafPreimage;
62
- witness: MembershipWitness<16>;
63
- } | {
64
- index: {
65
- index: number;
66
- alreadyPresent: boolean;
67
- };
68
- leafPreimage: NullifierLeafPreimage;
69
- witness: MembershipWitness<16>;
70
- }>;
71
- protected getSubtreeSiblingPath(treeId: MerkleTreeId, subtreeHeight: number): Promise<Fr[]>;
72
- protected processPublicDataUpdateRequests(tx: ProcessedTx): Promise<Fr[][]>;
73
- protected getPublicDataReadsSiblingPaths(tx: ProcessedTx): Promise<Fr[][]>;
74
- protected buildBaseRollupInput(left: ProcessedTx, right: ProcessedTx, globalVariables: GlobalVariables): Promise<BaseRollupInputs>;
75
- protected makeEmptyMembershipWitness<N extends number>(height: N): MembershipWitness<N>;
76
- }
77
- //# sourceMappingURL=solo_block_builder.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"solo_block_builder.d.ts","sourceRoot":"","sources":["../../src/block_builder/solo_block_builder.ts"],"names":[],"mappings":"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"}
@@ -1,454 +0,0 @@
1
- import { AppendOnlyTreeSnapshot, BaseRollupInputs, CircuitsWasm, ConstantRollupData, HISTORIC_BLOCKS_TREE_HEIGHT, L1_TO_L2_MSG_SUBTREE_HEIGHT, L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH, MembershipWitness, MergeRollupInputs, NULLIFIER_TREE_HEIGHT, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, NullifierLeafPreimage, PreviousKernelData, PreviousRollupData, ROLLUP_VK_TREE_HEIGHT, RollupTypes, RootRollupInputs, RootRollupPublicInputs, VK_TREE_HEIGHT, makeTuple, } from '@aztec/circuits.js';
2
- import { computeBlockHash, computeBlockHashWithGlobals, computeContractLeaf } from '@aztec/circuits.js/abis';
3
- import { toFriendlyJSON } from '@aztec/circuits.js/utils';
4
- import { toBigIntBE } from '@aztec/foundation/bigint-buffer';
5
- import { padArrayEnd } from '@aztec/foundation/collection';
6
- import { Fr } from '@aztec/foundation/fields';
7
- import { createDebugLogger } from '@aztec/foundation/log';
8
- import { assertLength } from '@aztec/foundation/serialize';
9
- import { ContractData, L2Block, L2BlockL2Logs, MerkleTreeId, PublicDataWrite, TxL2Logs } from '@aztec/types';
10
- import { computeGlobalVariablesHash } from '@aztec/world-state';
11
- import chunk from 'lodash.chunk';
12
- import flatMap from 'lodash.flatmap';
13
- const frToBigInt = (fr) => toBigIntBE(fr.toBuffer());
14
- const bigintToFr = (num) => new Fr(num);
15
- const bigintToNum = (num) => Number(num);
16
- // Denotes fields that are not used now, but will be in the future
17
- const FUTURE_FR = new Fr(0n);
18
- const FUTURE_NUM = 0;
19
- // Denotes fields that should be deleted
20
- const DELETE_FR = new Fr(0n);
21
- /**
22
- * Builds an L2 block out of a set of ProcessedTx's,
23
- * using the base, merge, and root rollup circuits.
24
- */
25
- export class SoloBlockBuilder {
26
- constructor(db, vks, simulator, prover, debug = createDebugLogger('aztec:sequencer:solo-block-builder')) {
27
- this.db = db;
28
- this.vks = vks;
29
- this.simulator = simulator;
30
- this.prover = prover;
31
- this.debug = debug;
32
- }
33
- /**
34
- * Builds an L2 block with the given number containing the given txs, updating state trees.
35
- * @param globalVariables - Global variables to be used in the block.
36
- * @param txs - Processed transactions to include in the block.
37
- * @param newL1ToL2Messages - L1 to L2 messages to be part of the block.
38
- * @param timestamp - Timestamp of the block.
39
- * @returns The new L2 block and a correctness proof as returned by the root rollup circuit.
40
- */
41
- async buildL2Block(globalVariables, txs, newL1ToL2Messages) {
42
- const [startPrivateDataTreeSnapshot, startNullifierTreeSnapshot, startContractTreeSnapshot, startPublicDataTreeSnapshot, startL1ToL2MessageTreeSnapshot, startHistoricBlocksTreeSnapshot,] = await Promise.all([
43
- MerkleTreeId.PRIVATE_DATA_TREE,
44
- MerkleTreeId.NULLIFIER_TREE,
45
- MerkleTreeId.CONTRACT_TREE,
46
- MerkleTreeId.PUBLIC_DATA_TREE,
47
- MerkleTreeId.L1_TO_L2_MESSAGES_TREE,
48
- MerkleTreeId.BLOCKS_TREE,
49
- ].map(tree => this.getTreeSnapshot(tree)));
50
- // Check txs are good for processing
51
- this.validateTxs(txs);
52
- // We fill the tx batch with empty txs, we process only one tx at a time for now
53
- const [circuitsOutput, proof] = await this.runCircuits(globalVariables, txs, newL1ToL2Messages);
54
- const { endPrivateDataTreeSnapshot, endNullifierTreeSnapshot, endContractTreeSnapshot, endPublicDataTreeRoot, endL1ToL2MessagesTreeSnapshot, endHistoricBlocksTreeSnapshot, } = circuitsOutput;
55
- // Collect all new nullifiers, commitments, and contracts from all txs in this block
56
- const wasm = await CircuitsWasm.get();
57
- const newNullifiers = flatMap(txs, tx => tx.data.end.newNullifiers);
58
- const newCommitments = flatMap(txs, tx => tx.data.end.newCommitments);
59
- const newContracts = flatMap(txs, tx => tx.data.end.newContracts).map(cd => computeContractLeaf(wasm, cd));
60
- const newContractData = flatMap(txs, tx => tx.data.end.newContracts).map(n => new ContractData(n.contractAddress, n.portalContractAddress));
61
- const newPublicDataWrites = flatMap(txs, tx => tx.data.end.publicDataUpdateRequests.map(t => new PublicDataWrite(t.leafIndex, t.newValue)));
62
- const newL2ToL1Msgs = flatMap(txs, tx => tx.data.end.newL2ToL1Msgs);
63
- // Consolidate logs data from all txs
64
- const encryptedLogsArr = [];
65
- const unencryptedLogsArr = [];
66
- for (const tx of txs) {
67
- const encryptedLogs = tx.encryptedLogs || new TxL2Logs([]);
68
- encryptedLogsArr.push(encryptedLogs);
69
- const unencryptedLogs = tx.unencryptedLogs || new TxL2Logs([]);
70
- unencryptedLogsArr.push(unencryptedLogs);
71
- }
72
- const newEncryptedLogs = new L2BlockL2Logs(encryptedLogsArr);
73
- const newUnencryptedLogs = new L2BlockL2Logs(unencryptedLogsArr);
74
- const l2Block = L2Block.fromFields({
75
- number: Number(globalVariables.blockNumber.value),
76
- globalVariables,
77
- startPrivateDataTreeSnapshot,
78
- endPrivateDataTreeSnapshot,
79
- startNullifierTreeSnapshot,
80
- endNullifierTreeSnapshot,
81
- startContractTreeSnapshot,
82
- endContractTreeSnapshot,
83
- startPublicDataTreeRoot: startPublicDataTreeSnapshot.root,
84
- endPublicDataTreeRoot,
85
- startL1ToL2MessagesTreeSnapshot: startL1ToL2MessageTreeSnapshot,
86
- endL1ToL2MessagesTreeSnapshot,
87
- startHistoricBlocksTreeSnapshot,
88
- endHistoricBlocksTreeSnapshot,
89
- newCommitments,
90
- newNullifiers,
91
- newL2ToL1Msgs,
92
- newContracts,
93
- newContractData,
94
- newPublicDataWrites,
95
- newL1ToL2Messages,
96
- newEncryptedLogs,
97
- newUnencryptedLogs,
98
- });
99
- if (!l2Block.getCalldataHash().equals(circuitsOutput.sha256CalldataHash())) {
100
- throw new Error(`Calldata hash mismatch, ${l2Block.getCalldataHash().toString('hex')} == ${circuitsOutput
101
- .sha256CalldataHash()
102
- .toString('hex')} `);
103
- }
104
- return [l2Block, proof];
105
- }
106
- validateTxs(txs) {
107
- for (const tx of txs) {
108
- for (const historicTreeRoot of [
109
- 'privateDataTreeRoot',
110
- 'contractTreeRoot',
111
- 'nullifierTreeRoot',
112
- 'l1ToL2MessagesTreeRoot',
113
- ]) {
114
- if (tx.data.constants.blockData[historicTreeRoot].isZero()) {
115
- throw new Error(`Empty ${historicTreeRoot} for tx: ${toFriendlyJSON(tx)}`);
116
- }
117
- }
118
- }
119
- }
120
- async getTreeSnapshot(id) {
121
- const treeInfo = await this.db.getTreeInfo(id);
122
- return new AppendOnlyTreeSnapshot(Fr.fromBuffer(treeInfo.root), Number(treeInfo.size));
123
- }
124
- async runCircuits(globalVariables, txs, newL1ToL2Messages) {
125
- // Check that the length of the array of txs is a power of two
126
- // See https://graphics.stanford.edu/~seander/bithacks.html#DetermineIfPowerOf2
127
- if (txs.length < 4 || (txs.length & (txs.length - 1)) !== 0) {
128
- throw new Error(`Length of txs for the block should be a power of two and at least four (got ${txs.length})`);
129
- }
130
- // padArrayEnd throws if the array is already full. Otherwise it pads till we reach the required size
131
- const newL1ToL2MessagesTuple = padArrayEnd(newL1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP);
132
- // Run the base rollup circuits for the txs
133
- const baseRollupOutputs = [];
134
- for (const pair of chunk(txs, 2)) {
135
- const [tx1, tx2] = pair;
136
- baseRollupOutputs.push(await this.baseRollupCircuit(tx1, tx2, globalVariables));
137
- }
138
- // Run merge rollups in layers until we have only two outputs
139
- let mergeRollupInputs = baseRollupOutputs;
140
- let mergeRollupOutputs = [];
141
- while (mergeRollupInputs.length > 2) {
142
- for (const pair of chunk(mergeRollupInputs, 2)) {
143
- const [r1, r2] = pair;
144
- mergeRollupOutputs.push(await this.mergeRollupCircuit(r1, r2));
145
- }
146
- mergeRollupInputs = mergeRollupOutputs;
147
- mergeRollupOutputs = [];
148
- }
149
- // Run the root rollup with the last two merge rollups (or base, if no merge layers)
150
- const [mergeOutputLeft, mergeOutputRight] = mergeRollupInputs;
151
- return this.rootRollupCircuit(mergeOutputLeft, mergeOutputRight, newL1ToL2MessagesTuple);
152
- }
153
- async baseRollupCircuit(tx1, tx2, globalVariables) {
154
- this.debug(`Running base rollup for ${tx1.hash} ${tx2.hash}`);
155
- const rollupInput = await this.buildBaseRollupInput(tx1, tx2, globalVariables);
156
- const rollupOutput = await this.simulator.baseRollupCircuit(rollupInput);
157
- await this.validateTrees(rollupOutput);
158
- const proof = await this.prover.getBaseRollupProof(rollupInput, rollupOutput);
159
- return [rollupOutput, proof];
160
- }
161
- async mergeRollupCircuit(left, right) {
162
- const vk = this.getVerificationKey(left[0].rollupType);
163
- const mergeInputs = new MergeRollupInputs([
164
- this.getPreviousRollupDataFromPublicInputs(left[0], left[1], vk),
165
- this.getPreviousRollupDataFromPublicInputs(right[0], right[1], vk),
166
- ]);
167
- this.debug(`Running merge rollup circuit`);
168
- const output = await this.simulator.mergeRollupCircuit(mergeInputs);
169
- const proof = await this.prover.getMergeRollupProof(mergeInputs, output);
170
- return [output, proof];
171
- }
172
- getVerificationKey(type) {
173
- switch (type) {
174
- case RollupTypes.Base:
175
- return this.vks.baseRollupCircuit;
176
- case RollupTypes.Merge:
177
- return this.vks.mergeRollupCircuit;
178
- default:
179
- throw new Error(`No verification key available for ${type}`);
180
- }
181
- }
182
- async rootRollupCircuit(left, right, newL1ToL2Messages) {
183
- this.debug(`Running root rollup circuit`);
184
- const rootInput = await this.getRootRollupInput(...left, ...right, newL1ToL2Messages);
185
- // Update the local trees to include the new l1 to l2 messages
186
- await this.db.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGES_TREE, newL1ToL2Messages.map(m => m.toBuffer()));
187
- // Simulate and get proof for the root circuit
188
- const rootOutput = await this.simulator.rootRollupCircuit(rootInput);
189
- const rootProof = await this.prover.getRootRollupProof(rootInput, rootOutput);
190
- // Update the root trees with the latest data and contract tree roots,
191
- // and validate them against the output of the root circuit simulation
192
- this.debug(`Updating and validating root trees`);
193
- const globalVariablesHash = await computeGlobalVariablesHash(left[0].constants.globalVariables);
194
- await this.db.updateLatestGlobalVariablesHash(globalVariablesHash);
195
- await this.db.updateHistoricBlocksTree(globalVariablesHash);
196
- await this.validateRootOutput(rootOutput);
197
- return [rootOutput, rootProof];
198
- }
199
- async updateHistoricBlocksTree(globalVariables) {
200
- // Calculate the block hash and add it to the historic block hashes tree
201
- const blockHash = await this.calculateBlockHash(globalVariables);
202
- await this.db.appendLeaves(MerkleTreeId.BLOCKS_TREE, [blockHash.toBuffer()]);
203
- }
204
- async calculateBlockHash(globals) {
205
- const [privateDataTreeRoot, nullifierTreeRoot, contractTreeRoot, publicDataTreeRoot, l1ToL2MessageTreeRoot] = (await Promise.all([
206
- MerkleTreeId.PRIVATE_DATA_TREE,
207
- MerkleTreeId.NULLIFIER_TREE,
208
- MerkleTreeId.CONTRACT_TREE,
209
- MerkleTreeId.PUBLIC_DATA_TREE,
210
- MerkleTreeId.L1_TO_L2_MESSAGES_TREE,
211
- ].map(tree => this.getTreeSnapshot(tree)))).map(r => r.root);
212
- const wasm = await CircuitsWasm.get();
213
- const blockHash = computeBlockHashWithGlobals(wasm, globals, privateDataTreeRoot, nullifierTreeRoot, contractTreeRoot, l1ToL2MessageTreeRoot, publicDataTreeRoot);
214
- return blockHash;
215
- }
216
- // Validate that the new roots we calculated from manual insertions match the outputs of the simulation
217
- async validateTrees(rollupOutput) {
218
- await Promise.all([
219
- this.validateTree(rollupOutput, MerkleTreeId.CONTRACT_TREE, 'Contract'),
220
- this.validateTree(rollupOutput, MerkleTreeId.PRIVATE_DATA_TREE, 'PrivateData'),
221
- this.validateTree(rollupOutput, MerkleTreeId.NULLIFIER_TREE, 'Nullifier'),
222
- this.validatePublicDataTreeRoot(rollupOutput),
223
- ]);
224
- }
225
- // Validate that the roots of all local trees match the output of the root circuit simulation
226
- async validateRootOutput(rootOutput) {
227
- await Promise.all([
228
- this.validateTrees(rootOutput),
229
- this.validateTree(rootOutput, MerkleTreeId.BLOCKS_TREE, 'HistoricBlocks'),
230
- this.validateTree(rootOutput, MerkleTreeId.L1_TO_L2_MESSAGES_TREE, 'L1ToL2Messages'),
231
- ]);
232
- }
233
- // Helper for validating a roots tree against a circuit simulation output
234
- async validateRootTree(rootOutput, treeId, name) {
235
- const localTree = await this.getTreeSnapshot(treeId);
236
- const simulatedTree = rootOutput[`endTreeOfHistoric${name}TreeRootsSnapshot`];
237
- this.validateSimulatedTree(localTree, simulatedTree, name, `Roots ${name}`);
238
- }
239
- /**
240
- * Validates that the root of the public data tree matches the output of the circuit simulation.
241
- * @param output - The output of the circuit simulation.
242
- * Note: Public data tree is sparse, so the "next available leaf index" doesn't make sense there.
243
- * For this reason we only validate root.
244
- */
245
- async validatePublicDataTreeRoot(output) {
246
- const localTree = await this.getTreeSnapshot(MerkleTreeId.PUBLIC_DATA_TREE);
247
- const simulatedTreeRoot = output[`endPublicDataTreeRoot`];
248
- if (!simulatedTreeRoot.toBuffer().equals(localTree.root.toBuffer())) {
249
- throw new Error(`PublicData tree root mismatch (local ${localTree.root}, simulated ${simulatedTreeRoot})`);
250
- }
251
- }
252
- // Helper for validating a non-roots tree against a circuit simulation output
253
- async validateTree(output, treeId, name) {
254
- if ('endL1ToL2MessageTreeSnapshot' in output && !(output instanceof RootRollupPublicInputs)) {
255
- throw new Error(`The name 'L1ToL2Message' can only be used when output is of type RootRollupPublicInputs`);
256
- }
257
- const localTree = await this.getTreeSnapshot(treeId);
258
- const simulatedTree = output[`end${name}TreeSnapshot`];
259
- this.validateSimulatedTree(localTree, simulatedTree, name);
260
- }
261
- // Helper for comparing two trees snapshots
262
- validateSimulatedTree(localTree, simulatedTree, name, label) {
263
- if (!simulatedTree.root.toBuffer().equals(localTree.root.toBuffer())) {
264
- throw new Error(`${label ?? name} tree root mismatch (local ${localTree.root}, simulated ${simulatedTree.root})`);
265
- }
266
- if (simulatedTree.nextAvailableLeafIndex !== localTree.nextAvailableLeafIndex) {
267
- throw new Error(`${label ?? name} tree next available leaf index mismatch (local ${localTree.nextAvailableLeafIndex}, simulated ${simulatedTree.nextAvailableLeafIndex})`);
268
- }
269
- }
270
- // Builds the inputs for the root rollup circuit, without making any changes to trees
271
- async getRootRollupInput(rollupOutputLeft, rollupProofLeft, rollupOutputRight, rollupProofRight, newL1ToL2Messages) {
272
- const vk = this.getVerificationKey(rollupOutputLeft.rollupType);
273
- const previousRollupData = [
274
- this.getPreviousRollupDataFromPublicInputs(rollupOutputLeft, rollupProofLeft, vk),
275
- this.getPreviousRollupDataFromPublicInputs(rollupOutputRight, rollupProofRight, vk),
276
- ];
277
- const getRootTreeSiblingPath = async (treeId) => {
278
- // TODO: Synchronize these operations into the tree db to avoid race conditions
279
- const { size } = await this.db.getTreeInfo(treeId);
280
- // TODO: Check for off-by-one errors
281
- const path = await this.db.getSiblingPath(treeId, size);
282
- return path.toFieldArray();
283
- };
284
- const newL1ToL2MessagesTreeRootSiblingPathArray = await this.getSubtreeSiblingPath(MerkleTreeId.L1_TO_L2_MESSAGES_TREE, L1_TO_L2_MSG_SUBTREE_HEIGHT);
285
- const newL1ToL2MessagesTreeRootSiblingPath = makeTuple(L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH, i => i < newL1ToL2MessagesTreeRootSiblingPathArray.length ? newL1ToL2MessagesTreeRootSiblingPathArray[i] : Fr.ZERO, 0);
286
- // Get tree snapshots
287
- const startL1ToL2MessagesTreeSnapshot = await this.getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGES_TREE);
288
- // Get historic block tree roots
289
- const startHistoricBlocksTreeSnapshot = await this.getTreeSnapshot(MerkleTreeId.BLOCKS_TREE);
290
- const newHistoricBlocksTreeSiblingPathArray = await getRootTreeSiblingPath(MerkleTreeId.BLOCKS_TREE);
291
- const newHistoricBlocksTreeSiblingPath = makeTuple(HISTORIC_BLOCKS_TREE_HEIGHT, i => (i < newHistoricBlocksTreeSiblingPathArray.length ? newHistoricBlocksTreeSiblingPathArray[i] : Fr.ZERO), 0);
292
- return RootRollupInputs.from({
293
- previousRollupData,
294
- newL1ToL2Messages,
295
- newL1ToL2MessagesTreeRootSiblingPath,
296
- startL1ToL2MessagesTreeSnapshot,
297
- startHistoricBlocksTreeSnapshot,
298
- newHistoricBlocksTreeSiblingPath,
299
- });
300
- }
301
- getPreviousRollupDataFromPublicInputs(rollupOutput, rollupProof, vk) {
302
- return new PreviousRollupData(rollupOutput, rollupProof, vk,
303
- // MembershipWitness for a VK tree to be implemented in the future
304
- FUTURE_NUM, new MembershipWitness(ROLLUP_VK_TREE_HEIGHT, BigInt(FUTURE_NUM), makeTuple(ROLLUP_VK_TREE_HEIGHT, () => FUTURE_FR)));
305
- }
306
- getKernelDataFor(tx) {
307
- return new PreviousKernelData(tx.data, tx.proof,
308
- // VK for the kernel circuit
309
- this.vks.privateKernelCircuit,
310
- // MembershipWitness for a VK tree to be implemented in the future
311
- FUTURE_NUM, assertLength(Array(VK_TREE_HEIGHT).fill(FUTURE_FR), VK_TREE_HEIGHT));
312
- }
313
- // Scan a tree searching for a specific value and return a membership witness proof for it
314
- async getMembershipWitnessFor(value, treeId, height) {
315
- // If this is an empty tx, then just return zeroes
316
- if (value.isZero())
317
- return this.makeEmptyMembershipWitness(height);
318
- const index = await this.db.findLeafIndex(treeId, value.toBuffer());
319
- if (index === undefined) {
320
- throw new Error(`Leaf with value ${value} not found in tree ${MerkleTreeId[treeId]}`);
321
- }
322
- const path = await this.db.getSiblingPath(treeId, index);
323
- return new MembershipWitness(height, index, assertLength(path.toFieldArray(), height));
324
- }
325
- async getHistoricTreesMembershipWitnessFor(tx) {
326
- const wasm = await CircuitsWasm.get();
327
- const blockData = tx.data.constants.blockData;
328
- const { privateDataTreeRoot, nullifierTreeRoot, contractTreeRoot, l1ToL2MessagesTreeRoot, publicDataTreeRoot } = blockData;
329
- const blockHash = computeBlockHash(wasm, blockData.globalVariablesHash, privateDataTreeRoot, nullifierTreeRoot, contractTreeRoot, l1ToL2MessagesTreeRoot, publicDataTreeRoot);
330
- return this.getMembershipWitnessFor(blockHash, MerkleTreeId.BLOCKS_TREE, HISTORIC_BLOCKS_TREE_HEIGHT);
331
- }
332
- async getConstantRollupData(globalVariables) {
333
- return ConstantRollupData.from({
334
- baseRollupVkHash: DELETE_FR,
335
- mergeRollupVkHash: DELETE_FR,
336
- privateKernelVkTreeRoot: FUTURE_FR,
337
- publicKernelVkTreeRoot: FUTURE_FR,
338
- startHistoricBlocksTreeRootsSnapshot: await this.getTreeSnapshot(MerkleTreeId.BLOCKS_TREE),
339
- globalVariables,
340
- });
341
- }
342
- async getLowNullifierInfo(nullifier) {
343
- // Return empty nullifier info for an empty tx
344
- if (nullifier.value === 0n) {
345
- return {
346
- index: 0,
347
- leafPreimage: NullifierLeafPreimage.empty(),
348
- witness: this.makeEmptyMembershipWitness(NULLIFIER_TREE_HEIGHT),
349
- };
350
- }
351
- const tree = MerkleTreeId.NULLIFIER_TREE;
352
- const prevValueIndex = await this.db.getPreviousValueIndex(tree, frToBigInt(nullifier));
353
- const prevValueInfo = await this.db.getLeafData(tree, prevValueIndex.index);
354
- if (!prevValueInfo)
355
- throw new Error(`Nullifier tree should have one initial leaf`);
356
- const prevValueSiblingPath = await this.db.getSiblingPath(tree, BigInt(prevValueIndex.index));
357
- return {
358
- index: prevValueIndex,
359
- leafPreimage: new NullifierLeafPreimage(bigintToFr(prevValueInfo.value), bigintToFr(prevValueInfo.nextValue), bigintToNum(prevValueInfo.nextIndex)),
360
- witness: new MembershipWitness(NULLIFIER_TREE_HEIGHT, BigInt(prevValueIndex.index), assertLength(prevValueSiblingPath.toFieldArray(), NULLIFIER_TREE_HEIGHT)),
361
- };
362
- }
363
- async getSubtreeSiblingPath(treeId, subtreeHeight) {
364
- const nextAvailableLeafIndex = await this.db.getTreeInfo(treeId).then(t => t.size);
365
- const fullSiblingPath = await this.db.getSiblingPath(treeId, nextAvailableLeafIndex);
366
- // Drop the first subtreeHeight items since we only care about the path to the subtree root
367
- return fullSiblingPath.getSubtreeSiblingPath(subtreeHeight).toFieldArray();
368
- }
369
- async processPublicDataUpdateRequests(tx) {
370
- const newPublicDataUpdateRequestsSiblingPaths = [];
371
- for (const publicDataUpdateRequest of tx.data.end.publicDataUpdateRequests) {
372
- const index = publicDataUpdateRequest.leafIndex.value;
373
- const path = await this.db.getSiblingPath(MerkleTreeId.PUBLIC_DATA_TREE, index);
374
- await this.db.updateLeaf(MerkleTreeId.PUBLIC_DATA_TREE, publicDataUpdateRequest.newValue.toBuffer(), index);
375
- newPublicDataUpdateRequestsSiblingPaths.push(path.toFieldArray());
376
- }
377
- return newPublicDataUpdateRequestsSiblingPaths;
378
- }
379
- async getPublicDataReadsSiblingPaths(tx) {
380
- const newPublicDataReadsSiblingPaths = [];
381
- for (const publicDataRead of tx.data.end.publicDataReads) {
382
- const index = publicDataRead.leafIndex.value;
383
- const path = await this.db.getSiblingPath(MerkleTreeId.PUBLIC_DATA_TREE, index);
384
- newPublicDataReadsSiblingPaths.push(path.toFieldArray());
385
- }
386
- return newPublicDataReadsSiblingPaths;
387
- }
388
- // Builds the base rollup inputs, updating the contract, nullifier, and data trees in the process
389
- async buildBaseRollupInput(left, right, globalVariables) {
390
- const wasm = await CircuitsWasm.get();
391
- // Get trees info before any changes hit
392
- const constants = await this.getConstantRollupData(globalVariables);
393
- const startNullifierTreeSnapshot = await this.getTreeSnapshot(MerkleTreeId.NULLIFIER_TREE);
394
- const startContractTreeSnapshot = await this.getTreeSnapshot(MerkleTreeId.CONTRACT_TREE);
395
- const startPrivateDataTreeSnapshot = await this.getTreeSnapshot(MerkleTreeId.PRIVATE_DATA_TREE);
396
- const startPublicDataTreeSnapshot = await this.getTreeSnapshot(MerkleTreeId.PUBLIC_DATA_TREE);
397
- const startHistoricBlocksTreeSnapshot = await this.getTreeSnapshot(MerkleTreeId.BLOCKS_TREE);
398
- // Get the subtree sibling paths for the circuit
399
- const newCommitmentsSubtreeSiblingPath = await this.getSubtreeSiblingPath(MerkleTreeId.PRIVATE_DATA_TREE, BaseRollupInputs.PRIVATE_DATA_SUBTREE_HEIGHT);
400
- const newContractsSubtreeSiblingPath = await this.getSubtreeSiblingPath(MerkleTreeId.CONTRACT_TREE, BaseRollupInputs.CONTRACT_SUBTREE_HEIGHT);
401
- // Update the contract and private data trees with the new items being inserted to get the new roots
402
- // that will be used by the next iteration of the base rollup circuit, skipping the empty ones
403
- const newContracts = flatMap([left, right], tx => tx.data.end.newContracts.map(cd => computeContractLeaf(wasm, cd)));
404
- const newCommitments = flatMap([left, right], tx => tx.data.end.newCommitments.map(x => x.toBuffer()));
405
- await this.db.appendLeaves(MerkleTreeId.CONTRACT_TREE, newContracts.map(x => x.toBuffer()));
406
- await this.db.appendLeaves(MerkleTreeId.PRIVATE_DATA_TREE, newCommitments);
407
- // Update the public data tree and get membership witnesses.
408
- // All public data reads are checked against the unmodified data root when the corresponding tx started,
409
- // so it's the unmodified tree for tx1, and the one after applying tx1 update request for tx2.
410
- // Update requests are checked against the tree as it is iteratively updated.
411
- // See https://github.com/AztecProtocol/aztec3-packages/issues/270#issuecomment-1522258200
412
- const leftPublicDataReadSiblingPaths = await this.getPublicDataReadsSiblingPaths(left);
413
- const leftPublicDataUpdateRequestsSiblingPaths = await this.processPublicDataUpdateRequests(left);
414
- const rightPublicDataReadSiblingPaths = await this.getPublicDataReadsSiblingPaths(right);
415
- const rightPublicDataUpdateRequestsSiblingPaths = await this.processPublicDataUpdateRequests(right);
416
- const newPublicDataReadsSiblingPaths = [...leftPublicDataReadSiblingPaths, ...rightPublicDataReadSiblingPaths];
417
- const newPublicDataUpdateRequestsSiblingPaths = [
418
- ...leftPublicDataUpdateRequestsSiblingPaths,
419
- ...rightPublicDataUpdateRequestsSiblingPaths,
420
- ];
421
- // Update the nullifier tree, capturing the low nullifier info for each individual operation
422
- const newNullifiers = [...left.data.end.newNullifiers, ...right.data.end.newNullifiers];
423
- const [nullifierWitnessLeaves, newNullifiersSubtreeSiblingPath] = await this.db.batchInsert(MerkleTreeId.NULLIFIER_TREE, newNullifiers.map(fr => fr.toBuffer()), BaseRollupInputs.NULLIFIER_SUBTREE_HEIGHT);
424
- if (nullifierWitnessLeaves === undefined) {
425
- throw new Error(`Could not craft nullifier batch insertion proofs`);
426
- }
427
- // Extract witness objects from returned data
428
- const lowNullifierMembershipWitnesses = nullifierWitnessLeaves.map(l => MembershipWitness.fromBufferArray(l.index, assertLength(l.siblingPath.toBufferArray(), NULLIFIER_TREE_HEIGHT)));
429
- return BaseRollupInputs.from({
430
- constants,
431
- startNullifierTreeSnapshot,
432
- startContractTreeSnapshot,
433
- startPrivateDataTreeSnapshot,
434
- startPublicDataTreeRoot: startPublicDataTreeSnapshot.root,
435
- startHistoricBlocksTreeSnapshot,
436
- newCommitmentsSubtreeSiblingPath,
437
- newContractsSubtreeSiblingPath,
438
- newNullifiersSubtreeSiblingPath: newNullifiersSubtreeSiblingPath.toFieldArray(),
439
- newPublicDataUpdateRequestsSiblingPaths,
440
- newPublicDataReadsSiblingPaths,
441
- lowNullifierLeafPreimages: nullifierWitnessLeaves.map(({ leafData }) => new NullifierLeafPreimage(new Fr(leafData.value), new Fr(leafData.nextValue), Number(leafData.nextIndex))),
442
- lowNullifierMembershipWitness: lowNullifierMembershipWitnesses,
443
- kernelData: [this.getKernelDataFor(left), this.getKernelDataFor(right)],
444
- historicBlocksTreeRootMembershipWitnesses: [
445
- await this.getHistoricTreesMembershipWitnessFor(left),
446
- await this.getHistoricTreesMembershipWitnessFor(right),
447
- ],
448
- });
449
- }
450
- makeEmptyMembershipWitness(height) {
451
- return new MembershipWitness(height, 0n, makeTuple(height, () => Fr.ZERO));
452
- }
453
- }
454
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29sb19ibG9ja19idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jsb2NrX2J1aWxkZXIvc29sb19ibG9ja19idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFFdEIsZ0JBQWdCLEVBQ2hCLFlBQVksRUFDWixrQkFBa0IsRUFFbEIsMkJBQTJCLEVBQzNCLDJCQUEyQixFQUMzQix3Q0FBd0MsRUFDeEMsaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDckIsbUNBQW1DLEVBQ25DLHFCQUFxQixFQUNyQixrQkFBa0IsRUFDbEIsa0JBQWtCLEVBRWxCLHFCQUFxQixFQUNyQixXQUFXLEVBQ1gsZ0JBQWdCLEVBQ2hCLHNCQUFzQixFQUN0QixjQUFjLEVBRWQsU0FBUyxHQUNWLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLDJCQUEyQixFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0csT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM3RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBUyxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0csT0FBTyxFQUF3QiwwQkFBMEIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXRGLE9BQU8s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
@@ -1,3 +0,0 @@
1
- import { type MemDown } from 'memdown';
2
- export declare const createMemDown: () => MemDown<any, any>;
3
- //# sourceMappingURL=solo_block_builder.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"solo_block_builder.test.d.ts","sourceRoot":"","sources":["../../src/block_builder/solo_block_builder.test.ts"],"names":[],"mappings":"AAkDA,OAAO,EAAE,KAAK,OAAO,EAAsB,MAAM,SAAS,CAAC;AAe3D,eAAO,MAAM,aAAa,yBAAgD,CAAC"}