@aztec/sequencer-client 0.1.0-alpha11

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 (146) hide show
  1. package/.eslintrc.cjs +1 -0
  2. package/.tsbuildinfo +1 -0
  3. package/README.md +45 -0
  4. package/dest/block_builder/index.d.ts +19 -0
  5. package/dest/block_builder/index.d.ts.map +1 -0
  6. package/dest/block_builder/index.js +2 -0
  7. package/dest/block_builder/solo_block_builder.d.ts +76 -0
  8. package/dest/block_builder/solo_block_builder.d.ts.map +1 -0
  9. package/dest/block_builder/solo_block_builder.js +453 -0
  10. package/dest/block_builder/solo_block_builder.test.d.ts +3 -0
  11. package/dest/block_builder/solo_block_builder.test.d.ts.map +1 -0
  12. package/dest/block_builder/solo_block_builder.test.js +291 -0
  13. package/dest/block_builder/types.d.ts +12 -0
  14. package/dest/block_builder/types.d.ts.map +1 -0
  15. package/dest/block_builder/types.js +2 -0
  16. package/dest/client/index.d.ts +2 -0
  17. package/dest/client/index.d.ts.map +1 -0
  18. package/dest/client/index.js +2 -0
  19. package/dest/client/sequencer-client.d.ts +32 -0
  20. package/dest/client/sequencer-client.d.ts.map +1 -0
  21. package/dest/client/sequencer-client.js +47 -0
  22. package/dest/config.d.ts +12 -0
  23. package/dest/config.d.ts.map +1 -0
  24. package/dest/config.js +25 -0
  25. package/dest/global_variable_builder/config.d.ts +19 -0
  26. package/dest/global_variable_builder/config.d.ts.map +1 -0
  27. package/dest/global_variable_builder/config.js +2 -0
  28. package/dest/global_variable_builder/global_builder.d.ts +30 -0
  29. package/dest/global_variable_builder/global_builder.d.ts.map +1 -0
  30. package/dest/global_variable_builder/global_builder.js +24 -0
  31. package/dest/global_variable_builder/index.d.ts +11 -0
  32. package/dest/global_variable_builder/index.d.ts.map +1 -0
  33. package/dest/global_variable_builder/index.js +12 -0
  34. package/dest/global_variable_builder/viem-reader.d.ts +26 -0
  35. package/dest/global_variable_builder/viem-reader.d.ts.map +1 -0
  36. package/dest/global_variable_builder/viem-reader.js +43 -0
  37. package/dest/index.d.ts +11 -0
  38. package/dest/index.d.ts.map +1 -0
  39. package/dest/index.js +12 -0
  40. package/dest/mocks/tx.d.ts +10 -0
  41. package/dest/mocks/tx.d.ts.map +1 -0
  42. package/dest/mocks/tx.js +18 -0
  43. package/dest/mocks/verification_keys.d.ts +28 -0
  44. package/dest/mocks/verification_keys.d.ts.map +1 -0
  45. package/dest/mocks/verification_keys.js +14 -0
  46. package/dest/prover/empty.d.ts +41 -0
  47. package/dest/prover/empty.d.ts.map +1 -0
  48. package/dest/prover/empty.js +57 -0
  49. package/dest/prover/index.d.ts +17 -0
  50. package/dest/prover/index.d.ts.map +1 -0
  51. package/dest/prover/index.js +2 -0
  52. package/dest/publisher/config.d.ts +33 -0
  53. package/dest/publisher/config.d.ts.map +1 -0
  54. package/dest/publisher/config.js +2 -0
  55. package/dest/publisher/index.d.ts +10 -0
  56. package/dest/publisher/index.d.ts.map +1 -0
  57. package/dest/publisher/index.js +11 -0
  58. package/dest/publisher/l1-publisher.d.ts +99 -0
  59. package/dest/publisher/l1-publisher.d.ts.map +1 -0
  60. package/dest/publisher/l1-publisher.js +154 -0
  61. package/dest/publisher/l1-publisher.test.d.ts +2 -0
  62. package/dest/publisher/l1-publisher.test.d.ts.map +1 -0
  63. package/dest/publisher/l1-publisher.test.js +58 -0
  64. package/dest/publisher/viem-tx-sender.d.ts +42 -0
  65. package/dest/publisher/viem-tx-sender.d.ts.map +1 -0
  66. package/dest/publisher/viem-tx-sender.js +115 -0
  67. package/dest/receiver.d.ts +13 -0
  68. package/dest/receiver.d.ts.map +1 -0
  69. package/dest/receiver.js +2 -0
  70. package/dest/sequencer/config.d.ts +26 -0
  71. package/dest/sequencer/config.d.ts.map +1 -0
  72. package/dest/sequencer/config.js +2 -0
  73. package/dest/sequencer/index.d.ts +4 -0
  74. package/dest/sequencer/index.d.ts.map +1 -0
  75. package/dest/sequencer/index.js +4 -0
  76. package/dest/sequencer/processed_tx.d.ts +34 -0
  77. package/dest/sequencer/processed_tx.d.ts.map +1 -0
  78. package/dest/sequencer/processed_tx.js +39 -0
  79. package/dest/sequencer/public_processor.d.ts +68 -0
  80. package/dest/sequencer/public_processor.d.ts.map +1 -0
  81. package/dest/sequencer/public_processor.js +195 -0
  82. package/dest/sequencer/public_processor.test.d.ts +2 -0
  83. package/dest/sequencer/public_processor.test.d.ts.map +1 -0
  84. package/dest/sequencer/public_processor.test.js +159 -0
  85. package/dest/sequencer/sequencer.d.ts +133 -0
  86. package/dest/sequencer/sequencer.d.ts.map +1 -0
  87. package/dest/sequencer/sequencer.js +293 -0
  88. package/dest/sequencer/sequencer.test.d.ts +2 -0
  89. package/dest/sequencer/sequencer.test.d.ts.map +1 -0
  90. package/dest/sequencer/sequencer.test.js +100 -0
  91. package/dest/sequencer/utils.d.ts +7 -0
  92. package/dest/sequencer/utils.d.ts.map +1 -0
  93. package/dest/sequencer/utils.js +9 -0
  94. package/dest/simulator/index.d.ts +42 -0
  95. package/dest/simulator/index.d.ts.map +1 -0
  96. package/dest/simulator/index.js +2 -0
  97. package/dest/simulator/public_executor.d.ts +39 -0
  98. package/dest/simulator/public_executor.d.ts.map +1 -0
  99. package/dest/simulator/public_executor.js +118 -0
  100. package/dest/simulator/public_kernel.d.ts +20 -0
  101. package/dest/simulator/public_kernel.d.ts.map +1 -0
  102. package/dest/simulator/public_kernel.js +27 -0
  103. package/dest/simulator/rollup.d.ts +33 -0
  104. package/dest/simulator/rollup.d.ts.map +1 -0
  105. package/dest/simulator/rollup.js +41 -0
  106. package/dest/utils.d.ts +12 -0
  107. package/dest/utils.d.ts.map +1 -0
  108. package/dest/utils.js +16 -0
  109. package/jest.integration.config.json +13 -0
  110. package/package.json +23 -0
  111. package/src/block_builder/index.ts +23 -0
  112. package/src/block_builder/solo_block_builder.test.ts +425 -0
  113. package/src/block_builder/solo_block_builder.ts +710 -0
  114. package/src/block_builder/types.ts +16 -0
  115. package/src/client/index.ts +1 -0
  116. package/src/client/sequencer-client.ts +79 -0
  117. package/src/config.ts +48 -0
  118. package/src/global_variable_builder/config.ts +19 -0
  119. package/src/global_variable_builder/global_builder.ts +43 -0
  120. package/src/global_variable_builder/index.ts +15 -0
  121. package/src/global_variable_builder/viem-reader.ts +63 -0
  122. package/src/index.ts +12 -0
  123. package/src/mocks/tx.ts +26 -0
  124. package/src/mocks/verification_keys.ts +36 -0
  125. package/src/prover/empty.ts +73 -0
  126. package/src/prover/index.ts +27 -0
  127. package/src/publisher/config.ts +36 -0
  128. package/src/publisher/index.ts +14 -0
  129. package/src/publisher/l1-publisher.test.ts +77 -0
  130. package/src/publisher/l1-publisher.ts +236 -0
  131. package/src/publisher/viem-tx-sender.ts +166 -0
  132. package/src/receiver.ts +13 -0
  133. package/src/sequencer/config.ts +27 -0
  134. package/src/sequencer/index.ts +3 -0
  135. package/src/sequencer/processed_tx.ts +82 -0
  136. package/src/sequencer/public_processor.test.ts +225 -0
  137. package/src/sequencer/public_processor.ts +280 -0
  138. package/src/sequencer/sequencer.test.ts +158 -0
  139. package/src/sequencer/sequencer.ts +356 -0
  140. package/src/sequencer/utils.ts +18 -0
  141. package/src/simulator/index.ts +51 -0
  142. package/src/simulator/public_executor.ts +137 -0
  143. package/src/simulator/public_kernel.ts +27 -0
  144. package/src/simulator/rollup.ts +54 -0
  145. package/src/utils.ts +16 -0
  146. package/tsconfig.json +38 -0
@@ -0,0 +1,291 @@
1
+ import { AppendOnlyTreeSnapshot, BaseRollupInputs, CircuitsWasm, Fr, GlobalVariables, KERNEL_NEW_COMMITMENTS_LENGTH, KERNEL_NEW_L2_TO_L1_MSGS_LENGTH, KERNEL_NEW_NULLIFIERS_LENGTH, KERNEL_PUBLIC_CALL_STACK_LENGTH, KERNEL_PUBLIC_DATA_UPDATE_REQUESTS_LENGTH, KernelCircuitPublicInputs, NULLIFIER_TREE_HEIGHT, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, Proof, PublicDataUpdateRequest, makeTuple, range, } from '@aztec/circuits.js';
2
+ import { computeContractLeaf } from '@aztec/circuits.js/abis';
3
+ import { fr, makeBaseOrMergeRollupPublicInputs, makeKernelPublicInputs, makeNewContractData, makeProof, makePublicCallRequest, makeRootRollupPublicInputs, } from '@aztec/circuits.js/factories';
4
+ import { toBufferBE } from '@aztec/foundation/bigint-buffer';
5
+ import { ContractData, L2Block, L2BlockL2Logs, MerkleTreeId, PublicDataWrite, Tx, TxL2Logs } from '@aztec/types';
6
+ import { MerkleTrees } from '@aztec/world-state';
7
+ import { mock } from 'jest-mock-extended';
8
+ import { default as levelup } from 'levelup';
9
+ import flatMap from 'lodash.flatmap';
10
+ import times from 'lodash.times';
11
+ import { default as memdown } from 'memdown';
12
+ import { makeEmptyLogs, makeTx } from '../mocks/tx.js';
13
+ import { getVerificationKeys } from '../mocks/verification_keys.js';
14
+ import { EmptyRollupProver } from '../prover/empty.js';
15
+ import { makeEmptyProcessedTx as makeEmptyProcessedTxFromHistoricTreeRoots, makeProcessedTx, } from '../sequencer/processed_tx.js';
16
+ import { getCombinedHistoricTreeRoots } from '../sequencer/utils.js';
17
+ import { WasmRollupCircuitSimulator } from '../simulator/rollup.js';
18
+ import { SoloBlockBuilder } from './solo_block_builder.js';
19
+ import { to2Fields } from '@aztec/foundation/serialize';
20
+ export const createMemDown = () => memdown();
21
+ describe('sequencer/solo_block_builder', () => {
22
+ let builder;
23
+ let builderDb;
24
+ let expectsDb;
25
+ let vks;
26
+ let simulator;
27
+ let prover;
28
+ let blockNumber;
29
+ let baseRollupOutputLeft;
30
+ let baseRollupOutputRight;
31
+ let rootRollupOutput;
32
+ let mockL1ToL2Messages;
33
+ let wasm;
34
+ let globalVariables;
35
+ const emptyProof = new Proof(Buffer.alloc(32, 0));
36
+ const chainId = Fr.ZERO;
37
+ const version = Fr.ZERO;
38
+ beforeAll(async () => {
39
+ wasm = await CircuitsWasm.get();
40
+ });
41
+ beforeEach(async () => {
42
+ blockNumber = 3;
43
+ globalVariables = new GlobalVariables(chainId, version, new Fr(blockNumber), Fr.ZERO);
44
+ builderDb = await MerkleTrees.new(levelup(createMemDown())).then(t => t.asLatest());
45
+ expectsDb = await MerkleTrees.new(levelup(createMemDown())).then(t => t.asLatest());
46
+ vks = getVerificationKeys();
47
+ simulator = mock();
48
+ prover = mock();
49
+ builder = new SoloBlockBuilder(builderDb, vks, simulator, prover);
50
+ // Create mock l1 to L2 messages
51
+ mockL1ToL2Messages = new Array(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP).fill(new Fr(0n));
52
+ // Create mock outputs for simulator
53
+ baseRollupOutputLeft = makeBaseOrMergeRollupPublicInputs();
54
+ baseRollupOutputRight = makeBaseOrMergeRollupPublicInputs();
55
+ rootRollupOutput = makeRootRollupPublicInputs();
56
+ // Set up mocks
57
+ prover.getBaseRollupProof.mockResolvedValue(emptyProof);
58
+ prover.getRootRollupProof.mockResolvedValue(emptyProof);
59
+ simulator.baseRollupCircuit
60
+ .mockResolvedValueOnce(baseRollupOutputLeft)
61
+ .mockResolvedValueOnce(baseRollupOutputRight);
62
+ simulator.rootRollupCircuit.mockResolvedValue(rootRollupOutput);
63
+ }, 20000);
64
+ const makeEmptyProcessedTx = async () => {
65
+ const historicTreeRoots = await getCombinedHistoricTreeRoots(builderDb);
66
+ return makeEmptyProcessedTxFromHistoricTreeRoots(historicTreeRoots, chainId, version);
67
+ };
68
+ // Updates the expectedDb trees based on the new commitments, contracts, and nullifiers from these txs
69
+ const updateExpectedTreesFromTxs = async (txs) => {
70
+ const newContracts = flatMap(txs, tx => tx.data.end.newContracts.map(n => computeContractLeaf(wasm, n)));
71
+ for (const [tree, leaves] of [
72
+ [MerkleTreeId.PRIVATE_DATA_TREE, flatMap(txs, tx => tx.data.end.newCommitments.map(l => l.toBuffer()))],
73
+ [MerkleTreeId.CONTRACT_TREE, newContracts.map(x => x.toBuffer())],
74
+ [MerkleTreeId.NULLIFIER_TREE, flatMap(txs, tx => tx.data.end.newNullifiers.map(x => x.toBuffer()))],
75
+ ]) {
76
+ await expectsDb.appendLeaves(tree, leaves);
77
+ }
78
+ for (const write of txs.flatMap(tx => tx.data.end.publicDataUpdateRequests)) {
79
+ await expectsDb.updateLeaf(MerkleTreeId.PUBLIC_DATA_TREE, write.newValue.toBuffer(), write.leafIndex.value);
80
+ }
81
+ };
82
+ const updateL1ToL2MessagesTree = async (l1ToL2Messages) => {
83
+ const asBuffer = l1ToL2Messages.map(m => m.toBuffer());
84
+ await expectsDb.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGES_TREE, asBuffer);
85
+ };
86
+ const getTreeSnapshot = async (tree) => {
87
+ const treeInfo = await expectsDb.getTreeInfo(tree);
88
+ return new AppendOnlyTreeSnapshot(Fr.fromBuffer(treeInfo.root), Number(treeInfo.size));
89
+ };
90
+ const buildMockSimulatorInputs = async () => {
91
+ const kernelOutput = makeKernelPublicInputs();
92
+ kernelOutput.constants.historicTreeRoots = await getCombinedHistoricTreeRoots(expectsDb);
93
+ const tx = await makeProcessedTx(new Tx(kernelOutput, emptyProof, makeEmptyLogs(), makeEmptyLogs(), [], times(KERNEL_PUBLIC_CALL_STACK_LENGTH, makePublicCallRequest)));
94
+ const txsLeft = [tx, await makeEmptyProcessedTx()];
95
+ const txsRight = [await makeEmptyProcessedTx(), await makeEmptyProcessedTx()];
96
+ // Calculate what would be the tree roots after the txs from the first base rollup land and update mock circuit output
97
+ await updateExpectedTreesFromTxs(txsLeft);
98
+ baseRollupOutputLeft.endContractTreeSnapshot = await getTreeSnapshot(MerkleTreeId.CONTRACT_TREE);
99
+ baseRollupOutputLeft.endNullifierTreeSnapshot = await getTreeSnapshot(MerkleTreeId.NULLIFIER_TREE);
100
+ baseRollupOutputLeft.endPrivateDataTreeSnapshot = await getTreeSnapshot(MerkleTreeId.PRIVATE_DATA_TREE);
101
+ baseRollupOutputLeft.endPublicDataTreeRoot = (await getTreeSnapshot(MerkleTreeId.PUBLIC_DATA_TREE)).root;
102
+ // Same for the two txs on the right
103
+ await updateExpectedTreesFromTxs(txsRight);
104
+ baseRollupOutputRight.endContractTreeSnapshot = await getTreeSnapshot(MerkleTreeId.CONTRACT_TREE);
105
+ baseRollupOutputRight.endNullifierTreeSnapshot = await getTreeSnapshot(MerkleTreeId.NULLIFIER_TREE);
106
+ baseRollupOutputRight.endPrivateDataTreeSnapshot = await getTreeSnapshot(MerkleTreeId.PRIVATE_DATA_TREE);
107
+ baseRollupOutputRight.endPublicDataTreeRoot = (await getTreeSnapshot(MerkleTreeId.PUBLIC_DATA_TREE)).root;
108
+ // Update l1 to l2 data tree
109
+ // And update the root trees now to create proper output to the root rollup circuit
110
+ await updateL1ToL2MessagesTree(mockL1ToL2Messages);
111
+ await expectsDb.updateHistoricRootsTrees();
112
+ rootRollupOutput.endContractTreeSnapshot = await getTreeSnapshot(MerkleTreeId.CONTRACT_TREE);
113
+ rootRollupOutput.endNullifierTreeSnapshot = await getTreeSnapshot(MerkleTreeId.NULLIFIER_TREE);
114
+ rootRollupOutput.endPrivateDataTreeSnapshot = await getTreeSnapshot(MerkleTreeId.PRIVATE_DATA_TREE);
115
+ rootRollupOutput.endPublicDataTreeRoot = (await getTreeSnapshot(MerkleTreeId.PUBLIC_DATA_TREE)).root;
116
+ rootRollupOutput.endTreeOfHistoricContractTreeRootsSnapshot = await getTreeSnapshot(MerkleTreeId.CONTRACT_TREE_ROOTS_TREE);
117
+ rootRollupOutput.endTreeOfHistoricPrivateDataTreeRootsSnapshot = await getTreeSnapshot(MerkleTreeId.PRIVATE_DATA_TREE_ROOTS_TREE);
118
+ rootRollupOutput.endL1ToL2MessageTreeSnapshot = await getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGES_TREE);
119
+ rootRollupOutput.endTreeOfHistoricL1ToL2MessageTreeRootsSnapshot = await getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGES_ROOTS_TREE);
120
+ const txs = [...txsLeft, ...txsRight];
121
+ const newNullifiers = flatMap(txs, tx => tx.data.end.newNullifiers);
122
+ const newCommitments = flatMap(txs, tx => tx.data.end.newCommitments);
123
+ const newContracts = flatMap(txs, tx => tx.data.end.newContracts).map(cd => computeContractLeaf(wasm, cd));
124
+ const newContractData = flatMap(txs, tx => tx.data.end.newContracts).map(n => new ContractData(n.contractAddress, n.portalContractAddress));
125
+ const newPublicDataWrites = flatMap(txs, tx => tx.data.end.publicDataUpdateRequests.map(t => new PublicDataWrite(t.leafIndex, t.newValue)));
126
+ const newL2ToL1Msgs = flatMap(txs, tx => tx.data.end.newL2ToL1Msgs);
127
+ const newEncryptedLogs = new L2BlockL2Logs(txs.map(tx => tx.encryptedLogs || new TxL2Logs([])));
128
+ const newUnencryptedLogs = new L2BlockL2Logs(txs.map(tx => tx.unencryptedLogs || new TxL2Logs([])));
129
+ const l2Block = L2Block.fromFields({
130
+ number: blockNumber,
131
+ globalVariables: rootRollupOutput.globalVariables,
132
+ startPrivateDataTreeSnapshot: rootRollupOutput.startPrivateDataTreeSnapshot,
133
+ endPrivateDataTreeSnapshot: rootRollupOutput.endPrivateDataTreeSnapshot,
134
+ startNullifierTreeSnapshot: rootRollupOutput.startNullifierTreeSnapshot,
135
+ endNullifierTreeSnapshot: rootRollupOutput.endNullifierTreeSnapshot,
136
+ startContractTreeSnapshot: rootRollupOutput.startContractTreeSnapshot,
137
+ endContractTreeSnapshot: rootRollupOutput.endContractTreeSnapshot,
138
+ startPublicDataTreeRoot: rootRollupOutput.startPublicDataTreeRoot,
139
+ endPublicDataTreeRoot: rootRollupOutput.endPublicDataTreeRoot,
140
+ startTreeOfHistoricPrivateDataTreeRootsSnapshot: rootRollupOutput.startTreeOfHistoricPrivateDataTreeRootsSnapshot,
141
+ endTreeOfHistoricPrivateDataTreeRootsSnapshot: rootRollupOutput.endTreeOfHistoricPrivateDataTreeRootsSnapshot,
142
+ startTreeOfHistoricContractTreeRootsSnapshot: rootRollupOutput.startTreeOfHistoricContractTreeRootsSnapshot,
143
+ endTreeOfHistoricContractTreeRootsSnapshot: rootRollupOutput.endTreeOfHistoricContractTreeRootsSnapshot,
144
+ startL1ToL2MessageTreeSnapshot: rootRollupOutput.startL1ToL2MessageTreeSnapshot,
145
+ endL1ToL2MessageTreeSnapshot: rootRollupOutput.endL1ToL2MessageTreeSnapshot,
146
+ startTreeOfHistoricL1ToL2MessageTreeRootsSnapshot: rootRollupOutput.startTreeOfHistoricL1ToL2MessageTreeRootsSnapshot,
147
+ endTreeOfHistoricL1ToL2MessageTreeRootsSnapshot: rootRollupOutput.endTreeOfHistoricL1ToL2MessageTreeRootsSnapshot,
148
+ newCommitments,
149
+ newNullifiers,
150
+ newContracts,
151
+ newContractData,
152
+ newPublicDataWrites,
153
+ newL1ToL2Messages: mockL1ToL2Messages,
154
+ newL2ToL1Msgs,
155
+ newEncryptedLogs,
156
+ newUnencryptedLogs,
157
+ });
158
+ const callDataHash = l2Block.getCalldataHash();
159
+ const high = Fr.fromBuffer(callDataHash.slice(0, 16));
160
+ const low = Fr.fromBuffer(callDataHash.slice(16, 32));
161
+ rootRollupOutput.calldataHash = [high, low];
162
+ return txs;
163
+ };
164
+ describe('mock simulator', () => {
165
+ beforeEach(() => {
166
+ // Create instance to test
167
+ builder = new SoloBlockBuilder(builderDb, vks, simulator, prover);
168
+ });
169
+ it('builds an L2 block using mock simulator', async () => {
170
+ // Assemble a fake transaction
171
+ const txs = await buildMockSimulatorInputs();
172
+ // Actually build a block!
173
+ const [l2Block, proof] = await builder.buildL2Block(globalVariables, txs, mockL1ToL2Messages);
174
+ expect(l2Block.number).toEqual(blockNumber);
175
+ expect(proof).toEqual(emptyProof);
176
+ }, 20000);
177
+ // For varying orders of insertions assert the local batch insertion generator creates the correct proofs
178
+ it.each([
179
+ // These are arbitrary but it needs to be higher than the constant `INITIAL_NULLIFIER_TREE_SIZE` and `KERNEL_NEW_NULLIFIERS_LENGTH * 2`
180
+ [[1003, 1002, 1001, 1000, 0, 0, 0, 0]],
181
+ [[1003, 1004, 1005, 1006, 0, 0, 0, 0]],
182
+ [[1234, 1098, 0, 0, 99999, 1096, 1054, 0]],
183
+ [[1970, 1980, 1040, 0, 99999, 1880, 100001, 9000000]],
184
+ ])('performs nullifier tree batch insertion correctly', async (nullifiers) => {
185
+ const leaves = nullifiers.map(i => toBufferBE(BigInt(i), 32));
186
+ await expectsDb.appendLeaves(MerkleTreeId.NULLIFIER_TREE, leaves);
187
+ await builderDb.batchInsert(MerkleTreeId.NULLIFIER_TREE, leaves, NULLIFIER_TREE_HEIGHT, BaseRollupInputs.NULLIFIER_SUBTREE_HEIGHT);
188
+ const expected = await expectsDb.getTreeInfo(MerkleTreeId.NULLIFIER_TREE);
189
+ const actual = await builderDb.getTreeInfo(MerkleTreeId.NULLIFIER_TREE);
190
+ expect(actual).toEqual(expected);
191
+ });
192
+ it('rejects if too many l1 to l2 messages are provided', async () => {
193
+ // Assemble a fake transaction
194
+ const txs = await buildMockSimulatorInputs();
195
+ const l1ToL2Messages = new Array(100).fill(new Fr(0n));
196
+ await expect(builder.buildL2Block(globalVariables, txs, l1ToL2Messages)).rejects.toThrow();
197
+ });
198
+ });
199
+ describe('circuits simulator', () => {
200
+ beforeEach(async () => {
201
+ const simulator = await WasmRollupCircuitSimulator.new();
202
+ const prover = new EmptyRollupProver();
203
+ builder = new SoloBlockBuilder(builderDb, vks, simulator, prover);
204
+ });
205
+ const makeContractDeployProcessedTx = async (seed = 0x1) => {
206
+ const tx = await makeEmptyProcessedTx();
207
+ tx.data.end.newContracts = [makeNewContractData(seed + 0x1000)];
208
+ return tx;
209
+ };
210
+ const makeBloatedProcessedTx = async (seed = 0x1) => {
211
+ const tx = makeTx(seed);
212
+ const kernelOutput = KernelCircuitPublicInputs.empty();
213
+ kernelOutput.constants.historicTreeRoots = await getCombinedHistoricTreeRoots(builderDb);
214
+ kernelOutput.end.publicDataUpdateRequests = makeTuple(KERNEL_PUBLIC_DATA_UPDATE_REQUESTS_LENGTH, i => new PublicDataUpdateRequest(fr(i), fr(0), fr(i + 10)), seed + 0x500);
215
+ const processedTx = await makeProcessedTx(tx, kernelOutput, makeProof());
216
+ processedTx.data.end.newCommitments = makeTuple(KERNEL_NEW_COMMITMENTS_LENGTH, fr, seed + 0x100);
217
+ processedTx.data.end.newNullifiers = makeTuple(KERNEL_NEW_NULLIFIERS_LENGTH, fr, seed + 0x200);
218
+ processedTx.data.end.newNullifiers[tx.data.end.newNullifiers.length - 1] = Fr.ZERO;
219
+ processedTx.data.end.newL2ToL1Msgs = makeTuple(KERNEL_NEW_L2_TO_L1_MSGS_LENGTH, fr, seed + 0x300);
220
+ processedTx.data.end.newContracts = [makeNewContractData(seed + 0x1000)];
221
+ processedTx.data.end.encryptedLogsHash = to2Fields(L2Block.computeKernelLogsHash(processedTx.encryptedLogs));
222
+ processedTx.data.end.unencryptedLogsHash = to2Fields(L2Block.computeKernelLogsHash(processedTx.unencryptedLogs));
223
+ return processedTx;
224
+ };
225
+ it.each([
226
+ [0, 4],
227
+ [1, 4],
228
+ [4, 4],
229
+ [0, 16],
230
+ [16, 16],
231
+ ])('builds an L2 block with %i contract deploy txs and %i txs total', async (deployCount, totalCount) => {
232
+ const contractTreeBefore = await builderDb.getTreeInfo(MerkleTreeId.CONTRACT_TREE);
233
+ const txs = [
234
+ ...(await Promise.all(times(deployCount, makeContractDeployProcessedTx))),
235
+ ...(await Promise.all(times(totalCount - deployCount, makeEmptyProcessedTx))),
236
+ ];
237
+ const [l2Block] = await builder.buildL2Block(globalVariables, txs, mockL1ToL2Messages);
238
+ expect(l2Block.number).toEqual(blockNumber);
239
+ await updateExpectedTreesFromTxs(txs);
240
+ const contractTreeAfter = await builderDb.getTreeInfo(MerkleTreeId.CONTRACT_TREE);
241
+ if (deployCount > 0) {
242
+ expect(contractTreeAfter.root).not.toEqual(contractTreeBefore.root);
243
+ }
244
+ const expectedContractTreeAfter = await expectsDb.getTreeInfo(MerkleTreeId.CONTRACT_TREE).then(t => t.root);
245
+ expect(contractTreeAfter.root).toEqual(expectedContractTreeAfter);
246
+ expect(contractTreeAfter.size).toEqual(BigInt(totalCount));
247
+ }, 10000);
248
+ it('builds an empty L2 block', async () => {
249
+ const txs = await Promise.all([
250
+ makeEmptyProcessedTx(),
251
+ makeEmptyProcessedTx(),
252
+ makeEmptyProcessedTx(),
253
+ makeEmptyProcessedTx(),
254
+ ]);
255
+ const [l2Block] = await builder.buildL2Block(globalVariables, txs, mockL1ToL2Messages);
256
+ expect(l2Block.number).toEqual(blockNumber);
257
+ }, 10000);
258
+ it('builds a mixed L2 block', async () => {
259
+ const txs = await Promise.all([
260
+ makeBloatedProcessedTx(32),
261
+ makeBloatedProcessedTx(64),
262
+ makeBloatedProcessedTx(96),
263
+ makeBloatedProcessedTx(128),
264
+ ]);
265
+ const l1ToL2Messages = range(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, 1 + 0x400).map(fr);
266
+ const [l2Block] = await builder.buildL2Block(globalVariables, txs, l1ToL2Messages);
267
+ expect(l2Block.number).toEqual(blockNumber);
268
+ }, 20000);
269
+ // This test specifically tests nullifier values which previously caused e2e_zk_token test to fail
270
+ it('e2e_zk_token edge case regression test on nullifier values', async () => {
271
+ const simulator = await WasmRollupCircuitSimulator.new();
272
+ const prover = new EmptyRollupProver();
273
+ builder = new SoloBlockBuilder(builderDb, vks, simulator, prover);
274
+ // update the starting tree
275
+ const updateVals = Array(4 * KERNEL_NEW_NULLIFIERS_LENGTH).fill(0n);
276
+ updateVals[0] = 19777494491628650244807463906174285795660759352776418619064841306523677458742n;
277
+ updateVals[1] = 10246291467305176436335175657884940686778521321101740385288169037814567547848n;
278
+ await builderDb.appendLeaves(MerkleTreeId.NULLIFIER_TREE, updateVals.map(v => toBufferBE(v, 32)));
279
+ // new added values
280
+ const tx = await makeEmptyProcessedTx();
281
+ tx.data.end.newNullifiers[0] = new Fr(10336601644835972678500657502133589897705389664587188571002640950065546264856n);
282
+ tx.data.end.newNullifiers[1] = new Fr(17490072961923661940560522096125238013953043065748521735636170028491723851741n);
283
+ const txs = [tx, await makeEmptyProcessedTx(), await makeEmptyProcessedTx(), await makeEmptyProcessedTx()];
284
+ const [l2Block] = await builder.buildL2Block(globalVariables, txs, mockL1ToL2Messages);
285
+ expect(l2Block.number).toEqual(blockNumber);
286
+ }, 10000);
287
+ });
288
+ // describe("Input guard tests", () => {
289
+ // })
290
+ });
291
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29sb19ibG9ja19idWlsZGVyLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmxvY2tfYnVpbGRlci9zb2xvX2Jsb2NrX2J1aWxkZXIudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsc0JBQXNCLEVBRXRCLGdCQUFnQixFQUNoQixZQUFZLEVBQ1osRUFBRSxFQUNGLGVBQWUsRUFDZiw2QkFBNkIsRUFDN0IsK0JBQStCLEVBQy9CLDRCQUE0QixFQUM1QiwrQkFBK0IsRUFDL0IseUNBQXlDLEVBQ3pDLHlCQUF5QixFQUN6QixxQkFBcUIsRUFDckIsbUNBQW1DLEVBQ25DLEtBQUssRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULEtBQUssR0FDTixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFDTCxFQUFFLEVBQ0YsaUNBQWlDLEVBQ2pDLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsU0FBUyxFQUNULHFCQUFxQixFQUNyQiwwQkFBMEIsR0FDM0IsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNqSCxPQUFPLEVBQXdCLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3ZFLE9BQU8sRUFBYSxJQUFJLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsT0FBTyxJQUFJLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM3QyxPQUFPLE9BQU8sTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEtBQUssTUFBTSxjQUFjLENBQUM7QUFD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
@@ -0,0 +1,12 @@
1
+ import { AppendOnlyTreeSnapshot, BaseOrMergeRollupPublicInputs, RootRollupPublicInputs } from '@aztec/circuits.js';
2
+ /**
3
+ * Type to assert that only the correct trees are checked when validating rollup tree outputs.
4
+ */
5
+ export type AllowedTreeNames<T extends BaseOrMergeRollupPublicInputs | RootRollupPublicInputs> = T extends RootRollupPublicInputs ? 'PrivateData' | 'Contract' | 'Nullifier' | 'L1ToL2Message' : 'PrivateData' | 'Contract' | 'Nullifier';
6
+ /**
7
+ * Type to assert the correct object field is indexed when validating rollup tree outputs.
8
+ */
9
+ export type OutputWithTreeSnapshot<T extends BaseOrMergeRollupPublicInputs | RootRollupPublicInputs> = {
10
+ [K in `end${AllowedTreeNames<T>}TreeSnapshot`]: AppendOnlyTreeSnapshot;
11
+ };
12
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +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,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,6BAA6B,GAAG,sBAAsB,IAC3F,CAAC,SAAS,sBAAsB,GAC5B,aAAa,GAAG,UAAU,GAAG,WAAW,GAAG,eAAe,GAC1D,aAAa,GAAG,UAAU,GAAG,WAAW,CAAC;AAE/C;;GAEG;AACH,MAAM,MAAM,sBAAsB,CAAC,CAAC,SAAS,6BAA6B,GAAG,sBAAsB,IAAI;KACpG,CAAC,IAAI,MAAM,gBAAgB,CAAC,CAAC,CAAC,cAAc,GAAG,sBAAsB;CACvE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmxvY2tfYnVpbGRlci90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -0,0 +1,2 @@
1
+ export * from './sequencer-client.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './sequencer-client.js';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsdUJBQXVCLENBQUMifQ==
@@ -0,0 +1,32 @@
1
+ import { P2P } from '@aztec/p2p';
2
+ import { WorldStateSynchroniser } from '@aztec/world-state';
3
+ import { ContractDataSource, L1ToL2MessageSource, L2BlockSource } from '@aztec/types';
4
+ import { SequencerClientConfig } from '../config.js';
5
+ import { Sequencer } from '../index.js';
6
+ /**
7
+ * Encapsulates the full sequencer and publisher.
8
+ */
9
+ export declare class SequencerClient {
10
+ private sequencer;
11
+ constructor(sequencer: Sequencer);
12
+ /**
13
+ * Initializes and starts a new instance.
14
+ * @param config - Configuration for the sequencer, publisher, and L1 tx sender.
15
+ * @param p2pClient - P2P client that provides the txs to be sequenced.
16
+ * @param worldStateSynchroniser - Provides access to world state.
17
+ * @param contractDataSource - Provides access to contract bytecode for public executions.
18
+ * @param l2BlockSource - Provides information about the previously published blocks.
19
+ * @param l1ToL2MessageSource - Provides access to L1 to L2 messages.
20
+ * @returns A new running instance.
21
+ */
22
+ static new(config: SequencerClientConfig, p2pClient: P2P, worldStateSynchroniser: WorldStateSynchroniser, contractDataSource: ContractDataSource, l2BlockSource: L2BlockSource, l1ToL2MessageSource: L1ToL2MessageSource): Promise<SequencerClient>;
23
+ /**
24
+ * Stops the sequencer from processing new txs.
25
+ */
26
+ stop(): Promise<void>;
27
+ /**
28
+ * Restarts the sequencer after being stopped.
29
+ */
30
+ restart(): void;
31
+ }
32
+ //# sourceMappingURL=sequencer-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sequencer-client.d.ts","sourceRoot":"","sources":["../../src/client/sequencer-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAEtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAuC,SAAS,EAAE,MAAM,aAAa,CAAC;AAM7E;;GAEG;AACH,qBAAa,eAAe;IACd,OAAO,CAAC,SAAS;gBAAT,SAAS,EAAE,SAAS;IAExC;;;;;;;;;OASG;WACiB,GAAG,CACrB,MAAM,EAAE,qBAAqB,EAC7B,SAAS,EAAE,GAAG,EACd,sBAAsB,EAAE,sBAAsB,EAC9C,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,EAAE,aAAa,EAC5B,mBAAmB,EAAE,mBAAmB;IA+B1C;;OAEG;IACU,IAAI;IAIjB;;OAEG;IACI,OAAO;CAGf"}
@@ -0,0 +1,47 @@
1
+ import { SoloBlockBuilder } from '../block_builder/solo_block_builder.js';
2
+ import { getL1Publisher, getVerificationKeys, Sequencer } from '../index.js';
3
+ import { EmptyRollupProver } from '../prover/empty.js';
4
+ import { PublicProcessorFactory } from '../sequencer/public_processor.js';
5
+ import { WasmRollupCircuitSimulator } from '../simulator/rollup.js';
6
+ import { getGlobalVariableBuilder } from '../global_variable_builder/index.js';
7
+ /**
8
+ * Encapsulates the full sequencer and publisher.
9
+ */
10
+ export class SequencerClient {
11
+ constructor(sequencer) {
12
+ this.sequencer = sequencer;
13
+ }
14
+ /**
15
+ * Initializes and starts a new instance.
16
+ * @param config - Configuration for the sequencer, publisher, and L1 tx sender.
17
+ * @param p2pClient - P2P client that provides the txs to be sequenced.
18
+ * @param worldStateSynchroniser - Provides access to world state.
19
+ * @param contractDataSource - Provides access to contract bytecode for public executions.
20
+ * @param l2BlockSource - Provides information about the previously published blocks.
21
+ * @param l1ToL2MessageSource - Provides access to L1 to L2 messages.
22
+ * @returns A new running instance.
23
+ */
24
+ static async new(config, p2pClient, worldStateSynchroniser, contractDataSource, l2BlockSource, l1ToL2MessageSource) {
25
+ const publisher = getL1Publisher(config);
26
+ const globalsBuilder = getGlobalVariableBuilder(config);
27
+ const merkleTreeDb = worldStateSynchroniser.getLatest();
28
+ const blockBuilder = new SoloBlockBuilder(merkleTreeDb, getVerificationKeys(), await WasmRollupCircuitSimulator.new(), new EmptyRollupProver());
29
+ const publicProcessorFactory = new PublicProcessorFactory(merkleTreeDb, contractDataSource, l1ToL2MessageSource);
30
+ const sequencer = new Sequencer(publisher, globalsBuilder, p2pClient, worldStateSynchroniser, blockBuilder, l2BlockSource, l1ToL2MessageSource, publicProcessorFactory, config);
31
+ await sequencer.start();
32
+ return new SequencerClient(sequencer);
33
+ }
34
+ /**
35
+ * Stops the sequencer from processing new txs.
36
+ */
37
+ async stop() {
38
+ await this.sequencer.stop();
39
+ }
40
+ /**
41
+ * Restarts the sequencer after being stopped.
42
+ */
43
+ restart() {
44
+ this.sequencer.restart();
45
+ }
46
+ }
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxdWVuY2VyLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGllbnQvc2VxdWVuY2VyLWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUUxRSxPQUFPLEVBQUUsY0FBYyxFQUFFLG1CQUFtQixFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM3RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxRSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUUvRTs7R0FFRztBQUNILE1BQU0sT0FBTyxlQUFlO0lBQzFCLFlBQW9CLFNBQW9CO1FBQXBCLGNBQVMsR0FBVCxTQUFTLENBQVc7SUFBRyxDQUFDO0lBRTVDOzs7Ozs7Ozs7T0FTRztJQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUNyQixNQUE2QixFQUM3QixTQUFjLEVBQ2Qsc0JBQThDLEVBQzlDLGtCQUFzQyxFQUN0QyxhQUE0QixFQUM1QixtQkFBd0M7UUFFeEMsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sY0FBYyxHQUFHLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hELE1BQU0sWUFBWSxHQUFHLHNCQUFzQixDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRXhELE1BQU0sWUFBWSxHQUFHLElBQUksZ0JBQWdCLENBQ3ZDLFlBQVksRUFDWixtQkFBbUIsRUFBRSxFQUNyQixNQUFNLDBCQUEwQixDQUFDLEdBQUcsRUFBRSxFQUN0QyxJQUFJLGlCQUFpQixFQUFFLENBQ3hCLENBQUM7UUFFRixNQUFNLHNCQUFzQixHQUFHLElBQUksc0JBQXNCLENBQUMsWUFBWSxFQUFFLGtCQUFrQixFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFFakgsTUFBTSxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQzdCLFNBQVMsRUFDVCxjQUFjLEVBQ2QsU0FBUyxFQUNULHNCQUFzQixFQUN0QixZQUFZLEVBQ1osYUFBYSxFQUNiLG1CQUFtQixFQUNuQixzQkFBc0IsRUFDdEIsTUFBTSxDQUNQLENBQUM7UUFFRixNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4QixPQUFPLElBQUksZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxJQUFJO1FBQ2YsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRDs7T0FFRztJQUNJLE9BQU87UUFDWixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7Q0FDRiJ9
@@ -0,0 +1,12 @@
1
+ import { SequencerConfig } from './sequencer/config.js';
2
+ import { PublisherConfig, TxSenderConfig } from './publisher/config.js';
3
+ import { GlobalReaderConfig } from './global_variable_builder/index.js';
4
+ /**
5
+ * Configuration settings for the SequencerClient.
6
+ */
7
+ export type SequencerClientConfig = PublisherConfig & TxSenderConfig & SequencerConfig & GlobalReaderConfig;
8
+ /**
9
+ * Creates an instance of SequencerClientConfig out of environment variables using sensible defaults for integration testing if not set.
10
+ */
11
+ export declare function getConfigEnvVars(): SequencerClientConfig;
12
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAExE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAExE;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,eAAe,GAAG,cAAc,GAAG,eAAe,GAAG,kBAAkB,CAAC;AAE5G;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,qBAAqB,CAkCxD"}
package/dest/config.js ADDED
@@ -0,0 +1,25 @@
1
+ import { EthAddress } from '@aztec/foundation/eth-address';
2
+ /**
3
+ * Creates an instance of SequencerClientConfig out of environment variables using sensible defaults for integration testing if not set.
4
+ */
5
+ export function getConfigEnvVars() {
6
+ const { SEQ_PUBLISHER_PRIVATE_KEY, ETHEREUM_HOST, CHAIN_ID, VERSION, API_KEY, SEQ_REQUIRED_CONFS, SEQ_RETRY_INTERVAL, SEQ_TX_POLLING_INTERVAL, SEQ_MAX_TX_PER_BLOCK, SEQ_MIN_TX_PER_BLOCK, ROLLUP_CONTRACT_ADDRESS, INBOX_CONTRACT_ADDRESS, CONTRACT_DEPLOYMENT_EMITTER_ADDRESS, } = process.env;
7
+ return {
8
+ rpcUrl: ETHEREUM_HOST ? ETHEREUM_HOST : '',
9
+ chainId: CHAIN_ID ? +CHAIN_ID : 31337,
10
+ version: VERSION ? +VERSION : 1,
11
+ apiKey: API_KEY,
12
+ requiredConfirmations: SEQ_REQUIRED_CONFS ? +SEQ_REQUIRED_CONFS : 1,
13
+ retryIntervalMs: SEQ_RETRY_INTERVAL ? +SEQ_RETRY_INTERVAL : 1000,
14
+ transactionPollingInterval: SEQ_TX_POLLING_INTERVAL ? +SEQ_TX_POLLING_INTERVAL : 1000,
15
+ rollupContract: ROLLUP_CONTRACT_ADDRESS ? EthAddress.fromString(ROLLUP_CONTRACT_ADDRESS) : EthAddress.ZERO,
16
+ inboxContract: INBOX_CONTRACT_ADDRESS ? EthAddress.fromString(INBOX_CONTRACT_ADDRESS) : EthAddress.ZERO,
17
+ contractDeploymentEmitterContract: CONTRACT_DEPLOYMENT_EMITTER_ADDRESS
18
+ ? EthAddress.fromString(CONTRACT_DEPLOYMENT_EMITTER_ADDRESS)
19
+ : EthAddress.ZERO,
20
+ publisherPrivateKey: Buffer.from(SEQ_PUBLISHER_PRIVATE_KEY || '', 'hex'),
21
+ maxTxsPerBlock: SEQ_MAX_TX_PER_BLOCK ? +SEQ_MAX_TX_PER_BLOCK : 32,
22
+ minTxsPerBlock: SEQ_MIN_TX_PER_BLOCK ? +SEQ_MIN_TX_PER_BLOCK : 1,
23
+ };
24
+ }
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFRM0Q7O0dBRUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCO0lBQzlCLE1BQU0sRUFDSix5QkFBeUIsRUFDekIsYUFBYSxFQUNiLFFBQVEsRUFDUixPQUFPLEVBQ1AsT0FBTyxFQUNQLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsdUJBQXVCLEVBQ3ZCLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsdUJBQXVCLEVBQ3ZCLHNCQUFzQixFQUN0QixtQ0FBbUMsR0FDcEMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDO0lBRWhCLE9BQU87UUFDTCxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDMUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUs7UUFDckMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsTUFBTSxFQUFFLE9BQU87UUFDZixxQkFBcUIsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRSxlQUFlLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLElBQUs7UUFDakUsMEJBQTBCLEVBQUUsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLElBQUs7UUFDdEYsY0FBYyxFQUFFLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJO1FBQzFHLGFBQWEsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSTtRQUN2RyxpQ0FBaUMsRUFBRSxtQ0FBbUM7WUFDcEUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsbUNBQW1DLENBQUM7WUFDNUQsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJO1FBQ25CLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMseUJBQXlCLElBQUksRUFBRSxFQUFFLEtBQUssQ0FBQztRQUN4RSxjQUFjLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDakUsY0FBYyxFQUFFLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2pFLENBQUM7QUFDSixDQUFDIn0=
@@ -0,0 +1,19 @@
1
+ import { EthAddress } from '@aztec/circuits.js';
2
+ /**
3
+ * Configuration of the L1GlobalReader.
4
+ */
5
+ export interface GlobalReaderConfig {
6
+ /**
7
+ * Rollup contract address.
8
+ */
9
+ rollupContract: EthAddress;
10
+ /**
11
+ * The RPC Url of the ethereum host.
12
+ */
13
+ rpcUrl: string;
14
+ /**
15
+ * The API key of the ethereum host.
16
+ */
17
+ apiKey?: string;
18
+ }
19
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/global_variable_builder/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,cAAc,EAAE,UAAU,CAAC;IAC3B;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2dsb2JhbF92YXJpYWJsZV9idWlsZGVyL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -0,0 +1,30 @@
1
+ import { Fr, GlobalVariables } from '@aztec/circuits.js';
2
+ /**
3
+ * Reads values from L1 state that is used for the global values.
4
+ */
5
+ export interface L1GlobalReader {
6
+ getLastTimestamp(): Promise<bigint>;
7
+ getVersion(): Promise<bigint>;
8
+ getChainId(): Promise<bigint>;
9
+ }
10
+ /**
11
+ * Builds global variables from L1 state.
12
+ */
13
+ export interface GlobalVariableBuilder {
14
+ buildGlobalVariables(blockNumber: Fr): Promise<GlobalVariables>;
15
+ }
16
+ /**
17
+ * Simple implementation of a builder that uses the minimum time possible for the global variables.
18
+ */
19
+ export declare class SimpleGlobalVariableBuilder implements GlobalVariableBuilder {
20
+ private readonly reader;
21
+ private log;
22
+ constructor(reader: L1GlobalReader);
23
+ /**
24
+ * Simple builder of global variables that use the minimum time possible.
25
+ * @param blockNumber - The block number to build global variables for.
26
+ * @returns The global variables for the given block number.
27
+ */
28
+ buildGlobalVariables(blockNumber: Fr): Promise<GlobalVariables>;
29
+ }
30
+ //# sourceMappingURL=global_builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global_builder.d.ts","sourceRoot":"","sources":["../../src/global_variable_builder/global_builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGzD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9B,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,oBAAoB,CAAC,WAAW,EAAE,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CACjE;AAED;;GAEG;AACH,qBAAa,2BAA4B,YAAW,qBAAqB;IAE3D,OAAO,CAAC,QAAQ,CAAC,MAAM;IADnC,OAAO,CAAC,GAAG,CAAuE;gBACrD,MAAM,EAAE,cAAc;IAEnD;;;;OAIG;IACU,oBAAoB,CAAC,WAAW,EAAE,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC;CAW7E"}
@@ -0,0 +1,24 @@
1
+ import { Fr, GlobalVariables } from '@aztec/circuits.js';
2
+ import { createDebugLogger } from '@aztec/foundation/log';
3
+ /**
4
+ * Simple implementation of a builder that uses the minimum time possible for the global variables.
5
+ */
6
+ export class SimpleGlobalVariableBuilder {
7
+ constructor(reader) {
8
+ this.reader = reader;
9
+ this.log = createDebugLogger('aztec:sequencer:simple_global_variable_builder');
10
+ }
11
+ /**
12
+ * Simple builder of global variables that use the minimum time possible.
13
+ * @param blockNumber - The block number to build global variables for.
14
+ * @returns The global variables for the given block number.
15
+ */
16
+ async buildGlobalVariables(blockNumber) {
17
+ const lastTimestamp = new Fr(await this.reader.getLastTimestamp());
18
+ const version = new Fr(await this.reader.getVersion());
19
+ const chainId = new Fr(await this.reader.getChainId());
20
+ this.log(`Built global variables for block ${blockNumber}: (${chainId}, ${version}, ${blockNumber}, ${lastTimestamp})`);
21
+ return new GlobalVariables(chainId, version, blockNumber, lastTimestamp);
22
+ }
23
+ }
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsX2J1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2xvYmFsX3ZhcmlhYmxlX2J1aWxkZXIvZ2xvYmFsX2J1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEVBQUUsRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQWtCMUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sMkJBQTJCO0lBRXRDLFlBQTZCLE1BQXNCO1FBQXRCLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBRDNDLFFBQUcsR0FBRyxpQkFBaUIsQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFdkQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxXQUFlO1FBQy9DLE1BQU0sYUFBYSxHQUFHLElBQUksRUFBRSxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7UUFDbkUsTUFBTSxPQUFPLEdBQUcsSUFBSSxFQUFFLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDdkQsTUFBTSxPQUFPLEdBQUcsSUFBSSxFQUFFLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFFdkQsSUFBSSxDQUFDLEdBQUcsQ0FDTixvQ0FBb0MsV0FBVyxNQUFNLE9BQU8sS0FBSyxPQUFPLEtBQUssV0FBVyxLQUFLLGFBQWEsR0FBRyxDQUM5RyxDQUFDO1FBRUYsT0FBTyxJQUFJLGVBQWUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUMzRSxDQUFDO0NBQ0YifQ==
@@ -0,0 +1,11 @@
1
+ import { GlobalReaderConfig } from './config.js';
2
+ import { GlobalVariableBuilder } from './global_builder.js';
3
+ export { SimpleGlobalVariableBuilder } from './global_builder.js';
4
+ export { GlobalReaderConfig } from './config.js';
5
+ /**
6
+ * Returns a new instance of the global variable builder.
7
+ * @param config - Configuration to initialize the builder.
8
+ * @returns A new instance of the global variable builder.
9
+ */
10
+ export declare function getGlobalVariableBuilder(config: GlobalReaderConfig): GlobalVariableBuilder;
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/global_variable_builder/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAA+B,MAAM,qBAAqB,CAAC;AAGzF,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,kBAAkB,GAAG,qBAAqB,CAE1F"}
@@ -0,0 +1,12 @@
1
+ import { SimpleGlobalVariableBuilder } from './global_builder.js';
2
+ import { ViemReader } from './viem-reader.js';
3
+ export { SimpleGlobalVariableBuilder } from './global_builder.js';
4
+ /**
5
+ * Returns a new instance of the global variable builder.
6
+ * @param config - Configuration to initialize the builder.
7
+ * @returns A new instance of the global variable builder.
8
+ */
9
+ export function getGlobalVariableBuilder(config) {
10
+ return new SimpleGlobalVariableBuilder(new ViemReader(config));
11
+ }
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2xvYmFsX3ZhcmlhYmxlX2J1aWxkZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUF5QiwyQkFBMkIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUU5QyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUdsRTs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUFDLE1BQTBCO0lBQ2pFLE9BQU8sSUFBSSwyQkFBMkIsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ2pFLENBQUMifQ==