git.delta.rocks / unique-network / refs/commits / 22128f82de1c

difftreelog

feat(rmrk) add set_priority

Daniel Shiposha2022-06-06parent: #5539af3.patch.diff
in: master

5 files changed

modifiedclient/rpc/src/lib.rsdiffbeforeafterboth
276 at: Option<BlockHash>,276 at: Option<BlockHash>,
277 ) -> Result<Vec<ResourceInfo>>;277 ) -> Result<Vec<ResourceInfo>>;
278278
279 #[method(name = "rmrk_nftResourcePriorities")]279 #[method(name = "rmrk_nftResourcePriority")]
280 /// Get NFT resource priorities280 /// Get NFT resource priority
281 fn nft_resource_priorities(281 fn nft_resource_priority(
282 &self,282 &self,
283 collection_id: RmrkCollectionId,283 collection_id: RmrkCollectionId,
284 nft_id: RmrkNftId,284 nft_id: RmrkNftId,
285 resource_id: RmrkResourceId,
285 at: Option<BlockHash>,286 at: Option<BlockHash>,
286 ) -> Result<Vec<RmrkResourceId>>;287 ) -> Result<Option<u32>>;
287288
288 #[method(name = "rmrk_base")]289 #[method(name = "rmrk_base")]
289 /// Get base info290 /// Get base info
522 rmrk_api523 rmrk_api
523 );524 );
524 pass_method!(nft_resources(collection_id: RmrkCollectionId, nft_id: RmrkNftId) -> Vec<ResourceInfo>, rmrk_api);525 pass_method!(nft_resources(collection_id: RmrkCollectionId, nft_id: RmrkNftId) -> Vec<ResourceInfo>, rmrk_api);
525 pass_method!(nft_resource_priorities(collection_id: RmrkCollectionId, nft_id: RmrkNftId) -> Vec<RmrkResourceId>, rmrk_api);526 pass_method!(nft_resource_priority(collection_id: RmrkCollectionId, nft_id: RmrkNftId, resource_id: RmrkResourceId) -> Option<u32>, rmrk_api);
526 pass_method!(base(base_id: RmrkBaseId) -> Option<BaseInfo>, rmrk_api);527 pass_method!(base(base_id: RmrkBaseId) -> Option<BaseInfo>, rmrk_api);
527 pass_method!(base_parts(base_id: RmrkBaseId) -> Vec<PartType>, rmrk_api);528 pass_method!(base_parts(base_id: RmrkBaseId) -> Vec<PartType>, rmrk_api);
528 pass_method!(theme_names(base_id: RmrkBaseId) -> Vec<RmrkThemeName>, rmrk_api);529 pass_method!(theme_names(base_id: RmrkBaseId) -> Vec<RmrkThemeName>, rmrk_api);
modifiedpallets/proxy-rmrk-core/src/lib.rsdiffbeforeafterboth
693 Ok(())693 Ok(())
694 }694 }
695
696 #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))]
697 #[transactional]
698 pub fn set_priority(
699 origin: OriginFor<T>,
700 rmrk_collection_id: RmrkCollectionId,
701 rmrk_nft_id: RmrkNftId,
702 priorities: BoundedVec<RmrkResourceId, RmrkMaxPriorities>,
703 ) -> DispatchResult {
704 let sender = ensure_signed(origin)?;
705 let sender = T::CrossAccountId::from_sub(sender);
706
707 let collection_id = Self::unique_collection_id(rmrk_collection_id)?;
708 let nft_id = rmrk_nft_id.into();
709 let budget = budget::Value::new(NESTING_BUDGET);
710
711 Self::ensure_nft_type(collection_id, nft_id, NftType::Regular)?;
712 Self::ensure_nft_owner(collection_id, nft_id, &sender, &budget)?;
713
714 <PalletNft<T>>::set_scoped_token_property(
715 collection_id,
716 nft_id,
717 PropertyScope::Rmrk,
718 Self::rmrk_property(ResourcePriorities, &priorities.into_inner())?
719 )?;
720
721 Ok(())
722 }
695723
696 #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))]724 #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))]
697 #[transactional]725 #[transactional]
1160 token_id: TokenId,1188 token_id: TokenId,
1161 ) -> Result<NftType, DispatchError> {1189 ) -> Result<NftType, DispatchError> {
1162 Self::get_nft_property_decoded(collection_id, token_id, TokenType)1190 Self::get_nft_property_decoded(collection_id, token_id, TokenType)
1163 .map_err(|_| <Error<T>>::NftTypeEncodeError.into())1191 .map_err(|_| <Error<T>>::NoAvailableNftId.into())
1164 }1192 }
11651193
1166 pub fn ensure_nft_type(1194 pub fn ensure_nft_type(
modifiedprimitives/data-structs/src/lib.rsdiffbeforeafterboth
929 pub const RmrkMaxCollectionsEquippablePerPart: u32 = 100;929 pub const RmrkMaxCollectionsEquippablePerPart: u32 = 100;
930 #[derive(PartialEq)]930 #[derive(PartialEq)]
931 pub const RmrkPartsLimit: u32 = 3;931 pub const RmrkPartsLimit: u32 = 3;
932 #[derive(PartialEq)]
933 pub const RmrkMaxPriorities: u32 = 3;
932}934}
933935
934impl From<RmrkCollectionId> for CollectionId {936impl From<RmrkCollectionId> for CollectionId {
modifiedprimitives/rmrk-rpc/src/lib.rsdiffbeforeafterboth
5050
51 fn nft_resources(collection_id: CollectionId, nft_id: NftId) -> Result<Vec<ResourceInfo>>;51 fn nft_resources(collection_id: CollectionId, nft_id: NftId) -> Result<Vec<ResourceInfo>>;
5252
53 fn nft_resource_priorities(collection_id: CollectionId, nft_id: NftId) -> Result<Vec<ResourceId>>;53 fn nft_resource_priority(collection_id: CollectionId, nft_id: NftId, resource_id: ResourceId) -> Result<Option<u32>>;
5454
55 fn base(base_id: BaseId) -> Result<Option<BaseInfo>>;55 fn base(base_id: BaseId) -> Result<Option<BaseInfo>>;
5656
modifiedruntime/common/src/runtime_apis.rsdiffbeforeafterboth
363 Ok(resources)363 Ok(resources)
364 }364 }
365365
366 fn nft_resource_priorities(collection_id: RmrkCollectionId, nft_id: RmrkNftId) -> Result<Vec<RmrkResourceId>, DispatchError> {366 fn nft_resource_priority(collection_id: RmrkCollectionId, nft_id: RmrkNftId, resource_id: RmrkResourceId) -> Result<Option<u32>, DispatchError> {
367 use pallet_proxy_rmrk_core::{RmrkProperty, misc::{CollectionType, NftType}};367 use pallet_proxy_rmrk_core::{RmrkProperty, misc::{CollectionType, NftType}};
368368
369 let collection_id = match RmrkCore::unique_collection_id(collection_id) {369 let collection_id = match RmrkCore::unique_collection_id(collection_id) {
370 Ok(id) => id,370 Ok(id) => id,
371 Err(_) => return Ok(Vec::new())371 Err(_) => return Ok(None)
372 };372 };
373 if RmrkCore::ensure_collection_type(collection_id, CollectionType::Regular).is_err() { return Ok(Vec::new()); }373 if RmrkCore::ensure_collection_type(collection_id, CollectionType::Regular).is_err() { return Ok(None); }
374374
375 let nft_id = TokenId(nft_id);375 let nft_id = TokenId(nft_id);
376 if RmrkCore::ensure_nft_type(collection_id, nft_id, NftType::Regular).is_err() { return Ok(Vec::new()); }376 if RmrkCore::ensure_nft_type(collection_id, nft_id, NftType::Regular).is_err() { return Ok(None); }
377377
378 /*let resource_collection_id: CollectionId = RmrkCore::get_nft_property_decoded(collection_id, nft_id, RmrkProperty::ResourceCollection)
379 .unwrap();
380 if RmrkCore::ensure_collection_type(collection_id, CollectionType::Resource).is_err() { return Ok(Vec::new()); }
381
382 let resources = pallet_nonfungible::TokenProperties::<Runtime>::iter_prefix((resource_collection_id,))
383 .filter_map(|(resource_id, properties)| Some((
384 resource_id, // ResourceId property
385 RmrkCore::get_nft_property_decoded(resource_collection_id, resource_id, RmrkProperty::Priority).unwrap(),
386 )))
387 .collect()
388 .sort_by_key(|(_, index)| *index)
389 .into_iter().map(|(resource_id, _)| resource_id)*/
390 let priorities = RmrkCore::get_nft_property_decoded(collection_id, nft_id, RmrkProperty::ResourcePriorities)?;378 let priorities: Vec<_> = RmrkCore::get_nft_property_decoded(collection_id, nft_id, RmrkProperty::ResourcePriorities)?;
391
392 Ok(priorities)379 Ok(
380 priorities.into_iter()
381 .enumerate()
382 .find(|(_, id)| *id == resource_id)
383 .map(|(priority, _): (usize, RmrkResourceId)| priority as u32)
384 )
393 }385 }
394386