--- a/client/rpc/src/lib.rs +++ b/client/rpc/src/lib.rs @@ -76,7 +76,7 @@ fn collection_properties( &self, collection: CollectionId, - keys: Vec, + keys: Option>, at: Option, ) -> Result>; @@ -85,7 +85,7 @@ &self, collection: CollectionId, token_id: TokenId, - properties: Vec, + keys: Option>, at: Option, ) -> Result>; @@ -93,7 +93,7 @@ fn property_permissions( &self, collection: CollectionId, - keys: Vec, + keys: Option>, at: Option, ) -> Result>; @@ -102,7 +102,7 @@ &self, collection: CollectionId, token_id: TokenId, - keys: Vec, + keys: Option>, at: Option, ) -> Result>; @@ -277,7 +277,7 @@ collection: CollectionId, #[map(|keys| string_keys_to_bytes_keys(keys))] - keys: Vec + keys: Option> ) -> Vec); pass_method!(token_properties( @@ -285,14 +285,14 @@ token_id: TokenId, #[map(|keys| string_keys_to_bytes_keys(keys))] - properties: Vec + keys: Option> ) -> Vec); pass_method!(property_permissions( collection: CollectionId, #[map(|keys| string_keys_to_bytes_keys(keys))] - keys: Vec + keys: Option> ) -> Vec); pass_method!(token_data( @@ -300,7 +300,7 @@ token_id: TokenId, #[map(|keys| string_keys_to_bytes_keys(keys))] - keys: Vec, + keys: Option>, ) -> TokenData); pass_method!(total_supply(collection: CollectionId) -> u32); @@ -318,6 +318,8 @@ pass_method!(effective_collection_limits(collection_id: CollectionId) -> Option); } -fn string_keys_to_bytes_keys(keys: Vec) -> Vec> { - keys.into_iter().map(|key| key.into_bytes()).collect() +fn string_keys_to_bytes_keys(keys: Option>) -> Option>> { + keys.map(|keys| { + keys.into_iter().map(|key| key.into_bytes()).collect() + }) } --- a/pallets/common/src/lib.rs +++ b/pallets/common/src/lib.rs @@ -845,31 +845,39 @@ pub fn filter_collection_properties( collection_id: CollectionId, - keys: Vec, + keys: Option>, ) -> Result, DispatchError> { let properties = Self::collection_properties(collection_id); - let properties = keys - .into_iter() + let properties = keys.map(|keys| { + keys.into_iter() .filter_map(|key| { properties.get(&key).map(|value| Property { key, value: value.clone(), }) }) - .collect(); + .collect() + }).unwrap_or( + properties.iter() + .map(|(key, value)| Property { + key: key.clone(), + value: value.clone(), + }) + .collect() + ); Ok(properties) } pub fn filter_property_permissions( collection_id: CollectionId, - keys: Vec, + keys: Option>, ) -> Result, DispatchError> { let permissions = Self::property_permissions(collection_id); - let key_permissions = keys - .into_iter() + let key_permissions = keys.map(|keys| { + keys.into_iter() .filter_map(|key| { permissions .get(&key) @@ -878,7 +886,15 @@ permission: permission.clone(), }) }) - .collect(); + .collect() + }).unwrap_or( + permissions.iter() + .map(|(key, permission)| PropertyKeyPermission { + key: key.clone(), + permission: permission.clone(), + }) + .collect() + ); Ok(key_permissions) } @@ -1148,7 +1164,7 @@ fn token_owner(&self, token: TokenId) -> Option; fn const_metadata(&self, token: TokenId) -> Vec; - fn token_properties(&self, token_id: TokenId, keys: Vec) -> Vec; + fn token_properties(&self, token_id: TokenId, keys: Option>) -> Vec; /// Amount of unique collection tokens fn total_supply(&self) -> u32; /// Amount of different tokens account has (Applicable to nonfungible/refungible) --- a/pallets/fungible/src/common.rs +++ b/pallets/fungible/src/common.rs @@ -319,7 +319,7 @@ Vec::new() } - fn token_properties(&self, _token_id: TokenId, _keys: Vec) -> Vec { + fn token_properties(&self, _token_id: TokenId, _keys: Option>) -> Vec { Vec::new() } --- a/pallets/nonfungible/src/common.rs +++ b/pallets/nonfungible/src/common.rs @@ -362,10 +362,11 @@ .into_inner() } - fn token_properties(&self, token_id: TokenId, keys: Vec) -> Vec { + fn token_properties(&self, token_id: TokenId, keys: Option>) -> Vec { let properties = >::token_properties((self.id, token_id)); - keys.into_iter() + keys.map(|keys| { + keys.into_iter() .filter_map(|key| { properties.get(&key).map(|value| Property { key, @@ -373,6 +374,13 @@ }) }) .collect() + }).unwrap_or( + properties.iter().map(|(key, value)| Property { + key: key.clone(), + value: value.clone(), + }) + .collect() + ) } fn total_supply(&self) -> u32 { --- a/pallets/refungible/src/common.rs +++ b/pallets/refungible/src/common.rs @@ -340,7 +340,7 @@ .into_inner() } - fn token_properties(&self, _token_id: TokenId, _keys: Vec) -> Vec { + fn token_properties(&self, _token_id: TokenId, _keys: Option>) -> Vec { Vec::new() } --- a/primitives/rpc/src/lib.rs +++ b/primitives/rpc/src/lib.rs @@ -43,20 +43,24 @@ fn topmost_token_owner(collection: CollectionId, token: TokenId) -> Result>; fn const_metadata(collection: CollectionId, token: TokenId) -> Result>; - fn collection_properties(collection: CollectionId, properties: Vec>) -> Result>; + fn collection_properties(collection: CollectionId, properties: Option>>) -> Result>; fn token_properties( collection: CollectionId, token_id: TokenId, - properties: Vec> + properties: Option>> ) -> Result>; fn property_permissions( collection: CollectionId, - properties: Vec> + properties: Option>> ) -> Result>; - fn token_data(collection: CollectionId, token_id: TokenId, keys: Vec>) -> Result>; + fn token_data( + collection: CollectionId, + token_id: TokenId, + keys: Option>> + ) -> Result>; fn total_supply(collection: CollectionId) -> Result; fn account_balance(collection: CollectionId, account: CrossAccountId) -> Result; --- a/runtime/common/src/runtime_apis.rs +++ b/runtime/common/src/runtime_apis.rs @@ -35,9 +35,11 @@ fn collection_properties( collection: CollectionId, - keys: Vec> + keys: Option>> ) -> Result, DispatchError> { - let keys = pallet_common::Pallet::::bytes_keys_to_property_keys(keys)?; + let keys = keys.map( + |keys| pallet_common::Pallet::::bytes_keys_to_property_keys(keys) + ).transpose()?; pallet_common::Pallet::::filter_collection_properties(collection, keys) } @@ -45,17 +47,22 @@ fn token_properties( collection: CollectionId, token_id: TokenId, - keys: Vec> + keys: Option>> ) -> Result, DispatchError> { - let keys = pallet_common::Pallet::::bytes_keys_to_property_keys(keys)?; + let keys = keys.map( + |keys| pallet_common::Pallet::::bytes_keys_to_property_keys(keys) + ).transpose()?; + dispatch_unique_runtime!(collection.token_properties(token_id, keys)) } fn property_permissions( collection: CollectionId, - keys: Vec> + keys: Option>> ) -> Result, DispatchError> { - let keys = pallet_common::Pallet::::bytes_keys_to_property_keys(keys)?; + let keys = keys.map( + |keys| pallet_common::Pallet::::bytes_keys_to_property_keys(keys) + ).transpose()?; pallet_common::Pallet::::filter_property_permissions(collection, keys) } @@ -63,7 +70,7 @@ fn token_data( collection: CollectionId, token_id: TokenId, - keys: Vec> + keys: Option>> ) -> Result, DispatchError> { let token_data = TokenData { const_data: Self::const_metadata(collection, token_id)?,