diff --git a/crates/cheatnet/src/runtime_extensions/call_to_blockifier_runtime_extension/execution/execution_info.rs b/crates/cheatnet/src/runtime_extensions/call_to_blockifier_runtime_extension/execution/execution_info.rs index 0fdef19eaf..112431a629 100644 --- a/crates/cheatnet/src/runtime_extensions/call_to_blockifier_runtime_extension/execution/execution_info.rs +++ b/crates/cheatnet/src/runtime_extensions/call_to_blockifier_runtime_extension/execution/execution_info.rs @@ -3,10 +3,8 @@ use cairo_vm::{ types::relocatable::{MaybeRelocatable, Relocatable}, vm::vm_core::VirtualMachine, }; -use conversions::{ - IntoConv, - serde::serialize::{SerializeToFeltVec, raw::RawFeltVec}, -}; +use conversions::serde::NoLengthFeltVec; +use conversions::{IntoConv, serde::serialize::SerializeToFeltVec}; use starknet_types_core::felt::Felt; fn get_cheated_block_info_ptr( @@ -90,8 +88,10 @@ fn get_cheated_tx_info_ptr( new_tx_info[7] = MaybeRelocatable::Int(nonce); } if let Some(resource_bounds) = resource_bounds { - let (resource_bounds_start_ptr, resource_bounds_end_ptr) = - add_vec_memory_segment(&RawFeltVec::new(resource_bounds).serialize_to_vec(), vm); + let (resource_bounds_start_ptr, resource_bounds_end_ptr) = add_vec_memory_segment( + &NoLengthFeltVec::new(resource_bounds).serialize_to_vec(), + vm, + ); new_tx_info[8] = resource_bounds_start_ptr.into(); new_tx_info[9] = resource_bounds_end_ptr.into(); } diff --git a/crates/conversions/src/serde.rs b/crates/conversions/src/serde.rs index 59bce9522d..aec77aab45 100644 --- a/crates/conversions/src/serde.rs +++ b/crates/conversions/src/serde.rs @@ -1,2 +1,5 @@ pub mod deserialize; +pub mod no_length_felt_vec; pub mod serialize; + +pub use no_length_felt_vec::NoLengthFeltVec; diff --git a/crates/conversions/src/serde/deserialize/deserialize_impl.rs b/crates/conversions/src/serde/deserialize/deserialize_impl.rs index 16a1d8b91a..e590af35c7 100644 --- a/crates/conversions/src/serde/deserialize/deserialize_impl.rs +++ b/crates/conversions/src/serde/deserialize/deserialize_impl.rs @@ -53,6 +53,19 @@ where } } +impl CairoDeserialize for Result { + fn deserialize(reader: &mut BufferReader<'_>) -> BufferReadResult { + let variant: Felt = reader.read()?; + let variant: usize = variant.to_usize().ok_or(BufferReadError::ParseFailed)?; + + match variant { + 0 => Ok(Ok(reader.read()?)), + 1 => Ok(Err(reader.read()?)), + _ => Err(BufferReadError::ParseFailed), + } + } +} + impl CairoDeserialize for bool { fn deserialize(reader: &mut BufferReader<'_>) -> BufferReadResult { let num: usize = reader.read()?; diff --git a/crates/conversions/src/serde/lib.rs b/crates/conversions/src/serde/lib.rs deleted file mode 100644 index 59bce9522d..0000000000 --- a/crates/conversions/src/serde/lib.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod deserialize; -pub mod serialize; diff --git a/crates/conversions/src/serde/no_length_felt_vec.rs b/crates/conversions/src/serde/no_length_felt_vec.rs new file mode 100644 index 0000000000..c4402964e8 --- /dev/null +++ b/crates/conversions/src/serde/no_length_felt_vec.rs @@ -0,0 +1,41 @@ +use conversions::serde::deserialize::{BufferReadResult, BufferReader, CairoDeserialize}; +use conversions::serde::serialize::{BufferWriter, CairoSerialize}; +use starknet_types_core::felt::Felt; + +/// use this wrapper to NOT add extra length felt +/// useful e.g. when you need to pass an already serialized value +#[derive(Debug)] +pub struct NoLengthFeltVec(pub Vec) +where + T: CairoSerialize; + +impl NoLengthFeltVec +where + T: CairoSerialize, +{ + #[must_use] + pub fn new(vec: Vec) -> Self { + Self(vec) + } +} + +impl CairoSerialize for NoLengthFeltVec +where + T: CairoSerialize, +{ + fn serialize(&self, output: &mut BufferWriter) { + for e in &self.0 { + e.serialize(output); + } + } +} + +impl CairoDeserialize for NoLengthFeltVec { + fn deserialize(reader: &mut BufferReader<'_>) -> BufferReadResult { + let mut result: Vec = Vec::new(); + while let Ok(r) = reader.read_felt() { + result.push(r); + } + Ok(Self::new(result)) + } +} diff --git a/crates/conversions/src/serde/serialize.rs b/crates/conversions/src/serde/serialize.rs index 59322be6e9..03f1184b81 100644 --- a/crates/conversions/src/serde/serialize.rs +++ b/crates/conversions/src/serde/serialize.rs @@ -2,7 +2,6 @@ use starknet_types_core::felt::Felt; pub use cairo_serde_macros::CairoSerialize; -pub mod raw; mod serialize_impl; pub struct BufferWriter { diff --git a/crates/conversions/src/serde/serialize/raw.rs b/crates/conversions/src/serde/serialize/raw.rs deleted file mode 100644 index f528da1a2d..0000000000 --- a/crates/conversions/src/serde/serialize/raw.rs +++ /dev/null @@ -1,28 +0,0 @@ -use super::{BufferWriter, CairoSerialize}; - -/// use this wrapper to NOT add extra length felt -/// useful e.g. when you need to pass an already serialized value -pub struct RawFeltVec(pub(crate) Vec) -where - T: CairoSerialize; - -impl RawFeltVec -where - T: CairoSerialize, -{ - #[must_use] - pub fn new(vec: Vec) -> Self { - Self(vec) - } -} - -impl CairoSerialize for RawFeltVec -where - T: CairoSerialize, -{ - fn serialize(&self, output: &mut BufferWriter) { - for e in &self.0 { - e.serialize(output); - } - } -} diff --git a/crates/runtime/src/lib.rs b/crates/runtime/src/lib.rs index 4cd1882906..1080d459ef 100644 --- a/crates/runtime/src/lib.rs +++ b/crates/runtime/src/lib.rs @@ -18,9 +18,9 @@ use cairo_vm::vm::errors::vm_errors::VirtualMachineError; use cairo_vm::vm::runners::cairo_runner::{ResourceTracker, RunResources}; use cairo_vm::vm::vm_core::VirtualMachine; use conversions::byte_array::ByteArray; +use conversions::serde::NoLengthFeltVec; use conversions::serde::deserialize::BufferReadError; use conversions::serde::deserialize::BufferReader; -use conversions::serde::serialize::raw::RawFeltVec; use conversions::serde::serialize::{CairoSerialize, SerializeToFeltVec}; use indoc::indoc; use shared::vm::VirtualMachineExt; @@ -294,7 +294,7 @@ impl ExtendedRuntime { return res; } // it is serialized again to add `Result` discriminator - Ok(CheatcodeHandlingResult::Handled(res)) => Ok(RawFeltVec::new(res)), + Ok(CheatcodeHandlingResult::Handled(res)) => Ok(NoLengthFeltVec::new(res)), Err(err) => Err(ByteArray::from(err.to_string().as_str())), } .serialize_to_vec();