diff --git a/.circleci/config.yml b/.circleci/config.yml index a9cf73da295..31bb8ce214c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -852,6 +852,13 @@ jobs: - run: name: "Copy docs dockerignore" command: cp docs/.dockerignore . + - run: + name: "Configure build for master" + command: | + if [ "$CIRCLE_BRANCH" == "master" ]; then + echo "Configuring build for master" + echo "INCLUDE_RELEASED_CODE=1" >> docs/.env + fi - run: name: "Build docs" command: build docs diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_format.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_format.cpp index 64411b6b2d0..6f66e74ce9f 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_format.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_format.cpp @@ -1,6 +1,7 @@ #include "acir_format.hpp" #include "barretenberg/common/log.hpp" #include "barretenberg/dsl/acir_format/pedersen.hpp" +#include "barretenberg/dsl/acir_format/recursion_constraint.hpp" #include "barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp" namespace acir_format { @@ -149,23 +150,52 @@ void build_constraints(Builder& builder, acir_format const& constraint_system, b create_block_constraints(builder, constraint, has_valid_witness_assignments); } - // Add recursion constraints // TODO(https://github.com/AztecProtocol/barretenberg/issues/817): disable these for UGH for now since we're not yet // dealing with proper recursion if constexpr (IsGoblinBuilder) { info("WARNING: this circuit contains recursion_constraints!"); } else { + // These are set and modified whenever we encounter a recursion opcode + // + // These should not be set by the caller + // TODO: Check if this is always the case. ie I won't receive a proof that will set the first + // TODO input_aggregation_object to be non-zero. + // TODO: if not, we can add input_aggregation_object to the proof too for all recursive proofs + // TODO: This might be the case for proof trees where the proofs are created on different machines + std::array current_input_aggregation_object = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + std::array current_output_aggregation_object = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + + // Add recursion constraints for (size_t i = 0; i < constraint_system.recursion_constraints.size(); ++i) { auto& constraint = constraint_system.recursion_constraints[i]; - create_recursion_constraints(builder, constraint, has_valid_witness_assignments); - - // make sure the verification key records the public input indices of the final recursion output (N.B. up to - // the ACIR description to make sure that the final output aggregation object wires are public inputs!) - if (i == constraint_system.recursion_constraints.size() - 1) { - std::vector proof_output_witness_indices(constraint.output_aggregation_object.begin(), - constraint.output_aggregation_object.end()); - builder.set_recursive_proof(proof_output_witness_indices); + current_output_aggregation_object = create_recursion_constraints(builder, + constraint, + current_input_aggregation_object, + constraint.nested_aggregation_object, + has_valid_witness_assignments); + current_input_aggregation_object = current_output_aggregation_object; + } + + // Now that the circuit has been completely built, we add the output aggregation as public + // inputs. + if (!constraint_system.recursion_constraints.empty()) { + + // First add the output aggregation object as public inputs + // Set the indices as public inputs because they are no longer being + // created in ACIR + for (const auto& idx : current_output_aggregation_object) { + builder.set_public_input(idx); } + + // Make sure the verification key records the public input indices of the + // final recursion output. + std::vector proof_output_witness_indices(current_output_aggregation_object.begin(), + current_output_aggregation_object.end()); + builder.set_recursive_proof(proof_output_witness_indices); } } } diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/recursion_constraint.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/recursion_constraint.cpp index 4118c3307f5..f01d4f60f66 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/recursion_constraint.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/recursion_constraint.cpp @@ -3,6 +3,7 @@ #include "barretenberg/plonk/transcript/transcript_wrappers.hpp" #include "barretenberg/stdlib/recursion/aggregation_state/aggregation_state.hpp" #include "barretenberg/stdlib/recursion/verifier/verifier.hpp" +#include namespace acir_format { @@ -28,12 +29,19 @@ void generate_dummy_proof() {} * We would either need a separate ACIR opcode where inner_proof_contains_recursive_proof = true, * or we need non-witness data to be provided as metadata in the ACIR opcode */ -template -void create_recursion_constraints(Builder& builder, - const RecursionConstraint& input, - bool has_valid_witness_assignments) +std::array create_recursion_constraints( + Builder& builder, + const RecursionConstraint& input, + std::array input_aggregation_object, + // TODO: does this need to be a part of the recursion opcode? + // TODO: or can we figure it out from the vk? + // TODO: either way we could probably have the user explicitly provide it + // TODO: in Noir. + // Note: this is not being used in Noir at the moment + std::array nested_aggregation_object, + bool has_valid_witness_assignments) { - const auto& nested_aggregation_indices = input.nested_aggregation_object; + const auto& nested_aggregation_indices = nested_aggregation_object; bool nested_aggregation_indices_all_zero = true; for (const auto& idx : nested_aggregation_indices) { nested_aggregation_indices_all_zero &= (idx == 0); @@ -47,8 +55,12 @@ void create_recursion_constraints(Builder& builder, const std::vector dummy_key = export_dummy_key_in_recursion_format( PolynomialManifest(Builder::CIRCUIT_TYPE), inner_proof_contains_recursive_proof); const auto manifest = Composer::create_manifest(input.public_inputs.size()); - const std::vector dummy_proof = + std::vector dummy_proof = export_dummy_transcript_in_recursion_format(manifest, inner_proof_contains_recursive_proof); + + // Remove the public inputs from the dummy proof + dummy_proof.erase(dummy_proof.begin(), + dummy_proof.begin() + static_cast(input.public_inputs.size())); for (size_t i = 0; i < input.proof.size(); ++i) { const auto proof_field_idx = input.proof[i]; // if we do NOT have a witness assignment (i.e. are just building the proving/verification keys), @@ -74,7 +86,7 @@ void create_recursion_constraints(Builder& builder, // Construct an in-circuit representation of the verification key. // For now, the v-key is a circuit constant and is fixed for the circuit. // (We may need a separate recursion opcode for this to vary, or add more config witnesses to this opcode) - const auto& aggregation_input = input.input_aggregation_object; + const auto& aggregation_input = input_aggregation_object; aggregation_state_ct previous_aggregation; // If we have previously recursively verified proofs, `is_aggregation_object_nonzero = true` @@ -113,7 +125,13 @@ void create_recursion_constraints(Builder& builder, } std::vector proof_fields; - proof_fields.reserve(input.proof.size()); + // Prepend the public inputs to the proof fields because this is how the + // core barretenberg library processes proofs (with the public inputs first and not separated) + proof_fields.reserve(input.proof.size() + input.public_inputs.size()); + for (const auto& idx : input.public_inputs) { + auto field = field_ct::from_witness_index(&builder, idx); + proof_fields.emplace_back(field); + } for (const auto& idx : input.proof) { auto field = field_ct::from_witness_index(&builder, idx); proof_fields.emplace_back(field); @@ -137,12 +155,14 @@ void create_recursion_constraints(Builder& builder, result.public_inputs[i].assert_equal(field_ct::from_witness_index(&builder, input.public_inputs[i])); } - // Assign the recursive proof outputs to `output_aggregation_object` - for (size_t i = 0; i < result.proof_witness_indices.size(); ++i) { - const auto lhs = field_ct::from_witness_index(&builder, result.proof_witness_indices[i]); - const auto rhs = field_ct::from_witness_index(&builder, input.output_aggregation_object[i]); - lhs.assert_equal(rhs); - } + // We want to return an array, so just copy the vector into the array + ASSERT(result.proof_witness_indices.size() == RecursionConstraint::AGGREGATION_OBJECT_SIZE); + std::array resulting_output_aggregation_object; + std::copy(result.proof_witness_indices.begin(), + result.proof_witness_indices.begin() + RecursionConstraint::AGGREGATION_OBJECT_SIZE, + resulting_output_aggregation_object.begin()); + + return resulting_output_aggregation_object; } /** @@ -350,8 +370,4 @@ G1AsFields export_g1_affine_element_as_fields(const barretenberg::g1::affine_ele return G1AsFields{ x_lo, x_hi, y_lo, y_hi }; } -template void create_recursion_constraints(UltraCircuitBuilder& builder, - const RecursionConstraint& input, - bool has_valid_witness_assignments); - } // namespace acir_format diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/recursion_constraint.hpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/recursion_constraint.hpp index 65574c68173..345b6744cd6 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/recursion_constraint.hpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/recursion_constraint.hpp @@ -53,17 +53,24 @@ struct RecursionConstraint { std::vector proof; std::vector public_inputs; uint32_t key_hash; + // TODO:This is now unused, but we keep it here for backwards compatibility std::array input_aggregation_object; + // TODO: This is now unused, but we keep it here for backwards compatibility std::array output_aggregation_object; + // TODO: This is currently not being used on the Noir level at all + // TODO: we don't have a way to specify that the proof we are creating contains a + // TODO: aggregation object (ie it is also verifying a proof) std::array nested_aggregation_object; friend bool operator==(RecursionConstraint const& lhs, RecursionConstraint const& rhs) = default; }; -template -void create_recursion_constraints(Builder& builder, - const RecursionConstraint& input, - bool has_valid_witness_assignments = false); +std::array create_recursion_constraints( + Builder& builder, + const RecursionConstraint& input, + std::array input_aggregation_object, + std::array nested_aggregation_object, + bool has_valid_witness_assignments = false); std::vector export_key_in_recursion_format(std::shared_ptr const& vkey); std::vector export_dummy_key_in_recursion_format(const PolynomialManifest& polynomial_manifest, diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/recursion_constraint.test.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/recursion_constraint.test.cpp index 550bd180cc3..b80d437e6d5 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/recursion_constraint.test.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/recursion_constraint.test.cpp @@ -146,7 +146,15 @@ Builder create_outer_circuit(std::vector& inner_circuits) transcript::HashType::PedersenBlake3s, 16); - const std::vector proof_witnesses = export_transcript_in_recursion_format(transcript); + std::vector proof_witnesses = export_transcript_in_recursion_format(transcript); + // - Save the public inputs so that we can set their values. + // - Then truncate them from the proof because the ACIR API expects proofs without public inputs + + std::vector inner_public_input_values( + proof_witnesses.begin(), proof_witnesses.begin() + static_cast(num_inner_public_inputs)); + proof_witnesses.erase(proof_witnesses.begin(), + proof_witnesses.begin() + static_cast(num_inner_public_inputs)); + const std::vector key_witnesses = export_key_in_recursion_format(inner_verifier.key); const uint32_t key_hash_start_idx = static_cast(witness_offset); @@ -202,14 +210,18 @@ Builder create_outer_circuit(std::vector& inner_circuits) for (const auto& wit : key_witnesses) { witness.emplace_back(wit); } + // Set the values for the inner public inputs + // Note: this is confusing, but we minus one here due to the fact that the + // witness values have not taken into account that zero is taken up by the zero_idx + for (size_t i = 0; i < num_inner_public_inputs; ++i) { + witness[inner_public_inputs[i] - 1] = inner_public_input_values[i]; + } witness_offset = key_indices_start_idx + key_witnesses.size(); circuit_idx++; } - std::vector public_inputs(output_aggregation_object.begin(), output_aggregation_object.end()); - acir_format constraint_system{ .varnum = static_cast(witness.size() + 1), - .public_inputs = public_inputs, + .public_inputs = {}, .logic_constraints = {}, .range_constraints = {}, .sha256_constraints = {}, diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/acir_composer.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/acir_composer.cpp index e9b2753ca5f..2901784eefe 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/acir_composer.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/acir_composer.cpp @@ -9,6 +9,7 @@ #include "barretenberg/plonk/proof_system/verification_key/sol_gen.hpp" #include "barretenberg/plonk/proof_system/verification_key/verification_key.hpp" #include "barretenberg/srs/factories/crs_factory.hpp" +#include "contract.hpp" namespace acir_proofs { @@ -130,6 +131,16 @@ bool AcirComposer::verify_proof(std::vector const& proof, bool is_recur // Hack. Shouldn't need to do this. 2144 is size with no public inputs. builder_.public_inputs.resize((proof.size() - 2144) / 32); + // TODO: We could get rid of this, if we made the Noir program specify whether something should be + // TODO: created with the recursive setting or not. ie: + // + // #[recursive_friendly] + // fn main() {} + // would put in the ACIR that we want this to be recursion friendly with a flag maybe and the backend + // would set the is_recursive flag to be true. + // This would eliminate the need for nargo to have a --recursive flag + // + // End result is that we may just be able to get it off of builder_, like builder_.is_recursive_friendly if (is_recursive) { auto verifier = composer.create_verifier(builder_); return verifier.verify_proof({ proof }); @@ -148,10 +159,12 @@ std::string AcirComposer::get_solidity_verifier() { std::ostringstream stream; output_vk_sol(stream, verification_key_, "UltraVerificationKey"); - return stream.str(); + return stream.str() + CONTRACT_SOURCE; } /** + * TODO: We should change this to return a proof without public inputs, since that is what std::verify_proof + * TODO: takes. * @brief Takes in a proof buffer and converts into a vector of field elements. * The Recursion opcode requires the proof serialized as a vector of witnesses. * Use this method to get the witness values! diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/contract.hpp b/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/contract.hpp new file mode 100644 index 00000000000..a40c775ab4d --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/contract.hpp @@ -0,0 +1,2583 @@ +#pragma once +#include + +// Source code for the Ultraplonk Solidity verifier. +// It's expected that the AcirComposer will inject a library which will load the verification key into memory. + +const std::string CONTRACT_SOURCE = R"( +/** + * @title Ultra Plonk proof verification contract + * @dev Top level Plonk proof verification contract, which allows Plonk proof to be verified + */ +abstract contract BaseUltraVerifier { + // VERIFICATION KEY MEMORY LOCATIONS + uint256 internal constant N_LOC = 0x380; + uint256 internal constant NUM_INPUTS_LOC = 0x3a0; + uint256 internal constant OMEGA_LOC = 0x3c0; + uint256 internal constant DOMAIN_INVERSE_LOC = 0x3e0; + uint256 internal constant Q1_X_LOC = 0x400; + uint256 internal constant Q1_Y_LOC = 0x420; + uint256 internal constant Q2_X_LOC = 0x440; + uint256 internal constant Q2_Y_LOC = 0x460; + uint256 internal constant Q3_X_LOC = 0x480; + uint256 internal constant Q3_Y_LOC = 0x4a0; + uint256 internal constant Q4_X_LOC = 0x4c0; + uint256 internal constant Q4_Y_LOC = 0x4e0; + uint256 internal constant QM_X_LOC = 0x500; + uint256 internal constant QM_Y_LOC = 0x520; + uint256 internal constant QC_X_LOC = 0x540; + uint256 internal constant QC_Y_LOC = 0x560; + uint256 internal constant QARITH_X_LOC = 0x580; + uint256 internal constant QARITH_Y_LOC = 0x5a0; + uint256 internal constant QSORT_X_LOC = 0x5c0; + uint256 internal constant QSORT_Y_LOC = 0x5e0; + uint256 internal constant QELLIPTIC_X_LOC = 0x600; + uint256 internal constant QELLIPTIC_Y_LOC = 0x620; + uint256 internal constant QAUX_X_LOC = 0x640; + uint256 internal constant QAUX_Y_LOC = 0x660; + uint256 internal constant SIGMA1_X_LOC = 0x680; + uint256 internal constant SIGMA1_Y_LOC = 0x6a0; + uint256 internal constant SIGMA2_X_LOC = 0x6c0; + uint256 internal constant SIGMA2_Y_LOC = 0x6e0; + uint256 internal constant SIGMA3_X_LOC = 0x700; + uint256 internal constant SIGMA3_Y_LOC = 0x720; + uint256 internal constant SIGMA4_X_LOC = 0x740; + uint256 internal constant SIGMA4_Y_LOC = 0x760; + uint256 internal constant TABLE1_X_LOC = 0x780; + uint256 internal constant TABLE1_Y_LOC = 0x7a0; + uint256 internal constant TABLE2_X_LOC = 0x7c0; + uint256 internal constant TABLE2_Y_LOC = 0x7e0; + uint256 internal constant TABLE3_X_LOC = 0x800; + uint256 internal constant TABLE3_Y_LOC = 0x820; + uint256 internal constant TABLE4_X_LOC = 0x840; + uint256 internal constant TABLE4_Y_LOC = 0x860; + uint256 internal constant TABLE_TYPE_X_LOC = 0x880; + uint256 internal constant TABLE_TYPE_Y_LOC = 0x8a0; + uint256 internal constant ID1_X_LOC = 0x8c0; + uint256 internal constant ID1_Y_LOC = 0x8e0; + uint256 internal constant ID2_X_LOC = 0x900; + uint256 internal constant ID2_Y_LOC = 0x920; + uint256 internal constant ID3_X_LOC = 0x940; + uint256 internal constant ID3_Y_LOC = 0x960; + uint256 internal constant ID4_X_LOC = 0x980; + uint256 internal constant ID4_Y_LOC = 0x9a0; + uint256 internal constant CONTAINS_RECURSIVE_PROOF_LOC = 0x9c0; + uint256 internal constant RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC = 0x9e0; + uint256 internal constant G2X_X0_LOC = 0xa00; + uint256 internal constant G2X_X1_LOC = 0xa20; + uint256 internal constant G2X_Y0_LOC = 0xa40; + uint256 internal constant G2X_Y1_LOC = 0xa60; + + // ### PROOF DATA MEMORY LOCATIONS + uint256 internal constant W1_X_LOC = 0x1200; + uint256 internal constant W1_Y_LOC = 0x1220; + uint256 internal constant W2_X_LOC = 0x1240; + uint256 internal constant W2_Y_LOC = 0x1260; + uint256 internal constant W3_X_LOC = 0x1280; + uint256 internal constant W3_Y_LOC = 0x12a0; + uint256 internal constant W4_X_LOC = 0x12c0; + uint256 internal constant W4_Y_LOC = 0x12e0; + uint256 internal constant S_X_LOC = 0x1300; + uint256 internal constant S_Y_LOC = 0x1320; + uint256 internal constant Z_X_LOC = 0x1340; + uint256 internal constant Z_Y_LOC = 0x1360; + uint256 internal constant Z_LOOKUP_X_LOC = 0x1380; + uint256 internal constant Z_LOOKUP_Y_LOC = 0x13a0; + uint256 internal constant T1_X_LOC = 0x13c0; + uint256 internal constant T1_Y_LOC = 0x13e0; + uint256 internal constant T2_X_LOC = 0x1400; + uint256 internal constant T2_Y_LOC = 0x1420; + uint256 internal constant T3_X_LOC = 0x1440; + uint256 internal constant T3_Y_LOC = 0x1460; + uint256 internal constant T4_X_LOC = 0x1480; + uint256 internal constant T4_Y_LOC = 0x14a0; + + uint256 internal constant W1_EVAL_LOC = 0x1600; + uint256 internal constant W2_EVAL_LOC = 0x1620; + uint256 internal constant W3_EVAL_LOC = 0x1640; + uint256 internal constant W4_EVAL_LOC = 0x1660; + uint256 internal constant S_EVAL_LOC = 0x1680; + uint256 internal constant Z_EVAL_LOC = 0x16a0; + uint256 internal constant Z_LOOKUP_EVAL_LOC = 0x16c0; + uint256 internal constant Q1_EVAL_LOC = 0x16e0; + uint256 internal constant Q2_EVAL_LOC = 0x1700; + uint256 internal constant Q3_EVAL_LOC = 0x1720; + uint256 internal constant Q4_EVAL_LOC = 0x1740; + uint256 internal constant QM_EVAL_LOC = 0x1760; + uint256 internal constant QC_EVAL_LOC = 0x1780; + uint256 internal constant QARITH_EVAL_LOC = 0x17a0; + uint256 internal constant QSORT_EVAL_LOC = 0x17c0; + uint256 internal constant QELLIPTIC_EVAL_LOC = 0x17e0; + uint256 internal constant QAUX_EVAL_LOC = 0x1800; + uint256 internal constant TABLE1_EVAL_LOC = 0x1840; + uint256 internal constant TABLE2_EVAL_LOC = 0x1860; + uint256 internal constant TABLE3_EVAL_LOC = 0x1880; + uint256 internal constant TABLE4_EVAL_LOC = 0x18a0; + uint256 internal constant TABLE_TYPE_EVAL_LOC = 0x18c0; + uint256 internal constant ID1_EVAL_LOC = 0x18e0; + uint256 internal constant ID2_EVAL_LOC = 0x1900; + uint256 internal constant ID3_EVAL_LOC = 0x1920; + uint256 internal constant ID4_EVAL_LOC = 0x1940; + uint256 internal constant SIGMA1_EVAL_LOC = 0x1960; + uint256 internal constant SIGMA2_EVAL_LOC = 0x1980; + uint256 internal constant SIGMA3_EVAL_LOC = 0x19a0; + uint256 internal constant SIGMA4_EVAL_LOC = 0x19c0; + uint256 internal constant W1_OMEGA_EVAL_LOC = 0x19e0; + uint256 internal constant W2_OMEGA_EVAL_LOC = 0x2000; + uint256 internal constant W3_OMEGA_EVAL_LOC = 0x2020; + uint256 internal constant W4_OMEGA_EVAL_LOC = 0x2040; + uint256 internal constant S_OMEGA_EVAL_LOC = 0x2060; + uint256 internal constant Z_OMEGA_EVAL_LOC = 0x2080; + uint256 internal constant Z_LOOKUP_OMEGA_EVAL_LOC = 0x20a0; + uint256 internal constant TABLE1_OMEGA_EVAL_LOC = 0x20c0; + uint256 internal constant TABLE2_OMEGA_EVAL_LOC = 0x20e0; + uint256 internal constant TABLE3_OMEGA_EVAL_LOC = 0x2100; + uint256 internal constant TABLE4_OMEGA_EVAL_LOC = 0x2120; + + uint256 internal constant PI_Z_X_LOC = 0x2300; + uint256 internal constant PI_Z_Y_LOC = 0x2320; + uint256 internal constant PI_Z_OMEGA_X_LOC = 0x2340; + uint256 internal constant PI_Z_OMEGA_Y_LOC = 0x2360; + + // Used for elliptic widget. These are alias names for wire + shifted wire evaluations + uint256 internal constant X1_EVAL_LOC = W2_EVAL_LOC; + uint256 internal constant X2_EVAL_LOC = W1_OMEGA_EVAL_LOC; + uint256 internal constant X3_EVAL_LOC = W2_OMEGA_EVAL_LOC; + uint256 internal constant Y1_EVAL_LOC = W3_EVAL_LOC; + uint256 internal constant Y2_EVAL_LOC = W4_OMEGA_EVAL_LOC; + uint256 internal constant Y3_EVAL_LOC = W3_OMEGA_EVAL_LOC; + uint256 internal constant QBETA_LOC = Q3_EVAL_LOC; + uint256 internal constant QBETA_SQR_LOC = Q4_EVAL_LOC; + uint256 internal constant QSIGN_LOC = Q1_EVAL_LOC; + + // ### CHALLENGES MEMORY OFFSETS + + uint256 internal constant C_BETA_LOC = 0x2600; + uint256 internal constant C_GAMMA_LOC = 0x2620; + uint256 internal constant C_ALPHA_LOC = 0x2640; + uint256 internal constant C_ETA_LOC = 0x2660; + uint256 internal constant C_ETA_SQR_LOC = 0x2680; + uint256 internal constant C_ETA_CUBE_LOC = 0x26a0; + + uint256 internal constant C_ZETA_LOC = 0x26c0; + uint256 internal constant C_CURRENT_LOC = 0x26e0; + uint256 internal constant C_V0_LOC = 0x2700; + uint256 internal constant C_V1_LOC = 0x2720; + uint256 internal constant C_V2_LOC = 0x2740; + uint256 internal constant C_V3_LOC = 0x2760; + uint256 internal constant C_V4_LOC = 0x2780; + uint256 internal constant C_V5_LOC = 0x27a0; + uint256 internal constant C_V6_LOC = 0x27c0; + uint256 internal constant C_V7_LOC = 0x27e0; + uint256 internal constant C_V8_LOC = 0x2800; + uint256 internal constant C_V9_LOC = 0x2820; + uint256 internal constant C_V10_LOC = 0x2840; + uint256 internal constant C_V11_LOC = 0x2860; + uint256 internal constant C_V12_LOC = 0x2880; + uint256 internal constant C_V13_LOC = 0x28a0; + uint256 internal constant C_V14_LOC = 0x28c0; + uint256 internal constant C_V15_LOC = 0x28e0; + uint256 internal constant C_V16_LOC = 0x2900; + uint256 internal constant C_V17_LOC = 0x2920; + uint256 internal constant C_V18_LOC = 0x2940; + uint256 internal constant C_V19_LOC = 0x2960; + uint256 internal constant C_V20_LOC = 0x2980; + uint256 internal constant C_V21_LOC = 0x29a0; + uint256 internal constant C_V22_LOC = 0x29c0; + uint256 internal constant C_V23_LOC = 0x29e0; + uint256 internal constant C_V24_LOC = 0x2a00; + uint256 internal constant C_V25_LOC = 0x2a20; + uint256 internal constant C_V26_LOC = 0x2a40; + uint256 internal constant C_V27_LOC = 0x2a60; + uint256 internal constant C_V28_LOC = 0x2a80; + uint256 internal constant C_V29_LOC = 0x2aa0; + uint256 internal constant C_V30_LOC = 0x2ac0; + + uint256 internal constant C_U_LOC = 0x2b00; + + // ### LOCAL VARIABLES MEMORY OFFSETS + uint256 internal constant DELTA_NUMERATOR_LOC = 0x3000; + uint256 internal constant DELTA_DENOMINATOR_LOC = 0x3020; + uint256 internal constant ZETA_POW_N_LOC = 0x3040; + uint256 internal constant PUBLIC_INPUT_DELTA_LOC = 0x3060; + uint256 internal constant ZERO_POLY_LOC = 0x3080; + uint256 internal constant L_START_LOC = 0x30a0; + uint256 internal constant L_END_LOC = 0x30c0; + uint256 internal constant R_ZERO_EVAL_LOC = 0x30e0; + + uint256 internal constant PLOOKUP_DELTA_NUMERATOR_LOC = 0x3100; + uint256 internal constant PLOOKUP_DELTA_DENOMINATOR_LOC = 0x3120; + uint256 internal constant PLOOKUP_DELTA_LOC = 0x3140; + + uint256 internal constant ACCUMULATOR_X_LOC = 0x3160; + uint256 internal constant ACCUMULATOR_Y_LOC = 0x3180; + uint256 internal constant ACCUMULATOR2_X_LOC = 0x31a0; + uint256 internal constant ACCUMULATOR2_Y_LOC = 0x31c0; + uint256 internal constant PAIRING_LHS_X_LOC = 0x31e0; + uint256 internal constant PAIRING_LHS_Y_LOC = 0x3200; + uint256 internal constant PAIRING_RHS_X_LOC = 0x3220; + uint256 internal constant PAIRING_RHS_Y_LOC = 0x3240; + + // ### SUCCESS FLAG MEMORY LOCATIONS + uint256 internal constant GRAND_PRODUCT_SUCCESS_FLAG = 0x3300; + uint256 internal constant ARITHMETIC_TERM_SUCCESS_FLAG = 0x3020; + uint256 internal constant BATCH_OPENING_SUCCESS_FLAG = 0x3340; + uint256 internal constant OPENING_COMMITMENT_SUCCESS_FLAG = 0x3360; + uint256 internal constant PAIRING_PREAMBLE_SUCCESS_FLAG = 0x3380; + uint256 internal constant PAIRING_SUCCESS_FLAG = 0x33a0; + uint256 internal constant RESULT_FLAG = 0x33c0; + + // misc stuff + uint256 internal constant OMEGA_INVERSE_LOC = 0x3400; + uint256 internal constant C_ALPHA_SQR_LOC = 0x3420; + uint256 internal constant C_ALPHA_CUBE_LOC = 0x3440; + uint256 internal constant C_ALPHA_QUAD_LOC = 0x3460; + uint256 internal constant C_ALPHA_BASE_LOC = 0x3480; + + // ### RECURSION VARIABLE MEMORY LOCATIONS + uint256 internal constant RECURSIVE_P1_X_LOC = 0x3500; + uint256 internal constant RECURSIVE_P1_Y_LOC = 0x3520; + uint256 internal constant RECURSIVE_P2_X_LOC = 0x3540; + uint256 internal constant RECURSIVE_P2_Y_LOC = 0x3560; + + uint256 internal constant PUBLIC_INPUTS_HASH_LOCATION = 0x3580; + + // sub-identity storage + uint256 internal constant PERMUTATION_IDENTITY = 0x3600; + uint256 internal constant PLOOKUP_IDENTITY = 0x3620; + uint256 internal constant ARITHMETIC_IDENTITY = 0x3640; + uint256 internal constant SORT_IDENTITY = 0x3660; + uint256 internal constant ELLIPTIC_IDENTITY = 0x3680; + uint256 internal constant AUX_IDENTITY = 0x36a0; + uint256 internal constant AUX_NON_NATIVE_FIELD_EVALUATION = 0x36c0; + uint256 internal constant AUX_LIMB_ACCUMULATOR_EVALUATION = 0x36e0; + uint256 internal constant AUX_RAM_CONSISTENCY_EVALUATION = 0x3700; + uint256 internal constant AUX_ROM_CONSISTENCY_EVALUATION = 0x3720; + uint256 internal constant AUX_MEMORY_EVALUATION = 0x3740; + + uint256 internal constant QUOTIENT_EVAL_LOC = 0x3760; + uint256 internal constant ZERO_POLY_INVERSE_LOC = 0x3780; + + // when hashing public inputs we use memory at NU_CHALLENGE_INPUT_LOC_A, as the hash input size is unknown at compile time + uint256 internal constant NU_CHALLENGE_INPUT_LOC_A = 0x37a0; + uint256 internal constant NU_CHALLENGE_INPUT_LOC_B = 0x37c0; + uint256 internal constant NU_CHALLENGE_INPUT_LOC_C = 0x37e0; + + bytes4 internal constant PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR = 0xeba9f4a6; + bytes4 internal constant PUBLIC_INPUT_GE_P_SELECTOR = 0x374a972f; + bytes4 internal constant MOD_EXP_FAILURE_SELECTOR = 0xf894a7bc; + bytes4 internal constant EC_SCALAR_MUL_FAILURE_SELECTOR = 0xf755f369; + bytes4 internal constant PROOF_FAILURE_SELECTOR = 0x0711fcec; + + uint256 internal constant ETA_INPUT_LENGTH = 0xc0; // W1, W2, W3 = 6 * 0x20 bytes + + // We need to hash 41 field elements when generating the NU challenge + // w1, w2, w3, w4, s, z, z_lookup, q1, q2, q3, q4, qm, qc, qarith (14) + // qsort, qelliptic, qaux, sigma1, sigma2, sigma, sigma4, (7) + // table1, table2, table3, table4, tabletype, id1, id2, id3, id4, (9) + // w1_omega, w2_omega, w3_omega, w4_omega, s_omega, z_omega, z_lookup_omega, (7) + // table1_omega, table2_omega, table3_omega, table4_omega (4) + uint256 internal constant NU_INPUT_LENGTH = 0x520; // 0x520 = 41 * 0x20 + + // There are ELEVEN G1 group elements added into the transcript in the `beta` round, that we need to skip over + // W1, W2, W3, W4, S, Z, Z_LOOKUP, T1, T2, T3, T4 + uint256 internal constant NU_CALLDATA_SKIP_LENGTH = 0x2c0; // 11 * 0x40 = 0x2c0 + + uint256 internal constant NEGATIVE_INVERSE_OF_2_MODULO_P = + 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000; + uint256 internal constant LIMB_SIZE = 0x100000000000000000; // 2<<68 + uint256 internal constant SUBLIMB_SHIFT = 0x4000; // 2<<14 + + // y^2 = x^3 + ax + b + // for Grumpkin, a = 0 and b = -17. We use b in a custom gate relation that evaluates elliptic curve arithmetic + uint256 internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = 17; + error PUBLIC_INPUT_COUNT_INVALID(uint256 expected, uint256 actual); + error PUBLIC_INPUT_INVALID_BN128_G1_POINT(); + error PUBLIC_INPUT_GE_P(); + error MOD_EXP_FAILURE(); + error EC_SCALAR_MUL_FAILURE(); + error PROOF_FAILURE(); + + function getVerificationKeyHash() public pure virtual returns (bytes32); + + function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure virtual; + + /** + * @notice Verify a Ultra Plonk proof + * @param _proof - The serialized proof + * @param _publicInputs - An array of the public inputs + * @return True if proof is valid, reverts otherwise + */ + function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) { + loadVerificationKey(N_LOC, OMEGA_INVERSE_LOC); + + uint256 requiredPublicInputCount; + assembly { + requiredPublicInputCount := mload(NUM_INPUTS_LOC) + } + if (requiredPublicInputCount != _publicInputs.length) { + revert PUBLIC_INPUT_COUNT_INVALID(requiredPublicInputCount, _publicInputs.length); + } + + assembly { + let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // EC group order + let p := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // Prime field order + + /** + * LOAD PROOF FROM CALLDATA + */ + { + let data_ptr := add(calldataload(0x04), 0x24) + + mstore(W1_Y_LOC, mod(calldataload(data_ptr), q)) + mstore(W1_X_LOC, mod(calldataload(add(data_ptr, 0x20)), q)) + + mstore(W2_Y_LOC, mod(calldataload(add(data_ptr, 0x40)), q)) + mstore(W2_X_LOC, mod(calldataload(add(data_ptr, 0x60)), q)) + + mstore(W3_Y_LOC, mod(calldataload(add(data_ptr, 0x80)), q)) + mstore(W3_X_LOC, mod(calldataload(add(data_ptr, 0xa0)), q)) + + mstore(W4_Y_LOC, mod(calldataload(add(data_ptr, 0xc0)), q)) + mstore(W4_X_LOC, mod(calldataload(add(data_ptr, 0xe0)), q)) + + mstore(S_Y_LOC, mod(calldataload(add(data_ptr, 0x100)), q)) + mstore(S_X_LOC, mod(calldataload(add(data_ptr, 0x120)), q)) + mstore(Z_Y_LOC, mod(calldataload(add(data_ptr, 0x140)), q)) + mstore(Z_X_LOC, mod(calldataload(add(data_ptr, 0x160)), q)) + mstore(Z_LOOKUP_Y_LOC, mod(calldataload(add(data_ptr, 0x180)), q)) + mstore(Z_LOOKUP_X_LOC, mod(calldataload(add(data_ptr, 0x1a0)), q)) + mstore(T1_Y_LOC, mod(calldataload(add(data_ptr, 0x1c0)), q)) + mstore(T1_X_LOC, mod(calldataload(add(data_ptr, 0x1e0)), q)) + + mstore(T2_Y_LOC, mod(calldataload(add(data_ptr, 0x200)), q)) + mstore(T2_X_LOC, mod(calldataload(add(data_ptr, 0x220)), q)) + + mstore(T3_Y_LOC, mod(calldataload(add(data_ptr, 0x240)), q)) + mstore(T3_X_LOC, mod(calldataload(add(data_ptr, 0x260)), q)) + + mstore(T4_Y_LOC, mod(calldataload(add(data_ptr, 0x280)), q)) + mstore(T4_X_LOC, mod(calldataload(add(data_ptr, 0x2a0)), q)) + + mstore(W1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2c0)), p)) + mstore(W2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x2e0)), p)) + mstore(W3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x300)), p)) + mstore(W4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x320)), p)) + mstore(S_EVAL_LOC, mod(calldataload(add(data_ptr, 0x340)), p)) + mstore(Z_EVAL_LOC, mod(calldataload(add(data_ptr, 0x360)), p)) + mstore(Z_LOOKUP_EVAL_LOC, mod(calldataload(add(data_ptr, 0x380)), p)) + mstore(Q1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3a0)), p)) + mstore(Q2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3c0)), p)) + mstore(Q3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x3e0)), p)) + mstore(Q4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x400)), p)) + mstore(QM_EVAL_LOC, mod(calldataload(add(data_ptr, 0x420)), p)) + mstore(QC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x440)), p)) + mstore(QARITH_EVAL_LOC, mod(calldataload(add(data_ptr, 0x460)), p)) + mstore(QSORT_EVAL_LOC, mod(calldataload(add(data_ptr, 0x480)), p)) + mstore(QELLIPTIC_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4a0)), p)) + mstore(QAUX_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4c0)), p)) + + mstore(SIGMA1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x4e0)), p)) + mstore(SIGMA2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x500)), p)) + + mstore(SIGMA3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x520)), p)) + mstore(SIGMA4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x540)), p)) + + mstore(TABLE1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x560)), p)) + mstore(TABLE2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x580)), p)) + mstore(TABLE3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5a0)), p)) + mstore(TABLE4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5c0)), p)) + mstore(TABLE_TYPE_EVAL_LOC, mod(calldataload(add(data_ptr, 0x5e0)), p)) + + mstore(ID1_EVAL_LOC, mod(calldataload(add(data_ptr, 0x600)), p)) + mstore(ID2_EVAL_LOC, mod(calldataload(add(data_ptr, 0x620)), p)) + mstore(ID3_EVAL_LOC, mod(calldataload(add(data_ptr, 0x640)), p)) + mstore(ID4_EVAL_LOC, mod(calldataload(add(data_ptr, 0x660)), p)) + + mstore(W1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x680)), p)) + mstore(W2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6a0)), p)) + mstore(W3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6c0)), p)) + mstore(W4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x6e0)), p)) + mstore(S_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x700)), p)) + + mstore(Z_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x720)), p)) + + mstore(Z_LOOKUP_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x740)), p)) + mstore(TABLE1_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x760)), p)) + mstore(TABLE2_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x780)), p)) + mstore(TABLE3_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7a0)), p)) + mstore(TABLE4_OMEGA_EVAL_LOC, mod(calldataload(add(data_ptr, 0x7c0)), p)) + + mstore(PI_Z_Y_LOC, mod(calldataload(add(data_ptr, 0x7e0)), q)) + mstore(PI_Z_X_LOC, mod(calldataload(add(data_ptr, 0x800)), q)) + + mstore(PI_Z_OMEGA_Y_LOC, mod(calldataload(add(data_ptr, 0x820)), q)) + mstore(PI_Z_OMEGA_X_LOC, mod(calldataload(add(data_ptr, 0x840)), q)) + } + + /** + * LOAD RECURSIVE PROOF INTO MEMORY + */ + { + if mload(CONTAINS_RECURSIVE_PROOF_LOC) { + let public_inputs_ptr := add(calldataload(0x24), 0x24) + let index_counter := add(shl(5, mload(RECURSIVE_PROOF_PUBLIC_INPUT_INDICES_LOC)), public_inputs_ptr) + + let x0 := calldataload(index_counter) + x0 := add(x0, shl(68, calldataload(add(index_counter, 0x20)))) + x0 := add(x0, shl(136, calldataload(add(index_counter, 0x40)))) + x0 := add(x0, shl(204, calldataload(add(index_counter, 0x60)))) + let y0 := calldataload(add(index_counter, 0x80)) + y0 := add(y0, shl(68, calldataload(add(index_counter, 0xa0)))) + y0 := add(y0, shl(136, calldataload(add(index_counter, 0xc0)))) + y0 := add(y0, shl(204, calldataload(add(index_counter, 0xe0)))) + let x1 := calldataload(add(index_counter, 0x100)) + x1 := add(x1, shl(68, calldataload(add(index_counter, 0x120)))) + x1 := add(x1, shl(136, calldataload(add(index_counter, 0x140)))) + x1 := add(x1, shl(204, calldataload(add(index_counter, 0x160)))) + let y1 := calldataload(add(index_counter, 0x180)) + y1 := add(y1, shl(68, calldataload(add(index_counter, 0x1a0)))) + y1 := add(y1, shl(136, calldataload(add(index_counter, 0x1c0)))) + y1 := add(y1, shl(204, calldataload(add(index_counter, 0x1e0)))) + mstore(RECURSIVE_P1_X_LOC, x0) + mstore(RECURSIVE_P1_Y_LOC, y0) + mstore(RECURSIVE_P2_X_LOC, x1) + mstore(RECURSIVE_P2_Y_LOC, y1) + + // validate these are valid bn128 G1 points + if iszero(and(and(lt(x0, q), lt(x1, q)), and(lt(y0, q), lt(y1, q)))) { + mstore(0x00, PUBLIC_INPUT_INVALID_BN128_G1_POINT_SELECTOR) + revert(0x00, 0x04) + } + } + } + + { + /** + * Generate initial challenge + */ + mstore(0x00, shl(224, mload(N_LOC))) + mstore(0x04, shl(224, mload(NUM_INPUTS_LOC))) + let challenge := keccak256(0x00, 0x08) + + /** + * Generate eta challenge + */ + mstore(PUBLIC_INPUTS_HASH_LOCATION, challenge) + // The public input location is stored at 0x24, we then add 0x24 to skip selector and the length of public inputs + let public_inputs_start := add(calldataload(0x24), 0x24) + // copy the public inputs over + let public_input_size := mul(mload(NUM_INPUTS_LOC), 0x20) + calldatacopy(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_inputs_start, public_input_size) + + // copy W1, W2, W3 into challenge. Each point is 0x40 bytes, so load 0xc0 = 3 * 0x40 bytes (ETA input length) + let w_start := add(calldataload(0x04), 0x24) + calldatacopy(add(add(PUBLIC_INPUTS_HASH_LOCATION, 0x20), public_input_size), w_start, ETA_INPUT_LENGTH) + + // Challenge is the old challenge + public inputs + W1, W2, W3 (0x20 + public_input_size + 0xc0) + let challenge_bytes_size := add(0x20, add(public_input_size, ETA_INPUT_LENGTH)) + + challenge := keccak256(PUBLIC_INPUTS_HASH_LOCATION, challenge_bytes_size) + { + let eta := mod(challenge, p) + mstore(C_ETA_LOC, eta) + mstore(C_ETA_SQR_LOC, mulmod(eta, eta, p)) + mstore(C_ETA_CUBE_LOC, mulmod(mload(C_ETA_SQR_LOC), eta, p)) + } + + /** + * Generate beta challenge + */ + mstore(0x00, challenge) + mstore(0x20, mload(W4_Y_LOC)) + mstore(0x40, mload(W4_X_LOC)) + mstore(0x60, mload(S_Y_LOC)) + mstore(0x80, mload(S_X_LOC)) + challenge := keccak256(0x00, 0xa0) + mstore(C_BETA_LOC, mod(challenge, p)) + + /** + * Generate gamma challenge + */ + mstore(0x00, challenge) + mstore8(0x20, 0x01) + challenge := keccak256(0x00, 0x21) + mstore(C_GAMMA_LOC, mod(challenge, p)) + + /** + * Generate alpha challenge + */ + mstore(0x00, challenge) + mstore(0x20, mload(Z_Y_LOC)) + mstore(0x40, mload(Z_X_LOC)) + mstore(0x60, mload(Z_LOOKUP_Y_LOC)) + mstore(0x80, mload(Z_LOOKUP_X_LOC)) + challenge := keccak256(0x00, 0xa0) + mstore(C_ALPHA_LOC, mod(challenge, p)) + + /** + * Compute and store some powers of alpha for future computations + */ + let alpha := mload(C_ALPHA_LOC) + mstore(C_ALPHA_SQR_LOC, mulmod(alpha, alpha, p)) + mstore(C_ALPHA_CUBE_LOC, mulmod(mload(C_ALPHA_SQR_LOC), alpha, p)) + mstore(C_ALPHA_QUAD_LOC, mulmod(mload(C_ALPHA_CUBE_LOC), alpha, p)) + mstore(C_ALPHA_BASE_LOC, alpha) + + /** + * Generate zeta challenge + */ + mstore(0x00, challenge) + mstore(0x20, mload(T1_Y_LOC)) + mstore(0x40, mload(T1_X_LOC)) + mstore(0x60, mload(T2_Y_LOC)) + mstore(0x80, mload(T2_X_LOC)) + mstore(0xa0, mload(T3_Y_LOC)) + mstore(0xc0, mload(T3_X_LOC)) + mstore(0xe0, mload(T4_Y_LOC)) + mstore(0x100, mload(T4_X_LOC)) + + challenge := keccak256(0x00, 0x120) + + mstore(C_ZETA_LOC, mod(challenge, p)) + mstore(C_CURRENT_LOC, challenge) + } + + /** + * EVALUATE FIELD OPERATIONS + */ + + /** + * COMPUTE PUBLIC INPUT DELTA + * ΔPI = ∏ᵢ∈ℓ(wᵢ + β σ(i) + γ) / ∏ᵢ∈ℓ(wᵢ + β σ'(i) + γ) + */ + { + let beta := mload(C_BETA_LOC) // β + let gamma := mload(C_GAMMA_LOC) // γ + let work_root := mload(OMEGA_LOC) // ω + let numerator_value := 1 + let denominator_value := 1 + + let p_clone := p // move p to the front of the stack + let valid_inputs := true + + // Load the starting point of the public inputs (jump over the selector and the length of public inputs [0x24]) + let public_inputs_ptr := add(calldataload(0x24), 0x24) + + // endpoint_ptr = public_inputs_ptr + num_inputs * 0x20. // every public input is 0x20 bytes + let endpoint_ptr := add(public_inputs_ptr, mul(mload(NUM_INPUTS_LOC), 0x20)) + + // root_1 = β * 0x05 + let root_1 := mulmod(beta, 0x05, p_clone) // k1.β + // root_2 = β * 0x0c + let root_2 := mulmod(beta, 0x0c, p_clone) + // @note 0x05 + 0x07 == 0x0c == external coset generator + + for {} lt(public_inputs_ptr, endpoint_ptr) { public_inputs_ptr := add(public_inputs_ptr, 0x20) } { + /** + * input = public_input[i] + * valid_inputs &= input < p + * temp = input + gamma + * numerator_value *= (β.σ(i) + wᵢ + γ) // σ(i) = 0x05.ωⁱ + * denominator_value *= (β.σ'(i) + wᵢ + γ) // σ'(i) = 0x0c.ωⁱ + * root_1 *= ω + * root_2 *= ω + */ + + let input := calldataload(public_inputs_ptr) + valid_inputs := and(valid_inputs, lt(input, p_clone)) + let temp := addmod(input, gamma, p_clone) + + numerator_value := mulmod(numerator_value, add(root_1, temp), p_clone) + denominator_value := mulmod(denominator_value, add(root_2, temp), p_clone) + + root_1 := mulmod(root_1, work_root, p_clone) + root_2 := mulmod(root_2, work_root, p_clone) + } + + // Revert if not all public inputs are field elements (i.e. < p) + if iszero(valid_inputs) { + mstore(0x00, PUBLIC_INPUT_GE_P_SELECTOR) + revert(0x00, 0x04) + } + + mstore(DELTA_NUMERATOR_LOC, numerator_value) + mstore(DELTA_DENOMINATOR_LOC, denominator_value) + } + + /** + * Compute Plookup delta factor [γ(1 + β)]^{n-k} + * k = num roots cut out of Z_H = 4 + */ + { + let delta_base := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p) + let delta_numerator := delta_base + { + let exponent := mload(N_LOC) + let count := 1 + for {} lt(count, exponent) { count := add(count, count) } { + delta_numerator := mulmod(delta_numerator, delta_numerator, p) + } + } + mstore(PLOOKUP_DELTA_NUMERATOR_LOC, delta_numerator) + + let delta_denominator := mulmod(delta_base, delta_base, p) + delta_denominator := mulmod(delta_denominator, delta_denominator, p) + mstore(PLOOKUP_DELTA_DENOMINATOR_LOC, delta_denominator) + } + /** + * Compute lagrange poly and vanishing poly fractions + */ + { + /** + * vanishing_numerator = zeta + * ZETA_POW_N = zeta^n + * vanishing_numerator -= 1 + * accumulating_root = omega_inverse + * work_root = p - accumulating_root + * domain_inverse = domain_inverse + * vanishing_denominator = zeta + work_root + * work_root *= accumulating_root + * vanishing_denominator *= (zeta + work_root) + * work_root *= accumulating_root + * vanishing_denominator *= (zeta + work_root) + * vanishing_denominator *= (zeta + (zeta + accumulating_root)) + * work_root = omega + * lagrange_numerator = vanishing_numerator * domain_inverse + * l_start_denominator = zeta - 1 + * accumulating_root = work_root^2 + * l_end_denominator = accumulating_root^2 * work_root * zeta - 1 + * Note: l_end_denominator term contains a term \omega^5 to cut out 5 roots of unity from vanishing poly + */ + + let zeta := mload(C_ZETA_LOC) + + // compute zeta^n, where n is a power of 2 + let vanishing_numerator := zeta + { + // pow_small + let exponent := mload(N_LOC) + let count := 1 + for {} lt(count, exponent) { count := add(count, count) } { + vanishing_numerator := mulmod(vanishing_numerator, vanishing_numerator, p) + } + } + mstore(ZETA_POW_N_LOC, vanishing_numerator) + vanishing_numerator := addmod(vanishing_numerator, sub(p, 1), p) + + let accumulating_root := mload(OMEGA_INVERSE_LOC) + let work_root := sub(p, accumulating_root) + let domain_inverse := mload(DOMAIN_INVERSE_LOC) + + let vanishing_denominator := addmod(zeta, work_root, p) + work_root := mulmod(work_root, accumulating_root, p) + vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p) + work_root := mulmod(work_root, accumulating_root, p) + vanishing_denominator := mulmod(vanishing_denominator, addmod(zeta, work_root, p), p) + vanishing_denominator := + mulmod(vanishing_denominator, addmod(zeta, mulmod(work_root, accumulating_root, p), p), p) + + work_root := mload(OMEGA_LOC) + + let lagrange_numerator := mulmod(vanishing_numerator, domain_inverse, p) + let l_start_denominator := addmod(zeta, sub(p, 1), p) + + accumulating_root := mulmod(work_root, work_root, p) + + let l_end_denominator := + addmod( + mulmod(mulmod(mulmod(accumulating_root, accumulating_root, p), work_root, p), zeta, p), sub(p, 1), p + ) + + /** + * Compute inversions using Montgomery's batch inversion trick + */ + let accumulator := mload(DELTA_DENOMINATOR_LOC) + let t0 := accumulator + accumulator := mulmod(accumulator, vanishing_denominator, p) + let t1 := accumulator + accumulator := mulmod(accumulator, vanishing_numerator, p) + let t2 := accumulator + accumulator := mulmod(accumulator, l_start_denominator, p) + let t3 := accumulator + accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p) + let t4 := accumulator + { + mstore(0, 0x20) + mstore(0x20, 0x20) + mstore(0x40, 0x20) + mstore(0x60, mulmod(accumulator, l_end_denominator, p)) + mstore(0x80, sub(p, 2)) + mstore(0xa0, p) + if iszero(staticcall(gas(), 0x05, 0x00, 0xc0, 0x00, 0x20)) { + mstore(0x0, MOD_EXP_FAILURE_SELECTOR) + revert(0x00, 0x04) + } + accumulator := mload(0x00) + } + + t4 := mulmod(accumulator, t4, p) + accumulator := mulmod(accumulator, l_end_denominator, p) + + t3 := mulmod(accumulator, t3, p) + accumulator := mulmod(accumulator, mload(PLOOKUP_DELTA_DENOMINATOR_LOC), p) + + t2 := mulmod(accumulator, t2, p) + accumulator := mulmod(accumulator, l_start_denominator, p) + + t1 := mulmod(accumulator, t1, p) + accumulator := mulmod(accumulator, vanishing_numerator, p) + + t0 := mulmod(accumulator, t0, p) + accumulator := mulmod(accumulator, vanishing_denominator, p) + + accumulator := mulmod(mulmod(accumulator, accumulator, p), mload(DELTA_DENOMINATOR_LOC), p) + + mstore(PUBLIC_INPUT_DELTA_LOC, mulmod(mload(DELTA_NUMERATOR_LOC), accumulator, p)) + mstore(ZERO_POLY_LOC, mulmod(vanishing_numerator, t0, p)) + mstore(ZERO_POLY_INVERSE_LOC, mulmod(vanishing_denominator, t1, p)) + mstore(L_START_LOC, mulmod(lagrange_numerator, t2, p)) + mstore(PLOOKUP_DELTA_LOC, mulmod(mload(PLOOKUP_DELTA_NUMERATOR_LOC), t3, p)) + mstore(L_END_LOC, mulmod(lagrange_numerator, t4, p)) + } + + /** + * UltraPlonk Widget Ordering: + * + * 1. Permutation widget + * 2. Plookup widget + * 3. Arithmetic widget + * 4. Fixed base widget (?) + * 5. GenPermSort widget + * 6. Elliptic widget + * 7. Auxiliary widget + */ + + /** + * COMPUTE PERMUTATION WIDGET EVALUATION + */ + { + let alpha := mload(C_ALPHA_LOC) + let beta := mload(C_BETA_LOC) + let gamma := mload(C_GAMMA_LOC) + + /** + * t1 = (W1 + gamma + beta * ID1) * (W2 + gamma + beta * ID2) + * t2 = (W3 + gamma + beta * ID3) * (W4 + gamma + beta * ID4) + * result = alpha_base * z_eval * t1 * t2 + * t1 = (W1 + gamma + beta * sigma_1_eval) * (W2 + gamma + beta * sigma_2_eval) + * t2 = (W2 + gamma + beta * sigma_3_eval) * (W3 + gamma + beta * sigma_4_eval) + * result -= (alpha_base * z_omega_eval * t1 * t2) + */ + let t1 := + mulmod( + add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(ID1_EVAL_LOC), p)), + add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(ID2_EVAL_LOC), p)), + p + ) + let t2 := + mulmod( + add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(ID3_EVAL_LOC), p)), + add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(ID4_EVAL_LOC), p)), + p + ) + let result := mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_EVAL_LOC), mulmod(t1, t2, p), p), p) + t1 := + mulmod( + add(add(mload(W1_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA1_EVAL_LOC), p)), + add(add(mload(W2_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA2_EVAL_LOC), p)), + p + ) + t2 := + mulmod( + add(add(mload(W3_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA3_EVAL_LOC), p)), + add(add(mload(W4_EVAL_LOC), gamma), mulmod(beta, mload(SIGMA4_EVAL_LOC), p)), + p + ) + result := + addmod( + result, + sub(p, mulmod(mload(C_ALPHA_BASE_LOC), mulmod(mload(Z_OMEGA_EVAL_LOC), mulmod(t1, t2, p), p), p)), + p + ) + + /** + * alpha_base *= alpha + * result += alpha_base . (L_{n-k}(ʓ) . (z(ʓ.ω) - ∆_{PI})) + * alpha_base *= alpha + * result += alpha_base . (L_1(ʓ)(Z(ʓ) - 1)) + * alpha_Base *= alpha + */ + mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p)) + result := + addmod( + result, + mulmod( + mload(C_ALPHA_BASE_LOC), + mulmod( + mload(L_END_LOC), + addmod(mload(Z_OMEGA_EVAL_LOC), sub(p, mload(PUBLIC_INPUT_DELTA_LOC)), p), + p + ), + p + ), + p + ) + mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p)) + mstore( + PERMUTATION_IDENTITY, + addmod( + result, + mulmod( + mload(C_ALPHA_BASE_LOC), + mulmod(mload(L_START_LOC), addmod(mload(Z_EVAL_LOC), sub(p, 1), p), p), + p + ), + p + ) + ) + mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p)) + } + + /** + * COMPUTE PLOOKUP WIDGET EVALUATION + */ + { + /** + * Goal: f = (w1(z) + q2.w1(zω)) + η(w2(z) + qm.w2(zω)) + η²(w3(z) + qc.w_3(zω)) + q3(z).η³ + * f = η.q3(z) + * f += (w3(z) + qc.w_3(zω)) + * f *= η + * f += (w2(z) + qm.w2(zω)) + * f *= η + * f += (w1(z) + q2.w1(zω)) + */ + let f := mulmod(mload(C_ETA_LOC), mload(Q3_EVAL_LOC), p) + f := + addmod(f, addmod(mload(W3_EVAL_LOC), mulmod(mload(QC_EVAL_LOC), mload(W3_OMEGA_EVAL_LOC), p), p), p) + f := mulmod(f, mload(C_ETA_LOC), p) + f := + addmod(f, addmod(mload(W2_EVAL_LOC), mulmod(mload(QM_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p), p) + f := mulmod(f, mload(C_ETA_LOC), p) + f := + addmod(f, addmod(mload(W1_EVAL_LOC), mulmod(mload(Q2_EVAL_LOC), mload(W1_OMEGA_EVAL_LOC), p), p), p) + + // t(z) = table4(z).η³ + table3(z).η² + table2(z).η + table1(z) + let t := + addmod( + addmod( + addmod( + mulmod(mload(TABLE4_EVAL_LOC), mload(C_ETA_CUBE_LOC), p), + mulmod(mload(TABLE3_EVAL_LOC), mload(C_ETA_SQR_LOC), p), + p + ), + mulmod(mload(TABLE2_EVAL_LOC), mload(C_ETA_LOC), p), + p + ), + mload(TABLE1_EVAL_LOC), + p + ) + + // t(zw) = table4(zw).η³ + table3(zw).η² + table2(zw).η + table1(zw) + let t_omega := + addmod( + addmod( + addmod( + mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_ETA_CUBE_LOC), p), + mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_ETA_SQR_LOC), p), + p + ), + mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p), + p + ), + mload(TABLE1_OMEGA_EVAL_LOC), + p + ) + + /** + * Goal: numerator = (TABLE_TYPE_EVAL * f(z) + γ) * (t(z) + βt(zω) + γ(β + 1)) * (β + 1) + * gamma_beta_constant = γ(β + 1) + * numerator = f * TABLE_TYPE_EVAL + gamma + * temp0 = t(z) + t(zω) * β + gamma_beta_constant + * numerator *= temp0 + * numerator *= (β + 1) + * temp0 = alpha * l_1 + * numerator += temp0 + * numerator *= z_lookup(z) + * numerator -= temp0 + */ + let gamma_beta_constant := mulmod(mload(C_GAMMA_LOC), addmod(mload(C_BETA_LOC), 1, p), p) + let numerator := addmod(mulmod(f, mload(TABLE_TYPE_EVAL_LOC), p), mload(C_GAMMA_LOC), p) + let temp0 := addmod(addmod(t, mulmod(t_omega, mload(C_BETA_LOC), p), p), gamma_beta_constant, p) + numerator := mulmod(numerator, temp0, p) + numerator := mulmod(numerator, addmod(mload(C_BETA_LOC), 1, p), p) + temp0 := mulmod(mload(C_ALPHA_LOC), mload(L_START_LOC), p) + numerator := addmod(numerator, temp0, p) + numerator := mulmod(numerator, mload(Z_LOOKUP_EVAL_LOC), p) + numerator := addmod(numerator, sub(p, temp0), p) + + /** + * Goal: denominator = z_lookup(zω)*[s(z) + βs(zω) + γ(1 + β)] - [z_lookup(zω) - [γ(1 + β)]^{n-k}]*α²L_end(z) + * note: delta_factor = [γ(1 + β)]^{n-k} + * denominator = s(z) + βs(zω) + γ(β + 1) + * temp1 = α²L_end(z) + * denominator -= temp1 + * denominator *= z_lookup(zω) + * denominator += temp1 * delta_factor + * PLOOKUP_IDENTITY = (numerator - denominator).alpha_base + * alpha_base *= alpha^3 + */ + let denominator := + addmod( + addmod(mload(S_EVAL_LOC), mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_BETA_LOC), p), p), + gamma_beta_constant, + p + ) + let temp1 := mulmod(mload(C_ALPHA_SQR_LOC), mload(L_END_LOC), p) + denominator := addmod(denominator, sub(p, temp1), p) + denominator := mulmod(denominator, mload(Z_LOOKUP_OMEGA_EVAL_LOC), p) + denominator := addmod(denominator, mulmod(temp1, mload(PLOOKUP_DELTA_LOC), p), p) + + mstore(PLOOKUP_IDENTITY, mulmod(addmod(numerator, sub(p, denominator), p), mload(C_ALPHA_BASE_LOC), p)) + + // update alpha + mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p)) + } + + /** + * COMPUTE ARITHMETIC WIDGET EVALUATION + */ + { + /** + * The basic arithmetic gate identity in standard plonk is as follows. + * (w_1 . w_2 . q_m) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c = 0 + * However, for Ultraplonk, we extend this to support "passing" wires between rows (shown without alpha scaling below): + * q_arith * ( ( (-1/2) * (q_arith - 3) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c ) + + * (q_arith - 1)*( α * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + w_4_omega) ) = 0 + * + * This formula results in several cases depending on q_arith: + * 1. q_arith == 0: Arithmetic gate is completely disabled + * + * 2. q_arith == 1: Everything in the minigate on the right is disabled. The equation is just a standard plonk equation + * with extra wires: q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c = 0 + * + * 3. q_arith == 2: The (w_1 + w_4 - ...) term is disabled. THe equation is: + * (1/2) * q_m * w_1 * w_2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + w_4_omega = 0 + * It allows defining w_4 at next index (w_4_omega) in terms of current wire values + * + * 4. q_arith == 3: The product of w_1 and w_2 is disabled, but a mini addition gate is enabled. α allows us to split + * the equation into two: + * + * q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + 2 * w_4_omega = 0 + * and + * w_1 + w_4 - w_1_omega + q_m = 0 (we are reusing q_m here) + * + * 5. q_arith > 3: The product of w_1 and w_2 is scaled by (q_arith - 3), while the w_4_omega term is scaled by (q_arith - 1). + * The equation can be split into two: + * + * (q_arith - 3)* q_m * w_1 * w_ 2 + q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 + q_c + (q_arith - 1) * w_4_omega = 0 + * and + * w_1 + w_4 - w_1_omega + q_m = 0 + * + * The problem that q_m is used both in both equations can be dealt with by appropriately changing selector values at + * the next gate. Then we can treat (q_arith - 1) as a simulated q_6 selector and scale q_m to handle (q_arith - 3) at + * product. + */ + + let w1q1 := mulmod(mload(W1_EVAL_LOC), mload(Q1_EVAL_LOC), p) + let w2q2 := mulmod(mload(W2_EVAL_LOC), mload(Q2_EVAL_LOC), p) + let w3q3 := mulmod(mload(W3_EVAL_LOC), mload(Q3_EVAL_LOC), p) + let w4q3 := mulmod(mload(W4_EVAL_LOC), mload(Q4_EVAL_LOC), p) + + // @todo - Add a explicit test that hits QARITH == 3 + // w1w2qm := (w_1 . w_2 . q_m . (QARITH_EVAL_LOC - 3)) / 2 + let w1w2qm := + mulmod( + mulmod( + mulmod(mulmod(mload(W1_EVAL_LOC), mload(W2_EVAL_LOC), p), mload(QM_EVAL_LOC), p), + addmod(mload(QARITH_EVAL_LOC), sub(p, 3), p), + p + ), + NEGATIVE_INVERSE_OF_2_MODULO_P, + p + ) + + // (w_1 . w_2 . q_m . (q_arith - 3)) / -2) + (w_1 . q_1) + (w_2 . q_2) + (w_3 . q_3) + (w_4 . q_4) + q_c + let identity := + addmod( + mload(QC_EVAL_LOC), addmod(w4q3, addmod(w3q3, addmod(w2q2, addmod(w1q1, w1w2qm, p), p), p), p), p + ) + + // if q_arith == 3 we evaluate an additional mini addition gate (on top of the regular one), where: + // w_1 + w_4 - w_1_omega + q_m = 0 + // we use this gate to save an addition gate when adding or subtracting non-native field elements + // α * (q_arith - 2) * (w_1 + w_4 - w_1_omega + q_m) + let extra_small_addition_gate_identity := + mulmod( + mload(C_ALPHA_LOC), + mulmod( + addmod(mload(QARITH_EVAL_LOC), sub(p, 2), p), + addmod( + mload(QM_EVAL_LOC), + addmod( + sub(p, mload(W1_OMEGA_EVAL_LOC)), addmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), p + ), + p + ), + p + ), + p + ) + + // if q_arith == 2 OR q_arith == 3 we add the 4th wire of the NEXT gate into the arithmetic identity + // N.B. if q_arith > 2, this wire value will be scaled by (q_arith - 1) relative to the other gate wires! + // alpha_base * q_arith * (identity + (q_arith - 1) * (w_4_omega + extra_small_addition_gate_identity)) + mstore( + ARITHMETIC_IDENTITY, + mulmod( + mload(C_ALPHA_BASE_LOC), + mulmod( + mload(QARITH_EVAL_LOC), + addmod( + identity, + mulmod( + addmod(mload(QARITH_EVAL_LOC), sub(p, 1), p), + addmod(mload(W4_OMEGA_EVAL_LOC), extra_small_addition_gate_identity, p), + p + ), + p + ), + p + ), + p + ) + ) + + // update alpha + mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p)) + } + + /** + * COMPUTE GENPERMSORT WIDGET EVALUATION + */ + { + /** + * D1 = (w2 - w1) + * D2 = (w3 - w2) + * D3 = (w4 - w3) + * D4 = (w1_omega - w4) + * + * α_a = alpha_base + * α_b = alpha_base * α + * α_c = alpha_base * α^2 + * α_d = alpha_base * α^3 + * + * range_accumulator = ( + * D1(D1 - 1)(D1 - 2)(D1 - 3).α_a + + * D2(D2 - 1)(D2 - 2)(D2 - 3).α_b + + * D3(D3 - 1)(D3 - 2)(D3 - 3).α_c + + * D4(D4 - 1)(D4 - 2)(D4 - 3).α_d + + * ) . q_sort + */ + let minus_two := sub(p, 2) + let minus_three := sub(p, 3) + let d1 := addmod(mload(W2_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p) + let d2 := addmod(mload(W3_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p) + let d3 := addmod(mload(W4_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p) + let d4 := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p) + + let range_accumulator := + mulmod( + mulmod( + mulmod(addmod(mulmod(d1, d1, p), sub(p, d1), p), addmod(d1, minus_two, p), p), + addmod(d1, minus_three, p), + p + ), + mload(C_ALPHA_BASE_LOC), + p + ) + range_accumulator := + addmod( + range_accumulator, + mulmod( + mulmod( + mulmod(addmod(mulmod(d2, d2, p), sub(p, d2), p), addmod(d2, minus_two, p), p), + addmod(d2, minus_three, p), + p + ), + mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), + p + ), + p + ) + range_accumulator := + addmod( + range_accumulator, + mulmod( + mulmod( + mulmod(addmod(mulmod(d3, d3, p), sub(p, d3), p), addmod(d3, minus_two, p), p), + addmod(d3, minus_three, p), + p + ), + mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_SQR_LOC), p), + p + ), + p + ) + range_accumulator := + addmod( + range_accumulator, + mulmod( + mulmod( + mulmod(addmod(mulmod(d4, d4, p), sub(p, d4), p), addmod(d4, minus_two, p), p), + addmod(d4, minus_three, p), + p + ), + mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p), + p + ), + p + ) + range_accumulator := mulmod(range_accumulator, mload(QSORT_EVAL_LOC), p) + + mstore(SORT_IDENTITY, range_accumulator) + + // update alpha + mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p)) + } + + /** + * COMPUTE ELLIPTIC WIDGET EVALUATION + */ + { + /** + * endo_term = (-x_2) * x_1 * (x_3 * 2 + x_1) * q_beta + * endo_sqr_term = x_2^2 + * endo_sqr_term *= (x_3 - x_1) + * endo_sqr_term *= q_beta^2 + * leftovers = x_2^2 + * leftovers *= x_2 + * leftovers += x_1^2 * (x_3 + x_1) @follow-up Invalid comment in BB widget + * leftovers -= (y_2^2 + y_1^2) + * sign_term = y_2 * y_1 + * sign_term += sign_term + * sign_term *= q_sign + */ + // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0 + let x_diff := addmod(mload(X2_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p) + let y2_sqr := mulmod(mload(Y2_EVAL_LOC), mload(Y2_EVAL_LOC), p) + let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p) + let y1y2 := mulmod(mulmod(mload(Y1_EVAL_LOC), mload(Y2_EVAL_LOC), p), mload(QSIGN_LOC), p) + + let x_add_identity := + addmod( + mulmod( + addmod(mload(X3_EVAL_LOC), addmod(mload(X2_EVAL_LOC), mload(X1_EVAL_LOC), p), p), + mulmod(x_diff, x_diff, p), + p + ), + addmod( + sub( + p, + addmod(y2_sqr, y1_sqr, p) + ), + addmod(y1y2, y1y2, p), + p + ), + p + ) + x_add_identity := + mulmod( + mulmod( + x_add_identity, + addmod( + 1, + sub(p, mload(QM_EVAL_LOC)), + p + ), + p + ), + mload(C_ALPHA_BASE_LOC), + p + ) + + // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0 + let y1_plus_y3 := addmod( + mload(Y1_EVAL_LOC), + mload(Y3_EVAL_LOC), + p + ) + let y_diff := addmod(mulmod(mload(Y2_EVAL_LOC), mload(QSIGN_LOC), p), sub(p, mload(Y1_EVAL_LOC)), p) + let y_add_identity := + addmod( + mulmod(y1_plus_y3, x_diff, p), + mulmod(addmod(mload(X3_EVAL_LOC), sub(p, mload(X1_EVAL_LOC)), p), y_diff, p), + p + ) + y_add_identity := + mulmod( + mulmod(y_add_identity, addmod(1, sub(p, mload(QM_EVAL_LOC)), p), p), + mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), + p + ) + + // ELLIPTIC_IDENTITY = (x_identity + y_identity) * Q_ELLIPTIC_EVAL + mstore( + ELLIPTIC_IDENTITY, mulmod(addmod(x_add_identity, y_add_identity, p), mload(QELLIPTIC_EVAL_LOC), p) + ) + } + { + /** + * x_pow_4 = (y_1_sqr - curve_b) * x_1; + * y_1_sqr_mul_4 = y_1_sqr + y_1_sqr; + * y_1_sqr_mul_4 += y_1_sqr_mul_4; + * x_1_pow_4_mul_9 = x_pow_4; + * x_1_pow_4_mul_9 += x_1_pow_4_mul_9; + * x_1_pow_4_mul_9 += x_1_pow_4_mul_9; + * x_1_pow_4_mul_9 += x_1_pow_4_mul_9; + * x_1_pow_4_mul_9 += x_pow_4; + * x_1_sqr_mul_3 = x_1_sqr + x_1_sqr + x_1_sqr; + * x_double_identity = (x_3 + x_1 + x_1) * y_1_sqr_mul_4 - x_1_pow_4_mul_9; + * y_double_identity = x_1_sqr_mul_3 * (x_1 - x_3) - (y_1 + y_1) * (y_1 + y_3); + */ + // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0 + let x1_sqr := mulmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p) + let y1_sqr := mulmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p) + let x_pow_4 := mulmod(addmod(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED, p), mload(X1_EVAL_LOC), p) + let y1_sqr_mul_4 := mulmod(y1_sqr, 4, p) + let x1_pow_4_mul_9 := mulmod(x_pow_4, 9, p) + let x1_sqr_mul_3 := mulmod(x1_sqr, 3, p) + let x_double_identity := + addmod( + mulmod( + addmod(mload(X3_EVAL_LOC), addmod(mload(X1_EVAL_LOC), mload(X1_EVAL_LOC), p), p), + y1_sqr_mul_4, + p + ), + sub(p, x1_pow_4_mul_9), + p + ) + // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0 + let y_double_identity := + addmod( + mulmod(x1_sqr_mul_3, addmod(mload(X1_EVAL_LOC), sub(p, mload(X3_EVAL_LOC)), p), p), + sub( + p, + mulmod( + addmod(mload(Y1_EVAL_LOC), mload(Y1_EVAL_LOC), p), + addmod(mload(Y1_EVAL_LOC), mload(Y3_EVAL_LOC), p), + p + ) + ), + p + ) + x_double_identity := mulmod(x_double_identity, mload(C_ALPHA_BASE_LOC), p) + y_double_identity := + mulmod(y_double_identity, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_LOC), p), p) + x_double_identity := mulmod(x_double_identity, mload(QM_EVAL_LOC), p) + y_double_identity := mulmod(y_double_identity, mload(QM_EVAL_LOC), p) + // ELLIPTIC_IDENTITY += (x_double_identity + y_double_identity) * Q_DOUBLE_EVAL + mstore( + ELLIPTIC_IDENTITY, + addmod( + mload(ELLIPTIC_IDENTITY), + mulmod(addmod(x_double_identity, y_double_identity, p), mload(QELLIPTIC_EVAL_LOC), p), + p + ) + ) + + // update alpha + mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_QUAD_LOC), p)) + } + + /** + * COMPUTE AUXILIARY WIDGET EVALUATION + */ + { + { + /** + * Non native field arithmetic gate 2 + * _ _ + * / _ _ _ 14 \ + * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 | + * \_ _/ + * + * limb_subproduct = w_1 . w_2_omega + w_1_omega . w_2 + * non_native_field_gate_2 = w_1 * w_4 + w_4 * w_3 - w_3_omega + * non_native_field_gate_2 = non_native_field_gate_2 * limb_size + * non_native_field_gate_2 -= w_4_omega + * non_native_field_gate_2 += limb_subproduct + * non_native_field_gate_2 *= q_4 + * limb_subproduct *= limb_size + * limb_subproduct += w_1_omega * w_2_omega + * non_native_field_gate_1 = (limb_subproduct + w_3 + w_4) * q_3 + * non_native_field_gate_3 = (limb_subproduct + w_4 - (w_3_omega + w_4_omega)) * q_m + * non_native_field_identity = (non_native_field_gate_1 + non_native_field_gate_2 + non_native_field_gate_3) * q_2 + */ + + let limb_subproduct := + addmod( + mulmod(mload(W1_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), + mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_EVAL_LOC), p), + p + ) + + let non_native_field_gate_2 := + addmod( + addmod( + mulmod(mload(W1_EVAL_LOC), mload(W4_EVAL_LOC), p), + mulmod(mload(W2_EVAL_LOC), mload(W3_EVAL_LOC), p), + p + ), + sub(p, mload(W3_OMEGA_EVAL_LOC)), + p + ) + non_native_field_gate_2 := mulmod(non_native_field_gate_2, LIMB_SIZE, p) + non_native_field_gate_2 := addmod(non_native_field_gate_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p) + non_native_field_gate_2 := addmod(non_native_field_gate_2, limb_subproduct, p) + non_native_field_gate_2 := mulmod(non_native_field_gate_2, mload(Q4_EVAL_LOC), p) + limb_subproduct := mulmod(limb_subproduct, LIMB_SIZE, p) + limb_subproduct := + addmod(limb_subproduct, mulmod(mload(W1_OMEGA_EVAL_LOC), mload(W2_OMEGA_EVAL_LOC), p), p) + let non_native_field_gate_1 := + mulmod( + addmod(limb_subproduct, sub(p, addmod(mload(W3_EVAL_LOC), mload(W4_EVAL_LOC), p)), p), + mload(Q3_EVAL_LOC), + p + ) + let non_native_field_gate_3 := + mulmod( + addmod( + addmod(limb_subproduct, mload(W4_EVAL_LOC), p), + sub(p, addmod(mload(W3_OMEGA_EVAL_LOC), mload(W4_OMEGA_EVAL_LOC), p)), + p + ), + mload(QM_EVAL_LOC), + p + ) + let non_native_field_identity := + mulmod( + addmod(addmod(non_native_field_gate_1, non_native_field_gate_2, p), non_native_field_gate_3, p), + mload(Q2_EVAL_LOC), + p + ) + + mstore(AUX_NON_NATIVE_FIELD_EVALUATION, non_native_field_identity) + } + + { + /** + * limb_accumulator_1 = w_2_omega; + * limb_accumulator_1 *= SUBLIMB_SHIFT; + * limb_accumulator_1 += w_1_omega; + * limb_accumulator_1 *= SUBLIMB_SHIFT; + * limb_accumulator_1 += w_3; + * limb_accumulator_1 *= SUBLIMB_SHIFT; + * limb_accumulator_1 += w_2; + * limb_accumulator_1 *= SUBLIMB_SHIFT; + * limb_accumulator_1 += w_1; + * limb_accumulator_1 -= w_4; + * limb_accumulator_1 *= q_4; + */ + let limb_accumulator_1 := mulmod(mload(W2_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p) + limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_OMEGA_EVAL_LOC), p) + limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p) + limb_accumulator_1 := addmod(limb_accumulator_1, mload(W3_EVAL_LOC), p) + limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p) + limb_accumulator_1 := addmod(limb_accumulator_1, mload(W2_EVAL_LOC), p) + limb_accumulator_1 := mulmod(limb_accumulator_1, SUBLIMB_SHIFT, p) + limb_accumulator_1 := addmod(limb_accumulator_1, mload(W1_EVAL_LOC), p) + limb_accumulator_1 := addmod(limb_accumulator_1, sub(p, mload(W4_EVAL_LOC)), p) + limb_accumulator_1 := mulmod(limb_accumulator_1, mload(Q4_EVAL_LOC), p) + + /** + * limb_accumulator_2 = w_3_omega; + * limb_accumulator_2 *= SUBLIMB_SHIFT; + * limb_accumulator_2 += w_2_omega; + * limb_accumulator_2 *= SUBLIMB_SHIFT; + * limb_accumulator_2 += w_1_omega; + * limb_accumulator_2 *= SUBLIMB_SHIFT; + * limb_accumulator_2 += w_4; + * limb_accumulator_2 *= SUBLIMB_SHIFT; + * limb_accumulator_2 += w_3; + * limb_accumulator_2 -= w_4_omega; + * limb_accumulator_2 *= q_m; + */ + let limb_accumulator_2 := mulmod(mload(W3_OMEGA_EVAL_LOC), SUBLIMB_SHIFT, p) + limb_accumulator_2 := addmod(limb_accumulator_2, mload(W2_OMEGA_EVAL_LOC), p) + limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p) + limb_accumulator_2 := addmod(limb_accumulator_2, mload(W1_OMEGA_EVAL_LOC), p) + limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p) + limb_accumulator_2 := addmod(limb_accumulator_2, mload(W4_EVAL_LOC), p) + limb_accumulator_2 := mulmod(limb_accumulator_2, SUBLIMB_SHIFT, p) + limb_accumulator_2 := addmod(limb_accumulator_2, mload(W3_EVAL_LOC), p) + limb_accumulator_2 := addmod(limb_accumulator_2, sub(p, mload(W4_OMEGA_EVAL_LOC)), p) + limb_accumulator_2 := mulmod(limb_accumulator_2, mload(QM_EVAL_LOC), p) + + mstore( + AUX_LIMB_ACCUMULATOR_EVALUATION, + mulmod(addmod(limb_accumulator_1, limb_accumulator_2, p), mload(Q3_EVAL_LOC), p) + ) + } + + { + /** + * memory_record_check = w_3; + * memory_record_check *= eta; + * memory_record_check += w_2; + * memory_record_check *= eta; + * memory_record_check += w_1; + * memory_record_check *= eta; + * memory_record_check += q_c; + * + * partial_record_check = memory_record_check; + * + * memory_record_check -= w_4; + */ + + let memory_record_check := mulmod(mload(W3_EVAL_LOC), mload(C_ETA_LOC), p) + memory_record_check := addmod(memory_record_check, mload(W2_EVAL_LOC), p) + memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p) + memory_record_check := addmod(memory_record_check, mload(W1_EVAL_LOC), p) + memory_record_check := mulmod(memory_record_check, mload(C_ETA_LOC), p) + memory_record_check := addmod(memory_record_check, mload(QC_EVAL_LOC), p) + + let partial_record_check := memory_record_check + memory_record_check := addmod(memory_record_check, sub(p, mload(W4_EVAL_LOC)), p) + + mstore(AUX_MEMORY_EVALUATION, memory_record_check) + + // index_delta = w_1_omega - w_1 + let index_delta := addmod(mload(W1_OMEGA_EVAL_LOC), sub(p, mload(W1_EVAL_LOC)), p) + // record_delta = w_4_omega - w_4 + let record_delta := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, mload(W4_EVAL_LOC)), p) + // index_is_monotonically_increasing = index_delta * (index_delta - 1) + let index_is_monotonically_increasing := mulmod(index_delta, addmod(index_delta, sub(p, 1), p), p) + + // adjacent_values_match_if_adjacent_indices_match = record_delta * (1 - index_delta) + let adjacent_values_match_if_adjacent_indices_match := + mulmod(record_delta, addmod(1, sub(p, index_delta), p), p) + + // AUX_ROM_CONSISTENCY_EVALUATION = ((adjacent_values_match_if_adjacent_indices_match * alpha) + index_is_monotonically_increasing) * alpha + partial_record_check + mstore( + AUX_ROM_CONSISTENCY_EVALUATION, + addmod( + mulmod( + addmod( + mulmod(adjacent_values_match_if_adjacent_indices_match, mload(C_ALPHA_LOC), p), + index_is_monotonically_increasing, + p + ), + mload(C_ALPHA_LOC), + p + ), + memory_record_check, + p + ) + ) + + { + /** + * next_gate_access_type = w_3_omega; + * next_gate_access_type *= eta; + * next_gate_access_type += w_2_omega; + * next_gate_access_type *= eta; + * next_gate_access_type += w_1_omega; + * next_gate_access_type *= eta; + * next_gate_access_type = w_4_omega - next_gate_access_type; + */ + let next_gate_access_type := mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_ETA_LOC), p) + next_gate_access_type := addmod(next_gate_access_type, mload(W2_OMEGA_EVAL_LOC), p) + next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p) + next_gate_access_type := addmod(next_gate_access_type, mload(W1_OMEGA_EVAL_LOC), p) + next_gate_access_type := mulmod(next_gate_access_type, mload(C_ETA_LOC), p) + next_gate_access_type := addmod(mload(W4_OMEGA_EVAL_LOC), sub(p, next_gate_access_type), p) + + // value_delta = w_3_omega - w_3 + let value_delta := addmod(mload(W3_OMEGA_EVAL_LOC), sub(p, mload(W3_EVAL_LOC)), p) + // adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = (1 - index_delta) * value_delta * (1 - next_gate_access_type); + + let adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation := + mulmod( + addmod(1, sub(p, index_delta), p), + mulmod(value_delta, addmod(1, sub(p, next_gate_access_type), p), p), + p + ) + + // AUX_RAM_CONSISTENCY_EVALUATION + + /** + * access_type = w_4 - partial_record_check + * access_check = access_type^2 - access_type + * next_gate_access_type_is_boolean = next_gate_access_type^2 - next_gate_access_type + * RAM_consistency_check_identity = adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation; + * RAM_consistency_check_identity *= alpha; + * RAM_consistency_check_identity += index_is_monotonically_increasing; + * RAM_consistency_check_identity *= alpha; + * RAM_consistency_check_identity += next_gate_access_type_is_boolean; + * RAM_consistency_check_identity *= alpha; + * RAM_consistency_check_identity += access_check; + */ + + let access_type := addmod(mload(W4_EVAL_LOC), sub(p, partial_record_check), p) + let access_check := mulmod(access_type, addmod(access_type, sub(p, 1), p), p) + let next_gate_access_type_is_boolean := + mulmod(next_gate_access_type, addmod(next_gate_access_type, sub(p, 1), p), p) + let RAM_cci := + mulmod( + adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation, + mload(C_ALPHA_LOC), + p + ) + RAM_cci := addmod(RAM_cci, index_is_monotonically_increasing, p) + RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p) + RAM_cci := addmod(RAM_cci, next_gate_access_type_is_boolean, p) + RAM_cci := mulmod(RAM_cci, mload(C_ALPHA_LOC), p) + RAM_cci := addmod(RAM_cci, access_check, p) + + mstore(AUX_RAM_CONSISTENCY_EVALUATION, RAM_cci) + } + + { + // timestamp_delta = w_2_omega - w_2 + let timestamp_delta := addmod(mload(W2_OMEGA_EVAL_LOC), sub(p, mload(W2_EVAL_LOC)), p) + + // RAM_timestamp_check_identity = (1 - index_delta) * timestamp_delta - w_3 + let RAM_timestamp_check_identity := + addmod( + mulmod(timestamp_delta, addmod(1, sub(p, index_delta), p), p), sub(p, mload(W3_EVAL_LOC)), p + ) + + /** + * memory_identity = ROM_consistency_check_identity * q_2; + * memory_identity += RAM_timestamp_check_identity * q_4; + * memory_identity += memory_record_check * q_m; + * memory_identity *= q_1; + * memory_identity += (RAM_consistency_check_identity * q_arith); + * + * auxiliary_identity = memory_identity + non_native_field_identity + limb_accumulator_identity; + * auxiliary_identity *= q_aux; + * auxiliary_identity *= alpha_base; + */ + let memory_identity := mulmod(mload(AUX_ROM_CONSISTENCY_EVALUATION), mload(Q2_EVAL_LOC), p) + memory_identity := + addmod(memory_identity, mulmod(RAM_timestamp_check_identity, mload(Q4_EVAL_LOC), p), p) + memory_identity := + addmod(memory_identity, mulmod(mload(AUX_MEMORY_EVALUATION), mload(QM_EVAL_LOC), p), p) + memory_identity := mulmod(memory_identity, mload(Q1_EVAL_LOC), p) + memory_identity := + addmod( + memory_identity, mulmod(mload(AUX_RAM_CONSISTENCY_EVALUATION), mload(QARITH_EVAL_LOC), p), p + ) + + let auxiliary_identity := addmod(memory_identity, mload(AUX_NON_NATIVE_FIELD_EVALUATION), p) + auxiliary_identity := addmod(auxiliary_identity, mload(AUX_LIMB_ACCUMULATOR_EVALUATION), p) + auxiliary_identity := mulmod(auxiliary_identity, mload(QAUX_EVAL_LOC), p) + auxiliary_identity := mulmod(auxiliary_identity, mload(C_ALPHA_BASE_LOC), p) + + mstore(AUX_IDENTITY, auxiliary_identity) + + // update alpha + mstore(C_ALPHA_BASE_LOC, mulmod(mload(C_ALPHA_BASE_LOC), mload(C_ALPHA_CUBE_LOC), p)) + } + } + } + + { + /** + * quotient = ARITHMETIC_IDENTITY + * quotient += PERMUTATION_IDENTITY + * quotient += PLOOKUP_IDENTITY + * quotient += SORT_IDENTITY + * quotient += ELLIPTIC_IDENTITY + * quotient += AUX_IDENTITY + * quotient *= ZERO_POLY_INVERSE + */ + mstore( + QUOTIENT_EVAL_LOC, + mulmod( + addmod( + addmod( + addmod( + addmod( + addmod(mload(PERMUTATION_IDENTITY), mload(PLOOKUP_IDENTITY), p), + mload(ARITHMETIC_IDENTITY), + p + ), + mload(SORT_IDENTITY), + p + ), + mload(ELLIPTIC_IDENTITY), + p + ), + mload(AUX_IDENTITY), + p + ), + mload(ZERO_POLY_INVERSE_LOC), + p + ) + ) + } + + /** + * GENERATE NU AND SEPARATOR CHALLENGES + */ + { + let current_challenge := mload(C_CURRENT_LOC) + // get a calldata pointer that points to the start of the data we want to copy + let calldata_ptr := add(calldataload(0x04), 0x24) + + calldata_ptr := add(calldata_ptr, NU_CALLDATA_SKIP_LENGTH) + + mstore(NU_CHALLENGE_INPUT_LOC_A, current_challenge) + mstore(NU_CHALLENGE_INPUT_LOC_B, mload(QUOTIENT_EVAL_LOC)) + calldatacopy(NU_CHALLENGE_INPUT_LOC_C, calldata_ptr, NU_INPUT_LENGTH) + + // hash length = (0x20 + num field elements), we include the previous challenge in the hash + let challenge := keccak256(NU_CHALLENGE_INPUT_LOC_A, add(NU_INPUT_LENGTH, 0x40)) + + mstore(C_V0_LOC, mod(challenge, p)) + // We need THIRTY-ONE independent nu challenges! + mstore(0x00, challenge) + mstore8(0x20, 0x01) + mstore(C_V1_LOC, mod(keccak256(0x00, 0x21), p)) + mstore8(0x20, 0x02) + mstore(C_V2_LOC, mod(keccak256(0x00, 0x21), p)) + mstore8(0x20, 0x03) + mstore(C_V3_LOC, mod(keccak256(0x00, 0x21), p)) + mstore8(0x20, 0x04) + mstore(C_V4_LOC, mod(keccak256(0x00, 0x21), p)) + mstore8(0x20, 0x05) + mstore(C_V5_LOC, mod(keccak256(0x00, 0x21), p)) + mstore8(0x20, 0x06) + mstore(C_V6_LOC, mod(keccak256(0x00, 0x21), p)) + mstore8(0x20, 0x07) + mstore(C_V7_LOC, mod(keccak256(0x00, 0x21), p)) + mstore8(0x20, 0x08) + mstore(C_V8_LOC, mod(keccak256(0x00, 0x21), p)) + mstore8(0x20, 0x09) + mstore(C_V9_LOC, mod(keccak256(0x00, 0x21), p)) + mstore8(0x20, 0x0a) + mstore(C_V10_LOC, mod(keccak256(0x00, 0x21), p)) + mstore8(0x20, 0x0b) + mstore(C_V11_LOC, mod(keccak256(0x00, 0x21), p)) + mstore8(0x20, 0x0c) + mstore(C_V12_LOC, mod(keccak256(0x00, 0x21), p)) + mstore8(0x20, 0x0d) + mstore(C_V13_LOC, mod(keccak256(0x00, 0x21), p)) + mstore8(0x20, 0x0e) + mstore(C_V14_LOC, mod(keccak256(0x00, 0x21), p)) + mstore8(0x20, 0x0f) + mstore(C_V15_LOC, mod(keccak256(0x00, 0x21), p)) + mstore8(0x20, 0x10) + mstore(C_V16_LOC, mod(keccak256(0x00, 0x21), p)) + mstore8(0x20, 0x11) + mstore(C_V17_LOC, mod(keccak256(0x00, 0x21), p)) + mstore8(0x20, 0x12) + mstore(C_V18_LOC, mod(keccak256(0x00, 0x21), p)) + mstore8(0x20, 0x13) + mstore(C_V19_LOC, mod(keccak256(0x00, 0x21), p)) + mstore8(0x20, 0x14) + mstore(C_V20_LOC, mod(keccak256(0x00, 0x21), p)) + mstore8(0x20, 0x15) + mstore(C_V21_LOC, mod(keccak256(0x00, 0x21), p)) + mstore8(0x20, 0x16) + mstore(C_V22_LOC, mod(keccak256(0x00, 0x21), p)) + mstore8(0x20, 0x17) + mstore(C_V23_LOC, mod(keccak256(0x00, 0x21), p)) + mstore8(0x20, 0x18) + mstore(C_V24_LOC, mod(keccak256(0x00, 0x21), p)) + mstore8(0x20, 0x19) + mstore(C_V25_LOC, mod(keccak256(0x00, 0x21), p)) + mstore8(0x20, 0x1a) + mstore(C_V26_LOC, mod(keccak256(0x00, 0x21), p)) + mstore8(0x20, 0x1b) + mstore(C_V27_LOC, mod(keccak256(0x00, 0x21), p)) + mstore8(0x20, 0x1c) + mstore(C_V28_LOC, mod(keccak256(0x00, 0x21), p)) + mstore8(0x20, 0x1d) + mstore(C_V29_LOC, mod(keccak256(0x00, 0x21), p)) + + // @follow-up - Why are both v29 and v30 using appending 0x1d to the prior challenge and hashing, should it not change? + mstore8(0x20, 0x1d) + challenge := keccak256(0x00, 0x21) + mstore(C_V30_LOC, mod(challenge, p)) + + // separator + mstore(0x00, challenge) + mstore(0x20, mload(PI_Z_Y_LOC)) + mstore(0x40, mload(PI_Z_X_LOC)) + mstore(0x60, mload(PI_Z_OMEGA_Y_LOC)) + mstore(0x80, mload(PI_Z_OMEGA_X_LOC)) + + mstore(C_U_LOC, mod(keccak256(0x00, 0xa0), p)) + } + + let success := 0 + // VALIDATE T1 + { + let x := mload(T1_X_LOC) + let y := mload(T1_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)) + mstore(ACCUMULATOR_X_LOC, x) + mstore(add(ACCUMULATOR_X_LOC, 0x20), y) + } + // VALIDATE T2 + { + let x := mload(T2_X_LOC) // 0x1400 + let y := mload(T2_Y_LOC) // 0x1420 + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mload(ZETA_POW_N_LOC)) + // accumulator_2 = [T2].zeta^n + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = [T1] + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE T3 + { + let x := mload(T3_X_LOC) + let y := mload(T3_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p)) + // accumulator_2 = [T3].zeta^{2n} + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE T4 + { + let x := mload(T4_X_LOC) + let y := mload(T4_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mulmod(mulmod(mload(ZETA_POW_N_LOC), mload(ZETA_POW_N_LOC), p), mload(ZETA_POW_N_LOC), p)) + // accumulator_2 = [T4].zeta^{3n} + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE W1 + { + let x := mload(W1_X_LOC) + let y := mload(W1_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V0_LOC), p)) + // accumulator_2 = v0.(u + 1).[W1] + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE W2 + { + let x := mload(W2_X_LOC) + let y := mload(W2_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V1_LOC), p)) + // accumulator_2 = v1.(u + 1).[W2] + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE W3 + { + let x := mload(W3_X_LOC) + let y := mload(W3_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V2_LOC), p)) + // accumulator_2 = v2.(u + 1).[W3] + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE W4 + { + let x := mload(W4_X_LOC) + let y := mload(W4_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V3_LOC), p)) + // accumulator_2 = v3.(u + 1).[W4] + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE S + { + let x := mload(S_X_LOC) + let y := mload(S_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V4_LOC), p)) + // accumulator_2 = v4.(u + 1).[S] + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE Z + { + let x := mload(Z_X_LOC) + let y := mload(Z_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V5_LOC), p)) + // accumulator_2 = v5.(u + 1).[Z] + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE Z_LOOKUP + { + let x := mload(Z_LOOKUP_X_LOC) + let y := mload(Z_LOOKUP_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V6_LOC), p)) + // accumulator_2 = v6.(u + 1).[Z_LOOKUP] + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE Q1 + { + let x := mload(Q1_X_LOC) + let y := mload(Q1_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mload(C_V7_LOC)) + // accumulator_2 = v7.[Q1] + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE Q2 + { + let x := mload(Q2_X_LOC) + let y := mload(Q2_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mload(C_V8_LOC)) + // accumulator_2 = v8.[Q2] + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE Q3 + { + let x := mload(Q3_X_LOC) + let y := mload(Q3_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mload(C_V9_LOC)) + // accumulator_2 = v9.[Q3] + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE Q4 + { + let x := mload(Q4_X_LOC) + let y := mload(Q4_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mload(C_V10_LOC)) + // accumulator_2 = v10.[Q4] + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE QM + { + let x := mload(QM_X_LOC) + let y := mload(QM_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mload(C_V11_LOC)) + // accumulator_2 = v11.[Q;] + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE QC + { + let x := mload(QC_X_LOC) + let y := mload(QC_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mload(C_V12_LOC)) + // accumulator_2 = v12.[QC] + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE QARITH + { + let x := mload(QARITH_X_LOC) + let y := mload(QARITH_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mload(C_V13_LOC)) + // accumulator_2 = v13.[QARITH] + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE QSORT + { + let x := mload(QSORT_X_LOC) + let y := mload(QSORT_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mload(C_V14_LOC)) + // accumulator_2 = v14.[QSORT] + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE QELLIPTIC + { + let x := mload(QELLIPTIC_X_LOC) + let y := mload(QELLIPTIC_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mload(C_V15_LOC)) + // accumulator_2 = v15.[QELLIPTIC] + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE QAUX + { + let x := mload(QAUX_X_LOC) + let y := mload(QAUX_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mload(C_V16_LOC)) + // accumulator_2 = v15.[Q_AUX] + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE SIGMA1 + { + let x := mload(SIGMA1_X_LOC) + let y := mload(SIGMA1_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mload(C_V17_LOC)) + // accumulator_2 = v17.[sigma1] + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE SIGMA2 + { + let x := mload(SIGMA2_X_LOC) + let y := mload(SIGMA2_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mload(C_V18_LOC)) + // accumulator_2 = v18.[sigma2] + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE SIGMA3 + { + let x := mload(SIGMA3_X_LOC) + let y := mload(SIGMA3_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mload(C_V19_LOC)) + // accumulator_2 = v19.[sigma3] + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE SIGMA4 + { + let x := mload(SIGMA4_X_LOC) + let y := mload(SIGMA4_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mload(C_V20_LOC)) + // accumulator_2 = v20.[sigma4] + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE TABLE1 + { + let x := mload(TABLE1_X_LOC) + let y := mload(TABLE1_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V21_LOC), p)) + // accumulator_2 = u.[table1] + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE TABLE2 + { + let x := mload(TABLE2_X_LOC) + let y := mload(TABLE2_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V22_LOC), p)) + // accumulator_2 = u.[table2] + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE TABLE3 + { + let x := mload(TABLE3_X_LOC) + let y := mload(TABLE3_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V23_LOC), p)) + // accumulator_2 = u.[table3] + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE TABLE4 + { + let x := mload(TABLE4_X_LOC) + let y := mload(TABLE4_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mulmod(addmod(mload(C_U_LOC), 0x1, p), mload(C_V24_LOC), p)) + // accumulator_2 = u.[table4] + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE TABLE_TYPE + { + let x := mload(TABLE_TYPE_X_LOC) + let y := mload(TABLE_TYPE_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mload(C_V25_LOC)) + // accumulator_2 = v25.[TableType] + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE ID1 + { + let x := mload(ID1_X_LOC) + let y := mload(ID1_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mload(C_V26_LOC)) + // accumulator_2 = v26.[ID1] + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE ID2 + { + let x := mload(ID2_X_LOC) + let y := mload(ID2_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mload(C_V27_LOC)) + // accumulator_2 = v27.[ID2] + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE ID3 + { + let x := mload(ID3_X_LOC) + let y := mload(ID3_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mload(C_V28_LOC)) + // accumulator_2 = v28.[ID3] + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE ID4 + { + let x := mload(ID4_X_LOC) + let y := mload(ID4_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mload(C_V29_LOC)) + // accumulator_2 = v29.[ID4] + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + /** + * COMPUTE BATCH EVALUATION SCALAR MULTIPLIER + */ + { + /** + * batch_evaluation = v0 * (w_1_omega * u + w_1_eval) + * batch_evaluation += v1 * (w_2_omega * u + w_2_eval) + * batch_evaluation += v2 * (w_3_omega * u + w_3_eval) + * batch_evaluation += v3 * (w_4_omega * u + w_4_eval) + * batch_evaluation += v4 * (s_omega_eval * u + s_eval) + * batch_evaluation += v5 * (z_omega_eval * u + z_eval) + * batch_evaluation += v6 * (z_lookup_omega_eval * u + z_lookup_eval) + */ + let batch_evaluation := + mulmod( + mload(C_V0_LOC), + addmod(mulmod(mload(W1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W1_EVAL_LOC), p), + p + ) + batch_evaluation := + addmod( + batch_evaluation, + mulmod( + mload(C_V1_LOC), + addmod(mulmod(mload(W2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W2_EVAL_LOC), p), + p + ), + p + ) + batch_evaluation := + addmod( + batch_evaluation, + mulmod( + mload(C_V2_LOC), + addmod(mulmod(mload(W3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W3_EVAL_LOC), p), + p + ), + p + ) + batch_evaluation := + addmod( + batch_evaluation, + mulmod( + mload(C_V3_LOC), + addmod(mulmod(mload(W4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(W4_EVAL_LOC), p), + p + ), + p + ) + batch_evaluation := + addmod( + batch_evaluation, + mulmod( + mload(C_V4_LOC), + addmod(mulmod(mload(S_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(S_EVAL_LOC), p), + p + ), + p + ) + batch_evaluation := + addmod( + batch_evaluation, + mulmod( + mload(C_V5_LOC), + addmod(mulmod(mload(Z_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_EVAL_LOC), p), + p + ), + p + ) + batch_evaluation := + addmod( + batch_evaluation, + mulmod( + mload(C_V6_LOC), + addmod(mulmod(mload(Z_LOOKUP_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(Z_LOOKUP_EVAL_LOC), p), + p + ), + p + ) + + /** + * batch_evaluation += v7 * Q1_EVAL + * batch_evaluation += v8 * Q2_EVAL + * batch_evaluation += v9 * Q3_EVAL + * batch_evaluation += v10 * Q4_EVAL + * batch_evaluation += v11 * QM_EVAL + * batch_evaluation += v12 * QC_EVAL + * batch_evaluation += v13 * QARITH_EVAL + * batch_evaluation += v14 * QSORT_EVAL_LOC + * batch_evaluation += v15 * QELLIPTIC_EVAL_LOC + * batch_evaluation += v16 * QAUX_EVAL_LOC + * batch_evaluation += v17 * SIGMA1_EVAL_LOC + * batch_evaluation += v18 * SIGMA2_EVAL_LOC + * batch_evaluation += v19 * SIGMA3_EVAL_LOC + * batch_evaluation += v20 * SIGMA4_EVAL_LOC + */ + batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V7_LOC), mload(Q1_EVAL_LOC), p), p) + batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V8_LOC), mload(Q2_EVAL_LOC), p), p) + batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V9_LOC), mload(Q3_EVAL_LOC), p), p) + batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V10_LOC), mload(Q4_EVAL_LOC), p), p) + batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V11_LOC), mload(QM_EVAL_LOC), p), p) + batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V12_LOC), mload(QC_EVAL_LOC), p), p) + batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V13_LOC), mload(QARITH_EVAL_LOC), p), p) + batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V14_LOC), mload(QSORT_EVAL_LOC), p), p) + batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V15_LOC), mload(QELLIPTIC_EVAL_LOC), p), p) + batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V16_LOC), mload(QAUX_EVAL_LOC), p), p) + batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V17_LOC), mload(SIGMA1_EVAL_LOC), p), p) + batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V18_LOC), mload(SIGMA2_EVAL_LOC), p), p) + batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V19_LOC), mload(SIGMA3_EVAL_LOC), p), p) + batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V20_LOC), mload(SIGMA4_EVAL_LOC), p), p) + + /** + * batch_evaluation += v21 * (table1(zw) * u + table1(z)) + * batch_evaluation += v22 * (table2(zw) * u + table2(z)) + * batch_evaluation += v23 * (table3(zw) * u + table3(z)) + * batch_evaluation += v24 * (table4(zw) * u + table4(z)) + * batch_evaluation += v25 * table_type_eval + * batch_evaluation += v26 * id1_eval + * batch_evaluation += v27 * id2_eval + * batch_evaluation += v28 * id3_eval + * batch_evaluation += v29 * id4_eval + * batch_evaluation += quotient_eval + */ + batch_evaluation := + addmod( + batch_evaluation, + mulmod( + mload(C_V21_LOC), + addmod(mulmod(mload(TABLE1_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE1_EVAL_LOC), p), + p + ), + p + ) + batch_evaluation := + addmod( + batch_evaluation, + mulmod( + mload(C_V22_LOC), + addmod(mulmod(mload(TABLE2_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE2_EVAL_LOC), p), + p + ), + p + ) + batch_evaluation := + addmod( + batch_evaluation, + mulmod( + mload(C_V23_LOC), + addmod(mulmod(mload(TABLE3_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE3_EVAL_LOC), p), + p + ), + p + ) + batch_evaluation := + addmod( + batch_evaluation, + mulmod( + mload(C_V24_LOC), + addmod(mulmod(mload(TABLE4_OMEGA_EVAL_LOC), mload(C_U_LOC), p), mload(TABLE4_EVAL_LOC), p), + p + ), + p + ) + batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V25_LOC), mload(TABLE_TYPE_EVAL_LOC), p), p) + batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V26_LOC), mload(ID1_EVAL_LOC), p), p) + batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V27_LOC), mload(ID2_EVAL_LOC), p), p) + batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V28_LOC), mload(ID3_EVAL_LOC), p), p) + batch_evaluation := addmod(batch_evaluation, mulmod(mload(C_V29_LOC), mload(ID4_EVAL_LOC), p), p) + batch_evaluation := addmod(batch_evaluation, mload(QUOTIENT_EVAL_LOC), p) + + mstore(0x00, 0x01) // [1].x + mstore(0x20, 0x02) // [1].y + mstore(0x40, sub(p, batch_evaluation)) + // accumulator_2 = -[1].(batch_evaluation) + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + mstore(OPENING_COMMITMENT_SUCCESS_FLAG, success) + } + + /** + * PERFORM PAIRING PREAMBLE + */ + { + let u := mload(C_U_LOC) + let zeta := mload(C_ZETA_LOC) + // VALIDATE PI_Z + { + let x := mload(PI_Z_X_LOC) + let y := mload(PI_Z_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q)) + mstore(0x00, x) + mstore(0x20, y) + } + // compute zeta.[PI_Z] and add into accumulator + mstore(0x40, zeta) + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, ACCUMULATOR_X_LOC, 0x40)) + + // VALIDATE PI_Z_OMEGA + { + let x := mload(PI_Z_OMEGA_X_LOC) + let y := mload(PI_Z_OMEGA_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + mstore(0x40, mulmod(mulmod(u, zeta, p), mload(OMEGA_LOC), p)) + // accumulator_2 = u.zeta.omega.[PI_Z_OMEGA] + success := and(success, staticcall(gas(), 7, 0x00, 0x60, ACCUMULATOR2_X_LOC, 0x40)) + // PAIRING_RHS = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, ACCUMULATOR_X_LOC, 0x80, PAIRING_RHS_X_LOC, 0x40)) + + mstore(0x00, mload(PI_Z_X_LOC)) + mstore(0x20, mload(PI_Z_Y_LOC)) + mstore(0x40, mload(PI_Z_OMEGA_X_LOC)) + mstore(0x60, mload(PI_Z_OMEGA_Y_LOC)) + mstore(0x80, u) + success := and(success, staticcall(gas(), 7, 0x40, 0x60, 0x40, 0x40)) + // PAIRING_LHS = [PI_Z] + [PI_Z_OMEGA] * u + success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40)) + // negate lhs y-coordinate + mstore(PAIRING_LHS_Y_LOC, sub(q, mload(PAIRING_LHS_Y_LOC))) + + if mload(CONTAINS_RECURSIVE_PROOF_LOC) { + // VALIDATE RECURSIVE P1 + { + let x := mload(RECURSIVE_P1_X_LOC) + let y := mload(RECURSIVE_P1_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + + // compute u.u.[recursive_p1] and write into 0x60 + mstore(0x40, mulmod(u, u, p)) + success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x60, 0x40)) + // VALIDATE RECURSIVE P2 + { + let x := mload(RECURSIVE_P2_X_LOC) + let y := mload(RECURSIVE_P2_Y_LOC) + let xx := mulmod(x, x, q) + // validate on curve + success := and(success, eq(mulmod(y, y, q), addmod(mulmod(x, xx, q), 3, q))) + mstore(0x00, x) + mstore(0x20, y) + } + // compute u.u.[recursive_p2] and write into 0x00 + // 0x40 still contains u*u + success := and(success, staticcall(gas(), 7, 0x00, 0x60, 0x00, 0x40)) + + // compute u.u.[recursiveP1] + rhs and write into rhs + mstore(0xa0, mload(PAIRING_RHS_X_LOC)) + mstore(0xc0, mload(PAIRING_RHS_Y_LOC)) + success := and(success, staticcall(gas(), 6, 0x60, 0x80, PAIRING_RHS_X_LOC, 0x40)) + + // compute u.u.[recursiveP2] + lhs and write into lhs + mstore(0x40, mload(PAIRING_LHS_X_LOC)) + mstore(0x60, mload(PAIRING_LHS_Y_LOC)) + success := and(success, staticcall(gas(), 6, 0x00, 0x80, PAIRING_LHS_X_LOC, 0x40)) + } + + if iszero(success) { + mstore(0x0, EC_SCALAR_MUL_FAILURE_SELECTOR) + revert(0x00, 0x04) + } + mstore(PAIRING_PREAMBLE_SUCCESS_FLAG, success) + } + + /** + * PERFORM PAIRING + */ + { + // rhs paired with [1]_2 + // lhs paired with [x]_2 + + mstore(0x00, mload(PAIRING_RHS_X_LOC)) + mstore(0x20, mload(PAIRING_RHS_Y_LOC)) + mstore(0x40, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // this is [1]_2 + mstore(0x60, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) + mstore(0x80, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) + mstore(0xa0, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa) + + mstore(0xc0, mload(PAIRING_LHS_X_LOC)) + mstore(0xe0, mload(PAIRING_LHS_Y_LOC)) + mstore(0x100, mload(G2X_X0_LOC)) + mstore(0x120, mload(G2X_X1_LOC)) + mstore(0x140, mload(G2X_Y0_LOC)) + mstore(0x160, mload(G2X_Y1_LOC)) + + success := staticcall(gas(), 8, 0x00, 0x180, 0x00, 0x20) + mstore(PAIRING_SUCCESS_FLAG, success) + mstore(RESULT_FLAG, mload(0x00)) + } + if iszero( + and( + and(and(mload(PAIRING_SUCCESS_FLAG), mload(RESULT_FLAG)), mload(PAIRING_PREAMBLE_SUCCESS_FLAG)), + mload(OPENING_COMMITMENT_SUCCESS_FLAG) + ) + ) { + mstore(0x0, PROOF_FAILURE_SELECTOR) + revert(0x00, 0x04) + } + { + mstore(0x00, 0x01) + return(0x00, 0x20) // Proof succeeded! + } + } + } +} + +contract UltraVerifier is BaseUltraVerifier { + function getVerificationKeyHash() public pure override(BaseUltraVerifier) returns (bytes32) { + return UltraVerificationKey.verificationKeyHash(); + } + + function loadVerificationKey(uint256 vk, uint256 _omegaInverseLoc) internal pure virtual override(BaseUltraVerifier) { + UltraVerificationKey.loadVerificationKey(vk, _omegaInverseLoc); + } +} +)"; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/circuit_builder_base.hpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/circuit_builder_base.hpp index 140d98b234f..12bbc8be31a 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/circuit_builder_base.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/circuit_builder_base.hpp @@ -347,11 +347,15 @@ template class CircuitBuilderBase { for (const auto& idx : proof_output_witness_indices) { set_public_input(idx); + // Why is it adding the size of the public input instead of the idx? recursive_proof_public_input_indices.push_back((uint32_t)(public_inputs.size() - 1)); } } /** + * TODO: We can remove this and use `add_recursive_proof` once my question has been addressed + * TODO: using `add_recursive_proof` also means that we will need to remove the cde which is + * TODO: adding the public_inputs * @brief Update recursive_proof_public_input_indices with existing public inputs that represent a recursive proof * * @param proof_output_witness_indices diff --git a/barretenberg/ts/src/barretenberg_wasm/barretenberg_wasm_main/index.ts b/barretenberg/ts/src/barretenberg_wasm/barretenberg_wasm_main/index.ts index cd172243231..f8c07e323b0 100644 --- a/barretenberg/ts/src/barretenberg_wasm/barretenberg_wasm_main/index.ts +++ b/barretenberg/ts/src/barretenberg_wasm/barretenberg_wasm_main/index.ts @@ -32,7 +32,7 @@ export class BarretenbergWasmMain extends BarretenbergWasmBase { module: WebAssembly.Module, threads = Math.min(getNumCpu(), BarretenbergWasmMain.MAX_THREADS), logger: (msg: string) => void = debug, - initial = 25, + initial = 26, maximum = 2 ** 16, ) { this.logger = logger; diff --git a/build_manifest.yml b/build_manifest.yml index 7208deb365f..cea9275b042 100644 --- a/build_manifest.yml +++ b/build_manifest.yml @@ -149,18 +149,6 @@ aztec-faucet: dependencies: - yarn-project-prod -aztec-node: - buildDir: yarn-project - projectDir: yarn-project/aztec-node - dependencies: - - yarn-project-prod - -p2p-bootstrap: - buildDir: yarn-project - projectDir: yarn-project/p2p-bootstrap - dependencies: - - yarn-project-prod - cli: buildDir: yarn-project projectDir: yarn-project/cli diff --git a/docs/.gitignore b/docs/.gitignore index 0e0b92f6647..462844ee8bd 100644 --- a/docs/.gitignore +++ b/docs/.gitignore @@ -16,6 +16,7 @@ .env.development.local .env.test.local .env.production.local +.env npm-debug.log* yarn-debug.log* diff --git a/docs/docs/dev_docs/tutorials/testing.md b/docs/docs/dev_docs/tutorials/testing.md index e13c00c2ce6..b0c3d553327 100644 --- a/docs/docs/dev_docs/tutorials/testing.md +++ b/docs/docs/dev_docs/tutorials/testing.md @@ -80,6 +80,20 @@ Instead of creating new accounts in our test suite, we can use the ones already #include_code use-existing-wallets /yarn-project/end-to-end/src/guides/dapp_testing.test.ts typescript +### Using debug options + +You can use the `debug` option in the `wait` method to get more information about the effects of the transaction. At the time of writing, this includes information about new note hashes added to the note hash tree, new nullifiers, public data writes, new L2 to L1 messages, new contract information and newly visible notes. + +This debug information will be populated in the transaction receipt. You can log it to the console or use it to make assertions about the transaction. + +If a note doesn't appear when you expect it to, check the visible notes returned by the debug options. See the following example for reference on how it's done in the token contract tests. + +#include_code debug /yarn-project/end-to-end/src/e2e_token_contract.test.ts typescript + +If the note appears in the visible notes and it contains the expected values there is probably an issue with how you fetch the notes. Check that the note getter (or note viewer) parameters are set correctly. If the note doesn't appear, ensure that you have emitted the corresponding encrypted log (usually by passing in a `broadcast = true` param to the `create_note` function). You can also check the Sandbox logs to see if the `emitEncryptedLog` was emitted. Run `export DEBUG="aztec:\*" before spinning up sandbox to see all the logs. + +For debugging and logging in Aztec contracts, see [this page](../debugging/main.md). + ## Assertions We will now see how to use `aztec.js` to write assertions about transaction statuses, about chain state both public and private, and about logs. diff --git a/docs/docs/dev_docs/tutorials/writing_dapp/testing.md b/docs/docs/dev_docs/tutorials/writing_dapp/testing.md index 594bb81e5d9..2265bac5b2e 100644 --- a/docs/docs/dev_docs/tutorials/writing_dapp/testing.md +++ b/docs/docs/dev_docs/tutorials/writing_dapp/testing.md @@ -21,17 +21,33 @@ We'll need to [install and run the Sandbox](../../cli/sandbox-reference.md#insta Create a new file `src/index.test.mjs` with the imports we'll be using and an empty test suite to begin with: ```js -import { Contract, createAccount } from "@aztec/aztec.js"; -import TokenContractArtifact from "../contracts/token/target/Token.json" assert { type: "json" }; - -describe("token", () => {}); +import { + Contract, + ExtendedNote, + Fr, + Note, + computeMessageSecretHash, + createAccount, + createPXEClient, + waitForSandbox, +} from "@aztec/aztec.js"; +import { TokenContractArtifact } from "@aztec/noir-contracts/artifacts"; + +const { + PXE_URL = "http://localhost:8080", + ETHEREUM_HOST = "http://localhost:8545", +} = process.env; + +describe("token contract", () => {}); ``` -Let's set up our test suite. We'll start [a new Sandbox instance within the test](../testing.md#running-sandbox-in-the-nodejs-process), create two fresh accounts to test with, and deploy an instance of our contract. The `aztec-sandbox` and `aztec.js` provide the helper functions we need to do this: +Let's set up our test suite. We'll make sure the Sandbox is running, create two fresh accounts to test with, and deploy an instance of our contract. `aztec.js` provides the helper functions we need to do this: #include_code setup yarn-project/end-to-end/src/sample-dapp/index.test.mjs javascript -Note that, since we are starting a new Sandbox instance, we need to `stop` it in the test suite teardown. Also, even though the Sandbox runs within our tests, we still need a running Ethereum development node. Make sure you are running [Anvil](https://book.getfoundry.sh/anvil/), [Hardhat Network](https://hardhat.org/hardhat-network/docs/overview), or [Ganache](https://trufflesuite.com/ganache/) along with your tests. +:::tip +Instead of creating new accounts in our test suite, we can use the ones already initialized by the Sandbox upon startup. This can provide a speed boost to your tests setup. However, bear in mind that you may accidentally introduce an interdependency across test suites by reusing the same accounts. Read more [here](../testing.md#using-sandbox-initial-accounts). +::: ## Writing our test @@ -43,7 +59,7 @@ In this example, we assert that the `recipient`'s balance is increased by the am ## Running our tests -With a local Ethereum development node running in port 8545, we can run our `jest` tests using `yarn`. The quirky syntax is due to [jest limitations in ESM support](https://jestjs.io/docs/ecmascript-modules), as well as not picking up `mjs` file by default: +We can run our `jest` tests using `yarn`. The quirky syntax is due to [jest limitations in ESM support](https://jestjs.io/docs/ecmascript-modules), as well as not picking up `mjs` file by default: ```sh yarn node --experimental-vm-modules $(yarn bin jest) --testRegex '.*\.test\.mjs$' diff --git a/docs/docs/dev_docs/wallets/main.md b/docs/docs/dev_docs/wallets/main.md index 66da29e8824..2c84a171114 100644 --- a/docs/docs/dev_docs/wallets/main.md +++ b/docs/docs/dev_docs/wallets/main.md @@ -1,6 +1,6 @@ # Wallets -Wallets are the applications through which users manage their accounts. Users rely on wallets to browse through their accounts, monitor their balances, and create new accounts. Wallets also store seed phrases and private keys, or interact with external keystores such as hardware wallets. +Wallets are the applications through which users manage their accounts. Users rely on wallets to browse through their accounts, monitor their balances, and create new accounts. Wallets also store seed phrases and private keys, or interact with external keystores such as hardware wallets. Wallets also provide an interface for dapps. Dapps may request access to see the user accounts, in order to show the state of those accounts in the context of the application, and request to send transactions from those accounts as the user interacts with the dapp. @@ -10,9 +10,9 @@ In this page we will cover the main responsibilities of a wallet in the Aztec ne ## Account setup -The first step for any wallet is to let the user set up their [accounts](../../concepts/foundation/accounts/main.md). An account in Aztec is represented on-chain by its corresponding account contract that the user must deploy to begin interacting with the network. This account contract dictates how transactions are authenticated and executed. +The first step for any wallet is to let the user set up their [accounts](../../concepts/foundation/accounts/main.md). An account in Aztec is represented on-chain by its corresponding account contract that the user must deploy to begin interacting with the network. This account contract dictates how transactions are authenticated and executed. -A wallet must support at least one specific [account contract implementation](./writing_an_account_contract.md), which means being able to deploy such a contract, as well as interacting with it when sending transactions. Code-wise, this requires [implementing the `AccountContract` interface](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/aztec.js/src/account/contract/index.ts). +A wallet must support at least one specific [account contract implementation](./writing_an_account_contract.md), which means being able to deploy such a contract, as well as interacting with it when sending transactions. Code-wise, this requires [implementing the `AccountContract` interface](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/aztec.js/src/account_contract/index.ts). Note that users must be able to receive funds in Aztec before deploying their account. A wallet should let a user generate a [deterministic complete address](../../concepts/foundation/accounts/keys.md#addresses-partial-addresses-and-public-keys) without having to interact with the network, so they can share it with others to receive funds. This requires that the wallet pins a specific contract implementation, its initialization arguments, a deployment salt, and a privacy key. These values yield a deterministic address, so when the account contract is actually deployed, it is available at the precalculated address. Once the account contract is deployed, the user can start sending transactions using it as the transaction origin. @@ -64,4 +64,3 @@ At the time of this writing, all private state is encrypted and broadcasted thro Encrypted data blobs do not carry any public information as to whom their recipient is. Therefore, it is not possible for a remote node to identify the notes that belong to a user, and it is not possible for a wallet to query a remote node for its private state. As such, wallets need to keep a local database of their accounts private state, in order to be able to answer any queries on their private state. Dapps may require access to the user's private state, in order to show information relevant to the current application. For instance, a dapp for a token may require access to the user's private notes in the token contract in order to display the user's balance. It is responsibility of the wallet to require authorization from the user before disclosing private state to a dapp. - diff --git a/docs/docs/dev_docs/wallets/writing_an_account_contract.md b/docs/docs/dev_docs/wallets/writing_an_account_contract.md index b06bd1cd700..c7228301d14 100644 --- a/docs/docs/dev_docs/wallets/writing_an_account_contract.md +++ b/docs/docs/dev_docs/wallets/writing_an_account_contract.md @@ -61,7 +61,7 @@ For our account contract, we will take the hash of the action to authorize, requ Now that we have a valid account contract, we need to write the typescript glue code that will take care of formatting and authenticating transactions so they can be processed by our contract, as well as deploying the contract during account setup. This takes the form of implementing the `AccountContract` interface: -#include_code account-contract-interface yarn-project/aztec.js/src/account/contract/index.ts typescript +#include_code account-contract-interface yarn-project/aztec.js/src/account_contract/account_contract.ts typescript However, if you are using the default `AccountActions` module, then you can leverage the `BaseAccountContract` class and just implement the logic for generating an auth witness that matches the one you wrote in Noir: diff --git a/docs/package.json b/docs/package.json index 6b3883f2282..134ded2a6c7 100644 --- a/docs/package.json +++ b/docs/package.json @@ -12,7 +12,7 @@ "deploy": "docusaurus deploy", "clear": "rm -rf 'processed-docs' 'processed-docs-cache' docs/apis && docusaurus clear", "serve": "docusaurus serve", - "preprocess": "yarn node ./src/preprocess/index.js", + "preprocess": "yarn node -r dotenv/config ./src/preprocess/index.js", "preprocess:dev": "nodemon --config nodemon.json ./src/preprocess/index.js", "typedoc": "rm -rf docs/apis && docusaurus generate-typedoc && cp -a docs/apis processed-docs/", "typedoc:dev": "nodemon -w ../yarn-project -e '*.js,*.ts,*.nr,*.md' --exec \"rm -rf docs/apis && yarn docusaurus generate-typedoc && cp -a docs/apis processed-docs/\"", @@ -40,6 +40,7 @@ "@tsconfig/docusaurus": "^1.0.5", "concurrently": "^8.0.1", "docusaurus-plugin-typedoc": "^0.20.2", + "dotenv": "^16.3.1", "nodemon": "^3.0.1", "typedoc": "^0.25.1", "typedoc-plugin-markdown": "^3.16.0", diff --git a/docs/yarn.lock b/docs/yarn.lock index 5610f57dfe4..3ac7b7d4c22 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -4043,6 +4043,11 @@ dot-prop@^5.2.0: dependencies: is-obj "^2.0.0" +dotenv@^16.3.1: + version "16.3.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" + integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== + duplexer3@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" diff --git a/noir/.gitrepo b/noir/.gitrepo index c73515799dc..a7ce2d788e5 100644 --- a/noir/.gitrepo +++ b/noir/.gitrepo @@ -6,7 +6,7 @@ [subrepo] remote = https://github.com/noir-lang/noir branch = aztec-packages - commit = f06ab9cf5e3580385bf5945276b57460a56aafbd - parent = 362c42f07e6bed29e5df3aad8d0b3949676d40f1 + commit = ef2f870f7c867f19f7ebc9605e6f264aa54a9e00 + parent = fde0ac3e96fe6e2edcdb1e6919d372e96181eda5 method = merge cmdver = 0.4.6 diff --git a/noir/test_programs/acir_artifacts/double_verify_proof/target/acir.gz b/noir/test_programs/acir_artifacts/double_verify_proof/target/acir.gz new file mode 100644 index 00000000000..31ff852f775 Binary files /dev/null and b/noir/test_programs/acir_artifacts/double_verify_proof/target/acir.gz differ diff --git a/noir/test_programs/acir_artifacts/double_verify_proof/target/witness.gz b/noir/test_programs/acir_artifacts/double_verify_proof/target/witness.gz new file mode 100644 index 00000000000..54abf4e8c51 Binary files /dev/null and b/noir/test_programs/acir_artifacts/double_verify_proof/target/witness.gz differ diff --git a/noir/test_programs/execution_success/double_verify_proof/Prover.toml b/noir/test_programs/execution_success/double_verify_proof/Prover.toml index 3e6d996d0e1..162c9a5060c 100644 --- a/noir/test_programs/execution_success/double_verify_proof/Prover.toml +++ b/noir/test_programs/execution_success/double_verify_proof/Prover.toml @@ -1,12 +1,11 @@ -input_aggregation_object = ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"] # key_hash = "0x17a5d2b205c1bf45b015ba33bc2f0beb7fbb36682f31f953b8d4d093c8644be5" -# proof = ["0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000008f66908323784e7c5259f4eefab77ca881","0x0000000000000000000000000000000000109cac7b943f9b737d7b023d4f5d8a","0x000000000000000000000000000000e991d3ac0a68a252bd3cd09cd1b43fe1b4","0x000000000000000000000000000000000014213d346a426777351fdabaa0fa26","0x000000000000000000000000000000e4603692a76af630015380b08d0e13c239","0x0000000000000000000000000000000000149e7046461203c1b72392bb93c262","0x000000000000000000000000000000c27ffc719f223ca6ef5476a5b66f03a4a8","0x000000000000000000000000000000000003718c62098243e3c1f38090e61753","0x000000000000000000000000000000749492aa98716ce5bf7c06e5c2a0a8a528","0x000000000000000000000000000000000018e4c7d33848bccdc3eed924bfaa15","0x0000000000000000000000000000004e10a37f41fd7c4fe32982daa498530d62","0x00000000000000000000000000000000001b76c8c59489c63f11280187109dd7","0x0000000000000000000000000000002a6cd84d3b8537a7c3cb0cb9461f02e4bb","0x0000000000000000000000000000000000197e524fd48ca5ccb30d6c5ffe689d","0x0000000000000000000000000000000013bf25498ce1f51078c06dac450c0325","0x000000000000000000000000000000000018d347b88a0c32e32571deb9b40466","0x00000000000000000000000000000060d496191298eb1b1c2ce18f9a4afcfc55","0x000000000000000000000000000000000024e11b8e8fcb45b8628cb9cc565513","0x00000000000000000000000000000004e976f6d12fff6250eea2d21c570d3d6a","0x00000000000000000000000000000000000967dbd89d2c7dc0121ea71ded7203","0x000000000000000000000000000000d96f810588c0daa43e88d765a3f82ea9b7","0x00000000000000000000000000000000001f69d7015fe6694bd1d4d61049dae9","0x000000000000000000000000000000c539910d0f81a890fa3d996a676db39640","0x000000000000000000000000000000000026d8b64020a669e24f740b4eba633a","0x000000000000000000000000000000c53cc90f99c40eb5d449f38180d9e9c8b6","0x00000000000000000000000000000000001071ddf2bacc2367dfb2c5084b7dd1","0x0000000000000000000000000000001b9791181eb174db1a50d903fa9fea9999","0x0000000000000000000000000000000000118c059d41a95311a5c361c6a9a00d","0x0000000000000000000000000000003caf4ad04551a3ffba19cc6a1fff457370","0x00000000000000000000000000000000001dc4d8be804c5289fbf54183f93149","0x00000000000000000000000000000050766764bb82799df5172043c515956263","0x00000000000000000000000000000000000a5849adbac9c33e53571b29aab672","0x0000000000000000000000000000002edb078e589d44ac93e283680b34adf574","0x000000000000000000000000000000000015e9e187c4fb683ca78d52a2a0301b","0x00000000000000000000000000000048ac0f1db3575ed0f84d61ab6cbdd53d9f","0x00000000000000000000000000000000002ddc4243fbc7104347d29a823194ae","0x00000000000000000000000000000070ad92aeea2bdea4277ffdfa3d3ed93443","0x000000000000000000000000000000000003bad3e3aae806c278094cb682a8e0","0x000000000000000000000000000000fb74b99eb44c80d8f7ba83d7e9e2efa5c0","0x00000000000000000000000000000000002819cc14e399c1dadc4f921e2a58fa","0x000000000000000000000000000000e3938bb3e7866c6499ec44fb72549efca0","0x00000000000000000000000000000000002d8264d5cdc2109da12e1864aca147","0x000000000000000000000000000000b12d7828cacbe86350f0b171b0cb0d1cd4","0x0000000000000000000000000000000000244155cecb315326f05641cac9475c","0x070b059f9471e22eed5a9ea08093dba3c59c941634611884c5f0f1a1a6b93e5c","0x118124ada70b46c7d23a6ca8b90d545f30e028b1689fe5c55c86bf55f42e0401","0x25dca6ad78c03ce1f7783cc39a5ea5ef90b318d5edf4f1367d4451c1db3c113e","0x0d9557b4e661b5c53b84fcb41f05d15c0ca112430db16f56d0ab54032fffe734","0x06aedf13a3b182784f4d64162f4706759f95e42fc8dc17d1b8b5f551dafdc007","0x132f97ab5f1f8817689b17e336125c5273d6970a1b3b0901fd26d193a4d2dce4","0x1b0c9980b5b09343e807d82bad307a06d1bfadcd1fa50be666c2907d31ef43e1","0x1ce7000cb24ecc1f2ff9d9507b2290513fed574a84d893811cb54a3c0bc51ccc","0x2e1df58d36444c2dfda98991847422f56ef66f079d26eb7f8110d0d7c46b2c0c","0x166c2f821be7c3e3e4440980e73770840194f14d003778b7fbcdd2690776255c","0x1ae8390287e2eb117851a5011575ba3801e5ee5c66a8f7432e2a2fb13c276008","0x047c09806bfb272d940d9b802e3e49b40050fd0f66717e8b325c5d4834b13aac","0x08f81300d7f64e5b281b37005c7c936800a1fa1ecce2fd1664b8ba9069627558","0x2ed7260e623b68d580304751341bb72141314b881e9e8dade626bf5cde8a077c","0x23e04c035fd9396ca06cdc0171f24da00287e87b338bf45992e2ea41a589d560","0x285c5583cbd4609a347a7781a030975402d8e58a99fd72e4c53f4789da3b100c","0x2cd85f0437cf87c7c8881301ce6ee1080329e29a006ef16ff79ba4d20eec4ab8","0x12eb74da267caf98c494db16c87f90f510fdca1f8095b40156a6f0bb066e3400","0x2267004535c434df4cbee1a356e48b1f317cb849ac69c3eb94e377d2274f1e08","0x2c9d4ce9d1d8b8cf1cb90cbc3e121f570c8260c53b48ed2070d474d5a6f12c4e","0x2c6c83ffaad6f30da5aa696973ccfbd0337cb7a5e5f9e5fc8e826dce21e8f51c","0x056c23922e9435f93853044ba96a1c12db97f47053987df5187269ce884ec00f","0x09e82d129a8f5d26cc609fcbd7a865c6dbe8f17fba09fc804acec716bcfffabb","0x0e643693068a8454606e3b4c05e6af7adc39ee8f207b7b0b7d2b245ef1b13567","0x12e040137285ab81f47bd6cc3424f92edc8aeb9e86ecf996af8781a726627013","0x00f01a11c2990ecba44568cb7b2bd25edb46f760ed26ff69e6160c86539d8563","0x28a91699dfa4e85e18e8621d39a147a40930701d2d88546e01adb71a1f8e407f","0x000000000000000000000000000000009d7cc0b2d2bdef816f4fb17e7a6f6c08","0x00000000000000000000000000000000bcfc1a7030171f681f2c6e97c61f4e70","0x00000000000000000000000000000000dc7b742d8d704f4ecf092bb111cf30d8","0x13b099dc4869006fde9df04bf36f4c8f08d4491cc6229ac36a98f93214c79b6a","0x008fa95e0d431d617d8d3288fde7f8bbe36492019943e2018564633528575892","0x0fc66c06bdff20dba4dc491d5cd13cc209c4d2d9e29802db665bb397c2a4e754","0x0fe48ae6623efbaadce6d6b75b87be6caa19c2fd4d94a74149ceb6bcb88251e1","0x1bb41738028855cb5e0085edcd62cff208121427ea19a57425a0cf6bb68deb93","0x0fbc646333ddc21ab1a77b01a35973a56d5a617c482a21a231497fd3cc9b74c1","0x19ab9eaa1a902faff2dd9baa19ff00cea9086baa8c28bcdb95f7a3549eaf09b4","0x25e2b7a7643df4d964cd787b593888b00abfe3ce79e8deaa6d68fd1686b84bcb","0x2d134d7eea07414451e54854d61d5b71245434d0638bba9a1184914f65f2521c","0x03df94e38e9eed8586acd277d180d5d515b49d89d37525f871be2ff4552c586c","0x0b102abb146839f073c4a2514e65a8962f48ee8bbd1801e815d9c42d34665ebd","0x000000000000000000000000000000b7a4109cb92b514401fb63667454a9c892","0x0000000000000000000000000000000000016fce7f8ef56fef466636f3fbc3de","0x00000000000000000000000000000005f2d1c401a7aa14ac7e9fce7c21ec2e1a","0x00000000000000000000000000000000000621322c74c5d0da5eb71a4f2b046f","0x00000000000000000000000000000073d774ad7f61b1c1b93800f7838cca6bde","0x00000000000000000000000000000000002d603cc025e6af192394df113d4677","0x00000000000000000000000000000066a2a702b4d4b1a24af9c56cacb18ae4b8","0x00000000000000000000000000000000000124a3c25b427cfb6fca07525c5b8d"] +# proof = ["0x0000000000000000000000000000008f66908323784e7c5259f4eefab77ca881","0x0000000000000000000000000000000000109cac7b943f9b737d7b023d4f5d8a","0x000000000000000000000000000000e991d3ac0a68a252bd3cd09cd1b43fe1b4","0x000000000000000000000000000000000014213d346a426777351fdabaa0fa26","0x000000000000000000000000000000e4603692a76af630015380b08d0e13c239","0x0000000000000000000000000000000000149e7046461203c1b72392bb93c262","0x000000000000000000000000000000c27ffc719f223ca6ef5476a5b66f03a4a8","0x000000000000000000000000000000000003718c62098243e3c1f38090e61753","0x000000000000000000000000000000749492aa98716ce5bf7c06e5c2a0a8a528","0x000000000000000000000000000000000018e4c7d33848bccdc3eed924bfaa15","0x0000000000000000000000000000004e10a37f41fd7c4fe32982daa498530d62","0x00000000000000000000000000000000001b76c8c59489c63f11280187109dd7","0x0000000000000000000000000000002a6cd84d3b8537a7c3cb0cb9461f02e4bb","0x0000000000000000000000000000000000197e524fd48ca5ccb30d6c5ffe689d","0x0000000000000000000000000000000013bf25498ce1f51078c06dac450c0325","0x000000000000000000000000000000000018d347b88a0c32e32571deb9b40466","0x00000000000000000000000000000060d496191298eb1b1c2ce18f9a4afcfc55","0x000000000000000000000000000000000024e11b8e8fcb45b8628cb9cc565513","0x00000000000000000000000000000004e976f6d12fff6250eea2d21c570d3d6a","0x00000000000000000000000000000000000967dbd89d2c7dc0121ea71ded7203","0x000000000000000000000000000000d96f810588c0daa43e88d765a3f82ea9b7","0x00000000000000000000000000000000001f69d7015fe6694bd1d4d61049dae9","0x000000000000000000000000000000c539910d0f81a890fa3d996a676db39640","0x000000000000000000000000000000000026d8b64020a669e24f740b4eba633a","0x000000000000000000000000000000c53cc90f99c40eb5d449f38180d9e9c8b6","0x00000000000000000000000000000000001071ddf2bacc2367dfb2c5084b7dd1","0x0000000000000000000000000000001b9791181eb174db1a50d903fa9fea9999","0x0000000000000000000000000000000000118c059d41a95311a5c361c6a9a00d","0x0000000000000000000000000000003caf4ad04551a3ffba19cc6a1fff457370","0x00000000000000000000000000000000001dc4d8be804c5289fbf54183f93149","0x00000000000000000000000000000050766764bb82799df5172043c515956263","0x00000000000000000000000000000000000a5849adbac9c33e53571b29aab672","0x0000000000000000000000000000002edb078e589d44ac93e283680b34adf574","0x000000000000000000000000000000000015e9e187c4fb683ca78d52a2a0301b","0x00000000000000000000000000000048ac0f1db3575ed0f84d61ab6cbdd53d9f","0x00000000000000000000000000000000002ddc4243fbc7104347d29a823194ae","0x00000000000000000000000000000070ad92aeea2bdea4277ffdfa3d3ed93443","0x000000000000000000000000000000000003bad3e3aae806c278094cb682a8e0","0x000000000000000000000000000000fb74b99eb44c80d8f7ba83d7e9e2efa5c0","0x00000000000000000000000000000000002819cc14e399c1dadc4f921e2a58fa","0x000000000000000000000000000000e3938bb3e7866c6499ec44fb72549efca0","0x00000000000000000000000000000000002d8264d5cdc2109da12e1864aca147","0x000000000000000000000000000000b12d7828cacbe86350f0b171b0cb0d1cd4","0x0000000000000000000000000000000000244155cecb315326f05641cac9475c","0x070b059f9471e22eed5a9ea08093dba3c59c941634611884c5f0f1a1a6b93e5c","0x118124ada70b46c7d23a6ca8b90d545f30e028b1689fe5c55c86bf55f42e0401","0x25dca6ad78c03ce1f7783cc39a5ea5ef90b318d5edf4f1367d4451c1db3c113e","0x0d9557b4e661b5c53b84fcb41f05d15c0ca112430db16f56d0ab54032fffe734","0x06aedf13a3b182784f4d64162f4706759f95e42fc8dc17d1b8b5f551dafdc007","0x132f97ab5f1f8817689b17e336125c5273d6970a1b3b0901fd26d193a4d2dce4","0x1b0c9980b5b09343e807d82bad307a06d1bfadcd1fa50be666c2907d31ef43e1","0x1ce7000cb24ecc1f2ff9d9507b2290513fed574a84d893811cb54a3c0bc51ccc","0x2e1df58d36444c2dfda98991847422f56ef66f079d26eb7f8110d0d7c46b2c0c","0x166c2f821be7c3e3e4440980e73770840194f14d003778b7fbcdd2690776255c","0x1ae8390287e2eb117851a5011575ba3801e5ee5c66a8f7432e2a2fb13c276008","0x047c09806bfb272d940d9b802e3e49b40050fd0f66717e8b325c5d4834b13aac","0x08f81300d7f64e5b281b37005c7c936800a1fa1ecce2fd1664b8ba9069627558","0x2ed7260e623b68d580304751341bb72141314b881e9e8dade626bf5cde8a077c","0x23e04c035fd9396ca06cdc0171f24da00287e87b338bf45992e2ea41a589d560","0x285c5583cbd4609a347a7781a030975402d8e58a99fd72e4c53f4789da3b100c","0x2cd85f0437cf87c7c8881301ce6ee1080329e29a006ef16ff79ba4d20eec4ab8","0x12eb74da267caf98c494db16c87f90f510fdca1f8095b40156a6f0bb066e3400","0x2267004535c434df4cbee1a356e48b1f317cb849ac69c3eb94e377d2274f1e08","0x2c9d4ce9d1d8b8cf1cb90cbc3e121f570c8260c53b48ed2070d474d5a6f12c4e","0x2c6c83ffaad6f30da5aa696973ccfbd0337cb7a5e5f9e5fc8e826dce21e8f51c","0x056c23922e9435f93853044ba96a1c12db97f47053987df5187269ce884ec00f","0x09e82d129a8f5d26cc609fcbd7a865c6dbe8f17fba09fc804acec716bcfffabb","0x0e643693068a8454606e3b4c05e6af7adc39ee8f207b7b0b7d2b245ef1b13567","0x12e040137285ab81f47bd6cc3424f92edc8aeb9e86ecf996af8781a726627013","0x00f01a11c2990ecba44568cb7b2bd25edb46f760ed26ff69e6160c86539d8563","0x28a91699dfa4e85e18e8621d39a147a40930701d2d88546e01adb71a1f8e407f","0x000000000000000000000000000000009d7cc0b2d2bdef816f4fb17e7a6f6c08","0x00000000000000000000000000000000bcfc1a7030171f681f2c6e97c61f4e70","0x00000000000000000000000000000000dc7b742d8d704f4ecf092bb111cf30d8","0x13b099dc4869006fde9df04bf36f4c8f08d4491cc6229ac36a98f93214c79b6a","0x008fa95e0d431d617d8d3288fde7f8bbe36492019943e2018564633528575892","0x0fc66c06bdff20dba4dc491d5cd13cc209c4d2d9e29802db665bb397c2a4e754","0x0fe48ae6623efbaadce6d6b75b87be6caa19c2fd4d94a74149ceb6bcb88251e1","0x1bb41738028855cb5e0085edcd62cff208121427ea19a57425a0cf6bb68deb93","0x0fbc646333ddc21ab1a77b01a35973a56d5a617c482a21a231497fd3cc9b74c1","0x19ab9eaa1a902faff2dd9baa19ff00cea9086baa8c28bcdb95f7a3549eaf09b4","0x25e2b7a7643df4d964cd787b593888b00abfe3ce79e8deaa6d68fd1686b84bcb","0x2d134d7eea07414451e54854d61d5b71245434d0638bba9a1184914f65f2521c","0x03df94e38e9eed8586acd277d180d5d515b49d89d37525f871be2ff4552c586c","0x0b102abb146839f073c4a2514e65a8962f48ee8bbd1801e815d9c42d34665ebd","0x000000000000000000000000000000b7a4109cb92b514401fb63667454a9c892","0x0000000000000000000000000000000000016fce7f8ef56fef466636f3fbc3de","0x00000000000000000000000000000005f2d1c401a7aa14ac7e9fce7c21ec2e1a","0x00000000000000000000000000000000000621322c74c5d0da5eb71a4f2b046f","0x00000000000000000000000000000073d774ad7f61b1c1b93800f7838cca6bde","0x00000000000000000000000000000000002d603cc025e6af192394df113d4677","0x00000000000000000000000000000066a2a702b4d4b1a24af9c56cacb18ae4b8","0x00000000000000000000000000000000000124a3c25b427cfb6fca07525c5b8d"] # public_inputs = ["0x0000000000000000000000000000000000000000000000000000000000000003"] # verification_key = ["0x2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e80","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x00000000000000000000000000000092139c61bae1a44f0fc7689507414be688","0x00000000000000000000000000000000000160ce4e279582f91bde4f03f5e9a2","0x0000000000000000000000000000005dc2d37f658c3b2d60f24740eb13b65d79","0x000000000000000000000000000000000007e3e8a5d98a1177ec85bf88f163a5","0x000000000000000000000000000000dc3035fbd7ff16412a8fd7da587a935298","0x000000000000000000000000000000000023d08e2817ac16990004ed11d8fc66","0x000000000000000000000000000000356a5ad59c646c746a8d09f5d154e47c4f","0x00000000000000000000000000000000000708529196af3c8e16ffa580c26182","0x0000000000000000000000000000002ddfe70eb7a1280596e8e4a804f118a6dd","0x000000000000000000000000000000000013757e15a0905f298303784a161b21","0x000000000000000000000000000000a23a729df796935c7824e3a26be794829b","0x000000000000000000000000000000000005775b6c146c4a59856e869fe5a70e","0x000000000000000000000000000000eef0c9e088fd2d45aa40311082d1f2809b","0x00000000000000000000000000000000001d539ccbfc556d0ad59307a218de65","0x000000000000000000000000000000a2c848beceb6ab7806fd3b88037b8410fc","0x0000000000000000000000000000000000177004deeb1f9d401fd7b1af1a5ac8","0x0000000000000000000000000000002508eb63672a733f20de1a97644be4f540","0x00000000000000000000000000000000000d82d51f2f75d806285fd248c819b8","0x000000000000000000000000000000d002f9100cbba8a29f13b11513c53c59d0","0x000000000000000000000000000000000006cd3b0e3460533b9e5ea2cdc0fcbb","0x000000000000000000000000000000f45ea38a93b2f810c5633ddb54927c1c96","0x000000000000000000000000000000000021791de65f9a28ec7024b1a87ab4f3","0x000000000000000000000000000000926511a0439502c86885a8c6f0327aa7ad","0x000000000000000000000000000000000029fa14a969c5d81ed3abbbfb11220a","0x000000000000000000000000000000b84c3258e8206f560e5b5b18cbeafef87e","0x00000000000000000000000000000000002a910445cd8fc895e5d235cd8ea185","0x000000000000000000000000000000887e67f15e84bcb8507a5064a363f6043b","0x000000000000000000000000000000000014dc6643d801c3ef27c2066b6e2bb4","0x000000000000000000000000000000e38e900b42c314ba803088e8fbf125203f","0x000000000000000000000000000000000020690fd4869db418306046b38161dc","0x0000000000000000000000000000001e2fa856bf7951b8292b1e88185993629c","0x0000000000000000000000000000000000048a85e0bbac7c60ad3d78f601f63c","0x0000000000000000000000000000006f457719495073d3666d77a625aeab0c51","0x00000000000000000000000000000000002623ad892dc62b1fa7d0a650f0d470","0x000000000000000000000000000000dbfcc8a467e021c03b13f74a9f79c3a10c","0x0000000000000000000000000000000000295f6f10976c37bd9c6f96bb7187d5","0x000000000000000000000000000000c13ef9a937cc12420fb38d9ab8e848e85e","0x000000000000000000000000000000000003560a3b334e887532f605c9cb7628","0x0000000000000000000000000000009bcebf08a4599cdda0fb96312d4dc0c7a9","0x000000000000000000000000000000000015adc8bb1e01c835f48959d1237bd6","0x00000000000000000000000000000047762ab839e4ff63c77605a9f383da37c2","0x000000000000000000000000000000000016a8c3c53d89660cf271522cd301fb","0x000000000000000000000000000000f0c8539a0b5f94420a513f9c305b932bfe","0x00000000000000000000000000000000002957ba01d9de5638f808f88a692533","0x000000000000000000000000000000ab17c6189d67d3bf5dd2f3885de0151b6f","0x0000000000000000000000000000000000060d8aa43fdc434d1942263f364d95","0x0000000000000000000000000000005d292333b3adb497f00b4bc32d45229060","0x00000000000000000000000000000000001a1018a66221883639f2898a66f345","0x00000000000000000000000000000006555a806b1993291deba0dc44e2abf431","0x00000000000000000000000000000000000cacff7099a9d5e35a21f4a00b2dc3","0x000000000000000000000000000000f50c11ba95d349c36d143eefd12e494950","0x00000000000000000000000000000000001022e8c5f02d639bc9dd8bc4407f99","0x000000000000000000000000000000c76828795098eda73d50b4b585c60afc60","0x00000000000000000000000000000000002bf09c0ec7011e93888962f2406630","0x00000000000000000000000000000049e5c83a8978d832fb8e144548e3ca1adb","0x00000000000000000000000000000000000e0ec242c2e160a984f61ca5adf5f5","0x0000000000000000000000000000009c5d6e08a6605ab4513748ac0fa017dd1c","0x00000000000000000000000000000000001f54baa07558e5fb055bd9ba49c067","0x0000000000000000000000000000001e1ee7ee29bbb5e4b080c6091c1433ce62","0x000000000000000000000000000000000024aec62a9d9763499267dc98c33428","0x0000000000000000000000000000001a96755946ff16f0d6632365f0eb0ab4d4","0x000000000000000000000000000000000028cf3e22bcd53782ebc3e0490e27e5","0x00000000000000000000000000000043148d7d8c9ba43f2133fab4201435a364","0x0000000000000000000000000000000000234ce541f1f5117dd404cfaf01a229","0x000000000000000000000000000000a7fb95ffb461d9514a1070e2d2403982ef","0x00000000000000000000000000000000003016955028b6390f446c3fd0c5b424","0x00000000000000000000000000000008863c3b7cd7cddc20ba79ce915051c56e","0x000000000000000000000000000000000013ef666111b0be56a235983d397d2a","0x000000000000000000000000000000e3993f465fc9f56e93ac769e597b752c1c","0x0000000000000000000000000000000000217f7c4235161e9a3c16c45b6ca499","0x0000000000000000000000000000008ffa4cd96bc67b0b7df5678271e1114075","0x0000000000000000000000000000000000256467bfcb63d9fdcb5dde397757ad","0x00000000000000000000000000000054e5eb270bb64bde6e6ececadfd8c3236c","0x00000000000000000000000000000000000e52d1bd75812c33c6f3d79ee4b94c","0x000000000000000000000000000000484a2c641dce55bc2dd64ef0cd790a7fea","0x00000000000000000000000000000000000ff417d256be43e73c8b1aa85bdda3","0x0000000000000000000000000000000b72e7b7713ab5da44e0f864182e748a23","0x00000000000000000000000000000000001a221055f1625ad833a44705f5f74e","0x00000000000000000000000000000067a99a34e9b81a17ad001db02e29bcb82a","0x000000000000000000000000000000000018a6c02e398389827568fa960e86e2","0x000000000000000000000000000000bb29f26f9890d6cc6401f4921d5884edca","0x00000000000000000000000000000000000868357b28039385c5a5058b6d358e","0x00000000000000000000000000000036fb6e229dde8edf7ec858b12d7e8be485","0x00000000000000000000000000000000001060afe929554ca473103f5e68193c","0x00000000000000000000000000000015226e07e207744c0857074dcab883af4a","0x00000000000000000000000000000000000b1c02619282755533457230b19b4a","0x0000000000000000000000000000001f2a0277e4807e6e1cbabca21dde5eb5e1","0x00000000000000000000000000000000000d928deafed363659688ed4ccdef52","0x000000000000000000000000000000363f0c994e91cecad25835338edee2294f","0x00000000000000000000000000000000002eea648c8732596b1314fe2a4d2f05","0x000000000000000000000000000000b2671d2ae51d31c1210433c3972bb64578","0x00000000000000000000000000000000000ab49886c2b94bd0bd3f6ed1dbbe2c"] -# proof_b = ["0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000002ab91b132e624f2a408aa8c9bf31cca8d7","0x000000000000000000000000000000000015ad57528e0f065c820cc5ad4eab81","0x0000000000000000000000000000001acb78b1b6a5c9a6ec8bf2272b463014da","0x0000000000000000000000000000000000117fd65346e04bf3666d2ab3f24c90","0x000000000000000000000000000000aad0adaf9a768ba6a178f804edac5c8943","0x000000000000000000000000000000000004a11c7d31f25c20e3af16f9b01f71","0x0000000000000000000000000000001f0ae9bb921893ce2710148eb1fcd99e39","0x0000000000000000000000000000000000123fda5008d3709f5afeda01de1930","0x000000000000000000000000000000971c2a8d0119097fd82b7a8074a14853f8","0x000000000000000000000000000000000009965b998750710678da7891d8aba6","0x0000000000000000000000000000002d6ef3813ba14a5f5202afed6b1c41de1c","0x000000000000000000000000000000000020366bfdb2f9279c43d66f90dfdf4d","0x00000000000000000000000000000041389f221eadec33e1b87518668c3bc92e","0x00000000000000000000000000000000000d3858169bb0432ab761d4be8ef03e","0x000000000000000000000000000000c1dbfe670dc912cb0fa1a0f633f81a4cef","0x00000000000000000000000000000000000fc0c403e668b0f51e07089082c32f","0x0000000000000000000000000000009a4fba9bf1369f637fd295c8bf795c9d02","0x00000000000000000000000000000000001d6d1e7286ce52401e6ea79d2cfa3d","0x0000000000000000000000000000004762bf7702ffe7a2c147e704280cd50bba","0x0000000000000000000000000000000000205797cdeaeff9a8d5ea4b95d41b1a","0x000000000000000000000000000000b3d43cc863ba8d98f51118c0db70761079","0x00000000000000000000000000000000002d2a3d10381bc6b47a693c1692b1b6","0x000000000000000000000000000000d35a69fb0e68729f71e651799c0d19e9eb","0x00000000000000000000000000000000002ade1dc7741b7f397271c10e596557","0x0000000000000000000000000000001a67b44714687085004e4142f700043298","0x00000000000000000000000000000000001bb7bbb7f45876b1d72e5d20cee106","0x00000000000000000000000000000025f1f1cbf43fad70cba255b37a19e88b0c","0x00000000000000000000000000000000000cc46b215fbd8e4b233cc74aab250b","0x0000000000000000000000000000008168026f51135fc1670664bc50e629917f","0x000000000000000000000000000000000004d822d80ba0c1bcbd4b000573c6f9","0x000000000000000000000000000000d85756249b937277eba3f5dcb89c56e7bb","0x000000000000000000000000000000000019a3a7a5b20dac138d7ddb1d499134","0x0000000000000000000000000000007621614c7ebc31a2177011f9da01668eb3","0x000000000000000000000000000000000024e9beb5d616ab120073170fc431e8","0x00000000000000000000000000000031fbf901896e958fbbed3e5c57aebbdd04","0x0000000000000000000000000000000000005ac0f10fcc255e179a40518875d4","0x0000000000000000000000000000002dab820c019bcca563b7dbdd26974653e9","0x00000000000000000000000000000000001a5655ec1a67f722b14c65d5c2197f","0x0000000000000000000000000000008e277e490196db5c19d09a9034e10c6432","0x000000000000000000000000000000000003f13b1af07db07eec88698d0aaf2a","0x0000000000000000000000000000002d618452e2b4c790d0551ea5863ed62e76","0x00000000000000000000000000000000001a7171e790a433a972d80218fb482d","0x0000000000000000000000000000005669975cd5bf65a739c0a35a8ab9b7963b","0x00000000000000000000000000000000000d27ffb6f00c86a0ce76a8067d1bce","0x03a0054fe9f93ab96e7c7ed6ec1ac641dffd99a1c804ee5db52cf1efa1a12c15","0x059324381c89c12c87d0f6c27963c31647721fdb02c125961da1a21cbfb3ed1c","0x04a5ead891b7c3f30329e6abcf2ac6903c3c1d8e68874f6baf3a6fc00e84533a","0x03c02f6b862734acf9d0c5133f8141b3a008c5499336a588b376a5dd86d9c837","0x1dd26b35c21c584c410df89d1fd549e7f5da9bb4fd290b7c528d92fbd652f5ad","0x2c8e7ef6f7a130769ae74d0f47aeab5c443492ef4b1ed0b3a9d61dfca80cbdda","0x2b074486c21c62e6eccf3191b3ab3c8df0fb98f0c44b9f0e9e2c281b908b83a6","0x149a6d620be135bba6bbfe8ac826df37567c8be78007e47cdcf5d6e4683d339e","0x119fdfd330036bde31af71e43bd5e191460605e4760d08a6e0ebddbdb5abfeeb","0x1713efc63c00b2de4f68e696d9d30c5603963484f4829e716de2796640864b09","0x1bb1862114cda3712c177b1b6bca0ecd9de7723925698aee83dc91ade7078d3e","0x049d965ad8ccf092dcae948491f702779a513db430e6ec7d15fa1847a6814235","0x093b2cb5b199e125b95d290923ee04ef34a27b6861cdd8fa2bf4308f4d02846a","0x2710c6cd6f14f8071976509d1002e915bfc182b843a3967134de380302423c72","0x24ecb2d6c6678496e574a4248fb813bcd289eda1873763e8afd0c23d340a11a8","0x298a49319f347529c22338a921af16346cdb2b55b81e5065c5cada84da8b53dd","0x2e27df8c780165bc9ed1cd2db3a618ac072c6909e9053ce2dbc4f2cc810c9612","0x07350f3a2e23c1ccbde0d39370159060de5b8df40ae7c58d3f9852b371f1adac","0x2fdf8bf8e2fa2acad0f6d6a3f73e7dc516e8e2d167128bf3a560972339122835","0x0d3ec457703c228d4b6cd1635df9d9bde51997d0228edef64d667cbd16f3cb70","0x148320b9ceab1f3be840dc38b0344e7db0755283d1eacf2dd472e99ee0fb473f","0x06febdcf4869a6b89fdeb0805612c53e139afc29d119a54bc3d72dc7de0f1a7b","0x0b9c542a2136974b7c8d4504e809c7b5adec39de020091c8d9d1460f84905cb0","0x1039ea84fa0387de593bd9897a00ca2d483d779232e77e45efcb5e572b119ee5","0x14d780dfd2d0787135ea6e0e0bf7cca4e28eb54663ce6ac305c5769ed192e11a","0x026127746f9cb625c3301bfbc41bc2c67949be75a032b8ceaddd1580378dd846","0x123cf1180af5fdf09444de423947c9a71790f2c85468b51ecc25fb7bf075a0d5","0x000000000000000000000000000000008419a4f769ceb72c3ac28f559331a5df","0x000000000000000000000000000000009e852c5c1891a89b79b64599e3d52d72","0x00000000000000000000000000000000b8f0b3c0c7549a0ab8a9fbde3478b505","0x056af493dda97ae84cdbbf9ce379e35bdd66e1223eebacdc4a6c2c92553604f4","0x023624c49a722bc8dc5d945b4b10be8ed6c608020e65038a470b5a407375c8aa","0x0ed9f8dd445bda548ef08b7a2ff233867c41b72786f98054597833a68cc9b900","0x2cbf3d04669aa3a0dcda95e19da879f36029abe28317f1ee69be28ddef2a0b87","0x284ca7049611e293aa4535dd7841a540996609d541814373b387b00069636f14","0x246a69ce4030b1e8a675eec89960bfe188bd4073f07afe74f7a77c0698c80bc5","0x1bbdab5d007c4743fbcbf3cc89252baf0b0e1b645b977434ccd4e7560d124761","0x210427e70ee1b484bbb0b4e98263faf24a45325236eed618d51dcb1cb3a9f60d","0x1fbc24b0bd5b0b8c514e138317cc332962714dd306b34939768d723d6ea2ca8e","0x1e74217a6bd46293e6eb721cad346b607a9d6953d677bc5a17fd195e299b9f0f","0x1d2c1e441a4db99b7c88d0b6429ca39792c984d4a63c2f7ab96cc07ee4947390","0x00000000000000000000000000000005b1e3524625c466540f3f7468172403cb","0x000000000000000000000000000000000013bb985f9d5562699347b5dfbc441e","0x000000000000000000000000000000f4fb87d7f481bb198aa6237a0c9ffd3c22","0x0000000000000000000000000000000000254c5f1b76e278f4c71cf5e71533dd","0x0000000000000000000000000000005a72a28b51be9c538b4d28b5106b9239b8","0x00000000000000000000000000000000000d02d80e1a73c82cb0dd8af1aabb3f","0x000000000000000000000000000000434c46502fc1c425a72a4717a3e44c3415","0x00000000000000000000000000000000001c8d74d967b9b65ff2772592a15d0e"] +# proof_b = ["0x0000000000000000000000000000002ab91b132e624f2a408aa8c9bf31cca8d7","0x000000000000000000000000000000000015ad57528e0f065c820cc5ad4eab81","0x0000000000000000000000000000001acb78b1b6a5c9a6ec8bf2272b463014da","0x0000000000000000000000000000000000117fd65346e04bf3666d2ab3f24c90","0x000000000000000000000000000000aad0adaf9a768ba6a178f804edac5c8943","0x000000000000000000000000000000000004a11c7d31f25c20e3af16f9b01f71","0x0000000000000000000000000000001f0ae9bb921893ce2710148eb1fcd99e39","0x0000000000000000000000000000000000123fda5008d3709f5afeda01de1930","0x000000000000000000000000000000971c2a8d0119097fd82b7a8074a14853f8","0x000000000000000000000000000000000009965b998750710678da7891d8aba6","0x0000000000000000000000000000002d6ef3813ba14a5f5202afed6b1c41de1c","0x000000000000000000000000000000000020366bfdb2f9279c43d66f90dfdf4d","0x00000000000000000000000000000041389f221eadec33e1b87518668c3bc92e","0x00000000000000000000000000000000000d3858169bb0432ab761d4be8ef03e","0x000000000000000000000000000000c1dbfe670dc912cb0fa1a0f633f81a4cef","0x00000000000000000000000000000000000fc0c403e668b0f51e07089082c32f","0x0000000000000000000000000000009a4fba9bf1369f637fd295c8bf795c9d02","0x00000000000000000000000000000000001d6d1e7286ce52401e6ea79d2cfa3d","0x0000000000000000000000000000004762bf7702ffe7a2c147e704280cd50bba","0x0000000000000000000000000000000000205797cdeaeff9a8d5ea4b95d41b1a","0x000000000000000000000000000000b3d43cc863ba8d98f51118c0db70761079","0x00000000000000000000000000000000002d2a3d10381bc6b47a693c1692b1b6","0x000000000000000000000000000000d35a69fb0e68729f71e651799c0d19e9eb","0x00000000000000000000000000000000002ade1dc7741b7f397271c10e596557","0x0000000000000000000000000000001a67b44714687085004e4142f700043298","0x00000000000000000000000000000000001bb7bbb7f45876b1d72e5d20cee106","0x00000000000000000000000000000025f1f1cbf43fad70cba255b37a19e88b0c","0x00000000000000000000000000000000000cc46b215fbd8e4b233cc74aab250b","0x0000000000000000000000000000008168026f51135fc1670664bc50e629917f","0x000000000000000000000000000000000004d822d80ba0c1bcbd4b000573c6f9","0x000000000000000000000000000000d85756249b937277eba3f5dcb89c56e7bb","0x000000000000000000000000000000000019a3a7a5b20dac138d7ddb1d499134","0x0000000000000000000000000000007621614c7ebc31a2177011f9da01668eb3","0x000000000000000000000000000000000024e9beb5d616ab120073170fc431e8","0x00000000000000000000000000000031fbf901896e958fbbed3e5c57aebbdd04","0x0000000000000000000000000000000000005ac0f10fcc255e179a40518875d4","0x0000000000000000000000000000002dab820c019bcca563b7dbdd26974653e9","0x00000000000000000000000000000000001a5655ec1a67f722b14c65d5c2197f","0x0000000000000000000000000000008e277e490196db5c19d09a9034e10c6432","0x000000000000000000000000000000000003f13b1af07db07eec88698d0aaf2a","0x0000000000000000000000000000002d618452e2b4c790d0551ea5863ed62e76","0x00000000000000000000000000000000001a7171e790a433a972d80218fb482d","0x0000000000000000000000000000005669975cd5bf65a739c0a35a8ab9b7963b","0x00000000000000000000000000000000000d27ffb6f00c86a0ce76a8067d1bce","0x03a0054fe9f93ab96e7c7ed6ec1ac641dffd99a1c804ee5db52cf1efa1a12c15","0x059324381c89c12c87d0f6c27963c31647721fdb02c125961da1a21cbfb3ed1c","0x04a5ead891b7c3f30329e6abcf2ac6903c3c1d8e68874f6baf3a6fc00e84533a","0x03c02f6b862734acf9d0c5133f8141b3a008c5499336a588b376a5dd86d9c837","0x1dd26b35c21c584c410df89d1fd549e7f5da9bb4fd290b7c528d92fbd652f5ad","0x2c8e7ef6f7a130769ae74d0f47aeab5c443492ef4b1ed0b3a9d61dfca80cbdda","0x2b074486c21c62e6eccf3191b3ab3c8df0fb98f0c44b9f0e9e2c281b908b83a6","0x149a6d620be135bba6bbfe8ac826df37567c8be78007e47cdcf5d6e4683d339e","0x119fdfd330036bde31af71e43bd5e191460605e4760d08a6e0ebddbdb5abfeeb","0x1713efc63c00b2de4f68e696d9d30c5603963484f4829e716de2796640864b09","0x1bb1862114cda3712c177b1b6bca0ecd9de7723925698aee83dc91ade7078d3e","0x049d965ad8ccf092dcae948491f702779a513db430e6ec7d15fa1847a6814235","0x093b2cb5b199e125b95d290923ee04ef34a27b6861cdd8fa2bf4308f4d02846a","0x2710c6cd6f14f8071976509d1002e915bfc182b843a3967134de380302423c72","0x24ecb2d6c6678496e574a4248fb813bcd289eda1873763e8afd0c23d340a11a8","0x298a49319f347529c22338a921af16346cdb2b55b81e5065c5cada84da8b53dd","0x2e27df8c780165bc9ed1cd2db3a618ac072c6909e9053ce2dbc4f2cc810c9612","0x07350f3a2e23c1ccbde0d39370159060de5b8df40ae7c58d3f9852b371f1adac","0x2fdf8bf8e2fa2acad0f6d6a3f73e7dc516e8e2d167128bf3a560972339122835","0x0d3ec457703c228d4b6cd1635df9d9bde51997d0228edef64d667cbd16f3cb70","0x148320b9ceab1f3be840dc38b0344e7db0755283d1eacf2dd472e99ee0fb473f","0x06febdcf4869a6b89fdeb0805612c53e139afc29d119a54bc3d72dc7de0f1a7b","0x0b9c542a2136974b7c8d4504e809c7b5adec39de020091c8d9d1460f84905cb0","0x1039ea84fa0387de593bd9897a00ca2d483d779232e77e45efcb5e572b119ee5","0x14d780dfd2d0787135ea6e0e0bf7cca4e28eb54663ce6ac305c5769ed192e11a","0x026127746f9cb625c3301bfbc41bc2c67949be75a032b8ceaddd1580378dd846","0x123cf1180af5fdf09444de423947c9a71790f2c85468b51ecc25fb7bf075a0d5","0x000000000000000000000000000000008419a4f769ceb72c3ac28f559331a5df","0x000000000000000000000000000000009e852c5c1891a89b79b64599e3d52d72","0x00000000000000000000000000000000b8f0b3c0c7549a0ab8a9fbde3478b505","0x056af493dda97ae84cdbbf9ce379e35bdd66e1223eebacdc4a6c2c92553604f4","0x023624c49a722bc8dc5d945b4b10be8ed6c608020e65038a470b5a407375c8aa","0x0ed9f8dd445bda548ef08b7a2ff233867c41b72786f98054597833a68cc9b900","0x2cbf3d04669aa3a0dcda95e19da879f36029abe28317f1ee69be28ddef2a0b87","0x284ca7049611e293aa4535dd7841a540996609d541814373b387b00069636f14","0x246a69ce4030b1e8a675eec89960bfe188bd4073f07afe74f7a77c0698c80bc5","0x1bbdab5d007c4743fbcbf3cc89252baf0b0e1b645b977434ccd4e7560d124761","0x210427e70ee1b484bbb0b4e98263faf24a45325236eed618d51dcb1cb3a9f60d","0x1fbc24b0bd5b0b8c514e138317cc332962714dd306b34939768d723d6ea2ca8e","0x1e74217a6bd46293e6eb721cad346b607a9d6953d677bc5a17fd195e299b9f0f","0x1d2c1e441a4db99b7c88d0b6429ca39792c984d4a63c2f7ab96cc07ee4947390","0x00000000000000000000000000000005b1e3524625c466540f3f7468172403cb","0x000000000000000000000000000000000013bb985f9d5562699347b5dfbc441e","0x000000000000000000000000000000f4fb87d7f481bb198aa6237a0c9ffd3c22","0x0000000000000000000000000000000000254c5f1b76e278f4c71cf5e71533dd","0x0000000000000000000000000000005a72a28b51be9c538b4d28b5106b9239b8","0x00000000000000000000000000000000000d02d80e1a73c82cb0dd8af1aabb3f","0x000000000000000000000000000000434c46502fc1c425a72a4717a3e44c3415","0x00000000000000000000000000000000001c8d74d967b9b65ff2772592a15d0e"] key_hash = "0x096129b1c6e108252fc5c829c4cc9b7e8f0d1fd9f29c2532b563d6396645e08f" -proof = ["0x0000000000000000000000000000000000000000000000000000000000000003","0x000000000000000000000000000000d62b795bec274279129a71195796825fcc","0x00000000000000000000000000000000000793ab763140f20a68a6bd2721fd74","0x00000000000000000000000000000053141d06d3307b36153f321511199e579c","0x00000000000000000000000000000000000a4b55d6c21f98a9c434911dcb5c67","0x0000000000000000000000000000005f9d324c0abd22cec92d99dbec438e9491","0x0000000000000000000000000000000000240dfafe1b53dc27147cbab14ea893","0x000000000000000000000000000000044a61d3aac32c6931247cf334a19d9611","0x000000000000000000000000000000000003f0f8cf4207bfa85c23ec9f8d0c88","0x00000000000000000000000000000002168a470e39ba2ac266f6b474de12045f","0x000000000000000000000000000000000025791e7d3feab542345c00ec5a30df","0x000000000000000000000000000000dcafd76d4c3640969c80e017b951ef6397","0x00000000000000000000000000000000001d27f75a1256771e88e0c86fc42dbc","0x0000000000000000000000000000007347ae7d2d9d7fc2b8f0baa014ee1fed9f","0x000000000000000000000000000000000018bd927f42bf7caf9555f56f09000d","0x000000000000000000000000000000041f765f83cbe5904c8f453f70a4531d10","0x00000000000000000000000000000000001858aabeeb5331a221419f4fed1c19","0x000000000000000000000000000000d254a54caaedf8287b9af951b2f2611121","0x000000000000000000000000000000000005ab493623c9563cf2e55ba5f18200","0x00000000000000000000000000000014f24cddc1a02440dc63637df8032c8074","0x000000000000000000000000000000000011950c16cef98471b1d78b935195a4","0x000000000000000000000000000000b0340b459e6bd5cc8f031c8654a502897f","0x00000000000000000000000000000000000e1cf3968dac4545a76a2ae58e512c","0x0000000000000000000000000000002adf7218aa06ca0d2c2e600dcc39193a2d","0x00000000000000000000000000000000001302e7e4b0f14749bd885ca25588b6","0x00000000000000000000000000000092009ce4056e79ab815d8cdfd4491138ae","0x000000000000000000000000000000000018af11e853c6cf2f0f6274b0da8133","0x000000000000000000000000000000dd3dc6f49232141718527b3a0e4b26e21d","0x00000000000000000000000000000000001a877853348a8b695c4f9a9aa4ce68","0x000000000000000000000000000000aecfc56ba07155450b368140d6324023b5","0x000000000000000000000000000000000029c11052798c57ece614617d33fcc2","0x000000000000000000000000000000eb106ffc816d16fb84e84b0b61157b2603","0x000000000000000000000000000000000026c3cac16206899a21cb5126841446","0x000000000000000000000000000000a782ed54805fe845068b362b58e2fa34ec","0x00000000000000000000000000000000000cf046a1bfcc666b7f28b572676073","0x000000000000000000000000000000b931c8dda60bb4aca4cc817f5540f1209f","0x000000000000000000000000000000000024ad50c3936fafc3d190e6a4874223","0x000000000000000000000000000000cce90cfbaf5671c8c8652db28a3a9566f7","0x000000000000000000000000000000000003574db9d0f84380c9635660f86354","0x0000000000000000000000000000003eb3e1dc31846a90f721e7a08c6d6dc4f7","0x000000000000000000000000000000000028999a700cd1abae1a288eebb9a91c","0x000000000000000000000000000000c1be4d385b11387e14eb9817050d772f78","0x000000000000000000000000000000000003c56b5bad8b4484c66ac921f1f102","0x000000000000000000000000000000ace245cabf0f00dc7fd253dd8af0377a14","0x0000000000000000000000000000000000107f1731fcf34b364c813599fa1df7","0x035b937d404932b542b706eb810ef4a7dca4566d4dde1ad6a8717f46167ead7e","0x17608cef3dc7960f41cb1295706df663727d45ee598a61e05e989d111449fb65","0x054712a950ad67da3aa860e49e6891f99b586b7f37caff94eb013fdb374b61ee","0x04b755083086c769b7f593e0e48d68dc54be808203351380ca5566a48149d8bb","0x17d7670b0915235f626fdc1d7e1134d2be906ef138d7843384b3ebc23b1d630f","0x064cf544ab5f4e3dab47960502cccc83321fb275068dfbdd3a2fcbc6dddcaa65","0x083338262712e2b66769ea40d9f412b18caa1bc81a51ff5a50b6c41f8c4b3d23","0x0cdd38958cab97defde00f4a5961b6fd676e29d9f2c352f6bb2c68b91f83f8af","0x02c8bdd005c2f43a0a8cbb2744916ce5c322dfa5b23367a829c12699f4036d32","0x25bac73c7e7b659fbea3135b7a0decf9db8dc3045bd2837dae337c64cc722546","0x19eb361aa419d37bce3d2e8b2b7692a02a9559e83d7f3d8fe9169970fbbc2cba","0x2494bd5106d00e05c7ea60e632e9fe03773b7f2c5b662aa37ec512a01f4a0775","0x18c52c2f2c6e7be1d7847c15e452a3a9c64316103d12e4b5b9a82fac4e940ee9","0x0e0342810456ef78f498c1bfa085a5f3cbc06db1f32fabd0ea9ad27dccac1680","0x024c13d6ef56af33ed7164ea8e47ddecc8a487b000d8b1b45edcd3895a503ba2","0x26e0d127f626bd39b55bc5d0c131dbf03fe006dc5c3edc57dda1e629799a4317","0x1b1140061bc52b15c4f5e100729a81968ee79dc03deb966a18850335a8e44a8b","0x1bb76f945199e71d531a89288912087a02dd0e83020e65d671485bf2e5e86e1a","0x29269900859c6d86e404185b415bf3b279cd100f38cfdb0077e8d6a299c4fd35","0x22b5e94bae2f6f0cdb424a3b12c4bf82cec3fb228e012c1974ed457827bbe012","0x18d3543a93249778e7a57936170dae85ffc47c2567f2d0076a32c0bb86fcf10a","0x03721dc2670206cde42a175fd56bcce32cf6cb8801450a8e8e4b3d4e07785973","0x2806db136dd214d3ac1478460855cae6a4324ab45cab35320d104fee26c260e8","0x1c3749f1937082afbbae9375b9be708cf339e1983e57ef4447f36cfa560c685c","0x1067b8cfb90ef08bcb48aea56b2716334241787c2004a95682d68a0685566fd0","0x0f41aee4416398f1d48ffc302403273cddef34a41f98507c53682041d82e51ff","0x10d854c9f0bfbdff7ca91a68f4978e9a79e7b14243d92f465f17bdf88d9f64f8","0x00000000000000000000000000000000018938b11099e0cdc05ddab84a153a97","0x0000000000000000000000000000000001d7dda1471f0dc3b3a3d3438c197982","0x00000000000000000000000000000000022682917da43ab9a6e9cbcece1db86d","0x2453913e6b0f36eab883ac4b0e0604d56aaeb9c55e641135173e63c342f1a660","0x05216c1b58dc43a49d01aaba3113b0e86be450fc17d28016e648e7162a1b67fb","0x152b34845a0222a2b41354c0d395a250d8363dc18748647d85acd89d6934ec56","0x1dfc6e971ce82b7dcda1f7f282713c6e22a8c79258a61209bda69719806da544","0x2968dd8b3af8e3953f1fbbd72f4c49b8270597bb27d4037adc157ac6083bee60","0x1b9425b88a4c7d39b3d75afe66917a9aa1d2055724392bc01fb918d84ff1410e","0x04ab571f236d8e750904dc307dd274003d9130f1a7110e4c1521cfb408877c73","0x2ad84f26fdc5831545272d02b806bb0e6dae44e71f73552c4eb9ff06030748c7","0x020e632b99d325db774b8630fb50b9a4e74d35b7f27d9fc02c65087ee747e42c","0x09a8c5a3171268cb61c02515c01c109889200ed13f415ae54df2078bbb887f92","0x1143281a9451abbb4c34c3fa84e7678c2af2e7ea8c05160a6f7f06988fc91af8","0x000000000000000000000000000000cbda736ca5cf6bc75413c2cc9e28ab0a68","0x00000000000000000000000000000000001ee78c9cc56aa5991062ae2e338587","0x000000000000000000000000000000bc9bfcdebb486f4cb314e681d2cc5f8df6","0x00000000000000000000000000000000000ad538431d04771bca7f633cb659ff","0x000000000000000000000000000000d45b317afcefa466a59bba9e171f1af70c","0x0000000000000000000000000000000000133c50180ea17932e4881124e7a7c6","0x000000000000000000000000000000fc9ed37f543775849f3e84eaa06f77f992","0x00000000000000000000000000000000001372873c9c051d1baff99248b8f70e"] +proof = ["0x000000000000000000000000000000d62b795bec274279129a71195796825fcc","0x00000000000000000000000000000000000793ab763140f20a68a6bd2721fd74","0x00000000000000000000000000000053141d06d3307b36153f321511199e579c","0x00000000000000000000000000000000000a4b55d6c21f98a9c434911dcb5c67","0x0000000000000000000000000000005f9d324c0abd22cec92d99dbec438e9491","0x0000000000000000000000000000000000240dfafe1b53dc27147cbab14ea893","0x000000000000000000000000000000044a61d3aac32c6931247cf334a19d9611","0x000000000000000000000000000000000003f0f8cf4207bfa85c23ec9f8d0c88","0x00000000000000000000000000000002168a470e39ba2ac266f6b474de12045f","0x000000000000000000000000000000000025791e7d3feab542345c00ec5a30df","0x000000000000000000000000000000dcafd76d4c3640969c80e017b951ef6397","0x00000000000000000000000000000000001d27f75a1256771e88e0c86fc42dbc","0x0000000000000000000000000000007347ae7d2d9d7fc2b8f0baa014ee1fed9f","0x000000000000000000000000000000000018bd927f42bf7caf9555f56f09000d","0x000000000000000000000000000000041f765f83cbe5904c8f453f70a4531d10","0x00000000000000000000000000000000001858aabeeb5331a221419f4fed1c19","0x000000000000000000000000000000d254a54caaedf8287b9af951b2f2611121","0x000000000000000000000000000000000005ab493623c9563cf2e55ba5f18200","0x00000000000000000000000000000014f24cddc1a02440dc63637df8032c8074","0x000000000000000000000000000000000011950c16cef98471b1d78b935195a4","0x000000000000000000000000000000b0340b459e6bd5cc8f031c8654a502897f","0x00000000000000000000000000000000000e1cf3968dac4545a76a2ae58e512c","0x0000000000000000000000000000002adf7218aa06ca0d2c2e600dcc39193a2d","0x00000000000000000000000000000000001302e7e4b0f14749bd885ca25588b6","0x00000000000000000000000000000092009ce4056e79ab815d8cdfd4491138ae","0x000000000000000000000000000000000018af11e853c6cf2f0f6274b0da8133","0x000000000000000000000000000000dd3dc6f49232141718527b3a0e4b26e21d","0x00000000000000000000000000000000001a877853348a8b695c4f9a9aa4ce68","0x000000000000000000000000000000aecfc56ba07155450b368140d6324023b5","0x000000000000000000000000000000000029c11052798c57ece614617d33fcc2","0x000000000000000000000000000000eb106ffc816d16fb84e84b0b61157b2603","0x000000000000000000000000000000000026c3cac16206899a21cb5126841446","0x000000000000000000000000000000a782ed54805fe845068b362b58e2fa34ec","0x00000000000000000000000000000000000cf046a1bfcc666b7f28b572676073","0x000000000000000000000000000000b931c8dda60bb4aca4cc817f5540f1209f","0x000000000000000000000000000000000024ad50c3936fafc3d190e6a4874223","0x000000000000000000000000000000cce90cfbaf5671c8c8652db28a3a9566f7","0x000000000000000000000000000000000003574db9d0f84380c9635660f86354","0x0000000000000000000000000000003eb3e1dc31846a90f721e7a08c6d6dc4f7","0x000000000000000000000000000000000028999a700cd1abae1a288eebb9a91c","0x000000000000000000000000000000c1be4d385b11387e14eb9817050d772f78","0x000000000000000000000000000000000003c56b5bad8b4484c66ac921f1f102","0x000000000000000000000000000000ace245cabf0f00dc7fd253dd8af0377a14","0x0000000000000000000000000000000000107f1731fcf34b364c813599fa1df7","0x035b937d404932b542b706eb810ef4a7dca4566d4dde1ad6a8717f46167ead7e","0x17608cef3dc7960f41cb1295706df663727d45ee598a61e05e989d111449fb65","0x054712a950ad67da3aa860e49e6891f99b586b7f37caff94eb013fdb374b61ee","0x04b755083086c769b7f593e0e48d68dc54be808203351380ca5566a48149d8bb","0x17d7670b0915235f626fdc1d7e1134d2be906ef138d7843384b3ebc23b1d630f","0x064cf544ab5f4e3dab47960502cccc83321fb275068dfbdd3a2fcbc6dddcaa65","0x083338262712e2b66769ea40d9f412b18caa1bc81a51ff5a50b6c41f8c4b3d23","0x0cdd38958cab97defde00f4a5961b6fd676e29d9f2c352f6bb2c68b91f83f8af","0x02c8bdd005c2f43a0a8cbb2744916ce5c322dfa5b23367a829c12699f4036d32","0x25bac73c7e7b659fbea3135b7a0decf9db8dc3045bd2837dae337c64cc722546","0x19eb361aa419d37bce3d2e8b2b7692a02a9559e83d7f3d8fe9169970fbbc2cba","0x2494bd5106d00e05c7ea60e632e9fe03773b7f2c5b662aa37ec512a01f4a0775","0x18c52c2f2c6e7be1d7847c15e452a3a9c64316103d12e4b5b9a82fac4e940ee9","0x0e0342810456ef78f498c1bfa085a5f3cbc06db1f32fabd0ea9ad27dccac1680","0x024c13d6ef56af33ed7164ea8e47ddecc8a487b000d8b1b45edcd3895a503ba2","0x26e0d127f626bd39b55bc5d0c131dbf03fe006dc5c3edc57dda1e629799a4317","0x1b1140061bc52b15c4f5e100729a81968ee79dc03deb966a18850335a8e44a8b","0x1bb76f945199e71d531a89288912087a02dd0e83020e65d671485bf2e5e86e1a","0x29269900859c6d86e404185b415bf3b279cd100f38cfdb0077e8d6a299c4fd35","0x22b5e94bae2f6f0cdb424a3b12c4bf82cec3fb228e012c1974ed457827bbe012","0x18d3543a93249778e7a57936170dae85ffc47c2567f2d0076a32c0bb86fcf10a","0x03721dc2670206cde42a175fd56bcce32cf6cb8801450a8e8e4b3d4e07785973","0x2806db136dd214d3ac1478460855cae6a4324ab45cab35320d104fee26c260e8","0x1c3749f1937082afbbae9375b9be708cf339e1983e57ef4447f36cfa560c685c","0x1067b8cfb90ef08bcb48aea56b2716334241787c2004a95682d68a0685566fd0","0x0f41aee4416398f1d48ffc302403273cddef34a41f98507c53682041d82e51ff","0x10d854c9f0bfbdff7ca91a68f4978e9a79e7b14243d92f465f17bdf88d9f64f8","0x00000000000000000000000000000000018938b11099e0cdc05ddab84a153a97","0x0000000000000000000000000000000001d7dda1471f0dc3b3a3d3438c197982","0x00000000000000000000000000000000022682917da43ab9a6e9cbcece1db86d","0x2453913e6b0f36eab883ac4b0e0604d56aaeb9c55e641135173e63c342f1a660","0x05216c1b58dc43a49d01aaba3113b0e86be450fc17d28016e648e7162a1b67fb","0x152b34845a0222a2b41354c0d395a250d8363dc18748647d85acd89d6934ec56","0x1dfc6e971ce82b7dcda1f7f282713c6e22a8c79258a61209bda69719806da544","0x2968dd8b3af8e3953f1fbbd72f4c49b8270597bb27d4037adc157ac6083bee60","0x1b9425b88a4c7d39b3d75afe66917a9aa1d2055724392bc01fb918d84ff1410e","0x04ab571f236d8e750904dc307dd274003d9130f1a7110e4c1521cfb408877c73","0x2ad84f26fdc5831545272d02b806bb0e6dae44e71f73552c4eb9ff06030748c7","0x020e632b99d325db774b8630fb50b9a4e74d35b7f27d9fc02c65087ee747e42c","0x09a8c5a3171268cb61c02515c01c109889200ed13f415ae54df2078bbb887f92","0x1143281a9451abbb4c34c3fa84e7678c2af2e7ea8c05160a6f7f06988fc91af8","0x000000000000000000000000000000cbda736ca5cf6bc75413c2cc9e28ab0a68","0x00000000000000000000000000000000001ee78c9cc56aa5991062ae2e338587","0x000000000000000000000000000000bc9bfcdebb486f4cb314e681d2cc5f8df6","0x00000000000000000000000000000000000ad538431d04771bca7f633cb659ff","0x000000000000000000000000000000d45b317afcefa466a59bba9e171f1af70c","0x0000000000000000000000000000000000133c50180ea17932e4881124e7a7c6","0x000000000000000000000000000000fc9ed37f543775849f3e84eaa06f77f992","0x00000000000000000000000000000000001372873c9c051d1baff99248b8f70e"] public_inputs = ["0x0000000000000000000000000000000000000000000000000000000000000003"] verification_key = ["0x2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e80","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x00000000000000000000000000000092139c61bae1a44f0fc7689507414be688","0x00000000000000000000000000000000000160ce4e279582f91bde4f03f5e9a2","0x0000000000000000000000000000005dc2d37f658c3b2d60f24740eb13b65d79","0x000000000000000000000000000000000007e3e8a5d98a1177ec85bf88f163a5","0x000000000000000000000000000000dc3035fbd7ff16412a8fd7da587a935298","0x000000000000000000000000000000000023d08e2817ac16990004ed11d8fc66","0x000000000000000000000000000000356a5ad59c646c746a8d09f5d154e47c4f","0x00000000000000000000000000000000000708529196af3c8e16ffa580c26182","0x0000000000000000000000000000002ddfe70eb7a1280596e8e4a804f118a6dd","0x000000000000000000000000000000000013757e15a0905f298303784a161b21","0x000000000000000000000000000000a23a729df796935c7824e3a26be794829b","0x000000000000000000000000000000000005775b6c146c4a59856e869fe5a70e","0x000000000000000000000000000000eef0c9e088fd2d45aa40311082d1f2809b","0x00000000000000000000000000000000001d539ccbfc556d0ad59307a218de65","0x000000000000000000000000000000a2c848beceb6ab7806fd3b88037b8410fc","0x0000000000000000000000000000000000177004deeb1f9d401fd7b1af1a5ac8","0x0000000000000000000000000000002508eb63672a733f20de1a97644be4f540","0x00000000000000000000000000000000000d82d51f2f75d806285fd248c819b8","0x000000000000000000000000000000d002f9100cbba8a29f13b11513c53c59d0","0x000000000000000000000000000000000006cd3b0e3460533b9e5ea2cdc0fcbb","0x000000000000000000000000000000f45ea38a93b2f810c5633ddb54927c1c96","0x000000000000000000000000000000000021791de65f9a28ec7024b1a87ab4f3","0x000000000000000000000000000000926511a0439502c86885a8c6f0327aa7ad","0x000000000000000000000000000000000029fa14a969c5d81ed3abbbfb11220a","0x000000000000000000000000000000b84c3258e8206f560e5b5b18cbeafef87e","0x00000000000000000000000000000000002a910445cd8fc895e5d235cd8ea185","0x000000000000000000000000000000887e67f15e84bcb8507a5064a363f6043b","0x000000000000000000000000000000000014dc6643d801c3ef27c2066b6e2bb4","0x000000000000000000000000000000e38e900b42c314ba803088e8fbf125203f","0x000000000000000000000000000000000020690fd4869db418306046b38161dc","0x0000000000000000000000000000001e2fa856bf7951b8292b1e88185993629c","0x0000000000000000000000000000000000048a85e0bbac7c60ad3d78f601f63c","0x0000000000000000000000000000006f457719495073d3666d77a625aeab0c51","0x00000000000000000000000000000000002623ad892dc62b1fa7d0a650f0d470","0x000000000000000000000000000000dbfcc8a467e021c03b13f74a9f79c3a10c","0x0000000000000000000000000000000000295f6f10976c37bd9c6f96bb7187d5","0x000000000000000000000000000000c13ef9a937cc12420fb38d9ab8e848e85e","0x000000000000000000000000000000000003560a3b334e887532f605c9cb7628","0x0000000000000000000000000000009bcebf08a4599cdda0fb96312d4dc0c7a9","0x000000000000000000000000000000000015adc8bb1e01c835f48959d1237bd6","0x00000000000000000000000000000047762ab839e4ff63c77605a9f383da37c2","0x000000000000000000000000000000000016a8c3c53d89660cf271522cd301fb","0x000000000000000000000000000000f0c8539a0b5f94420a513f9c305b932bfe","0x00000000000000000000000000000000002957ba01d9de5638f808f88a692533","0x000000000000000000000000000000ab17c6189d67d3bf5dd2f3885de0151b6f","0x0000000000000000000000000000000000060d8aa43fdc434d1942263f364d95","0x0000000000000000000000000000005d292333b3adb497f00b4bc32d45229060","0x00000000000000000000000000000000001a1018a66221883639f2898a66f345","0x00000000000000000000000000000006555a806b1993291deba0dc44e2abf431","0x00000000000000000000000000000000000cacff7099a9d5e35a21f4a00b2dc3","0x000000000000000000000000000000f50c11ba95d349c36d143eefd12e494950","0x00000000000000000000000000000000001022e8c5f02d639bc9dd8bc4407f99","0x000000000000000000000000000000c76828795098eda73d50b4b585c60afc60","0x00000000000000000000000000000000002bf09c0ec7011e93888962f2406630","0x00000000000000000000000000000049e5c83a8978d832fb8e144548e3ca1adb","0x00000000000000000000000000000000000e0ec242c2e160a984f61ca5adf5f5","0x0000000000000000000000000000009c5d6e08a6605ab4513748ac0fa017dd1c","0x00000000000000000000000000000000001f54baa07558e5fb055bd9ba49c067","0x0000000000000000000000000000001e1ee7ee29bbb5e4b080c6091c1433ce62","0x000000000000000000000000000000000024aec62a9d9763499267dc98c33428","0x0000000000000000000000000000001a96755946ff16f0d6632365f0eb0ab4d4","0x000000000000000000000000000000000028cf3e22bcd53782ebc3e0490e27e5","0x00000000000000000000000000000043148d7d8c9ba43f2133fab4201435a364","0x0000000000000000000000000000000000234ce541f1f5117dd404cfaf01a229","0x000000000000000000000000000000a7fb95ffb461d9514a1070e2d2403982ef","0x00000000000000000000000000000000003016955028b6390f446c3fd0c5b424","0x00000000000000000000000000000008863c3b7cd7cddc20ba79ce915051c56e","0x000000000000000000000000000000000013ef666111b0be56a235983d397d2a","0x000000000000000000000000000000e3993f465fc9f56e93ac769e597b752c1c","0x0000000000000000000000000000000000217f7c4235161e9a3c16c45b6ca499","0x0000000000000000000000000000008ffa4cd96bc67b0b7df5678271e1114075","0x0000000000000000000000000000000000256467bfcb63d9fdcb5dde397757ad","0x00000000000000000000000000000054e5eb270bb64bde6e6ececadfd8c3236c","0x00000000000000000000000000000000000e52d1bd75812c33c6f3d79ee4b94c","0x000000000000000000000000000000484a2c641dce55bc2dd64ef0cd790a7fea","0x00000000000000000000000000000000000ff417d256be43e73c8b1aa85bdda3","0x0000000000000000000000000000000b72e7b7713ab5da44e0f864182e748a23","0x00000000000000000000000000000000001a221055f1625ad833a44705f5f74e","0x00000000000000000000000000000067a99a34e9b81a17ad001db02e29bcb82a","0x000000000000000000000000000000000018a6c02e398389827568fa960e86e2","0x000000000000000000000000000000bb29f26f9890d6cc6401f4921d5884edca","0x00000000000000000000000000000000000868357b28039385c5a5058b6d358e","0x00000000000000000000000000000036fb6e229dde8edf7ec858b12d7e8be485","0x00000000000000000000000000000000001060afe929554ca473103f5e68193c","0x00000000000000000000000000000015226e07e207744c0857074dcab883af4a","0x00000000000000000000000000000000000b1c02619282755533457230b19b4a","0x0000000000000000000000000000001f2a0277e4807e6e1cbabca21dde5eb5e1","0x00000000000000000000000000000000000d928deafed363659688ed4ccdef52","0x000000000000000000000000000000363f0c994e91cecad25835338edee2294f","0x00000000000000000000000000000000002eea648c8732596b1314fe2a4d2f05","0x000000000000000000000000000000b2671d2ae51d31c1210433c3972bb64578","0x00000000000000000000000000000000000ab49886c2b94bd0bd3f6ed1dbbe2c"] -proof_b = ["0x0000000000000000000000000000000000000000000000000000000000000003","0x000000000000000000000000000000f05c69448ca29bdf52076f9b073bb30fed","0x000000000000000000000000000000000028c86bb3e27b4aaaaef126f7df5349","0x00000000000000000000000000000026ae031fc93594375dfc7f3bbe027f97d5","0x000000000000000000000000000000000000dd12c7290fe7f775796a233b8590","0x000000000000000000000000000000c1ee6631704de424d010c5c4ac8293ac49","0x00000000000000000000000000000000002f41818c9aa83f5c8d9bdd128015b9","0x000000000000000000000000000000b50a5801482f7e3a5de8ab3cce0f10b0d3","0x000000000000000000000000000000000022a0bc69c293dbf293b25bc9eef7f8","0x0000000000000000000000000000003b02abf1967ef394154dc15d763135e903","0x00000000000000000000000000000000000d8a2ee46acc6d1ed8d517b56d47c8","0x00000000000000000000000000000039bf0d1b3d8cf9de898f101c626e978d78","0x0000000000000000000000000000000000008faa7df2451a24d291a9b584f1a5","0x000000000000000000000000000000c1dae329ed7adf63a2d89a5f16fb98b6d8","0x00000000000000000000000000000000001ff0bc16fc0bd4aa2d6255690453c2","0x000000000000000000000000000000d12d7589f853a9b472613efa56689beaf1","0x00000000000000000000000000000000002d6fbc798f4403751df6aeee8bedd3","0x0000000000000000000000000000007c1fa069cb17194fecf88db9dd54a4ee36","0x0000000000000000000000000000000000268e026f9814822a42b2d59eec5d24","0x000000000000000000000000000000c3fb56beab774218cd63498fc050a5fd9b","0x00000000000000000000000000000000000071c014d7b5063f005a0bc2ee1af4","0x000000000000000000000000000000ae12b25371c6af42bbe0a85cddd2eaebc7","0x000000000000000000000000000000000026d270e1ffc9c7c344c694dfadda83","0x00000000000000000000000000000080280858c6be461716921caa3c26f3f6f3","0x000000000000000000000000000000000001dcdd3f39e27d0ce6aa5d14dff4c1","0x000000000000000000000000000000080e1d2c913c834ebcf7e0600c076c08fd","0x00000000000000000000000000000000002df3d142217694e65fb7c355d62764","0x000000000000000000000000000000e5e336f3f59d77e500f49771bfbeb12e83","0x000000000000000000000000000000000028fffe08bdc4c0690643d2e1a1275f","0x000000000000000000000000000000db5618b32afc13e18f21b39f3fbede9d11","0x00000000000000000000000000000000001d244818370d43fb7e8bc67e03787b","0x0000000000000000000000000000006bcc1fd3f9f78449ad1df1bc11bc379edd","0x000000000000000000000000000000000009ac9cbb285edbf5b3a973f3f5f1cb","0x000000000000000000000000000000fd885905b6c0fc95bb4dd0b11f6797d4b3","0x000000000000000000000000000000000021f07995cdd835145e19c38127c562","0x000000000000000000000000000000bbbf2b975c2c97ae4b45c4a52059e53ee3","0x000000000000000000000000000000000024158163788841cf4590bbc1e89a90","0x0000000000000000000000000000009aca93d2b1386ea412d4b36ea5bb9894a8","0x00000000000000000000000000000000002532d1d210e8ed4c2f5c00cbaaa475","0x000000000000000000000000000000634a88caa1d77cb6b5fe77cac31458fc31","0x00000000000000000000000000000000000bdf18bae92fce7cfddab5520cac6e","0x000000000000000000000000000000622e9626255170ccec77602c755aa193e1","0x000000000000000000000000000000000001d4edba370e04436a988bad05dada","0x000000000000000000000000000000b52934323a0aec8f803cdaafee2ab7bfb2","0x0000000000000000000000000000000000155312af5e0e25ca9fd61aef9e58ed","0x06270b517855f6f6a608e432883d1d1030a12a1e33022dc142b7728691421da2","0x2af7c794d7b720b25eb1df0afd8c8e3c15b6e518194c3caea7966a5f8210ff04","0x073fe573aeb27d81a5713be93e1365390dcbc3c8e7439ff1d36a84cc014f5642","0x11351b961147431e54535248b58b35cf5cddb9b13827899167617d7a96794d64","0x297c9421c9c3db286770787c35b86bc41583386491b4ae55e5fa81aefa21efc4","0x0f4eeca3ff4a3495f859898937688652d33f9b4dd3e003e12adf15278e0997c3","0x133e3d8b82721d40d919f2326810ba6f07eff3f7d20d86b2bde692a811522019","0x2c502f53c9698b73bb8c8f9b9cf2d705d16a64a7040348b4b39c637a2064316c","0x0cbc1971e1c566cde9d9125c91cdc88e817db182692f836c1a5170a6246eaf73","0x12c47793e7db706c637cd4b4d96d227f569850176b852b1fe8ad522ddb38ef0e","0x0cd7b300e9309a135285be1aeb02b152f97931a7357ab6d609a2cb1970aab877","0x2a7789dfe286c9d0a7592f1c9316e730cb14c9d843aefc4764d76e7f8571c96a","0x248ac54ce3dbf37796621882a4ac76046df5ab680da487fd85cce76b1ae392d3","0x149d1d07cebe320f77b03533e34912545cedeae62bd9778d37724728762b5710","0x00fe29daebdaed61309790e70e2dcefa3f3af4c6c965ce424b8dbcf09b8e4b49","0x2b75b3bace61b731d7f0c003a144b62b0a4fbe9f0d14ca89b0652b70210014b3","0x2588ef27cfb6e0d8c6f9a969b2da44fead30a02ed70a563fd15aa45bb671de1c","0x2b74d7674b55642697b4a1e226eddb0e4918b2d57aa5b99093dc46cadcdea000","0x244c626845d3a5040f08f01e9611f968ad675ca857789149b13a0cfa83a2e064","0x2cb8d02f90cae33fd7bcfb80af4aff067c4f5fc4b3f9228d5b8f768bc8f6c971","0x1372f3d1f04e0c39a50e823d5da03d70bebe19a1b8e28f8c2ff601cc0bfc0095","0x19af6601d2613426a50b7c35d60562a5f2f2634e6af56dac13459632e15570ee","0x13c2a16ed3b65dcd9414659be79af17995d344de34eaf962343b0f1e76c73a57","0x0dd5dcdbd50b8774831d4f01f930804d38b4266dfee085185530880a0c3903c0","0x07e91848d660b11b722638680ac60f20db9507fdc8d610ce762600f5a1aacd29","0x1f9c2a94d10c0a7fb60292cfc46fd3d2501181bea0ffe1f5f2501d474be3a785","0x14edb9c5bd389eae08a5ea2a7a1662894e1e878c142084d966a625bef68cf7c3","0x00000000000000000000000000000000cecd01810814d175f0a533f0067618c4","0x00000000000000000000000000000000f82935013ce5c82720c63e533af41db8","0x000000000000000000000000000000012185688171b6bed850e748b66f7222ac","0x2dd7f5ff2150155c2ac86ebe28d9ecbca2eea812b0021ab2bceae111cfea8325","0x04ea6c2daf2b9e827d2213c3d03953410dcf1ed67ba34a3c00e772be92606a8b","0x163f2bd18dcde52f99b9867c944780fd718d1612927053b139b280fc55013d1b","0x05e388fd160ccac30a8f7b18a4bd042f705e92b5937e8c0e9478e2ff623907c6","0x00ba3f6f527d6ed3ff17a63b1d5be3c42bdfae88fdf63311fc7b871157939309","0x16187d9daa8c2e5a1a9ab15be7ca6a8feebfb31bea76f9a3ca69381881c70561","0x0f64522e4904edb7377b14a7b9dad848829167324ef5c016346b3ad8251191ee","0x273bbe6000a4001dce369e5a36cc0b0ca3fd351665b688238aa8c556a6ca6b8e","0x022d2232efb2faa8307846c9a4c697aabad1b7f1336b35ad72fa8922975b49d9","0x0d82d478bff3955c4b0a34ef94427ca5f9da23147ad953c89f2e428277ec2825","0x18d886be90343010659c231583be61a138e28e37c24771e3cb61fbe2587d0671","0x000000000000000000000000000000196ba6a58dbeb7c34cb1d6287e23d434de","0x00000000000000000000000000000000001df8ae8a1589590f8863c1fefd8dfd","0x000000000000000000000000000000f30e11b2c5fbefa166cbb9f58c5f8e1a4c","0x000000000000000000000000000000000026420ade7666bc0ab1cf1fd9d0c534","0x0000000000000000000000000000000feb5b7d8260d25a1ee1ce76ff461673fc","0x00000000000000000000000000000000002bd2ac6223a80671b777bf5dca70a4","0x000000000000000000000000000000690f757006d2fa1ddb0114c9f268783537","0x000000000000000000000000000000000023ad36feadd91e50118f32e97a0204"] \ No newline at end of file +proof_b = ["0x000000000000000000000000000000f05c69448ca29bdf52076f9b073bb30fed","0x000000000000000000000000000000000028c86bb3e27b4aaaaef126f7df5349","0x00000000000000000000000000000026ae031fc93594375dfc7f3bbe027f97d5","0x000000000000000000000000000000000000dd12c7290fe7f775796a233b8590","0x000000000000000000000000000000c1ee6631704de424d010c5c4ac8293ac49","0x00000000000000000000000000000000002f41818c9aa83f5c8d9bdd128015b9","0x000000000000000000000000000000b50a5801482f7e3a5de8ab3cce0f10b0d3","0x000000000000000000000000000000000022a0bc69c293dbf293b25bc9eef7f8","0x0000000000000000000000000000003b02abf1967ef394154dc15d763135e903","0x00000000000000000000000000000000000d8a2ee46acc6d1ed8d517b56d47c8","0x00000000000000000000000000000039bf0d1b3d8cf9de898f101c626e978d78","0x0000000000000000000000000000000000008faa7df2451a24d291a9b584f1a5","0x000000000000000000000000000000c1dae329ed7adf63a2d89a5f16fb98b6d8","0x00000000000000000000000000000000001ff0bc16fc0bd4aa2d6255690453c2","0x000000000000000000000000000000d12d7589f853a9b472613efa56689beaf1","0x00000000000000000000000000000000002d6fbc798f4403751df6aeee8bedd3","0x0000000000000000000000000000007c1fa069cb17194fecf88db9dd54a4ee36","0x0000000000000000000000000000000000268e026f9814822a42b2d59eec5d24","0x000000000000000000000000000000c3fb56beab774218cd63498fc050a5fd9b","0x00000000000000000000000000000000000071c014d7b5063f005a0bc2ee1af4","0x000000000000000000000000000000ae12b25371c6af42bbe0a85cddd2eaebc7","0x000000000000000000000000000000000026d270e1ffc9c7c344c694dfadda83","0x00000000000000000000000000000080280858c6be461716921caa3c26f3f6f3","0x000000000000000000000000000000000001dcdd3f39e27d0ce6aa5d14dff4c1","0x000000000000000000000000000000080e1d2c913c834ebcf7e0600c076c08fd","0x00000000000000000000000000000000002df3d142217694e65fb7c355d62764","0x000000000000000000000000000000e5e336f3f59d77e500f49771bfbeb12e83","0x000000000000000000000000000000000028fffe08bdc4c0690643d2e1a1275f","0x000000000000000000000000000000db5618b32afc13e18f21b39f3fbede9d11","0x00000000000000000000000000000000001d244818370d43fb7e8bc67e03787b","0x0000000000000000000000000000006bcc1fd3f9f78449ad1df1bc11bc379edd","0x000000000000000000000000000000000009ac9cbb285edbf5b3a973f3f5f1cb","0x000000000000000000000000000000fd885905b6c0fc95bb4dd0b11f6797d4b3","0x000000000000000000000000000000000021f07995cdd835145e19c38127c562","0x000000000000000000000000000000bbbf2b975c2c97ae4b45c4a52059e53ee3","0x000000000000000000000000000000000024158163788841cf4590bbc1e89a90","0x0000000000000000000000000000009aca93d2b1386ea412d4b36ea5bb9894a8","0x00000000000000000000000000000000002532d1d210e8ed4c2f5c00cbaaa475","0x000000000000000000000000000000634a88caa1d77cb6b5fe77cac31458fc31","0x00000000000000000000000000000000000bdf18bae92fce7cfddab5520cac6e","0x000000000000000000000000000000622e9626255170ccec77602c755aa193e1","0x000000000000000000000000000000000001d4edba370e04436a988bad05dada","0x000000000000000000000000000000b52934323a0aec8f803cdaafee2ab7bfb2","0x0000000000000000000000000000000000155312af5e0e25ca9fd61aef9e58ed","0x06270b517855f6f6a608e432883d1d1030a12a1e33022dc142b7728691421da2","0x2af7c794d7b720b25eb1df0afd8c8e3c15b6e518194c3caea7966a5f8210ff04","0x073fe573aeb27d81a5713be93e1365390dcbc3c8e7439ff1d36a84cc014f5642","0x11351b961147431e54535248b58b35cf5cddb9b13827899167617d7a96794d64","0x297c9421c9c3db286770787c35b86bc41583386491b4ae55e5fa81aefa21efc4","0x0f4eeca3ff4a3495f859898937688652d33f9b4dd3e003e12adf15278e0997c3","0x133e3d8b82721d40d919f2326810ba6f07eff3f7d20d86b2bde692a811522019","0x2c502f53c9698b73bb8c8f9b9cf2d705d16a64a7040348b4b39c637a2064316c","0x0cbc1971e1c566cde9d9125c91cdc88e817db182692f836c1a5170a6246eaf73","0x12c47793e7db706c637cd4b4d96d227f569850176b852b1fe8ad522ddb38ef0e","0x0cd7b300e9309a135285be1aeb02b152f97931a7357ab6d609a2cb1970aab877","0x2a7789dfe286c9d0a7592f1c9316e730cb14c9d843aefc4764d76e7f8571c96a","0x248ac54ce3dbf37796621882a4ac76046df5ab680da487fd85cce76b1ae392d3","0x149d1d07cebe320f77b03533e34912545cedeae62bd9778d37724728762b5710","0x00fe29daebdaed61309790e70e2dcefa3f3af4c6c965ce424b8dbcf09b8e4b49","0x2b75b3bace61b731d7f0c003a144b62b0a4fbe9f0d14ca89b0652b70210014b3","0x2588ef27cfb6e0d8c6f9a969b2da44fead30a02ed70a563fd15aa45bb671de1c","0x2b74d7674b55642697b4a1e226eddb0e4918b2d57aa5b99093dc46cadcdea000","0x244c626845d3a5040f08f01e9611f968ad675ca857789149b13a0cfa83a2e064","0x2cb8d02f90cae33fd7bcfb80af4aff067c4f5fc4b3f9228d5b8f768bc8f6c971","0x1372f3d1f04e0c39a50e823d5da03d70bebe19a1b8e28f8c2ff601cc0bfc0095","0x19af6601d2613426a50b7c35d60562a5f2f2634e6af56dac13459632e15570ee","0x13c2a16ed3b65dcd9414659be79af17995d344de34eaf962343b0f1e76c73a57","0x0dd5dcdbd50b8774831d4f01f930804d38b4266dfee085185530880a0c3903c0","0x07e91848d660b11b722638680ac60f20db9507fdc8d610ce762600f5a1aacd29","0x1f9c2a94d10c0a7fb60292cfc46fd3d2501181bea0ffe1f5f2501d474be3a785","0x14edb9c5bd389eae08a5ea2a7a1662894e1e878c142084d966a625bef68cf7c3","0x00000000000000000000000000000000cecd01810814d175f0a533f0067618c4","0x00000000000000000000000000000000f82935013ce5c82720c63e533af41db8","0x000000000000000000000000000000012185688171b6bed850e748b66f7222ac","0x2dd7f5ff2150155c2ac86ebe28d9ecbca2eea812b0021ab2bceae111cfea8325","0x04ea6c2daf2b9e827d2213c3d03953410dcf1ed67ba34a3c00e772be92606a8b","0x163f2bd18dcde52f99b9867c944780fd718d1612927053b139b280fc55013d1b","0x05e388fd160ccac30a8f7b18a4bd042f705e92b5937e8c0e9478e2ff623907c6","0x00ba3f6f527d6ed3ff17a63b1d5be3c42bdfae88fdf63311fc7b871157939309","0x16187d9daa8c2e5a1a9ab15be7ca6a8feebfb31bea76f9a3ca69381881c70561","0x0f64522e4904edb7377b14a7b9dad848829167324ef5c016346b3ad8251191ee","0x273bbe6000a4001dce369e5a36cc0b0ca3fd351665b688238aa8c556a6ca6b8e","0x022d2232efb2faa8307846c9a4c697aabad1b7f1336b35ad72fa8922975b49d9","0x0d82d478bff3955c4b0a34ef94427ca5f9da23147ad953c89f2e428277ec2825","0x18d886be90343010659c231583be61a138e28e37c24771e3cb61fbe2587d0671","0x000000000000000000000000000000196ba6a58dbeb7c34cb1d6287e23d434de","0x00000000000000000000000000000000001df8ae8a1589590f8863c1fefd8dfd","0x000000000000000000000000000000f30e11b2c5fbefa166cbb9f58c5f8e1a4c","0x000000000000000000000000000000000026420ade7666bc0ab1cf1fd9d0c534","0x0000000000000000000000000000000feb5b7d8260d25a1ee1ce76ff461673fc","0x00000000000000000000000000000000002bd2ac6223a80671b777bf5dca70a4","0x000000000000000000000000000000690f757006d2fa1ddb0114c9f268783537","0x000000000000000000000000000000000023ad36feadd91e50118f32e97a0204"] \ No newline at end of file diff --git a/noir/test_programs/execution_success/double_verify_proof/src/main.nr b/noir/test_programs/execution_success/double_verify_proof/src/main.nr index 98cd534266a..fc30f1c1088 100644 --- a/noir/test_programs/execution_success/double_verify_proof/src/main.nr +++ b/noir/test_programs/execution_success/double_verify_proof/src/main.nr @@ -2,31 +2,34 @@ use dep::std; fn main( verification_key: [Field; 114], - proof: [Field; 94], + // This is the proof without public inputs attached. + // + // This means: the size of this does not change with the number of public inputs. + proof: [Field; 93], public_inputs: [Field; 1], + // This is currently not public. It is fine given that the vk is a part of the circuit definition. + // I believe we want to eventually make it public too though. key_hash: Field, - input_aggregation_object: [Field; 16], - proof_b: [Field; 94] -) -> pub [Field; 16] { - let output_aggregation_object_a = std::verify_proof( + proof_b: [Field; 93] +) { + // Create dummy aggregation object + // It is no longer needed but we don't want to make a breaking change to the serialization format + // just yet. The object can be anything as the backend is no longer checking it anyways. + let unused_input_aggregation_object = [verification_key[0]]; + + let _ = std::verify_proof( verification_key.as_slice(), proof.as_slice(), public_inputs.as_slice(), key_hash, - input_aggregation_object + unused_input_aggregation_object ); - let output_aggregation_object = std::verify_proof( + let _ = std::verify_proof( verification_key.as_slice(), proof_b.as_slice(), public_inputs.as_slice(), key_hash, - output_aggregation_object_a + unused_input_aggregation_object ); - - let mut output = [0; 16]; - for i in 0..16 { - output[i] = output_aggregation_object[i]; - } - output } diff --git a/yarn-project/Dockerfile.prod b/yarn-project/Dockerfile.prod index 16f65db4740..2c43f3af26b 100644 --- a/yarn-project/Dockerfile.prod +++ b/yarn-project/Dockerfile.prod @@ -46,4 +46,4 @@ RUN ARCH= && \ rm "node-v$NODE_VERSION-linux-$ARCH.tar.gz" && \ node --version COPY --from=builder /usr/src /usr/src -ENTRYPOINT ["/usr/bin/node"] \ No newline at end of file +ENTRYPOINT ["/usr/bin/node"] diff --git a/yarn-project/aztec.js/.gitignore b/yarn-project/aztec.js/.gitignore new file mode 100644 index 00000000000..03b565b6c24 --- /dev/null +++ b/yarn-project/aztec.js/.gitignore @@ -0,0 +1 @@ +src/account_contract/artifacts \ No newline at end of file diff --git a/yarn-project/aztec.js/src/account/defaults/entrypoint_payload.ts b/yarn-project/aztec.js/src/account/defaults/entrypoint_payload.ts index 4e2afca4040..6ff8c947931 100644 --- a/yarn-project/aztec.js/src/account/defaults/entrypoint_payload.ts +++ b/yarn-project/aztec.js/src/account/defaults/entrypoint_payload.ts @@ -4,10 +4,10 @@ import { pedersenHash } from '@aztec/foundation/crypto'; import { FunctionCall, PackedArguments, emptyFunctionCall } from '@aztec/types'; // These must match the values defined in yarn-project/aztec-nr/aztec/src/entrypoint.nr -export const ACCOUNT_MAX_CALLS = 4; +const ACCOUNT_MAX_CALLS = 4; /** Encoded function call for account contract entrypoint */ -export type EntrypointFunctionCall = { +type EntrypointFunctionCall = { // eslint-disable-next-line camelcase /** Arguments hash for the call */ args_hash: Fr; @@ -76,7 +76,7 @@ export function hashPayload(payload: EntrypointPayload) { } /** Flattens an entrypoint payload */ -export function flattenPayload(payload: EntrypointPayload) { +function flattenPayload(payload: EntrypointPayload) { return [ ...payload.function_calls.flatMap(call => [ call.args_hash, diff --git a/yarn-project/aztec.js/src/account/index.ts b/yarn-project/aztec.js/src/account/index.ts index eab0d934492..a57f2fb40ba 100644 --- a/yarn-project/aztec.js/src/account/index.ts +++ b/yarn-project/aztec.js/src/account/index.ts @@ -19,106 +19,13 @@ * * @packageDocumentation */ -import { CompleteAddress, GrumpkinPrivateKey, PXE } from '@aztec/types'; +import { Fr } from '@aztec/circuits.js'; -import { AccountContract, AccountWallet, AztecAddress, Fr } from '../index.js'; -import { EcdsaAccountContract } from './contract/ecdsa_account_contract.js'; -import { SchnorrAccountContract } from './contract/schnorr_account_contract.js'; -import { SingleKeyAccountContract } from './contract/single_key_account_contract.js'; -import { AccountManager } from './manager/index.js'; +export { CompleteAddress } from '@aztec/types'; -export * from './contract/index.js'; export * from './defaults/index.js'; -export * from './utils.js'; export { AccountInterface, AuthWitnessProvider } from './interface.js'; -export { AccountManager, CompleteAddress }; +export * from './wallet.js'; /** A contract deployment salt. */ export type Salt = Fr | number | bigint; - -/** - * Creates an Account that relies on an ECDSA signing key for authentication. - * @param pxe - An PXE server instance. - * @param encryptionPrivateKey - Grumpkin key used for note encryption. - * @param signingPrivateKey - Secp256k1 key used for signing transactions. - * @param saltOrAddress - Deployment salt or complete address if account contract is already deployed. - */ -export function getEcdsaAccount( - pxe: PXE, - encryptionPrivateKey: GrumpkinPrivateKey, - signingPrivateKey: Buffer, - saltOrAddress?: Salt | CompleteAddress, -): AccountManager { - return new AccountManager(pxe, encryptionPrivateKey, new EcdsaAccountContract(signingPrivateKey), saltOrAddress); -} - -/** - * Creates an Account that relies on a Grumpkin signing key for authentication. - * @param pxe - An PXE server instance. - * @param encryptionPrivateKey - Grumpkin key used for note encryption. - * @param signingPrivateKey - Grumpkin key used for signing transactions. - * @param saltOrAddress - Deployment salt or complete address if account contract is already deployed. - */ -export function getSchnorrAccount( - pxe: PXE, - encryptionPrivateKey: GrumpkinPrivateKey, - signingPrivateKey: GrumpkinPrivateKey, - saltOrAddress?: Salt | CompleteAddress, -): AccountManager { - return new AccountManager(pxe, encryptionPrivateKey, new SchnorrAccountContract(signingPrivateKey), saltOrAddress); -} - -/** - * Creates an Account that uses the same Grumpkin key for encryption and authentication. - * @param pxe - An PXE server instance. - * @param encryptionAndSigningPrivateKey - Grumpkin key used for note encryption and signing transactions. - * @param saltOrAddress - Deployment salt or complete address if account contract is already deployed. - */ -export function getUnsafeSchnorrAccount( - pxe: PXE, - encryptionAndSigningPrivateKey: GrumpkinPrivateKey, - saltOrAddress?: Salt | CompleteAddress, -): AccountManager { - return new AccountManager( - pxe, - encryptionAndSigningPrivateKey, - new SingleKeyAccountContract(encryptionAndSigningPrivateKey), - saltOrAddress, - ); -} - -/** - * Gets a wallet for an already registered account using Schnorr signatures with a single key for encryption and authentication. - * @param pxe - An PXE server instance. - * @param address - Address for the account. - * @param signingPrivateKey - Grumpkin key used for note encryption and signing transactions. - * @returns A wallet for this account that can be used to interact with a contract instance. - */ -export function getUnsafeSchnorrWallet( - pxe: PXE, - address: AztecAddress, - signingKey: GrumpkinPrivateKey, -): Promise { - return getWallet(pxe, address, new SingleKeyAccountContract(signingKey)); -} - -/** - * Gets a wallet for an already registered account. - * @param pxe - PXE Service instance. - * @param address - Address for the account. - * @param accountContract - Account contract implementation. - * @returns A wallet for this account that can be used to interact with a contract instance. - */ -export async function getWallet( - pxe: PXE, - address: AztecAddress, - accountContract: AccountContract, -): Promise { - const completeAddress = await pxe.getRegisteredAccount(address); - if (!completeAddress) { - throw new Error(`Account ${address} not found`); - } - const nodeInfo = await pxe.getNodeInfo(); - const entrypoint = accountContract.getInterface(completeAddress, nodeInfo); - return new AccountWallet(pxe, entrypoint); -} diff --git a/yarn-project/aztec.js/src/account/wallet.ts b/yarn-project/aztec.js/src/account/wallet.ts new file mode 100644 index 00000000000..511a861a17a --- /dev/null +++ b/yarn-project/aztec.js/src/account/wallet.ts @@ -0,0 +1,8 @@ +import { PXE } from '@aztec/types'; + +import { AccountInterface } from './interface.js'; + +/** + * The wallet interface. + */ +export type Wallet = AccountInterface & PXE; diff --git a/yarn-project/aztec.js/src/account/contract/index.ts b/yarn-project/aztec.js/src/account_contract/account_contract.ts similarity index 83% rename from yarn-project/aztec.js/src/account/contract/index.ts rename to yarn-project/aztec.js/src/account_contract/account_contract.ts index f0ac2fcd717..0954dcc9fd3 100644 --- a/yarn-project/aztec.js/src/account/contract/index.ts +++ b/yarn-project/aztec.js/src/account_contract/account_contract.ts @@ -1,12 +1,7 @@ import { ContractArtifact } from '@aztec/foundation/abi'; import { CompleteAddress, NodeInfo } from '@aztec/types'; -import { AccountInterface } from '../interface.js'; - -export * from './ecdsa_account_contract.js'; -export * from './schnorr_account_contract.js'; -export * from './single_key_account_contract.js'; -export * from './base_account_contract.js'; +import { AccountInterface } from '../account/interface.js'; // docs:start:account-contract-interface /** diff --git a/yarn-project/aztec.js/src/account/contract/base_account_contract.ts b/yarn-project/aztec.js/src/account_contract/base_account_contract.ts similarity index 77% rename from yarn-project/aztec.js/src/account/contract/base_account_contract.ts rename to yarn-project/aztec.js/src/account_contract/base_account_contract.ts index c0123c8ad14..9c04fcf1d1b 100644 --- a/yarn-project/aztec.js/src/account/contract/base_account_contract.ts +++ b/yarn-project/aztec.js/src/account_contract/base_account_contract.ts @@ -1,9 +1,9 @@ import { ContractArtifact } from '@aztec/foundation/abi'; import { CompleteAddress, NodeInfo } from '@aztec/types'; -import { DefaultAccountInterface } from '../defaults/default_interface.js'; -import { AccountInterface, AuthWitnessProvider } from '../interface.js'; -import { AccountContract } from './index.js'; +import { DefaultAccountInterface } from '../account/defaults/default_interface.js'; +import { AccountInterface, AuthWitnessProvider } from '../account/interface.js'; +import { AccountContract } from './account_contract.js'; /** * Base class for implementing an account contract. Requires that the account uses the diff --git a/yarn-project/aztec.js/src/account/contract/ecdsa_account_contract.ts b/yarn-project/aztec.js/src/account_contract/ecdsa_account_contract.ts similarity index 89% rename from yarn-project/aztec.js/src/account/contract/ecdsa_account_contract.ts rename to yarn-project/aztec.js/src/account_contract/ecdsa_account_contract.ts index 8820fbced7f..c7f344c3731 100644 --- a/yarn-project/aztec.js/src/account/contract/ecdsa_account_contract.ts +++ b/yarn-project/aztec.js/src/account_contract/ecdsa_account_contract.ts @@ -3,8 +3,8 @@ import { ContractArtifact } from '@aztec/foundation/abi'; import { Fr } from '@aztec/foundation/fields'; import { AuthWitness, CompleteAddress } from '@aztec/types'; -import EcdsaAccountContractArtifact from '../../artifacts/ecdsa_account_contract.json' assert { type: 'json' }; -import { AuthWitnessProvider } from '../interface.js'; +import { AuthWitnessProvider } from '../account/interface.js'; +import EcdsaAccountContractArtifact from './artifacts/ecdsa_account_contract.json' assert { type: 'json' }; import { BaseAccountContract } from './base_account_contract.js'; /** diff --git a/yarn-project/aztec.js/src/account_contract/index.ts b/yarn-project/aztec.js/src/account_contract/index.ts new file mode 100644 index 00000000000..0e3be8aee56 --- /dev/null +++ b/yarn-project/aztec.js/src/account_contract/index.ts @@ -0,0 +1,5 @@ +export * from './account_contract.js'; +export * from './ecdsa_account_contract.js'; +export * from './schnorr_account_contract.js'; +export * from './single_key_account_contract.js'; +export * from './base_account_contract.js'; diff --git a/yarn-project/aztec.js/src/account/contract/schnorr_account_contract.ts b/yarn-project/aztec.js/src/account_contract/schnorr_account_contract.ts similarity index 89% rename from yarn-project/aztec.js/src/account/contract/schnorr_account_contract.ts rename to yarn-project/aztec.js/src/account_contract/schnorr_account_contract.ts index cd6cec3791b..f70c5cf1461 100644 --- a/yarn-project/aztec.js/src/account/contract/schnorr_account_contract.ts +++ b/yarn-project/aztec.js/src/account_contract/schnorr_account_contract.ts @@ -3,8 +3,8 @@ import { ContractArtifact } from '@aztec/foundation/abi'; import { Fr } from '@aztec/foundation/fields'; import { AuthWitness, CompleteAddress, GrumpkinPrivateKey } from '@aztec/types'; -import SchnorrAccountContractArtifact from '../../artifacts/schnorr_account_contract.json' assert { type: 'json' }; -import { AuthWitnessProvider } from '../interface.js'; +import { AuthWitnessProvider } from '../account/interface.js'; +import SchnorrAccountContractArtifact from './artifacts/schnorr_account_contract.json' assert { type: 'json' }; import { BaseAccountContract } from './base_account_contract.js'; /** diff --git a/yarn-project/aztec.js/src/account/contract/single_key_account_contract.ts b/yarn-project/aztec.js/src/account_contract/single_key_account_contract.ts similarity index 87% rename from yarn-project/aztec.js/src/account/contract/single_key_account_contract.ts rename to yarn-project/aztec.js/src/account_contract/single_key_account_contract.ts index c2b1bffa2fb..24a5c7178fa 100644 --- a/yarn-project/aztec.js/src/account/contract/single_key_account_contract.ts +++ b/yarn-project/aztec.js/src/account_contract/single_key_account_contract.ts @@ -4,9 +4,9 @@ import { ContractArtifact } from '@aztec/foundation/abi'; import { Fr } from '@aztec/foundation/fields'; import { AuthWitness, CompleteAddress, GrumpkinPrivateKey } from '@aztec/types'; -import SchnorrSingleKeyAccountContractArtifact from '../../artifacts/schnorr_single_key_account_contract.json' assert { type: 'json' }; -import { generatePublicKey } from '../../index.js'; -import { AuthWitnessProvider } from '../interface.js'; +import { AuthWitnessProvider } from '../account/interface.js'; +import { generatePublicKey } from '../utils/index.js'; +import SchnorrSingleKeyAccountContractArtifact from './artifacts/schnorr_single_key_account_contract.json' assert { type: 'json' }; import { BaseAccountContract } from './base_account_contract.js'; /** diff --git a/yarn-project/aztec.js/src/account/manager/deploy_account_sent_tx.ts b/yarn-project/aztec.js/src/account_manager/deploy_account_sent_tx.ts similarity index 92% rename from yarn-project/aztec.js/src/account/manager/deploy_account_sent_tx.ts rename to yarn-project/aztec.js/src/account_manager/deploy_account_sent_tx.ts index 321d8632ae5..bc8f79bba3a 100644 --- a/yarn-project/aztec.js/src/account/manager/deploy_account_sent_tx.ts +++ b/yarn-project/aztec.js/src/account_manager/deploy_account_sent_tx.ts @@ -1,8 +1,8 @@ import { FieldsOf } from '@aztec/circuits.js'; import { TxHash, TxReceipt } from '@aztec/types'; -import { DefaultWaitOpts, SentTx, WaitOpts } from '../../contract/sent_tx.js'; -import { Wallet } from '../../wallet/index.js'; +import { Wallet } from '../account/index.js'; +import { DefaultWaitOpts, SentTx, WaitOpts } from '../contract/index.js'; import { waitForAccountSynch } from './util.js'; /** Extends a transaction receipt with a wallet instance for the newly deployed contract. */ diff --git a/yarn-project/aztec.js/src/account/manager/index.ts b/yarn-project/aztec.js/src/account_manager/index.ts similarity index 70% rename from yarn-project/aztec.js/src/account/manager/index.ts rename to yarn-project/aztec.js/src/account_manager/index.ts index 98a36321c7f..20de45d7ccb 100644 --- a/yarn-project/aztec.js/src/account/manager/index.ts +++ b/yarn-project/aztec.js/src/account_manager/index.ts @@ -2,16 +2,18 @@ import { PublicKey, getContractDeploymentInfo } from '@aztec/circuits.js'; import { Fr } from '@aztec/foundation/fields'; import { CompleteAddress, GrumpkinPrivateKey, PXE } from '@aztec/types'; -import { DefaultWaitOpts } from '../../contract/sent_tx.js'; +import { Salt } from '../account/index.js'; +import { AccountInterface } from '../account/interface.js'; import { - AccountWalletWithPrivateKey, - ContractDeployer, - DeployMethod, - WaitOpts, - generatePublicKey, -} from '../../index.js'; -import { AccountContract, Salt } from '../index.js'; -import { AccountInterface } from '../interface.js'; + AccountContract, + EcdsaAccountContract, + SchnorrAccountContract, + SingleKeyAccountContract, +} from '../account_contract/index.js'; +import { DefaultWaitOpts, DeployMethod, WaitOpts } from '../contract/index.js'; +import { ContractDeployer } from '../contract_deployer/index.js'; +import { generatePublicKey } from '../utils/index.js'; +import { AccountWalletWithPrivateKey } from '../wallet/index.js'; import { DeployAccountSentTx } from './deploy_account_sent_tx.js'; import { waitForAccountSynch } from './util.js'; @@ -154,3 +156,54 @@ export class AccountManager { return completeAddress; } } + +/** + * Creates an Account that relies on an ECDSA signing key for authentication. + * @param pxe - An PXE server instance. + * @param encryptionPrivateKey - Grumpkin key used for note encryption. + * @param signingPrivateKey - Secp256k1 key used for signing transactions. + * @param saltOrAddress - Deployment salt or complete address if account contract is already deployed. + */ +export function getEcdsaAccount( + pxe: PXE, + encryptionPrivateKey: GrumpkinPrivateKey, + signingPrivateKey: Buffer, + saltOrAddress?: Salt | CompleteAddress, +): AccountManager { + return new AccountManager(pxe, encryptionPrivateKey, new EcdsaAccountContract(signingPrivateKey), saltOrAddress); +} + +/** + * Creates an Account that relies on a Grumpkin signing key for authentication. + * @param pxe - An PXE server instance. + * @param encryptionPrivateKey - Grumpkin key used for note encryption. + * @param signingPrivateKey - Grumpkin key used for signing transactions. + * @param saltOrAddress - Deployment salt or complete address if account contract is already deployed. + */ +export function getSchnorrAccount( + pxe: PXE, + encryptionPrivateKey: GrumpkinPrivateKey, + signingPrivateKey: GrumpkinPrivateKey, + saltOrAddress?: Salt | CompleteAddress, +): AccountManager { + return new AccountManager(pxe, encryptionPrivateKey, new SchnorrAccountContract(signingPrivateKey), saltOrAddress); +} + +/** + * Creates an Account that uses the same Grumpkin key for encryption and authentication. + * @param pxe - An PXE server instance. + * @param encryptionAndSigningPrivateKey - Grumpkin key used for note encryption and signing transactions. + * @param saltOrAddress - Deployment salt or complete address if account contract is already deployed. + */ +export function getUnsafeSchnorrAccount( + pxe: PXE, + encryptionAndSigningPrivateKey: GrumpkinPrivateKey, + saltOrAddress?: Salt | CompleteAddress, +): AccountManager { + return new AccountManager( + pxe, + encryptionAndSigningPrivateKey, + new SingleKeyAccountContract(encryptionAndSigningPrivateKey), + saltOrAddress, + ); +} diff --git a/yarn-project/aztec.js/src/account/manager/util.ts b/yarn-project/aztec.js/src/account_manager/util.ts similarity index 82% rename from yarn-project/aztec.js/src/account/manager/util.ts rename to yarn-project/aztec.js/src/account_manager/util.ts index 2c111eca4fe..8d1bf4a0be7 100644 --- a/yarn-project/aztec.js/src/account/manager/util.ts +++ b/yarn-project/aztec.js/src/account_manager/util.ts @@ -1,4 +1,7 @@ -import { CompleteAddress, PXE, WaitOpts, retryUntil } from '../../index.js'; +import { retryUntil } from '@aztec/foundation/retry'; +import { CompleteAddress, PXE } from '@aztec/types'; + +import { WaitOpts } from '../contract/index.js'; /** * Waits for the account to finish synchronizing with the PXE Service. diff --git a/yarn-project/aztec.js/src/artifacts/ecdsa_account_contract.json b/yarn-project/aztec.js/src/artifacts/ecdsa_account_contract.json deleted file mode 100644 index d2498f18ede..00000000000 --- a/yarn-project/aztec.js/src/artifacts/ecdsa_account_contract.json +++ /dev/null @@ -1,813 +0,0 @@ -{ - "name": "EcdsaAccount", - "functions": [ - { - "name": "compute_note_hash_and_nullifier", - "functionType": "unconstrained", - "isInternal": false, - "parameters": [ - { - "name": "contract_address", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "nonce", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "storage_slot", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "serialized_note", - "type": { - "kind": "array", - "length": 5, - "type": { - "kind": "field" - } - }, - "visibility": "private" - } - ], - "returnTypes": [ - { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - ], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "constructor", - "functionType": "secret", - "isInternal": false, - "parameters": [ - { - "name": "signing_pub_key_x", - "type": { - "kind": "array", - "length": 32, - "type": { - "kind": "integer", - "sign": "unsigned", - "width": 8 - } - }, - "visibility": "public" - }, - { - "name": "signing_pub_key_y", - "type": { - "kind": "array", - "length": 32, - "type": { - "kind": "integer", - "sign": "unsigned", - "width": 8 - } - }, - "visibility": "public" - } - ], - "returnTypes": [], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "entrypoint", - "functionType": "secret", - "isInternal": false, - "parameters": [ - { - "name": "payload", - "type": { - "kind": "struct", - "path": "authwit::entrypoint::EntrypointPayload", - "fields": [ - { - "name": "function_calls", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "struct", - "path": "authwit::entrypoint::FunctionCall", - "fields": [ - { - "name": "args_hash", - "type": { - "kind": "field" - } - }, - { - "name": "function_selector", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::abis::function_selector::FunctionSelector", - "fields": [ - { - "name": "inner", - "type": { - "kind": "integer", - "sign": "unsigned", - "width": 32 - } - } - ] - } - }, - { - "name": "target_address", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::address::AztecAddress", - "fields": [ - { - "name": "inner", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "is_public", - "type": { - "kind": "boolean" - } - } - ] - } - } - }, - { - "name": "nonce", - "type": { - "kind": "field" - } - } - ] - }, - "visibility": "public" - } - ], - "returnTypes": [], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "is_valid", - "functionType": "secret", - "isInternal": false, - "parameters": [ - { - "name": "message_hash", - "type": { - "kind": "field" - }, - "visibility": "private" - } - ], - "returnTypes": [], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "is_valid_public", - "functionType": "open", - "isInternal": false, - "parameters": [ - { - "name": "message_hash", - "type": { - "kind": "field" - }, - "visibility": "private" - } - ], - "returnTypes": [ - { - "kind": "struct", - "path": "aztec::protocol_types::abis::public_circuit_public_inputs::PublicCircuitPublicInputs", - "fields": [ - { - "name": "call_context", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::abis::call_context::CallContext", - "fields": [ - { - "name": "msg_sender", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::address::AztecAddress", - "fields": [ - { - "name": "inner", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "storage_contract_address", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::address::AztecAddress", - "fields": [ - { - "name": "inner", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "portal_contract_address", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::address::EthAddress", - "fields": [ - { - "name": "inner", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "function_selector", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::abis::function_selector::FunctionSelector", - "fields": [ - { - "name": "inner", - "type": { - "kind": "integer", - "sign": "unsigned", - "width": 32 - } - } - ] - } - }, - { - "name": "is_delegate_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_static_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_contract_deployment", - "type": { - "kind": "boolean" - } - } - ] - } - }, - { - "name": "args_hash", - "type": { - "kind": "field" - } - }, - { - "name": "return_values", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "contract_storage_update_requests", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::protocol_types::contrakt::storage_update_request::StorageUpdateRequest", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "old_value", - "type": { - "kind": "field" - } - }, - { - "name": "new_value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "contract_storage_reads", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::protocol_types::contrakt::storage_read::StorageRead", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "current_value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "public_call_stack_hashes", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_commitments", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_nullifiers", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_l2_to_l1_msgs", - "type": { - "kind": "array", - "length": 2, - "type": { - "kind": "field" - } - } - }, - { - "name": "unencrypted_logs_hash", - "type": { - "kind": "array", - "length": 2, - "type": { - "kind": "field" - } - } - }, - { - "name": "unencrypted_log_preimages_length", - "type": { - "kind": "field" - } - }, - { - "name": "block_header", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::abis::block_header::BlockHeader", - "fields": [ - { - "name": "note_hash_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "nullifier_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "contract_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "l1_to_l2_messages_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "archive_root", - "type": { - "kind": "field" - } - }, - { - "name": "public_data_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "global_variables_hash", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "prover_address", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::address::AztecAddress", - "fields": [ - { - "name": "inner", - "type": { - "kind": "field" - } - } - ] - } - } - ] - } - ], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "set_is_valid_storage", - "functionType": "open", - "isInternal": true, - "parameters": [ - { - "name": "message_hash", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "value", - "type": { - "kind": "boolean" - }, - "visibility": "private" - } - ], - "returnTypes": [ - { - "kind": "struct", - "path": "aztec::protocol_types::abis::public_circuit_public_inputs::PublicCircuitPublicInputs", - "fields": [ - { - "name": "call_context", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::abis::call_context::CallContext", - "fields": [ - { - "name": "msg_sender", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::address::AztecAddress", - "fields": [ - { - "name": "inner", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "storage_contract_address", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::address::AztecAddress", - "fields": [ - { - "name": "inner", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "portal_contract_address", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::address::EthAddress", - "fields": [ - { - "name": "inner", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "function_selector", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::abis::function_selector::FunctionSelector", - "fields": [ - { - "name": "inner", - "type": { - "kind": "integer", - "sign": "unsigned", - "width": 32 - } - } - ] - } - }, - { - "name": "is_delegate_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_static_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_contract_deployment", - "type": { - "kind": "boolean" - } - } - ] - } - }, - { - "name": "args_hash", - "type": { - "kind": "field" - } - }, - { - "name": "return_values", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "contract_storage_update_requests", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::protocol_types::contrakt::storage_update_request::StorageUpdateRequest", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "old_value", - "type": { - "kind": "field" - } - }, - { - "name": "new_value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "contract_storage_reads", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::protocol_types::contrakt::storage_read::StorageRead", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "current_value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "public_call_stack_hashes", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_commitments", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_nullifiers", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_l2_to_l1_msgs", - "type": { - "kind": "array", - "length": 2, - "type": { - "kind": "field" - } - } - }, - { - "name": "unencrypted_logs_hash", - "type": { - "kind": "array", - "length": 2, - "type": { - "kind": "field" - } - } - }, - { - "name": "unencrypted_log_preimages_length", - "type": { - "kind": "field" - } - }, - { - "name": "block_header", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::abis::block_header::BlockHeader", - "fields": [ - { - "name": "note_hash_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "nullifier_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "contract_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "l1_to_l2_messages_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "archive_root", - "type": { - "kind": "field" - } - }, - { - "name": "public_data_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "global_variables_hash", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "prover_address", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::address::AztecAddress", - "fields": [ - { - "name": "inner", - "type": { - "kind": "field" - } - } - ] - } - } - ] - } - ], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - } - ], - "events": [] -} diff --git a/yarn-project/aztec.js/src/artifacts/schnorr_account_contract.json b/yarn-project/aztec.js/src/artifacts/schnorr_account_contract.json deleted file mode 100644 index 04d59da83b8..00000000000 --- a/yarn-project/aztec.js/src/artifacts/schnorr_account_contract.json +++ /dev/null @@ -1,801 +0,0 @@ -{ - "name": "SchnorrAccount", - "functions": [ - { - "name": "compute_note_hash_and_nullifier", - "functionType": "unconstrained", - "isInternal": false, - "parameters": [ - { - "name": "contract_address", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "nonce", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "storage_slot", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "serialized_note", - "type": { - "kind": "array", - "length": 3, - "type": { - "kind": "field" - } - }, - "visibility": "private" - } - ], - "returnTypes": [ - { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - ], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "constructor", - "functionType": "secret", - "isInternal": false, - "parameters": [ - { - "name": "signing_pub_key_x", - "type": { - "kind": "field" - }, - "visibility": "public" - }, - { - "name": "signing_pub_key_y", - "type": { - "kind": "field" - }, - "visibility": "public" - } - ], - "returnTypes": [], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "entrypoint", - "functionType": "secret", - "isInternal": false, - "parameters": [ - { - "name": "payload", - "type": { - "kind": "struct", - "path": "authwit::entrypoint::EntrypointPayload", - "fields": [ - { - "name": "function_calls", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "struct", - "path": "authwit::entrypoint::FunctionCall", - "fields": [ - { - "name": "args_hash", - "type": { - "kind": "field" - } - }, - { - "name": "function_selector", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::abis::function_selector::FunctionSelector", - "fields": [ - { - "name": "inner", - "type": { - "kind": "integer", - "sign": "unsigned", - "width": 32 - } - } - ] - } - }, - { - "name": "target_address", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::address::AztecAddress", - "fields": [ - { - "name": "inner", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "is_public", - "type": { - "kind": "boolean" - } - } - ] - } - } - }, - { - "name": "nonce", - "type": { - "kind": "field" - } - } - ] - }, - "visibility": "public" - } - ], - "returnTypes": [], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "is_valid", - "functionType": "secret", - "isInternal": false, - "parameters": [ - { - "name": "message_hash", - "type": { - "kind": "field" - }, - "visibility": "private" - } - ], - "returnTypes": [], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "is_valid_public", - "functionType": "open", - "isInternal": false, - "parameters": [ - { - "name": "message_hash", - "type": { - "kind": "field" - }, - "visibility": "private" - } - ], - "returnTypes": [ - { - "kind": "struct", - "path": "aztec::protocol_types::abis::public_circuit_public_inputs::PublicCircuitPublicInputs", - "fields": [ - { - "name": "call_context", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::abis::call_context::CallContext", - "fields": [ - { - "name": "msg_sender", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::address::AztecAddress", - "fields": [ - { - "name": "inner", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "storage_contract_address", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::address::AztecAddress", - "fields": [ - { - "name": "inner", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "portal_contract_address", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::address::EthAddress", - "fields": [ - { - "name": "inner", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "function_selector", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::abis::function_selector::FunctionSelector", - "fields": [ - { - "name": "inner", - "type": { - "kind": "integer", - "sign": "unsigned", - "width": 32 - } - } - ] - } - }, - { - "name": "is_delegate_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_static_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_contract_deployment", - "type": { - "kind": "boolean" - } - } - ] - } - }, - { - "name": "args_hash", - "type": { - "kind": "field" - } - }, - { - "name": "return_values", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "contract_storage_update_requests", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::protocol_types::contrakt::storage_update_request::StorageUpdateRequest", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "old_value", - "type": { - "kind": "field" - } - }, - { - "name": "new_value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "contract_storage_reads", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::protocol_types::contrakt::storage_read::StorageRead", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "current_value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "public_call_stack_hashes", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_commitments", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_nullifiers", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_l2_to_l1_msgs", - "type": { - "kind": "array", - "length": 2, - "type": { - "kind": "field" - } - } - }, - { - "name": "unencrypted_logs_hash", - "type": { - "kind": "array", - "length": 2, - "type": { - "kind": "field" - } - } - }, - { - "name": "unencrypted_log_preimages_length", - "type": { - "kind": "field" - } - }, - { - "name": "block_header", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::abis::block_header::BlockHeader", - "fields": [ - { - "name": "note_hash_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "nullifier_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "contract_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "l1_to_l2_messages_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "archive_root", - "type": { - "kind": "field" - } - }, - { - "name": "public_data_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "global_variables_hash", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "prover_address", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::address::AztecAddress", - "fields": [ - { - "name": "inner", - "type": { - "kind": "field" - } - } - ] - } - } - ] - } - ], - "bytecode": "H4sIAAAAAAAA/+3dB3wVx50H8PckIVg9JHpH8EQzHUn0LsCYaqopxjQBooMwiOZeMcbghu3Ejlt6d3rPpV5ySS652JeeXOolueSSXIpzyaXfzL75Wz+W8Ysm/o81z/rv5/Pn7c7uznxnZnff7r5d9GQqlUqnckOxim6piweaX2c+q1/YUJPmy6vap7OoQJzFBeIsKRBnuwJxlhaIs32BODsUiDMqEGdZgTgzBeLsWCDO8gJxVhSIs1OBODsXiLNLgTi7FoizG6OzDzi7m88e5rOn+exlPnubT1qnr/nsZ+pYYqb7q6hUMUDFQDOPGiSrokrFIBWDVQxRMVTFMBWXqBiuYoSKkSpGqRitYoyKsSrGmXxqVNSqGK9igoqJKiapmKxiioqpKqapmK5ihoqZKmapmG3abY6KuSrmqbhUxXwVl6lYoGKhikUqFqtYomKpistVLFOx3NQla+qyQsVKFatUrFZxhYo1KtaqWKdivYorVWxQcZWKjSo2qdisYouKrSrqVWxTsV3FDhUNKnaq2KVit4o9Kvaq2Kdiv4oDKg6qaEy0+SEVV6s4rOKImdfZzGtScVTFMRXHVZxQcVLFNSquVXGdiutV3KDiRhU3qbhZxS0qbk3kdZuK21WcUnGHitMq7lRxRsVdKs6qOKfibhX3qLhXxX0q7ldx3uRVZPJ6QMWDibSHVLzMjL/cfD5sPh8xn68wn4+az8fM5+Pm8wnz+aSKX1fkxvU5XPJaW6fRNp+GNNr+iyCN9oViSKP9ogTSaB9pB2m0v5RCGu077SGtnxnvAGn9YZw+K814GaQNMOMZSBtoxjtCWtaMl0NalRmvgLRBZrwTpA02450hbYgZ7wJpQ814V/NJ9dZDnfmsfoGDzpP5uFqt7dTn3aA+1OfdIY36vAekUZ/3hDSqey9Ioz7vDWnU530gjfq8L6RRn/eDNOpz3Faozyshjfp8AKRRnw+ENOrzLKRRn1dBGvX5IEijPh8MadSWQyCN2pK2Fd1282A+DbgP4n0zSqP5uA8WQ56URvNxH6T5uA/SfNwHcT590nzcB2k+7m80H/ct6i/cj2idrpBG/YXbHeWD2xj1F25PlDduO9RfuO1QebjtUH/htkMG3HZo28dth1xZSKNtH7cdstK2o+tVCrY681n9woYaPNbSkE5M18E4lV8K9WeyjMfjeUsslWAZwNwuGWiXAVBOlrkc/B5qSZ2zYKlitug8B/HmGZ/WDgY/1ZXKycD87lC3wcx1S0OZlC9NDwZL/4QTv+v7B+CjtCz4Blt8Q3h9tenUhf1YB9NDwEdpVWBh3qZqo4RFD/n2mUFgGcZqqanGc7yWWIaBZSirJbf/XsKbZ3weOZw5T53HCGgTaj+yZ2D+cGivEcztlYYyKV+aRp9YxSpWsYpVrGIVq1jbthWvc/CeHS03OAAfpQ0FC/e1Ad7jorz1fcSnoEzeexQ11XidTPdjyEBlFcMyny5vdr3TpJWlLr62jlLN19TYfwNZ/bn+o3IoX5oeCD6qSzZRV25LVcLy0i23djv/fcKaan1fWt/rpu1pQKIetnu/lKa3yY9BfUO5t4v3PovAx3y/t+Yfvd+L9+mKwce9r2rfAAffQPDRevi7Cvf9WjxmtcRXBT5arx34uO9p4r3Tlvhs9zlL4ZP7fpnrvbuh4KP12oOP+fs19g1z8OG5Eq3XAXzc5yLaN9zBh+cntF4EvlEefCMdfKPAR+uVgW+MB99oB98Y8I2GcfKN8+Ab6+AbByZaryP4ajz4qlMt99WAj9YrB994D75aB9948NF6FeCb6ME3wcE3EXy0XifwTfbgm+Tgmww+Wq8z+KZ68E1x8E0FH63XBXzTPfimOfimg4/Ww2eUZnrwzXDwzQQfrdcNfLM9+GY5+GaDj9brCb45vL74d9A6B98csFzKa5mgLXMdLJeCZR6vJf4ddD5vnvHvoJcx56nzWABtQu1H9gzMvwzaawFze6WhTMqXptEn1rZtxfeSyBmlLt7XWtNHafM8WqKERQ/5jnU2H/blIl5f/L2w0MG3CCxLWS3j43vEix0sS8GyhNWS+164nDfP+Bi+DPxUVyonA/Oxz5cx1y0NZVK+NI0+sYpVrGIVq1jFKlaxilWsYhWrWMUqVrGKVaxiFatYxSpWsYpVrGIVq1jFym/VloUJZwTLLQzAR2lLPFqihEUP+Z4TsfmwL1fw+uJnapY7+FaAZTWrpTZ+pmalg2U1WFaxWnLP1FzBm2f8TM0a8FNdqZwMzMc+X8NctzSUSfnSNPrEKlaxilWsYhWrWMUqVrGKVaxiFatYxSpWsYq1UKzasjzhjGC55QH4KG2VR0uUsOgh3312mw/7ch2vL/5NYq2Dbx1YNvBa4v//Yb2DZQNYruS1xL9JXMWbZ/ybxEbwU12pnAzMxz7fyFy3NJRJ+dI0+sTatq3asjbhjGC5tQH4KO1Kj5YoYdFDvuOSzYd9uZnXFx/DNzn4NoOlntWS+1smWxws9WDZymrJHcO38eYZH8O3g5/qSuVkYD72+XbmuqWhTMqXptEnVrGKVaxiFatYxSrWtm3Vlk0JZwTLbQrAR2lbPVqihEUP+a5TbD7sywZeX3xNt8PB1wCW3ayW3DXdTgfLbrDsYrXkrun28OYZX9PtBT/VlcrJwHzs873MdUtDmZQvTaNPrGIVq1jFKlaxilWsbduqLTsSzgiW2xGAj9J2ebRECYse8l2n2HzYl/t5ffE13T4H336wNHqwHHCwNILlIK8lvqY7xJtnfE13NfiprlROBuZjn1/NXLc0lEn50jT6CsWqLfsSzgiW2xeAj9IOerRECYse8u0/Nh/25RFeX7x/H3bwHQHLMQ+WJgfLMbAc5bXEx5rjvHnGx5oT4Ke6UjkZmI99foK5bmkok/KlafQVilVbDiecESx3OAAfpR31aIkSFj3k239sPuzLazz4Tjr4rgHfSYvvOg++ax1814GP1ovAd4MH3/UOvhvAR+uVge8mD74bHXw3ge9GGCffLR58Nzv4bgETrYd/Y/Q2D75bHXy3gY/WKwffKQ++2x18p8BH61WA77QH3x0OvtPgo/Xwb4ye8eC708F3Bny0Hh7/znrw3eXgOwu+uyy+uz34zjn47gbfOYvvXg++exx894LvHovvfg+++xx894PlPK+lOgOW81DOgx7q/ECq5XV+ECwPeagzWR6Ccl7uoc4vS7W8zlR+BtZD3yMefA87+B4B38MW36MefK9w8D0KPloP9+PHPfgec/A9Dr7HLL4nPfiecPA9Cb4nLL5XefC90sH3KvC90uJ7jQffqx18rwHfqy2+13nwvdbB9zrwvdbie4MH3+sdfG8A3+stvjd58L3Rwfcm8L3R4nuLB9+bHXxvAd+bLb6nPPje6uB7Cnxvtfje7sH3Ngff28H3NovvnR5873DwvRN877D43u3B9y4H37vB9y6L770efO9x8L0XfO+x+N7vwfc+B9/7wfc+i++DHnwfcPB9EHwfsPg+zOuLf4f4kIPvw2D5KK8lftf9nxwsHwXLR3gt8W8iH+PNM/5N5OPgp7pSORmYj33+cea6paFMypem0SfWtm3Vlg8lnBEs96EAfJT2EY+WKGHRQ77jks2HfflJXl98DP+Eg++TYPk0qyX3f6j/s4Pl02D5FKsldwz/F94842P4Z8BPdaVyMjAf+/wzzHVLQ5mUL02jT6xiFatYxSpWsYpVrGIVq1jFKlaxilWsYhWrWAvFqi2fSDgjWO4TAfgo7VMeLVHCood899ltPuzLz/H64t8kPuvg+xxYvsBqyf0m8a8Oli+A5fOsltxvEv/Gm2f8m8QXwU91pXIyMB/7/IvMdUtDmZQvTaNPrGIVq1jFKlaxilWsYhWrWMUqVrGKVaxiFatYC8WqLZ9NOCNY7rMB+Cjt8x4tUcKih3z32W0+7MtneH3xbxJPO/ieAcuXWS25vx/x7w6WL4PlS6yW3G8SX+HNM/5N4qvgp7pSORmYj33+Vea6paFMypem0SdWsYpVrGIVq1jFKta2bdWWpxPOCJZ7OgAfpX3JoyVKWPSQ7zrF5sO+/DqvL76m+5qD7+tg+RarJXdN9w0Hy7fA8k1WS+6a7j9484yv6b4NfqorlZOB+djn32auWxrKpHxpGn1iFatYxSpWsYpVrGJt21Zt+VrCGcFyXwvAR2nf9GiJEhY95LtOsfmwL7/L64uv6b7j4PsuWH7Aasld033PwfIDsHyf1ZK7pvtP3jzja7ofgv975pPKycB87PMfMtctDWVSvjSNPrGKVaxiFatYxSpWsbZtq7Z8J+GMYLnvBOCjtO97tEQJix7yXafYfNiXP+b1xdd0P3Lw/RgsP+W1xH9n4L8cLD8Fy094LfE13X/z5hlf0/0M/FRXKicD87HPf8ZctzSUSfnSNPrE2rat2vKjhDOC5X4UgI/SfuLREiUsesh3XLL5sC9/weuLj+E/d/D9Aiy/4rXEx/D/cbD8Ciy/5LXEx/Bf8+YZH8N/A36qK5WTgfnY579hrlsayqR8aRp9Ym3bVm35ecIZwXI/D8BHab/0aIkSFj3kOy7ZfNiXv+X1xcfwZx18vwXL7z1Y/tfB8nuw/I7XEh/D/483z/gY/gfwU12pnAzMxz7/A3Pd0lAm5UvT6CsUq7Y8m3BGsNyzAfgo7XceLVHCood8+4/Nh335Jw++Pzr4/gS+P1p8f/Hg+7OD7y/g+7PF9zcPvr86+P4Gvr9afOk0vy8Jyuej8jOwIPqKPfiKHHzF4Cuy+Np58JU4+NqBr8Tia+/BV+rgaw++Uosv8uDr4OCLwNfB4st48JU5+DLgK7P4yj34Ojr4ysHX0eLr5MFX4eDrBD5a7zz4unjwdXbwdQEfrfcQ+Lp58HV18HUDX1eLr4cHX3cHXw/wdbf4ennw9XTw9QJfT8v+0ceDr7eDrw/4elt8/Tz4+jr4+oGvr8VX6cHX38FXCb7+Ft9AD74BDr6B4Btg8VV58GUdfFXgy1p8gz34Bjn4BoNvkMU31INviINvKPiGWHyXePANc/BdAr5hFt8ID77hDr4R4Btu8Y3y4Bvp4BsFvpEW3xgPvtEOvjHgG23xjfPgG+vgGwe+sRZfjQdftYOvBnzVFt94D75aB9948NVafBM9+CY4+CaCb4LFN5nXF9+fnuTgo/K1ZRqvJf69c4qDZRpYpjL3m85zOm+e8b3yGVAhqut06PMZlj6fwVy3NJRJ+dI0+sTatq3aQscGckaw3KR06/sobapHS5Sw6CHfccnmw76c5eEYPtPBNwvaag6rJfd3qGY7WOaApc7DMXyuh2P4PKgQ1XUu9Pk8S5/P87B/zE3sHzSNPrGKVaxiFatYxSpWsYpVrGIVq1jFKlaxilWsYi0Uq7bQvW5yRrAczWtN33P3nD1aooRFD4nJC+6z23zYl/N5ffFvEpc6+OZDWy1kteR+k7jMwbIQLAuY+03nuYg3z/g3icVQIarrIujzxZY+X+xh/1iU2D9oGn1iFatYxSpWsYpVrGIVq1jFKlaxilWsYhWrWMVaKFZtoXvd5IxgOZrXmj5KW+DREiUsekhMXnCf3ebDvlzK64t/k1ji4FsKbbWc1ZL7mzuXO1iWg2UZc7/pPFfw5hn/JrESKkR1XQF9vtLS5ys97B8rEvsHTaNPrGIVq1jFKlaxilWsbduqLXStQM4IlqN5remjtGUeLVHCoofE5AXXKTYf9uVqXl98TbfKwbca2motqyV3TXeFg2UtWNYw95vOcx1vnvE13XqoENV1HfT5ekufr/ewf6xL7B80jT6xilWsYhWrWMUqVrG2bau20LUCOSNYjua1po/S1ni0RAmLHhKTF1yn2HzYlxt4ffE13ZUOvg3QVptYLblruqscLJvAspG533Sem3nzjK/ptkCFqK6boc+3WPp8i4f9Y3Ni/6Bp9IlVrGIVq1jFKlaxirVtW7WFrhXIGcFyNK81fZS20aMlSlj0kJi84DrF5sO+rOf1xdd0Wx189dBWO3gt8d8Z2OZg2QGW7cz9pvNs4M0zvqbbCRWiujZAn++09PlOD/tHQ2L/oGn0ibVtW7WFjg3b4BhOy21Nt76P0rZ7tEQJix7yHZdsPuzL3R6O4bscfLuhrfZ5OIbvcbDsA8teD8fw/R6O4QegQlTX/dDnByx9fsDD/rE/sX/QNPrE2rat2kLHhj1wDKfldqVb30dpez1aooRFD/mOSzYf9mWjh2P4QQdfI7TVYQ+WQw6Ww2C52sMx/IiHY3gTVIjqegT6vMnS500e9o8jif2DptFXKFZtoW34EBxraLmD6db3UdrVHi1RwqKHfPuPzYd9ecyD76iD7xj4jlp8Jzz4jjv4ToDvuMV3jQffSQffNeA7afFd58F3rYPvOvBda/Hd4MF3vYPvBvBdb/Hd5MF3o4PvJvDdaPHd4sF3s4PvFvDdbPHd7uH84VYH3+1wLL7Nw/nDKd48q3WedzC3mc7jNDQStd8p6Duafwe012kP36OnEt+jNI2+llq7p1rX6qHc2o4qjw5Qb8r/fOrCdtDDnWa8BNJp39OTZ0xaOzNNyz9klimGZZ6Jcp/lpo1pKII2PuOhjXGog/Ez0N809AzI0iMgy/yALJ0CsnQMyBIFZCkNyFIckOVUOhxLeUDtUhaQpX1AlpKALL0CsvQJyNI7IEtdQJbuAVkqArJkArJ0CMjSLiBLupUtUeriew4RzD8FyxUl1tXt+OOK5vlnTXoR5HPOpBVb8j4Led9lxs+lL14X2+ishzbCcupgmsoqA8O5dOtb2gVk6RCQJROQpSIgS/eALHUBWXoHZOkTkKVXQJaSgCztA7KUBWQpD8hyKh2OpTigdikNyBIFZOkYkKVTQJb5AVl6BGTpGZCl6EWy0LUZ5XtXwtKa5d7NW278zNs9UC5dq94N7U7l3wOOe5kd6YQjDeVSWcWwzAlzQqDPl46WNbsuTfG69LGbzg8pb13mtR7KbJgyqX7bhJ07W1LmXN565v7+b+rCIZ2YroNxKl9b5vFa4mcz5vDmGT+bMZu5zXQes6BNqP3InoH5s6G9ZjG3VxrKpHxpGn0ttXZvZauv/p/Jm+dzz3tQW85MtCnWZzpzfXQeM0xeJVDWdChzKnOZuu+mmbzouRQyUFnFsMz95niV77mUabzGvPeAqazney6ltS09ArLMD8jSNSBLp4AsHQOyRAFZSgOyFAdkmRWQpVtAls4BWcoDspQFZGkfkKUkIEuvgCx9ArL0DshSF5ClS0CWioAsmYAsHQKytAvIkm5ly/M9O0TzZ0FaUWLd5LNDk016EawzyYwXW/KeDGlTzPgky7rYRpMTdal+YUPcRlhOHUxTWfjs0KQALO0CsnQIyJIJyFIRkKVLQJa6gCy9A7L0CcjSKyBLSUCW9gFZygKylAdk6RyQpVtAllkBWYoDspQGZIkCsnQMyNIpIEvXgCzzA7L0CMjSMyBL0YtkoetnyndKwtKa5U7kLTd+TmAClEv3EyZCu1P5E8AxntmRTjjSUC6VVQzLLDEXqPqcdmGm2eXj+S66tsFnrZZ5KBOf7/p7Zc7lreeEl/rzXTqP2eC3Pd9E8/G3AeZnwvI+3zTbX7lx/V+Kz6KJteXWDJRHzih18b7Wmj5KmwcW5mNBjS6HzvfmQDkzeMuJj6m4begh3zF1BliYn0Ws8fWM4TTwJ58xzMB837+3Tk9d2KY0jb6WWmeL9SVp5X/mdXx8fojl6iHfPj7VYxvoPKfw5hnv45PBT3WlcjIwH/u3Na6PxCpWsYpVrGIVq1jFKlaxilWsYhWrWMUqVrGKVaxiFatYxSpWsYpVrGIVqx+rLncSa7m11VGiXD3ke+bC5/PiL8Yz2VRXKicD87F/JzDXLQ1lUr40jT6xilWsYhWrWMUqVrGKVaxiFatYxSpWsYpVrGItFKuH/98ifhcYy9VDvnvW4z22gc6zljfP+J51DfiprlROBuZj/9Yw1y0NZVK+NI0+sbZtqy63mrXcmvh3KSxXD/n28WqPbaDzHMebZ8wdC36qK5WTgfnYv2OZ65aGMilfmkafWMUqVrGKVaxiFatY27ZVlzuGtdzcOT+Wq4d85/xjPLaBznM0b57xOf8o8FNdqZwMzMf+HcVctzSUSfnSNPrEKlaxilWsYhWrWMXatq263JG85dZGiXL1kO+cf6THNtB5juDNMz7nHw5+qiuVk4H52L/DmeuWhjIpX5pGX6FYdbmX8JYbb4tYrh7ybYuXeGwDnecw3jzjbXEo+KmuVE4G5mP/DmWuWxrKpHxpGn2FYo0grQjSaD7+jdEhZrwE0gab8XaQdhnUidIWmPH2kLbQjHeAtEVmvCekLTbj+HdTl5jxmZC21IxPh7TLzTj+bdZlZnwKpC0345MhbYUZnwhpK834BEhbZcZrIW21Ga+BtCvM+DhIW2PGx0LaWjM+GtLWmfFRkLbejI+AtCvN+HBI22DGZ0PaVTBOnxvNeBmkbTLjGUjbbMY7QtoWM14OaVvNeAWk1ZvxTpC2zeKjbXEYpNG2iNsubYtDII22xcGQRtviZZBG2+ICSKNtcSGkURstgjRqo8WQRm20BNKojZZCGrXR5ZBGbbQM0qiNlkMa/S2+FZBGf4t0JaTR39RaBWn0t/NWQ1p3M34FpPUw42sgjfbHtZDWy4yvg7TeZnw9pNHf4bwS0vqa8Q2Q1s+M47bZ34xvhLRKM74J0gaY8c2QNtCMb4G0rBnfCmlVZrwe0gaZcdo29bZSCsvWmc/qFzbUYFk05PvepvJLoS5MluoMWLJQzgDWcmrjv/FEfVNkyqJtbgCUW8lTbg2N6HL7Q/5V4KCyimGZZ8yOWm6W78/aDjkPldvOtAN5+oOHlvmK8ehj3omK5npkeV21uE/QkG+bzKaaLUx9RpRq3I9bYqkEC+92mzuv5d4GdJ79mPPUefSFNkluUxmY3w/aqy9ze+H+RvnSNPrEKlaxilWsYhWrWMUqVrGKVaxiFatYxSpWsYq1UKzaUpVw4m9ZVQH4KA1/b+G+t42//VHe+reLnfDbxUDWMnO/LWWhTlkwUFnFsMyTFc2uvWa8DOZTX+FvjNh/vL935PqPyqF8aZrKKoO6YP9x/96Bv9NRvi/dcmu38+8DtdX693/9TEHW5Jfc76hP8bdXSsPf+XSf03aHzzUMTKS1Vn/gPjMQ0mh8EPh427jGx29o8WM7faEfsmacyimG+bfCMeT2iua+SR4v9PwHLPNpyPe7Jv5uzfycWDU+J1Zq8h1qKZf5mcULnk9Lm6AyKL0Yxs/TQzKwnB6ofcmst7shluVwfEBinQzMH+K5zvhsYB1MU1l6OzkN29QD8H3J/X2D9cV26QHtQvMHQrtw72+6XfD8LguGfmAZnHDieRUeA4d48D3fedUQ8FFaJfioHng8eQqsPs+Bks/XYB8yfU9c8HwNPn9RBQ4qC59neZ3ZrvVjLcnzniys2wfyfDGeCUp+N+MzQW8G84v1TBB5bM8EvQ2OEz/4O+evlYk0D/4a9FO+lQk/nhdU+rM4t+X7E33LfW2GzzjSkO87vy+0DffxzMd5hM5jGPiprvgdS/O7Q92Y3xXI+x2LvqEWK57PViaW4z8fqK328f6FzmOEyUsfF2hfo3KKYf5n4PjxOTg3pTpnIZ9vWObT0NJ3TUbx1rUa3/2ic9dRlnJ5/7+HC985o3NXKoPSi2H863DuOqZ59Ln2JbPe7kZalsPxoYl1MjB/pOc6jwJHHUxTWXo7+QJsU9+Ac1fu/Rzri+3SB9qF5uN1dvJ6Ad+dwu/G1ng3LJO6+H0h/G7nP1/MubLgyqYuvmeG9/Ky4MJ7ecXMrtJU83sbXHniOyM05Dt2lcJnO2aLvi9E74wcaWo8XL+rYVVD/Y40sEoSxCKg4Ti+pkWvteBrWvRaC76mRevjK1mUTweYl2wetvp3g8oVmcJLDLLUFN4h1fy+jW4rfT9Nn5/pzU6/H6Pfh9Hvv+j3XbqB8Zz51OcZ+tpHv7+i31fR76fo7VifW+nvfH0eqI8N+ntfb+vZVO4YoO9X6etJfd6ljxN6X9TfJ3o/1funPq7oY58+vutjn35/S7/XpU+C9IFJvwum/+9e/Z6Yfn9M/+05/W6Zfudsair3Ptp0FTNSuXfY9Ltts03bzlExV8U8FZeqmJ/Kvbek31PS7yUtSuXeO1qSyr1XpN8j0u8N6feE9HtB+j0g/d6Pfs9Hv9ej3+PR7+3o93T0ezn6PZwNqdx7NhtTufdo9HszW1K592LqU7n3Xrar2KGiQcVOFbtU7FaxR8VeFftU7FdxQMVBFY0qDqm4WsVhFUdUNKk4quKYiuMqTqg4qeIaFdequE7F9SpuUHGjiptU3KziFhW3qrhNxe0qTqm4Q8VpFXeqOKPiLhVnU7m+vlvFPSruVXGfivtVnFfxgIoHVTyk4mUqXq7iYRWPqHiFikdVPKbicRVPqHgy1bzP44b/tHkJbIaZXp3bX7NH9jc2ZauzB9W/9fv3Nx5v2DE2i/OOZA8cPdKUPdJUf7gpu/Nw44FszVjM974yP/k+bd4Voe+z+qamhgOHmrJNjWrF/U17Du0/mT2+p2l3tvFYw+GdqgBc+bUVL2DlN5mV+1+8cv2OHc+/3vvMerQXLzq4o+FEtvFoU7ZxZ3Zb49GDO478P1KEvWoJlAIA", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "set_is_valid_storage", - "functionType": "open", - "isInternal": true, - "parameters": [ - { - "name": "message_hash", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "value", - "type": { - "kind": "boolean" - }, - "visibility": "private" - } - ], - "returnTypes": [ - { - "kind": "struct", - "path": "aztec::protocol_types::abis::public_circuit_public_inputs::PublicCircuitPublicInputs", - "fields": [ - { - "name": "call_context", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::abis::call_context::CallContext", - "fields": [ - { - "name": "msg_sender", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::address::AztecAddress", - "fields": [ - { - "name": "inner", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "storage_contract_address", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::address::AztecAddress", - "fields": [ - { - "name": "inner", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "portal_contract_address", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::address::EthAddress", - "fields": [ - { - "name": "inner", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "function_selector", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::abis::function_selector::FunctionSelector", - "fields": [ - { - "name": "inner", - "type": { - "kind": "integer", - "sign": "unsigned", - "width": 32 - } - } - ] - } - }, - { - "name": "is_delegate_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_static_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_contract_deployment", - "type": { - "kind": "boolean" - } - } - ] - } - }, - { - "name": "args_hash", - "type": { - "kind": "field" - } - }, - { - "name": "return_values", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "contract_storage_update_requests", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::protocol_types::contrakt::storage_update_request::StorageUpdateRequest", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "old_value", - "type": { - "kind": "field" - } - }, - { - "name": "new_value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "contract_storage_reads", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::protocol_types::contrakt::storage_read::StorageRead", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "current_value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "public_call_stack_hashes", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_commitments", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_nullifiers", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_l2_to_l1_msgs", - "type": { - "kind": "array", - "length": 2, - "type": { - "kind": "field" - } - } - }, - { - "name": "unencrypted_logs_hash", - "type": { - "kind": "array", - "length": 2, - "type": { - "kind": "field" - } - } - }, - { - "name": "unencrypted_log_preimages_length", - "type": { - "kind": "field" - } - }, - { - "name": "block_header", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::abis::block_header::BlockHeader", - "fields": [ - { - "name": "note_hash_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "nullifier_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "contract_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "l1_to_l2_messages_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "archive_root", - "type": { - "kind": "field" - } - }, - { - "name": "public_data_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "global_variables_hash", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "prover_address", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::address::AztecAddress", - "fields": [ - { - "name": "inner", - "type": { - "kind": "field" - } - } - ] - } - } - ] - } - ], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - } - ], - "events": [] -} diff --git a/yarn-project/aztec.js/src/artifacts/schnorr_single_key_account_contract.json b/yarn-project/aztec.js/src/artifacts/schnorr_single_key_account_contract.json deleted file mode 100644 index ed9b096f34d..00000000000 --- a/yarn-project/aztec.js/src/artifacts/schnorr_single_key_account_contract.json +++ /dev/null @@ -1,736 +0,0 @@ -{ - "name": "SchnorrSingleKeyAccount", - "functions": [ - { - "name": "constructor", - "functionType": "secret", - "isInternal": false, - "parameters": [], - "returnTypes": [], - "bytecode": "H4sIAAAAAAAA/+XdZ2+TZxSHcSfEdvdu2BD2bu3Yju1OSvemk+6Ci9Pd0kl3Kd17TzpS9l6fkHMJI/ECXnFH4tZl6S9LefHIv9h+/Ixzn3O4UCiMFY4++iL9kYHI0HF/47G891w5tUe1GNsonmC7tcpIvd5tDnerteqaynC702pU6o3OSKvaqjZajbXDrVqt26q3mu1Ou1lpV+u1bnW00a6N9jZcTPcaK+PhLsU2SuPgLp3m7nJsozwO7nJid+Ekn/dTfZ0Tx+l19id+n/oSmidlYu5PaJ6ciXlCQvOUTMwDCc1TMzEXE5qnZWIuJTRPz8RcTmiekYl5YkLzTKF5SGieJTTPFprnCM1zheZ5QvN8oXmB0LxQaF4kNC8WmpcIzUuF5mVC82VC8+VCc0VorgrNw0JzTWiuC80NoXlEaG4KzS2huS00XyE0Xyk0XyU0Xy00XyM0Xys0LxearxOaVwjN1wvNNwjNNwrNNwnNNwvNtwjNtwrNtwnNtwvNdwjNdwrNdwnNdwvNK4Xme4Tme4Xm+4Tm+4XmB4TmB4XmVULzQ0Lzw0LzI0Lzo0LzY0Lz40LzE0Lzk0LzaqF5jdDcEZqfEprXCs1doXlUaH5aaH5GaH5WaH5OaH5eaH5BaH5RaH5JaH5ZaF4nNL8iNL8qNL8mNL8uNL8hNL8pNK8Xmt8Smt8Wmt8Rmt8Vmt8Tmt8Xmj8Qmj8UmjcIzR8JzRuF5o+F5k+E5k+F5s+E5s+F5i+E5i+F5q+E5q+F5m+E5m+F5u+E5u+F5h+E5h+F5p+E5p+F5l+E5l+F5t+E5t+F5j+E5j+F5r+E5k1C899C8z9C879C839C85jQ/L/QvFlo3pKJ+YyE5q2ZmM9MaN6WifmshObtmZjPTmjekYn5nITmnZmYz01o3pWJ+byE5t2ZmM9PaN6TifmChOa9mZgvTGjel4n5ooTm/ZmYL05oPpCJ+ZKE5oOZmC9NaD6UiXkwoflwQvNgbzt9PfOEyECkGClFyhHOCTlH4pyBY2iOKTnG4piD32B+k9hHs8/iO8xnmvd48Lj/56be86TI5MiUyNTItMj0yIzIzMhQZFZkdmROZG5kXmR+ZEFkYWRRZHFkSWRpZFmEGffMfOdNZCY4M7KZGc0MZWYKM2O3GWEGKzNJmdHJzEpmODLTkBl/x2beMRNtRYSZWcyQYqYSM4aYucMMGmayMKOEmR3MsGCmAzMO6Pm/MkJPeHqk0zOcHtr0lKbH8qoIPXjpSUuPVnqW0sOTnpb0eKTn4eoIPfE6EXqm0UOMnlr0mKLnEj2I6MlDjxp6ttDDhJ4e9Lig58O6CD0BWCPPmnHWULOmmDW26yOswWRNImv0WLPGGi7WNLHGhzUvGyKsidgYoWaeGnJqqqkxpuaWGlRqMqlRpGaPGjZquqhxouaHGhhqQqiRoGaAe+jcU+YeK/ccuQfHPSnu0fCZ4Bo+17S5xss1z7EI18S4RsQ1E64hcE7NOSbnXJyDcEzOMSrHbBzD8JvObxz7fPaB7BP4jhx7HAEN+DJJTJoAAA==", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "entrypoint", - "functionType": "secret", - "isInternal": false, - "parameters": [ - { - "name": "payload", - "type": { - "kind": "struct", - "path": "authwit::entrypoint::EntrypointPayload", - "fields": [ - { - "name": "function_calls", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "struct", - "path": "authwit::entrypoint::FunctionCall", - "fields": [ - { - "name": "args_hash", - "type": { - "kind": "field" - } - }, - { - "name": "function_selector", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::abis::function_selector::FunctionSelector", - "fields": [ - { - "name": "inner", - "type": { - "kind": "integer", - "sign": "unsigned", - "width": 32 - } - } - ] - } - }, - { - "name": "target_address", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::address::AztecAddress", - "fields": [ - { - "name": "inner", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "is_public", - "type": { - "kind": "boolean" - } - } - ] - } - } - }, - { - "name": "nonce", - "type": { - "kind": "field" - } - } - ] - }, - "visibility": "public" - } - ], - "returnTypes": [], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "is_valid", - "functionType": "secret", - "isInternal": false, - "parameters": [ - { - "name": "message_hash", - "type": { - "kind": "field" - }, - "visibility": "private" - } - ], - "returnTypes": [], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "is_valid_public", - "functionType": "open", - "isInternal": false, - "parameters": [ - { - "name": "message_hash", - "type": { - "kind": "field" - }, - "visibility": "private" - } - ], - "returnTypes": [ - { - "kind": "struct", - "path": "aztec::protocol_types::abis::public_circuit_public_inputs::PublicCircuitPublicInputs", - "fields": [ - { - "name": "call_context", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::abis::call_context::CallContext", - "fields": [ - { - "name": "msg_sender", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::address::AztecAddress", - "fields": [ - { - "name": "inner", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "storage_contract_address", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::address::AztecAddress", - "fields": [ - { - "name": "inner", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "portal_contract_address", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::address::EthAddress", - "fields": [ - { - "name": "inner", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "function_selector", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::abis::function_selector::FunctionSelector", - "fields": [ - { - "name": "inner", - "type": { - "kind": "integer", - "sign": "unsigned", - "width": 32 - } - } - ] - } - }, - { - "name": "is_delegate_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_static_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_contract_deployment", - "type": { - "kind": "boolean" - } - } - ] - } - }, - { - "name": "args_hash", - "type": { - "kind": "field" - } - }, - { - "name": "return_values", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "contract_storage_update_requests", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::protocol_types::contrakt::storage_update_request::StorageUpdateRequest", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "old_value", - "type": { - "kind": "field" - } - }, - { - "name": "new_value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "contract_storage_reads", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::protocol_types::contrakt::storage_read::StorageRead", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "current_value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "public_call_stack_hashes", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_commitments", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_nullifiers", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_l2_to_l1_msgs", - "type": { - "kind": "array", - "length": 2, - "type": { - "kind": "field" - } - } - }, - { - "name": "unencrypted_logs_hash", - "type": { - "kind": "array", - "length": 2, - "type": { - "kind": "field" - } - } - }, - { - "name": "unencrypted_log_preimages_length", - "type": { - "kind": "field" - } - }, - { - "name": "block_header", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::abis::block_header::BlockHeader", - "fields": [ - { - "name": "note_hash_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "nullifier_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "contract_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "l1_to_l2_messages_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "archive_root", - "type": { - "kind": "field" - } - }, - { - "name": "public_data_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "global_variables_hash", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "prover_address", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::address::AztecAddress", - "fields": [ - { - "name": "inner", - "type": { - "kind": "field" - } - } - ] - } - } - ] - } - ], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "set_is_valid_storage", - "functionType": "open", - "isInternal": true, - "parameters": [ - { - "name": "message_hash", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "value", - "type": { - "kind": "boolean" - }, - "visibility": "private" - } - ], - "returnTypes": [ - { - "kind": "struct", - "path": "aztec::protocol_types::abis::public_circuit_public_inputs::PublicCircuitPublicInputs", - "fields": [ - { - "name": "call_context", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::abis::call_context::CallContext", - "fields": [ - { - "name": "msg_sender", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::address::AztecAddress", - "fields": [ - { - "name": "inner", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "storage_contract_address", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::address::AztecAddress", - "fields": [ - { - "name": "inner", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "portal_contract_address", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::address::EthAddress", - "fields": [ - { - "name": "inner", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "function_selector", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::abis::function_selector::FunctionSelector", - "fields": [ - { - "name": "inner", - "type": { - "kind": "integer", - "sign": "unsigned", - "width": 32 - } - } - ] - } - }, - { - "name": "is_delegate_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_static_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_contract_deployment", - "type": { - "kind": "boolean" - } - } - ] - } - }, - { - "name": "args_hash", - "type": { - "kind": "field" - } - }, - { - "name": "return_values", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "contract_storage_update_requests", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::protocol_types::contrakt::storage_update_request::StorageUpdateRequest", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "old_value", - "type": { - "kind": "field" - } - }, - { - "name": "new_value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "contract_storage_reads", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::protocol_types::contrakt::storage_read::StorageRead", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "current_value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "public_call_stack_hashes", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_commitments", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_nullifiers", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_l2_to_l1_msgs", - "type": { - "kind": "array", - "length": 2, - "type": { - "kind": "field" - } - } - }, - { - "name": "unencrypted_logs_hash", - "type": { - "kind": "array", - "length": 2, - "type": { - "kind": "field" - } - } - }, - { - "name": "unencrypted_log_preimages_length", - "type": { - "kind": "field" - } - }, - { - "name": "block_header", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::abis::block_header::BlockHeader", - "fields": [ - { - "name": "note_hash_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "nullifier_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "contract_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "l1_to_l2_messages_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "archive_root", - "type": { - "kind": "field" - } - }, - { - "name": "public_data_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "global_variables_hash", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "prover_address", - "type": { - "kind": "struct", - "path": "aztec::protocol_types::address::AztecAddress", - "fields": [ - { - "name": "inner", - "type": { - "kind": "field" - } - } - ] - } - } - ] - } - ], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - } - ], - "events": [] -} diff --git a/yarn-project/aztec.js/src/contract/batch_call.ts b/yarn-project/aztec.js/src/contract/batch_call.ts index 0a848312cbf..68b5536644a 100644 --- a/yarn-project/aztec.js/src/contract/batch_call.ts +++ b/yarn-project/aztec.js/src/contract/batch_call.ts @@ -1,6 +1,6 @@ import { FunctionCall, TxExecutionRequest } from '@aztec/types'; -import { Wallet } from '../wallet/index.js'; +import { Wallet } from '../account/index.js'; import { BaseContractInteraction } from './base_contract_interaction.js'; /** A batch of function calls to be sent as a single transaction through a wallet. */ diff --git a/yarn-project/aztec.js/src/contract/contract.ts b/yarn-project/aztec.js/src/contract/contract.ts index 5de21db3d77..5b90579e281 100644 --- a/yarn-project/aztec.js/src/contract/contract.ts +++ b/yarn-project/aztec.js/src/contract/contract.ts @@ -3,9 +3,9 @@ import { AztecAddress } from '@aztec/foundation/aztec-address'; import { Point } from '@aztec/foundation/fields'; import { PublicKey } from '@aztec/types'; -import { DeployMethod } from '../contract_deployer/deploy_method.js'; -import { Wallet } from '../wallet/index.js'; +import { Wallet } from '../account/index.js'; import { ContractBase } from './contract_base.js'; +import { DeployMethod } from './deploy_method.js'; /** * The Contract class represents a contract and provides utility methods for interacting with it. @@ -43,7 +43,8 @@ export class Contract extends ContractBase { * @param args - Arguments for the constructor. */ public static deploy(wallet: Wallet, artifact: ContractArtifact, args: any[]) { - return new DeployMethod(Point.ZERO, wallet, artifact, args); + const postDeployCtor = (address: AztecAddress, wallet: Wallet) => Contract.at(address, artifact, wallet); + return new DeployMethod(Point.ZERO, wallet, artifact, postDeployCtor, args); } /** @@ -54,6 +55,7 @@ export class Contract extends ContractBase { * @param args - Arguments for the constructor. */ public static deployWithPublicKey(publicKey: PublicKey, wallet: Wallet, artifact: ContractArtifact, args: any[]) { - return new DeployMethod(publicKey, wallet, artifact, args); + const postDeployCtor = (address: AztecAddress, wallet: Wallet) => Contract.at(address, artifact, wallet); + return new DeployMethod(publicKey, wallet, artifact, postDeployCtor, args); } } diff --git a/yarn-project/aztec.js/src/contract/contract_base.ts b/yarn-project/aztec.js/src/contract/contract_base.ts index 584529573d8..82e312f264c 100644 --- a/yarn-project/aztec.js/src/contract/contract_base.ts +++ b/yarn-project/aztec.js/src/contract/contract_base.ts @@ -2,7 +2,7 @@ import { ContractArtifact, FunctionArtifact, FunctionSelector } from '@aztec/fou import { EthAddress } from '@aztec/foundation/eth-address'; import { CompleteAddress, DeployedContract } from '@aztec/types'; -import { Wallet } from '../wallet/index.js'; +import { Wallet } from '../account/index.js'; import { ContractFunctionInteraction } from './contract_function_interaction.js'; /** diff --git a/yarn-project/aztec.js/src/contract/contract_function_interaction.ts b/yarn-project/aztec.js/src/contract/contract_function_interaction.ts index da6932b1b91..84ac432f48a 100644 --- a/yarn-project/aztec.js/src/contract/contract_function_interaction.ts +++ b/yarn-project/aztec.js/src/contract/contract_function_interaction.ts @@ -2,7 +2,7 @@ import { AztecAddress, FunctionData } from '@aztec/circuits.js'; import { FunctionAbi, FunctionType, encodeArguments } from '@aztec/foundation/abi'; import { FunctionCall, TxExecutionRequest } from '@aztec/types'; -import { Wallet } from '../wallet/index.js'; +import { Wallet } from '../account/wallet.js'; import { BaseContractInteraction, SendMethodOptions } from './base_contract_interaction.js'; export { SendMethodOptions }; diff --git a/yarn-project/aztec.js/src/contract_deployer/deploy_method.ts b/yarn-project/aztec.js/src/contract/deploy_method.ts similarity index 91% rename from yarn-project/aztec.js/src/contract_deployer/deploy_method.ts rename to yarn-project/aztec.js/src/contract/deploy_method.ts index a6dc144d347..cac819e4cf7 100644 --- a/yarn-project/aztec.js/src/contract_deployer/deploy_method.ts +++ b/yarn-project/aztec.js/src/contract/deploy_method.ts @@ -1,4 +1,5 @@ import { + AztecAddress, CompleteAddress, ContractDeploymentData, FunctionData, @@ -10,8 +11,10 @@ import { EthAddress } from '@aztec/foundation/eth-address'; import { Fr } from '@aztec/foundation/fields'; import { PXE, PackedArguments, PublicKey, Tx, TxExecutionRequest } from '@aztec/types'; -import { BaseContractInteraction } from '../contract/base_contract_interaction.js'; -import { Contract, ContractBase, SendMethodOptions } from '../contract/index.js'; +import { Wallet } from '../account/index.js'; +import { BaseContractInteraction, SendMethodOptions } from './base_contract_interaction.js'; +import { type Contract } from './contract.js'; +import { ContractBase } from './contract_base.js'; import { DeploySentTx } from './deploy_sent_tx.js'; /** @@ -44,6 +47,7 @@ export class DeployMethod extends Bas private publicKey: PublicKey, protected pxe: PXE, private artifact: ContractArtifact, + private postDeployCtor: (address: AztecAddress, wallet: Wallet) => Promise, private args: any[] = [], ) { super(pxe); @@ -125,7 +129,7 @@ export class DeployMethod extends Bas */ public send(options: DeployOptions = {}): DeploySentTx { const txHashPromise = super.send(options).getTxHash(); - return new DeploySentTx(this.artifact, this.pxe, txHashPromise, this.completeAddress); + return new DeploySentTx(this.pxe, txHashPromise, this.postDeployCtor, this.completeAddress); } /** diff --git a/yarn-project/aztec.js/src/contract_deployer/deploy_sent_tx.ts b/yarn-project/aztec.js/src/contract/deploy_sent_tx.ts similarity index 86% rename from yarn-project/aztec.js/src/contract_deployer/deploy_sent_tx.ts rename to yarn-project/aztec.js/src/contract/deploy_sent_tx.ts index 7dad9ff2dde..a884a1e1302 100644 --- a/yarn-project/aztec.js/src/contract_deployer/deploy_sent_tx.ts +++ b/yarn-project/aztec.js/src/contract/deploy_sent_tx.ts @@ -1,11 +1,10 @@ import { AztecAddress, CompleteAddress, FieldsOf } from '@aztec/circuits.js'; -import { ContractArtifact } from '@aztec/foundation/abi'; import { PXE, TxHash, TxReceipt } from '@aztec/types'; -import { Contract } from '../contract/contract.js'; -import { ContractBase } from '../contract/contract_base.js'; -import { SentTx, WaitOpts } from '../contract/sent_tx.js'; -import { Wallet } from '../wallet/index.js'; +import { Wallet } from '../account/index.js'; +import { type Contract } from './contract.js'; +import { ContractBase } from './contract_base.js'; +import { SentTx, WaitOpts } from './sent_tx.js'; /** Options related to waiting for a deployment tx. */ export type DeployedWaitOpts = WaitOpts & { @@ -24,9 +23,9 @@ export type DeployTxReceipt = FieldsO */ export class DeploySentTx extends SentTx { constructor( - private artifact: ContractArtifact, wallet: PXE | Wallet, txHashPromise: Promise, + private postDeployCtor: (address: AztecAddress, wallet: Wallet) => Promise, /** * The complete address of the deployed contract @@ -66,6 +65,6 @@ export class DeploySentTx extends SentTx if (!address) { throw new Error(`Contract address is missing from transaction receipt`); } - return Contract.at(address, this.artifact, contractWallet) as Promise; + return this.postDeployCtor(address, contractWallet) as Promise; } } diff --git a/yarn-project/aztec.js/src/contract/index.ts b/yarn-project/aztec.js/src/contract/index.ts index 0a2d9ea8994..eb3c16064d3 100644 --- a/yarn-project/aztec.js/src/contract/index.ts +++ b/yarn-project/aztec.js/src/contract/index.ts @@ -37,6 +37,8 @@ */ export * from './contract.js'; export * from './contract_function_interaction.js'; -export { SentTx, WaitOpts } from './sent_tx.js'; +export * from './sent_tx.js'; export * from './contract_base.js'; export * from './batch_call.js'; +export * from './deploy_method.js'; +export * from './deploy_sent_tx.js'; diff --git a/yarn-project/aztec.js/src/contract_deployer/contract_deployer.ts b/yarn-project/aztec.js/src/contract_deployer/contract_deployer.ts index 3bc720d72be..1cdc6a7b89f 100644 --- a/yarn-project/aztec.js/src/contract_deployer/contract_deployer.ts +++ b/yarn-project/aztec.js/src/contract_deployer/contract_deployer.ts @@ -1,8 +1,11 @@ +import { AztecAddress } from '@aztec/circuits.js'; import { ContractArtifact } from '@aztec/foundation/abi'; import { Point } from '@aztec/foundation/fields'; import { PXE, PublicKey } from '@aztec/types'; -import { DeployMethod } from './deploy_method.js'; +import { Wallet } from '../account/wallet.js'; +import { DeployMethod } from '../contract/deploy_method.js'; +import { Contract } from '../contract/index.js'; /** * A class for deploying contract. @@ -21,6 +24,7 @@ export class ContractDeployer { * @returns A DeployMethod instance configured with the ABI, PXE, and constructor arguments. */ public deploy(...args: any[]) { - return new DeployMethod(this.publicKey ?? Point.ZERO, this.pxe, this.artifact, args); + const postDeployCtor = (address: AztecAddress, wallet: Wallet) => Contract.at(address, this.artifact, wallet); + return new DeployMethod(this.publicKey ?? Point.ZERO, this.pxe, this.artifact, postDeployCtor, args); } } diff --git a/yarn-project/aztec.js/src/contract_deployer/index.ts b/yarn-project/aztec.js/src/contract_deployer/index.ts index 20add4a47c0..587eeb108ce 100644 --- a/yarn-project/aztec.js/src/contract_deployer/index.ts +++ b/yarn-project/aztec.js/src/contract_deployer/index.ts @@ -1,3 +1 @@ export * from './contract_deployer.js'; -export * from './deploy_sent_tx.js'; -export * from './deploy_method.js'; diff --git a/yarn-project/aztec.js/src/account/utils.ts b/yarn-project/aztec.js/src/create_account/index.ts similarity index 72% rename from yarn-project/aztec.js/src/account/utils.ts rename to yarn-project/aztec.js/src/create_account/index.ts index f6309b90ee7..e4d6d169278 100644 --- a/yarn-project/aztec.js/src/account/utils.ts +++ b/yarn-project/aztec.js/src/create_account/index.ts @@ -1,8 +1,8 @@ -import { CompleteAddress, GrumpkinScalar } from '@aztec/circuits.js'; +import { GrumpkinScalar } from '@aztec/circuits.js'; import { PXE } from '@aztec/types'; -import { getSchnorrAccount } from '../index.js'; -import { AccountWalletWithPrivateKey } from '../wallet/account_wallet.js'; +import { getSchnorrAccount } from '../account_manager/index.js'; +import { AccountWalletWithPrivateKey } from '../wallet/account_wallet_with_private_key.js'; /** * Deploys and registers a new account using random private keys and returns the associated Schnorr account wallet. Useful for testing. @@ -13,17 +13,6 @@ export function createAccount(pxe: PXE): Promise { return getSchnorrAccount(pxe, GrumpkinScalar.random(), GrumpkinScalar.random()).waitDeploy(); } -/** - * Creates a random address and registers it as a recipient on the pxe server. Useful for testing. - * @param pxe - PXE. - * @returns Complete address of the registered recipient. - */ -export async function createRecipient(pxe: PXE): Promise { - const completeAddress = CompleteAddress.random(); - await pxe.registerRecipient(completeAddress); - return completeAddress; -} - /** * Creates a given number of random accounts using the Schnorr account wallet. * @param pxe - PXE. diff --git a/yarn-project/aztec.js/src/index.ts b/yarn-project/aztec.js/src/index.ts index bf7610adc41..6ad796595e4 100644 --- a/yarn-project/aztec.js/src/index.ts +++ b/yarn-project/aztec.js/src/index.ts @@ -27,9 +27,11 @@ export { ContractMethod, SentTx, BatchCall, + DeployMethod, + DeploySentTx, } from './contract/index.js'; -export { ContractDeployer, DeployMethod, DeploySentTx } from './contract_deployer/index.js'; +export { ContractDeployer } from './contract_deployer/index.js'; export { generatePublicKey, @@ -46,27 +48,26 @@ export { export { createPXEClient } from './pxe_client.js'; +export { CompleteAddress, AuthWitnessProvider } from './account/index.js'; + export { - CompleteAddress, - getSchnorrAccount, AccountContract, - AccountManager, - getUnsafeSchnorrAccount, EcdsaAccountContract, - createAccounts, SchnorrAccountContract, SingleKeyAccountContract, - createAccount, - AuthWitnessProvider, BaseAccountContract, -} from './account/index.js'; +} from './account_contract/index.js'; + +export { getSchnorrAccount, AccountManager, getUnsafeSchnorrAccount } from './account_manager/index.js'; export { waitForSandbox, getSandboxAccountsWallets, deployInitialSandboxAccounts } from './sandbox/index.js'; export { AccountWalletWithPrivateKey, AccountWallet, Wallet, SignerlessWallet } from './wallet/index.js'; -// TODO https://github.com/AztecProtocol/aztec-packages/issues/2632 --> FunctionSelector might not need to be exposed -// here once the issue is resolved. +export { createAccount, createAccounts } from './create_account/index.js'; + +// // TODO https://github.com/AztecProtocol/aztec-packages/issues/2632 --> FunctionSelector might not need to be exposed +// // here once the issue is resolved. export { AztecAddress, EthAddress, diff --git a/yarn-project/aztec.js/src/sandbox/index.ts b/yarn-project/aztec.js/src/sandbox/index.ts index 23d0b438a0f..8d3dfbdb162 100644 --- a/yarn-project/aztec.js/src/sandbox/index.ts +++ b/yarn-project/aztec.js/src/sandbox/index.ts @@ -1,10 +1,12 @@ import { Fr, GrumpkinScalar } from '@aztec/foundation/fields'; import { sleep } from '@aztec/foundation/sleep'; +import { PXE } from '@aztec/types'; import zip from 'lodash.zip'; -import SchnorrAccountContractArtifact from '../artifacts/schnorr_account_contract.json' assert { type: 'json' }; -import { AccountWalletWithPrivateKey, PXE, createPXEClient, getSchnorrAccount } from '../index.js'; +import { getSchnorrAccount } from '../account_manager/index.js'; +import { createPXEClient } from '../pxe_client.js'; +import { AccountWalletWithPrivateKey } from '../wallet/index.js'; export const INITIAL_SANDBOX_ENCRYPTION_KEYS = [ GrumpkinScalar.fromString('2153536ff6628eee01cf4024889ff977a18d9fa61d0e414422f7681cf085c281'), @@ -16,8 +18,6 @@ export const INITIAL_SANDBOX_SIGNING_KEYS = INITIAL_SANDBOX_ENCRYPTION_KEYS; export const INITIAL_SANDBOX_SALTS = [Fr.ZERO, Fr.ZERO, Fr.ZERO]; -export const INITIAL_SANDBOX_ACCOUNT_CONTRACT_ABI = SchnorrAccountContractArtifact; - export const { PXE_URL = 'http://localhost:8080' } = process.env; /** diff --git a/yarn-project/aztec.js/src/wallet/account_wallet.ts b/yarn-project/aztec.js/src/wallet/account_wallet.ts index 9df782b76df..e9906dd0fdf 100644 --- a/yarn-project/aztec.js/src/wallet/account_wallet.ts +++ b/yarn-project/aztec.js/src/wallet/account_wallet.ts @@ -1,9 +1,9 @@ -import { Fr, GrumpkinPrivateKey } from '@aztec/circuits.js'; +import { Fr } from '@aztec/circuits.js'; import { ABIParameterVisibility, FunctionAbi, FunctionType } from '@aztec/foundation/abi'; import { AuthWitness, FunctionCall, PXE, TxExecutionRequest } from '@aztec/types'; import { AccountInterface } from '../account/interface.js'; -import { ContractFunctionInteraction } from '../index.js'; +import { ContractFunctionInteraction } from '../contract/contract_function_interaction.js'; import { BaseWallet } from './base_wallet.js'; /** @@ -68,19 +68,3 @@ export class AccountWallet extends BaseWallet { }; } } - -/** - * Extends {@link AccountWallet} with the encryption private key. Not required for - * implementing the wallet interface but useful for testing purposes or exporting - * an account to another pxe. - */ -export class AccountWalletWithPrivateKey extends AccountWallet { - constructor(pxe: PXE, account: AccountInterface, private encryptionPrivateKey: GrumpkinPrivateKey) { - super(pxe, account); - } - - /** Returns the encryption private key associated with this account. */ - public getEncryptionPrivateKey() { - return this.encryptionPrivateKey; - } -} diff --git a/yarn-project/aztec.js/src/wallet/account_wallet_with_private_key.ts b/yarn-project/aztec.js/src/wallet/account_wallet_with_private_key.ts new file mode 100644 index 00000000000..2b148478425 --- /dev/null +++ b/yarn-project/aztec.js/src/wallet/account_wallet_with_private_key.ts @@ -0,0 +1,21 @@ +import { GrumpkinPrivateKey } from '@aztec/circuits.js'; +import { PXE } from '@aztec/types'; + +import { AccountInterface } from '../account/interface.js'; +import { AccountWallet } from './account_wallet.js'; + +/** + * Extends {@link AccountWallet} with the encryption private key. Not required for + * implementing the wallet interface but useful for testing purposes or exporting + * an account to another pxe. + */ +export class AccountWalletWithPrivateKey extends AccountWallet { + constructor(pxe: PXE, account: AccountInterface, private encryptionPrivateKey: GrumpkinPrivateKey) { + super(pxe, account); + } + + /** Returns the encryption private key associated with this account. */ + public getEncryptionPrivateKey() { + return this.encryptionPrivateKey; + } +} diff --git a/yarn-project/aztec.js/src/wallet/base_wallet.ts b/yarn-project/aztec.js/src/wallet/base_wallet.ts index 17b6ea22e03..04a8c80920c 100644 --- a/yarn-project/aztec.js/src/wallet/base_wallet.ts +++ b/yarn-project/aztec.js/src/wallet/base_wallet.ts @@ -1,4 +1,4 @@ -import { AztecAddress, Fr, GrumpkinPrivateKey, PartialAddress } from '@aztec/circuits.js'; +import { AztecAddress, CompleteAddress, Fr, GrumpkinPrivateKey, PartialAddress } from '@aztec/circuits.js'; import { AuthWitness, ContractData, @@ -20,8 +20,7 @@ import { TxReceipt, } from '@aztec/types'; -import { CompleteAddress } from '../index.js'; -import { Wallet } from './index.js'; +import { Wallet } from '../account/wallet.js'; /** * A base class for Wallet implementations diff --git a/yarn-project/aztec.js/src/wallet/create_recipient.ts b/yarn-project/aztec.js/src/wallet/create_recipient.ts new file mode 100644 index 00000000000..2d87185997b --- /dev/null +++ b/yarn-project/aztec.js/src/wallet/create_recipient.ts @@ -0,0 +1,13 @@ +import { CompleteAddress } from '@aztec/circuits.js'; +import { PXE } from '@aztec/types'; + +/** + * Creates a random address and registers it as a recipient on the pxe server. Useful for testing. + * @param pxe - PXE. + * @returns Complete address of the registered recipient. + */ +export async function createRecipient(pxe: PXE): Promise { + const completeAddress = CompleteAddress.random(); + await pxe.registerRecipient(completeAddress); + return completeAddress; +} diff --git a/yarn-project/aztec.js/src/wallet/index.ts b/yarn-project/aztec.js/src/wallet/index.ts index b0c01e656cd..a8121edaf60 100644 --- a/yarn-project/aztec.js/src/wallet/index.ts +++ b/yarn-project/aztec.js/src/wallet/index.ts @@ -1,12 +1,46 @@ -import { PXE } from '@aztec/types'; +import { AztecAddress } from '@aztec/foundation/aztec-address'; +import { GrumpkinPrivateKey, PXE } from '@aztec/types'; -import { AccountInterface } from '../account/index.js'; +import { AccountContract, SingleKeyAccountContract } from '../account_contract/index.js'; +import { AccountWallet } from './account_wallet.js'; -export * from './base_wallet.js'; export * from './account_wallet.js'; export * from './signerless_wallet.js'; +export * from './account_wallet_with_private_key.js'; +export * from '../account/wallet.js'; /** - * The wallet interface. + * Gets a wallet for an already registered account using Schnorr signatures with a single key for encryption and authentication. + * @param pxe - An PXE server instance. + * @param address - Address for the account. + * @param signingPrivateKey - Grumpkin key used for note encryption and signing transactions. + * @returns A wallet for this account that can be used to interact with a contract instance. */ -export type Wallet = AccountInterface & PXE; +export function getUnsafeSchnorrWallet( + pxe: PXE, + address: AztecAddress, + signingKey: GrumpkinPrivateKey, +): Promise { + return getWallet(pxe, address, new SingleKeyAccountContract(signingKey)); +} + +/** + * Gets a wallet for an already registered account. + * @param pxe - PXE Service instance. + * @param address - Address for the account. + * @param accountContract - Account contract implementation. + * @returns A wallet for this account that can be used to interact with a contract instance. + */ +export async function getWallet( + pxe: PXE, + address: AztecAddress, + accountContract: AccountContract, +): Promise { + const completeAddress = await pxe.getRegisteredAccount(address); + if (!completeAddress) { + throw new Error(`Account ${address} not found`); + } + const nodeInfo = await pxe.getNodeInfo(); + const entrypoint = accountContract.getInterface(completeAddress, nodeInfo); + return new AccountWallet(pxe, entrypoint); +} diff --git a/yarn-project/aztec.js/src/wallet/signerless_wallet.ts b/yarn-project/aztec.js/src/wallet/signerless_wallet.ts index e9d04584853..05619535628 100644 --- a/yarn-project/aztec.js/src/wallet/signerless_wallet.ts +++ b/yarn-project/aztec.js/src/wallet/signerless_wallet.ts @@ -1,7 +1,6 @@ -import { Fr, TxContext } from '@aztec/circuits.js'; +import { CompleteAddress, Fr, TxContext } from '@aztec/circuits.js'; import { AuthWitness, FunctionCall, PackedArguments, TxExecutionRequest } from '@aztec/types'; -import { CompleteAddress } from '../index.js'; import { BaseWallet } from './base_wallet.js'; /** diff --git a/yarn-project/end-to-end/src/e2e_token_contract.test.ts b/yarn-project/end-to-end/src/e2e_token_contract.test.ts index 5acdf39a0de..95af7828e27 100644 --- a/yarn-project/end-to-end/src/e2e_token_contract.test.ts +++ b/yarn-project/end-to-end/src/e2e_token_contract.test.ts @@ -172,7 +172,9 @@ describe('e2e_token_contract', () => { it('redeem as recipient', async () => { await addPendingShieldNoteToPXE(0, amount, secretHash, txHash); const txClaim = asset.methods.redeem_shield(accounts[0].address, amount, secret).send(); + // docs:start:debug const receiptClaim = await txClaim.wait({ debug: true }); + // docs:end:debug expect(receiptClaim.status).toBe(TxStatus.MINED); tokenSim.redeemShield(accounts[0].address, amount); // 1 note should be created containing `amount` of tokens diff --git a/yarn-project/end-to-end/src/sample-dapp/index.test.mjs b/yarn-project/end-to-end/src/sample-dapp/index.test.mjs index 11424c9465d..ad7282103da 100644 --- a/yarn-project/end-to-end/src/sample-dapp/index.test.mjs +++ b/yarn-project/end-to-end/src/sample-dapp/index.test.mjs @@ -1,12 +1,24 @@ import { createSandbox } from '@aztec/aztec-sandbox'; -import { Contract, ExtendedNote, Fr, Note, computeMessageSecretHash, createAccount } from '@aztec/aztec.js'; +import { + Contract, + ExtendedNote, + Fr, + Note, + computeMessageSecretHash, + createAccount, + createPXEClient, + waitForSandbox, +} from '@aztec/aztec.js'; import { TokenContractArtifact } from '@aztec/noir-contracts/artifacts'; +const { PXE_URL = 'http://localhost:8080', ETHEREUM_HOST = 'http://localhost:8545' } = process.env; + describe('token', () => { // docs:start:setup let pxe, stop, owner, recipient, token; beforeAll(async () => { - ({ pxe, stop } = await createSandbox()); + const pxe = createPXEClient(PXE_URL); + await waitForSandbox(pxe); owner = await createAccount(pxe); recipient = await createAccount(pxe); @@ -24,8 +36,6 @@ describe('token', () => { await token.methods.redeem_shield({ address: owner.getAddress() }, initialBalance, secret).send().wait(); }, 120_000); - - afterAll(() => stop()); // docs:end:setup // docs:start:test diff --git a/yarn-project/end-to-end/src/shared/browser.ts b/yarn-project/end-to-end/src/shared/browser.ts index 72b064bc903..0584ea9c222 100644 --- a/yarn-project/end-to-end/src/shared/browser.ts +++ b/yarn-project/end-to-end/src/shared/browser.ts @@ -194,14 +194,16 @@ export const browserTestSuite = (setup: () => Server, pageLogger: AztecJs.DebugL } const [owner] = await getSandboxAccountsWallets(pxe); const ownerAddress = owner.getAddress(); - const tx = new DeployMethod(accounts[0].publicKey, pxe, TokenContractArtifact, [ - owner.getCompleteAddress(), - ]).send(); - await tx.wait(); - const receipt = await tx.getReceipt(); - console.log(`Contract Deployed: ${receipt.contractAddress}`); - - const token = await Contract.at(receipt.contractAddress!, TokenContractArtifact, owner); + const tx = new DeployMethod( + accounts[0].publicKey, + pxe, + TokenContractArtifact, + a => Contract.at(a, TokenContractArtifact, owner), + [owner.getCompleteAddress()], + ).send(); + const { contract: token, txHash } = await tx.wait(); + + console.log(`Contract Deployed: ${token.address}`); const secret = Fr.random(); const secretHash = computeMessageSecretHash(secret); const mintPrivateReceipt = await token.methods.mint_private(initialBalance, secretHash).send().wait(); @@ -219,7 +221,7 @@ export const browserTestSuite = (setup: () => Server, pageLogger: AztecJs.DebugL await token.methods.redeem_shield(ownerAddress, initialBalance, secret).send().wait(); - return receipt.txHash.toString(); + return txHash.toString(); }, PXE_URL, privKey.toString(), diff --git a/yarn-project/noir-compiler/src/__snapshots__/index.test.ts.snap b/yarn-project/noir-compiler/src/__snapshots__/index.test.ts.snap index 5d3f916dc63..1a99b10fe69 100644 --- a/yarn-project/noir-compiler/src/__snapshots__/index.test.ts.snap +++ b/yarn-project/noir-compiler/src/__snapshots__/index.test.ts.snap @@ -47,17 +47,21 @@ exports[`noir-compiler using nargo generates Aztec.nr external interface 1`] = ` use dep::std; use dep::aztec::context::{ PrivateContext, PublicContext }; -use dep::protocol_types::constants::RETURN_VALUES_LENGTH; +use dep::protocol_types::{ + address::AztecAddress, + abis::function_selector::FunctionSelector, + constants::RETURN_VALUES_LENGTH, +}; // Interface for calling TestContract functions from a private context struct TestContractPrivateContextInterface { - address: Field, + address: AztecAddress, } impl TestContractPrivateContextInterface { - pub fn at(address: Field) -> Self { + pub fn at(address: AztecAddress) -> Self { Self { address, } @@ -69,7 +73,7 @@ impl TestContractPrivateContextInterface { ) { let mut serialized_args = [0; 0]; - context.call_public_function(self.address, 0x46be982e, serialized_args) + context.call_public_function(self.address, FunctionSelector::from_field(0x46be982e), serialized_args) } } @@ -79,11 +83,11 @@ impl TestContractPrivateContextInterface { // Interface for calling TestContract functions from a public context struct TestContractPublicContextInterface { - address: Field, + address: AztecAddress, } impl TestContractPublicContextInterface { - pub fn at(address: Field) -> Self { + pub fn at(address: AztecAddress) -> Self { Self { address, } @@ -95,7 +99,7 @@ impl TestContractPublicContextInterface { ) -> [Field; RETURN_VALUES_LENGTH] { let mut serialized_args = [0; 0]; - context.call_public_function(self.address, 0x46be982e, serialized_args) + context.call_public_function(self.address, FunctionSelector::from_field(0x46be982e), serialized_args) } } @@ -123,6 +127,7 @@ import { EthAddressLike, FieldLike, Fr, + FunctionSelectorLike, Point, PublicKey, Wallet, @@ -163,14 +168,14 @@ export class TestContractContract extends ContractBase { * Creates a tx to deploy a new instance of this contract. */ public static deploy(wallet: Wallet, pub_param: FieldLike) { - return new DeployMethod(Point.ZERO, wallet, TestContractContractArtifact, Array.from(arguments).slice(1)); + return new DeployMethod(Point.ZERO, wallet, TestContractContractArtifact, TestContractContract.at, Array.from(arguments).slice(1)); } /** * Creates a tx to deploy a new instance of this contract using the specified public key to derive the address. */ public static deployWithPublicKey(publicKey: PublicKey, wallet: Wallet, pub_param: FieldLike) { - return new DeployMethod(publicKey, wallet, TestContractContractArtifact, Array.from(arguments).slice(2)); + return new DeployMethod(publicKey, wallet, TestContractContractArtifact, TestContractContract.at, Array.from(arguments).slice(2)); } @@ -361,14 +366,14 @@ export class TestContractContract extends ContractBase { * Creates a tx to deploy a new instance of this contract. */ public static deploy(wallet: Wallet, pub_param: FieldLike) { - return new DeployMethod(Point.ZERO, wallet, TestContractContractArtifact, Array.from(arguments).slice(1)); + return new DeployMethod(Point.ZERO, wallet, TestContractContractArtifact, TestContractContract.at, Array.from(arguments).slice(1)); } /** * Creates a tx to deploy a new instance of this contract using the specified public key to derive the address. */ public static deployWithPublicKey(publicKey: PublicKey, wallet: Wallet, pub_param: FieldLike) { - return new DeployMethod(publicKey, wallet, TestContractContractArtifact, Array.from(arguments).slice(2)); + return new DeployMethod(publicKey, wallet, TestContractContractArtifact, TestContractContract.at, Array.from(arguments).slice(2)); } diff --git a/yarn-project/noir-compiler/src/compile/nargo.ts b/yarn-project/noir-compiler/src/compile/nargo.ts index f6a296144a4..f1367b0930d 100644 --- a/yarn-project/noir-compiler/src/compile/nargo.ts +++ b/yarn-project/noir-compiler/src/compile/nargo.ts @@ -3,7 +3,8 @@ import { LogFn, createDebugLogger } from '@aztec/foundation/log'; import { execSync } from 'child_process'; import { emptyDir } from 'fs-extra'; import { readFile, readdir, stat, unlink } from 'fs/promises'; -import path from 'path'; +import { dirname, join } from 'path'; +import { fileURLToPath } from 'url'; import { NoirCommit, NoirTag } from '../index.js'; import { NoirCompiledContract, NoirContractCompilationArtifacts, NoirDebugMetadata } from '../noir_artifact.js'; @@ -18,6 +19,19 @@ export type CompileOpts = { log?: LogFn; }; +/** + * + */ +function getCurrentDir() { + if (typeof __dirname !== 'undefined') { + return __dirname; + } else { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + return dirname(fileURLToPath(import.meta.url)); + } +} + /** * A class that compiles Aztec.nr contracts using nargo via the shell. */ @@ -33,7 +47,7 @@ export class NargoContractCompiler { */ public async compile(): Promise { const stdio = this.opts.quiet ? 'ignore' : 'inherit'; - const nargoBin = this.opts.nargoBin ?? 'nargo'; + const nargoBin = this.opts.nargoBin ?? getCurrentDir() + '/../../../../noir/target/release/nargo'; const version = execSync(`${nargoBin} --version`, { cwd: this.projectPath, stdio: 'pipe' }).toString(); this.checkNargoBinVersion(version.replace('\n', '')); await emptyDir(this.getTargetFolder()); @@ -56,7 +70,7 @@ export class NargoContractCompiler { const debugArtifacts = new Map(); for (const filename of await readdir(this.getTargetFolder())) { - const file = path.join(this.getTargetFolder(), filename); + const file = join(this.getTargetFolder(), filename); if ((await stat(file)).isFile() && file.endsWith('.json')) { if (filename.startsWith('debug_')) { debugArtifacts.set( @@ -81,6 +95,6 @@ export class NargoContractCompiler { } private getTargetFolder() { - return path.join(this.projectPath, 'target'); + return join(this.projectPath, 'target'); } } diff --git a/yarn-project/noir-compiler/src/contract-interface-gen/contractTypescript.ts b/yarn-project/noir-compiler/src/contract-interface-gen/contractTypescript.ts index 6afa902c1d5..e38ab52831a 100644 --- a/yarn-project/noir-compiler/src/contract-interface-gen/contractTypescript.ts +++ b/yarn-project/noir-compiler/src/contract-interface-gen/contractTypescript.ts @@ -71,21 +71,22 @@ function generateMethod(entry: FunctionArtifact) { function generateDeploy(input: ContractArtifact) { const ctor = input.functions.find(f => f.name === 'constructor'); const args = (ctor?.parameters ?? []).map(generateParameter).join(', '); - const artifactName = `${input.name}ContractArtifact`; + const contractName = `${input.name}Contract`; + const artifactName = `${contractName}Artifact`; return ` /** * Creates a tx to deploy a new instance of this contract. */ public static deploy(wallet: Wallet, ${args}) { - return new DeployMethod<${input.name}Contract>(Point.ZERO, wallet, ${artifactName}, Array.from(arguments).slice(1)); + return new DeployMethod<${input.name}Contract>(Point.ZERO, wallet, ${artifactName}, ${contractName}.at, Array.from(arguments).slice(1)); } /** * Creates a tx to deploy a new instance of this contract using the specified public key to derive the address. */ public static deployWithPublicKey(publicKey: PublicKey, wallet: Wallet, ${args}) { - return new DeployMethod<${input.name}Contract>(publicKey, wallet, ${artifactName}, Array.from(arguments).slice(2)); + return new DeployMethod<${input.name}Contract>(publicKey, wallet, ${artifactName}, ${contractName}.at, Array.from(arguments).slice(2)); } `; } diff --git a/yarn-project/noir-contracts/package.json b/yarn-project/noir-contracts/package.json index f4135a3dd64..445a0087198 100644 --- a/yarn-project/noir-contracts/package.json +++ b/yarn-project/noir-contracts/package.json @@ -13,7 +13,7 @@ "formatting": "run -T prettier --check ./src && run -T eslint ./src", "formatting:fix": "run -T eslint --fix ./src && run -T prettier -w ./src", "test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --passWithNoTests", - "noir:clean": "rm -rf ./src/artifacts ./src/types && mkdir -p ../aztec.js/src/artifacts/ && find ../aztec.js/src/artifacts/ -mindepth 1 -delete && rm -rf target/", + "noir:clean": "rm -rf ./src/artifacts ./src/types ../aztec.js/src/account_contract/artifacts ./target/ && mkdir -p ../aztec.js/src/account_contract/artifacts", "noir:build": "./src/scripts/compile.sh", "noir:build:all": "yarn noir:clean && ./scripts/compile_all.sh && ./scripts/types_all.sh", "noir:types:all": "./scripts/types_all.sh" diff --git a/yarn-project/noir-contracts/scripts/types.sh b/yarn-project/noir-contracts/scripts/types.sh index 3e2410e4004..16c85577397 100755 --- a/yarn-project/noir-contracts/scripts/types.sh +++ b/yarn-project/noir-contracts/scripts/types.sh @@ -49,7 +49,7 @@ process() { format() { echo "Formatting contract folders" - yarn run -T prettier -w ../aztec.js/src/artifacts/*.json ./$types_dir/*.ts + yarn run -T prettier -w ../aztec.js/src/account_contract/artifacts/*.json ./$types_dir/*.ts echo -e "Done\n" } diff --git a/yarn-project/noir-contracts/src/scripts/copy_output.ts b/yarn-project/noir-contracts/src/scripts/copy_output.ts index 94b80351ca7..f27f20b2f6f 100644 --- a/yarn-project/noir-contracts/src/scripts/copy_output.ts +++ b/yarn-project/noir-contracts/src/scripts/copy_output.ts @@ -14,9 +14,9 @@ import { format } from 'util'; const log = createConsoleLogger('aztec:noir-contracts'); const PROJECT_CONTRACTS = [ - { name: 'SchnorrSingleKeyAccount', target: '../aztec.js/src/artifacts/', exclude: [] }, - { name: 'SchnorrAccount', target: '../aztec.js/src/artifacts/', exclude: [] }, - { name: 'EcdsaAccount', target: '../aztec.js/src/artifacts/', exclude: [] }, + { name: 'SchnorrSingleKeyAccount', target: '../aztec.js/src/account_contract/artifacts/', exclude: [] }, + { name: 'SchnorrAccount', target: '../aztec.js/src/account_contract/artifacts/', exclude: [] }, + { name: 'EcdsaAccount', target: '../aztec.js/src/account_contract/artifacts/', exclude: [] }, ]; const INTERFACE_CONTRACTS = ['private_token', 'private_token_airdrop', 'test']; diff --git a/yarn-project/noir-protocol-circuits/src/Nargo.toml b/yarn-project/noir-protocol-circuits/src/Nargo.toml index 40096bdb01a..79a55c635e0 100644 --- a/yarn-project/noir-protocol-circuits/src/Nargo.toml +++ b/yarn-project/noir-protocol-circuits/src/Nargo.toml @@ -16,5 +16,6 @@ members = [ "crates/rollup-lib", "crates/rollup-merge", "crates/rollup-base", + "crates/rollup-base-simulated", "crates/rollup-root", ] diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-base-simulated/Nargo.toml b/yarn-project/noir-protocol-circuits/src/crates/rollup-base-simulated/Nargo.toml new file mode 100644 index 00000000000..cda6dfa73c5 --- /dev/null +++ b/yarn-project/noir-protocol-circuits/src/crates/rollup-base-simulated/Nargo.toml @@ -0,0 +1,9 @@ +[package] +name = "rollup_base_simulated" +type = "bin" +authors = [""] +compiler_version = ">=0.18.0" + +[dependencies] +rollup_lib = { path = "../rollup-lib" } +types = { path = "../types" } diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-base-simulated/src/main.nr b/yarn-project/noir-protocol-circuits/src/crates/rollup-base-simulated/src/main.nr new file mode 100644 index 00000000000..67faaa8ec99 --- /dev/null +++ b/yarn-project/noir-protocol-circuits/src/crates/rollup-base-simulated/src/main.nr @@ -0,0 +1,5 @@ +use dep::rollup_lib::base::{BaseRollupInputs,BaseOrMergeRollupPublicInputs}; + +unconstrained fn main(inputs: BaseRollupInputs) -> pub BaseOrMergeRollupPublicInputs { + inputs.base_rollup_circuit() +} diff --git a/yarn-project/noir-protocol-circuits/src/crates/rollup-base/src/main.nr b/yarn-project/noir-protocol-circuits/src/crates/rollup-base/src/main.nr index 7405a961633..a7b7b5cdd10 100644 --- a/yarn-project/noir-protocol-circuits/src/crates/rollup-base/src/main.nr +++ b/yarn-project/noir-protocol-circuits/src/crates/rollup-base/src/main.nr @@ -1,6 +1,5 @@ use dep::rollup_lib::base::{BaseRollupInputs,BaseOrMergeRollupPublicInputs}; -//TODO add a circuit variant -unconstrained fn main(inputs : BaseRollupInputs) -> pub BaseOrMergeRollupPublicInputs { +fn main(inputs: BaseRollupInputs) -> pub BaseOrMergeRollupPublicInputs { inputs.base_rollup_circuit() -} \ No newline at end of file +} diff --git a/yarn-project/noir-protocol-circuits/src/index.ts b/yarn-project/noir-protocol-circuits/src/index.ts index 97671183a7c..89954211e99 100644 --- a/yarn-project/noir-protocol-circuits/src/index.ts +++ b/yarn-project/noir-protocol-circuits/src/index.ts @@ -26,7 +26,7 @@ import PublicKernelPrivatePreviousJson from './target/public_kernel_private_prev import PublicKernelPrivatePreviousSimulatedJson from './target/public_kernel_private_previous_simulated.json' assert { type: 'json' }; import PublicKernelPublicPreviousJson from './target/public_kernel_public_previous.json' assert { type: 'json' }; import PublicKernelPublicPreviousSimulatedJson from './target/public_kernel_public_previous_simulated.json' assert { type: 'json' }; -import BaseRollupJson from './target/rollup_base.json' assert { type: 'json' }; +import BaseRollupSimulatedJson from './target/rollup_base_simulated.json' assert { type: 'json' }; import MergeRollupJson from './target/rollup_merge.json' assert { type: 'json' }; import RootRollupJson from './target/rollup_root.json' assert { type: 'json' }; import { @@ -416,12 +416,12 @@ async function executeMergeRollupWithACVM(input: MergeRollupInputType): Promise< * Executes the base rollup with the given inputs using the acvm. */ async function executeBaseRollupWithACVM(input: BaseRollupInputType): Promise { - const initialWitnessMap = abiEncode(BaseRollupJson.abi as Abi, input as any); + const initialWitnessMap = abiEncode(BaseRollupSimulatedJson.abi as Abi, input as any); // Execute the circuit on those initial witness values // // Decode the bytecode from base64 since the acvm does not know about base64 encoding - const decodedBytecode = Buffer.from(BaseRollupJson.bytecode, 'base64'); + const decodedBytecode = Buffer.from(BaseRollupSimulatedJson.bytecode, 'base64'); // // Execute the circuit const _witnessMap = await executeCircuitWithBlackBoxSolver( @@ -434,7 +434,7 @@ async function executeBaseRollupWithACVM(input: BaseRollupInputType): Promise { it('can serialize an L2 block with logs to a buffer and back', () => { diff --git a/yarn-project/types/src/l2_block_downloader/l2_block_downloader.ts b/yarn-project/types/src/l2_block_downloader/l2_block_downloader.ts index 228694ca719..e1e03d9a278 100644 --- a/yarn-project/types/src/l2_block_downloader/l2_block_downloader.ts +++ b/yarn-project/types/src/l2_block_downloader/l2_block_downloader.ts @@ -2,7 +2,9 @@ import { MemoryFifo, Semaphore, SerialQueue } from '@aztec/foundation/fifo'; import { createDebugLogger } from '@aztec/foundation/log'; import { InterruptibleSleep } from '@aztec/foundation/sleep'; -import { INITIAL_L2_BLOCK_NUM, L2Block, L2BlockSource } from '../index.js'; +import { INITIAL_L2_BLOCK_NUM } from '../constants.js'; +import { L2Block } from '../l2_block.js'; +import { L2BlockSource } from '../l2_block_source.js'; const log = createDebugLogger('aztec:l2_block_downloader'); diff --git a/yarn-project/types/src/logs/log_filter.ts b/yarn-project/types/src/logs/log_filter.ts index 34dca97343e..a1448527edd 100644 --- a/yarn-project/types/src/logs/log_filter.ts +++ b/yarn-project/types/src/logs/log_filter.ts @@ -1,6 +1,7 @@ import { AztecAddress, FunctionSelector } from '@aztec/circuits.js'; -import { LogId, TxHash } from '../index.js'; +import { TxHash } from '../tx/index.js'; +import { LogId } from './log_id.js'; /** * Log filter used to fetch L2 logs. diff --git a/yarn-project/types/src/mocks.ts b/yarn-project/types/src/mocks.ts index 24d958df490..44336d6caa3 100644 --- a/yarn-project/types/src/mocks.ts +++ b/yarn-project/types/src/mocks.ts @@ -14,7 +14,10 @@ import { Tuple } from '@aztec/foundation/serialize'; import times from 'lodash.times'; -import { DeployedContract, ExtendedContractData, ExtendedNote, FunctionL2Logs, Note, TxL2Logs } from './index.js'; +import { ExtendedContractData } from './contract_data.js'; +import { DeployedContract } from './interfaces/index.js'; +import { FunctionL2Logs, Note, TxL2Logs } from './logs/index.js'; +import { ExtendedNote } from './notes/index.js'; import { Tx, TxHash } from './tx/index.js'; /** diff --git a/yarn-project/types/src/notes/extended_note.ts b/yarn-project/types/src/notes/extended_note.ts index 1b39068802e..41395ea61f0 100644 --- a/yarn-project/types/src/notes/extended_note.ts +++ b/yarn-project/types/src/notes/extended_note.ts @@ -1,5 +1,8 @@ import { AztecAddress, Fr } from '@aztec/circuits.js'; -import { BufferReader, Note, TxHash } from '@aztec/types'; +import { BufferReader } from '@aztec/foundation/serialize'; + +import { Note } from '../logs/index.js'; +import { TxHash } from '../tx/index.js'; /** * A note with contextual data. diff --git a/yarn-project/types/src/tx/tx.ts b/yarn-project/types/src/tx/tx.ts index 381d0a7f782..0e21ec98bd0 100644 --- a/yarn-project/types/src/tx/tx.ts +++ b/yarn-project/types/src/tx/tx.ts @@ -10,8 +10,8 @@ import { arrayNonEmptyLength } from '@aztec/foundation/collection'; import { BufferReader, Tuple } from '@aztec/foundation/serialize'; import { ExtendedContractData } from '../contract_data.js'; -import { L2LogsSource } from '../index.js'; import { GetUnencryptedLogsResponse } from '../logs/get_unencrypted_logs_response.js'; +import { L2LogsSource } from '../logs/index.js'; import { TxL2Logs } from '../logs/tx_l2_logs.js'; import { TxStats } from '../stats/stats.js'; import { TxHash } from './tx_hash.js'; diff --git a/yarn-project/types/src/tx/tx_receipt.ts b/yarn-project/types/src/tx/tx_receipt.ts index dbd71233aea..46dc697f96f 100644 --- a/yarn-project/types/src/tx/tx_receipt.ts +++ b/yarn-project/types/src/tx/tx_receipt.ts @@ -1,6 +1,10 @@ import { AztecAddress } from '@aztec/foundation/aztec-address'; import { Fr } from '@aztec/foundation/fields'; -import { ContractData, ExtendedNote, PublicDataWrite, TxHash } from '@aztec/types'; + +import { ContractData } from '../contract_data.js'; +import { ExtendedNote } from '../notes/index.js'; +import { PublicDataWrite } from '../public_data_write.js'; +import { TxHash } from './tx_hash.js'; /** * Possible status of a transaction. diff --git a/yellow-paper/docs/public-vm/avm.md b/yellow-paper/docs/public-vm/avm.md index 0ac65539a7a..d79f5898cf9 100644 --- a/yellow-paper/docs/public-vm/avm.md +++ b/yellow-paper/docs/public-vm/avm.md @@ -156,6 +156,7 @@ INITIAL_MACHINE_STATE = MachineState { l2GasLeft: TxRequest.l2GasLimit, pc: 0, memory: uninitialized, + internalCallStack: empty, } INITIAL_MESSAGE_CALL_RESULTS = MessageCallResults { @@ -172,9 +173,11 @@ With an initialized context (and therefore an initial program counter of 0), the ### Program Counter and Control Flow The program counter (machine state's `pc`) determines which instruction to execute (`instr = environment.bytecode[pc]`). Each instruction's state transition function updates the program counter in some way, which allows the VM to progress to the next instruction at each step. -Most instructions simply increment the program counter by 1. This allows VM execution to flow naturally from instruction to instruction. Some instructions ([`JUMP`](./InstructionSet#isa-section-jump), [`JUMPI`](./InstructionSet#isa-section-jumpi), `INTERNALCALL`, `INTERNALRETURN`) modify the program counter based on inputs. +Most instructions simply increment the program counter by 1. This allows VM execution to flow naturally from instruction to instruction. Some instructions ([`JUMP`](./InstructionSet#isa-section-jump), [`JUMPI`](./InstructionSet#isa-section-jumpi), `INTERNALCALL`) modify the program counter based on inputs. -`JUMP`, `JUMPI`, and `INTERNALCALL` assign a new value to program counter from a constant present in the bytecode. These instructions never assign a value from memory to program counter. Before jumping, the `INTERNALCALL` instruction pushes the current program counter to an internal call-stack that is maintained in a reserved region of memory. `INTERNALRETURN` pops a destination from that internal call-stack and jumps there. Thus, jump destinations, can be either constants from the contract bytecode, or destinations popped from the internal call-stack. +The `INTERNALCALL` instruction jumps to the destination specified by its input (sets `pc` to that destination), but first it pushes the current `pc+1` to `machineState.internalCallStack`. The `INTERNALRETURN` instruction pops a destination from `machineState.internalCallStack` and jumps there. + +> Jump destinations can only be constants from the contract bytecode, or destinations popped from `machineState.internalCallStack`. A jump destination will never originate from main memory. ### Gas limits and tracking Each instruction has an associated `l1GasCost` and `l2GasCost`. Before an instruction is executed, the VM enforces that there is sufficient gas remaining via the following assertions: @@ -202,7 +205,7 @@ A instruction's gas cost is loosely derived from its complexity. Execution compl - [`JUMP`](./InstructionSet/#isa-section-jump) is an example of an instruction with constant gas cost. Regardless of its inputs, the instruction always incurs the same `l1GasCost` and `l2GasCost`. - The [`SET`](./InstructionSet/#isa-section-set) instruction operates on a different sized constant (based on its `dst-type`). Therefore, this instruction's gas cost increases with the size of its input. - Instructions that operate on a data range of a specified "size" scale in cost with that size. An example of this is the [`CALLDATACOPY`](./InstructionSet/#isa-section-calldatacopy) argument which copies `copySize` words from `environment.calldata` to memory. -- The [`CALL`](./InstructionSet/#isa-section-call)/[`STATICCALL`](./InstructionSet/#isa-section-call)/`DELEGATECALL` instruction's gas cost is determined by its `l*Gas` arguments, but any gas unused by the triggered message call is refunded after its completion (more on this later). +- The [`CALL`](./InstructionSet/#isa-section-call)/[`STATICCALL`](./InstructionSet/#isa-section-call)/`DELEGATECALL` instruction's gas cost is determined by its `l*Gas` arguments, but any gas unused by the triggered message call is refunded after its completion ([more on this later](#updating-the-calling-context-after-nested-call-halts)). - An instruction with "offset" arguments (like [`ADD`](./InstructionSet/#isa-section-add) and many others), has increased cost for each offset argument that is flagged as "indirect". > Implementation detail: an instruction's gas cost will roughly align with the number of rows it corresponds to in the SNARK execution trace including rows in the sub-operation table, memory table, chiplet tables, etc. @@ -222,6 +225,8 @@ results.output = machineState.memory[instr.args.retOffset:instr.args.retOffset+i ``` > Definitions: `retOffset` and `retSize` here are arguments to the [`RETURN`](./InstructionSet/#isa-section-return) and [`REVERT`](./InstructionSet/#isa-section-revert) instructions. If `retSize` is 0, the context will have no output. Otherwise, these arguments point to a region of memory to output. +> Note: `results.output` is only relevant when the caller is a message call itself. When a public execution request's initial message call halts normally, its `results.output` is ignored. + ### Exceptional halting An exceptional halt is not explicitly triggered by an instruction but instead occurs when one of the following halting conditions is met: 1. **Insufficient gas** @@ -242,7 +247,7 @@ An exceptional halt is not explicitly triggered by an instruction but instead oc 1. **World state modification attempt during a static call** ``` assert !environment.isStaticCall - or environment.bytecode[machineState.pc].opcode not in WS_MODIFYING_OPS + OR environment.bytecode[machineState.pc].opcode not in WS_MODIFYING_OPS ``` > Definition: `WS_MODIFYING_OPS` represents the list of all opcodes corresponding to instructions that modify world state. @@ -302,9 +307,42 @@ nestedMachineState = MachineState { l2GasLeft: callingContext.machineState.memory[instr.args.gasOffset+1], pc: 0, memory: uninitialized, + internalCallStack: empty, } ``` +> Note: the sub-context machine state's `l*GasLeft` is initialized based on the call instruction's `gasOffset` argument. The caller allocates some amount of L1 and L2 gas to the nested call. It does so using the instruction's `gasOffset` argument. In particular, prior to the message call instruction, the caller populates `M[gasOffset]` with the sub-context's initial `l1GasLeft`. Likewise it populates `M[gasOffset+1]` with `l2GasLeft`. + > Note: recall that `INITIAL_MESSAGE_CALL_RESULTS` is the same initial value used during [context initialization for a public execution request's initial message call](#context-initialization-for-initial-call). > `STATICCALL_OP` and `DELEGATECALL_OP` refer to the 8-bit opcode values for the `STATICCALL` and `DELEGATECALL` instructions respectively. -### Updating the calling context after nested call halts \ No newline at end of file +### Updating the calling context after nested call halts +When a message call's execution encounters an instruction that itself triggers a message call, the nested call executes until it reaches a halt. At that point, control returns to the caller, and the calling context is updated based on the sub-context and the message call instruction's transition function. The components of that transition function are defined below. + +The success or failure of the nested call is captured into memory at the offset specified by the call instruction's `successOffset` input: +``` +context.machineState.memory[instr.args.successOffset] = !subContext.results.reverted +``` + +Recall that a nested call is allocated some gas. In particular, the call instruction's `gasOffset` input points to an L1 and L2 gas allocation for the nested call. As shown in the [section above](#context-initialization-for-a-nested-call), a nested call's `subContext.machineState.l1GasLeft` is initialized to `context.machineState.memory[instr.args.gasOffset]`. Likewise, `l2GasLeft` is initialized from `gasOfffset+1`. + +As detailed in [the gas section above](#gas-cost-notes-and-examples), every instruction has an associated `instr.l1GasCost` and `instr.l2GasCost`. A nested call instruction's cost is the same as its initial `l*GasLeft` and `l2GasLeft`. Prior to the nested call's execution, this cost is subtracted from the calling context's remaining gas. + +When a nested call completes, any of its allocated gas that remains unused is refunded to the caller. +``` +context.l1GasLeft += subContext.machineState.l1GasLeft +context.l2GasLeft += subContext.machineState.l2GasLeft +``` + +If a nested call halts normally with a [`RETURN`](./InstructionSet/#isa-section-return) or [`REVERT`](./InstructionSet/#isa-section-revert), it may have some output data (`subContext.results.output`). The caller's `retOffset` and `retSize` arguments to the nested call instruction specify a region in memory to place output data when the nested call returns. +``` +if instr.args.retSize > 0: + context.memory[instr.args.retOffset:instr.args.retOffset+instr.args.retSize] = subContext.results.output +``` + +As long as a nested call has not reverted, its updates to the world state and accrued substate will be absorbed into the calling context. +``` +if !subContext.results.reverted AND instr.opcode != STATICCALL_OP: + context.worldState = subContext.worldState + context.accruedSubstate.append(subContext.accruedSubstate) +``` +> Reminder: a nested call cannot make updates to the world state or accrued substate if it is a [`STATICCALL`](./InstructionSet/#isa-section-staticcall). \ No newline at end of file