29 uint64_t value_to_serialize =
static_cast<uint64_t
>(this->
value);
30 packer.pack_bin(
sizeof(value_to_serialize));
31 packer.pack_bin_body((
char*)&value_to_serialize,
sizeof(value_to_serialize));
37 if (o.type == msgpack::type::BIN) {
39 if (bin.size ==
sizeof(uint64_t)) {
40 uint64_t value_to_deserialize = 0;
41 std::memcpy(&value_to_deserialize, bin.ptr,
sizeof(value_to_deserialize));
44 throw std::runtime_error(
"Invalid binary data size for MemoryTag");
70 uint8_t value_to_serialize =
static_cast<uint8_t
>(this->
value);
71 packer.pack_bin(
sizeof(value_to_serialize));
72 packer.pack_bin_body((
char*)&value_to_serialize,
sizeof(value_to_serialize));
78 if (o.type == msgpack::type::BIN) {
80 if (bin.size ==
sizeof(uint8_t)) {
81 uint8_t value_to_deserialize = 0;
82 std::memcpy(&value_to_deserialize, bin.ptr,
sizeof(value_to_deserialize));
85 throw std::runtime_error(
"Invalid binary data size for AddressingMode");
556 using Ts::operator()...;
585 os <<
"ADD_8_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
588 os <<
"SET_8_Instruction " << arg.value_tag <<
" " << arg.result_address <<
" " << arg.value;
591 os <<
"SET_16_Instruction " << arg.value_tag <<
" " << arg.result_address <<
" " << arg.value;
594 os <<
"SET_32_Instruction " << arg.value_tag <<
" " << arg.result_address <<
" " << arg.value;
597 os <<
"SET_64_Instruction " << arg.value_tag <<
" " << arg.result_address <<
" " << arg.value;
600 os <<
"SET_128_Instruction " << arg.value_tag <<
" " << arg.result_address <<
" " << arg.value_high
601 <<
" " << arg.value_low;
604 os <<
"SET_FF_Instruction " << arg.value_tag <<
" " << arg.result_address <<
" " << arg.value;
607 os <<
"SUB_8_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
610 os <<
"MUL_8_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
613 os <<
"DIV_8_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
616 os <<
"FDIV_8_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
619 os <<
"EQ_8_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
622 os <<
"LT_8_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
625 os <<
"LTE_8_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
628 os <<
"AND_8_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
631 os <<
"OR_8_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
634 os <<
"XOR_8_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
637 os <<
"SHL_8_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
640 os <<
"SHR_8_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
642 [&](
NOT_8_Instruction arg) { os <<
"NOT_8_Instruction " << arg.a_address <<
" " << arg.result_address; },
644 os <<
"ADD_16_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
647 os <<
"SUB_16_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
650 os <<
"MUL_16_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
653 os <<
"DIV_16_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
656 os <<
"FDIV_16_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
659 os <<
"EQ_16_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
662 os <<
"LT_16_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
665 os <<
"LTE_16_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
668 os <<
"AND_16_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
671 os <<
"OR_16_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
674 os <<
"XOR_16_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
676 [&](
NOT_16_Instruction arg) { os <<
"NOT_16_Instruction " << arg.a_address <<
" " << arg.result_address; },
678 os <<
"SHL_16_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
681 os <<
"SHR_16_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
684 os <<
"CAST_8_Instruction " << arg.src_tag <<
" " << arg.src_address <<
" " << arg.result_address <<
" "
688 os <<
"CAST_16_Instruction " << arg.src_tag <<
" " << arg.src_address <<
" " << arg.result_address
689 <<
" " << arg.target_tag;
692 os <<
"MOV_8_Instruction " << arg.value_tag <<
" " << arg.src_address <<
" " << arg.result_address;
695 os <<
"MOV_16_Instruction " << arg.value_tag <<
" " << arg.src_address <<
" " << arg.result_address;
698 os <<
"SSTORE_Instruction " << arg.src_address <<
" " << arg.result_address <<
" " << arg.slot;
700 [&](
SLOAD_Instruction arg) { os <<
"SLOAD_Instruction " << arg.slot_address <<
" " << arg.result_address; },
702 os <<
"GETENVVAR_Instruction " << arg.result_address <<
" " <<
static_cast<int>(arg.type);
706 os <<
"NULLIFIEREXISTS_Instruction " << arg.nullifier_address <<
" " << arg.contract_address_address
707 <<
" " << arg.result_address;
710 os <<
"EMITNOTEHASH_Instruction " << arg.note_hash_address <<
" " << arg.note_hash;
713 os <<
"NOTEHASHEXISTS_Instruction " << arg.notehash_address <<
" " << arg.notehash_address <<
" "
714 << arg.leaf_index_address <<
" " << arg.result_address;
717 os <<
"CALLDATACOPY_Instruction " << arg.dst_address <<
" " <<
static_cast<int>(arg.copy_size) <<
" "
718 << arg.copy_size_address <<
" " << arg.cd_start_address <<
" " << arg.cd_start_address;
720 [&](
auto) { os <<
"Unknown instruction"; },
::FuzzInstruction FuzzInstruction
bb::avm2::MemoryTag MemoryTag
std::ostream & operator<<(std::ostream &os, const MemoryTag &tag)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
std::string to_string(bb::avm2::ValueTag tag)
mem[result_offset] = mem[a_address] + mem[b_address] (16-bit)
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] + mem[b_address]
MSGPACK_FIELDS(a_address, b_address, result_address)
ResultAddressRef result_address
mem[result_offset] = mem[a_address] & mem[b_address] (16-bit)
MSGPACK_FIELDS(a_address, b_address, result_address)
ResultAddressRef result_address
mem[result_offset] = mem[a_address] & mem[b_address]
MSGPACK_FIELDS(a_address, b_address, result_address)
ResultAddressRef result_address
uint32_t index
Index of the address in the memory_manager.stored_variables map.
uint32_t base_offset
Base offset Used for Relative/IndirectRelative modes only Sets M[0] = base_offset.
AddressingModeWrapper mode
uint16_t pointer_address
Index of the pointer in the memory_manager.stored_variables map Used for Indirect/IndirectRelative mo...
MSGPACK_FIELDS(tag, index, pointer_address, base_offset, mode)
Wrapper for AddressingMode to allow for msgpack packing and unpacking.
AddressingModeWrapper()=default
void msgpack_unpack(msgpack::object const &o)
void msgpack_pack(auto &packer) const
AddressingModeWrapper(AddressingMode v)
CALLDATACOPY: M[dstOffset:dstOffset+M[copySizeOffset]] = calldata[M[cdStartOffset]:M[cdStartOffset]+M...
ResultAddressRef dst_address
ResultAddressRef cd_start_address
ResultAddressRef copy_size_address
MSGPACK_FIELDS(dst_address, copy_size, copy_size_address, cd_start, cd_start_address)
CAST_16: cast mem[src_offset_index] to target_tag and store at dst_offset.
MSGPACK_FIELDS(src_tag, src_address, result_address, target_tag)
MemoryTagWrapper target_tag
ResultAddressRef result_address
CAST_8: cast mem[src_offset_index] to target_tag and store at dst_offset.
MSGPACK_FIELDS(src_tag, src_address, result_address, target_tag)
MemoryTagWrapper target_tag
ResultAddressRef result_address
mem[result_offset] = mem[a_address] / mem[b_address] (16-bit)
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] / mem[b_address]
MSGPACK_FIELDS(a_address, b_address, result_address)
ResultAddressRef result_address
EMITNOTEHASH: M[note_hash_offset] = note_hash; emit note hash to the note hash tree.
MSGPACK_FIELDS(note_hash_address, note_hash)
ResultAddressRef note_hash_address
EMITNULIFIER: inserts new nullifier to the nullifier tree.
MSGPACK_FIELDS(nullifier_address)
AddressRef nullifier_address
mem[result_offset] = mem[a_address] == mem[b_address] (16-bit)
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] == mem[b_address]
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
MSGPACK_FIELDS(a_address, b_address, result_address)
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
ResultAddressRef result_address
GETENVVAR: M[result_offset] = getenvvar(type)
ResultAddressRef result_address
MSGPACK_FIELDS(result_address, type)
mem[result_offset] = mem[a_address] < mem[b_address] (16-bit)
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] < mem[b_address]
MSGPACK_FIELDS(a_address, b_address, result_address)
ResultAddressRef result_address
mem[result_offset] = mem[a_address] <= mem[b_address] (16-bit)
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] <= mem[b_address]
MSGPACK_FIELDS(a_address, b_address, result_address)
ResultAddressRef result_address
MOV_16 instruction: mem[dst_offset] = mem[src_offset].
ResultAddressRef result_address
MemoryTagWrapper value_tag
MSGPACK_FIELDS(value_tag, src_address, result_address)
MOV_8 instruction: mem[dst_offset] = mem[src_offset].
MemoryTagWrapper value_tag
MSGPACK_FIELDS(value_tag, src_address, result_address)
ResultAddressRef result_address
mem[result_offset] = mem[a_address] * mem[b_address] (16-bit)
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] * mem[b_address]
MSGPACK_FIELDS(a_address, b_address, result_address)
ResultAddressRef result_address
Wrapper for MemoryTag to allow for msgpack packing and unpacking.
MemoryTagWrapper(MemoryTag v)
MemoryTagWrapper()=default
void msgpack_pack(auto &packer) const
void msgpack_unpack(msgpack::object const &o)
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, result_address)
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, result_address)
NOTEHASHEXISTS: M[result_offset] = NOTEHASHEXISTS(M[notehash_offset], M[leaf_index_offset]) len = len...
ResultAddressRef leaf_index_address
ResultAddressRef result_address
MSGPACK_FIELDS(notehash_index, notehash_address, leaf_index_address, result_address)
ResultAddressRef notehash_address
NULLIFIEREXISTS: checks if nullifier exists in the nullifier tree Gets contract's address by GETENVVA...
ResultAddressRef result_address
ResultAddressRef contract_address_address
AddressRef nullifier_address
MSGPACK_FIELDS(nullifier_address, contract_address_address, result_address)
mem[result_offset] = mem[a_address] | mem[b_address] (16-bit)
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] | mem[b_address]
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
MSGPACK_FIELDS(address, pointer_address, base_offset, mode)
AddressingModeWrapper mode
uint32_t base_offset
Base offset used for Relative/IndirectRelative modes only.
uint16_t pointer_address
Pointer address used for Indirect/IndirectRelative modes only.
MSGPACK_FIELDS(value_tag, result_address, value_low, value_high)
MemoryTagWrapper value_tag
ResultAddressRef result_address
ResultAddressRef result_address
MSGPACK_FIELDS(value_tag, result_address, value)
MemoryTagWrapper value_tag
MSGPACK_FIELDS(value_tag, result_address, value)
ResultAddressRef result_address
MemoryTagWrapper value_tag
MSGPACK_FIELDS(value_tag, result_address, value)
MemoryTagWrapper value_tag
ResultAddressRef result_address
MemoryTagWrapper value_tag
MSGPACK_FIELDS(value_tag, result_address, value)
ResultAddressRef result_address
MSGPACK_FIELDS(value_tag, result_address, value)
MemoryTagWrapper value_tag
ResultAddressRef result_address
mem[result_offset] = mem[a_address] << mem[b_address] (16-bit)
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] << mem[b_address]
MSGPACK_FIELDS(a_address, b_address, result_address)
ResultAddressRef result_address
mem[result_offset] = mem[a_address] >> mem[b_address] (16-bit)
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] >> mem[b_address]
MSGPACK_FIELDS(a_address, b_address, result_address)
ResultAddressRef result_address
SLOAD: M[slot_offset] = slot; M[result_offset] = S[M[slotOffset]].
ResultAddressRef result_address
MSGPACK_FIELDS(slot_index, slot_address, result_address)
ResultAddressRef slot_address
SSTORE: M[slot_offset_index] = slot; S[M[slotOffset]] = M[srcOffset].
ResultAddressRef result_address
MSGPACK_FIELDS(src_address, result_address, slot)
mem[result_offset] = mem[a_address] - mem[b_address] (16-bit)
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] - mem[b_address]
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] ^ mem[b_address] (16-bit)
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] ^ mem[b_address]
MemoryTagWrapper argument_tag
ResultAddressRef result_address
MSGPACK_FIELDS(argument_tag, a_address, b_address, result_address)