From c6d7017ea05abab202c885390f9d783a35c69166 Mon Sep 17 00:00:00 2001 From: Busari Date: Wed, 5 Aug 2026 12:18:24 +0100 Subject: [PATCH] Return TokenizationError instead of panicking on invalid content metadata length mint() used .unwrap() on BytesValidator::validate_length() for title, description, and content_hash, so an out-of-range value (e.g. a content_hash that isn't exactly 32 bytes) panicked the whole invocation instead of returning a recoverable contract error. Propagate TokenizationError::InvalidMetadata via ? instead. Closes #485 --- contracts/teachlink/src/tokenization.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/contracts/teachlink/src/tokenization.rs b/contracts/teachlink/src/tokenization.rs index 25a87b96..8ea0a085 100644 --- a/contracts/teachlink/src/tokenization.rs +++ b/contracts/teachlink/src/tokenization.rs @@ -49,10 +49,14 @@ impl ContentTokenization { crate::validation::AddressValidator::validate(env, &creator).unwrap(); // Metadata validation (if title/description were String, we'd use StringValidator) - // Since they are Bytes, we check length - crate::validation::BytesValidator::validate_length(&title, 1, 100).unwrap(); - crate::validation::BytesValidator::validate_length(&description, 1, 1000).unwrap(); - crate::validation::BytesValidator::validate_length(&content_hash, 32, 32).unwrap(); + // Since they are Bytes, we check length. Propagate as a proper + // contract error instead of panicking the invocation (#485). + crate::validation::BytesValidator::validate_length(&title, 1, 100) + .map_err(|_| TokenizationError::InvalidMetadata)?; + crate::validation::BytesValidator::validate_length(&description, 1, 1000) + .map_err(|_| TokenizationError::InvalidMetadata)?; + crate::validation::BytesValidator::validate_length(&content_hash, 32, 32) + .map_err(|_| TokenizationError::InvalidMetadata)?; if royalty_percentage > 100 { panic!("Royalty percentage cannot exceed 100");