git.delta.rocks / unique-network / refs/commits / eebd0e2c517b

difftreelog

fix use OptionQuery for TokenProperties

Daniel Shiposha2023-10-02parent: #5ef5e6b.patch.diff
in: master

9 files changed

modifiedpallets/balances-adapter/src/common.rsdiffbeforeafterboth
--- a/pallets/balances-adapter/src/common.rs
+++ b/pallets/balances-adapter/src/common.rs
@@ -172,18 +172,16 @@
 		fail!(<pallet_common::Error<T>>::UnsupportedOperation);
 	}
 
-	fn get_token_properties_map(&self, _token_id: TokenId) -> up_data_structs::TokenProperties {
+	fn get_token_properties_raw(
+		&self,
+		_token_id: TokenId,
+	) -> Option<up_data_structs::TokenProperties> {
 		// No token properties are defined on fungibles
-		up_data_structs::TokenProperties::new()
+		None
 	}
 
-	fn set_token_properties_map(&self, _token_id: TokenId, _map: up_data_structs::TokenProperties) {
-		// No token properties are defined on fungibles
-	}
-
-	fn properties_exist(&self, _token: TokenId) -> bool {
+	fn set_token_properties_raw(&self, _token_id: TokenId, _map: up_data_structs::TokenProperties) {
 		// No token properties are defined on fungibles
-		false
 	}
 
 	fn set_token_property_permissions(
modifiedpallets/common/src/lib.rsdiffbeforeafterboth
--- a/pallets/common/src/lib.rs
+++ b/pallets/common/src/lib.rs
@@ -2098,18 +2098,13 @@
 	/// Get token properties raw map.
 	///
 	/// * `token_id` - The token which properties are needed.
-	fn get_token_properties_map(&self, token_id: TokenId) -> TokenProperties;
+	fn get_token_properties_raw(&self, token_id: TokenId) -> Option<TokenProperties>;
 
 	/// Set token properties raw map.
 	///
 	/// * `token_id` - The token for which the properties are being set.
 	/// * `map` - The raw map containing the token's properties.
-	fn set_token_properties_map(&self, token_id: TokenId, map: TokenProperties);
-
-	/// Whether the given token has properties.
-	///
-	/// * `token_id` - The token in question.
-	fn properties_exist(&self, token: TokenId) -> bool;
+	fn set_token_properties_raw(&self, token_id: TokenId, map: TokenProperties);
 
 	/// Set token property permissions.
 	///
@@ -2590,7 +2585,7 @@
 			<PalletEvm<T>>::deposit_log(log);
 
 			self.collection
-				.set_token_properties_map(token_id, stored_properties.into_inner());
+				.set_token_properties_raw(token_id, stored_properties.into_inner());
 		}
 
 		Ok(())
@@ -2624,7 +2619,7 @@
 			true
 		},
 		get_properties: |token_id| {
-			debug_assert!(!collection.properties_exist(token_id));
+			debug_assert!(collection.get_token_properties_raw(token_id).is_none());
 			TokenProperties::new()
 		},
 		_phantom: PhantomData,
@@ -2686,7 +2681,11 @@
 		is_collection_admin: LazyValue::new(|| collection.is_owner_or_admin(sender)),
 		property_permissions: LazyValue::new(|| <Pallet<T>>::property_permissions(collection.id)),
 		check_token_exist: |token_id| collection.token_exists(token_id),
-		get_properties: |token_id| collection.get_token_properties_map(token_id),
+		get_properties: |token_id| {
+			collection
+				.get_token_properties_raw(token_id)
+				.unwrap_or_default()
+		},
 		_phantom: PhantomData,
 	}
 }
modifiedpallets/fungible/src/common.rsdiffbeforeafterboth
--- a/pallets/fungible/src/common.rs
+++ b/pallets/fungible/src/common.rs
@@ -364,18 +364,16 @@
 		fail!(<Error<T>>::SettingPropertiesNotAllowed)
 	}
 
-	fn get_token_properties_map(&self, _token_id: TokenId) -> up_data_structs::TokenProperties {
+	fn get_token_properties_raw(
+		&self,
+		_token_id: TokenId,
+	) -> Option<up_data_structs::TokenProperties> {
 		// No token properties are defined on fungibles
-		up_data_structs::TokenProperties::new()
+		None
 	}
 
-	fn set_token_properties_map(&self, _token_id: TokenId, _map: up_data_structs::TokenProperties) {
-		// No token properties are defined on fungibles
-	}
-
-	fn properties_exist(&self, _token: TokenId) -> bool {
+	fn set_token_properties_raw(&self, _token_id: TokenId, _map: up_data_structs::TokenProperties) {
 		// No token properties are defined on fungibles
-		false
 	}
 
 	fn check_nesting(
modifiedpallets/nonfungible/src/common.rsdiffbeforeafterboth
--- a/pallets/nonfungible/src/common.rs
+++ b/pallets/nonfungible/src/common.rs
@@ -265,12 +265,15 @@
 		)
 	}
 
-	fn get_token_properties_map(&self, token_id: TokenId) -> up_data_structs::TokenProperties {
+	fn get_token_properties_raw(
+		&self,
+		token_id: TokenId,
+	) -> Option<up_data_structs::TokenProperties> {
 		<TokenProperties<T>>::get((self.id, token_id))
 	}
 
-	fn set_token_properties_map(&self, token_id: TokenId, map: up_data_structs::TokenProperties) {
-		<TokenProperties<T>>::set((self.id, token_id), map)
+	fn set_token_properties_raw(&self, token_id: TokenId, map: up_data_structs::TokenProperties) {
+		<TokenProperties<T>>::insert((self.id, token_id), map)
 	}
 
 	fn set_token_property_permissions(
@@ -287,10 +290,6 @@
 		)
 	}
 
-	fn properties_exist(&self, token: TokenId) -> bool {
-		<TokenProperties<T>>::contains_key((self.id, token))
-	}
-
 	fn burn_item(
 		&self,
 		sender: T::CrossAccountId,
@@ -482,13 +481,15 @@
 	}
 
 	fn token_property(&self, token_id: TokenId, key: &PropertyKey) -> Option<PropertyValue> {
-		<Pallet<T>>::token_properties((self.id, token_id))
+		<Pallet<T>>::token_properties((self.id, token_id))?
 			.get(key)
 			.cloned()
 	}
 
 	fn token_properties(&self, token_id: TokenId, keys: Option<Vec<PropertyKey>>) -> Vec<Property> {
-		let properties = <Pallet<T>>::token_properties((self.id, token_id));
+		let Some(properties) = <Pallet<T>>::token_properties((self.id, token_id)) else {
+			return vec![];
+		};
 
 		keys.map(|keys| {
 			keys.into_iter()
modifiedpallets/nonfungible/src/erc.rsdiffbeforeafterboth
--- a/pallets/nonfungible/src/erc.rs
+++ b/pallets/nonfungible/src/erc.rs
@@ -272,7 +272,8 @@
 			.try_into()
 			.map_err(|_| "key too long")?;
 
-		let props = <TokenProperties<T>>::get((self.id, token_id));
+		let props =
+			<TokenProperties<T>>::get((self.id, token_id)).ok_or("Token properties not found")?;
 		let prop = props.get(&key).ok_or("key not found")?;
 
 		Ok(prop.to_vec().into())
modifiedpallets/nonfungible/src/lib.rsdiffbeforeafterboth
102use up_data_structs::{102use up_data_structs::{
103 AccessMode, CollectionId, CustomDataLimit, TokenId, CreateCollectionData, CreateNftExData,103 AccessMode, CollectionId, CustomDataLimit, TokenId, CreateCollectionData, CreateNftExData,
104 mapping::TokenAddressMapping, budget::Budget, Property, PropertyKey, PropertyValue,104 mapping::TokenAddressMapping, budget::Budget, Property, PropertyKey, PropertyValue,
105 PropertyKeyPermission, PropertyScope, TrySetProperty, TokenChild, AuxPropertyValue,105 PropertyKeyPermission, PropertyScope, TokenChild, AuxPropertyValue, PropertiesPermissionMap,
106 PropertiesPermissionMap, TokenProperties as TokenPropertiesT,106 TokenProperties as TokenPropertiesT,
107};107};
108use pallet_evm::{account::CrossAccountId, Pallet as PalletEvm};108use pallet_evm::{account::CrossAccountId, Pallet as PalletEvm};
201 pub type TokenProperties<T: Config> = StorageNMap<201 pub type TokenProperties<T: Config> = StorageNMap<
202 Key = (Key<Twox64Concat, CollectionId>, Key<Twox64Concat, TokenId>),202 Key = (Key<Twox64Concat, CollectionId>, Key<Twox64Concat, TokenId>),
203 Value = TokenPropertiesT,203 Value = TokenPropertiesT,
204 QueryKind = ValueQuery,204 QueryKind = OptionQuery,
205 >;205 >;
206206
207 /// Custom data of a token that is serialized to bytes,207 /// Custom data of a token that is serialized to bytes,
342 <TokenData<T>>::contains_key((collection.id, token))342 <TokenData<T>>::contains_key((collection.id, token))
343 }343 }
344
345 /// Set the token property with the scope.
346 ///
347 /// - `property`: Contains key-value pair.
348 pub fn set_scoped_token_property(
349 collection_id: CollectionId,
350 token_id: TokenId,
351 scope: PropertyScope,
352 property: Property,
353 ) -> DispatchResult {
354 TokenProperties::<T>::try_mutate((collection_id, token_id), |properties| {
355 properties.try_scoped_set(scope, property.key, property.value)
356 })
357 .map_err(<CommonError<T>>::from)?;
358
359 Ok(())
360 }
361
362 /// Batch operation to set multiple properties with the same scope.
363 pub fn set_scoped_token_properties(
364 collection_id: CollectionId,
365 token_id: TokenId,
366 scope: PropertyScope,
367 properties: impl Iterator<Item = Property>,
368 ) -> DispatchResult {
369 TokenProperties::<T>::try_mutate((collection_id, token_id), |stored_properties| {
370 stored_properties.try_scoped_set_from_iter(scope, properties)
371 })
372 .map_err(<CommonError<T>>::from)?;
373
374 Ok(())
375 }
376344
377 /// Add or edit auxiliary data for the property.345 /// Add or edit auxiliary data for the property.
378 ///346 ///
13941362
1395 pub fn repair_item(collection: &NonfungibleHandle<T>, token: TokenId) -> DispatchResult {1363 pub fn repair_item(collection: &NonfungibleHandle<T>, token: TokenId) -> DispatchResult {
1396 <TokenProperties<T>>::mutate((collection.id, token), |properties| {1364 <TokenProperties<T>>::mutate((collection.id, token), |properties| {
1365 if let Some(properties) = properties {
1397 properties.recompute_consumed_space();1366 properties.recompute_consumed_space();
1398 });1367 }
1368 });
13991369
1400 Ok(())1370 Ok(())
modifiedpallets/refungible/src/common.rsdiffbeforeafterboth
--- a/pallets/refungible/src/common.rs
+++ b/pallets/refungible/src/common.rs
@@ -435,16 +435,15 @@
 		)
 	}
 
-	fn get_token_properties_map(&self, token_id: TokenId) -> up_data_structs::TokenProperties {
+	fn get_token_properties_raw(
+		&self,
+		token_id: TokenId,
+	) -> Option<up_data_structs::TokenProperties> {
 		<TokenProperties<T>>::get((self.id, token_id))
 	}
 
-	fn set_token_properties_map(&self, token_id: TokenId, map: up_data_structs::TokenProperties) {
-		<TokenProperties<T>>::set((self.id, token_id), map)
-	}
-
-	fn properties_exist(&self, token: TokenId) -> bool {
-		<TokenProperties<T>>::contains_key((self.id, token))
+	fn set_token_properties_raw(&self, token_id: TokenId, map: up_data_structs::TokenProperties) {
+		<TokenProperties<T>>::insert((self.id, token_id), map)
 	}
 
 	fn check_nesting(
@@ -514,13 +513,15 @@
 	}
 
 	fn token_property(&self, token_id: TokenId, key: &PropertyKey) -> Option<PropertyValue> {
-		<Pallet<T>>::token_properties((self.id, token_id))
+		<Pallet<T>>::token_properties((self.id, token_id))?
 			.get(key)
 			.cloned()
 	}
 
 	fn token_properties(&self, token_id: TokenId, keys: Option<Vec<PropertyKey>>) -> Vec<Property> {
-		let properties = <Pallet<T>>::token_properties((self.id, token_id));
+		let Some(properties) = <Pallet<T>>::token_properties((self.id, token_id)) else {
+			return vec![];
+		};
 
 		keys.map(|keys| {
 			keys.into_iter()
modifiedpallets/refungible/src/erc.rsdiffbeforeafterboth
--- a/pallets/refungible/src/erc.rs
+++ b/pallets/refungible/src/erc.rs
@@ -283,7 +283,8 @@
 			.try_into()
 			.map_err(|_| "key too long")?;
 
-		let props = <TokenProperties<T>>::get((self.id, token_id));
+		let props =
+			<TokenProperties<T>>::get((self.id, token_id)).ok_or("Token properties not found")?;
 		let prop = props.get(&key).ok_or("key not found")?;
 
 		Ok(prop.to_vec().into())
modifiedpallets/refungible/src/lib.rsdiffbeforeafterboth
--- a/pallets/refungible/src/lib.rs
+++ b/pallets/refungible/src/lib.rs
@@ -106,8 +106,8 @@
 use up_data_structs::{
 	AccessMode, budget::Budget, CollectionId, CreateCollectionData, mapping::TokenAddressMapping,
 	MAX_REFUNGIBLE_PIECES, Property, PropertyKey, PropertyKeyPermission, PropertyScope,
-	PropertyValue, TokenId, TrySetProperty, PropertiesPermissionMap,
-	CreateRefungibleExMultipleOwners, TokenOwnerError, TokenProperties as TokenPropertiesT,
+	PropertyValue, TokenId, PropertiesPermissionMap, CreateRefungibleExMultipleOwners,
+	TokenOwnerError, TokenProperties as TokenPropertiesT,
 };
 
 pub use pallet::*;
@@ -175,7 +175,7 @@
 	pub type TokenProperties<T: Config> = StorageNMap<
 		Key = (Key<Twox64Concat, CollectionId>, Key<Twox64Concat, TokenId>),
 		Value = TokenPropertiesT,
-		QueryKind = ValueQuery,
+		QueryKind = OptionQuery,
 	>;
 
 	/// Total amount of pieces for token
@@ -292,35 +292,7 @@
 	/// - `token`: Token ID.
 	pub fn token_exists(collection: &RefungibleHandle<T>, token: TokenId) -> bool {
 		<TotalSupply<T>>::contains_key((collection.id, token))
-	}
-
-	pub fn set_scoped_token_property(
-		collection_id: CollectionId,
-		token_id: TokenId,
-		scope: PropertyScope,
-		property: Property,
-	) -> DispatchResult {
-		TokenProperties::<T>::try_mutate((collection_id, token_id), |properties| {
-			properties.try_scoped_set(scope, property.key, property.value)
-		})
-		.map_err(<CommonError<T>>::from)?;
-
-		Ok(())
 	}
-
-	pub fn set_scoped_token_properties(
-		collection_id: CollectionId,
-		token_id: TokenId,
-		scope: PropertyScope,
-		properties: impl Iterator<Item = Property>,
-	) -> DispatchResult {
-		TokenProperties::<T>::try_mutate((collection_id, token_id), |stored_properties| {
-			stored_properties.try_scoped_set_from_iter(scope, properties)
-		})
-		.map_err(<CommonError<T>>::from)?;
-
-		Ok(())
-	}
 }
 
 // unchecked calls skips any permission checks
@@ -1426,7 +1398,9 @@
 
 	pub fn repair_item(collection: &RefungibleHandle<T>, token: TokenId) -> DispatchResult {
 		<TokenProperties<T>>::mutate((collection.id, token), |properties| {
-			properties.recompute_consumed_space();
+			if let Some(properties) = properties {
+				properties.recompute_consumed_space();
+			}
 		});
 
 		Ok(())