difftreelog
feat(rmrk) add accept_resource
in: master
1 file changed
pallets/proxy-rmrk-core/src/lib.rsdiffbeforeafterboth134 CannotSendToDescendentOrSelf,134 CannotSendToDescendentOrSelf,135 CannotAcceptNonOwnedNft,135 CannotAcceptNonOwnedNft,136 CannotRejectNonOwnedNft,136 CannotRejectNonOwnedNft,137 ResourceNotPending,137 }138 }138139139 #[pallet::call]140 #[pallet::call]538 Ok(())539 Ok(())539 }540 }541542 #[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);552553 let collection_id = Self::unique_collection_id(rmrk_collection_id)554 .map_err(|_| <Error<T>>::ResourceDoesntExist)?;555556 let nft_id = rmrk_nft_id.into();557 let resource_id = rmrk_resource_id.into();558559 let budget = budget::Value::new(NESTING_BUDGET);560561 let nft_owner = <PalletStructure<T>>::find_topmost_owner(562 collection_id,563 nft_id,564 &budget,565 ).map_err(|_| <Error<T>>::ResourceDoesntExist)?;566567 let resource_collection_id: CollectionId =568 Self::get_nft_property_decoded(collection_id, nft_id, ResourceCollection)569 .map_err(|_| <Error<T>>::ResourceDoesntExist)?;570571 let is_pending: bool = Self::get_nft_property_decoded(resource_collection_id, resource_id, PendingResourceAccept)572 .map_err(|_| <Error<T>>::ResourceDoesntExist)?;573574 ensure!(is_pending, <Error<T>>::ResourceNotPending);575576 ensure!(cross_sender == nft_owner, <Error<T>>::NoPermission);577578 <PalletNft<T>>::set_scoped_token_property(579 resource_collection_id,580 resource_id,581 PropertyScope::Rmrk,582 Self::rmrk_property(PendingResourceAccept, &false)?,583 )?;584585 Ok(())586 }540587541 #[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);838839 // Check NFT lock status // todo depends on market, maybe later840 //ensure!(!Pallet::<T>::is_locked(collection_id, nft_id), pallet_uniques::Error::<T>::Locked);841885842 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);888844 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)?;894895 let pending = sender != nft_owner;845896846 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 them852903853 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 [