From 779125dc32f8250e7d4f0867862e5518cfe33d7a Mon Sep 17 00:00:00 2001 From: Nasr Date: Thu, 25 Sep 2025 18:01:04 -0400 Subject: [PATCH 1/3] feat(schema): support legacy & non legacy ser --- crates/dojo/types/src/schema.rs | 56 +++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/crates/dojo/types/src/schema.rs b/crates/dojo/types/src/schema.rs index f38564f75a..7811b93ebd 100644 --- a/crates/dojo/types/src/schema.rs +++ b/crates/dojo/types/src/schema.rs @@ -21,8 +21,8 @@ pub struct Member { } impl Member { - pub fn serialize(&self) -> Result, PrimitiveError> { - self.ty.serialize() + pub fn serialize(&self, legacy_storage: bool) -> Result, PrimitiveError> { + self.ty.serialize(legacy_storage) } } @@ -139,52 +139,60 @@ impl Ty { } } - pub fn serialize(&self) -> Result, PrimitiveError> { + pub fn serialize(&self, legacy_storage: bool) -> Result, PrimitiveError> { let mut felts = vec![]; - fn serialize_inner(ty: &Ty, felts: &mut Vec) -> Result<(), PrimitiveError> { + fn serialize_inner(ty: &Ty, felts: &mut Vec, legacy_storage: bool) -> Result<(), PrimitiveError> { match ty { Ty::Primitive(c) => { felts.extend(c.serialize()?); } Ty::Struct(s) => { for child in &s.children { - serialize_inner(&child.ty, felts)?; + serialize_inner(&child.ty, felts, legacy_storage)?; } } Ty::Enum(e) => { - let option = e - .option - .map(|v| Ok(vec![Felt::from(v)])) - .unwrap_or(Err(PrimitiveError::MissingFieldElement))?; - felts.extend(option); - - // TODO: we should increment `option` is the model does not use the legacy - // storage system. But is this `serialize` function still - // used ? - - for EnumOption { ty, .. } in &e.options { - serialize_inner(ty, felts)?; + if let Some(option) = e.option { + // For new storage system, enum variant indices start from 1 + let serialized_option = if legacy_storage { + option + } else { + option + 1 + }; + felts.push(Felt::from(serialized_option)); + + // Only serialize the selected option + if let Some(selected_option) = e.options.get(option as usize) { + serialize_inner(&selected_option.ty, felts, legacy_storage)?; + } + } else { + // For uninitialized enum in new storage system, use 0 + if !legacy_storage { + felts.push(Felt::from(0u8)); + } else { + return Err(PrimitiveError::MissingFieldElement); + } } } Ty::Tuple(tys) => { for ty in tys { - serialize_inner(ty, felts)?; + serialize_inner(ty, felts, legacy_storage)?; } } Ty::Array(items_ty) => { let _ = serialize_inner( &Ty::Primitive(Primitive::U32(Some(items_ty.len().try_into().unwrap()))), felts, + legacy_storage, ); for item_ty in items_ty { - serialize_inner(item_ty, felts)?; + serialize_inner(item_ty, felts, legacy_storage)?; } } - Ty::FixedSizeArray((items_ty, size)) => { - let item_ty = &items_ty[0]; - for _ in 0..*size { - serialize_inner(item_ty, felts)?; + Ty::FixedSizeArray((items_ty, _size)) => { + for elem in items_ty { + serialize_inner(elem, felts, legacy_storage)?; } } Ty::ByteArray(bytes) => { @@ -196,7 +204,7 @@ impl Ty { Ok(()) } - serialize_inner(self, &mut felts)?; + serialize_inner(self, &mut felts, legacy_storage)?; Ok(felts) } From 00f214d66422feb4b5b5c9aa44959ba9c0d42af8 Mon Sep 17 00:00:00 2001 From: Nasr Date: Thu, 25 Sep 2025 18:09:02 -0400 Subject: [PATCH 2/3] avoid u8 overflow --- crates/dojo/types/src/schema.rs | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/crates/dojo/types/src/schema.rs b/crates/dojo/types/src/schema.rs index 7811b93ebd..8277b11b2e 100644 --- a/crates/dojo/types/src/schema.rs +++ b/crates/dojo/types/src/schema.rs @@ -142,7 +142,11 @@ impl Ty { pub fn serialize(&self, legacy_storage: bool) -> Result, PrimitiveError> { let mut felts = vec![]; - fn serialize_inner(ty: &Ty, felts: &mut Vec, legacy_storage: bool) -> Result<(), PrimitiveError> { + fn serialize_inner( + ty: &Ty, + felts: &mut Vec, + legacy_storage: bool, + ) -> Result<(), PrimitiveError> { match ty { Ty::Primitive(c) => { felts.extend(c.serialize()?); @@ -155,13 +159,12 @@ impl Ty { Ty::Enum(e) => { if let Some(option) = e.option { // For new storage system, enum variant indices start from 1 - let serialized_option = if legacy_storage { - option - } else { - option + 1 - }; - felts.push(Felt::from(serialized_option)); - + let mut serialized_option = Felt::from(option); + if !legacy_storage { + serialized_option += Felt::ONE; + } + felts.push(serialized_option); + // Only serialize the selected option if let Some(selected_option) = e.options.get(option as usize) { serialize_inner(&selected_option.ty, felts, legacy_storage)?; @@ -169,7 +172,7 @@ impl Ty { } else { // For uninitialized enum in new storage system, use 0 if !legacy_storage { - felts.push(Felt::from(0u8)); + felts.push(Felt::ZERO); } else { return Err(PrimitiveError::MissingFieldElement); } From f80751ad6dda41fc9c6c7af2c4033e217bcf8793 Mon Sep 17 00:00:00 2001 From: Nasr Date: Thu, 25 Sep 2025 18:16:38 -0400 Subject: [PATCH 3/3] keys legacy ser --- crates/dojo/types/src/schema.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/dojo/types/src/schema.rs b/crates/dojo/types/src/schema.rs index 8277b11b2e..4772bb10ab 100644 --- a/crates/dojo/types/src/schema.rs +++ b/crates/dojo/types/src/schema.rs @@ -153,7 +153,7 @@ impl Ty { } Ty::Struct(s) => { for child in &s.children { - serialize_inner(&child.ty, felts, legacy_storage)?; + serialize_inner(&child.ty, felts, child.key || legacy_storage)?; } } Ty::Enum(e) => {