From eebd0e2c517b1f52e8cf673c0e98136ee9744918 Mon Sep 17 00:00:00 2001 From: Daniel Shiposha Date: Mon, 02 Oct 2023 16:04:09 +0000 Subject: [PATCH] fix: use OptionQuery for TokenProperties --- --- a/pallets/balances-adapter/src/common.rs +++ b/pallets/balances-adapter/src/common.rs @@ -172,18 +172,16 @@ fail!(>::UnsupportedOperation); } - fn get_token_properties_map(&self, _token_id: TokenId) -> up_data_structs::TokenProperties { + fn get_token_properties_raw( + &self, + _token_id: TokenId, + ) -> Option { // 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( --- 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; /// 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 @@ >::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(|| >::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, } } --- a/pallets/fungible/src/common.rs +++ b/pallets/fungible/src/common.rs @@ -364,18 +364,16 @@ fail!(>::SettingPropertiesNotAllowed) } - fn get_token_properties_map(&self, _token_id: TokenId) -> up_data_structs::TokenProperties { + fn get_token_properties_raw( + &self, + _token_id: TokenId, + ) -> Option { // 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( --- 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 { >::get((self.id, token_id)) } - fn set_token_properties_map(&self, token_id: TokenId, map: up_data_structs::TokenProperties) { - >::set((self.id, token_id), map) + fn set_token_properties_raw(&self, token_id: TokenId, map: up_data_structs::TokenProperties) { + >::insert((self.id, token_id), map) } fn set_token_property_permissions( @@ -287,10 +290,6 @@ ) } - fn properties_exist(&self, token: TokenId) -> bool { - >::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 { - >::token_properties((self.id, token_id)) + >::token_properties((self.id, token_id))? .get(key) .cloned() } fn token_properties(&self, token_id: TokenId, keys: Option>) -> Vec { - let properties = >::token_properties((self.id, token_id)); + let Some(properties) = >::token_properties((self.id, token_id)) else { + return vec![]; + }; keys.map(|keys| { keys.into_iter() --- 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 = >::get((self.id, token_id)); + let props = + >::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()) --- a/pallets/nonfungible/src/lib.rs +++ b/pallets/nonfungible/src/lib.rs @@ -102,8 +102,8 @@ use up_data_structs::{ AccessMode, CollectionId, CustomDataLimit, TokenId, CreateCollectionData, CreateNftExData, mapping::TokenAddressMapping, budget::Budget, Property, PropertyKey, PropertyValue, - PropertyKeyPermission, PropertyScope, TrySetProperty, TokenChild, AuxPropertyValue, - PropertiesPermissionMap, TokenProperties as TokenPropertiesT, + PropertyKeyPermission, PropertyScope, TokenChild, AuxPropertyValue, PropertiesPermissionMap, + TokenProperties as TokenPropertiesT, }; use pallet_evm::{account::CrossAccountId, Pallet as PalletEvm}; use pallet_common::{ @@ -201,7 +201,7 @@ pub type TokenProperties = StorageNMap< Key = (Key, Key), Value = TokenPropertiesT, - QueryKind = ValueQuery, + QueryKind = OptionQuery, >; /// Custom data of a token that is serialized to bytes, @@ -340,40 +340,8 @@ /// - `token`: Token ID. pub fn token_exists(collection: &NonfungibleHandle, token: TokenId) -> bool { >::contains_key((collection.id, token)) - } - - /// Set the token property with the scope. - /// - /// - `property`: Contains key-value pair. - pub fn set_scoped_token_property( - collection_id: CollectionId, - token_id: TokenId, - scope: PropertyScope, - property: Property, - ) -> DispatchResult { - TokenProperties::::try_mutate((collection_id, token_id), |properties| { - properties.try_scoped_set(scope, property.key, property.value) - }) - .map_err(>::from)?; - - Ok(()) } - /// Batch operation to set multiple properties with the same scope. - pub fn set_scoped_token_properties( - collection_id: CollectionId, - token_id: TokenId, - scope: PropertyScope, - properties: impl Iterator, - ) -> DispatchResult { - TokenProperties::::try_mutate((collection_id, token_id), |stored_properties| { - stored_properties.try_scoped_set_from_iter(scope, properties) - }) - .map_err(>::from)?; - - Ok(()) - } - /// Add or edit auxiliary data for the property. /// /// - `f`: function that adds or edits auxiliary data. @@ -1394,7 +1362,9 @@ pub fn repair_item(collection: &NonfungibleHandle, token: TokenId) -> DispatchResult { >::mutate((collection.id, token), |properties| { - properties.recompute_consumed_space(); + if let Some(properties) = properties { + properties.recompute_consumed_space(); + } }); Ok(()) --- 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 { >::get((self.id, token_id)) } - fn set_token_properties_map(&self, token_id: TokenId, map: up_data_structs::TokenProperties) { - >::set((self.id, token_id), map) - } - - fn properties_exist(&self, token: TokenId) -> bool { - >::contains_key((self.id, token)) + fn set_token_properties_raw(&self, token_id: TokenId, map: up_data_structs::TokenProperties) { + >::insert((self.id, token_id), map) } fn check_nesting( @@ -514,13 +513,15 @@ } fn token_property(&self, token_id: TokenId, key: &PropertyKey) -> Option { - >::token_properties((self.id, token_id)) + >::token_properties((self.id, token_id))? .get(key) .cloned() } fn token_properties(&self, token_id: TokenId, keys: Option>) -> Vec { - let properties = >::token_properties((self.id, token_id)); + let Some(properties) = >::token_properties((self.id, token_id)) else { + return vec![]; + }; keys.map(|keys| { keys.into_iter() --- 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 = >::get((self.id, token_id)); + let props = + >::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()) --- 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 = StorageNMap< Key = (Key, Key), 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, token: TokenId) -> bool { >::contains_key((collection.id, token)) - } - - pub fn set_scoped_token_property( - collection_id: CollectionId, - token_id: TokenId, - scope: PropertyScope, - property: Property, - ) -> DispatchResult { - TokenProperties::::try_mutate((collection_id, token_id), |properties| { - properties.try_scoped_set(scope, property.key, property.value) - }) - .map_err(>::from)?; - - Ok(()) } - - pub fn set_scoped_token_properties( - collection_id: CollectionId, - token_id: TokenId, - scope: PropertyScope, - properties: impl Iterator, - ) -> DispatchResult { - TokenProperties::::try_mutate((collection_id, token_id), |stored_properties| { - stored_properties.try_scoped_set_from_iter(scope, properties) - }) - .map_err(>::from)?; - - Ok(()) - } } // unchecked calls skips any permission checks @@ -1426,7 +1398,9 @@ pub fn repair_item(collection: &RefungibleHandle, token: TokenId) -> DispatchResult { >::mutate((collection.id, token), |properties| { - properties.recompute_consumed_space(); + if let Some(properties) = properties { + properties.recompute_consumed_space(); + } }); Ok(()) -- gitstuff