@aztec/prover-client 0.0.0-test.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/README.md +1 -0
  2. package/dest/bin/get-proof-inputs.d.ts +2 -0
  3. package/dest/bin/get-proof-inputs.d.ts.map +1 -0
  4. package/dest/bin/get-proof-inputs.js +51 -0
  5. package/dest/block_builder/index.d.ts +6 -0
  6. package/dest/block_builder/index.d.ts.map +1 -0
  7. package/dest/block_builder/index.js +1 -0
  8. package/dest/block_builder/light.d.ts +33 -0
  9. package/dest/block_builder/light.d.ts.map +1 -0
  10. package/dest/block_builder/light.js +82 -0
  11. package/dest/config.d.ts +17 -0
  12. package/dest/config.d.ts.map +1 -0
  13. package/dest/config.js +39 -0
  14. package/dest/index.d.ts +4 -0
  15. package/dest/index.d.ts.map +1 -0
  16. package/dest/index.js +2 -0
  17. package/dest/mocks/fixtures.d.ts +20 -0
  18. package/dest/mocks/fixtures.d.ts.map +1 -0
  19. package/dest/mocks/fixtures.js +77 -0
  20. package/dest/mocks/test_context.d.ts +55 -0
  21. package/dest/mocks/test_context.d.ts.map +1 -0
  22. package/dest/mocks/test_context.js +193 -0
  23. package/dest/orchestrator/block-building-helpers.d.ts +55 -0
  24. package/dest/orchestrator/block-building-helpers.d.ts.map +1 -0
  25. package/dest/orchestrator/block-building-helpers.js +285 -0
  26. package/dest/orchestrator/block-proving-state.d.ts +76 -0
  27. package/dest/orchestrator/block-proving-state.d.ts.map +1 -0
  28. package/dest/orchestrator/block-proving-state.js +269 -0
  29. package/dest/orchestrator/epoch-proving-state.d.ts +60 -0
  30. package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -0
  31. package/dest/orchestrator/epoch-proving-state.js +163 -0
  32. package/dest/orchestrator/index.d.ts +2 -0
  33. package/dest/orchestrator/index.d.ts.map +1 -0
  34. package/dest/orchestrator/index.js +1 -0
  35. package/dest/orchestrator/orchestrator.d.ts +110 -0
  36. package/dest/orchestrator/orchestrator.d.ts.map +1 -0
  37. package/dest/orchestrator/orchestrator.js +690 -0
  38. package/dest/orchestrator/orchestrator_metrics.d.ts +8 -0
  39. package/dest/orchestrator/orchestrator_metrics.d.ts.map +1 -0
  40. package/dest/orchestrator/orchestrator_metrics.js +17 -0
  41. package/dest/orchestrator/tx-proving-state.d.ts +34 -0
  42. package/dest/orchestrator/tx-proving-state.d.ts.map +1 -0
  43. package/dest/orchestrator/tx-proving-state.js +94 -0
  44. package/dest/prover-client/factory.d.ts +6 -0
  45. package/dest/prover-client/factory.d.ts.map +1 -0
  46. package/dest/prover-client/factory.js +5 -0
  47. package/dest/prover-client/index.d.ts +3 -0
  48. package/dest/prover-client/index.d.ts.map +1 -0
  49. package/dest/prover-client/index.js +2 -0
  50. package/dest/prover-client/prover-client.d.ts +42 -0
  51. package/dest/prover-client/prover-client.d.ts.map +1 -0
  52. package/dest/prover-client/prover-client.js +110 -0
  53. package/dest/prover-client/server-epoch-prover.d.ts +28 -0
  54. package/dest/prover-client/server-epoch-prover.d.ts.map +1 -0
  55. package/dest/prover-client/server-epoch-prover.js +40 -0
  56. package/dest/proving_broker/broker_prover_facade.d.ts +46 -0
  57. package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -0
  58. package/dest/proving_broker/broker_prover_facade.js +344 -0
  59. package/dest/proving_broker/config.d.ts +83 -0
  60. package/dest/proving_broker/config.d.ts.map +1 -0
  61. package/dest/proving_broker/config.js +104 -0
  62. package/dest/proving_broker/factory.d.ts +5 -0
  63. package/dest/proving_broker/factory.d.ts.map +1 -0
  64. package/dest/proving_broker/factory.js +9 -0
  65. package/dest/proving_broker/fixtures.d.ts +5 -0
  66. package/dest/proving_broker/fixtures.d.ts.map +1 -0
  67. package/dest/proving_broker/fixtures.js +12 -0
  68. package/dest/proving_broker/index.d.ts +10 -0
  69. package/dest/proving_broker/index.d.ts.map +1 -0
  70. package/dest/proving_broker/index.js +9 -0
  71. package/dest/proving_broker/proof_store/factory.d.ts +6 -0
  72. package/dest/proving_broker/proof_store/factory.d.ts.map +1 -0
  73. package/dest/proving_broker/proof_store/factory.js +36 -0
  74. package/dest/proving_broker/proof_store/gcs_proof_store.d.ts +14 -0
  75. package/dest/proving_broker/proof_store/gcs_proof_store.d.ts.map +1 -0
  76. package/dest/proving_broker/proof_store/gcs_proof_store.js +51 -0
  77. package/dest/proving_broker/proof_store/index.d.ts +4 -0
  78. package/dest/proving_broker/proof_store/index.d.ts.map +1 -0
  79. package/dest/proving_broker/proof_store/index.js +3 -0
  80. package/dest/proving_broker/proof_store/inline_proof_store.d.ts +15 -0
  81. package/dest/proving_broker/proof_store/inline_proof_store.d.ts.map +1 -0
  82. package/dest/proving_broker/proof_store/inline_proof_store.js +41 -0
  83. package/dest/proving_broker/proof_store/proof_store.d.ts +36 -0
  84. package/dest/proving_broker/proof_store/proof_store.d.ts.map +1 -0
  85. package/dest/proving_broker/proof_store/proof_store.js +3 -0
  86. package/dest/proving_broker/proving_agent.d.ts +46 -0
  87. package/dest/proving_broker/proving_agent.d.ts.map +1 -0
  88. package/dest/proving_broker/proving_agent.js +134 -0
  89. package/dest/proving_broker/proving_agent_instrumentation.d.ts +8 -0
  90. package/dest/proving_broker/proving_agent_instrumentation.d.ts.map +1 -0
  91. package/dest/proving_broker/proving_agent_instrumentation.js +16 -0
  92. package/dest/proving_broker/proving_broker.d.ts +64 -0
  93. package/dest/proving_broker/proving_broker.d.ts.map +1 -0
  94. package/dest/proving_broker/proving_broker.js +570 -0
  95. package/dest/proving_broker/proving_broker_database/memory.d.ts +16 -0
  96. package/dest/proving_broker/proving_broker_database/memory.d.ts.map +1 -0
  97. package/dest/proving_broker/proving_broker_database/memory.js +54 -0
  98. package/dest/proving_broker/proving_broker_database/persisted.d.ts +25 -0
  99. package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -0
  100. package/dest/proving_broker/proving_broker_database/persisted.js +182 -0
  101. package/dest/proving_broker/proving_broker_database.d.ts +39 -0
  102. package/dest/proving_broker/proving_broker_database.d.ts.map +1 -0
  103. package/dest/proving_broker/proving_broker_database.js +3 -0
  104. package/dest/proving_broker/proving_broker_instrumentation.d.ts +29 -0
  105. package/dest/proving_broker/proving_broker_instrumentation.d.ts.map +1 -0
  106. package/dest/proving_broker/proving_broker_instrumentation.js +110 -0
  107. package/dest/proving_broker/proving_job_controller.d.ts +33 -0
  108. package/dest/proving_broker/proving_job_controller.d.ts.map +1 -0
  109. package/dest/proving_broker/proving_job_controller.js +166 -0
  110. package/dest/proving_broker/rpc.d.ts +27 -0
  111. package/dest/proving_broker/rpc.d.ts.map +1 -0
  112. package/dest/proving_broker/rpc.js +66 -0
  113. package/dest/test/mock_prover.d.ts +35 -0
  114. package/dest/test/mock_prover.d.ts.map +1 -0
  115. package/dest/test/mock_prover.js +82 -0
  116. package/package.json +112 -0
  117. package/src/bin/get-proof-inputs.ts +59 -0
  118. package/src/block_builder/index.ts +6 -0
  119. package/src/block_builder/light.ts +101 -0
  120. package/src/config.ts +55 -0
  121. package/src/index.ts +4 -0
  122. package/src/mocks/fixtures.ts +117 -0
  123. package/src/mocks/test_context.ts +257 -0
  124. package/src/orchestrator/block-building-helpers.ts +553 -0
  125. package/src/orchestrator/block-proving-state.ts +379 -0
  126. package/src/orchestrator/epoch-proving-state.ts +252 -0
  127. package/src/orchestrator/index.ts +1 -0
  128. package/src/orchestrator/orchestrator.ts +971 -0
  129. package/src/orchestrator/orchestrator_metrics.ts +22 -0
  130. package/src/orchestrator/tx-proving-state.ts +139 -0
  131. package/src/prover-client/factory.ts +14 -0
  132. package/src/prover-client/index.ts +2 -0
  133. package/src/prover-client/prover-client.ts +162 -0
  134. package/src/prover-client/server-epoch-prover.ts +51 -0
  135. package/src/proving_broker/broker_prover_facade.ts +585 -0
  136. package/src/proving_broker/config.ts +138 -0
  137. package/src/proving_broker/factory.ts +18 -0
  138. package/src/proving_broker/fixtures.ts +15 -0
  139. package/src/proving_broker/index.ts +9 -0
  140. package/src/proving_broker/proof_store/factory.ts +42 -0
  141. package/src/proving_broker/proof_store/gcs_proof_store.ts +72 -0
  142. package/src/proving_broker/proof_store/index.ts +3 -0
  143. package/src/proving_broker/proof_store/inline_proof_store.ts +63 -0
  144. package/src/proving_broker/proof_store/proof_store.ts +54 -0
  145. package/src/proving_broker/proving_agent.ts +181 -0
  146. package/src/proving_broker/proving_agent_instrumentation.ts +21 -0
  147. package/src/proving_broker/proving_broker.ts +687 -0
  148. package/src/proving_broker/proving_broker_database/memory.ts +63 -0
  149. package/src/proving_broker/proving_broker_database/persisted.ts +218 -0
  150. package/src/proving_broker/proving_broker_database.ts +44 -0
  151. package/src/proving_broker/proving_broker_instrumentation.ts +145 -0
  152. package/src/proving_broker/proving_job_controller.ts +194 -0
  153. package/src/proving_broker/rpc.ts +95 -0
  154. package/src/test/mock_prover.ts +253 -0
package/README.md ADDED
@@ -0,0 +1 @@
1
+ # Prover Client
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=get-proof-inputs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-proof-inputs.d.ts","sourceRoot":"","sources":["../../src/bin/get-proof-inputs.ts"],"names":[],"mappings":""}
@@ -0,0 +1,51 @@
1
+ /* eslint-disable no-console */ import { AVM_INPUTS_FILENAME } from '@aztec/bb-prover';
2
+ import { jsonParseWithSchema, jsonStringify } from '@aztec/foundation/json-rpc';
3
+ import { createLogger } from '@aztec/foundation/log';
4
+ import { ProvingJobInputs } from '@aztec/stdlib/interfaces/server';
5
+ import { ProvingRequestType } from '@aztec/stdlib/proofs';
6
+ import { mkdirSync, writeFileSync } from 'fs';
7
+ import { createProofStoreForUri } from '../proving_broker/index.js';
8
+ const logger = createLogger('prover-client:get-proof-inputs');
9
+ function printUsage() {
10
+ console.error('Usage: get-proof-inputs <proof-uri> [out-dir=.]');
11
+ }
12
+ async function main() {
13
+ if (process.argv[2] === '--help') {
14
+ printUsage();
15
+ return;
16
+ }
17
+ const uri = process.argv[2];
18
+ const outDir = process.argv[3] || '.';
19
+ if (!uri) {
20
+ printUsage();
21
+ throw new Error('Missing proof URI');
22
+ }
23
+ mkdirSync(outDir, {
24
+ recursive: true
25
+ });
26
+ const proofStore = createProofStoreForUri(uri);
27
+ logger.info(`Processing uri ${uri}`);
28
+ const input = await proofStore.getProofInput(uri);
29
+ logger.info(`Found inputs for ${ProvingRequestType[input.type]}`);
30
+ writeProofInputs(input, outDir);
31
+ console.log((await jsonParseWithSchema(jsonStringify(input), ProvingJobInputs)).inputs);
32
+ }
33
+ // This mimics the behavior of bb-prover/src/bb/execute.ts
34
+ function writeProofInputs(input, outDir) {
35
+ switch(input.type){
36
+ case ProvingRequestType.PUBLIC_VM:
37
+ {
38
+ writeFileSync(`${outDir}/${AVM_INPUTS_FILENAME}`, input.inputs.serializeWithMessagePack());
39
+ logger.info(`Wrote AVM inputs to ${AVM_INPUTS_FILENAME}`);
40
+ break;
41
+ }
42
+ default:
43
+ {
44
+ throw new Error(`Unimplemented proving request type: ${ProvingRequestType[input.type]}`);
45
+ }
46
+ }
47
+ }
48
+ main().catch((err)=>{
49
+ console.error(err);
50
+ process.exit(1);
51
+ });
@@ -0,0 +1,6 @@
1
+ import type { BlockBuilder, MerkleTreeReadOperations } from '@aztec/stdlib/interfaces/server';
2
+ export * from './light.js';
3
+ export interface BlockBuilderFactory {
4
+ create(db: MerkleTreeReadOperations): BlockBuilder;
5
+ }
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/block_builder/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAE9F,cAAc,YAAY,CAAC;AAC3B,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,EAAE,wBAAwB,GAAG,YAAY,CAAC;CACpD"}
@@ -0,0 +1 @@
1
+ export * from './light.js';
@@ -0,0 +1,33 @@
1
+ import { Fr } from '@aztec/foundation/fields';
2
+ import { L2Block } from '@aztec/stdlib/block';
3
+ import type { BlockBuilder, MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
4
+ import { type GlobalVariables, type ProcessedTx } from '@aztec/stdlib/tx';
5
+ import { type TelemetryClient } from '@aztec/telemetry-client';
6
+ /**
7
+ * Builds a block and its header from a set of processed tx without running any circuits.
8
+ */
9
+ export declare class LightweightBlockBuilder implements BlockBuilder {
10
+ private db;
11
+ private telemetry;
12
+ private spongeBlobState?;
13
+ private globalVariables?;
14
+ private l1ToL2Messages?;
15
+ private txs;
16
+ private readonly logger;
17
+ constructor(db: MerkleTreeWriteOperations, telemetry?: TelemetryClient);
18
+ startNewBlock(globalVariables: GlobalVariables, l1ToL2Messages: Fr[]): Promise<void>;
19
+ addTxs(txs: ProcessedTx[]): Promise<void>;
20
+ setBlockCompleted(): Promise<L2Block>;
21
+ private buildBlock;
22
+ }
23
+ export declare class LightweightBlockBuilderFactory {
24
+ private telemetry;
25
+ constructor(telemetry?: TelemetryClient);
26
+ create(db: MerkleTreeWriteOperations): BlockBuilder;
27
+ }
28
+ /**
29
+ * Creates a block builder under the hood with the given txs and messages and creates a block.
30
+ * @param db - A db fork to use for block building.
31
+ */
32
+ export declare function buildBlock(txs: ProcessedTx[], globalVariables: GlobalVariables, l1ToL2Messages: Fr[], db: MerkleTreeWriteOperations, telemetry?: TelemetryClient): Promise<L2Block>;
33
+ //# sourceMappingURL=light.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"light.d.ts","sourceRoot":"","sources":["../../src/block_builder/light.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAE9C,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAE/F,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,WAAW,EAAmB,MAAM,kBAAkB,CAAC;AAC3F,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAQnF;;GAEG;AACH,qBAAa,uBAAwB,YAAW,YAAY;IAS9C,OAAO,CAAC,EAAE;IAA6B,OAAO,CAAC,SAAS;IARpE,OAAO,CAAC,eAAe,CAAC,CAAa;IACrC,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C,OAAO,CAAC,cAAc,CAAC,CAAO;IAE9B,OAAO,CAAC,GAAG,CAAqB;IAEhC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+C;gBAElD,EAAE,EAAE,yBAAyB,EAAU,SAAS,GAAE,eAAsC;IAEtG,aAAa,CAAC,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAWpF,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAS/C,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC;YAIvB,UAAU;CAoBzB;AAED,qBAAa,8BAA8B;IAC7B,OAAO,CAAC,SAAS;gBAAT,SAAS,GAAE,eAAsC;IAErE,MAAM,CAAC,EAAE,EAAE,yBAAyB,GAAG,YAAY;CAGpD;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,WAAW,EAAE,EAClB,eAAe,EAAE,eAAe,EAChC,cAAc,EAAE,EAAE,EAAE,EACpB,EAAE,EAAE,yBAAyB,EAC7B,SAAS,GAAE,eAAsC,oBAMlD"}
@@ -0,0 +1,82 @@
1
+ import { SpongeBlob } from '@aztec/blob-lib';
2
+ import { NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/constants';
3
+ import { padArrayEnd } from '@aztec/foundation/collection';
4
+ import { Fr } from '@aztec/foundation/fields';
5
+ import { createLogger } from '@aztec/foundation/log';
6
+ import { L2Block } from '@aztec/stdlib/block';
7
+ import { MerkleTreeId } from '@aztec/stdlib/trees';
8
+ import { toNumBlobFields } from '@aztec/stdlib/tx';
9
+ import { getTelemetryClient } from '@aztec/telemetry-client';
10
+ import { buildBaseRollupHints, buildHeaderAndBodyFromTxs, getTreeSnapshot } from '../orchestrator/block-building-helpers.js';
11
+ /**
12
+ * Builds a block and its header from a set of processed tx without running any circuits.
13
+ */ export class LightweightBlockBuilder {
14
+ db;
15
+ telemetry;
16
+ spongeBlobState;
17
+ globalVariables;
18
+ l1ToL2Messages;
19
+ txs;
20
+ logger;
21
+ constructor(db, telemetry = getTelemetryClient()){
22
+ this.db = db;
23
+ this.telemetry = telemetry;
24
+ this.txs = [];
25
+ this.logger = createLogger('prover-client:block_builder');
26
+ }
27
+ async startNewBlock(globalVariables, l1ToL2Messages) {
28
+ this.logger.debug('Starting new block', {
29
+ globalVariables: globalVariables.toInspect(),
30
+ l1ToL2Messages
31
+ });
32
+ this.globalVariables = globalVariables;
33
+ this.l1ToL2Messages = padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP);
34
+ this.txs = [];
35
+ this.spongeBlobState = undefined;
36
+ // Update L1 to L2 tree
37
+ await this.db.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, this.l1ToL2Messages);
38
+ }
39
+ async addTxs(txs) {
40
+ this.spongeBlobState = SpongeBlob.init(toNumBlobFields(txs));
41
+ for (const tx of txs){
42
+ this.logger.debug('Adding new tx to block', {
43
+ txHash: tx.hash.toString()
44
+ });
45
+ this.txs.push(tx);
46
+ await buildBaseRollupHints(tx, this.globalVariables, this.db, this.spongeBlobState);
47
+ }
48
+ }
49
+ setBlockCompleted() {
50
+ return this.buildBlock();
51
+ }
52
+ async buildBlock() {
53
+ const { header, body } = await buildHeaderAndBodyFromTxs(this.txs, this.globalVariables, this.l1ToL2Messages, this.db);
54
+ await this.db.updateArchive(header);
55
+ const newArchive = await getTreeSnapshot(MerkleTreeId.ARCHIVE, this.db);
56
+ const block = new L2Block(newArchive, header, body);
57
+ this.logger.debug(`Built block ${block.number}`, {
58
+ globalVariables: this.globalVariables?.toInspect(),
59
+ archiveRoot: newArchive.root.toString(),
60
+ blockHash: block.hash.toString()
61
+ });
62
+ return block;
63
+ }
64
+ }
65
+ export class LightweightBlockBuilderFactory {
66
+ telemetry;
67
+ constructor(telemetry = getTelemetryClient()){
68
+ this.telemetry = telemetry;
69
+ }
70
+ create(db) {
71
+ return new LightweightBlockBuilder(db, this.telemetry);
72
+ }
73
+ }
74
+ /**
75
+ * Creates a block builder under the hood with the given txs and messages and creates a block.
76
+ * @param db - A db fork to use for block building.
77
+ */ export async function buildBlock(txs, globalVariables, l1ToL2Messages, db, telemetry = getTelemetryClient()) {
78
+ const builder = new LightweightBlockBuilder(db, telemetry);
79
+ await builder.startNewBlock(globalVariables, l1ToL2Messages);
80
+ await builder.addTxs(txs);
81
+ return await builder.setBlockCompleted();
82
+ }
@@ -0,0 +1,17 @@
1
+ import type { ACVMConfig, BBConfig } from '@aztec/bb-prover';
2
+ import { type ConfigMappingsType } from '@aztec/foundation/config';
3
+ import { type ProverConfig } from '@aztec/stdlib/interfaces/server';
4
+ import { type ProverAgentConfig, type ProverBrokerConfig } from './proving_broker/config.js';
5
+ /**
6
+ * The prover configuration.
7
+ */
8
+ export type ProverClientConfig = ProverConfig & ProverAgentConfig & ProverBrokerConfig & BBConfig & ACVMConfig;
9
+ export declare const bbConfigMappings: ConfigMappingsType<BBConfig & ACVMConfig>;
10
+ export declare const proverClientConfigMappings: ConfigMappingsType<ProverClientConfig>;
11
+ /**
12
+ * Returns the prover configuration from the environment variables.
13
+ * Note: If an environment variable is not set, the default value is used.
14
+ * @returns The prover configuration.
15
+ */
16
+ export declare function getProverEnvVars(): ProverClientConfig;
17
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,KAAK,kBAAkB,EAA8C,MAAM,0BAA0B,CAAC;AAC/G,OAAO,EAAE,KAAK,YAAY,EAAwB,MAAM,iCAAiC,CAAC;AAE1F,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EAGxB,MAAM,4BAA4B,CAAC;AAEpC;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE/G,eAAO,MAAM,gBAAgB,EAAE,kBAAkB,CAAC,QAAQ,GAAG,UAAU,CAsBtE,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,kBAAkB,CAAC,kBAAkB,CAK7E,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,kBAAkB,CAErD"}
package/dest/config.js ADDED
@@ -0,0 +1,39 @@
1
+ import { booleanConfigHelper, getConfigFromMappings } from '@aztec/foundation/config';
2
+ import { proverConfigMappings } from '@aztec/stdlib/interfaces/server';
3
+ import { proverAgentConfigMappings, proverBrokerConfigMappings } from './proving_broker/config.js';
4
+ export const bbConfigMappings = {
5
+ acvmWorkingDirectory: {
6
+ env: 'ACVM_WORKING_DIRECTORY',
7
+ description: 'The working directory to use for simulation/proving'
8
+ },
9
+ acvmBinaryPath: {
10
+ env: 'ACVM_BINARY_PATH',
11
+ description: 'The path to the ACVM binary'
12
+ },
13
+ bbWorkingDirectory: {
14
+ env: 'BB_WORKING_DIRECTORY',
15
+ description: 'The working directory to use for proving'
16
+ },
17
+ bbBinaryPath: {
18
+ env: 'BB_BINARY_PATH',
19
+ description: 'The path to the bb binary'
20
+ },
21
+ bbSkipCleanup: {
22
+ env: 'BB_SKIP_CLEANUP',
23
+ description: 'Whether to skip cleanup of bb temporary files',
24
+ ...booleanConfigHelper(false)
25
+ }
26
+ };
27
+ export const proverClientConfigMappings = {
28
+ ...bbConfigMappings,
29
+ ...proverConfigMappings,
30
+ ...proverAgentConfigMappings,
31
+ ...proverBrokerConfigMappings
32
+ };
33
+ /**
34
+ * Returns the prover configuration from the environment variables.
35
+ * Note: If an environment variable is not set, the default value is used.
36
+ * @returns The prover configuration.
37
+ */ export function getProverEnvVars() {
38
+ return getConfigFromMappings(proverClientConfigMappings);
39
+ }
@@ -0,0 +1,4 @@
1
+ export type { EpochProverManager } from '@aztec/stdlib/interfaces/server';
2
+ export * from './prover-client/index.js';
3
+ export * from './config.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAE1E,cAAc,0BAA0B,CAAC;AACzC,cAAc,aAAa,CAAC"}
package/dest/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from './prover-client/index.js';
2
+ export * from './config.js';
@@ -0,0 +1,20 @@
1
+ import type { Logger } from '@aztec/foundation/log';
2
+ import { type SimulationProvider } from '@aztec/simulator/server';
3
+ import type { MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
4
+ import type { ProcessedTx } from '@aztec/stdlib/tx';
5
+ import { GlobalVariables } from '@aztec/stdlib/tx';
6
+ export declare const getEnvironmentConfig: (logger: Logger) => Promise<{
7
+ acvmWorkingDirectory: string;
8
+ bbWorkingDirectory: string;
9
+ expectedAcvmPath: string;
10
+ expectedBBPath: string;
11
+ directoryToCleanup: string | undefined;
12
+ bbSkipCleanup: boolean;
13
+ } | undefined>;
14
+ export declare function getSimulationProvider(config: {
15
+ acvmWorkingDirectory: string | undefined;
16
+ acvmBinaryPath: string | undefined;
17
+ }, logger?: Logger): Promise<SimulationProvider>;
18
+ export declare const updateExpectedTreesFromTxs: (db: MerkleTreeWriteOperations, txs: ProcessedTx[]) => Promise<void>;
19
+ export declare const makeGlobals: (blockNumber: number) => GlobalVariables;
20
+ //# sourceMappingURL=fixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../src/mocks/fixtures.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAuB,KAAK,kBAAkB,EAA0B,MAAM,yBAAyB,CAAC;AAG/G,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAEjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAiBnD,eAAO,MAAM,oBAAoB,WAAkB,MAAM;;;;;;;cAkCxD,CAAC;AAEF,wBAAsB,qBAAqB,CACzC,MAAM,EAAE;IAAE,oBAAoB,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,EACxF,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,kBAAkB,CAAC,CAe7B;AAGD,eAAO,MAAM,0BAA0B,OAAc,yBAAyB,OAAO,WAAW,EAAE,kBAgBjG,CAAC;AAEF,eAAO,MAAM,WAAW,gBAAiB,MAAM,oBAW9C,CAAC"}
@@ -0,0 +1,77 @@
1
+ import { MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, NULLIFIER_TREE_HEIGHT } from '@aztec/constants';
2
+ import { padArrayEnd } from '@aztec/foundation/collection';
3
+ import { randomBytes } from '@aztec/foundation/crypto';
4
+ import { EthAddress } from '@aztec/foundation/eth-address';
5
+ import { Fr } from '@aztec/foundation/fields';
6
+ import { fileURLToPath } from '@aztec/foundation/url';
7
+ import { NativeACVMSimulator, WASMSimulatorWithBlobs } from '@aztec/simulator/server';
8
+ import { AztecAddress } from '@aztec/stdlib/aztec-address';
9
+ import { GasFees } from '@aztec/stdlib/gas';
10
+ import { MerkleTreeId } from '@aztec/stdlib/trees';
11
+ import { GlobalVariables } from '@aztec/stdlib/tx';
12
+ import { promises as fs } from 'fs';
13
+ import path from 'path';
14
+ const { BB_RELEASE_DIR = 'cpp/build/bin', TEMP_DIR = '/tmp', BB_BINARY_PATH = '', BB_WORKING_DIRECTORY = '', BB_SKIP_CLEANUP = '', NOIR_RELEASE_DIR = 'noir-repo/target/release', ACVM_BINARY_PATH = '', ACVM_WORKING_DIRECTORY = '' } = process.env;
15
+ // Determines if we have access to the bb binary and a tmp folder for temp files
16
+ export const getEnvironmentConfig = async (logger)=>{
17
+ try {
18
+ const expectedBBPath = BB_BINARY_PATH ? BB_BINARY_PATH : `${path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../../../barretenberg/', BB_RELEASE_DIR)}/bb`;
19
+ await fs.access(expectedBBPath, fs.constants.R_OK);
20
+ const tempWorkingDirectory = `${TEMP_DIR}/${randomBytes(4).toString('hex')}`;
21
+ const bbWorkingDirectory = BB_WORKING_DIRECTORY ? BB_WORKING_DIRECTORY : `${tempWorkingDirectory}/bb`;
22
+ await fs.mkdir(bbWorkingDirectory, {
23
+ recursive: true
24
+ });
25
+ logger.info(`Found native BB binary at ${expectedBBPath} with working directory ${bbWorkingDirectory}`);
26
+ const expectedAcvmPath = ACVM_BINARY_PATH ? ACVM_BINARY_PATH : `${path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../../../noir/', NOIR_RELEASE_DIR)}/acvm`;
27
+ await fs.access(expectedAcvmPath, fs.constants.R_OK);
28
+ const acvmWorkingDirectory = ACVM_WORKING_DIRECTORY ? ACVM_WORKING_DIRECTORY : `${tempWorkingDirectory}/acvm`;
29
+ await fs.mkdir(acvmWorkingDirectory, {
30
+ recursive: true
31
+ });
32
+ logger.info(`Found native ACVM binary at ${expectedAcvmPath} with working directory ${acvmWorkingDirectory}`);
33
+ const bbSkipCleanup = [
34
+ '1',
35
+ 'true'
36
+ ].includes(BB_SKIP_CLEANUP);
37
+ bbSkipCleanup && logger.verbose(`Not going to clean up BB working directory ${bbWorkingDirectory} after run`);
38
+ return {
39
+ acvmWorkingDirectory,
40
+ bbWorkingDirectory,
41
+ expectedAcvmPath,
42
+ expectedBBPath,
43
+ directoryToCleanup: ACVM_WORKING_DIRECTORY && BB_WORKING_DIRECTORY ? undefined : tempWorkingDirectory,
44
+ bbSkipCleanup
45
+ };
46
+ } catch (err) {
47
+ logger.info(`Native BB not available: ${err}`);
48
+ return undefined;
49
+ }
50
+ };
51
+ export async function getSimulationProvider(config, logger) {
52
+ if (config.acvmBinaryPath && config.acvmWorkingDirectory) {
53
+ try {
54
+ await fs.access(config.acvmBinaryPath, fs.constants.R_OK);
55
+ await fs.mkdir(config.acvmWorkingDirectory, {
56
+ recursive: true
57
+ });
58
+ logger?.info(`Using native ACVM at ${config.acvmBinaryPath} and working directory ${config.acvmWorkingDirectory}`);
59
+ return new NativeACVMSimulator(config.acvmWorkingDirectory, config.acvmBinaryPath);
60
+ } catch {
61
+ logger?.warn(`Failed to access ACVM at ${config.acvmBinaryPath}, falling back to WASM`);
62
+ }
63
+ }
64
+ logger?.info('Using WASM ACVM simulation');
65
+ return new WASMSimulatorWithBlobs();
66
+ }
67
+ // Updates the expectedDb trees based on the new note hashes, contracts, and nullifiers from these txs
68
+ export const updateExpectedTreesFromTxs = async (db, txs)=>{
69
+ await db.appendLeaves(MerkleTreeId.NOTE_HASH_TREE, txs.flatMap((tx)=>padArrayEnd(tx.txEffect.noteHashes, Fr.zero(), MAX_NOTE_HASHES_PER_TX)));
70
+ await db.batchInsert(MerkleTreeId.NULLIFIER_TREE, txs.flatMap((tx)=>padArrayEnd(tx.txEffect.nullifiers, Fr.zero(), MAX_NULLIFIERS_PER_TX).map((x)=>x.toBuffer())), NULLIFIER_TREE_HEIGHT);
71
+ for (const tx of txs){
72
+ await db.sequentialInsert(MerkleTreeId.PUBLIC_DATA_TREE, tx.txEffect.publicDataWrites.map((write)=>write.toBuffer()));
73
+ }
74
+ };
75
+ export const makeGlobals = (blockNumber)=>{
76
+ return new GlobalVariables(Fr.ZERO, Fr.ZERO, new Fr(blockNumber), new Fr(blockNumber), new Fr(blockNumber), EthAddress.ZERO, AztecAddress.ZERO, GasFees.empty());
77
+ };
@@ -0,0 +1,55 @@
1
+ import type { BBProverConfig } from '@aztec/bb-prover';
2
+ import { Fr } from '@aztec/foundation/fields';
3
+ import type { Logger } from '@aztec/foundation/log';
4
+ import { PublicProcessor, PublicTxSimulationTester, PublicTxSimulator } from '@aztec/simulator/server';
5
+ import { AztecAddress } from '@aztec/stdlib/aztec-address';
6
+ import type { L2Block } from '@aztec/stdlib/block';
7
+ import type { ServerCircuitProver } from '@aztec/stdlib/interfaces/server';
8
+ import { makeBloatedProcessedTx } from '@aztec/stdlib/testing';
9
+ import { type AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
10
+ import { type BlockHeader, type GlobalVariables, type ProcessedTx, type Tx } from '@aztec/stdlib/tx';
11
+ import type { MerkleTreeAdminDatabase } from '@aztec/world-state';
12
+ import { ProvingOrchestrator } from '../orchestrator/index.js';
13
+ import { BrokerCircuitProverFacade } from '../proving_broker/broker_prover_facade.js';
14
+ import { TestBroker } from '../test/mock_prover.js';
15
+ export declare class TestContext {
16
+ publicTxSimulator: PublicTxSimulator;
17
+ worldState: MerkleTreeAdminDatabase;
18
+ publicProcessor: PublicProcessor;
19
+ globalVariables: GlobalVariables;
20
+ prover: ServerCircuitProver;
21
+ broker: TestBroker;
22
+ brokerProverFacade: BrokerCircuitProverFacade;
23
+ orchestrator: TestProvingOrchestrator;
24
+ blockNumber: number;
25
+ feePayer: AztecAddress;
26
+ directoriesToCleanup: string[];
27
+ tester: PublicTxSimulationTester;
28
+ logger: Logger;
29
+ private headers;
30
+ private feePayerBalance;
31
+ constructor(publicTxSimulator: PublicTxSimulator, worldState: MerkleTreeAdminDatabase, publicProcessor: PublicProcessor, globalVariables: GlobalVariables, prover: ServerCircuitProver, broker: TestBroker, brokerProverFacade: BrokerCircuitProverFacade, orchestrator: TestProvingOrchestrator, blockNumber: number, feePayer: AztecAddress, initialFeePayerBalance: Fr, directoriesToCleanup: string[], tester: PublicTxSimulationTester, logger: Logger);
32
+ get epochProver(): TestProvingOrchestrator;
33
+ static new(logger: Logger, proverCount?: number, createProver?: (bbConfig: BBProverConfig) => Promise<ServerCircuitProver>, blockNumber?: number): Promise<TestContext>;
34
+ getFork(): Promise<import("@aztec/stdlib/trees").MerkleTreeWriteOperations>;
35
+ getBlockHeader(blockNumber: 0): BlockHeader;
36
+ getBlockHeader(blockNumber: number): BlockHeader | undefined;
37
+ getPreviousBlockHeader(currentBlockNumber?: number): BlockHeader;
38
+ cleanup(): Promise<void>;
39
+ makeProcessedTx(opts?: Parameters<typeof makeBloatedProcessedTx>[0]): Promise<ProcessedTx>;
40
+ makeProcessedTx(seed?: number): Promise<ProcessedTx>;
41
+ /** Creates a block with the given number of txs and adds it to world-state */
42
+ makePendingBlock(numTxs: number, numMsgs?: number, blockNumOrGlobals?: GlobalVariables | number, makeProcessedTxOpts?: (index: number) => Partial<Parameters<typeof makeBloatedProcessedTx>[0]>): Promise<{
43
+ block: L2Block;
44
+ txs: ProcessedTx[];
45
+ msgs: Fr[];
46
+ }>;
47
+ processPublicFunctions(txs: Tx[], maxTransactions: number): Promise<[ProcessedTx[], import("@aztec/stdlib/tx").FailedTx[], import("@aztec/stdlib/tx").NestedProcessReturnValues[]]>;
48
+ setTreeRoots(txs: ProcessedTx[]): Promise<void>;
49
+ }
50
+ declare class TestProvingOrchestrator extends ProvingOrchestrator {
51
+ isVerifyBuiltBlockAgainstSyncedStateEnabled: boolean;
52
+ protected verifyBuiltBlockAgainstSyncedState(l2Block: L2Block, newArchive: AppendOnlyTreeSnapshot): Promise<void>;
53
+ }
54
+ export {};
55
+ //# sourceMappingURL=test_context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_context.d.ts","sourceRoot":"","sources":["../../src/mocks/test_context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,193 @@
1
+ import { times, timesParallel } from '@aztec/foundation/collection';
2
+ import { Fr } from '@aztec/foundation/fields';
3
+ import { TestDateProvider } from '@aztec/foundation/timer';
4
+ import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
5
+ import { protocolContractTreeRoot } from '@aztec/protocol-contracts';
6
+ import { computeFeePayerBalanceLeafSlot } from '@aztec/protocol-contracts/fee-juice';
7
+ import { PublicProcessor, PublicTxSimulationTester, PublicTxSimulator, SimpleContractDataSource, WorldStateDB } from '@aztec/simulator/server';
8
+ import { PublicDataWrite } from '@aztec/stdlib/avm';
9
+ import { AztecAddress } from '@aztec/stdlib/aztec-address';
10
+ import { makeBloatedProcessedTx } from '@aztec/stdlib/testing';
11
+ import { PublicDataTreeLeaf } from '@aztec/stdlib/trees';
12
+ import { TreeSnapshots } from '@aztec/stdlib/tx';
13
+ import { NativeWorldStateService } from '@aztec/world-state/native';
14
+ import { promises as fs } from 'fs';
15
+ import { TestCircuitProver } from '../../../bb-prover/src/test/test_circuit_prover.js';
16
+ import { buildBlock } from '../block_builder/light.js';
17
+ import { ProvingOrchestrator } from '../orchestrator/index.js';
18
+ import { BrokerCircuitProverFacade } from '../proving_broker/broker_prover_facade.js';
19
+ import { TestBroker } from '../test/mock_prover.js';
20
+ import { getEnvironmentConfig, getSimulationProvider, makeGlobals, updateExpectedTreesFromTxs } from './fixtures.js';
21
+ export class TestContext {
22
+ publicTxSimulator;
23
+ worldState;
24
+ publicProcessor;
25
+ globalVariables;
26
+ prover;
27
+ broker;
28
+ brokerProverFacade;
29
+ orchestrator;
30
+ blockNumber;
31
+ feePayer;
32
+ directoriesToCleanup;
33
+ tester;
34
+ logger;
35
+ headers;
36
+ feePayerBalance;
37
+ constructor(publicTxSimulator, worldState, publicProcessor, globalVariables, prover, broker, brokerProverFacade, orchestrator, blockNumber, feePayer, initialFeePayerBalance, directoriesToCleanup, tester, logger){
38
+ this.publicTxSimulator = publicTxSimulator;
39
+ this.worldState = worldState;
40
+ this.publicProcessor = publicProcessor;
41
+ this.globalVariables = globalVariables;
42
+ this.prover = prover;
43
+ this.broker = broker;
44
+ this.brokerProverFacade = brokerProverFacade;
45
+ this.orchestrator = orchestrator;
46
+ this.blockNumber = blockNumber;
47
+ this.feePayer = feePayer;
48
+ this.directoriesToCleanup = directoriesToCleanup;
49
+ this.tester = tester;
50
+ this.logger = logger;
51
+ this.headers = new Map();
52
+ this.feePayerBalance = initialFeePayerBalance;
53
+ }
54
+ get epochProver() {
55
+ return this.orchestrator;
56
+ }
57
+ static async new(logger, proverCount = 4, createProver = async (bbConfig)=>new TestCircuitProver(await getSimulationProvider(bbConfig, logger)), blockNumber = 1) {
58
+ const directoriesToCleanup = [];
59
+ const globalVariables = makeGlobals(blockNumber);
60
+ const feePayer = AztecAddress.fromNumber(42222);
61
+ const initialFeePayerBalance = new Fr(10n ** 20n);
62
+ const feePayerSlot = await computeFeePayerBalanceLeafSlot(feePayer);
63
+ const prefilledPublicData = [
64
+ new PublicDataTreeLeaf(feePayerSlot, initialFeePayerBalance)
65
+ ];
66
+ // Separated dbs for public processor and prover - see public_processor for context
67
+ const ws = await NativeWorldStateService.tmp(undefined /* rollupAddress */ , true, prefilledPublicData);
68
+ const publicDb = await ws.fork();
69
+ const contractDataSource = new SimpleContractDataSource();
70
+ const worldStateDB = new WorldStateDB(publicDb, contractDataSource);
71
+ const tester = new PublicTxSimulationTester(worldStateDB, contractDataSource, publicDb);
72
+ const publicTxSimulator = new PublicTxSimulator(publicDb, worldStateDB, globalVariables, true);
73
+ const processor = new PublicProcessor(publicDb, globalVariables, worldStateDB, publicTxSimulator, new TestDateProvider());
74
+ let localProver;
75
+ const config = await getEnvironmentConfig(logger);
76
+ if (!config) {
77
+ localProver = new TestCircuitProver();
78
+ } else {
79
+ const bbConfig = {
80
+ acvmBinaryPath: config.expectedAcvmPath,
81
+ acvmWorkingDirectory: config.acvmWorkingDirectory,
82
+ bbBinaryPath: config.expectedBBPath,
83
+ bbWorkingDirectory: config.bbWorkingDirectory,
84
+ bbSkipCleanup: config.bbSkipCleanup
85
+ };
86
+ localProver = await createProver(bbConfig);
87
+ }
88
+ if (config?.directoryToCleanup && !config.bbSkipCleanup) {
89
+ directoriesToCleanup.push(config.directoryToCleanup);
90
+ }
91
+ const broker = new TestBroker(proverCount, localProver);
92
+ const facade = new BrokerCircuitProverFacade(broker);
93
+ const orchestrator = new TestProvingOrchestrator(ws, facade, Fr.ZERO);
94
+ await broker.start();
95
+ facade.start();
96
+ return new this(publicTxSimulator, ws, processor, globalVariables, localProver, broker, facade, orchestrator, blockNumber, feePayer, initialFeePayerBalance, directoriesToCleanup, tester, logger);
97
+ }
98
+ getFork() {
99
+ return this.worldState.fork();
100
+ }
101
+ getBlockHeader(blockNumber = 0) {
102
+ return blockNumber === 0 ? this.worldState.getCommitted().getInitialHeader() : this.headers.get(blockNumber);
103
+ }
104
+ getPreviousBlockHeader(currentBlockNumber = this.blockNumber) {
105
+ return this.getBlockHeader(currentBlockNumber - 1);
106
+ }
107
+ async cleanup() {
108
+ await this.brokerProverFacade.stop();
109
+ await this.broker.stop();
110
+ for (const dir of this.directoriesToCleanup.filter((x)=>x !== '')){
111
+ try {
112
+ await fs.rm(dir, {
113
+ recursive: true,
114
+ force: true,
115
+ maxRetries: 3
116
+ });
117
+ } catch (err) {
118
+ this.logger.warn(`Failed to delete tmp directory $dir}: ${err}`);
119
+ }
120
+ }
121
+ }
122
+ async makeProcessedTx(seedOrOpts) {
123
+ const opts = typeof seedOrOpts === 'number' ? {
124
+ seed: seedOrOpts
125
+ } : seedOrOpts;
126
+ const blockNum = (opts?.globalVariables ?? this.globalVariables).blockNumber.toNumber();
127
+ const header = this.getBlockHeader(blockNum - 1);
128
+ const tx = await makeBloatedProcessedTx({
129
+ header,
130
+ vkTreeRoot: getVKTreeRoot(),
131
+ protocolContractTreeRoot,
132
+ globalVariables: this.globalVariables,
133
+ feePayer: this.feePayer,
134
+ ...opts
135
+ });
136
+ this.feePayerBalance = new Fr(this.feePayerBalance.toBigInt() - tx.txEffect.transactionFee.toBigInt());
137
+ if (opts?.privateOnly) {
138
+ const feePayerSlot = await computeFeePayerBalanceLeafSlot(this.feePayer);
139
+ tx.txEffect.publicDataWrites[0] = new PublicDataWrite(feePayerSlot, this.feePayerBalance);
140
+ }
141
+ return tx;
142
+ }
143
+ /** Creates a block with the given number of txs and adds it to world-state */ async makePendingBlock(numTxs, numMsgs = 0, blockNumOrGlobals = this.globalVariables, makeProcessedTxOpts = ()=>({})) {
144
+ const globalVariables = typeof blockNumOrGlobals === 'number' ? makeGlobals(blockNumOrGlobals) : blockNumOrGlobals;
145
+ const blockNum = globalVariables.blockNumber.toNumber();
146
+ const db = await this.worldState.fork();
147
+ const msgs = times(numMsgs, (i)=>new Fr(blockNum * 100 + i));
148
+ const txs = await timesParallel(numTxs, (i)=>this.makeProcessedTx({
149
+ seed: i + blockNum * 1000,
150
+ globalVariables,
151
+ ...makeProcessedTxOpts(i)
152
+ }));
153
+ await this.setTreeRoots(txs);
154
+ const block = await buildBlock(txs, globalVariables, msgs, db);
155
+ this.headers.set(blockNum, block.header);
156
+ await this.worldState.handleL2BlockAndMessages(block, msgs);
157
+ return {
158
+ block,
159
+ txs,
160
+ msgs
161
+ };
162
+ }
163
+ async processPublicFunctions(txs, maxTransactions) {
164
+ return await this.publicProcessor.process(txs, {
165
+ maxTransactions
166
+ });
167
+ }
168
+ async setTreeRoots(txs) {
169
+ const db = await this.worldState.fork();
170
+ for (const tx of txs){
171
+ const startStateReference = await db.getStateReference();
172
+ await updateExpectedTreesFromTxs(db, [
173
+ tx
174
+ ]);
175
+ const endStateReference = await db.getStateReference();
176
+ if (tx.avmProvingRequest) {
177
+ tx.avmProvingRequest.inputs.publicInputs.startTreeSnapshots = new TreeSnapshots(startStateReference.l1ToL2MessageTree, startStateReference.partial.noteHashTree, startStateReference.partial.nullifierTree, startStateReference.partial.publicDataTree);
178
+ tx.avmProvingRequest.inputs.publicInputs.endTreeSnapshots = new TreeSnapshots(endStateReference.l1ToL2MessageTree, endStateReference.partial.noteHashTree, endStateReference.partial.nullifierTree, endStateReference.partial.publicDataTree);
179
+ }
180
+ }
181
+ }
182
+ }
183
+ class TestProvingOrchestrator extends ProvingOrchestrator {
184
+ isVerifyBuiltBlockAgainstSyncedStateEnabled = false;
185
+ // Disable this check by default, since it requires seeding world state with the block being built
186
+ // This is only enabled in some tests with multiple blocks that populate the pending chain via makePendingBlock
187
+ verifyBuiltBlockAgainstSyncedState(l2Block, newArchive) {
188
+ if (this.isVerifyBuiltBlockAgainstSyncedStateEnabled) {
189
+ return super.verifyBuiltBlockAgainstSyncedState(l2Block, newArchive);
190
+ }
191
+ return Promise.resolve();
192
+ }
193
+ }