Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
274 changes: 191 additions & 83 deletions barretenberg/cpp/pil/vm2/bytecode/bc_retrieval.pil

Large diffs are not rendered by default.

2 changes: 0 additions & 2 deletions barretenberg/cpp/pil/vm2/bytecode/class_id_derivation.pil
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
include "bc_retrieval.pil";

include "../constants_gen.pil";
include "../poseidon2_hash.pil";
include "../precomputed.pil";
Expand Down
2 changes: 1 addition & 1 deletion barretenberg/cpp/pil/vm2/context.pil
Original file line number Diff line number Diff line change
Expand Up @@ -613,7 +613,7 @@ namespace execution;

// `prev_retrieved_bytecodes_tree_root/size --> prev_retrieved_bytecodes_tree_root/size`:
// In execution.pil, the two constraints #[BYTECODE_RETRIEVAL_RESULT] and
//#[RETRIEVED_BYTECODES_TREE_ROOT/SIZE_NOT_CHANGED] constrain the transition `prev_retrieved_bytecodes_tree_root/size`
// #[RETRIEVED_BYTECODES_TREE_ROOT/SIZE_NOT_CHANGED] constrain the transition `prev_retrieved_bytecodes_tree_root/size`
// to `retrieved_bytecodes_tree_root/size` in the same row.

// The state of the retrieved bytecodes tree should be continuous unless we have finished an enqueued call, i.e.,
Expand Down
4 changes: 2 additions & 2 deletions barretenberg/cpp/pil/vm2/ecc_mem.pil
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,9 @@ include "precomputed.pil";
* - guaranteed by this gadget to be FF.
* - M[rop[6]+2]: M[dst_offset+2] aka res_is_inf (boolean flag if RES is the point at infinity - written by this gadget)
* - guaranteed by this gadget to be U1.
*
*
* ERROR HANDLING:
* Two errors needs to be handled as part of this trace,
* Two errors need to be handled as part of this trace,
* (1) DST_OUT_OF_BOUNDS_ACCESS: If the writes would access a memory address outside
* of the max AVM memory address (AVM_HIGHEST_MEM_ADDRESS).
* (2) POINT_NOT_ON_CURVE: If either of the inputs (embedded curve points) do not
Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -112,46 +112,5 @@ TEST(ClassIdDerivationPoseidonTest, WithHashInteraction)
lookup_class_id_derivation_class_id_poseidon2_1_settings>(trace);
}

// TODO: This should probably be refined and moved to bc_retrieval test file once that exists
TEST(ClassIdDerivationPoseidonTest, WithRetrievalInteraction)
{
PurePoseidon2 poseidon2 = PurePoseidon2();

EventEmitter<ClassIdDerivationEvent> event_emitter;
ClassIdDerivation class_id_derivation(poseidon2, event_emitter);

auto klass = generate_contract_class();
FF class_id =
compute_contract_class_id(klass.artifact_hash, klass.private_functions_root, klass.public_bytecode_commitment);
klass.id = class_id;

TestTraceContainer trace({
{ { C::precomputed_first_row, 1 } },
});

ClassIdDerivationTraceBuilder builder;
BytecodeTraceBuilder bc_trace_builder;

class_id_derivation.assert_derivation(klass);
builder.process({ { .klass = klass } }, trace);

// Create a basic ContractClass without commitment for the retrieval event
ContractClass klass_without_commitment = {
.id = klass.id,
.artifact_hash = klass.artifact_hash,
.private_functions_root = klass.private_functions_root,
.packed_bytecode = klass.packed_bytecode,
};

bc_trace_builder.process_retrieval({ { .bytecode_id = klass.public_bytecode_commitment,
.address = 1,
.current_class_id = klass.id,
.contract_class = klass_without_commitment,
.nullifier_root = 3 } },
trace);

check_interaction<BytecodeTraceBuilder, lookup_bc_retrieval_class_id_derivation_settings>(trace);
}

} // namespace
} // namespace bb::avm2::constraining
16 changes: 8 additions & 8 deletions barretenberg/cpp/src/barretenberg/vm2/generated/columns.hpp

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -146,9 +146,9 @@ namespace bb::avm2 {
struct AvmFlavorVariables {
static constexpr size_t NUM_PRECOMPUTED_ENTITIES = 123;
static constexpr size_t NUM_WITNESS_ENTITIES = 3088;
static constexpr size_t NUM_SHIFTED_ENTITIES = 359;
static constexpr size_t NUM_SHIFTED_ENTITIES = 358;
static constexpr size_t NUM_WIRES = 2620;
static constexpr size_t NUM_ALL_ENTITIES = 3570;
static constexpr size_t NUM_ALL_ENTITIES = 3569;

// Need to be templated for recursive verifier
template <typename FF_>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ template <typename FF_> class bc_retrievalImpl {
public:
using FF = FF_;

static constexpr std::array<size_t, 14> SUBRELATION_PARTIAL_LENGTHS = { 3, 4, 3, 3, 5, 3, 5, 3, 4, 3, 3, 3, 3, 3 };
static constexpr std::array<size_t, 11> SUBRELATION_PARTIAL_LENGTHS = { 3, 3, 5, 3, 4, 3, 3, 3, 3, 3, 3 };

template <typename AllEntities> inline static bool skip(const AllEntities& in)
{
Expand All @@ -35,28 +35,34 @@ template <typename FF> class bc_retrieval : public Relation<bc_retrievalImpl<FF>
static constexpr const std::string_view NAME = "bc_retrieval";

// Subrelation indices constants, to be used in tests.
static constexpr size_t SR_TRACE_CONTINUITY = 1;
static constexpr size_t SR_NO_REMAINING_BYTECODES = 4;
static constexpr size_t SR_CURRENT_CLASS_ID_IS_ZERO_IF_INSTANCE_DOES_NOT_EXIST = 8;
static constexpr size_t SR_ARTIFACT_HASH_IS_ZERO_IF_ERROR = 9;
static constexpr size_t SR_PRIVATE_FUNCTION_ROOT_IS_ZERO_IF_ERROR = 10;
static constexpr size_t SR_BYTECODE_ID_IS_ZERO_IF_ERROR = 11;
static constexpr size_t SR_NO_REMAINING_BYTECODES = 2;
static constexpr size_t SR_NEW_CLASS_IS_ZERO_IF_INSTANCE_DOES_NOT_EXIST = 3;
static constexpr size_t SR_ERROR_CHECK = 4;
static constexpr size_t SR_ARTIFACT_HASH_IS_ZERO_IF_ERROR = 5;
static constexpr size_t SR_PRIVATE_FUNCTION_ROOT_IS_ZERO_IF_ERROR = 6;
static constexpr size_t SR_BYTECODE_ID_IS_ZERO_IF_ERROR = 7;
static constexpr size_t SR_RETRIEVED_BYTECODES_TREE_ROOT_NOT_CHANGED_IF_ERROR = 8;
static constexpr size_t SR_RETRIEVED_BYTECODES_TREE_SIZE_NOT_CHANGED_IF_ERROR = 9;

static std::string get_subrelation_label(size_t index)
{
switch (index) {
case SR_TRACE_CONTINUITY:
return "TRACE_CONTINUITY";
case SR_NO_REMAINING_BYTECODES:
return "NO_REMAINING_BYTECODES";
case SR_CURRENT_CLASS_ID_IS_ZERO_IF_INSTANCE_DOES_NOT_EXIST:
return "CURRENT_CLASS_ID_IS_ZERO_IF_INSTANCE_DOES_NOT_EXIST";
case SR_NEW_CLASS_IS_ZERO_IF_INSTANCE_DOES_NOT_EXIST:
return "NEW_CLASS_IS_ZERO_IF_INSTANCE_DOES_NOT_EXIST";
case SR_ERROR_CHECK:
return "ERROR_CHECK";
case SR_ARTIFACT_HASH_IS_ZERO_IF_ERROR:
return "ARTIFACT_HASH_IS_ZERO_IF_ERROR";
case SR_PRIVATE_FUNCTION_ROOT_IS_ZERO_IF_ERROR:
return "PRIVATE_FUNCTION_ROOT_IS_ZERO_IF_ERROR";
case SR_BYTECODE_ID_IS_ZERO_IF_ERROR:
return "BYTECODE_ID_IS_ZERO_IF_ERROR";
case SR_RETRIEVED_BYTECODES_TREE_ROOT_NOT_CHANGED_IF_ERROR:
return "RETRIEVED_BYTECODES_TREE_ROOT_NOT_CHANGED_IF_ERROR";
case SR_RETRIEVED_BYTECODES_TREE_SIZE_NOT_CHANGED_IF_ERROR:
return "RETRIEVED_BYTECODES_TREE_SIZE_NOT_CHANGED_IF_ERROR";
}
return std::to_string(index);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,102 +22,81 @@ void bc_retrievalImpl<FF_>::accumulate(ContainerOverSubrelations& evals,
in.get(C::bc_retrieval_prev_retrieved_bytecodes_tree_size));
const auto bc_retrieval_TOO_MANY_BYTECODES =
in.get(C::bc_retrieval_no_remaining_bytecodes) * in.get(C::bc_retrieval_is_new_class);
const auto bc_retrieval_INSTANCE_NOT_FOUND = (FF(1) - in.get(C::bc_retrieval_instance_exists));

{
using View = typename std::tuple_element_t<0, ContainerOverSubrelations>::View;
auto tmp =
static_cast<View>(in.get(C::bc_retrieval_sel)) * (FF(1) - static_cast<View>(in.get(C::bc_retrieval_sel)));
std::get<0>(evals) += (tmp * scaling_factor);
}
{ // TRACE_CONTINUITY
using View = typename std::tuple_element_t<1, ContainerOverSubrelations>::View;
auto tmp = (FF(1) - static_cast<View>(in.get(C::bc_retrieval_sel))) *
(FF(1) - static_cast<View>(in.get(C::precomputed_first_row))) *
static_cast<View>(in.get(C::bc_retrieval_sel_shift));
std::get<1>(evals) += (tmp * scaling_factor);
}
{
using View = typename std::tuple_element_t<2, ContainerOverSubrelations>::View;
auto tmp = static_cast<View>(in.get(C::bc_retrieval_instance_exists)) *
(FF(1) - static_cast<View>(in.get(C::bc_retrieval_instance_exists)));
std::get<2>(evals) += (tmp * scaling_factor);
}
{
using View = typename std::tuple_element_t<3, ContainerOverSubrelations>::View;
using View = typename std::tuple_element_t<1, ContainerOverSubrelations>::View;
auto tmp = static_cast<View>(in.get(C::bc_retrieval_no_remaining_bytecodes)) *
(FF(1) - static_cast<View>(in.get(C::bc_retrieval_no_remaining_bytecodes)));
std::get<3>(evals) += (tmp * scaling_factor);
std::get<1>(evals) += (tmp * scaling_factor);
}
{ // NO_REMAINING_BYTECODES
using View = typename std::tuple_element_t<4, ContainerOverSubrelations>::View;
using View = typename std::tuple_element_t<2, ContainerOverSubrelations>::View;
auto tmp = static_cast<View>(in.get(C::bc_retrieval_sel)) *
((CView(bc_retrieval_REMAINING_BYTECODES) *
(static_cast<View>(in.get(C::bc_retrieval_no_remaining_bytecodes)) *
(FF(1) - static_cast<View>(in.get(C::bc_retrieval_remaining_bytecodes_inv))) +
static_cast<View>(in.get(C::bc_retrieval_remaining_bytecodes_inv))) -
FF(1)) +
static_cast<View>(in.get(C::bc_retrieval_no_remaining_bytecodes)));
std::get<4>(evals) += (tmp * scaling_factor);
}
{
using View = typename std::tuple_element_t<5, ContainerOverSubrelations>::View;
auto tmp = (FF(1) - static_cast<View>(in.get(C::bc_retrieval_instance_exists))) *
static_cast<View>(in.get(C::bc_retrieval_is_new_class));
std::get<5>(evals) += (tmp * scaling_factor);
}
{
using View = typename std::tuple_element_t<6, ContainerOverSubrelations>::View;
auto tmp = static_cast<View>(in.get(C::bc_retrieval_sel)) *
(static_cast<View>(in.get(C::bc_retrieval_instance_exists)) *
(FF(1) - CView(bc_retrieval_TOO_MANY_BYTECODES)) -
(FF(1) - static_cast<View>(in.get(C::bc_retrieval_error))));
std::get<6>(evals) += (tmp * scaling_factor);
std::get<2>(evals) += (tmp * scaling_factor);
}
{
using View = typename std::tuple_element_t<7, ContainerOverSubrelations>::View;
auto tmp = (static_cast<View>(in.get(C::bc_retrieval_should_retrieve)) -
static_cast<View>(in.get(C::bc_retrieval_sel)) *
(FF(1) - static_cast<View>(in.get(C::bc_retrieval_error))));
std::get<7>(evals) += (tmp * scaling_factor);
{ // NEW_CLASS_IS_ZERO_IF_INSTANCE_DOES_NOT_EXIST
using View = typename std::tuple_element_t<3, ContainerOverSubrelations>::View;
auto tmp = CView(bc_retrieval_INSTANCE_NOT_FOUND) * static_cast<View>(in.get(C::bc_retrieval_is_new_class));
std::get<3>(evals) += (tmp * scaling_factor);
}
{ // CURRENT_CLASS_ID_IS_ZERO_IF_INSTANCE_DOES_NOT_EXIST
using View = typename std::tuple_element_t<8, ContainerOverSubrelations>::View;
{ // ERROR_CHECK
using View = typename std::tuple_element_t<4, ContainerOverSubrelations>::View;
auto tmp = static_cast<View>(in.get(C::bc_retrieval_sel)) *
(FF(1) - static_cast<View>(in.get(C::bc_retrieval_instance_exists))) *
static_cast<View>(in.get(C::bc_retrieval_current_class_id));
std::get<8>(evals) += (tmp * scaling_factor);
((CView(bc_retrieval_INSTANCE_NOT_FOUND) + CView(bc_retrieval_TOO_MANY_BYTECODES)) -
static_cast<View>(in.get(C::bc_retrieval_error)));
std::get<4>(evals) += (tmp * scaling_factor);
}
{ // ARTIFACT_HASH_IS_ZERO_IF_ERROR
using View = typename std::tuple_element_t<9, ContainerOverSubrelations>::View;
using View = typename std::tuple_element_t<5, ContainerOverSubrelations>::View;
auto tmp =
static_cast<View>(in.get(C::bc_retrieval_error)) * static_cast<View>(in.get(C::bc_retrieval_artifact_hash));
std::get<9>(evals) += (tmp * scaling_factor);
std::get<5>(evals) += (tmp * scaling_factor);
}
{ // PRIVATE_FUNCTION_ROOT_IS_ZERO_IF_ERROR
using View = typename std::tuple_element_t<10, ContainerOverSubrelations>::View;
using View = typename std::tuple_element_t<6, ContainerOverSubrelations>::View;
auto tmp = static_cast<View>(in.get(C::bc_retrieval_error)) *
static_cast<View>(in.get(C::bc_retrieval_private_functions_root));
std::get<10>(evals) += (tmp * scaling_factor);
std::get<6>(evals) += (tmp * scaling_factor);
}
{ // BYTECODE_ID_IS_ZERO_IF_ERROR
using View = typename std::tuple_element_t<11, ContainerOverSubrelations>::View;
using View = typename std::tuple_element_t<7, ContainerOverSubrelations>::View;
auto tmp =
static_cast<View>(in.get(C::bc_retrieval_error)) * static_cast<View>(in.get(C::bc_retrieval_bytecode_id));
std::get<11>(evals) += (tmp * scaling_factor);
std::get<7>(evals) += (tmp * scaling_factor);
}
{
using View = typename std::tuple_element_t<12, ContainerOverSubrelations>::View;
{ // RETRIEVED_BYTECODES_TREE_ROOT_NOT_CHANGED_IF_ERROR
using View = typename std::tuple_element_t<8, ContainerOverSubrelations>::View;
auto tmp = static_cast<View>(in.get(C::bc_retrieval_error)) *
(static_cast<View>(in.get(C::bc_retrieval_next_retrieved_bytecodes_tree_root)) -
static_cast<View>(in.get(C::bc_retrieval_prev_retrieved_bytecodes_tree_root)));
std::get<12>(evals) += (tmp * scaling_factor);
std::get<8>(evals) += (tmp * scaling_factor);
}
{
using View = typename std::tuple_element_t<13, ContainerOverSubrelations>::View;
{ // RETRIEVED_BYTECODES_TREE_SIZE_NOT_CHANGED_IF_ERROR
using View = typename std::tuple_element_t<9, ContainerOverSubrelations>::View;
auto tmp = static_cast<View>(in.get(C::bc_retrieval_error)) *
(static_cast<View>(in.get(C::bc_retrieval_next_retrieved_bytecodes_tree_size)) -
static_cast<View>(in.get(C::bc_retrieval_prev_retrieved_bytecodes_tree_size)));
std::get<13>(evals) += (tmp * scaling_factor);
std::get<9>(evals) += (tmp * scaling_factor);
}
{
using View = typename std::tuple_element_t<10, ContainerOverSubrelations>::View;
auto tmp = (static_cast<View>(in.get(C::bc_retrieval_should_retrieve)) -
static_cast<View>(in.get(C::bc_retrieval_sel)) *
(FF(1) - static_cast<View>(in.get(C::bc_retrieval_error))));
std::get<10>(evals) += (tmp * scaling_factor);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@
namespace bb::avm2 {

INSTANTIATE_LOOKUP(lookup_bc_retrieval_contract_instance_retrieval_relation);
INSTANTIATE_LOOKUP(lookup_bc_retrieval_is_new_class_check_relation);
INSTANTIATE_LOOKUP(lookup_bc_retrieval_class_id_derivation_relation);
INSTANTIATE_LOOKUP(lookup_bc_retrieval_is_new_class_check_relation);
INSTANTIATE_LOOKUP(lookup_bc_retrieval_retrieved_bytecodes_insertion_relation);

} // namespace bb::avm2
Original file line number Diff line number Diff line change
Expand Up @@ -43,34 +43,6 @@ template <typename FF_>
using lookup_bc_retrieval_contract_instance_retrieval_relation =
lookup_relation_base<FF_, lookup_bc_retrieval_contract_instance_retrieval_settings>;

/////////////////// lookup_bc_retrieval_is_new_class_check ///////////////////

struct lookup_bc_retrieval_is_new_class_check_settings_ {
static constexpr std::string_view NAME = "LOOKUP_BC_RETRIEVAL_IS_NEW_CLASS_CHECK";
static constexpr std::string_view RELATION_NAME = "bc_retrieval";
static constexpr size_t LOOKUP_TUPLE_SIZE = 3;
static constexpr Column SRC_SELECTOR = Column::bc_retrieval_instance_exists;
static constexpr Column DST_SELECTOR = Column::retrieved_bytecodes_tree_check_sel;
static constexpr Column COUNTS = Column::lookup_bc_retrieval_is_new_class_check_counts;
static constexpr Column INVERSES = Column::lookup_bc_retrieval_is_new_class_check_inv;
static constexpr std::array<ColumnAndShifts, LOOKUP_TUPLE_SIZE> SRC_COLUMNS = {
ColumnAndShifts::bc_retrieval_current_class_id,
ColumnAndShifts::bc_retrieval_is_new_class,
ColumnAndShifts::bc_retrieval_prev_retrieved_bytecodes_tree_root
};
static constexpr std::array<ColumnAndShifts, LOOKUP_TUPLE_SIZE> DST_COLUMNS = {
ColumnAndShifts::retrieved_bytecodes_tree_check_class_id,
ColumnAndShifts::retrieved_bytecodes_tree_check_leaf_not_exists,
ColumnAndShifts::retrieved_bytecodes_tree_check_root
};
};

using lookup_bc_retrieval_is_new_class_check_settings =
lookup_settings<lookup_bc_retrieval_is_new_class_check_settings_>;
template <typename FF_>
using lookup_bc_retrieval_is_new_class_check_relation =
lookup_relation_base<FF_, lookup_bc_retrieval_is_new_class_check_settings>;

/////////////////// lookup_bc_retrieval_class_id_derivation ///////////////////

struct lookup_bc_retrieval_class_id_derivation_settings_ {
Expand Down Expand Up @@ -101,6 +73,34 @@ template <typename FF_>
using lookup_bc_retrieval_class_id_derivation_relation =
lookup_relation_base<FF_, lookup_bc_retrieval_class_id_derivation_settings>;

/////////////////// lookup_bc_retrieval_is_new_class_check ///////////////////

struct lookup_bc_retrieval_is_new_class_check_settings_ {
static constexpr std::string_view NAME = "LOOKUP_BC_RETRIEVAL_IS_NEW_CLASS_CHECK";
static constexpr std::string_view RELATION_NAME = "bc_retrieval";
static constexpr size_t LOOKUP_TUPLE_SIZE = 3;
static constexpr Column SRC_SELECTOR = Column::bc_retrieval_instance_exists;
static constexpr Column DST_SELECTOR = Column::retrieved_bytecodes_tree_check_sel;
static constexpr Column COUNTS = Column::lookup_bc_retrieval_is_new_class_check_counts;
static constexpr Column INVERSES = Column::lookup_bc_retrieval_is_new_class_check_inv;
static constexpr std::array<ColumnAndShifts, LOOKUP_TUPLE_SIZE> SRC_COLUMNS = {
ColumnAndShifts::bc_retrieval_current_class_id,
ColumnAndShifts::bc_retrieval_is_new_class,
ColumnAndShifts::bc_retrieval_prev_retrieved_bytecodes_tree_root
};
static constexpr std::array<ColumnAndShifts, LOOKUP_TUPLE_SIZE> DST_COLUMNS = {
ColumnAndShifts::retrieved_bytecodes_tree_check_class_id,
ColumnAndShifts::retrieved_bytecodes_tree_check_leaf_not_exists,
ColumnAndShifts::retrieved_bytecodes_tree_check_root
};
};

using lookup_bc_retrieval_is_new_class_check_settings =
lookup_settings<lookup_bc_retrieval_is_new_class_check_settings_>;
template <typename FF_>
using lookup_bc_retrieval_is_new_class_check_relation =
lookup_relation_base<FF_, lookup_bc_retrieval_is_new_class_check_settings>;

/////////////////// lookup_bc_retrieval_retrieved_bytecodes_insertion ///////////////////

struct lookup_bc_retrieval_retrieved_bytecodes_insertion_settings_ {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,13 @@ struct BytecodeRetrievalEvent {
BytecodeId bytecode_id;
AztecAddress address;
ContractClassId current_class_id;
ContractClass contract_class;
FF nullifier_root;
FF public_data_tree_root;
ContractClass contract_class{};
FF nullifier_root; // TODO(MW): Rename either nullifier_root -> nullifier_tree_root or...
FF public_data_tree_root; // public_data_tree_root -> public_data_root
Comment on lines +35 to +36
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The circuit uses the naming convention ..._tree_root, but a lot of cpp uses just .._root. Avoided doing this now because it creates a massive annoying diff to look at, so will create a follow up PR (unless we agree it's not worth the effort!)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Another event suggestion - instead of the two bools, would it make more sense to use an enum like std::optional<BytecodeRetrievalEventEventError> error? IIRC it's more consistent with other events

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah "_tree_root" would be more precise. You can open a ticket.

Related to the the "std::optional<>", I agree it would be cleaner. I would welcome such a change.

AppendOnlyTreeSnapshot retrieved_bytecodes_snapshot_before;
AppendOnlyTreeSnapshot retrieved_bytecodes_snapshot_after;
bool is_new_class = false;
// TODO(MW): Better to have something like std::optional<BytecodeRetrievalEventEventError> error here?
bool instance_not_found_error = false;
bool limit_error = false;
};
Expand Down
Loading