From 4b48bfe2fd92e64dec046b3dd7a3c2d74a28bf0e Mon Sep 17 00:00:00 2001 From: migue toscano Date: Tue, 22 Mar 2022 22:03:28 -0300 Subject: [PATCH 1/3] Refactored to accept asset_type field --- registries/nft/src/nft.rs | 48 +++++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/registries/nft/src/nft.rs b/registries/nft/src/nft.rs index 3a43886..8ca4dbb 100644 --- a/registries/nft/src/nft.rs +++ b/registries/nft/src/nft.rs @@ -117,9 +117,9 @@ fn add(canister_info: NftCanister) -> Result<(), OperationError> { && !validate_url(&canister_info.frontend.clone().unwrap()) { return Err(OperationError::BadParameters); - } else if canister_info.details[0].0 != String::from("standard") { + } else if canister_info.details.len() == 0 { return Err(OperationError::BadParameters); - } else if canister_info.details.len() != 1 { + } else if !canister_info.details.clone().into_iter().any(|detail| detail.0 == "standard") { return Err(OperationError::BadParameters); } @@ -212,6 +212,39 @@ mod tests { assert!(add(canister_info).is_ok()); } + #[test] + fn test_add_with_asset_type_field_successfully() { + MockContext::new() + .with_caller(mock_principals::alice()) + .with_data(Controller(mock_principals::alice())) + .inject(); + + let canister_info = NftCanister { + name: String::from("xtc"), + principal_id: mock_principals::xtc(), + description: String::from("XTC is your cycles wallet."), + thumbnail: String::from("https://google.com"), + frontend: None, + details: vec![ + ( + String::from("standard"), + DetailValue::Text(String::from("Dank")), + ), + ( + String::from("asset_type"), + DetailValue::Text(String::from("png")), + ), + ], + }; + + assert!(add(canister_info).is_ok()); + + let added_canister = get(mock_principals::xtc()); + + assert_eq!(added_canister.unwrap().details[1].0, String::from("asset_type")); + assert_eq!(added_canister.unwrap().details[1].1, DetailValue::Text(String::from("png"))); + } + #[test] fn test_add_fails_because_of_unauthorized_caller() { let context = MockContext::new() @@ -381,16 +414,7 @@ mod tests { thumbnail: String::from("https://logo_url.com"), frontend: None, principal_id: mock_principals::xtc(), - details: vec![ - ( - String::from("standard"), - DetailValue::Text(String::from("DIP721")), - ), - ( - String::from("extra field"), - DetailValue::Text(String::from("invalid field")), - ), - ], + details: vec![], }; let addition_result = add(canister_info); From 913274bbd7737f0761fd871562a3787471f94724 Mon Sep 17 00:00:00 2001 From: migue toscano Date: Fri, 25 Mar 2022 09:05:14 -0300 Subject: [PATCH 2/3] updated upgrade script --- registries/nft/src/upgrade.rs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/registries/nft/src/upgrade.rs b/registries/nft/src/upgrade.rs index 46ae7e7..8bfaae1 100644 --- a/registries/nft/src/upgrade.rs +++ b/registries/nft/src/upgrade.rs @@ -1,4 +1,4 @@ -use crate::nft::{Controller, DetailValue, NftCanister, Registry}; +use crate::nft::{Controller, DetailValue, NftCanister, Registry }; use ic_cdk::export::candid::{CandidType, Deserialize, Principal}; use ic_kit::ic::*; use ic_kit::macros::*; @@ -31,7 +31,24 @@ pub fn pre_upgrade() { #[post_upgrade] pub fn post_upgrade() { if let Ok((stable,)) = ic::stable_restore::<(StableStorage,)>() { - ic::get_mut::().load(stable.db); + let mut updated_nft_canisters = Vec::with_capacity(stable.db.len()); + + for (_key, nft_canister) in stable.db.into_iter() { + let updated_nft_canister = NftCanister { + name: nft_canister.name.clone(), + description: nft_canister.description.clone(), + thumbnail: nft_canister.thumbnail.clone(), + frontend: nft_canister.frontend.clone(), + principal_id: nft_canister.principal_id.clone(), + details: vec![ + nft_canister.details[0].clone(), + (String::from("asset_type"), DetailValue::Text(String::from("ASSET TYPE HERE"))), + ], + }; + + updated_nft_canisters.push((updated_nft_canister.principal_id, updated_nft_canister)); + } + ic::get_mut::().load(updated_nft_canisters); ic::store(Controller(stable.controller)); } } From 44e9991f1d5561ccf1d5e8d95665701543187e24 Mon Sep 17 00:00:00 2001 From: Nima Rasooli Date: Mon, 28 Mar 2022 00:21:55 +0430 Subject: [PATCH 3/3] Change the nft.rs and upgrade.rs files Add details field validation to the add method & change the asset type to unknown --- registries/nft/src/nft.rs | 4 ++++ registries/nft/src/upgrade.rs | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/registries/nft/src/nft.rs b/registries/nft/src/nft.rs index 8ca4dbb..a4b8840 100644 --- a/registries/nft/src/nft.rs +++ b/registries/nft/src/nft.rs @@ -121,6 +121,10 @@ fn add(canister_info: NftCanister) -> Result<(), OperationError> { return Err(OperationError::BadParameters); } else if !canister_info.details.clone().into_iter().any(|detail| detail.0 == "standard") { return Err(OperationError::BadParameters); + } else if canister_info.details.0.0 != String::from("standard") { + return Err(OperationError::BadParameters); + } else if canister_info.details.1.0 != String::from("asset_type") { + return Err(OperationError::BadParameters); } let name = canister_info.name.clone(); diff --git a/registries/nft/src/upgrade.rs b/registries/nft/src/upgrade.rs index 8bfaae1..1550108 100644 --- a/registries/nft/src/upgrade.rs +++ b/registries/nft/src/upgrade.rs @@ -42,7 +42,7 @@ pub fn post_upgrade() { principal_id: nft_canister.principal_id.clone(), details: vec![ nft_canister.details[0].clone(), - (String::from("asset_type"), DetailValue::Text(String::from("ASSET TYPE HERE"))), + (String::from("asset_type"), DetailValue::Text(String::from("unknown"))), ], };