@aztec/simulator 3.0.0-canary.a9708bd → 3.0.0-devnet.3
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/dest/private/acvm_native.d.ts +1 -2
- package/dest/private/acvm_native.d.ts.map +1 -1
- package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts +1 -1
- package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts.map +1 -1
- package/dest/public/avm/avm_execution_environment.d.ts +2 -1
- package/dest/public/avm/avm_execution_environment.d.ts.map +1 -1
- package/dest/public/avm/avm_execution_environment.js +5 -2
- package/dest/public/avm/avm_gas.js +2 -2
- package/dest/public/avm/avm_memory_types.d.ts +6 -0
- package/dest/public/avm/avm_memory_types.d.ts.map +1 -1
- package/dest/public/avm/avm_memory_types.js +9 -2
- package/dest/public/avm/avm_simulator.d.ts +1 -1
- package/dest/public/avm/avm_simulator.d.ts.map +1 -1
- package/dest/public/avm/avm_simulator.js +14 -21
- package/dest/public/avm/errors.d.ts +5 -14
- package/dest/public/avm/errors.d.ts.map +1 -1
- package/dest/public/avm/errors.js +7 -20
- package/dest/public/avm/fixtures/avm_simulation_tester.d.ts +2 -1
- package/dest/public/avm/fixtures/avm_simulation_tester.d.ts.map +1 -1
- package/dest/public/avm/fixtures/avm_simulation_tester.js +2 -3
- package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts +2 -0
- package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +1 -1
- package/dest/public/avm/fixtures/base_avm_simulation_tester.js +22 -0
- package/dest/public/avm/fixtures/initializers.d.ts.map +1 -1
- package/dest/public/avm/fixtures/initializers.js +2 -2
- package/dest/public/avm/opcodes/accrued_substate.d.ts +2 -2
- package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
- package/dest/public/avm/opcodes/accrued_substate.js +7 -7
- package/dest/public/avm/opcodes/addressing_mode.d.ts.map +1 -1
- package/dest/public/avm/opcodes/addressing_mode.js +2 -3
- package/dest/public/avm/opcodes/conversion.d.ts.map +1 -1
- package/dest/public/avm/opcodes/conversion.js +3 -0
- package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -1
- package/dest/public/avm/opcodes/ec_add.js +3 -2
- package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -1
- package/dest/public/avm/opcodes/environment_getters.js +5 -7
- package/dest/public/avm/opcodes/instruction.d.ts.map +1 -1
- package/dest/public/avm/opcodes/instruction.js +5 -6
- package/dest/public/avm/opcodes/misc.d.ts +2 -1
- package/dest/public/avm/opcodes/misc.d.ts.map +1 -1
- package/dest/public/avm/opcodes/misc.js +28 -8
- package/dest/public/avm/serialization/instruction_serialization.d.ts +8 -0
- package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -1
- package/dest/public/avm/serialization/instruction_serialization.js +10 -0
- package/dest/public/avm/test_utils.d.ts +2 -2
- package/dest/public/avm/test_utils.d.ts.map +1 -1
- package/dest/public/avm/test_utils.js +6 -9
- package/dest/public/fixtures/bulk_test.d.ts.map +1 -1
- package/dest/public/fixtures/bulk_test.js +63 -130
- package/dest/public/fixtures/custom_bytecode_tester.d.ts +12 -0
- package/dest/public/fixtures/custom_bytecode_tester.d.ts.map +1 -0
- package/dest/public/fixtures/custom_bytecode_tester.js +29 -0
- package/dest/public/fixtures/custom_bytecode_tests.d.ts +9 -0
- package/dest/public/fixtures/custom_bytecode_tests.d.ts.map +1 -0
- package/dest/public/fixtures/custom_bytecode_tests.js +109 -0
- package/dest/public/fixtures/index.d.ts +2 -1
- package/dest/public/fixtures/index.d.ts.map +1 -1
- package/dest/public/fixtures/index.js +2 -1
- package/dest/public/fixtures/minimal_public_tx.d.ts +2 -1
- package/dest/public/fixtures/minimal_public_tx.d.ts.map +1 -1
- package/dest/public/fixtures/minimal_public_tx.js +8 -22
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts +4 -2
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
- package/dest/public/fixtures/public_tx_simulation_tester.js +11 -6
- package/dest/public/fixtures/utils.js +1 -1
- package/dest/public/hinting_db_sources.d.ts +2 -0
- package/dest/public/hinting_db_sources.d.ts.map +1 -1
- package/dest/public/hinting_db_sources.js +3 -0
- package/dest/public/index.d.ts +1 -1
- package/dest/public/index.d.ts.map +1 -1
- package/dest/public/public_db_sources.d.ts +2 -2
- package/dest/public/public_db_sources.d.ts.map +1 -1
- package/dest/public/public_db_sources.js +11 -1
- 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 +2 -0
- package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -1
- package/dest/public/public_processor/guarded_merkle_tree.js +3 -0
- package/dest/public/public_processor/public_processor.d.ts +9 -4
- package/dest/public/public_processor/public_processor.d.ts.map +1 -1
- package/dest/public/public_processor/public_processor.js +33 -16
- package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts +41 -0
- package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/cpp_public_tx_simulator.js +89 -0
- package/dest/public/public_tx_simulator/index.d.ts +1 -0
- package/dest/public/public_tx_simulator/index.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts +5 -4
- package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/measured_public_tx_simulator.js +3 -4
- package/dest/public/public_tx_simulator/public_tx_context.d.ts +4 -2
- package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/public_tx_context.js +12 -8
- package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +24 -11
- package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/public_tx_simulator.js +112 -44
- package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts +9 -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/public_tx_simulator/telemetry_public_tx_simulator.d.ts +2 -1
- package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.js +2 -2
- package/dest/public/side_effect_errors.d.ts +41 -1
- package/dest/public/side_effect_errors.d.ts.map +1 -1
- package/dest/public/side_effect_errors.js +70 -1
- package/dest/public/side_effect_trace.d.ts +11 -4
- package/dest/public/side_effect_trace.d.ts.map +1 -1
- package/dest/public/side_effect_trace.js +35 -20
- package/dest/public/side_effect_trace_interface.d.ts +6 -0
- package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
- package/dest/public/state_manager/nullifiers.d.ts +0 -3
- package/dest/public/state_manager/nullifiers.d.ts.map +1 -1
- package/dest/public/state_manager/nullifiers.js +1 -6
- package/dest/public/state_manager/state_manager.d.ts +7 -2
- package/dest/public/state_manager/state_manager.d.ts.map +1 -1
- package/dest/public/state_manager/state_manager.js +54 -15
- package/package.json +21 -17
- package/src/private/acvm_native.ts +1 -2
- package/src/private/circuit_recording/simulator_recorder_wrapper.ts +1 -1
- package/src/public/avm/avm_execution_environment.ts +4 -1
- package/src/public/avm/avm_gas.ts +2 -2
- package/src/public/avm/avm_memory_types.ts +11 -2
- package/src/public/avm/avm_simulator.ts +16 -27
- package/src/public/avm/errors.ts +7 -24
- package/src/public/avm/fixtures/avm_simulation_tester.ts +4 -2
- package/src/public/avm/fixtures/base_avm_simulation_tester.ts +32 -0
- package/src/public/avm/fixtures/initializers.ts +2 -1
- package/src/public/avm/opcodes/accrued_substate.ts +4 -4
- package/src/public/avm/opcodes/addressing_mode.ts +3 -3
- package/src/public/avm/opcodes/conversion.ts +4 -0
- package/src/public/avm/opcodes/ec_add.ts +3 -2
- package/src/public/avm/opcodes/environment_getters.ts +6 -8
- package/src/public/avm/opcodes/instruction.ts +8 -6
- package/src/public/avm/opcodes/misc.ts +41 -7
- package/src/public/avm/serialization/instruction_serialization.ts +12 -0
- package/src/public/avm/test_utils.ts +6 -14
- package/src/public/fixtures/bulk_test.ts +41 -23
- package/src/public/fixtures/custom_bytecode_tester.ts +49 -0
- package/src/public/fixtures/custom_bytecode_tests.ts +135 -0
- package/src/public/fixtures/index.ts +2 -1
- package/src/public/fixtures/minimal_public_tx.ts +8 -31
- package/src/public/fixtures/public_tx_simulation_tester.ts +16 -12
- package/src/public/fixtures/utils.ts +1 -1
- package/src/public/hinting_db_sources.ts +5 -0
- package/src/public/index.ts +6 -1
- package/src/public/public_db_sources.ts +19 -3
- package/src/public/public_errors.ts +14 -0
- package/src/public/public_processor/guarded_merkle_tree.ts +4 -0
- package/src/public/public_processor/public_processor.ts +46 -39
- package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +128 -0
- package/src/public/public_tx_simulator/index.ts +1 -0
- package/src/public/public_tx_simulator/measured_public_tx_simulator.ts +12 -9
- package/src/public/public_tx_simulator/public_tx_context.ts +11 -4
- package/src/public/public_tx_simulator/public_tx_simulator.ts +178 -60
- package/src/public/public_tx_simulator/public_tx_simulator_interface.ts +11 -0
- package/src/public/public_tx_simulator/telemetry_public_tx_simulator.ts +3 -12
- package/src/public/side_effect_errors.ts +91 -1
- package/src/public/side_effect_trace.ts +48 -23
- package/src/public/side_effect_trace_interface.ts +6 -0
- package/src/public/state_manager/nullifiers.ts +1 -7
- package/src/public/state_manager/state_manager.ts +73 -25
- package/dest/public/bytecode_errors.d.ts +0 -4
- package/dest/public/bytecode_errors.d.ts.map +0 -1
- package/dest/public/bytecode_errors.js +0 -6
- package/src/public/bytecode_errors.ts +0 -6
|
@@ -6,7 +6,7 @@ import type { GlobalVariables } from '@aztec/stdlib/tx';
|
|
|
6
6
|
|
|
7
7
|
import { strict as assert } from 'assert';
|
|
8
8
|
|
|
9
|
-
import {
|
|
9
|
+
import { CheckedPublicExecutionError } from '../public_errors.js';
|
|
10
10
|
import type { PublicPersistableStateManager } from '../state_manager/state_manager.js';
|
|
11
11
|
import { AvmContext } from './avm_context.js';
|
|
12
12
|
import { AvmContractCallResult } from './avm_contract_call_result.js';
|
|
@@ -14,7 +14,7 @@ import { AvmExecutionEnvironment } from './avm_execution_environment.js';
|
|
|
14
14
|
import type { Gas } from './avm_gas.js';
|
|
15
15
|
import { AvmMachineState } from './avm_machine_state.js';
|
|
16
16
|
import type { AvmSimulatorInterface } from './avm_simulator_interface.js';
|
|
17
|
-
import {
|
|
17
|
+
import { AvmRevertReason, InvalidProgramCounterError } from './errors.js';
|
|
18
18
|
import type { Instruction } from './opcodes/instruction.js';
|
|
19
19
|
import { revertReasonFromExceptionalHalt, revertReasonFromExplicitRevert } from './revert_reason.js';
|
|
20
20
|
import {
|
|
@@ -76,6 +76,7 @@ export class AvmSimulator implements AvmSimulatorInterface {
|
|
|
76
76
|
calldata: Fr[],
|
|
77
77
|
allocatedGas: Gas,
|
|
78
78
|
clientInitiatedSimulation: boolean = false,
|
|
79
|
+
maxDebugLogMemoryReads?: number,
|
|
79
80
|
) {
|
|
80
81
|
const avmExecutionEnv = new AvmExecutionEnvironment(
|
|
81
82
|
address,
|
|
@@ -86,6 +87,7 @@ export class AvmSimulator implements AvmSimulatorInterface {
|
|
|
86
87
|
isStaticCall,
|
|
87
88
|
calldata,
|
|
88
89
|
clientInitiatedSimulation,
|
|
90
|
+
maxDebugLogMemoryReads,
|
|
89
91
|
);
|
|
90
92
|
|
|
91
93
|
const avmMachineState = new AvmMachineState(allocatedGas);
|
|
@@ -97,22 +99,13 @@ export class AvmSimulator implements AvmSimulatorInterface {
|
|
|
97
99
|
* Fetch the bytecode and execute it in the current context.
|
|
98
100
|
*/
|
|
99
101
|
public async execute(): Promise<AvmContractCallResult> {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
} catch (err: any) {
|
|
104
|
-
if (!(err instanceof AvmExecutionError || err instanceof SideEffectLimitReachedError)) {
|
|
105
|
-
this.log.error(`Unknown error thrown by AVM during bytecode retrieval: ${err}`);
|
|
106
|
-
throw err;
|
|
107
|
-
}
|
|
108
|
-
return await this.handleFailureToRetrieveBytecode(
|
|
109
|
-
`Bytecode retrieval for contract '${this.context.environment.address}' failed with ${err.message}. Reverting...`,
|
|
110
|
-
);
|
|
111
|
-
}
|
|
102
|
+
const bytecode = await this.context.persistableState.getBytecode(this.context.environment.address);
|
|
103
|
+
// getBytecode returns undefined if bytecode is not found or if the limit of contract calls to unique class IDs is reached.
|
|
104
|
+
// If it throws an error that reaches this point, it is a bug.
|
|
112
105
|
|
|
113
106
|
if (!bytecode) {
|
|
114
107
|
return await this.handleFailureToRetrieveBytecode(
|
|
115
|
-
`No bytecode found
|
|
108
|
+
`No bytecode found, or limit encountered for max calls to unique contract class IDs. Contract address: ${this.context.environment.address}. Reverting...`,
|
|
116
109
|
);
|
|
117
110
|
}
|
|
118
111
|
|
|
@@ -135,6 +128,7 @@ export class AvmSimulator implements AvmSimulatorInterface {
|
|
|
135
128
|
assert(bytecode.length > 0, "AVM simulator can't execute empty bytecode");
|
|
136
129
|
|
|
137
130
|
this.bytecode = bytecode;
|
|
131
|
+
let instructionName = 'NONE'; // This is used for logging purposes
|
|
138
132
|
|
|
139
133
|
const { machineState } = this.context;
|
|
140
134
|
const callStartGas = machineState.gasLeft; // Save gas before executing instruction (for profiling)
|
|
@@ -163,6 +157,7 @@ export class AvmSimulator implements AvmSimulatorInterface {
|
|
|
163
157
|
}
|
|
164
158
|
machineState.nextPc = machineState.pc + bytesRead;
|
|
165
159
|
|
|
160
|
+
instructionName = instruction.constructor.name;
|
|
166
161
|
// Execute the instruction.
|
|
167
162
|
// Normal returns and reverts will return normally here.
|
|
168
163
|
// "Exceptional halts" will throw.
|
|
@@ -211,18 +206,12 @@ export class AvmSimulator implements AvmSimulatorInterface {
|
|
|
211
206
|
// Return results for processing by calling context
|
|
212
207
|
return results;
|
|
213
208
|
} catch (err: any) {
|
|
214
|
-
this.log.
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
if (
|
|
219
|
-
|
|
220
|
-
err.constructor.name == 'OutOfGasError' ||
|
|
221
|
-
err instanceof AvmExecutionError ||
|
|
222
|
-
err instanceof SideEffectLimitReachedError
|
|
223
|
-
)
|
|
224
|
-
) {
|
|
225
|
-
this.log.error(`Unknown error thrown by AVM: ${err}`);
|
|
209
|
+
this.log.info(
|
|
210
|
+
`Exceptional halt (revert by something other than REVERT opcode) for instruction
|
|
211
|
+
${instructionName} at pc ${machineState.pc} and instruction counter ${machineState.instrCounter}`,
|
|
212
|
+
);
|
|
213
|
+
if (!(err instanceof CheckedPublicExecutionError)) {
|
|
214
|
+
this.log.error(`Unchecked/unknown error thrown by AVM. This is a bug. Error: ${err}`);
|
|
226
215
|
throw err;
|
|
227
216
|
}
|
|
228
217
|
|
package/src/public/avm/errors.ts
CHANGED
|
@@ -1,26 +1,19 @@
|
|
|
1
1
|
import type { Point } from '@aztec/foundation/fields';
|
|
2
|
-
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
3
2
|
import type { FailingFunction, NoirCallStack } from '@aztec/stdlib/errors';
|
|
4
3
|
|
|
5
4
|
import { ExecutionError } from '../../common/errors.js';
|
|
5
|
+
import { CheckedPublicExecutionError } from '../public_errors.js';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Avm-specific errors should derive from this
|
|
9
9
|
*/
|
|
10
|
-
export abstract class AvmExecutionError extends
|
|
10
|
+
export abstract class AvmExecutionError extends CheckedPublicExecutionError {
|
|
11
11
|
constructor(message: string) {
|
|
12
12
|
super(message);
|
|
13
13
|
this.name = 'AvmExecutionError';
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
export class NoBytecodeForContractError extends AvmExecutionError {
|
|
18
|
-
constructor(contractAddress: AztecAddress) {
|
|
19
|
-
super(`No bytecode found at: ${contractAddress}`);
|
|
20
|
-
this.name = 'NoBytecodeFoundInterpreterError';
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
17
|
export class ArithmeticError extends AvmExecutionError {
|
|
25
18
|
constructor(message: string) {
|
|
26
19
|
super(message);
|
|
@@ -129,22 +122,12 @@ export class OutOfGasError extends AvmExecutionError {
|
|
|
129
122
|
}
|
|
130
123
|
|
|
131
124
|
/**
|
|
132
|
-
* Error is thrown when the supplied points
|
|
133
|
-
*/
|
|
134
|
-
export class MSMPointsLengthError extends AvmExecutionError {
|
|
135
|
-
constructor(pointsReadLength: number) {
|
|
136
|
-
super(`Points vector length should be a multiple of 3, was ${pointsReadLength}`);
|
|
137
|
-
this.name = 'MSMPointsLengthError';
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Error is thrown when one of the supplied points does not lie on the Grumpkin curve. Specific for MSM opcode.
|
|
125
|
+
* Error is thrown when one of the supplied points does not lie on the Grumpkin curve. Specific for ECADD opcode.
|
|
143
126
|
*/
|
|
144
|
-
export class
|
|
145
|
-
constructor(point: Point) {
|
|
146
|
-
super(`
|
|
147
|
-
this.name = '
|
|
127
|
+
export class EcAddPointNotOnCurveError extends AvmExecutionError {
|
|
128
|
+
constructor(pointIndex: number, point: Point) {
|
|
129
|
+
super(`EcAdd point${pointIndex} (${point.toString()}) is not on the curve.`);
|
|
130
|
+
this.name = 'EcAddPointNotOnCurveError';
|
|
148
131
|
}
|
|
149
132
|
}
|
|
150
133
|
|
|
@@ -37,9 +37,11 @@ export class AvmSimulationTester extends BaseAvmSimulationTester {
|
|
|
37
37
|
super(contractDataSource, merkleTrees);
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
static async create(
|
|
40
|
+
static async create(
|
|
41
|
+
worldStateService: NativeWorldStateService, // make sure to close this later
|
|
42
|
+
): Promise<AvmSimulationTester> {
|
|
41
43
|
const contractDataSource = new SimpleContractDataSource();
|
|
42
|
-
const merkleTrees = await
|
|
44
|
+
const merkleTrees = await worldStateService.fork();
|
|
43
45
|
const treesDB = new PublicTreesDB(merkleTrees);
|
|
44
46
|
const contractsDB = new PublicContractsDB(contractDataSource);
|
|
45
47
|
const trace = new SideEffectTrace();
|
|
@@ -2,7 +2,9 @@ import { CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS } from '@aztec/constants';
|
|
|
2
2
|
import { Fr } from '@aztec/foundation/fields';
|
|
3
3
|
import { createLogger } from '@aztec/foundation/log';
|
|
4
4
|
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
5
|
+
import { getCanonicalAuthRegistry } from '@aztec/protocol-contracts/auth-registry';
|
|
5
6
|
import { computeFeePayerBalanceStorageSlot, getCanonicalFeeJuice } from '@aztec/protocol-contracts/fee-juice';
|
|
7
|
+
import { getCanonicalInstanceRegistry } from '@aztec/protocol-contracts/instance-registry';
|
|
6
8
|
import type { ContractArtifact } from '@aztec/stdlib/abi';
|
|
7
9
|
import { PublicDataWrite } from '@aztec/stdlib/avm';
|
|
8
10
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
@@ -88,6 +90,36 @@ export abstract class BaseAvmSimulationTester {
|
|
|
88
90
|
return feeJuice.instance;
|
|
89
91
|
}
|
|
90
92
|
|
|
93
|
+
async registerAuthContract(): Promise<ContractInstanceWithAddress> {
|
|
94
|
+
const authRegistry = await getCanonicalAuthRegistry();
|
|
95
|
+
const authRegistryContractClassPublic = {
|
|
96
|
+
...authRegistry.contractClass,
|
|
97
|
+
privateFunctions: [],
|
|
98
|
+
utilityFunctions: [],
|
|
99
|
+
};
|
|
100
|
+
await this.contractDataSource.addNewContract(
|
|
101
|
+
authRegistry.artifact,
|
|
102
|
+
authRegistryContractClassPublic,
|
|
103
|
+
authRegistry.instance,
|
|
104
|
+
);
|
|
105
|
+
return authRegistry.instance;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
async registerInstanceRegistryContract(): Promise<ContractInstanceWithAddress> {
|
|
109
|
+
const instanceRegistry = await getCanonicalInstanceRegistry();
|
|
110
|
+
const instanceRegistryContractClassPublic = {
|
|
111
|
+
...instanceRegistry.contractClass,
|
|
112
|
+
privateFunctions: [],
|
|
113
|
+
utilityFunctions: [],
|
|
114
|
+
};
|
|
115
|
+
await this.contractDataSource.addNewContract(
|
|
116
|
+
instanceRegistry.artifact,
|
|
117
|
+
instanceRegistryContractClassPublic,
|
|
118
|
+
instanceRegistry.instance,
|
|
119
|
+
);
|
|
120
|
+
return instanceRegistry.instance;
|
|
121
|
+
}
|
|
122
|
+
|
|
91
123
|
async addContractInstance(contractInstance: ContractInstanceWithAddress, skipNullifierInsertion = false) {
|
|
92
124
|
if (!skipNullifierInsertion) {
|
|
93
125
|
await this.insertContractAddressNullifier(contractInstance.address);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AVM_MAX_PROCESSABLE_L2_GAS } from '@aztec/constants';
|
|
1
|
+
import { AVM_MAX_PROCESSABLE_L2_GAS, DEFAULT_MAX_DEBUG_LOG_MEMORY_READS } from '@aztec/constants';
|
|
2
2
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
3
3
|
import { Fr } from '@aztec/foundation/fields';
|
|
4
4
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
@@ -73,6 +73,7 @@ export function initExecutionEnvironment(overrides?: Partial<AvmExecutionEnviron
|
|
|
73
73
|
overrides?.isStaticCall ?? false,
|
|
74
74
|
overrides?.calldata ?? [],
|
|
75
75
|
overrides?.clientInitiatedSimulation ?? true, // default to true for testing even though internal default is false
|
|
76
|
+
overrides?.maxDebugLogMemoryReads ?? DEFAULT_MAX_DEBUG_LOG_MEMORY_READS,
|
|
76
77
|
);
|
|
77
78
|
}
|
|
78
79
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { NullifierCollisionError } from '../../
|
|
1
|
+
import { NullifierCollisionError } from '../../side_effect_errors.js';
|
|
2
2
|
import type { AvmContext } from '../avm_context.js';
|
|
3
3
|
import { TypeTag, Uint1 } from '../avm_memory_types.js';
|
|
4
4
|
import { InstructionExecutionError, StaticCallAlterationError } from '../errors.js';
|
|
@@ -219,8 +219,8 @@ export class EmitUnencryptedLog extends Instruction {
|
|
|
219
219
|
|
|
220
220
|
constructor(
|
|
221
221
|
private indirect: number,
|
|
222
|
-
private logOffset: number,
|
|
223
222
|
private logSizeOffset: number,
|
|
223
|
+
private logOffset: number,
|
|
224
224
|
) {
|
|
225
225
|
super();
|
|
226
226
|
}
|
|
@@ -237,8 +237,8 @@ export class EmitUnencryptedLog extends Instruction {
|
|
|
237
237
|
this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
|
|
238
238
|
);
|
|
239
239
|
|
|
240
|
-
const operands = [this.
|
|
241
|
-
const [
|
|
240
|
+
const operands = [this.logSizeOffset, this.logOffset];
|
|
241
|
+
const [logSizeOffset, logOffset] = addressing.resolve(operands, memory);
|
|
242
242
|
memory.checkTag(TypeTag.UINT32, logSizeOffset);
|
|
243
243
|
const logSize = memory.get(logSizeOffset).toNumber();
|
|
244
244
|
memory.checkTagsRange(TypeTag.FIELD, logOffset, logSize);
|
|
@@ -2,6 +2,8 @@ import { AVM_MAX_OPERANDS } from '@aztec/constants';
|
|
|
2
2
|
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
3
3
|
import type { Tuple } from '@aztec/foundation/serialize';
|
|
4
4
|
|
|
5
|
+
import { strict as assert } from 'assert';
|
|
6
|
+
|
|
5
7
|
import { MemoryValue, TaggedMemory, type TaggedMemoryInterface, TypeTag } from '../avm_memory_types.js';
|
|
6
8
|
import { RelativeAddressOutOfRangeError, TagCheckError } from '../errors.js';
|
|
7
9
|
|
|
@@ -20,9 +22,7 @@ export class Addressing {
|
|
|
20
22
|
) {}
|
|
21
23
|
|
|
22
24
|
public static fromModes(modes: AddressingMode[]): Addressing {
|
|
23
|
-
|
|
24
|
-
throw new Error('Too many operands for addressing mode');
|
|
25
|
-
}
|
|
25
|
+
assert(modes.length <= AVM_MAX_OPERANDS, 'Too many operands for addressing mode');
|
|
26
26
|
return new Addressing(padArrayEnd(modes, AddressingMode.DIRECT, AVM_MAX_OPERANDS));
|
|
27
27
|
}
|
|
28
28
|
|
|
@@ -80,6 +80,10 @@ export class ToRadixBE extends Instruction {
|
|
|
80
80
|
value /= radixBN;
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
+
if (value !== 0n) {
|
|
84
|
+
throw new InvalidToRadixInputsError(`Field failed to decompose in ${numLimbs} limbs.`);
|
|
85
|
+
}
|
|
86
|
+
|
|
83
87
|
const outputType = outputBits != 0 ? Uint1 : Uint8;
|
|
84
88
|
const res = limbArray.map(byte => new outputType(byte));
|
|
85
89
|
memory.setSlice(dstOffset, res);
|
|
@@ -3,6 +3,7 @@ import { Point } from '@aztec/foundation/fields';
|
|
|
3
3
|
|
|
4
4
|
import type { AvmContext } from '../avm_context.js';
|
|
5
5
|
import { Field, TypeTag, Uint1 } from '../avm_memory_types.js';
|
|
6
|
+
import { EcAddPointNotOnCurveError } from '../errors.js';
|
|
6
7
|
import { Opcode, OperandType } from '../serialization/instruction_serialization.js';
|
|
7
8
|
import { Addressing } from './addressing_mode.js';
|
|
8
9
|
import { Instruction } from './instruction.js';
|
|
@@ -65,7 +66,7 @@ export class EcAdd extends Instruction {
|
|
|
65
66
|
const p1IsInfinite = memory.get(p1IsInfiniteOffset).toNumber() === 1;
|
|
66
67
|
const p1 = new Point(p1X.toFr(), p1Y.toFr(), p1IsInfinite);
|
|
67
68
|
if (!p1.isOnGrumpkin()) {
|
|
68
|
-
throw new
|
|
69
|
+
throw new EcAddPointNotOnCurveError(/*pointIndex=*/ 1, p1);
|
|
69
70
|
}
|
|
70
71
|
|
|
71
72
|
const p2X = memory.get(p2XOffset);
|
|
@@ -74,7 +75,7 @@ export class EcAdd extends Instruction {
|
|
|
74
75
|
const p2IsInfinite = memory.get(p2IsInfiniteOffset).toNumber() === 1;
|
|
75
76
|
const p2 = new Point(p2X.toFr(), p2Y.toFr(), p2IsInfinite);
|
|
76
77
|
if (!p2.isOnGrumpkin()) {
|
|
77
|
-
throw new
|
|
78
|
+
throw new EcAddPointNotOnCurveError(/*pointIndex=*/ 2, p2);
|
|
78
79
|
}
|
|
79
80
|
|
|
80
81
|
const grumpkin = new Grumpkin();
|
|
@@ -20,8 +20,8 @@ export enum EnvironmentVariable {
|
|
|
20
20
|
DAGASLEFT,
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
function getValue(
|
|
24
|
-
switch (
|
|
23
|
+
function getValue(varEnum: EnvironmentVariable, ctx: AvmContext) {
|
|
24
|
+
switch (varEnum) {
|
|
25
25
|
case EnvironmentVariable.ADDRESS:
|
|
26
26
|
return new Field(ctx.environment.address.toField());
|
|
27
27
|
case EnvironmentVariable.SENDER:
|
|
@@ -47,7 +47,7 @@ function getValue(e: EnvironmentVariable, ctx: AvmContext) {
|
|
|
47
47
|
case EnvironmentVariable.DAGASLEFT:
|
|
48
48
|
return new Uint32(ctx.machineState.daGasLeft);
|
|
49
49
|
default:
|
|
50
|
-
throw new
|
|
50
|
+
throw new InstructionExecutionError(`Invalid GETENVVAR var enum ${varEnum}`);
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
53
|
|
|
@@ -77,13 +77,11 @@ export class GetEnvVar extends Instruction {
|
|
|
77
77
|
this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
|
|
78
78
|
);
|
|
79
79
|
|
|
80
|
-
if (!(this.varEnum in EnvironmentVariable)) {
|
|
81
|
-
throw new InstructionExecutionError(`Invalid GETENVVAR var enum ${this.varEnum}`);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
80
|
const operands = [this.dstOffset];
|
|
85
81
|
const [dstOffset] = addressing.resolve(operands, memory);
|
|
86
82
|
|
|
87
|
-
|
|
83
|
+
const value = getValue(this.varEnum as EnvironmentVariable, context);
|
|
84
|
+
|
|
85
|
+
memory.set(dstOffset, value);
|
|
88
86
|
}
|
|
89
87
|
}
|
|
@@ -36,6 +36,8 @@ export abstract class Instruction {
|
|
|
36
36
|
* @returns Thee string representation.
|
|
37
37
|
*/
|
|
38
38
|
public toString(): string {
|
|
39
|
+
// Note: we could have this be the actual wire opcode if `bytecode_serialization.ts` were to
|
|
40
|
+
// pass it into the class' static `Instruction.as(this, wireFormat)` method.
|
|
39
41
|
let instructionStr = this.constructor.name + ': ';
|
|
40
42
|
// assumes that all properties are flags or operands
|
|
41
43
|
for (const prop of Object.getOwnPropertyNames(this) as (keyof Instruction)[]) {
|
|
@@ -114,9 +116,7 @@ export abstract class Instruction {
|
|
|
114
116
|
*/
|
|
115
117
|
public get type(): string {
|
|
116
118
|
const type = 'type' in this.constructor && (this.constructor.type as string);
|
|
117
|
-
|
|
118
|
-
throw new Error(`Instruction class ${this.constructor.name} does not have a static 'type' property defined.`);
|
|
119
|
-
}
|
|
119
|
+
assert(!!type, `Instruction class ${this.constructor.name} does not have a static 'type' property defined.`);
|
|
120
120
|
return type;
|
|
121
121
|
}
|
|
122
122
|
|
|
@@ -126,9 +126,11 @@ export abstract class Instruction {
|
|
|
126
126
|
*/
|
|
127
127
|
public get opcode(): Opcode {
|
|
128
128
|
const opcode = 'opcode' in this.constructor ? (this.constructor.opcode as Opcode) : undefined;
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
129
|
+
assert(
|
|
130
|
+
opcode !== undefined,
|
|
131
|
+
`Instruction class ${this.constructor.name} does not have a static 'opcode' property defined.`,
|
|
132
|
+
);
|
|
133
|
+
assert(Opcode[opcode] !== undefined, `Invalid opcode ${opcode} for instruction class ${this.constructor.name}.`);
|
|
132
134
|
return opcode;
|
|
133
135
|
}
|
|
134
136
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { applyStringFormatting, createLogger } from '@aztec/foundation/log';
|
|
1
|
+
import { LogLevels, applyStringFormatting, createLogger } from '@aztec/foundation/log';
|
|
2
2
|
|
|
3
3
|
import type { AvmContext } from '../avm_context.js';
|
|
4
4
|
import { TypeTag } from '../avm_memory_types.js';
|
|
@@ -15,6 +15,7 @@ export class DebugLog extends Instruction {
|
|
|
15
15
|
static readonly wireFormat: OperandType[] = [
|
|
16
16
|
OperandType.UINT8, // Opcode
|
|
17
17
|
OperandType.UINT8, // Indirect
|
|
18
|
+
OperandType.UINT16, // level memory address
|
|
18
19
|
OperandType.UINT16, // message memory address
|
|
19
20
|
OperandType.UINT16, // fields memory address
|
|
20
21
|
OperandType.UINT16, // fields size address
|
|
@@ -23,6 +24,7 @@ export class DebugLog extends Instruction {
|
|
|
23
24
|
|
|
24
25
|
constructor(
|
|
25
26
|
private indirect: number,
|
|
27
|
+
private levelOffset: number,
|
|
26
28
|
private messageOffset: number,
|
|
27
29
|
private fieldsOffset: number,
|
|
28
30
|
private fieldsSizeOffset: number,
|
|
@@ -39,16 +41,30 @@ export class DebugLog extends Instruction {
|
|
|
39
41
|
this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
|
|
40
42
|
);
|
|
41
43
|
|
|
42
|
-
const operands = [this.messageOffset, this.fieldsOffset, this.fieldsSizeOffset];
|
|
43
|
-
const [messageOffset, fieldsOffset, fieldsSizeOffset] = addressing.resolve(operands, memory);
|
|
44
|
+
const operands = [this.levelOffset, this.messageOffset, this.fieldsOffset, this.fieldsSizeOffset];
|
|
45
|
+
const [levelOffset, messageOffset, fieldsOffset, fieldsSizeOffset] = addressing.resolve(operands, memory);
|
|
44
46
|
|
|
45
|
-
// DebugLog is a no-op except when doing client-initiated simulation
|
|
47
|
+
// DebugLog is a no-op except when doing client-initiated simulation.
|
|
46
48
|
// Note that we still do address resolution and basic tag-checking (above)
|
|
47
49
|
// To avoid a special-case in the witness generator and circuit.
|
|
48
|
-
if (context.environment.clientInitiatedSimulation
|
|
50
|
+
if (context.environment.clientInitiatedSimulation) {
|
|
51
|
+
memory.checkTag(TypeTag.UINT8, levelOffset);
|
|
52
|
+
const levelNumber = memory.get(levelOffset).toNumber();
|
|
49
53
|
memory.checkTag(TypeTag.UINT32, fieldsSizeOffset);
|
|
50
54
|
const fieldsSize = memory.get(fieldsSizeOffset).toNumber();
|
|
51
55
|
|
|
56
|
+
const memoryReads = 1 /* level */ + 1 /* fieldsSize */ + this.messageSize /* message */ + fieldsSize; /* fields */
|
|
57
|
+
if (
|
|
58
|
+
context.persistableState.getDebugLogMemoryReads() + memoryReads >
|
|
59
|
+
context.environment.maxDebugLogMemoryReads
|
|
60
|
+
) {
|
|
61
|
+
// Regular error on purpose: this is not a recoverable error.
|
|
62
|
+
throw new Error(
|
|
63
|
+
`Max debug log memory reads exceeded: ${context.persistableState.getDebugLogMemoryReads() + memoryReads} > ${context.environment.maxDebugLogMemoryReads}`,
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
context.persistableState.writeDebugLogMemoryReads(memoryReads);
|
|
67
|
+
|
|
52
68
|
const rawMessage = memory.getSlice(messageOffset, this.messageSize);
|
|
53
69
|
const fields = memory.getSlice(fieldsOffset, fieldsSize);
|
|
54
70
|
|
|
@@ -57,12 +73,30 @@ export class DebugLog extends Instruction {
|
|
|
57
73
|
|
|
58
74
|
// Interpret str<N> = [u8; N] to string.
|
|
59
75
|
const messageAsStr = rawMessage.map(field => String.fromCharCode(field.toNumber())).join('');
|
|
60
|
-
|
|
76
|
+
|
|
77
|
+
if (!LogLevels[levelNumber]) {
|
|
78
|
+
// Regular error on purpose: this is not a recoverable error.
|
|
79
|
+
throw new Error(`Invalid debug log level: ${levelNumber}`);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const level = LogLevels[levelNumber];
|
|
83
|
+
|
|
84
|
+
context.persistableState.writeDebugLog(
|
|
85
|
+
context.environment.address,
|
|
86
|
+
level,
|
|
61
87
|
messageAsStr,
|
|
62
88
|
fields.map(field => field.toFr()),
|
|
63
89
|
);
|
|
64
90
|
|
|
65
|
-
|
|
91
|
+
// Skips string formatting if the level is disabled.
|
|
92
|
+
if (DebugLog.logger.isLevelEnabled(level)) {
|
|
93
|
+
const formattedStr = applyStringFormatting(
|
|
94
|
+
messageAsStr,
|
|
95
|
+
fields.map(field => field.toFr()),
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
DebugLog.logger[level](formattedStr);
|
|
99
|
+
}
|
|
66
100
|
}
|
|
67
101
|
}
|
|
68
102
|
}
|
|
@@ -124,6 +124,18 @@ const OPERAND_SPEC = new Map<OperandType, [number, (offset: number) => OperandNa
|
|
|
124
124
|
[OperandType.TAG, [1, Buffer.prototype.readUint8, Buffer.prototype.writeUint8]],
|
|
125
125
|
]);
|
|
126
126
|
|
|
127
|
+
/**
|
|
128
|
+
* Returns the size of an operand in bytes.
|
|
129
|
+
* Should not be called with unknown operand types.
|
|
130
|
+
* @param operandType
|
|
131
|
+
* @returns number size in bytes
|
|
132
|
+
* @throws AssertionError if the operand type is unknown
|
|
133
|
+
*/
|
|
134
|
+
export function getOperandSize(operandType: OperandType): number {
|
|
135
|
+
assert(OPERAND_SPEC.has(operandType), `Unknown operand type: ${operandType}`);
|
|
136
|
+
return OPERAND_SPEC.get(operandType)![0];
|
|
137
|
+
}
|
|
138
|
+
|
|
127
139
|
function readUintBE(buf: Buffer, offset: number, totalBytes: number): bigint {
|
|
128
140
|
let value: bigint = 0n;
|
|
129
141
|
for (let i = 0; i < totalBytes; ++i) {
|
|
@@ -27,13 +27,12 @@ export function mockStorageReadWithMap(worldStateDB: PublicTreesDB, mockedStorag
|
|
|
27
27
|
);
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
export function
|
|
30
|
+
export function mockGetNoteHash(worldStateDB: PublicTreesDB, _leafIndex: bigint, value?: Fr) {
|
|
31
31
|
(worldStateDB as jest.Mocked<PublicTreesDB>).getNoteHash.mockImplementation((index: bigint) => {
|
|
32
|
-
if (index == _leafIndex) {
|
|
32
|
+
if (index == _leafIndex && value) {
|
|
33
33
|
return Promise.resolve(value);
|
|
34
34
|
} else {
|
|
35
|
-
|
|
36
|
-
return Promise.resolve(undefined);
|
|
35
|
+
return Promise.resolve(Fr.ZERO);
|
|
37
36
|
}
|
|
38
37
|
});
|
|
39
38
|
}
|
|
@@ -42,19 +41,12 @@ export function mockCheckNullifierExists(worldStateDB: PublicTreesDB, exists: bo
|
|
|
42
41
|
(worldStateDB as jest.Mocked<PublicTreesDB>).checkNullifierExists.mockResolvedValue(exists);
|
|
43
42
|
}
|
|
44
43
|
|
|
45
|
-
export function
|
|
46
|
-
worldStateDB: PublicTreesDB,
|
|
47
|
-
leafIndex: bigint,
|
|
48
|
-
value: Fr,
|
|
49
|
-
valueAtOtherIndices?: Fr,
|
|
50
|
-
) {
|
|
44
|
+
export function mockGetL1ToL2LeafValue(worldStateDB: PublicTreesDB, leafIndex: bigint, value?: Fr) {
|
|
51
45
|
(worldStateDB as jest.Mocked<PublicTreesDB>).getL1ToL2LeafValue.mockImplementation((index: bigint) => {
|
|
52
|
-
if (index == leafIndex) {
|
|
46
|
+
if (index == leafIndex && value) {
|
|
53
47
|
return Promise.resolve(value);
|
|
54
48
|
} else {
|
|
55
|
-
|
|
56
|
-
// (or undefined if no value is specified for other indices)
|
|
57
|
-
return Promise.resolve(valueAtOtherIndices!);
|
|
49
|
+
return Promise.resolve(Fr.ZERO!);
|
|
58
50
|
}
|
|
59
51
|
});
|
|
60
52
|
}
|
|
@@ -20,11 +20,19 @@ export async function bulkTest(
|
|
|
20
20
|
avmTestContractArtifact,
|
|
21
21
|
);
|
|
22
22
|
|
|
23
|
+
// Needed since we invoke the Fee Juice Contract in the bulk test.registerFeeJuiceContract
|
|
24
|
+
await tester.registerFeeJuiceContract();
|
|
25
|
+
// Register multiple different protocol contracts (to ensure we don't dedup bytecode hashing events):
|
|
26
|
+
await tester.registerAuthContract();
|
|
27
|
+
await tester.registerInstanceRegistryContract();
|
|
28
|
+
|
|
23
29
|
// Get a deployed contract instance to pass to the contract
|
|
24
30
|
// for it to use as "expected" values when testing contract instance retrieval.
|
|
25
31
|
const expectContractInstance = avmTestContract;
|
|
26
32
|
const argsField = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(x => new Fr(x));
|
|
27
|
-
const argsU8 = [1, 2, 3, 4, 5, 6, 7, 8
|
|
33
|
+
const argsU8 = [1, 2, 3, 4, 5, 6, 7, 8].map(x => new Fr(x));
|
|
34
|
+
argsU8.push(new Fr(2n ** 128n + 9n)); // Trigger truncation from large (> 128 bits) value (canonical decomposition event)
|
|
35
|
+
argsU8.push(new Fr(2n ** 125n + 10n)); // Trigger truncation from small (< 128 bits) value (no canonical decomposition event)
|
|
28
36
|
const args = [
|
|
29
37
|
argsField,
|
|
30
38
|
argsU8,
|
|
@@ -45,6 +53,26 @@ export async function bulkTest(
|
|
|
45
53
|
fnName: 'bulk_testing',
|
|
46
54
|
args,
|
|
47
55
|
},
|
|
56
|
+
// 3 calls creating calldata + asserting calldata copy:
|
|
57
|
+
{
|
|
58
|
+
address: avmTestContract.address,
|
|
59
|
+
fnName: 'assert_calldata_copy_large',
|
|
60
|
+
args: [Array.from({ length: 300 }, () => Fr.random()), /* with_selector: */ true],
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
address: avmTestContract.address,
|
|
64
|
+
fnName: 'assert_calldata_copy',
|
|
65
|
+
args: [argsField.slice(3), /* with_selector: */ true],
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
address: avmTestContract.address,
|
|
69
|
+
fnName: 'assert_calldata_copy_large',
|
|
70
|
+
args: [Array.from({ length: 300 }, () => Fr.random()), /* with_selector: */ true],
|
|
71
|
+
},
|
|
72
|
+
// 3 calls to external contracts
|
|
73
|
+
{ address: avmTestContract.address, fnName: 'call_fee_juice', args: [] },
|
|
74
|
+
{ address: avmTestContract.address, fnName: 'call_auth_registry', args: [] },
|
|
75
|
+
{ address: avmTestContract.address, fnName: 'call_instance_registry', args: [] },
|
|
48
76
|
],
|
|
49
77
|
/*teardownCall=*/ undefined,
|
|
50
78
|
/*feePayer*/ undefined,
|
|
@@ -78,25 +106,22 @@ export async function megaBulkTest(
|
|
|
78
106
|
deployer,
|
|
79
107
|
avmTestContractArtifact,
|
|
80
108
|
);
|
|
109
|
+
|
|
110
|
+
// Needed since we invoke the Fee Juice Contract in the bulk test.registerFeeJuiceContract
|
|
111
|
+
await tester.registerFeeJuiceContract();
|
|
112
|
+
|
|
81
113
|
// Get a deployed contract instance to pass to the contract
|
|
82
114
|
// for it to use as "expected" values when testing contract instance retrieval.
|
|
83
115
|
const expectContractInstance = avmTestContract;
|
|
84
116
|
const argsField0 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(x => new Fr(x));
|
|
85
|
-
const argsField1 = [
|
|
86
|
-
const argsField2 = [
|
|
87
|
-
const argsField3 = [
|
|
88
|
-
const argsField4 = [
|
|
89
|
-
const argsField5 = [
|
|
90
|
-
const argsField6 = [
|
|
91
|
-
const argsField7 = [
|
|
92
|
-
const argsField8 = [
|
|
93
|
-
const argsField9 = [10, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(x => new Fr(x));
|
|
94
|
-
const argsField10 = [11, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(x => new Fr(x));
|
|
95
|
-
const argsField11 = [12, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(x => new Fr(x));
|
|
96
|
-
const argsField12 = [13, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(x => new Fr(x));
|
|
97
|
-
const argsField13 = [14, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(x => new Fr(x));
|
|
98
|
-
const argsField14 = [15, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(x => new Fr(x));
|
|
99
|
-
const argsField15 = [16, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(x => new Fr(x));
|
|
117
|
+
const argsField1 = [3, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(x => new Fr(x));
|
|
118
|
+
const argsField2 = [5, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(x => new Fr(x));
|
|
119
|
+
const argsField3 = [7, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(x => new Fr(x));
|
|
120
|
+
const argsField4 = [9, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(x => new Fr(x));
|
|
121
|
+
const argsField5 = [11, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(x => new Fr(x));
|
|
122
|
+
const argsField6 = [13, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(x => new Fr(x));
|
|
123
|
+
const argsField7 = [15, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(x => new Fr(x));
|
|
124
|
+
const argsField8 = [17, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(x => new Fr(x));
|
|
100
125
|
const argsU8 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(x => new Fr(x));
|
|
101
126
|
const genArgs = (argsField: Fr[]) => [
|
|
102
127
|
argsField,
|
|
@@ -123,13 +148,6 @@ export async function megaBulkTest(
|
|
|
123
148
|
{ address: avmTestContract.address, fnName: 'bulk_testing', args: genArgs(argsField6) },
|
|
124
149
|
{ address: avmTestContract.address, fnName: 'bulk_testing', args: genArgs(argsField7) },
|
|
125
150
|
{ address: avmTestContract.address, fnName: 'bulk_testing', args: genArgs(argsField8) },
|
|
126
|
-
{ address: avmTestContract.address, fnName: 'bulk_testing', args: genArgs(argsField9) },
|
|
127
|
-
{ address: avmTestContract.address, fnName: 'bulk_testing', args: genArgs(argsField10) },
|
|
128
|
-
{ address: avmTestContract.address, fnName: 'bulk_testing', args: genArgs(argsField11) },
|
|
129
|
-
{ address: avmTestContract.address, fnName: 'bulk_testing', args: genArgs(argsField12) },
|
|
130
|
-
{ address: avmTestContract.address, fnName: 'bulk_testing', args: genArgs(argsField13) },
|
|
131
|
-
{ address: avmTestContract.address, fnName: 'bulk_testing', args: genArgs(argsField14) },
|
|
132
|
-
{ address: avmTestContract.address, fnName: 'bulk_testing', args: genArgs(argsField15) },
|
|
133
151
|
],
|
|
134
152
|
/*teardownCall=*/ undefined,
|
|
135
153
|
/*feePayer*/ undefined,
|