@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.
- package/.eslintrc.cjs +1 -0
- package/.tsbuildinfo +1 -0
- package/README.md +45 -0
- package/dest/block_builder/index.d.ts +19 -0
- package/dest/block_builder/index.d.ts.map +1 -0
- package/dest/block_builder/index.js +2 -0
- package/dest/block_builder/solo_block_builder.d.ts +76 -0
- package/dest/block_builder/solo_block_builder.d.ts.map +1 -0
- package/dest/block_builder/solo_block_builder.js +453 -0
- package/dest/block_builder/solo_block_builder.test.d.ts +3 -0
- package/dest/block_builder/solo_block_builder.test.d.ts.map +1 -0
- package/dest/block_builder/solo_block_builder.test.js +291 -0
- package/dest/block_builder/types.d.ts +12 -0
- package/dest/block_builder/types.d.ts.map +1 -0
- package/dest/block_builder/types.js +2 -0
- package/dest/client/index.d.ts +2 -0
- package/dest/client/index.d.ts.map +1 -0
- package/dest/client/index.js +2 -0
- package/dest/client/sequencer-client.d.ts +32 -0
- package/dest/client/sequencer-client.d.ts.map +1 -0
- package/dest/client/sequencer-client.js +47 -0
- package/dest/config.d.ts +12 -0
- package/dest/config.d.ts.map +1 -0
- package/dest/config.js +25 -0
- package/dest/global_variable_builder/config.d.ts +19 -0
- package/dest/global_variable_builder/config.d.ts.map +1 -0
- package/dest/global_variable_builder/config.js +2 -0
- package/dest/global_variable_builder/global_builder.d.ts +30 -0
- package/dest/global_variable_builder/global_builder.d.ts.map +1 -0
- package/dest/global_variable_builder/global_builder.js +24 -0
- package/dest/global_variable_builder/index.d.ts +11 -0
- package/dest/global_variable_builder/index.d.ts.map +1 -0
- package/dest/global_variable_builder/index.js +12 -0
- package/dest/global_variable_builder/viem-reader.d.ts +26 -0
- package/dest/global_variable_builder/viem-reader.d.ts.map +1 -0
- package/dest/global_variable_builder/viem-reader.js +43 -0
- package/dest/index.d.ts +11 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/index.js +12 -0
- package/dest/mocks/tx.d.ts +10 -0
- package/dest/mocks/tx.d.ts.map +1 -0
- package/dest/mocks/tx.js +18 -0
- package/dest/mocks/verification_keys.d.ts +28 -0
- package/dest/mocks/verification_keys.d.ts.map +1 -0
- package/dest/mocks/verification_keys.js +14 -0
- package/dest/prover/empty.d.ts +41 -0
- package/dest/prover/empty.d.ts.map +1 -0
- package/dest/prover/empty.js +57 -0
- package/dest/prover/index.d.ts +17 -0
- package/dest/prover/index.d.ts.map +1 -0
- package/dest/prover/index.js +2 -0
- package/dest/publisher/config.d.ts +33 -0
- package/dest/publisher/config.d.ts.map +1 -0
- package/dest/publisher/config.js +2 -0
- package/dest/publisher/index.d.ts +10 -0
- package/dest/publisher/index.d.ts.map +1 -0
- package/dest/publisher/index.js +11 -0
- package/dest/publisher/l1-publisher.d.ts +99 -0
- package/dest/publisher/l1-publisher.d.ts.map +1 -0
- package/dest/publisher/l1-publisher.js +154 -0
- package/dest/publisher/l1-publisher.test.d.ts +2 -0
- package/dest/publisher/l1-publisher.test.d.ts.map +1 -0
- package/dest/publisher/l1-publisher.test.js +58 -0
- package/dest/publisher/viem-tx-sender.d.ts +42 -0
- package/dest/publisher/viem-tx-sender.d.ts.map +1 -0
- package/dest/publisher/viem-tx-sender.js +115 -0
- package/dest/receiver.d.ts +13 -0
- package/dest/receiver.d.ts.map +1 -0
- package/dest/receiver.js +2 -0
- package/dest/sequencer/config.d.ts +26 -0
- package/dest/sequencer/config.d.ts.map +1 -0
- package/dest/sequencer/config.js +2 -0
- package/dest/sequencer/index.d.ts +4 -0
- package/dest/sequencer/index.d.ts.map +1 -0
- package/dest/sequencer/index.js +4 -0
- package/dest/sequencer/processed_tx.d.ts +34 -0
- package/dest/sequencer/processed_tx.d.ts.map +1 -0
- package/dest/sequencer/processed_tx.js +39 -0
- package/dest/sequencer/public_processor.d.ts +68 -0
- package/dest/sequencer/public_processor.d.ts.map +1 -0
- package/dest/sequencer/public_processor.js +195 -0
- package/dest/sequencer/public_processor.test.d.ts +2 -0
- package/dest/sequencer/public_processor.test.d.ts.map +1 -0
- package/dest/sequencer/public_processor.test.js +159 -0
- package/dest/sequencer/sequencer.d.ts +133 -0
- package/dest/sequencer/sequencer.d.ts.map +1 -0
- package/dest/sequencer/sequencer.js +293 -0
- package/dest/sequencer/sequencer.test.d.ts +2 -0
- package/dest/sequencer/sequencer.test.d.ts.map +1 -0
- package/dest/sequencer/sequencer.test.js +100 -0
- package/dest/sequencer/utils.d.ts +7 -0
- package/dest/sequencer/utils.d.ts.map +1 -0
- package/dest/sequencer/utils.js +9 -0
- package/dest/simulator/index.d.ts +42 -0
- package/dest/simulator/index.d.ts.map +1 -0
- package/dest/simulator/index.js +2 -0
- package/dest/simulator/public_executor.d.ts +39 -0
- package/dest/simulator/public_executor.d.ts.map +1 -0
- package/dest/simulator/public_executor.js +118 -0
- package/dest/simulator/public_kernel.d.ts +20 -0
- package/dest/simulator/public_kernel.d.ts.map +1 -0
- package/dest/simulator/public_kernel.js +27 -0
- package/dest/simulator/rollup.d.ts +33 -0
- package/dest/simulator/rollup.d.ts.map +1 -0
- package/dest/simulator/rollup.js +41 -0
- package/dest/utils.d.ts +12 -0
- package/dest/utils.d.ts.map +1 -0
- package/dest/utils.js +16 -0
- package/jest.integration.config.json +13 -0
- package/package.json +23 -0
- package/src/block_builder/index.ts +23 -0
- package/src/block_builder/solo_block_builder.test.ts +425 -0
- package/src/block_builder/solo_block_builder.ts +710 -0
- package/src/block_builder/types.ts +16 -0
- package/src/client/index.ts +1 -0
- package/src/client/sequencer-client.ts +79 -0
- package/src/config.ts +48 -0
- package/src/global_variable_builder/config.ts +19 -0
- package/src/global_variable_builder/global_builder.ts +43 -0
- package/src/global_variable_builder/index.ts +15 -0
- package/src/global_variable_builder/viem-reader.ts +63 -0
- package/src/index.ts +12 -0
- package/src/mocks/tx.ts +26 -0
- package/src/mocks/verification_keys.ts +36 -0
- package/src/prover/empty.ts +73 -0
- package/src/prover/index.ts +27 -0
- package/src/publisher/config.ts +36 -0
- package/src/publisher/index.ts +14 -0
- package/src/publisher/l1-publisher.test.ts +77 -0
- package/src/publisher/l1-publisher.ts +236 -0
- package/src/publisher/viem-tx-sender.ts +166 -0
- package/src/receiver.ts +13 -0
- package/src/sequencer/config.ts +27 -0
- package/src/sequencer/index.ts +3 -0
- package/src/sequencer/processed_tx.ts +82 -0
- package/src/sequencer/public_processor.test.ts +225 -0
- package/src/sequencer/public_processor.ts +280 -0
- package/src/sequencer/sequencer.test.ts +158 -0
- package/src/sequencer/sequencer.ts +356 -0
- package/src/sequencer/utils.ts +18 -0
- package/src/simulator/index.ts +51 -0
- package/src/simulator/public_executor.ts +137 -0
- package/src/simulator/public_kernel.ts +27 -0
- package/src/simulator/rollup.ts +54 -0
- package/src/utils.ts +16 -0
- package/tsconfig.json +38 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { isPublicExecutionResult } from '@aztec/acir-simulator';
|
|
2
|
+
import { AztecAddress, CircuitsWasm, ContractStorageRead, ContractStorageUpdateRequest, Fr, KERNEL_PUBLIC_DATA_READS_LENGTH, KERNEL_PUBLIC_DATA_UPDATE_REQUESTS_LENGTH, MembershipWitness, NEW_COMMITMENTS_LENGTH, NEW_L2_TO_L1_MSGS_LENGTH, NEW_NULLIFIERS_LENGTH, PUBLIC_CALL_STACK_LENGTH, PreviousKernelData, PublicCallData, PublicCallStackItem, PublicCircuitPublicInputs, PublicKernelInputs, RETURN_VALUES_LENGTH, VK_TREE_HEIGHT, } from '@aztec/circuits.js';
|
|
3
|
+
import { computeCallStackItemHash, computeVarArgsHash } from '@aztec/circuits.js/abis';
|
|
4
|
+
import { isArrayEmpty, padArrayEnd, padArrayStart } from '@aztec/foundation/collection';
|
|
5
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
6
|
+
import { mapTuple, to2Fields } from '@aztec/foundation/serialize';
|
|
7
|
+
import { MerkleTreeId } from '@aztec/types';
|
|
8
|
+
import { getVerificationKeys } from '../index.js';
|
|
9
|
+
import { EmptyPublicProver } from '../prover/empty.js';
|
|
10
|
+
import { getPublicExecutor } from '../simulator/public_executor.js';
|
|
11
|
+
import { WasmPublicKernelCircuitSimulator } from '../simulator/public_kernel.js';
|
|
12
|
+
import { makeEmptyProcessedTx, makeProcessedTx } from './processed_tx.js';
|
|
13
|
+
import { getCombinedHistoricTreeRoots } from './utils.js';
|
|
14
|
+
/**
|
|
15
|
+
* Creates new instances of PublicProcessor given the provided merkle tree db and contract data source.
|
|
16
|
+
*/
|
|
17
|
+
export class PublicProcessorFactory {
|
|
18
|
+
constructor(merkleTree, contractDataSource, l1Tol2MessagesDataSource) {
|
|
19
|
+
this.merkleTree = merkleTree;
|
|
20
|
+
this.contractDataSource = contractDataSource;
|
|
21
|
+
this.l1Tol2MessagesDataSource = l1Tol2MessagesDataSource;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Creates a new instance of a PublicProcessor.
|
|
25
|
+
* @returns A new instance of a PublicProcessor.
|
|
26
|
+
*/
|
|
27
|
+
create() {
|
|
28
|
+
return new PublicProcessor(this.merkleTree, getPublicExecutor(this.merkleTree, this.contractDataSource, this.l1Tol2MessagesDataSource), new WasmPublicKernelCircuitSimulator(), new EmptyPublicProver(), this.contractDataSource);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Converts Txs lifted from the P2P module into ProcessedTx objects by executing
|
|
33
|
+
* any public function calls in them. Txs with private calls only are unaffected.
|
|
34
|
+
*/
|
|
35
|
+
export class PublicProcessor {
|
|
36
|
+
constructor(db, publicExecutor, publicKernel, publicProver, contractDataSource, log = createDebugLogger('aztec:sequencer:public-processor')) {
|
|
37
|
+
this.db = db;
|
|
38
|
+
this.publicExecutor = publicExecutor;
|
|
39
|
+
this.publicKernel = publicKernel;
|
|
40
|
+
this.publicProver = publicProver;
|
|
41
|
+
this.contractDataSource = contractDataSource;
|
|
42
|
+
this.log = log;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Run each tx through the public circuit and the public kernel circuit if needed.
|
|
46
|
+
* @param txs - Txs to process.
|
|
47
|
+
* @param globalVariables - The global variables for the block.
|
|
48
|
+
* @returns The list of processed txs with their circuit simulation outputs.
|
|
49
|
+
*/
|
|
50
|
+
async process(txs, globalVariables) {
|
|
51
|
+
const result = [];
|
|
52
|
+
const failed = [];
|
|
53
|
+
for (const tx of txs) {
|
|
54
|
+
this.log(`Processing tx ${await tx.getTxHash()}`);
|
|
55
|
+
try {
|
|
56
|
+
result.push(await this.processTx(tx, globalVariables));
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
this.log(`Error processing tx ${await tx.getTxHash()}: ${err}`);
|
|
60
|
+
failed.push(tx);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return [result, failed];
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Makes an empty processed tx. Useful for padding a block to a power of two number of txs.
|
|
67
|
+
* @param chainId - The chain id of the rollup.
|
|
68
|
+
* @param version - The version of the rollup.
|
|
69
|
+
* @returns A processed tx with empty data.
|
|
70
|
+
*/
|
|
71
|
+
async makeEmptyProcessedTx(chainId, version) {
|
|
72
|
+
const historicTreeRoots = await getCombinedHistoricTreeRoots(this.db);
|
|
73
|
+
return makeEmptyProcessedTx(historicTreeRoots, chainId, version);
|
|
74
|
+
}
|
|
75
|
+
async processTx(tx, globalVariables) {
|
|
76
|
+
if (!isArrayEmpty(tx.data.end.publicCallStack, item => item.isZero())) {
|
|
77
|
+
const [publicKernelOutput, publicKernelProof, newUnencryptedFunctionLogs] = await this.processEnqueuedPublicCalls(tx, globalVariables);
|
|
78
|
+
tx.unencryptedLogs.addFunctionLogs(newUnencryptedFunctionLogs);
|
|
79
|
+
return makeProcessedTx(tx, publicKernelOutput, publicKernelProof);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
return makeProcessedTx(tx);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async processEnqueuedPublicCalls(tx, globalVariables) {
|
|
86
|
+
this.log(`Executing enqueued public calls for tx ${await tx.getTxHash()}`);
|
|
87
|
+
if (!tx.enqueuedPublicFunctionCalls)
|
|
88
|
+
throw new Error(`Missing preimages for enqueued public calls`);
|
|
89
|
+
// We execute the requests in order, which means reversing the input as the stack pops from the end of the array
|
|
90
|
+
const executionStack = [...tx.enqueuedPublicFunctionCalls].reverse();
|
|
91
|
+
let kernelOutput = tx.data;
|
|
92
|
+
let kernelProof = tx.proof;
|
|
93
|
+
const newUnencryptedFunctionLogs = [];
|
|
94
|
+
while (executionStack.length) {
|
|
95
|
+
const current = executionStack.pop();
|
|
96
|
+
const isExecutionRequest = !isPublicExecutionResult(current);
|
|
97
|
+
const result = isExecutionRequest ? await this.publicExecutor.execute(current, globalVariables) : current;
|
|
98
|
+
newUnencryptedFunctionLogs.push(result.unencryptedLogs);
|
|
99
|
+
const functionSelector = result.execution.functionData.functionSelectorBuffer.toString('hex');
|
|
100
|
+
this.log(`Running public kernel circuit for ${functionSelector}@${result.execution.contractAddress.toString()}`);
|
|
101
|
+
executionStack.push(...result.nestedExecutions);
|
|
102
|
+
const preimages = await this.getPublicCallStackPreimages(result);
|
|
103
|
+
const callData = await this.getPublicCallData(result, preimages, isExecutionRequest);
|
|
104
|
+
[kernelOutput, kernelProof] = await this.runKernelCircuit(callData, kernelOutput, kernelProof);
|
|
105
|
+
}
|
|
106
|
+
return [kernelOutput, kernelProof, newUnencryptedFunctionLogs];
|
|
107
|
+
}
|
|
108
|
+
async runKernelCircuit(callData, previousOutput, previousProof) {
|
|
109
|
+
const output = await this.getKernelCircuitOutput(callData, previousOutput, previousProof);
|
|
110
|
+
const proof = await this.publicProver.getPublicKernelCircuitProof(output);
|
|
111
|
+
return [output, proof];
|
|
112
|
+
}
|
|
113
|
+
getKernelCircuitOutput(callData, previousOutput, previousProof) {
|
|
114
|
+
if (previousOutput?.isPrivate && previousProof) {
|
|
115
|
+
// Run the public kernel circuit with previous private kernel
|
|
116
|
+
const previousKernel = this.getPreviousKernelData(previousOutput, previousProof);
|
|
117
|
+
const inputs = new PublicKernelInputs(previousKernel, callData);
|
|
118
|
+
return this.publicKernel.publicKernelCircuitPrivateInput(inputs);
|
|
119
|
+
}
|
|
120
|
+
else if (previousOutput && previousProof) {
|
|
121
|
+
// Run the public kernel circuit with previous public kernel
|
|
122
|
+
const previousKernel = this.getPreviousKernelData(previousOutput, previousProof);
|
|
123
|
+
const inputs = new PublicKernelInputs(previousKernel, callData);
|
|
124
|
+
return this.publicKernel.publicKernelCircuitNonFirstIteration(inputs);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
throw new Error(`No public kernel circuit for inputs`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
getPreviousKernelData(previousOutput, previousProof) {
|
|
131
|
+
const vk = getVerificationKeys().publicKernelCircuit;
|
|
132
|
+
const vkIndex = 0;
|
|
133
|
+
const vkSiblingPath = MembershipWitness.random(VK_TREE_HEIGHT).siblingPath;
|
|
134
|
+
return new PreviousKernelData(previousOutput, previousProof, vk, vkIndex, vkSiblingPath);
|
|
135
|
+
}
|
|
136
|
+
async getPublicCircuitPublicInputs(result) {
|
|
137
|
+
const publicDataTreeInfo = await this.db.getTreeInfo(MerkleTreeId.PUBLIC_DATA_TREE);
|
|
138
|
+
const historicPublicDataTreeRoot = Fr.fromBuffer(publicDataTreeInfo.root);
|
|
139
|
+
const callStackPreimages = await this.getPublicCallStackPreimages(result);
|
|
140
|
+
const wasm = await CircuitsWasm.get();
|
|
141
|
+
const publicCallStack = mapTuple(callStackPreimages, item => item.isEmpty() ? Fr.zero() : computeCallStackItemHash(wasm, item));
|
|
142
|
+
// TODO(#1347): Noir fails with too many unknowns error when public inputs struct contains too many members.
|
|
143
|
+
const unencryptedLogsHash = to2Fields(result.unencryptedLogs.hash());
|
|
144
|
+
const unencryptedLogPreimagesLength = new Fr(result.unencryptedLogs.getSerializedLength());
|
|
145
|
+
return PublicCircuitPublicInputs.from({
|
|
146
|
+
callContext: result.execution.callContext,
|
|
147
|
+
proverAddress: AztecAddress.random(),
|
|
148
|
+
argsHash: await computeVarArgsHash(wasm, result.execution.args),
|
|
149
|
+
newCommitments: padArrayEnd(result.newCommitments, Fr.ZERO, NEW_COMMITMENTS_LENGTH),
|
|
150
|
+
newNullifiers: padArrayEnd(result.newNullifiers, Fr.ZERO, NEW_NULLIFIERS_LENGTH),
|
|
151
|
+
newL2ToL1Msgs: padArrayEnd(result.newL2ToL1Messages, Fr.ZERO, NEW_L2_TO_L1_MSGS_LENGTH),
|
|
152
|
+
returnValues: padArrayEnd(result.returnValues, Fr.ZERO, RETURN_VALUES_LENGTH),
|
|
153
|
+
contractStorageReads: padArrayEnd(result.contractStorageReads, ContractStorageRead.empty(), KERNEL_PUBLIC_DATA_READS_LENGTH),
|
|
154
|
+
contractStorageUpdateRequests: padArrayEnd(result.contractStorageUpdateRequests, ContractStorageUpdateRequest.empty(), KERNEL_PUBLIC_DATA_UPDATE_REQUESTS_LENGTH),
|
|
155
|
+
publicCallStack,
|
|
156
|
+
unencryptedLogsHash,
|
|
157
|
+
unencryptedLogPreimagesLength,
|
|
158
|
+
historicPublicDataTreeRoot,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
async getPublicCallStackItem(result, isExecutionRequest = false) {
|
|
162
|
+
return new PublicCallStackItem(result.execution.contractAddress, result.execution.functionData, await this.getPublicCircuitPublicInputs(result), isExecutionRequest);
|
|
163
|
+
}
|
|
164
|
+
async getPublicCallStackPreimages(result) {
|
|
165
|
+
const nested = result.nestedExecutions;
|
|
166
|
+
const preimages = await Promise.all(nested.map(n => this.getPublicCallStackItem(n)));
|
|
167
|
+
if (preimages.length > PUBLIC_CALL_STACK_LENGTH) {
|
|
168
|
+
throw new Error(`Public call stack size exceeded (max ${PUBLIC_CALL_STACK_LENGTH}, got ${preimages.length})`);
|
|
169
|
+
}
|
|
170
|
+
// Top of the stack is at the end of the array, so we padStart
|
|
171
|
+
return padArrayStart(preimages, PublicCallStackItem.empty(), PUBLIC_CALL_STACK_LENGTH);
|
|
172
|
+
}
|
|
173
|
+
getBytecodeHash(_result) {
|
|
174
|
+
// TODO: Determine how to calculate bytecode hash. Circuits just check it isn't zero for now.
|
|
175
|
+
// See https://github.com/AztecProtocol/aztec3-packages/issues/378
|
|
176
|
+
const bytecodeHash = new Fr(1n);
|
|
177
|
+
return Promise.resolve(bytecodeHash);
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Calculates the PublicCircuitOutput for this execution result along with its proof,
|
|
181
|
+
* and assembles a PublicCallData object from it.
|
|
182
|
+
* @param result - The execution result.
|
|
183
|
+
* @param preimages - The preimages of the callstack items.
|
|
184
|
+
* @param isExecutionRequest - Whether the current callstack item should be considered a public fn execution request.
|
|
185
|
+
* @returns A corresponding PublicCallData object.
|
|
186
|
+
*/
|
|
187
|
+
async getPublicCallData(result, preimages, isExecutionRequest = false) {
|
|
188
|
+
const bytecodeHash = await this.getBytecodeHash(result);
|
|
189
|
+
const callStackItem = await this.getPublicCallStackItem(result, isExecutionRequest);
|
|
190
|
+
const portalContractAddress = result.execution.callContext.portalContractAddress.toField();
|
|
191
|
+
const proof = await this.publicProver.getPublicCircuitProof(callStackItem.publicInputs);
|
|
192
|
+
return new PublicCallData(callStackItem, preimages, proof, portalContractAddress, bytecodeHash);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX3Byb2Nlc3Nvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXF1ZW5jZXIvcHVibGljX3Byb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTBELHVCQUF1QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDeEgsT0FBTyxFQUNMLFlBQVksRUFDWixZQUFZLEVBQ1osbUJBQW1CLEVBQ25CLDRCQUE0QixFQUM1QixFQUFFLEVBRUYsK0JBQStCLEVBQy9CLHlDQUF5QyxFQUV6QyxpQkFBaUIsRUFDakIsc0JBQXNCLEVBQ3RCLHdCQUF3QixFQUN4QixxQkFBcUIsRUFDckIsd0JBQXdCLEVBQ3hCLGtCQUFrQixFQUVsQixjQUFjLEVBQ2QsbUJBQW1CLEVBQ25CLHlCQUF5QixFQUN6QixrQkFBa0IsRUFFbEIsb0JBQW9CLEVBQ3BCLGNBQWMsR0FDZixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3hGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBUyxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDekUsT0FBTyxFQUEyRCxZQUFZLEVBQU0sTUFBTSxjQUFjLENBQUM7QUFFekcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBR3ZELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2pGLE9BQU8sRUFBZSxv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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public_processor.test.d.ts","sourceRoot":"","sources":["../../src/sequencer/public_processor.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { ARGS_LENGTH, CallContext, CircuitsWasm, EthAddress, Fr, FunctionData, GlobalVariables, KERNEL_PRIVATE_CALL_STACK_LENGTH, KERNEL_PUBLIC_CALL_STACK_LENGTH, PUBLIC_DATA_TREE_HEIGHT, makeEmptyProof, makeTuple, } from '@aztec/circuits.js';
|
|
2
|
+
import { computeCallStackItemHash } from '@aztec/circuits.js/abis';
|
|
3
|
+
import { makeAztecAddress, makeKernelPublicInputs, makePublicCallRequest, makeSelector, } from '@aztec/circuits.js/factories';
|
|
4
|
+
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
5
|
+
import { SiblingPath } from '@aztec/merkle-tree';
|
|
6
|
+
import { ContractPublicData, EncodedContractFunction, FunctionL2Logs, Tx, TxL2Logs, } from '@aztec/types';
|
|
7
|
+
import { mock } from 'jest-mock-extended';
|
|
8
|
+
import pick from 'lodash.pick';
|
|
9
|
+
import times from 'lodash.times';
|
|
10
|
+
import { makeTx } from '../index.js';
|
|
11
|
+
import { WasmPublicKernelCircuitSimulator } from '../simulator/public_kernel.js';
|
|
12
|
+
import { PublicProcessor } from './public_processor.js';
|
|
13
|
+
describe('public_processor', () => {
|
|
14
|
+
let db;
|
|
15
|
+
let publicExecutor;
|
|
16
|
+
let publicProver;
|
|
17
|
+
let contractDataSource;
|
|
18
|
+
let publicFunction;
|
|
19
|
+
let contractData;
|
|
20
|
+
let proof;
|
|
21
|
+
let root;
|
|
22
|
+
let processor;
|
|
23
|
+
beforeEach(() => {
|
|
24
|
+
db = mock();
|
|
25
|
+
publicExecutor = mock();
|
|
26
|
+
publicProver = mock();
|
|
27
|
+
contractDataSource = mock();
|
|
28
|
+
contractData = ContractPublicData.random();
|
|
29
|
+
publicFunction = EncodedContractFunction.random();
|
|
30
|
+
proof = makeEmptyProof();
|
|
31
|
+
root = Buffer.alloc(32, 5);
|
|
32
|
+
publicProver.getPublicCircuitProof.mockResolvedValue(proof);
|
|
33
|
+
publicProver.getPublicKernelCircuitProof.mockResolvedValue(proof);
|
|
34
|
+
db.getTreeInfo.mockResolvedValue({ root });
|
|
35
|
+
contractDataSource.getL2ContractPublicData.mockResolvedValue(contractData);
|
|
36
|
+
contractDataSource.getPublicFunction.mockResolvedValue(publicFunction);
|
|
37
|
+
});
|
|
38
|
+
describe('with mock circuits', () => {
|
|
39
|
+
let publicKernel;
|
|
40
|
+
beforeEach(() => {
|
|
41
|
+
publicKernel = mock();
|
|
42
|
+
processor = new PublicProcessor(db, publicExecutor, publicKernel, publicProver, contractDataSource);
|
|
43
|
+
});
|
|
44
|
+
it('skips txs without public execution requests', async function () {
|
|
45
|
+
const tx = makeTx();
|
|
46
|
+
tx.data.end.publicCallStack = makeTuple(KERNEL_PUBLIC_CALL_STACK_LENGTH, Fr.zero);
|
|
47
|
+
const hash = await tx.getTxHash();
|
|
48
|
+
const [processed, failed] = await processor.process([tx], GlobalVariables.empty());
|
|
49
|
+
expect(processed).toEqual([
|
|
50
|
+
{ isEmpty: false, hash, ...pick(tx, 'data', 'proof', 'encryptedLogs', 'unencryptedLogs') },
|
|
51
|
+
]);
|
|
52
|
+
expect(failed).toEqual([]);
|
|
53
|
+
});
|
|
54
|
+
it('returns failed txs without aborting entire operation', async function () {
|
|
55
|
+
publicExecutor.execute.mockRejectedValue(new Error(`Failed`));
|
|
56
|
+
const tx = makeTx();
|
|
57
|
+
const [processed, failed] = await processor.process([tx], GlobalVariables.empty());
|
|
58
|
+
expect(processed).toEqual([]);
|
|
59
|
+
expect(failed).toEqual([tx]);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
describe('with actual circuits', () => {
|
|
63
|
+
let publicKernel;
|
|
64
|
+
let wasm;
|
|
65
|
+
beforeAll(async () => {
|
|
66
|
+
wasm = await CircuitsWasm.get();
|
|
67
|
+
});
|
|
68
|
+
beforeEach(() => {
|
|
69
|
+
const path = times(PUBLIC_DATA_TREE_HEIGHT, i => Buffer.alloc(32, i));
|
|
70
|
+
db.getSiblingPath.mockResolvedValue(new SiblingPath(PUBLIC_DATA_TREE_HEIGHT, path));
|
|
71
|
+
publicKernel = new WasmPublicKernelCircuitSimulator();
|
|
72
|
+
processor = new PublicProcessor(db, publicExecutor, publicKernel, publicProver, contractDataSource);
|
|
73
|
+
});
|
|
74
|
+
const expectedTxByHash = async (tx) => expect.objectContaining({
|
|
75
|
+
hash: await tx.getTxHash(),
|
|
76
|
+
proof,
|
|
77
|
+
});
|
|
78
|
+
it('runs a tx with enqueued public calls', async function () {
|
|
79
|
+
const callRequests = [makePublicCallRequest(0x100), makePublicCallRequest(0x100)];
|
|
80
|
+
const callStackItems = await Promise.all(callRequests.map(call => call.toPublicCallStackItem()));
|
|
81
|
+
const callStackHashes = callStackItems.map(call => computeCallStackItemHash(wasm, call));
|
|
82
|
+
const kernelOutput = makeKernelPublicInputs(0x10);
|
|
83
|
+
kernelOutput.end.publicCallStack = padArrayEnd(callStackHashes, Fr.ZERO, KERNEL_PUBLIC_CALL_STACK_LENGTH);
|
|
84
|
+
kernelOutput.end.privateCallStack = padArrayEnd([], Fr.ZERO, KERNEL_PRIVATE_CALL_STACK_LENGTH);
|
|
85
|
+
const tx = new Tx(kernelOutput, proof, TxL2Logs.random(2, 3), TxL2Logs.random(3, 2), [], callRequests);
|
|
86
|
+
publicExecutor.execute.mockImplementation(execution => {
|
|
87
|
+
for (const request of callRequests) {
|
|
88
|
+
if (execution.contractAddress.equals(request.contractAddress)) {
|
|
89
|
+
return Promise.resolve(makePublicExecutionResultFromRequest(request));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
throw new Error(`Unexpected execution request: ${execution}`);
|
|
93
|
+
});
|
|
94
|
+
const [processed, failed] = await processor.process([tx], GlobalVariables.empty());
|
|
95
|
+
expect(processed).toHaveLength(1);
|
|
96
|
+
expect(processed).toEqual([await expectedTxByHash(tx)]);
|
|
97
|
+
expect(failed).toHaveLength(0);
|
|
98
|
+
expect(publicExecutor.execute).toHaveBeenCalledTimes(2);
|
|
99
|
+
});
|
|
100
|
+
it('runs a tx with an enqueued public call with nested execution', async function () {
|
|
101
|
+
const callRequest = makePublicCallRequest(0x100);
|
|
102
|
+
const callStackItem = await callRequest.toPublicCallStackItem();
|
|
103
|
+
const callStackHash = computeCallStackItemHash(wasm, callStackItem);
|
|
104
|
+
const kernelOutput = makeKernelPublicInputs(0x10);
|
|
105
|
+
kernelOutput.end.publicCallStack = padArrayEnd([callStackHash], Fr.ZERO, KERNEL_PUBLIC_CALL_STACK_LENGTH);
|
|
106
|
+
kernelOutput.end.privateCallStack = padArrayEnd([], Fr.ZERO, KERNEL_PRIVATE_CALL_STACK_LENGTH);
|
|
107
|
+
const tx = new Tx(kernelOutput, proof, TxL2Logs.random(2, 3), TxL2Logs.random(3, 2), [], [callRequest]);
|
|
108
|
+
const publicExecutionResult = makePublicExecutionResultFromRequest(callRequest);
|
|
109
|
+
publicExecutionResult.nestedExecutions = [
|
|
110
|
+
makePublicExecutionResult({
|
|
111
|
+
from: publicExecutionResult.execution.contractAddress,
|
|
112
|
+
to: makeAztecAddress(30),
|
|
113
|
+
functionData: new FunctionData(makeSelector(5), false, false),
|
|
114
|
+
args: new Array(ARGS_LENGTH).fill(Fr.ZERO),
|
|
115
|
+
}),
|
|
116
|
+
];
|
|
117
|
+
publicExecutor.execute.mockResolvedValue(publicExecutionResult);
|
|
118
|
+
const [processed, failed] = await processor.process([tx], GlobalVariables.empty());
|
|
119
|
+
expect(processed).toHaveLength(1);
|
|
120
|
+
expect(processed).toEqual([await expectedTxByHash(tx)]);
|
|
121
|
+
expect(failed).toHaveLength(0);
|
|
122
|
+
expect(publicExecutor.execute).toHaveBeenCalledTimes(1);
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
function makePublicExecutionResultFromRequest(item) {
|
|
127
|
+
return {
|
|
128
|
+
execution: item,
|
|
129
|
+
nestedExecutions: [],
|
|
130
|
+
returnValues: [new Fr(1n)],
|
|
131
|
+
newCommitments: [],
|
|
132
|
+
newL2ToL1Messages: [],
|
|
133
|
+
newNullifiers: [],
|
|
134
|
+
contractStorageReads: [],
|
|
135
|
+
contractStorageUpdateRequests: [],
|
|
136
|
+
unencryptedLogs: new FunctionL2Logs([]),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
function makePublicExecutionResult(tx, nestedExecutions = []) {
|
|
140
|
+
const callContext = new CallContext(tx.from, tx.to, EthAddress.ZERO, false, false, false);
|
|
141
|
+
const execution = {
|
|
142
|
+
callContext,
|
|
143
|
+
contractAddress: tx.to,
|
|
144
|
+
functionData: tx.functionData,
|
|
145
|
+
args: tx.args,
|
|
146
|
+
};
|
|
147
|
+
return {
|
|
148
|
+
execution,
|
|
149
|
+
nestedExecutions,
|
|
150
|
+
returnValues: [],
|
|
151
|
+
newCommitments: [],
|
|
152
|
+
newNullifiers: [],
|
|
153
|
+
newL2ToL1Messages: [],
|
|
154
|
+
contractStorageReads: [],
|
|
155
|
+
contractStorageUpdateRequests: [],
|
|
156
|
+
unencryptedLogs: new FunctionL2Logs([]),
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX3Byb2Nlc3Nvci50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcXVlbmNlci9wdWJsaWNfcHJvY2Vzc29yLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUNMLFdBQVcsRUFDWCxXQUFXLEVBQ1gsWUFBWSxFQUNaLFVBQVUsRUFDVixFQUFFLEVBQ0YsWUFBWSxFQUNaLGVBQWUsRUFDZixnQ0FBZ0MsRUFDaEMsK0JBQStCLEVBQy9CLHVCQUF1QixFQUd2QixjQUFjLEVBQ2QsU0FBUyxHQUNWLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkUsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixzQkFBc0IsRUFDdEIscUJBQXFCLEVBQ3JCLFlBQVksR0FDYixNQUFNLDhCQUE4QixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDakQsT0FBTyxFQUVMLGtCQUFrQixFQUNsQix1QkFBdUIsRUFFdkIsY0FBYyxFQUNkLEVBQUUsRUFDRixRQUFRLEdBQ1QsTUFBTSxjQUFjLENBQUM7QUFFdEIsT0FBTyxFQUFhLElBQUksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3JELE9BQU8sSUFBSSxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEtBQUssTUFBTSxjQUFjLENBQUM7QUFDakMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUdyQyxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNqRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFeEQsUUFBUSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsRUFBRTtJQUNoQyxJQUFJLEVBQW1DLENBQUM7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
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
2
|
+
import { P2P } from '@aztec/p2p';
|
|
3
|
+
import { L1ToL2MessageSource, L2Block, L2BlockSource, Tx } from '@aztec/types';
|
|
4
|
+
import { WorldStateSynchroniser } from '@aztec/world-state';
|
|
5
|
+
import { BlockBuilder } from '../block_builder/index.js';
|
|
6
|
+
import { L1Publisher } from '../publisher/l1-publisher.js';
|
|
7
|
+
import { SequencerConfig } from './config.js';
|
|
8
|
+
import { ProcessedTx } from './processed_tx.js';
|
|
9
|
+
import { PublicProcessorFactory } from './public_processor.js';
|
|
10
|
+
import { GlobalVariables } from '@aztec/circuits.js';
|
|
11
|
+
import { GlobalVariableBuilder } from '../global_variable_builder/global_builder.js';
|
|
12
|
+
/**
|
|
13
|
+
* Sequencer client
|
|
14
|
+
* - Wins a period of time to become the sequencer (depending on finalised protocol).
|
|
15
|
+
* - Chooses a set of txs from the tx pool to be in the rollup.
|
|
16
|
+
* - Simulate the rollup of txs.
|
|
17
|
+
* - Adds proof requests to the request pool (not for this milestone).
|
|
18
|
+
* - Receives results to those proofs from the network (repeats as necessary) (not for this milestone).
|
|
19
|
+
* - Publishes L1 tx(s) to the rollup contract via RollupPublisher.
|
|
20
|
+
*/
|
|
21
|
+
export declare class Sequencer {
|
|
22
|
+
private publisher;
|
|
23
|
+
private globalsBuilder;
|
|
24
|
+
private p2pClient;
|
|
25
|
+
private worldState;
|
|
26
|
+
private blockBuilder;
|
|
27
|
+
private l2BlockSource;
|
|
28
|
+
private l1ToL2MessageSource;
|
|
29
|
+
private publicProcessorFactory;
|
|
30
|
+
private log;
|
|
31
|
+
private runningPromise?;
|
|
32
|
+
private pollingIntervalMs;
|
|
33
|
+
private maxTxsPerBlock;
|
|
34
|
+
private minTxsPerBLock;
|
|
35
|
+
private lastPublishedBlock;
|
|
36
|
+
private state;
|
|
37
|
+
private chainId;
|
|
38
|
+
private version;
|
|
39
|
+
constructor(publisher: L1Publisher, globalsBuilder: GlobalVariableBuilder, p2pClient: P2P, worldState: WorldStateSynchroniser, blockBuilder: BlockBuilder, l2BlockSource: L2BlockSource, l1ToL2MessageSource: L1ToL2MessageSource, publicProcessorFactory: PublicProcessorFactory, config: SequencerConfig, log?: import("@aztec/foundation/log").DebugLogger);
|
|
40
|
+
/**
|
|
41
|
+
* Starts the sequencer and moves to IDLE state. Blocks until the initial sync is complete.
|
|
42
|
+
*/
|
|
43
|
+
start(): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Stops the sequencer from processing txs and moves to STOPPED state.
|
|
46
|
+
*/
|
|
47
|
+
stop(): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Starts a previously stopped sequencer.
|
|
50
|
+
*/
|
|
51
|
+
restart(): void;
|
|
52
|
+
/**
|
|
53
|
+
* Returns the current state of the sequencer.
|
|
54
|
+
* @returns An object with a state entry with one of SequencerState.
|
|
55
|
+
*/
|
|
56
|
+
status(): {
|
|
57
|
+
state: SequencerState;
|
|
58
|
+
};
|
|
59
|
+
protected initialSync(): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Grabs up to maxTxsPerBlock from the p2p client, constructs a block, and pushes it to L1.
|
|
62
|
+
*/
|
|
63
|
+
protected work(): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Gets new contract public data from the txs and publishes it on chain.
|
|
66
|
+
* @param validTxs - The set of real transactions being published as part of the block.
|
|
67
|
+
* @param block - The L2Block to be published.
|
|
68
|
+
*/
|
|
69
|
+
protected publishContractPublicData(validTxs: Tx[], block: L2Block): Promise<void>;
|
|
70
|
+
/**
|
|
71
|
+
* Publishes the L2Block to the rollup contract.
|
|
72
|
+
* @param block - The L2Block to be published.
|
|
73
|
+
*/
|
|
74
|
+
protected publishL2Block(block: L2Block): Promise<void>;
|
|
75
|
+
protected takeValidTxs(txs: Tx[]): Promise<Tx[]>;
|
|
76
|
+
/**
|
|
77
|
+
* Returns whether the previous block sent has been mined, and all dependencies have caught up with it.
|
|
78
|
+
* @returns Boolean indicating if our dependencies are synced to the latest block.
|
|
79
|
+
*/
|
|
80
|
+
protected isBlockSynced(): Promise<boolean>;
|
|
81
|
+
/**
|
|
82
|
+
* Pads the set of txs to a power of two and assembles a block by calling the block builder.
|
|
83
|
+
* @param txs - Processed txs to include in the next block.
|
|
84
|
+
* @param newL1ToL2Messages - L1 to L2 messages to be part of the block.
|
|
85
|
+
* @param emptyTx - Empty tx to repeat at the end of the block to pad to a power of two.
|
|
86
|
+
* @param globalVariables - Global variables to use in the block.
|
|
87
|
+
* @returns The new block.
|
|
88
|
+
*/
|
|
89
|
+
protected buildBlock(txs: ProcessedTx[], newL1ToL2Messages: Fr[], emptyTx: ProcessedTx, globalVariables: GlobalVariables): Promise<L2Block>;
|
|
90
|
+
/**
|
|
91
|
+
* Calls the archiver to pull upto `NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP` message keys
|
|
92
|
+
* (archiver returns the top messages sorted by fees)
|
|
93
|
+
* @returns An array of L1 to L2 messages' messageKeys
|
|
94
|
+
*/
|
|
95
|
+
protected getPendingL1ToL2Messages(): Promise<Fr[]>;
|
|
96
|
+
/**
|
|
97
|
+
* Returns true if one of the transaction nullifiers exist.
|
|
98
|
+
* Nullifiers prevent double spends in a private context.
|
|
99
|
+
* @param tx - The transaction.
|
|
100
|
+
* @returns Whether this is a problematic double spend that the L1 contract would reject.
|
|
101
|
+
*/
|
|
102
|
+
protected isTxDoubleSpend(tx: Tx): Promise<boolean>;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* State of the sequencer.
|
|
106
|
+
*/
|
|
107
|
+
export declare enum SequencerState {
|
|
108
|
+
/**
|
|
109
|
+
* Will move to WAITING_FOR_TXS after a configured amount of time.
|
|
110
|
+
*/
|
|
111
|
+
IDLE = 0,
|
|
112
|
+
/**
|
|
113
|
+
* Polling the P2P module for txs to include in a block. Will move to CREATING_BLOCK if there are valid txs to include, or back to IDLE otherwise.
|
|
114
|
+
*/
|
|
115
|
+
WAITING_FOR_TXS = 1,
|
|
116
|
+
/**
|
|
117
|
+
* Creating a new L2 block. Includes processing public function calls and running rollup circuits. Will move to PUBLISHING_CONTRACT_DATA.
|
|
118
|
+
*/
|
|
119
|
+
CREATING_BLOCK = 2,
|
|
120
|
+
/**
|
|
121
|
+
* Sending the tx to L1 with encrypted logs and awaiting it to be mined. Will move back to PUBLISHING_BLOCK once finished.
|
|
122
|
+
*/
|
|
123
|
+
PUBLISHING_CONTRACT_DATA = 3,
|
|
124
|
+
/**
|
|
125
|
+
* Sending the tx to L1 with the L2 block data and awaiting it to be mined. Will move to IDLE.
|
|
126
|
+
*/
|
|
127
|
+
PUBLISHING_BLOCK = 4,
|
|
128
|
+
/**
|
|
129
|
+
* Sequencer is stopped and not processing any txs from the pool.
|
|
130
|
+
*/
|
|
131
|
+
STOPPED = 5
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=sequencer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequencer.d.ts","sourceRoot":"","sources":["../../src/sequencer/sequencer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAG9C,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAGL,mBAAmB,EACnB,OAAO,EACP,aAAa,EAEb,EAAE,EACH,MAAM,cAAc,CAAC;AACtB,OAAO,EAAoB,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE9E,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAE3D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AAErF;;;;;;;;GAQG;AACH,qBAAa,SAAS;IAWlB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,mBAAmB;IAC3B,OAAO,CAAC,sBAAsB;IAE9B,OAAO,CAAC,GAAG;IAnBb,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,cAAc,CAAM;IAC5B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,OAAO,CAAK;gBAGV,SAAS,EAAE,WAAW,EACtB,cAAc,EAAE,qBAAqB,EACrC,SAAS,EAAE,GAAG,EACd,UAAU,EAAE,sBAAsB,EAClC,YAAY,EAAE,YAAY,EAC1B,aAAa,EAAE,aAAa,EAC5B,mBAAmB,EAAE,mBAAmB,EACxC,sBAAsB,EAAE,sBAAsB,EACtD,MAAM,EAAE,eAAe,EACf,GAAG,8CAAuC;IAapD;;OAEG;IACU,KAAK;IASlB;;OAEG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAOlC;;OAEG;IACI,OAAO;IAMd;;;OAGG;IACI,MAAM;;;cAIG,WAAW;IAK3B;;OAEG;cACa,IAAI;IAkEpB;;;;OAIG;cACa,yBAAyB,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO;IA2BxE;;;OAGG;cACa,cAAc,CAAC,KAAK,EAAE,OAAO;cAa7B,YAAY,CAAC,GAAG,EAAE,EAAE,EAAE;IA4BtC;;;OAGG;cACa,aAAa;IAS7B;;;;;;;OAOG;cACa,UAAU,CACxB,GAAG,EAAE,WAAW,EAAE,EAClB,iBAAiB,EAAE,EAAE,EAAE,EACvB,OAAO,EAAE,WAAW,EACpB,eAAe,EAAE,eAAe;IAalC;;;;OAIG;cACa,wBAAwB,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;IAIzD;;;;;OAKG;cACa,eAAe,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;CAgB1D;AAED;;GAEG;AACH,oBAAY,cAAc;IACxB;;OAEG;IACH,IAAI,IAAA;IACJ;;OAEG;IACH,eAAe,IAAA;IACf;;OAEG;IACH,cAAc,IAAA;IACd;;OAEG;IACH,wBAAwB,IAAA;IACxB;;OAEG;IACH,gBAAgB,IAAA;IAChB;;OAEG;IACH,OAAO,IAAA;CACR"}
|