git.delta.rocks / unique-network / refs/commits / 0913f409209f

difftreelog

feat(rmrk) add accept_resource

Daniel Shiposha2022-06-05parent: #416d78a.patch.diff
in: master

1 file changed

modifiedpallets/proxy-rmrk-core/src/lib.rsdiffbeforeafterboth
134 CannotSendToDescendentOrSelf,134 CannotSendToDescendentOrSelf,
135 CannotAcceptNonOwnedNft,135 CannotAcceptNonOwnedNft,
136 CannotRejectNonOwnedNft,136 CannotRejectNonOwnedNft,
137 ResourceNotPending,
137 }138 }
138139
139 #[pallet::call]140 #[pallet::call]
538 Ok(())539 Ok(())
539 }540 }
541
542 #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))]
543 #[transactional]
544 pub fn accept_resource(
545 origin: OriginFor<T>,
546 rmrk_collection_id: RmrkCollectionId,
547 rmrk_nft_id: RmrkNftId,
548 rmrk_resource_id: RmrkResourceId,
549 ) -> DispatchResult {
550 let sender = ensure_signed(origin)?;
551 let cross_sender = T::CrossAccountId::from_sub(sender);
552
553 let collection_id = Self::unique_collection_id(rmrk_collection_id)
554 .map_err(|_| <Error<T>>::ResourceDoesntExist)?;
555
556 let nft_id = rmrk_nft_id.into();
557 let resource_id = rmrk_resource_id.into();
558
559 let budget = budget::Value::new(NESTING_BUDGET);
560
561 let nft_owner = <PalletStructure<T>>::find_topmost_owner(
562 collection_id,
563 nft_id,
564 &budget,
565 ).map_err(|_| <Error<T>>::ResourceDoesntExist)?;
566
567 let resource_collection_id: CollectionId =
568 Self::get_nft_property_decoded(collection_id, nft_id, ResourceCollection)
569 .map_err(|_| <Error<T>>::ResourceDoesntExist)?;
570
571 let is_pending: bool = Self::get_nft_property_decoded(resource_collection_id, resource_id, PendingResourceAccept)
572 .map_err(|_| <Error<T>>::ResourceDoesntExist)?;
573
574 ensure!(is_pending, <Error<T>>::ResourceNotPending);
575
576 ensure!(cross_sender == nft_owner, <Error<T>>::NoPermission);
577
578 <PalletNft<T>>::set_scoped_token_property(
579 resource_collection_id,
580 resource_id,
581 PropertyScope::Rmrk,
582 Self::rmrk_property(PendingResourceAccept, &false)?,
583 )?;
584
585 Ok(())
586 }
540587
541 #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))]588 #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))]
542 #[transactional]589 #[transactional]
836 Self::get_typed_nft_collection(collection_id, misc::CollectionType::Regular)?;883 Self::get_typed_nft_collection(collection_id, misc::CollectionType::Regular)?;
837 ensure!(collection.owner == sender, Error::<T>::NoPermission);884 ensure!(collection.owner == sender, Error::<T>::NoPermission);
838
839 // Check NFT lock status // todo depends on market, maybe later
840 //ensure!(!Pallet::<T>::is_locked(collection_id, nft_id), pallet_uniques::Error::<T>::Locked);
841885
842 let sender = T::CrossAccountId::from_sub(sender);886 let sender = T::CrossAccountId::from_sub(sender);
843 let budget = budget::Value::new(NESTING_BUDGET);887 let budget = budget::Value::new(NESTING_BUDGET);
888
844 let pending = Self::ensure_nft_owner(collection_id, token_id, &sender, &budget).is_err();889 let nft_owner = <PalletStructure<T>>::find_topmost_owner(
890 collection_id,
891 token_id,
892 &budget,
893 ).map_err(Self::map_unique_err_to_proxy)?;
894
895 let pending = sender != nft_owner;
845896
846 let resource_collection_id: CollectionId =897 let resource_collection_id: CollectionId =
847 Self::get_nft_property_decoded(collection_id, token_id, ResourceCollection)?;898 Self::get_nft_property_decoded(collection_id, token_id, ResourceCollection)?;
851 // todo probably add extra connections to bases, slots, etc., when RMRK starts to use them902 // todo probably add extra connections to bases, slots, etc., when RMRK starts to use them
852903
853 let resource_id = Self::create_nft(904 let resource_id = Self::create_nft(
854 &sender, // todo owner of the nft?905 &sender,
855 &sender,906 &nft_owner,
856 &resource_collection,907 &resource_collection,
857 resource_properties.chain(908 resource_properties.chain(
858 [909 [