Skip to content

Commit da1b422

Browse files
authored
Fix SerializeAsFelt252Vec for Vec (#2093)
<!-- Reference any GitHub issues resolved by this PR --> Closes # ## Introduced changes <!-- A brief description of the changes --> - Fix `SerializeAsFelt252Vec` for `Vec`. There was missing length serialization in `Vec` implementation
1 parent 892a896 commit da1b422

File tree

5 files changed

+63
-16
lines changed

5 files changed

+63
-16
lines changed

crates/cheatnet/src/runtime_extensions/call_to_blockifier_runtime_extension/execution/execution_info.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ use cairo_vm::{
33
types::relocatable::{MaybeRelocatable, Relocatable},
44
vm::vm_core::VirtualMachine,
55
};
6-
use conversions::{felt252::SerializeAsFelt252Vec, FromConv, IntoConv};
6+
use conversions::{
7+
felt252::{RawFeltVec, SerializeAsFelt252Vec},
8+
FromConv, IntoConv,
9+
};
710

811
use crate::{
912
runtime_extensions::forge_runtime_extension::cheatcodes::spoof::TxInfoMock, state::CheatedData,
@@ -90,8 +93,10 @@ fn get_cheated_tx_info_ptr(
9093
new_tx_info[7] = MaybeRelocatable::Int(nonce);
9194
};
9295
if let Some(resource_bounds) = resource_bounds {
93-
let (resource_bounds_start_ptr, resource_bounds_end_ptr) =
94-
add_vec_memory_segment(&resource_bounds.serialize_as_felt252_vec(), vm);
96+
let (resource_bounds_start_ptr, resource_bounds_end_ptr) = add_vec_memory_segment(
97+
&RawFeltVec::new(resource_bounds).serialize_as_felt252_vec(),
98+
vm,
99+
);
95100
new_tx_info[8] = resource_bounds_start_ptr.into();
96101
new_tx_info[9] = resource_bounds_end_ptr.into();
97102
}

crates/conversions/src/felt252.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,11 +129,42 @@ pub trait SerializeAsFelt252Vec: Sized {
129129
}
130130
}
131131

132+
/// use this wrapper to NOT add extra length felt
133+
/// useful e.g. when you need to pass an already serialized value
134+
pub struct RawFeltVec<T>(Vec<T>)
135+
where
136+
T: SerializeAsFelt252Vec;
137+
138+
impl<T> RawFeltVec<T>
139+
where
140+
T: SerializeAsFelt252Vec,
141+
{
142+
#[must_use]
143+
pub fn new(vec: Vec<T>) -> Self {
144+
Self(vec)
145+
}
146+
}
147+
148+
impl<T> SerializeAsFelt252Vec for RawFeltVec<T>
149+
where
150+
T: SerializeAsFelt252Vec,
151+
{
152+
fn serialize_into_felt252_vec(self, output: &mut Vec<Felt252>) {
153+
for e in self.0 {
154+
e.serialize_into_felt252_vec(output);
155+
}
156+
}
157+
}
158+
132159
impl<T> SerializeAsFelt252Vec for Vec<T>
133160
where
134161
T: SerializeAsFelt252Vec,
135162
{
136163
fn serialize_into_felt252_vec(self, output: &mut Vec<Felt252>) {
164+
let len: Felt252 = self.len().into();
165+
166+
len.serialize_into_felt252_vec(output);
167+
137168
for e in self {
138169
e.serialize_into_felt252_vec(output);
139170
}

crates/runtime/src/lib.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use cairo_vm::vm::errors::vm_errors::VirtualMachineError;
2424
use cairo_vm::vm::runners::cairo_runner::{ResourceTracker, RunResources};
2525
use cairo_vm::vm::vm_core::VirtualMachine;
2626
use conversions::byte_array::ByteArray;
27-
use conversions::felt252::SerializeAsFelt252Vec;
27+
use conversions::felt252::{RawFeltVec, SerializeAsFelt252Vec};
2828
pub use runtime_macros::FromReader;
2929
use starknet_api::StarknetApiError;
3030
use std::any::Any;
@@ -266,8 +266,9 @@ impl<Extension: ExtensionLogic> ExtendedRuntime<Extension> {
266266
);
267267
return res;
268268
}
269-
Ok(CheatcodeHandlingResult::Handled(res)) => Ok(res),
270-
Err(err) => Err(ByteArray::from(err.to_string().as_str()).serialize_no_magic()),
269+
// it is serialized again to add `Result` discriminator
270+
Ok(CheatcodeHandlingResult::Handled(res)) => Ok(RawFeltVec::new(res)),
271+
Err(err) => Err(ByteArray::from(err.to_string().as_str())),
271272
}
272273
.serialize_as_felt252_vec();
273274

crates/sncast/src/response/structs.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use cairo_felt::Felt252;
22
use camino::Utf8PathBuf;
3-
use conversions::felt252::SerializeAsFelt252Vec;
43
use conversions::FromConv;
4+
use conversions::{felt252::SerializeAsFelt252Vec, IntoConv};
55
use serde::{Deserialize, Serialize, Serializer};
66
use starknet::core::types::FieldElement;
77

@@ -10,6 +10,12 @@ pub struct Decimal(pub u64);
1010
#[derive(Clone, Debug, Deserialize, PartialEq)]
1111
pub struct Felt(pub FieldElement);
1212

13+
impl FromConv<Felt> for Felt252 {
14+
fn from_(value: Felt) -> Self {
15+
value.0.into_()
16+
}
17+
}
18+
1319
impl Serialize for Decimal {
1420
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1521
where
@@ -47,8 +53,7 @@ impl CommandResponse for CallResponse {}
4753

4854
impl SerializeAsFelt252Vec for CallResponse {
4955
fn serialize_into_felt252_vec(self, output: &mut Vec<Felt252>) {
50-
output.push(Felt252::from(self.response.len()));
51-
output.extend(self.response.iter().map(|el| Felt252::from_(el.0)));
56+
self.response.serialize_into_felt252_vec(output);
5257
}
5358
}
5459

@@ -60,7 +65,7 @@ impl CommandResponse for InvokeResponse {}
6065

6166
impl SerializeAsFelt252Vec for InvokeResponse {
6267
fn serialize_into_felt252_vec(self, output: &mut Vec<Felt252>) {
63-
output.push(Felt252::from_(self.transaction_hash.0));
68+
self.transaction_hash.serialize_into_felt252_vec(output);
6469
}
6570
}
6671

crates/sncast/src/state/state_file.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -204,15 +204,20 @@ impl From<DeployResponse> for ScriptTransactionOutput {
204204

205205
#[must_use]
206206
pub fn serialize_as_script_function_result(output: ScriptTransactionOutput) -> Vec<Felt252> {
207-
let res = match output {
208-
ScriptTransactionOutput::InvokeResponse(val) => val.serialize_as_felt252_vec(),
209-
ScriptTransactionOutput::DeclareResponse(val) => val.serialize_as_felt252_vec(),
210-
ScriptTransactionOutput::DeployResponse(val) => val.serialize_as_felt252_vec(),
207+
match output {
208+
ScriptTransactionOutput::InvokeResponse(val) => {
209+
Ok::<_, StarknetCommandError>(val).serialize_as_felt252_vec()
210+
}
211+
ScriptTransactionOutput::DeclareResponse(val) => {
212+
Ok::<_, StarknetCommandError>(val).serialize_as_felt252_vec()
213+
}
214+
ScriptTransactionOutput::DeployResponse(val) => {
215+
Ok::<_, StarknetCommandError>(val).serialize_as_felt252_vec()
216+
}
211217
ScriptTransactionOutput::ErrorResponse(_) => {
212218
panic!("Cannot return ErrorResponse as script function response")
213219
}
214-
};
215-
Ok::<Vec<Felt252>, StarknetCommandError>(res).serialize_as_felt252_vec()
220+
}
216221
}
217222

218223
#[derive(Clone, Deserialize, Serialize, Debug, PartialEq)]

0 commit comments

Comments
 (0)