From 22128f82de1c6045a7781a51499fb14d4b90afe6 Mon Sep 17 00:00:00 2001 From: Daniel Shiposha Date: Mon, 06 Jun 2022 15:07:06 +0000 Subject: [PATCH] feat(rmrk): add set_priority --- --- a/client/rpc/src/lib.rs +++ b/client/rpc/src/lib.rs @@ -276,14 +276,15 @@ at: Option, ) -> Result>; - #[method(name = "rmrk_nftResourcePriorities")] - /// Get NFT resource priorities - fn nft_resource_priorities( + #[method(name = "rmrk_nftResourcePriority")] + /// Get NFT resource priority + fn nft_resource_priority( &self, collection_id: RmrkCollectionId, nft_id: RmrkNftId, + resource_id: RmrkResourceId, at: Option, - ) -> Result>; + ) -> Result>; #[method(name = "rmrk_base")] /// Get base info @@ -522,7 +523,7 @@ rmrk_api ); pass_method!(nft_resources(collection_id: RmrkCollectionId, nft_id: RmrkNftId) -> Vec, rmrk_api); - pass_method!(nft_resource_priorities(collection_id: RmrkCollectionId, nft_id: RmrkNftId) -> Vec, rmrk_api); + pass_method!(nft_resource_priority(collection_id: RmrkCollectionId, nft_id: RmrkNftId, resource_id: RmrkResourceId) -> Option, rmrk_api); pass_method!(base(base_id: RmrkBaseId) -> Option, rmrk_api); pass_method!(base_parts(base_id: RmrkBaseId) -> Vec, rmrk_api); pass_method!(theme_names(base_id: RmrkBaseId) -> Vec, rmrk_api); --- a/pallets/proxy-rmrk-core/src/lib.rs +++ b/pallets/proxy-rmrk-core/src/lib.rs @@ -695,6 +695,34 @@ #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))] #[transactional] + pub fn set_priority( + origin: OriginFor, + rmrk_collection_id: RmrkCollectionId, + rmrk_nft_id: RmrkNftId, + priorities: BoundedVec, + ) -> DispatchResult { + let sender = ensure_signed(origin)?; + let sender = T::CrossAccountId::from_sub(sender); + + let collection_id = Self::unique_collection_id(rmrk_collection_id)?; + let nft_id = rmrk_nft_id.into(); + let budget = budget::Value::new(NESTING_BUDGET); + + Self::ensure_nft_type(collection_id, nft_id, NftType::Regular)?; + Self::ensure_nft_owner(collection_id, nft_id, &sender, &budget)?; + + >::set_scoped_token_property( + collection_id, + nft_id, + PropertyScope::Rmrk, + Self::rmrk_property(ResourcePriorities, &priorities.into_inner())? + )?; + + Ok(()) + } + + #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))] + #[transactional] pub fn add_basic_resource( origin: OriginFor, collection_id: RmrkCollectionId, @@ -1160,7 +1188,7 @@ token_id: TokenId, ) -> Result { Self::get_nft_property_decoded(collection_id, token_id, TokenType) - .map_err(|_| >::NftTypeEncodeError.into()) + .map_err(|_| >::NoAvailableNftId.into()) } pub fn ensure_nft_type( --- a/primitives/data-structs/src/lib.rs +++ b/primitives/data-structs/src/lib.rs @@ -929,6 +929,8 @@ pub const RmrkMaxCollectionsEquippablePerPart: u32 = 100; #[derive(PartialEq)] pub const RmrkPartsLimit: u32 = 3; + #[derive(PartialEq)] + pub const RmrkMaxPriorities: u32 = 3; } impl From for CollectionId { --- a/primitives/rmrk-rpc/src/lib.rs +++ b/primitives/rmrk-rpc/src/lib.rs @@ -50,7 +50,7 @@ fn nft_resources(collection_id: CollectionId, nft_id: NftId) -> Result>; - fn nft_resource_priorities(collection_id: CollectionId, nft_id: NftId) -> Result>; + fn nft_resource_priority(collection_id: CollectionId, nft_id: NftId, resource_id: ResourceId) -> Result>; fn base(base_id: BaseId) -> Result>; --- a/runtime/common/src/runtime_apis.rs +++ b/runtime/common/src/runtime_apis.rs @@ -363,33 +363,25 @@ Ok(resources) } - fn nft_resource_priorities(collection_id: RmrkCollectionId, nft_id: RmrkNftId) -> Result, DispatchError> { + fn nft_resource_priority(collection_id: RmrkCollectionId, nft_id: RmrkNftId, resource_id: RmrkResourceId) -> Result, DispatchError> { use pallet_proxy_rmrk_core::{RmrkProperty, misc::{CollectionType, NftType}}; let collection_id = match RmrkCore::unique_collection_id(collection_id) { Ok(id) => id, - Err(_) => return Ok(Vec::new()) + Err(_) => return Ok(None) }; - if RmrkCore::ensure_collection_type(collection_id, CollectionType::Regular).is_err() { return Ok(Vec::new()); } + if RmrkCore::ensure_collection_type(collection_id, CollectionType::Regular).is_err() { return Ok(None); } let nft_id = TokenId(nft_id); - if RmrkCore::ensure_nft_type(collection_id, nft_id, NftType::Regular).is_err() { return Ok(Vec::new()); } + if RmrkCore::ensure_nft_type(collection_id, nft_id, NftType::Regular).is_err() { return Ok(None); } - /*let resource_collection_id: CollectionId = RmrkCore::get_nft_property_decoded(collection_id, nft_id, RmrkProperty::ResourceCollection) - .unwrap(); - if RmrkCore::ensure_collection_type(collection_id, CollectionType::Resource).is_err() { return Ok(Vec::new()); } - - let resources = pallet_nonfungible::TokenProperties::::iter_prefix((resource_collection_id,)) - .filter_map(|(resource_id, properties)| Some(( - resource_id, // ResourceId property - RmrkCore::get_nft_property_decoded(resource_collection_id, resource_id, RmrkProperty::Priority).unwrap(), - ))) - .collect() - .sort_by_key(|(_, index)| *index) - .into_iter().map(|(resource_id, _)| resource_id)*/ - let priorities = RmrkCore::get_nft_property_decoded(collection_id, nft_id, RmrkProperty::ResourcePriorities)?; - - Ok(priorities) + let priorities: Vec<_> = RmrkCore::get_nft_property_decoded(collection_id, nft_id, RmrkProperty::ResourcePriorities)?; + Ok( + priorities.into_iter() + .enumerate() + .find(|(_, id)| *id == resource_id) + .map(|(priority, _): (usize, RmrkResourceId)| priority as u32) + ) } fn base(base_id: RmrkBaseId) -> Result>, DispatchError> { -- gitstuff