@aztec-labs/simulator 6.0.0-nightly.20260829
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/README.md +57 -0
- package/dest/client.d.ts +6 -0
- package/dest/client.d.ts.map +1 -0
- package/dest/client.js +3 -0
- package/dest/common/errors.d.ts +51 -0
- package/dest/common/errors.d.ts.map +1 -0
- package/dest/common/errors.js +154 -0
- package/dest/common/index.d.ts +3 -0
- package/dest/common/index.d.ts.map +1 -0
- package/dest/common/index.js +2 -0
- package/dest/common/stats/index.d.ts +2 -0
- package/dest/common/stats/index.d.ts.map +1 -0
- package/dest/common/stats/index.js +1 -0
- package/dest/common/stats/stats.d.ts +4 -0
- package/dest/common/stats/stats.d.ts.map +1 -0
- package/dest/common/stats/stats.js +10 -0
- package/dest/private/acvm/acvm.d.ts +43 -0
- package/dest/private/acvm/acvm.d.ts.map +1 -0
- package/dest/private/acvm/acvm.js +65 -0
- package/dest/private/acvm/acvm_types.d.ts +10 -0
- package/dest/private/acvm/acvm_types.d.ts.map +1 -0
- package/dest/private/acvm/acvm_types.js +3 -0
- package/dest/private/acvm/deserialize.d.ts +35 -0
- package/dest/private/acvm/deserialize.d.ts.map +1 -0
- package/dest/private/acvm/deserialize.js +50 -0
- package/dest/private/acvm/index.d.ts +5 -0
- package/dest/private/acvm/index.d.ts.map +1 -0
- package/dest/private/acvm/index.js +4 -0
- package/dest/private/acvm/serialize.d.ts +41 -0
- package/dest/private/acvm/serialize.d.ts.map +1 -0
- package/dest/private/acvm/serialize.js +99 -0
- package/dest/private/acvm_native.d.ts +41 -0
- package/dest/private/acvm_native.d.ts.map +1 -0
- package/dest/private/acvm_native.js +147 -0
- package/dest/private/acvm_wasm.d.ts +16 -0
- package/dest/private/acvm_wasm.d.ts.map +1 -0
- package/dest/private/acvm_wasm.js +67 -0
- package/dest/private/acvm_wasm_with_blobs.d.ts +20 -0
- package/dest/private/acvm_wasm_with_blobs.d.ts.map +1 -0
- package/dest/private/acvm_wasm_with_blobs.js +35 -0
- package/dest/private/circuit_simulator.d.ts +35 -0
- package/dest/private/circuit_simulator.d.ts.map +1 -0
- package/dest/private/circuit_simulator.js +43 -0
- package/dest/private/factory.d.ts +12 -0
- package/dest/private/factory.d.ts.map +1 -0
- package/dest/private/factory.js +30 -0
- package/dest/public/avm/testing/account_proof_fetcher.d.ts +2 -0
- package/dest/public/avm/testing/account_proof_fetcher.d.ts.map +1 -0
- package/dest/public/avm/testing/account_proof_fetcher.js +152 -0
- package/dest/public/avm/testing/base_avm_simulation_tester.d.ts +39 -0
- package/dest/public/avm/testing/base_avm_simulation_tester.d.ts.map +1 -0
- package/dest/public/avm/testing/base_avm_simulation_tester.js +121 -0
- package/dest/public/avm/testing/utils.d.ts +32 -0
- package/dest/public/avm/testing/utils.d.ts.map +1 -0
- package/dest/public/avm/testing/utils.js +66 -0
- package/dest/public/avm_simulator.d.ts +28 -0
- package/dest/public/avm_simulator.d.ts.map +1 -0
- package/dest/public/avm_simulator.js +4 -0
- package/dest/public/avm_simulator_pool.d.ts +84 -0
- package/dest/public/avm_simulator_pool.d.ts.map +1 -0
- package/dest/public/avm_simulator_pool.js +311 -0
- package/dest/public/cdb_ipc_server.d.ts +40 -0
- package/dest/public/cdb_ipc_server.d.ts.map +1 -0
- package/dest/public/cdb_ipc_server.js +153 -0
- package/dest/public/contracts_db_checkpoint.d.ts +16 -0
- package/dest/public/contracts_db_checkpoint.d.ts.map +1 -0
- package/dest/public/contracts_db_checkpoint.js +30 -0
- package/dest/public/db_interfaces.d.ts +68 -0
- package/dest/public/db_interfaces.d.ts.map +1 -0
- package/dest/public/db_interfaces.js +3 -0
- package/dest/public/executor_metrics.d.ts +21 -0
- package/dest/public/executor_metrics.d.ts.map +1 -0
- package/dest/public/executor_metrics.js +64 -0
- package/dest/public/executor_metrics_interface.d.ts +10 -0
- package/dest/public/executor_metrics_interface.d.ts.map +1 -0
- package/dest/public/executor_metrics_interface.js +1 -0
- package/dest/public/fixtures/amm_test.d.ts +10 -0
- package/dest/public/fixtures/amm_test.d.ts.map +1 -0
- package/dest/public/fixtures/amm_test.js +213 -0
- package/dest/public/fixtures/bulk_test.d.ts +6 -0
- package/dest/public/fixtures/bulk_test.d.ts.map +1 -0
- package/dest/public/fixtures/bulk_test.js +289 -0
- package/dest/public/fixtures/custom_bytecode_tester.d.ts +34 -0
- package/dest/public/fixtures/custom_bytecode_tester.d.ts.map +1 -0
- package/dest/public/fixtures/custom_bytecode_tester.js +53 -0
- package/dest/public/fixtures/index.d.ts +10 -0
- package/dest/public/fixtures/index.d.ts.map +1 -0
- package/dest/public/fixtures/index.js +9 -0
- package/dest/public/fixtures/public_processor_test_env.d.ts +30 -0
- package/dest/public/fixtures/public_processor_test_env.d.ts.map +1 -0
- package/dest/public/fixtures/public_processor_test_env.js +73 -0
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts +77 -0
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -0
- package/dest/public/fixtures/public_tx_simulation_tester.js +176 -0
- package/dest/public/fixtures/simple_contract_data_source.d.ts +36 -0
- package/dest/public/fixtures/simple_contract_data_source.d.ts.map +1 -0
- package/dest/public/fixtures/simple_contract_data_source.js +95 -0
- package/dest/public/fixtures/token_test.d.ts +12 -0
- package/dest/public/fixtures/token_test.d.ts.map +1 -0
- package/dest/public/fixtures/token_test.js +96 -0
- package/dest/public/fixtures/utils.d.ts +26 -0
- package/dest/public/fixtures/utils.d.ts.map +1 -0
- package/dest/public/fixtures/utils.js +170 -0
- package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts +65 -0
- package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts.map +1 -0
- package/dest/public/fuzzing/avm_fuzzer_simulator.js +181 -0
- package/dest/public/fuzzing/avm_simulator_bin.d.ts +2 -0
- package/dest/public/fuzzing/avm_simulator_bin.d.ts.map +1 -0
- package/dest/public/fuzzing/avm_simulator_bin.js +108 -0
- package/dest/public/index.d.ts +10 -0
- package/dest/public/index.d.ts.map +1 -0
- package/dest/public/index.js +6 -0
- package/dest/public/public_db_sources.d.ts +83 -0
- package/dest/public/public_db_sources.d.ts.map +1 -0
- package/dest/public/public_db_sources.js +297 -0
- package/dest/public/public_errors.d.ts +12 -0
- package/dest/public/public_errors.d.ts.map +1 -0
- package/dest/public/public_errors.js +13 -0
- package/dest/public/public_processor/guarded_merkle_tree.d.ts +52 -0
- package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -0
- package/dest/public/public_processor/guarded_merkle_tree.js +116 -0
- package/dest/public/public_processor/public_processor.d.ts +71 -0
- package/dest/public/public_processor/public_processor.d.ts.map +1 -0
- package/dest/public/public_processor/public_processor.js +858 -0
- package/dest/public/public_processor/public_processor_metrics.d.ts +30 -0
- package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -0
- package/dest/public/public_processor/public_processor_metrics.js +116 -0
- package/dest/public/public_tx_simulator/dumping_public_tx_simulator.d.ts +17 -0
- package/dest/public/public_tx_simulator/dumping_public_tx_simulator.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/dumping_public_tx_simulator.js +39 -0
- package/dest/public/public_tx_simulator/factories.d.ts +14 -0
- package/dest/public/public_tx_simulator/factories.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/factories.js +28 -0
- package/dest/public/public_tx_simulator/index.d.ts +6 -0
- package/dest/public/public_tx_simulator/index.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/index.js +3 -0
- package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +53 -0
- package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/public_tx_simulator.js +127 -0
- package/dest/public/public_tx_simulator/public_tx_simulator_base.d.ts +24 -0
- package/dest/public/public_tx_simulator/public_tx_simulator_base.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/public_tx_simulator_base.js +31 -0
- package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts +32 -0
- package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/public_tx_simulator_interface.js +1 -0
- package/dest/public/side_effect_errors.d.ts +44 -0
- package/dest/public/side_effect_errors.d.ts.map +1 -0
- package/dest/public/side_effect_errors.js +75 -0
- package/dest/public/test_executor_metrics.d.ts +56 -0
- package/dest/public/test_executor_metrics.d.ts.map +1 -0
- package/dest/public/test_executor_metrics.js +305 -0
- package/dest/public/unique_class_ids.d.ts +37 -0
- package/dest/public/unique_class_ids.d.ts.map +1 -0
- package/dest/public/unique_class_ids.js +61 -0
- package/dest/public/utils.d.ts +3 -0
- package/dest/public/utils.d.ts.map +1 -0
- package/dest/public/utils.js +18 -0
- package/dest/server.d.ts +7 -0
- package/dest/server.d.ts.map +1 -0
- package/dest/server.js +5 -0
- package/package.json +109 -0
- package/src/client.ts +5 -0
- package/src/common/errors.ts +219 -0
- package/src/common/index.ts +2 -0
- package/src/common/stats/index.ts +1 -0
- package/src/common/stats/stats.ts +20 -0
- package/src/private/acvm/acvm.ts +114 -0
- package/src/private/acvm/acvm_types.ts +11 -0
- package/src/private/acvm/deserialize.ts +58 -0
- package/src/private/acvm/index.ts +4 -0
- package/src/private/acvm/serialize.ts +123 -0
- package/src/private/acvm_native.ts +200 -0
- package/src/private/acvm_wasm.ts +80 -0
- package/src/private/acvm_wasm_with_blobs.ts +55 -0
- package/src/private/circuit_simulator.ts +91 -0
- package/src/private/factory.ts +40 -0
- package/src/public/avm/testing/account_proof.json +553 -0
- package/src/public/avm/testing/account_proof_fetcher.ts +166 -0
- package/src/public/avm/testing/base_avm_simulation_tester.ts +162 -0
- package/src/public/avm/testing/utils.ts +114 -0
- package/src/public/avm_simulator.ts +29 -0
- package/src/public/avm_simulator_pool.ts +355 -0
- package/src/public/cdb_ipc_server.ts +198 -0
- package/src/public/contracts_db_checkpoint.ts +41 -0
- package/src/public/db_interfaces.ts +76 -0
- package/src/public/executor_metrics.ts +102 -0
- package/src/public/executor_metrics_interface.ts +20 -0
- package/src/public/fixtures/amm_test.ts +331 -0
- package/src/public/fixtures/bulk_test.ts +194 -0
- package/src/public/fixtures/custom_bytecode_tester.ts +83 -0
- package/src/public/fixtures/index.ts +13 -0
- package/src/public/fixtures/public_processor_test_env.ts +88 -0
- package/src/public/fixtures/public_tx_simulation_tester.ts +315 -0
- package/src/public/fixtures/simple_contract_data_source.ts +122 -0
- package/src/public/fixtures/token_test.ts +148 -0
- package/src/public/fixtures/utils.ts +269 -0
- package/src/public/fuzzing/avm_fuzzer_simulator.ts +302 -0
- package/src/public/fuzzing/avm_simulator_bin.ts +156 -0
- package/src/public/index.ts +16 -0
- package/src/public/public_db_sources.ts +405 -0
- package/src/public/public_errors.ts +14 -0
- package/src/public/public_processor/guarded_merkle_tree.ts +161 -0
- package/src/public/public_processor/public_processor.ts +657 -0
- package/src/public/public_processor/public_processor_metrics.ts +138 -0
- package/src/public/public_tx_simulator/dumping_public_tx_simulator.ts +66 -0
- package/src/public/public_tx_simulator/factories.ts +61 -0
- package/src/public/public_tx_simulator/index.ts +8 -0
- package/src/public/public_tx_simulator/public_tx_simulator.ts +190 -0
- package/src/public/public_tx_simulator/public_tx_simulator_base.ts +37 -0
- package/src/public/public_tx_simulator/public_tx_simulator_interface.ts +33 -0
- package/src/public/side_effect_errors.ts +96 -0
- package/src/public/test_executor_metrics.ts +399 -0
- package/src/public/unique_class_ids.ts +79 -0
- package/src/public/utils.ts +16 -0
- package/src/server.ts +6 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { createLogger } from '@aztec-labs/foundation/log';
|
|
2
|
+
import { getFunctionSelector } from '../avm/testing/utils.js';
|
|
3
|
+
/**
|
|
4
|
+
* This class is used during public/avm testing to function as a database of
|
|
5
|
+
* contract contract classes and instances. Tests can populate it with classes
|
|
6
|
+
* and instances and then probe it via the ContractDataSource interface.
|
|
7
|
+
*
|
|
8
|
+
* This class does not include any real merkle trees & merkle operations.
|
|
9
|
+
*/ export class SimpleContractDataSource {
|
|
10
|
+
logger = createLogger('simple-contract-data-source');
|
|
11
|
+
// maps contract class ID to class
|
|
12
|
+
contractClasses = new Map();
|
|
13
|
+
// maps contract instance address to instance
|
|
14
|
+
contractInstances = new Map();
|
|
15
|
+
// maps contract instance address to address
|
|
16
|
+
contractArtifacts = new Map();
|
|
17
|
+
// maps `${classID}:${fnSelector}` to name
|
|
18
|
+
debugFunctionName = new Map();
|
|
19
|
+
/////////////////////////////////////////////////////////////
|
|
20
|
+
// Helper functions not in the contract data source interface
|
|
21
|
+
/**
|
|
22
|
+
* Derive the contract class and instance with some seed.
|
|
23
|
+
* Add both to the contract data source along with the contract artifact.
|
|
24
|
+
*/ async addNewContract(contractArtifact, contractClass, contractInstance) {
|
|
25
|
+
await this.addContractArtifact(contractClass.id, contractArtifact);
|
|
26
|
+
await this.addContractClass(contractClass);
|
|
27
|
+
await this.addContractInstance(contractInstance);
|
|
28
|
+
}
|
|
29
|
+
async addContractArtifact(classId, artifact) {
|
|
30
|
+
this.contractArtifacts.set(classId.toString(), artifact);
|
|
31
|
+
const classIdStr = classId.toString();
|
|
32
|
+
const publicFns = artifact.nonDispatchPublicFunctions;
|
|
33
|
+
if (publicFns.length !== 0) {
|
|
34
|
+
for (const fn of publicFns){
|
|
35
|
+
const actualFnName = `${fn.name}`;
|
|
36
|
+
const fnSelector = await getFunctionSelector(actualFnName, artifact);
|
|
37
|
+
const key = `${classIdStr}:${fnSelector.toString()}`;
|
|
38
|
+
const longFnName = `${artifact.name}.${actualFnName}`;
|
|
39
|
+
this.debugFunctionName.set(key, longFnName);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/////////////////////////////////////////////////////////////
|
|
44
|
+
// ContractDataSource function implementations
|
|
45
|
+
getBlockNumber() {
|
|
46
|
+
throw new Error('Method not implemented.');
|
|
47
|
+
}
|
|
48
|
+
getContractClass(id) {
|
|
49
|
+
return Promise.resolve(this.contractClasses.get(id.toString()));
|
|
50
|
+
}
|
|
51
|
+
getBytecodeCommitment(_id) {
|
|
52
|
+
return Promise.resolve(undefined);
|
|
53
|
+
}
|
|
54
|
+
getContract(address) {
|
|
55
|
+
return Promise.resolve(this.contractInstances.get(address.toString()));
|
|
56
|
+
}
|
|
57
|
+
getContractClassIds() {
|
|
58
|
+
throw new Error('Method not implemented.');
|
|
59
|
+
}
|
|
60
|
+
async getContractArtifact(address) {
|
|
61
|
+
const contractInstance = await this.getContract(address);
|
|
62
|
+
if (!contractInstance) {
|
|
63
|
+
this.logger.warn(`Contract not found at address: ${address}`);
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
this.logger.debug(`Retrieved contract artifact for address: ${address}`);
|
|
67
|
+
this.logger.debug(`Contract class ID: ${contractInstance.currentContractClassId}`);
|
|
68
|
+
return this.contractArtifacts.get(contractInstance.currentContractClassId.toString());
|
|
69
|
+
}
|
|
70
|
+
async getDebugFunctionName(address, selector) {
|
|
71
|
+
const contractInstance = await this.getContract(address);
|
|
72
|
+
if (!contractInstance) {
|
|
73
|
+
this.logger.warn(`Couldn't get fn name for debugging. Contract not in tester's ContractDataSource.`);
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
const key = `${contractInstance.currentContractClassId.toString()}:${selector.toString()}`;
|
|
77
|
+
const fnName = this.debugFunctionName.get(key);
|
|
78
|
+
if (!fnName) {
|
|
79
|
+
this.logger.warn(`Couldn't get fn name for debugging...`);
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
return fnName;
|
|
83
|
+
}
|
|
84
|
+
registerContractFunctionSignatures(_signatures) {
|
|
85
|
+
return Promise.resolve();
|
|
86
|
+
}
|
|
87
|
+
addContractClass(contractClass) {
|
|
88
|
+
this.contractClasses.set(contractClass.id.toString(), contractClass);
|
|
89
|
+
return Promise.resolve();
|
|
90
|
+
}
|
|
91
|
+
addContractInstance(contractInstance) {
|
|
92
|
+
this.contractInstances.set(contractInstance.address.toString(), contractInstance);
|
|
93
|
+
return Promise.resolve();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Logger } from '@aztec-labs/foundation/log';
|
|
2
|
+
import type { ContractArtifact } from '@aztec-labs/stdlib/abi';
|
|
3
|
+
import { AztecAddress } from '@aztec-labs/stdlib/aztec-address';
|
|
4
|
+
import type { ContractInstanceWithAddress } from '@aztec-labs/stdlib/contract';
|
|
5
|
+
import { PublicTxSimulationTester } from './public_tx_simulation_tester.js';
|
|
6
|
+
export type TokenTestOptions = {
|
|
7
|
+
/** Skip return value assertions in balance checks (useful for benchmarking with collectCallMetadata=false) */
|
|
8
|
+
skipReturnValueAssertions?: boolean;
|
|
9
|
+
};
|
|
10
|
+
export declare function tokenTest(tester: PublicTxSimulationTester, logger: Logger, tokenArtifact: ContractArtifact, expectToBeTrue: (x: boolean) => void, options?: TokenTestOptions): Promise<void>;
|
|
11
|
+
export declare function setUpToken(tester: PublicTxSimulationTester, tokenArtifact: ContractArtifact, admin: AztecAddress, expectToBeTrue: (x: boolean) => void, seed?: number): Promise<ContractInstanceWithAddress>;
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5fdGVzdC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3B1YmxpYy9maXh0dXJlcy90b2tlbl90ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXpELE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDL0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2hFLE9BQU8sS0FBSyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFL0UsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFNUUsTUFBTSxNQUFNLGdCQUFnQixHQUFHO0lBQzdCLDhHQUE4RztJQUM5Ryx5QkFBeUIsQ0FBQyxFQUFFLE9BQU8sQ0FBQztDQUNyQyxDQUFDO0FBRUYsd0JBQXNCLFNBQVMsQ0FDN0IsTUFBTSxFQUFFLHdCQUF3QixFQUNoQyxNQUFNLEVBQUUsTUFBTSxFQUNkLGFBQWEsRUFBRSxnQkFBZ0IsRUFDL0IsY0FBYyxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sS0FBSyxJQUFJLEVBQ3BDLE9BQU8sR0FBRSxnQkFBcUIsaUJBK0QvQjtBQUVELHdCQUFzQixVQUFVLENBQzlCLE1BQU0sRUFBRSx3QkFBd0IsRUFDaEMsYUFBYSxFQUFFLGdCQUFnQixFQUMvQixLQUFLLEVBQUUsWUFBWSxFQUNuQixjQUFjLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxLQUFLLElBQUksRUFDcEMsSUFBSSxTQUFJLHdDQTBCVCJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token_test.d.ts","sourceRoot":"","sources":["../../../src/public/fixtures/token_test.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAE/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,8GAA8G;IAC9G,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC,CAAC;AAEF,wBAAsB,SAAS,CAC7B,MAAM,EAAE,wBAAwB,EAChC,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,gBAAgB,EAC/B,cAAc,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,EACpC,OAAO,GAAE,gBAAqB,iBA+D/B;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,wBAAwB,EAChC,aAAa,EAAE,gBAAgB,EAC/B,KAAK,EAAE,YAAY,EACnB,cAAc,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,EACpC,IAAI,SAAI,wCA0BT"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { Fr } from '@aztec-labs/foundation/curves/bn254';
|
|
2
|
+
import { Timer } from '@aztec-labs/foundation/timer';
|
|
3
|
+
import { AztecAddress } from '@aztec-labs/stdlib/aztec-address';
|
|
4
|
+
export async function tokenTest(tester, logger, tokenArtifact, expectToBeTrue, options = {}) {
|
|
5
|
+
const timer = new Timer();
|
|
6
|
+
const admin = AztecAddress.fromNumberUnsafe(42);
|
|
7
|
+
const sender = AztecAddress.fromNumberUnsafe(111);
|
|
8
|
+
const receiver = AztecAddress.fromNumberUnsafe(222);
|
|
9
|
+
const token = await setUpToken(tester, tokenArtifact, admin, expectToBeTrue);
|
|
10
|
+
const mintAmount = 100n;
|
|
11
|
+
// EXECUTE! This means that if using AvmProvingTester subclass, it will PROVE the transaction!
|
|
12
|
+
const mintResult = await tester.executeTxWithLabel(/*txLabel=*/ 'Token/mint_to_public', /*sender=*/ admin, /*setupCalls=*/ [], /*appCalls=*/ [
|
|
13
|
+
{
|
|
14
|
+
address: token.address,
|
|
15
|
+
fnName: 'mint_to_public',
|
|
16
|
+
args: [
|
|
17
|
+
/*to=*/ sender,
|
|
18
|
+
mintAmount
|
|
19
|
+
]
|
|
20
|
+
}
|
|
21
|
+
]);
|
|
22
|
+
expectToBeTrue(mintResult.revertCode.isOK());
|
|
23
|
+
await checkBalance(tester, token, sender, sender, mintAmount, expectToBeTrue, options);
|
|
24
|
+
const authwitNonce = new Fr(0);
|
|
25
|
+
const transferAmount = 50n;
|
|
26
|
+
// EXECUTE! This means that if using AvmProvingTester subclass, it will PROVE the transaction!
|
|
27
|
+
const transferResult = await tester.executeTxWithLabel(/*txLabel=*/ 'Token/transfer_in_public', /*sender=*/ sender, /*setupCalls=*/ [], /*appCalls=*/ [
|
|
28
|
+
{
|
|
29
|
+
address: token.address,
|
|
30
|
+
fnName: 'transfer_in_public',
|
|
31
|
+
args: [
|
|
32
|
+
/*from=*/ sender,
|
|
33
|
+
/*to=*/ receiver,
|
|
34
|
+
transferAmount,
|
|
35
|
+
authwitNonce
|
|
36
|
+
]
|
|
37
|
+
}
|
|
38
|
+
]);
|
|
39
|
+
expectToBeTrue(transferResult.revertCode.isOK());
|
|
40
|
+
await checkBalance(tester, token, sender, sender, mintAmount - transferAmount, expectToBeTrue, options);
|
|
41
|
+
await checkBalance(tester, token, sender, receiver, transferAmount, expectToBeTrue, options);
|
|
42
|
+
// EXECUTE! This means that if using AvmProvingTester subclass, it will PROVE the transaction!
|
|
43
|
+
const burnResult = await tester.executeTxWithLabel(/*txLabel=*/ 'Token/burn_public', /*sender=*/ receiver, /*setupCalls=*/ [], /*appCalls=*/ [
|
|
44
|
+
{
|
|
45
|
+
address: token.address,
|
|
46
|
+
fnName: 'burn_public',
|
|
47
|
+
args: [
|
|
48
|
+
/*from=*/ receiver,
|
|
49
|
+
transferAmount,
|
|
50
|
+
authwitNonce
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
]);
|
|
54
|
+
expectToBeTrue(burnResult.revertCode.isOK());
|
|
55
|
+
await checkBalance(tester, token, sender, receiver, 0n, expectToBeTrue, options);
|
|
56
|
+
logger.info(`TokenContract test took ${timer.ms()}ms\n`);
|
|
57
|
+
}
|
|
58
|
+
export async function setUpToken(tester, tokenArtifact, admin, expectToBeTrue, seed = 0) {
|
|
59
|
+
const constructorArgs = [
|
|
60
|
+
admin,
|
|
61
|
+
/*name=*/ 'Token',
|
|
62
|
+
/*symbol=*/ 'TOK',
|
|
63
|
+
/*decimals=*/ new Fr(18)
|
|
64
|
+
];
|
|
65
|
+
const token = await tester.registerAndDeployContract(constructorArgs, /*deployer=*/ admin, tokenArtifact, /*skipNullifierInsertion=*/ false, seed);
|
|
66
|
+
// EXECUTE! This means that if using AvmProvingTester subclass, it will PROVE the transaction!
|
|
67
|
+
const result = await tester.executeTxWithLabel(/*txLabel=*/ 'Token/constructor', /*sender=*/ admin, /*setupCalls=*/ [], /*appCalls=*/ [
|
|
68
|
+
{
|
|
69
|
+
fnName: 'constructor',
|
|
70
|
+
args: constructorArgs,
|
|
71
|
+
address: token.address
|
|
72
|
+
}
|
|
73
|
+
]);
|
|
74
|
+
expectToBeTrue(result.revertCode.isOK());
|
|
75
|
+
return token;
|
|
76
|
+
}
|
|
77
|
+
async function checkBalance(tester, token, sender, account, expectedBalance, expectToBeTrue, options = {}) {
|
|
78
|
+
// Strictly simulate this! No need to "execute" (aka prove if using AvmProvingTester subclass).
|
|
79
|
+
const balResult = await tester.simulateTxWithLabel(/*txLabel=*/ 'Token/balance_of_public', sender, /*setupCalls=*/ [], /*appCalls=*/ [
|
|
80
|
+
{
|
|
81
|
+
address: token.address,
|
|
82
|
+
fnName: 'balance_of_public',
|
|
83
|
+
args: [
|
|
84
|
+
/*owner=*/ account
|
|
85
|
+
],
|
|
86
|
+
isStaticCall: true
|
|
87
|
+
}
|
|
88
|
+
]);
|
|
89
|
+
expectToBeTrue(balResult.revertCode.isOK());
|
|
90
|
+
if (!options.skipReturnValueAssertions) {
|
|
91
|
+
// should be 1 call with 1 return value that is expectedBalance
|
|
92
|
+
const appLogicReturnValues = balResult.getAppLogicReturnValues();
|
|
93
|
+
expectToBeTrue(appLogicReturnValues.length === 1);
|
|
94
|
+
expectToBeTrue(appLogicReturnValues[0].values?.[0]?.toBigInt() === expectedBalance);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Fr } from '@aztec-labs/foundation/curves/bn254';
|
|
2
|
+
import { AztecAddress } from '@aztec-labs/stdlib/aztec-address';
|
|
3
|
+
import type { ContractClassPublic, ContractInstanceWithAddress } from '@aztec-labs/stdlib/contract';
|
|
4
|
+
import { Gas } from '@aztec-labs/stdlib/gas';
|
|
5
|
+
import type { ScopedL2ToL1Message } from '@aztec-labs/stdlib/messaging';
|
|
6
|
+
import { GlobalVariables, PublicCallRequestWithCalldata, Tx } from '@aztec-labs/stdlib/tx';
|
|
7
|
+
export type TestPrivateInsertions = {
|
|
8
|
+
revertible?: {
|
|
9
|
+
nullifiers?: Fr[];
|
|
10
|
+
noteHashes?: Fr[];
|
|
11
|
+
l2ToL1Msgs?: ScopedL2ToL1Message[];
|
|
12
|
+
};
|
|
13
|
+
nonRevertible?: {
|
|
14
|
+
nullifiers?: Fr[];
|
|
15
|
+
noteHashes?: Fr[];
|
|
16
|
+
l2ToL1Msgs?: ScopedL2ToL1Message[];
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Craft a carrier transaction for some public calls for simulation by PublicTxSimulator.
|
|
21
|
+
*/
|
|
22
|
+
export declare function createTxForPublicCalls(privateInsertions: TestPrivateInsertions, setupCallRequests: PublicCallRequestWithCalldata[], appCallRequests: PublicCallRequestWithCalldata[], teardownCallRequest?: PublicCallRequestWithCalldata, feePayer?: AztecAddress, gasUsedByPrivate?: Gas, globals?: GlobalVariables, gasLimits?: Gas): Promise<Tx>;
|
|
23
|
+
export declare function createTxForPrivateOnly(feePayer?: AztecAddress, gasUsedByPrivate?: Gas): Promise<Tx>;
|
|
24
|
+
export declare function addNewContractClassToTx(tx: Tx, contractClass: ContractClassPublic, skipNullifierInsertion?: boolean): Promise<void>;
|
|
25
|
+
export declare function addNewContractInstanceToTx(tx: Tx, contractInstance: ContractInstanceWithAddress, skipNullifierInsertion?: boolean): Promise<void>;
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wdWJsaWMvZml4dHVyZXMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBU0EsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBR3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNoRSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3BHLE9BQU8sRUFBRSxHQUFHLEVBQXdCLE1BQU0sd0JBQXdCLENBQUM7QUFVbkUsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUV4RSxPQUFPLEVBRUwsZUFBZSxFQUVmLDZCQUE2QixFQUM3QixFQUFFLEVBR0gsTUFBTSx1QkFBdUIsQ0FBQztBQU0vQixNQUFNLE1BQU0scUJBQXFCLEdBQUc7SUFDbEMsVUFBVSxDQUFDLEVBQUU7UUFDWCxVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUNsQixVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUNsQixVQUFVLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxDQUFDO0tBQ3BDLENBQUM7SUFDRixhQUFhLENBQUMsRUFBRTtRQUNkLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ2xCLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ2xCLFVBQVUsQ0FBQyxFQUFFLG1CQUFtQixFQUFFLENBQUM7S0FDcEMsQ0FBQztDQUNILENBQUM7QUFFRjs7R0FFRztBQUNILHdCQUFzQixzQkFBc0IsQ0FDMUMsaUJBQWlCLEVBQUUscUJBQXFCLEVBQ3hDLGlCQUFpQixFQUFFLDZCQUE2QixFQUFFLEVBQ2xELGVBQWUsRUFBRSw2QkFBNkIsRUFBRSxFQUNoRCxtQkFBbUIsQ0FBQyxFQUFFLDZCQUE2QixFQUNuRCxRQUFRLGVBQXNCLEVBQzlCLGdCQUFnQixHQUFFLEdBQWlCLEVBQ25DLE9BQU8sR0FBRSxlQUF5QyxFQUNsRCxTQUFTLENBQUMsRUFBRSxHQUFHLEdBQ2QsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQTRGYjtBQUVELHdCQUFzQixzQkFBc0IsQ0FDMUMsUUFBUSxlQUFzQixFQUM5QixnQkFBZ0IsR0FBRSxHQUFxQixHQUN0QyxPQUFPLENBQUMsRUFBRSxDQUFDLENBMEJiO0FBRUQsd0JBQXNCLHVCQUF1QixDQUMzQyxFQUFFLEVBQUUsRUFBRSxFQUNOLGFBQWEsRUFBRSxtQkFBbUIsRUFDbEMsc0JBQXNCLFVBQVEsaUJBNkIvQjtBQUVELHdCQUFzQiwwQkFBMEIsQ0FDOUMsRUFBRSxFQUFFLEVBQUUsRUFDTixnQkFBZ0IsRUFBRSwyQkFBMkIsRUFDN0Msc0JBQXNCLFVBQVEsaUJBeUMvQiJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/public/fixtures/utils.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,EAAE,EAAE,MAAM,qCAAqC,CAAC;AAGzD,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AACpG,OAAO,EAAE,GAAG,EAAwB,MAAM,wBAAwB,CAAC;AAUnE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAExE,OAAO,EAEL,eAAe,EAEf,6BAA6B,EAC7B,EAAE,EAGH,MAAM,uBAAuB,CAAC;AAM/B,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,CAAC,EAAE;QACX,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC;QAClB,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC;QAClB,UAAU,CAAC,EAAE,mBAAmB,EAAE,CAAC;KACpC,CAAC;IACF,aAAa,CAAC,EAAE;QACd,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC;QAClB,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC;QAClB,UAAU,CAAC,EAAE,mBAAmB,EAAE,CAAC;KACpC,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,iBAAiB,EAAE,qBAAqB,EACxC,iBAAiB,EAAE,6BAA6B,EAAE,EAClD,eAAe,EAAE,6BAA6B,EAAE,EAChD,mBAAmB,CAAC,EAAE,6BAA6B,EACnD,QAAQ,eAAsB,EAC9B,gBAAgB,GAAE,GAAiB,EACnC,OAAO,GAAE,eAAyC,EAClD,SAAS,CAAC,EAAE,GAAG,GACd,OAAO,CAAC,EAAE,CAAC,CA4Fb;AAED,wBAAsB,sBAAsB,CAC1C,QAAQ,eAAsB,EAC9B,gBAAgB,GAAE,GAAqB,GACtC,OAAO,CAAC,EAAE,CAAC,CA0Bb;AAED,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE,EAAE,EACN,aAAa,EAAE,mBAAmB,EAClC,sBAAsB,UAAQ,iBA6B/B;AAED,wBAAsB,0BAA0B,CAC9C,EAAE,EAAE,EAAE,EACN,gBAAgB,EAAE,2BAA2B,EAC7C,sBAAsB,UAAQ,iBAyC/B"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { CONTRACT_CLASS_PUBLISHED_MAGIC_VALUE, CONTRACT_CLASS_REGISTRY_CONTRACT_ADDRESS, CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS, MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT, MAX_PROCESSABLE_L2_GAS, PRIVATE_LOG_SIZE_IN_FIELDS } from '@aztec-labs/constants';
|
|
2
|
+
import { padArrayEnd } from '@aztec-labs/foundation/collection';
|
|
3
|
+
import { Fr } from '@aztec-labs/foundation/curves/bn254';
|
|
4
|
+
import { CONTRACT_INSTANCE_PUBLISHED_EVENT_TAG } from '@aztec-labs/protocol-contracts';
|
|
5
|
+
import { bufferAsFields } from '@aztec-labs/stdlib/abi';
|
|
6
|
+
import { AztecAddress } from '@aztec-labs/stdlib/aztec-address';
|
|
7
|
+
import { Gas, GasFees, GasSettings } from '@aztec-labs/stdlib/gas';
|
|
8
|
+
import { siloNullifier } from '@aztec-labs/stdlib/hash';
|
|
9
|
+
import { LogHash, PartialPrivateTailPublicInputsForPublic, PartialPrivateTailPublicInputsForRollup, PrivateKernelTailCircuitPublicInputs, countAccumulatedItems } from '@aztec-labs/stdlib/kernel';
|
|
10
|
+
import { ContractClassLogFields, PrivateLog } from '@aztec-labs/stdlib/logs';
|
|
11
|
+
import { ChonkProof } from '@aztec-labs/stdlib/proofs';
|
|
12
|
+
import { BlockHeader, GlobalVariables, HashedValues, Tx, TxConstantData, TxContext } from '@aztec-labs/stdlib/tx';
|
|
13
|
+
import { strict as assert } from 'assert';
|
|
14
|
+
const TEARDOWN_DA_GAS_LIMIT = 98_304;
|
|
15
|
+
const TEARDOWN_L2_GAS_LIMIT = 817_500;
|
|
16
|
+
/**
|
|
17
|
+
* Craft a carrier transaction for some public calls for simulation by PublicTxSimulator.
|
|
18
|
+
*/ export async function createTxForPublicCalls(privateInsertions, setupCallRequests, appCallRequests, teardownCallRequest, feePayer = AztecAddress.zero(), gasUsedByPrivate = Gas.empty(), globals = GlobalVariables.empty(), gasLimits) {
|
|
19
|
+
assert(setupCallRequests.length > 0 || appCallRequests.length > 0 || teardownCallRequest !== undefined, "Can't create public tx with no enqueued calls");
|
|
20
|
+
// use max limits
|
|
21
|
+
gasLimits = gasLimits ?? new Gas(MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT, MAX_PROCESSABLE_L2_GAS);
|
|
22
|
+
const forPublic = PartialPrivateTailPublicInputsForPublic.empty();
|
|
23
|
+
// Non revertible private insertions
|
|
24
|
+
if (!privateInsertions.nonRevertible?.nullifiers?.length) {
|
|
25
|
+
throw new Error('At least one non-revertible nullifier is required');
|
|
26
|
+
}
|
|
27
|
+
for(let i = 0; i < privateInsertions.nonRevertible.nullifiers.length; i++){
|
|
28
|
+
assert(i < forPublic.nonRevertibleAccumulatedData.nullifiers.length, 'Nullifier index out of bounds');
|
|
29
|
+
forPublic.nonRevertibleAccumulatedData.nullifiers[i] = privateInsertions.nonRevertible.nullifiers[i];
|
|
30
|
+
}
|
|
31
|
+
if (privateInsertions.nonRevertible.noteHashes) {
|
|
32
|
+
for(let i = 0; i < privateInsertions.nonRevertible.noteHashes.length; i++){
|
|
33
|
+
assert(i < forPublic.nonRevertibleAccumulatedData.noteHashes.length, 'Note hash index out of bounds');
|
|
34
|
+
forPublic.nonRevertibleAccumulatedData.noteHashes[i] = privateInsertions.nonRevertible.noteHashes[i];
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (privateInsertions.nonRevertible.l2ToL1Msgs) {
|
|
38
|
+
for(let i = 0; i < privateInsertions.nonRevertible.l2ToL1Msgs.length; i++){
|
|
39
|
+
assert(i < forPublic.nonRevertibleAccumulatedData.l2ToL1Msgs.length, 'L2 to L1 message index out of bounds');
|
|
40
|
+
forPublic.nonRevertibleAccumulatedData.l2ToL1Msgs[i] = privateInsertions.nonRevertible.l2ToL1Msgs[i];
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Revertible private insertions
|
|
44
|
+
if (privateInsertions.revertible) {
|
|
45
|
+
if (privateInsertions.revertible.noteHashes) {
|
|
46
|
+
for(let i = 0; i < privateInsertions.revertible.noteHashes.length; i++){
|
|
47
|
+
assert(i < forPublic.revertibleAccumulatedData.noteHashes.length, 'Note hash index out of bounds');
|
|
48
|
+
forPublic.revertibleAccumulatedData.noteHashes[i] = privateInsertions.revertible.noteHashes[i];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (privateInsertions.revertible.nullifiers) {
|
|
52
|
+
for(let i = 0; i < privateInsertions.revertible.nullifiers.length; i++){
|
|
53
|
+
assert(i < forPublic.revertibleAccumulatedData.nullifiers.length, 'Nullifier index out of bounds');
|
|
54
|
+
forPublic.revertibleAccumulatedData.nullifiers[i] = privateInsertions.revertible.nullifiers[i];
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (privateInsertions.revertible.l2ToL1Msgs) {
|
|
58
|
+
for(let i = 0; i < privateInsertions.revertible.l2ToL1Msgs.length; i++){
|
|
59
|
+
assert(i < forPublic.revertibleAccumulatedData.l2ToL1Msgs.length, 'L2 to L1 message index out of bounds');
|
|
60
|
+
forPublic.revertibleAccumulatedData.l2ToL1Msgs[i] = privateInsertions.revertible.l2ToL1Msgs[i];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
for(let i = 0; i < setupCallRequests.length; i++){
|
|
65
|
+
forPublic.nonRevertibleAccumulatedData.publicCallRequests[i] = setupCallRequests[i].request;
|
|
66
|
+
}
|
|
67
|
+
for(let i = 0; i < appCallRequests.length; i++){
|
|
68
|
+
forPublic.revertibleAccumulatedData.publicCallRequests[i] = appCallRequests[i].request;
|
|
69
|
+
}
|
|
70
|
+
if (teardownCallRequest) {
|
|
71
|
+
forPublic.publicTeardownCallRequest = teardownCallRequest.request;
|
|
72
|
+
}
|
|
73
|
+
const maxFeesPerGas = feePayer.isZero() ? GasFees.empty() : new GasFees(10, 10);
|
|
74
|
+
const teardownGasLimits = teardownCallRequest ? new Gas(TEARDOWN_DA_GAS_LIMIT, TEARDOWN_L2_GAS_LIMIT) : Gas.empty();
|
|
75
|
+
const gasSettings = new GasSettings(gasLimits, teardownGasLimits, maxFeesPerGas, GasFees.empty());
|
|
76
|
+
const txContext = new TxContext(Fr.zero(), Fr.zero(), gasSettings);
|
|
77
|
+
const header = BlockHeader.empty({
|
|
78
|
+
globalVariables: globals
|
|
79
|
+
});
|
|
80
|
+
const constantData = new TxConstantData(header, txContext, Fr.zero(), Fr.zero());
|
|
81
|
+
const expirationTimestamp = 0n; // Not used in the simulator.
|
|
82
|
+
const txData = new PrivateKernelTailCircuitPublicInputs(constantData, /*gasUsed=*/ gasUsedByPrivate, feePayer, expirationTimestamp, forPublic);
|
|
83
|
+
const calldata = [
|
|
84
|
+
...setupCallRequests,
|
|
85
|
+
...appCallRequests,
|
|
86
|
+
...teardownCallRequest ? [
|
|
87
|
+
teardownCallRequest
|
|
88
|
+
] : []
|
|
89
|
+
].map((r)=>new HashedValues(r.calldata, r.request.calldataHash));
|
|
90
|
+
return await Tx.create({
|
|
91
|
+
data: txData,
|
|
92
|
+
chonkProof: ChonkProof.random(),
|
|
93
|
+
contractClassLogFields: [],
|
|
94
|
+
publicFunctionCalldata: calldata
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
export async function createTxForPrivateOnly(feePayer = AztecAddress.zero(), gasUsedByPrivate = new Gas(10, 10)) {
|
|
98
|
+
// use max limits
|
|
99
|
+
const gasLimits = new Gas(MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT, MAX_PROCESSABLE_L2_GAS);
|
|
100
|
+
const forRollup = PartialPrivateTailPublicInputsForRollup.empty();
|
|
101
|
+
const maxFeesPerGas = feePayer.isZero() ? GasFees.empty() : new GasFees(10, 10);
|
|
102
|
+
const gasSettings = new GasSettings(gasLimits, Gas.empty(), maxFeesPerGas, GasFees.empty());
|
|
103
|
+
const txContext = new TxContext(Fr.zero(), Fr.zero(), gasSettings);
|
|
104
|
+
const constantData = new TxConstantData(BlockHeader.empty(), txContext, Fr.zero(), Fr.zero());
|
|
105
|
+
const expirationTimestamp = 0n; // Not used in the simulator.
|
|
106
|
+
const txData = new PrivateKernelTailCircuitPublicInputs(constantData, /*gasUsed=*/ gasUsedByPrivate, feePayer, expirationTimestamp, /*forPublic=*/ undefined, forRollup);
|
|
107
|
+
return await Tx.create({
|
|
108
|
+
data: txData,
|
|
109
|
+
chonkProof: ChonkProof.empty(),
|
|
110
|
+
contractClassLogFields: [],
|
|
111
|
+
publicFunctionCalldata: []
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
export async function addNewContractClassToTx(tx, contractClass, skipNullifierInsertion = false) {
|
|
115
|
+
const contractClassLogFields = [
|
|
116
|
+
new Fr(CONTRACT_CLASS_PUBLISHED_MAGIC_VALUE),
|
|
117
|
+
contractClass.id,
|
|
118
|
+
new Fr(contractClass.version),
|
|
119
|
+
new Fr(contractClass.artifactHash),
|
|
120
|
+
new Fr(contractClass.privateFunctionsRoot),
|
|
121
|
+
...bufferAsFields(contractClass.packedBytecode, Math.ceil(contractClass.packedBytecode.length / 31) + 1)
|
|
122
|
+
];
|
|
123
|
+
const contractAddress = new AztecAddress(new Fr(CONTRACT_CLASS_REGISTRY_CONTRACT_ADDRESS));
|
|
124
|
+
const emittedLength = contractClassLogFields.length;
|
|
125
|
+
const logFields = ContractClassLogFields.fromEmittedFields(contractClassLogFields);
|
|
126
|
+
const contractClassLogHash = LogHash.from({
|
|
127
|
+
value: await logFields.hash(),
|
|
128
|
+
length: emittedLength
|
|
129
|
+
}).scope(contractAddress);
|
|
130
|
+
const accumulatedData = tx.data.forPublic ? tx.data.forPublic.revertibleAccumulatedData : tx.data.forRollup.end;
|
|
131
|
+
if (!skipNullifierInsertion) {
|
|
132
|
+
const nextNullifierIndex = countAccumulatedItems(accumulatedData.nullifiers);
|
|
133
|
+
accumulatedData.nullifiers[nextNullifierIndex] = contractClass.id;
|
|
134
|
+
}
|
|
135
|
+
const nextLogIndex = countAccumulatedItems(accumulatedData.contractClassLogsHashes);
|
|
136
|
+
accumulatedData.contractClassLogsHashes[nextLogIndex] = contractClassLogHash;
|
|
137
|
+
tx.contractClassLogFields.push(logFields);
|
|
138
|
+
}
|
|
139
|
+
export async function addNewContractInstanceToTx(tx, contractInstance, skipNullifierInsertion = false) {
|
|
140
|
+
// Only ivpk_m is broadcast as a point (x, y); the other five keys are hashes.
|
|
141
|
+
const publicKeysAsFields = [
|
|
142
|
+
contractInstance.publicKeys.npkMHash,
|
|
143
|
+
contractInstance.publicKeys.ivpkM.x,
|
|
144
|
+
contractInstance.publicKeys.ivpkM.y,
|
|
145
|
+
contractInstance.publicKeys.ovpkMHash,
|
|
146
|
+
contractInstance.publicKeys.tpkMHash,
|
|
147
|
+
contractInstance.publicKeys.mspkMHash,
|
|
148
|
+
contractInstance.publicKeys.fbpkMHash
|
|
149
|
+
];
|
|
150
|
+
const logFields = [
|
|
151
|
+
CONTRACT_INSTANCE_PUBLISHED_EVENT_TAG,
|
|
152
|
+
contractInstance.address.toField(),
|
|
153
|
+
new Fr(contractInstance.version),
|
|
154
|
+
new Fr(contractInstance.salt),
|
|
155
|
+
contractInstance.currentContractClassId,
|
|
156
|
+
contractInstance.initializationHash,
|
|
157
|
+
contractInstance.immutablesHash,
|
|
158
|
+
...publicKeysAsFields,
|
|
159
|
+
contractInstance.deployer.toField()
|
|
160
|
+
];
|
|
161
|
+
const contractInstanceLog = new PrivateLog(padArrayEnd(logFields, Fr.ZERO, PRIVATE_LOG_SIZE_IN_FIELDS), logFields.length);
|
|
162
|
+
const contractAddressNullifier = await siloNullifier(AztecAddress.fromNumberUnsafe(CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS), contractInstance.address.toField());
|
|
163
|
+
const accumulatedData = tx.data.forPublic ? tx.data.forPublic.revertibleAccumulatedData : tx.data.forRollup.end;
|
|
164
|
+
if (!skipNullifierInsertion) {
|
|
165
|
+
const nextNullifierIndex = countAccumulatedItems(accumulatedData.nullifiers);
|
|
166
|
+
accumulatedData.nullifiers[nextNullifierIndex] = contractAddressNullifier;
|
|
167
|
+
}
|
|
168
|
+
const nextLogIndex = countAccumulatedItems(accumulatedData.privateLogs);
|
|
169
|
+
accumulatedData.privateLogs[nextLogIndex] = contractInstanceLog;
|
|
170
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { AvmTxHint, type PublicTxResult } from '@aztec-labs/stdlib/avm';
|
|
2
|
+
import { type MerkleTreeWriteOperations } from '@aztec-labs/stdlib/trees';
|
|
3
|
+
import { GlobalVariables, ProtocolContracts } from '@aztec-labs/stdlib/tx';
|
|
4
|
+
import type { NativeWorldStateService } from '@aztec-labs/world-state';
|
|
5
|
+
import { BaseAvmSimulationTester } from '../avm/testing/base_avm_simulation_tester.js';
|
|
6
|
+
import { AvmSimulatorPool } from '../avm_simulator_pool.js';
|
|
7
|
+
import { SimpleContractDataSource } from '../fixtures/simple_contract_data_source.js';
|
|
8
|
+
import { PublicContractsDB } from '../public_db_sources.js';
|
|
9
|
+
/**
|
|
10
|
+
* Request structure for fuzzer simulation communication from C++.
|
|
11
|
+
* Matches the C++ FuzzerSimulationRequest struct
|
|
12
|
+
*/
|
|
13
|
+
export declare class FuzzerSimulationRequest {
|
|
14
|
+
readonly tx: AvmTxHint;
|
|
15
|
+
readonly globals: GlobalVariables;
|
|
16
|
+
readonly contractClasses: any[];
|
|
17
|
+
readonly contractInstances: [any, any][];
|
|
18
|
+
readonly publicDataWrites: any[];
|
|
19
|
+
readonly noteHashes: any[];
|
|
20
|
+
readonly protocolContracts: ProtocolContracts;
|
|
21
|
+
constructor(tx: AvmTxHint, globals: GlobalVariables, contractClasses: any[], contractInstances: [any, any][], publicDataWrites: any[], noteHashes: any[], protocolContracts: ProtocolContracts);
|
|
22
|
+
static fromPlainObject(obj: any): FuzzerSimulationRequest;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* A simulator class for the AVM fuzzer that extends BaseAvmSimulationTester.
|
|
26
|
+
* It provides methods for registering contracts from C++ msgpack data and simulating transactions.
|
|
27
|
+
* The simulation itself runs on the production C++ AVM simulator, so the fuzzer compares brillig
|
|
28
|
+
* execution against the real AVM rather than a TS reference.
|
|
29
|
+
*/
|
|
30
|
+
export declare class AvmFuzzerSimulator extends BaseAvmSimulationTester {
|
|
31
|
+
private avmSimulator;
|
|
32
|
+
private simulator;
|
|
33
|
+
constructor(merkleTrees: MerkleTreeWriteOperations, contractDataSource: SimpleContractDataSource, globals: GlobalVariables, avmSimulator: AvmSimulatorPool, contractsDB: PublicContractsDB, forkId: number);
|
|
34
|
+
/**
|
|
35
|
+
* Static factory method to create an AvmFuzzerSimulator.
|
|
36
|
+
*/
|
|
37
|
+
static create(worldStateService: NativeWorldStateService, globals: GlobalVariables): Promise<AvmFuzzerSimulator>;
|
|
38
|
+
/** Tear down the AVM simulator pool (AVM processes and CDB server). */
|
|
39
|
+
close(): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Simulate a transaction from a C++ AvmTxHint.
|
|
42
|
+
*/
|
|
43
|
+
simulate(txHint: AvmTxHint): Promise<PublicTxResult>;
|
|
44
|
+
/**
|
|
45
|
+
* Add a contract class from C++ raw msgpack data.
|
|
46
|
+
*/
|
|
47
|
+
addContractClassFromCpp(rawClass: any): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Add a contract instance from C++ raw msgpack data.
|
|
50
|
+
* This also inserts the contract address nullifier into the nullifier tree,
|
|
51
|
+
* unless the address is a protocol canonical address (1-11).
|
|
52
|
+
*/
|
|
53
|
+
addContractInstanceFromCpp(rawAddress: any, rawInstance: any): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Apply public data tree writes from C++ raw msgpack data.
|
|
56
|
+
* This is used to pre-populate the public data tree before simulation (e.g., for bytecode upgrades).
|
|
57
|
+
*/
|
|
58
|
+
applyPublicDataWrites(rawWrites: any[]): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Apply note hashes from C++ raw msgpack data.
|
|
61
|
+
* This is used to pre-populate the note hash tree before simulation.
|
|
62
|
+
*/
|
|
63
|
+
applyNoteHashes(rawNoteHashes: any[]): Promise<void>;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZtX2Z1enplcl9zaW11bGF0b3IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wdWJsaWMvZnV6emluZy9hdm1fZnV6emVyX3NpbXVsYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFVQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFleEUsT0FBTyxFQUFnQixLQUFLLHlCQUF5QixFQUFzQixNQUFNLDBCQUEwQixDQUFDO0FBQzVHLE9BQU8sRUFFTCxlQUFlLEVBRWYsaUJBQWlCLEVBS2xCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV2RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN2RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN0RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUc1RDs7O0dBR0c7QUFDSCxxQkFBYSx1QkFBdUI7YUFFaEIsRUFBRSxFQUFFLFNBQVM7YUFDYixPQUFPLEVBQUUsZUFBZTthQUN4QixlQUFlLEVBQUUsR0FBRyxFQUFFO2FBQ3RCLGlCQUFpQixFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFO2FBQy9CLGdCQUFnQixFQUFFLEdBQUcsRUFBRTthQUN2QixVQUFVLEVBQUUsR0FBRyxFQUFFO2FBQ2pCLGlCQUFpQixFQUFFLGlCQUFpQjtJQVB0RCxZQUNrQixFQUFFLEVBQUUsU0FBUyxFQUNiLE9BQU8sRUFBRSxlQUFlLEVBQ3hCLGVBQWUsRUFBRSxHQUFHLEVBQUUsRUFDdEIsaUJBQWlCLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFDL0IsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFLEVBQ3ZCLFVBQVUsRUFBRSxHQUFHLEVBQUUsRUFDakIsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQ2xEO0lBRUosTUFBTSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLHVCQUF1QixDQWF4RDtDQUNGO0FBbUhEOzs7OztHQUtHO0FBQ0gscUJBQWEsa0JBQW1CLFNBQVEsdUJBQXVCO0lBTzNELE9BQU8sQ0FBQyxZQUFZO0lBTnRCLE9BQU8sQ0FBQyxTQUFTLENBQW9CO0lBRXJDLFlBQ0UsV0FBVyxFQUFFLHlCQUF5QixFQUN0QyxrQkFBa0IsRUFBRSx3QkFBd0IsRUFDNUMsT0FBTyxFQUFFLGVBQWUsRUFDaEIsWUFBWSxFQUFFLGdCQUFnQixFQUN0QyxXQUFXLEVBQUUsaUJBQWlCLEVBQzlCLE1BQU0sRUFBRSxNQUFNLEVBb0JmO0lBRUQ7O09BRUc7SUFDSCxPQUFvQixNQUFNLENBQ3hCLGlCQUFpQixFQUFFLHVCQUF1QixFQUMxQyxPQUFPLEVBQUUsZUFBZSxHQUN2QixPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FPN0I7SUFFRCx1RUFBdUU7SUFDMUQsS0FBSyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FFbEM7SUFFRDs7T0FFRztJQUNVLFFBQVEsQ0FBQyxNQUFNLEVBQUUsU0FBUyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FVaEU7SUFFRDs7T0FFRztJQUNVLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUdqRTtJQUVEOzs7O09BSUc7SUFDVSwwQkFBMEIsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQU14RjtJQUVEOzs7T0FHRztJQUNVLHFCQUFxQixDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBS2xFO0lBRUQ7OztPQUdHO0lBQ1UsZUFBZSxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBSWhFO0NBQ0YifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avm_fuzzer_simulator.d.ts","sourceRoot":"","sources":["../../../src/public/fuzzing/avm_fuzzer_simulator.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAexE,OAAO,EAAgB,KAAK,yBAAyB,EAAsB,MAAM,0BAA0B,CAAC;AAC5G,OAAO,EAEL,eAAe,EAEf,iBAAiB,EAKlB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAEvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8CAA8C,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AACtF,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAG5D;;;GAGG;AACH,qBAAa,uBAAuB;aAEhB,EAAE,EAAE,SAAS;aACb,OAAO,EAAE,eAAe;aACxB,eAAe,EAAE,GAAG,EAAE;aACtB,iBAAiB,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE;aAC/B,gBAAgB,EAAE,GAAG,EAAE;aACvB,UAAU,EAAE,GAAG,EAAE;aACjB,iBAAiB,EAAE,iBAAiB;IAPtD,YACkB,EAAE,EAAE,SAAS,EACb,OAAO,EAAE,eAAe,EACxB,eAAe,EAAE,GAAG,EAAE,EACtB,iBAAiB,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAC/B,gBAAgB,EAAE,GAAG,EAAE,EACvB,UAAU,EAAE,GAAG,EAAE,EACjB,iBAAiB,EAAE,iBAAiB,EAClD;IAEJ,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,uBAAuB,CAaxD;CACF;AAmHD;;;;;GAKG;AACH,qBAAa,kBAAmB,SAAQ,uBAAuB;IAO3D,OAAO,CAAC,YAAY;IANtB,OAAO,CAAC,SAAS,CAAoB;IAErC,YACE,WAAW,EAAE,yBAAyB,EACtC,kBAAkB,EAAE,wBAAwB,EAC5C,OAAO,EAAE,eAAe,EAChB,YAAY,EAAE,gBAAgB,EACtC,WAAW,EAAE,iBAAiB,EAC9B,MAAM,EAAE,MAAM,EAoBf;IAED;;OAEG;IACH,OAAoB,MAAM,CACxB,iBAAiB,EAAE,uBAAuB,EAC1C,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,kBAAkB,CAAC,CAO7B;IAED,uEAAuE;IAC1D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAElC;IAED;;OAEG;IACU,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,CAUhE;IAED;;OAEG;IACU,uBAAuB,CAAC,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAGjE;IAED;;;;OAIG;IACU,0BAA0B,CAAC,UAAU,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAMxF;IAED;;;OAGG;IACU,qBAAqB,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAKlE;IAED;;;OAGG;IACU,eAAe,CAAC,aAAa,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAIhE;CACF"}
|