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");
699 using Ts::operator()...;
725 std::visit([&](
auto&& arg) { os << arg; }, param);
734 os <<
"ADD_8_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
737 os <<
"SET_8_Instruction " << arg.value_tag <<
" " << arg.result_address <<
" " << arg.value;
740 os <<
"SET_16_Instruction " << arg.value_tag <<
" " << arg.result_address <<
" " << arg.value;
743 os <<
"SET_32_Instruction " << arg.value_tag <<
" " << arg.result_address <<
" " << arg.value;
746 os <<
"SET_64_Instruction " << arg.value_tag <<
" " << arg.result_address <<
" " << arg.value;
749 os <<
"SET_128_Instruction " << arg.value_tag <<
" " << arg.result_address <<
" " << arg.value_high
750 <<
" " << arg.value_low;
753 os <<
"SET_FF_Instruction " << arg.value_tag <<
" " << arg.result_address <<
" " << arg.value;
756 os <<
"SUB_8_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
759 os <<
"MUL_8_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
762 os <<
"DIV_8_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
765 os <<
"FDIV_8_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
768 os <<
"EQ_8_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
771 os <<
"LT_8_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
774 os <<
"LTE_8_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
777 os <<
"AND_8_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
780 os <<
"OR_8_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
783 os <<
"XOR_8_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
786 os <<
"SHL_8_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
789 os <<
"SHR_8_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
791 [&](
NOT_8_Instruction arg) { os <<
"NOT_8_Instruction " << arg.a_address <<
" " << arg.result_address; },
793 os <<
"ADD_16_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
796 os <<
"SUB_16_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
799 os <<
"MUL_16_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
802 os <<
"DIV_16_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
805 os <<
"FDIV_16_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
808 os <<
"EQ_16_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
811 os <<
"LT_16_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
814 os <<
"LTE_16_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
817 os <<
"AND_16_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
820 os <<
"OR_16_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
823 os <<
"XOR_16_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
825 [&](
NOT_16_Instruction arg) { os <<
"NOT_16_Instruction " << arg.a_address <<
" " << arg.result_address; },
827 os <<
"SHL_16_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
830 os <<
"SHR_16_Instruction " << arg.a_address <<
" " << arg.b_address <<
" " << arg.result_address;
833 os <<
"CAST_8_Instruction " << arg.src_tag <<
" " << arg.src_address <<
" " << arg.result_address <<
" "
837 os <<
"CAST_16_Instruction " << arg.src_tag <<
" " << arg.src_address <<
" " << arg.result_address
838 <<
" " << arg.target_tag;
841 os <<
"MOV_8_Instruction " << arg.value_tag <<
" " << arg.src_address <<
" " << arg.result_address;
844 os <<
"MOV_16_Instruction " << arg.value_tag <<
" " << arg.src_address <<
" " << arg.result_address;
847 os <<
"SSTORE_Instruction " << arg.src_address <<
" " << arg.result_address <<
" " << arg.slot;
849 [&](
SLOAD_Instruction arg) { os <<
"SLOAD_Instruction " << arg.slot_address <<
" " << arg.result_address; },
851 os <<
"GETENVVAR_Instruction " << arg.result_address <<
" " <<
static_cast<int>(arg.type);
855 os <<
"NULLIFIEREXISTS_Instruction " << arg.nullifier_address <<
" " << arg.contract_address_address
856 <<
" " << arg.result_address;
859 os <<
"L1TOL2MSGEXISTS_Instruction " << arg.msg_hash_address <<
" " << arg.leaf_index_address <<
" "
860 << arg.result_address;
863 os <<
"EMITNOTEHASH_Instruction " << arg.note_hash_address <<
" " << arg.note_hash;
866 os <<
"NOTEHASHEXISTS_Instruction " << arg.notehash_address <<
" " << arg.notehash_address <<
" "
867 << arg.leaf_index_address <<
" " << arg.result_address;
870 os <<
"CALLDATACOPY_Instruction " << arg.dst_address <<
" " <<
static_cast<int>(arg.copy_size) <<
" "
871 << arg.copy_size_address <<
" " << arg.cd_start_address <<
" " << arg.cd_start_address;
874 os <<
"SENDL2TOL1MSG_Instruction " << arg.recipient <<
" " << arg.recipient_address <<
" "
875 << arg.content <<
" " << arg.content_address;
878 os <<
"EMITUNENCRYPTEDLOG_Instruction " << arg.log_size_address <<
" " << arg.log_values_address;
881 os <<
"CALL_Instruction " << arg.l2_gas_address <<
" " << arg.da_gas_address <<
" "
882 << arg.contract_address_address <<
" " << arg.calldata_size_address <<
" " << arg.calldata_address
883 <<
" " << arg.is_static_call;
886 os <<
"RETURNDATASIZE_WITH_RETURNDATACOPY_Instruction " << arg.copy_size_offset <<
" "
887 << arg.dst_address <<
" " << arg.rd_start_offset;
890 os <<
"ECADD_Instruction " << arg.p1_x <<
" " << arg.p1_y <<
" " << arg.p1_infinite <<
" " << arg.p2_x
891 <<
" " << arg.p2_y <<
" " << arg.p2_infinite <<
" " << arg.result;
894 os <<
"POSEIDON2PERM_Instruction " << arg.src_address <<
" " << arg.dst_address;
897 os <<
"KECCAKF1600_Instruction " << arg.src_address <<
" " << arg.dst_address;
900 os <<
"SHA256COMPRESSION_Instruction " << arg.state_address <<
" " << arg.input_address <<
" "
904 os <<
"TORADIXBE_Instruction " << arg.value_address <<
" " << arg.radix_address <<
" "
905 << arg.num_limbs_address <<
" " << arg.output_bits_address <<
" " << arg.dst_address <<
" "
906 << arg.is_output_bits;
908 [&](
auto) { os <<
"Unknown instruction"; },
::FuzzInstruction FuzzInstruction
std::ostream & operator<<(std::ostream &os, const MemoryTagWrapper &tag)
bb::avm2::MemoryTag MemoryTag
std::variant< VariableRef, AddressRef > ParamRef
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
mem[result_offset] = mem[a_address] + mem[b_address] (16-bit)
AddressRef 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)
AddressRef result_address
mem[result_offset] = mem[a_address] & mem[b_address] (16-bit)
MSGPACK_FIELDS(a_address, b_address, result_address)
AddressRef result_address
mem[result_offset] = mem[a_address] & mem[b_address]
MSGPACK_FIELDS(a_address, b_address, result_address)
AddressRef result_address
MSGPACK_FIELDS(address, pointer_address_seed, base_offset_seed, mode)
AddressingModeWrapper mode
uint32_t base_offset_seed
A seed for the generation of the base offset Used for Relative/IndirectRelative modes only Sets M[0] ...
uint16_t pointer_address_seed
A seed for the generation of the pointer address Used for Indirect/IndirectRelative modes only.
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)
ParamRef contract_address_address
AddressRef calldata_size_address
MSGPACK_FIELDS(l2_gas_address, da_gas_address, contract_address_address, calldata_address, calldata_size_address, calldata_size, is_static_call)
ParamRef calldata_address
CALLDATACOPY: M[dstOffset:dstOffset+M[copySizeOffset]] = calldata[M[cdStartOffset]:M[cdStartOffset]+M...
AddressRef copy_size_address
AddressRef cd_start_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.
AddressRef result_address
MSGPACK_FIELDS(src_tag, src_address, result_address, target_tag)
MemoryTagWrapper target_tag
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)
AddressRef result_address
MemoryTagWrapper target_tag
mem[result_offset] = mem[a_address] / mem[b_address] (16-bit)
AddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] / mem[b_address]
AddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
MSGPACK_FIELDS(p1_x, p1_y, p1_infinite, p2_x, p2_y, p2_infinite, result)
EMITNOTEHASH: M[note_hash_offset] = note_hash; emit note hash to the note hash tree.
AddressRef note_hash_address
MSGPACK_FIELDS(note_hash_address, note_hash)
EMITNULIFIER: inserts new nullifier to the nullifier tree.
MSGPACK_FIELDS(nullifier_address)
ParamRef nullifier_address
MSGPACK_FIELDS(log_size_address, log_values_address)
ParamRef log_size_address
ParamRef log_values_address
mem[result_offset] = mem[a_address] == mem[b_address] (16-bit)
MSGPACK_FIELDS(a_address, b_address, result_address)
AddressRef result_address
mem[result_offset] = mem[a_address] == mem[b_address]
MSGPACK_FIELDS(a_address, b_address, result_address)
AddressRef result_address
AddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
MSGPACK_FIELDS(a_address, b_address, result_address)
AddressRef result_address
ParamRef contract_address_address
MSGPACK_FIELDS(contract_address_address, member_enum, dst_address)
GETENVVAR: M[result_offset] = getenvvar(type)
AddressRef result_address
MSGPACK_FIELDS(result_address, type)
KECCAKF1600: Perform Keccak-f[1600] permutation on 25 U64 values M[dst_address:dst_address+25] = kecc...
MSGPACK_FIELDS(src_address, dst_address)
L1TOL2MSGEXISTS: Check if a L1 to L2 message exists M[result_address] = L1TOL2MSGEXISTS(M[msg_hash_ad...
MSGPACK_FIELDS(msg_hash_address, leaf_index_address, result_address)
AddressRef result_address
ParamRef msg_hash_address
ParamRef leaf_index_address
mem[result_offset] = mem[a_address] < mem[b_address] (16-bit)
AddressRef 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)
AddressRef result_address
mem[result_offset] = mem[a_address] <= mem[b_address] (16-bit)
MSGPACK_FIELDS(a_address, b_address, result_address)
AddressRef result_address
mem[result_offset] = mem[a_address] <= mem[b_address]
AddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
MOV_16 instruction: mem[dst_offset] = mem[src_offset].
MemoryTagWrapper value_tag
MSGPACK_FIELDS(value_tag, src_address, result_address)
AddressRef result_address
MOV_8 instruction: mem[dst_offset] = mem[src_offset].
MemoryTagWrapper value_tag
MSGPACK_FIELDS(value_tag, src_address, result_address)
AddressRef result_address
mem[result_offset] = mem[a_address] * mem[b_address] (16-bit)
MSGPACK_FIELDS(a_address, b_address, result_address)
AddressRef result_address
mem[result_offset] = mem[a_address] * mem[b_address]
AddressRef result_address
MSGPACK_FIELDS(a_address, b_address, 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)
MSGPACK_FIELDS(a_address, result_address)
AddressRef result_address
AddressRef result_address
MSGPACK_FIELDS(a_address, result_address)
NOTEHASHEXISTS: M[result_offset] = NOTEHASHEXISTS(M[notehash_offset], M[leaf_index_offset]) len = len...
AddressRef notehash_address
AddressRef result_address
MSGPACK_FIELDS(notehash_index, notehash_address, leaf_index_address, result_address)
AddressRef leaf_index_address
NULLIFIEREXISTS: checks if nullifier exists in the nullifier tree Gets contract's address by GETENVVA...
ParamRef nullifier_address
AddressRef result_address
AddressRef contract_address_address
MSGPACK_FIELDS(nullifier_address, contract_address_address, result_address)
mem[result_offset] = mem[a_address] | mem[b_address] (16-bit)
AddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] | mem[b_address]
AddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
POSEIDON2PERM: Perform Poseidon2 permutation on 4 FF values M[dst_address:dst_address+4] = poseidon2_...
MSGPACK_FIELDS(src_address, dst_address)
: RETURNDATASIZE + RETURNDATACOPY:
uint16_t copy_size_offset
MSGPACK_FIELDS(copy_size_offset, dst_address, rd_start, rd_start_offset)
Output of resolving an address in the memory manager In order to resolve a given absolute address wit...
std::optional< uint32_t > base_pointer
uint32_t absolute_address
std::optional< uint32_t > pointer_address
AddressRef content_address
AddressRef recipient_address
MSGPACK_FIELDS(recipient, recipient_address, content, content_address)
MSGPACK_FIELDS(value_tag, result_address, value_low, value_high)
MemoryTagWrapper value_tag
AddressRef result_address
AddressRef result_address
MSGPACK_FIELDS(value_tag, result_address, value)
MemoryTagWrapper value_tag
MSGPACK_FIELDS(value_tag, result_address, value)
AddressRef result_address
MemoryTagWrapper value_tag
AddressRef result_address
MSGPACK_FIELDS(value_tag, result_address, value)
MemoryTagWrapper value_tag
MemoryTagWrapper value_tag
MSGPACK_FIELDS(value_tag, result_address, value)
AddressRef result_address
MSGPACK_FIELDS(value_tag, result_address, value)
MemoryTagWrapper value_tag
AddressRef result_address
SHA256COMPRESSION: Perform SHA256 compression M[dst_address:dst_address+8] = sha256_compression(M[sta...
MSGPACK_FIELDS(state_address, input_address, dst_address)
mem[result_offset] = mem[a_address] << mem[b_address] (16-bit)
AddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] << mem[b_address]
AddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] >> mem[b_address] (16-bit)
AddressRef 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)
AddressRef result_address
SLOAD: M[slot_offset] = slot; M[result_offset] = S[M[slotOffset]].
MSGPACK_FIELDS(slot_index, slot_address, result_address)
AddressRef result_address
SSTORE: M[slot_offset_index] = slot; S[M[slotOffset]] = M[srcOffset].
AddressRef result_address
MSGPACK_FIELDS(src_address, result_address, slot)
mem[result_offset] = mem[a_address] - mem[b_address] (16-bit)
AddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] - mem[b_address]
AddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
MSGPACK_FIELDS(dst_address)
TORADIXBE: Convert a field element to a vector of limbs in big-endian radix representation M[dst_addr...
ParamRef num_limbs_address
MSGPACK_FIELDS(value_address, radix_address, num_limbs_address, output_bits_address, dst_address, is_output_bits)
ParamRef output_bits_address
AddressingModeWrapper mode
uint32_t base_offset_seed
A seed for the generation of the base offset Used for Relative/IndirectRelative modes only Sets M[0] ...
uint32_t index
Index of the variable in the memory_manager.stored_variables map.
MSGPACK_FIELDS(tag, index, pointer_address_seed, base_offset_seed, mode)
uint16_t pointer_address_seed
A seed for the generation of the pointer address Used for Indirect/IndirectRelative modes only.
mem[result_offset] = mem[a_address] ^ mem[b_address] (16-bit)
MSGPACK_FIELDS(a_address, b_address, result_address)
AddressRef result_address
mem[result_offset] = mem[a_address] ^ mem[b_address]
MSGPACK_FIELDS(a_address, b_address, result_address)
AddressRef result_address