20 for (
size_t i = 0; i < 4; ++i) {
24 return avm2::Fq(limbs[0], limbs[1], limbs[2], limbs[3]);
35 Fq scalar = random_fq_scalar(rng);
45 const std::vector<AztecAddress>& contract_addresses,
46 std::vector<bb::crypto::merkle_tree::PublicDataLeafValue>& public_data_writes,
52 if (contract_classes.empty()) {
66 size_t original_size =
bytecode.size();
67 size_t max_size = original_size * 2;
86 new_class.
id = new_class_id;
92 instance.current_contract_class_id = new_class_id;
95 contract_classes.push_back(new_class);
98 FF delayed_public_mutable_slot =
108 for (
size_t i = 0; i < 4; i++) {
109 FF storage_slot = delayed_public_mutable_slot + i;
118 std::vector<AztecAddress>& contract_addresses,
122 if (contract_classes.empty()) {
151 for (
size_t i = 0; i < contract_instances.size(); i++) {
153 if (contract_instances[i].original_contract_class_id == klass.
id) {
154 fuzz_info(
"Mutated original contract class ", klass.
id,
" at address ", contract_addresses[i]);
158 contract_instances[i].current_contract_class_id = new_class_id;
159 contract_instances[i].original_contract_class_id = new_class_id;
160 auto contract_addr = std::ranges::find_if(
161 contract_addresses, [&](
const AztecAddress& addr) {
return addr == original_address; });
165 if (contract_instances[i].current_contract_class_id == klass.
id) {
166 fuzz_info(
"Mutated current contract class ", klass.
id,
" at address ", contract_addresses[i]);
168 contract_instances[i].current_contract_class_id = new_class_id;
173 klass.
id = new_class_id;
177 std::vector<AztecAddress>& contract_addresses,
181 if (contract_instances.empty()) {
192 constexpr size_t num_mutable_fields = 7;
209 mutate_point(
instance.public_keys.nullifier_key, rng);
213 mutate_point(
instance.public_keys.incoming_viewing_key, rng);
217 mutate_point(
instance.public_keys.outgoing_viewing_key, rng);
221 mutate_point(
instance.public_keys.tagging_key, rng);
230 auto contract_address =
231 std::ranges::find_if(contract_addresses, [&](
const AztecAddress& addr) {
return addr == original_address; });
232 *contract_address = new_address;
void mutate_field(bb::avm2::FF &value, std::mt19937_64 &rng, const FieldMutationConfig &config)
std::shared_ptr< Napi::ThreadSafeFunction > instance
std::shared_ptr< Napi::ThreadSafeFunction > bytecode
#define DOM_SEP__PUBLIC_STORAGE_MAP_SLOT
#define UPDATED_CLASS_IDS_SLOT
#define DOM_SEP__PUBLIC_LEAF_SLOT
#define CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS
size_t LLVMFuzzerMutate(uint8_t *Data, size_t Size, size_t MaxSize)
Native Poseidon2 hash function implementation.
static FF hash(const std::vector< FF > &input)
Hashes a vector of field elements.
static constexpr element one
constexpr FieldMutationConfig BASIC_FIELD_MUTATION_CONFIGURATION
size_t LLVMFuzzerMutate(uint8_t *Data, size_t Size, size_t MaxSize)
void mutate_contract_instances(std::vector< ContractInstance > &contract_instances, 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)
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)
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_contract_address(const ContractInstance &contract_instance)
AvmFlavorSettings::G1::Fq Fq
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
FF private_functions_root
FF public_bytecode_commitment
std::vector< uint8_t > packed_bytecode