git.delta.rocks / unique-network / refs/commits / 4458a1dde4ff

difftreelog

minor: Fix tokenURI logic.

Trubnikov Sergey2022-07-19parent: #2dd986e.patch.diff
in: master

2 files changed

modifiedpallets/nonfungible/src/erc.rsdiffbeforeafterboth
--- a/pallets/nonfungible/src/erc.rs
+++ b/pallets/nonfungible/src/erc.rs
@@ -219,25 +219,34 @@
 	/// @return token's const_metadata
 	#[solidity(rename_selector = "tokenURI")]
 	fn token_uri(&self, token_id: uint256) -> Result<string> {
-		let token_id: u32 = token_id.try_into().map_err(|_| "token id overflow")?;	
-
-		if let Ok(shema_name) = get_token_property(self, token_id, &schema_name_key()) {
-			if shema_name != "ERC721" {
-				return Ok("".into());
+		let is_erc721 = || {
+			if let Some(shema_name) = pallet_common::Pallet::<T>::get_collection_property(self.id, &schema_name_key()) {
+				let shema_name = shema_name.into_inner();
+				shema_name == b"ERC721"
+			} else {
+				false
 			}
-		} else {
-			return Ok("".into());
-		}
+		};
+
+		let token_id_u32: u32 = token_id.try_into().map_err(|_| "token id overflow")?;
 
-		if let Ok(url) = get_token_property(self, token_id, &u_key()) {
+		if let Ok(url) = get_token_property(self, token_id_u32, &u_key()) {
 			if !url.is_empty() {
 				return Ok(url);
 			}
+		} else if !is_erc721() {
+			return Err("tokenURI not set".into());
 		}
 
-		if let Ok(base_uri) = get_token_property(self, token_id, &base_uri_key()) {
+		if let Some(base_uri) = pallet_common::Pallet::<T>::get_collection_property(self.id, &base_uri_key()) {
 			if !base_uri.is_empty() {
-				if let Ok(suffix) = get_token_property(self, token_id, &s_key()) {
+				let base_uri = string::from_utf8(base_uri.into_inner()).map_err(|e| {
+					Error::Revert(alloc::format!(
+						"Can not convert value \"baseURI\" to string with error \"{}\"",
+						e
+					))
+				})?;
+				if let Ok(suffix) = get_token_property(self, token_id_u32, &s_key()) {
 					if !suffix.is_empty() {
 						return Ok(base_uri + suffix.as_str());
 					}
@@ -484,7 +493,7 @@
 		token_id: uint256,
 		token_uri: string,
 	) -> Result<bool> {
-		let key = token_uri_key();
+		let key = u_key();
 		let permission = get_token_permission::<T>(self.id, &key)?;
 		if !permission.collection_admin {
 			return Err("Operation is not allowed".into());
@@ -535,7 +544,11 @@
 	}
 }
 
-fn get_token_property<T: Config>(collection: &CollectionHandle<T>, token_id: u32, key: &up_data_structs::PropertyKey) -> Result<string> {
+fn get_token_property<T: Config>(
+	collection: &CollectionHandle<T>,
+	token_id: u32,
+	key: &up_data_structs::PropertyKey,
+) -> Result<string> {
 	collection.consume_store_reads(1)?;
 	let properties = <TokenProperties<T>>::try_get((collection.id, token_id))
 		.map_err(|_| Error::Revert("Token properties not found".into()))?;
@@ -554,8 +567,11 @@
 		.map_err(|_| Error::Revert("No permissions for collection".into()))?;
 	let a = token_property_permissions
 		.get(key)
-		.map(|p| p.clone())
-		.ok_or_else(|| Error::Revert("No permission".into()))?;
+		.map(Clone::clone)
+		.ok_or_else(|| {
+			let key = string::from_utf8(key.clone().into_inner()).unwrap_or_default();
+			Error::Revert(alloc::format!("No permission for key {}", key))
+		})?;
 	Ok(a)
 }
 
modifiedpallets/unique/src/eth/mod.rsdiffbeforeafterboth
95 let mut token_property_permissions =95 let mut token_property_permissions =
96 up_data_structs::CollectionPropertiesPermissionsVec::default();96 up_data_structs::CollectionPropertiesPermissionsVec::default();
97
98 if add_properties {
99 token_property_permissions
100 .try_push(up_data_structs::PropertyKeyPermission {
101 key: token_uri_key(),
102 permission: up_data_structs::PropertyPermission {
103 mutable: true,
104 collection_admin: true,
105 token_owner: false,
106 },
107 })
108 .map_err(|e| Error::Revert(format!("{:?}", e)))?;
10997
110 token_property_permissions98 token_property_permissions
111 .try_push(up_data_structs::PropertyKeyPermission {99 .try_push(up_data_structs::PropertyKeyPermission {
118 })106 })
119 .map_err(|e| Error::Revert(format!("{:?}", e)))?;107 .map_err(|e| Error::Revert(format!("{:?}", e)))?;
120108
109 if add_properties {
121 token_property_permissions110 token_property_permissions
122 .try_push(up_data_structs::PropertyKeyPermission {111 .try_push(up_data_structs::PropertyKeyPermission {
123 key: s_key(),112 key: s_key(),
144 })133 })
145 .map_err(|e| Error::Revert(format!("{:?}", e)))?;134 .map_err(|e| Error::Revert(format!("{:?}", e)))?;
146 }135 }
147 }136 }
148137
149 let data = CreateCollectionData {138 let data = CreateCollectionData {
150 name,139 name,
202 true,
203 )?;
201 let collection_id =204 let collection_id =
202 <pallet_nonfungible::Pallet<T>>::init_collection(caller.clone(), data, false)205 <pallet_nonfungible::Pallet<T>>::init_collection(caller.clone(), data, true)
203 .map_err(pallet_evm_coder_substrate::dispatch_to_evm::<T>)?;206 .map_err(pallet_evm_coder_substrate::dispatch_to_evm::<T>)?;
204207
205 let address = pallet_common::eth::collection_id_to_address(collection_id);208 let address = pallet_common::eth::collection_id_to_address(collection_id);