diff --git a/aztec-connect-cpp/barretenberg b/aztec-connect-cpp/barretenberg index 4bd6d084a..24146a07b 160000 --- a/aztec-connect-cpp/barretenberg +++ b/aztec-connect-cpp/barretenberg @@ -1 +1 @@ -Subproject commit 4bd6d084a082aa44e0502b1a21bcf854a1ae7f54 +Subproject commit 24146a07be7fdce10a27bc7a57dce8db555d4d9c diff --git a/aztec-connect-cpp/src/rollup/constants.hpp b/aztec-connect-cpp/src/rollup/constants.hpp index 1311e47b1..c6a6c8196 100644 --- a/aztec-connect-cpp/src/rollup/constants.hpp +++ b/aztec-connect-cpp/src/rollup/constants.hpp @@ -38,7 +38,7 @@ constexpr bool is_circuit_change_expected = 0; constraints. They need to be changed when there is a circuit change. */ constexpr uint32_t ACCOUNT = 23967; constexpr uint32_t JOIN_SPLIT = 64047; -constexpr uint32_t CLAIM = 22684; +constexpr uint32_t CLAIM = 23050; constexpr uint32_t ROLLUP = 1173221; constexpr uint32_t ROOT_ROLLUP = 5481327; constexpr uint32_t ROOT_VERIFIER = 7435892; @@ -61,12 +61,12 @@ namespace circuit_vk_hash { to comply with the from_buffer<>() method. */ constexpr auto ACCOUNT = uint256_t(0xcd6d70c733eaf823, 0x6505d3402817ad3d, 0xbf9e2b6a262589cf, 0xafcc546b55cc45e3); constexpr auto JOIN_SPLIT = uint256_t(0xb23c7772f47bc823, 0x5493625d4f08603c, 0x21ac50a5929576f9, 0xb7b3113c131460e5); -constexpr auto CLAIM = uint256_t(0x878301ebba40ab60, 0x931466762c62d661, 0x40aad71ec3496905, 0x9f47aaa109759d0a); -constexpr auto ROLLUP = uint256_t(0x8712bcbeb11180c5, 0x598412e4f700c484, 0xfe50ad453c8e4288, 0xa7340fac5feb663f); -constexpr auto ROOT_ROLLUP = uint256_t(0xcf2fee21f089b32f, 0x90c6187354cf70d4, 0x3a5a90b8c86d8c64, 0xd55af088ddc86db7); +constexpr auto CLAIM = uint256_t(0xa753ce523719749e, 0x80216aff7f8bc9ce, 0xa9b0f69bbd24ac33, 0xae17c5fb7d488138); +constexpr auto ROLLUP = uint256_t(0x5f2f6590e5553f19, 0x62c287e01b897621, 0xf32d03437085e2d, 0x567b0be24dc99966); +constexpr auto ROOT_ROLLUP = uint256_t(0x64e5e03cf9534ed6, 0x7fdc871935b9e4fe, 0xd2b81e990cc15f3d, 0x47f00f76d92e5e4d); ; constexpr auto ROOT_VERIFIER = - uint256_t(0xe91df73df393fb5f, 0x99a9fa13abfbb206, 0x2ffe8c891cbde8c2, 0xdcb051e8ca06df5e); + uint256_t(0xb4349747ae6ea507, 0xfaafa0f2e384c984, 0x9325870bcc594daf, 0x50163a2572c67363); }; // namespace circuit_vk_hash namespace ProofIds { diff --git a/aztec-connect-cpp/src/rollup/proofs/claim/claim.test.cpp b/aztec-connect-cpp/src/rollup/proofs/claim/claim.test.cpp index 3edb4075f..15854f75a 100644 --- a/aztec-connect-cpp/src/rollup/proofs/claim/claim.test.cpp +++ b/aztec-connect-cpp/src/rollup/proofs/claim/claim.test.cpp @@ -3,10 +3,19 @@ #include "index.hpp" #include "../inner_proof_data/inner_proof_data.hpp" #include "../notes/native/index.hpp" +#include "../notes/circuit/index.hpp" +#include "./claim_circuit.hpp" #include +#include +#include #include #include +#include +#include +#define ENABLE_MALICIOUS_RATIO_CHECK_FOR_TESTS +#include "./malicious_claim_circuit.hpp" +#undef ENABLE_MALICIOUS_RATIO_CHECK_FOR_TESTS namespace rollup { namespace proofs { namespace claim { @@ -1579,6 +1588,72 @@ TEST_F(claim_tests, test_real_virtual) EXPECT_EQ(tx.get_output_notes()[0], result.public_inputs[InnerProofFields::NOTE_COMMITMENT1]); EXPECT_EQ(tx.get_output_notes()[1], result.public_inputs[InnerProofFields::NOTE_COMMITMENT2]); } +/** + * @brief Check that malicious prover can't submit an erroneous claim + * + */ +TEST_F(claim_tests, test_claim_fails_if_prover_is_malicious) +{ + // Generate notes with malicious values + const claim_note note1 = { .deposit_value = 1, + .bridge_call_data = 0, + .defi_interaction_nonce = 0, + .fee = 0, + .value_note_partial_commitment = + create_partial_commitment(user.note_secret, user.owner.public_key, 0, 0), + .input_nullifier = fr::random_element(&engine) }; + + const defi_interaction::note note2 = { .bridge_call_data = 0, + .interaction_nonce = 0, + .total_input_value = 100, + .total_output_value_a = 100, + .total_output_value_b = 100, + .interaction_result = 1 }; + append_note(note1, data_tree); + append_note(note2, defi_tree); + claim_tx tx = create_claim_tx(note1, 0, 0, note2); + tx.output_value_a = 100; + tx.output_value_b = 100; + + // Create one regular composer + Composer composer = Composer(cd.proving_key, cd.verification_key, cd.num_gates); + // And one donor + Composer donor = Composer(cd.proving_key, cd.verification_key, cd.num_gates); + + // Construct the circuit with malicious witness in the donor + malicious_claim_circuit(donor, tx); + + // Construct the regular claim circuit in the regular composer + claim_circuit(composer, tx); + + // The witness in the regular will not satisfy the contriaints + info("Check circuit before transplant: ", composer.check_circuit()); + ASSERT_EQ(composer.variables.size(), donor.variables.size()); + // Copy the values of variables into the regular circuit + for (size_t i = 0; i < composer.variables.size(); i++) { + composer.variables[i] = donor.variables[i]; + } + // If the circuit is undercontrained, the will both pass now + info("Check donor circuit: ", donor.check_circuit()); + info("Check circuit after transplant: ", composer.check_circuit()); + Timer proof_timer; + info(": Creating proof..."); + verify_result result; + auto prover = composer.create_unrolled_prover(); + auto proof = prover.construct_proof(); + result.proof_data = proof.proof_data; + info(": Proof created in ", proof_timer.toString(), "s"); + auto verifier = composer.create_unrolled_verifier(); + result.verified = verifier.verify_proof({ result.proof_data }); + if (!result.verified) { + info(": Proof validation failed."); + } else { + info(": Verified successfully."); + } + result.verification_key = composer.circuit_verification_key; + EXPECT_FALSE(result.verified); +} + } // namespace claim } // namespace proofs } // namespace rollup \ No newline at end of file diff --git a/aztec-connect-cpp/src/rollup/proofs/claim/malicious_claim_circuit.hpp b/aztec-connect-cpp/src/rollup/proofs/claim/malicious_claim_circuit.hpp new file mode 100644 index 000000000..17c601017 --- /dev/null +++ b/aztec-connect-cpp/src/rollup/proofs/claim/malicious_claim_circuit.hpp @@ -0,0 +1,228 @@ +#pragma once +#include "claim_tx.hpp" +#include +#include "malicious_ratio_check.hpp" +#include "../notes/circuit/index.hpp" +#include + +#ifndef ENABLE_MALICIOUS_RATIO_CHECK_FOR_TESTS +static_assert(false, "THIS FILE CAN ONLY BE USED INT TESTS"); +#endif +namespace rollup { +namespace proofs { +namespace claim { + +using namespace plonk::stdlib::types::turbo; +using namespace plonk::stdlib::merkle_tree; +using namespace notes; +/** + * @brief This function creates the same circuit as the regular claim circuit, but feels it with malicious witness + * + * @param composer + * @param tx + */ +void malicious_claim_circuit(Composer& composer, claim_tx const& tx) +{ + // Create witnesses. + const auto proof_id = field_ct(witness_ct(&composer, ProofIds::DEFI_CLAIM)); + proof_id.assert_equal(ProofIds::DEFI_CLAIM); + const auto data_root = field_ct(witness_ct(&composer, tx.data_root)); + const auto defi_root = field_ct(witness_ct(&composer, tx.defi_root)); + const auto claim_note_index = + suint_ct(witness_ct(&composer, tx.claim_note_index), DATA_TREE_DEPTH, "claim_note_index"); + const auto claim_note_path = create_witness_hash_path(composer, tx.claim_note_path); + const auto defi_note_index = + suint_ct(witness_ct(&composer, tx.defi_note_index), DEFI_TREE_DEPTH, "defi_note_index"); + + /** + * Conversion to `claim_note_witness_data` contains: + * - range constraints on the claim note's attributes + * - expansion of bridge_call_data + * - expansion of the bridge_call_data's bit_config + * - sense checks on the bit_config's values + * (some bits can contradict each other) + */ + const auto claim_note_data = circuit::claim::claim_note_witness_data(composer, tx.claim_note); + + const auto claim_note = circuit::claim::claim_note(claim_note_data); + const auto defi_interaction_note_path = create_witness_hash_path(composer, tx.defi_interaction_note_path); + + /** + * Implicit conversion to `defi_interaction::witness_data` includes: + * - range constraints on the defi_interaction_note's attributes + * - expansion of bridge_call_data + * - expansion of the bridge_call_data's bit_config + * - sense checks on the bit_config's values + * (some bits can contradict each other) + */ + const auto defi_interaction_note = circuit::defi_interaction::note({ composer, tx.defi_interaction_note }); + const auto output_value_a = + suint_ct(witness_ct(&composer, tx.output_value_a), NOTE_VALUE_BIT_LENGTH, "output_value_a"); + const auto output_value_b = + suint_ct(witness_ct(&composer, tx.output_value_b), NOTE_VALUE_BIT_LENGTH, "output_value_b"); + + const bool_ct first_output_virtual = + circuit::get_asset_id_flag(claim_note_data.bridge_call_data_local.output_asset_id_a); + const bool_ct second_output_virtual = + circuit::get_asset_id_flag(claim_note_data.bridge_call_data_local.output_asset_id_b); + const bool_ct& second_input_in_use = claim_note_data.bridge_call_data_local.config.second_input_in_use; + const bool_ct& second_output_in_use = claim_note_data.bridge_call_data_local.config.second_output_in_use; + + { + // Don't support zero deposits (because they're illogical): + claim_note.deposit_value.value.assert_is_not_zero("Not supported: zero deposit"); + // Ensure deposit_value <= total_input_value + defi_interaction_note.total_input_value.subtract( + claim_note.deposit_value, NOTE_VALUE_BIT_LENGTH, "deposit_value > total_input_value"); + // These checks are superfluous, but included just in case: + // Ensure output_value_a <= total_output_value_a + defi_interaction_note.total_output_value_a.subtract( + output_value_a, NOTE_VALUE_BIT_LENGTH, "output_value_a > total_output_value_a"); + // Ensure output_value_b <= total_output_value_b + defi_interaction_note.total_output_value_b.subtract( + output_value_b, NOTE_VALUE_BIT_LENGTH, "output_value_b > total_output_value_b"); + } + + { + // Ratio checks. + // Note, these ratio_checks also guarantee: + // defi_interaction_note.total_input_value != 0 + // defi_interaction_note.total_output_value_a != 0 (unless output_value_a == 0) + // defi_interaction_note.total_output_value_b != 0 (unless output_value_b == 0) + + // Check that (deposit * total_output_value_a) == (output_value_a * total_input_value) + // Rearranging, this ensures output_value_a == (deposit / total_input_value) * total_output_value_a + const bool_ct rc1 = malicious_ratio_check(composer, + { .a1 = claim_note.deposit_value.value, + .a2 = defi_interaction_note.total_input_value.value, + .b1 = output_value_a.value, + .b2 = defi_interaction_note.total_output_value_a.value }); + const bool_ct valid1 = (output_value_a == 0 && defi_interaction_note.total_output_value_a == 0) || rc1; + valid1.assert_equal(true, "ratio check 1 failed"); + + // Check that (deposit * total_output_value_b) == (output_value_b * total_input_value) + // Rearranging, this ensures output_value_b == (deposit / total_input_value) * total_output_value_b + const bool_ct rc2 = malicious_ratio_check(composer, + { .a1 = claim_note.deposit_value.value, + .a2 = defi_interaction_note.total_input_value.value, + .b1 = output_value_b.value, + .b2 = defi_interaction_note.total_output_value_b.value }); + const bool_ct valid2 = (output_value_b == 0 && defi_interaction_note.total_output_value_b == 0) || rc2; + valid2.assert_equal(true, "ratio check 2 failed"); + } + + // This nullifier1 is unique because the claim_note.commitment is unique (which itself is unique because it contains + // a unique input_nullifier (from the defi-deposit tx which created it)). + const auto nullifier1 = circuit::claim::compute_nullifier(claim_note.commitment); + + // We 'nullify' this (claim note, defi interaction note) combination. Each owner of a claim note can produce a valid + // nullifier. + const auto nullifier2 = + circuit::defi_interaction::compute_nullifier(defi_interaction_note.commitment, claim_note.commitment); + + field_ct output_note_commitment1; + field_ct output_note_commitment2; + { + // Compute output notes. + const auto virtual_note_flag = suint_ct(uint256_t(1) << (MAX_NUM_ASSETS_BIT_LENGTH - 1)); + + // If the defi interaction was unsuccessful, refund the original defi_deposit_value (which was denominated in + // bridge input_asset_id_a) via output note 1. + const bool_ct& interaction_success = defi_interaction_note.interaction_result; + const auto output_value_1 = + suint_ct::conditional_assign(interaction_success, output_value_a, claim_note_data.deposit_value); + const auto output_asset_id_1_if_success = + suint_ct::conditional_assign(first_output_virtual, + virtual_note_flag + claim_note.defi_interaction_nonce, + claim_note_data.bridge_call_data_local.output_asset_id_a); + const auto output_asset_id_1 = suint_ct::conditional_assign( + interaction_success, output_asset_id_1_if_success, claim_note_data.bridge_call_data_local.input_asset_id_a); + output_note_commitment1 = circuit::value::complete_partial_commitment( + claim_note.value_note_partial_commitment, output_value_1, output_asset_id_1, nullifier1); + + // If the defi interaction was unsuccessful, refund the original defi_deposit_value (which was denominated in + // bridge input_asset_id_b) via output note 2, and only if there was a second input asset to the bridge. + const auto output_value_2 = + suint_ct::conditional_assign(interaction_success, output_value_b, claim_note_data.deposit_value); + const auto output_asset_id_2_if_success = + suint_ct::conditional_assign(second_output_virtual, + virtual_note_flag + claim_note.defi_interaction_nonce, + claim_note_data.bridge_call_data_local.output_asset_id_b); + const auto output_asset_id_2 = suint_ct::conditional_assign( + interaction_success, output_asset_id_2_if_success, claim_note_data.bridge_call_data_local.input_asset_id_b); + output_note_commitment2 = circuit::value::complete_partial_commitment( + claim_note.value_note_partial_commitment, output_value_2, output_asset_id_2, nullifier2); + + // We zero the output_note_commitment2 in two cases: + // - if the bridge interaction succeeded and returned a second output asset; or + // - if the bridge interaction failed and no second asset was ever sent to the bridge. + const bool_ct is_bridge_output_b_in_use = interaction_success && second_output_in_use; + const bool_ct was_bridge_input_b_in_use = !interaction_success && second_input_in_use; + + const bool_ct output_note_2_exists = is_bridge_output_b_in_use || was_bridge_input_b_in_use; + + output_note_commitment2 = output_note_commitment2 * output_note_2_exists; + } + + { + // Check claim note and interaction note are related. + claim_note.bridge_call_data.assert_equal(defi_interaction_note.bridge_call_data, + "note bridge call datas don't match"); + claim_note.defi_interaction_nonce.assert_equal(defi_interaction_note.interaction_nonce, + "note nonces don't match"); + } + + { + // Existence checks + + // Check claim note exists: + const bool_ct claim_exists = check_membership(data_root, + claim_note_path, + claim_note.commitment, + claim_note_index.value.decompose_into_bits(DATA_TREE_DEPTH)); + claim_exists.assert_equal(true, "claim note not a member"); + + // Check defi interaction note exists: + const bool_ct din_exists = check_membership(defi_root, + defi_interaction_note_path, + defi_interaction_note.commitment, + defi_note_index.value.decompose_into_bits(DEFI_TREE_DEPTH)); + din_exists.assert_equal(true, "defi interaction note not a member"); + } + + // Force unused public inputs to 0. + const field_ct public_value = witness_ct(&composer, 0); + const field_ct public_owner = witness_ct(&composer, 0); + const field_ct asset_id = witness_ct(&composer, 0); + const field_ct defi_deposit_value = witness_ct(&composer, 0); + const field_ct backward_link = witness_ct(&composer, 0); + const field_ct allow_chain = witness_ct(&composer, 0); + public_value.assert_is_zero(); + public_owner.assert_is_zero(); + asset_id.assert_is_zero(); + defi_deposit_value.assert_is_zero(); + backward_link.assert_is_zero(); + allow_chain.assert_is_zero(); + + // The following make up the public inputs to the circuit. + proof_id.set_public(); + output_note_commitment1.set_public(); + output_note_commitment2.set_public(); + nullifier1.set_public(); + nullifier2.set_public(); + public_value.set_public(); // 0 + public_owner.set_public(); // 0 + asset_id.set_public(); // 0 + data_root.set_public(); + claim_note.fee.set_public(); + claim_note_data.bridge_call_data_local.input_asset_id_a.set_public(); + claim_note.bridge_call_data.set_public(); + defi_deposit_value.set_public(); // 0 + defi_root.set_public(); + backward_link.set_public(); // 0 + allow_chain.set_public(); // 0 +} + +} // namespace claim +} // namespace proofs +} // namespace rollup diff --git a/aztec-connect-cpp/src/rollup/proofs/claim/malicious_ratio_check.hpp b/aztec-connect-cpp/src/rollup/proofs/claim/malicious_ratio_check.hpp new file mode 100644 index 000000000..3b34eee5a --- /dev/null +++ b/aztec-connect-cpp/src/rollup/proofs/claim/malicious_ratio_check.hpp @@ -0,0 +1,196 @@ +#pragma once +#include "claim_tx.hpp" +#include "ratio_check.hpp" +#include + +namespace rollup { +namespace proofs { +namespace claim { + +#ifndef ENABLE_MALICIOUS_RATIO_CHECK_FOR_TESTS +static_assert(false, "THIS FILE CAN ONLY BE USED INT TESTS"); +#endif + +using namespace plonk::stdlib::types::turbo; + +// This function creates the same constraints as product check, but creates a malicious witness +// Validate that a1 * b1 == a2 * b2 , when (a1, b1, a2, b2) are treated as Integers +inline bool_ct malicious_product_check(Composer& composer, + const field_ct& a1, + const field_ct& b1, + const field_ct& a2, + const field_ct& b2, + const field_ct& residual = 0) +{ + constexpr barretenberg::fr shift_1 = barretenberg::fr(uint256_t(1) << 68); + constexpr barretenberg::fr shift_2 = barretenberg::fr(uint256_t(1) << (68 * 2)); + constexpr barretenberg::fr shift_3 = barretenberg::fr(uint256_t(1) << (68 * 3)); + info("Going into malicious codepath"); + // CODE MODIFIED FOR PoC + // Split a field_t element into 4 68-bit limbs + // we modify the witness generation so that we can add n*FIELD_MODULUS to the + // limbs (which doesn't affect the decomposition constraints) + const auto split_into_limbs = [&composer, &shift_1, &shift_2, &shift_3]( + const field_ct& input, const size_t MAX_INPUT_BITS, const barretenberg::fr n) { + const uint256_t value_ = input.get_value(); + const uint256_t p = (const uint256_t)barretenberg::fr(-1) + 1; + + const uint256_t value = value_ + p * n; + + constexpr size_t NUM_BITS_PER_LIMB = 68; + const uint256_t t0 = value.slice(0, NUM_BITS_PER_LIMB); + const uint256_t t1 = value.slice(NUM_BITS_PER_LIMB, 2 * NUM_BITS_PER_LIMB); + const uint256_t t2 = value.slice(2 * NUM_BITS_PER_LIMB, 3 * NUM_BITS_PER_LIMB); + const uint256_t t3 = value.slice(3 * NUM_BITS_PER_LIMB, 4 * NUM_BITS_PER_LIMB); + + std::array limbs{ + witness_ct(&composer, t0), + witness_ct(&composer, t1), + witness_ct(&composer, t2), + witness_ct(&composer, t3), + }; + + field_ct limb_sum_1 = limbs[0].add_two(limbs[1] * shift_1, limbs[2] * shift_2); + field_ct limb_sum_2 = input - (limbs[3] * shift_3); + // std::cout << "limb decomposition " << limb_sum_1 << " ; " << limb_sum_2 << std::endl; + limb_sum_1.assert_equal(limb_sum_2); + + // Since the modulus is a power of two minus one, wwe can simply range constrain each of the limbs + size_t bits_left = MAX_INPUT_BITS; + for (size_t i = 0; i < 4; i++) { + // If we've run out of bits, enforce zero + if (bits_left == 0) { + limbs[i].assert_is_zero(); + // If there are not enough bits for a full lmb, reduce constraint + } else if (bits_left < NUM_BITS_PER_LIMB) { + limbs[i].create_range_constraint(bits_left); + bits_left = 0; + } else { + // Just a regular limb + limbs[i].create_range_constraint(NUM_BITS_PER_LIMB); + bits_left -= NUM_BITS_PER_LIMB; + } + } + + return limbs; + }; + + // CODE MODIFIED FOR PoC + // change limb splitting witness generation so that the left side + // of the equation is increased by the modulus P. + // (the right side is already increased by P as we use a negative residual) + + const auto left_1 = split_into_limbs(a1, notes::DEFI_DEPOSIT_VALUE_BIT_LENGTH, 0); + const auto left_2 = split_into_limbs(a2, notes::NOTE_VALUE_BIT_LENGTH, 0); + const auto right_1 = split_into_limbs(b1, notes::NOTE_VALUE_BIT_LENGTH, 1); + const auto right_2 = split_into_limbs(b2, notes::NOTE_VALUE_BIT_LENGTH, 0); + const auto residual_limbs = split_into_limbs(residual, notes::NOTE_VALUE_BIT_LENGTH, 0); + + // Rest of the code isn't modified. + + // takes a [204-208]-bit limb and splits it into a low 136-bit limb and a high 72-bit limb + const auto split_out_carry_term = [&composer, &shift_2](const field_ct& limb) { + const uint256_t limb_val = limb.get_value(); + + const uint256_t lo_val = limb_val.slice(0, 68 * 2); + const uint256_t hi_val = limb_val.slice(68 * 2, 256); + + const field_ct lo(witness_ct(&composer, lo_val)); + const field_ct hi(witness_ct(&composer, hi_val)); + + lo.create_range_constraint(68 * 2); + hi.create_range_constraint(72); // allow for 4 overflow bits + + limb.assert_equal(lo + (hi * shift_2)); + + return std::array{ lo, hi }; + }; + + // Use schoolbook multiplication algorithm to multiply 2 4-limbed values together, then convert result into 4 + // 2-limb values (with limbs twice the size) that do not overlap + const auto compute_product_limbs = [&split_out_carry_term, &shift_1](const std::array& left, + const std::array& right, + const std::array& to_add, + const bool use_residual = false) { + // a = left[0] * right[0]; + const field_ct b = left[0].madd(right[1], left[1] * right[0]); + const field_ct c = left[0].madd(right[2], left[1].madd(right[1], left[2] * right[0])); + const field_ct d = left[0].madd(right[3], left[1].madd(right[2], left[2].madd(right[1], left[3] * right[0]))); + const field_ct e = left[1].madd(right[3], left[2].madd(right[2], left[3] * right[1])); + const field_ct f = left[2].madd(right[3], left[3] * right[2]); + // g = left[3] * right[3]; + + if (use_residual) { + const auto t0 = + split_out_carry_term(to_add[0] + left[0].madd(right[0], (b * shift_1) + to_add[1] * shift_1)); + const auto r0 = t0[0]; + const auto t1 = split_out_carry_term(t0[1].add_two(c + to_add[2], to_add[3] * shift_1 + d * shift_1)); + const auto r1 = t1[0]; + const auto t2 = split_out_carry_term(t1[1].add_two(e, f * shift_1)); + const auto r2 = t2[0]; + const auto r3 = left[3].madd(right[3], t2[1]); + return std::array{ r0, r1, r2, r3 }; + } + const auto t0 = split_out_carry_term(left[0].madd(right[0], (b * shift_1))); + const auto r0 = t0[0]; + const auto t1 = split_out_carry_term(t0[1].add_two(c, d * shift_1)); + const auto r1 = t1[0]; + const auto t2 = split_out_carry_term(t1[1].add_two(e, f * shift_1)); + const auto r2 = t2[0]; + const auto r3 = left[3].madd(right[3], t2[1]); + return std::array{ r0, r1, r2, r3 }; + }; + + const auto lhs = compute_product_limbs(left_1, right_1, { 0, 0, 0, 0 }, false); + const auto rhs = compute_product_limbs(left_2, right_2, residual_limbs, true); + + bool_ct balanced(&composer, true); + for (size_t i = 0; i < 4; ++i) { + // std::cout << "i" << i << ": " << lhs[i] << " ; " << rhs[i] << std::endl; + balanced = balanced && lhs[i] == rhs[i]; + } + + return balanced; +} + +/** + * This function creates teh same constraints as regular ratio check, but constructs a malicious witness + * Will return true if the ratios are the same, false if not or if either denominator is 0. + * Effectively: a1 / a2 == b1 / b2 + */ +inline bool_ct malicious_ratio_check(Composer& composer, const ratios& ratios) +{ + const field_ct residual = witness_ct(&composer, barretenberg::fr(100 - 100 * 100)); + // we have the following implicit definitions for `ratios.a1/a2/b1/b2`: + // a1 = deposit_value + // a2 = total_input_value + // b1 = output_value + // b2 = total_output_value + // + // we want the following expression over the integers: + // output_value = (deposit_value * total_output_value) / total_input_value + // + // we do this via checking: + // a1 * b2 == b1 * a2 + residual + // + // where `residual` is a remainder term in case `deposit_value * total_output_value` is not divisible by + // `total_input_value` this requires us to validate that `residual < total_input_value` + + ratios.a1.create_range_constraint(notes::DEFI_DEPOSIT_VALUE_BIT_LENGTH, "ratio_check range constraint failure: a1"); + ratios.a2.create_range_constraint(notes::NOTE_VALUE_BIT_LENGTH, "ratio_check range constraint failure: a2"); + ratios.b1.create_range_constraint(notes::NOTE_VALUE_BIT_LENGTH, "ratio_check range constraint failure: b1"); + ratios.b2.create_range_constraint(notes::NOTE_VALUE_BIT_LENGTH, "ratio_check range constraint failure: b2"); + residual.create_range_constraint(notes::NOTE_VALUE_BIT_LENGTH, "ratio_check range constraint failure: residual"); + // We need to assert that residual < a2 + // i.e. a2 - residual > 0 => a2 - residual - 1 >= 0 + (ratios.a2 - residual - 1) + .normalize() + .create_range_constraint(notes::NOTE_VALUE_BIT_LENGTH, "ratio_check range constraint failure: residual >= a2"); + + return (ratios.a2 != 0) && (ratios.b2 != 0) && + malicious_product_check(composer, ratios.a1, ratios.b2, ratios.b1, ratios.a2, residual); +} + +} // namespace claim +} // namespace proofs +} // namespace rollup \ No newline at end of file diff --git a/aztec-connect-cpp/src/rollup/proofs/claim/ratio_check.hpp b/aztec-connect-cpp/src/rollup/proofs/claim/ratio_check.hpp index f90b0fba2..609b1edf2 100644 --- a/aztec-connect-cpp/src/rollup/proofs/claim/ratio_check.hpp +++ b/aztec-connect-cpp/src/rollup/proofs/claim/ratio_check.hpp @@ -1,6 +1,7 @@ #pragma once #include "claim_tx.hpp" #include +#include "../notes/constants.hpp" namespace rollup { namespace proofs { @@ -46,13 +47,19 @@ inline bool_ct product_check(Composer& composer, constexpr barretenberg::fr shift_3 = barretenberg::fr(uint256_t(1) << (68 * 3)); // Split a field_t element into 4 68-bit limbs - const auto split_into_limbs = [&composer, &shift_1, &shift_2, &shift_3](const field_ct& input) { + const auto split_into_limbs = [&composer, &shift_1, &shift_2, &shift_3](const field_ct& input, + const size_t MAX_INPUT_BITS) { const uint256_t value = input.get_value(); - const uint256_t t0 = value.slice(0, 68); - const uint256_t t1 = value.slice(68, 136); - const uint256_t t2 = value.slice(136, 204); - const uint256_t t3 = value.slice(204, 272); + constexpr size_t NUM_BITS_PER_LIMB = 68; + + ASSERT(MAX_INPUT_BITS <= MAX_NO_WRAP_INTEGER_BIT_LENGTH); + ASSERT(MAX_INPUT_BITS > 0); + + const uint256_t t0 = value.slice(0, NUM_BITS_PER_LIMB); + const uint256_t t1 = value.slice(NUM_BITS_PER_LIMB, 2 * NUM_BITS_PER_LIMB); + const uint256_t t2 = value.slice(2 * NUM_BITS_PER_LIMB, 3 * NUM_BITS_PER_LIMB); + const uint256_t t3 = value.slice(3 * NUM_BITS_PER_LIMB, 4 * NUM_BITS_PER_LIMB); std::array limbs{ witness_ct(&composer, t0), @@ -65,19 +72,37 @@ inline bool_ct product_check(Composer& composer, field_ct limb_sum_2 = input - (limbs[3] * shift_3); limb_sum_1.assert_equal(limb_sum_2); - limbs[0].create_range_constraint(68); - limbs[1].create_range_constraint(68); - limbs[2].create_range_constraint(68); - limbs[3].create_range_constraint(68); + // Since the modulus is a power of two minus one, wwe can simply range constrain each of the limbs + size_t bits_left = MAX_INPUT_BITS; + for (size_t i = 0; i < 4; i++) { + // If we've run out of bits, enforce zero + if (bits_left == 0) { + limbs[i].assert_is_zero(); + // If there are not enough bits for a full lmb, reduce constraint + } else if (bits_left < NUM_BITS_PER_LIMB) { + limbs[i].create_range_constraint(bits_left); + bits_left = 0; + } else { + // Just a regular limb + limbs[i].create_range_constraint(NUM_BITS_PER_LIMB); + bits_left -= NUM_BITS_PER_LIMB; + } + } return limbs; }; - const auto left_1 = split_into_limbs(a1); - const auto left_2 = split_into_limbs(a2); - const auto right_1 = split_into_limbs(b1); - const auto right_2 = split_into_limbs(b2); - const auto residual_limbs = split_into_limbs(residual); + // b1 = a1 * b2 mod a2 + // => a1 * b2 = b1 * a2 + r \in Z (equation 1) + + // split a1, a2, b1, b2, r into 68-bit limbs + // evaluate equation 1 via limb arithmetic. The limb arithmetic *cannot overflow* + + const auto left_1 = split_into_limbs(a1, notes::DEFI_DEPOSIT_VALUE_BIT_LENGTH); + const auto left_2 = split_into_limbs(a2, notes::NOTE_VALUE_BIT_LENGTH); + const auto right_1 = split_into_limbs(b1, notes::NOTE_VALUE_BIT_LENGTH); + const auto right_2 = split_into_limbs(b2, notes::NOTE_VALUE_BIT_LENGTH); + const auto residual_limbs = split_into_limbs(residual, notes::NOTE_VALUE_BIT_LENGTH); // takes a [204-208]-bit limb and splits it into a low 136-bit limb and a high 72-bit limb const auto split_out_carry_term = [&composer, &shift_2](const field_ct& limb) { @@ -122,6 +147,7 @@ inline bool_ct product_check(Composer& composer, const auto r3 = left[3].madd(right[3], t2[1]); return std::array{ r0, r1, r2, r3 }; } + const auto t0 = split_out_carry_term(left[0].madd(right[0], (b * shift_1))); const auto r0 = t0[0]; const auto t1 = split_out_carry_term(t0[1].add_two(c, d * shift_1)); @@ -151,10 +177,36 @@ inline bool_ct ratio_check(Composer& composer, ratios const& ratios) { const field_ct residual = ratios.get_residual(composer); + // we have the following implicit definitions for `ratios.a1/a2/b1/b2`: + // a1 = deposit_value + // a2 = total_input_value + // b1 = output_value + // b2 = total_output_value + // + // we want the following expression over the integers: + // output_value = (deposit_value * total_output_value) / total_input_value + // + // we do this via checking: + // a1 * b2 == b1 * a2 + residual + // + // where `residual` is a remainder term in case `deposit_value * total_output_value` is not divisible by + // `total_input_value` this requires us to validate that `residual < total_input_value` + + ratios.a1.create_range_constraint(notes::DEFI_DEPOSIT_VALUE_BIT_LENGTH, "ratio_check range constraint failure: a1"); + ratios.a2.create_range_constraint(notes::NOTE_VALUE_BIT_LENGTH, "ratio_check range constraint failure: a2"); + ratios.b1.create_range_constraint(notes::NOTE_VALUE_BIT_LENGTH, "ratio_check range constraint failure: b1"); + ratios.b2.create_range_constraint(notes::NOTE_VALUE_BIT_LENGTH, "ratio_check range constraint failure: b2"); + residual.create_range_constraint(notes::NOTE_VALUE_BIT_LENGTH, "ratio_check range constraint failure: residual"); + // We need to assert that residual < a2 + // i.e. a2 - residual > 0 => a2 - residual - 1 >= 0 + (ratios.a2 - residual - 1) + .normalize() + .create_range_constraint(notes::NOTE_VALUE_BIT_LENGTH, "ratio_check range constraint failure: residual >= a2"); + return (ratios.a2 != 0) && (ratios.b2 != 0) && product_check(composer, ratios.a1, ratios.b2, ratios.b1, ratios.a2, residual); } } // namespace claim } // namespace proofs -} // namespace rollup +} // namespace rollup \ No newline at end of file diff --git a/aztec-connect-cpp/src/rollup/proofs/claim/ratio_check.test.cpp b/aztec-connect-cpp/src/rollup/proofs/claim/ratio_check.test.cpp index 8e659b253..dd8903b1f 100644 --- a/aztec-connect-cpp/src/rollup/proofs/claim/ratio_check.test.cpp +++ b/aztec-connect-cpp/src/rollup/proofs/claim/ratio_check.test.cpp @@ -10,13 +10,24 @@ namespace { auto& engine = numeric::random::get_debug_engine(); } // namespace +uint256_t get_random_note(bool is_defi_claim_note = false) +{ + uint256_t note_mask = (uint256_t(1) << rollup::proofs::notes::NOTE_VALUE_BIT_LENGTH) - 1; + uint256_t claim_note_mask = (uint256_t(1) << rollup::proofs::notes::DEFI_DEPOSIT_VALUE_BIT_LENGTH) - 1; + + if (is_defi_claim_note) { + return engine.get_random_uint256() & claim_note_mask; + } else { + return engine.get_random_uint256() & note_mask; + } +} // Testing a1 * b1 == a2 * b2 passes for valid ratios. TEST(ratio_check, product_check) { - uint256_t a1 = engine.get_random_uint256(); + uint256_t a1 = get_random_note(true); a1.data[3] = a1.data[3] & 0x0fffffffffffffffULL; // 60-bits - uint256_t b1 = engine.get_random_uint256(); + uint256_t b1 = get_random_note(); // engine.get_random_uint256(); b1.data[3] = b1.data[3] & 0x0fffffffffffffffULL; // 60-bits b1.data[0] = b1.data[0] & 0xfffffffffffffffeULL; // 64-bits (lsb zero) @@ -72,13 +83,14 @@ TEST(ratio_check, product_check_with_zeros) TEST(ratio_check, ratio_check) { - uint256_t a = engine.get_random_uint256(); + uint256_t a = get_random_note(true); a.data[3] = a.data[3] & 0x0fffffffffffffffULL; // 60-bits - uint256_t b = engine.get_random_uint256(); + uint256_t b = get_random_note(); // engine.get_random_uint256(); b.data[3] = b.data[3] & 0x0fffffffffffffffULL; // 60-bits - uint256_t c; + uint256_t c = 0; while (c == 0) { - c = engine.get_random_uint256(); // it'll 'never' happen, but just in case it's 0, try again. + c = get_random_note(); // engine.get_random_uint256(); // it'll 'never' happen, but just in case it's 0, try + // again. } c.data[3] = c.data[3] & 0x0fffffffffffffffULL; // 60-bits @@ -154,12 +166,12 @@ TEST(ratio_check, zero_denominator_a2_returns_false) ratios ratios{ a1, a2, b1, b2 }; auto result = ratio_check(composer, ratios); result.assert_equal(false); - waffle::TurboProver prover = composer.create_prover(); waffle::TurboVerifier verifier = composer.create_verifier(); waffle::plonk_proof proof = prover.construct_proof(); bool proof_result = verifier.verify_proof(proof); - EXPECT_EQ(proof_result, true); + // Zero denominator now completely breaks the proof. It is not allowed + EXPECT_EQ(proof_result, false); } TEST(ratio_check, zero_denominator_b2_returns_false) @@ -209,7 +221,9 @@ TEST(ratio_check, zero_denominator_both_returns_false) waffle::TurboVerifier verifier = composer.create_verifier(); waffle::plonk_proof proof = prover.construct_proof(); bool proof_result = verifier.verify_proof(proof); - EXPECT_EQ(proof_result, true); + + // Zero denominator now completely breaks the proof. It is not allowed + EXPECT_EQ(proof_result, false); } TEST(ratio_check, field_modulus_overflow_fails) @@ -237,7 +251,8 @@ TEST(ratio_check, field_modulus_overflow_fails) waffle::TurboVerifier verifier = composer.create_verifier(); waffle::plonk_proof proof = prover.construct_proof(); bool proof_result = verifier.verify_proof(proof); - EXPECT_EQ(proof_result, true); + // if ratio check == false because the inputs are too large, we expect the proof to fail + EXPECT_EQ(proof_result, false); } TEST(ratio_check, field_modulus_overflow_with_biggest_numbers_possible_fails) @@ -267,5 +282,6 @@ TEST(ratio_check, field_modulus_overflow_with_biggest_numbers_possible_fails) waffle::TurboVerifier verifier = composer.create_verifier(); waffle::plonk_proof proof = prover.construct_proof(); bool proof_result = verifier.verify_proof(proof); - EXPECT_EQ(proof_result, true); + // if ratio check == false because of a field modulus overflow, we expect the proof to fail + EXPECT_EQ(proof_result, false); } \ No newline at end of file diff --git a/build-system b/build-system index 7ef44034b..c121e6206 160000 --- a/build-system +++ b/build-system @@ -1 +1 @@ -Subproject commit 7ef44034b2f8357d1b83afbaab0db0191574b71a +Subproject commit c121e620684595350b3d8af55247bba8efba7f20 diff --git a/contracts/Dockerfile b/contracts/Dockerfile index 59ae86375..7d59e1ff5 100644 --- a/contracts/Dockerfile +++ b/contracts/Dockerfile @@ -14,8 +14,8 @@ RUN forge install --no-commit \ https://github.com/foundry-rs/forge-std \ https://github.com/uniswap/v2-core \ https://github.com/uniswap/v2-periphery \ - https://github.com/openzeppelin/openzeppelin-contracts \ - https://github.com/openzeppelin/openzeppelin-contracts-upgradeable \ + https://github.com/openzeppelin/openzeppelin-contracts@v4.8.0 \ + https://github.com/openzeppelin/openzeppelin-contracts-upgradeable@v4.8.0 \ https://github.com/AztecProtocol/rollup-encoder@main \ https://github.com/AztecProtocol/aztec-connect-bridges@master ENV MAINNET_RPC_URL='https://mainnet.infura.io/v3/9928b52099854248b3a096be07a6b23c' diff --git a/contracts/deploy/dev b/contracts/deploy/dev index 8d11e0bdc..b0eef4663 100644 --- a/contracts/deploy/dev +++ b/contracts/deploy/dev @@ -1 +1 @@ -redeploy=22 +redeploy=23 diff --git a/contracts/src/core/verifier/keys/VerificationKey1x1.sol b/contracts/src/core/verifier/keys/VerificationKey1x1.sol index 6d47360c1..4c4a9914a 100644 --- a/contracts/src/core/verifier/keys/VerificationKey1x1.sol +++ b/contracts/src/core/verifier/keys/VerificationKey1x1.sol @@ -1,11 +1,11 @@ -// Verification Key Hash: dcb051e8ca06df5e2ffe8c891cbde8c299a9fa13abfbb206e91df73df393fb5f +// Verification Key Hash: 50163a2572c673639325870bcc594daffaafa0f2e384c984b4349747ae6ea507 // SPDX-License-Identifier: Apache-2.0 // Copyright 2022 Aztec pragma solidity >=0.8.4; library VerificationKey1x1 { function verificationKeyHash() internal pure returns (bytes32) { - return 0xdcb051e8ca06df5e2ffe8c891cbde8c299a9fa13abfbb206e91df73df393fb5f; + return 0x50163a2572c673639325870bcc594daffaafa0f2e384c984b4349747ae6ea507; } function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure { @@ -16,8 +16,8 @@ library VerificationKey1x1 { mstore(add(_vk, 0x60), 0x30644e121894ba67550ff245e0f5eb5a25832df811e8df9dd100d30c2c14d821) // vk.domain_inverse mstore(add(_vk, 0x80), 0x1d349b8977724e09c86fa578f4735879a9f44c213b0c8ca5102e4c3971408ef1) // vk.Q1.x mstore(add(_vk, 0xa0), 0x24f288f17b6ae11b4b7864ab9594f8b2f4f19ea1d60e17f772974e91844ac462) // vk.Q1.y - mstore(add(_vk, 0xc0), 0x1408e5e7a8c6f1b360854f783da18e451bfc8f45b8d6f82335f3e22ee4b25a11) // vk.Q2.x - mstore(add(_vk, 0xe0), 0x160a5ac54d7155d83da58ce550865746e166353fa602445e8f9ca286c3223dab) // vk.Q2.y + mstore(add(_vk, 0xc0), 0x1f09b279ad6c323cb954b9e2dbd99987a3129ccfe812555ce461353e10657900) // vk.Q2.x + mstore(add(_vk, 0xe0), 0x2db4739282cfc33e916b5ecf047830971992f56e967655b7707349784159c87c) // vk.Q2.y mstore(add(_vk, 0x100), 0x1da0feb3b521b13e4c0f131fb7e5fe4a4406caa1cee0df757659f2303329c00c) // vk.Q3.x mstore(add(_vk, 0x120), 0x1f964f3a14e19de343a7a8a7ae0fc7b3c44211a9927ebbdb9556fd623177464c) // vk.Q3.y mstore(add(_vk, 0x140), 0x188fa91323b2ba20000d98efb311dc84b27ec60203c6f51301471213bfcc0c93) // vk.QM.x diff --git a/contracts/src/core/verifier/keys/VerificationKey28x32.sol b/contracts/src/core/verifier/keys/VerificationKey28x32.sol index 615a92b72..4448f0be6 100644 --- a/contracts/src/core/verifier/keys/VerificationKey28x32.sol +++ b/contracts/src/core/verifier/keys/VerificationKey28x32.sol @@ -1,11 +1,11 @@ -// Verification Key Hash: 8c16a95cccbb8c49aaf2bf27970df31180f348dfd3bbda93acb7fa800840ce5d +// Verification Key Hash: 30c540ad71c1de0ea945ef250fec744221207208b9c1a5e355ff394c0873e55c // SPDX-License-Identifier: Apache-2.0 // Copyright 2022 Aztec pragma solidity >=0.8.4; library VerificationKey28x32 { function verificationKeyHash() internal pure returns (bytes32) { - return 0x8c16a95cccbb8c49aaf2bf27970df31180f348dfd3bbda93acb7fa800840ce5d; + return 0x30c540ad71c1de0ea945ef250fec744221207208b9c1a5e355ff394c0873e55c; } function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure { @@ -16,8 +16,8 @@ library VerificationKey28x32 { mstore(add(_vk, 0x60), 0x30644e121894ba67550ff245e0f5eb5a25832df811e8df9dd100d30c2c14d821) // vk.domain_inverse mstore(add(_vk, 0x80), 0x1d349b8977724e09c86fa578f4735879a9f44c213b0c8ca5102e4c3971408ef1) // vk.Q1.x mstore(add(_vk, 0xa0), 0x24f288f17b6ae11b4b7864ab9594f8b2f4f19ea1d60e17f772974e91844ac462) // vk.Q1.y - mstore(add(_vk, 0xc0), 0x09007371eee3140ee40dfd6e64b753c41fea0dd9949a3c6ff6411de25e4856eb) // vk.Q2.x - mstore(add(_vk, 0xe0), 0x2ed69f94549ec90d46a8a108500e37e2e7ace7ee1d5fe69b994e0aa35b40cbc7) // vk.Q2.y + mstore(add(_vk, 0xc0), 0x1478cb35d613e2cfbfda0b9dce986b7f00930b2556fa46cdc3baee5dc76bf589) // vk.Q2.x + mstore(add(_vk, 0xe0), 0x2c18d64a741c1d344f0d52e6c62f7ac79821aba10256a15d2622438791a82839) // vk.Q2.y mstore(add(_vk, 0x100), 0x1da0feb3b521b13e4c0f131fb7e5fe4a4406caa1cee0df757659f2303329c00c) // vk.Q3.x mstore(add(_vk, 0x120), 0x1f964f3a14e19de343a7a8a7ae0fc7b3c44211a9927ebbdb9556fd623177464c) // vk.Q3.y mstore(add(_vk, 0x140), 0x188fa91323b2ba20000d98efb311dc84b27ec60203c6f51301471213bfcc0c93) // vk.QM.x diff --git a/contracts/src/test/rollup_processor/InteractionNotes.t.sol b/contracts/src/test/rollup_processor/InteractionNotes.t.sol index e38f17aea..c84590f51 100644 --- a/contracts/src/test/rollup_processor/InteractionNotes.t.sol +++ b/contracts/src/test/rollup_processor/InteractionNotes.t.sol @@ -47,7 +47,7 @@ contract InteractionNotesTest is TestBase { asyncBridgeAddressId = rollupProcessor.getSupportedBridgesLength(); // Setup token A - tokenA = new ERC20Mintable('TokenA'); + tokenA = new ERC20Mintable("TokenA"); rollupProcessor.setSupportedAsset(address(tokenA), 100000); tokenAssetA = AztecTypes.AztecAsset({ id: rollupProcessor.getSupportedAssetsLength(), @@ -56,7 +56,7 @@ contract InteractionNotesTest is TestBase { }); // Setup token B - tokenB = new ERC20Mintable('TokenB'); + tokenB = new ERC20Mintable("TokenB"); rollupProcessor.setSupportedAsset(address(tokenB), 100000); tokenAssetB = AztecTypes.AztecAsset({ id: rollupProcessor.getSupportedAssetsLength(), @@ -65,7 +65,7 @@ contract InteractionNotesTest is TestBase { }); // Setup token C - tokenC = new ERC20Mintable('TokenC'); + tokenC = new ERC20Mintable("TokenC"); rollupProcessor.setSupportedAsset(address(tokenC), 100000); tokenAssetC = AztecTypes.AztecAsset({ id: rollupProcessor.getSupportedAssetsLength(), @@ -126,6 +126,8 @@ contract InteractionNotesTest is TestBase { uint256 firstNonce = rollupId * NUMBER_OF_BRIDGE_CALLS; for (uint256 nonce = firstNonce; nonce < NUMBER_OF_BRIDGE_CALLS; nonce++) { rollupEncoder.defiInteractionL2(encodedBridgeCallDataAsync, totalInputValueAsync); + } + for (uint256 nonce = firstNonce; nonce < NUMBER_OF_BRIDGE_CALLS; nonce++) { vm.expectEmit(true, true, false, true); emit AsyncDefiBridgeProcessed(encodedBridgeCallDataAsync, nonce, totalInputValueAsync); } @@ -139,6 +141,8 @@ contract InteractionNotesTest is TestBase { firstNonce = rollupId * NUMBER_OF_BRIDGE_CALLS; for (uint256 nonce = firstNonce; nonce < firstNonce + 8; nonce++) { rollupEncoder.defiInteractionL2(encodedBridgeCallDataAsync, totalInputValueAsync); + } + for (uint256 nonce = firstNonce; nonce < firstNonce + 8; nonce++) { vm.expectEmit(true, true, false, true); emit AsyncDefiBridgeProcessed(encodedBridgeCallDataAsync, nonce, totalInputValueAsync); } @@ -190,7 +194,7 @@ contract InteractionNotesTest is TestBase { outputValueBAsync, true, "" - ); + ); rollupProcessor.processAsyncDefiInteraction(nonce); } } @@ -211,7 +215,9 @@ contract InteractionNotesTest is TestBase { rollupEncoder.defiInteractionL2(encodedBridgeCallDataSync, totalInputValueSync); - bytes32[] memory nextExpectedDefiHashes = new bytes32[](NUMBER_OF_BRIDGE_CALLS); + bytes32[] memory nextExpectedDefiHashes = new bytes32[]( + NUMBER_OF_BRIDGE_CALLS + ); for (uint256 i = 0; i < NUMBER_OF_BRIDGE_CALLS; i++) { nextExpectedDefiHashes[i] = rollupEncoder.computeDefiInteractionHash( encodedBridgeCallDataAsync, @@ -226,7 +232,7 @@ contract InteractionNotesTest is TestBase { vm.expectEmit(true, true, false, true); emit DefiBridgeProcessed( encodedBridgeCallDataSync, nonce, totalInputValueSync, outputValueASync, 0, true, "" - ); + ); vm.expectEmit(true, false, false, true); emit RollupProcessed(rollupId, nextExpectedDefiHashes, ROLLUP_PROVIDER); rollupEncoder.processRollup(); @@ -244,7 +250,7 @@ contract InteractionNotesTest is TestBase { outputValueBAsync, true, "" - ); + ); rollupProcessor.processAsyncDefiInteraction(nonce); } } @@ -284,7 +290,7 @@ contract InteractionNotesTest is TestBase { vm.expectEmit(true, true, false, true); emit DefiBridgeProcessed( encodedBridgeCallDataSync, nonce, totalInputValueSync, outputValueASync, 0, true, "" - ); + ); vm.expectEmit(true, false, false, true); emit RollupProcessed(rollupId, nextExpectedDefiHashes, ROLLUP_PROVIDER); rollupEncoder.processRollup(); @@ -292,7 +298,9 @@ contract InteractionNotesTest is TestBase { } function _setAsyncBridgeAction(uint256 _outputValueA, uint256 _outputValueB) private returns (uint256) { - AsyncBridge.SubAction[] memory subActions = new AsyncBridge.SubAction[](2); + AsyncBridge.SubAction[] memory subActions = new AsyncBridge.SubAction[]( + 2 + ); subActions[0] = AsyncBridge.SubAction({ target: address(tokenA), value: 0, @@ -315,7 +323,9 @@ contract InteractionNotesTest is TestBase { } function _setSyncBridgeAction(uint256 _outputValueA, uint256 _interactionNonce) private returns (uint256) { - SyncBridge.SubAction[] memory subActions = new SyncBridge.SubAction[](1); + SyncBridge.SubAction[] memory subActions = new SyncBridge.SubAction[]( + 1 + ); subActions[0] = SyncBridge.SubAction({ target: address(rollupProcessor), value: _outputValueA, diff --git a/yarn-project/.pnp.cjs b/yarn-project/.pnp.cjs index e850e9511..c634c47e2 100755 --- a/yarn-project/.pnp.cjs +++ b/yarn-project/.pnp.cjs @@ -5572,6 +5572,22 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["@puppeteer/browsers", [\ + ["npm:1.7.1", {\ + "packageLocation": "./.yarn/cache/@puppeteer-browsers-npm-1.7.1-a197dcc835-fb7cf7773a.zip/node_modules/@puppeteer/browsers/",\ + "packageDependencies": [\ + ["@puppeteer/browsers", "npm:1.7.1"],\ + ["debug", "virtual:e9a07d9e500f265638a80b6a2d60a63d2c1402dd6a58d2f05af9d82e52be33df29a16291c32b33b9e23f1a0efea054868bd3312893433fe0583e4dba376fe47e#npm:4.3.4"],\ + ["extract-zip", "npm:2.0.1"],\ + ["progress", "npm:2.0.3"],\ + ["proxy-agent", "npm:6.3.1"],\ + ["tar-fs", "npm:3.0.4"],\ + ["unbzip2-stream", "npm:1.4.3"],\ + ["yargs", "npm:17.7.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["@rushstack/eslint-patch", [\ ["npm:1.1.4", {\ "packageLocation": "./.yarn/cache/@rushstack-eslint-patch-npm-1.1.4-3fdde25f35-597bc84e2f.zip/node_modules/@rushstack/eslint-patch/",\ @@ -5649,6 +5665,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["@tootallnate/quickjs-emscripten", [\ + ["npm:0.23.0", {\ + "packageLocation": "./.yarn/unplugged/@tootallnate-quickjs-emscripten-npm-0.23.0-a889ea7aeb/node_modules/@tootallnate/quickjs-emscripten/",\ + "packageDependencies": [\ + ["@tootallnate/quickjs-emscripten", "npm:0.23.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["@tsconfig/node10", [\ ["npm:1.0.9", {\ "packageLocation": "./.yarn/cache/@tsconfig-node10-npm-1.0.9-f2e2d20feb-a33ae4dc2a.zip/node_modules/@tsconfig/node10/",\ @@ -7810,6 +7835,14 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["debug", "virtual:e9a07d9e500f265638a80b6a2d60a63d2c1402dd6a58d2f05af9d82e52be33df29a16291c32b33b9e23f1a0efea054868bd3312893433fe0583e4dba376fe47e#npm:4.3.4"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:7.1.0", {\ + "packageLocation": "./.yarn/cache/agent-base-npm-7.1.0-4b12ba5111-f7828f9914.zip/node_modules/agent-base/",\ + "packageDependencies": [\ + ["agent-base", "npm:7.1.0"],\ + ["debug", "virtual:e9a07d9e500f265638a80b6a2d60a63d2c1402dd6a58d2f05af9d82e52be33df29a16291c32b33b9e23f1a0efea054868bd3312893433fe0583e4dba376fe47e#npm:4.3.4"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["agentkeepalive", [\ @@ -8172,6 +8205,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["ast-types", [\ + ["npm:0.13.4", {\ + "packageLocation": "./.yarn/cache/ast-types-npm-0.13.4-69f7e68df8-5a51f7b705.zip/node_modules/ast-types/",\ + "packageDependencies": [\ + ["ast-types", "npm:0.13.4"],\ + ["tslib", "npm:2.6.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["async-limiter", [\ ["npm:1.0.1", {\ "packageLocation": "./.yarn/cache/async-limiter-npm-1.0.1-7e6819bcdb-2b849695b4.zip/node_modules/async-limiter/",\ @@ -8291,6 +8334,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "SOFT"\ }]\ ]],\ + ["b4a", [\ + ["npm:1.6.4", {\ + "packageLocation": "./.yarn/cache/b4a-npm-1.6.4-080bcba845-81b086f9af.zip/node_modules/b4a/",\ + "packageDependencies": [\ + ["b4a", "npm:1.6.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["babel-jest", [\ ["npm:28.1.3", {\ "packageLocation": "./.yarn/cache/babel-jest-npm-28.1.3-3bb56d0efd-57ccd2296e.zip/node_modules/babel-jest/",\ @@ -8676,6 +8728,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["basic-ftp", [\ + ["npm:5.0.3", {\ + "packageLocation": "./.yarn/cache/basic-ftp-npm-5.0.3-95a5b33162-8b04e88eb8.zip/node_modules/basic-ftp/",\ + "packageDependencies": [\ + ["basic-ftp", "npm:5.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["batch", [\ ["npm:0.6.1", {\ "packageLocation": "./.yarn/cache/batch-npm-0.6.1-70e2e81169-61f9934c73.zip/node_modules/batch/",\ @@ -8790,18 +8851,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["bl", [\ - ["npm:4.1.0", {\ - "packageLocation": "./.yarn/cache/bl-npm-4.1.0-7f94cdcf3f-9e8521fa7e.zip/node_modules/bl/",\ - "packageDependencies": [\ - ["bl", "npm:4.1.0"],\ - ["buffer", "npm:5.7.1"],\ - ["inherits", "npm:2.0.4"],\ - ["readable-stream", "npm:3.6.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["bluebird", [\ ["npm:3.7.2", {\ "packageLocation": "./.yarn/cache/bluebird-npm-3.7.2-6a54136ee3-869417503c.zip/node_modules/bluebird/",\ @@ -9409,13 +9458,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["chownr", [\ - ["npm:1.1.4", {\ - "packageLocation": "./.yarn/cache/chownr-npm-1.1.4-5bd400ab08-115648f8eb.zip/node_modules/chownr/",\ - "packageDependencies": [\ - ["chownr", "npm:1.1.4"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:2.0.0", {\ "packageLocation": "./.yarn/cache/chownr-npm-2.0.0-638f1c9c61-c57cf9dd07.zip/node_modules/chownr/",\ "packageDependencies": [\ @@ -9433,6 +9475,30 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["chromium-bidi", [\ + ["npm:0.4.28", {\ + "packageLocation": "./.yarn/cache/chromium-bidi-npm-0.4.28-d14ac319b4-d8ac0aefcf.zip/node_modules/chromium-bidi/",\ + "packageDependencies": [\ + ["chromium-bidi", "npm:0.4.28"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5e2ffe6643fd9d9aedaf831052606b790f6bad54259fdf17fbc35f4c707654364e72981da8a504ee8a17efeab5c33c348bcf2c504854073b10722528f49c0a5d#npm:0.4.28", {\ + "packageLocation": "./.yarn/__virtual__/chromium-bidi-virtual-049a1b6e2a/0/cache/chromium-bidi-npm-0.4.28-d14ac319b4-d8ac0aefcf.zip/node_modules/chromium-bidi/",\ + "packageDependencies": [\ + ["chromium-bidi", "virtual:5e2ffe6643fd9d9aedaf831052606b790f6bad54259fdf17fbc35f4c707654364e72981da8a504ee8a17efeab5c33c348bcf2c504854073b10722528f49c0a5d#npm:0.4.28"],\ + ["@types/devtools-protocol", null],\ + ["devtools-protocol", "npm:0.0.1179426"],\ + ["mitt", "npm:3.0.1"],\ + ["urlpattern-polyfill", "npm:9.0.0"]\ + ],\ + "packagePeers": [\ + "@types/devtools-protocol",\ + "devtools-protocol"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["ci-info", [\ ["npm:3.3.2", {\ "packageLocation": "./.yarn/cache/ci-info-npm-3.3.2-fb5617e149-fd81f1edd2.zip/node_modules/ci-info/",\ @@ -9550,6 +9616,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["wrap-ansi", "npm:7.0.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:8.0.1", {\ + "packageLocation": "./.yarn/cache/cliui-npm-8.0.1-3b029092cf-79648b3b00.zip/node_modules/cliui/",\ + "packageDependencies": [\ + ["cliui", "npm:8.0.1"],\ + ["string-width", "npm:4.2.3"],\ + ["strip-ansi", "npm:6.0.1"],\ + ["wrap-ansi", "npm:7.0.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["clone-deep", [\ @@ -9987,6 +10063,32 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["cosmiconfig", [\ + ["npm:8.3.6", {\ + "packageLocation": "./.yarn/cache/cosmiconfig-npm-8.3.6-a5566e2779-dc339ebea4.zip/node_modules/cosmiconfig/",\ + "packageDependencies": [\ + ["cosmiconfig", "npm:8.3.6"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:1cb044f6d8906edec383235091e9279fc7129c77d48c9e9575848999afacc1e5ea0020e3f9cb2edbcc8c1917f1c57058a787ebacefbdb5e16987f0b1683e9acb#npm:8.3.6", {\ + "packageLocation": "./.yarn/__virtual__/cosmiconfig-virtual-ca3c8c5ba5/0/cache/cosmiconfig-npm-8.3.6-a5566e2779-dc339ebea4.zip/node_modules/cosmiconfig/",\ + "packageDependencies": [\ + ["cosmiconfig", "virtual:1cb044f6d8906edec383235091e9279fc7129c77d48c9e9575848999afacc1e5ea0020e3f9cb2edbcc8c1917f1c57058a787ebacefbdb5e16987f0b1683e9acb#npm:8.3.6"],\ + ["@types/typescript", null],\ + ["import-fresh", "npm:3.3.0"],\ + ["js-yaml", "npm:4.1.0"],\ + ["parse-json", "npm:5.2.0"],\ + ["path-type", "npm:4.0.0"],\ + ["typescript", null]\ + ],\ + "packagePeers": [\ + "@types/typescript",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["create-hash", [\ ["npm:1.2.0", {\ "packageLocation": "./.yarn/cache/create-hash-npm-1.2.0-afd048e1ce-02a6ae3bb9.zip/node_modules/create-hash/",\ @@ -10033,6 +10135,14 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["node-fetch", "virtual:e414995db9c779306e687c7a7c66965e66d0cd7270f6b9fc4f00cc9772c5d50b305ab83e142e0e21dbf10968f7437cbdfcb170d05f4bde68707ac7d0082c9cca#npm:2.6.7"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/cross-fetch-npm-4.0.0-9c67668db4-ecca4f37ff.zip/node_modules/cross-fetch/",\ + "packageDependencies": [\ + ["cross-fetch", "npm:4.0.0"],\ + ["node-fetch", "virtual:9c67668db478e95ba4d6a763bc55027eeff0d22eaf59478017ea07386fc33a3c7b7b625af78aa86a33991a9a500a7aa216e28632de568f02adefd662ef53a42d#npm:2.7.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["cross-spawn", [\ @@ -10136,6 +10246,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["data-uri-to-buffer", [\ + ["npm:5.0.1", {\ + "packageLocation": "./.yarn/cache/data-uri-to-buffer-npm-5.0.1-a40e5ac026-10958f89c0.zip/node_modules/data-uri-to-buffer/",\ + "packageDependencies": [\ + ["data-uri-to-buffer", "npm:5.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["data-urls", [\ ["npm:3.0.2", {\ "packageLocation": "./.yarn/cache/data-urls-npm-3.0.2-c8b2050319-033fc3dd0f.zip/node_modules/data-urls/",\ @@ -10349,6 +10468,18 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["degenerator", [\ + ["npm:5.0.1", {\ + "packageLocation": "./.yarn/cache/degenerator-npm-5.0.1-97c678cdaf-a64fa39cdf.zip/node_modules/degenerator/",\ + "packageDependencies": [\ + ["degenerator", "npm:5.0.1"],\ + ["ast-types", "npm:0.13.4"],\ + ["escodegen", "npm:2.1.0"],\ + ["esprima", "npm:4.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["delayed-stream", [\ ["npm:1.0.0", {\ "packageLocation": "./.yarn/cache/delayed-stream-npm-1.0.0-c5a4c4cc02-46fe6e83e2.zip/node_modules/delayed-stream/",\ @@ -10440,10 +10571,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["devtools-protocol", [\ - ["npm:0.0.1001819", {\ - "packageLocation": "./.yarn/cache/devtools-protocol-npm-0.0.1001819-150772e30c-156e7c6703.zip/node_modules/devtools-protocol/",\ + ["npm:0.0.1179426", {\ + "packageLocation": "./.yarn/cache/devtools-protocol-npm-0.0.1179426-3c128037ae-38a091bde4.zip/node_modules/devtools-protocol/",\ "packageDependencies": [\ - ["devtools-protocol", "npm:0.0.1001819"]\ + ["devtools-protocol", "npm:0.0.1179426"]\ ],\ "linkType": "HARD"\ }]\ @@ -10785,7 +10916,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@types/node", "npm:18.7.23"],\ ["debug", "virtual:e9a07d9e500f265638a80b6a2d60a63d2c1402dd6a58d2f05af9d82e52be33df29a16291c32b33b9e23f1a0efea054868bd3312893433fe0583e4dba376fe47e#npm:4.3.4"],\ ["jest", "virtual:4cf42c2f2a8aa147d524c15c0290174d77a2062937f0c22441901ac61d50212062460a38e714456279cdb4fab155b3b1d12acfb24cd6bb68fcc1837e921b5557#npm:28.1.3"],\ - ["puppeteer", "npm:14.4.1"],\ + ["puppeteer", "npm:21.3.6"],\ ["ts-jest", "virtual:9fe0621c2f7452e546afb7407263191bb0ff23335513d4fd321b647e96c783bd3533ee8c741b409ee3ca4a469ab9f9512eb07ca312f25e666f781e44aabf80c5#npm:28.0.7"],\ ["typescript", "patch:typescript@npm%3A4.7.4#~builtin::version=4.7.4&hash=a1c5e5"]\ ],\ @@ -10964,6 +11095,17 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["source-map", "npm:0.6.1"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:2.1.0", {\ + "packageLocation": "./.yarn/cache/escodegen-npm-2.1.0-e0bf940745-096696407e.zip/node_modules/escodegen/",\ + "packageDependencies": [\ + ["escodegen", "npm:2.1.0"],\ + ["esprima", "npm:4.0.1"],\ + ["estraverse", "npm:5.3.0"],\ + ["esutils", "npm:2.0.3"],\ + ["source-map", "npm:0.6.1"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["eslint", [\ @@ -11556,6 +11698,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["fast-fifo", [\ + ["npm:1.3.2", {\ + "packageLocation": "./.yarn/cache/fast-fifo-npm-1.3.2-391cc25df4-6bfcba3e4d.zip/node_modules/fast-fifo/",\ + "packageDependencies": [\ + ["fast-fifo", "npm:1.3.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["fast-glob", [\ ["npm:3.2.11", {\ "packageLocation": "./.yarn/cache/fast-glob-npm-3.2.11-bc01135fef-f473105324.zip/node_modules/fast-glob/",\ @@ -11830,15 +11981,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["fs-constants", [\ - ["npm:1.0.0", {\ - "packageLocation": "./.yarn/cache/fs-constants-npm-1.0.0-59576b2177-18f5b71837.zip/node_modules/fs-constants/",\ - "packageDependencies": [\ - ["fs-constants", "npm:1.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["fs-extra", [\ ["npm:10.0.0", {\ "packageLocation": "./.yarn/cache/fs-extra-npm-10.0.0-4f8c704115-5285a3d8f3.zip/node_modules/fs-extra/",\ @@ -11860,6 +12002,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ + ["npm:8.1.0", {\ + "packageLocation": "./.yarn/cache/fs-extra-npm-8.1.0-197473387f-bf44f0e6ce.zip/node_modules/fs-extra/",\ + "packageDependencies": [\ + ["fs-extra", "npm:8.1.0"],\ + ["graceful-fs", "npm:4.2.10"],\ + ["jsonfile", "npm:4.0.0"],\ + ["universalify", "npm:0.1.2"]\ + ],\ + "linkType": "HARD"\ + }],\ ["npm:9.0.1", {\ "packageLocation": "./.yarn/cache/fs-extra-npm-9.0.1-2925889105-0110da06b4.zip/node_modules/fs-extra/",\ "packageDependencies": [\ @@ -12050,6 +12202,19 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["get-uri", [\ + ["npm:6.0.1", {\ + "packageLocation": "./.yarn/cache/get-uri-npm-6.0.1-d4f0bb7365-a8aec70e1c.zip/node_modules/get-uri/",\ + "packageDependencies": [\ + ["get-uri", "npm:6.0.1"],\ + ["basic-ftp", "npm:5.0.3"],\ + ["data-uri-to-buffer", "npm:5.0.1"],\ + ["debug", "virtual:e9a07d9e500f265638a80b6a2d60a63d2c1402dd6a58d2f05af9d82e52be33df29a16291c32b33b9e23f1a0efea054868bd3312893433fe0583e4dba376fe47e#npm:4.3.4"],\ + ["fs-extra", "npm:8.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["getpass", [\ ["npm:0.1.7", {\ "packageLocation": "./.yarn/cache/getpass-npm-0.1.7-519164a3be-ab18d55661.zip/node_modules/getpass/",\ @@ -12554,6 +12719,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["debug", "virtual:e9a07d9e500f265638a80b6a2d60a63d2c1402dd6a58d2f05af9d82e52be33df29a16291c32b33b9e23f1a0efea054868bd3312893433fe0583e4dba376fe47e#npm:4.3.4"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:7.0.0", {\ + "packageLocation": "./.yarn/cache/http-proxy-agent-npm-7.0.0-106a57cc8c-48d4fac997.zip/node_modules/http-proxy-agent/",\ + "packageDependencies": [\ + ["http-proxy-agent", "npm:7.0.0"],\ + ["agent-base", "npm:7.1.0"],\ + ["debug", "virtual:e9a07d9e500f265638a80b6a2d60a63d2c1402dd6a58d2f05af9d82e52be33df29a16291c32b33b9e23f1a0efea054868bd3312893433fe0583e4dba376fe47e#npm:4.3.4"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["http-proxy-middleware", [\ @@ -12602,6 +12776,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["debug", "virtual:e9a07d9e500f265638a80b6a2d60a63d2c1402dd6a58d2f05af9d82e52be33df29a16291c32b33b9e23f1a0efea054868bd3312893433fe0583e4dba376fe47e#npm:4.3.4"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:7.0.2", {\ + "packageLocation": "./.yarn/cache/https-proxy-agent-npm-7.0.2-83ea6a5d42-088969a0dd.zip/node_modules/https-proxy-agent/",\ + "packageDependencies": [\ + ["https-proxy-agent", "npm:7.0.2"],\ + ["agent-base", "npm:7.1.0"],\ + ["debug", "virtual:e9a07d9e500f265638a80b6a2d60a63d2c1402dd6a58d2f05af9d82e52be33df29a16291c32b33b9e23f1a0efea054868bd3312893433fe0583e4dba376fe47e#npm:4.3.4"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["human-signals", [\ @@ -12820,6 +13003,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["ip", "npm:1.1.8"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/ip-npm-2.0.0-204facb3cc-cfcfac6b87.zip/node_modules/ip/",\ + "packageDependencies": [\ + ["ip", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["ipaddr.js", [\ @@ -14338,6 +14528,14 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["jsonfile", [\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/jsonfile-npm-4.0.0-10ce3aea15-6447d6224f.zip/node_modules/jsonfile/",\ + "packageDependencies": [\ + ["jsonfile", "npm:4.0.0"],\ + ["graceful-fs", "npm:4.2.10"]\ + ],\ + "linkType": "HARD"\ + }],\ ["npm:6.1.0", {\ "packageLocation": "./.yarn/cache/jsonfile-npm-6.1.0-20a4796cee-7af3b8e1ac.zip/node_modules/jsonfile/",\ "packageDependencies": [\ @@ -14857,6 +15055,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["lru-cache", "npm:7.10.2"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:7.18.3", {\ + "packageLocation": "./.yarn/cache/lru-cache-npm-7.18.3-e68be5b11c-e550d77238.zip/node_modules/lru-cache/",\ + "packageDependencies": [\ + ["lru-cache", "npm:7.18.3"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["ltgt", [\ @@ -15244,6 +15449,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["mitt", [\ + ["npm:3.0.1", {\ + "packageLocation": "./.yarn/cache/mitt-npm-3.0.1-ce290ffa77-b55a489ac9.zip/node_modules/mitt/",\ + "packageDependencies": [\ + ["mitt", "npm:3.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["mkdirp", [\ ["npm:1.0.4", {\ "packageLocation": "./.yarn/cache/mkdirp-npm-1.0.4-37f6ef56b9-a96865108c.zip/node_modules/mkdirp/",\ @@ -15376,6 +15590,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["netmask", [\ + ["npm:2.0.2", {\ + "packageLocation": "./.yarn/cache/netmask-npm-2.0.2-2299510a4d-c65cb8d3f7.zip/node_modules/netmask/",\ + "packageDependencies": [\ + ["netmask", "npm:2.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["no-case", [\ ["npm:3.0.4", {\ "packageLocation": "./.yarn/cache/no-case-npm-3.0.4-12884c3d98-0b2ebc113d.zip/node_modules/no-case/",\ @@ -15414,6 +15637,27 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ + ["npm:2.7.0", {\ + "packageLocation": "./.yarn/cache/node-fetch-npm-2.7.0-587d57004e-d76d2f5edb.zip/node_modules/node-fetch/",\ + "packageDependencies": [\ + ["node-fetch", "npm:2.7.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:9c67668db478e95ba4d6a763bc55027eeff0d22eaf59478017ea07386fc33a3c7b7b625af78aa86a33991a9a500a7aa216e28632de568f02adefd662ef53a42d#npm:2.7.0", {\ + "packageLocation": "./.yarn/__virtual__/node-fetch-virtual-0ec1497d1c/0/cache/node-fetch-npm-2.7.0-587d57004e-d76d2f5edb.zip/node_modules/node-fetch/",\ + "packageDependencies": [\ + ["node-fetch", "virtual:9c67668db478e95ba4d6a763bc55027eeff0d22eaf59478017ea07386fc33a3c7b7b625af78aa86a33991a9a500a7aa216e28632de568f02adefd662ef53a42d#npm:2.7.0"],\ + ["@types/encoding", null],\ + ["encoding", null],\ + ["whatwg-url", "npm:5.0.0"]\ + ],\ + "packagePeers": [\ + "@types/encoding",\ + "encoding"\ + ],\ + "linkType": "HARD"\ + }],\ ["virtual:e414995db9c779306e687c7a7c66965e66d0cd7270f6b9fc4f00cc9772c5d50b305ab83e142e0e21dbf10968f7437cbdfcb170d05f4bde68707ac7d0082c9cca#npm:2.6.7", {\ "packageLocation": "./.yarn/__virtual__/node-fetch-virtual-10f4bc17d9/0/cache/node-fetch-npm-2.6.7-777aa2a6df-8d816ffd1e.zip/node_modules/node-fetch/",\ "packageDependencies": [\ @@ -15856,6 +16100,35 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["pac-proxy-agent", [\ + ["npm:7.0.1", {\ + "packageLocation": "./.yarn/cache/pac-proxy-agent-npm-7.0.1-8d7216fff5-3d4aa48ec1.zip/node_modules/pac-proxy-agent/",\ + "packageDependencies": [\ + ["pac-proxy-agent", "npm:7.0.1"],\ + ["@tootallnate/quickjs-emscripten", "npm:0.23.0"],\ + ["agent-base", "npm:7.1.0"],\ + ["debug", "virtual:e9a07d9e500f265638a80b6a2d60a63d2c1402dd6a58d2f05af9d82e52be33df29a16291c32b33b9e23f1a0efea054868bd3312893433fe0583e4dba376fe47e#npm:4.3.4"],\ + ["get-uri", "npm:6.0.1"],\ + ["http-proxy-agent", "npm:7.0.0"],\ + ["https-proxy-agent", "npm:7.0.2"],\ + ["pac-resolver", "npm:7.0.0"],\ + ["socks-proxy-agent", "npm:8.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["pac-resolver", [\ + ["npm:7.0.0", {\ + "packageLocation": "./.yarn/cache/pac-resolver-npm-7.0.0-904b294260-fa3a898c09.zip/node_modules/pac-resolver/",\ + "packageDependencies": [\ + ["pac-resolver", "npm:7.0.0"],\ + ["degenerator", "npm:5.0.1"],\ + ["ip", "npm:1.1.8"],\ + ["netmask", "npm:2.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["packet-reader", [\ ["npm:1.0.0", {\ "packageLocation": "./.yarn/cache/packet-reader-npm-1.0.0-e93c92246b-0b7516f0cb.zip/node_modules/packet-reader/",\ @@ -16454,6 +16727,23 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["proxy-agent", [\ + ["npm:6.3.1", {\ + "packageLocation": "./.yarn/cache/proxy-agent-npm-6.3.1-b14461a822-31030da419.zip/node_modules/proxy-agent/",\ + "packageDependencies": [\ + ["proxy-agent", "npm:6.3.1"],\ + ["agent-base", "npm:7.1.0"],\ + ["debug", "virtual:e9a07d9e500f265638a80b6a2d60a63d2c1402dd6a58d2f05af9d82e52be33df29a16291c32b33b9e23f1a0efea054868bd3312893433fe0583e4dba376fe47e#npm:4.3.4"],\ + ["http-proxy-agent", "npm:7.0.0"],\ + ["https-proxy-agent", "npm:7.0.2"],\ + ["lru-cache", "npm:7.18.3"],\ + ["pac-proxy-agent", "npm:7.0.1"],\ + ["proxy-from-env", "npm:1.1.0"],\ + ["socks-proxy-agent", "npm:8.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["proxy-from-env", [\ ["npm:1.1.0", {\ "packageLocation": "./.yarn/cache/proxy-from-env-npm-1.1.0-c13d07f26b-ed7fcc2ba0.zip/node_modules/proxy-from-env/",\ @@ -16517,22 +16807,28 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["puppeteer", [\ - ["npm:14.4.1", {\ - "packageLocation": "./.yarn/unplugged/puppeteer-npm-14.4.1-db9660d7e2/node_modules/puppeteer/",\ + ["npm:21.3.6", {\ + "packageLocation": "./.yarn/unplugged/puppeteer-npm-21.3.6-1cb044f6d8/node_modules/puppeteer/",\ "packageDependencies": [\ - ["puppeteer", "npm:14.4.1"],\ - ["cross-fetch", "npm:3.1.5"],\ + ["puppeteer", "npm:21.3.6"],\ + ["@puppeteer/browsers", "npm:1.7.1"],\ + ["cosmiconfig", "virtual:1cb044f6d8906edec383235091e9279fc7129c77d48c9e9575848999afacc1e5ea0020e3f9cb2edbcc8c1917f1c57058a787ebacefbdb5e16987f0b1683e9acb#npm:8.3.6"],\ + ["puppeteer-core", "npm:21.3.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["puppeteer-core", [\ + ["npm:21.3.6", {\ + "packageLocation": "./.yarn/cache/puppeteer-core-npm-21.3.6-5e2ffe6643-18f85781d0.zip/node_modules/puppeteer-core/",\ + "packageDependencies": [\ + ["puppeteer-core", "npm:21.3.6"],\ + ["@puppeteer/browsers", "npm:1.7.1"],\ + ["chromium-bidi", "virtual:5e2ffe6643fd9d9aedaf831052606b790f6bad54259fdf17fbc35f4c707654364e72981da8a504ee8a17efeab5c33c348bcf2c504854073b10722528f49c0a5d#npm:0.4.28"],\ + ["cross-fetch", "npm:4.0.0"],\ ["debug", "virtual:e9a07d9e500f265638a80b6a2d60a63d2c1402dd6a58d2f05af9d82e52be33df29a16291c32b33b9e23f1a0efea054868bd3312893433fe0583e4dba376fe47e#npm:4.3.4"],\ - ["devtools-protocol", "npm:0.0.1001819"],\ - ["extract-zip", "npm:2.0.1"],\ - ["https-proxy-agent", "npm:5.0.1"],\ - ["pkg-dir", "npm:4.2.0"],\ - ["progress", "npm:2.0.3"],\ - ["proxy-from-env", "npm:1.1.0"],\ - ["rimraf", "npm:3.0.2"],\ - ["tar-fs", "npm:2.1.1"],\ - ["unbzip2-stream", "npm:1.4.3"],\ - ["ws", "virtual:db9660d7e225d082a6bec7f74ddc3cf056c215ee171efbfbe29bef4c6033cd247d0bc45306f2998021ceb2fd1e08aaa63db18518323428b624bb8b288998147c#npm:8.7.0"]\ + ["devtools-protocol", "npm:0.0.1179426"],\ + ["ws", "virtual:5e2ffe6643fd9d9aedaf831052606b790f6bad54259fdf17fbc35f4c707654364e72981da8a504ee8a17efeab5c33c348bcf2c504854073b10722528f49c0a5d#npm:8.14.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -16599,6 +16895,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["queue-tick", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/queue-tick-npm-1.0.1-10bd6eaf3d-57c3292814.zip/node_modules/queue-tick/",\ + "packageDependencies": [\ + ["queue-tick", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["randombytes", [\ ["npm:2.1.0", {\ "packageLocation": "./.yarn/cache/randombytes-npm-2.1.0-e3da76bccf-d779499376.zip/node_modules/randombytes/",\ @@ -17667,6 +17972,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["smart-buffer", "npm:4.2.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:2.7.1", {\ + "packageLocation": "./.yarn/cache/socks-npm-2.7.1-17f2b53052-259d9e3e8e.zip/node_modules/socks/",\ + "packageDependencies": [\ + ["socks", "npm:2.7.1"],\ + ["ip", "npm:2.0.0"],\ + ["smart-buffer", "npm:4.2.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["socks-proxy-agent", [\ @@ -17689,6 +18003,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["socks", "npm:2.6.2"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:8.0.2", {\ + "packageLocation": "./.yarn/cache/socks-proxy-agent-npm-8.0.2-df165543cf-4fb165df08.zip/node_modules/socks-proxy-agent/",\ + "packageDependencies": [\ + ["socks-proxy-agent", "npm:8.0.2"],\ + ["agent-base", "npm:7.1.0"],\ + ["debug", "virtual:e9a07d9e500f265638a80b6a2d60a63d2c1402dd6a58d2f05af9d82e52be33df29a16291c32b33b9e23f1a0efea054868bd3312893433fe0583e4dba376fe47e#npm:4.3.4"],\ + ["socks", "npm:2.7.1"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["source-map", [\ @@ -17933,6 +18257,17 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["streamx", [\ + ["npm:2.15.1", {\ + "packageLocation": "./.yarn/cache/streamx-npm-2.15.1-d5dbdeeb03-6f2b4fed68.zip/node_modules/streamx/",\ + "packageDependencies": [\ + ["streamx", "npm:2.15.1"],\ + ["fast-fifo", "npm:1.3.2"],\ + ["queue-tick", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["strict-uri-encode", [\ ["npm:2.0.0", {\ "packageLocation": "./.yarn/cache/strict-uri-encode-npm-2.0.0-1ec3189376-eaac4cf978.zip/node_modules/strict-uri-encode/",\ @@ -18230,28 +18565,25 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["tar-fs", [\ - ["npm:2.1.1", {\ - "packageLocation": "./.yarn/cache/tar-fs-npm-2.1.1-e374d3b7a2-f5b9a70059.zip/node_modules/tar-fs/",\ + ["npm:3.0.4", {\ + "packageLocation": "./.yarn/cache/tar-fs-npm-3.0.4-fa3da2e321-dcf4054f9e.zip/node_modules/tar-fs/",\ "packageDependencies": [\ - ["tar-fs", "npm:2.1.1"],\ - ["chownr", "npm:1.1.4"],\ + ["tar-fs", "npm:3.0.4"],\ ["mkdirp-classic", "npm:0.5.3"],\ ["pump", "npm:3.0.0"],\ - ["tar-stream", "npm:2.2.0"]\ + ["tar-stream", "npm:3.1.6"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["tar-stream", [\ - ["npm:2.2.0", {\ - "packageLocation": "./.yarn/cache/tar-stream-npm-2.2.0-884c79b510-699831a8b9.zip/node_modules/tar-stream/",\ + ["npm:3.1.6", {\ + "packageLocation": "./.yarn/cache/tar-stream-npm-3.1.6-ce3ac17e49-f3627f9185.zip/node_modules/tar-stream/",\ "packageDependencies": [\ - ["tar-stream", "npm:2.2.0"],\ - ["bl", "npm:4.1.0"],\ - ["end-of-stream", "npm:1.4.4"],\ - ["fs-constants", "npm:1.0.0"],\ - ["inherits", "npm:2.0.4"],\ - ["readable-stream", "npm:3.6.0"]\ + ["tar-stream", "npm:3.1.6"],\ + ["b4a", "npm:1.6.4"],\ + ["fast-fifo", "npm:1.3.2"],\ + ["streamx", "npm:2.15.1"]\ ],\ "linkType": "HARD"\ }]\ @@ -19026,6 +19358,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["tslib", "npm:2.4.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:2.6.2", {\ + "packageLocation": "./.yarn/cache/tslib-npm-2.6.2-4fc8c068d9-329ea56123.zip/node_modules/tslib/",\ + "packageDependencies": [\ + ["tslib", "npm:2.6.2"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["tsscmp", [\ @@ -19694,6 +20033,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["urlpattern-polyfill", [\ + ["npm:9.0.0", {\ + "packageLocation": "./.yarn/cache/urlpattern-polyfill-npm-9.0.0-b3c823788f-d3658b78a1.zip/node_modules/urlpattern-polyfill/",\ + "packageDependencies": [\ + ["urlpattern-polyfill", "npm:9.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["use-sync-external-store", [\ ["npm:1.2.0", {\ "packageLocation": "./.yarn/cache/use-sync-external-store-npm-1.2.0-44f75d2564-5c639e0f8d.zip/node_modules/use-sync-external-store/",\ @@ -20893,10 +21241,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["npm:8.7.0", {\ - "packageLocation": "./.yarn/cache/ws-npm-8.7.0-880cfc8423-078fa2dbc0.zip/node_modules/ws/",\ + ["npm:8.14.2", {\ + "packageLocation": "./.yarn/cache/ws-npm-8.14.2-b339ac47a2-3ca0dad26e.zip/node_modules/ws/",\ "packageDependencies": [\ - ["ws", "npm:8.7.0"]\ + ["ws", "npm:8.14.2"]\ ],\ "linkType": "SOFT"\ }],\ @@ -20967,10 +21315,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:b831d2a476fa3fca615225b8f0ed5808e15fa068d92374842f728f3a5a7f4fd3b1ad65f31c4da93ca45747b80d502238d3add0895aa4ab5d58ab25bb1a848f0a#npm:8.8.0", {\ - "packageLocation": "./.yarn/__virtual__/ws-virtual-e18e961635/0/cache/ws-npm-8.8.0-89e1c83090-6ceed1ca1c.zip/node_modules/ws/",\ + ["virtual:5e2ffe6643fd9d9aedaf831052606b790f6bad54259fdf17fbc35f4c707654364e72981da8a504ee8a17efeab5c33c348bcf2c504854073b10722528f49c0a5d#npm:8.14.2", {\ + "packageLocation": "./.yarn/__virtual__/ws-virtual-2b19170d45/0/cache/ws-npm-8.14.2-b339ac47a2-3ca0dad26e.zip/node_modules/ws/",\ "packageDependencies": [\ - ["ws", "virtual:b831d2a476fa3fca615225b8f0ed5808e15fa068d92374842f728f3a5a7f4fd3b1ad65f31c4da93ca45747b80d502238d3add0895aa4ab5d58ab25bb1a848f0a#npm:8.8.0"],\ + ["ws", "virtual:5e2ffe6643fd9d9aedaf831052606b790f6bad54259fdf17fbc35f4c707654364e72981da8a504ee8a17efeab5c33c348bcf2c504854073b10722528f49c0a5d#npm:8.14.2"],\ ["@types/bufferutil", null],\ ["@types/utf-8-validate", null],\ ["bufferutil", null],\ @@ -20984,10 +21332,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:cc129beab13eb304bfe5553be0b3353a6435e7ae17dd64592e5525330db153d2fd28ea03e9b7135b73b66a9d507efead5f9b3984ec840654fdf963cb2162051d#npm:7.5.9", {\ - "packageLocation": "./.yarn/__virtual__/ws-virtual-0210a83e02/0/cache/ws-npm-7.5.9-26f12a5ed6-c3c100a181.zip/node_modules/ws/",\ + ["virtual:b831d2a476fa3fca615225b8f0ed5808e15fa068d92374842f728f3a5a7f4fd3b1ad65f31c4da93ca45747b80d502238d3add0895aa4ab5d58ab25bb1a848f0a#npm:8.8.0", {\ + "packageLocation": "./.yarn/__virtual__/ws-virtual-e18e961635/0/cache/ws-npm-8.8.0-89e1c83090-6ceed1ca1c.zip/node_modules/ws/",\ "packageDependencies": [\ - ["ws", "virtual:cc129beab13eb304bfe5553be0b3353a6435e7ae17dd64592e5525330db153d2fd28ea03e9b7135b73b66a9d507efead5f9b3984ec840654fdf963cb2162051d#npm:7.5.9"],\ + ["ws", "virtual:b831d2a476fa3fca615225b8f0ed5808e15fa068d92374842f728f3a5a7f4fd3b1ad65f31c4da93ca45747b80d502238d3add0895aa4ab5d58ab25bb1a848f0a#npm:8.8.0"],\ ["@types/bufferutil", null],\ ["@types/utf-8-validate", null],\ ["bufferutil", null],\ @@ -21001,10 +21349,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:d1aaf8f72ef0f3d9c0ebd8374d7b93749ad85e70a979d6675b5d8dc175d06664ebc9a1f372401d4cc28f7bde4d203dedaf9d94ec5d9b5312124be9a394abede2#npm:7.5.3", {\ - "packageLocation": "./.yarn/__virtual__/ws-virtual-0a60ef3786/0/cache/ws-npm-7.5.3-3a046a0b1a-423dc0d859.zip/node_modules/ws/",\ + ["virtual:cc129beab13eb304bfe5553be0b3353a6435e7ae17dd64592e5525330db153d2fd28ea03e9b7135b73b66a9d507efead5f9b3984ec840654fdf963cb2162051d#npm:7.5.9", {\ + "packageLocation": "./.yarn/__virtual__/ws-virtual-0210a83e02/0/cache/ws-npm-7.5.9-26f12a5ed6-c3c100a181.zip/node_modules/ws/",\ "packageDependencies": [\ - ["ws", "virtual:d1aaf8f72ef0f3d9c0ebd8374d7b93749ad85e70a979d6675b5d8dc175d06664ebc9a1f372401d4cc28f7bde4d203dedaf9d94ec5d9b5312124be9a394abede2#npm:7.5.3"],\ + ["ws", "virtual:cc129beab13eb304bfe5553be0b3353a6435e7ae17dd64592e5525330db153d2fd28ea03e9b7135b73b66a9d507efead5f9b3984ec840654fdf963cb2162051d#npm:7.5.9"],\ ["@types/bufferutil", null],\ ["@types/utf-8-validate", null],\ ["bufferutil", null],\ @@ -21018,10 +21366,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:db9660d7e225d082a6bec7f74ddc3cf056c215ee171efbfbe29bef4c6033cd247d0bc45306f2998021ceb2fd1e08aaa63db18518323428b624bb8b288998147c#npm:8.7.0", {\ - "packageLocation": "./.yarn/__virtual__/ws-virtual-07cb26c656/0/cache/ws-npm-8.7.0-880cfc8423-078fa2dbc0.zip/node_modules/ws/",\ + ["virtual:d1aaf8f72ef0f3d9c0ebd8374d7b93749ad85e70a979d6675b5d8dc175d06664ebc9a1f372401d4cc28f7bde4d203dedaf9d94ec5d9b5312124be9a394abede2#npm:7.5.3", {\ + "packageLocation": "./.yarn/__virtual__/ws-virtual-0a60ef3786/0/cache/ws-npm-7.5.3-3a046a0b1a-423dc0d859.zip/node_modules/ws/",\ "packageDependencies": [\ - ["ws", "virtual:db9660d7e225d082a6bec7f74ddc3cf056c215ee171efbfbe29bef4c6033cd247d0bc45306f2998021ceb2fd1e08aaa63db18518323428b624bb8b288998147c#npm:8.7.0"],\ + ["ws", "virtual:d1aaf8f72ef0f3d9c0ebd8374d7b93749ad85e70a979d6675b5d8dc175d06664ebc9a1f372401d4cc28f7bde4d203dedaf9d94ec5d9b5312124be9a394abede2#npm:7.5.3"],\ ["@types/bufferutil", null],\ ["@types/utf-8-validate", null],\ ["bufferutil", null],\ @@ -21170,6 +21518,20 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["yargs-parser", "npm:21.0.1"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:17.7.1", {\ + "packageLocation": "./.yarn/cache/yargs-npm-17.7.1-0758ec0e50-3d8a43c336.zip/node_modules/yargs/",\ + "packageDependencies": [\ + ["yargs", "npm:17.7.1"],\ + ["cliui", "npm:8.0.1"],\ + ["escalade", "npm:3.1.1"],\ + ["get-caller-file", "npm:2.0.5"],\ + ["require-directory", "npm:2.1.1"],\ + ["string-width", "npm:4.2.3"],\ + ["y18n", "npm:5.0.8"],\ + ["yargs-parser", "npm:21.1.1"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["yargs-parser", [\ @@ -21195,6 +21557,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["yargs-parser", "npm:21.0.1"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:21.1.1", {\ + "packageLocation": "./.yarn/cache/yargs-parser-npm-21.1.1-8fdc003314-ed2d96a616.zip/node_modules/yargs-parser/",\ + "packageDependencies": [\ + ["yargs-parser", "npm:21.1.1"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["yauzl", [\ diff --git a/yarn-project/end-to-end/Dockerfile b/yarn-project/end-to-end/Dockerfile index 4a2409384..d2f6c792c 100644 --- a/yarn-project/end-to-end/Dockerfile +++ b/yarn-project/end-to-end/Dockerfile @@ -13,7 +13,19 @@ RUN yarn workspaces focus --production > /dev/null FROM node:18-alpine ENV CHROME_BIN="/usr/bin/chromium-browser" PUPPETEER_SKIP_CHROMIUM_DOWNLOAD="true" -RUN apk update && apk add --no-cache udev ttf-freefont chromium curl jq bash +RUN apk update && apk add --no-cache \ + bash \ + curl \ + udev \ + jq \ + chromium \ + chromium-chromedriver \ + nss \ + freetype \ + harfbuzz \ + ca-certificates \ + ttf-freefont + COPY --from=0 /usr/src /usr/src WORKDIR /usr/src/yarn-project/end-to-end ENV DEBUG=bb:* diff --git a/yarn-project/end-to-end/package.json b/yarn-project/end-to-end/package.json index 2aa1ea4b4..f72285242 100644 --- a/yarn-project/end-to-end/package.json +++ b/yarn-project/end-to-end/package.json @@ -38,7 +38,7 @@ "@types/node": "^18.7.23", "debug": "^4.3.4", "jest": "^28.1.3", - "puppeteer": "^14.1.1", + "puppeteer": "^21.3.4", "ts-jest": "^28.0.7", "typescript": "^4.7.4" } diff --git a/yarn-project/end-to-end/scripts/docker-compose-browser.yml b/yarn-project/end-to-end/scripts/docker-compose-browser.yml new file mode 100644 index 000000000..66fc5e931 --- /dev/null +++ b/yarn-project/end-to-end/scripts/docker-compose-browser.yml @@ -0,0 +1,79 @@ +version: '3' +services: + contracts: + image: aztecprotocol/contracts:latest + environment: + ETHEREUM_HOST: ${ETHEREUM_HOST:-} + VK: ${VK:-} + PORT: 8547 + command: ./scripts/start_e2e.sh + + kebab: + image: aztecprotocol/kebab:latest + environment: + ETHEREUM_HOST: ${ETHEREUM_HOST:-http://contracts:8544} + CONTRACTS_HOST: http://contracts:8547 + NO_BUILD: 'true' + PORT: 8545 + depends_on: + - contracts + command: start:e2e + + halloumi1: + image: aztecprotocol/halloumi:latest + environment: + NUM_INNER_ROLLUP_TXS: ${NUM_INNER_ROLLUP_TXS:-3} + NUM_OUTER_ROLLUP_PROOFS: ${NUM_OUTER_ROLLUP_PROOFS:-2} + PERSIST: 'false' + PROVERLESS: ${PROVERLESS:-true} + JOB_SERVER_URL: http://falafel:8082 + + halloumi2: + image: aztecprotocol/halloumi:latest + environment: + NUM_INNER_ROLLUP_TXS: ${NUM_INNER_ROLLUP_TXS:-3} + NUM_OUTER_ROLLUP_PROOFS: ${NUM_OUTER_ROLLUP_PROOFS:-2} + PERSIST: 'false' + PROVERLESS: ${PROVERLESS:-true} + JOB_SERVER_URL: http://falafel:8082 + + falafel: + image: aztecprotocol/falafel:latest + environment: + ETHEREUM_HOST: http://kebab:8545 + CONTRACTS_HOST: http://contracts:8547 + NUM_INNER_ROLLUP_TXS: ${NUM_INNER_ROLLUP_TXS:-3} + NUM_OUTER_ROLLUP_PROOFS: ${NUM_OUTER_ROLLUP_PROOFS:-2} + PROVERLESS: ${PROVERLESS:-true} + NO_BUILD: 'true' + PORT: 8081 + depends_on: + - kebab + command: start:e2e + + # sdk: + # image: aztecprotocol/sdk:latest + # environment: + # ROLLUP_HOST: http://falafel:8081 + # depends_on: + # - falafel + # command: start:e2e + # ports: + # - '1234:1234' + + hummus: + image: aztecprotocol/hummus:latest + # depends_on: + # - sdk + + end-to-end: + image: aztecprotocol/end-to-end:latest + environment: + ETHEREUM_HOST: http://kebab:8545 + ROLLUP_HOST: http://falafel:8081 + CONTRACTS_HOST: http://contracts:8547 + SDK_HOST: http://sdk:1234 + HUMMUS_HOST: http://hummus:8080 + depends_on: + - hummus + entrypoint: ['./scripts/start_browser_e2e.sh', '${TEST:-./src/e2e_browser.test.ts}'] diff --git a/yarn-project/end-to-end/scripts/run_tests b/yarn-project/end-to-end/scripts/run_tests index 90a6439c5..91aaa3e2b 100755 --- a/yarn-project/end-to-end/scripts/run_tests +++ b/yarn-project/end-to-end/scripts/run_tests @@ -25,6 +25,8 @@ docker-compose rm -f if [[ "$TEST" == *int_* ]] ; then docker-compose -f "docker-compose.integration.yml" up --exit-code-from end-to-end -else +elif [[ "$TEST" == *"browser"* ]]; then + docker-compose -f "docker-compose-browser.yml" up --exit-code-from end-to-end +else docker-compose up --exit-code-from end-to-end fi \ No newline at end of file diff --git a/yarn-project/end-to-end/scripts/start_browser_e2e.sh b/yarn-project/end-to-end/scripts/start_browser_e2e.sh new file mode 100755 index 000000000..c505ce631 --- /dev/null +++ b/yarn-project/end-to-end/scripts/start_browser_e2e.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +TEST=${1:-./src/e2e_browser.test.ts} + +apk add dbus + +# Create dbus dirs +mkdir -p /var/run/dbus + +# Change ownership and permissions if necessary +chown -R root:root /var/run/dbus +chmod -R 755 /var/run/dbus + +dbus-daemon --system --nofork & +yarn test $TEST diff --git a/yarn-project/end-to-end/src/e2e_browser.test.ts b/yarn-project/end-to-end/src/e2e_browser.test.ts index 275f72e3b..de2ac1088 100644 --- a/yarn-project/end-to-end/src/e2e_browser.test.ts +++ b/yarn-project/end-to-end/src/e2e_browser.test.ts @@ -47,9 +47,17 @@ describe('hummus terminal test', () => { beforeAll(async () => { browser = await puppeteer.launch({ - headless: true, + headless: 'new', executablePath: process.env.CHROME_BIN, - args: ['--no-sandbox', '--headless', '--disable-gpu', '--disable-dev-shm-usage', '--disk-cache-dir=/dev/null'], + args: [ + '--no-sandbox', + '--headless', + '--disable-gpu', + '--disable-dev-shm-usage', + '--disable-software-rasterizer', + '--remote-debugging-port=9222', + ], + dumpio: true, }); page = await browser.newPage(); diff --git a/yarn-project/yarn.lock b/yarn-project/yarn.lock index 6dd624100..990b3e5cf 100644 --- a/yarn-project/yarn.lock +++ b/yarn-project/yarn.lock @@ -3983,6 +3983,23 @@ __metadata: languageName: node linkType: hard +"@puppeteer/browsers@npm:1.7.1": + version: 1.7.1 + resolution: "@puppeteer/browsers@npm:1.7.1" + dependencies: + debug: 4.3.4 + extract-zip: 2.0.1 + progress: 2.0.3 + proxy-agent: 6.3.1 + tar-fs: 3.0.4 + unbzip2-stream: 1.4.3 + yargs: 17.7.1 + bin: + browsers: lib/cjs/main-cli.js + checksum: fb7cf7773a1aed4e34ce0952dbf9609a164e624d4f8e1f342b816fe3e983888d7a7b2fbafc963559e96cb5bca0d75fb9c81f2097f9b1f5478a0f1cc7cbc12dff + languageName: node + linkType: hard + "@rushstack/eslint-patch@npm:^1.1.4": version: 1.1.4 resolution: "@rushstack/eslint-patch@npm:1.1.4" @@ -4050,6 +4067,13 @@ __metadata: languageName: node linkType: hard +"@tootallnate/quickjs-emscripten@npm:^0.23.0": + version: 0.23.0 + resolution: "@tootallnate/quickjs-emscripten@npm:0.23.0" + checksum: c350a2947ffb80b22e14ff35099fd582d1340d65723384a0fd0515e905e2534459ad2f301a43279a37308a27c99273c932e64649abd57d0bb3ca8c557150eccc + languageName: node + linkType: hard + "@tsconfig/node10@npm:^1.0.7": version: 1.0.9 resolution: "@tsconfig/node10@npm:1.0.9" @@ -5731,6 +5755,15 @@ __metadata: languageName: node linkType: hard +"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0": + version: 7.1.0 + resolution: "agent-base@npm:7.1.0" + dependencies: + debug: ^4.3.4 + checksum: f7828f991470a0cc22cb579c86a18cbae83d8a3cbed39992ab34fc7217c4d126017f1c74d0ab66be87f71455318a8ea3e757d6a37881b8d0f2a2c6aa55e5418f + languageName: node + linkType: hard + "agentkeepalive@npm:^4.1.3, agentkeepalive@npm:^4.2.1": version: 4.2.1 resolution: "agentkeepalive@npm:4.2.1" @@ -6027,6 +6060,15 @@ __metadata: languageName: node linkType: hard +"ast-types@npm:^0.13.4": + version: 0.13.4 + resolution: "ast-types@npm:0.13.4" + dependencies: + tslib: ^2.0.1 + checksum: 5a51f7b70588ecced3601845a0e203279ca2f5fdc184416a0a1640c93ec0a267241d6090a328e78eebb8de81f8754754e0a4f1558ba2a3d638f8ccbd0b1f0eff + languageName: node + linkType: hard + "async-limiter@npm:~1.0.0": version: 1.0.1 resolution: "async-limiter@npm:1.0.1" @@ -6133,6 +6175,13 @@ __metadata: languageName: unknown linkType: soft +"b4a@npm:^1.6.4": + version: 1.6.4 + resolution: "b4a@npm:1.6.4" + checksum: 81b086f9af1f8845fbef4476307236bda3d660c158c201db976f19cdce05f41f93110ab6b12fd7a2696602a490cc43d5410ee36a56d6eef93afb0d6ca69ac3b2 + languageName: node + linkType: hard + "babel-jest@npm:^28.1.3": version: 28.1.3 resolution: "babel-jest@npm:28.1.3" @@ -6328,6 +6377,13 @@ __metadata: languageName: node linkType: hard +"basic-ftp@npm:^5.0.2": + version: 5.0.3 + resolution: "basic-ftp@npm:5.0.3" + checksum: 8b04e88eb85a64de9311721bb0707c9cd70453eefdd854cab85438e6f46fb6c597ddad57ed1acf0a9ede3c677b14e657f51051688a5f23d6f3ea7b5d9073b850 + languageName: node + linkType: hard + "batch@npm:0.6.1": version: 0.6.1 resolution: "batch@npm:0.6.1" @@ -6427,17 +6483,6 @@ __metadata: languageName: node linkType: hard -"bl@npm:^4.0.3": - version: 4.1.0 - resolution: "bl@npm:4.1.0" - dependencies: - buffer: "npm:^5.5.0" - inherits: "npm:^2.0.4" - readable-stream: "npm:^3.4.0" - checksum: 9e8521fa7e83aa9427c6f8ccdcba6e8167ef30cc9a22df26effcc5ab682ef91d2cbc23a239f945d099289e4bbcfae7a192e9c28c84c6202e710a0dfec3722662 - languageName: node - linkType: hard - "bluebird@npm:^3.4.7": version: 3.7.2 resolution: "bluebird@npm:3.7.2" @@ -6742,7 +6787,7 @@ __metadata: languageName: node linkType: hard -"buffer@npm:^5.2.1, buffer@npm:^5.4.3, buffer@npm:^5.5.0": +"buffer@npm:^5.2.1, buffer@npm:^5.4.3": version: 5.7.1 resolution: "buffer@npm:5.7.1" dependencies: @@ -6990,13 +7035,6 @@ __metadata: languageName: node linkType: hard -"chownr@npm:^1.1.1": - version: 1.1.4 - resolution: "chownr@npm:1.1.4" - checksum: 115648f8eb38bac5e41c3857f3e663f9c39ed6480d1349977c4d96c95a47266fcacc5a5aabf3cb6c481e22d72f41992827db47301851766c4fd77ac21a4f081d - languageName: node - linkType: hard - "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" @@ -7011,6 +7049,18 @@ __metadata: languageName: node linkType: hard +"chromium-bidi@npm:0.4.28": + version: 0.4.28 + resolution: "chromium-bidi@npm:0.4.28" + dependencies: + mitt: 3.0.1 + urlpattern-polyfill: 9.0.0 + peerDependencies: + devtools-protocol: "*" + checksum: d8ac0aefcf11ebd744e0b97ecded9dac5c03ab55f46267570cdf1b780ad1e05e8cf6987b65178bda99a1ef1ea1bc59721bda85008283ca5f145912b9e1bf578d + languageName: node + linkType: hard + "ci-info@npm:^3.2.0": version: 3.3.2 resolution: "ci-info@npm:3.3.2" @@ -7119,6 +7169,17 @@ __metadata: languageName: node linkType: hard +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: ^4.2.0 + strip-ansi: ^6.0.1 + wrap-ansi: ^7.0.0 + checksum: 79648b3b0045f2e285b76fb2e24e207c6db44323581e421c3acbd0e86454cba1b37aea976ab50195a49e7384b871e6dfb2247ad7dec53c02454ac6497394cb56 + languageName: node + linkType: hard + "clone-deep@npm:^4.0.1": version: 4.0.1 resolution: "clone-deep@npm:4.0.1" @@ -7446,6 +7507,23 @@ __metadata: languageName: node linkType: hard +"cosmiconfig@npm:8.3.6": + version: 8.3.6 + resolution: "cosmiconfig@npm:8.3.6" + dependencies: + import-fresh: ^3.3.0 + js-yaml: ^4.1.0 + parse-json: ^5.2.0 + path-type: ^4.0.0 + peerDependencies: + typescript: ">=4.9.5" + peerDependenciesMeta: + typescript: + optional: true + checksum: dc339ebea427898c9e03bf01b56ba7afbac07fc7d2a2d5a15d6e9c14de98275a9565da949375aee1809591c152c0a3877bb86dbeaf74d5bd5aaa79955ad9e7a0 + languageName: node + linkType: hard + "create-hash@npm:^1.1.0, create-hash@npm:^1.1.2, create-hash@npm:^1.2.0": version: 1.2.0 resolution: "create-hash@npm:1.2.0" @@ -7480,7 +7558,16 @@ __metadata: languageName: node linkType: hard -"cross-fetch@npm:3.1.5, cross-fetch@npm:^3.1.4, cross-fetch@npm:^3.1.5": +"cross-fetch@npm:4.0.0": + version: 4.0.0 + resolution: "cross-fetch@npm:4.0.0" + dependencies: + node-fetch: ^2.6.12 + checksum: ecca4f37ffa0e8283e7a8a590926b66713a7ef7892757aa36c2d20ffa27b0ac5c60dcf453119c809abe5923fc0bae3702a4d896bfb406ef1077b0d0018213e24 + languageName: node + linkType: hard + +"cross-fetch@npm:^3.1.4, cross-fetch@npm:^3.1.5": version: 3.1.5 resolution: "cross-fetch@npm:3.1.5" dependencies: @@ -7577,6 +7664,13 @@ __metadata: languageName: node linkType: hard +"data-uri-to-buffer@npm:^5.0.1": + version: 5.0.1 + resolution: "data-uri-to-buffer@npm:5.0.1" + checksum: 10958f89c0047b84bd86d572b6b77c9bf238ebe7b55a9a9ab04c90fbf5ab1881783b72e31dc0febdffd30ec914930244f2f728e3629bb8911d922baba129426f + languageName: node + linkType: hard + "data-urls@npm:^3.0.1": version: 3.0.2 resolution: "data-urls@npm:3.0.2" @@ -7717,6 +7811,17 @@ __metadata: languageName: node linkType: hard +"degenerator@npm:^5.0.0": + version: 5.0.1 + resolution: "degenerator@npm:5.0.1" + dependencies: + ast-types: ^0.13.4 + escodegen: ^2.1.0 + esprima: ^4.0.1 + checksum: a64fa39cdf6c2edd75188157d32338ee9de7193d7dbb2aeb4acb1eb30fa4a15ed80ba8dae9bd4d7b085472cf174a5baf81adb761aaa8e326771392c922084152 + languageName: node + linkType: hard + "delayed-stream@npm:~1.0.0": version: 1.0.0 resolution: "delayed-stream@npm:1.0.0" @@ -7790,10 +7895,10 @@ __metadata: languageName: node linkType: hard -"devtools-protocol@npm:0.0.1001819": - version: 0.0.1001819 - resolution: "devtools-protocol@npm:0.0.1001819" - checksum: 156e7c6703ec6c203e0bc1d68393fcd768de45bf225ca7b2d6bd106d8dc4ab0e8f38c518ce158c73d83a96db8ef32ae06dc9b4edd70e94660253dc2622619947 +"devtools-protocol@npm:0.0.1179426": + version: 0.0.1179426 + resolution: "devtools-protocol@npm:0.0.1179426" + checksum: 38a091bde42d7d0f8e5e6c7a445db6a56d7b80f21f51de47ed1316123f70b2256aa6fe0d87fbe37bcc4928c0b9245e28a17fb7fbf8d8622156ae36870b26c1ed languageName: node linkType: hard @@ -8068,7 +8173,7 @@ __metadata: languageName: node linkType: hard -"end-of-stream@npm:^1.1.0, end-of-stream@npm:^1.4.1": +"end-of-stream@npm:^1.1.0": version: 1.4.4 resolution: "end-of-stream@npm:1.4.4" dependencies: @@ -8092,7 +8197,7 @@ __metadata: "@types/node": ^18.7.23 debug: ^4.3.4 jest: ^28.1.3 - puppeteer: ^14.1.1 + puppeteer: ^21.3.4 ts-jest: ^28.0.7 typescript: ^4.7.4 languageName: unknown @@ -8257,6 +8362,24 @@ __metadata: languageName: node linkType: hard +"escodegen@npm:^2.1.0": + version: 2.1.0 + resolution: "escodegen@npm:2.1.0" + dependencies: + esprima: ^4.0.1 + estraverse: ^5.2.0 + esutils: ^2.0.2 + source-map: ~0.6.1 + dependenciesMeta: + source-map: + optional: true + bin: + escodegen: bin/escodegen.js + esgenerate: bin/esgenerate.js + checksum: 096696407e161305cd05aebb95134ad176708bc5cb13d0dcc89a5fcbb959b8ed757e7f2591a5f8036f8f4952d4a724de0df14cd419e29212729fa6df5ce16bf6 + languageName: node + linkType: hard + "eslint-config-prettier@npm:^8.5.0": version: 8.5.0 resolution: "eslint-config-prettier@npm:8.5.0" @@ -8805,6 +8928,13 @@ __metadata: languageName: node linkType: hard +"fast-fifo@npm:^1.1.0, fast-fifo@npm:^1.2.0": + version: 1.3.2 + resolution: "fast-fifo@npm:1.3.2" + checksum: 6bfcba3e4df5af7be3332703b69a7898a8ed7020837ec4395bb341bd96cc3a6d86c3f6071dd98da289618cf2234c70d84b2a6f09a33dd6f988b1ff60d8e54275 + languageName: node + linkType: hard + "fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.9": version: 3.2.11 resolution: "fast-glob@npm:3.2.11" @@ -9039,13 +9169,6 @@ __metadata: languageName: node linkType: hard -"fs-constants@npm:^1.0.0": - version: 1.0.0 - resolution: "fs-constants@npm:1.0.0" - checksum: 18f5b718371816155849475ac36c7d0b24d39a11d91348cfcb308b4494824413e03572c403c86d3a260e049465518c4f0d5bd00f0371cdfcad6d4f30a85b350d - languageName: node - linkType: hard - "fs-extra@npm:10.0.0": version: 10.0.0 resolution: "fs-extra@npm:10.0.0" @@ -9080,6 +9203,17 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:^8.1.0": + version: 8.1.0 + resolution: "fs-extra@npm:8.1.0" + dependencies: + graceful-fs: ^4.2.0 + jsonfile: ^4.0.0 + universalify: ^0.1.0 + checksum: bf44f0e6cea59d5ce071bba4c43ca76d216f89e402dc6285c128abc0902e9b8525135aa808adad72c9d5d218e9f4bcc63962815529ff2f684ad532172a284880 + languageName: node + linkType: hard + "fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0": version: 2.1.0 resolution: "fs-minipass@npm:2.1.0" @@ -9246,6 +9380,18 @@ __metadata: languageName: node linkType: hard +"get-uri@npm:^6.0.1": + version: 6.0.1 + resolution: "get-uri@npm:6.0.1" + dependencies: + basic-ftp: ^5.0.2 + data-uri-to-buffer: ^5.0.1 + debug: ^4.3.4 + fs-extra: ^8.1.0 + checksum: a8aec70e1c67386fbe67f66e344ecd671a19f4cfc8e0f0e14d070563af5123d540e77fbceb6e26566f29846fac864d2862699ab134d307f85c85e7d72ce23d14 + languageName: node + linkType: hard + "getpass@npm:^0.1.1": version: 0.1.7 resolution: "getpass@npm:0.1.7" @@ -9684,6 +9830,16 @@ __metadata: languageName: node linkType: hard +"http-proxy-agent@npm:^7.0.0": + version: 7.0.0 + resolution: "http-proxy-agent@npm:7.0.0" + dependencies: + agent-base: ^7.1.0 + debug: ^4.3.4 + checksum: 48d4fac997917e15f45094852b63b62a46d0c8a4f0b9c6c23ca26d27b8df8d178bed88389e604745e748bd9a01f5023e25093722777f0593c3f052009ff438b6 + languageName: node + linkType: hard + "http-proxy-middleware@npm:^2.0.3": version: 2.0.6 resolution: "http-proxy-middleware@npm:2.0.6" @@ -9724,7 +9880,7 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:5.0.1, https-proxy-agent@npm:^5.0.0": +"https-proxy-agent@npm:^5.0.0": version: 5.0.1 resolution: "https-proxy-agent@npm:5.0.1" dependencies: @@ -9734,6 +9890,16 @@ __metadata: languageName: node linkType: hard +"https-proxy-agent@npm:^7.0.2": + version: 7.0.2 + resolution: "https-proxy-agent@npm:7.0.2" + dependencies: + agent-base: ^7.0.2 + debug: 4 + checksum: 088969a0dd476ea7a0ed0a2cf1283013682b08f874c3bc6696c83fa061d2c157d29ef0ad3eb70a2046010bb7665573b2388d10fdcb3e410a66995e5248444292 + languageName: node + linkType: hard + "human-signals@npm:^2.1.0": version: 2.1.0 resolution: "human-signals@npm:2.1.0" @@ -9819,7 +9985,7 @@ __metadata: languageName: node linkType: hard -"import-fresh@npm:^3.0.0, import-fresh@npm:^3.2.1": +"import-fresh@npm:^3.0.0, import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": version: 3.3.0 resolution: "import-fresh@npm:3.3.0" dependencies: @@ -9918,13 +10084,20 @@ __metadata: languageName: node linkType: hard -"ip@npm:^1.1.5": +"ip@npm:^1.1.5, ip@npm:^1.1.8": version: 1.1.8 resolution: "ip@npm:1.1.8" checksum: a2ade53eb339fb0cbe9e69a44caab10d6e3784662285eb5d2677117ee4facc33a64679051c35e0dfdb1a3983a51ce2f5d2cb36446d52e10d01881789b76e28fb languageName: node linkType: hard +"ip@npm:^2.0.0": + version: 2.0.0 + resolution: "ip@npm:2.0.0" + checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349 + languageName: node + linkType: hard + "ipaddr.js@npm:1.9.1": version: 1.9.1 resolution: "ipaddr.js@npm:1.9.1" @@ -11273,6 +11446,18 @@ __metadata: languageName: node linkType: hard +"jsonfile@npm:^4.0.0": + version: 4.0.0 + resolution: "jsonfile@npm:4.0.0" + dependencies: + graceful-fs: ^4.1.6 + dependenciesMeta: + graceful-fs: + optional: true + checksum: 6447d6224f0d31623eef9b51185af03ac328a7553efcee30fa423d98a9e276ca08db87d71e17f2310b0263fd3ffa6c2a90a6308367f661dc21580f9469897c9e + languageName: node + linkType: hard + "jsonfile@npm:^6.0.1": version: 6.1.0 resolution: "jsonfile@npm:6.1.0" @@ -11736,6 +11921,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^7.14.1": + version: 7.18.3 + resolution: "lru-cache@npm:7.18.3" + checksum: e550d772384709deea3f141af34b6d4fa392e2e418c1498c078de0ee63670f1f46f5eee746e8ef7e69e1c895af0d4224e62ee33e66a543a14763b0f2e74c1356 + languageName: node + linkType: hard + "lru-cache@npm:^7.7.1": version: 7.10.2 resolution: "lru-cache@npm:7.10.2" @@ -12098,6 +12290,13 @@ __metadata: languageName: node linkType: hard +"mitt@npm:3.0.1": + version: 3.0.1 + resolution: "mitt@npm:3.0.1" + checksum: b55a489ac9c2949ab166b7f060601d3b6d893a852515ae9eca4e11df01c013876df777ea109317622b5c1c60e8aae252558e33c8c94e14124db38f64a39614b1 + languageName: node + linkType: hard + "mkdirp-classic@npm:^0.5.2": version: 0.5.3 resolution: "mkdirp-classic@npm:0.5.3" @@ -12214,6 +12413,13 @@ __metadata: languageName: node linkType: hard +"netmask@npm:^2.0.2": + version: 2.0.2 + resolution: "netmask@npm:2.0.2" + checksum: c65cb8d3f7ea5669edddb3217e4c96910a60d0d9a4b52d9847ff6b28b2d0277cd8464eee0ef85133cdee32605c57940cacdd04a9a019079b091b6bba4cb0ec22 + languageName: node + linkType: hard + "no-case@npm:^3.0.4": version: 3.0.4 resolution: "no-case@npm:3.0.4" @@ -12254,6 +12460,20 @@ __metadata: languageName: node linkType: hard +"node-fetch@npm:^2.6.12": + version: 2.7.0 + resolution: "node-fetch@npm:2.7.0" + dependencies: + whatwg-url: ^5.0.0 + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: d76d2f5edb451a3f05b15115ec89fc6be39de37c6089f1b6368df03b91e1633fd379a7e01b7ab05089a25034b2023d959b47e59759cb38d88341b2459e89d6e5 + languageName: node + linkType: hard + "node-forge@npm:^1": version: 1.3.1 resolution: "node-forge@npm:1.3.1" @@ -12650,6 +12870,33 @@ __metadata: languageName: node linkType: hard +"pac-proxy-agent@npm:^7.0.1": + version: 7.0.1 + resolution: "pac-proxy-agent@npm:7.0.1" + dependencies: + "@tootallnate/quickjs-emscripten": ^0.23.0 + agent-base: ^7.0.2 + debug: ^4.3.4 + get-uri: ^6.0.1 + http-proxy-agent: ^7.0.0 + https-proxy-agent: ^7.0.2 + pac-resolver: ^7.0.0 + socks-proxy-agent: ^8.0.2 + checksum: 3d4aa48ec1c19db10158ecc1c4c9a9f77792294412d225ceb3dfa45d5a06950dca9755e2db0d9b69f12769119bea0adf2b24390d9c73c8d81df75e28245ae451 + languageName: node + linkType: hard + +"pac-resolver@npm:^7.0.0": + version: 7.0.0 + resolution: "pac-resolver@npm:7.0.0" + dependencies: + degenerator: ^5.0.0 + ip: ^1.1.8 + netmask: ^2.0.2 + checksum: fa3a898c09848e93e35f5e23443fea36ddb393a851c76a23664a5bf3fcbe58ff77a0bcdae1e4f01b9ea87ea493c52e14d97a0fe39f92474d14cd45559c6e3cde + languageName: node + linkType: hard + "packet-reader@npm:1.0.0": version: 1.0.0 resolution: "packet-reader@npm:1.0.0" @@ -12943,7 +13190,7 @@ __metadata: languageName: node linkType: hard -"pkg-dir@npm:4.2.0, pkg-dir@npm:^4.2.0": +"pkg-dir@npm:^4.2.0": version: 4.2.0 resolution: "pkg-dir@npm:4.2.0" dependencies: @@ -13140,7 +13387,23 @@ __metadata: languageName: node linkType: hard -"proxy-from-env@npm:1.1.0": +"proxy-agent@npm:6.3.1": + version: 6.3.1 + resolution: "proxy-agent@npm:6.3.1" + dependencies: + agent-base: ^7.0.2 + debug: ^4.3.4 + http-proxy-agent: ^7.0.0 + https-proxy-agent: ^7.0.2 + lru-cache: ^7.14.1 + pac-proxy-agent: ^7.0.1 + proxy-from-env: ^1.1.0 + socks-proxy-agent: ^8.0.2 + checksum: 31030da419da31809340ac2521090c9a5bf4fe47a944843f829b3502883208c8586a468955e64b694140a41d70af6f45cf4793f5efd4a6f3ed94e5ac8023e36d + languageName: node + linkType: hard + +"proxy-from-env@npm:^1.1.0": version: 1.1.0 resolution: "proxy-from-env@npm:1.1.0" checksum: ed7fcc2ba0a33404958e34d95d18638249a68c430e30fcb6c478497d72739ba64ce9810a24f53a7d921d0c065e5b78e3822759800698167256b04659366ca4d4 @@ -13196,23 +13459,28 @@ __metadata: languageName: node linkType: hard -"puppeteer@npm:^14.1.1": - version: 14.4.1 - resolution: "puppeteer@npm:14.4.1" +"puppeteer-core@npm:21.3.6": + version: 21.3.6 + resolution: "puppeteer-core@npm:21.3.6" dependencies: - cross-fetch: "npm:3.1.5" - debug: "npm:4.3.4" - devtools-protocol: "npm:0.0.1001819" - extract-zip: "npm:2.0.1" - https-proxy-agent: "npm:5.0.1" - pkg-dir: "npm:4.2.0" - progress: "npm:2.0.3" - proxy-from-env: "npm:1.1.0" - rimraf: "npm:3.0.2" - tar-fs: "npm:2.1.1" - unbzip2-stream: "npm:1.4.3" - ws: "npm:8.7.0" - checksum: 21566e220dbbc8df8c59209b71de83630bf7ba8f9fa117c9f2452370430471fa3bbeb9c19bbfb95bc8078d65454d9000240441050ba6c9880de1954038af0a08 + "@puppeteer/browsers": 1.7.1 + chromium-bidi: 0.4.28 + cross-fetch: 4.0.0 + debug: 4.3.4 + devtools-protocol: 0.0.1179426 + ws: 8.14.2 + checksum: 18f85781d0fc575fc6b5261a242414492e99ba497f914afaef9e3afd62a7ad135dbb63602cca5eae102a91ec8e84838a2bf0d6217bf68ba9b01d2c8b4152faf8 + languageName: node + linkType: hard + +"puppeteer@npm:^21.3.4": + version: 21.3.6 + resolution: "puppeteer@npm:21.3.6" + dependencies: + "@puppeteer/browsers": 1.7.1 + cosmiconfig: 8.3.6 + puppeteer-core: 21.3.6 + checksum: 781dd1061e402dd14fb0d2a522987dc81624437b3cf25eae7dfde26e94a23e992e201d97c9021e002ecd3aae43e1f6a248ec70566c2520a25cd4fabe9e171506 languageName: node linkType: hard @@ -13276,6 +13544,13 @@ __metadata: languageName: node linkType: hard +"queue-tick@npm:^1.0.1": + version: 1.0.1 + resolution: "queue-tick@npm:1.0.1" + checksum: 57c3292814b297f87f792fbeb99ce982813e4e54d7a8bdff65cf53d5c084113913289d4a48ec8bbc964927a74b847554f9f4579df43c969a6c8e0f026457ad01 + languageName: node + linkType: hard + "randombytes@npm:^2.0.1, randombytes@npm:^2.1.0": version: 2.1.0 resolution: "randombytes@npm:2.1.0" @@ -13396,7 +13671,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^3.0.6, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0": +"readable-stream@npm:^3.0.6, readable-stream@npm:^3.4.0, readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0": version: 3.6.0 resolution: "readable-stream@npm:3.6.0" dependencies: @@ -13749,7 +14024,7 @@ __metadata: languageName: node linkType: hard -"rimraf@npm:3.0.2, rimraf@npm:^3.0.0, rimraf@npm:^3.0.2": +"rimraf@npm:^3.0.0, rimraf@npm:^3.0.2": version: 3.0.2 resolution: "rimraf@npm:3.0.2" dependencies: @@ -14172,6 +14447,17 @@ __metadata: languageName: node linkType: hard +"socks-proxy-agent@npm:^8.0.2": + version: 8.0.2 + resolution: "socks-proxy-agent@npm:8.0.2" + dependencies: + agent-base: ^7.0.2 + debug: ^4.3.4 + socks: ^2.7.1 + checksum: 4fb165df08f1f380881dcd887b3cdfdc1aba3797c76c1e9f51d29048be6e494c5b06d68e7aea2e23df4572428f27a3ec22b3d7c75c570c5346507433899a4b6d + languageName: node + linkType: hard + "socks@npm:^2.6.2": version: 2.6.2 resolution: "socks@npm:2.6.2" @@ -14182,6 +14468,16 @@ __metadata: languageName: node linkType: hard +"socks@npm:^2.7.1": + version: 2.7.1 + resolution: "socks@npm:2.7.1" + dependencies: + ip: ^2.0.0 + smart-buffer: ^4.2.0 + checksum: 259d9e3e8e1c9809a7f5c32238c3d4d2a36b39b83851d0f573bfde5f21c4b1288417ce1af06af1452569cd1eb0841169afd4998f0e04ba04656f6b7f0e46d748 + languageName: node + linkType: hard + "source-map-support@npm:*, source-map-support@npm:^0.5.21, source-map-support@npm:~0.5.20": version: 0.5.21 resolution: "source-map-support@npm:0.5.21" @@ -14401,6 +14697,16 @@ __metadata: languageName: node linkType: hard +"streamx@npm:^2.15.0": + version: 2.15.1 + resolution: "streamx@npm:2.15.1" + dependencies: + fast-fifo: ^1.1.0 + queue-tick: ^1.0.1 + checksum: 6f2b4fed68caacd28efbd44d4264f5d3c2b81b0a5de14419333dac57f2075c49ae648df8d03db632a33587a6c8ab7cb9cdb4f9a2f8305be0c2cd79af35742b15 + languageName: node + linkType: hard + "strict-uri-encode@npm:^2.0.0": version: 2.0.0 resolution: "strict-uri-encode@npm:2.0.0" @@ -14640,28 +14946,25 @@ __metadata: languageName: node linkType: hard -"tar-fs@npm:2.1.1": - version: 2.1.1 - resolution: "tar-fs@npm:2.1.1" +"tar-fs@npm:3.0.4": + version: 3.0.4 + resolution: "tar-fs@npm:3.0.4" dependencies: - chownr: "npm:^1.1.1" - mkdirp-classic: "npm:^0.5.2" - pump: "npm:^3.0.0" - tar-stream: "npm:^2.1.4" - checksum: f5b9a70059f5b2969e65f037b4e4da2daf0fa762d3d232ffd96e819e3f94665dbbbe62f76f084f1acb4dbdcce16c6e4dac08d12ffc6d24b8d76720f4d9cf032d + mkdirp-classic: ^0.5.2 + pump: ^3.0.0 + tar-stream: ^3.1.5 + checksum: dcf4054f9e92ca0efe61c2b3f612914fb259a47900aa908a63106513a6d006c899b426ada53eb88d9dbbf089b5724c8e90b96a2c4ca6171845fa14203d734e30 languageName: node linkType: hard -"tar-stream@npm:^2.1.4": - version: 2.2.0 - resolution: "tar-stream@npm:2.2.0" +"tar-stream@npm:^3.1.5": + version: 3.1.6 + resolution: "tar-stream@npm:3.1.6" dependencies: - bl: "npm:^4.0.3" - end-of-stream: "npm:^1.4.1" - fs-constants: "npm:^1.0.0" - inherits: "npm:^2.0.3" - readable-stream: "npm:^3.1.1" - checksum: 699831a8b97666ef50021c767f84924cfee21c142c2eb0e79c63254e140e6408d6d55a065a2992548e72b06de39237ef2b802b99e3ece93ca3904a37622a66f3 + b4a: ^1.6.4 + fast-fifo: ^1.2.0 + streamx: ^2.15.0 + checksum: f3627f918581976e954ff03cb8d370551053796b82564f8c7ca8fac84c48e4d042026d0854fc222171a34ff9c682b72fae91be9c9b0a112d4c54f9e4f443e9c5 languageName: node linkType: hard @@ -15091,6 +15394,13 @@ __metadata: languageName: node linkType: hard +"tslib@npm:^2.0.1": + version: 2.6.2 + resolution: "tslib@npm:2.6.2" + checksum: 329ea56123005922f39642318e3d1f0f8265d1e7fcb92c633e0809521da75eeaca28d2cf96d7248229deb40e5c19adf408259f4b9640afd20d13aecc1430f3ad + languageName: node + linkType: hard + "tsscmp@npm:1.0.6": version: 1.0.6 resolution: "tsscmp@npm:1.0.6" @@ -15395,7 +15705,7 @@ __metadata: languageName: node linkType: hard -"universalify@npm:^0.1.2": +"universalify@npm:^0.1.0, universalify@npm:^0.1.2": version: 0.1.2 resolution: "universalify@npm:0.1.2" checksum: 40cdc60f6e61070fe658ca36016a8f4ec216b29bf04a55dce14e3710cc84c7448538ef4dad3728d0bfe29975ccd7bfb5f414c45e7b78883567fb31b246f02dff @@ -15477,6 +15787,13 @@ __metadata: languageName: node linkType: hard +"urlpattern-polyfill@npm:9.0.0": + version: 9.0.0 + resolution: "urlpattern-polyfill@npm:9.0.0" + checksum: d3658b78a10eaee514c464f5a4336c408c70cf01e9b915cb1df5892b3c49003d1ed4042dc72d1b18493b8b847883e84fbf2bf358abb5dff84b2725d5e8463bcb + languageName: node + linkType: hard + "use-sync-external-store@npm:1.2.0": version: 1.2.0 resolution: "use-sync-external-store@npm:1.2.0" @@ -16177,18 +16494,18 @@ __metadata: languageName: node linkType: hard -"ws@npm:8.7.0": - version: 8.7.0 - resolution: "ws@npm:8.7.0" +"ws@npm:8.14.2": + version: 8.14.2 + resolution: "ws@npm:8.14.2" peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 + utf-8-validate: ">=5.0.2" peerDependenciesMeta: bufferutil: optional: true utf-8-validate: optional: true - checksum: 078fa2dbc06b31a45e0057b19e2930d26c222622e355955afe019c9b9b25f62eb2a8eff7cceabdad04910ecd2bd6ef4fa48e6f3673f2fdddff02a6e4c2459584 + checksum: 3ca0dad26e8cc6515ff392b622a1467430814c463b3368b0258e33696b1d4bed7510bc7030f7b72838b9fdeb8dbd8839cbf808367d6aae2e1d668ce741d4308b languageName: node linkType: hard @@ -16345,6 +16662,28 @@ __metadata: languageName: node linkType: hard +"yargs-parser@npm:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: ed2d96a616a9e3e1cc7d204c62ecc61f7aaab633dcbfab2c6df50f7f87b393993fe6640d017759fe112d0cb1e0119f2b4150a87305cc873fd90831c6a58ccf1c + languageName: node + linkType: hard + +"yargs@npm:17.7.1": + version: 17.7.1 + resolution: "yargs@npm:17.7.1" + dependencies: + cliui: ^8.0.1 + escalade: ^3.1.1 + get-caller-file: ^2.0.5 + require-directory: ^2.1.1 + string-width: ^4.2.3 + y18n: ^5.0.5 + yargs-parser: ^21.1.1 + checksum: 3d8a43c336a4942bc68080768664aca85c7bd406f018bad362fd255c41c8f4e650277f42fd65d543fce99e084124ddafee7bbfc1a5c6a8fda4cec78609dcf8d4 + languageName: node + linkType: hard + "yargs@npm:^13.2.4": version: 13.3.2 resolution: "yargs@npm:13.3.2"