diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/tests/execution.test.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/tests/execution.test.cpp index 7be9d1e7ab39..b083fa57680c 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/tests/execution.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/tests/execution.test.cpp @@ -122,9 +122,11 @@ class AvmExecutionTests : public ::testing::Test { auto tagging_key = grumpkin::g1::affine_one; PublicKeysHint public_keys{ nullifier_key, incoming_viewing_key, outgoing_viewing_key, tagging_key }; ContractInstanceHint contract_instance = { - FF::one() /* temp address */, true /* exists */, FF(2) /* salt */, FF(3) /* deployer_addr */, class_id, + FF::one() /* temp address */, true /* exists */, FF(2) /* salt */, FF(3) /* deployer_addr */, class_id, class_id, FF(8) /* initialisation_hash */, public_keys, /*membership_hint=*/ { .low_leaf_preimage = { .nullifier = 0, .next_nullifier = 0, .next_index = 0, }, .low_leaf_index = 0, .low_leaf_sibling_path = {} }, + /* update_hint*/ { .leaf_preimage = { .slot = 0, .value = 0, .next_index = 0, .next_slot = 0, }, .leaf_index = 0, .sibling_path = {} }, + /* update_preimage */ {}, }; FF address = AvmBytecodeTraceBuilder::compute_address_from_instance(contract_instance); contract_instance.address = address; @@ -2293,10 +2295,13 @@ TEST_F(AvmExecutionTests, opGetContractInstanceOpcode) .exists = true, .salt = 2, .deployer_addr = 42, - .contract_class_id = 66, + .current_contract_class_id = 66, + .original_contract_class_id = 66, .initialisation_hash = 99, .public_keys = public_keys_hints, - .membership_hint = { .low_leaf_preimage = { .nullifier = 0, .next_nullifier = 0, .next_index = 0, }, .low_leaf_index = 0, .low_leaf_sibling_path = {} }, + .initialization_membership_hint = { .low_leaf_preimage = { .nullifier = 0, .next_nullifier = 0, .next_index = 0, }, .low_leaf_index = 0, .low_leaf_sibling_path = {} }, + .update_membership_hint = { .leaf_preimage = { .slot = 0, .value = 0, .next_index = 0, .next_slot = 0, }, .leaf_index = 0, .sibling_path = {} }, + .update_preimage = {} }; auto execution_hints = ExecutionHints().with_contract_instance_hints({ { address, instance } }); @@ -2341,7 +2346,7 @@ TEST_F(AvmExecutionTests, opGetContractInstanceOpcode) std::vector const calldata{}; // alternating member value, exists bool std::vector const expected_returndata = { - instance.deployer_addr, 1, instance.contract_class_id, 1, instance.initialisation_hash, 1, + instance.deployer_addr, 1, instance.current_contract_class_id, 1, instance.initialisation_hash, 1, }; std::vector returndata{}; diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/trace/bytecode_trace.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/trace/bytecode_trace.cpp index 36137f3c84a3..47b4583f47be 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/trace/bytecode_trace.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/trace/bytecode_trace.cpp @@ -32,7 +32,7 @@ FF AvmBytecodeTraceBuilder::compute_address_from_instance(const ContractInstance contract_instance.initialisation_hash, contract_instance.deployer_addr }); FF partial_address = poseidon2::hash( - { GENERATOR_INDEX__PARTIAL_ADDRESS, contract_instance.contract_class_id, salted_initialization_hash }); + { GENERATOR_INDEX__PARTIAL_ADDRESS, contract_instance.original_contract_class_id, salted_initialization_hash }); std::vector public_keys_hash_fields = contract_instance.public_keys.to_fields(); std::vector public_key_hash_vec{ GENERATOR_INDEX__PUBLIC_KEYS_HASH }; @@ -144,7 +144,7 @@ void AvmBytecodeTraceBuilder::build_bytecode_hash_columns() contract_bytecode.contract_class_id_preimage.private_fn_root, running_hash); // Assert that the computed class id is the same as what we received as the hint - ASSERT(last_entry.class_id == contract_bytecode.contract_instance.contract_class_id); + ASSERT(last_entry.class_id == contract_bytecode.contract_instance.current_contract_class_id); last_entry.contract_address = compute_address_from_instance(contract_bytecode.contract_instance); // Assert that the computed contract address is the same as what we received as the hint diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/trace/execution_hints.hpp b/barretenberg/cpp/src/barretenberg/vm/avm/trace/execution_hints.hpp index 568af787cf02..16a270fee75a 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/trace/execution_hints.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/trace/execution_hints.hpp @@ -163,10 +163,13 @@ struct ContractInstanceHint { bool exists; // Useful for membership checks FF salt{}; FF deployer_addr{}; - FF contract_class_id{}; + FF current_contract_class_id{}; + FF original_contract_class_id{}; FF initialisation_hash{}; PublicKeysHint public_keys; - NullifierReadTreeHint membership_hint; + NullifierReadTreeHint initialization_membership_hint; + PublicDataReadTreeHint update_membership_hint; + std::vector update_preimage; }; inline void read(uint8_t const*& it, PublicKeysHint& hint) @@ -187,10 +190,13 @@ inline void read(uint8_t const*& it, ContractInstanceHint& hint) read(it, hint.exists); read(it, hint.salt); read(it, hint.deployer_addr); - read(it, hint.contract_class_id); + read(it, hint.current_contract_class_id); + read(it, hint.original_contract_class_id); read(it, hint.initialisation_hash); read(it, hint.public_keys); - read(it, hint.membership_hint); + read(it, hint.initialization_membership_hint); + read(it, hint.update_membership_hint); + read(it, hint.update_preimage); } struct AvmContractBytecode { diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/trace/trace.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/trace/trace.cpp index 87bf9ec41d0b..17e464800b7d 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/trace/trace.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/trace/trace.cpp @@ -171,22 +171,68 @@ std::vector AvmTraceBuilder::get_bytecode_from_hints(const FF contract_ // TODO: still need to make sure that the contract address does correspond to this class id const AvmContractBytecode bytecode_hint = *std::ranges::find_if(execution_hints.all_contract_bytecode, [contract_class_id](const auto& contract) { - return contract.contract_instance.contract_class_id == contract_class_id; + return contract.contract_instance.current_contract_class_id == contract_class_id; }); return bytecode_hint.bytecode; } +void AvmTraceBuilder::validate_contract_instance_current_class_id(uint32_t clk, const ContractInstanceHint& instance) +{ + if (is_canonical(instance.address)) { + return; + } + // First validate the update_preimage against the public data tree + PublicDataReadTreeHint read_hint = instance.update_membership_hint; + + const FF shared_mutable_slot = Poseidon2::hash({ UPDATED_CLASS_IDS_SLOT, instance.address }); + const FF hash_slot = shared_mutable_slot + UPDATES_SHARED_MUTABLE_VALUES_LEN; + const FF hash_leaf_slot = + AvmMerkleTreeTraceBuilder::unconstrained_compute_public_tree_leaf_slot(DEPLOYER_CONTRACT_ADDRESS, hash_slot); + bool exists = read_hint.leaf_preimage.slot == hash_leaf_slot; + + bool is_member = merkle_tree_trace_builder.perform_storage_read( + clk, read_hint.leaf_preimage, read_hint.leaf_index, read_hint.sibling_path); + // membership check must always pass + ASSERT(is_member); + + if (exists) { + const FF reproduced_hash = Poseidon2::hash(instance.update_preimage); + ASSERT(reproduced_hash == read_hint.leaf_preimage.value); + } else { + AvmMerkleTreeTraceBuilder::assert_public_data_non_membership_check(read_hint.leaf_preimage, hash_leaf_slot); + // ensure instance.update_preimage is all zeroes + ASSERT(std::all_of( + instance.update_preimage.begin(), instance.update_preimage.end(), [](const auto& x) { return x == 0; })); + } + + // update_preimage is validated, now validate the contract class id + FF expected_current_class_id; + const FF prev_value = instance.update_preimage[SCHEDULED_DELAY_CHANGE_PCKD_LEN + 0]; + const FF next_value = instance.update_preimage[SCHEDULED_DELAY_CHANGE_PCKD_LEN + 1]; + const uint32_t block_of_change = + static_cast(instance.update_preimage[SCHEDULED_DELAY_CHANGE_PCKD_LEN + 2]); + + // Fourth item is related to update delays which we don't care. + if (static_cast(public_inputs.global_variables.block_number) < block_of_change) { + // original class id was validated against the address + expected_current_class_id = prev_value == 0 ? instance.original_contract_class_id : prev_value; + } else { + expected_current_class_id = next_value == 0 ? instance.original_contract_class_id : next_value; + } + ASSERT(expected_current_class_id == instance.current_contract_class_id); +} + std::vector AvmTraceBuilder::get_bytecode(const FF contract_address, bool check_membership) { auto clk = static_cast(main_trace.size()) + 1; ASSERT(execution_hints.contract_instance_hints.contains(contract_address)); const ContractInstanceHint instance_hint = execution_hints.contract_instance_hints.at(contract_address); - const FF contract_class_id = instance_hint.contract_class_id; + const FF contract_class_id = instance_hint.current_contract_class_id; bool exists = true; if (check_membership && !is_canonical(contract_address)) { - if (bytecode_membership_cache.find(contract_address) != bytecode_membership_cache.end()) { + if (contract_instance_membership_cache.find(contract_address) != contract_instance_membership_cache.end()) { // If we have already seen the contract address, we can skip the membership check and used the cached // membership proof vinfo("Found bytecode for contract address in cache: ", contract_address); @@ -195,7 +241,7 @@ std::vector AvmTraceBuilder::get_bytecode(const FF contract_address, bo const auto contract_address_nullifier = AvmMerkleTreeTraceBuilder::unconstrained_silo_nullifier( DEPLOYER_CONTRACT_ADDRESS, /*nullifier=*/contract_address); // nullifier read hint for the contract address - NullifierReadTreeHint nullifier_read_hint = instance_hint.membership_hint; + NullifierReadTreeHint nullifier_read_hint = instance_hint.initialization_membership_hint; // If the hinted preimage matches the contract address nullifier, the membership check will prove its existence, // otherwise the membership check will prove that a low-leaf exists that skips the contract address nullifier. @@ -212,7 +258,7 @@ std::vector AvmTraceBuilder::get_bytecode(const FF contract_address, bo // This was a membership proof! // Assert that the hint's exists flag matches. The flag isn't really necessary... ASSERT(instance_hint.exists); - bytecode_membership_cache.insert(contract_address); + contract_instance_membership_cache.insert(contract_address); // The cache contains all the unique contract class ids we have seen so far // If this bytecode retrievals have reached the number of unique contract class IDs, can't make @@ -223,7 +269,8 @@ std::vector AvmTraceBuilder::get_bytecode(const FF contract_address, bo MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS); throw std::runtime_error("Limit reached for contract calls to unique class id."); } - contract_class_id_cache.insert(instance_hint.contract_class_id); + contract_class_id_cache.insert(instance_hint.current_contract_class_id); + validate_contract_instance_current_class_id(clk, instance_hint); return get_bytecode_from_hints(contract_class_id); } else { // This was a non-membership proof! @@ -3502,12 +3549,13 @@ AvmError AvmTraceBuilder::op_get_contract_instance( // Read the contract instance hint ContractInstanceHint instance = execution_hints.contract_instance_hints.at(contract_address); - if (is_canonical(contract_address)) { - // skip membership check for canonical contracts + if (is_canonical(contract_address) || + (contract_instance_membership_cache.find(contract_address) != contract_instance_membership_cache.end())) { + // skip membership check for canonical contracts and contracts already verified exists = true; } else { // nullifier read hint for the contract address - NullifierReadTreeHint nullifier_read_hint = instance.membership_hint; + NullifierReadTreeHint nullifier_read_hint = instance.initialization_membership_hint; // If the hinted preimage matches the contract address nullifier, the membership check will prove its // existence, otherwise the membership check will prove that a low-leaf exists that skips the contract @@ -3534,6 +3582,9 @@ AvmError AvmTraceBuilder::op_get_contract_instance( (nullifier_read_hint.low_leaf_preimage.next_nullifier == FF::zero() || contract_address_nullifier > nullifier_read_hint.low_leaf_preimage.next_nullifier)); } + validate_contract_instance_current_class_id(clk, instance); + + contract_instance_membership_cache.insert(contract_address); } if (exists) { @@ -3542,7 +3593,7 @@ AvmError AvmTraceBuilder::op_get_contract_instance( member_value = instance.deployer_addr; break; case ContractInstanceMember::CLASS_ID: - member_value = instance.contract_class_id; + member_value = instance.current_contract_class_id; break; case ContractInstanceMember::INIT_HASH: member_value = instance.initialisation_hash; diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/trace/trace.hpp b/barretenberg/cpp/src/barretenberg/vm/avm/trace/trace.hpp index ad5705dc1200..0a7fddc827c4 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/trace/trace.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/trace/trace.hpp @@ -233,9 +233,11 @@ class AvmTraceBuilder { void checkpoint_non_revertible_state(); void rollback_to_non_revertible_checkpoint(); std::vector get_bytecode(const FF contract_address, bool check_membership = false); + void validate_contract_instance_current_class_id(uint32_t clk, const ContractInstanceHint& instance); + // Used to track the unique class ids, could also be used to cache membership checks of class ids std::unordered_set contract_class_id_cache; - std::unordered_set bytecode_membership_cache; + std::unordered_set contract_instance_membership_cache; void insert_private_state(const std::vector& siloed_nullifiers, const std::vector& unique_note_hashes); void insert_private_revertible_state(const std::vector& siloed_nullifiers, const std::vector& siloed_note_hashes); diff --git a/barretenberg/cpp/src/barretenberg/vm/aztec_constants.hpp b/barretenberg/cpp/src/barretenberg/vm/aztec_constants.hpp index 836a5fd2a2c8..87225482c294 100644 --- a/barretenberg/cpp/src/barretenberg/vm/aztec_constants.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/aztec_constants.hpp @@ -27,6 +27,7 @@ #define FEE_JUICE_ADDRESS 5 #define ROUTER_ADDRESS 6 #define FEE_JUICE_BALANCES_SLOT 1 +#define UPDATED_CLASS_IDS_SLOT 1 #define AZTEC_ADDRESS_LENGTH 1 #define GAS_FEES_LENGTH 2 #define GAS_LENGTH 2 @@ -146,6 +147,8 @@ #define AVM_EMITNULLIFIER_BASE_DA_GAS 512 #define AVM_SENDL2TOL1MSG_BASE_DA_GAS 512 #define AVM_EMITUNENCRYPTEDLOG_DYN_DA_GAS 512 +#define SCHEDULED_DELAY_CHANGE_PCKD_LEN 1 +#define UPDATES_SHARED_MUTABLE_VALUES_LEN 4 #define GENERATOR_INDEX__NOTE_HASH_NONCE 2 #define GENERATOR_INDEX__UNIQUE_NOTE_HASH 3 #define GENERATOR_INDEX__SILOED_NOTE_HASH 4 diff --git a/barretenberg/cpp/src/barretenberg/vm2/common/avm_inputs.hpp b/barretenberg/cpp/src/barretenberg/vm2/common/avm_inputs.hpp index b806ccb82b15..900bd95427cd 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/common/avm_inputs.hpp +++ b/barretenberg/cpp/src/barretenberg/vm2/common/avm_inputs.hpp @@ -29,14 +29,22 @@ struct ContractInstanceHint { bool exists; FF salt; AztecAddress deployer; - ContractClassId contractClassId; + ContractClassId currentContractClassId; + ContractClassId originalContractClassId; FF initializationHash; PublicKeysHint publicKeys; // TODO: missing membership hints. bool operator==(const ContractInstanceHint& other) const = default; - MSGPACK_FIELDS(address, exists, salt, deployer, contractClassId, initializationHash, publicKeys); + MSGPACK_FIELDS(address, + exists, + salt, + deployer, + currentContractClassId, + originalContractClassId, + initializationHash, + publicKeys); }; struct ContractClassHint { diff --git a/barretenberg/cpp/src/barretenberg/vm2/common/avm_inputs.test.cpp b/barretenberg/cpp/src/barretenberg/vm2/common/avm_inputs.test.cpp index c76cdece1f8a..f4dc2f00f59f 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/common/avm_inputs.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm2/common/avm_inputs.test.cpp @@ -52,7 +52,8 @@ TEST(AvmInputsTest, Deserialization) .exists = true, .salt = FF(0xdeadbeef), .deployer = AztecAddress(0x000010), - .contractClassId = ContractClassId(0x41181337), + .currentContractClassId = ContractClassId(0x41181337), + .originalContractClassId = ContractClassId(0x41181337), .initializationHash = FF(0x111111), .publicKeys = { .masterNullifierPublicKey = AffinePoint( @@ -74,7 +75,8 @@ TEST(AvmInputsTest, Deserialization) .exists = false, .salt = FF(0xdead0000), .deployer = AztecAddress(0x000020), - .contractClassId = ContractClassId(0x51181337), + .currentContractClassId = ContractClassId(0x51181337), + .originalContractClassId = ContractClassId(0x51181337), .initializationHash = FF(0x222222), .publicKeys = { .masterNullifierPublicKey = AffinePoint( diff --git a/barretenberg/cpp/src/barretenberg/vm2/common/avm_inputs.testdata.bin b/barretenberg/cpp/src/barretenberg/vm2/common/avm_inputs.testdata.bin index 703290cccd6b..a94f2fb00560 100644 Binary files a/barretenberg/cpp/src/barretenberg/vm2/common/avm_inputs.testdata.bin and b/barretenberg/cpp/src/barretenberg/vm2/common/avm_inputs.testdata.bin differ diff --git a/barretenberg/cpp/src/barretenberg/vm2/simulation/lib/raw_data_db.cpp b/barretenberg/cpp/src/barretenberg/vm2/simulation/lib/raw_data_db.cpp index 7a739d8e1853..b86fd7fd082a 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/simulation/lib/raw_data_db.cpp +++ b/barretenberg/cpp/src/barretenberg/vm2/simulation/lib/raw_data_db.cpp @@ -22,7 +22,7 @@ ContractInstance HintedRawDataDB::get_contract_instance(const AztecAddress& addr .address = contract_instance_hint.address, .salt = contract_instance_hint.salt, .deployer_addr = contract_instance_hint.deployer, - .contract_class_id = contract_instance_hint.contractClassId, + .contract_class_id = contract_instance_hint.originalContractClassId, .initialisation_hash = contract_instance_hint.initializationHash, .public_keys = PublicKeys{ diff --git a/l1-contracts/src/core/libraries/ConstantsGen.sol b/l1-contracts/src/core/libraries/ConstantsGen.sol index 0fd8bf3400cf..df21b2baece9 100644 --- a/l1-contracts/src/core/libraries/ConstantsGen.sol +++ b/l1-contracts/src/core/libraries/ConstantsGen.sol @@ -114,6 +114,8 @@ library Constants { 24399338136397901754495080759185489776044879232766421623673792970137; uint256 internal constant DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE = 14061769416655647708490531650437236735160113654556896985372298487345; + uint256 internal constant DEPLOYER_CONTRACT_INSTANCE_UPDATED_MAGIC_VALUE = + 1534834688047131268740281708431107902615560100979874281215533519862; uint256 internal constant MAX_PROTOCOL_CONTRACTS = 7; uint256 internal constant CANONICAL_AUTH_REGISTRY_ADDRESS = 1; uint256 internal constant DEPLOYER_CONTRACT_ADDRESS = 2; @@ -123,6 +125,7 @@ library Constants { uint256 internal constant ROUTER_ADDRESS = 6; uint256 internal constant REGISTERER_CONTRACT_BYTECODE_CAPSULE_SLOT = 79025834455612; uint256 internal constant FEE_JUICE_BALANCES_SLOT = 1; + uint256 internal constant UPDATED_CLASS_IDS_SLOT = 1; uint256 internal constant DEFAULT_NPK_M_X = 582240093077765400562621227108555700500271598878376310175765873770292988861; uint256 internal constant DEFAULT_NPK_M_Y = @@ -306,4 +309,10 @@ library Constants { uint256 internal constant PROOF_TYPE_ROLLUP_HONK = 5; uint256 internal constant PROOF_TYPE_ROOT_ROLLUP_HONK = 6; uint256 internal constant TWO_POW_64 = 18446744073709551616; + uint256 internal constant DEFAULT_UPDATE_DELAY = 3600; + uint256 internal constant MINIMUM_UPDATE_DELAY = 25; + uint256 internal constant UPDATES_VALUE_SIZE = 1; + uint256 internal constant UPDATES_SCHEDULED_VALUE_CHANGE_LEN = 3; + uint256 internal constant SCHEDULED_DELAY_CHANGE_PCKD_LEN = 1; + uint256 internal constant UPDATES_SHARED_MUTABLE_VALUES_LEN = 4; } diff --git a/noir-projects/aztec-nr/aztec/src/state_vars/shared_mutable.nr b/noir-projects/aztec-nr/aztec/src/state_vars/shared_mutable.nr index e480aa390e8c..cf658741579e 100644 --- a/noir-projects/aztec-nr/aztec/src/state_vars/shared_mutable.nr +++ b/noir-projects/aztec-nr/aztec/src/state_vars/shared_mutable.nr @@ -1,21 +1,14 @@ -use dep::protocol_types::traits::Packable; +use dep::protocol_types::{ + shared_mutable::{ScheduledDelayChange, ScheduledValueChange, SharedMutableValues}, + traits::Packable, +}; use crate::{ context::{PrivateContext, PublicContext, UnconstrainedContext}, - state_vars::{ - shared_mutable::{ - scheduled_delay_change::ScheduledDelayChange, - scheduled_value_change::ScheduledValueChange, - shared_mutable_values::SharedMutableValues, - }, - storage::Storage, - }, + state_vars::storage::Storage, utils::with_hash::WithHash, }; -pub(crate) mod shared_mutable_values; -pub(crate) mod scheduled_delay_change; -pub(crate) mod scheduled_value_change; mod test; pub struct SharedMutable { @@ -69,6 +62,10 @@ where { pub fn schedule_value_change(self, new_value: T) { + let _value_change = self.schedule_and_return_value_change(new_value); + } + + pub fn schedule_and_return_value_change(self, new_value: T) -> ScheduledValueChange { let mut value_change = self.read_value_change(); let delay_change = self.read_delay_change(); @@ -81,6 +78,8 @@ where value_change.schedule_change(new_value, block_number, current_delay, block_of_change); self.write(value_change, delay_change); + + value_change } pub fn schedule_delay_change(self, new_delay: u32) { diff --git a/noir-projects/noir-contracts/Nargo.toml b/noir-projects/noir-contracts/Nargo.toml index 263c45bba62c..bcb624428d24 100644 --- a/noir-projects/noir-contracts/Nargo.toml +++ b/noir-projects/noir-contracts/Nargo.toml @@ -43,6 +43,8 @@ members = [ "contracts/token_blacklist_contract", "contracts/token_bridge_contract", "contracts/uniswap_contract", + "contracts/updatable_contract", + "contracts/updated_contract", "contracts/multi_call_entrypoint_contract", "contracts/static_child_contract", "contracts/static_parent_contract", diff --git a/noir-projects/noir-contracts/contracts/contract_instance_deployer_contract/src/main.nr b/noir-projects/noir-contracts/contracts/contract_instance_deployer_contract/src/main.nr index 14de246da737..2fdd170295b4 100644 --- a/noir-projects/noir-contracts/contracts/contract_instance_deployer_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/contract_instance_deployer_contract/src/main.nr @@ -2,13 +2,18 @@ use dep::aztec::macros::aztec; #[aztec] pub contract ContractInstanceDeployer { - use dep::aztec::macros::{events::event, functions::private}; + use dep::aztec::macros::{events::event, functions::{private, public, view}, storage::storage}; + use dep::aztec::prelude::{Map, SharedMutable}; use dep::aztec::protocol_types::{ address::{AztecAddress, PartialAddress}, - constants::{DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE, REGISTERER_CONTRACT_ADDRESS}, + constants::{ + DEFAULT_UPDATE_DELAY, DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE, + DEPLOYER_CONTRACT_INSTANCE_UPDATED_MAGIC_VALUE, MINIMUM_UPDATE_DELAY, + REGISTERER_CONTRACT_ADDRESS, + }, contract_class_id::ContractClassId, public_keys::PublicKeys, - traits::Serialize, + traits::{Serialize, ToField}, utils::arrays::array_concat, }; use dep::contract_class_registerer::ContractClassRegisterer; @@ -78,6 +83,21 @@ pub contract ContractInstanceDeployer { } } + #[derive(Serialize)] + #[event] + struct ContractInstanceUpdated { + DEPLOYER_CONTRACT_INSTANCE_UPDATED_MAGIC_VALUE: Field, + address: AztecAddress, + prev_contract_class_id: ContractClassId, + new_contract_class_id: ContractClassId, + block_of_change: u32, + } + + #[storage] + struct Storage { + updated_class_ids: Map, Context>, + } + #[private] fn deploy( salt: Field, @@ -123,4 +143,55 @@ pub contract ContractInstanceDeployer { let padded_log = array_concat(payload, [0; 3]); context.emit_private_log(padded_log); } + + #[public] + fn update(new_contract_class_id: ContractClassId) { + let address = context.msg_sender(); + + assert( + context.nullifier_exists(address.to_field(), context.this_address()), + "msg.sender is not deployed", + ); + + assert( + context.nullifier_exists(new_contract_class_id.to_field(), REGISTERER_CONTRACT_ADDRESS), + "New contract class is not registered", + ); + + let scheduled_value_update = storage + .updated_class_ids + .at(address) + .schedule_and_return_value_change(new_contract_class_id); + let (prev_contract_class_id, block_of_change) = scheduled_value_update.get_previous(); + + let event = ContractInstanceUpdated { + DEPLOYER_CONTRACT_INSTANCE_UPDATED_MAGIC_VALUE, + address, + prev_contract_class_id, + new_contract_class_id, + block_of_change, + }; + + context.emit_public_log(event); + } + + #[public] + fn set_update_delay(new_update_delay: u32) { + let address = context.msg_sender(); + + assert( + context.nullifier_exists(address.to_field(), context.this_address()), + "msg.sender is not deployed", + ); + + assert(new_update_delay >= MINIMUM_UPDATE_DELAY, "New update delay is too low"); + + storage.updated_class_ids.at(address).schedule_delay_change(new_update_delay); + } + + #[public] + #[view] + fn get_update_delay() -> u32 { + storage.updated_class_ids.at(context.msg_sender()).get_current_delay() + } } diff --git a/noir-projects/noir-contracts/contracts/updatable_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/updatable_contract/Nargo.toml new file mode 100644 index 000000000000..77fcc50875c3 --- /dev/null +++ b/noir-projects/noir-contracts/contracts/updatable_contract/Nargo.toml @@ -0,0 +1,10 @@ +[package] +name = "updatable_contract" +authors = [""] +compiler_version = ">=0.25.0" +type = "contract" + +[dependencies] +aztec = { path = "../../../aztec-nr/aztec" } +value_note = { path = "../../../aztec-nr/value-note" } +contract_instance_deployer = { path = "../contract_instance_deployer_contract" } diff --git a/noir-projects/noir-contracts/contracts/updatable_contract/src/main.nr b/noir-projects/noir-contracts/contracts/updatable_contract/src/main.nr new file mode 100644 index 000000000000..70021278262f --- /dev/null +++ b/noir-projects/noir-contracts/contracts/updatable_contract/src/main.nr @@ -0,0 +1,68 @@ +use dep::aztec::macros::aztec; + +#[aztec] +contract Updatable { + use aztec::encrypted_logs::log_assembly_strategies::default_aes128::note::encode_and_encrypt_note; + use aztec::macros::{functions::{initializer, private, public}, storage::storage}; + use aztec::prelude::{PrivateMutable, PublicMutable}; + + use aztec::protocol_types::{ + constants::DEPLOYER_CONTRACT_ADDRESS, + contract_class_id::ContractClassId, + traits::{Hash, Serialize}, + }; + use contract_instance_deployer::ContractInstanceDeployer; + use value_note::value_note::ValueNote; + + #[storage] + struct Storage { + private_value: PrivateMutable, + public_value: PublicMutable, + } + + #[initializer] + #[private] + fn initialize(initial_value: Field) { + let owner = context.msg_sender(); + let mut new_value = ValueNote::new(initial_value, owner); + storage.private_value.initialize(&mut new_value).emit(encode_and_encrypt_note( + &mut context, + owner, + owner, + )); + Updatable::at(context.this_address()).set_public_value(initial_value).enqueue(&mut context); + } + + #[public] + fn set_public_value(new_value: Field) { + storage.public_value.write(new_value); + } + + #[private] + fn update_to(new_class_id: ContractClassId) { + ContractInstanceDeployer::at(DEPLOYER_CONTRACT_ADDRESS).update(new_class_id).enqueue( + &mut context, + ); + } + + #[private] + fn set_update_delay(new_delay: u32) { + ContractInstanceDeployer::at(DEPLOYER_CONTRACT_ADDRESS).set_update_delay(new_delay).enqueue( + &mut context, + ); + } + + #[public] + fn get_update_delay() -> u32 { + ContractInstanceDeployer::at(DEPLOYER_CONTRACT_ADDRESS).get_update_delay().view(&mut context) + } + + unconstrained fn get_private_value() -> pub Field { + storage.private_value.view_note().value + } + + unconstrained fn get_public_value() -> pub Field { + storage.public_value.read() + } + +} diff --git a/noir-projects/noir-contracts/contracts/updated_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/updated_contract/Nargo.toml new file mode 100644 index 000000000000..4ff9cb7eb8f6 --- /dev/null +++ b/noir-projects/noir-contracts/contracts/updated_contract/Nargo.toml @@ -0,0 +1,10 @@ +[package] +name = "updated_contract" +authors = [""] +compiler_version = ">=0.25.0" +type = "contract" + +[dependencies] +aztec = { path = "../../../aztec-nr/aztec" } +value_note = { path = "../../../aztec-nr/value-note" } +contract_instance_deployer = { path = "../contract_instance_deployer_contract" } diff --git a/noir-projects/noir-contracts/contracts/updated_contract/src/main.nr b/noir-projects/noir-contracts/contracts/updated_contract/src/main.nr new file mode 100644 index 000000000000..844c2f9a0c59 --- /dev/null +++ b/noir-projects/noir-contracts/contracts/updated_contract/src/main.nr @@ -0,0 +1,48 @@ +use dep::aztec::macros::aztec; + +#[aztec] +contract Updated { + use aztec::encrypted_logs::log_assembly_strategies::default_aes128::note::encode_and_encrypt_note; + use aztec::macros::{functions::{private, public}, storage::storage}; + use aztec::prelude::{PrivateMutable, PublicMutable}; + + use aztec::protocol_types::{constants::DEPLOYER_CONTRACT_ADDRESS, traits::Hash}; + use contract_instance_deployer::ContractInstanceDeployer; + use value_note::value_note::ValueNote; + + #[storage] + struct Storage { + private_value: PrivateMutable, + public_value: PublicMutable, + } + + #[public] + fn set_public_value() { + storage.public_value.write(27); + } + + #[private] + fn set_private_value() { + let owner = context.msg_sender(); + let mut new_note = ValueNote::new(27, owner); + storage.private_value.replace(&mut new_note).emit(encode_and_encrypt_note( + &mut context, + owner, + owner, + )); + } + + #[public] + fn get_update_delay() -> u32 { + ContractInstanceDeployer::at(DEPLOYER_CONTRACT_ADDRESS).get_update_delay().view(&mut context) + } + + unconstrained fn get_private_value() -> pub Field { + storage.private_value.view_note().value + } + + unconstrained fn get_public_value() -> pub Field { + storage.public_value.read() + } + +} diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-init/Prover.toml b/noir-projects/noir-protocol-circuits/crates/private-kernel-init/Prover.toml index b77ec74a8438..4d14bd6a6fe8 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-init/Prover.toml +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-init/Prover.toml @@ -1,13 +1,13 @@ -vk_tree_root = "0x090a6edbf45a7a953c0f356db0ffd532e057797163ef6dc5d4cfa852cb0aaa2c" -protocol_contract_tree_root = "0x2d5d4db09f9cead586c3d27ff21023e98615d9afc7740037a3d411f7aa3c1e96" +vk_tree_root = "0x21d971c64d3619099dafa73842f3706996ff14fa9d32f509bb26ae93dfd3f686" +protocol_contract_tree_root = "0x22c0e4f2a805886466bd0a7225ac03637630dcb01a306fa4b122a42c0c6a3f10" is_private_only = false first_nullifier_hint = "0x0000000000000000000000000000000000000000000000000000000000000000" [tx_request] -args_hash = "0x14706f5a771b436a4124cb9651fa7a023273fddb092778f2b6c508e60e539cb0" +args_hash = "0x1c78057442463fa4abb6c8174ca6cbd65f63118ff10f43ba76e657c79271b1c4" [tx_request.origin] - inner = "0x261174ae4897ef34adb44dc66d962b6780504d1b1067c0b61e54e80de220d2d0" + inner = "0x30115c80b13c0a42019f2e58b75086cf4053674b689df29e2c9581447f32cf2f" [tx_request.tx_context] chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" @@ -23,7 +23,7 @@ l2_gas = "0x00000000000000000000000000000000000000000000000000000000005b8d80" [tx_request.tx_context.gas_settings.max_fees_per_gas] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" -fee_per_l2_gas = "0x00000000000000000000000000000000000000000000000000000012e9bb9bf7" +fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000000186c3f" [tx_request.tx_context.gas_settings.max_priority_fees_per_gas] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -35,13 +35,8 @@ fee_per_l2_gas = "0x000000000000000000000000000000000000000000000000000000000000 [tx_request.function_data.selector] inner = "0x0000000000000000000000000000000000000000000000000000000027e740b2" -[private_call] -contract_class_artifact_hash = "0x093b3ef6aa64f87b0ebe1f85916850de67ca43a883c2f1916706dc7e02236f38" -contract_class_public_bytecode_commitment = "0x0000000000000000000000000000000000000000000000000000000000000000" -acir_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [private_call.vk] - key = [ +[private_call.vk] +key = [ "0x0000000000000000000000000000000000000000000000000000000000100000", "0x0000000000000000000000000000000000000000000000000000000000000010", "0x00000000000000000000000000000000000000000000000000000000000328b1", @@ -65,30 +60,30 @@ acir_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000000000775836e31e53bda7e93c53422d1a8e3cd5", - "0x00000000000000000000000000000000000377028cc87fade6f8bcb734568961", - "0x000000000000000000000000000000ca7fd0674a7ba20833295c416420d2e7c1", - "0x0000000000000000000000000000000000265f70ffb78f42ca9db527ccc2a0d9", - "0x0000000000000000000000000000005e0a4cdef34a693652cf33bf776af83c0a", - "0x00000000000000000000000000000000000f776e3a088ddf6cb549da8a207d56", - "0x00000000000000000000000000000071ff3e700b2f8f991decc32319afcfe8c3", - "0x00000000000000000000000000000000000836ec28bbf5e572587cc47c416a2b", - "0x00000000000000000000000000000060d141d024dee23b3a8dd1aa98f224c440", - "0x000000000000000000000000000000000011861e38b0457ea34d870b4f3e4c23", - "0x00000000000000000000000000000048e0200af4523949ed2693783aa68ffc4c", - "0x00000000000000000000000000000000002093f016018e7bb8407e0e76fb1629", - "0x0000000000000000000000000000004cb2c6c83b90ffe5cbec441a7ae6b45bc7", - "0x00000000000000000000000000000000000bc3b6158749fe64e955f1b185f1d0", - "0x000000000000000000000000000000a51a9497905a681a2e9d6215c7a1abaed8", - "0x0000000000000000000000000000000000258d8b8588ce2899dd49549c9ada73", - "0x000000000000000000000000000000ac4f33f32ec385d0efd7bd413754adf63d", - "0x0000000000000000000000000000000000069613efcc8e9d4ee400a06a730118", - "0x0000000000000000000000000000005fcc2a645b50ba1b71326384b2579a8af1", - "0x00000000000000000000000000000000000b27b8419676e7a84a9d38ec798da4", - "0x000000000000000000000000000000657ca0d82735e356b2a5d55b6ac684655b", - "0x00000000000000000000000000000000000dbcd5763887e61277347c404d3980", - "0x0000000000000000000000000000004413809de081762acd74fc88ef5a7c5a99", - "0x0000000000000000000000000000000000052cbb84afbb82c1f5432578e8f7c7", + "0x000000000000000000000000000000ce7b9b9d87a1166114f0eb635ccfadf3c4", + "0x000000000000000000000000000000000000149ae9604e8b96d266ff7a33e688", + "0x000000000000000000000000000000bb2ba26b5e9232e44d41c072042aaaffb3", + "0x00000000000000000000000000000000001f260f41e48c7a8e4f9054cb4d8b99", + "0x000000000000000000000000000000cede4b4a60139b4fce604516e7f1f3c388", + "0x00000000000000000000000000000000001553cba4065435d21e87fff0c892f8", + "0x0000000000000000000000000000008d469400affbce7ad87c3ba01ae1f0efaf", + "0x0000000000000000000000000000000000025165aa0bd71f582e927e284d2d07", + "0x000000000000000000000000000000d58b5207dc95abdbd3782e49bec07df740", + "0x000000000000000000000000000000000008d93b89a24ed0325a6fb44fef5e7d", + "0x00000000000000000000000000000082b5ed35754bb9e65716b75c2f49ccb387", + "0x0000000000000000000000000000000000044d1c38c89337f8345511930c976d", + "0x000000000000000000000000000000d419594748bd76f6b38408d3ab31363cc2", + "0x000000000000000000000000000000000028811c19620b3203ab452b25e6792e", + "0x000000000000000000000000000000bf3455e9b94789df965149b747bf0e53b4", + "0x00000000000000000000000000000000001bf2a52eaca78ca31df5f3214ad78c", + "0x000000000000000000000000000000a0e502ff628643a46eb2aecd5fa2693834", + "0x0000000000000000000000000000000000226fcd830c168dff93bcc2b0700309", + "0x00000000000000000000000000000038f3fa716677e7f23f096a75fcd647c892", + "0x000000000000000000000000000000000027491e02abe62c68de752c3c529361", + "0x0000000000000000000000000000006500fde6ddf5ff2c5f8e6e4a3e5d61ffce", + "0x0000000000000000000000000000000000012153699f29df6322d8e5ab5f4a80", + "0x000000000000000000000000000000571cf8130390901d4b903f4682424323e5", + "0x000000000000000000000000000000000011f56b7fb830912a7f081088ec0029", "0x000000000000000000000000000000552393d09533e1b2004bd84e9f8a53a88f", "0x00000000000000000000000000000000000456bb701b5b0b463bbcf0c4fe7190", "0x00000000000000000000000000000074156481e9a3f8f091d30db1003a6daab4", @@ -97,10 +92,10 @@ acir_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x00000000000000000000000000000000000d56bbef147278fdc057f9a336d984", "0x000000000000000000000000000000f11f3eaed8726026211d2ee0f83e32e453", "0x0000000000000000000000000000000000291fbbe0b7f6f2823d5469cf981a1e", - "0x000000000000000000000000000000ffd28cf9ba1417c1caf418b43a3de9d434", - "0x000000000000000000000000000000000015449830399d0f54c492fcd591732f", - "0x000000000000000000000000000000fd493f730fa26592af1e4c7af7ec5321a5", - "0x00000000000000000000000000000000000bf622ffdd69efded5b1ad1d42d140", + "0x0000000000000000000000000000006d3eaa4e23a937590ce96d4ce395eb9ca1", + "0x00000000000000000000000000000000001f6bf3e8d8abb69dbd588290f5930e", + "0x0000000000000000000000000000004904827f57ac61c78570fb28c148ebbf63", + "0x0000000000000000000000000000000000248209f534ffdd643e6667757f3cc5", "0x000000000000000000000000000000f7a57d8eb28c5d23873376972e0630ac39", "0x00000000000000000000000000000000001b55bec64f61aa2803559d6a766e60", "0x000000000000000000000000000000d20d9a80ac0aa69cbff40f2e4dca6eebce", @@ -121,38 +116,38 @@ acir_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x00000000000000000000000000000000001dad3f4e78044bf6197cbd3e376f67", "0x000000000000000000000000000000d68a49412f45d61ef4fa8a13437267f9de", "0x0000000000000000000000000000000000243adeaa8a631cdf7bc2586150dba2", - "0x00000000000000000000000000000004b49a102241618edbd23c93ecba625dc6", - "0x00000000000000000000000000000000002abb2d064545acb95c5e80977c818a", - "0x000000000000000000000000000000c5c6b09b6c8bf03488b12695e8fc70fe22", - "0x00000000000000000000000000000000001b15326a839c5e7c221e480720c36b", - "0x000000000000000000000000000000662c2473f0e8ab59f734804c9a69ae121f", - "0x0000000000000000000000000000000000199ef1eb9b40bb93923a40577d95e5", - "0x0000000000000000000000000000009cf99efb8d678b82439fbbaf7774e32c4e", - "0x00000000000000000000000000000000000c46231fdc6142f2f2533fa6eabbc2", - "0x000000000000000000000000000000b639d851190c1f37fd178a03add2725676", - "0x00000000000000000000000000000000000e1aa64856c9d51fdee716f00ec474", - "0x00000000000000000000000000000052bbc13d7f0dd3f0760ac75330f189b904", - "0x00000000000000000000000000000000000d50e12d34b1fea28df38785df176b", - "0x000000000000000000000000000000b7c5fa0eab0e9af427251a0f0e90d4390f", - "0x00000000000000000000000000000000000d4b6c7df437152d9f4950640b838a", - "0x000000000000000000000000000000f69d8a955bc29d1e73873aaf4f41e26ab9", - "0x00000000000000000000000000000000002ecda78bf9dd30a78b5c3ba5684e12", - "0x000000000000000000000000000000ea75e11432b4e3d2184225704fb2643f11", - "0x00000000000000000000000000000000000b2eda7abe3b05d227567bd9eb64c1", - "0x0000000000000000000000000000005c2d319d1d8c43fdb524437ca0747c4800", - "0x00000000000000000000000000000000002dc52732b4471ab1e0484dcbde4702", - "0x000000000000000000000000000000b6f7b03b7de4cbe83ec0cec7d17859931c", - "0x000000000000000000000000000000000014f079a015f56c9f46ad5957d9b7e8", - "0x0000000000000000000000000000000d70afaf2f2379249a103b2ef8632c7c8e", - "0x00000000000000000000000000000000000e949a273b7740556f42964e79538c", - "0x000000000000000000000000000000f486b1eeaf7647aae37ddaf8f9617c1eec", - "0x00000000000000000000000000000000000a50e99a1f25f251463473bcc377c2", - "0x0000000000000000000000000000004bc3f9da26310273537951a19b31c298fa", - "0x000000000000000000000000000000000017faa947354da834c133db980f5462", - "0x00000000000000000000000000000062018fbe858d3180b2d04e56911a792ffb", - "0x00000000000000000000000000000000002b1262a9a690c3eb425dbe84386d28", - "0x0000000000000000000000000000004e05d50aa0f686d76358ce7e2ce23897a3", - "0x00000000000000000000000000000000000528a2c0f2014cdf1b535f8f663d86", + "0x000000000000000000000000000000c886839ab98267acd8c7b84e6be0f638aa", + "0x00000000000000000000000000000000001121156422e4835e3d8d34ab5cbd2a", + "0x00000000000000000000000000000029043712764295aabc4732c9cb2289da66", + "0x000000000000000000000000000000000015f179d49eef2606f86c7893a97cd3", + "0x00000000000000000000000000000061bb3caa1a2ed435f3b5fea226462ad763", + "0x000000000000000000000000000000000015d0600625d3e9b0ce98f29be63270", + "0x00000000000000000000000000000096929007c0978f987a0c9b1d334d5fc32f", + "0x0000000000000000000000000000000000027b0660daf7b9a39908eab6428695", + "0x000000000000000000000000000000f84e29c66f445d2fabb191b6506c20de71", + "0x0000000000000000000000000000000000038676fd7c7640d53b4d66c5539e53", + "0x00000000000000000000000000000010411d188146e83434800e195d61317f15", + "0x0000000000000000000000000000000000022cd6aa27013133896a44ec81fa3f", + "0x000000000000000000000000000000cc615929ee3b746374c06b025bf57d81f0", + "0x00000000000000000000000000000000001c62524963a4b1101d88bfc24de791", + "0x000000000000000000000000000000abda4b6d9e27979959b68ee694f349752a", + "0x00000000000000000000000000000000001f0832b2c21fcde549a4ee946c35f7", + "0x00000000000000000000000000000077f2a6ce537ffa15b32ea091f0cd0f4926", + "0x00000000000000000000000000000000002a7c7ee0b9879d021c827b4da94bf0", + "0x00000000000000000000000000000082019ba82af5d03f830e008b3f6da41523", + "0x00000000000000000000000000000000001d488b008651120c70eebb84a7e365", + "0x000000000000000000000000000000d733d7b2c357a31ceb159b7cb372654692", + "0x0000000000000000000000000000000000183cbd8c2678e4712a615eb378ccd3", + "0x000000000000000000000000000000eb01901781efa7ef1373bab28ca14a6e4c", + "0x0000000000000000000000000000000000214fec8aabf60dce6884fa065649e0", + "0x0000000000000000000000000000001199da0b059ccc2ec058ec51219f3b38ff", + "0x00000000000000000000000000000000002023c7d019b6a207dbef79b2996206", + "0x000000000000000000000000000000d722e236a9d78854e897297fab66213bca", + "0x00000000000000000000000000000000000f701ce6d63018e0c0c3cb59704e3f", + "0x000000000000000000000000000000d92586f0e08b7b36d2fe47994a3d2379e5", + "0x0000000000000000000000000000000000152596cdb484bae09c1dafa8d225b8", + "0x0000000000000000000000000000008197a869f3b956470d65b2d3a922a690b3", + "0x000000000000000000000000000000000008b708dc05929c85ec9b8d9065916b", "0x00000000000000000000000000000084a9b3527cd2ebff62b245a04aab258f92", "0x00000000000000000000000000000000000a85019e1252699312cbd5ec6a23b2", "0x00000000000000000000000000000000b5eee72336430c3feb7da6b8b57e1551", @@ -186,55 +181,119 @@ acir_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x00000000000000000000000000000078f4b3bc61f19d6e7069359bbf47e7f907", "0x00000000000000000000000000000000002d7c18a93c3dae58809faaeec6a86a" ] - hash = "0x2f8fc4817e72f3df76a1933723114dcfa15854f5fe10178c458bdff5aca6d783" +hash = "0x03794d69241e6646aceced5e2cc634f9aa4772262592229b7608834b3ccee7d5" + +[private_call.verification_key_hints] +contract_class_artifact_hash = "0x196980607d3bc2d71a5b0eaf7611d18ca2818bb95e9eba3b9f5d7aec4a9c649f" +contract_class_public_bytecode_commitment = "0x0000000000000000000000000000000000000000000000000000000000000000" +acir_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +updated_class_id_value_change = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] +updated_class_id_delay_change = [ + "0x0000000000000000000000000000000000000000000000000000000000000000" +] - [private_call.function_leaf_membership_witness] + [private_call.verification_key_hints.function_leaf_membership_witness] leaf_index = "0" sibling_path = [ - "0x2c5cf3eba88f6b97be1e9f373f62c5c317ea9693f54ad1b03e826cf14e83c868", - "0x22d0c6ab9e48b1f8fd239d09ff2f5cfbff9501b21033f8c7a46d92b4fb6d0a54", + "0x19e6836999621e391642be3c4c36044ff6f7fd2574179c85904223fa6cafb5a5", + "0x1de366438a3afe71656f913e425152445a052a668918dcd8a0da41a745cb584e", "0x0e1ce4f11f4d51a7d3136abbd625315fff3876d322e46ad8401da96f8e43a614", "0x1a0ca5eecb1430479902264f04e557160a4666fb42bb8b283c6397e3d17ac937", "0x2a6595890719fef7967c209488728aa5342438ba52058a3c770202f55acf6854" ] -[private_call.public_keys.npk_m.inner] -x = "0x2661813d6be5d3e5bea8100a26875f885511651e75a98a21aff9e9b8becc53c4" -y = "0x1933d05b68e5528f6c8e351e72903e1a3eb0a57cf0d0b6df2804c29c05e313c5" +[private_call.verification_key_hints.public_keys.npk_m.inner] +x = "0x0a9b8adfbfa47265264eeec2111506602133932ab717a76524ed17ea41bf9728" +y = "0x051e243411ef5b245a7ea87e21e21ca2a56d7afa54986a97a6c96bb00b7f481a" is_infinite = false -[private_call.public_keys.ivpk_m.inner] -x = "0x0affd911ec8a44d1c4b39efe3da80dbb0ee2b628f51bcf2fffe791e60826f4e9" -y = "0x211639aad7e181f09e0253f304c624600aff0fa416550926a8c1f8f4e28cf45e" +[private_call.verification_key_hints.public_keys.ivpk_m.inner] +x = "0x14c1119dcc7a4f31cbe3eef3ed0561028974c76012bd2b4f64f06516e4e98e7b" +y = "0x233b0bb5960229f1708bed66ed8be0f25e3ace322cee2b11cc0e2a81c809a85b" is_infinite = false -[private_call.public_keys.ovpk_m.inner] -x = "0x139705b4492d05c89ba39d7a1c2be133ec4d7efa8dcbb6ede73c73476636a21a" -y = "0x10ddecf162bc33ae6251ba2338337f393edc69f2d1461015bfd28826f34e5ccc" +[private_call.verification_key_hints.public_keys.ovpk_m.inner] +x = "0x212f7a13c7f76e6f50079fe464decceaa39b4de02ea1fd5f73ad4b6b63593209" +y = "0x18d5f37bc55ad053daa878fab020ea899f120198e2025c527f91a4f891dc492a" is_infinite = false -[private_call.public_keys.tpk_m.inner] -x = "0x17309d0ccead0fb419766fa445df1730e4120171eb19a209dc93d026c1fc4807" -y = "0x16e6ff886c8842da9da88f27693587ecb017bcbfa18f6853175e894b1b615b65" +[private_call.verification_key_hints.public_keys.tpk_m.inner] +x = "0x0c7c85ccda76197ddec6e2c366101c119c3d67d6663befdfd6fe461bf58d6f30" +y = "0x18e02b1417ec3bde89406edf53ed8e2d2526f513c13408a84576fa6310ab0a78" is_infinite = false - [private_call.salted_initialization_hash] - inner = "0x2c8d540eae6c72bde5e440ca90201d275c7ed50e2576ca11991c8643d55f7800" + [private_call.verification_key_hints.salted_initialization_hash] + inner = "0x25e914d724050071f0716015039d3d1391e9ea4a52a9f9bc9fee382694924123" + + [private_call.verification_key_hints.protocol_contract_membership_witness] + leaf_index = "2" + sibling_path = [ + "0x1797e9eb2bc5d5c6e1aa3386f1d719bce936306d9a9105b935185cc8fbd03f7a", + "0x2f2acfe1e2aeb2f43f8fd14267acafdbaa06c495ae010977dfc07b24312fb5dc", + "0x2213e581b96f63758b3fc7fea45eccc574f2e95648ac68c27d2865906bf389c0" +] + + [private_call.verification_key_hints.protocol_contract_leaf] + address = "0x2fca7ff6e9adfbd67f3cd542234daffe419d1271b2043862eb6b63a02d95fd1f" + next_address = "0x0000000000000000000000000000000000000000000000000000000000000000" - [private_call.protocol_contract_membership_witness] - leaf_index = "4" + [private_call.verification_key_hints.updated_class_id_witness] + leaf_index = "132" sibling_path = [ - "0x0a023db51e9a9cb41b0be9faf146bb5094ba54e357af710364633a00ea424d2e", - "0x11efc1ff409140e05eca73a2df30bfbdae0130b92a6ed2f7d7e1a61eb23d3e6d", - "0x0bc88163a1fe70904187f6352ec107398d353293f0e0010f4c615871d679da6a" + "0x1d00b43e9f9f13cd82a5dda3505061d9cc16f04d90ffcbf6fd21abd35184b1b7", + "0x044757d7dadb7e58940c63a8e3511266a15798b0ec4252f3bbb6f5985d011c99", + "0x182f25010964870ea1d1cbcfc242f39ce8d22d7f596452c5a5e76400fc440f9c", + "0x1f5d28afdbfc3602b110144ffbca3c7e23117e3f117632f38dc0857cfa8ce9f6", + "0x196ca6ed61b8f48c8ad8df44a8a72ac71343352adc8d654037439d851965344d", + "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", + "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", + "0x1403ea8e9dceb886c909e93a8405e12e5e4f3ba06d85939ffb951672b5c3ea83", + "0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1", + "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", + "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", + "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", + "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", + "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", + "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", + "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", + "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", + "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", + "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", + "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", + "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", + "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", + "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", + "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", + "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", + "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", + "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", + "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", + "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", + "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", + "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", + "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", + "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", + "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", + "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", + "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", + "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", + "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", + "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", + "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" ] - [private_call.protocol_contract_leaf] - address = "0x237a0bac451ebac796b96dbe27ccfda5230e8c962b391b84b0304c3775e9e0c0" - next_address = "0x2946115660107c3ca9bea1e486452595999c3677e7aaeaa9ca898e0fbba0051a" + [private_call.verification_key_hints.updated_class_id_leaf] + slot = "0x0851971354193cb64142d979aff7b3c49f5dc2212ba36ea68f6e7b0916dd557e" + value = "0x05208323f49682fc3367ed42a0212854a797b5372b0cc6bc5493b00e96ff256d" + next_slot = "0x0aa43f4a7989199d7e7c243a8a55e20d1dc2ad72a9610be7832b69c867c5a236" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000081" [app_public_inputs] -args_hash = "0x14706f5a771b436a4124cb9651fa7a023273fddb092778f2b6c508e60e539cb0" +args_hash = "0x1c78057442463fa4abb6c8174ca6cbd65f63118ff10f43ba76e657c79271b1c4" returns_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" start_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000001" end_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000004" @@ -252,13 +311,13 @@ _value = "0x0000000000000000000000000000000000000000000000000000000000000000" inner = "0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000" [app_public_inputs.call_context.contract_address] - inner = "0x261174ae4897ef34adb44dc66d962b6780504d1b1067c0b61e54e80de220d2d0" + inner = "0x30115c80b13c0a42019f2e58b75086cf4053674b689df29e2c9581447f32cf2f" [app_public_inputs.call_context.function_selector] inner = "0x0000000000000000000000000000000000000000000000000000000027e740b2" [[app_public_inputs.note_hash_read_requests]] - value = "0x0c47e69105b67dbd03e93f15fe5df88c538b68152d54ebe3bf44d35a538b9d36" + value = "0x19a0c6005860f89e0e94e26f514bc2952e7f1ba490521fadffc8ea72be85f837" counter = "0x0000000000000000000000000000000000000000000000000000000000000002" [[app_public_inputs.note_hash_read_requests]] @@ -800,13 +859,13 @@ _value = "0x0000000000000000000000000000000000000000000000000000000000000000" [app_public_inputs.public_call_requests.inner] is_static_call = true - args_hash = "0x123a2a06304cb31bf6e98c71b2b8ee12f3225dfcaa0d242512537056632962a6" + args_hash = "0x1b1d58b3cd52d9b27e85e4ff9a0416d912a32f576553901871ae62a4141daad4" [app_public_inputs.public_call_requests.inner.msg_sender] - inner = "0x261174ae4897ef34adb44dc66d962b6780504d1b1067c0b61e54e80de220d2d0" + inner = "0x30115c80b13c0a42019f2e58b75086cf4053674b689df29e2c9581447f32cf2f" [app_public_inputs.public_call_requests.inner.contract_address] - inner = "0x27581b7f11d6e97d5aa29a88c9d06d5fd073e619af7da445d51619956fde6c68" + inner = "0x063951d8a111a809db4098fe0146d185698cb0651ea8953607998767eae4617c" [app_public_inputs.public_call_requests.inner.function_selector] inner = "0x00000000000000000000000000000000000000000000000000000000d5441b0d" @@ -1500,16 +1559,16 @@ _value = "0x0000000000000000000000000000000000000000000000000000000000000000" length = "0x0000000000000000000000000000000000000000000000000000000000000000" [app_public_inputs.historical_header] - total_fees = "0x0000000000000000000000000000000000000000000000000003a831c6a84280" - total_mana_used = "0x0000000000000000000000000000000000000000000000000000000000004a40" + total_fees = "0x000000000000000000000000000000000000000000000000000002234738a6dc" + total_mana_used = "0x000000000000000000000000000000000000000000000000000000000003e4b5" [app_public_inputs.historical_header.last_archive] - root = "0x26539d26af96d95bbb572600a75cac167b3d1c1b1463d7a37f36a17a8d06ed6a" - next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000008" + root = "0x182ece3a6471a364fdb90dac6ee36013aa3be5f8b00a3edae015ae194590f266" + next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000005" [app_public_inputs.historical_header.content_commitment] num_txs = "0x0000000000000000000000000000000000000000000000000000000000000001" - blobs_hash = "0x00766b5deaa18a777a6519ed05b5ab8360ac4c4b8ba6b207d8cabb2ff48d8c4b" + blobs_hash = "0x00dbbc8e274b20691c819f6c5ccdaa3317c048cdf7e346aca53a9ad0338e33f4" in_hash = "0x00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c" out_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1518,33 +1577,33 @@ root = "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000050" [app_public_inputs.historical_header.state.partial.note_hash_tree] -root = "0x00893d1239f1319771e840ed89e26356efb7a175b5d14215f16d2f3f73b61de0" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000240" +root = "0x1d2a0372ac57ea0f5e4878ef40b3876d986df26d9039093d56426b8d05c1aa95" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000180" [app_public_inputs.historical_header.state.partial.nullifier_tree] -root = "0x0cf60cbdd1d63166e082dafba02571914ee2e2b63f16a0088f4bc35f9141063f" -next_available_leaf_index = "0x00000000000000000000000000000000000000000000000000000000000002c0" +root = "0x300782ca3597643e3bd4ef7c4122e409019f3e970a5e27cac7511d3bceca71b4" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000200" [app_public_inputs.historical_header.state.partial.public_data_tree] -root = "0x21adba011a03e24b92611d690dcc4d6b77d39beddf5d2ec763554cc2e96d8b87" -next_available_leaf_index = "0x000000000000000000000000000000000000000000000000000000000000009a" +root = "0x17043d2abd1baca090b8b982811b5e202356adbc5d2b1e262c33c7846acf08dd" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000099" [app_public_inputs.historical_header.global_variables] chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" version = "0x0000000000000000000000000000000000000000000000000000000000000001" - block_number = "0x0000000000000000000000000000000000000000000000000000000000000008" - slot_number = "0x0000000000000000000000000000000000000000000000000000000000000022" - timestamp = "0x0000000000000000000000000000000000000000000000000000000067aa83d7" + block_number = "0x0000000000000000000000000000000000000000000000000000000000000005" + slot_number = "0x0000000000000000000000000000000000000000000000000000000000000008" + timestamp = "0x0000000000000000000000000000000000000000000000000000000067af1dda" [app_public_inputs.historical_header.global_variables.coinbase] - inner = "0x000000000000000000000000510b7559c009aa23c667441544126add2fded29c" + inner = "0x00000000000000000000000036878ef7e244777d78d353a8a91073f7f9f4b9d2" [app_public_inputs.historical_header.global_variables.fee_recipient] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [app_public_inputs.historical_header.global_variables.gas_fees] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9bd267fa" + fee_per_l2_gas = "0x00000000000000000000000000000000000000000000000000000000008c90ec" [app_public_inputs.tx_context] chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" @@ -1560,7 +1619,7 @@ l2_gas = "0x00000000000000000000000000000000000000000000000000000000005b8d80" [app_public_inputs.tx_context.gas_settings.max_fees_per_gas] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" -fee_per_l2_gas = "0x00000000000000000000000000000000000000000000000000000012e9bb9bf7" +fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000000186c3f" [app_public_inputs.tx_context.gas_settings.max_priority_fees_per_gas] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-inner/Prover.toml b/noir-projects/noir-protocol-circuits/crates/private-kernel-inner/Prover.toml index 82c94002c2ff..a686e0e33203 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-inner/Prover.toml +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-inner/Prover.toml @@ -1,16 +1,16 @@ [previous_kernel] vk_index = "0x0000000000000000000000000000000000000000000000000000000000000000" vk_path = [ - "0x2686e39eed3e405a2a1162208acadd6be9448cdb96d9a72c0bef2dd5152a5da5", - "0x19275c3c902286390bf9165a8a58adfa82283972fbb5d8c55d8faf01ec3e5a0e", - "0x2b556b4625c4c544d7841613ad6820d136b75fccb8b7baf79ef456bce4cdce46", - "0x2b3e3f6a09e7f29f50fd57b6861a71a4837ca5794f7023c2b08c9108f4019110", + "0x0ff18f50ac892a4855d69c72b1a1a2dbcc8ad7c44b8ad06b17decf0e3ed9771c", + "0x20b25d6f46b001bfed6f0bb609200b2608fe075b68c9b740838d2b12a19700fd", + "0x24003f6468fefa5c180ec4da2a12f20b61cd408fa2b0536a52ddcd464ba030d9", + "0x1ed25a38cd9d04ab5b82e40e8df5203e8601022abfa3f35de954bae2f5ab9434", "0x085de27a70b1e644dba1f38475bc3cf44d2db93e32296c875e1b4e7435720caa", - "0x059405994b0e8b49eeccac51801f92d8adbc42fd48c9dd274f888e910168794e" + "0x059405994b0e8b49eeccac51801f92d8adbc42fd48c9dd274f888e910168794e", ] - [previous_kernel.vk] - key = [ +[previous_kernel.vk] +key = [ "0x0000000000000000000000000000000000000000000000000000000000100000", "0x0000000000000000000000000000000000000000000000000000000000000020", "0x00000000000000000000000000000000000000000000000000000000000328b1", @@ -34,30 +34,30 @@ vk_path = [ "0x0000000000000000000000000000000000000000000000000000000000000008", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x000000000000000000000000000000f3f4ff6224dbcf3360733d15b18fa8f270", - "0x00000000000000000000000000000000001d10baf86b2b9ebd05fad360f7e212", - "0x000000000000000000000000000000f12401f8a5114bf9b5e17b6c598c6af074", - "0x00000000000000000000000000000000002132e40157a8a5564a28ad11912354", - "0x000000000000000000000000000000d81a0980aef468cd0580a76dc2192fd538", - "0x000000000000000000000000000000000019d1e7df034994219282dc7b3589bd", - "0x00000000000000000000000000000089af208b330cc40c199a2fd42e7b019b02", - "0x0000000000000000000000000000000000245a41a779ce3b841a3245fe27b472", - "0x00000000000000000000000000000019f70281d95b9bb5ab75ba6cce6715b727", - "0x000000000000000000000000000000000000f6b154e6130b6aa2f2385a2b4379", - "0x0000000000000000000000000000007a765390d53e6547d29f2522600e206c06", - "0x00000000000000000000000000000000002ea28b388879a5d486ee070ef9a837", - "0x0000000000000000000000000000002ddc5da7b6321c08de84d084eac0b3c2c6", - "0x00000000000000000000000000000000000dfa3f29d2ee6bb6967d38d9485ceb", - "0x0000000000000000000000000000009a33f9bd7cb70c797937f984837829d6cf", - "0x000000000000000000000000000000000000e31b2cc54d234d571d5ecdc3adb5", - "0x000000000000000000000000000000b0be3158b78d8f97fde7d4afe8ed080a06", - "0x00000000000000000000000000000000002e90bab16e5931fa48d0b89b8942ca", - "0x0000000000000000000000000000008b8d9dae14d07519f9554cb18cf4abdffb", - "0x00000000000000000000000000000000000a7c47013f027336161e7552a19739", - "0x0000000000000000000000000000009b01dea55cbbb889b38aaaa65914209650", - "0x000000000000000000000000000000000016c6c85338b8b9a6bd8679c2c21d61", - "0x000000000000000000000000000000eba166b1b51c4a7ed781d7822b24549d93", - "0x0000000000000000000000000000000000296720a58920cc4e77bab97595e1de", + "0x0000000000000000000000000000006b36e989fcb0f48274657e892bc7cebf7e", + "0x00000000000000000000000000000000000cbdeb4be5ecc3195d16cc90567a3a", + "0x0000000000000000000000000000001c846d9d9a9c0398e189b899be8ad7c09d", + "0x000000000000000000000000000000000028879c559541e43b2dfef3171c517c", + "0x00000000000000000000000000000096f2f4e04119e6c95be70b64fbba3b309c", + "0x00000000000000000000000000000000002a0d70f1109c6f7b8c3b59eb7830e9", + "0x0000000000000000000000000000000365ccc83973015af4309ae7de151eefd4", + "0x00000000000000000000000000000000001bed9fbb7c38d32c576e9e69d43694", + "0x000000000000000000000000000000476c1f7b2518fb4332f13077a8cfa93453", + "0x000000000000000000000000000000000023ac20ca86cb173c2608cd4afa1930", + "0x000000000000000000000000000000798ef5d10688ea9a8cdcc069ccf803bf7d", + "0x00000000000000000000000000000000000a53d911fb269e0f6f43d45a53ec63", + "0x0000000000000000000000000000008ac2a1045199b028cfb4d3d4c9949ed75a", + "0x0000000000000000000000000000000000289a88e3eff8a537aed8c2f7ba044b", + "0x000000000000000000000000000000a093cbe6bda8ae64f91f8bab5178a552db", + "0x0000000000000000000000000000000000275915bd19e70597b2a1e11f23a4b6", + "0x0000000000000000000000000000002c94db86921f70af974e84a6a4cb7498e7", + "0x00000000000000000000000000000000000664f64f56d7680298204955d26b29", + "0x000000000000000000000000000000533b653d761df17a44e6a4504d81e759b6", + "0x00000000000000000000000000000000001906f815928ddd614e39a1f978cbac", + "0x000000000000000000000000000000a7b5b9951fda167f5919d468002703d829", + "0x00000000000000000000000000000000002e7226141d975dd78955e796dd164b", + "0x000000000000000000000000000000fb63544587b7060d166ab7ba46aba3f08e", + "0x00000000000000000000000000000000000f2f54de9419fe622291ed5ed9eec9", "0x000000000000000000000000000000cf3f0cf483e3b60ac46e2580628429291f", "0x0000000000000000000000000000000000179a988d2f894ba4cc456686236e49", "0x00000000000000000000000000000041c39c0b069ca7761686f7caf8bd51c343", @@ -66,14 +66,14 @@ vk_path = [ "0x0000000000000000000000000000000000298c3311fc9170f92de940b042aab9", "0x000000000000000000000000000000bf37537eb196b05c1d98fa51016a9bacbb", "0x000000000000000000000000000000000007b05f408a612847259016b9204ae4", - "0x0000000000000000000000000000006002eb0ee9dc08582484e977e03196c529", - "0x00000000000000000000000000000000001986039b806bd540833e855272e3b1", - "0x00000000000000000000000000000010e983ce0b34ff06e7215d9a1181fbea75", - "0x0000000000000000000000000000000000076541e77c745b8c754679809fd595", - "0x0000000000000000000000000000001278bd6ce77d1088282dfe2d116ce93e86", - "0x00000000000000000000000000000000001961cb0dc239b81e2967aee689b398", - "0x0000000000000000000000000000006e600ee691a1c930789354702db97364e7", - "0x00000000000000000000000000000000000d4d30185b4070455a8113616e0519", + "0x0000000000000000000000000000001a9650137fef18a5430542e54818e8df8e", + "0x00000000000000000000000000000000000065873582e9d566a71eb84033672f", + "0x0000000000000000000000000000005773b38f228f5f077eabf0f8fd2c57095d", + "0x0000000000000000000000000000000000009b41ae800d512b887823bb70ffb2", + "0x00000000000000000000000000000036105f719445624b3ff086475e309d57f5", + "0x000000000000000000000000000000000021bbe4db73ad5db2902bbbfe2ec847", + "0x000000000000000000000000000000fd1eac1ff68888138c69a10736f764c276", + "0x0000000000000000000000000000000000179cb559c651336d44f26a5b1d849d", "0x00000000000000000000000000000035c9cb5f001915ccb707544d8295b4e4f8", "0x00000000000000000000000000000000002451c090209c18e440624b96591a23", "0x000000000000000000000000000000381694f1ab41bc30edb347a4618bbcb253", @@ -82,46 +82,46 @@ vk_path = [ "0x0000000000000000000000000000000000172c855547ef1cf358b1193059ab94", "0x000000000000000000000000000000c746ba121a8412b23d1a54c2679b7fcb42", "0x0000000000000000000000000000000000188578f3213bb6dba81fc0826a77f1", - "0x00000000000000000000000000000055926d768ed25d3b2defe81966ebc71493", - "0x00000000000000000000000000000000000af1160b73d0b5240cc20c893721df", - "0x000000000000000000000000000000385fccaee44be830c74f63fb5ba03500bb", - "0x00000000000000000000000000000000000268e31a0c93ba93c9232a6052f859", - "0x000000000000000000000000000000132e7c81960e83db0e4e4e683463aa4849", - "0x000000000000000000000000000000000010cf59ed4bbce8322dc58b3b941981", - "0x0000000000000000000000000000004109a283617ab5dc58c7037562a29620d5", - "0x0000000000000000000000000000000000181037f396d13373172d5a5aafa63f", - "0x000000000000000000000000000000565b139d3d21793ded0fcca0b185e4673e", - "0x00000000000000000000000000000000001afe1b2b72463256f855f26972531b", - "0x000000000000000000000000000000867f8acfc668750f6c431e22dd014e1248", - "0x00000000000000000000000000000000002b2e383876ac33c90b7286ec179dc2", - "0x000000000000000000000000000000a28875204e10ee16cbb80ebcab595599cf", - "0x000000000000000000000000000000000000b21f3504f3f7d148c43d9679b961", - "0x0000000000000000000000000000006874e58cb76cb3bddf1c8945296301a0dd", - "0x0000000000000000000000000000000000117ff987fcdff1fc91aacd947aead9", - "0x00000000000000000000000000000022cf659dfdd4a8e261323b19a7d2846ba5", - "0x00000000000000000000000000000000000c9267f43f30df04a999d044c33b85", - "0x00000000000000000000000000000067ae9252b2f1d89930b65476c56af5e585", - "0x00000000000000000000000000000000000da686230a47442f5dc71bab3484bc", - "0x0000000000000000000000000000005ab50efbf650e5ba56f20399380b31c219", - "0x00000000000000000000000000000000002100d364a1d7fc0420097febeded32", - "0x000000000000000000000000000000c4b432bb0018b4192eacf5c10750706bfe", - "0x000000000000000000000000000000000008b5819a61fd63e29489a4346ddf3d", - "0x000000000000000000000000000000d5f739273dd051e70911e0e89fb8e533f1", - "0x00000000000000000000000000000000000e38c177e35547f579bc64ea719f1e", - "0x0000000000000000000000000000008c86cf2d45c8a269e03c67eaf214cf268c", - "0x0000000000000000000000000000000000041017301b67a2fb51d0ec892638a4", - "0x00000000000000000000000000000070d65da45584727f08de25b0e3b2343de0", - "0x00000000000000000000000000000000002faacc9081fbe227bbebd8f827b244", - "0x000000000000000000000000000000a428301bbc43dd3b2f3f538dfb08c6a9b0", - "0x00000000000000000000000000000000000f892311c20078c907f200220434da", - "0x000000000000000000000000000000e3082a102709e7202a4f6f2d313c8d4749", - "0x000000000000000000000000000000000019d7019a3b54245a52e1b34bbc028d", - "0x000000000000000000000000000000b0906d4f6548cf528e5a6d273924c43c69", - "0x00000000000000000000000000000000002a4166f5fc5f8d924d7b869b9ffe33", - "0x000000000000000000000000000000b8dbc03ede13c008e2ed30936c34617c26", - "0x00000000000000000000000000000000000ed66d8dea1f18e5066ede28f30a1f", - "0x00000000000000000000000000000092f801292d7e184fc9aff8f493ff6bb189", - "0x000000000000000000000000000000000011ed17d0077f095ecaca415b60e2d7", + "0x000000000000000000000000000000b8bfc0ec72460534646ca70473b769e469", + "0x0000000000000000000000000000000000049b8d0d775977aced41eb139190a1", + "0x00000000000000000000000000000096f3f7b6aadf2bd52f2924c7122667ce25", + "0x00000000000000000000000000000000000525a7e6f2f97879bcc820bf777253", + "0x000000000000000000000000000000f4d3cf67a283478a5eac6fbe17ee96eed2", + "0x00000000000000000000000000000000000ad1b561d9594259b882488d0cc327", + "0x000000000000000000000000000000a411ca082e39592f1fc853c2d513bbd5aa", + "0x000000000000000000000000000000000008d3f884d8438ee5215018dcaa188a", + "0x000000000000000000000000000000e21fbc2b91d869007a1617bf0a7ac2464e", + "0x00000000000000000000000000000000001c99d7e58390e1218a42405fc9edea", + "0x000000000000000000000000000000036c627bee51735f1c3b112847c0053609", + "0x000000000000000000000000000000000017a920dc865673d42da879a77807e7", + "0x000000000000000000000000000000036b6c53513dff73708fc471be40708659", + "0x000000000000000000000000000000000027043300bd6c923409735a65ce98ee", + "0x000000000000000000000000000000a5ebd7e48c4581b92e1a0315fd1f5f6a06", + "0x00000000000000000000000000000000001a6b5eb7388b5e04168befce24d07a", + "0x000000000000000000000000000000a9038b7594683ab2a9ec3ce97efa44b8e7", + "0x00000000000000000000000000000000000595d26d43c71aadc00f8f491b7593", + "0x000000000000000000000000000000d602ee9e20686c91809ed47f8baff4fce0", + "0x00000000000000000000000000000000000ab2f2dd4d73cb30bde326eda9ed14", + "0x0000000000000000000000000000005be54127b72f21b1b83777dac39e4c87ea", + "0x00000000000000000000000000000000000131f00f042923f95a0e8c6d64892d", + "0x0000000000000000000000000000001118cd368e870728e0d1f412298c9a65f7", + "0x000000000000000000000000000000000026add52478248d754153bdce61f3c1", + "0x00000000000000000000000000000009154d3ec9f3bcb2df35a69bd0fb79208d", + "0x00000000000000000000000000000000001d613f6e65a57a1a1030ccb344d8a2", + "0x000000000000000000000000000000bb2a219ac198512f1a908e61ef9cbf9e42", + "0x00000000000000000000000000000000001f707d2d07e454f19f75f6d663bbc4", + "0x00000000000000000000000000000086b9a8c5acfbc532ffff6fba3134e9f038", + "0x00000000000000000000000000000000001e0e81a4b32e0b53fd1b419850835c", + "0x0000000000000000000000000000000ab14d96e68c9ae60ccf77717352e0f361", + "0x00000000000000000000000000000000000367e2302bedd0779777a919482f46", + "0x0000000000000000000000000000005e702135199675b0eda0f599c95366df39", + "0x00000000000000000000000000000000002ee595025e2d81d67fca35e75a7d29", + "0x000000000000000000000000000000beb2f84caf57feac059949820d628b275f", + "0x000000000000000000000000000000000000980aa78f659e9d9bb1b75026e47c", + "0x000000000000000000000000000000a984cb21527c59527b1a46d94444017688", + "0x00000000000000000000000000000000002bf65486b4acfe48a82d7cbd4f0090", + "0x000000000000000000000000000000142e989f44d6d395036693548aa07c70c2", + "0x00000000000000000000000000000000002b11210c4a8d195242600467a70652", "0x000000000000000000000000000000f6f4596202301b6ae4eb0ebbeadd203340", "0x00000000000000000000000000000000000adc89c48d75b571636f5bbeb4a806", "0x00000000000000000000000000000000034e3e27454ef992b4bf84b97baa7471", @@ -142,10 +142,10 @@ vk_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000000000ec3268d2915a5187af550434e44aa25dcb", - "0x00000000000000000000000000000000000228a28a4c8ca7f74996a8c6984697", - "0x000000000000000000000000000000efc73380fcc3f615a0358041e5b4d28ae6", - "0x00000000000000000000000000000000002d515e1a139718d91e5728b118e629", + "0x0000000000000000000000000000002601343ed9ec702f7e521ebe0ffbd691f3", + "0x000000000000000000000000000000000012ff74941b932aa806c1bc5e1a178f", + "0x0000000000000000000000000000005cfadbe0d6f87ff27fb836c4f6cbb5f414", + "0x00000000000000000000000000000000000f4f5d92fbaa233a1b3681560577ec", "0x0000000000000000000000000000006241ca0c75be2d15e6b9188983d6b41e2d", "0x00000000000000000000000000000000001a71ab9767b295f9337074850d2d40", "0x000000000000000000000000000000ec7f970d2da2ca7f41836eb044f5a75b01", @@ -153,69 +153,69 @@ vk_path = [ "0x000000000000000000000000000000e55ba19751adfe6c36324d3fb6c2da0989", "0x00000000000000000000000000000000001d58aa61c64ad522043d79c4802219", "0x00000000000000000000000000000078f4b3bc61f19d6e7069359bbf47e7f907", - "0x00000000000000000000000000000000002d7c18a93c3dae58809faaeec6a86a" + "0x00000000000000000000000000000000002d7c18a93c3dae58809faaeec6a86a", ] - hash = "0x2a8d97659dc393aead47ffc8bcc582fa8446c7c2cc7b32b57028dea23ecb9166" +hash = "0x089516eb536f5bcde95e03095e0702a013100b0c70b9bb7131ebd2f57b40ea52" [previous_kernel_public_inputs] min_revertible_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000003" is_private_only = true -claimed_first_nullifier = "0x25f17738bb49817d35b62766c4029c7358c66663cf81eb2fc79e99eb98adc9c0" +claimed_first_nullifier = "0x0e4066147fc8ac2b969caa4493d06966719c626262227398154eefd146a6b8bd" - [previous_kernel_public_inputs.constants] - vk_tree_root = "0x090a6edbf45a7a953c0f356db0ffd532e057797163ef6dc5d4cfa852cb0aaa2c" - protocol_contract_tree_root = "0x2d5d4db09f9cead586c3d27ff21023e98615d9afc7740037a3d411f7aa3c1e96" +[previous_kernel_public_inputs.constants] +vk_tree_root = "0x21d971c64d3619099dafa73842f3706996ff14fa9d32f509bb26ae93dfd3f686" +protocol_contract_tree_root = "0x22c0e4f2a805886466bd0a7225ac03637630dcb01a306fa4b122a42c0c6a3f10" - [previous_kernel_public_inputs.constants.historical_header] - total_fees = "0x0000000000000000000000000000000000000000000000000003a831c6a84280" - total_mana_used = "0x0000000000000000000000000000000000000000000000000000000000004a40" +[previous_kernel_public_inputs.constants.historical_header] +total_fees = "0x000000000000000000000000000000000000000000000000000002234738a6dc" +total_mana_used = "0x000000000000000000000000000000000000000000000000000000000003e4b5" - [previous_kernel_public_inputs.constants.historical_header.last_archive] - root = "0x26539d26af96d95bbb572600a75cac167b3d1c1b1463d7a37f36a17a8d06ed6a" - next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000008" +[previous_kernel_public_inputs.constants.historical_header.last_archive] +root = "0x182ece3a6471a364fdb90dac6ee36013aa3be5f8b00a3edae015ae194590f266" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000005" - [previous_kernel_public_inputs.constants.historical_header.content_commitment] - num_txs = "0x0000000000000000000000000000000000000000000000000000000000000001" - blobs_hash = "0x00766b5deaa18a777a6519ed05b5ab8360ac4c4b8ba6b207d8cabb2ff48d8c4b" - in_hash = "0x00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c" - out_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.constants.historical_header.content_commitment] +num_txs = "0x0000000000000000000000000000000000000000000000000000000000000001" +blobs_hash = "0x00dbbc8e274b20691c819f6c5ccdaa3317c048cdf7e346aca53a9ad0338e33f4" +in_hash = "0x00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c" +out_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.constants.historical_header.state.l1_to_l2_message_tree] root = "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000050" [previous_kernel_public_inputs.constants.historical_header.state.partial.note_hash_tree] -root = "0x00893d1239f1319771e840ed89e26356efb7a175b5d14215f16d2f3f73b61de0" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000240" +root = "0x1d2a0372ac57ea0f5e4878ef40b3876d986df26d9039093d56426b8d05c1aa95" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000180" [previous_kernel_public_inputs.constants.historical_header.state.partial.nullifier_tree] -root = "0x0cf60cbdd1d63166e082dafba02571914ee2e2b63f16a0088f4bc35f9141063f" -next_available_leaf_index = "0x00000000000000000000000000000000000000000000000000000000000002c0" +root = "0x300782ca3597643e3bd4ef7c4122e409019f3e970a5e27cac7511d3bceca71b4" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000200" [previous_kernel_public_inputs.constants.historical_header.state.partial.public_data_tree] -root = "0x21adba011a03e24b92611d690dcc4d6b77d39beddf5d2ec763554cc2e96d8b87" -next_available_leaf_index = "0x000000000000000000000000000000000000000000000000000000000000009a" +root = "0x17043d2abd1baca090b8b982811b5e202356adbc5d2b1e262c33c7846acf08dd" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000099" - [previous_kernel_public_inputs.constants.historical_header.global_variables] - chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" - version = "0x0000000000000000000000000000000000000000000000000000000000000001" - block_number = "0x0000000000000000000000000000000000000000000000000000000000000008" - slot_number = "0x0000000000000000000000000000000000000000000000000000000000000022" - timestamp = "0x0000000000000000000000000000000000000000000000000000000067aa83d7" +[previous_kernel_public_inputs.constants.historical_header.global_variables] +chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" +version = "0x0000000000000000000000000000000000000000000000000000000000000001" +block_number = "0x0000000000000000000000000000000000000000000000000000000000000005" +slot_number = "0x0000000000000000000000000000000000000000000000000000000000000008" +timestamp = "0x0000000000000000000000000000000000000000000000000000000067af1dda" - [previous_kernel_public_inputs.constants.historical_header.global_variables.coinbase] - inner = "0x000000000000000000000000510b7559c009aa23c667441544126add2fded29c" +[previous_kernel_public_inputs.constants.historical_header.global_variables.coinbase] +inner = "0x00000000000000000000000036878ef7e244777d78d353a8a91073f7f9f4b9d2" - [previous_kernel_public_inputs.constants.historical_header.global_variables.fee_recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.constants.historical_header.global_variables.fee_recipient] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.constants.historical_header.global_variables.gas_fees] - fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9bd267fa" +[previous_kernel_public_inputs.constants.historical_header.global_variables.gas_fees] +fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" +fee_per_l2_gas = "0x00000000000000000000000000000000000000000000000000000000008c90ec" - [previous_kernel_public_inputs.constants.tx_context] - chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" - version = "0x0000000000000000000000000000000000000000000000000000000000000001" +[previous_kernel_public_inputs.constants.tx_context] +chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" +version = "0x0000000000000000000000000000000000000000000000000000000000000001" [previous_kernel_public_inputs.constants.tx_context.gas_settings.gas_limits] da_gas = "0x000000000000000000000000000000000000000000000000000000003b9aca00" @@ -227,23 +227,23 @@ l2_gas = "0x00000000000000000000000000000000000000000000000000000000005b8d80" [previous_kernel_public_inputs.constants.tx_context.gas_settings.max_fees_per_gas] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" -fee_per_l2_gas = "0x00000000000000000000000000000000000000000000000000000012e9bb9bf7" +fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000000186c3f" [previous_kernel_public_inputs.constants.tx_context.gas_settings.max_priority_fees_per_gas] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.for_rollup.max_block_number._opt] -_is_some = false -_value = "0x0000000000000000000000000000000000000000000000000000000000000000" +_is_some = true +_value = "0x0000000000000000000000000000000000000000000000000000000000000e15" [[previous_kernel_public_inputs.validation_requests.note_hash_read_requests]] [previous_kernel_public_inputs.validation_requests.note_hash_read_requests.read_request] -value = "0x0c47e69105b67dbd03e93f15fe5df88c538b68152d54ebe3bf44d35a538b9d36" +value = "0x19a0c6005860f89e0e94e26f514bc2952e7f1ba490521fadffc8ea72be85f837" counter = "0x0000000000000000000000000000000000000000000000000000000000000002" [previous_kernel_public_inputs.validation_requests.note_hash_read_requests.contract_address] -inner = "0x261174ae4897ef34adb44dc66d962b6780504d1b1067c0b61e54e80de220d2d0" +inner = "0x30115c80b13c0a42019f2e58b75086cf4053674b689df29e2c9581447f32cf2f" [[previous_kernel_public_inputs.validation_requests.note_hash_read_requests]] [previous_kernel_public_inputs.validation_requests.note_hash_read_requests.read_request] @@ -1265,13 +1265,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1280,13 +1280,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1295,13 +1295,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1310,13 +1310,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1325,13 +1325,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1340,13 +1340,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1355,13 +1355,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1370,13 +1370,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1385,13 +1385,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1400,13 +1400,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1415,13 +1415,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1430,13 +1430,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1445,13 +1445,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1460,13 +1460,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1475,13 +1475,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1490,13 +1490,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1505,13 +1505,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1520,13 +1520,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1535,13 +1535,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1550,13 +1550,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1565,13 +1565,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1580,13 +1580,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1595,13 +1595,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1610,13 +1610,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1625,13 +1625,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1640,13 +1640,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1655,13 +1655,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1670,13 +1670,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1685,13 +1685,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1700,13 +1700,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1715,13 +1715,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1730,13 +1730,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1745,13 +1745,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1760,13 +1760,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1775,13 +1775,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1790,13 +1790,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1805,13 +1805,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1820,13 +1820,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1835,13 +1835,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1850,13 +1850,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1865,13 +1865,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1880,13 +1880,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1895,13 +1895,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1910,13 +1910,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1925,13 +1925,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1940,13 +1940,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1955,13 +1955,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1970,13 +1970,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1985,13 +1985,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -2000,13 +2000,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -2015,13 +2015,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -2030,13 +2030,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -2045,13 +2045,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -2060,13 +2060,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -2075,13 +2075,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -2090,13 +2090,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -2105,13 +2105,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -2120,13 +2120,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -2135,13 +2135,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -2150,13 +2150,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -2165,13 +2165,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -2180,13 +2180,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -2195,13 +2195,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -2210,13 +2210,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -2739,7 +2739,7 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.nullifiers]] [previous_kernel_public_inputs.end.nullifiers.nullifier] -value = "0x25f17738bb49817d35b62766c4029c7358c66663cf81eb2fc79e99eb98adc9c0" +value = "0x0e4066147fc8ac2b969caa4493d06966719c626262227398154eefd146a6b8bd" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -3318,8 +3318,8 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" content = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.l2_to_l1_msgs.message.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.l2_to_l1_msgs.message.recipient] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.l2_to_l1_msgs.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -3329,8 +3329,8 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" content = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.l2_to_l1_msgs.message.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.l2_to_l1_msgs.message.recipient] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.l2_to_l1_msgs.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -3340,8 +3340,8 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" content = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.l2_to_l1_msgs.message.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.l2_to_l1_msgs.message.recipient] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.l2_to_l1_msgs.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -3351,8 +3351,8 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" content = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.l2_to_l1_msgs.message.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.l2_to_l1_msgs.message.recipient] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.l2_to_l1_msgs.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -3362,8 +3362,8 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" content = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.l2_to_l1_msgs.message.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.l2_to_l1_msgs.message.recipient] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.l2_to_l1_msgs.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -3373,8 +3373,8 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" content = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.l2_to_l1_msgs.message.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.l2_to_l1_msgs.message.recipient] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.l2_to_l1_msgs.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -3384,8 +3384,8 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" content = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.l2_to_l1_msgs.message.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.l2_to_l1_msgs.message.recipient] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.l2_to_l1_msgs.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -3395,8 +3395,8 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" content = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.l2_to_l1_msgs.message.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.l2_to_l1_msgs.message.recipient] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.l2_to_l1_msgs.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -3406,8 +3406,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -3425,7 +3426,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -3436,8 +3436,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -3455,7 +3456,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -3466,8 +3466,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -3485,7 +3486,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -3496,8 +3496,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -3515,7 +3516,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -3526,8 +3526,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -3545,7 +3546,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -3556,8 +3556,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -3575,7 +3576,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -3586,8 +3586,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -3605,7 +3606,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -3616,8 +3616,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -3635,7 +3636,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -3646,8 +3646,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -3665,7 +3666,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -3676,8 +3676,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -3695,7 +3696,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -3706,8 +3706,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -3725,7 +3726,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -3736,8 +3736,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -3755,7 +3756,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -3766,8 +3766,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -3785,7 +3786,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -3796,8 +3796,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -3815,7 +3816,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -3826,8 +3826,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -3845,7 +3846,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -3856,8 +3856,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -3875,7 +3876,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -3886,8 +3886,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -3905,7 +3906,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -3916,8 +3916,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -3935,7 +3936,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -3946,8 +3946,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -3965,7 +3966,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -3976,8 +3976,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -3995,7 +3996,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -4006,8 +4006,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -4025,7 +4026,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -4036,8 +4036,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -4055,7 +4056,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -4066,8 +4066,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -4085,7 +4086,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -4096,8 +4096,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -4115,7 +4116,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -4126,8 +4126,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -4145,7 +4146,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -4156,8 +4156,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -4175,7 +4176,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -4186,8 +4186,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -4205,7 +4206,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -4216,8 +4216,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -4235,7 +4236,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -4246,8 +4246,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -4265,7 +4266,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -4276,8 +4276,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -4295,7 +4296,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -4306,8 +4306,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -4325,7 +4326,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -4336,8 +4336,9 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_logs.inner.log] - fields = [ +[previous_kernel_public_inputs.end.private_logs.inner.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -4355,7 +4356,6 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -4373,532 +4373,532 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.private_call_stack]] -args_hash = "0x1cac5c4f1f80be5521468340086ab60a9aa24629d06fbc3575bdbb8397371f94" +args_hash = "0x2520065232ac85d18f98e0987076f68dbbd2660f8f5b8c50ac0408fdd014d6d8" returns_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" start_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000003" end_side_effect_counter = "0x000000000000000000000000000000000000000000000000000000000000000c" - [previous_kernel_public_inputs.end.private_call_stack.call_context] - is_static_call = false +[previous_kernel_public_inputs.end.private_call_stack.call_context] +is_static_call = false - [previous_kernel_public_inputs.end.private_call_stack.call_context.msg_sender] - inner = "0x261174ae4897ef34adb44dc66d962b6780504d1b1067c0b61e54e80de220d2d0" +[previous_kernel_public_inputs.end.private_call_stack.call_context.msg_sender] +inner = "0x30115c80b13c0a42019f2e58b75086cf4053674b689df29e2c9581447f32cf2f" - [previous_kernel_public_inputs.end.private_call_stack.call_context.contract_address] - inner = "0x27581b7f11d6e97d5aa29a88c9d06d5fd073e619af7da445d51619956fde6c68" +[previous_kernel_public_inputs.end.private_call_stack.call_context.contract_address] +inner = "0x063951d8a111a809db4098fe0146d185698cb0651ea8953607998767eae4617c" - [previous_kernel_public_inputs.end.private_call_stack.call_context.function_selector] - inner = "0x000000000000000000000000000000000000000000000000000000000c508454" +[previous_kernel_public_inputs.end.private_call_stack.call_context.function_selector] +inner = "0x000000000000000000000000000000000000000000000000000000000c508454" [[previous_kernel_public_inputs.end.private_call_stack]] args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -4906,17 +4906,17 @@ returns_hash = "0x00000000000000000000000000000000000000000000000000000000000000 start_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" end_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_call_stack.call_context] - is_static_call = false +[previous_kernel_public_inputs.end.private_call_stack.call_context] +is_static_call = false - [previous_kernel_public_inputs.end.private_call_stack.call_context.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.private_call_stack.call_context.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_call_stack.call_context.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.private_call_stack.call_context.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_call_stack.call_context.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.private_call_stack.call_context.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.private_call_stack]] args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -4924,17 +4924,17 @@ returns_hash = "0x00000000000000000000000000000000000000000000000000000000000000 start_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" end_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_call_stack.call_context] - is_static_call = false +[previous_kernel_public_inputs.end.private_call_stack.call_context] +is_static_call = false - [previous_kernel_public_inputs.end.private_call_stack.call_context.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.private_call_stack.call_context.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_call_stack.call_context.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.private_call_stack.call_context.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_call_stack.call_context.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.private_call_stack.call_context.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.private_call_stack]] args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -4942,17 +4942,17 @@ returns_hash = "0x00000000000000000000000000000000000000000000000000000000000000 start_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" end_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_call_stack.call_context] - is_static_call = false +[previous_kernel_public_inputs.end.private_call_stack.call_context] +is_static_call = false - [previous_kernel_public_inputs.end.private_call_stack.call_context.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.private_call_stack.call_context.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_call_stack.call_context.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.private_call_stack.call_context.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_call_stack.call_context.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.private_call_stack.call_context.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.private_call_stack]] args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -4960,17 +4960,17 @@ returns_hash = "0x00000000000000000000000000000000000000000000000000000000000000 start_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" end_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_call_stack.call_context] - is_static_call = false +[previous_kernel_public_inputs.end.private_call_stack.call_context] +is_static_call = false - [previous_kernel_public_inputs.end.private_call_stack.call_context.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.private_call_stack.call_context.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_call_stack.call_context.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.private_call_stack.call_context.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_call_stack.call_context.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.private_call_stack.call_context.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.private_call_stack]] args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -4978,17 +4978,17 @@ returns_hash = "0x00000000000000000000000000000000000000000000000000000000000000 start_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" end_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_call_stack.call_context] - is_static_call = false +[previous_kernel_public_inputs.end.private_call_stack.call_context] +is_static_call = false - [previous_kernel_public_inputs.end.private_call_stack.call_context.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.private_call_stack.call_context.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_call_stack.call_context.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.private_call_stack.call_context.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_call_stack.call_context.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.private_call_stack.call_context.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.private_call_stack]] args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -4996,17 +4996,17 @@ returns_hash = "0x00000000000000000000000000000000000000000000000000000000000000 start_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" end_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_call_stack.call_context] - is_static_call = false +[previous_kernel_public_inputs.end.private_call_stack.call_context] +is_static_call = false - [previous_kernel_public_inputs.end.private_call_stack.call_context.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.private_call_stack.call_context.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_call_stack.call_context.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.private_call_stack.call_context.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_call_stack.call_context.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.private_call_stack.call_context.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.private_call_stack]] args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -5014,41 +5014,36 @@ returns_hash = "0x00000000000000000000000000000000000000000000000000000000000000 start_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" end_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_call_stack.call_context] - is_static_call = false +[previous_kernel_public_inputs.end.private_call_stack.call_context] +is_static_call = false - [previous_kernel_public_inputs.end.private_call_stack.call_context.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.private_call_stack.call_context.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_call_stack.call_context.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.private_call_stack.call_context.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.end.private_call_stack.call_context.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [previous_kernel_public_inputs.public_teardown_call_request] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.end.private_call_stack.call_context.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.public_teardown_call_request.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.public_teardown_call_request] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.public_teardown_call_request.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.public_teardown_call_request.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.public_teardown_call_request.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.public_teardown_call_request.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [previous_kernel_public_inputs.fee_payer] - inner = "0x0739aa78c2b89115fa6a6f888f6afeadbce0e2ec3196b098ab8b1d864da54252" +[previous_kernel_public_inputs.public_teardown_call_request.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" -[private_call] -contract_class_artifact_hash = "0x2afacaaea7c332e3c765b32d69e4e0b98c1a89151372048ff76aa250ff302645" -contract_class_public_bytecode_commitment = "0x1d991be1124ab8654b93432ca1c6345e2dd272d018b57f9355b90e75b8e691ba" -acir_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[previous_kernel_public_inputs.fee_payer] +inner = "0x0739aa78c2b89115fa6a6f888f6afeadbce0e2ec3196b098ab8b1d864da54252" - [private_call.vk] - key = [ +[private_call.vk] +key = [ "0x0000000000000000000000000000000000000000000000000000000000100000", "0x0000000000000000000000000000000000000000000000000000000000000010", "0x00000000000000000000000000000000000000000000000000000000000328b1", @@ -5072,30 +5067,30 @@ acir_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000000000ba17c246b3c6daca90edb0c9ce41c111da", - "0x000000000000000000000000000000000008cee1e4bf6a75a00437d71577496b", - "0x000000000000000000000000000000f09480d76662107c123881d6b90fb512a2", - "0x000000000000000000000000000000000003fbd9cbd151ae4101fc070fc18e9d", - "0x0000000000000000000000000000000304eccc6b1a39c66cdf1fa0a59f22448e", - "0x000000000000000000000000000000000011bf15ce7adbc3b63127ac28664011", - "0x00000000000000000000000000000012e5d2e1a8dc5ac7dff8215dd13a5e2709", - "0x00000000000000000000000000000000002f28afcb501fd28f4abd1bbb1444eb", - "0x000000000000000000000000000000d3d5c80d5dcb852524cc5ffd828ab1ed63", - "0x000000000000000000000000000000000014cd140237dc4b1f933f278c5d92db", - "0x000000000000000000000000000000601e3021acb959cc4d9b5dde91cc70b543", - "0x00000000000000000000000000000000001c64290aadfaac3a0d277cfdd8c4c0", - "0x000000000000000000000000000000155c05b4114764261c6f7d2059b28357a0", - "0x0000000000000000000000000000000000138870f9d38994a12e44e43ce580a4", - "0x000000000000000000000000000000c72db81b6ca89afa144d921df87de656dc", - "0x000000000000000000000000000000000013c4546a63b009286df117ce76f2a0", - "0x000000000000000000000000000000a32b8e8b55f7d95c945f9118a7fac61b68", - "0x0000000000000000000000000000000000161441f405c774e696eabe792a7586", - "0x00000000000000000000000000000038d3d6cb581fe64ae791587b602a4faa73", - "0x0000000000000000000000000000000000292e29ef496f338bed5ff6dcbaa065", - "0x000000000000000000000000000000350e6ad9be45ffdd7b78c4fc9c034604d5", - "0x00000000000000000000000000000000000d80d89c7f09837129f90bf7dc0895", - "0x000000000000000000000000000000b3580f0ad362117183fb5a59ece9f2bb10", - "0x00000000000000000000000000000000001e92536aa2e57ef09a922e091fcbc5", + "0x000000000000000000000000000000d0f24ae07c53979f027820c5903918279b", + "0x00000000000000000000000000000000002112c3cb02fa2655d1d0bfa01ff2fd", + "0x0000000000000000000000000000007821427795740bab1af6afe68afeaf8745", + "0x000000000000000000000000000000000021bd496e0fd85a7685f6749e0e2f40", + "0x0000000000000000000000000000009f77f46b2952c974bf95623c8ae4cbedd5", + "0x000000000000000000000000000000000018715a70fa33ec70ca2971068ba9d2", + "0x000000000000000000000000000000b34dc548042f2e9974aaa4d684abce8a14", + "0x000000000000000000000000000000000017d64063a82e93fa034b9e7281bb68", + "0x0000000000000000000000000000003459b9ecab885b34debed4d111bf29c160", + "0x000000000000000000000000000000000005d1a7fb656242aa4c47b9a721874d", + "0x000000000000000000000000000000e6dd04a25cc6cde4168816df5f4bdce5a7", + "0x00000000000000000000000000000000002ae349869c6bd96dce738583185c65", + "0x000000000000000000000000000000a294a2403c1f6aa211e4e558e34932eccd", + "0x00000000000000000000000000000000000320d37f9fa7753ccbe3d8a16157ea", + "0x0000000000000000000000000000002f674a1948abf2fe832219907cdd0091ca", + "0x00000000000000000000000000000000002c598b0b681a3682d85fd6bb5bd5d5", + "0x000000000000000000000000000000d821114ad5c9c439b68b1ceafeb3f8f4c4", + "0x00000000000000000000000000000000002c7d23b4cb68a41adf72846337da1d", + "0x000000000000000000000000000000d6e20dee3a7c7b9574ef85ce18befe83e3", + "0x000000000000000000000000000000000011ff03a9e7a9635294b048b53c2ab8", + "0x0000000000000000000000000000001231ce534a849e081803d20a9a73031857", + "0x00000000000000000000000000000000000aa9f9bb1cfc41d723bbb16bd742d7", + "0x0000000000000000000000000000006a08d056c9ebe2cc03a3fb5691f39c14a3", + "0x00000000000000000000000000000000002756f7e3b1eb8acfe17f77e0a7632e", "0x000000000000000000000000000000552393d09533e1b2004bd84e9f8a53a88f", "0x00000000000000000000000000000000000456bb701b5b0b463bbcf0c4fe7190", "0x00000000000000000000000000000074156481e9a3f8f091d30db1003a6daab4", @@ -5104,22 +5099,22 @@ acir_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000298c3311fc9170f92de940b042aab9", "0x000000000000000000000000000000bf37537eb196b05c1d98fa51016a9bacbb", "0x000000000000000000000000000000000007b05f408a612847259016b9204ae4", - "0x000000000000000000000000000000939bf1a5b7809d8b01f3644d25320c1057", - "0x00000000000000000000000000000000000bb9c327c5c46150d6a9f881da3f97", - "0x000000000000000000000000000000373deb6abda4cbd0aeb599f5e2cbc8c7d0", - "0x000000000000000000000000000000000008853658bb9a976b9c5759f6e4a7a7", + "0x000000000000000000000000000000906e430726fd837b3ff6c1bc1a03c37ab0", + "0x00000000000000000000000000000000000ca88a6b594f166075a7f1fe5ed69c", + "0x0000000000000000000000000000004740870a401f788841b3ca80ffdcd768bf", + "0x000000000000000000000000000000000012eff68d219e805e7ac7f191d545b9", "0x000000000000000000000000000000c0dde24b40843332cba16e5819b70252e8", "0x000000000000000000000000000000000028d8801d55f465e503ea406c01aba5", "0x000000000000000000000000000000948b3a2c03a15b1cefaf61a304e4a719da", "0x000000000000000000000000000000000003b7cfd2b82a92094655eebf43f587", - "0x00000000000000000000000000000027e9ad698de14515bc8d1b6cae9fbad57f", - "0x00000000000000000000000000000000001c0a8b31ac9b62bed2b663095c7c6d", - "0x00000000000000000000000000000032be17a5c7ec6f478466d2a20658a26691", - "0x00000000000000000000000000000000000ad876deed75f59e602b4310acca72", - "0x000000000000000000000000000000823ca734148f958a26e328b3f7742ea48c", - "0x00000000000000000000000000000000000327674919840515cc9adc69a08fca", - "0x0000000000000000000000000000003b11524c9317fca9485e116204c763b8b4", - "0x00000000000000000000000000000000001bfe8c3873c37bf972dcc81e0f31f9", + "0x00000000000000000000000000000051a87cef6fc1fc139c638070eeb6332e56", + "0x00000000000000000000000000000000002f54bb0062b7d1188f56014b559e12", + "0x0000000000000000000000000000008b54df63e7e28a33d41f9da53348df041e", + "0x000000000000000000000000000000000012e92e36a0c7a2bcdf5fc5556a4359", + "0x0000000000000000000000000000001391e66608c470664e43f3848126ec8275", + "0x00000000000000000000000000000000002b0ed41e83d59c4dab3ba4112a9ece", + "0x0000000000000000000000000000000b199fe9bb72fbf94f3a16c3e451fe6cf4", + "0x00000000000000000000000000000000001aeef4d3ecfa86b4c40343ea7f7eff", "0x0000000000000000000000000000002ac5cca6118d139ec7f25a9b76a5ddcafe", "0x0000000000000000000000000000000000234c4d5c9182f86728981254d9b542", "0x00000000000000000000000000000073e9bec3d89f0a089185e5c495abc03f49", @@ -5128,38 +5123,38 @@ acir_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000080352ea8b7367481b2706ade1e8dd", "0x0000000000000000000000000000000fb762794564a807d2fe4f1796aeb91374", "0x00000000000000000000000000000000002fb18b04275219efb2d8b9993ac5a4", - "0x000000000000000000000000000000de088cc8c0527b80157b779e36b5584684", - "0x00000000000000000000000000000000002b2479dba4b8536cad4536a76772eb", - "0x00000000000000000000000000000088f079ceae5b612632d0f90ff9870eb518", - "0x000000000000000000000000000000000012dc0d37f799f65987161df01f2725", - "0x00000000000000000000000000000035dbe3c0ad6adec423daf4f4d006fc2107", - "0x000000000000000000000000000000000013be267471ce48c6fc419ed2c4f448", - "0x00000000000000000000000000000058f3c8b2d3fa8d27c7e9d00a30ab43cc10", - "0x0000000000000000000000000000000000013c74cd0d5d7b5b5d5c9efe463700", - "0x000000000000000000000000000000cc57f7a6fd16721223c06423fe824d808b", - "0x00000000000000000000000000000000002b7ed029a6fd2bb3aea57c910f4ce5", - "0x000000000000000000000000000000e160b523de9603e839cde7f13fa3b33f01", - "0x000000000000000000000000000000000026d602349ce611d3a0a13e99ff39f1", - "0x0000000000000000000000000000009a937ef599676d703f16e420f8ff58bf67", - "0x00000000000000000000000000000000000953bb1e7b32d830c5287273593692", - "0x000000000000000000000000000000ec2a55268e5541e16ef75936b7ef712da4", - "0x00000000000000000000000000000000002fb62718859b835874d34b239520a6", - "0x000000000000000000000000000000f0e554bf0a57474980d6587c90240108df", - "0x00000000000000000000000000000000001b59c63da545cf00a79032128aad3b", - "0x000000000000000000000000000000a96e68b12d0a7e2b6f8ce543e2bb429461", - "0x00000000000000000000000000000000000a7bc231143365bea08a875a15ae48", - "0x00000000000000000000000000000041faf11f15be8c711e2d6788919ca8a678", - "0x00000000000000000000000000000000001765e8b8b608510cac4df5441fee72", - "0x00000000000000000000000000000080166245f4c87e53148ccee1e5b9df2e64", - "0x000000000000000000000000000000000009580fbf9ea8ea3f770c1319f80570", - "0x000000000000000000000000000000a29e551e64e61881d2ab207e14e541fa97", - "0x00000000000000000000000000000000002e5d31bfdd37c018b0b3044580e4b3", - "0x0000000000000000000000000000007bf40e2a38bcfcea5c03729bb156a3e737", - "0x00000000000000000000000000000000000d5cb0eea228961fe7367c81bea0f7", - "0x0000000000000000000000000000007b6209c1a43ffce20c3fac25735bf423bc", - "0x00000000000000000000000000000000000d03c063cb3753b1fd740dc307ef61", - "0x00000000000000000000000000000067acda10350e2f21b2cf23eb60638577ae", - "0x00000000000000000000000000000000000324b34c98af03b9a5a00231efa4b8", + "0x000000000000000000000000000000fa3689d35598b509dcb3a63858af8b6b75", + "0x0000000000000000000000000000000000117f98fde596f79a6fc5e1a7e26b78", + "0x000000000000000000000000000000c64c8c3286028eed0b1534927795a4cf68", + "0x00000000000000000000000000000000002440da69173bad9683ef9780a9d308", + "0x00000000000000000000000000000058f67ee114d27a4af6803ba8767d9c9185", + "0x00000000000000000000000000000000002d711988a56d31e63010bb81d030b2", + "0x00000000000000000000000000000081cafd0f66b27324bf2524ae3376522d32", + "0x000000000000000000000000000000000003a58f4dd50c2781847dd40fe700df", + "0x000000000000000000000000000000a953038a5c7322b8440190a6607e048a47", + "0x000000000000000000000000000000000009284b2c60eebb72a0ac0bcae3137f", + "0x0000000000000000000000000000000b194a39973f99250da852bdf114473da4", + "0x000000000000000000000000000000000006bbc63a17d4aca00e957a429a03fe", + "0x000000000000000000000000000000864db770a1c2050f329eed2d0392e4b18d", + "0x000000000000000000000000000000000005490606160acf8ac289fbd9dbcd3e", + "0x000000000000000000000000000000d5b29ff745dc7cf20daafd55b96896ac18", + "0x000000000000000000000000000000000004557daa92f73b7caaf5deb669f4c9", + "0x00000000000000000000000000000043ab8e610f59cf41e51755ac9177ffcdb2", + "0x00000000000000000000000000000000002a2b06e9ab1a4b0b4edcac4ced4999", + "0x000000000000000000000000000000a37c820d58b93dea04b7db51246afa4c01", + "0x000000000000000000000000000000000002dd4a039f385a9d76743206392180", + "0x0000000000000000000000000000000376bb6a3c6d5a70189a3de72865b508fe", + "0x00000000000000000000000000000000001e1873e31e4f19ebb9bdc02f5e63f4", + "0x000000000000000000000000000000f42cb662ce1d9a375168466de4cacd8470", + "0x00000000000000000000000000000000001fdcef2639c5711deea57ce27c27a6", + "0x00000000000000000000000000000018eb9219d75b46784413005e6652a9e1a4", + "0x00000000000000000000000000000000000236df738b5369ac3da26f88355e40", + "0x0000000000000000000000000000006dc25bae2fa73d6d336f7389e3ad2a2c0b", + "0x000000000000000000000000000000000002112fa771e9c5b4f240ad4a5fe50c", + "0x0000000000000000000000000000003a84d79e3a23b251b8c319bc7194e1d33e", + "0x00000000000000000000000000000000001ef1c16b5b8d51a3f12102926beaa0", + "0x0000000000000000000000000000004a255e99c101800790a99f3559ce94f61f", + "0x000000000000000000000000000000000021cf62234fb2b8032e58d8210913b3", "0x000000000000000000000000000000f6f4596202301b6ae4eb0ebbeadd203340", "0x00000000000000000000000000000000000adc89c48d75b571636f5bbeb4a806", "0x00000000000000000000000000000000034e3e27454ef992b4bf84b97baa7471", @@ -5191,57 +5186,121 @@ acir_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x000000000000000000000000000000e55ba19751adfe6c36324d3fb6c2da0989", "0x00000000000000000000000000000000001d58aa61c64ad522043d79c4802219", "0x00000000000000000000000000000078f4b3bc61f19d6e7069359bbf47e7f907", - "0x00000000000000000000000000000000002d7c18a93c3dae58809faaeec6a86a" + "0x00000000000000000000000000000000002d7c18a93c3dae58809faaeec6a86a", +] +hash = "0x0337c5e1d7a9a57f891f48697f1d75676c63c8a5b1a959f832c3e8a03c2ff296" + +[private_call.verification_key_hints] +contract_class_artifact_hash = "0x234cbdd26e9d0372ebd5959a1ae9214ccb91cafdf43cc8eac8f9b79a15086724" +contract_class_public_bytecode_commitment = "0x14adc8906401b8fd9ba1f0067ba676be8df5be5b1d1b78d0d0899a3956df3614" +acir_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +updated_class_id_value_change = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", +] +updated_class_id_delay_change = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", ] - hash = "0x1f136008f15076069fefca2d3d5aef5cf09266b34ac5a0d5aa1f2bb3db3d5f83" - - [private_call.function_leaf_membership_witness] - leaf_index = "1" - sibling_path = [ - "0x1ad6f5048722d3b1d70eb9fc3134002fd74631a10f404b3b88a11fbea98b8c81", - "0x1cd3f5bd4a2737ce75dc0909b13078f90df57ba65c204ad9dec43a7d453a4946", - "0x0775cab0d259e9759af58a730f46a8edc0ef0d8c5cb42a7e591893f79b2574bf", - "0x3012fd3ea84e29e5ab0c6c4ddc1a5654faeb5ff9a4970babc8e01f48cbb4862a", - "0x2a6595890719fef7967c209488728aa5342438ba52058a3c770202f55acf6854" + +[private_call.verification_key_hints.function_leaf_membership_witness] +leaf_index = "1" +sibling_path = [ + "0x0b3dd7d35874a303322a7bfb26a405cdfd25804f6c4bf48ed07f3f0926666ba6", + "0x10e71c29a7228b6a531777eafad44bab7a63890182136839cef8da0f1d4ac51d", + "0x0080f9ed155b11f47b5b0814def786ee04ce4c3420c8a53fcef96e0df0f78ccb", + "0x1f7faf1f3812a77569a0e23b73514987157bdd5473793f32b57d955e44447041", + "0x2a6595890719fef7967c209488728aa5342438ba52058a3c770202f55acf6854", ] -[private_call.public_keys.npk_m.inner] +[private_call.verification_key_hints.public_keys.npk_m.inner] x = "0x01498945581e0eb9f8427ad6021184c700ef091d570892c437d12c7d90364bbd" y = "0x170ae506787c5c43d6ca9255d571c10fa9ffa9d141666e290c347c5c9ab7e344" is_infinite = false -[private_call.public_keys.ivpk_m.inner] +[private_call.verification_key_hints.public_keys.ivpk_m.inner] x = "0x00c044b05b6ca83b9c2dbae79cc1135155956a64e136819136e9947fe5e5866c" y = "0x1c1f0ca244c7cd46b682552bff8ae77dea40b966a71de076ec3b7678f2bdb151" is_infinite = false -[private_call.public_keys.ovpk_m.inner] +[private_call.verification_key_hints.public_keys.ovpk_m.inner] x = "0x1b00316144359e9a3ec8e49c1cdb7eeb0cedd190dfd9dc90eea5115aa779e287" y = "0x080ffc74d7a8b0bccb88ac11f45874172f3847eb8b92654aaa58a3d2b8dc7833" is_infinite = false -[private_call.public_keys.tpk_m.inner] +[private_call.verification_key_hints.public_keys.tpk_m.inner] x = "0x019c111f36ad3fc1d9b7a7a14344314d2864b94f030594cd67f753ef774a1efb" y = "0x2039907fe37f08d10739255141bb066c506a12f7d1e8dfec21abc58494705b6f" is_infinite = false - [private_call.salted_initialization_hash] - inner = "0x0477be87dc567110841df2d0210e046e53001ef02159517957ec8196d77b2064" +[private_call.verification_key_hints.salted_initialization_hash] +inner = "0x2672ed90573d225cfe01a8935d569c6169b914b25e9e506673ccf3eb8020bfb0" + +[private_call.verification_key_hints.protocol_contract_membership_witness] +leaf_index = "0" +sibling_path = [ + "0x0bd3713aaea61ed2f388dbb57c38360b7e08e9010d50a6ac13d71c4feb6d2606", + "0x09476730cfc400f7d59f19ec32ad204ff272d7d99250b1de3870e1ca13533861", + "0x2213e581b96f63758b3fc7fea45eccc574f2e95648ac68c27d2865906bf389c0", +] - [private_call.protocol_contract_membership_witness] - leaf_index = "4" - sibling_path = [ - "0x0a023db51e9a9cb41b0be9faf146bb5094ba54e357af710364633a00ea424d2e", - "0x11efc1ff409140e05eca73a2df30bfbdae0130b92a6ed2f7d7e1a61eb23d3e6d", - "0x0bc88163a1fe70904187f6352ec107398d353293f0e0010f4c615871d679da6a" +[private_call.verification_key_hints.protocol_contract_leaf] +address = "0x0000000000000000000000000000000000000000000000000000000000000000" +next_address = "0x1281e0c1842212e79fa2249877524dda4f07f3d42cb502097302737bd3177550" + +[private_call.verification_key_hints.updated_class_id_witness] +leaf_index = "132" +sibling_path = [ + "0x1d00b43e9f9f13cd82a5dda3505061d9cc16f04d90ffcbf6fd21abd35184b1b7", + "0x044757d7dadb7e58940c63a8e3511266a15798b0ec4252f3bbb6f5985d011c99", + "0x182f25010964870ea1d1cbcfc242f39ce8d22d7f596452c5a5e76400fc440f9c", + "0x1f5d28afdbfc3602b110144ffbca3c7e23117e3f117632f38dc0857cfa8ce9f6", + "0x196ca6ed61b8f48c8ad8df44a8a72ac71343352adc8d654037439d851965344d", + "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", + "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", + "0x1403ea8e9dceb886c909e93a8405e12e5e4f3ba06d85939ffb951672b5c3ea83", + "0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1", + "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", + "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", + "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", + "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", + "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", + "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", + "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", + "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", + "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", + "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", + "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", + "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", + "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", + "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", + "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", + "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", + "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", + "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", + "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", + "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", + "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", + "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", + "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", + "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", + "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", + "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", + "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", + "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", + "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", + "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", + "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6", ] - [private_call.protocol_contract_leaf] - address = "0x237a0bac451ebac796b96dbe27ccfda5230e8c962b391b84b0304c3775e9e0c0" - next_address = "0x2946115660107c3ca9bea1e486452595999c3677e7aaeaa9ca898e0fbba0051a" +[private_call.verification_key_hints.updated_class_id_leaf] +slot = "0x0851971354193cb64142d979aff7b3c49f5dc2212ba36ea68f6e7b0916dd557e" +value = "0x05208323f49682fc3367ed42a0212854a797b5372b0cc6bc5493b00e96ff256d" +next_slot = "0x0aa43f4a7989199d7e7c243a8a55e20d1dc2ad72a9610be7832b69c867c5a236" +next_index = "0x0000000000000000000000000000000000000000000000000000000000000081" [app_public_inputs] -args_hash = "0x1cac5c4f1f80be5521468340086ab60a9aa24629d06fbc3575bdbb8397371f94" +args_hash = "0x2520065232ac85d18f98e0987076f68dbbd2660f8f5b8c50ac0408fdd014d6d8" returns_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" start_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000003" end_side_effect_counter = "0x000000000000000000000000000000000000000000000000000000000000000c" @@ -5252,923 +5311,924 @@ is_fee_payer = false _is_some = false _value = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.call_context] - is_static_call = false +[app_public_inputs.call_context] +is_static_call = false - [app_public_inputs.call_context.msg_sender] - inner = "0x261174ae4897ef34adb44dc66d962b6780504d1b1067c0b61e54e80de220d2d0" +[app_public_inputs.call_context.msg_sender] +inner = "0x30115c80b13c0a42019f2e58b75086cf4053674b689df29e2c9581447f32cf2f" - [app_public_inputs.call_context.contract_address] - inner = "0x27581b7f11d6e97d5aa29a88c9d06d5fd073e619af7da445d51619956fde6c68" +[app_public_inputs.call_context.contract_address] +inner = "0x063951d8a111a809db4098fe0146d185698cb0651ea8953607998767eae4617c" - [app_public_inputs.call_context.function_selector] - inner = "0x000000000000000000000000000000000000000000000000000000000c508454" +[app_public_inputs.call_context.function_selector] +inner = "0x000000000000000000000000000000000000000000000000000000000c508454" - [[app_public_inputs.note_hash_read_requests]] - value = "0x08f8781e274eb24375d79f0c416592d1ab0a2efb7d98de7df34e02b79a6e606c" - counter = "0x0000000000000000000000000000000000000000000000000000000000000005" +[[app_public_inputs.note_hash_read_requests]] +value = "0x2b94b8072109fb51e0fe54f5058cd22bf22b05cb5535ceb48084b734de8aab81" +counter = "0x0000000000000000000000000000000000000000000000000000000000000005" - [[app_public_inputs.note_hash_read_requests]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.note_hash_read_requests]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.note_hash_read_requests]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.note_hash_read_requests]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.note_hash_read_requests]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.note_hash_read_requests]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.note_hash_read_requests]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.note_hash_read_requests]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.note_hash_read_requests]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.note_hash_read_requests]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.note_hash_read_requests]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.note_hash_read_requests]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.note_hash_read_requests]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.note_hash_read_requests]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.note_hash_read_requests]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.note_hash_read_requests]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.note_hash_read_requests]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.note_hash_read_requests]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.note_hash_read_requests]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.note_hash_read_requests]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.note_hash_read_requests]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.note_hash_read_requests]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.note_hash_read_requests]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.note_hash_read_requests]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.note_hash_read_requests]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.note_hash_read_requests]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.note_hash_read_requests]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.note_hash_read_requests]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.note_hash_read_requests]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.note_hash_read_requests]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.nullifier_read_requests]] - value = "0x27581b7f11d6e97d5aa29a88c9d06d5fd073e619af7da445d51619956fde6c68" - counter = "0x0000000000000000000000000000000000000000000000000000000000000004" +[[app_public_inputs.nullifier_read_requests]] +value = "0x063951d8a111a809db4098fe0146d185698cb0651ea8953607998767eae4617c" +counter = "0x0000000000000000000000000000000000000000000000000000000000000004" - [[app_public_inputs.nullifier_read_requests]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.nullifier_read_requests]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.nullifier_read_requests]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.nullifier_read_requests]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.nullifier_read_requests]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.nullifier_read_requests]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.nullifier_read_requests]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.nullifier_read_requests]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.nullifier_read_requests]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.nullifier_read_requests]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.nullifier_read_requests]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.nullifier_read_requests]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.nullifier_read_requests]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.nullifier_read_requests]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.nullifier_read_requests]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.nullifier_read_requests]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.nullifier_read_requests]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.nullifier_read_requests]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.nullifier_read_requests]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.nullifier_read_requests]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.nullifier_read_requests]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.nullifier_read_requests]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.nullifier_read_requests]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.nullifier_read_requests]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.nullifier_read_requests]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.nullifier_read_requests]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.nullifier_read_requests]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.nullifier_read_requests]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.nullifier_read_requests]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.nullifier_read_requests]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.key_validation_requests_and_generators]] - sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000030" +[[app_public_inputs.key_validation_requests_and_generators]] +sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000030" - [app_public_inputs.key_validation_requests_and_generators.request] - sk_app = "0x1d53532e5fda4a97d8a4b38b69a3b49cbc1931494e79f2ad6208f6de19fc2ca7" +[app_public_inputs.key_validation_requests_and_generators.request] +sk_app = "0x273b277af64f264579dfad9ff48f4691853355aa5f09811f5a721ef6faf46f3a" - [app_public_inputs.key_validation_requests_and_generators.request.pk_m] - x = "0x2661813d6be5d3e5bea8100a26875f885511651e75a98a21aff9e9b8becc53c4" - y = "0x1933d05b68e5528f6c8e351e72903e1a3eb0a57cf0d0b6df2804c29c05e313c5" - is_infinite = false +[app_public_inputs.key_validation_requests_and_generators.request.pk_m] +x = "0x0a9b8adfbfa47265264eeec2111506602133932ab717a76524ed17ea41bf9728" +y = "0x051e243411ef5b245a7ea87e21e21ca2a56d7afa54986a97a6c96bb00b7f481a" +is_infinite = false - [[app_public_inputs.key_validation_requests_and_generators]] - sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.key_validation_requests_and_generators]] +sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.key_validation_requests_and_generators.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.key_validation_requests_and_generators.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.key_validation_requests_and_generators.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[app_public_inputs.key_validation_requests_and_generators.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false - [[app_public_inputs.key_validation_requests_and_generators]] - sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.key_validation_requests_and_generators]] +sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.key_validation_requests_and_generators.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.key_validation_requests_and_generators.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.key_validation_requests_and_generators.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[app_public_inputs.key_validation_requests_and_generators.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false - [[app_public_inputs.key_validation_requests_and_generators]] - sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.key_validation_requests_and_generators]] +sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.key_validation_requests_and_generators.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.key_validation_requests_and_generators.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.key_validation_requests_and_generators.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[app_public_inputs.key_validation_requests_and_generators.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false - [[app_public_inputs.key_validation_requests_and_generators]] - sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.key_validation_requests_and_generators]] +sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.key_validation_requests_and_generators.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.key_validation_requests_and_generators.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.key_validation_requests_and_generators.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[app_public_inputs.key_validation_requests_and_generators.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false - [[app_public_inputs.key_validation_requests_and_generators]] - sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.key_validation_requests_and_generators]] +sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.key_validation_requests_and_generators.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.key_validation_requests_and_generators.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.key_validation_requests_and_generators.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[app_public_inputs.key_validation_requests_and_generators.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false - [[app_public_inputs.key_validation_requests_and_generators]] - sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.key_validation_requests_and_generators]] +sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.key_validation_requests_and_generators.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.key_validation_requests_and_generators.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.key_validation_requests_and_generators.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[app_public_inputs.key_validation_requests_and_generators.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false - [[app_public_inputs.key_validation_requests_and_generators]] - sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.key_validation_requests_and_generators]] +sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.key_validation_requests_and_generators.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.key_validation_requests_and_generators.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.key_validation_requests_and_generators.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[app_public_inputs.key_validation_requests_and_generators.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false - [[app_public_inputs.key_validation_requests_and_generators]] - sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.key_validation_requests_and_generators]] +sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.key_validation_requests_and_generators.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.key_validation_requests_and_generators.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.key_validation_requests_and_generators.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[app_public_inputs.key_validation_requests_and_generators.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false - [[app_public_inputs.key_validation_requests_and_generators]] - sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.key_validation_requests_and_generators]] +sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.key_validation_requests_and_generators.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.key_validation_requests_and_generators.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.key_validation_requests_and_generators.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[app_public_inputs.key_validation_requests_and_generators.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false - [[app_public_inputs.key_validation_requests_and_generators]] - sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.key_validation_requests_and_generators]] +sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.key_validation_requests_and_generators.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.key_validation_requests_and_generators.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.key_validation_requests_and_generators.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[app_public_inputs.key_validation_requests_and_generators.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false - [[app_public_inputs.key_validation_requests_and_generators]] - sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.key_validation_requests_and_generators]] +sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.key_validation_requests_and_generators.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.key_validation_requests_and_generators.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.key_validation_requests_and_generators.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[app_public_inputs.key_validation_requests_and_generators.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false - [[app_public_inputs.key_validation_requests_and_generators]] - sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.key_validation_requests_and_generators]] +sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.key_validation_requests_and_generators.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.key_validation_requests_and_generators.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.key_validation_requests_and_generators.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[app_public_inputs.key_validation_requests_and_generators.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false - [[app_public_inputs.key_validation_requests_and_generators]] - sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.key_validation_requests_and_generators]] +sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.key_validation_requests_and_generators.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.key_validation_requests_and_generators.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.key_validation_requests_and_generators.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[app_public_inputs.key_validation_requests_and_generators.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false - [[app_public_inputs.key_validation_requests_and_generators]] - sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.key_validation_requests_and_generators]] +sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.key_validation_requests_and_generators.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.key_validation_requests_and_generators.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.key_validation_requests_and_generators.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[app_public_inputs.key_validation_requests_and_generators.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false - [[app_public_inputs.key_validation_requests_and_generators]] - sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.key_validation_requests_and_generators]] +sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.key_validation_requests_and_generators.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.key_validation_requests_and_generators.request] +sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.key_validation_requests_and_generators.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" - is_infinite = false +[app_public_inputs.key_validation_requests_and_generators.request.pk_m] +x = "0x0000000000000000000000000000000000000000000000000000000000000000" +y = "0x0000000000000000000000000000000000000000000000000000000000000000" +is_infinite = false - [[app_public_inputs.note_hashes]] - value = "0x0d0bcf1778b423fa448569abe884025bdb00003af281644a46dc62a69cb5678e" - counter = "0x0000000000000000000000000000000000000000000000000000000000000007" +[[app_public_inputs.note_hashes]] +value = "0x1aa68efceea6b90ffe07ffdecc4e56a979d2bc87a2a54c5728ec01696e303ade" +counter = "0x0000000000000000000000000000000000000000000000000000000000000007" - [[app_public_inputs.note_hashes]] - value = "0x1112b6e1a435c69a059ee937434a2910ebd291d0577b16351218ed9d55715035" - counter = "0x0000000000000000000000000000000000000000000000000000000000000009" - - [[app_public_inputs.note_hashes]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.note_hashes]] +value = "0x09fc58c805b329996e740fd814d8065bd4a686c4f5ad01a01d9cc5ff75e9a8e2" +counter = "0x0000000000000000000000000000000000000000000000000000000000000009" - [[app_public_inputs.note_hashes]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[app_public_inputs.note_hashes]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[app_public_inputs.note_hashes]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[app_public_inputs.note_hashes]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[app_public_inputs.note_hashes]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[app_public_inputs.note_hashes]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[app_public_inputs.note_hashes]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[app_public_inputs.note_hashes]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[app_public_inputs.note_hashes]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[app_public_inputs.note_hashes]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[app_public_inputs.note_hashes]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[app_public_inputs.note_hashes]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[app_public_inputs.note_hashes]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[app_public_inputs.nullifiers]] - value = "0x1bcf6d2a87ab8a04be01a1a4d580633f8e695b2e39953626dadc56baaa3c9551" - counter = "0x0000000000000000000000000000000000000000000000000000000000000006" - note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[app_public_inputs.nullifiers]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[app_public_inputs.nullifiers]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[app_public_inputs.nullifiers]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[app_public_inputs.nullifiers]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[app_public_inputs.nullifiers]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[app_public_inputs.nullifiers]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[app_public_inputs.nullifiers]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[app_public_inputs.nullifiers]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[app_public_inputs.nullifiers]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[app_public_inputs.nullifiers]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[app_public_inputs.nullifiers]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[app_public_inputs.nullifiers]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[app_public_inputs.nullifiers]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[app_public_inputs.nullifiers]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[app_public_inputs.nullifiers]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.note_hashes]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.private_call_requests]] - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - returns_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - start_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - end_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.note_hashes]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_call_requests.call_context] - is_static_call = false +[[app_public_inputs.note_hashes]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_call_requests.call_context.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.note_hashes]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_call_requests.call_context.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.note_hashes]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_call_requests.call_context.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.note_hashes]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.private_call_requests]] - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - returns_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - start_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - end_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.note_hashes]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_call_requests.call_context] - is_static_call = false +[[app_public_inputs.note_hashes]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_call_requests.call_context.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.note_hashes]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_call_requests.call_context.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.note_hashes]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_call_requests.call_context.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.note_hashes]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.private_call_requests]] - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - returns_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - start_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - end_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.note_hashes]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_call_requests.call_context] - is_static_call = false +[[app_public_inputs.note_hashes]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_call_requests.call_context.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.note_hashes]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_call_requests.call_context.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.nullifiers]] +value = "0x2d30d9abe00b009a54354f50a0fda77ab19ccaaa5889b7542601796d752f5a1c" +counter = "0x0000000000000000000000000000000000000000000000000000000000000006" +note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_call_requests.call_context.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.nullifiers]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.private_call_requests]] - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - returns_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - start_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - end_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.nullifiers]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_call_requests.call_context] - is_static_call = false +[[app_public_inputs.nullifiers]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_call_requests.call_context.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.nullifiers]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_call_requests.call_context.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.nullifiers]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_call_requests.call_context.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.nullifiers]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.private_call_requests]] - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - returns_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - start_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - end_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.nullifiers]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_call_requests.call_context] - is_static_call = false +[[app_public_inputs.nullifiers]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_call_requests.call_context.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.nullifiers]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_call_requests.call_context.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.nullifiers]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_call_requests.call_context.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.nullifiers]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.public_call_requests]] - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.nullifiers]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.nullifiers]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.nullifiers]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.nullifiers]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.private_call_requests]] +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +returns_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +start_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +end_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.public_call_requests]] - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.private_call_requests.call_context] +is_static_call = false - [app_public_inputs.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.private_call_requests.call_context.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.private_call_requests.call_context.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.private_call_requests.call_context.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.private_call_requests]] +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +returns_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +start_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +end_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.public_call_requests]] - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.private_call_requests.call_context] +is_static_call = false - [app_public_inputs.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.private_call_requests.call_context.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.private_call_requests.call_context.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.private_call_requests.call_context.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.private_call_requests]] +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +returns_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +start_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +end_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.public_call_requests]] - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.private_call_requests.call_context] +is_static_call = false - [app_public_inputs.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.private_call_requests.call_context.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.private_call_requests.call_context.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.private_call_requests.call_context.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.private_call_requests]] +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +returns_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +start_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +end_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.public_call_requests]] - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.private_call_requests.call_context] +is_static_call = false - [app_public_inputs.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.private_call_requests.call_context.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.private_call_requests.call_context.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.private_call_requests.call_context.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.private_call_requests]] +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +returns_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +start_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +end_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.public_call_requests]] - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.private_call_requests.call_context] +is_static_call = false - [app_public_inputs.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.private_call_requests.call_context.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.private_call_requests.call_context.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.private_call_requests.call_context.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.public_call_requests]] +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.public_call_requests]] - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.public_call_requests]] +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.public_call_requests]] - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.public_call_requests]] +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.public_call_requests]] - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.public_call_requests]] +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.public_call_requests]] - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.public_call_requests]] +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.public_call_requests]] - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.public_call_requests]] +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.public_call_requests]] - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.public_call_requests]] +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.public_call_requests]] - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.public_call_requests]] +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.public_call_requests]] - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.public_call_requests]] +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.public_call_requests]] - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.public_call_requests]] +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.public_call_requests]] - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.public_call_requests]] +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_teardown_call_request] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_teardown_call_request.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_teardown_call_request.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.public_teardown_call_request.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.l2_to_l1_msgs]] - content = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.public_call_requests]] +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.l2_to_l1_msgs.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" + +[app_public_inputs.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.l2_to_l1_msgs]] - content = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.l2_to_l1_msgs.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[app_public_inputs.private_logs]] - note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000007" - counter = "0x0000000000000000000000000000000000000000000000000000000000000008" +[[app_public_inputs.public_call_requests]] +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_logs.log] - fields = [ - "0x2f1a4571bbecb3e5a94b413bb949991e4b9f8dbf8b037ff79938bf66c824772f", - "0x2e7e6db25ca199941b566c81011b678ac55ed9ec7db1a8ade41681501416fbb1", - "0x000192d3aa0c6f18329790b83eec92467c0169560119b3f957f4e8daf0256c66", - "0x004d609dc5c37f07675e820d083f0d732d6ab4b6421f1252e15170aa20dee808", - "0x00646c903459c5e15f2c167dfc5820ef9d2b10b1ca3ab352aa2ae6f4da97576d", - "0x008777ab04c5f20472be4ee8f8dd42ba1f563fe204f22e8f21ef9e9b37290d4f", - "0x004701f4fda200cb91bf8f0dc9af531f99eb13455953bc15de0495568811fbf8", - "0x00e543b40ae4da5b350ae90178dc56f06084866a32f3066c70bd3b1b55ee98cc", - "0x00e0316bc8af8abb6980bd305d86980c1c471f6a512c4e13e839a4695116cb44", - "0x004cb6b1b5aa17a09f1ef466ef7e009e6ff8b21ab9705b7ffe8725a7a8fb7bea", - "0x288d372209bdfe1453fcbe658e90970e4930663e0800330e0845d585a1fbdc7e", - "0x1c80b5060ebd134a47e8d3e94d5865c63307257927c805348a9a64c6abd8ca4a", - "0x180afa1695d0a7330c94fc9aa246223bc6aa592780d10a40ada4ef3b6c9b1ba9", - "0x1cfdb5ea00b7ddc43eca05bbf11a1ea7e56cdffdc11a65911806e394484f66c2", - "0x02e04f6038a54b39481c1ea71206f0d0d54607d7186fbefd53ef54883ce5ef23", - "0x2b45382ee4d94cd5d861d46374f3f701a7408d895ee3df15172aff0fc49d8c59", - "0x161c269e7b16f27b20580ec7e4ee82c4327489759d24751246b395b58d1d8a26", - "0x29ff1d63ef709d8f352c4f432d1104e21d42ff7645a505f0838e4d1425f412b1" +[app_public_inputs.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" + +[app_public_inputs.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + +[app_public_inputs.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + +[app_public_inputs.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + +[[app_public_inputs.public_call_requests]] +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" + +[app_public_inputs.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" + +[app_public_inputs.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + +[app_public_inputs.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + +[app_public_inputs.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + +[[app_public_inputs.public_call_requests]] +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" + +[app_public_inputs.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" + +[app_public_inputs.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + +[app_public_inputs.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + +[app_public_inputs.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + +[[app_public_inputs.public_call_requests]] +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" + +[app_public_inputs.public_call_requests.inner] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" + +[app_public_inputs.public_call_requests.inner.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + +[app_public_inputs.public_call_requests.inner.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + +[app_public_inputs.public_call_requests.inner.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + +[app_public_inputs.public_teardown_call_request] +is_static_call = false +args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" + +[app_public_inputs.public_teardown_call_request.msg_sender] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + +[app_public_inputs.public_teardown_call_request.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + +[app_public_inputs.public_teardown_call_request.function_selector] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + +[[app_public_inputs.l2_to_l1_msgs]] +content = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" + +[app_public_inputs.l2_to_l1_msgs.recipient] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + +[[app_public_inputs.l2_to_l1_msgs]] +content = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" + +[app_public_inputs.l2_to_l1_msgs.recipient] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + +[[app_public_inputs.private_logs]] +note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000007" +counter = "0x0000000000000000000000000000000000000000000000000000000000000008" + +[app_public_inputs.private_logs.log] +fields = [ + "0x0751bef29db5c69716a4c9f23896a496d936d4520129b5251eec6f11262b8e1e", + "0x167603b5766d67512512a4796245a56076b94de8d1ea07b295ebb4ed85c056ff", + "0x0000aafc95fd793b5c4b0feb06e38bc21489dbdc04b633539e72738b723e49d1", + "0x008891147ceb97bd6ff6389d25e3587f6171edd234ae0e9edd6b5226edca86f7", + "0x00a78845c981e5cf9956624bc82c8a64d7252c7bc4a66cfb82ae5b81238ad17b", + "0x00f3a19da28c5dc92914cdd68a3d672ce3d080cd37f9266f3706775773ac2c0f", + "0x0048cb12059190078e332090882354d7fcf9118711cfeec72100492aaa81080f", + "0x00586dbb6ad2497e647a78fd4c6c0c82f8d10d7c6ce67c571e678c7bcd8a7117", + "0x00e814e6b343543791ec83139c26a5ea25229abc730f72c832da0853d87846fc", + "0x0040647c93641b8349ae718a39e1c4d699f6a75ac5648ae435db9c9d95d2e9f1", + "0x1a81779f583dddb618e0ff174cccdd90613e39b78e4b145bb6ab92df93348880", + "0x1eecaf4a50ddce6f795cc6755f0131f6c53e9118b9ebd2d8f7d7cd9f4dc7eaae", + "0x0df14306f82a26e71aa043e79e0c71280cf7e024ff84d142bfcf027528c03c2c", + "0x1c04bddae0848102eb8c0a82ef3f453a664d2b156e36109b65a119c7818ea964", + "0x27de018c80d8144ce4edc0268fd054cdffb10d922596c7644ebaa530a08c1a8d", + "0x077cce49c4d731e6413d42e4354e2d7c90de28d0ba1b4b6fb25a93d0be010d1f", + "0x2af29b5bed0a2af7fbb3238513869593cea3a634f19670d718ad68769af052e8", + "0x20ca5e5d6a61d84f1b1fc2611c6da95b59a8050805bc4b6818fcadbd34ab6cb4", ] - [[app_public_inputs.private_logs]] - note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000009" - counter = "0x000000000000000000000000000000000000000000000000000000000000000a" - - [app_public_inputs.private_logs.log] - fields = [ - "0x20a27490917a65f3584e9de9a53cf94ed27d2985713e3fd92b1964155a5aa941", - "0x0cfb0c06e39a98be0cad6bdd87d6c4f72e69e50078661d9dda8a277e6be144b6", - "0x0000cb266e70b5e72397c6782ebffd1473d40a0c690f0c1fd8e7eb47901ff973", - "0x001c177d95cf9ed9d7984e0727b2cdf3b06e0b0b680483195a289845f72d6f62", - "0x00313dc69a806e1c4962266802a785e44ed643b53faaedbe56208591d1ed2217", - "0x00877f90361f0ccfb9997500d8728e34f32681c2699ba63407e86ad69e1857f4", - "0x005b6187563530deb9daa6f9a83a5d433ec43ef1be7b1513e7277a87fd91a154", - "0x007e388c05177f193f98b3c76b9d41cb4ccef040b60baffc43dd1eef57e5e5e0", - "0x00764be23ba7af2158dd7e6f7322edea051dc304322679a5bbc5c2f2ae6be1f1", - "0x00adb04b8f41f467ecf986b6aca54290931ac41e97d35eaa7596be00aa032dee", - "0x139d6cc6964570781f4358b6c80ac9ec692f9c4e6110a1fbc15642a21ec29dc7", - "0x254eab6ab95b59c502a0bba222073b4c9d2b1425564839a4367cfaa296329c71", - "0x203f8ae6dd34b9f317a2410dd96cb76f06ec1493561a5310dd94e2a8c60b7b23", - "0x2c77bb56250b2ad0b409bd2e99ee79c4ee090b0598ee201b39ee15c185b1fd1a", - "0x2252dc49994e710dd9089cafa3c3840fec26f6ad6df53b770fcdbff96ae71547", - "0x2a02170269e3b2ab57129b355b2e5fd05320c6f75ccba51a2b2bcdf944ca4551", - "0x2c59670c74189b47634fd078d42b0507b2a37ebdae83ba9dcdcd595f9a7857ad", - "0x2e0d6ec1e43b83f2e04f29701a9e62e48f13306b8155125e0328c481781a82d7" +[[app_public_inputs.private_logs]] +note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000009" +counter = "0x000000000000000000000000000000000000000000000000000000000000000a" + +[app_public_inputs.private_logs.log] +fields = [ + "0x0160ce68ff73104586e66d37584fcc06941824a3642410d534f67c64db7cd16a", + "0x21f0603da9489d946191d324ee2dca49f79bc6022ccbd2e72aa8988384526784", + "0x00006087e669a25770908fb7e2e6b01c25c6f643374513f0507d3d6478b31a0a", + "0x00ecba62b7f788bcef37fc2cabb256bf4509a1f2955201668abbf507b53f8707", + "0x0091918238d3228c93568602404c6731f96908d985153629fb1dcc0d24a2a8b4", + "0x00a0b8b0ae66f7dd89a444a16fe191546b76fec2bab479b805f98371a470892b", + "0x00cdf60485232f6d2b93cf88ffe49c11b892bf2bdee507d1e58f7e85a3f71942", + "0x00458cade0e3fe12f5c41dce526434c55e405c12f03e3f0acc8adb491ccea8ca", + "0x003367fb1e21a73ada7ef61d96521554ac87df355bec2a1eb21e5890f3e7c526", + "0x00fe53f99a629a3acb169430cfd422384d6cd404b5b9c75857a2d1502394db85", + "0x02cfce371540c91427b6b1c5c1b79bbfe78bf6cb30fe74229db5d7f97e2b1a63", + "0x1b70e5487575afe9c4c31263cec6e81ec6c6c36561cafb2e237d3b46bc9ecb63", + "0x2e41b9dbafb4fdf0de3cfbef8e2d1d62376a725882d89323aca404ba85001473", + "0x0e84510e85c20ebf809cca3db0871e698a609036f6ca43f23f077ad4034e9b85", + "0x1c8693adef7eab0b7cb8d9867a5687ffcfc1b0d90d88e8222ee4224715e5b3b4", + "0x1e67cff2a9b0cd25efa7e7aba76e59b8788c31697fe483673d12162fbcdb4cb0", + "0x0babeb8fad5ad098aa0cea25c85fa70f1bf6557b7bfb6ab7d0445f5851fdf3c1", + "0x11d5e67093feab6d16fbc32e4a1a5d16e407ce6e7cfe254244e577664c8fb532", ] - [[app_public_inputs.private_logs]] - note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x000000000000000000000000000000000000000000000000000000000000000b" - - [app_public_inputs.private_logs.log] - fields = [ - "0x1e9e65c5548eda81eb560271e16bdc8b7226c4977fcca5b6f98785ca3a72aaae", - "0x00e201b276065a38c29239dc9aa9f9b83464e5644e20c6b86269ee51b5d85c3e", - "0x000108fc4c4d38edc45eec9395d983d9d18f7484f8dc381d36db48d0fddf2686", - "0x002ad850990f5b1eca9c7fd42cd800c669d188cb5e4ce7bb5b184e1bccfb7187", - "0x005447a194644dbf8cf8eb4ea7fa89da74e919aa8a4752384d07ad2a5250026c", - "0x00e12db84842df7d813f229483a799bfa5a5f96a67b4a9e36ef3652372d11a46", - "0x0061e3882c550f540391a8df29644855818e8ebcfbbbc7bdf9c083dc8bac1092", - "0x00873f73d9574fc2d7e603737e69c7e996a32f4bba7033372f8cdbbf88ca15fa", - "0x0081b20f8367c8590b13ca7051334dc524c6e095763bfb7211494fd8aa707b78", - "0x00bf647749d536e58dd19ff6c1826be7246c346ed26ab28d895f1cdcafe984b5", - "0x1e428ad029bdafd8ab8529db7ca7cd622e98a5dd0e3ea9ee380e8c06f2ee2607", - "0x16652f6254eae25950403464559440d5a730acf90d04744f70429f1c6576df5f", - "0x18732b50e18ec638f6340cd255ba6faf37f1d1bfdf03499735db311d58145e83", - "0x15dd7deccaca06ad53f1bd7559d0bc5e5adab25daadf611136113f6b1f6bb1bb", - "0x22cf7e85aac30fb819042ba11decd3df34aa8215d3963be43e95625362c8f3f5", - "0x05f79e7f32387f4505f023c22a7e457a7e78c407ace400ee8f82baf09cfbd293", - "0x0ed4f4286764d6a609cfea38082a0851331063604aca10ac483dfcf1711490c0", - "0x0501fd500c67848714d556c7f407b9f373aa13795e4fdbc096112f76aaac9502" +[[app_public_inputs.private_logs]] +note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x000000000000000000000000000000000000000000000000000000000000000b" + +[app_public_inputs.private_logs.log] +fields = [ + "0x2cfcb408db9e9386a04b2b367cb853925eb8a51feeafca073e1512827e348f49", + "0x1af508073662bd113fe745f8826fdeee9dfa030da19a9d145b4a092d774808fa", + "0x0000bb6a87d3ba9c686e11dbc5710aa9ad1656188aa05b9527f76da85c2a527e", + "0x00bae9608b3b65dcddeea7294fc3325bdb52cf74a5f492dbb36223f7a02cef70", + "0x0058b4a3a1e53fb32d75c29b5004b27084f283920cde1af31004e14c97611998", + "0x00bfac8fc5179ac59c0c27e06f64522c92ead4efd84f5c29e58a829c525623f0", + "0x0076b2c342324046af723c040db5120834b2b44fe26b02a26f27020db42f2f29", + "0x00b26af836c55ed20971d1c5f09d5304a8a8affdb732df6a65cd437e3ca7c45e", + "0x00e5ea05ca955a7abe61187a74115a742818701888b1e3b4cbecf778bfbfcc4f", + "0x009103f3f67fc0642bb6e041ad8d6e7546ed3d6124779b267cc71df47c742686", + "0x2a0ee4c02e0eb8863b7741d4a4a0204e3ca7d377d7b12da78979c7efca7fd8e7", + "0x1ceacbf2e1a154013ec0f29c6d0f0b6ee2c8ba2a30f10652864a1ffadfdbef80", + "0x0ed57f26e1d4174a6f3c7c53a72b6e5da13ee88107e38a1d8e26c9147fa2520f", + "0x0ef0e2babcc7e4bb040e857445aa0e95fdd4c6d1a54b684e935fb26fd8701709", + "0x1506dd3be1bc9e0373422002785b9b1c6de61325677b039368d93618e9d3f3eb", + "0x125b5cb4e410cb3657d5af35b49ab6e31374ffb59d65dbe0500cfce9e68c7f48", + "0x1406aab50a8fcce2fd525b48b289cd2e5453ef4cbb0bb6bee5dc987b2133ffb1", + "0x15e3f93acc5bd69e02d73e1f20d356b2cf41ef470f94f4c9f626ae516e07102a", ] - [[app_public_inputs.private_logs]] - note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.private_logs]] +note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_logs.log] - fields = [ +[app_public_inputs.private_logs.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -6186,15 +6246,15 @@ _value = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] - [[app_public_inputs.private_logs]] - note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.private_logs]] +note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_logs.log] - fields = [ +[app_public_inputs.private_logs.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -6212,15 +6272,15 @@ _value = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] - [[app_public_inputs.private_logs]] - note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.private_logs]] +note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_logs.log] - fields = [ +[app_public_inputs.private_logs.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -6238,15 +6298,15 @@ _value = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] - [[app_public_inputs.private_logs]] - note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.private_logs]] +note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_logs.log] - fields = [ +[app_public_inputs.private_logs.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -6264,15 +6324,15 @@ _value = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] - [[app_public_inputs.private_logs]] - note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.private_logs]] +note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_logs.log] - fields = [ +[app_public_inputs.private_logs.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -6290,15 +6350,15 @@ _value = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] - [[app_public_inputs.private_logs]] - note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.private_logs]] +note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_logs.log] - fields = [ +[app_public_inputs.private_logs.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -6316,15 +6376,15 @@ _value = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] - [[app_public_inputs.private_logs]] - note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.private_logs]] +note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_logs.log] - fields = [ +[app_public_inputs.private_logs.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -6342,15 +6402,15 @@ _value = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] - [[app_public_inputs.private_logs]] - note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.private_logs]] +note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_logs.log] - fields = [ +[app_public_inputs.private_logs.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -6368,15 +6428,15 @@ _value = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] - [[app_public_inputs.private_logs]] - note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.private_logs]] +note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_logs.log] - fields = [ +[app_public_inputs.private_logs.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -6394,15 +6454,15 @@ _value = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] - [[app_public_inputs.private_logs]] - note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.private_logs]] +note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_logs.log] - fields = [ +[app_public_inputs.private_logs.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -6420,15 +6480,15 @@ _value = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] - [[app_public_inputs.private_logs]] - note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.private_logs]] +note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_logs.log] - fields = [ +[app_public_inputs.private_logs.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -6446,15 +6506,15 @@ _value = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] - [[app_public_inputs.private_logs]] - note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.private_logs]] +note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_logs.log] - fields = [ +[app_public_inputs.private_logs.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -6472,15 +6532,15 @@ _value = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] - [[app_public_inputs.private_logs]] - note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.private_logs]] +note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.private_logs.log] - fields = [ +[app_public_inputs.private_logs.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -6498,64 +6558,63 @@ _value = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" ] - [[app_public_inputs.contract_class_logs_hashes]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - length = "0x0000000000000000000000000000000000000000000000000000000000000000" +[[app_public_inputs.contract_class_logs_hashes]] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +length = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.historical_header] - total_fees = "0x0000000000000000000000000000000000000000000000000003a831c6a84280" - total_mana_used = "0x0000000000000000000000000000000000000000000000000000000000004a40" +[app_public_inputs.historical_header] +total_fees = "0x000000000000000000000000000000000000000000000000000002234738a6dc" +total_mana_used = "0x000000000000000000000000000000000000000000000000000000000003e4b5" - [app_public_inputs.historical_header.last_archive] - root = "0x26539d26af96d95bbb572600a75cac167b3d1c1b1463d7a37f36a17a8d06ed6a" - next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000008" +[app_public_inputs.historical_header.last_archive] +root = "0x182ece3a6471a364fdb90dac6ee36013aa3be5f8b00a3edae015ae194590f266" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000005" - [app_public_inputs.historical_header.content_commitment] - num_txs = "0x0000000000000000000000000000000000000000000000000000000000000001" - blobs_hash = "0x00766b5deaa18a777a6519ed05b5ab8360ac4c4b8ba6b207d8cabb2ff48d8c4b" - in_hash = "0x00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c" - out_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.historical_header.content_commitment] +num_txs = "0x0000000000000000000000000000000000000000000000000000000000000001" +blobs_hash = "0x00dbbc8e274b20691c819f6c5ccdaa3317c048cdf7e346aca53a9ad0338e33f4" +in_hash = "0x00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c" +out_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [app_public_inputs.historical_header.state.l1_to_l2_message_tree] root = "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000050" [app_public_inputs.historical_header.state.partial.note_hash_tree] -root = "0x00893d1239f1319771e840ed89e26356efb7a175b5d14215f16d2f3f73b61de0" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000240" +root = "0x1d2a0372ac57ea0f5e4878ef40b3876d986df26d9039093d56426b8d05c1aa95" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000180" [app_public_inputs.historical_header.state.partial.nullifier_tree] -root = "0x0cf60cbdd1d63166e082dafba02571914ee2e2b63f16a0088f4bc35f9141063f" -next_available_leaf_index = "0x00000000000000000000000000000000000000000000000000000000000002c0" +root = "0x300782ca3597643e3bd4ef7c4122e409019f3e970a5e27cac7511d3bceca71b4" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000200" [app_public_inputs.historical_header.state.partial.public_data_tree] -root = "0x21adba011a03e24b92611d690dcc4d6b77d39beddf5d2ec763554cc2e96d8b87" -next_available_leaf_index = "0x000000000000000000000000000000000000000000000000000000000000009a" +root = "0x17043d2abd1baca090b8b982811b5e202356adbc5d2b1e262c33c7846acf08dd" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000099" - [app_public_inputs.historical_header.global_variables] - chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" - version = "0x0000000000000000000000000000000000000000000000000000000000000001" - block_number = "0x0000000000000000000000000000000000000000000000000000000000000008" - slot_number = "0x0000000000000000000000000000000000000000000000000000000000000022" - timestamp = "0x0000000000000000000000000000000000000000000000000000000067aa83d7" +[app_public_inputs.historical_header.global_variables] +chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" +version = "0x0000000000000000000000000000000000000000000000000000000000000001" +block_number = "0x0000000000000000000000000000000000000000000000000000000000000005" +slot_number = "0x0000000000000000000000000000000000000000000000000000000000000008" +timestamp = "0x0000000000000000000000000000000000000000000000000000000067af1dda" - [app_public_inputs.historical_header.global_variables.coinbase] - inner = "0x000000000000000000000000510b7559c009aa23c667441544126add2fded29c" +[app_public_inputs.historical_header.global_variables.coinbase] +inner = "0x00000000000000000000000036878ef7e244777d78d353a8a91073f7f9f4b9d2" - [app_public_inputs.historical_header.global_variables.fee_recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +[app_public_inputs.historical_header.global_variables.fee_recipient] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - [app_public_inputs.historical_header.global_variables.gas_fees] - fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9bd267fa" +[app_public_inputs.historical_header.global_variables.gas_fees] +fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" +fee_per_l2_gas = "0x00000000000000000000000000000000000000000000000000000000008c90ec" - [app_public_inputs.tx_context] - chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" - version = "0x0000000000000000000000000000000000000000000000000000000000000001" +[app_public_inputs.tx_context] +chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" +version = "0x0000000000000000000000000000000000000000000000000000000000000001" [app_public_inputs.tx_context.gas_settings.gas_limits] da_gas = "0x000000000000000000000000000000000000000000000000000000003b9aca00" @@ -6567,7 +6626,7 @@ l2_gas = "0x00000000000000000000000000000000000000000000000000000000005b8d80" [app_public_inputs.tx_context.gas_settings.max_fees_per_gas] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" -fee_per_l2_gas = "0x00000000000000000000000000000000000000000000000000000012e9bb9bf7" +fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000000186c3f" [app_public_inputs.tx_context.gas_settings.max_priority_fees_per_gas] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/private_call_data_validator/validate_contract_address.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/private_call_data_validator/validate_contract_address.nr index 2b1778572c3e..33e403c837d3 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/private_call_data_validator/validate_contract_address.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/private_call_data_validator/validate_contract_address.nr @@ -1,7 +1,19 @@ use dep::types::{ - abis::private_kernel::private_call_data::PrivateCallData, address::AztecAddress, - constants::MAX_PROTOCOL_CONTRACTS, merkle_tree::conditionally_assert_check_membership, - traits::ToField, + abis::private_kernel::private_call_data::PrivateCallData, + address::AztecAddress, + constants::{ + DEFAULT_UPDATE_DELAY, DEPLOYER_CONTRACT_ADDRESS, MAX_PROTOCOL_CONTRACTS, + UPDATED_CLASS_IDS_SLOT, + }, + contract_class_id::ContractClassId, + hash::private_functions_root_from_siblings, + merkle_tree::conditionally_assert_check_membership, + shared_mutable::{ + scheduled_delay_change::ScheduledDelayChange, scheduled_value_change::ScheduledValueChange, + shared_mutable_values::SharedMutableValues, with_hash::validate_with_hash_hints, + }, + storage::map::derive_storage_slot_in_map, + traits::{is_empty, Packable, ToField}, }; pub fn validate_contract_address( @@ -13,29 +25,63 @@ pub fn validate_contract_address( private_call_data.vk.check_hash(); - let computed_address = AztecAddress::compute_from_private_function( + let hints = private_call_data.verification_key_hints; + + let private_functions_root = private_functions_root_from_siblings( private_call_data.public_inputs.call_context.function_selector, private_call_data.vk.hash, - private_call_data.function_leaf_membership_witness, - private_call_data.contract_class_artifact_hash, - private_call_data.contract_class_public_bytecode_commitment, - private_call_data.salted_initialization_hash, - private_call_data.public_keys, + hints.function_leaf_membership_witness.leaf_index, + hints.function_leaf_membership_witness.sibling_path, + ); + + let contract_class_id = ContractClassId::compute( + hints.contract_class_artifact_hash, + private_functions_root, + hints.contract_class_public_bytecode_commitment, + ); + + let computed_address = AztecAddress::compute_from_class_id( + contract_class_id, + hints.salted_initialization_hash, + hints.public_keys, + ); + + let value_change: ScheduledValueChange = + Packable::unpack(hints.updated_class_id_value_change); + let delay_change: ScheduledDelayChange = + Packable::unpack(hints.updated_class_id_delay_change); + + // A block horizon for this shared mutable should be set separately when generating/validating kernel output + validate_with_hash_hints( + private_call_data.public_inputs.historical_header, + derive_storage_slot_in_map(UPDATED_CLASS_IDS_SLOT as Field, contract_address), + DEPLOYER_CONTRACT_ADDRESS, + SharedMutableValues::new(value_change, delay_change), + hints.updated_class_id_witness, + hints.updated_class_id_leaf, + ); + + let updated_contract_class_id = value_change.get_current_at( + private_call_data.public_inputs.historical_header.global_variables.block_number as u32, ); let contract_address_field = contract_address.to_field(); let is_protocol_contract = contract_address_field.lt(MAX_PROTOCOL_CONTRACTS as Field); + let is_updated_contract = !is_empty(updated_contract_class_id); + + let address_derivation_check = + !is_protocol_contract & computed_address.eq(contract_address) & !is_updated_contract; + let updated_class_check = !is_protocol_contract + & is_updated_contract + & contract_class_id.eq(updated_contract_class_id); + let protocol_contract_check = is_protocol_contract + & hints.protocol_contract_membership_witness.leaf_index.eq(contract_address_field) + & !is_updated_contract; - // We either have a normal contract address, which must match the calculated address, or + // We can have a normal contract address, which must match the calculated address, an updated contract so the class id used must be the updated one, or // A computed protocol contract address which exists at the index held in call_context.contract_address. assert( - (!is_protocol_contract & computed_address.eq(contract_address)) - | ( - is_protocol_contract - & private_call_data.protocol_contract_membership_witness.leaf_index.eq( - contract_address_field, - ) - ), + address_derivation_check | updated_class_check | protocol_contract_check, "computed contract address does not match expected one", ); @@ -45,8 +91,9 @@ pub fn validate_contract_address( conditionally_assert_check_membership( computed_address.to_field(), is_protocol_contract, - private_call_data.protocol_contract_leaf, - private_call_data.protocol_contract_membership_witness, + hints.protocol_contract_leaf, + hints.protocol_contract_membership_witness, protocol_contract_tree_root, ); } + diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/private_kernel_circuit_output_validator.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/private_kernel_circuit_output_validator.nr index 2300ee88497d..4f321bdf2d2d 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/private_kernel_circuit_output_validator.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/private_kernel_circuit_output_validator.nr @@ -8,9 +8,16 @@ use dep::types::{ private_circuit_public_inputs::{ PrivateCircuitPublicInputs, PrivateCircuitPublicInputsArrayLengths, }, + private_kernel::private_call_data::PrivateCallData, }, address::AztecAddress, - traits::is_empty, + constants::DEFAULT_UPDATE_DELAY, + contract_class_id::ContractClassId, + shared_mutable::{ + compute_shared_mutable_block_horizon, scheduled_delay_change::ScheduledDelayChange, + scheduled_value_change::ScheduledValueChange, + }, + traits::{is_empty, Packable}, transaction::tx_request::TxRequest, utils::arrays::{ assert_array_appended, assert_array_appended_and_scoped, assert_array_appended_reversed, @@ -30,7 +37,7 @@ impl PrivateKernelCircuitOutputValidator { pub fn validate_as_first_call( self, tx_request: TxRequest, - private_call: PrivateCircuitPublicInputs, + private_call: PrivateCallData, private_call_array_lengths: PrivateCircuitPublicInputsArrayLengths, vk_tree_root: Field, protocol_contract_tree_root: Field, @@ -50,7 +57,7 @@ impl PrivateKernelCircuitOutputValidator { offsets.nullifiers = 1; // The protocol nullifier is not propagated from the private call. } self.validate_propagated_from_private_call( - private_call, + private_call.public_inputs, private_call_array_lengths, offsets, 0, // num_popped_call @@ -61,7 +68,7 @@ impl PrivateKernelCircuitOutputValidator { self, previous_kernel: PrivateKernelCircuitPublicInputs, previous_kernel_array_lengths: PrivateKernelCircuitPublicInputsArrayLengths, - private_call: PrivateCircuitPublicInputs, + private_call: PrivateCallData, private_call_array_lengths: PrivateCircuitPublicInputsArrayLengths, ) { self.validate_aggregated_values(previous_kernel, private_call); @@ -70,7 +77,7 @@ impl PrivateKernelCircuitOutputValidator { previous_kernel_array_lengths, ); self.validate_propagated_from_private_call( - private_call, + private_call.public_inputs, private_call_array_lengths, previous_kernel_array_lengths, 1, // num_popped_call @@ -80,7 +87,7 @@ impl PrivateKernelCircuitOutputValidator { fn validate_initial_values( self, tx_request: TxRequest, - private_call: PrivateCircuitPublicInputs, + private_call: PrivateCallData, vk_tree_root: Field, protocol_contract_tree_root: Field, is_private_only: bool, @@ -91,7 +98,7 @@ impl PrivateKernelCircuitOutputValidator { assert_eq(self.output.constants.tx_context, tx_request.tx_context, "mismatch tx_context"); assert_eq( self.output.constants.historical_header, - private_call.historical_header, + private_call.public_inputs.historical_header, "mismatch historical_header", ); assert_eq(self.output.constants.vk_tree_root, vk_tree_root, "mismatch vk_tree_root"); @@ -115,21 +122,27 @@ impl PrivateKernelCircuitOutputValidator { // Others. assert_eq( self.output.min_revertible_side_effect_counter, - private_call.min_revertible_side_effect_counter, + private_call.public_inputs.min_revertible_side_effect_counter, "incorrect initial min_revertible_side_effect_counter", ); + + let max_block_number = Self::update_max_block_number_for_contract_updates( + private_call, + private_call.public_inputs.max_block_number, + ); + assert_eq( self.output.validation_requests.for_rollup.max_block_number, - private_call.max_block_number, + max_block_number, "incorrect initial max_block_number", ); assert_eq( self.output.public_teardown_call_request, - private_call.public_teardown_call_request, + private_call.public_inputs.public_teardown_call_request, "incorrect initial public_teardown_call_request", ); - let initial_fee_payer = if private_call.is_fee_payer { - private_call.call_context.contract_address + let initial_fee_payer = if private_call.public_inputs.is_fee_payer { + private_call.public_inputs.call_context.contract_address } else { AztecAddress::zero() }; @@ -139,19 +152,19 @@ impl PrivateKernelCircuitOutputValidator { fn validate_aggregated_values( self, previous_kernel: PrivateKernelCircuitPublicInputs, - private_call: PrivateCircuitPublicInputs, + private_call: PrivateCallData, ) { // min_revertible_side_effect_counter let propagated_min_revertible_counter = if previous_kernel .min_revertible_side_effect_counter != 0 { assert( - private_call.min_revertible_side_effect_counter == 0, + private_call.public_inputs.min_revertible_side_effect_counter == 0, "cannot overwrite min_revertible_side_effect_counter", ); previous_kernel.min_revertible_side_effect_counter } else { - private_call.min_revertible_side_effect_counter + private_call.public_inputs.min_revertible_side_effect_counter }; assert_eq( self.output.min_revertible_side_effect_counter, @@ -162,8 +175,12 @@ impl PrivateKernelCircuitOutputValidator { // max_block_number let max_block_number = MaxBlockNumber::min( previous_kernel.validation_requests.for_rollup.max_block_number, - private_call.max_block_number, + private_call.public_inputs.max_block_number, ); + + let max_block_number = + Self::update_max_block_number_for_contract_updates(private_call, max_block_number); + assert_eq( self.output.validation_requests.for_rollup.max_block_number, max_block_number, @@ -175,12 +192,12 @@ impl PrivateKernelCircuitOutputValidator { previous_kernel.public_teardown_call_request, ) { assert( - is_empty(private_call.public_teardown_call_request), + is_empty(private_call.public_inputs.public_teardown_call_request), "cannot overwrite public_teardown_call_request", ); previous_kernel.public_teardown_call_request } else { - private_call.public_teardown_call_request + private_call.public_inputs.public_teardown_call_request }; assert_eq( self.output.public_teardown_call_request, @@ -190,10 +207,10 @@ impl PrivateKernelCircuitOutputValidator { // fee_payer let propagated_fee_payer = if !is_empty(previous_kernel.fee_payer) { - assert(!private_call.is_fee_payer, "cannot overwrite fee_payer"); + assert(!private_call.public_inputs.is_fee_payer, "cannot overwrite fee_payer"); previous_kernel.fee_payer - } else if private_call.is_fee_payer { - private_call.call_context.contract_address + } else if private_call.public_inputs.is_fee_payer { + private_call.public_inputs.call_context.contract_address } else { AztecAddress::zero() }; @@ -354,4 +371,27 @@ impl PrivateKernelCircuitOutputValidator { offsets.private_call_stack - num_popped_call, ); } + + fn update_max_block_number_for_contract_updates( + private_call: PrivateCallData, + max_block_number: MaxBlockNumber, + ) -> MaxBlockNumber { + if !private_call.public_inputs.call_context.contract_address.is_protocol_contract() { + MaxBlockNumber::min( + max_block_number, + MaxBlockNumber::new(compute_shared_mutable_block_horizon( + ScheduledValueChange::::unpack( + private_call.verification_key_hints.updated_class_id_value_change, + ), + ScheduledDelayChange::::unpack( + private_call.verification_key_hints.updated_class_id_delay_change, + ), + private_call.public_inputs.historical_header.global_variables.block_number + as u32, + )), + ) + } else { + max_block_number + } + } } diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/private_kernel_circuit_public_inputs_composer.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/private_kernel_circuit_public_inputs_composer.nr index 69dc7b30d6d0..6d611d730964 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/private_kernel_circuit_public_inputs_composer.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/private_kernel_circuit_public_inputs_composer.nr @@ -6,11 +6,19 @@ use dep::types::{ max_block_number::MaxBlockNumber, nullifier::{Nullifier, ScopedNullifier}, private_circuit_public_inputs::PrivateCircuitPublicInputs, + private_kernel::private_call_data::PrivateCallData, side_effect::{Ordered, OrderedValue}, tx_constant_data::TxConstantData, }, address::AztecAddress, - traits::{Empty, Hash, is_empty}, + constants::DEFAULT_UPDATE_DELAY, + contract_class_id::ContractClassId, + debug::no_op, + shared_mutable::{ + compute_shared_mutable_block_horizon, scheduled_delay_change::ScheduledDelayChange, + scheduled_value_change::ScheduledValueChange, + }, + traits::{Empty, Hash, is_empty, Packable}, transaction::tx_request::TxRequest, utils::arrays::{array_length, array_to_bounded_vec, sort_by_counter_asc, sort_by_counter_desc}, }; @@ -120,11 +128,8 @@ impl PrivateKernelCircuitPublicInputsComposer { *self } - pub fn with_private_call( - &mut self, - private_call_public_inputs: PrivateCircuitPublicInputs, - ) -> Self { - self.propagate_from_private_call(private_call_public_inputs); + pub fn with_private_call(&mut self, private_call: PrivateCallData) -> Self { + self.propagate_from_private_call(private_call); *self } @@ -146,72 +151,97 @@ impl PrivateKernelCircuitPublicInputsComposer { self.public_inputs.finish() } - fn propagate_from_private_call(&mut self, private_call: PrivateCircuitPublicInputs) { + fn propagate_from_private_call(&mut self, private_call: PrivateCallData) { self.propagate_max_block_number(private_call); - self.propagate_note_hash_read_requests(private_call); - self.propagate_nullifier_read_requests(private_call); - self.propagate_key_validation_requests(private_call); - self.propagate_note_hashes(private_call); - self.propagate_nullifiers(private_call); - self.propagate_l2_to_l1_messages(private_call); - self.propagate_logs(private_call); - self.propagate_private_call_requests(private_call); - self.propagate_public_call_requests(private_call); - self.propagate_public_teardown_call_request(private_call); - self.propagate_fee_payer(private_call); - self.propagate_min_revertible_side_effect_counter(private_call); + self.propagate_note_hash_read_requests(private_call.public_inputs); + self.propagate_nullifier_read_requests(private_call.public_inputs); + self.propagate_key_validation_requests(private_call.public_inputs); + self.propagate_note_hashes(private_call.public_inputs); + self.propagate_nullifiers(private_call.public_inputs); + self.propagate_l2_to_l1_messages(private_call.public_inputs); + self.propagate_logs(private_call.public_inputs); + self.propagate_private_call_requests(private_call.public_inputs); + self.propagate_public_call_requests(private_call.public_inputs); + self.propagate_public_teardown_call_request(private_call.public_inputs); + self.propagate_fee_payer(private_call.public_inputs); + self.propagate_min_revertible_side_effect_counter(private_call.public_inputs); } fn propagate_min_revertible_side_effect_counter( &mut self, - private_call: PrivateCircuitPublicInputs, + private_call_public_inputs: PrivateCircuitPublicInputs, ) { if self.public_inputs.min_revertible_side_effect_counter != 0 { assert( - private_call.min_revertible_side_effect_counter == 0, + private_call_public_inputs.min_revertible_side_effect_counter == 0, "cannot overwrite non-zero min_revertible_side_effect_counter", ); } else { self.public_inputs.min_revertible_side_effect_counter = - private_call.min_revertible_side_effect_counter; + private_call_public_inputs.min_revertible_side_effect_counter; }; } - fn propagate_max_block_number(&mut self, private_call: PrivateCircuitPublicInputs) { + fn propagate_max_block_number(&mut self, private_call: PrivateCallData) { // Update the max block number if the private call requested a lower one. self.public_inputs.validation_requests.max_block_number = MaxBlockNumber::min( self.public_inputs.validation_requests.max_block_number, - private_call.max_block_number, + private_call.public_inputs.max_block_number, ); - } + // Update the max block number for the shared mutable read + if !private_call.public_inputs.call_context.contract_address.is_protocol_contract() { + self.public_inputs.validation_requests.max_block_number = MaxBlockNumber::min( + self.public_inputs.validation_requests.max_block_number, + MaxBlockNumber::new(compute_shared_mutable_block_horizon( + ScheduledValueChange::::unpack( + private_call.verification_key_hints.updated_class_id_value_change, + ), + ScheduledDelayChange::::unpack( + private_call.verification_key_hints.updated_class_id_delay_change, + ), + private_call.public_inputs.historical_header.global_variables.block_number + as u32, + )), + ); + } + } - fn propagate_note_hash_read_requests(&mut self, private_call: PrivateCircuitPublicInputs) { - let read_requests = private_call.note_hash_read_requests; + fn propagate_note_hash_read_requests( + &mut self, + private_call_public_inputs: PrivateCircuitPublicInputs, + ) { + let read_requests = private_call_public_inputs.note_hash_read_requests; for i in 0..read_requests.len() { let request = read_requests[i]; if !is_empty(request) { self.public_inputs.validation_requests.note_hash_read_requests.push(request.scope( - private_call.call_context.contract_address, + private_call_public_inputs.call_context.contract_address, )); } } } - fn propagate_nullifier_read_requests(&mut self, private_call: PrivateCircuitPublicInputs) { - let nullifier_read_requests = private_call.nullifier_read_requests; + fn propagate_nullifier_read_requests( + &mut self, + private_call_public_inputs: PrivateCircuitPublicInputs, + ) { + let nullifier_read_requests = private_call_public_inputs.nullifier_read_requests; for i in 0..nullifier_read_requests.len() { let request = nullifier_read_requests[i]; if !is_empty(request) { self.public_inputs.validation_requests.nullifier_read_requests.push(request.scope( - private_call.call_context.contract_address, + private_call_public_inputs.call_context.contract_address, )); } } } - fn propagate_key_validation_requests(&mut self, private_call: PrivateCircuitPublicInputs) { + fn propagate_key_validation_requests( + &mut self, + private_call_public_inputs: PrivateCircuitPublicInputs, + ) { let key_validation_requests_and_generators = - private_call.key_validation_requests_and_generators; + private_call_public_inputs.key_validation_requests_and_generators; for i in 0..key_validation_requests_and_generators.len() { let request = key_validation_requests_and_generators[i]; if !is_empty(request) { @@ -219,71 +249,79 @@ impl PrivateKernelCircuitPublicInputsComposer { .public_inputs .validation_requests .scoped_key_validation_requests_and_generators - .push(request.scope(private_call.call_context.contract_address)); + .push(request.scope(private_call_public_inputs.call_context.contract_address)); } } } - fn propagate_note_hashes(&mut self, private_call: PrivateCircuitPublicInputs) { - let note_hashes = private_call.note_hashes; + fn propagate_note_hashes(&mut self, private_call_public_inputs: PrivateCircuitPublicInputs) { + // BUG: If we delete this print, the resoluting note_hashes bounded vec is missing the original items. + no_op(self.public_inputs.end.note_hashes); + let note_hashes = private_call_public_inputs.note_hashes; for i in 0..note_hashes.len() { let note_hash = note_hashes[i]; if note_hash.value != 0 { self.public_inputs.end.note_hashes.push(note_hash.scope( - private_call.call_context.contract_address, + private_call_public_inputs.call_context.contract_address, )); } } } - fn propagate_nullifiers(&mut self, private_call: PrivateCircuitPublicInputs) { - let nullifiers = private_call.nullifiers; + fn propagate_nullifiers(&mut self, private_call_public_inputs: PrivateCircuitPublicInputs) { + let nullifiers = private_call_public_inputs.nullifiers; for i in 0..nullifiers.len() { let nullifier = nullifiers[i]; if nullifier.value != 0 { self.public_inputs.end.nullifiers.push(nullifier.scope( - private_call.call_context.contract_address, + private_call_public_inputs.call_context.contract_address, )); } } } - fn propagate_l2_to_l1_messages(&mut self, private_call: PrivateCircuitPublicInputs) { - let l2_to_l1_msgs = private_call.l2_to_l1_msgs; + fn propagate_l2_to_l1_messages( + &mut self, + private_call_public_inputs: PrivateCircuitPublicInputs, + ) { + let l2_to_l1_msgs = private_call_public_inputs.l2_to_l1_msgs; for i in 0..l2_to_l1_msgs.len() { let msg = l2_to_l1_msgs[i]; if !is_empty(msg) { self.public_inputs.end.l2_to_l1_msgs.push(msg.scope( - private_call.call_context.contract_address, + private_call_public_inputs.call_context.contract_address, )); } } } - fn propagate_logs(&mut self, private_call: PrivateCircuitPublicInputs) { - let private_logs = private_call.private_logs; + fn propagate_logs(&mut self, private_call_public_inputs: PrivateCircuitPublicInputs) { + let private_logs = private_call_public_inputs.private_logs; for i in 0..private_logs.len() { let log = private_logs[i]; if !is_empty(log) { self.public_inputs.end.private_logs.push(log.scope( - private_call.call_context.contract_address, + private_call_public_inputs.call_context.contract_address, )); } } - let contract_class_logs = private_call.contract_class_logs_hashes; + let contract_class_logs = private_call_public_inputs.contract_class_logs_hashes; for i in 0..contract_class_logs.len() { let log = contract_class_logs[i]; if !is_empty(log) { self.public_inputs.end.contract_class_logs_hashes.push(log.scope( - private_call.call_context.contract_address, + private_call_public_inputs.call_context.contract_address, )); } } } - fn propagate_private_call_requests(&mut self, private_call: PrivateCircuitPublicInputs) { - let call_requests = private_call.private_call_requests; + fn propagate_private_call_requests( + &mut self, + private_call_public_inputs: PrivateCircuitPublicInputs, + ) { + let call_requests = private_call_public_inputs.private_call_requests; let num_requests = array_length(call_requests); for i in 0..call_requests.len() { if i < num_requests { @@ -294,8 +332,11 @@ impl PrivateKernelCircuitPublicInputsComposer { } } - fn propagate_public_call_requests(&mut self, private_call: PrivateCircuitPublicInputs) { - let call_requests = private_call.public_call_requests; + fn propagate_public_call_requests( + &mut self, + private_call_public_inputs: PrivateCircuitPublicInputs, + ) { + let call_requests = private_call_public_inputs.public_call_requests; for i in 0..call_requests.len() { if !is_empty(call_requests[i]) { self.public_inputs.end.public_call_requests.push(call_requests[i]); @@ -303,8 +344,11 @@ impl PrivateKernelCircuitPublicInputsComposer { } } - fn propagate_public_teardown_call_request(&mut self, private_call: PrivateCircuitPublicInputs) { - let call_request = private_call.public_teardown_call_request; + fn propagate_public_teardown_call_request( + &mut self, + private_call_public_inputs: PrivateCircuitPublicInputs, + ) { + let call_request = private_call_public_inputs.public_teardown_call_request; if !is_empty(call_request) { assert( is_empty(self.public_inputs.public_teardown_call_request), @@ -314,10 +358,10 @@ impl PrivateKernelCircuitPublicInputsComposer { } } - fn propagate_fee_payer(&mut self, private_call: PrivateCircuitPublicInputs) { - if (private_call.is_fee_payer) { + fn propagate_fee_payer(&mut self, private_call_public_inputs: PrivateCircuitPublicInputs) { + if (private_call_public_inputs.is_fee_payer) { assert(self.public_inputs.fee_payer.is_zero(), "Cannot overwrite non-empty fee_payer"); - self.public_inputs.fee_payer = private_call.call_context.contract_address; + self.public_inputs.fee_payer = private_call_public_inputs.call_context.contract_address; } } } diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_init.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_init.nr index 59395030cbb6..11a006111a6b 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_init.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_init.nr @@ -43,16 +43,15 @@ impl PrivateKernelInitCircuitPrivateInputs { } unconstrained fn generate_output(self) -> PrivateKernelCircuitPublicInputs { - let private_call_public_inputs = self.private_call.public_inputs; PrivateKernelCircuitPublicInputsComposer::new_from_tx_request( self.tx_request, - private_call_public_inputs, + self.private_call.public_inputs, self.vk_tree_root, self.protocol_contract_tree_root, self.is_private_only, self.first_nullifier_hint, ) - .with_private_call(private_call_public_inputs) + .with_private_call(self.private_call) .finish() } @@ -78,7 +77,7 @@ impl PrivateKernelInitCircuitPrivateInputs { if dep::types::validate::should_validate_output() { PrivateKernelCircuitOutputValidator::new(output).validate_as_first_call( self.tx_request, - self.private_call.public_inputs, + self.private_call, private_call_data_validator.array_lengths, self.vk_tree_root, self.protocol_contract_tree_root, @@ -107,11 +106,14 @@ mod tests { pub fn new() -> Self { let private_call = FixtureBuilder::new().is_first_call(); let tx_request = private_call.build_tx_request(); + PrivateKernelInitInputsBuilder { tx_request, private_call } } - pub fn execute(self) -> PrivateKernelCircuitPublicInputs { + pub fn execute(mut self) -> PrivateKernelCircuitPublicInputs { + self.private_call.compute_update_tree_and_hints(); let private_call = self.private_call.to_private_call_data(); + PrivateKernelInitCircuitPrivateInputs { tx_request: self.tx_request, private_call, diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_inner.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_inner.nr index f0d64bec2c69..f973399df79d 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_inner.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_inner.nr @@ -43,7 +43,7 @@ impl PrivateKernelInnerCircuitPrivateInputs { self.previous_kernel.public_inputs, ) .pop_top_call_request() - .with_private_call(self.private_call.public_inputs) + .with_private_call(self.private_call) .finish() } @@ -81,7 +81,7 @@ impl PrivateKernelInnerCircuitPrivateInputs { PrivateKernelCircuitOutputValidator::new(output).validate_as_inner_call( self.previous_kernel.public_inputs, previous_kernel_array_lengths, - self.private_call.public_inputs, + self.private_call, private_call_data_validator.array_lengths, ); } @@ -118,8 +118,10 @@ mod tests { } pub fn execute(&mut self) -> PrivateKernelCircuitPublicInputs { + self.private_call.compute_update_tree_and_hints(); let private_call = self.private_call.to_private_call_data(); self.previous_kernel.add_private_call_request_for_private_call(private_call); + self.previous_kernel.set_historical_header_from_call_data(private_call); let previous_kernel = self.previous_kernel.to_private_kernel_data(); let kernel = PrivateKernelInnerCircuitPrivateInputs { previous_kernel, private_call }; diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_call_data_validator_builder/mod.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_call_data_validator_builder/mod.nr index 606b05a01206..ea3d0aaaa80b 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_call_data_validator_builder/mod.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_call_data_validator_builder/mod.nr @@ -32,7 +32,9 @@ impl PrivateCallDataValidatorBuilder { } pub fn new_from_counter(counter: u32) -> Self { - let private_call = FixtureBuilder::new_from_counter(counter); + let mut private_call = FixtureBuilder::new_from_counter(counter); + private_call.compute_update_tree_and_hints(); + let previous_note_hashes = BoundedVec::new(); PrivateCallDataValidatorBuilder { private_call, previous_note_hashes } } diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_call_data_validator_builder/validate_against_previous_kernel.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_call_data_validator_builder/validate_against_previous_kernel.nr index 6878159ee2ed..2462b5f5be29 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_call_data_validator_builder/validate_against_previous_kernel.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_call_data_validator_builder/validate_against_previous_kernel.nr @@ -17,18 +17,19 @@ impl PrivateCallDataValidatorBuilder { previous_kernel, ); } -} -fn make_previous_kernel() -> PrivateKernelCircuitPublicInputs { - let builder = FixtureBuilder::new(); - builder.to_private_kernel_circuit_public_inputs() + fn make_previous_kernel(self) -> PrivateKernelCircuitPublicInputs { + let mut builder = FixtureBuilder::new(); + builder.historical_header = self.private_call.historical_header; + builder.to_private_kernel_circuit_public_inputs() + } } #[test] fn validate_against_previous_kernel_succeeds() { let builder = PrivateCallDataValidatorBuilder::new(); - let previous_kernel = make_previous_kernel(); + let previous_kernel = builder.make_previous_kernel(); builder.validate_against_previous_kernel(previous_kernel); } @@ -37,7 +38,7 @@ fn validate_against_previous_kernel_succeeds() { fn validate_against_previous_kernel_mismatch_header_version_fails() { let builder = PrivateCallDataValidatorBuilder::new(); - let mut previous_kernel = make_previous_kernel(); + let mut previous_kernel = builder.make_previous_kernel(); previous_kernel.constants.historical_header.global_variables.version += 1; builder.validate_against_previous_kernel(previous_kernel); @@ -47,7 +48,7 @@ fn validate_against_previous_kernel_mismatch_header_version_fails() { fn validate_against_previous_kernel_mismatch_chain_id_fails() { let builder = PrivateCallDataValidatorBuilder::new(); - let mut previous_kernel = make_previous_kernel(); + let mut previous_kernel = builder.make_previous_kernel(); previous_kernel.constants.tx_context.chain_id += 1; builder.validate_against_previous_kernel(previous_kernel); diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_call_data_validator_builder/validate_contract_address.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_call_data_validator_builder/validate_contract_address.nr index 4c4a7f3c6d16..c68b0d4ee9ef 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_call_data_validator_builder/validate_contract_address.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_call_data_validator_builder/validate_contract_address.nr @@ -1,7 +1,11 @@ use crate::tests::private_call_data_validator_builder::PrivateCallDataValidatorBuilder; use dep::types::address::AztecAddress; use std::embedded_curve_ops::{EmbeddedCurveScalar, fixed_base_scalar_mul as derive_public_key}; +use types::contract_class_id::ContractClassId; use types::hash::verification_key_hash; +use types::shared_mutable::scheduled_value_change::ScheduledValueChange; +use types::tests::fixtures; +use types::traits::FromField; impl PrivateCallDataValidatorBuilder { pub fn new_with_regular_contract() -> Self { @@ -161,3 +165,63 @@ fn validate_contract_address_regular_address_wrong_low_leaf() { builder.validate(); } + +#[test] +fn validate_contract_address_with_updated_contract_succeeds() { + let mut builder = PrivateCallDataValidatorBuilder::new_with_regular_contract(); + let original_class_id = ContractClassId::from_field(27); + builder.private_call.contract_address = AztecAddress::compute_from_class_id( + original_class_id, + builder.private_call.salted_initialization_hash, + builder.private_call.public_keys, + ); + builder.private_call.updated_class_id_value_change = ScheduledValueChange::new( + original_class_id, + fixtures::contracts::default_contract.contract_class_id, + builder.private_call.historical_header.global_variables.block_number as u32, + ); + + builder.private_call.compute_update_tree_and_hints(); + + builder.validate(); +} + +#[test(should_fail_with = "computed contract address does not match expected one")] +fn validate_contract_address_not_yet_updated_contract_fails() { + let mut builder = PrivateCallDataValidatorBuilder::new_with_regular_contract(); + let original_class_id = ContractClassId::from_field(27); + builder.private_call.contract_address = AztecAddress::compute_from_class_id( + original_class_id, + builder.private_call.salted_initialization_hash, + builder.private_call.public_keys, + ); + builder.private_call.updated_class_id_value_change = ScheduledValueChange::new( + original_class_id, + fixtures::contracts::default_contract.contract_class_id, + (builder.private_call.historical_header.global_variables.block_number + 1) as u32, + ); + + builder.private_call.compute_update_tree_and_hints(); + + builder.validate(); +} + +#[test(should_fail_with = "computed contract address does not match expected one")] +fn validate_contract_address_updated_to_different_class_fails() { + let mut builder = PrivateCallDataValidatorBuilder::new_with_regular_contract(); + let original_class_id = ContractClassId::from_field(27); + builder.private_call.contract_address = AztecAddress::compute_from_class_id( + original_class_id, + builder.private_call.salted_initialization_hash, + builder.private_call.public_keys, + ); + builder.private_call.updated_class_id_value_change = ScheduledValueChange::new( + original_class_id, + ContractClassId::from_field(28), + builder.private_call.historical_header.global_variables.block_number as u32, + ); + + builder.private_call.compute_update_tree_and_hints(); + + builder.validate(); +} diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_output_validator_builder/mod.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_output_validator_builder/mod.nr index ee0f932ab4c3..c1840e0f4639 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_output_validator_builder/mod.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_output_validator_builder/mod.nr @@ -14,7 +14,7 @@ use dep::types::{ private_circuit_public_inputs::PrivateCircuitPublicInputsArrayLengths, side_effect::OrderedValue, }, - constants::PRIVATE_KERNEL_INIT_INDEX, + constants::{DEFAULT_UPDATE_DELAY, PRIVATE_KERNEL_INIT_INDEX}, tests::fixture_builder::FixtureBuilder, traits::Empty, transaction::tx_request::TxRequest, @@ -35,6 +35,10 @@ impl PrivateKernelCircuitOutputValidatorBuilder { let mut output = FixtureBuilder::new(); let tx_request = output.build_tx_request(); output.claimed_first_nullifier = 27; + output.set_max_block_number( + (previous_kernel.historical_header.global_variables.block_number) as u32 + + DEFAULT_UPDATE_DELAY, + ); previous_kernel.claimed_first_nullifier = 27; previous_kernel = previous_kernel.in_vk_tree(PRIVATE_KERNEL_INIT_INDEX); @@ -76,7 +80,7 @@ impl PrivateKernelCircuitOutputValidatorBuilder { let output = self.output.to_private_kernel_circuit_public_inputs(); PrivateKernelCircuitOutputValidator::new(output).validate_as_first_call( self.tx_request, - private_call.public_inputs, + private_call, array_lengths, FixtureBuilder::vk_tree_root(), self.private_call.protocol_contract_tree_root, @@ -102,7 +106,7 @@ impl PrivateKernelCircuitOutputValidatorBuilder { PrivateKernelCircuitOutputValidator::new(output).validate_as_inner_call( previous_kernel, previous_kernel_array_lengths, - private_call.public_inputs, + private_call, private_call_array_lengths, ); } diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_output_validator_builder/validate_aggregated_values.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_output_validator_builder/validate_aggregated_values.nr index 9eb024dcb70b..c1f7ce7772a1 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_output_validator_builder/validate_aggregated_values.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_output_validator_builder/validate_aggregated_values.nr @@ -13,8 +13,8 @@ fn validate_aggregated_values_empty_data_succeeds() { fn validate_aggregated_values_min_revertible_side_effect_counter_from_previous_succeeds() { let mut builder = PrivateKernelCircuitOutputValidatorBuilder::new(); - builder.previous_kernel.min_revertible_side_effect_counter = 123; - builder.output.min_revertible_side_effect_counter = 123; + builder.previous_kernel.min_revertible_side_effect_counter = 3; + builder.output.min_revertible_side_effect_counter = 3; builder.validate_as_inner_call(); } @@ -23,8 +23,8 @@ fn validate_aggregated_values_min_revertible_side_effect_counter_from_previous_s fn validate_aggregated_values_min_revertible_side_effect_counter_from_private_call_succeeds() { let mut builder = PrivateKernelCircuitOutputValidatorBuilder::new(); - builder.private_call.min_revertible_side_effect_counter = 123; - builder.output.min_revertible_side_effect_counter = 123; + builder.private_call.min_revertible_side_effect_counter = 3; + builder.output.min_revertible_side_effect_counter = 3; builder.validate_as_inner_call(); } @@ -33,9 +33,9 @@ fn validate_aggregated_values_min_revertible_side_effect_counter_from_private_ca fn validate_aggregated_values_min_revertible_side_effect_counter_overwrite_fails() { let mut builder = PrivateKernelCircuitOutputValidatorBuilder::new(); - builder.previous_kernel.min_revertible_side_effect_counter = 123; + builder.previous_kernel.min_revertible_side_effect_counter = 3; builder.private_call.min_revertible_side_effect_counter = 4567; - builder.output.min_revertible_side_effect_counter = 123; + builder.output.min_revertible_side_effect_counter = 3; builder.validate_as_inner_call(); } @@ -44,7 +44,7 @@ fn validate_aggregated_values_min_revertible_side_effect_counter_overwrite_fails fn validate_aggregated_values_min_revertible_side_effect_counter_from_previous_mismatch_fails() { let mut builder = PrivateKernelCircuitOutputValidatorBuilder::new(); - builder.previous_kernel.min_revertible_side_effect_counter = 123; + builder.previous_kernel.min_revertible_side_effect_counter = 3; builder.output.min_revertible_side_effect_counter = 4567; builder.validate_as_inner_call(); @@ -54,7 +54,7 @@ fn validate_aggregated_values_min_revertible_side_effect_counter_from_previous_m fn validate_aggregated_values_min_revertible_side_effect_counter_from_private_call_mismatch_fails() { let mut builder = PrivateKernelCircuitOutputValidatorBuilder::new(); - builder.private_call.min_revertible_side_effect_counter = 123; + builder.private_call.min_revertible_side_effect_counter = 3; builder.output.min_revertible_side_effect_counter = 4567; builder.validate_as_inner_call(); @@ -64,7 +64,7 @@ fn validate_aggregated_values_min_revertible_side_effect_counter_from_private_ca fn validate_aggregated_values_min_revertible_side_effect_counter_random_output_fails() { let mut builder = PrivateKernelCircuitOutputValidatorBuilder::new(); - builder.output.min_revertible_side_effect_counter = 123; + builder.output.min_revertible_side_effect_counter = 3; builder.validate_as_inner_call(); } @@ -76,8 +76,8 @@ fn validate_aggregated_values_min_revertible_side_effect_counter_random_output_f fn validate_aggregated_values_max_block_number_from_previous_succeeds() { let mut builder = PrivateKernelCircuitOutputValidatorBuilder::new(); - builder.previous_kernel.set_max_block_number(123); - builder.output.set_max_block_number(123); + builder.previous_kernel.set_max_block_number(3); + builder.output.set_max_block_number(3); builder.validate_as_inner_call(); } @@ -86,8 +86,8 @@ fn validate_aggregated_values_max_block_number_from_previous_succeeds() { fn validate_aggregated_values_max_block_number_from_private_call_succeeds() { let mut builder = PrivateKernelCircuitOutputValidatorBuilder::new(); - builder.private_call.set_max_block_number(123); - builder.output.set_max_block_number(123); + builder.private_call.set_max_block_number(3); + builder.output.set_max_block_number(3); builder.validate_as_inner_call(); } @@ -96,9 +96,9 @@ fn validate_aggregated_values_max_block_number_from_private_call_succeeds() { fn validate_aggregated_values_max_block_number_from_both_succeeds() { let mut builder = PrivateKernelCircuitOutputValidatorBuilder::new(); - builder.previous_kernel.set_max_block_number(123); - builder.private_call.set_max_block_number(123); - builder.output.set_max_block_number(123); + builder.previous_kernel.set_max_block_number(3); + builder.private_call.set_max_block_number(3); + builder.output.set_max_block_number(3); builder.validate_as_inner_call(); } @@ -107,9 +107,9 @@ fn validate_aggregated_values_max_block_number_from_both_succeeds() { fn validate_aggregated_values_max_block_number_from_both_pick_previous_succeeds() { let mut builder = PrivateKernelCircuitOutputValidatorBuilder::new(); - builder.previous_kernel.set_max_block_number(123); - builder.private_call.set_max_block_number(4567); - builder.output.set_max_block_number(123); + builder.previous_kernel.set_max_block_number(3); + builder.private_call.set_max_block_number(4); + builder.output.set_max_block_number(3); builder.validate_as_inner_call(); } @@ -118,9 +118,9 @@ fn validate_aggregated_values_max_block_number_from_both_pick_previous_succeeds( fn validate_aggregated_values_max_block_number_from_both_pick_private_call_succeeds() { let mut builder = PrivateKernelCircuitOutputValidatorBuilder::new(); - builder.previous_kernel.set_max_block_number(4567); - builder.private_call.set_max_block_number(123); - builder.output.set_max_block_number(123); + builder.previous_kernel.set_max_block_number(4); + builder.private_call.set_max_block_number(3); + builder.output.set_max_block_number(3); builder.validate_as_inner_call(); } @@ -129,9 +129,9 @@ fn validate_aggregated_values_max_block_number_from_both_pick_private_call_succe fn validate_aggregated_values_max_block_number_from_both_pick_larger_fails() { let mut builder = PrivateKernelCircuitOutputValidatorBuilder::new(); - builder.previous_kernel.set_max_block_number(4567); - builder.private_call.set_max_block_number(123); - builder.output.set_max_block_number(4567); + builder.previous_kernel.set_max_block_number(4); + builder.private_call.set_max_block_number(3); + builder.output.set_max_block_number(4); builder.validate_as_inner_call(); } @@ -140,7 +140,7 @@ fn validate_aggregated_values_max_block_number_from_both_pick_larger_fails() { fn validate_aggregated_values_max_block_number_random_output_fails() { let mut builder = PrivateKernelCircuitOutputValidatorBuilder::new(); - builder.output.set_max_block_number(123); + builder.output.set_max_block_number(3); builder.validate_as_inner_call(); } diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_output_validator_builder/validate_initial_values.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_output_validator_builder/validate_initial_values.nr index c30bc3acbbdf..a2986c3fad20 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_output_validator_builder/validate_initial_values.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_output_validator_builder/validate_initial_values.nr @@ -100,8 +100,8 @@ fn validate_initial_values_min_revertible_side_effect_counter_random_output_fail fn validate_initial_values_max_block_number_succeeds() { let mut builder = PrivateKernelCircuitOutputValidatorBuilder::new(); - builder.private_call.set_max_block_number(123); - builder.output.set_max_block_number(123); + builder.private_call.set_max_block_number(3); + builder.output.set_max_block_number(3); builder.validate_as_first_call(false); } @@ -110,8 +110,8 @@ fn validate_initial_values_max_block_number_succeeds() { fn validate_initial_values_max_block_number_mismatch_fails() { let mut builder = PrivateKernelCircuitOutputValidatorBuilder::new(); - builder.private_call.set_max_block_number(4567); - builder.output.set_max_block_number(123); + builder.private_call.set_max_block_number(4); + builder.output.set_max_block_number(3); builder.validate_as_first_call(false); } @@ -120,7 +120,7 @@ fn validate_initial_values_max_block_number_mismatch_fails() { fn validate_initial_values_max_block_number_empty_output_fails() { let mut builder = PrivateKernelCircuitOutputValidatorBuilder::new(); - builder.private_call.set_max_block_number(4567); + builder.private_call.set_max_block_number(4); builder.validate_as_first_call(false); } @@ -129,7 +129,7 @@ fn validate_initial_values_max_block_number_empty_output_fails() { fn validate_initial_values_max_block_number_random_output_fails() { let mut builder = PrivateKernelCircuitOutputValidatorBuilder::new(); - builder.output.set_max_block_number(123); + builder.output.set_max_block_number(3); builder.validate_as_first_call(false); } @@ -215,7 +215,7 @@ fn validate_initial_values_fee_payer_empty_output_fails() { fn validate_initial_values_fee_payer_random_output_fails() { let mut builder = PrivateKernelCircuitOutputValidatorBuilder::new(); - builder.output.set_fee_payer(AztecAddress::from_field(123)); + builder.output.set_fee_payer(AztecAddress::from_field(3)); builder.validate_as_first_call(false); } diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_public_inputs_composer_builder/mod.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_public_inputs_composer_builder/mod.nr index 8b8bcee6f01f..469a35e32288 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_public_inputs_composer_builder/mod.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_public_inputs_composer_builder/mod.nr @@ -69,10 +69,7 @@ impl PrivateKernelCircuitPublicInputsComposerBuilder { is_private_only: bool, ) -> PrivateKernelCircuitPublicInputs { let private_call = self.private_call.to_private_call_data(); - self - .new_from_tx_request(is_private_only) - .with_private_call(private_call.public_inputs) - .finish() + self.new_from_tx_request(is_private_only).with_private_call(private_call).finish() } pub fn compose_from_previous_kernel(self) -> PrivateKernelCircuitPublicInputs { @@ -88,7 +85,7 @@ impl PrivateKernelCircuitPublicInputsComposerBuilder { unsafe { PrivateKernelCircuitPublicInputsComposer::new_from_previous_kernel(previous_kernel) .pop_top_call_request() - .with_private_call(private_call.public_inputs) + .with_private_call(private_call) .finish() } } diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_public_inputs_composer_builder/new_from_previous_kernel_with_private_call.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_public_inputs_composer_builder/new_from_previous_kernel_with_private_call.nr index 8e4d03af9f4b..b9b2f00a33c8 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_public_inputs_composer_builder/new_from_previous_kernel_with_private_call.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_public_inputs_composer_builder/new_from_previous_kernel_with_private_call.nr @@ -1,7 +1,7 @@ use crate::tests::private_kernel_circuit_public_inputs_composer_builder::PrivateKernelCircuitPublicInputsComposerBuilder; use dep::types::{ abis::kernel_circuit_public_inputs::PrivateKernelCircuitPublicInputsArrayLengths, - tests::utils::assert_array_eq, traits::is_empty, + constants::DEFAULT_UPDATE_DELAY, tests::utils::assert_array_eq, traits::is_empty, }; #[test] @@ -14,7 +14,10 @@ fn new_from_previous_kernel_with_private_call_empty_data_succeeds() { let expected_array_lengths = PrivateKernelCircuitPublicInputsArrayLengths::empty(); assert_eq(array_lengths, expected_array_lengths); - assert(output.validation_requests.for_rollup.max_block_number.is_none()); + assert_eq( + output.validation_requests.for_rollup.max_block_number.unwrap_unchecked(), + DEFAULT_UPDATE_DELAY, + ); assert(is_empty(output.public_teardown_call_request)); assert(is_empty(output.fee_payer)); } @@ -23,30 +26,30 @@ fn new_from_previous_kernel_with_private_call_empty_data_succeeds() { fn new_from_previous_kernel_with_private_call_min_revertible_side_effect_counter_prev_empty_succeeds() { let mut builder = PrivateKernelCircuitPublicInputsComposerBuilder::new(); - builder.private_call.min_revertible_side_effect_counter = 123; + builder.private_call.min_revertible_side_effect_counter = 3; let output = builder.compose_from_previous_kernel(); - assert_eq(output.min_revertible_side_effect_counter, 123); + assert_eq(output.min_revertible_side_effect_counter, 3); } #[test] fn new_from_previous_kernel_with_private_call_min_revertible_side_effect_counter_curr_empty_succeeds() { let mut builder = PrivateKernelCircuitPublicInputsComposerBuilder::new(); - builder.previous_kernel.min_revertible_side_effect_counter = 123; + builder.previous_kernel.min_revertible_side_effect_counter = 3; let output = builder.compose_from_previous_kernel(); - assert_eq(output.min_revertible_side_effect_counter, 123); + assert_eq(output.min_revertible_side_effect_counter, 3); } #[test(should_fail_with = "cannot overwrite non-zero min_revertible_side_effect_counter")] fn new_from_previous_kernel_with_private_call_min_revertible_side_effect_counter_overwrite_fails() { let mut builder = PrivateKernelCircuitPublicInputsComposerBuilder::new(); - builder.previous_kernel.min_revertible_side_effect_counter = 123; - builder.private_call.min_revertible_side_effect_counter = 123; + builder.previous_kernel.min_revertible_side_effect_counter = 3; + builder.private_call.min_revertible_side_effect_counter = 3; let _ = builder.compose_from_previous_kernel(); } @@ -55,46 +58,46 @@ fn new_from_previous_kernel_with_private_call_min_revertible_side_effect_counter fn new_from_previous_kernel_with_private_call_max_block_number_prev_empty_succeeds() { let mut builder = PrivateKernelCircuitPublicInputsComposerBuilder::new(); - builder.private_call.set_max_block_number(123); + builder.private_call.set_max_block_number(3); let output = builder.compose_from_previous_kernel(); - assert_eq(output.validation_requests.for_rollup.max_block_number.unwrap(), 123); + assert_eq(output.validation_requests.for_rollup.max_block_number.unwrap(), 3); } #[test] fn new_from_previous_kernel_with_private_call_max_block_number_curr_empty_succeeds() { let mut builder = PrivateKernelCircuitPublicInputsComposerBuilder::new(); - builder.previous_kernel.set_max_block_number(123); + builder.previous_kernel.set_max_block_number(3); let output = builder.compose_from_previous_kernel(); - assert_eq(output.validation_requests.for_rollup.max_block_number.unwrap(), 123); + assert_eq(output.validation_requests.for_rollup.max_block_number.unwrap(), 3); } #[test] fn new_from_previous_kernel_with_private_call_max_block_number_pick_prev_succeeds() { let mut builder = PrivateKernelCircuitPublicInputsComposerBuilder::new(); - builder.previous_kernel.set_max_block_number(123); - builder.private_call.set_max_block_number(4567); + builder.previous_kernel.set_max_block_number(3); + builder.private_call.set_max_block_number(4); let output = builder.compose_from_previous_kernel(); - assert_eq(output.validation_requests.for_rollup.max_block_number.unwrap(), 123); + assert_eq(output.validation_requests.for_rollup.max_block_number.unwrap(), 3); } #[test] fn new_from_previous_kernel_with_private_call_max_block_number_pick_curr_succeeds() { let mut builder = PrivateKernelCircuitPublicInputsComposerBuilder::new(); - builder.previous_kernel.set_max_block_number(4567); - builder.private_call.set_max_block_number(123); + builder.previous_kernel.set_max_block_number(4); + builder.private_call.set_max_block_number(3); let output = builder.compose_from_previous_kernel(); - assert_eq(output.validation_requests.for_rollup.max_block_number.unwrap(), 123); + assert_eq(output.validation_requests.for_rollup.max_block_number.unwrap(), 3); } #[test] diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_public_inputs_composer_builder/propagate_from_private_call.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_public_inputs_composer_builder/propagate_from_private_call.nr index 66cfd54d85af..c1fc2dc9316d 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_public_inputs_composer_builder/propagate_from_private_call.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_public_inputs_composer_builder/propagate_from_private_call.nr @@ -4,7 +4,7 @@ use crate::{ }; use dep::types::{ abis::kernel_circuit_public_inputs::PrivateKernelCircuitPublicInputsArrayLengths, - tests::utils::assert_array_eq, traits::is_empty, + constants::DEFAULT_UPDATE_DELAY, tests::utils::assert_array_eq, traits::is_empty, }; #[test] @@ -25,8 +25,18 @@ fn propagate_from_private_call_empty_data_succeeds() { assert_eq(array_lengths, expected_array_lengths); assert_eq(output.min_revertible_side_effect_counter, 0); - assert(is_empty(output.validation_requests)); - assert(output.validation_requests.for_rollup.max_block_number.is_none()); + assert(is_empty(output.validation_requests.note_hash_read_requests)); + assert(is_empty(output.validation_requests.nullifier_read_requests)); + assert( + is_empty( + output.validation_requests.scoped_key_validation_requests_and_generators, + ), + ); + assert(is_empty(output.validation_requests.split_counter)); + assert_eq( + output.validation_requests.for_rollup.max_block_number.unwrap_unchecked(), + DEFAULT_UPDATE_DELAY, + ); assert(is_empty(output.public_teardown_call_request)); assert(is_empty(output.fee_payer)); } @@ -46,11 +56,11 @@ fn propagate_from_private_call_min_revertible_side_effect_counter_succeeds() { fn propagate_from_private_call_max_block_number_succeeds() { let mut builder = PrivateKernelCircuitPublicInputsComposerBuilder::new(); - builder.private_call.set_max_block_number(123); + builder.private_call.set_max_block_number(5); let output = builder.compose_from_tx_request(false); - assert_eq(output.validation_requests.for_rollup.max_block_number.unwrap(), 123); + assert_eq(output.validation_requests.for_rollup.max_block_number.unwrap(), 5); } #[test] diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_kernel/private_call_data.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_kernel/private_call_data.nr index 6dea5bcc94d6..c36e5825547c 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_kernel/private_call_data.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_kernel/private_call_data.nr @@ -6,7 +6,9 @@ use crate::{ address::SaltedInitializationHash, constants::{ FUNCTION_TREE_HEIGHT, PROOF_TYPE_OINK, PROOF_TYPE_PG, PROTOCOL_CONTRACT_TREE_HEIGHT, + PUBLIC_DATA_TREE_HEIGHT, }, + data::public_data_tree_leaf_preimage::PublicDataTreeLeafPreimage, merkle_tree::membership::MembershipWitness, proof::verification_key::ClientIVCVerificationKey, public_keys::PublicKeys, @@ -14,17 +16,8 @@ use crate::{ pub struct PrivateCallData { pub public_inputs: PrivateCircuitPublicInputs, - pub vk: ClientIVCVerificationKey, - - pub salted_initialization_hash: SaltedInitializationHash, - pub public_keys: PublicKeys, - pub contract_class_artifact_hash: Field, - pub contract_class_public_bytecode_commitment: Field, - pub function_leaf_membership_witness: MembershipWitness, - pub protocol_contract_membership_witness: MembershipWitness, - pub protocol_contract_leaf: ProtocolContractLeafPreimage, - pub acir_hash: Field, + pub verification_key_hints: PrivateVerificationKeyHints, } impl PrivateCallData { @@ -39,9 +32,7 @@ impl PrivateCallData { } } -pub struct PrivateCallDataWithoutPublicInputs { - pub vk: ClientIVCVerificationKey, - +pub struct PrivateVerificationKeyHints { pub salted_initialization_hash: SaltedInitializationHash, pub public_keys: PublicKeys, pub contract_class_artifact_hash: Field, @@ -50,6 +41,15 @@ pub struct PrivateCallDataWithoutPublicInputs { pub protocol_contract_membership_witness: MembershipWitness, pub protocol_contract_leaf: ProtocolContractLeafPreimage, pub acir_hash: Field, + pub updated_class_id_witness: MembershipWitness, + pub updated_class_id_leaf: PublicDataTreeLeafPreimage, + pub updated_class_id_value_change: [Field; 3], + pub updated_class_id_delay_change: [Field; 1], +} + +pub struct PrivateCallDataWithoutPublicInputs { + pub vk: ClientIVCVerificationKey, + pub verification_key_hints: PrivateVerificationKeyHints, } impl PrivateCallDataWithoutPublicInputs { @@ -60,15 +60,7 @@ impl PrivateCallDataWithoutPublicInputs { PrivateCallData { public_inputs, vk: self.vk, - salted_initialization_hash: self.salted_initialization_hash, - public_keys: self.public_keys, - contract_class_artifact_hash: self.contract_class_artifact_hash, - contract_class_public_bytecode_commitment: self - .contract_class_public_bytecode_commitment, - function_leaf_membership_witness: self.function_leaf_membership_witness, - protocol_contract_membership_witness: self.protocol_contract_membership_witness, - protocol_contract_leaf: self.protocol_contract_leaf, - acir_hash: self.acir_hash, + verification_key_hints: self.verification_key_hints, } } } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/address/aztec_address.nr b/noir-projects/noir-protocol-circuits/crates/types/src/address/aztec_address.nr index 2d7250d531cc..eeb33844923c 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/address/aztec_address.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/address/aztec_address.nr @@ -1,15 +1,13 @@ use crate::{ - abis::function_selector::FunctionSelector, address::{ partial_address::PartialAddress, salted_initialization_hash::SaltedInitializationHash, }, constants::{ - AZTEC_ADDRESS_LENGTH, FUNCTION_TREE_HEIGHT, GENERATOR_INDEX__CONTRACT_ADDRESS_V1, - MAX_FIELD_VALUE, + AZTEC_ADDRESS_LENGTH, GENERATOR_INDEX__CONTRACT_ADDRESS_V1, MAX_FIELD_VALUE, + MAX_PROTOCOL_CONTRACTS, }, contract_class_id::ContractClassId, - hash::{poseidon2_hash_with_separator, private_functions_root_from_siblings}, - merkle_tree::membership::MembershipWitness, + hash::poseidon2_hash_with_separator, public_keys::{IvpkM, NpkM, OvpkM, PublicKeys, ToPoint, TpkM}, traits::{Deserialize, Empty, FromField, Packable, Serialize, ToField}, }; @@ -124,29 +122,11 @@ impl AztecAddress { AztecAddress::from_field(address_point.x) } - pub fn compute_from_private_function( - function_selector: FunctionSelector, - function_vk_hash: Field, - function_leaf_membership_witness: MembershipWitness, - contract_class_artifact_hash: Field, - contract_class_public_bytecode_commitment: Field, + pub fn compute_from_class_id( + contract_class_id: ContractClassId, salted_initialization_hash: SaltedInitializationHash, public_keys: PublicKeys, ) -> Self { - let private_functions_root = private_functions_root_from_siblings( - function_selector, - function_vk_hash, - function_leaf_membership_witness.leaf_index, - function_leaf_membership_witness.sibling_path, - ); - - let contract_class_id = ContractClassId::compute( - contract_class_artifact_hash, - private_functions_root, - contract_class_public_bytecode_commitment, - ); - - // Compute contract address using the preimage which includes the class_id. let partial_address = PartialAddress::compute_from_salted_initialization_hash( contract_class_id, salted_initialization_hash, @@ -155,6 +135,10 @@ impl AztecAddress { AztecAddress::compute(public_keys, partial_address) } + pub fn is_protocol_contract(self) -> bool { + self.inner.lt(MAX_PROTOCOL_CONTRACTS as Field) + } + pub fn is_zero(self) -> bool { self.inner == 0 } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr b/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr index 4467b83781da..57675a3d2bda 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr @@ -171,6 +171,10 @@ pub global REGISTERER_UNCONSTRAINED_FUNCTION_BROADCASTED_MAGIC_VALUE: Field = pub global DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE: Field = 0x85864497636cf755ae7bde03f267ce01a520981c21c3682aaf82a631; +// sha224sum 'struct ContractInstanceUpdated' +pub global DEPLOYER_CONTRACT_INSTANCE_UPDATED_MAGIC_VALUE: Field = + 0x0e92f9f8a534e858fcf777da206e08b0c620ecf9deb21d13479813f6; + // CANONICAL CONTRACT ADDRESSES pub global MAX_PROTOCOL_CONTRACTS: u32 = (1 << PROTOCOL_CONTRACT_TREE_HEIGHT as u8) - 1; // Index 0 can't be used. pub global CANONICAL_AUTH_REGISTRY_ADDRESS: AztecAddress = AztecAddress::from_field(1); @@ -186,6 +190,9 @@ pub global REGISTERER_CONTRACT_BYTECODE_CAPSULE_SLOT: Field = 79025834455612; // Slot of the balances map to be hashed with an AztecAddress (map key) to get an actual storage slot. pub global FEE_JUICE_BALANCES_SLOT: u32 = 1; +// Slot of the updated_class_ids map to be hashed with an AztecAddress (map key) to get an actual storage slot. +pub global UPDATED_CLASS_IDS_SLOT: u32 = 1; + // CANONICAL DEFAULT KEYS // This below are: // "az_null_npk" @@ -765,6 +772,18 @@ pub global PROOF_TYPE_ROOT_ROLLUP_HONK: u32 = 6; pub global TWO_POW_64: Field = 18446744073709551616; +// 24 hours with a slot duration of 24 seconds +pub global DEFAULT_UPDATE_DELAY: u32 = 3600; +// 10 minutes with a slot duration of 24 seconds +pub global MINIMUM_UPDATE_DELAY: u32 = 25; + +// Updates hold contract class id, which fit in 1 field. +pub global UPDATES_VALUE_SIZE: u32 = 1; +pub global UPDATES_SCHEDULED_VALUE_CHANGE_LEN: u32 = 2 * UPDATES_VALUE_SIZE + 1; +pub global SCHEDULED_DELAY_CHANGE_PCKD_LEN: u32 = 1; +pub global UPDATES_SHARED_MUTABLE_VALUES_LEN: u32 = + UPDATES_SCHEDULED_VALUE_CHANGE_LEN + SCHEDULED_DELAY_CHANGE_PCKD_LEN; + mod test { use crate::constants::{ MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/contract_class_id.nr b/noir-projects/noir-protocol-circuits/crates/types/src/contract_class_id.nr index 2ff06c1d8e4f..fb68c541257b 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/contract_class_id.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/contract_class_id.nr @@ -1,5 +1,5 @@ use crate::constants::GENERATOR_INDEX__CONTRACT_LEAF; -use crate::traits::{Deserialize, FromField, Packable, Serialize, ToField}; +use crate::traits::{Deserialize, Empty, FromField, Packable, Serialize, ToField}; pub struct ContractClassId { pub inner: Field, @@ -35,6 +35,12 @@ impl Deserialize<1> for ContractClassId { } } +impl Empty for ContractClassId { + fn empty() -> Self { + Self { inner: 0 } + } +} + // Implement the Packable trait so ContractClassId can be stored in contract's storage. impl Packable<1> for ContractClassId { fn pack(self) -> [Field; 1] { diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/debug.nr b/noir-projects/noir-protocol-circuits/crates/types/src/debug.nr new file mode 100644 index 000000000000..31ccafc068f9 --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/types/src/debug.nr @@ -0,0 +1,16 @@ +// Temporary workaround to bypass compiler issues. Passing values to the oracle is able to fix some bugs such as https://github.com/noir-lang/noir/issues/7192 +// and https://github.com/noir-lang/noir/issues/7192 + +#[oracle(noOp)] +fn no_op_oracle(value: T) {} + +unconstrained fn no_op_oracle_wrapper(value: T) { + no_op_oracle(value); +} + +pub fn no_op(value: T) { + /// Safety: This is a no op + unsafe { + no_op_oracle_wrapper(value); + } +} diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/lib.nr b/noir-projects/noir-protocol-circuits/crates/types/src/lib.nr index c5c37d539cb1..c0e54fdb74a7 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/lib.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/lib.nr @@ -1,6 +1,7 @@ pub mod utils; pub mod address; pub mod debug_log; +pub mod debug; pub mod public_keys; pub mod point; pub mod scalar; @@ -18,10 +19,11 @@ pub mod traits; pub mod type_serialization; pub mod type_packing; +pub mod shared_mutable; pub mod content_commitment; pub mod block_header; -mod tests; +pub(crate) mod tests; pub mod state_reference; pub mod partial_state_reference; diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/shared_mutable/mod.nr b/noir-projects/noir-protocol-circuits/crates/types/src/shared_mutable/mod.nr new file mode 100644 index 000000000000..4a91f943d1b8 --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/types/src/shared_mutable/mod.nr @@ -0,0 +1,23 @@ +use super::traits::{FromField, ToField}; + +pub use scheduled_delay_change::ScheduledDelayChange; +pub use scheduled_value_change::ScheduledValueChange; +pub use shared_mutable_values::SharedMutableValues; + +pub mod scheduled_delay_change; +pub mod scheduled_value_change; +pub mod shared_mutable_values; +pub mod with_hash; + +pub fn compute_shared_mutable_block_horizon( + value_change: ScheduledValueChange, + delay_change: ScheduledDelayChange, + historical_block_number: u32, +) -> u32 +where + T: ToField + Eq + FromField, +{ + let effective_minimum_delay = + delay_change.get_effective_minimum_delay_at(historical_block_number); + value_change.get_block_horizon(historical_block_number, effective_minimum_delay) +} diff --git a/noir-projects/aztec-nr/aztec/src/state_vars/shared_mutable/scheduled_delay_change.nr b/noir-projects/noir-protocol-circuits/crates/types/src/shared_mutable/scheduled_delay_change.nr similarity index 92% rename from noir-projects/aztec-nr/aztec/src/state_vars/shared_mutable/scheduled_delay_change.nr rename to noir-projects/noir-protocol-circuits/crates/types/src/shared_mutable/scheduled_delay_change.nr index 8ffd57d09e4e..45fdb08de68c 100644 --- a/noir-projects/aztec-nr/aztec/src/state_vars/shared_mutable/scheduled_delay_change.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/shared_mutable/scheduled_delay_change.nr @@ -1,17 +1,16 @@ -use dep::protocol_types::traits::Packable; +use crate::constants::SCHEDULED_DELAY_CHANGE_PCKD_LEN; +use crate::traits::{Empty, Packable}; use std::cmp::min; mod test; -pub(crate) global SCHEDULED_DELAY_CHANGE_PCKD_LEN: u32 = 1; - // This data structure is used by SharedMutable to store the minimum delay with which a ScheduledValueChange object can // schedule a change. // This delay is initially equal to INITIAL_DELAY, and can be safely mutated to any other value over time. This mutation // is performed via `schedule_change` in order to satisfy ScheduleValueChange constraints: if e.g. we allowed for the // delay to be decreased immediately then it'd be possible for the state variable to schedule a value change with a // reduced delay, invalidating prior private reads. -pub(crate) struct ScheduledDelayChange { +pub struct ScheduledDelayChange { // Both pre and post are stored in public storage, so by default they are zeroed. By wrapping them in an Option, // they default to Option::none(), which we detect and replace with INITIAL_DELAY. The end result is that a // ScheduledDelayChange that has not been initialized has a delay equal to INITIAL_DELAY, which is the desired @@ -23,14 +22,14 @@ pub(crate) struct ScheduledDelayChange { } impl ScheduledDelayChange { - pub(crate) fn new(pre: Option, post: Option, block_of_change: u32) -> Self { + pub fn new(pre: Option, post: Option, block_of_change: u32) -> Self { Self { pre, post, block_of_change } } /// Returns the current value of the delay stored in the data structure. /// This function only returns a meaningful value when called in public with the current block number - for /// historical private reads use `get_effective_minimum_delay_at` instead. - pub(crate) fn get_current(self, current_block_number: u32) -> u32 { + pub fn get_current(self, current_block_number: u32) -> u32 { // The post value becomes the current one at the block of change, so any transaction that is included in the // block of change will use the post value. if current_block_number < self.block_of_change { @@ -43,7 +42,7 @@ impl ScheduledDelayChange { /// Returns the scheduled change, i.e. the post-change delay and the block at which it will become the current /// delay. Note that this block may be in the past if the change has already taken place. /// Additionally, further changes might be later scheduled, potentially canceling the one returned by this function. - pub(crate) fn get_scheduled(self) -> (u32, u32) { + pub fn get_scheduled(self) -> (u32, u32) { (self.post.unwrap_or(INITIAL_DELAY), self.block_of_change) } @@ -54,7 +53,7 @@ impl ScheduledDelayChange { /// - when reducing the delay, the change will take effect after a delay equal to the difference between old and /// new delay. For example, if reducing from 3 days to 1 day, the reduction will be scheduled to happen after 2 /// days. - pub(crate) fn schedule_change(&mut self, new: u32, current_block_number: u32) { + pub fn schedule_change(&mut self, new: u32, current_block_number: u32) { let current = self.get_current(current_block_number); // When changing the delay value we must ensure that it is not possible to produce a value change with a delay @@ -91,7 +90,7 @@ impl ScheduledDelayChange { /// which a value change could be scheduled), but it also considers scenarios in which a delay reduction is /// scheduled to happen in the near future, resulting in a way to schedule a change with an overall delay lower than /// the current one. - pub(crate) fn get_effective_minimum_delay_at(self, historical_block_number: u32) -> u32 { + pub fn get_effective_minimum_delay_at(self, historical_block_number: u32) -> u32 { if self.block_of_change <= historical_block_number { // If no delay changes were scheduled, then the delay value at the historical block (post) is guaranteed to // hold due to how further delay changes would be scheduled by `schedule_change`. @@ -131,7 +130,7 @@ impl Packable for Sched fn pack(self) -> [Field; SCHEDULED_DELAY_CHANGE_PCKD_LEN] { // We pack all three u32 values into a single U128, which is made up of two u64 limbs. // Low limb: [ pre_inner: u32 | post_inner: u32 ] - // High limb: [ empty | pre_is_some: u8 | post_is_some: u8 | block_of_change: u32 ] + // High limb: [ empty | pre_is_some: u1 | post_is_some: u1 | block_of_change: u32 ] let lo = ((self.pre.unwrap_unchecked() as u64) * (1 << 32)) + (self.post.unwrap_unchecked() as u64); @@ -179,3 +178,9 @@ impl Eq for ScheduledDelayChange { & (self.block_of_change == other.block_of_change) } } + +impl Empty for ScheduledDelayChange { + fn empty() -> Self { + Self { pre: Option::none(), post: Option::none(), block_of_change: 0 } + } +} diff --git a/noir-projects/aztec-nr/aztec/src/state_vars/shared_mutable/scheduled_delay_change/test.nr b/noir-projects/noir-protocol-circuits/crates/types/src/shared_mutable/scheduled_delay_change/test.nr similarity index 99% rename from noir-projects/aztec-nr/aztec/src/state_vars/shared_mutable/scheduled_delay_change/test.nr rename to noir-projects/noir-protocol-circuits/crates/types/src/shared_mutable/scheduled_delay_change/test.nr index ff83d72da6ce..fc7778b02565 100644 --- a/noir-projects/aztec-nr/aztec/src/state_vars/shared_mutable/scheduled_delay_change/test.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/shared_mutable/scheduled_delay_change/test.nr @@ -1,4 +1,4 @@ -use crate::state_vars::shared_mutable::scheduled_delay_change::ScheduledDelayChange; +use crate::shared_mutable::scheduled_delay_change::ScheduledDelayChange; global TEST_INITIAL_DELAY: u32 = 13; diff --git a/noir-projects/aztec-nr/aztec/src/state_vars/shared_mutable/scheduled_value_change.nr b/noir-projects/noir-protocol-circuits/crates/types/src/shared_mutable/scheduled_value_change.nr similarity index 90% rename from noir-projects/aztec-nr/aztec/src/state_vars/shared_mutable/scheduled_value_change.nr rename to noir-projects/noir-protocol-circuits/crates/types/src/shared_mutable/scheduled_value_change.nr index 17db009b9d60..360cd6febc10 100644 --- a/noir-projects/aztec-nr/aztec/src/state_vars/shared_mutable/scheduled_value_change.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/shared_mutable/scheduled_value_change.nr @@ -1,5 +1,4 @@ -use crate::utils::array; -use dep::protocol_types::traits::Packable; +use crate::{traits::{Empty, Packable}, utils::arrays}; use std::cmp::min; mod test; @@ -9,7 +8,7 @@ mod test; // of change after some minimum delay measured in blocks has elapsed. This means that at any given block number we know // both the current value and the smallest block number at which the value might change - this is called the // 'block horizon'. -pub(crate) struct ScheduledValueChange { +pub struct ScheduledValueChange { pre: T, post: T, // Block at which `post` value is used instead of `pre` @@ -17,7 +16,7 @@ pub(crate) struct ScheduledValueChange { } impl ScheduledValueChange { - pub(crate) fn new(pre: T, post: T, block_of_change: u32) -> Self { + pub fn new(pre: T, post: T, block_of_change: u32) -> Self { Self { pre, post, block_of_change } } @@ -27,7 +26,7 @@ impl ScheduledValueChange { /// to construct the proof). /// Reading in private is only safe if the transaction's `max_block_number` property is set to a value lower or /// equal to the block horizon (see `get_block_horizon()`). - pub(crate) fn get_current_at(self, block_number: u32) -> T { + pub fn get_current_at(self, block_number: u32) -> T { // The post value becomes the current one at the block of change. This means different things in each realm: // - in public, any transaction that is included in the block of change will use the post value // - in private, any transaction that includes the block of change as part of the historical state will use the @@ -42,10 +41,16 @@ impl ScheduledValueChange { /// Returns the scheduled change, i.e. the post-change value and the block at which it will become the current /// value. Note that this block may be in the past if the change has already taken place. /// Additionally, further changes might be later scheduled, potentially canceling the one returned by this function. - pub(crate) fn get_scheduled(self) -> (T, u32) { + pub fn get_scheduled(self) -> (T, u32) { (self.post, self.block_of_change) } + // Returns the previous value. This is the value that is current up until the block of change. Note that this value + // might not be the current anymore since block of change might have already passed. + pub fn get_previous(self) -> (T, u32) { + (self.pre, self.block_of_change) + } + /// Returns the largest block number at which the value returned by `get_current_at` is known to remain the current /// value. This value is only meaningful in private when constructing a proof at some `historical_block_number`, /// since due to its asynchronous nature private execution cannot know about any later scheduled changes. @@ -57,7 +62,7 @@ impl ScheduledValueChange { /// The value returned by `get_current_at` in private when called with a historical block number is only safe to use /// if the transaction's `max_block_number` property is set to a value lower or equal to the block horizon computed /// using the same historical block number. - pub(crate) fn get_block_horizon(self, historical_block_number: u32, minimum_delay: u32) -> u32 { + pub fn get_block_horizon(self, historical_block_number: u32, minimum_delay: u32) -> u32 { // The block horizon is the very last block in which the current value is known. Any block past the horizon // (i.e. with a block number larger than the block horizon) may have a different current value. Reading the // current value in private typically requires constraining the maximum valid block number to be equal to the @@ -119,7 +124,7 @@ impl ScheduledValueChange { /// Mutates the value by scheduling a change at the current block number. This function is only meaningful when /// called in public with the current block number. - pub(crate) fn schedule_change( + pub fn schedule_change( &mut self, new_value: T, current_block_number: u32, @@ -154,8 +159,8 @@ where fn unpack(input: [Field; 2 * N + 1]) -> Self { Self { - pre: T::unpack(array::subarray(input, 0)), - post: T::unpack(array::subarray(input, N)), + pre: T::unpack(arrays::subarray(input, 0)), + post: T::unpack(arrays::subarray(input, N)), block_of_change: input[2 * N] as u32, } } @@ -171,3 +176,12 @@ where & (self.block_of_change == other.block_of_change) } } + +impl Empty for ScheduledValueChange +where + T: Empty, +{ + fn empty() -> Self { + Self { pre: T::empty(), post: T::empty(), block_of_change: 0 } + } +} diff --git a/noir-projects/aztec-nr/aztec/src/state_vars/shared_mutable/scheduled_value_change/test.nr b/noir-projects/noir-protocol-circuits/crates/types/src/shared_mutable/scheduled_value_change/test.nr similarity index 98% rename from noir-projects/aztec-nr/aztec/src/state_vars/shared_mutable/scheduled_value_change/test.nr rename to noir-projects/noir-protocol-circuits/crates/types/src/shared_mutable/scheduled_value_change/test.nr index 179089945abd..4b66df4955d3 100644 --- a/noir-projects/aztec-nr/aztec/src/state_vars/shared_mutable/scheduled_value_change/test.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/shared_mutable/scheduled_value_change/test.nr @@ -1,4 +1,4 @@ -use crate::state_vars::shared_mutable::scheduled_value_change::ScheduledValueChange; +use crate::shared_mutable::scheduled_value_change::ScheduledValueChange; global TEST_DELAY: u32 = 200; diff --git a/noir-projects/aztec-nr/aztec/src/state_vars/shared_mutable/shared_mutable_values.nr b/noir-projects/noir-protocol-circuits/crates/types/src/shared_mutable/shared_mutable_values.nr similarity index 73% rename from noir-projects/aztec-nr/aztec/src/state_vars/shared_mutable/shared_mutable_values.nr rename to noir-projects/noir-protocol-circuits/crates/types/src/shared_mutable/shared_mutable_values.nr index 1eb1fd5be3d3..9f967740e745 100644 --- a/noir-projects/aztec-nr/aztec/src/state_vars/shared_mutable/shared_mutable_values.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/shared_mutable/shared_mutable_values.nr @@ -1,9 +1,8 @@ -use crate::state_vars::shared_mutable::{ +use crate::{hash::poseidon2_hash, traits::{Hash, Packable}, utils::arrays::{self, array_concat}}; +use super::{ scheduled_delay_change::{SCHEDULED_DELAY_CHANGE_PCKD_LEN, ScheduledDelayChange}, scheduled_value_change::ScheduledValueChange, }; -use crate::utils::array; -use dep::protocol_types::{traits::Packable, utils::arrays::array_concat}; use std::meta::derive; /// SharedMutableValues is just a wrapper around ScheduledValueChange and ScheduledDelayChange that then allows us @@ -14,16 +13,13 @@ use std::meta::derive; /// reason we expose `get_delay_change_storage_slot` and `get_value_change_storage_slot` which point to the correct /// location in the storage. This is "hacky" as we pack and store the values together but there is no way around it. #[derive(Eq)] -pub(crate) struct SharedMutableValues { - svc: ScheduledValueChange, - sdc: ScheduledDelayChange, +pub struct SharedMutableValues { + pub svc: ScheduledValueChange, + pub sdc: ScheduledDelayChange, } impl SharedMutableValues { - pub(crate) fn new( - svc: ScheduledValueChange, - sdc: ScheduledDelayChange, - ) -> Self { + pub fn new(svc: ScheduledValueChange, sdc: ScheduledDelayChange) -> Self { SharedMutableValues { svc, sdc } } @@ -48,8 +44,17 @@ where fn unpack(fields: [Field; 2 * N + 1 + SCHEDULED_DELAY_CHANGE_PCKD_LEN]) -> Self { SharedMutableValues { - sdc: Packable::unpack(array::subarray(fields, 0)), - svc: Packable::unpack(array::subarray(fields, SCHEDULED_DELAY_CHANGE_PCKD_LEN)), + sdc: Packable::unpack(arrays::subarray(fields, 0)), + svc: Packable::unpack(arrays::subarray(fields, SCHEDULED_DELAY_CHANGE_PCKD_LEN)), } } } + +impl Hash for SharedMutableValues +where + T: Packable, +{ + fn hash(self) -> Field { + poseidon2_hash(self.pack()) + } +} diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/shared_mutable/with_hash.nr b/noir-projects/noir-protocol-circuits/crates/types/src/shared_mutable/with_hash.nr new file mode 100644 index 000000000000..678c1d360b5f --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/types/src/shared_mutable/with_hash.nr @@ -0,0 +1,371 @@ +use crate::{ + address::aztec_address::AztecAddress, + block_header::BlockHeader, + constants::PUBLIC_DATA_TREE_HEIGHT, + data::{ + hash::compute_public_data_tree_index, + public_data_tree_leaf_preimage::PublicDataTreeLeafPreimage, + }, + hash::poseidon2_hash, + merkle_tree::{membership::MembershipWitness, root::root_from_sibling_path}, + traits::{Hash, Packable}, +}; + +pub fn validate_with_hash_hints( + historical_header: BlockHeader, + with_hash_storage_slot: Field, + contract_address: AztecAddress, + with_hash_value_hint: T, + witness: MembershipWitness, + leaf_preimage: PublicDataTreeLeafPreimage, +) +where + T: Packable + Eq, +{ + let storage_hash = public_storage_historical_read( + historical_header, + compute_with_hash_hash_storage_slot::(with_hash_storage_slot), + contract_address, + witness, + leaf_preimage, + ); + + let hashed_value = poseidon2_hash(with_hash_value_hint.pack()); + + if storage_hash != 0 { + assert_eq(storage_hash, hashed_value, "Hint values do not match hash"); + } else { + // The hash slot can only hold a zero if it is uninitialized. Therefore, the hints must then be zero + // (i.e. the default value for public storage) as well. + assert_eq( + with_hash_value_hint, + T::unpack(std::mem::zeroed()), + "Non-zero hint for zero hash", + ); + }; +} + +pub fn compute_with_hash_hash_storage_slot(with_hash_storage_slot: Field) -> Field +where + T: Packable, +{ + with_hash_storage_slot + N as Field +} + +fn public_storage_historical_read( + historical_header: BlockHeader, + storage_slot: Field, + contract_address: AztecAddress, + witness: MembershipWitness, + leaf_preimage: PublicDataTreeLeafPreimage, +) -> Field { + let public_data_tree_index = compute_public_data_tree_index(contract_address, storage_slot); + + assert_eq( + historical_header.state.partial.public_data_tree.root, + root_from_sibling_path( + leaf_preimage.hash(), + witness.leaf_index, + witness.sibling_path, + ), + "Proving public value inclusion failed", + ); + + let is_less_than_slot = leaf_preimage.slot.lt(public_data_tree_index); + let is_next_greater_than = public_data_tree_index.lt(leaf_preimage.next_slot); + let is_max = ((leaf_preimage.next_index == 0) & (leaf_preimage.next_slot == 0)); + let is_in_range = is_less_than_slot & (is_next_greater_than | is_max); + + if is_in_range { + 0 + } else { + assert_eq( + leaf_preimage.slot, + public_data_tree_index, + "Public data tree index doesn't match witness", + ); + leaf_preimage.value + } +} + +mod tests { + use crate::{ + address::aztec_address::AztecAddress, + block_header::BlockHeader, + contract_class_id::ContractClassId, + data::{ + hash::compute_public_data_tree_index, + public_data_tree_leaf_preimage::PublicDataTreeLeafPreimage, + }, + merkle_tree::membership::MembershipWitness, + shared_mutable::{ + scheduled_delay_change::ScheduledDelayChange, + scheduled_value_change::ScheduledValueChange, + shared_mutable_values::SharedMutableValues, + }, + tests::fixtures::public_data_tree::empty_public_data_tree, + traits::{Empty, FromField, Hash}, + }; + use super::{compute_with_hash_hash_storage_slot, validate_with_hash_hints}; + + #[test] + fn test_validate_empty_with_hash_hints() { + let with_hash_storage_slot = 27; + let contract_address = AztecAddress::from_field(42); + + let public_data_prefill = 2; + + let public_data_tree = empty_public_data_tree::<4, 2>(public_data_prefill); + let mut historical_header = BlockHeader::empty(); + historical_header.state.partial.public_data_tree.root = public_data_tree.get_root(); + historical_header.state.partial.public_data_tree.next_available_leaf_index = + public_data_prefill; + + let witness = MembershipWitness { + leaf_index: (public_data_prefill - 1) as Field, + sibling_path: public_data_tree.get_sibling_path(public_data_prefill - 1), + }; + + let leaf_preimage = PublicDataTreeLeafPreimage { + slot: (public_data_prefill - 1) as Field, + value: 0, + next_slot: 0, + next_index: 0, + }; + + let with_hash_hint = SharedMutableValues::new( + ScheduledValueChange::::empty(), + ScheduledDelayChange::empty(), + ); + + validate_with_hash_hints( + historical_header, + with_hash_storage_slot, + contract_address, + with_hash_hint, + witness, + leaf_preimage, + ); + } + + #[test] + fn test_validate_non_empty_with_hash_hints() { + let with_hash_storage_slot = 27; + let contract_address = AztecAddress::from_field(42); + + let hash_storage_slot = compute_with_hash_hash_storage_slot::, _>( + with_hash_storage_slot, + ); + let hash_leaf_slot = compute_public_data_tree_index(contract_address, hash_storage_slot); + + let with_hash_hint = SharedMutableValues::new( + ScheduledValueChange::new( + ContractClassId::from_field(0), + ContractClassId::from_field(96), + 100, + ), + ScheduledDelayChange::<100>::new(Option::none(), Option::some(10), 200), + ); + + let public_data_prefill = 2; + + let mut public_data_tree = empty_public_data_tree::<4, 2>(public_data_prefill); + public_data_tree.update_leaf( + public_data_prefill - 1, + PublicDataTreeLeafPreimage { + slot: (public_data_prefill - 1) as Field, + value: 0, + next_slot: hash_leaf_slot, + next_index: public_data_prefill, + } + .hash(), + ); + + let leaf_preimage = PublicDataTreeLeafPreimage { + slot: hash_leaf_slot, + value: with_hash_hint.hash(), + next_slot: 0, + next_index: 0, + }; + public_data_tree.update_leaf(public_data_prefill, leaf_preimage.hash()); + + let mut historical_header = BlockHeader::empty(); + historical_header.state.partial.public_data_tree.root = public_data_tree.get_root(); + historical_header.state.partial.public_data_tree.next_available_leaf_index = + public_data_prefill + 1; + + let witness = MembershipWitness { + leaf_index: public_data_prefill as Field, + sibling_path: public_data_tree.get_sibling_path(public_data_prefill), + }; + + validate_with_hash_hints( + historical_header, + with_hash_storage_slot, + contract_address, + with_hash_hint, + witness, + leaf_preimage, + ); + } + + #[test(should_fail_with = "Proving public value inclusion failed")] + fn test_validate_with_hash_hints_fake_membership_fails() { + // Made up data + validate_with_hash_hints( + BlockHeader::empty(), + 27, + AztecAddress::from_field(42), + SharedMutableValues::new( + ScheduledValueChange::::empty(), + ScheduledDelayChange::empty(), + ), + MembershipWitness { leaf_index: 80, sibling_path: std::mem::zeroed() }, + PublicDataTreeLeafPreimage::empty(), + ); + } + + #[test(should_fail_with = "Public data tree index doesn't match witness")] + fn test_validate_with_hash_hints_different_leaf_fails() { + let with_hash_storage_slot = 27; + let contract_address = AztecAddress::from_field(42); + + let public_data_prefill = 2; + + let public_data_tree = empty_public_data_tree::<4, 2>(public_data_prefill); + let mut historical_header = BlockHeader::empty(); + historical_header.state.partial.public_data_tree.root = public_data_tree.get_root(); + historical_header.state.partial.public_data_tree.next_available_leaf_index = + public_data_prefill; + + let witness = + MembershipWitness { leaf_index: 0, sibling_path: public_data_tree.get_sibling_path(0) }; + + let leaf_preimage = PublicDataTreeLeafPreimage { + slot: 0, // This leaf is invalid for any slot that is not zero + value: 0, + next_slot: 1, + next_index: 1, + }; + + validate_with_hash_hints( + historical_header, + with_hash_storage_slot, + contract_address, + SharedMutableValues::new( + ScheduledValueChange::::empty(), + ScheduledDelayChange::empty(), + ), + witness, + leaf_preimage, + ); + } + + #[test(should_fail_with = "Non-zero hint for zero hash")] + fn test_validate_non_empty_value_with_empty_leaf_fails() { + let with_hash_storage_slot = 27; + let contract_address = AztecAddress::from_field(42); + + let public_data_prefill = 2; + + let public_data_tree = empty_public_data_tree::<4, 2>(public_data_prefill); + let mut historical_header = BlockHeader::empty(); + historical_header.state.partial.public_data_tree.root = public_data_tree.get_root(); + historical_header.state.partial.public_data_tree.next_available_leaf_index = + public_data_prefill; + + let witness = MembershipWitness { + leaf_index: (public_data_prefill - 1) as Field, + sibling_path: public_data_tree.get_sibling_path(public_data_prefill - 1), + }; + + let leaf_preimage = PublicDataTreeLeafPreimage { + slot: (public_data_prefill - 1) as Field, + value: 0, + next_slot: 0, + next_index: 0, + }; + // Expected to be empty, it's not + let value_hint = SharedMutableValues::new( + ScheduledValueChange::new( + ContractClassId::from_field(0), + ContractClassId::from_field(96), + 100, + ), + ScheduledDelayChange::empty(), + ); + + validate_with_hash_hints( + historical_header, + with_hash_storage_slot, + contract_address, + value_hint, + witness, + leaf_preimage, + ); + } + + #[test(should_fail_with = "Hint values do not match hash")] + fn test_validate_wrong_hash_hints_fails() { + let with_hash_storage_slot = 27; + let contract_address = AztecAddress::from_field(42); + + let hash_storage_slot = compute_with_hash_hash_storage_slot::, _>( + with_hash_storage_slot, + ); + let hash_leaf_slot = compute_public_data_tree_index(contract_address, hash_storage_slot); + + let value_hint = SharedMutableValues::new( + ScheduledValueChange::new( + ContractClassId::from_field(0), + ContractClassId::from_field(96), + 100, + ), + ScheduledDelayChange::<100>::new(Option::none(), Option::some(10), 200), + ); + + let hashed_value = 9000; // Incorrect hash + + let public_data_prefill = 2; + + let mut public_data_tree = empty_public_data_tree::<4, 2>(public_data_prefill); + public_data_tree.update_leaf( + public_data_prefill - 1, + PublicDataTreeLeafPreimage { + slot: (public_data_prefill - 1) as Field, + value: 0, + next_slot: hash_leaf_slot, + next_index: public_data_prefill, + } + .hash(), + ); + + let leaf_preimage = PublicDataTreeLeafPreimage { + slot: hash_leaf_slot, + value: hashed_value, + next_slot: 0, + next_index: 0, + }; + public_data_tree.update_leaf(public_data_prefill, leaf_preimage.hash()); + + let mut historical_header = BlockHeader::empty(); + historical_header.state.partial.public_data_tree.root = public_data_tree.get_root(); + historical_header.state.partial.public_data_tree.next_available_leaf_index = + public_data_prefill + 1; + + let witness = MembershipWitness { + leaf_index: public_data_prefill as Field, + sibling_path: public_data_tree.get_sibling_path(public_data_prefill), + }; + + validate_with_hash_hints( + historical_header, + with_hash_storage_slot, + contract_address, + value_hint, + witness, + leaf_preimage, + ); + } + +} diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixture_builder.nr b/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixture_builder.nr index 22999cdb9fb5..69911eb8241a 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixture_builder.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixture_builder.nr @@ -25,7 +25,7 @@ use crate::{ nullifier::{Nullifier, ScopedNullifier}, private_call_request::PrivateCallRequest, private_circuit_public_inputs::PrivateCircuitPublicInputs, - private_kernel::private_call_data::PrivateCallData, + private_kernel::private_call_data::{PrivateCallData, PrivateVerificationKeyHints}, private_kernel_data::PrivateKernelData, private_log::PrivateLogData, protocol_contract_leaf_preimage::ProtocolContractLeafPreimage, @@ -45,15 +45,21 @@ use crate::{ address::{AztecAddress, EthAddress, SaltedInitializationHash}, block_header::BlockHeader, constants::{ - CLIENT_IVC_VERIFICATION_KEY_LENGTH_IN_FIELDS, FUNCTION_TREE_HEIGHT, - MAX_CONTRACT_CLASS_LOGS_PER_TX, MAX_ENQUEUED_CALLS_PER_TX, MAX_FIELD_VALUE, - MAX_KEY_VALIDATION_REQUESTS_PER_TX, MAX_L2_TO_L1_MSGS_PER_TX, - MAX_NOTE_HASH_READ_REQUESTS_PER_TX, MAX_NOTE_HASHES_PER_TX, + CLIENT_IVC_VERIFICATION_KEY_LENGTH_IN_FIELDS, DEFAULT_UPDATE_DELAY, + DEPLOYER_CONTRACT_ADDRESS, FUNCTION_TREE_HEIGHT, MAX_CONTRACT_CLASS_LOGS_PER_TX, + MAX_ENQUEUED_CALLS_PER_TX, MAX_FIELD_VALUE, MAX_KEY_VALIDATION_REQUESTS_PER_TX, + MAX_L2_TO_L1_MSGS_PER_TX, MAX_NOTE_HASH_READ_REQUESTS_PER_TX, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIER_READ_REQUESTS_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_PRIVATE_CALL_STACK_LENGTH_PER_TX, MAX_PRIVATE_LOGS_PER_TX, MAX_PUBLIC_LOGS_PER_TX, MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, PRIVATE_CALL_REQUEST_LENGTH, PRIVATE_LOG_SIZE_IN_FIELDS, PROTOCOL_CONTRACT_TREE_HEIGHT, PUBLIC_CALL_REQUEST_LENGTH, - PUBLIC_LOG_DATA_SIZE_IN_FIELDS, VK_TREE_HEIGHT, + PUBLIC_DATA_TREE_HEIGHT, PUBLIC_LOG_DATA_SIZE_IN_FIELDS, UPDATED_CLASS_IDS_SLOT, + VK_TREE_HEIGHT, + }, + contract_class_id::ContractClassId, + data::{ + hash::compute_public_data_tree_index, + public_data_tree_leaf_preimage::PublicDataTreeLeafPreimage, }, hash::{ compute_l2_to_l1_hash, compute_siloed_nullifier, compute_siloed_private_log_field, @@ -68,8 +74,16 @@ use crate::{ verification_key::{ClientIVCVerificationKey, HonkVerificationKey, VerificationKey}, }, public_keys::PublicKeys, - tests::fixtures::{self, contract_functions::ContractFunction, contracts::ContractData}, - traits::{Deserialize, Empty, FromField, ToField}, + shared_mutable::{ + scheduled_delay_change::ScheduledDelayChange, scheduled_value_change::ScheduledValueChange, + shared_mutable_values::SharedMutableValues, with_hash::compute_with_hash_hash_storage_slot, + }, + storage::map::derive_storage_slot_in_map, + tests::fixtures::{ + self, contract_functions::ContractFunction, contracts::ContractData, + public_data_tree::empty_public_data_tree, + }, + traits::{Deserialize, Empty, FromField, Hash, is_empty, Packable, ToField}, transaction::{tx_context::TxContext, tx_request::TxRequest}, }; @@ -164,6 +178,12 @@ pub struct FixtureBuilder { pub protocol_contract_membership_witness: MembershipWitness, pub protocol_contract_leaf: ProtocolContractLeafPreimage, + // Contract updates + pub updated_class_id_witness: MembershipWitness, + pub updated_class_id_leaf: PublicDataTreeLeafPreimage, + pub updated_class_id_value_change: ScheduledValueChange, + pub updated_class_id_delay_change: ScheduledDelayChange, + // Tree snapshots. pub archive_tree: AppendOnlyTreeSnapshot, pub start_snapshots: TreeSnapshots, @@ -407,10 +427,8 @@ impl FixtureBuilder { } } - pub fn to_private_call_data(self) -> PrivateCallData { - PrivateCallData { - public_inputs: self.to_private_circuit_public_inputs(), - vk: self.client_ivc_vk, + pub fn to_private_verification_key_hints(self) -> PrivateVerificationKeyHints { + PrivateVerificationKeyHints { function_leaf_membership_witness: self.function_leaf_membership_witness, salted_initialization_hash: self.salted_initialization_hash, public_keys: self.public_keys, @@ -420,6 +438,84 @@ impl FixtureBuilder { protocol_contract_membership_witness: self.protocol_contract_membership_witness, protocol_contract_leaf: self.protocol_contract_leaf, acir_hash: self.acir_hash, + updated_class_id_witness: self.updated_class_id_witness, + updated_class_id_leaf: self.updated_class_id_leaf, + updated_class_id_value_change: self.updated_class_id_value_change.pack(), + updated_class_id_delay_change: self.updated_class_id_delay_change.pack(), + } + } + + pub fn compute_update_tree_and_hints(&mut self) { + let public_data_prefill = 2; + let mut public_data_tree = empty_public_data_tree::<8, 3>(public_data_prefill); + + if is_empty(self.updated_class_id_value_change) + & is_empty(self.updated_class_id_delay_change) { + self.historical_header.state.partial.public_data_tree.root = + public_data_tree.get_root(); + self.historical_header.state.partial.public_data_tree.next_available_leaf_index = + public_data_prefill; + + self.updated_class_id_witness = MembershipWitness { + leaf_index: (public_data_prefill - 1) as Field, + sibling_path: public_data_tree.get_sibling_path(public_data_prefill - 1), + }; + self.updated_class_id_leaf = PublicDataTreeLeafPreimage { + slot: (public_data_prefill - 1) as Field, + value: 0, + next_slot: 0, + next_index: 0, + }; + } else { + let hashed_update = SharedMutableValues::new( + self.updated_class_id_value_change, + self.updated_class_id_delay_change, + ) + .hash(); + let shared_mutable_slot = + derive_storage_slot_in_map(UPDATED_CLASS_IDS_SLOT as Field, self.contract_address); + let hash_slot = compute_with_hash_hash_storage_slot::, _>( + shared_mutable_slot, + ); + let hash_leaf_slot = + compute_public_data_tree_index(DEPLOYER_CONTRACT_ADDRESS, hash_slot); + public_data_tree.update_leaf( + public_data_prefill - 1, + PublicDataTreeLeafPreimage { + slot: (public_data_prefill - 1) as Field, + value: 0, + next_slot: hash_leaf_slot, + next_index: public_data_prefill, + } + .hash(), + ); + self.updated_class_id_leaf = PublicDataTreeLeafPreimage { + slot: hash_leaf_slot, + value: hashed_update, + next_slot: 0, + next_index: 0, + }; + public_data_tree.update_leaf(public_data_prefill, self.updated_class_id_leaf.hash()); + self.historical_header.state.partial.public_data_tree.root = + public_data_tree.get_root(); + self.historical_header.state.partial.public_data_tree.next_available_leaf_index = + public_data_prefill + 1; + self.updated_class_id_witness = MembershipWitness { + leaf_index: public_data_prefill as Field, + sibling_path: public_data_tree.get_sibling_path(public_data_prefill), + }; + } + } + + pub fn set_historical_header_from_call_data(&mut self, private_call: PrivateCallData) { + self.historical_header = private_call.public_inputs.historical_header; + } + + pub fn to_private_call_data(mut self) -> PrivateCallData { + PrivateCallData { + public_inputs: self.to_private_circuit_public_inputs(), + vk: self.client_ivc_vk, + verification_key_hints: self.to_private_verification_key_hints(), } } @@ -1168,6 +1264,10 @@ impl Empty for FixtureBuilder { protocol_contract_tree_root: 0, protocol_contract_membership_witness: MembershipWitness::empty(), protocol_contract_leaf: ProtocolContractLeafPreimage::empty(), + updated_class_id_witness: MembershipWitness::empty(), + updated_class_id_leaf: PublicDataTreeLeafPreimage::empty(), + updated_class_id_value_change: ScheduledValueChange::empty(), + updated_class_id_delay_change: ScheduledDelayChange::empty(), archive_tree: AppendOnlyTreeSnapshot::zero(), start_snapshots: TreeSnapshots::empty(), end_snapshots: TreeSnapshots::empty(), diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures.nr b/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures.nr index 4c9e41cadb76..f95a5e0e2b28 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures.nr @@ -3,6 +3,7 @@ pub mod contracts; pub mod merkle_tree; pub mod protocol_contract_tree; pub mod vk_tree; +pub mod public_data_tree; use crate::address::AztecAddress; diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures/public_data_tree.nr b/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures/public_data_tree.nr new file mode 100644 index 000000000000..36188c5a8258 --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures/public_data_tree.nr @@ -0,0 +1,35 @@ +use crate::{ + constants::PUBLIC_DATA_TREE_HEIGHT, + data::public_data_tree_leaf_preimage::PublicDataTreeLeafPreimage, + tests::merkle_tree_utils::NonEmptyMerkleTree, traits::Hash, +}; + +pub fn empty_public_data_tree( + prefill_count: u32, + ) -> NonEmptyMerkleTree { + let mut leaves = [0; LEAVES_COUNT]; + for i in 0..(prefill_count - 1) { + let leaf = PublicDataTreeLeafPreimage { + slot: i as Field, + value: 0, + next_slot: (i + 1) as Field, + next_index: i + 1, + }; + leaves[i] = leaf.hash(); + } + + let last_leaf = PublicDataTreeLeafPreimage { + slot: (prefill_count - 1) as Field, + value: 0, + next_slot: 0, + next_index: 0, + }; + leaves[prefill_count - 1] = last_leaf.hash(); + + NonEmptyMerkleTree::new( + leaves, + [0; PUBLIC_DATA_TREE_HEIGHT], + [0; PUBLIC_DATA_TREE_HEIGHT - SUBTREE_HEIGHT], + [0; SUBTREE_HEIGHT], + ) +} diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/tests/merkle_tree_utils.nr b/noir-projects/noir-protocol-circuits/crates/types/src/tests/merkle_tree_utils.nr index 52290e27603c..97ae46c48c41 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/tests/merkle_tree_utils.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/tests/merkle_tree_utils.nr @@ -189,6 +189,7 @@ impl u32 { SUBTREE_ITEMS } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/traits.nr b/noir-projects/noir-protocol-circuits/crates/types/src/traits.nr index 2ecb40dd98a0..2a0ae428a925 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/traits.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/traits.nr @@ -48,6 +48,21 @@ impl Empty for U128 { } } +impl Empty for [T; N] +where + T: Empty, +{ + fn empty() -> Self { + [T::empty(); N] + } +} + +impl Empty for Option { + fn empty() -> Self { + Option::none() + } +} + pub fn is_empty(item: T) -> bool where T: Empty + Eq, diff --git a/yarn-project/archiver/src/archiver/archiver.ts b/yarn-project/archiver/src/archiver/archiver.ts index 3467d2c6df3b..c78c257a3d54 100644 --- a/yarn-project/archiver/src/archiver/archiver.ts +++ b/yarn-project/archiver/src/archiver/archiver.ts @@ -32,6 +32,7 @@ import { type FunctionSelector, type PrivateLog, type PublicFunction, + type PublicLog, type UnconstrainedFunctionWithMembershipProof, computePublicBytecodeCommitment, isValidPrivateFunctionMembershipProof, @@ -51,7 +52,10 @@ import { PrivateFunctionBroadcastedEvent, UnconstrainedFunctionBroadcastedEvent, } from '@aztec/protocol-contracts/class-registerer'; -import { ContractInstanceDeployedEvent } from '@aztec/protocol-contracts/instance-deployer'; +import { + ContractInstanceDeployedEvent, + ContractInstanceUpdatedEvent, +} from '@aztec/protocol-contracts/instance-deployer'; import { Attributes, type TelemetryClient, type Traceable, type Tracer, trackSpan } from '@aztec/telemetry-client'; import groupBy from 'lodash.groupby'; @@ -688,9 +692,11 @@ export class Archiver implements ArchiveSource, Traceable { if (!instance) { throw new Error(`Contract ${address.toString()} not found`); } - const contractClass = await this.getContractClass(instance.contractClassId); + const contractClass = await this.getContractClass(instance.currentContractClassId); if (!contractClass) { - throw new Error(`Contract class ${instance.contractClassId.toString()} for ${address.toString()} not found`); + throw new Error( + `Contract class ${instance.currentContractClassId.toString()} for ${address.toString()} not found`, + ); } return contractClass.publicFunctions.find(f => f.selector.equals(selector)); } @@ -872,6 +878,8 @@ class ArchiverStoreHelper | 'deleteContractClasses' | 'addContractInstances' | 'deleteContractInstances' + | 'addContractInstanceUpdates' + | 'deleteContractInstanceUpdates' | 'addFunctions' > { @@ -935,6 +943,29 @@ class ArchiverStoreHelper return true; } + /** + * Extracts and stores contract instances out of ContractInstanceDeployed events emitted by the canonical deployer contract. + * @param allLogs - All logs emitted in a bunch of blocks. + */ + async #updateUpdatedContractInstances(allLogs: PublicLog[], blockNum: number, operation: Operation) { + const contractUpdates = allLogs + .filter(log => ContractInstanceUpdatedEvent.isContractInstanceUpdatedEvent(log)) + .map(log => ContractInstanceUpdatedEvent.fromLog(log)) + .map(e => e.toContractInstanceUpdate()); + + if (contractUpdates.length > 0) { + contractUpdates.forEach(c => + this.#log.verbose(`${Operation[operation]} contract instance update at ${c.address.toString()}`), + ); + if (operation == Operation.Store) { + return await this.store.addContractInstanceUpdates(contractUpdates, blockNum); + } else if (operation == Operation.Delete) { + return await this.store.deleteContractInstanceUpdates(contractUpdates, blockNum); + } + } + return true; + } + /** * Stores the functions that was broadcasted individually * @@ -1009,10 +1040,12 @@ class ArchiverStoreHelper .flatMap(txLog => txLog.unrollLogs()); // ContractInstanceDeployed event logs are broadcast in privateLogs. const privateLogs = block.data.body.txEffects.flatMap(txEffect => txEffect.privateLogs); + const publicLogs = block.data.body.txEffects.flatMap(txEffect => txEffect.publicLogs); return ( await Promise.all([ this.#updateRegisteredContractClasses(contractClassLogs, block.data.number, Operation.Store), this.#updateDeployedContractInstances(privateLogs, block.data.number, Operation.Store), + this.#updateUpdatedContractInstances(publicLogs, block.data.number, Operation.Store), this.#storeBroadcastedIndividualFunctions(contractClassLogs, block.data.number), ]) ).every(Boolean); @@ -1042,11 +1075,13 @@ class ArchiverStoreHelper // ContractInstanceDeployed event logs are broadcast in privateLogs. const privateLogs = block.data.body.txEffects.flatMap(txEffect => txEffect.privateLogs); + const publicLogs = block.data.body.txEffects.flatMap(txEffect => txEffect.publicLogs); return ( await Promise.all([ this.#updateRegisteredContractClasses(contractClassLogs, block.data.number, Operation.Delete), this.#updateDeployedContractInstances(privateLogs, block.data.number, Operation.Delete), + this.#updateUpdatedContractInstances(publicLogs, block.data.number, Operation.Delete), ]) ).every(Boolean); }), diff --git a/yarn-project/archiver/src/archiver/archiver_store.ts b/yarn-project/archiver/src/archiver/archiver_store.ts index 30364404e1c1..95e324095423 100644 --- a/yarn-project/archiver/src/archiver/archiver_store.ts +++ b/yarn-project/archiver/src/archiver/archiver_store.ts @@ -13,6 +13,7 @@ import { import { type BlockHeader, type ContractClassPublic, + type ContractInstanceUpdateWithAddress, type ContractInstanceWithAddress, type ExecutablePrivateFunctionWithMembershipProof, type Fr, @@ -244,6 +245,14 @@ export interface ArchiverDataStore { addContractInstances(data: ContractInstanceWithAddress[], blockNumber: number): Promise; deleteContractInstances(data: ContractInstanceWithAddress[], blockNumber: number): Promise; + /** + * Add new contract instance updates + * @param data - List of contract updates to be added. + * @param blockNumber - Number of the L2 block the updates were scheduled in. + * @returns True if the operation is successful. + */ + addContractInstanceUpdates(data: ContractInstanceUpdateWithAddress[], blockNumber: number): Promise; + deleteContractInstanceUpdates(data: ContractInstanceUpdateWithAddress[], blockNumber: number): Promise; /** * Adds private functions to a contract class. */ @@ -254,7 +263,7 @@ export interface ArchiverDataStore { ): Promise; /** - * Returns a contract instance given its address, or undefined if not exists. + * Returns a contract instance given its address and the given block number, or undefined if not exists. * @param address - Address of the contract. */ getContractInstance(address: AztecAddress): Promise; diff --git a/yarn-project/archiver/src/archiver/archiver_store_test_suite.ts b/yarn-project/archiver/src/archiver/archiver_store_test_suite.ts index dea8335c5365..39df377b9395 100644 --- a/yarn-project/archiver/src/archiver/archiver_store_test_suite.ts +++ b/yarn-project/archiver/src/archiver/archiver_store_test_suite.ts @@ -279,7 +279,11 @@ export function describeArchiverDataStore( const blockNum = 10; beforeEach(async () => { - const randomInstance = await SerializableContractInstance.random(); + const classId = Fr.random(); + const randomInstance = await SerializableContractInstance.random({ + currentContractClassId: classId, + originalContractClassId: classId, + }); contractInstance = { ...randomInstance, address: await AztecAddress.random() }; await store.addContractInstances([contractInstance], blockNum); }); diff --git a/yarn-project/archiver/src/archiver/kv_archiver_store/contract_instance_store.ts b/yarn-project/archiver/src/archiver/kv_archiver_store/contract_instance_store.ts index 4e1818f7e24c..17c7ceeded38 100644 --- a/yarn-project/archiver/src/archiver/kv_archiver_store/contract_instance_store.ts +++ b/yarn-project/archiver/src/archiver/kv_archiver_store/contract_instance_store.ts @@ -1,14 +1,25 @@ -import { type AztecAddress, type ContractInstanceWithAddress, SerializableContractInstance } from '@aztec/circuits.js'; +import { + type AztecAddress, + type ContractInstanceUpdateWithAddress, + type ContractInstanceWithAddress, + type Fr, + SerializableContractInstance, + SerializableContractInstanceUpdate, +} from '@aztec/circuits.js'; import type { AztecAsyncKVStore, AztecAsyncMap } from '@aztec/kv-store'; +type ContractInstanceUpdateKey = [string, number] | [string, number, number]; + /** * LMDB implementation of the ArchiverDataStore interface. */ export class ContractInstanceStore { #contractInstances: AztecAsyncMap; + #contractInstanceUpdates: AztecAsyncMap; constructor(db: AztecAsyncKVStore) { this.#contractInstances = db.openMap('archiver_contract_instances'); + this.#contractInstanceUpdates = db.openMap('archiver_contract_instance_updates'); } addContractInstance(contractInstance: ContractInstanceWithAddress): Promise { @@ -22,8 +33,75 @@ export class ContractInstanceStore { return this.#contractInstances.delete(contractInstance.address.toString()); } - async getContractInstance(address: AztecAddress): Promise { + getUpdateKey(contractAddress: AztecAddress, blockNumber: number, logIndex?: number): ContractInstanceUpdateKey { + if (logIndex === undefined) { + return [contractAddress.toString(), blockNumber]; + } else { + return [contractAddress.toString(), blockNumber, logIndex]; + } + } + + addContractInstanceUpdate( + contractInstanceUpdate: ContractInstanceUpdateWithAddress, + blockNumber: number, + logIndex: number, + ): Promise { + return this.#contractInstanceUpdates.set( + this.getUpdateKey(contractInstanceUpdate.address, blockNumber, logIndex), + new SerializableContractInstanceUpdate(contractInstanceUpdate).toBuffer(), + ); + } + + deleteContractInstanceUpdate( + contractInstanceUpdate: ContractInstanceUpdateWithAddress, + blockNumber: number, + logIndex: number, + ): Promise { + return this.#contractInstanceUpdates.delete( + this.getUpdateKey(contractInstanceUpdate.address, blockNumber, logIndex), + ); + } + + async getCurrentContractInstanceClassId( + address: AztecAddress, + blockNumber: number, + originalClassId: Fr, + ): Promise { + // We need to find the last update before the given block number + const queryResult = await this.#contractInstanceUpdates + .valuesAsync({ + reverse: true, + end: this.getUpdateKey(address, blockNumber + 1), // No update can match this key since it doesn't have a log index. We want the highest key <= blockNumber + limit: 1, + }) + .next(); + if (queryResult.done) { + return originalClassId; + } + + const serializedUpdate = queryResult.value; + const update = SerializableContractInstanceUpdate.fromBuffer(serializedUpdate); + if (blockNumber < update.blockOfChange) { + return update.prevContractClassId.isZero() ? originalClassId : update.prevContractClassId; + } + return update.newContractClassId; + } + + async getContractInstance( + address: AztecAddress, + blockNumber: number, + ): Promise { const contractInstance = await this.#contractInstances.getAsync(address.toString()); - return contractInstance && SerializableContractInstance.fromBuffer(contractInstance).withAddress(address); + if (!contractInstance) { + return undefined; + } + + const instance = SerializableContractInstance.fromBuffer(contractInstance).withAddress(address); + instance.currentContractClassId = await this.getCurrentContractInstanceClassId( + address, + blockNumber, + instance.originalContractClassId, + ); + return instance; } } diff --git a/yarn-project/archiver/src/archiver/kv_archiver_store/kv_archiver_store.ts b/yarn-project/archiver/src/archiver/kv_archiver_store/kv_archiver_store.ts index f392a1619cd5..8df0355bc907 100644 --- a/yarn-project/archiver/src/archiver/kv_archiver_store/kv_archiver_store.ts +++ b/yarn-project/archiver/src/archiver/kv_archiver_store/kv_archiver_store.ts @@ -12,6 +12,7 @@ import { import { type BlockHeader, type ContractClassPublic, + type ContractInstanceUpdateWithAddress, type ContractInstanceWithAddress, type ExecutablePrivateFunctionWithMembershipProof, type Fr, @@ -83,8 +84,8 @@ export class KVArchiverDataStore implements ArchiverDataStore { return this.#contractClassStore.getContractClassIds(); } - getContractInstance(address: AztecAddress): Promise { - const contract = this.#contractInstanceStore.getContractInstance(address); + async getContractInstance(address: AztecAddress): Promise { + const contract = this.#contractInstanceStore.getContractInstance(address, await this.getSynchedL2BlockNumber()); return contract; } @@ -126,6 +127,28 @@ export class KVArchiverDataStore implements ArchiverDataStore { return (await Promise.all(data.map(c => this.#contractInstanceStore.deleteContractInstance(c)))).every(Boolean); } + async addContractInstanceUpdates(data: ContractInstanceUpdateWithAddress[], blockNumber: number): Promise { + return ( + await Promise.all( + data.map((update, logIndex) => + this.#contractInstanceStore.addContractInstanceUpdate(update, blockNumber, logIndex), + ), + ) + ).every(Boolean); + } + async deleteContractInstanceUpdates( + data: ContractInstanceUpdateWithAddress[], + blockNumber: number, + ): Promise { + return ( + await Promise.all( + data.map((update, logIndex) => + this.#contractInstanceStore.deleteContractInstanceUpdate(update, blockNumber, logIndex), + ), + ) + ).every(Boolean); + } + /** * Append new blocks to the store's list. * @param blocks - The L2 blocks to be added to the store and the last processed L1 block. diff --git a/yarn-project/archiver/src/archiver/memory_archiver_store/memory_archiver_store.ts b/yarn-project/archiver/src/archiver/memory_archiver_store/memory_archiver_store.ts index 2ddcbc77a004..c5b0381a38e7 100644 --- a/yarn-project/archiver/src/archiver/memory_archiver_store/memory_archiver_store.ts +++ b/yarn-project/archiver/src/archiver/memory_archiver_store/memory_archiver_store.ts @@ -20,6 +20,7 @@ import { type BlockHeader, type ContractClassPublic, type ContractClassPublicWithBlockNumber, + type ContractInstanceUpdateWithAddress, type ContractInstanceWithAddress, type ExecutablePrivateFunctionWithMembershipProof, Fr, @@ -40,6 +41,8 @@ import { type DataRetrieval } from '../structs/data_retrieval.js'; import { type L1Published } from '../structs/published.js'; import { L1ToL2MessageStore } from './l1_to_l2_message_store.js'; +type StoredContractInstanceUpdate = ContractInstanceUpdateWithAddress & { blockNumber: number; logIndex: number }; + /** * Simple, in-memory implementation of an archiver data store. */ @@ -81,7 +84,10 @@ export class MemoryArchiverStore implements ArchiverDataStore { private contractInstances: Map = new Map(); + private contractInstanceUpdates: Map = new Map(); + private lastL1BlockNewBlocks: bigint | undefined = undefined; + private lastL1BlockNewMessages: bigint | undefined = undefined; private lastProvenL2BlockNumber: number = 0; @@ -112,7 +118,23 @@ export class MemoryArchiverStore implements ArchiverDataStore { } public getContractInstance(address: AztecAddress): Promise { - return Promise.resolve(this.contractInstances.get(address.toString())); + const instance = this.contractInstances.get(address.toString()); + if (!instance) { + return Promise.resolve(undefined); + } + const updates = this.contractInstanceUpdates.get(address.toString()) || []; + if (updates.length > 0) { + const lastUpdate = updates[0]; + const currentBlockNumber = this.getLastBlockNumber(); + if (currentBlockNumber >= lastUpdate.blockOfChange) { + instance.currentContractClassId = lastUpdate.newContractClassId; + } else if (!lastUpdate.prevContractClassId.isZero()) { + instance.currentContractClassId = lastUpdate.prevContractClassId; + } else { + instance.currentContractClassId = instance.originalContractClassId; + } + } + return Promise.resolve(instance); } public getBytecodeCommitment(contractClassId: Fr): Promise { @@ -186,6 +208,33 @@ export class MemoryArchiverStore implements ArchiverDataStore { return Promise.resolve(true); } + public addContractInstanceUpdates(data: ContractInstanceUpdateWithAddress[], blockNumber: number): Promise { + for (let logIndex = 0; logIndex < data.length; logIndex++) { + const contractInstanceUpdate = data[logIndex]; + const updates = this.contractInstanceUpdates.get(contractInstanceUpdate.address.toString()) || []; + updates.unshift({ + ...contractInstanceUpdate, + blockNumber, + logIndex, + }); + this.contractInstanceUpdates.set(contractInstanceUpdate.address.toString(), updates); + } + return Promise.resolve(true); + } + + public deleteContractInstanceUpdates( + data: ContractInstanceUpdateWithAddress[], + blockNumber: number, + ): Promise { + for (let logIndex = 0; logIndex < data.length; logIndex++) { + const contractInstanceUpdate = data[logIndex]; + let updates = this.contractInstanceUpdates.get(contractInstanceUpdate.address.toString()) || []; + updates = updates.filter(update => !(update.blockNumber === blockNumber && update.logIndex === logIndex)); + this.contractInstanceUpdates.set(contractInstanceUpdate.address.toString(), updates); + } + return Promise.resolve(true); + } + /** * Append new blocks to the store's list. * @param blocks - The L2 blocks to be added to the store and the last processed L1 block. @@ -690,15 +739,19 @@ export class MemoryArchiverStore implements ArchiverDataStore { }); } + getLastBlockNumber(): number { + if (this.l2Blocks.length === 0) { + return INITIAL_L2_BLOCK_NUM - 1; + } + return this.l2Blocks[this.l2Blocks.length - 1].data.number; + } + /** * Gets the number of the latest L2 block processed. * @returns The number of the latest L2 block processed. */ public getSynchedL2BlockNumber(): Promise { - if (this.l2Blocks.length === 0) { - return Promise.resolve(INITIAL_L2_BLOCK_NUM - 1); - } - return Promise.resolve(this.l2Blocks[this.l2Blocks.length - 1].data.number); + return Promise.resolve(this.getLastBlockNumber()); } public getProvenL2BlockNumber(): Promise { diff --git a/yarn-project/aztec.js/src/contract/contract.test.ts b/yarn-project/aztec.js/src/contract/contract.test.ts index e8943c10a721..191dff629a14 100644 --- a/yarn-project/aztec.js/src/contract/contract.test.ts +++ b/yarn-project/aztec.js/src/contract/contract.test.ts @@ -13,6 +13,7 @@ import { EthAddress, GasFees, type NodeInfo, + getContractClassFromArtifact, } from '@aztec/circuits.js'; import { type L1ContractAddresses } from '@aztec/ethereum/l1-contract-addresses'; import { type AbiDecoded, type ContractArtifact, FunctionType } from '@aztec/foundation/abi'; @@ -79,14 +80,23 @@ describe('Contract Class', () => { returnTypes: [], errorTypes: {}, bytecode: Buffer.alloc(8, 0xfa), + verificationKey: 'fake-verification-key', }, { - name: 'baz', + name: 'public_dispatch', isInitializer: false, isStatic: false, functionType: FunctionType.PUBLIC, isInternal: false, - parameters: [], + parameters: [ + { + name: 'selector', + type: { + kind: 'field', + }, + visibility: 'public', + }, + ], returnTypes: [], errorTypes: {}, bytecode: Buffer.alloc(8, 0xfb), @@ -131,7 +141,12 @@ describe('Contract Class', () => { beforeEach(async () => { contractAddress = await AztecAddress.random(); account = await CompleteAddress.random(); - contractInstance = { address: contractAddress } as ContractInstanceWithAddress; + const contractClass = await getContractClassFromArtifact(defaultArtifact); + contractInstance = { + address: contractAddress, + currentContractClassId: contractClass.id, + originalContractClassId: contractClass.id, + } as ContractInstanceWithAddress; const mockNodeInfo: NodeInfo = { nodeVersion: 'vx.x.x', diff --git a/yarn-project/aztec.js/src/contract/contract.ts b/yarn-project/aztec.js/src/contract/contract.ts index 6472a9da8800..71d61dee8bce 100644 --- a/yarn-project/aztec.js/src/contract/contract.ts +++ b/yarn-project/aztec.js/src/contract/contract.ts @@ -1,4 +1,4 @@ -import { PublicKeys } from '@aztec/circuits.js'; +import { PublicKeys, getContractClassFromArtifact } from '@aztec/circuits.js'; import { type ContractArtifact } from '@aztec/foundation/abi'; import { type AztecAddress } from '@aztec/foundation/aztec-address'; @@ -26,6 +26,12 @@ export class Contract extends ContractBase { if (instance === undefined) { throw new Error(`Contract instance at ${address.toString()} has not been registered in the wallet's PXE`); } + const thisContractClass = await getContractClassFromArtifact(artifact); + if (!thisContractClass.id.equals(instance.currentContractClassId)) { + // wallet holds an outdated version of this contract + await wallet.updateContract(address, artifact); + instance.currentContractClassId = thisContractClass.id; + } return new Contract(instance, artifact, wallet); } diff --git a/yarn-project/aztec.js/src/contract/deploy_method.ts b/yarn-project/aztec.js/src/contract/deploy_method.ts index d8f95418cd7d..3c32b5d73f2a 100644 --- a/yarn-project/aztec.js/src/contract/deploy_method.ts +++ b/yarn-project/aztec.js/src/contract/deploy_method.ts @@ -147,9 +147,9 @@ export class DeployMethod extends Bas // Obtain contract class from artifact and check it matches the reported one by the instance. // TODO(@spalladino): We're unnecessarily calculating the contract class multiple times here. const contractClass = await getContractClassFromArtifact(this.artifact); - if (!instance.contractClassId.equals(contractClass.id)) { + if (!instance.currentContractClassId.equals(contractClass.id)) { throw new Error( - `Contract class mismatch when deploying contract: got ${instance.contractClassId.toString()} from instance and ${contractClass.id.toString()} from artifact`, + `Contract class mismatch when deploying contract: got ${instance.currentContractClassId.toString()} from instance and ${contractClass.id.toString()} from artifact`, ); } diff --git a/yarn-project/aztec.js/src/deployment/deploy_instance.ts b/yarn-project/aztec.js/src/deployment/deploy_instance.ts index bf0d501d28d5..4b49fbbfc8c7 100644 --- a/yarn-project/aztec.js/src/deployment/deploy_instance.ts +++ b/yarn-project/aztec.js/src/deployment/deploy_instance.ts @@ -14,7 +14,7 @@ export async function deployInstance( instance: ContractInstanceWithAddress, ): Promise { const deployerContract = await getDeployerContract(wallet); - const { salt, contractClassId, publicKeys, deployer } = instance; + const { salt, currentContractClassId: contractClassId, publicKeys, deployer } = instance; const isUniversalDeploy = deployer.isZero(); if (!isUniversalDeploy && !wallet.getAddress().equals(deployer)) { throw new Error( diff --git a/yarn-project/aztec.js/src/wallet/base_wallet.ts b/yarn-project/aztec.js/src/wallet/base_wallet.ts index 69f6c61abb66..e6f238e26689 100644 --- a/yarn-project/aztec.js/src/wallet/base_wallet.ts +++ b/yarn-project/aztec.js/src/wallet/base_wallet.ts @@ -94,6 +94,9 @@ export abstract class BaseWallet implements Wallet { registerContractClass(artifact: ContractArtifact): Promise { return this.pxe.registerContractClass(artifact); } + updateContract(contractAddress: AztecAddress, artifact: ContractArtifact): Promise { + return this.pxe.updateContract(contractAddress, artifact); + } getContracts(): Promise { return this.pxe.getContracts(); } diff --git a/yarn-project/aztec/src/cli/cmds/start_pxe.ts b/yarn-project/aztec/src/cli/cmds/start_pxe.ts index 959254e36fd5..f0986afc77a8 100644 --- a/yarn-project/aztec/src/cli/cmds/start_pxe.ts +++ b/yarn-project/aztec/src/cli/cmds/start_pxe.ts @@ -105,13 +105,15 @@ export async function addPXE( await Promise.all( Object.values(l2Contracts).map(async ({ name, address, artifact, initHash, salt }) => { + const contractClass = await getContractClassFromArtifact(artifact!); const instance: ContractInstanceWithAddress = { version: 1, salt, initializationHash: initHash, address, deployer: AztecAddress.ZERO, - contractClassId: (await getContractClassFromArtifact(artifact!)).id, + currentContractClassId: contractClass.id, + originalContractClassId: contractClass.id, publicKeys: PublicKeys.default(), }; userLog(`Registering ${name} at ${address.toString()}`); diff --git a/yarn-project/bb-prover/src/avm_proving_tests/avm_contract_class_limits.test.ts b/yarn-project/bb-prover/src/avm_proving_tests/avm_contract_class_limits.test.ts index bbba6b94cb4b..98daadbc0a87 100644 --- a/yarn-project/bb-prover/src/avm_proving_tests/avm_contract_class_limits.test.ts +++ b/yarn-project/bb-prover/src/avm_proving_tests/avm_contract_class_limits.test.ts @@ -44,7 +44,7 @@ describe('AVM WitGen & Circuit – check circuit - contract class limits', () => // include another contract address that reuses a class ID to ensure that we can call it even after the limit is reached const instanceSameClassAsFirstContract = await makeContractInstanceFromClassId( - instances[0].contractClassId, + instances[0].currentContractClassId, /*seed=*/ 1000, ); instanceAddresses.push(instanceSameClassAsFirstContract.address); diff --git a/yarn-project/bb-prover/src/avm_proving_tests/avm_contract_updates.test.ts b/yarn-project/bb-prover/src/avm_proving_tests/avm_contract_updates.test.ts new file mode 100644 index 000000000000..04e21bd3b88e --- /dev/null +++ b/yarn-project/bb-prover/src/avm_proving_tests/avm_contract_updates.test.ts @@ -0,0 +1,208 @@ +import { + AztecAddress, + type ContractClassPublic, + type ContractInstanceWithAddress, + FunctionSelector, + PUBLIC_DISPATCH_SELECTOR, + ScheduledDelayChange, + ScheduledValueChange, + UPDATED_CLASS_IDS_SLOT, + UPDATES_SCHEDULED_VALUE_CHANGE_LEN, + computeSharedMutableHashSlot, +} from '@aztec/circuits.js'; +import { deriveStorageSlotInMap } from '@aztec/circuits.js/hash'; +import { makeContractClassPublic, makeContractInstanceFromClassId } from '@aztec/circuits.js/testing'; +import { poseidon2Hash } from '@aztec/foundation/crypto'; +import { Fr } from '@aztec/foundation/fields'; +import { AvmTestContractArtifact } from '@aztec/noir-contracts.js/AvmTest'; +import { ProtocolContractAddress } from '@aztec/protocol-contracts'; +import { DEFAULT_BLOCK_NUMBER, getAvmTestContractBytecode } from '@aztec/simulator/public/fixtures'; + +import { AvmProvingTester } from './avm_proving_tester.js'; + +const TIMEOUT = 300_000; +const DISPATCH_FN_NAME = 'public_dispatch'; +const DISPATCH_SELECTOR = new FunctionSelector(PUBLIC_DISPATCH_SELECTOR); + +describe('AVM WitGen & Circuit - contract updates', () => { + const sender = AztecAddress.fromNumber(42); + + const avmTestContractClassSeed = 0; + const avmTestContractBytecode = getAvmTestContractBytecode(DISPATCH_FN_NAME); + let avmTestContractClass: ContractClassPublic; + let avmTestContractInstance: ContractInstanceWithAddress; + + beforeEach(async () => { + avmTestContractClass = await makeContractClassPublic( + /*seed=*/ avmTestContractClassSeed, + /*publicDispatchFunction=*/ { bytecode: avmTestContractBytecode, selector: DISPATCH_SELECTOR }, + ); + }); + + const writeContractUpdate = async ( + tester: AvmProvingTester, + contractAddress: AztecAddress, + previousClassId: Fr, + nextClassId: Fr, + blockOfChange: number, + ) => { + const sharedMutableSlot = await deriveStorageSlotInMap(new Fr(UPDATED_CLASS_IDS_SLOT), contractAddress); + + const valueChange = new ScheduledValueChange([previousClassId], [nextClassId], blockOfChange); + const delayChange = ScheduledDelayChange.empty(); + const writeToTree = async (storageSlot: Fr, value: Fr) => { + await tester.setPublicStorage(ProtocolContractAddress.ContractInstanceDeployer, storageSlot, value); + }; + await valueChange.writeToTree(sharedMutableSlot, writeToTree); + await delayChange.writeToTree(sharedMutableSlot, writeToTree); + + const updatePreimage = [delayChange.toField(), ...valueChange.toFields()]; + const updateHash = await poseidon2Hash(updatePreimage); + + const hashSlot = computeSharedMutableHashSlot(sharedMutableSlot, UPDATES_SCHEDULED_VALUE_CHANGE_LEN); + + await writeToTree(hashSlot, updateHash); + }; + + it( + 'should execute an updated contract', + async () => { + // Contract was not originally the avmTestContract + const originalClassId = new Fr(27); + avmTestContractInstance = await makeContractInstanceFromClassId( + originalClassId, + /*seed=*/ avmTestContractClassSeed, + { + currentClassId: avmTestContractClass.id, + }, + ); + const tester = await AvmProvingTester.create(/*checkCircuitOnly*/ true); + await tester.addContractClass(avmTestContractClass, AvmTestContractArtifact); + await tester.addContractInstance(avmTestContractInstance); + await writeContractUpdate( + tester, + avmTestContractInstance.address, + avmTestContractInstance.originalContractClassId, + avmTestContractInstance.currentContractClassId, + DEFAULT_BLOCK_NUMBER, + ); + + await tester.simProveVerify( + sender, + /*setupCalls=*/ [], + /*appCalls=*/ [ + { address: avmTestContractInstance.address, fnName: 'add_args_return', args: [new Fr(1), new Fr(2)] }, + ], + /*teardownCall=*/ undefined, + /*expectRevert=*/ false, + ); + }, + TIMEOUT, + ); + + it( + 'should fail if trying to execute an updated contract which has not been updated yet', + async () => { + // Contract was not originally the avmTestContract + const originalClassId = new Fr(27); + avmTestContractInstance = await makeContractInstanceFromClassId( + originalClassId, + /*seed=*/ avmTestContractClassSeed, + { + currentClassId: avmTestContractClass.id, + }, + ); + const tester = await AvmProvingTester.create(/*checkCircuitOnly*/ true); + await tester.addContractClass(avmTestContractClass, AvmTestContractArtifact); + await tester.addContractInstance(avmTestContractInstance); + await writeContractUpdate( + tester, + avmTestContractInstance.address, + avmTestContractInstance.originalContractClassId, + avmTestContractInstance.currentContractClassId, + DEFAULT_BLOCK_NUMBER + 1, + ); + + await expect( + tester.simProveVerify( + sender, + /*setupCalls=*/ [], + /*appCalls=*/ [ + { address: avmTestContractInstance.address, fnName: 'add_args_return', args: [new Fr(1), new Fr(2)] }, + ], + /*teardownCall=*/ undefined, + /*expectRevert=*/ false, + ), + ).rejects.toThrow(); + }, + TIMEOUT, + ); + + it( + 'should execute a not yet updated contract', + async () => { + // Contract was not originally the avmTestContract + const newClassId = new Fr(27); + avmTestContractInstance = await makeContractInstanceFromClassId( + avmTestContractClass.id, + /*seed=*/ avmTestContractClassSeed, + ); + const tester = await AvmProvingTester.create(/*checkCircuitOnly*/ true); + await tester.addContractClass(avmTestContractClass, AvmTestContractArtifact); + await tester.addContractInstance(avmTestContractInstance); + await writeContractUpdate( + tester, + avmTestContractInstance.address, + avmTestContractInstance.currentContractClassId, + newClassId, + DEFAULT_BLOCK_NUMBER + 1, + ); + + await tester.simProveVerify( + sender, + /*setupCalls=*/ [], + /*appCalls=*/ [ + { address: avmTestContractInstance.address, fnName: 'add_args_return', args: [new Fr(1), new Fr(2)] }, + ], + /*teardownCall=*/ undefined, + /*expectRevert=*/ false, + ); + }, + TIMEOUT, + ); + + it( + 'should fail if trying to execute the old class of a contract which has been updated already', + async () => { + // Contract was not originally the avmTestContract + const newClassId = new Fr(27); + avmTestContractInstance = await makeContractInstanceFromClassId( + avmTestContractClass.id, + /*seed=*/ avmTestContractClassSeed, + ); + const tester = await AvmProvingTester.create(/*checkCircuitOnly*/ true); + await tester.addContractClass(avmTestContractClass, AvmTestContractArtifact); + await tester.addContractInstance(avmTestContractInstance); + await writeContractUpdate( + tester, + avmTestContractInstance.address, + avmTestContractInstance.currentContractClassId, + newClassId, + DEFAULT_BLOCK_NUMBER - 1, + ); + + await expect( + tester.simProveVerify( + sender, + /*setupCalls=*/ [], + /*appCalls=*/ [ + { address: avmTestContractInstance.address, fnName: 'add_args_return', args: [new Fr(1), new Fr(2)] }, + ], + /*teardownCall=*/ undefined, + /*expectRevert=*/ false, + ), + ).rejects.toThrow(); + }, + TIMEOUT, + ); +}); diff --git a/yarn-project/bb-prover/src/avm_proving_tests/avm_proving_and_verification.test.ts b/yarn-project/bb-prover/src/avm_proving_tests/avm_proving_and_verification.test.ts index 56656363080d..73298d5b9757 100644 --- a/yarn-project/bb-prover/src/avm_proving_tests/avm_proving_and_verification.test.ts +++ b/yarn-project/bb-prover/src/avm_proving_tests/avm_proving_and_verification.test.ts @@ -49,7 +49,7 @@ describe('AVM WitGen & Circuit – proving and verification', () => { argsU8, /*getInstanceForAddress=*/ expectContractInstance.address.toField(), /*expectedDeployer=*/ expectContractInstance.deployer.toField(), - /*expectedClassId=*/ expectContractInstance.contractClassId.toField(), + /*expectedClassId=*/ expectContractInstance.currentContractClassId.toField(), /*expectedInitializationHash=*/ expectContractInstance.initializationHash.toField(), ]; diff --git a/yarn-project/bb-prover/src/avm_proving_tests/avm_v2.test.ts b/yarn-project/bb-prover/src/avm_proving_tests/avm_v2.test.ts index 1ba8f7658b1c..81901f2f9177 100644 --- a/yarn-project/bb-prover/src/avm_proving_tests/avm_v2.test.ts +++ b/yarn-project/bb-prover/src/avm_proving_tests/avm_v2.test.ts @@ -49,7 +49,7 @@ describe('AVM v2', () => { argsU8, /*getInstanceForAddress=*/ expectContractInstance.address.toField(), /*expectedDeployer=*/ expectContractInstance.deployer.toField(), - /*expectedClassId=*/ expectContractInstance.contractClassId.toField(), + /*expectedClassId=*/ expectContractInstance.currentContractClassId.toField(), /*expectedInitializationHash=*/ expectContractInstance.initializationHash.toField(), ]; diff --git a/yarn-project/circuit-types/src/interfaces/archiver.test.ts b/yarn-project/circuit-types/src/interfaces/archiver.test.ts index 7146dd877224..d5e2bd76d417 100644 --- a/yarn-project/circuit-types/src/interfaces/archiver.test.ts +++ b/yarn-project/circuit-types/src/interfaces/archiver.test.ts @@ -237,7 +237,8 @@ describe('ArchiverApiSchema', () => { const result = await context.client.getContract(address); expect(result).toEqual({ address, - contractClassId: expect.any(Fr), + currentContractClassId: expect.any(Fr), + originalContractClassId: expect.any(Fr), deployer: expect.any(AztecAddress), initializationHash: expect.any(Fr), publicKeys: expect.any(PublicKeys), @@ -370,7 +371,8 @@ class MockArchiver implements ArchiverApi { async getContract(address: AztecAddress): Promise { return { address, - contractClassId: Fr.random(), + currentContractClassId: Fr.random(), + originalContractClassId: Fr.random(), deployer: await AztecAddress.random(), initializationHash: Fr.random(), publicKeys: await PublicKeys.random(), diff --git a/yarn-project/circuit-types/src/interfaces/aztec-node.test.ts b/yarn-project/circuit-types/src/interfaces/aztec-node.test.ts index ae562878c114..605909330f7e 100644 --- a/yarn-project/circuit-types/src/interfaces/aztec-node.test.ts +++ b/yarn-project/circuit-types/src/interfaces/aztec-node.test.ts @@ -328,7 +328,8 @@ describe('AztecNodeApiSchema', () => { const response = await context.client.getContract(await AztecAddress.random()); expect(response).toEqual({ address: expect.any(AztecAddress), - contractClassId: expect.any(Fr), + currentContractClassId: expect.any(Fr), + originalContractClassId: expect.any(Fr), deployer: expect.any(AztecAddress), initializationHash: expect.any(Fr), publicKeys: expect.any(PublicKeys), @@ -587,7 +588,8 @@ class MockAztecNode implements AztecNode { expect(address).toBeInstanceOf(AztecAddress); const instance = { version: 1 as const, - contractClassId: Fr.random(), + currentContractClassId: Fr.random(), + originalContractClassId: Fr.random(), deployer: await AztecAddress.random(), initializationHash: Fr.random(), publicKeys: await PublicKeys.random(), diff --git a/yarn-project/circuit-types/src/interfaces/pxe.test.ts b/yarn-project/circuit-types/src/interfaces/pxe.test.ts index 17731c1fb68f..8cb9f8d958da 100644 --- a/yarn-project/circuit-types/src/interfaces/pxe.test.ts +++ b/yarn-project/circuit-types/src/interfaces/pxe.test.ts @@ -76,7 +76,8 @@ describe('PXESchema', () => { address = await AztecAddress.random(); instance = { version: 1, - contractClassId: Fr.random(), + currentContractClassId: Fr.random(), + originalContractClassId: Fr.random(), deployer: await AztecAddress.random(), initializationHash: Fr.random(), publicKeys: await PublicKeys.random(), @@ -146,6 +147,10 @@ describe('PXESchema', () => { await context.client.registerContract({ instance, artifact }); }); + it('updateContract', async () => { + await context.client.updateContract(instance.address, artifact); + }); + it('getContracts', async () => { const result = await context.client.getContracts(); expect(result).toEqual([address]); @@ -384,6 +389,10 @@ class MockPXE implements PXE { deepStrictEqual(contract.artifact, this.artifact); return Promise.resolve(); } + updateContract(contractAddress: AztecAddress, _artifact: ContractArtifact): Promise { + expect(contractAddress).toEqual(this.address); + return Promise.resolve(); + } getContracts(): Promise { return Promise.resolve([this.address]); } diff --git a/yarn-project/circuit-types/src/interfaces/pxe.ts b/yarn-project/circuit-types/src/interfaces/pxe.ts index c23fae7f8dd8..ba042e7203b9 100644 --- a/yarn-project/circuit-types/src/interfaces/pxe.ts +++ b/yarn-project/circuit-types/src/interfaces/pxe.ts @@ -150,6 +150,15 @@ export interface PXE { */ registerContract(contract: { instance: ContractInstanceWithAddress; artifact?: ContractArtifact }): Promise; + /** + * Updates a deployed contract in the PXE Service. This is used to update the contract artifact when + * an update has happened, so the new code can be used in the simulation of local transactions. + * This is called by aztec.js when instantiating a contract in a given address with a mismatching artifact. + * @param contractAddress - The address of the contract to update. + * @param artifact - The updated artifact for the contract. + */ + updateContract(contractAddress: AztecAddress, artifact: ContractArtifact): Promise; + /** * Retrieves the addresses of contracts added to this PXE Service. * @returns An array of contracts addresses registered on this PXE Service. @@ -479,6 +488,7 @@ export const PXESchema: ApiSchemaFor = { .function() .args(z.object({ instance: ContractInstanceWithAddressSchema, artifact: z.optional(ContractArtifactSchema) })) .returns(z.void()), + updateContract: z.function().args(schemas.AztecAddress, ContractArtifactSchema).returns(z.void()), getContracts: z.function().returns(z.array(schemas.AztecAddress)), proveTx: z.function().args(TxExecutionRequest.schema, PrivateExecutionResult.schema).returns(TxProvingResult.schema), simulateTx: z diff --git a/yarn-project/circuit-types/src/mocks.ts b/yarn-project/circuit-types/src/mocks.ts index 8ac0d0e3f9d2..68710913c229 100644 --- a/yarn-project/circuit-types/src/mocks.ts +++ b/yarn-project/circuit-types/src/mocks.ts @@ -197,7 +197,14 @@ export const randomContractInstanceWithAddress = async ( opts: { contractClassId?: Fr } = {}, address?: AztecAddress, ): Promise => { - const instance = await SerializableContractInstance.random(opts); + const instance = await SerializableContractInstance.random( + opts.contractClassId + ? { + currentContractClassId: opts.contractClassId, + originalContractClassId: opts.contractClassId, + } + : undefined, + ); return instance.withAddress(address ?? (await computeContractAddressFromInstance(instance))); }; diff --git a/yarn-project/circuits.js/src/constants.gen.ts b/yarn-project/circuits.js/src/constants.gen.ts index c5e98b89150c..347ef462283d 100644 --- a/yarn-project/circuits.js/src/constants.gen.ts +++ b/yarn-project/circuits.js/src/constants.gen.ts @@ -99,6 +99,8 @@ export const REGISTERER_UNCONSTRAINED_FUNCTION_BROADCASTED_MAGIC_VALUE = 24399338136397901754495080759185489776044879232766421623673792970137n; export const DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE = 14061769416655647708490531650437236735160113654556896985372298487345n; +export const DEPLOYER_CONTRACT_INSTANCE_UPDATED_MAGIC_VALUE = + 1534834688047131268740281708431107902615560100979874281215533519862n; export const MAX_PROTOCOL_CONTRACTS = 7; export const CANONICAL_AUTH_REGISTRY_ADDRESS = 1; export const DEPLOYER_CONTRACT_ADDRESS = 2; @@ -108,6 +110,7 @@ export const FEE_JUICE_ADDRESS = 5; export const ROUTER_ADDRESS = 6; export const REGISTERER_CONTRACT_BYTECODE_CAPSULE_SLOT = 79025834455612; export const FEE_JUICE_BALANCES_SLOT = 1; +export const UPDATED_CLASS_IDS_SLOT = 1; export const DEFAULT_NPK_M_X = 582240093077765400562621227108555700500271598878376310175765873770292988861n; export const DEFAULT_NPK_M_Y = 10422444662424639723529825114205836958711284159673861467999592572974769103684n; export const DEFAULT_IVPK_M_X = 339708709767762472786445938838804872781183545349360029270386718856175781484n; @@ -350,6 +353,12 @@ export const PROOF_TYPE_AVM = 4; export const PROOF_TYPE_ROLLUP_HONK = 5; export const PROOF_TYPE_ROOT_ROLLUP_HONK = 6; export const TWO_POW_64 = 18446744073709551616n; +export const DEFAULT_UPDATE_DELAY = 3600; +export const MINIMUM_UPDATE_DELAY = 25; +export const UPDATES_VALUE_SIZE = 1; +export const UPDATES_SCHEDULED_VALUE_CHANGE_LEN = 3; +export const SCHEDULED_DELAY_CHANGE_PCKD_LEN = 1; +export const UPDATES_SHARED_MUTABLE_VALUES_LEN = 4; export enum GeneratorIndex { NOTE_HASH = 1, NOTE_HASH_NONCE = 2, diff --git a/yarn-project/circuits.js/src/contract/contract_address.test.ts b/yarn-project/circuits.js/src/contract/contract_address.test.ts index 6eb036136dfd..7179cd706abc 100644 --- a/yarn-project/circuits.js/src/contract/contract_address.test.ts +++ b/yarn-project/circuits.js/src/contract/contract_address.test.ts @@ -14,7 +14,7 @@ describe('ContractAddress', () => { setupCustomSnapshotSerializers(expect); it('computePartialAddress', async () => { const mockInstance = { - contractClassId: new Fr(1), + originalContractClassId: new Fr(1), saltedInitializationHash: new Fr(2), }; const result = await computePartialAddress(mockInstance); @@ -64,7 +64,8 @@ describe('ContractAddress', () => { await computeContractAddressFromInstance({ publicKeys, salt, - contractClassId, + originalContractClassId: contractClassId, + currentContractClassId: contractClassId, initializationHash, deployer, version: 1, diff --git a/yarn-project/circuits.js/src/contract/contract_address.ts b/yarn-project/circuits.js/src/contract/contract_address.ts index ebaeadb2d684..98a577774d69 100644 --- a/yarn-project/circuits.js/src/contract/contract_address.ts +++ b/yarn-project/circuits.js/src/contract/contract_address.ts @@ -22,7 +22,7 @@ import { type ContractInstance } from './interfaces/contract_instance.js'; export async function computeContractAddressFromInstance( instance: | ContractInstance - | ({ contractClassId: Fr; saltedInitializationHash: Fr } & Pick), + | ({ originalContractClassId: Fr; saltedInitializationHash: Fr } & Pick), ): Promise { const partialAddress = await computePartialAddress(instance); return computeAddress(instance.publicKeys, partialAddress); @@ -34,8 +34,8 @@ export async function computeContractAddressFromInstance( */ export async function computePartialAddress( instance: - | Pick - | { contractClassId: Fr; saltedInitializationHash: Fr }, + | Pick + | { originalContractClassId: Fr; saltedInitializationHash: Fr }, ): Promise { const saltedInitializationHash = 'saltedInitializationHash' in instance @@ -43,7 +43,7 @@ export async function computePartialAddress( : await computeSaltedInitializationHash(instance); return poseidon2HashWithSeparator( - [instance.contractClassId, saltedInitializationHash], + [instance.originalContractClassId, saltedInitializationHash], GeneratorIndex.PARTIAL_ADDRESS, ); } diff --git a/yarn-project/circuits.js/src/contract/contract_instance.ts b/yarn-project/circuits.js/src/contract/contract_instance.ts index e4cfc8f6ad5e..77ad130e30fc 100644 --- a/yarn-project/circuits.js/src/contract/contract_instance.ts +++ b/yarn-project/circuits.js/src/contract/contract_instance.ts @@ -24,7 +24,8 @@ export class SerializableContractInstance { public readonly version = VERSION; public readonly salt: Fr; public readonly deployer: AztecAddress; - public readonly contractClassId: Fr; + public readonly currentContractClassId: Fr; + public readonly originalContractClassId: Fr; public readonly initializationHash: Fr; public readonly publicKeys: PublicKeys; @@ -34,7 +35,8 @@ export class SerializableContractInstance { } this.salt = instance.salt; this.deployer = instance.deployer; - this.contractClassId = instance.contractClassId; + this.currentContractClassId = instance.currentContractClassId; + this.originalContractClassId = instance.originalContractClassId; this.initializationHash = instance.initializationHash; this.publicKeys = instance.publicKeys; } @@ -44,7 +46,8 @@ export class SerializableContractInstance { numToUInt8(this.version), this.salt, this.deployer, - this.contractClassId, + this.currentContractClassId, + this.originalContractClassId, this.initializationHash, this.publicKeys, ); @@ -61,7 +64,8 @@ export class SerializableContractInstance { version: reader.readUInt8() as typeof VERSION, salt: reader.readObject(Fr), deployer: reader.readObject(AztecAddress), - contractClassId: reader.readObject(Fr), + currentContractClassId: reader.readObject(Fr), + originalContractClassId: reader.readObject(Fr), initializationHash: reader.readObject(Fr), publicKeys: reader.readObject(PublicKeys), }); @@ -72,7 +76,8 @@ export class SerializableContractInstance { version: VERSION, salt: Fr.random(), deployer: await AztecAddress.random(), - contractClassId: Fr.random(), + currentContractClassId: Fr.random(), + originalContractClassId: Fr.random(), initializationHash: Fr.random(), publicKeys: await PublicKeys.random(), ...opts, @@ -84,7 +89,8 @@ export class SerializableContractInstance { version: VERSION, salt: Fr.zero(), deployer: AztecAddress.zero(), - contractClassId: Fr.zero(), + currentContractClassId: Fr.zero(), + originalContractClassId: Fr.zero(), initializationHash: Fr.zero(), publicKeys: PublicKeys.default(), }); @@ -123,7 +129,8 @@ export async function getContractInstanceFromDeployParams( const publicKeys = opts.publicKeys ?? PublicKeys.default(); const instance: ContractInstance = { - contractClassId: contractClass.id, + currentContractClassId: contractClass.id, + originalContractClassId: contractClass.id, initializationHash, publicKeys, salt, diff --git a/yarn-project/circuits.js/src/contract/contract_instance_update.test.ts b/yarn-project/circuits.js/src/contract/contract_instance_update.test.ts new file mode 100644 index 000000000000..1fe3f745fac0 --- /dev/null +++ b/yarn-project/circuits.js/src/contract/contract_instance_update.test.ts @@ -0,0 +1,8 @@ +import { SerializableContractInstanceUpdate } from './contract_instance_update.js'; + +describe('ContractInstance', () => { + it('can serialize and deserialize an instance update', () => { + const instance = SerializableContractInstanceUpdate.random(); + expect(SerializableContractInstanceUpdate.fromBuffer(instance.toBuffer())).toEqual(instance); + }); +}); diff --git a/yarn-project/circuits.js/src/contract/contract_instance_update.ts b/yarn-project/circuits.js/src/contract/contract_instance_update.ts new file mode 100644 index 000000000000..f9f8878653a9 --- /dev/null +++ b/yarn-project/circuits.js/src/contract/contract_instance_update.ts @@ -0,0 +1,47 @@ +import { Fr } from '@aztec/foundation/fields'; +import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize'; +import { type FieldsOf } from '@aztec/foundation/types'; + +import { type ContractInstanceUpdate } from './interfaces/contract_instance_update.js'; + +export class SerializableContractInstanceUpdate { + prevContractClassId: Fr; + newContractClassId: Fr; + blockOfChange: number; + + constructor(instance: ContractInstanceUpdate) { + this.prevContractClassId = instance.prevContractClassId; + this.newContractClassId = instance.newContractClassId; + this.blockOfChange = instance.blockOfChange; + } + + public toBuffer() { + return serializeToBuffer(this.prevContractClassId, this.newContractClassId, this.blockOfChange); + } + + static fromBuffer(bufferOrReader: Buffer | BufferReader) { + const reader = BufferReader.asReader(bufferOrReader); + return new SerializableContractInstanceUpdate({ + prevContractClassId: reader.readObject(Fr), + newContractClassId: reader.readObject(Fr), + blockOfChange: reader.readNumber(), + }); + } + + static random(opts: Partial> = {}) { + return new SerializableContractInstanceUpdate({ + prevContractClassId: Fr.random(), + newContractClassId: Fr.random(), + blockOfChange: Math.floor(Math.random() * 1000), + ...opts, + }); + } + + static default() { + return new SerializableContractInstanceUpdate({ + prevContractClassId: Fr.zero(), + newContractClassId: Fr.zero(), + blockOfChange: 0, + }); + } +} diff --git a/yarn-project/circuits.js/src/contract/index.ts b/yarn-project/circuits.js/src/contract/index.ts index 7376d76d6628..46e26b11748d 100644 --- a/yarn-project/circuits.js/src/contract/index.ts +++ b/yarn-project/circuits.js/src/contract/index.ts @@ -3,6 +3,7 @@ export * from './contract_address.js'; export * from './contract_class.js'; export * from './contract_class_id.js'; export * from './contract_instance.js'; +export * from './contract_instance_update.js'; export * from './private_function.js'; export * from './private_function_membership_proof.js'; export * from './unconstrained_function_membership_proof.js'; diff --git a/yarn-project/circuits.js/src/contract/interfaces/contract_instance.ts b/yarn-project/circuits.js/src/contract/interfaces/contract_instance.ts index 0d4d0092b8b5..31d66372284a 100644 --- a/yarn-project/circuits.js/src/contract/interfaces/contract_instance.ts +++ b/yarn-project/circuits.js/src/contract/interfaces/contract_instance.ts @@ -21,7 +21,9 @@ export interface ContractInstance { /** Optional deployer address or zero if this was a universal deploy. */ deployer: AztecAddress; /** Identifier of the contract class for this instance. */ - contractClassId: Fr; + currentContractClassId: Fr; + /** Identifier of the original (at deployment) contract class for this instance */ + originalContractClassId: Fr; /** Hash of the selector and arguments to the constructor. */ initializationHash: Fr; /** Public keys associated with this instance. */ @@ -34,7 +36,8 @@ export const ContractInstanceSchema = z.object({ version: z.literal(VERSION), salt: schemas.Fr, deployer: schemas.AztecAddress, - contractClassId: schemas.Fr, + currentContractClassId: schemas.Fr, + originalContractClassId: schemas.Fr, initializationHash: schemas.Fr, publicKeys: PublicKeys.schema, }) satisfies ZodFor; diff --git a/yarn-project/circuits.js/src/contract/interfaces/contract_instance_update.ts b/yarn-project/circuits.js/src/contract/interfaces/contract_instance_update.ts new file mode 100644 index 000000000000..55d0abee6d30 --- /dev/null +++ b/yarn-project/circuits.js/src/contract/interfaces/contract_instance_update.ts @@ -0,0 +1,29 @@ +import { type AztecAddress } from '@aztec/foundation/aztec-address'; +import { type Fr } from '@aztec/foundation/fields'; +import { type ZodFor, schemas } from '@aztec/foundation/schemas'; + +import { z } from 'zod'; + +/** + * An update to a contract instance, changing its contract class. + */ +export interface ContractInstanceUpdate { + /** Identifier of the previous contract class for this instance */ + prevContractClassId: Fr; + /** Identifier of the new contract class for this instance. */ + newContractClassId: Fr; + /** The block number where the contract class in use will be the new one */ + blockOfChange: number; +} + +export type ContractInstanceUpdateWithAddress = ContractInstanceUpdate & { address: AztecAddress }; + +export const ContractInstanceUpdateSchema = z.object({ + prevContractClassId: schemas.Fr, + newContractClassId: schemas.Fr, + blockOfChange: z.number(), +}) satisfies ZodFor; + +export const ContractInstanceUpdateWithAddressSchema = ContractInstanceUpdateSchema.and( + z.object({ address: schemas.AztecAddress }), +) satisfies ZodFor; diff --git a/yarn-project/circuits.js/src/contract/interfaces/index.ts b/yarn-project/circuits.js/src/contract/interfaces/index.ts index e3b0d5ebf86e..ab09b8533776 100644 --- a/yarn-project/circuits.js/src/contract/interfaces/index.ts +++ b/yarn-project/circuits.js/src/contract/interfaces/index.ts @@ -1,5 +1,6 @@ export * from './contract_class.js'; export * from './contract_data_source.js'; export * from './contract_instance.js'; +export * from './contract_instance_update.js'; export * from './node-info.js'; export * from './protocol_contract_addresses.js'; diff --git a/yarn-project/circuits.js/src/scripts/constants.in.ts b/yarn-project/circuits.js/src/scripts/constants.in.ts index 419daa59e69b..27dbabc44b1d 100644 --- a/yarn-project/circuits.js/src/scripts/constants.in.ts +++ b/yarn-project/circuits.js/src/scripts/constants.in.ts @@ -92,6 +92,9 @@ const CPP_CONSTANTS = [ 'ROUTER_ADDRESS', 'FEE_JUICE_BALANCES_SLOT', 'MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS', + 'UPDATED_CLASS_IDS_SLOT', + 'UPDATES_SHARED_MUTABLE_VALUES_LEN', + 'SCHEDULED_DELAY_CHANGE_PCKD_LEN', ]; const CPP_GENERATORS: string[] = [ diff --git a/yarn-project/circuits.js/src/structs/avm/avm.test.ts b/yarn-project/circuits.js/src/structs/avm/avm.test.ts index ced612198593..8599c0da1031 100644 --- a/yarn-project/circuits.js/src/structs/avm/avm.test.ts +++ b/yarn-project/circuits.js/src/structs/avm/avm.test.ts @@ -21,7 +21,8 @@ describe('Avm circuit inputs', () => { exists: true, salt: new Fr(0xdeadbeefn), deployer: AztecAddress.fromBigInt(0x000010n), - contractClassId: new Fr(0x41181337n), + currentContractClassId: new Fr(0x41181337n), + originalContractClassId: new Fr(0x41181337n), initializationHash: new Fr(0x111111n), publicKeys: new PublicKeys( new Point( @@ -52,7 +53,8 @@ describe('Avm circuit inputs', () => { exists: false, salt: new Fr(0xdead0000n), deployer: AztecAddress.fromBigInt(0x000020n), - contractClassId: new Fr(0x51181337n), + currentContractClassId: new Fr(0x51181337n), + originalContractClassId: new Fr(0x51181337n), initializationHash: new Fr(0x222222n), publicKeys: new PublicKeys( new Point( diff --git a/yarn-project/circuits.js/src/structs/avm/avm.ts b/yarn-project/circuits.js/src/structs/avm/avm.ts index 2728525635b9..238b1109b8ba 100644 --- a/yarn-project/circuits.js/src/structs/avm/avm.ts +++ b/yarn-project/circuits.js/src/structs/avm/avm.ts @@ -86,16 +86,23 @@ export class AvmEnqueuedCallHint { } export class AvmContractInstanceHint { + public readonly updatePreimage: Vector; + constructor( public readonly address: AztecAddress, public readonly exists: boolean, public readonly salt: Fr, public readonly deployer: AztecAddress, - public readonly contractClassId: Fr, + public readonly currentContractClassId: Fr, + public readonly originalContractClassId: Fr, public readonly initializationHash: Fr, public readonly publicKeys: PublicKeys, - public readonly membershipHint: AvmNullifierReadTreeHint = AvmNullifierReadTreeHint.empty(), - ) {} + public readonly initializationMembershipHint: AvmNullifierReadTreeHint = AvmNullifierReadTreeHint.empty(), + public readonly updateMembershipHint: AvmPublicDataReadTreeHint = AvmPublicDataReadTreeHint.empty(), + updatePreimage: Fr[], + ) { + this.updatePreimage = new Vector(updatePreimage); + } /** * Serializes the inputs to a buffer. * @returns - The inputs serialized to a buffer. @@ -122,22 +129,16 @@ export class AvmContractInstanceHint { !this.exists && this.salt.isZero() && this.deployer.isZero() && - this.contractClassId.isZero() && + this.currentContractClassId.isZero() && + this.originalContractClassId.isZero() && this.initializationHash.isZero() && this.publicKeys.isEmpty() && - this.membershipHint.isEmpty() + this.initializationMembershipHint.isEmpty() && + this.updateMembershipHint.isEmpty() && + this.updatePreimage.items.length == 0 ); } - /** - * Creates a new instance from fields. - * @param fields - Fields to create the instance from. - * @returns A new AvmHint instance. - */ - static from(fields: FieldsOf): AvmContractInstanceHint { - return new AvmContractInstanceHint(...AvmContractInstanceHint.getFields(fields)); - } - /** * Extracts fields from an instance. * @param fields - Fields to create the instance from. @@ -149,10 +150,13 @@ export class AvmContractInstanceHint { fields.exists, fields.salt, fields.deployer, - fields.contractClassId, + fields.currentContractClassId, + fields.originalContractClassId, fields.initializationHash, fields.publicKeys, - fields.membershipHint, + fields.initializationMembershipHint, + fields.updateMembershipHint, + fields.updatePreimage, ] as const; } @@ -170,8 +174,11 @@ export class AvmContractInstanceHint { AztecAddress.fromBuffer(reader), Fr.fromBuffer(reader), Fr.fromBuffer(reader), + Fr.fromBuffer(reader), PublicKeys.fromBuffer(reader), AvmNullifierReadTreeHint.fromBuffer(reader), + AvmPublicDataReadTreeHint.fromBuffer(reader), + reader.readVector(Fr), ); } @@ -539,6 +546,10 @@ export class AvmPublicDataReadTreeHint { return this.toBuffer().toString('hex'); } + static empty(): AvmPublicDataReadTreeHint { + return new AvmPublicDataReadTreeHint(PublicDataTreeLeafPreimage.empty(), Fr.ZERO, []); + } + /** * Is the struct empty? * @returns whether all members are empty. diff --git a/yarn-project/circuits.js/src/structs/index.ts b/yarn-project/circuits.js/src/structs/index.ts index 64004a2cdb2f..f27cd4a22d12 100644 --- a/yarn-project/circuits.js/src/structs/index.ts +++ b/yarn-project/circuits.js/src/structs/index.ts @@ -70,6 +70,7 @@ export * from './revert_code.js'; export * from './rollup_validation_requests.js'; export * from './scoped_key_validation_request_and_generator.js'; export * from './shared.js'; +export * from './shared_mutable/index.js'; export * from './state_reference.js'; export * from './tree_leaf_read_request.js'; export * from './tree_snapshots.js'; diff --git a/yarn-project/circuits.js/src/structs/kernel/private_call_data.ts b/yarn-project/circuits.js/src/structs/kernel/private_call_data.ts index 940336616325..d21d5f264309 100644 --- a/yarn-project/circuits.js/src/structs/kernel/private_call_data.ts +++ b/yarn-project/circuits.js/src/structs/kernel/private_call_data.ts @@ -2,11 +2,18 @@ import { Fr } from '@aztec/foundation/fields'; import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize'; import { type FieldsOf } from '@aztec/foundation/types'; -import { FUNCTION_TREE_HEIGHT, PROTOCOL_CONTRACT_TREE_HEIGHT } from '../../constants.gen.js'; +import { + FUNCTION_TREE_HEIGHT, + PROTOCOL_CONTRACT_TREE_HEIGHT, + PUBLIC_DATA_TREE_HEIGHT, + UPDATES_VALUE_SIZE, +} from '../../constants.gen.js'; import { PublicKeys } from '../../types/public_keys.js'; import { MembershipWitness } from '../membership_witness.js'; import { PrivateCircuitPublicInputs } from '../private_circuit_public_inputs.js'; -import { ProtocolContractLeafPreimage } from '../trees/index.js'; +import { ScheduledDelayChange } from '../shared_mutable/scheduled_delay_change.js'; +import { ScheduledValueChange } from '../shared_mutable/scheduled_value_change.js'; +import { ProtocolContractLeafPreimage, PublicDataTreeLeafPreimage } from '../trees/index.js'; import { VerificationKeyAsFields } from '../verification_key.js'; /** @@ -18,10 +25,56 @@ export class PrivateCallData { * Public inputs of the private function circuit. */ public publicInputs: PrivateCircuitPublicInputs, + /** * The verification key for the function being invoked. */ public vk: VerificationKeyAsFields, + + /** + * Hints for the validation of the vk + */ + public verificationKeyHints: PrivateVerificationKeyHints, + ) {} + + /** + * Serialize into a field array. Low-level utility. + * @param fields - Object with fields. + * @returns The array. + */ + static getFields(fields: FieldsOf) { + return [fields.publicInputs, fields.vk, fields.verificationKeyHints] as const; + } + + static from(fields: FieldsOf): PrivateCallData { + return new PrivateCallData(...PrivateCallData.getFields(fields)); + } + + /** + * Serialize this as a buffer. + * @returns The buffer. + */ + toBuffer(): Buffer { + return serializeToBuffer(...PrivateCallData.getFields(this)); + } + + /** + * Deserializes from a buffer or reader. + * @param buffer - Buffer or reader to read from. + * @returns The deserialized instance. + */ + static fromBuffer(buffer: Buffer | BufferReader): PrivateCallData { + const reader = BufferReader.asReader(buffer); + return new PrivateCallData( + reader.readObject(PrivateCircuitPublicInputs), + reader.readObject(VerificationKeyAsFields), + reader.readObject(PrivateVerificationKeyHints), + ); + } +} + +export class PrivateVerificationKeyHints { + constructor( /** * Artifact hash of the contract class for this private call. */ @@ -56,6 +109,8 @@ export class PrivateCallData { * The hash of the ACIR of the function being invoked. */ public acirHash: Fr, + + public updatedClassIdHints: UpdatedClassIdHints, ) {} /** @@ -63,10 +118,8 @@ export class PrivateCallData { * @param fields - Object with fields. * @returns The array. */ - static getFields(fields: FieldsOf) { + static getFields(fields: FieldsOf) { return [ - fields.publicInputs, - fields.vk, fields.contractClassArtifactHash, fields.contractClassPublicBytecodeCommitment, fields.publicKeys, @@ -75,11 +128,12 @@ export class PrivateCallData { fields.protocolContractMembershipWitness, fields.protocolContractLeaf, fields.acirHash, + fields.updatedClassIdHints, ] as const; } - static from(fields: FieldsOf): PrivateCallData { - return new PrivateCallData(...PrivateCallData.getFields(fields)); + static from(fields: FieldsOf): PrivateVerificationKeyHints { + return new PrivateVerificationKeyHints(...PrivateVerificationKeyHints.getFields(fields)); } /** @@ -87,7 +141,7 @@ export class PrivateCallData { * @returns The buffer. */ toBuffer(): Buffer { - return serializeToBuffer(...PrivateCallData.getFields(this)); + return serializeToBuffer(...PrivateVerificationKeyHints.getFields(this)); } /** @@ -95,11 +149,9 @@ export class PrivateCallData { * @param buffer - Buffer or reader to read from. * @returns The deserialized instance. */ - static fromBuffer(buffer: Buffer | BufferReader): PrivateCallData { + static fromBuffer(buffer: Buffer | BufferReader): PrivateVerificationKeyHints { const reader = BufferReader.asReader(buffer); - return new PrivateCallData( - reader.readObject(PrivateCircuitPublicInputs), - reader.readObject(VerificationKeyAsFields), + return new PrivateVerificationKeyHints( reader.readObject(Fr), reader.readObject(Fr), reader.readObject(PublicKeys), @@ -108,6 +160,56 @@ export class PrivateCallData { reader.readObject(MembershipWitness.deserializer(PROTOCOL_CONTRACT_TREE_HEIGHT)), reader.readObject(ProtocolContractLeafPreimage), reader.readObject(Fr), + reader.readObject(UpdatedClassIdHints), + ); + } +} + +export class UpdatedClassIdHints { + constructor( + public updatedClassIdWitness: MembershipWitness, + public updatedClassIdLeaf: PublicDataTreeLeafPreimage, + public updatedClassIdValueChange: ScheduledValueChange, + public updatedClassIdDelayChange: ScheduledDelayChange, + ) {} + + static getFields(fields: FieldsOf) { + return [ + fields.updatedClassIdWitness, + fields.updatedClassIdLeaf, + fields.updatedClassIdValueChange, + fields.updatedClassIdDelayChange, + ] as const; + } + + static from(fields: FieldsOf): UpdatedClassIdHints { + return new UpdatedClassIdHints(...UpdatedClassIdHints.getFields(fields)); + } + + /** + * Serialize this as a buffer. + * @returns The buffer. + */ + toBuffer(): Buffer { + return serializeToBuffer(...UpdatedClassIdHints.getFields(this)); + } + + /** + * Deserializes from a buffer or reader. + * @param buffer - Buffer or reader to read from. + * @returns The deserialized instance. + */ + static fromBuffer(buffer: Buffer | BufferReader): UpdatedClassIdHints { + const reader = BufferReader.asReader(buffer); + return new UpdatedClassIdHints( + reader.readObject(MembershipWitness.deserializer(PUBLIC_DATA_TREE_HEIGHT)), + reader.readObject(PublicDataTreeLeafPreimage), + reader.readObject({ + fromBuffer(reader) { + return ScheduledValueChange.fromBuffer(reader, UPDATES_VALUE_SIZE); + }, + }), + reader.readObject(ScheduledDelayChange), ); } } diff --git a/yarn-project/circuits.js/src/structs/shared_mutable/index.ts b/yarn-project/circuits.js/src/structs/shared_mutable/index.ts new file mode 100644 index 000000000000..d503d08263bb --- /dev/null +++ b/yarn-project/circuits.js/src/structs/shared_mutable/index.ts @@ -0,0 +1,11 @@ +import { Fr } from '@aztec/foundation/fields'; + +import { SCHEDULED_DELAY_CHANGE_PCKD_LEN } from '../../constants.gen.js'; + +export * from './scheduled_delay_change.js'; +export * from './scheduled_value_change.js'; + +export function computeSharedMutableHashSlot(sharedMutableSlot: Fr, valueChangeLen: number) { + // hash is stored after the value change and the delay change + return sharedMutableSlot.add(new Fr(valueChangeLen + SCHEDULED_DELAY_CHANGE_PCKD_LEN)); +} diff --git a/yarn-project/circuits.js/src/structs/shared_mutable/scheduled_delay_change.test.ts b/yarn-project/circuits.js/src/structs/shared_mutable/scheduled_delay_change.test.ts new file mode 100644 index 000000000000..09e230edf9f6 --- /dev/null +++ b/yarn-project/circuits.js/src/structs/shared_mutable/scheduled_delay_change.test.ts @@ -0,0 +1,17 @@ +import { ScheduledDelayChange } from './scheduled_delay_change.js'; + +describe('ScheduledDelayChange', () => { + it(`serializes to field and back`, () => { + let delayChange = ScheduledDelayChange.empty(); + expect(delayChange).toEqual(ScheduledDelayChange.fromField(delayChange.toField())); + + delayChange = new ScheduledDelayChange(undefined, 1, 2); + expect(delayChange).toEqual(ScheduledDelayChange.fromField(delayChange.toField())); + + delayChange = new ScheduledDelayChange(3, 4, undefined); + expect(delayChange).toEqual(ScheduledDelayChange.fromField(delayChange.toField())); + + delayChange = new ScheduledDelayChange(5, 6, 7); + expect(delayChange).toEqual(ScheduledDelayChange.fromField(delayChange.toField())); + }); +}); diff --git a/yarn-project/circuits.js/src/structs/shared_mutable/scheduled_delay_change.ts b/yarn-project/circuits.js/src/structs/shared_mutable/scheduled_delay_change.ts new file mode 100644 index 000000000000..a99d77d60d30 --- /dev/null +++ b/yarn-project/circuits.js/src/structs/shared_mutable/scheduled_delay_change.ts @@ -0,0 +1,59 @@ +import { Fr } from '@aztec/foundation/fields'; +import { BufferReader } from '@aztec/foundation/serialize'; + +import { type UInt32 } from '../shared.js'; + +export class ScheduledDelayChange { + constructor(public previous: UInt32 | undefined, public blockOfChange: UInt32, public post: UInt32 | undefined) {} + + static fromField(field: Fr) { + const asBigint = field.toBigInt(); + const post = asBigint & 0xffffffffn; + const pre = (asBigint >> 32n) & 0xffffffffn; + const blockOfChange = (asBigint >> 64n) & 0xffffffffn; + const isPostSome = (asBigint >> 96n) & 1n; + const isPreSome = (asBigint >> 97n) & 1n; + return new this(isPreSome ? Number(pre) : undefined, Number(blockOfChange), isPostSome ? Number(post) : undefined); + } + + toField(): Fr { + // high bits [ pre_is_some: u1 | post_is_some: u1 | block_of_change: u32 | pre_inner: u32 | post_inner: u32 ] low bits + let result = BigInt(this.post || 0); + result |= BigInt(this.previous || 0) << 32n; + result |= BigInt(this.blockOfChange) << 64n; + result |= this.post === undefined ? 0n : 1n << 96n; + result |= this.previous === undefined ? 0n : 1n << 97n; + return new Fr(result); + } + + toBuffer(): Buffer { + return this.toField().toBuffer(); + } + + static fromBuffer(buffer: Buffer | BufferReader): ScheduledDelayChange { + const reader = BufferReader.asReader(buffer); + return ScheduledDelayChange.fromField(reader.readObject(Fr)); + } + + static empty() { + return new this(undefined, 0, undefined); + } + + isEmpty(): boolean { + return this.toField().isEmpty(); + } + + static computeSlot(sharedMutableSlot: Fr) { + return sharedMutableSlot; + } + + static async readFromTree(sharedMutableSlot: Fr, reader: (storageSlot: Fr) => Promise) { + const delaySlot = this.computeSlot(sharedMutableSlot); + return ScheduledDelayChange.fromField(await reader(delaySlot)); + } + + async writeToTree(sharedMutableSlot: Fr, writer: (storageSlot: Fr, value: Fr) => Promise) { + const delaySlot = ScheduledDelayChange.computeSlot(sharedMutableSlot); + await writer(delaySlot, this.toField()); + } +} diff --git a/yarn-project/circuits.js/src/structs/shared_mutable/scheduled_value_change.test.ts b/yarn-project/circuits.js/src/structs/shared_mutable/scheduled_value_change.test.ts new file mode 100644 index 000000000000..c00e710a6950 --- /dev/null +++ b/yarn-project/circuits.js/src/structs/shared_mutable/scheduled_value_change.test.ts @@ -0,0 +1,14 @@ +import { Fr } from '@aztec/foundation/fields'; + +import { ScheduledValueChange } from './scheduled_value_change.js'; + +describe('ScheduledValueChange', () => { + it(`serializes to fields and back`, () => { + let valueChange = ScheduledValueChange.empty(1); + expect(valueChange).toEqual(ScheduledValueChange.fromFields(valueChange.toFields(), 1)); + + valueChange = new ScheduledValueChange([new Fr(1)], [new Fr(2)], 27); + + expect(valueChange).toEqual(ScheduledValueChange.fromFields(valueChange.toFields(), 1)); + }); +}); diff --git a/yarn-project/circuits.js/src/structs/shared_mutable/scheduled_value_change.ts b/yarn-project/circuits.js/src/structs/shared_mutable/scheduled_value_change.ts new file mode 100644 index 000000000000..7ebf8e0b114d --- /dev/null +++ b/yarn-project/circuits.js/src/structs/shared_mutable/scheduled_value_change.ts @@ -0,0 +1,68 @@ +import { Fr } from '@aztec/foundation/fields'; +import { BufferReader, FieldReader, serializeToBuffer } from '@aztec/foundation/serialize'; + +import { SCHEDULED_DELAY_CHANGE_PCKD_LEN } from '../../constants.gen.js'; + +export class ScheduledValueChange { + constructor(public previous: Fr[], public post: Fr[], public blockOfChange: number) { + if (this.previous.length !== this.post.length) { + throw new Error('Previous and post must have the same length'); + } + } + + static fromFields(fields: Fr[] | FieldReader, valueSize: number) { + const reader = FieldReader.asReader(fields); + return new this(reader.readFieldArray(valueSize), reader.readFieldArray(valueSize), reader.readField().toNumber()); + } + + toFields(): Fr[] { + return [...this.previous, ...this.post, new Fr(this.blockOfChange)]; + } + + toBuffer(): Buffer { + return serializeToBuffer(this.toFields()); + } + + static fromBuffer(buffer: Buffer | BufferReader, valueSize: number): ScheduledValueChange { + const reader = BufferReader.asReader(buffer); + return ScheduledValueChange.fromFields(reader.readArray(3, Fr), valueSize); + } + + static empty(valueSize: number) { + return new this(Array(valueSize).fill(new Fr(0)), Array(valueSize).fill(new Fr(0)), 0); + } + + isEmpty(): boolean { + return this.previous.every(v => v.isZero()) && this.post.every(v => v.isZero()) && this.blockOfChange === 0; + } + + static computeSlot(sharedMutableSlot: Fr) { + return sharedMutableSlot.add(new Fr(SCHEDULED_DELAY_CHANGE_PCKD_LEN)); + } + + static async readFromTree(sharedMutableSlot: Fr, valueSize: number, reader: (storageSlot: Fr) => Promise) { + const baseValueSlot = this.computeSlot(sharedMutableSlot); + const fields = []; + for (let i = 0; i < 3; i++) { + fields.push(await reader(baseValueSlot.add(new Fr(i)))); + } + return ScheduledValueChange.fromFields(fields, valueSize); + } + + async writeToTree(sharedMutableSlot: Fr, writer: (storageSlot: Fr, value: Fr) => Promise) { + const baseValueSlot = ScheduledValueChange.computeSlot(sharedMutableSlot); + const fields = this.toFields(); + + for (let i = 0; i < fields.length; i++) { + await writer(baseValueSlot.add(new Fr(i)), fields[i]); + } + } + + getCurrentAt(blockNumber: number) { + if (blockNumber < this.blockOfChange) { + return this.previous; + } else { + return this.post; + } + } +} diff --git a/yarn-project/circuits.js/src/tests/factories.ts b/yarn-project/circuits.js/src/tests/factories.ts index 3715216c2cfc..bceafef8ddab 100644 --- a/yarn-project/circuits.js/src/tests/factories.ts +++ b/yarn-project/circuits.js/src/tests/factories.ts @@ -1270,6 +1270,7 @@ export async function makeContractInstanceFromClassId( deployer?: AztecAddress; initializationHash?: Fr; publicKeys?: PublicKeys; + currentClassId?: Fr; }, ): Promise { const salt = new Fr(seed); @@ -1290,7 +1291,8 @@ export async function makeContractInstanceFromClassId( version: 1, salt, deployer, - contractClassId: classId, + currentContractClassId: overrides?.currentClassId ?? classId, + originalContractClassId: classId, initializationHash, publicKeys, }).withAddress(address); @@ -1305,10 +1307,13 @@ export async function makeAvmBytecodeHints(seed = 0): Promise new Fr(i), seed + 0x4000), ); const publicBytecodeCommitment = await computePublicBytecodeCommitment(packedBytecode); @@ -1337,6 +1342,14 @@ export function makeAvmNullifierReadTreeHints(seed = 0): AvmNullifierReadTreeHin ); } +export function makeAvmPublicDataReadTreeHints(seed = 0): AvmPublicDataReadTreeHint { + return new AvmPublicDataReadTreeHint( + new PublicDataTreeLeafPreimage(new Fr(seed), new Fr(seed + 1), new Fr(seed + 2), BigInt(seed + 3)), + new Fr(seed + 1), + makeArray(10, i => new Fr(i), seed + 0x1000), + ); +} + export function makeAvmNullifierInsertionTreeHints(seed = 0): AvmNullifierWriteTreeHint { return new AvmNullifierWriteTreeHint( makeAvmNullifierReadTreeHints(seed), @@ -1373,13 +1386,16 @@ export function makeAvmContractInstanceHint(seed = 0): AvmContractInstanceHint { new AztecAddress(new Fr(seed + 0x3)), new Fr(seed + 0x4), new Fr(seed + 0x5), + new Fr(seed + 0x6), new PublicKeys( - new Point(new Fr(seed + 0x6), new Fr(seed + 0x7), false), - new Point(new Fr(seed + 0x8), new Fr(seed + 0x9), false), - new Point(new Fr(seed + 0x10), new Fr(seed + 0x11), false), - new Point(new Fr(seed + 0x12), new Fr(seed + 0x13), false), + new Point(new Fr(seed + 0x7), new Fr(seed + 0x8), false), + new Point(new Fr(seed + 0x9), new Fr(seed + 0x10), false), + new Point(new Fr(seed + 0x11), new Fr(seed + 0x12), false), + new Point(new Fr(seed + 0x13), new Fr(seed + 0x14), false), ), makeAvmNullifierReadTreeHints(seed + 0x1000), + makeAvmPublicDataReadTreeHints(seed + 0x2000), + makeArray(4, i => new Fr(i), seed + 0x3000), ); } diff --git a/yarn-project/cli/src/cmds/pxe/add_contract.ts b/yarn-project/cli/src/cmds/pxe/add_contract.ts index d43ba9c586dc..b62ce6beb233 100644 --- a/yarn-project/cli/src/cmds/pxe/add_contract.ts +++ b/yarn-project/cli/src/cmds/pxe/add_contract.ts @@ -18,11 +18,13 @@ export async function addContract( log: LogFn, ) { const artifact = await getContractArtifact(contractArtifactPath, log); + const contractClass = await getContractClassFromArtifact(artifact); const instance: ContractInstanceWithAddress = { version: 1, salt, initializationHash, - contractClassId: (await getContractClassFromArtifact(artifact)).id, + currentContractClassId: contractClass.id, + originalContractClassId: contractClass.id, publicKeys: publicKeys ?? PublicKeys.default(), address, deployer: deployer ?? AztecAddress.ZERO, @@ -35,5 +37,5 @@ export async function addContract( const client = await createCompatibleClient(rpcUrl, debugLogger); await client.registerContract({ artifact, instance }); - log(`\nContract added to PXE at ${address.toString()} with class ${instance.contractClassId.toString()}\n`); + log(`\nContract added to PXE at ${address.toString()} with class ${instance.currentContractClassId.toString()}\n`); } diff --git a/yarn-project/cli/src/cmds/pxe/get_contract_data.ts b/yarn-project/cli/src/cmds/pxe/get_contract_data.ts index ff42abda7a57..aa3348ba3f87 100644 --- a/yarn-project/cli/src/cmds/pxe/get_contract_data.ts +++ b/yarn-project/cli/src/cmds/pxe/get_contract_data.ts @@ -16,7 +16,9 @@ export async function getContractData( isContractPubliclyDeployed: isPubliclyDeployed, } = await client.getContractMetadata(contractAddress); const contractClass = - includeBytecode && instance && (await client.getContractClassMetadata(instance?.contractClassId)).contractClass; + includeBytecode && + instance && + (await client.getContractClassMetadata(instance?.currentContractClassId)).contractClass; const isPrivatelyDeployed = !!instance; const initStr = isInitialized ? 'initialized' : 'not initialized'; diff --git a/yarn-project/cli/src/utils/inspect.ts b/yarn-project/cli/src/utils/inspect.ts index 2fcea0f3ca9f..f45de2a89ffe 100644 --- a/yarn-project/cli/src/utils/inspect.ts +++ b/yarn-project/cli/src/utils/inspect.ts @@ -184,7 +184,7 @@ async function getKnownArtifacts(pxe: PXE): Promise { const knownContracts = ( await Promise.all(knownContractAddresses.map(contractAddress => pxe.getContractMetadata(contractAddress))) ).map(contractMetadata => contractMetadata.contractInstance); - const classIds = [...new Set(knownContracts.map(contract => contract?.contractClassId))]; + const classIds = [...new Set(knownContracts.map(contract => contract?.currentContractClassId))]; const knownArtifacts = ( await Promise.all(classIds.map(classId => (classId ? pxe.getContractClassMetadata(classId) : undefined))) ).map(contractClassMetadata => @@ -196,7 +196,7 @@ async function getKnownArtifacts(pxe: PXE): Promise { for (const instance of knownContracts) { if (instance) { const artifact = knownArtifacts.find(a => - a?.classId?.equals(instance.contractClassId), + a?.classId?.equals(instance.currentContractClassId), ) as ContractArtifactWithClassId; if (artifact) { map[instance.address.toString()] = artifact; diff --git a/yarn-project/end-to-end/scripts/e2e_test_config.yml b/yarn-project/end-to-end/scripts/e2e_test_config.yml index bdfdab2c9005..ff72785e708f 100644 --- a/yarn-project/end-to-end/scripts/e2e_test_config.yml +++ b/yarn-project/end-to-end/scripts/e2e_test_config.yml @@ -13,6 +13,7 @@ tests: e2e_bot: {} e2e_card_game: {} e2e_cheat_codes: {} + e2e_contract_updates: {} e2e_cross_chain_messaging: {} e2e_crowdfunding_and_claim: {} e2e_deploy_contract: {} diff --git a/yarn-project/end-to-end/src/e2e_avm_simulator.test.ts b/yarn-project/end-to-end/src/e2e_avm_simulator.test.ts index 0f8d5339e864..597498522dcb 100644 --- a/yarn-project/end-to-end/src/e2e_avm_simulator.test.ts +++ b/yarn-project/end-to-end/src/e2e_avm_simulator.test.ts @@ -118,7 +118,7 @@ describe('e2e_avm_simulator', () => { .test_get_contract_instance_matches( avmContract.address, avmContract.instance.deployer, - avmContract.instance.contractClassId, + avmContract.instance.currentContractClassId, avmContract.instance.initializationHash, ) .send() diff --git a/yarn-project/end-to-end/src/e2e_contract_updates.test.ts b/yarn-project/end-to-end/src/e2e_contract_updates.test.ts new file mode 100644 index 000000000000..9cc7028ea1b3 --- /dev/null +++ b/yarn-project/end-to-end/src/e2e_contract_updates.test.ts @@ -0,0 +1,159 @@ +import { getSchnorrAccountContractAddress } from '@aztec/accounts/schnorr'; +import { Fr, type Wallet, getContractClassFromArtifact } from '@aztec/aztec.js'; +import { registerContractClass } from '@aztec/aztec.js/deployment'; +import { + type AztecAddress, + MINIMUM_UPDATE_DELAY, + PublicDataTreeLeaf, + ScheduledDelayChange, + ScheduledValueChange, + UPDATED_CLASS_IDS_SLOT, + UPDATES_SCHEDULED_VALUE_CHANGE_LEN, + computeSharedMutableHashSlot, + deriveSigningKey, + getContractInstanceFromDeployParams, +} from '@aztec/circuits.js'; +import { computePublicDataTreeLeafSlot, deriveStorageSlotInMap } from '@aztec/circuits.js/hash'; +import { poseidon2Hash } from '@aztec/foundation/crypto'; +import { UpdatableContract } from '@aztec/noir-contracts.js/Updatable'; +import { UpdatedContract, UpdatedContractArtifact } from '@aztec/noir-contracts.js/Updated'; +import { ProtocolContractAddress } from '@aztec/protocol-contracts'; + +import { setup } from './fixtures/utils.js'; + +// Set the update delay in genesis data so it's feasible to test in an e2e test +const DEFAULT_TEST_UPDATE_DELAY = 10; + +describe('e2e_contract_updates', () => { + let wallet: Wallet; + let teardown: () => Promise; + let contract: UpdatableContract; + let updatedContractClassId: Fr; + + const setupScheduledDelay = async (constructorArgs: any[], salt: Fr, deployer: AztecAddress) => { + const predictedInstance = await getContractInstanceFromDeployParams(UpdatableContract.artifact, { + constructorArgs, + salt, + deployer, + }); + + const sharedMutableSlot = await deriveStorageSlotInMap(new Fr(UPDATED_CLASS_IDS_SLOT), predictedInstance.address); + + const leaves: PublicDataTreeLeaf[] = []; + + const writeToTree = async (storageSlot: Fr, value: Fr) => { + leaves.push( + new PublicDataTreeLeaf( + await computePublicDataTreeLeafSlot(ProtocolContractAddress.ContractInstanceDeployer, storageSlot), + value, + ), + ); + }; + const valueChange = ScheduledValueChange.empty(1); + const delayChange = new ScheduledDelayChange(undefined, 0, DEFAULT_TEST_UPDATE_DELAY); + await valueChange.writeToTree(sharedMutableSlot, writeToTree); + await delayChange.writeToTree(sharedMutableSlot, writeToTree); + + const updatePreimage = [delayChange.toField(), ...valueChange.toFields()]; + const updateHash = await poseidon2Hash(updatePreimage); + + const hashSlot = computeSharedMutableHashSlot(sharedMutableSlot, UPDATES_SCHEDULED_VALUE_CHANGE_LEN); + + await writeToTree(hashSlot, updateHash); + + return leaves; + }; + + beforeEach(async () => { + const senderPrivateKey = Fr.random(); + const signingKey = deriveSigningKey(senderPrivateKey); + const salt = Fr.ONE; + const initialFundedAccounts = [ + { + secret: senderPrivateKey, + signingKey, + salt, + address: await getSchnorrAccountContractAddress(senderPrivateKey, salt, signingKey), + }, + ]; + + const constructorArgs = [1n]; + const genesisPublicData = await setupScheduledDelay(constructorArgs, salt, initialFundedAccounts[0].address); + + ({ teardown, wallet } = await setup(1, { + genesisPublicData, + initialFundedAccounts, + assumeProvenThrough: Number.MAX_SAFE_INTEGER, + })); + + contract = await UpdatableContract.deploy(wallet, constructorArgs[0]) + .send({ contractAddressSalt: salt }) + .deployed(); + + const registerMethod = await registerContractClass(wallet, UpdatedContractArtifact); + await registerMethod.send().wait(); + + updatedContractClassId = (await getContractClassFromArtifact(UpdatedContractArtifact)).id; + }); + + const mineBlocks = async (count: number) => { + for (let i = 0; i < count; i++) { + await contract.methods.get_update_delay().send().wait(); + } + }; + + afterAll(() => teardown()); + + it('should update the contract', async () => { + expect(await contract.methods.get_private_value().simulate()).toEqual(1n); + expect(await contract.methods.get_public_value().simulate()).toEqual(1n); + await contract.methods.update_to(updatedContractClassId).send().wait(); + // Mine some blocks + await mineBlocks(DEFAULT_TEST_UPDATE_DELAY); + // Should be updated now + const updatedContract = await UpdatedContract.at(contract.address, wallet); + // Call a private method that wasn't available in the previous contract + await updatedContract.methods.set_private_value().send().wait(); + // Read state that was changed by the previous tx + expect(await updatedContract.methods.get_private_value().simulate()).toEqual(27n); + + // Call a public method with a new implementation + await updatedContract.methods.set_public_value().send().wait(); + expect(await updatedContract.methods.get_public_value().simulate()).toEqual(27n); + }); + + it('should change the update delay and then update the contract', async () => { + expect(await contract.methods.get_update_delay().simulate()).toEqual(BigInt(DEFAULT_TEST_UPDATE_DELAY)); + + // Increases the delay so it should happen immediately + await contract.methods + .set_update_delay(MINIMUM_UPDATE_DELAY + 1) + .send() + .wait(); + + expect(await contract.methods.get_update_delay().simulate()).toEqual(BigInt(MINIMUM_UPDATE_DELAY + 1)); + + await contract.methods.update_to(updatedContractClassId).send().wait(); + await mineBlocks(MINIMUM_UPDATE_DELAY + 1); + + // Should be updated now + const updatedContract = await UpdatedContract.at(contract.address, wallet); + // Call a private method that wasn't available in the previous contract + await updatedContract.methods.set_private_value().send().wait(); + }); + + it('should not allow to change the delay to a value lower than the minimum', async () => { + await expect( + contract.methods + .set_update_delay(MINIMUM_UPDATE_DELAY - 1) + .send() + .wait(), + ).rejects.toThrow('New update delay is too low'); + }); + + it('should not allow to instantiate a contract with an updated class before the update happens', async () => { + await expect(UpdatedContract.at(contract.address, wallet)).rejects.toThrow( + 'Could not update contract to a class different from the current one', + ); + }); +}); diff --git a/yarn-project/end-to-end/src/e2e_deploy_contract/contract_class_registration.test.ts b/yarn-project/end-to-end/src/e2e_deploy_contract/contract_class_registration.test.ts index 07b32b6fd7a4..3e208137b638 100644 --- a/yarn-project/end-to-end/src/e2e_deploy_contract/contract_class_registration.test.ts +++ b/yarn-project/end-to-end/src/e2e_deploy_contract/contract_class_registration.test.ts @@ -155,7 +155,7 @@ describe('e2e_deploy_contract contract class registration', () => { constructorArtifact: opts.constructorName, deployer: opts.deployer, }); - const { address, contractClassId } = instance; + const { address, currentContractClassId: contractClassId } = instance; logger.info(`Deploying contract instance at ${address.toString()} class id ${contractClassId.toString()}`); await deployFn(instance); @@ -198,7 +198,7 @@ describe('e2e_deploy_contract contract class registration', () => { const deployed = await aztecNode.getContract(instance.address); expect(deployed).toBeDefined(); expect(deployed!.address).toEqual(instance.address); - expect(deployed!.contractClassId).toEqual(contractClass.id); + expect(deployed!.currentContractClassId).toEqual(contractClass.id); expect(deployed!.initializationHash).toEqual(instance.initializationHash); expect(deployed!.publicKeys).toEqual(instance.publicKeys); expect(deployed!.salt).toEqual(instance.salt); diff --git a/yarn-project/end-to-end/src/e2e_deploy_contract/deploy_method.test.ts b/yarn-project/end-to-end/src/e2e_deploy_contract/deploy_method.test.ts index 3ad4ee7db156..efe5ea514c86 100644 --- a/yarn-project/end-to-end/src/e2e_deploy_contract/deploy_method.test.ts +++ b/yarn-project/end-to-end/src/e2e_deploy_contract/deploy_method.test.ts @@ -51,7 +51,7 @@ describe('e2e_deploy_contract deploy method', () => { await contract.methods.increment_public_value(owner, 84).send().wait(); expect(await contract.methods.get_public_value(owner).simulate()).toEqual(84n); expect( - (await pxe.getContractClassMetadata(contract.instance.contractClassId)).isContractClassPubliclyRegistered, + (await pxe.getContractClassMetadata(contract.instance.currentContractClassId)).isContractClassPubliclyRegistered, ).toBeTrue(); }); diff --git a/yarn-project/end-to-end/src/e2e_deploy_contract/legacy.test.ts b/yarn-project/end-to-end/src/e2e_deploy_contract/legacy.test.ts index a388abe9ef23..0616a7ddb7af 100644 --- a/yarn-project/end-to-end/src/e2e_deploy_contract/legacy.test.ts +++ b/yarn-project/end-to-end/src/e2e_deploy_contract/legacy.test.ts @@ -116,7 +116,7 @@ describe('e2e_deploy_contract legacy', () => { const { isContractClassPubliclyRegistered } = await pxe.getContractClassMetadata( ( await badDeploy.getInstance() - ).contractClassId, + ).currentContractClassId, ); // But the bad tx did not deploy expect(isContractClassPubliclyRegistered).toBeFalse(); diff --git a/yarn-project/end-to-end/src/e2e_synching.test.ts b/yarn-project/end-to-end/src/e2e_synching.test.ts index 4c286e980490..7b2441788111 100644 --- a/yarn-project/end-to-end/src/e2e_synching.test.ts +++ b/yarn-project/end-to-end/src/e2e_synching.test.ts @@ -573,7 +573,7 @@ describe('e2e_synching', () => { const contractClassIds = await archiver.getContractClassIds(); for (const c of contracts) { - expect(contractClassIds.includes(c.instance.contractClassId)).toBeTrue; + expect(contractClassIds.includes(c.instance.currentContractClassId)).toBeTrue; expect(await archiver.getContract(c.address)).not.toBeUndefined; } @@ -591,15 +591,15 @@ describe('e2e_synching', () => { const contractClassIdsAfter = await archiver.getContractClassIds(); - expect(contractClassIdsAfter.includes(contracts[0].instance.contractClassId)).toBeTrue; - expect(contractClassIdsAfter.includes(contracts[1].instance.contractClassId)).toBeFalse; + expect(contractClassIdsAfter.includes(contracts[0].instance.currentContractClassId)).toBeTrue; + expect(contractClassIdsAfter.includes(contracts[1].instance.currentContractClassId)).toBeFalse; expect(await archiver.getContract(contracts[0].address)).not.toBeUndefined; expect(await archiver.getContract(contracts[1].address)).toBeUndefined; expect(await archiver.getContract(contracts[2].address)).toBeUndefined; // Only the hardcoded schnorr is pruned since the contract class also existed before prune. expect(contractClassIdsAfter).toEqual( - contractClassIds.filter(c => !c.equals(contracts[1].instance.contractClassId)), + contractClassIds.filter(c => !c.equals(contracts[1].instance.currentContractClassId)), ); expect(await archiver.getTxEffect(txHash)).toBeUndefined; diff --git a/yarn-project/end-to-end/src/fixtures/utils.ts b/yarn-project/end-to-end/src/fixtures/utils.ts index edf188475966..63aac6b3de52 100644 --- a/yarn-project/end-to-end/src/fixtures/utils.ts +++ b/yarn-project/end-to-end/src/fixtures/utils.ts @@ -307,6 +307,8 @@ export type SetupOptions = { fundRewardDistributor?: boolean; /** Manual config for the telemetry client */ telemetryConfig?: Partial & { benchmark?: boolean }; + /** Public data that will be inserted in the tree in genesis */ + genesisPublicData?: PublicDataTreeLeaf[]; } & Partial; /** Context for an end-to-end test as returned by the `setup` function */ @@ -440,6 +442,7 @@ export async function setup( const { genesisBlockHash, genesisArchiveRoot, prefilledPublicData } = await getGenesisValues( initialFundedAccounts.map(a => a.address), opts.initialAccountFeeJuice, + opts.genesisPublicData, ); const deployL1ContractsValues = diff --git a/yarn-project/ivc-integration/src/avm_integration.test.ts b/yarn-project/ivc-integration/src/avm_integration.test.ts index 31824adaf248..95ecaf7ab4a1 100644 --- a/yarn-project/ivc-integration/src/avm_integration.test.ts +++ b/yarn-project/ivc-integration/src/avm_integration.test.ts @@ -101,7 +101,7 @@ describe('AVM Integration', () => { ...argsU8, /*getInstanceForAddress=*/ expectContractInstance.address.toField(), /*expectedDeployer=*/ expectContractInstance.deployer.toField(), - /*expectedClassId=*/ expectContractInstance.contractClassId.toField(), + /*expectedClassId=*/ expectContractInstance.currentContractClassId.toField(), /*expectedInitializationHash=*/ expectContractInstance.initializationHash.toField(), ].map(x => new Fr(x)); const simRes = await simTester.simulateTx( diff --git a/yarn-project/kv-store/src/interfaces/common.ts b/yarn-project/kv-store/src/interfaces/common.ts index 8edf29a3e016..f7123038f839 100644 --- a/yarn-project/kv-store/src/interfaces/common.ts +++ b/yarn-project/kv-store/src/interfaces/common.ts @@ -1,7 +1,7 @@ /** * The key type for use with the kv-store */ -export type Key = string | number; +export type Key = string | number | Array; /** * A range of keys to iterate over. diff --git a/yarn-project/noir-protocol-circuits-types/src/conversion/client.ts b/yarn-project/noir-protocol-circuits-types/src/conversion/client.ts index bb3db696ef42..c28c65d50bc4 100644 --- a/yarn-project/noir-protocol-circuits-types/src/conversion/client.ts +++ b/yarn-project/noir-protocol-circuits-types/src/conversion/client.ts @@ -39,6 +39,7 @@ import { PrivateLogData, PrivateToPublicAccumulatedData, PrivateValidationRequests, + type PrivateVerificationKeyHints, type PublicKeys, ReadRequest, type ReadRequestStatus, @@ -53,8 +54,9 @@ import { type TransientDataIndexHint, TxConstantData, type TxRequest, + UPDATES_SCHEDULED_VALUE_CHANGE_LEN, } from '@aztec/circuits.js'; -import { mapTuple } from '@aztec/foundation/serialize'; +import { assertLength, mapTuple } from '@aztec/foundation/serialize'; import type { CallContext as CallContextNoir, @@ -85,6 +87,7 @@ import type { PrivateToPublicKernelCircuitPublicInputs as PrivateToPublicKernelCircuitPublicInputsNoir, PrivateToRollupKernelCircuitPublicInputs as PrivateToRollupKernelCircuitPublicInputsNoir, PrivateValidationRequests as PrivateValidationRequestsNoir, + PrivateVerificationKeyHints as PrivateVerificationKeyHintsNoir, PublicKeys as PublicKeysNoir, ReadRequest as ReadRequestNoir, ReadRequestStatus as ReadRequestStatusNoir, @@ -127,6 +130,7 @@ import { mapProtocolContractLeafPreimageToNoir, mapPublicCallRequestFromNoir, mapPublicCallRequestToNoir, + mapPublicDataTreePreimageToNoir, mapScopedL2ToL1MessageFromNoir, mapScopedL2ToL1MessageToNoir, mapTupleFromNoir, @@ -604,6 +608,42 @@ export function mapFunctionDataFromNoir(functionData: FunctionDataNoir): Functio return new FunctionData(mapFunctionSelectorFromNoir(functionData.selector), functionData.is_private); } +export function mapPrivateVerificationKeyHintsToNoir( + privateVerificationKeyHints: PrivateVerificationKeyHints, +): PrivateVerificationKeyHintsNoir { + const updatedClassIdValueChangeAsFields = assertLength( + privateVerificationKeyHints.updatedClassIdHints.updatedClassIdValueChange.toFields(), + UPDATES_SCHEDULED_VALUE_CHANGE_LEN, + ); + + return { + function_leaf_membership_witness: mapMembershipWitnessToNoir( + privateVerificationKeyHints.functionLeafMembershipWitness, + ), + contract_class_artifact_hash: mapFieldToNoir(privateVerificationKeyHints.contractClassArtifactHash), + contract_class_public_bytecode_commitment: mapFieldToNoir( + privateVerificationKeyHints.contractClassPublicBytecodeCommitment, + ), + public_keys: mapPublicKeysToNoir(privateVerificationKeyHints.publicKeys), + salted_initialization_hash: mapWrappedFieldToNoir(privateVerificationKeyHints.saltedInitializationHash), + protocol_contract_membership_witness: mapMembershipWitnessToNoir( + privateVerificationKeyHints.protocolContractMembershipWitness, + ), + protocol_contract_leaf: mapProtocolContractLeafPreimageToNoir(privateVerificationKeyHints.protocolContractLeaf), + acir_hash: mapFieldToNoir(privateVerificationKeyHints.acirHash), + updated_class_id_witness: mapMembershipWitnessToNoir( + privateVerificationKeyHints.updatedClassIdHints.updatedClassIdWitness, + ), + updated_class_id_leaf: mapPublicDataTreePreimageToNoir( + privateVerificationKeyHints.updatedClassIdHints.updatedClassIdLeaf, + ), + updated_class_id_value_change: mapTuple(updatedClassIdValueChangeAsFields, mapFieldToNoir), + updated_class_id_delay_change: [ + mapFieldToNoir(privateVerificationKeyHints.updatedClassIdHints.updatedClassIdDelayChange.toField()), + ], + }; +} + /** * Maps a private call data to a noir private call data. * @param privateCallData - The private call data. @@ -612,14 +652,7 @@ export function mapFunctionDataFromNoir(functionData: FunctionDataNoir): Functio export function mapPrivateCallDataToNoir(privateCallData: PrivateCallData): PrivateCallDataWithoutPublicInputsNoir { return { vk: mapVerificationKeyToNoir(privateCallData.vk, CLIENT_IVC_VERIFICATION_KEY_LENGTH_IN_FIELDS), - function_leaf_membership_witness: mapMembershipWitnessToNoir(privateCallData.functionLeafMembershipWitness), - contract_class_artifact_hash: mapFieldToNoir(privateCallData.contractClassArtifactHash), - contract_class_public_bytecode_commitment: mapFieldToNoir(privateCallData.contractClassPublicBytecodeCommitment), - public_keys: mapPublicKeysToNoir(privateCallData.publicKeys), - salted_initialization_hash: mapWrappedFieldToNoir(privateCallData.saltedInitializationHash), - protocol_contract_membership_witness: mapMembershipWitnessToNoir(privateCallData.protocolContractMembershipWitness), - protocol_contract_leaf: mapProtocolContractLeafPreimageToNoir(privateCallData.protocolContractLeaf), - acir_hash: mapFieldToNoir(privateCallData.acirHash), + verification_key_hints: mapPrivateVerificationKeyHintsToNoir(privateCallData.verificationKeyHints), }; } diff --git a/yarn-project/noir-protocol-circuits-types/src/noir_test_gen.test.ts b/yarn-project/noir-protocol-circuits-types/src/noir_test_gen.test.ts index 3616891fd7fc..e40978adbb7a 100644 --- a/yarn-project/noir-protocol-circuits-types/src/noir_test_gen.test.ts +++ b/yarn-project/noir-protocol-circuits-types/src/noir_test_gen.test.ts @@ -61,7 +61,14 @@ describe('Data generation for noir tests', () => { contractClass, ); const deployer = AztecAddress.ZERO; - const instance: ContractInstance = { ...contract, version: 1, initializationHash, contractClassId, deployer }; + const instance: ContractInstance = { + ...contract, + version: 1, + initializationHash, + currentContractClassId: contractClassId, + originalContractClassId: contractClassId, + deployer, + }; const address = await computeContractAddressFromInstance(instance); const saltedInitializationHash = await computeSaltedInitializationHash(instance); const partialAddress = await computePartialAddress(instance); diff --git a/yarn-project/noir-protocol-circuits-types/src/utils/client/foreign_call_handler.ts b/yarn-project/noir-protocol-circuits-types/src/utils/client/foreign_call_handler.ts index e01c95a83f9e..fde85d547769 100644 --- a/yarn-project/noir-protocol-circuits-types/src/utils/client/foreign_call_handler.ts +++ b/yarn-project/noir-protocol-circuits-types/src/utils/client/foreign_call_handler.ts @@ -18,6 +18,8 @@ export function foreignCallHandler(name: string, args: ForeignCallInput[]): Prom const msg: string = msgRaw.map(acvmField => String.fromCharCode(fromACVMField(acvmField).toNumber())).join(''); const fieldsFr: Fr[] = fields.map((field: string) => fromACVMField(field)); log.verbose('debug_log ' + applyStringFormatting(msg, fieldsFr)); + } else if (name === 'noOp') { + // Workaround for compiler issues where data is deleted because it's "unused" } else { throw Error(`unexpected oracle during execution: ${name}`); } diff --git a/yarn-project/noir-protocol-circuits-types/src/utils/server/foreign_call_handler.ts b/yarn-project/noir-protocol-circuits-types/src/utils/server/foreign_call_handler.ts index 854c4c042b63..323171eb4691 100644 --- a/yarn-project/noir-protocol-circuits-types/src/utils/server/foreign_call_handler.ts +++ b/yarn-project/noir-protocol-circuits-types/src/utils/server/foreign_call_handler.ts @@ -59,6 +59,8 @@ export async function foreignCallHandler(name: string, args: ForeignCallInput[]) } }); return Promise.resolve([blobPublicInputs.toFields().map(toACVMField)]); + } else if (name === 'noOp') { + // Workaround for compiler issues where data is deleted because it's "unused" } else { throw Error(`unexpected oracle during execution: ${name}`); } diff --git a/yarn-project/protocol-contracts/src/instance-deployer/contract_instance_deployed_event.ts b/yarn-project/protocol-contracts/src/instance-deployer/contract_instance_deployed_event.ts index 500f87f82fd0..163cf5b3778a 100644 --- a/yarn-project/protocol-contracts/src/instance-deployer/contract_instance_deployed_event.ts +++ b/yarn-project/protocol-contracts/src/instance-deployer/contract_instance_deployed_event.ts @@ -51,7 +51,8 @@ export class ContractInstanceDeployedEvent { return { address: this.address, version: this.version, - contractClassId: this.contractClassId, + currentContractClassId: this.contractClassId, + originalContractClassId: this.contractClassId, initializationHash: this.initializationHash, publicKeys: this.publicKeys, salt: this.salt, diff --git a/yarn-project/protocol-contracts/src/instance-deployer/contract_instance_updated_event.ts b/yarn-project/protocol-contracts/src/instance-deployer/contract_instance_updated_event.ts new file mode 100644 index 000000000000..4fb32f3fbe49 --- /dev/null +++ b/yarn-project/protocol-contracts/src/instance-deployer/contract_instance_updated_event.ts @@ -0,0 +1,43 @@ +import { type ContractInstanceUpdateWithAddress, type PublicLog } from '@aztec/circuits.js'; +import { AztecAddress } from '@aztec/foundation/aztec-address'; +import { Fr } from '@aztec/foundation/fields'; +import { BufferReader } from '@aztec/foundation/serialize'; + +import { DEPLOYER_CONTRACT_INSTANCE_UPDATED_TAG, ProtocolContractAddress } from '../protocol_contract_data.js'; + +/** Event emitted from the ContractInstanceDeployer. */ +export class ContractInstanceUpdatedEvent { + constructor( + public readonly address: AztecAddress, + public readonly prevContractClassId: Fr, + public readonly newContractClassId: Fr, + public readonly blockOfChange: number, + ) {} + + static isContractInstanceUpdatedEvent(log: PublicLog) { + return ( + log.contractAddress.equals(ProtocolContractAddress.ContractInstanceDeployer) && + log.log[0].equals(DEPLOYER_CONTRACT_INSTANCE_UPDATED_TAG) + ); + } + + static fromLog(log: PublicLog) { + const bufferWithoutAddressAndTag = log.toBuffer().subarray(64); + const reader = new BufferReader(bufferWithoutAddressAndTag); + const address = reader.readObject(AztecAddress); + const prevContractClassId = reader.readObject(Fr); + const newContractClassId = reader.readObject(Fr); + const blockOfChange = reader.readObject(Fr).toNumber(); + + return new ContractInstanceUpdatedEvent(address, prevContractClassId, newContractClassId, blockOfChange); + } + + toContractInstanceUpdate(): ContractInstanceUpdateWithAddress { + return { + address: this.address, + prevContractClassId: this.prevContractClassId, + newContractClassId: this.newContractClassId, + blockOfChange: this.blockOfChange, + }; + } +} diff --git a/yarn-project/protocol-contracts/src/instance-deployer/index.ts b/yarn-project/protocol-contracts/src/instance-deployer/index.ts index dff020eb191e..28d61b72f7cc 100644 --- a/yarn-project/protocol-contracts/src/instance-deployer/index.ts +++ b/yarn-project/protocol-contracts/src/instance-deployer/index.ts @@ -6,6 +6,7 @@ import { makeProtocolContract } from '../make_protocol_contract.js'; import { type ProtocolContract } from '../protocol_contract.js'; export * from './contract_instance_deployed_event.js'; +export * from './contract_instance_updated_event.js'; export const ContractInstanceDeployerArtifact = loadContractArtifact( ContractInstanceDeployerJson as NoirCompiledContract, diff --git a/yarn-project/protocol-contracts/src/protocol_contract_tree.ts b/yarn-project/protocol-contracts/src/protocol_contract_tree.ts index 1dadbf8f5638..5b275a3f2470 100644 --- a/yarn-project/protocol-contracts/src/protocol_contract_tree.ts +++ b/yarn-project/protocol-contracts/src/protocol_contract_tree.ts @@ -25,16 +25,20 @@ async function getTree() { return protocolContractTree; } -export async function getProtocolContractLeafAndMembershipWitness(address: AztecAddress) { +// Computed address can be different from contract address due to upgrades +export async function getProtocolContractLeafAndMembershipWitness( + contractAddress: AztecAddress, + computedAddress: AztecAddress, +) { const tree = await getTree(); let lowLeaf; let witness; - if (isProtocolContract(address)) { - const index = address.toField().toNumber(); + if (isProtocolContract(contractAddress)) { + const index = contractAddress.toField().toNumber(); lowLeaf = tree.leafPreimages[index]; witness = tree.getMembershipWitness(index); } else { - lowLeaf = tree.getLowLeaf(address.toBigInt()); + lowLeaf = tree.getLowLeaf(computedAddress.toBigInt()); const hashed = (await poseidon2Hash(lowLeaf.toHashInputs())).toBuffer(); witness = tree.getMembershipWitness(hashed); } diff --git a/yarn-project/protocol-contracts/src/scripts/generate_data.ts b/yarn-project/protocol-contracts/src/scripts/generate_data.ts index d6e405360ea9..e518047ceb28 100644 --- a/yarn-project/protocol-contracts/src/scripts/generate_data.ts +++ b/yarn-project/protocol-contracts/src/scripts/generate_data.ts @@ -3,6 +3,7 @@ import { CANONICAL_AUTH_REGISTRY_ADDRESS, DEPLOYER_CONTRACT_ADDRESS, DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE, + DEPLOYER_CONTRACT_INSTANCE_UPDATED_MAGIC_VALUE, FEE_JUICE_ADDRESS, Fr, MULTI_CALL_ENTRYPOINT_ADDRESS, @@ -138,6 +139,7 @@ async function generateLogTags() { DEPLOYER_CONTRACT_ADDRESS, DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE, ])}'); + export const DEPLOYER_CONTRACT_INSTANCE_UPDATED_TAG = new Fr(${DEPLOYER_CONTRACT_INSTANCE_UPDATED_MAGIC_VALUE}n); `; } diff --git a/yarn-project/pxe/src/contract_data_oracle/index.ts b/yarn-project/pxe/src/contract_data_oracle/index.ts index 869630780920..aef5653fa440 100644 --- a/yarn-project/pxe/src/contract_data_oracle/index.ts +++ b/yarn-project/pxe/src/contract_data_oracle/index.ts @@ -23,21 +23,16 @@ import { PrivateFunctionsTree } from './private_functions_tree.js'; export class ContractDataOracle { /** Map from contract class id to private function tree. */ private contractClasses: Map = new Map(); - /** Map from address to contract instance. */ - private contractInstances: Map = new Map(); constructor(private db: ContractArtifactDatabase & ContractInstanceDatabase) {} /** Returns a contract instance for a given address. Throws if not found. */ public async getContractInstance(contractAddress: AztecAddress): Promise { - if (!this.contractInstances.has(contractAddress.toString())) { - const instance = await this.db.getContractInstance(contractAddress); - if (!instance) { - throw new ContractNotFoundError(contractAddress.toString()); - } - this.contractInstances.set(contractAddress.toString(), instance); + const instance = await this.db.getContractInstance(contractAddress); + if (!instance) { + throw new ContractNotFoundError(contractAddress.toString()); } - return this.contractInstances.get(contractAddress.toString())!; + return instance; } /** Returns a contract class for a given class id. Throws if not found. */ @@ -117,16 +112,16 @@ export class ContractDataOracle { } /** - * Retrieve the function membership witness for the given contract address and function selector. + * Retrieve the function membership witness for the given contract class and function selector. * The function membership witness represents a proof that the function belongs to the specified contract. * Throws an error if the contract address or function selector is unknown. * - * @param contractAddress - The contract address. + * @param contractClassId - The id of the class. * @param selector - The function selector. * @returns A promise that resolves with the MembershipWitness instance for the specified contract's function. */ - public async getFunctionMembershipWitness(contractAddress: AztecAddress, selector: FunctionSelector) { - const tree = await this.getTreeForAddress(contractAddress); + public async getFunctionMembershipWitness(contractClassId: Fr, selector: FunctionSelector) { + const tree = await this.getTreeForClassId(contractClassId); return tree.getFunctionMembershipWitness(selector); } @@ -176,6 +171,6 @@ export class ContractDataOracle { */ private async getTreeForAddress(contractAddress: AztecAddress): Promise { const instance = await this.getContractInstance(contractAddress); - return this.getTreeForClassId(instance.contractClassId); + return this.getTreeForClassId(instance.currentContractClassId); } } diff --git a/yarn-project/pxe/src/database/kv_pxe_database.ts b/yarn-project/pxe/src/database/kv_pxe_database.ts index 936e86490d44..bf0bcb910fba 100644 --- a/yarn-project/pxe/src/database/kv_pxe_database.ts +++ b/yarn-project/pxe/src/database/kv_pxe_database.ts @@ -125,7 +125,7 @@ export class KVPxeDatabase implements PxeDatabase { address: AztecAddress, ): Promise<(ContractInstanceWithAddress & ContractArtifact) | undefined> { const instance = await this.getContractInstance(address); - const artifact = instance && (await this.getContractArtifact(instance?.contractClassId)); + const artifact = instance && (await this.getContractArtifact(instance?.currentContractClassId)); if (!instance || !artifact) { return undefined; } diff --git a/yarn-project/pxe/src/kernel_oracle/index.ts b/yarn-project/pxe/src/kernel_oracle/index.ts index a40fbefec5f4..6b79cf7e7871 100644 --- a/yarn-project/pxe/src/kernel_oracle/index.ts +++ b/yarn-project/pxe/src/kernel_oracle/index.ts @@ -1,21 +1,31 @@ import { type AztecNode, type L2BlockNumber } from '@aztec/circuit-types'; import { type AztecAddress, - type Fr, + Fr, type FunctionSelector, type GrumpkinScalar, MembershipWitness, type NOTE_HASH_TREE_HEIGHT, + PUBLIC_DATA_TREE_HEIGHT, type Point, + ScheduledDelayChange, + ScheduledValueChange, + UPDATED_CLASS_IDS_SLOT, + UPDATES_SCHEDULED_VALUE_CHANGE_LEN, + UPDATES_VALUE_SIZE, + UpdatedClassIdHints, VK_TREE_HEIGHT, type VerificationKeyAsFields, computeContractClassIdPreimage, computeSaltedInitializationHash, + computeSharedMutableHashSlot, } from '@aztec/circuits.js'; +import { computePublicDataTreeLeafSlot, deriveStorageSlotInMap } from '@aztec/circuits.js/hash'; import { createLogger } from '@aztec/foundation/log'; import { type Tuple } from '@aztec/foundation/serialize'; import { type KeyStore } from '@aztec/key-store'; import { getVKIndex, getVKSiblingPath } from '@aztec/noir-protocol-circuits-types/vks'; +import { ProtocolContractAddress } from '@aztec/protocol-contracts'; import { type ContractDataOracle } from '../contract_data_oracle/index.js'; import { type ProvingDataOracle } from './../kernel_prover/proving_data_oracle.js'; @@ -47,8 +57,8 @@ export class KernelOracle implements ProvingDataOracle { return computeContractClassIdPreimage(contractClass); } - public async getFunctionMembershipWitness(contractAddress: AztecAddress, selector: FunctionSelector) { - return await this.contractDataOracle.getFunctionMembershipWitness(contractAddress, selector); + public async getFunctionMembershipWitness(contractClassId: Fr, selector: FunctionSelector) { + return await this.contractDataOracle.getFunctionMembershipWitness(contractClassId, selector); } public getVkMembershipWitness(vk: VerificationKeyAsFields) { @@ -81,4 +91,37 @@ export class KernelOracle implements ProvingDataOracle { public getDebugFunctionName(contractAddress: AztecAddress, selector: FunctionSelector): Promise { return this.contractDataOracle.getDebugFunctionName(contractAddress, selector); } + + public async getUpdatedClassIdHints(contractAddress: AztecAddress): Promise { + const sharedMutableSlot = await deriveStorageSlotInMap(new Fr(UPDATED_CLASS_IDS_SLOT), contractAddress); + + const hashSlot = computeSharedMutableHashSlot(sharedMutableSlot, UPDATES_SCHEDULED_VALUE_CHANGE_LEN); + + const hashLeafSlot = await computePublicDataTreeLeafSlot( + ProtocolContractAddress.ContractInstanceDeployer, + hashSlot, + ); + const updatedClassIdWitness = await this.node.getPublicDataTreeWitness(this.blockNumber, hashLeafSlot); + + if (!updatedClassIdWitness) { + throw new Error(`No public data tree witness found for ${hashLeafSlot}`); + } + + const readStorage = (storageSlot: Fr) => + this.node.getPublicStorageAt(ProtocolContractAddress.ContractInstanceDeployer, storageSlot, this.blockNumber); + + const valueChange = await ScheduledValueChange.readFromTree(sharedMutableSlot, UPDATES_VALUE_SIZE, readStorage); + const delayChange = await ScheduledDelayChange.readFromTree(sharedMutableSlot, readStorage); + + return new UpdatedClassIdHints( + new MembershipWitness( + PUBLIC_DATA_TREE_HEIGHT, + updatedClassIdWitness.index, + updatedClassIdWitness.siblingPath.toTuple(), + ), + updatedClassIdWitness.leafPreimage, + valueChange, + delayChange, + ); + } } diff --git a/yarn-project/pxe/src/kernel_prover/kernel_prover.test.ts b/yarn-project/pxe/src/kernel_prover/kernel_prover.test.ts index ced97542f1d5..027440960c2a 100644 --- a/yarn-project/pxe/src/kernel_prover/kernel_prover.test.ts +++ b/yarn-project/pxe/src/kernel_prover/kernel_prover.test.ts @@ -142,7 +142,8 @@ describe('Kernel Prover', () => { oracle.getVkMembershipWitness.mockResolvedValue(MembershipWitness.random(VK_TREE_HEIGHT)); oracle.getContractAddressPreimage.mockResolvedValue({ - contractClassId: Fr.random(), + currentContractClassId: Fr.random(), + originalContractClassId: Fr.random(), publicKeys: await PublicKeys.random(), saltedInitializationHash: Fr.random(), }); diff --git a/yarn-project/pxe/src/kernel_prover/kernel_prover.ts b/yarn-project/pxe/src/kernel_prover/kernel_prover.ts index ccb53787803b..814851129f41 100644 --- a/yarn-project/pxe/src/kernel_prover/kernel_prover.ts +++ b/yarn-project/pxe/src/kernel_prover/kernel_prover.ts @@ -22,10 +22,12 @@ import { PrivateKernelTailCircuitPrivateInputs, type PrivateKernelTailCircuitPublicInputs, type PrivateLog, + PrivateVerificationKeyHints, type ScopedPrivateLogData, type TxRequest, VK_TREE_HEIGHT, VerificationKeyAsFields, + computeContractAddressFromInstance, } from '@aztec/circuits.js'; import { hashVK } from '@aztec/circuits.js/hash'; import { vkAsFieldsMegaHonk } from '@aztec/foundation/crypto'; @@ -349,34 +351,46 @@ export class KernelProver { const vkAsFields = await vkAsFieldsMegaHonk(vkAsBuffer); const vk = new VerificationKeyAsFields(vkAsFields, await hashVK(vkAsFields)); + const { currentContractClassId, publicKeys, saltedInitializationHash } = + await this.oracle.getContractAddressPreimage(contractAddress); const functionLeafMembershipWitness = await this.oracle.getFunctionMembershipWitness( - contractAddress, + currentContractClassId, functionSelector, ); - const { contractClassId, publicKeys, saltedInitializationHash } = await this.oracle.getContractAddressPreimage( - contractAddress, - ); + const { artifactHash: contractClassArtifactHash, publicBytecodeCommitment: contractClassPublicBytecodeCommitment } = - await this.oracle.getContractClassIdPreimage(contractClassId); + await this.oracle.getContractClassIdPreimage(currentContractClassId); // TODO(#262): Use real acir hash // const acirHash = keccak256(Buffer.from(bytecode, 'hex')); const acirHash = Fr.fromBuffer(Buffer.alloc(32, 0)); + // This will be the address computed in the kernel by the executed class. We need to provide non membership of it in the protocol contract tree. + // This would only be equal to contractAddress if the currentClassId is equal to the original class id (no update happened). + const computedAddress = await computeContractAddressFromInstance({ + originalContractClassId: currentContractClassId, + saltedInitializationHash, + publicKeys, + }); + const { lowLeaf: protocolContractLeaf, witness: protocolContractMembershipWitness } = - await getProtocolContractLeafAndMembershipWitness(contractAddress); + await getProtocolContractLeafAndMembershipWitness(contractAddress, computedAddress); + const updatedClassIdHints = await this.oracle.getUpdatedClassIdHints(contractAddress); return PrivateCallData.from({ publicInputs, vk, - publicKeys, - contractClassArtifactHash, - contractClassPublicBytecodeCommitment, - saltedInitializationHash, - functionLeafMembershipWitness, - protocolContractMembershipWitness, - protocolContractLeaf, - acirHash, + verificationKeyHints: PrivateVerificationKeyHints.from({ + publicKeys, + contractClassArtifactHash, + contractClassPublicBytecodeCommitment, + saltedInitializationHash, + functionLeafMembershipWitness, + protocolContractMembershipWitness, + protocolContractLeaf, + acirHash, + updatedClassIdHints, + }), }); } diff --git a/yarn-project/pxe/src/kernel_prover/proving_data_oracle.ts b/yarn-project/pxe/src/kernel_prover/proving_data_oracle.ts index c3127fbc2109..21f5013df128 100644 --- a/yarn-project/pxe/src/kernel_prover/proving_data_oracle.ts +++ b/yarn-project/pxe/src/kernel_prover/proving_data_oracle.ts @@ -8,6 +8,7 @@ import { type NOTE_HASH_TREE_HEIGHT, type Point, type PublicKeys, + type UpdatedClassIdHints, type VK_TREE_HEIGHT, type VerificationKeyAsFields, } from '@aztec/circuits.js'; @@ -19,9 +20,12 @@ import { type AztecAddress } from '@aztec/foundation/aztec-address'; */ export interface ProvingDataOracle { /** Retrieves the preimage of a contract address from the registered contract instances db. */ - getContractAddressPreimage( - address: AztecAddress, - ): Promise<{ saltedInitializationHash: Fr; publicKeys: PublicKeys; contractClassId: Fr }>; + getContractAddressPreimage(address: AztecAddress): Promise<{ + saltedInitializationHash: Fr; + publicKeys: PublicKeys; + currentContractClassId: Fr; + originalContractClassId: Fr; + }>; /** Retrieves the preimage of a contract class id from the contract classes db. */ getContractClassIdPreimage( @@ -29,16 +33,16 @@ export interface ProvingDataOracle { ): Promise<{ artifactHash: Fr; publicBytecodeCommitment: Fr; privateFunctionsRoot: Fr }>; /** - * Retrieve the function membership witness for the given contract address and function selector. + * Retrieve the function membership witness for the given contract class and function selector. * The function membership witness represents a proof that the function belongs to the specified contract. * Throws an error if the contract address or function selector is unknown. * - * @param contractAddress - The contract address. + * @param contractClassId - The id of the class. * @param selector - The function selector. * @returns A promise that resolves with the MembershipWitness instance for the specified contract's function. */ getFunctionMembershipWitness( - contractAddress: AztecAddress, + contractClassId: Fr, selector: FunctionSelector, ): Promise>; @@ -80,4 +84,6 @@ export interface ProvingDataOracle { getMasterSecretKey(masterPublicKey: Point): Promise; getDebugFunctionName(contractAddress: AztecAddress, selector: FunctionSelector): Promise; + + getUpdatedClassIdHints(contractAddress: AztecAddress): Promise; } diff --git a/yarn-project/pxe/src/note_decryption_utils/add_public_values_to_payload.ts b/yarn-project/pxe/src/note_decryption_utils/add_public_values_to_payload.ts index 1ec8073784f0..e83f76cf8b12 100644 --- a/yarn-project/pxe/src/note_decryption_utils/add_public_values_to_payload.ts +++ b/yarn-project/pxe/src/note_decryption_utils/add_public_values_to_payload.ts @@ -24,10 +24,10 @@ export async function getOrderedNoteItems( ); } - const artifact = await db.getContractArtifact(instance.contractClassId); + const artifact = await db.getContractArtifact(instance.currentContractClassId); if (!artifact) { throw new Error( - `Could not find artifact for contract class ${instance.contractClassId.toString()}. This should never happen here as the partial notes flow should be triggered only for non-deferred notes.`, + `Could not find artifact for contract class ${instance.currentContractClassId.toString()}. This should never happen here as the partial notes flow should be triggered only for non-deferred notes.`, ); } diff --git a/yarn-project/pxe/src/pxe_service/pxe_service.ts b/yarn-project/pxe/src/pxe_service/pxe_service.ts index ba840f57ca19..775c4e01332a 100644 --- a/yarn-project/pxe/src/pxe_service/pxe_service.ts +++ b/yarn-project/pxe/src/pxe_service/pxe_service.ts @@ -62,7 +62,7 @@ import { type KeyStore } from '@aztec/key-store'; import { type L2TipsStore } from '@aztec/kv-store/stores'; import { ProtocolContractAddress, protocolContractNames } from '@aztec/protocol-contracts'; import { getCanonicalProtocolContract } from '@aztec/protocol-contracts/bundle'; -import { type AcirSimulator, type SimulationProvider } from '@aztec/simulator/client'; +import { type AcirSimulator, type SimulationProvider, readCurrentClassId } from '@aztec/simulator/client'; import { inspect } from 'util'; @@ -248,9 +248,10 @@ export class PXEService implements PXE { if (artifact) { // If the user provides an artifact, validate it against the expected class id and register it const contractClass = await getContractClassFromArtifact(artifact); - if (!contractClass.id.equals(instance.contractClassId)) { + const contractClassId = contractClass.id; + if (!contractClassId.equals(instance.currentContractClassId)) { throw new Error( - `Artifact does not match expected class id (computed ${contractClass.id} but instance refers to ${instance.contractClassId})`, + `Artifact does not match expected class id (computed ${contractClassId} but instance refers to ${instance.currentContractClassId})`, ); } const computedAddress = await computeContractAddressFromInstance(instance); @@ -269,16 +270,52 @@ export class PXEService implements PXE { await this.node.addContractClass({ ...contractClass, privateFunctions: [], unconstrainedFunctions: [] }); } else { // Otherwise, make sure there is an artifact already registered for that class id - artifact = await this.db.getContractArtifact(instance.contractClassId); + artifact = await this.db.getContractArtifact(instance.currentContractClassId); if (!artifact) { throw new Error( - `Missing contract artifact for class id ${instance.contractClassId} for contract ${instance.address}`, + `Missing contract artifact for class id ${instance.currentContractClassId} for contract ${instance.address}`, ); } } - this.log.info(`Added contract ${artifact.name} at ${instance.address.toString()}`); await this.db.addContractInstance(instance); + this.log.info( + `Added contract ${artifact.name} at ${instance.address.toString()} with class ${instance.currentContractClassId}`, + ); + } + + public async updateContract(contractAddress: AztecAddress, artifact: ContractArtifact): Promise { + const currentInstance = await this.db.getContractInstance(contractAddress); + if (!currentInstance) { + throw new Error(`Contract ${contractAddress.toString()} is not registered.`); + } + const contractClass = await getContractClassFromArtifact(artifact); + await this.synchronizer.sync(); + + const header = await this.db.getBlockHeader(); + + const currentClassId = await readCurrentClassId( + contractAddress, + currentInstance, + this.node, + header.globalVariables.blockNumber.toNumber(), + ); + if (!contractClass.id.equals(currentClassId)) { + throw new Error('Could not update contract to a class different from the current one.'); + } + + await this.db.addContractArtifact(contractClass.id, artifact); + + const publicFunctionSignatures = artifact.functions + .filter(fn => fn.functionType === FunctionType.PUBLIC) + .map(fn => decodeFunctionSignature(fn.name, fn.parameters)); + await this.node.registerContractFunctionSignatures(contractAddress, publicFunctionSignatures); + + // TODO(#10007): Node should get public contract class from the registration event, not from PXE registration + await this.node.addContractClass({ ...contractClass, privateFunctions: [], unconstrainedFunctions: [] }); + currentInstance.currentContractClassId = contractClass.id; + await this.db.addContractInstance(currentInstance); + this.log.info(`Updated contract ${artifact.name} at ${contractAddress.toString()} to class ${contractClass.id}`); } public getContracts(): Promise { @@ -728,19 +765,14 @@ export class PXEService implements PXE { * @param execRequest - The transaction request object containing details of the contract call. * @returns An object containing the contract address, function artifact, and historical tree roots. */ - async #getSimulationParameters(execRequest: FunctionCall | TxExecutionRequest) { + #getSimulationParameters(execRequest: FunctionCall | TxExecutionRequest) { const contractAddress = (execRequest as FunctionCall).to ?? (execRequest as TxExecutionRequest).origin; const functionSelector = (execRequest as FunctionCall).selector ?? (execRequest as TxExecutionRequest).functionSelector; - const functionArtifact = await this.contractDataOracle.getFunctionArtifact(contractAddress, functionSelector); - const debug = await this.contractDataOracle.getFunctionDebugMetadata(contractAddress, functionSelector); return { contractAddress, - functionArtifact: { - ...functionArtifact, - debug, - }, + functionSelector, }; } @@ -750,11 +782,11 @@ export class PXEService implements PXE { scopes?: AztecAddress[], ): Promise { // TODO - Pause syncing while simulating. - const { contractAddress, functionArtifact } = await this.#getSimulationParameters(txRequest); + const { contractAddress, functionSelector } = this.#getSimulationParameters(txRequest); try { - const result = await this.simulator.run(txRequest, functionArtifact, contractAddress, msgSender, scopes); - this.log.debug(`Private simulation completed for ${contractAddress.toString()}:${functionArtifact.name}`); + const result = await this.simulator.run(txRequest, contractAddress, functionSelector, msgSender, scopes); + this.log.debug(`Private simulation completed for ${contractAddress.toString()}:${functionSelector}`); return result; } catch (err) { if (err instanceof SimulationError) { @@ -774,12 +806,12 @@ export class PXEService implements PXE { * @returns The simulation result containing the outputs of the unconstrained function. */ async #simulateUnconstrained(execRequest: FunctionCall, scopes?: AztecAddress[]) { - const { contractAddress, functionArtifact } = await this.#getSimulationParameters(execRequest); + const { contractAddress, functionSelector } = this.#getSimulationParameters(execRequest); this.log.debug('Executing unconstrained simulator...'); try { - const result = await this.simulator.runUnconstrained(execRequest, functionArtifact, contractAddress, scopes); - this.log.verbose(`Unconstrained simulation for ${contractAddress}.${functionArtifact.name} completed`); + const result = await this.simulator.runUnconstrained(execRequest, contractAddress, functionSelector, scopes); + this.log.verbose(`Unconstrained simulation for ${contractAddress}.${functionSelector} completed`); return result; } catch (err) { diff --git a/yarn-project/pxe/src/simulator_oracle/index.ts b/yarn-project/pxe/src/simulator_oracle/index.ts index f0dd865c11cc..9f12e100d621 100644 --- a/yarn-project/pxe/src/simulator_oracle/index.ts +++ b/yarn-project/pxe/src/simulator_oracle/index.ts @@ -134,7 +134,7 @@ export class SimulatorOracle implements DBOracle { functionName: string, ): Promise { const instance = await this.contractDataOracle.getContractInstance(contractAddress); - const artifact = await this.contractDataOracle.getContractArtifact(instance.contractClassId); + const artifact = await this.contractDataOracle.getContractArtifact(instance.currentContractClassId); return artifact && getFunctionArtifact(artifact, functionName); } @@ -798,10 +798,11 @@ export class SimulatorOracle implements DBOracle { ); } + const selector = await FunctionSelector.fromNameAndParameters(artifact); const execRequest: FunctionCall = { name: artifact.name, to: contractAddress, - selector: await FunctionSelector.fromNameAndParameters(artifact), + selector, type: FunctionType.UNCONSTRAINED, isStatic: artifact.isStatic, args: encodeArguments(artifact, [ @@ -819,8 +820,8 @@ export class SimulatorOracle implements DBOracle { getAcirSimulator(this.db, this.aztecNode, this.keyStore, this.simulationProvider, this.contractDataOracle) ).runUnconstrained( execRequest, - artifact, contractAddress, + selector, [], // empty scope as this call should not require access to private information ); } diff --git a/yarn-project/pxe/src/simulator_oracle/simulator_oracle.test.ts b/yarn-project/pxe/src/simulator_oracle/simulator_oracle.test.ts index 3363fb56098a..b8eb2f027fcd 100644 --- a/yarn-project/pxe/src/simulator_oracle/simulator_oracle.test.ts +++ b/yarn-project/pxe/src/simulator_oracle/simulator_oracle.test.ts @@ -27,7 +27,7 @@ import { computeTaggingSecretPoint, deriveKeys, } from '@aztec/circuits.js'; -import { type FunctionArtifact, FunctionType } from '@aztec/foundation/abi'; +import { type FunctionArtifact, FunctionSelector, FunctionType } from '@aztec/foundation/abi'; import { timesParallel } from '@aztec/foundation/collection'; import { pedersenHash, poseidon2Hash } from '@aztec/foundation/crypto'; import { KeyStore } from '@aztec/key-store'; @@ -554,7 +554,7 @@ describe('Simulator oracle', () => { const contractArtifact = randomContractArtifact(); contractArtifact.functions = [processLogFuncArtifact]; await database.addContractInstance(contractInstance); - await database.addContractArtifact(contractInstance.contractClassId, contractArtifact); + await database.addContractArtifact(contractInstance.currentContractClassId, contractArtifact); contractAddress = contractInstance.address; addNotesSpy = jest.spyOn(database, 'addNotes'); @@ -655,7 +655,12 @@ describe('Simulator oracle', () => { // We test that a call to `processLog` is made with the correct function artifact and contract address expect(runUnconstrainedSpy).toHaveBeenCalledTimes(3); - expect(runUnconstrainedSpy).toHaveBeenCalledWith(expect.anything(), processLogFuncArtifact, contractAddress, []); + expect(runUnconstrainedSpy).toHaveBeenCalledWith( + expect.anything(), + contractAddress, + await FunctionSelector.fromNameAndParameters(processLogFuncArtifact.name, processLogFuncArtifact.parameters), + [], + ); }, 30_000); it('should not store notes that do not belong to us', async () => { diff --git a/yarn-project/scripts/package.local.json b/yarn-project/scripts/package.local.json index 8db2a39eb81b..75ce5c8e0604 100644 --- a/yarn-project/scripts/package.local.json +++ b/yarn-project/scripts/package.local.json @@ -1,4 +1,3 @@ { - "scripts": { - } + "scripts": {} } diff --git a/yarn-project/sequencer-client/src/tx_validator/phases_validator.test.ts b/yarn-project/sequencer-client/src/tx_validator/phases_validator.test.ts index d5572b9cae20..20e38a4fb4ce 100644 --- a/yarn-project/sequencer-client/src/tx_validator/phases_validator.test.ts +++ b/yarn-project/sequencer-client/src/tx_validator/phases_validator.test.ts @@ -32,7 +32,8 @@ describe('PhasesTxValidator', () => { contractDataSource = mock({ getContract: mockFn().mockImplementation(() => { return { - contractClassId: Fr.random(), + currentContractClassId: Fr.random(), + originalContractClassId: Fr.random(), }; }), }); @@ -71,7 +72,8 @@ describe('PhasesTxValidator', () => { contractDataSource.getContract.mockImplementationOnce(contractAddress => { if (address.equals(contractAddress)) { return Promise.resolve({ - contractClassId: allowedContractClass, + currentContractClassId: allowedContractClass, + originalContractClassId: Fr.random(), } as any); } else { return Promise.resolve(undefined); @@ -94,7 +96,8 @@ describe('PhasesTxValidator', () => { contractDataSource.getContract.mockImplementationOnce(contractAddress => { if (address.equals(contractAddress)) { return Promise.resolve({ - contractClassId: Fr.random(), + currentContractClassId: Fr.random(), + originalContractClassId: Fr.random(), } as any); } else { return Promise.resolve(undefined); diff --git a/yarn-project/sequencer-client/src/tx_validator/phases_validator.ts b/yarn-project/sequencer-client/src/tx_validator/phases_validator.ts index 38112a20ccfc..82f021c90f1f 100644 --- a/yarn-project/sequencer-client/src/tx_validator/phases_validator.ts +++ b/yarn-project/sequencer-client/src/tx_validator/phases_validator.ts @@ -78,14 +78,14 @@ export class PhasesTxValidator implements TxValidator { } if ('classId' in entry && !('selector' in entry)) { - if (contractClass.contractClassId.equals(entry.classId)) { + if (contractClass.currentContractClassId.equals(entry.classId)) { return true; } } if ('classId' in entry && 'selector' in entry) { if ( - contractClass.contractClassId.equals(entry.classId) && + contractClass.currentContractClassId.equals(entry.classId) && (entry.selector === undefined || entry.selector.equals(functionSelector)) ) { return true; diff --git a/yarn-project/simulator/src/acvm/oracle/oracle.ts b/yarn-project/simulator/src/acvm/oracle/oracle.ts index 51f78bfc3177..e1cd1aed5b65 100644 --- a/yarn-project/simulator/src/acvm/oracle/oracle.ts +++ b/yarn-project/simulator/src/acvm/oracle/oracle.ts @@ -58,7 +58,7 @@ export class Oracle { return [ instance.salt, instance.deployer, - instance.contractClassId, + instance.currentContractClassId, instance.initializationHash, ...instance.publicKeys.toFields(), ].map(toACVMField); diff --git a/yarn-project/simulator/src/avm/apps_tests/avm_test.test.ts b/yarn-project/simulator/src/avm/apps_tests/avm_test.test.ts index 1d37b14c4185..180a5497dcfa 100644 --- a/yarn-project/simulator/src/avm/apps_tests/avm_test.test.ts +++ b/yarn-project/simulator/src/avm/apps_tests/avm_test.test.ts @@ -43,7 +43,7 @@ describe('AVM simulator apps tests: AvmTestContract', () => { argsU8, /*getInstanceForAddress=*/ expectContractInstance.address, /*expectedDeployer=*/ expectContractInstance.deployer, - /*expectedClassId=*/ expectContractInstance.contractClassId, + /*expectedClassId=*/ expectContractInstance.currentContractClassId, /*expectedInitializationHash=*/ expectContractInstance.initializationHash, ]; const results = await simTester.simulateCall(sender, /*address=*/ testContractAddress, 'bulk_testing', args); @@ -61,7 +61,7 @@ describe('AVM simulator apps tests: AvmTestContract', () => { // include another contract address that reuses a class ID to ensure that we can call it even after the limit is reached const instanceSameClassAsFirstContract = await makeContractInstanceFromClassId( - instances[0].contractClassId, + instances[0].currentContractClassId, /*seed=*/ 1000, ); instanceAddresses.push(instanceSameClassAsFirstContract.address); diff --git a/yarn-project/simulator/src/avm/avm_simulator.test.ts b/yarn-project/simulator/src/avm/avm_simulator.test.ts index 255420c45a20..0991ba47149e 100644 --- a/yarn-project/simulator/src/avm/avm_simulator.test.ts +++ b/yarn-project/simulator/src/avm/avm_simulator.test.ts @@ -864,7 +864,8 @@ describe('AVM simulator: transpiled Noir contracts', () => { version: 1 as const, salt: new Fr(0x123), deployer: AztecAddress.fromBigInt(0x456n), - contractClassId: new Fr(0x789), + currentContractClassId: new Fr(0x789), + originalContractClassId: new Fr(0x789), initializationHash: new Fr(0x101112), publicKeys: new PublicKeys( new Point(new Fr(0x131415), new Fr(0x161718), false), diff --git a/yarn-project/simulator/src/avm/fixtures/simple_contract_data_source.ts b/yarn-project/simulator/src/avm/fixtures/simple_contract_data_source.ts index e76de873ebb4..93098ce464df 100644 --- a/yarn-project/simulator/src/avm/fixtures/simple_contract_data_source.ts +++ b/yarn-project/simulator/src/avm/fixtures/simple_contract_data_source.ts @@ -74,8 +74,8 @@ export class SimpleContractDataSource implements ContractDataSource { return undefined; } this.logger.debug(`Retrieved contract artifact for address: ${address}`); - this.logger.debug(`Contract class ID: ${contractInstance.contractClassId}`); - return Promise.resolve(this.contractArtifacts.get(contractInstance!.contractClassId.toString())); + this.logger.debug(`Contract class ID: ${contractInstance.currentContractClassId}`); + return Promise.resolve(this.contractArtifacts.get(contractInstance!.currentContractClassId.toString())); } getContractFunctionName(_address: AztecAddress, _selector: FunctionSelector): Promise { diff --git a/yarn-project/simulator/src/avm/journal/journal.ts b/yarn-project/simulator/src/avm/journal/journal.ts index c7ed7e7b7586..06c97b6ce32f 100644 --- a/yarn-project/simulator/src/avm/journal/journal.ts +++ b/yarn-project/simulator/src/avm/journal/journal.ts @@ -1,5 +1,7 @@ import { MerkleTreeId } from '@aztec/circuit-types'; import { + AvmNullifierReadTreeHint, + AvmPublicDataReadTreeHint, AztecAddress, CANONICAL_AUTH_REGISTRY_ADDRESS, DEPLOYER_CONTRACT_ADDRESS, @@ -7,21 +9,30 @@ import { MULTI_CALL_ENTRYPOINT_ADDRESS, NullifierLeafPreimage, type PublicCallRequest, - type PublicDataTreeLeafPreimage, + PublicDataTreeLeafPreimage, REGISTERER_CONTRACT_ADDRESS, ROUTER_ADDRESS, + ScheduledDelayChange, + ScheduledValueChange, SerializableContractInstance, + UPDATED_CLASS_IDS_SLOT, + UPDATES_SCHEDULED_VALUE_CHANGE_LEN, + UPDATES_VALUE_SIZE, + computeSharedMutableHashSlot, } from '@aztec/circuits.js'; import { computeNoteHashNonce, computePublicDataTreeLeafSlot, computeUniqueNoteHash, + deriveStorageSlotInMap, siloNoteHash, siloNullifier, } from '@aztec/circuits.js/hash'; +import { poseidon2Hash } from '@aztec/foundation/crypto'; import { Fr } from '@aztec/foundation/fields'; import { jsonStringify } from '@aztec/foundation/json-rpc'; import { createLogger } from '@aztec/foundation/log'; +import { ProtocolContractAddress } from '@aztec/protocol-contracts'; import { strict as assert } from 'assert'; @@ -194,6 +205,26 @@ export class AvmPersistableStateManager { * @returns the latest value written to slot, or 0 if never written to before */ public async readStorage(contractAddress: AztecAddress, slot: Fr): Promise { + const { value, leafPreimage, leafIndex, leafPath } = await this.getPublicDataMembership(contractAddress, slot); + + if (this.doMerkleOperations) { + this.trace.tracePublicStorageRead(contractAddress, slot, value, leafPreimage, leafIndex, leafPath); + } else { + this.trace.tracePublicStorageRead(contractAddress, slot, value); + } + + return Promise.resolve(value); + } + + async getPublicDataMembership( + contractAddress: AztecAddress, + slot: Fr, + ): Promise<{ + value: Fr; + leafPreimage: PublicDataTreeLeafPreimage; + leafIndex: Fr; + leafPath: Fr[]; + }> { const { value, cached } = await this.publicStorage.read(contractAddress, slot); this.log.trace(`Storage read (address=${contractAddress}, slot=${slot}): value=${value}, cached=${cached}`); const leafSlot = await computePublicDataTreeLeafSlot(contractAddress, slot); @@ -231,14 +262,20 @@ export class AvmPersistableStateManager { 'Public data tree low leaf should skip the target leaf slot when the target leaf does not exist or is the max value.', ); } - // On non-existence, AVM circuit will need to recognize that leafPreimage.slot != leafSlot, - // prove that this is a low leaf that skips leafSlot, and then prove membership of the leaf. - this.trace.tracePublicStorageRead(contractAddress, slot, value, leafPreimage, new Fr(leafIndex), leafPath); + return { + value, + leafPreimage, + leafIndex: new Fr(leafIndex), + leafPath, + }; } else { - this.trace.tracePublicStorageRead(contractAddress, slot, value); + return { + value, + leafPreimage: PublicDataTreeLeafPreimage.empty(), + leafIndex: Fr.ZERO, + leafPath: [], + }; } - - return Promise.resolve(value); } /** @@ -546,24 +583,31 @@ export class AvmPersistableStateManager { const instanceWithAddress = await this.worldStateDB.getContractInstance(contractAddress); const exists = instanceWithAddress !== undefined; - let [existsInTree, leafOrLowLeafPreimage, leafOrLowLeafIndex, leafOrLowLeafPath] = [ - exists, - NullifierLeafPreimage.empty(), - Fr.ZERO, - new Array(), - ]; + let nullifierMembership = AvmNullifierReadTreeHint.empty(); + let updateMembership = AvmPublicDataReadTreeHint.empty(); + let updatePreimage: Fr[] = []; if (!contractAddressIsCanonical(contractAddress)) { const contractAddressNullifier = await siloNullifier( AztecAddress.fromNumber(DEPLOYER_CONTRACT_ADDRESS), contractAddress.toField(), ); - [existsInTree, leafOrLowLeafPreimage, leafOrLowLeafIndex, leafOrLowLeafPath] = await this.getNullifierMembership( - /*siloedNullifier=*/ contractAddressNullifier, + const [ + nullifierExistsInTree, + nullifierLeafOrLowLeafPreimage, + nullifierLeafOrLowLeafIndex, + nullifierLeafOrLowLeafPath, + ] = await this.getNullifierMembership(/*siloedNullifier=*/ contractAddressNullifier); + nullifierMembership = new AvmNullifierReadTreeHint( + nullifierLeafOrLowLeafPreimage, + nullifierLeafOrLowLeafIndex, + nullifierLeafOrLowLeafPath, ); assert( - exists == existsInTree, + exists == nullifierExistsInTree, 'WorldStateDB contains contract instance, but nullifier tree does not contain contract address (or vice versa).... This is a bug!', ); + + ({ updateMembership, updatePreimage } = await this.getContractUpdateHints(contractAddress)); } if (exists) { @@ -576,9 +620,9 @@ export class AvmPersistableStateManager { contractAddress, exists, instance, - leafOrLowLeafPreimage, - leafOrLowLeafIndex, - leafOrLowLeafPath, + nullifierMembership, + updateMembership, + updatePreimage, ); } else { this.trace.traceGetContractInstance(contractAddress, exists, instance); @@ -592,9 +636,9 @@ export class AvmPersistableStateManager { contractAddress, exists, /*instance=*/ undefined, - leafOrLowLeafPreimage, - leafOrLowLeafIndex, - leafOrLowLeafPath, + nullifierMembership, + updateMembership, + updatePreimage, ); } else { this.trace.traceGetContractInstance(contractAddress, exists); @@ -611,39 +655,47 @@ export class AvmPersistableStateManager { const instanceWithAddress = await this.worldStateDB.getContractInstance(contractAddress); const exists = instanceWithAddress !== undefined; - let [existsInTree, leafOrLowLeafPreimage, leafOrLowLeafIndex, leafOrLowLeafPath] = [ - exists, - NullifierLeafPreimage.empty(), - Fr.ZERO, - new Array(), - ]; + let nullifierMembership = AvmNullifierReadTreeHint.empty(); + let updateMembership = AvmPublicDataReadTreeHint.empty(); + let updatePreimage: Fr[] = []; + if (!contractAddressIsCanonical(contractAddress)) { const contractAddressNullifier = await siloNullifier( AztecAddress.fromNumber(DEPLOYER_CONTRACT_ADDRESS), contractAddress.toField(), ); - [existsInTree, leafOrLowLeafPreimage, leafOrLowLeafIndex, leafOrLowLeafPath] = await this.getNullifierMembership( - /*siloedNullifier=*/ contractAddressNullifier, - ); + const [ + nullifierExistsInTree, + nullifierLeafOrLowLeafPreimage, + nullifierLeafOrLowLeafIndex, + nullifierLeafOrLowLeafPath, + ] = await this.getNullifierMembership(/*siloedNullifier=*/ contractAddressNullifier); assert( - exists == existsInTree, + exists == nullifierExistsInTree, 'WorldStateDB contains contract instance, but nullifier tree does not contain contract address (or vice versa).... This is a bug!', ); + nullifierMembership = new AvmNullifierReadTreeHint( + nullifierLeafOrLowLeafPreimage, + nullifierLeafOrLowLeafIndex, + nullifierLeafOrLowLeafPath, + ); + + ({ updateMembership, updatePreimage } = await this.getContractUpdateHints(contractAddress)); } if (exists) { const instance = new SerializableContractInstance(instanceWithAddress); - const contractClass = await this.worldStateDB.getContractClass(instance.contractClassId); - const bytecodeCommitment = await this.worldStateDB.getBytecodeCommitment(instance.contractClassId); + const contractClass = await this.worldStateDB.getContractClass(instance.currentContractClassId); + const bytecodeCommitment = await this.worldStateDB.getBytecodeCommitment(instance.currentContractClassId); assert( contractClass, - `Contract class not found in DB, but a contract instance was found with this class ID (${instance.contractClassId}). This should not happen!`, + `Contract class not found in DB, but a contract instance was found with this class ID (${instance.currentContractClassId}). This should not happen!`, ); assert( bytecodeCommitment, - `Bytecode commitment was not found in DB for contract class (${instance.contractClassId}). This should not happen!`, + `Bytecode commitment was not found in DB for contract class (${instance.currentContractClassId}). This should not happen!`, ); const contractClassPreimage = { @@ -659,9 +711,9 @@ export class AvmPersistableStateManager { contractClass.packedBytecode, instance, contractClassPreimage, - leafOrLowLeafPreimage, - leafOrLowLeafIndex, - leafOrLowLeafPath, + nullifierMembership, + updateMembership, + updatePreimage, ); } else { this.trace.traceGetBytecode( @@ -685,9 +737,9 @@ export class AvmPersistableStateManager { /*instance=*/ undefined, /*contractClass=*/ undefined, /*bytecode=*/ undefined, - leafOrLowLeafPreimage, - leafOrLowLeafIndex, - leafOrLowLeafPath, + nullifierMembership, + updateMembership, + updatePreimage, ); } else { this.trace.traceGetBytecode(contractAddress, exists); // bytecode, instance, class undefined @@ -696,6 +748,47 @@ export class AvmPersistableStateManager { } } + async getContractUpdateHints(contractAddress: AztecAddress) { + const sharedMutableSlot = await deriveStorageSlotInMap(new Fr(UPDATED_CLASS_IDS_SLOT), contractAddress); + + const hashSlot = computeSharedMutableHashSlot(sharedMutableSlot, UPDATES_SCHEDULED_VALUE_CHANGE_LEN); + + const { + value: hash, + leafPreimage, + leafIndex, + leafPath, + } = await this.getPublicDataMembership(ProtocolContractAddress.ContractInstanceDeployer, hashSlot); + const updateMembership = new AvmPublicDataReadTreeHint(leafPreimage, leafIndex, leafPath); + + const readStorage = async (storageSlot: Fr) => + (await this.publicStorage.read(ProtocolContractAddress.ContractInstanceDeployer, storageSlot)).value; + + const valueChange = await ScheduledValueChange.readFromTree(sharedMutableSlot, UPDATES_VALUE_SIZE, readStorage); + + const delayChange = await ScheduledDelayChange.readFromTree(sharedMutableSlot, readStorage); + + const updatePreimage = [delayChange.toField(), ...valueChange.toFields()]; + + if (!hash.isZero()) { + const hashed = await poseidon2Hash(updatePreimage); + if (!hashed.equals(hash)) { + throw new Error(`Update hint hash mismatch: ${hash} != ${hashed}`); + } + this.log.trace(`Non empty update hint found for contract ${contractAddress}`); + } else { + if (updatePreimage.some(f => !f.isZero())) { + throw new Error(`Update hint hash is zero, but update preimage is not: ${updatePreimage}`); + } + this.log.trace(`No update hint found for contract ${contractAddress}`); + } + + return { + updateMembership, + updatePreimage, + }; + } + public traceEnqueuedCall(publicCallRequest: PublicCallRequest, calldata: Fr[], reverted: boolean) { this.trace.traceEnqueuedCall(publicCallRequest, calldata, reverted); } diff --git a/yarn-project/simulator/src/avm/opcodes/contract.test.ts b/yarn-project/simulator/src/avm/opcodes/contract.test.ts index 9311c9b32786..6532fca0fad5 100644 --- a/yarn-project/simulator/src/avm/opcodes/contract.test.ts +++ b/yarn-project/simulator/src/avm/opcodes/contract.test.ts @@ -27,7 +27,7 @@ describe('Contract opcodes', () => { address = await AztecAddress.random(); contractInstance = await SerializableContractInstance.random(); deployer = contractInstance.deployer; - contractClassId = contractInstance.contractClassId; + contractClassId = contractInstance.currentContractClassId; initializationHash = contractInstance.initializationHash; worldStateDB = mock(); trace = mock(); diff --git a/yarn-project/simulator/src/avm/opcodes/contract.ts b/yarn-project/simulator/src/avm/opcodes/contract.ts index 6874ddeedd3f..c3f06eaba047 100644 --- a/yarn-project/simulator/src/avm/opcodes/contract.ts +++ b/yarn-project/simulator/src/avm/opcodes/contract.ts @@ -58,7 +58,7 @@ export class GetContractInstance extends Instruction { memberValue = new Field(instance.deployer.toField()); break; case ContractInstanceMember.CLASS_ID: - memberValue = new Field(instance.contractClassId.toField()); + memberValue = new Field(instance.currentContractClassId.toField()); break; case ContractInstanceMember.INIT_HASH: memberValue = new Field(instance.initializationHash); diff --git a/yarn-project/simulator/src/client/client_execution_context.ts b/yarn-project/simulator/src/client/client_execution_context.ts index 732acb4299ac..380c1a4e4841 100644 --- a/yarn-project/simulator/src/client/client_execution_context.ts +++ b/yarn-project/simulator/src/client/client_execution_context.ts @@ -32,7 +32,7 @@ import { type SimulationProvider } from '../server.js'; import { type DBOracle } from './db_oracle.js'; import { type ExecutionNoteCache } from './execution_note_cache.js'; import { pickNotes } from './pick_notes.js'; -import { executePrivateFunction } from './private_execution.js'; +import { executePrivateFunction, verifyCurrentClassId } from './private_execution.js'; import { ViewDataOracle } from './view_data_oracle.js'; /** @@ -368,11 +368,18 @@ export class ClientExecutionContext extends ViewDataOracle { isStaticCall: boolean, ) { this.log.debug( - `Calling private function ${this.contractAddress}:${functionSelector} from ${this.callContext.contractAddress}`, + `Calling private function ${targetContractAddress}:${functionSelector} from ${this.callContext.contractAddress}`, ); isStaticCall = isStaticCall || this.callContext.isStaticCall; + await verifyCurrentClassId( + targetContractAddress, + await this.db.getContractInstance(targetContractAddress), + this.node, + this.historicalHeader.globalVariables.blockNumber.toNumber(), + ); + const targetArtifact = await this.db.getFunctionArtifact(targetContractAddress, functionSelector); const derivedTxContext = this.txContext.clone(); diff --git a/yarn-project/simulator/src/client/index.ts b/yarn-project/simulator/src/client/index.ts index 8bb0a47d91a5..a18122af8431 100644 --- a/yarn-project/simulator/src/client/index.ts +++ b/yarn-project/simulator/src/client/index.ts @@ -3,7 +3,7 @@ export { ViewDataOracle } from './view_data_oracle.js'; export { type DBOracle, ContractClassNotFoundError, ContractNotFoundError } from './db_oracle.js'; export * from './pick_notes.js'; export { ExecutionNoteCache } from './execution_note_cache.js'; -export { extractPrivateCircuitPublicInputs } from './private_execution.js'; +export { extractPrivateCircuitPublicInputs, readCurrentClassId } from './private_execution.js'; export { witnessMapToFields } from '../acvm/deserialize.js'; export { toACVMWitness } from '../acvm/serialize.js'; export { extractCallStack } from '../acvm/acvm.js'; diff --git a/yarn-project/simulator/src/client/private_execution.test.ts b/yarn-project/simulator/src/client/private_execution.test.ts index fed96f57715a..c96581ccaac6 100644 --- a/yarn-project/simulator/src/client/private_execution.test.ts +++ b/yarn-project/simulator/src/client/private_execution.test.ts @@ -13,6 +13,7 @@ import { BlockHeader, CallContext, CompleteAddress, + type ContractInstance, GasFees, GasSettings, GeneratorIndex, @@ -28,6 +29,7 @@ import { TxContext, computeAppNullifierSecretKey, deriveKeys, + getContractClassFromArtifact, getContractInstanceFromDeployParams, getNonEmptyItems, } from '@aztec/circuits.js'; @@ -40,6 +42,7 @@ import { } from '@aztec/circuits.js/hash'; import { makeHeader } from '@aztec/circuits.js/testing'; import { + type ContractArtifact, type FunctionArtifact, FunctionSelector, type NoteSelector, @@ -65,7 +68,7 @@ import { StatefulTestContractArtifact } from '@aztec/noir-contracts.js/StatefulT import { TestContractArtifact } from '@aztec/noir-contracts.js/Test'; import { jest } from '@jest/globals'; -import { type MockProxy, mock } from 'jest-mock-extended'; +import { Matcher, type MatcherCreator, type MockProxy, mock } from 'jest-mock-extended'; import { toFunctionSelector } from 'viem'; import { MessageLoadOracleInputs } from '../common/message_load_oracle_inputs.js'; @@ -110,32 +113,56 @@ describe('Private Execution test suite', () => { gasSettings: GasSettings.default({ maxFeesPerGas: new GasFees(10, 10) }), }; + let contracts: { [address: string]: ContractArtifact }; + + // expectedValue is optional + const aztecAddressMatcher: MatcherCreator = expectedValue => + new Matcher(actualValue => { + return expectedValue?.toString() === actualValue.toString(); + }, 'Matches aztec addresses'); + + const mockContractInstance = async (artifact: ContractArtifact, address: AztecAddress) => { + contracts[address.toString()] = artifact; + const contractClass = await getContractClassFromArtifact(artifact); + + oracle.getContractInstance.calledWith(aztecAddressMatcher(address)).mockResolvedValue({ + currentContractClassId: contractClass.id, + originalContractClassId: contractClass.id, + } as ContractInstance); + }; + const runSimulator = async ({ artifact, + functionName, args = [], msgSender = AztecAddress.fromField(Fr.MAX_FIELD_VALUE), contractAddress = undefined, txContext = {}, }: { - artifact: FunctionArtifact; + artifact: ContractArtifact; + functionName: string; msgSender?: AztecAddress; contractAddress?: AztecAddress; args?: any[]; txContext?: Partial>; }) => { - const hashedArguments = await HashedValues.fromValues(encodeArguments(artifact, args)); + const functionArtifact = getFunctionArtifactByName(artifact, functionName); contractAddress = contractAddress ?? defaultContractAddress; + const selector = await FunctionSelector.fromNameAndParameters(functionName, functionArtifact.parameters); + await mockContractInstance(artifact, contractAddress); + + const hashedArguments = await HashedValues.fromValues(encodeArguments(functionArtifact, args)); const txRequest = TxExecutionRequest.from({ origin: contractAddress, firstCallArgsHash: hashedArguments.hash, - functionSelector: await FunctionSelector.fromNameAndParameters(artifact.name, artifact.parameters), + functionSelector: selector, txContext: TxContext.from({ ...txContextFields, ...txContext }), argsOfCalls: [hashedArguments], authWitnesses: [], capsules: [], }); - return acirSimulator.run(txRequest, artifact, contractAddress, msgSender); + return acirSimulator.run(txRequest, contractAddress, selector, msgSender); }; const insertLeaves = async (leaves: Fr[], name = 'noteHash') => { @@ -206,6 +233,7 @@ describe('Private Execution test suite', () => { beforeEach(async () => { trees = {}; oracle = mock(); + contracts = {}; oracle.getKeyValidationRequest.mockImplementation(async (pkMHash: Fr, contractAddress: AztecAddress) => { if (pkMHash.equals(await ownerCompleteAddress.publicKeys.masterNullifierPublicKey.hash())) { return Promise.resolve( @@ -247,6 +275,29 @@ describe('Private Execution test suite', () => { return Promise.resolve(new IndexedTaggingSecret(secret, 0)); }, ); + oracle.getFunctionArtifact.mockImplementation(async (address, selector) => { + const contract = contracts[address.toString()]; + if (!contract) { + throw new Error(`Contract not found: ${address}`); + } + const artifact = await getFunctionArtifact(contract, selector); + if (!artifact) { + throw new Error(`Function not found: ${selector.toString()} in contract ${address}`); + } + return Promise.resolve(artifact); + }); + + oracle.getFunctionArtifactByName.mockImplementation((address, name) => { + const contract = contracts[address.toString()]; + if (!contract) { + throw new Error(`Contract not found: ${address}`); + } + const artifact = getFunctionArtifactByName(contract, name); + if (!artifact) { + throw new Error(`Function not found: ${name} in contract ${address}`); + } + return Promise.resolve(artifact); + }); node = mock(); node.getPublicStorageAt.mockImplementation( @@ -262,10 +313,14 @@ describe('Private Execution test suite', () => { it('emits a field array as an encrypted log', async () => { // NB: this test does NOT cover correct enc/dec of values, just whether // the contexts correctly populate non-note encrypted logs - const artifact = getFunctionArtifactByName(TestContractArtifact, 'emit_array_as_encrypted_log'); const sender = recipient; // Needed for tagging. const args = [times(5, () => Fr.random()), owner, sender, false]; - const result = await runSimulator({ artifact, msgSender: owner, args }); + const result = await runSimulator({ + artifact: TestContractArtifact, + functionName: 'emit_array_as_encrypted_log', + msgSender: owner, + args, + }); const privateLogs = getNonEmptyItems(result.entrypoint.publicInputs.privateLogs); expect(privateLogs).toHaveLength(1); @@ -307,13 +362,8 @@ describe('Private Execution test suite', () => { beforeEach(async () => { contractAddress = await AztecAddress.random(); - oracle.getFunctionArtifactByName.mockImplementation((_, functionName: string) => - Promise.resolve(getFunctionArtifactByName(StatefulTestContractArtifact, functionName)), - ); - oracle.getFunctionArtifact.mockImplementation((_, selector: FunctionSelector) => - Promise.resolve(getFunctionArtifact(StatefulTestContractArtifact, selector)), - ); + await mockContractInstance(StatefulTestContractArtifact, contractAddress); }); it('should have a constructor with arguments that inserts notes', async () => { @@ -322,8 +372,12 @@ describe('Private Execution test suite', () => { constructorArgs: initArgs, }); oracle.getContractInstance.mockResolvedValue(instance); - const artifact = getFunctionArtifactByName(StatefulTestContractArtifact, 'constructor'); - const executionResult = await runSimulator({ args: initArgs, artifact, contractAddress: instance.address }); + const executionResult = await runSimulator({ + args: initArgs, + artifact: StatefulTestContractArtifact, + functionName: 'constructor', + contractAddress: instance.address, + }); const result = executionResult.entrypoint.nestedExecutions[0]; expect(result.newNotes).toHaveLength(1); @@ -342,9 +396,11 @@ describe('Private Execution test suite', () => { }); it('should run the create_note function', async () => { - const artifact = getFunctionArtifactByName(StatefulTestContractArtifact, 'create_note_no_init_check'); - - const { entrypoint: result } = await runSimulator({ args: [owner, owner, 140], artifact }); + const { entrypoint: result } = await runSimulator({ + args: [owner, owner, 140], + artifact: StatefulTestContractArtifact, + functionName: 'create_note_no_init_check', + }); expect(result.newNotes).toHaveLength(1); const newNote = result.newNotes[0]; @@ -363,7 +419,6 @@ describe('Private Execution test suite', () => { it('should run the destroy_and_create function', async () => { const amountToTransfer = 100n; - const artifact = getFunctionArtifactByName(StatefulTestContractArtifact, 'destroy_and_create_no_init_check'); const storageSlot = await deriveStorageSlotInMap(StatefulTestContractArtifact.storageLayout['notes'].slot, owner); const recipientStorageSlot = await deriveStorageSlotInMap( @@ -394,7 +449,8 @@ describe('Private Execution test suite', () => { const args = [recipient, amountToTransfer]; const { entrypoint: result, firstNullifier } = await runSimulator({ args, - artifact, + artifact: StatefulTestContractArtifact, + functionName: 'destroy_and_create_no_init_check', msgSender: owner, contractAddress, }); @@ -438,7 +494,6 @@ describe('Private Execution test suite', () => { it('should be able to destroy_and_create with dummy notes', async () => { const amountToTransfer = 100n; const balance = 160n; - const artifact = getFunctionArtifactByName(StatefulTestContractArtifact, 'destroy_and_create_no_init_check'); const storageSlot = await deriveStorageSlotInMap(new Fr(1n), owner); @@ -460,7 +515,13 @@ describe('Private Execution test suite', () => { await insertLeaves(consumedNotes.map(n => n.uniqueNoteHash)); const args = [recipient, amountToTransfer]; - const { entrypoint: result } = await runSimulator({ args, artifact, msgSender: owner, contractAddress }); + const { entrypoint: result } = await runSimulator({ + args, + artifact: StatefulTestContractArtifact, + functionName: 'destroy_and_create_no_init_check', + msgSender: owner, + contractAddress, + }); const nullifiers = getNonEmptyItems(result.publicInputs.nullifiers).map(n => n.value); expect(nullifiers).toEqual(consumedNotes.map(n => n.innerNullifier)); @@ -480,30 +541,36 @@ describe('Private Execution test suite', () => { it('child function should be callable', async () => { const initialValue = 100n; - const artifact = getFunctionArtifactByName(ChildContractArtifact, 'value'); - const { entrypoint: result } = await runSimulator({ args: [initialValue], artifact }); + const { entrypoint: result } = await runSimulator({ + args: [initialValue], + artifact: ChildContractArtifact, + functionName: 'value', + }); expect(result.returnValues).toEqual([new Fr(initialValue + privateIncrement)]); }); it('parent should call child', async () => { const childArtifact = getFunctionArtifactByName(ChildContractArtifact, 'value'); - const parentArtifact = getFunctionArtifactByName(ParentContractArtifact, 'entry_point'); const parentAddress = await AztecAddress.random(); const childAddress = await AztecAddress.random(); const childSelector = await FunctionSelector.fromNameAndParameters(childArtifact.name, childArtifact.parameters); - oracle.getFunctionArtifact.mockImplementation(() => Promise.resolve(childArtifact)); - + await mockContractInstance(ChildContractArtifact, childAddress); logger.info(`Parent deployed at ${parentAddress.toString()}`); logger.info(`Calling child function ${childSelector.toString()} at ${childAddress.toString()}`); const args = [childAddress, childSelector]; - const { entrypoint: result } = await runSimulator({ args, artifact: parentArtifact }); + const { entrypoint: result } = await runSimulator({ + args, + artifact: ParentContractArtifact, + functionName: 'entry_point', + }); expect(result.returnValues).toEqual([new Fr(privateIncrement)]); - expect(oracle.getFunctionArtifact.mock.calls[0]).toEqual([childAddress, childSelector]); + // First fetch of the function artifact is the parent contract + expect(oracle.getFunctionArtifact.mock.calls[1]).toEqual([childAddress, childSelector]); expect(result.nestedExecutions).toHaveLength(1); expect(result.nestedExecutions[0].returnValues).toEqual([new Fr(privateIncrement)]); expect(result.publicInputs.privateCallRequests[0].callContext).toEqual( @@ -531,27 +598,34 @@ describe('Private Execution test suite', () => { it('test function should be directly callable', async () => { logger.info(`Calling testCodeGen function`); - const { entrypoint: result } = await runSimulator({ args, artifact: testCodeGenArtifact }); + const { entrypoint: result } = await runSimulator({ + args, + artifact: TestContractArtifact, + functionName: 'test_code_gen', + }); expect(result.returnValues).toEqual([argsHash]); }); it('test function should be callable through autogenerated interface', async () => { const testAddress = await AztecAddress.random(); - const parentArtifact = getFunctionArtifactByName(ImportTestContractArtifact, 'main_contract'); const testCodeGenSelector = await FunctionSelector.fromNameAndParameters( testCodeGenArtifact.name, testCodeGenArtifact.parameters, ); - oracle.getFunctionArtifact.mockResolvedValue(testCodeGenArtifact); + await mockContractInstance(TestContractArtifact, testAddress); logger.info(`Calling importer main function`); const args = [testAddress]; - const { entrypoint: result } = await runSimulator({ args, artifact: parentArtifact }); + const { entrypoint: result } = await runSimulator({ + args, + artifact: ImportTestContractArtifact, + functionName: 'main_contract', + }); expect(result.returnValues).toEqual([argsHash]); - expect(oracle.getFunctionArtifact.mock.calls[0]).toEqual([testAddress, testCodeGenSelector]); + expect(oracle.getFunctionArtifact.mock.calls[1]).toEqual([testAddress, testCodeGenSelector]); expect(result.nestedExecutions).toHaveLength(1); expect(result.nestedExecutions[0].returnValues).toEqual([argsHash]); }); @@ -564,7 +638,6 @@ describe('Private Execution test suite', () => { contractAddress = await AztecAddress.random(); }); describe('L1 to L2', () => { - const artifact = getFunctionArtifactByName(TestContractArtifact, 'consume_mint_to_private_message'); let bridgedAmount = 100n; const l1ToL2MessageIndex = 0; @@ -618,7 +691,8 @@ describe('Private Execution test suite', () => { const result = await runSimulator({ contractAddress, - artifact, + artifact: TestContractArtifact, + functionName: 'consume_mint_to_private_message', args, txContext: { version: new Fr(1n), chainId: new Fr(1n) }, }); @@ -639,7 +713,8 @@ describe('Private Execution test suite', () => { await expect( runSimulator({ contractAddress, - artifact, + artifact: TestContractArtifact, + functionName: 'consume_mint_to_private_message', args, txContext: { version: new Fr(1n), chainId: new Fr(1n) }, }), @@ -660,7 +735,8 @@ describe('Private Execution test suite', () => { await expect( runSimulator({ contractAddress, - artifact, + artifact: TestContractArtifact, + functionName: 'consume_mint_to_private_message', args, txContext: { version: new Fr(1n), chainId: new Fr(1n) }, }), @@ -680,7 +756,8 @@ describe('Private Execution test suite', () => { await expect( runSimulator({ contractAddress, - artifact, + artifact: TestContractArtifact, + functionName: 'consume_mint_to_private_message', args, txContext: { version: new Fr(1n), chainId: new Fr(1n) }, }), @@ -699,7 +776,8 @@ describe('Private Execution test suite', () => { await expect( runSimulator({ contractAddress, - artifact, + artifact: TestContractArtifact, + functionName: 'consume_mint_to_private_message', args, txContext: { version: new Fr(1n), chainId: new Fr(2n) }, }), @@ -718,7 +796,8 @@ describe('Private Execution test suite', () => { await expect( runSimulator({ contractAddress, - artifact, + artifact: TestContractArtifact, + functionName: 'consume_mint_to_private_message', args, txContext: { version: new Fr(2n), chainId: new Fr(1n) }, }), @@ -738,7 +817,8 @@ describe('Private Execution test suite', () => { await expect( runSimulator({ contractAddress, - artifact, + artifact: TestContractArtifact, + functionName: 'consume_mint_to_private_message', args, txContext: { version: new Fr(1n), chainId: new Fr(1n) }, }), @@ -758,7 +838,8 @@ describe('Private Execution test suite', () => { await expect( runSimulator({ contractAddress, - artifact, + artifact: TestContractArtifact, + functionName: 'consume_mint_to_private_message', args, txContext: { version: new Fr(1n), chainId: new Fr(1n) }, }), @@ -767,7 +848,6 @@ describe('Private Execution test suite', () => { }); it('Should be able to consume a dummy public to private message', async () => { - const artifact = getFunctionArtifactByName(TestContractArtifact, 'consume_note_from_secret'); const secret = new Fr(1n); const secretHash = await computeSecretHash(secret); const note = new Note([secretHash]); @@ -786,7 +866,12 @@ describe('Private Execution test suite', () => { }, ]); - const { entrypoint: result } = await runSimulator({ artifact, args: [secret], contractAddress }); + const { entrypoint: result } = await runSimulator({ + artifact: TestContractArtifact, + functionName: 'consume_note_from_secret', + args: [secret], + contractAddress, + }); // Check a nullifier has been inserted. const nullifiers = getNonEmptyItems(result.publicInputs.nullifiers); @@ -800,20 +885,22 @@ describe('Private Execution test suite', () => { describe('enqueued calls', () => { it.each([false, true])('parent should enqueue call to child (internal %p)', async isInternal => { - const parentArtifact = getFunctionArtifactByName(ParentContractArtifact, 'enqueue_call_to_child'); - const childContractArtifact = ChildContractArtifact.functions.find(fn => fn.name === 'public_dispatch')!; - expect(childContractArtifact).toBeDefined(); + const childContractArtifact = structuredClone(ChildContractArtifact); + const childFunctionArtifact = childContractArtifact.functions.find(fn => fn.name === 'public_dispatch')!; + expect(childFunctionArtifact).toBeDefined(); + childFunctionArtifact.isInternal = isInternal; + const childAddress = await AztecAddress.random(); + await mockContractInstance(childContractArtifact, childAddress); const childSelector = await FunctionSelector.fromSignature('pub_set_value(Field)'); const parentAddress = await AztecAddress.random(); - oracle.getFunctionArtifact.mockImplementation(() => Promise.resolve({ ...childContractArtifact, isInternal })); - const args = [childAddress, childSelector, 42n]; const result = await runSimulator({ msgSender: parentAddress, contractAddress: parentAddress, - artifact: parentArtifact, + artifact: ParentContractArtifact, + functionName: 'enqueue_call_to_child', args, }); @@ -836,13 +923,18 @@ describe('Private Execution test suite', () => { describe('setting teardown function', () => { it('should be able to set a teardown function', async () => { - const entrypoint = getFunctionArtifactByName(TestContractArtifact, 'test_setting_teardown'); - const teardown = getFunctionArtifactByName(TestContractArtifact, 'dummy_public_call'); - oracle.getFunctionArtifact.mockImplementation(() => Promise.resolve({ ...teardown })); - const { entrypoint: result } = await runSimulator({ artifact: entrypoint }); + // All public functions get wrapped in a public_dispatch function + const publicDispatch = getFunctionArtifactByName(TestContractArtifact, 'public_dispatch'); + const { entrypoint: result } = await runSimulator({ + artifact: TestContractArtifact, + functionName: 'test_setting_teardown', + }); expect(result.publicTeardownFunctionCall.isEmpty()).toBeFalsy(); expect(result.publicTeardownFunctionCall.callContext.functionSelector).toEqual( - await FunctionSelector.fromNameAndParameters(teardown.name, teardown.parameters), + await FunctionSelector.fromNameAndParameters(publicDispatch.name, publicDispatch.parameters), + ); + expect(result.publicTeardownFunctionCall.args[0]).toEqual( + (await FunctionSelector.fromNameAndParameters('dummy_public_call', [])).toField(), ); }); }); @@ -850,16 +942,22 @@ describe('Private Execution test suite', () => { describe('setting fee payer', () => { it('should default to not being a fee payer', async () => { // arbitrary random function that doesn't set a fee payer - const entrypoint = getFunctionArtifactByName(TestContractArtifact, 'get_this_address'); const contractAddress = await AztecAddress.random(); - const { entrypoint: result } = await runSimulator({ artifact: entrypoint, contractAddress }); + const { entrypoint: result } = await runSimulator({ + artifact: TestContractArtifact, + functionName: 'get_this_address', + contractAddress, + }); expect(result.publicInputs.isFeePayer).toBe(false); }); it('should be able to set a fee payer', async () => { - const entrypoint = getFunctionArtifactByName(TestContractArtifact, 'test_setting_fee_payer'); const contractAddress = await AztecAddress.random(); - const { entrypoint: result } = await runSimulator({ artifact: entrypoint, contractAddress }); + const { entrypoint: result } = await runSimulator({ + artifact: TestContractArtifact, + functionName: 'test_setting_fee_payer', + contractAddress, + }); expect(result.publicInputs.isFeePayer).toBe(true); }); }); @@ -867,13 +965,8 @@ describe('Private Execution test suite', () => { describe('pending note hashes contract', () => { const valueNoteTypeId = PendingNoteHashesContractArtifact.notes['ValueNote'].id; - beforeEach(() => { - oracle.getFunctionArtifact.mockImplementation((_, selector) => - Promise.resolve(getFunctionArtifact(PendingNoteHashesContractArtifact, selector)), - ); - oracle.getFunctionArtifactByName.mockImplementation((_, functionName: string) => - Promise.resolve(getFunctionArtifact(PendingNoteHashesContractArtifact, functionName)), - ); + beforeEach(async () => { + await mockContractInstance(PendingNoteHashesContractArtifact, defaultContractAddress); }); it('should be able to insert, read, and nullify pending note hashes in one call', async () => { @@ -884,16 +977,13 @@ describe('Private Execution test suite', () => { const amountToTransfer = 100n; const contractAddress = await AztecAddress.random(); - const artifact = getFunctionArtifactByName( - PendingNoteHashesContractArtifact, - 'test_insert_then_get_then_nullify_flat', - ); const sender = owner; const args = [amountToTransfer, owner, sender]; const { entrypoint: result } = await runSimulator({ args: args, - artifact: artifact, + artifact: PendingNoteHashesContractArtifact, + functionName: 'test_insert_then_get_then_nullify_flat', contractAddress, }); @@ -945,10 +1035,7 @@ describe('Private Execution test suite', () => { const amountToTransfer = 100n; const contractAddress = await AztecAddress.random(); - const artifact = getFunctionArtifactByName( - PendingNoteHashesContractArtifact, - 'test_insert_then_get_then_nullify_all_in_nested_calls', - ); + const insertArtifact = getFunctionArtifactByName(PendingNoteHashesContractArtifact, 'insert_note'); const getThenNullifyArtifact = getFunctionArtifactByName( @@ -969,7 +1056,8 @@ describe('Private Execution test suite', () => { const args = [amountToTransfer, owner, sender, insertFnSelector.toField(), getThenNullifyFnSelector.toField()]; const { entrypoint: result } = await runSimulator({ args: args, - artifact: artifact, + artifact: PendingNoteHashesContractArtifact, + functionName: 'test_insert_then_get_then_nullify_all_in_nested_calls', contractAddress: contractAddress, }); @@ -1025,13 +1113,12 @@ describe('Private Execution test suite', () => { const contractAddress = await AztecAddress.random(); - const artifact = getFunctionArtifactByName(PendingNoteHashesContractArtifact, 'test_bad_get_then_insert_flat'); - const args = [amountToTransfer, owner]; // This will throw if we read the note before it was inserted await runSimulator({ args: args, - artifact: artifact, + artifact: PendingNoteHashesContractArtifact, + functionName: 'test_bad_get_then_insert_flat', contractAddress, }); }); @@ -1039,32 +1126,31 @@ describe('Private Execution test suite', () => { describe('get master incoming viewing public key', () => { it('gets the public key for an address', async () => { - // Tweak the contract artifact so we can extract return values - const artifact = getFunctionArtifactByName(TestContractArtifact, 'get_master_incoming_viewing_public_key'); - // Generate a partial address, pubkey, and resulting address const completeAddress = await CompleteAddress.random(); const args = [completeAddress.address]; const pubKey = completeAddress.publicKeys.masterIncomingViewingPublicKey; oracle.getCompleteAddress.mockResolvedValue(completeAddress); - const { entrypoint: result } = await runSimulator({ artifact, args }); + const { entrypoint: result } = await runSimulator({ + artifact: TestContractArtifact, + functionName: 'get_master_incoming_viewing_public_key', + args, + }); expect(result.returnValues).toEqual([pubKey.x, pubKey.y]); }); }); describe('Get notes', () => { it('fails if returning no notes', async () => { - const artifact = getFunctionArtifactByName(TestContractArtifact, 'call_get_notes'); - const args = [2n, true]; oracle.syncTaggedLogs.mockResolvedValue(new Map()); oracle.processTaggedLogs.mockResolvedValue(); oracle.getNotes.mockResolvedValue([]); - await expect(() => runSimulator({ artifact, args })).rejects.toThrow( - `Assertion failed: Attempted to read past end of BoundedVec`, - ); + await expect(() => + runSimulator({ artifact: TestContractArtifact, functionName: 'call_get_notes', args }), + ).rejects.toThrow(`Assertion failed: Attempted to read past end of BoundedVec`); }); }); @@ -1072,11 +1158,12 @@ describe('Private Execution test suite', () => { it('this_address should return the current context address', async () => { const contractAddress = await AztecAddress.random(); - // Tweak the contract artifact so we can extract return values - const artifact = getFunctionArtifactByName(TestContractArtifact, 'get_this_address'); - - // Overwrite the oracle return value - const { entrypoint: result } = await runSimulator({ artifact, args: [], contractAddress }); + const { entrypoint: result } = await runSimulator({ + artifact: TestContractArtifact, + functionName: 'get_this_address', + args: [], + contractAddress, + }); expect(result.returnValues).toEqual([contractAddress.toField()]); }); }); @@ -1085,27 +1172,35 @@ describe('Private Execution test suite', () => { let chainId: Fr; let version: Fr; let args: any[]; - let artifact: FunctionArtifact; beforeEach(() => { chainId = Fr.random(); version = Fr.random(); args = [chainId, version]; - - artifact = getFunctionArtifactByName(TestContractArtifact, 'assert_private_global_vars'); - oracle.getFunctionArtifact.mockImplementation(() => Promise.resolve(artifact)); }); it('Private global vars are correctly set', async () => { // Chain id and version set in tx context is the same as the ones we pass via args so this should not throw - await runSimulator({ artifact, msgSender: owner, args, txContext: { chainId, version } }); + await runSimulator({ + artifact: TestContractArtifact, + functionName: 'assert_private_global_vars', + msgSender: owner, + args, + txContext: { chainId, version }, + }); }); it('Throws when chainId is incorrectly set', async () => { // We set the chainId in the tx context to a different value than the one we pass via args so the simulator should throw const unexpectedChainId = Fr.random(); await expect(() => - runSimulator({ artifact, msgSender: owner, args, txContext: { chainId: unexpectedChainId, version } }), + runSimulator({ + artifact: TestContractArtifact, + functionName: 'assert_private_global_vars', + msgSender: owner, + args, + txContext: { chainId: unexpectedChainId, version }, + }), ).rejects.toThrow('Invalid chain id'); }); @@ -1113,18 +1208,19 @@ describe('Private Execution test suite', () => { // We set the version in the tx context to a different value than the one we pass via args so the simulator should throw const unexpectedVersion = Fr.random(); await expect(() => - runSimulator({ artifact, msgSender: owner, args, txContext: { chainId, version: unexpectedVersion } }), + runSimulator({ + artifact: TestContractArtifact, + functionName: 'assert_private_global_vars', + msgSender: owner, + args, + txContext: { chainId, version: unexpectedVersion }, + }), ).rejects.toThrow('Invalid version'); }); }); describe('Historical header in private context', () => { - let artifact: FunctionArtifact; - beforeEach(() => { - artifact = getFunctionArtifactByName(TestContractArtifact, 'assert_header_private'); - oracle.getFunctionArtifact.mockImplementation(() => Promise.resolve(artifact)); - header = makeHeader(); oracle.getBlockHeader.mockClear(); @@ -1134,14 +1230,21 @@ describe('Private Execution test suite', () => { it('Header is correctly set', async () => { const args = [await header.hash()]; - await runSimulator({ artifact, msgSender: owner, args }); + await runSimulator({ + artifact: TestContractArtifact, + functionName: 'assert_header_private', + msgSender: owner, + args, + }); }); it('Throws when header is not as expected', async () => { const unexpectedHeaderHash = Fr.random(); const args = [unexpectedHeaderHash]; - await expect(() => runSimulator({ artifact, msgSender: owner, args })).rejects.toThrow('Invalid header hash'); + await expect(() => + runSimulator({ artifact: TestContractArtifact, functionName: 'assert_header_private', msgSender: owner, args }), + ).rejects.toThrow('Invalid header hash'); }); }); }); diff --git a/yarn-project/simulator/src/client/private_execution.ts b/yarn-project/simulator/src/client/private_execution.ts index ff15487be8fb..3e9a5729b321 100644 --- a/yarn-project/simulator/src/client/private_execution.ts +++ b/yarn-project/simulator/src/client/private_execution.ts @@ -1,15 +1,21 @@ -import { PrivateCallExecutionResult } from '@aztec/circuit-types'; +import { type AztecNode, PrivateCallExecutionResult } from '@aztec/circuit-types'; import { type CircuitWitnessGenerationStats } from '@aztec/circuit-types/stats'; import { + type ContractInstance, Fr, PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH, PRIVATE_CONTEXT_INPUTS_LENGTH, PrivateCircuitPublicInputs, + ScheduledValueChange, + UPDATED_CLASS_IDS_SLOT, + UPDATES_VALUE_SIZE, } from '@aztec/circuits.js'; +import { deriveStorageSlotInMap } from '@aztec/circuits.js/hash'; import { type FunctionArtifact, type FunctionSelector, countArgumentsSize } from '@aztec/foundation/abi'; import { type AztecAddress } from '@aztec/foundation/aztec-address'; import { createLogger } from '@aztec/foundation/log'; import { Timer } from '@aztec/foundation/timer'; +import { ProtocolContractAddress } from '@aztec/protocol-contracts'; import { fromACVMField, witnessMapToFields } from '../acvm/deserialize.js'; import { type ACVMWitness, Oracle, extractCallStack } from '../acvm/index.js'; @@ -115,3 +121,34 @@ export function extractPrivateCircuitPublicInputs( } return PrivateCircuitPublicInputs.fromFields(returnData); } + +export async function readCurrentClassId( + contractAddress: AztecAddress, + instance: ContractInstance, + node: AztecNode, + blockNumber: number, +) { + const sharedMutableSlot = await deriveStorageSlotInMap(new Fr(UPDATED_CLASS_IDS_SLOT), contractAddress); + const valueChange = await ScheduledValueChange.readFromTree(sharedMutableSlot, UPDATES_VALUE_SIZE, slot => + node.getPublicStorageAt(ProtocolContractAddress.ContractInstanceDeployer, slot, blockNumber), + ); + let currentClassId = valueChange.getCurrentAt(blockNumber)[0]; + if (currentClassId.isZero()) { + currentClassId = instance.originalContractClassId; + } + return currentClassId; +} + +export async function verifyCurrentClassId( + contractAddress: AztecAddress, + instance: ContractInstance, + node: AztecNode, + blockNumber: number, +) { + const currentClassId = await readCurrentClassId(contractAddress, instance, node, blockNumber); + if (!instance.currentContractClassId.equals(currentClassId)) { + throw new Error( + `Contract ${contractAddress} is outdated, current class id is ${currentClassId}, local class id is ${instance.currentContractClassId}`, + ); + } +} diff --git a/yarn-project/simulator/src/client/simulator.ts b/yarn-project/simulator/src/client/simulator.ts index 5f71d7c66f6e..23952b29d6dc 100644 --- a/yarn-project/simulator/src/client/simulator.ts +++ b/yarn-project/simulator/src/client/simulator.ts @@ -24,7 +24,7 @@ import { type SimulationProvider } from '../common/simulation_provider.js'; import { ClientExecutionContext } from './client_execution_context.js'; import { type DBOracle } from './db_oracle.js'; import { ExecutionNoteCache } from './execution_note_cache.js'; -import { executePrivateFunction } from './private_execution.js'; +import { executePrivateFunction, verifyCurrentClassId } from './private_execution.js'; import { executeUnconstrainedFunction } from './unconstrained_execution.js'; import { ViewDataOracle } from './view_data_oracle.js'; @@ -49,11 +49,21 @@ export class AcirSimulator { */ public async run( request: TxExecutionRequest, - entryPointArtifact: FunctionArtifact, contractAddress: AztecAddress, + selector: FunctionSelector, msgSender = AztecAddress.fromField(Fr.MAX_FIELD_VALUE), scopes?: AztecAddress[], ): Promise { + const header = await this.db.getBlockHeader(); + + await verifyCurrentClassId( + contractAddress, + await this.db.getContractInstance(contractAddress), + this.node, + header.globalVariables.blockNumber.toNumber(), + ); + const entryPointArtifact = await this.db.getFunctionArtifact(contractAddress, selector); + if (entryPointArtifact.functionType !== FunctionType.PRIVATE) { throw new Error(`Cannot run ${entryPointArtifact.functionType} function as private`); } @@ -64,8 +74,6 @@ export class AcirSimulator { ); } - const header = await this.db.getBlockHeader(); - // reserve the first side effect for the tx hash (inserted by the private kernel) const startSideEffectCounter = 1; @@ -121,10 +129,18 @@ export class AcirSimulator { */ public async runUnconstrained( request: FunctionCall, - entryPointArtifact: FunctionArtifact, contractAddress: AztecAddress, + selector: FunctionSelector, scopes?: AztecAddress[], ) { + await verifyCurrentClassId( + contractAddress, + await this.db.getContractInstance(contractAddress), + this.node, + await this.node.getBlockNumber(), + ); + const entryPointArtifact = await this.db.getFunctionArtifact(contractAddress, selector); + if (entryPointArtifact.functionType !== FunctionType.UNCONSTRAINED) { throw new Error(`Cannot run ${entryPointArtifact.functionType} function as unconstrained`); } @@ -189,11 +205,11 @@ export class AcirSimulator { } const extendedNoteItems = note.items.concat(Array(maxNoteFields - note.items.length).fill(Fr.ZERO)); - + const selector = await FunctionSelector.fromNameAndParameters(artifact); const execRequest: FunctionCall = { name: artifact.name, to: contractAddress, - selector: await FunctionSelector.fromNameAndParameters(artifact), + selector, type: FunctionType.UNCONSTRAINED, isStatic: artifact.isStatic, args: encodeArguments(artifact, [ @@ -209,8 +225,8 @@ export class AcirSimulator { const [noteHash, uniqueNoteHash, siloedNoteHash, innerNullifier] = (await this.runUnconstrained( execRequest, - artifact, contractAddress, + selector, // We can omit scopes here, because "compute_note_hash_and_optionally_a_nullifier" does not need access to any notes. )) as bigint[]; diff --git a/yarn-project/simulator/src/client/unconstrained_execution.test.ts b/yarn-project/simulator/src/client/unconstrained_execution.test.ts index 11163cef2758..600da35a840b 100644 --- a/yarn-project/simulator/src/client/unconstrained_execution.test.ts +++ b/yarn-project/simulator/src/client/unconstrained_execution.test.ts @@ -1,5 +1,5 @@ import { type AztecNode, type FunctionCall, Note } from '@aztec/circuit-types'; -import { BlockHeader, CompleteAddress } from '@aztec/circuits.js'; +import { BlockHeader, CompleteAddress, type ContractInstance } from '@aztec/circuits.js'; import { FunctionSelector, FunctionType, encodeArguments } from '@aztec/foundation/abi'; import { AztecAddress } from '@aztec/foundation/aztec-address'; import { Fr } from '@aztec/foundation/fields'; @@ -56,6 +56,13 @@ describe('Unconstrained Execution test suite', () => { const notes: Note[] = [...Array(5).fill(buildNote(1n, owner)), ...Array(2).fill(buildNote(2n, owner))]; + node.getBlockNumber.mockResolvedValue(27); + node.getPublicStorageAt.mockResolvedValue(Fr.ZERO); + oracle.getFunctionArtifact.mockResolvedValue(artifact); + oracle.getContractInstance.mockResolvedValue({ + currentContractClassId: new Fr(42), + originalContractClassId: new Fr(42), + } as ContractInstance); oracle.syncTaggedLogs.mockResolvedValue(new Map()); oracle.processTaggedLogs.mockResolvedValue(); oracle.getBlockHeader.mockResolvedValue(BlockHeader.empty()); @@ -82,7 +89,7 @@ describe('Unconstrained Execution test suite', () => { returnTypes: artifact.returnTypes, }; - const result = await acirSimulator.runUnconstrained(execRequest, artifact, await AztecAddress.random()); + const result = await acirSimulator.runUnconstrained(execRequest, contractAddress, FunctionSelector.empty()); expect(result).toEqual(9n); }, 30_000); diff --git a/yarn-project/simulator/src/public/fixtures/public_tx_simulation_tester.ts b/yarn-project/simulator/src/public/fixtures/public_tx_simulation_tester.ts index 1059ce35fa94..5b6f497a19bc 100644 --- a/yarn-project/simulator/src/public/fixtures/public_tx_simulation_tester.ts +++ b/yarn-project/simulator/src/public/fixtures/public_tx_simulation_tester.ts @@ -25,8 +25,9 @@ import { WorldStateDB } from '../public_db_sources.js'; import { type PublicTxResult, PublicTxSimulator } from '../public_tx_simulator.js'; import { createTxForPublicCalls } from './index.js'; -const TIMESTAMP = new Fr(99833); -const DEFAULT_GAS_FEES = new GasFees(2, 3); +export const TIMESTAMP = new Fr(99833); +export const DEFAULT_GAS_FEES = new GasFees(2, 3); +export const DEFAULT_BLOCK_NUMBER = 42; export type TestEnqueuedCall = { address: AztecAddress; @@ -69,6 +70,7 @@ export class PublicTxSimulationTester extends BaseAvmSimulationTester { const globals = GlobalVariables.empty(); globals.timestamp = TIMESTAMP; globals.gasFees = DEFAULT_GAS_FEES; + globals.blockNumber = new Fr(DEFAULT_BLOCK_NUMBER); const simulator = new PublicTxSimulator(this.merkleTrees, this.worldStateDB, globals, /*doMerkleOperations=*/ true); diff --git a/yarn-project/simulator/src/public/public_db_sources.ts b/yarn-project/simulator/src/public/public_db_sources.ts index c5baef1afe35..69b2a5871b43 100644 --- a/yarn-project/simulator/src/public/public_db_sources.ts +++ b/yarn-project/simulator/src/public/public_db_sources.ts @@ -145,9 +145,11 @@ export class ContractsDataSourcePublicDB implements PublicContractsDB { if (!instance) { throw new Error(`Contract ${address.toString()} not found`); } - const contractClass = await this.getContractClass(instance.contractClassId); + const contractClass = await this.getContractClass(instance.currentContractClassId); if (!contractClass) { - throw new Error(`Contract class ${instance.contractClassId.toString()} for ${address.toString()} not found`); + throw new Error( + `Contract class ${instance.currentContractClassId.toString()} for ${address.toString()} not found`, + ); } return contractClass.publicFunctions.find(f => f.selector.equals(selector))?.bytecode; } diff --git a/yarn-project/simulator/src/public/side_effect_trace.test.ts b/yarn-project/simulator/src/public/side_effect_trace.test.ts index 920ddaec34fe..eed150757284 100644 --- a/yarn-project/simulator/src/public/side_effect_trace.test.ts +++ b/yarn-project/simulator/src/public/side_effect_trace.test.ts @@ -23,6 +23,7 @@ import { PublicDataUpdateRequest, PublicLog, SerializableContractInstance, + Vector, } from '@aztec/circuits.js'; import { computePublicDataTreeLeafSlot } from '@aztec/circuits.js/hash'; import { padArrayEnd } from '@aztec/foundation/collection'; @@ -163,18 +164,42 @@ describe('Public Side Effect Trace', () => { it('Should trace get contract instance', async () => { const instance = await SerializableContractInstance.random(); const { version: _, ...instanceWithoutVersion } = instance; - const lowLeafPreimage = new NullifierLeafPreimage(/*siloedNullifier=*/ address.toField(), Fr.ZERO, 0n); + const initializationLowLeafPreimage = new NullifierLeafPreimage( + /*siloedNullifier=*/ address.toField(), + Fr.ZERO, + 0n, + ); + const initializationMembershipHint = new AvmNullifierReadTreeHint( + initializationLowLeafPreimage, + lowLeafIndex, + lowLeafSiblingPath, + ); + const updateSlot = Fr.random(); + const updateMembershipHint = new AvmPublicDataReadTreeHint( + new PublicDataTreeLeafPreimage(updateSlot, Fr.ZERO, Fr.ZERO, updateSlot.add(new Fr(10n)).toBigInt()), + new Fr(1), + [], + ); + const updatePreimage = [new Fr(1), new Fr(2), new Fr(3), new Fr(4)]; const exists = true; - trace.traceGetContractInstance(address, exists, instance, lowLeafPreimage, lowLeafIndex, lowLeafSiblingPath); + trace.traceGetContractInstance( + address, + exists, + instance, + initializationMembershipHint, + updateMembershipHint, + updatePreimage, + ); expect(trace.getCounter()).toBe(startCounterPlus1); - const membershipHint = new AvmNullifierReadTreeHint(lowLeafPreimage, lowLeafIndex, lowLeafSiblingPath); expect(trace.getAvmCircuitHints().contractInstances.items).toEqual([ { address, exists, ...instanceWithoutVersion, - membershipHint, + initializationMembershipHint, + updateMembershipHint, + updatePreimage: new Vector(updatePreimage), }, ]); }); @@ -187,7 +212,23 @@ describe('Public Side Effect Trace', () => { publicBytecodeCommitment: Fr.random(), }; const { version: _, ...instanceWithoutVersion } = instance; - const lowLeafPreimage = new NullifierLeafPreimage(/*siloedNullifier=*/ address.toField(), Fr.ZERO, 0n); + const initializationLowLeafPreimage = new NullifierLeafPreimage( + /*siloedNullifier=*/ address.toField(), + Fr.ZERO, + 0n, + ); + const initializationMembership = new AvmNullifierReadTreeHint( + initializationLowLeafPreimage, + lowLeafIndex, + lowLeafSiblingPath, + ); + const updateSlot = Fr.random(); + const updateMembershipHint = new AvmPublicDataReadTreeHint( + new PublicDataTreeLeafPreimage(updateSlot, Fr.ZERO, Fr.ZERO, updateSlot.add(new Fr(10n)).toBigInt()), + new Fr(1), + [], + ); + const updatePreimage = [new Fr(1), new Fr(2), new Fr(3), new Fr(4)]; const exists = true; trace.traceGetBytecode( address, @@ -195,16 +236,22 @@ describe('Public Side Effect Trace', () => { bytecode, instance, contractClass, - lowLeafPreimage, - lowLeafIndex, - lowLeafSiblingPath, + initializationMembership, + updateMembershipHint, + updatePreimage, ); - const membershipHint = new AvmNullifierReadTreeHint(lowLeafPreimage, lowLeafIndex, lowLeafSiblingPath); expect(Array.from(trace.getAvmCircuitHints().contractBytecodeHints.values())).toEqual([ { bytecode, - contractInstanceHint: { address, exists, ...instanceWithoutVersion, membershipHint: { ...membershipHint } }, + contractInstanceHint: { + address, + exists, + ...instanceWithoutVersion, + initializationMembershipHint: { ...initializationMembership }, + updateMembershipHint, + updatePreimage: new Vector(updatePreimage), + }, contractClassHint: contractClass, }, ]); @@ -361,7 +408,7 @@ describe('Public Side Effect Trace', () => { const differentAddr = AztecAddress.fromNumber(MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS + 1); const instanceWithSameClassId = await SerializableContractInstance.random({ - contractClassId: firstInstance.contractClassId, + currentContractClassId: firstInstance.currentContractClassId, }); // can re-trace different contract address if it has a duplicate class ID trace.traceGetBytecode(differentAddr, /*exists=*/ true, bytecode, instanceWithSameClassId); @@ -407,6 +454,7 @@ describe('Public Side Effect Trace', () => { let testCounter = startCounter; const leafPreimage = new PublicDataTreeLeafPreimage(slot, value, Fr.ZERO, 0n); const lowLeafPreimage = new NullifierLeafPreimage(utxo, Fr.ZERO, 0n); + const nullifierMembership = new AvmNullifierReadTreeHint(lowLeafPreimage, Fr.ZERO, []); nestedTrace.tracePublicStorageRead(address, slot, value, leafPreimage, Fr.ZERO, []); testCounter++; await nestedTrace.tracePublicStorageWrite( @@ -437,9 +485,9 @@ describe('Public Side Effect Trace', () => { testCounter++; nestedTrace.tracePublicLog(address, log); testCounter++; - nestedTrace.traceGetContractInstance(address, /*exists=*/ true, contractInstance, lowLeafPreimage, Fr.ZERO, []); + nestedTrace.traceGetContractInstance(address, /*exists=*/ true, contractInstance, nullifierMembership); testCounter++; - nestedTrace.traceGetContractInstance(address, /*exists=*/ false, contractInstance, lowLeafPreimage, Fr.ZERO, []); + nestedTrace.traceGetContractInstance(address, /*exists=*/ false, contractInstance, nullifierMembership); testCounter++; trace.merge(nestedTrace, reverted); diff --git a/yarn-project/simulator/src/public/side_effect_trace.ts b/yarn-project/simulator/src/public/side_effect_trace.ts index bd067e240b3b..960165ec5f8a 100644 --- a/yarn-project/simulator/src/public/side_effect_trace.ts +++ b/yarn-project/simulator/src/public/side_effect_trace.ts @@ -371,21 +371,23 @@ export class SideEffectTrace implements PublicSideEffectTraceInterface { contractAddress: AztecAddress, exists: boolean, instance: SerializableContractInstance = SerializableContractInstance.default(), - lowLeafPreimage: NullifierLeafPreimage = NullifierLeafPreimage.empty(), - lowLeafIndex: Fr = Fr.zero(), - lowLeafPath: Fr[] = emptyNullifierPath(), + nullifierMembershipHint: AvmNullifierReadTreeHint = AvmNullifierReadTreeHint.empty(), + updateMembershipHint: AvmPublicDataReadTreeHint = AvmPublicDataReadTreeHint.empty(), + updatePreimage: Fr[] = [], ) { - const membershipHint = new AvmNullifierReadTreeHint(lowLeafPreimage, lowLeafIndex, lowLeafPath); this.avmCircuitHints.contractInstances.items.push( new AvmContractInstanceHint( contractAddress, exists, instance.salt, instance.deployer, - instance.contractClassId, + instance.currentContractClassId, + instance.originalContractClassId, instance.initializationHash, instance.publicKeys, - membershipHint, + nullifierMembershipHint, + updateMembershipHint, + updatePreimage, ), ); this.log.trace(`Tracing contract instance retrieval (counter=${this.sideEffectCounter})`); @@ -405,9 +407,9 @@ export class SideEffectTrace implements PublicSideEffectTraceInterface { privateFunctionsRoot: Fr.zero(), publicBytecodeCommitment: Fr.zero(), }, - lowLeafPreimage: NullifierLeafPreimage = NullifierLeafPreimage.empty(), - lowLeafIndex: Fr = Fr.zero(), - lowLeafPath: Fr[] = emptyNullifierPath(), + nullifierMembershipHint: AvmNullifierReadTreeHint = AvmNullifierReadTreeHint.empty(), + updateMembershipHint: AvmPublicDataReadTreeHint = AvmPublicDataReadTreeHint.empty(), + updatePreimage: Fr[] = [], ) { // FIXME: The way we are hinting contract bytecodes is fundamentally broken. // We are mapping contract class ID to a bytecode hint @@ -417,16 +419,18 @@ export class SideEffectTrace implements PublicSideEffectTraceInterface { // But without that instance hinted, the circuit can't prove that the called contract address // actually corresponds to any class ID. - const membershipHint = new AvmNullifierReadTreeHint(lowLeafPreimage, lowLeafIndex, lowLeafPath); const instance = new AvmContractInstanceHint( contractAddress, exists, contractInstance.salt, contractInstance.deployer, - contractInstance.contractClassId, + contractInstance.currentContractClassId, + contractInstance.originalContractClassId, contractInstance.initializationHash, contractInstance.publicKeys, - membershipHint, + nullifierMembershipHint, + updateMembershipHint, + updatePreimage, ); // Always hint the contract instance separately from the bytecode hint. @@ -446,10 +450,10 @@ export class SideEffectTrace implements PublicSideEffectTraceInterface { // Don't we still need to hint if the class ID already exists? // Because the circuit needs to prove that the called contract address corresponds to the class ID. // To do so, the circuit needs to know the class ID in the - if (this.gotBytecodeFromClassIds.has(contractInstance.contractClassId.toString())) { + if (this.gotBytecodeFromClassIds.has(contractInstance.currentContractClassId.toString())) { // this ensures there are no duplicates this.log.trace( - `Contract class id ${contractInstance.contractClassId.toString()} already exists in previous hints`, + `Contract class id ${contractInstance.currentContractClassId.toString()} already exists in previous hints`, ); return; } @@ -463,7 +467,7 @@ export class SideEffectTrace implements PublicSideEffectTraceInterface { // present/used. That would require more bytecode hashing which is exactly what this limit exists to avoid. if (this.gotBytecodeFromClassIds.size() >= MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS) { this.log.debug( - `Bytecode retrieval failure for contract class ID ${contractInstance.contractClassId.toString()} (limit reached)`, + `Bytecode retrieval failure for contract class ID ${contractInstance.currentContractClassId.toString()} (limit reached)`, ); throw new SideEffectLimitReachedError( 'contract calls to unique class IDs', @@ -473,12 +477,12 @@ export class SideEffectTrace implements PublicSideEffectTraceInterface { this.log.trace(`Tracing bytecode & contract class for bytecode retrieval: class=${jsonStringify(contractClass)}`); this.avmCircuitHints.contractBytecodeHints.set( - contractInstance.contractClassId.toString(), + contractInstance.currentContractClassId.toString(), new AvmContractBytecodeHints(bytecode, instance, contractClass), ); // After adding the bytecode hint, mark the classId as retrieved to avoid duplication. // The above map alone isn't sufficient because we need to check the parent trace's (and its parent) as well. - this.gotBytecodeFromClassIds.add(contractInstance.contractClassId.toString()); + this.gotBytecodeFromClassIds.add(contractInstance.currentContractClassId.toString()); } /** diff --git a/yarn-project/simulator/src/public/side_effect_trace_interface.ts b/yarn-project/simulator/src/public/side_effect_trace_interface.ts index eea7c9efe23b..223727aa522c 100644 --- a/yarn-project/simulator/src/public/side_effect_trace_interface.ts +++ b/yarn-project/simulator/src/public/side_effect_trace_interface.ts @@ -1,4 +1,6 @@ import { + type AvmNullifierReadTreeHint, + type AvmPublicDataReadTreeHint, type ContractClassIdPreimage, type NullifierLeafPreimage, type PublicCallRequest, @@ -63,9 +65,9 @@ export interface PublicSideEffectTraceInterface { contractAddress: AztecAddress, exists: boolean, instance?: SerializableContractInstance, - lowLeafPreimage?: NullifierLeafPreimage, - lowLeafIndex?: Fr, - lowLeafPath?: Fr[], + nullifierMembershipHint?: AvmNullifierReadTreeHint, + updateMembershipHint?: AvmPublicDataReadTreeHint, + updatePreimage?: Fr[], ): void; traceGetBytecode( contractAddress: AztecAddress, @@ -73,9 +75,9 @@ export interface PublicSideEffectTraceInterface { bytecode?: Buffer, contractInstance?: SerializableContractInstance, contractClass?: ContractClassIdPreimage, - lowLeafPreimage?: NullifierLeafPreimage, - lowLeafIndex?: Fr, - lowLeafPath?: Fr[], + nullifierMembershipHint?: AvmNullifierReadTreeHint, + updateMembershipHint?: AvmPublicDataReadTreeHint, + updatePreimage?: Fr[], ): void; traceEnqueuedCall( /** The call request from private that enqueued this call. */ diff --git a/yarn-project/txe/src/node/txe_node.ts b/yarn-project/txe/src/node/txe_node.ts index 329bd8424717..2ea207237980 100644 --- a/yarn-project/txe/src/node/txe_node.ts +++ b/yarn-project/txe/src/node/txe_node.ts @@ -9,7 +9,7 @@ import { type L2BlockNumber, type L2Tips, type LogFilter, - type MerkleTreeId, + MerkleTreeId, type MerkleTreeReadOperations, type MerkleTreeWriteOperations, type NullifierMembershipWitness, @@ -40,8 +40,10 @@ import { PUBLIC_LOG_DATA_SIZE_IN_FIELDS, type PrivateLog, type ProtocolContractAddresses, + type PublicDataTreeLeafPreimage, type PublicLog, } from '@aztec/circuits.js'; +import { computePublicDataTreeLeafSlot } from '@aztec/circuits.js/hash'; import { type L1ContractAddresses } from '@aztec/ethereum'; import { poseidon2Hash } from '@aztec/foundation/crypto'; import { Fr } from '@aztec/foundation/fields'; @@ -582,8 +584,23 @@ export class TXENode implements AztecNode { * @param blockNumber - The block number at which to get the data or 'latest'. * @returns Storage value at the given contract slot. */ - getPublicStorageAt(_contract: AztecAddress, _slot: Fr, _blockNumber: L2BlockNumber): Promise { - throw new Error('TXE Node method getPublicStorageAt not implemented'); + async getPublicStorageAt(contract: AztecAddress, slot: Fr, blockNumber: L2BlockNumber): Promise { + const db: MerkleTreeReadOperations = + blockNumber === (await this.getBlockNumber()) || blockNumber === 'latest' || blockNumber === undefined + ? this.baseFork + : this.nativeWorldStateService.getSnapshot(blockNumber); + + const leafSlot = await computePublicDataTreeLeafSlot(contract, slot); + + const lowLeafResult = await db.getPreviousValueIndex(MerkleTreeId.PUBLIC_DATA_TREE, leafSlot.toBigInt()); + if (!lowLeafResult || !lowLeafResult.alreadyPresent) { + return Fr.ZERO; + } + const preimage = (await db.getLeafPreimage( + MerkleTreeId.PUBLIC_DATA_TREE, + lowLeafResult.index, + )) as PublicDataTreeLeafPreimage; + return preimage.value; } /** diff --git a/yarn-project/txe/src/oracle/txe_oracle.ts b/yarn-project/txe/src/oracle/txe_oracle.ts index eda97954e6d9..69a6c2e89ecf 100644 --- a/yarn-project/txe/src/oracle/txe_oracle.ts +++ b/yarn-project/txe/src/oracle/txe_oracle.ts @@ -874,7 +874,7 @@ export class TXE implements TypedOracle { if (!instance) { return undefined; } - const artifact = await this.contractDataOracle.getContractArtifact(instance!.contractClassId); + const artifact = await this.contractDataOracle.getContractArtifact(instance!.currentContractClassId); if (!artifact) { return undefined; } diff --git a/yarn-project/txe/src/txe_service/txe_service.ts b/yarn-project/txe/src/txe_service/txe_service.ts index 751b6191aa18..0fe60ecaa405 100644 --- a/yarn-project/txe/src/txe_service/txe_service.ts +++ b/yarn-project/txe/src/txe_service/txe_service.ts @@ -99,7 +99,7 @@ export class TXEService { await this.addAccount(artifact, instance, secret); } else { await (this.typedOracle as TXE).addContractInstance(instance); - await (this.typedOracle as TXE).addContractArtifact(instance.contractClassId, artifact); + await (this.typedOracle as TXE).addContractArtifact(instance.currentContractClassId, artifact); this.logger.debug(`Deployed ${artifact.name} at ${instance.address}`); } @@ -107,7 +107,7 @@ export class TXEService { toArray([ instance.salt, instance.deployer.toField(), - instance.contractClassId, + instance.currentContractClassId, instance.initializationHash, ...instance.publicKeys.toFields(), ]), @@ -153,7 +153,7 @@ export class TXEService { async addAccount(artifact: ContractArtifact, instance: ContractInstanceWithAddress, secret: ForeignCallSingle) { this.logger.debug(`Deployed ${artifact.name} at ${instance.address}`); await (this.typedOracle as TXE).addContractInstance(instance); - await (this.typedOracle as TXE).addContractArtifact(instance.contractClassId, artifact); + await (this.typedOracle as TXE).addContractArtifact(instance.currentContractClassId, artifact); const keyStore = (this.typedOracle as TXE).getKeyStore(); const completeAddress = await keyStore.addAccount(fromSingle(secret), await computePartialAddress(instance)); @@ -392,7 +392,7 @@ export class TXEService { toArray([ instance.salt, instance.deployer.toField(), - instance.contractClassId, + instance.currentContractClassId, instance.initializationHash, ...instance.publicKeys.toFields(), ]), @@ -626,7 +626,7 @@ export class TXEService { async avmOpcodeGetContractInstanceClassId(address: ForeignCallSingle) { const instance = await this.typedOracle.getContractInstance(addressFromSingle(address)); return toForeignCallResult([ - toSingle(instance.contractClassId), + toSingle(instance.currentContractClassId), // AVM requires an extra boolean indicating the instance was found toSingle(new Fr(1)), ]); diff --git a/yarn-project/txe/src/util/txe_public_contract_data_source.ts b/yarn-project/txe/src/util/txe_public_contract_data_source.ts index a9cccb092b82..fdb61f26b6a3 100644 --- a/yarn-project/txe/src/util/txe_public_contract_data_source.ts +++ b/yarn-project/txe/src/util/txe_public_contract_data_source.ts @@ -71,7 +71,7 @@ export class TXEPublicContractDataSource implements ContractDataSource { async getContractArtifact(address: AztecAddress): Promise { const instance = await this.txeOracle.getContractDataOracle().getContractInstance(address); - return this.txeOracle.getContractDataOracle().getContractArtifact(instance.contractClassId); + return this.txeOracle.getContractDataOracle().getContractArtifact(instance.currentContractClassId); } async getContractFunctionName(address: AztecAddress, selector: FunctionSelector): Promise { diff --git a/yarn-project/world-state/src/testing.ts b/yarn-project/world-state/src/testing.ts index 5330b4501459..16bd8c5ba7a0 100644 --- a/yarn-project/world-state/src/testing.ts +++ b/yarn-project/world-state/src/testing.ts @@ -40,15 +40,19 @@ export const defaultInitialAccountFeeJuice = new Fr(10n ** 22n); export async function getGenesisValues( initialAccounts: AztecAddress[], initialAccountFeeJuice = defaultInitialAccountFeeJuice, + genesisPublicData: PublicDataTreeLeaf[] = [], ) { // Top up the accounts with fee juice. - const prefilledPublicData = ( - await Promise.all( - initialAccounts.map( - async address => new PublicDataTreeLeaf(await computeFeePayerBalanceLeafSlot(address), initialAccountFeeJuice), - ), - ) - ).sort((a, b) => (b.slot.lt(a.slot) ? 1 : -1)); + let prefilledPublicData = await Promise.all( + initialAccounts.map( + async address => new PublicDataTreeLeaf(await computeFeePayerBalanceLeafSlot(address), initialAccountFeeJuice), + ), + ); + + // Add user-defined public data + prefilledPublicData = prefilledPublicData.concat(genesisPublicData); + + prefilledPublicData.sort((a, b) => (b.slot.lt(a.slot) ? 1 : -1)); const { genesisBlockHash, genesisArchiveRoot } = await generateGenesisValues(prefilledPublicData);