Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
fuzzer_lib.cpp
Go to the documentation of this file.
2
3#include <cstdint>
4#include <string>
5#include <unordered_set>
6#include <vector>
7
28
29using namespace bb::avm2::fuzzer;
30using namespace bb::avm2::simulation;
31using namespace bb::world_state;
32
33extern size_t LLVMFuzzerMutate(uint8_t* Data, size_t Size, size_t MaxSize);
34
36{
37 // Add all contract classes and instances to the contract DB
38 // There may be more classes than instances because of the possibility of mutated bytecodes that are used in
39 // upgrades - these are not directly instantiated
40 for (size_t i = 0; i < tx_data.contract_classes.size(); ++i) {
41 const auto& contract_class = tx_data.contract_classes[i];
42 contract_db.add_contract_class(contract_class.id, contract_class);
43 }
44
45 // Add contract instances to the contract DB
46 for (size_t i = 0; i < tx_data.contract_instances.size(); ++i) {
47 const auto& contract_instance = tx_data.contract_instances[i];
48 auto contract_address = tx_data.contract_addresses[i];
49 contract_db.add_contract_instance(contract_address, contract_instance);
50 }
51
52 // For protocol contracts, also add instances keyed by canonical address (1-11).
53 // This is needed because protocol contracts are looked up by canonical address,
54 // but the derived address in protocol_contracts.derived_addresses maps to the actual instance.
55 for (size_t i = 0; i < tx_data.protocol_contracts.derived_addresses.size(); ++i) {
56 const auto& derived_address = tx_data.protocol_contracts.derived_addresses[i];
57 if (!derived_address.is_zero()) {
58 // Canonical address is index + 1 (addresses 1-11 map to indices 0-10)
59 AztecAddress canonical_address(static_cast<uint256_t>(i + 1));
60 // Find the instance for this derived address and also add it by canonical address
61 auto maybe_instance = contract_db.get_contract_instance(derived_address);
62 if (maybe_instance.has_value()) {
63 contract_db.add_contract_instance(canonical_address, maybe_instance.value());
64 }
65 }
66 }
67
68 // Register contract addresses in the world state
69 for (const auto& addr : tx_data.contract_addresses) {
71 }
72
73 // Apply public data tree writes (e.g., for contract instance upgrades)
74 for (const auto& write : tx_data.public_data_writes) {
76 }
77
79}
80
82{
83 // Compute fee from gas limits and max fees per gas (upper bound on fee)
84 FF fee_required_da = FF(tx.gas_settings.gas_limits.da_gas) * FF(tx.gas_settings.max_fees_per_gas.fee_per_da_gas);
85 FF fee_required_l2 = FF(tx.gas_settings.gas_limits.l2_gas) * FF(tx.gas_settings.max_fees_per_gas.fee_per_l2_gas);
86
87 // Fund fee payer with required fee
88 ws_mgr.write_fee_payer_balance(tx.fee_payer, fee_required_da + fee_required_l2);
89}
90
95{
96 auto cpp_simulator = CppSimulator();
97 SimulatorResult cpp_result;
98
99 try {
101 cpp_result = cpp_simulator.simulate(ws_mgr,
103 tx_data.tx,
104 tx_data.global_variables,
105 tx_data.public_data_writes,
106 tx_data.note_hashes,
107 tx_data.protocol_contracts);
108 fuzz_info("CppSimulator completed without exception");
109 fuzz_info("CppSimulator result: ", cpp_result);
110 ws_mgr.revert();
111 } catch (const std::exception& e) {
112 fuzz_info("CppSimulator threw an exception: ", e.what());
113 cpp_result = SimulatorResult{
114 .reverted = true,
115 .output = {},
116 .end_tree_snapshots = TreeSnapshots(),
117 .revert_reason = e.what(),
118 };
119 ws_mgr.revert();
120 }
121
122 return cpp_result;
123}
124
132{
133 ProtocolContracts& protocol_contracts = tx_data.protocol_contracts;
136 AvmSimulationHelper helper;
137
138 // Reset stats for this iteration
140
141 const PublicSimulatorConfig sim_fast_config{
142 .skip_fee_enforcement = false,
143 .collect_call_metadata = true,
144 .collect_public_inputs = true,
145 };
146
147 const PublicSimulatorConfig sim_hint_config{
148 .skip_fee_enforcement = false,
149 .collect_call_metadata = true,
150 .collect_hints = true,
151 .collect_public_inputs = true,
152 };
153
154 // 1. Run simulate_fast_with_existing_ws
155 // It is the only one that may throw, so we wrap it in try-catch. If it fails, we do not proceed
156 TxSimulationResult fast_result;
157 try {
159 fast_result = AVM_TRACK_TIME_V(
160 "fuzzer/simulate_fast",
162 contract_db, ws_rev, ws, sim_fast_config, tx_data.tx, tx_data.global_variables, protocol_contracts));
163 ws_mgr.revert();
164 } catch (const std::exception& e) {
165 ws_mgr.revert();
166 fuzz_info("simulate_fast_with_existing_ws threw an exception: ", e.what());
167 return {};
168 }
169
170 // 2. Run simulate_for_hint_collection
173 "fuzzer/simulate_hints",
175 contract_db, ws_rev, ws, sim_hint_config, tx_data.tx, tx_data.global_variables, protocol_contracts));
176 ws_mgr.revert();
177
178 // 2a. Construct proving inputs from hint result
179 bb::avm2::AvmProvingInputs proving_inputs{
180 .public_inputs = hint_result.public_inputs.value(),
181 .hints = hint_result.hints.value(),
182 };
183
184 // 3. (optional) Simulate Fast with hinted db
185 TxSimulationResult sim_fast_hinted_result =
186 helper.simulate_fast_with_hinted_dbs(proving_inputs.hints, sim_fast_config);
187
188 // 4. Compare results from all 3 simulations
189 bool result = compare_cpp_simulator_results({ fast_result, hint_result, sim_fast_hinted_result });
190 BB_ASSERT(result,
191 "Simulation results do not match between simulate_fast, simulate_for_hint_collection, "
192 "and simulate_fast_with_hinted_dbs");
193
194 // 5. Run check_circuit (skip in coverage builds since it's slow and not needed for coverage measurement)
195
196#ifndef COVERAGE_AVM
197 avm2::AvmAPI avm_api;
198 bool check_circuit_result = avm_api.check_circuit(proving_inputs);
199 BB_ASSERT(check_circuit_result,
200 "check_circuit returned false in fuzzer with no exception, this indicates a failure");
201
202 // 6. Prove and verify
203 auto proof = avm_api.prove(proving_inputs);
204 bool verified = avm_api.verify(proof, proving_inputs.public_inputs);
205 BB_ASSERT(verified, "Proof verification failed");
206#else
207 // In coverage builds, run simulate_for_witgen and tracegen instead of check_circuit
208 // This gives us coverage the the event and tracegen code paths without the overhead of check_circuit
209 vinfo("Running simulate_for_witgen in coverage build (skipping check_circuit)");
210 avm2::AvmSimulationHelper simulation_helper;
211 auto events = simulation_helper.simulate_for_witgen(proving_inputs.hints);
212 AvmTraceGenHelper tracegen_helper;
214 tracegen_helper.fill_trace_columns(trace, std::move(events), hint_result.public_inputs.value());
215#endif
216
217 return fast_result;
218}
219
220// Initialize FuzzerTxData with sensible defaults
222{
223 FuzzerTxData tx_data = {
225 .global_variables = { .chain_id = CHAIN_ID,
226 .version = VERSION,
227 .block_number = BLOCK_NUMBER,
228 .slot_number = SLOT_NUMBER,
229 .timestamp = TIMESTAMP,
230 .coinbase = COINBASE,
231 .fee_recipient = FEE_RECIPIENT,
232 .gas_fees =
233 GasFees{ .fee_per_da_gas = FEE_PER_DA_GAS, .fee_per_l2_gas = FEE_PER_L2_GAS } },
234 .protocol_contracts = {},
235 // We can write proper mutations for this. However it might not be of much value since we have variability from
236 // nonrevertible note hashes.
237 .note_hashes = { generate_random_field(rng), generate_random_field(rng), generate_random_field(rng) }
238 };
239
240 // TODO(alvaro): This is messy, we mutate when creating default tx data. Maybe we should just remove the mutation
241 // from generate_fuzzer_data altogether.
243 FuzzerData fuzzer_data = generate_fuzzer_data(rng, context);
244 tx_data.input_programs.push_back(fuzzer_data);
245
246 return tx_data;
247}
248
254
256{
257 fuzz_info("Building bytecode from fuzzer data: ", fuzzer_data.instruction_blocks);
258 auto control_flow = ControlFlow(fuzzer_data.instruction_blocks);
259 for (const auto& cfg_instruction : fuzzer_data.cfg_instructions) {
260 control_flow.process_cfg_instruction(cfg_instruction);
261 }
262 auto bytecode = control_flow.build_bytecode(fuzzer_data.return_options);
263
264 auto bytecode_commitment = compute_public_bytecode_commitment(bytecode);
265 auto class_id = compute_contract_class_id(/*artifact_hash=*/0, /*private_fn_root=*/0, bytecode_commitment);
266 ContractClassWithCommitment contract_class{
267 .id = class_id,
268 .artifact_hash = 0,
269 .private_functions_root = 0,
270 .packed_bytecode = bytecode,
271 .public_bytecode_commitment = bytecode_commitment,
272 };
273 ContractInstance contract_instance{
274 .salt = 0,
275 .deployer = MSG_SENDER,
276 .current_contract_class_id = class_id, // Initial and current are the same
277 .original_contract_class_id = class_id,
278 .public_keys = {
279 .nullifier_key_hash = 0,
280 .incoming_viewing_key = grumpkin::g1::element::one(),
281 .outgoing_viewing_key_hash = 0,
282 .tagging_key_hash = 0,
283 },
284 };
285 return { bytecode, contract_class, contract_instance };
286}
287
289 uint8_t* serialized_fuzzer_data,
290 size_t serialized_fuzzer_data_size,
291 size_t max_size,
292 unsigned int seed)
293{
294 auto rng = std::mt19937_64(seed);
295 FuzzerTxData tx_data;
296 try {
297 msgpack::unpack((reinterpret_cast<const char*>(serialized_fuzzer_data)), serialized_fuzzer_data_size)
298 .get()
299 .convert(tx_data);
300 } catch (const std::exception&) {
301 fuzz_info("Failed to deserialize input in CustomMutator, creating default FuzzerTxData");
302 tx_data = create_default_tx_data(rng, context);
303 }
304
306
307 // Build up bytecodes, contract classes and instances from the fuzzer data
308 tx_data.contract_classes.clear();
309 tx_data.contract_instances.clear();
310 tx_data.contract_addresses.clear();
311 tx_data.public_data_writes.clear();
312 std::vector<AztecAddress> contract_addresses;
313
315 for (auto& fuzzer_data : tx_data.input_programs) {
316 const auto [bytecode, contract_class, contract_instance] = build_bytecode_and_artifacts(fuzzer_data);
317
318 auto contract_address = simulation::compute_contract_address(contract_instance);
319
320 // Skip duplicate addresses - multiple input_programs can generate the same address
321 if (seen_addresses.contains(contract_address)) {
322 fuzz_info("Skipping duplicate contract address: ", contract_address);
323 continue;
324 }
325 seen_addresses.insert(contract_address);
326
327 contract_addresses.push_back(contract_address);
328 tx_data.contract_classes.push_back(contract_class);
329 tx_data.contract_instances.push_back(contract_instance);
330 }
331
332 tx_data.contract_addresses = contract_addresses;
333
334 // Ensure all enqueued calls have valid contract addresses (not placeholders)
335 // We may add more advanced mutation to change contract addresses later, right now we just ensure they are valid
336 if (!contract_addresses.empty()) {
337 auto idx_dist = std::uniform_int_distribution<size_t>(0, contract_addresses.size() - 1);
338 for (auto& call : tx_data.tx.setup_enqueued_calls) {
339 call.request.contract_address = contract_addresses[idx_dist(rng)];
340 }
341 for (auto& call : tx_data.tx.app_logic_enqueued_calls) {
342 call.request.contract_address = contract_addresses[idx_dist(rng)];
343 }
344 }
345
346 // Select mutation type (weighted against bytecode mutations) -- todo
348
349 switch (mutation_choice) {
352 break;
354 mutate_tx(tx_data.tx, contract_addresses, rng);
355 break;
358 tx_data.contract_instances,
359 tx_data.contract_addresses,
360 tx_data.public_data_writes,
361 rng);
362 break;
363
366 break;
369 break;
371 // This is just mutating the gas values and timestamp
374 break;
377 break;
378 }
379
380 // Clear any protocol contract derived addresses that reference addresses no longer in the contract set.
381 // This can happen when mutations (e.g., ContractClassMutation, ContractInstanceMutation) change contract addresses.
382 // Must run AFTER all mutations since some mutations modify contract_addresses.
383 std::unordered_set<AztecAddress> valid_addresses(tx_data.contract_addresses.begin(),
384 tx_data.contract_addresses.end());
385 for (auto& derived_address : tx_data.protocol_contracts.derived_addresses) {
386 if (!derived_address.is_zero() && !valid_addresses.contains(derived_address)) {
387 derived_address = AztecAddress(0);
388 }
389 }
390
391 // Ensure at least 1 app_logic enqueued call exists (mutations may have deleted all), the public base kernel circuit
392 // guarantees that there is at least 1 enqueued call in an public tx (so this is a valid assumption)
393 if (tx_data.tx.app_logic_enqueued_calls.empty() && !contract_addresses.empty()) {
394 auto idx = std::uniform_int_distribution<size_t>(0, contract_addresses.size() - 1)(rng);
395 std::vector<FF> calldata = {};
396 auto calldata_hash = compute_calldata_hash(calldata);
397 tx_data.tx.app_logic_enqueued_calls.push_back(
399 .contract_address = contract_addresses[idx],
400 .is_static_call = false,
401 .calldata_hash = calldata_hash },
402 .calldata = calldata });
403 }
404
405 // Ensure global gas_fees <= max_fees_per_gas (required for compute_effective_gas_fees)
406 // This must run after ANY mutation since TxMutation can reduce max_fees_per_gas
407 tx_data.global_variables.gas_fees.fee_per_da_gas = std::min(
409 tx_data.global_variables.gas_fees.fee_per_l2_gas = std::min(
411
412 // Compute effective gas fees matching TS computeEffectiveGasFees
413 // This must be done after any mutation that could affect gas settings or global variables
414 tx_data.tx.effective_gas_fees =
416
417 auto [mutated_serialized_fuzzer_data, mutated_serialized_fuzzer_data_size] = msgpack_encode_buffer(tx_data);
418 if (mutated_serialized_fuzzer_data_size > max_size) {
419 delete[] mutated_serialized_fuzzer_data;
420 return 0; // Can't fit mutated data in buffer, skip this mutation
421 }
422 memcpy(serialized_fuzzer_data, mutated_serialized_fuzzer_data, mutated_serialized_fuzzer_data_size);
423 delete[] mutated_serialized_fuzzer_data;
424
425 return mutated_serialized_fuzzer_data_size;
426}
427
429{
430 std::vector<std::pair<FF, uint64_t>> note_hash_leaf_index_pairs;
431 note_hash_leaf_index_pairs.reserve(tx_data.note_hashes.size() +
433
434 // For note hashes we assume we start from an empty tree. We could read size everytime but it'd slow things down.
435 // If you're having trouble with that check initialization on FuzzerWorldStateManager::initialize()
436 uint64_t leaf_offset = 0;
437
438 for (uint64_t i = 0; i < tx_data.note_hashes.size(); ++i) {
439 note_hash_leaf_index_pairs.push_back({ tx_data.note_hashes[i], leaf_offset + i });
440 }
441
442 uint64_t padding_leaves = MAX_NOTE_HASHES_PER_TX - (tx_data.note_hashes.size() % MAX_NOTE_HASHES_PER_TX);
443 leaf_offset += tx_data.note_hashes.size() + padding_leaves;
444
445 for (uint64_t i = 0; i < tx_data.tx.non_revertible_accumulated_data.note_hashes.size(); ++i) {
446 note_hash_leaf_index_pairs.push_back(
447 { tx_data.tx.non_revertible_accumulated_data.note_hashes[i], leaf_offset + i });
448 }
449
450 context.set_existing_note_hashes(note_hash_leaf_index_pairs);
451
452 context.set_existing_contract_addresses(tx_data.contract_addresses);
453}
#define BB_ASSERT(expression,...)
Definition assert.hpp:70
const uint32_t BLOCK_NUMBER
Definition constants.hpp:16
#define fuzz_info(...)
Definition constants.hpp:51
const AztecAddress FEE_RECIPIENT
Definition constants.hpp:20
const Gas GAS_LIMIT
Definition constants.hpp:40
const FF TRANSACTION_FEE
Definition constants.hpp:38
const EthAddress COINBASE
Definition constants.hpp:19
const FF MSG_SENDER
Definition constants.hpp:33
const FF SLOT_NUMBER
Definition constants.hpp:17
const FF CHAIN_ID
Definition constants.hpp:14
constexpr uint128_t FEE_PER_DA_GAS
Definition constants.hpp:21
const bool IS_STATIC_CALL
Definition constants.hpp:39
constexpr uint128_t FEE_PER_L2_GAS
Definition constants.hpp:22
FF generate_random_field(std::mt19937_64 &rng)
Definition field.cpp:25
std::shared_ptr< Napi::ThreadSafeFunction > bytecode
#define MAX_NOTE_HASHES_PER_TX
StrictMock< MockContractDB > contract_db
uses barretenberg/vm2 to simulate the bytecode
Definition simulator.hpp:44
T select(std::mt19937_64 &rng) const
bool check_circuit(const ProvingInputs &inputs)
Definition avm_api.cpp:36
bool verify(const AvmProof &proof, const PublicInputs &pi)
Definition avm_api.cpp:66
AvmProof prove(const ProvingInputs &inputs)
Definition avm_api.cpp:13
TxSimulationResult simulate_for_hint_collection(simulation::ContractDBInterface &raw_contract_db, const world_state::WorldStateRevision &world_state_revision, world_state::WorldState &ws, const PublicSimulatorConfig &config, const Tx &tx, const GlobalVariables &global_variables, const ProtocolContracts &protocol_contracts, simulation::CancellationTokenPtr cancellation_token=nullptr)
TxSimulationResult simulate_fast_with_hinted_dbs(const ExecutionHints &hints, const PublicSimulatorConfig &config)
TxSimulationResult simulate_fast_with_existing_ws(simulation::ContractDBInterface &raw_contract_db, const world_state::WorldStateRevision &world_state_revision, world_state::WorldState &ws, const PublicSimulatorConfig &config, const Tx &tx, const GlobalVariables &global_variables, const ProtocolContracts &protocol_contracts, simulation::CancellationTokenPtr cancellation_token=nullptr)
simulation::EventsContainer simulate_for_witgen(const ExecutionHints &hints)
void fill_trace_columns(tracegen::TraceContainer &trace, simulation::EventsContainer &&events, const PublicInputs &public_inputs)
static Stats & get()
Definition stats.cpp:10
void reset()
Definition stats.cpp:16
world_state::WorldState & get_world_state()
Definition dbs.hpp:96
void register_contract_address(const AztecAddress &contract_address)
Definition dbs.cpp:225
void append_note_hashes(const std::vector< FF > &note_hashes)
Definition dbs.cpp:254
void write_fee_payer_balance(const AztecAddress &fee_payer, const FF &balance)
Definition dbs.cpp:234
world_state::WorldStateRevision get_current_revision() const
Definition dbs.cpp:206
void public_data_write(const bb::crypto::merkle_tree::PublicDataLeafValue &public_data)
Definition dbs.cpp:248
static constexpr element one
Definition group.hpp:48
Holds the Merkle trees responsible for storing the state of the Aztec protocol.
#define vinfo(...)
Definition log.hpp:94
constexpr Uint64MutationConfig BASIC_UINT64_T_MUTATION_CONFIGURATION
TestTraceContainer trace
FuzzerWorldStateManager * ws_mgr
Definition fuzz.test.cpp:15
bool compare_cpp_simulator_results(const std::vector< TxSimulationResult > &results)
SimulatorResult fuzz_tx(FuzzerWorldStateManager &ws_mgr, FuzzerContractDB &contract_db, FuzzerTxData &tx_data)
Run the C++ simulator on a full transaction containing multiple enqueued calls.
void populate_context_from_tx_data(FuzzerContext &context, const FuzzerTxData &tx_data)
size_t LLVMFuzzerMutate(uint8_t *Data, size_t Size, size_t MaxSize)
TxSimulationResult fuzz_prover(FuzzerWorldStateManager &ws_mgr, FuzzerContractDB &contract_db, FuzzerTxData &tx_data)
Run the prover fuzzer: fast simulation, hint collection, comparison, and check_circuit.
ContractArtifacts build_bytecode_and_artifacts(FuzzerData &fuzzer_data)
void setup_fuzzer_state(FuzzerWorldStateManager &ws_mgr, FuzzerContractDB &contract_db, const FuzzerTxData &tx_data)
size_t mutate_tx_data(FuzzerContext &context, uint8_t *serialized_fuzzer_data, size_t serialized_fuzzer_data_size, size_t max_size, unsigned int seed)
FuzzerTxData create_default_tx_data(std::mt19937_64 &rng, FuzzerContext &context)
void fund_fee_payer(FuzzerWorldStateManager &ws_mgr, const Tx &tx)
FuzzerTxDataMutationType
std::tuple< Bytecode, ContractClassWithCommitment, ContractInstance > ContractArtifacts
constexpr FuzzerTxDataMutationConfig FUZZER_TX_DATA_MUTATION_CONFIGURATION
std::pair< uint8_t *, size_t > msgpack_encode_buffer(auto &&obj, uint8_t *scratch_buf=nullptr, size_t scratch_size=0)
void mutate_tx(Tx &tx, std::vector< AztecAddress > &contract_addresses, std::mt19937_64 &rng)
Definition tx_data.cpp:62
void mutate_contract_instances(std::vector< ContractInstance > &contract_instances, std::vector< AztecAddress > &contract_addresses, std::mt19937_64 &rng)
Definition bytecode.cpp:176
void mutate_protocol_contracts(ProtocolContracts &protocol_contracts, Tx &tx, const std::vector< AztecAddress > &contract_addresses, std::mt19937_64 &rng)
void mutate_contract_classes(std::vector< ContractClassWithCommitment > &contract_classes, std::vector< ContractInstance > &contract_instances, std::vector< AztecAddress > &contract_addresses, std::mt19937_64 &rng)
Definition bytecode.cpp:116
FuzzerData generate_fuzzer_data(std::mt19937_64 &rng, const FuzzerContext &context)
void mutate_fuzzer_data_vec(const FuzzerContext &context, std::vector< FuzzerData > &enqueued_calls, std::mt19937_64 &rng, size_t max_size)
Definition tx_data.cpp:125
void mutate_bytecode(std::vector< ContractClassWithCommitment > &contract_classes, std::vector< ContractInstance > &contract_instances, const std::vector< AztecAddress > &contract_addresses, std::vector< bb::crypto::merkle_tree::PublicDataLeafValue > &public_data_writes, std::mt19937_64 &rng)
Definition bytecode.cpp:43
void mutate_gas_fees(GasFees &fees, std::mt19937_64 &rng)
Definition gas.cpp:66
GasFees compute_effective_gas_fees(const GasFees &gas_fees, const GasSettings &gas_settings)
Definition gas.cpp:121
AVM range check gadget for witness generation.
FF compute_public_bytecode_commitment(std::span< const uint8_t > bytecode)
FF compute_contract_class_id(const FF &artifact_hash, const FF &private_fn_root, const FF &public_bytecode_commitment)
FF compute_calldata_hash(std::span< const FF > calldata)
FF compute_contract_address(const ContractInstance &contract_instance)
AvmFlavorSettings::FF FF
Definition field.hpp:10
void write(B &buf, field2< base_field, Params > const &value)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
Tx create_default_tx(const AztecAddress &contract_address, const AztecAddress &sender_address, const std::vector< FF > &calldata, const FF &transaction_fee, bool is_static_call, const Gas &gas_limit)
Definition simulator.cpp:96
#define AVM_TRACK_TIME_V(key, body)
Definition stats.hpp:20
describes the data which will be used for fuzzing Should contain instructions, calldata,...
ReturnOptions return_options
std::vector< CFGInstruction > cfg_instructions
std::vector< InstructionBlock > instruction_blocks
std::vector< AztecAddress > contract_addresses
ProtocolContracts protocol_contracts
std::vector< FF > note_hashes
std::vector< FuzzerData > input_programs
std::vector< ContractInstance > contract_instances
std::vector< ContractClassWithCommitment > contract_classes
GlobalVariables global_variables
std::vector< bb::crypto::merkle_tree::PublicDataLeafValue > public_data_writes
std::vector< FF > note_hashes
Definition avm_io.hpp:320
PublicInputs public_inputs
Definition avm_io.hpp:420
uint128_t fee_per_l2_gas
uint128_t fee_per_da_gas
std::array< AztecAddress, MAX_PROTOCOL_CONTRACTS > derived_addresses
GasFees effective_gas_fees
Definition avm_io.hpp:334
std::vector< PublicCallRequestWithCalldata > setup_enqueued_calls
Definition avm_io.hpp:339
std::vector< PublicCallRequestWithCalldata > app_logic_enqueued_calls
Definition avm_io.hpp:340
AccumulatedData non_revertible_accumulated_data
Definition avm_io.hpp:337
GasSettings gas_settings
Definition avm_io.hpp:333
std::optional< ExecutionHints > hints
Definition avm_io.hpp:560
std::optional< PublicInputs > public_inputs
Definition avm_io.hpp:559
void mutate_uint64_t(uint64_t &value, std::mt19937_64 &rng, const Uint64MutationConfig &config)
Definition uint64_t.cpp:4