Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions crates/cli/src/meta/magic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ pub enum KnownMagic {
/// Dotrain source code meta v1
DotrainSourceV1 = 0xffa15ef0fc437099,
/// Dotrain instance meta v1
DotrainGuiStateV1 = 0xffda7b2fb167c286,
OrderBuilderStateV1 = 0xffda7b2fb167c286,
Comment on lines 42 to +43
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial

Stale doc comment: still says "Dotrain instance meta v1".

The doc comment should be updated to reflect the new name, e.g., "Order builder state meta v1".

📝 Proposed fix
-    /// Dotrain instance meta v1
+    /// Order builder state meta v1
     OrderBuilderStateV1 = 0xffda7b2fb167c286,
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
/// Dotrain instance meta v1
DotrainGuiStateV1 = 0xffda7b2fb167c286,
OrderBuilderStateV1 = 0xffda7b2fb167c286,
/// Order builder state meta v1
OrderBuilderStateV1 = 0xffda7b2fb167c286,
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@crates/cli/src/meta/magic.rs` around lines 42 - 43, Update the stale doc
comment on the OrderBuilderStateV1 variant: replace "Dotrain instance meta v1"
with a correct description such as "Order builder state meta v1" so the
documentation matches the enum variant OrderBuilderStateV1 and its purpose.

}

impl KnownMagic {
Expand Down Expand Up @@ -70,7 +70,7 @@ impl TryFrom<u64> for KnownMagic {
}
v if v == KnownMagic::RainlangSourceV1 as u64 => Ok(KnownMagic::RainlangSourceV1),
v if v == KnownMagic::DotrainSourceV1 as u64 => Ok(KnownMagic::DotrainSourceV1),
v if v == KnownMagic::DotrainGuiStateV1 as u64 => Ok(KnownMagic::DotrainGuiStateV1),
v if v == KnownMagic::OrderBuilderStateV1 as u64 => Ok(KnownMagic::OrderBuilderStateV1),
_ => Err(crate::error::Error::UnknownMagic),
}
}
Expand Down Expand Up @@ -171,7 +171,7 @@ mod tests {

#[test]
fn test_dotrain_instance_meta_v1() {
let magic_number = KnownMagic::DotrainGuiStateV1;
let magic_number = KnownMagic::OrderBuilderStateV1;
let magic_number_after_prefix = magic_number.to_prefix_bytes();

assert_eq!(hex::encode(magic_number_after_prefix), "ffda7b2fb167c286");
Expand Down
6 changes: 3 additions & 3 deletions crates/cli/src/meta/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ pub enum KnownMeta {
RainlangSourceV1,
AddressList,
DotrainSourceV1,
DotrainGuiStateV1,
OrderBuilderStateV1,
}

impl TryFrom<KnownMagic> for KnownMeta {
Expand All @@ -53,7 +53,7 @@ impl TryFrom<KnownMagic> for KnownMeta {
KnownMagic::AddressList => Ok(KnownMeta::AddressList),
KnownMagic::InterpreterCallerMetaV1 => Ok(KnownMeta::InterpreterCallerMetaV1),
KnownMagic::DotrainSourceV1 => Ok(KnownMeta::DotrainSourceV1),
KnownMagic::DotrainGuiStateV1 => Ok(KnownMeta::DotrainGuiStateV1),
KnownMagic::OrderBuilderStateV1 => Ok(KnownMeta::OrderBuilderStateV1),
KnownMagic::ExpressionDeployerV2BytecodeV1 => {
Ok(KnownMeta::ExpressionDeployerV2BytecodeV1)
}
Expand Down Expand Up @@ -287,7 +287,7 @@ impl RainMetaDocumentV1Item {
| KnownMagic::InterpreterCallerMetaV1
| KnownMagic::ExpressionDeployerV2BytecodeV1
| KnownMagic::DotrainSourceV1
| KnownMagic::DotrainGuiStateV1
| KnownMagic::OrderBuilderStateV1
| KnownMagic::RainlangSourceV1 => T::try_from(self),
_ => Err(Error::UnsupportedMeta)?,
}
Expand Down
2 changes: 1 addition & 1 deletion crates/cli/src/meta/types/dotrain/mod.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/// Dotrain meta V1 implementations
pub mod v1;
pub mod source_v1;
pub mod gui_state_v1;
pub mod order_builder_state_v1;
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ impl_wasm_traits!(ShortenedTokenCfg);
/// for a deployed order referencing a dotrain template
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[cfg_attr(target_family = "wasm", derive(Tsify))]
pub struct DotrainGuiStateV1 {
pub struct OrderBuilderStateV1 {
/// Hash of the original dotrain template in Metaboard
#[cfg_attr(target_family = "wasm", tsify(type = "`0x${string}`"))]
pub dotrain_hash: B256,
Expand All @@ -57,9 +57,9 @@ pub struct DotrainGuiStateV1 {
pub selected_deployment: String,
}
#[cfg(target_family = "wasm")]
impl_wasm_traits!(DotrainGuiStateV1);
impl_wasm_traits!(OrderBuilderStateV1);

impl DotrainGuiStateV1 {
impl OrderBuilderStateV1 {
/// Get the template hash
pub fn dotrain_hash(&self) -> B256 {
self.dotrain_hash
Expand All @@ -81,69 +81,70 @@ impl DotrainGuiStateV1 {
.collect()
}

/// Extract DotrainGuiStateV1 from raw meta bytes
/// Extract OrderBuilderStateV1 from raw meta bytes
///
/// This function attempts to decode CBOR data and find a DotrainGuiStateV1 document
/// This function attempts to decode CBOR data and find a OrderBuilderStateV1 document
/// among potentially multiple metadata items.
///
/// Returns:
/// - Ok(Some(DotrainGuiStateV1)) if found and successfully parsed
/// - Ok(None) if no DotrainGuiStateV1 document found in the meta bytes
/// - Ok(Some(OrderBuilderStateV1)) if found and successfully parsed
/// - Ok(None) if no OrderBuilderStateV1 document found in the meta bytes
/// - Err(Error) if there are parsing/decoding errors
pub fn extract_from_meta(meta_bytes: &[u8]) -> Result<Option<Self>, Error> {
// Try to decode CBOR data
let decoded_items = RainMetaDocumentV1Item::cbor_decode(meta_bytes)?;

// Look for DotrainGuiStateV1 among the decoded items
// Look for OrderBuilderStateV1 among the decoded items
for item in decoded_items {
if item.magic == KnownMagic::RainMetaDocumentV1 {
if let Some(instance) = DotrainGuiStateV1::extract_from_meta(item.payload.as_ref())?
if let Some(instance) =
OrderBuilderStateV1::extract_from_meta(item.payload.as_ref())?
{
return Ok(Some(instance));
}
}
if item.magic == KnownMagic::DotrainGuiStateV1 {
let instance = DotrainGuiStateV1::try_from(item)?;
if item.magic == KnownMagic::OrderBuilderStateV1 {
let instance = OrderBuilderStateV1::try_from(item)?;
return Ok(Some(instance));
}
}

// No DotrainGuiStateV1 found
// No OrderBuilderStateV1 found
Ok(None)
}
}

impl TryFrom<DotrainGuiStateV1> for RainMetaDocumentV1Item {
impl TryFrom<OrderBuilderStateV1> for RainMetaDocumentV1Item {
type Error = Error;

fn try_from(value: DotrainGuiStateV1) -> Result<Self, Self::Error> {
fn try_from(value: OrderBuilderStateV1) -> Result<Self, Self::Error> {
// Serialize the struct to CBOR bytes
let cbor_bytes = serde_cbor::to_vec(&value).map_err(Error::SerdeCborError)?;

Ok(RainMetaDocumentV1Item {
payload: serde_bytes::ByteBuf::from(cbor_bytes),
magic: KnownMagic::DotrainGuiStateV1,
magic: KnownMagic::OrderBuilderStateV1,
content_type: ContentType::OctetStream,
content_encoding: ContentEncoding::None,
content_language: ContentLanguage::None,
})
}
}

impl TryFrom<RainMetaDocumentV1Item> for DotrainGuiStateV1 {
impl TryFrom<RainMetaDocumentV1Item> for OrderBuilderStateV1 {
type Error = Error;

fn try_from(value: RainMetaDocumentV1Item) -> Result<Self, Error> {
// Check magic type
if value.magic != KnownMagic::DotrainGuiStateV1 {
if value.magic != KnownMagic::OrderBuilderStateV1 {
return Err(Error::InvalidMetaMagic(
KnownMagic::DotrainGuiStateV1,
KnownMagic::OrderBuilderStateV1,
value.magic,
));
}

// Deserialize CBOR from payload
let instance = serde_cbor::from_slice::<DotrainGuiStateV1>(&value.payload)
let instance = serde_cbor::from_slice::<OrderBuilderStateV1>(&value.payload)
.map_err(Error::SerdeCborError)?;

Ok(instance)
Expand All @@ -157,7 +158,7 @@ mod tests {
use crate::meta::KnownMagic;
use crate::meta::types::dotrain::source_v1::DotrainSourceV1;

fn create_test_instance() -> DotrainGuiStateV1 {
fn create_test_instance() -> OrderBuilderStateV1 {
let field_values = BTreeMap::from([(
"amount".to_string(),
ValueCfg {
Expand All @@ -180,7 +181,7 @@ mod tests {
("output-0".to_string(), None),
]);

DotrainGuiStateV1 {
OrderBuilderStateV1 {
dotrain_hash: B256::from([0x12; 32]),
field_values,
deposits: BTreeMap::new(),
Expand Down Expand Up @@ -211,14 +212,14 @@ mod tests {
let instance = create_test_instance();
let document_item: RainMetaDocumentV1Item = instance.clone().try_into().unwrap();

assert_eq!(document_item.magic, KnownMagic::DotrainGuiStateV1);
assert_eq!(document_item.magic, KnownMagic::OrderBuilderStateV1);
assert_eq!(document_item.content_type, ContentType::OctetStream);
assert_eq!(document_item.content_encoding, ContentEncoding::None);
assert_eq!(document_item.content_language, ContentLanguage::None);

// Verify payload contains valid CBOR that can be deserialized back
let deserialized_instance =
serde_cbor::from_slice::<DotrainGuiStateV1>(&document_item.payload).unwrap();
serde_cbor::from_slice::<OrderBuilderStateV1>(&document_item.payload).unwrap();
assert_eq!(deserialized_instance, instance);
}

Expand All @@ -229,13 +230,13 @@ mod tests {

let document_item = RainMetaDocumentV1Item {
payload: serde_bytes::ByteBuf::from(cbor_bytes),
magic: KnownMagic::DotrainGuiStateV1,
magic: KnownMagic::OrderBuilderStateV1,
content_type: ContentType::OctetStream,
content_encoding: ContentEncoding::None,
content_language: ContentLanguage::None,
};

let recovered_instance = DotrainGuiStateV1::try_from(document_item).unwrap();
let recovered_instance = OrderBuilderStateV1::try_from(document_item).unwrap();
assert_eq!(recovered_instance, instance);
}

Expand All @@ -252,11 +253,11 @@ mod tests {
content_language: ContentLanguage::None,
};

let result = DotrainGuiStateV1::try_from(document_item);
let result = OrderBuilderStateV1::try_from(document_item);
assert!(result.is_err());
match result.unwrap_err() {
Error::InvalidMetaMagic(expected, actual) => {
assert_eq!(expected, KnownMagic::DotrainGuiStateV1);
assert_eq!(expected, KnownMagic::OrderBuilderStateV1);
assert_eq!(actual, KnownMagic::DotrainSourceV1);
}
_ => panic!("Expected InvalidMetaMagic error"),
Expand All @@ -268,13 +269,13 @@ mod tests {
let invalid_cbor = b"{ invalid cbor }";
let document_item = RainMetaDocumentV1Item {
payload: serde_bytes::ByteBuf::from(invalid_cbor.to_vec()),
magic: KnownMagic::DotrainGuiStateV1,
magic: KnownMagic::OrderBuilderStateV1,
content_type: ContentType::OctetStream,
content_encoding: ContentEncoding::None,
content_language: ContentLanguage::None,
};

let result = DotrainGuiStateV1::try_from(document_item);
let result = OrderBuilderStateV1::try_from(document_item);
assert!(result.is_err());
match result.unwrap_err() {
Error::SerdeCborError(_) => {} // Expected
Expand All @@ -286,9 +287,9 @@ mod tests {
fn test_conversion_roundtrip() {
let original_instance = create_test_instance();

// DotrainGuiStateV1 -> RainMetaDocumentV1Item -> DotrainGuiStateV1
// OrderBuilderStateV1 -> RainMetaDocumentV1Item -> OrderBuilderStateV1
let document_item: RainMetaDocumentV1Item = original_instance.clone().try_into().unwrap();
let recovered_instance = DotrainGuiStateV1::try_from(document_item).unwrap();
let recovered_instance = OrderBuilderStateV1::try_from(document_item).unwrap();

assert_eq!(recovered_instance, original_instance);
}
Expand All @@ -308,8 +309,8 @@ mod tests {
assert_eq!(decoded_items.len(), 1);
let decoded_item = decoded_items.into_iter().next().unwrap();

// Convert back to DotrainGuiStateV1
let decoded_instance = DotrainGuiStateV1::try_from(decoded_item).unwrap();
// Convert back to OrderBuilderStateV1
let decoded_instance = OrderBuilderStateV1::try_from(decoded_item).unwrap();

// Verify roundtrip
assert_eq!(decoded_instance, original_instance);
Expand All @@ -321,7 +322,7 @@ mod tests {
let document_item: RainMetaDocumentV1Item = original_instance.clone().try_into().unwrap();
let cbor_bytes = document_item.cbor_encode().unwrap();

let result = DotrainGuiStateV1::extract_from_meta(&cbor_bytes).unwrap();
let result = OrderBuilderStateV1::extract_from_meta(&cbor_bytes).unwrap();
assert!(result.is_some());
let extracted_instance = result.unwrap();
assert_eq!(extracted_instance, original_instance);
Expand All @@ -334,13 +335,13 @@ mod tests {
let document_item: RainMetaDocumentV1Item = source.into();
let cbor_bytes = document_item.cbor_encode().unwrap();

let result = DotrainGuiStateV1::extract_from_meta(&cbor_bytes).unwrap();
let result = OrderBuilderStateV1::extract_from_meta(&cbor_bytes).unwrap();
assert!(result.is_none());
}

#[test]
fn test_extract_from_meta_multiple_documents() {
// Create multiple documents, only one is DotrainGuiStateV1
// Create multiple documents, only one is OrderBuilderStateV1
let instance = create_test_instance();
let instance_doc: RainMetaDocumentV1Item = instance.clone().try_into().unwrap();
let source = DotrainSourceV1("test code".to_string());
Expand All @@ -352,7 +353,7 @@ mod tests {
RainMetaDocumentV1Item::cbor_encode_seq(&documents, KnownMagic::RainMetaDocumentV1)
.unwrap();

let result = DotrainGuiStateV1::extract_from_meta(&cbor_bytes).unwrap();
let result = OrderBuilderStateV1::extract_from_meta(&cbor_bytes).unwrap();
assert!(result.is_some());
let extracted_instance = result.unwrap();
assert_eq!(extracted_instance, instance);
Expand All @@ -362,7 +363,7 @@ mod tests {
fn test_extract_from_meta_invalid_cbor() {
let invalid_cbor = vec![0xFF, 0xFE, 0xFD, 0xFC];

let result = DotrainGuiStateV1::extract_from_meta(&invalid_cbor);
let result = OrderBuilderStateV1::extract_from_meta(&invalid_cbor);
assert!(result.is_err());
// Should be a CBOR decode error
}
Expand All @@ -371,24 +372,24 @@ mod tests {
fn test_extract_from_meta_empty_data() {
let empty_data = vec![];

let result = DotrainGuiStateV1::extract_from_meta(&empty_data);
let result = OrderBuilderStateV1::extract_from_meta(&empty_data);
assert!(result.is_err());
// Should be a CBOR decode error for empty data
}

#[test]
fn test_extract_from_meta_corrupted_instance_data() {
// Create a document with DotrainGuiStateV1 magic but invalid CBOR payload
// Create a document with OrderBuilderStateV1 magic but invalid CBOR payload
let corrupted_doc = RainMetaDocumentV1Item {
payload: serde_bytes::ByteBuf::from("{ corrupted cbor }"),
magic: KnownMagic::DotrainGuiStateV1,
magic: KnownMagic::OrderBuilderStateV1,
content_type: ContentType::OctetStream,
content_encoding: ContentEncoding::None,
content_language: ContentLanguage::None,
};
let cbor_bytes = corrupted_doc.cbor_encode().unwrap();

let result = DotrainGuiStateV1::extract_from_meta(&cbor_bytes);
let result = OrderBuilderStateV1::extract_from_meta(&cbor_bytes);
assert!(result.is_err());
// Should be a CBOR deserialization error
match result.unwrap_err() {
Expand Down