From ea54bfda484473ff63b059c9dfc420b45ea91989 Mon Sep 17 00:00:00 2001 From: Daniel Shiposha Date: Sun, 05 Jun 2022 22:49:49 +0000 Subject: [PATCH] feat(rmrk): add accept_resource_removal --- --- a/pallets/proxy-rmrk-core/src/lib.rs +++ b/pallets/proxy-rmrk-core/src/lib.rs @@ -558,18 +558,20 @@ let budget = budget::Value::new(NESTING_BUDGET); - let nft_owner = >::find_topmost_owner( - collection_id, - nft_id, - &budget, - ).map_err(|_| >::ResourceDoesntExist)?; + let nft_owner = + >::find_topmost_owner(collection_id, nft_id, &budget) + .map_err(|_| >::ResourceDoesntExist)?; let resource_collection_id: CollectionId = Self::get_nft_property_decoded(collection_id, nft_id, ResourceCollection) .map_err(|_| >::ResourceDoesntExist)?; - let is_pending: bool = Self::get_nft_property_decoded(resource_collection_id, resource_id, PendingResourceAccept) - .map_err(|_| >::ResourceDoesntExist)?; + let is_pending: bool = Self::get_nft_property_decoded( + resource_collection_id, + resource_id, + PendingResourceAccept, + ) + .map_err(|_| >::ResourceDoesntExist)?; ensure!(is_pending, >::ResourceNotPending); @@ -577,7 +579,7 @@ >::set_scoped_token_property( resource_collection_id, - resource_id, + rmrk_resource_id.into(), PropertyScope::Rmrk, Self::rmrk_property(PendingResourceAccept, &false)?, )?; @@ -587,6 +589,55 @@ #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))] #[transactional] + pub fn accept_resource_removal( + origin: OriginFor, + rmrk_collection_id: RmrkCollectionId, + rmrk_nft_id: RmrkNftId, + rmrk_resource_id: RmrkResourceId, + ) -> DispatchResult { + let sender = ensure_signed(origin)?; + let cross_sender = T::CrossAccountId::from_sub(sender); + + let collection_id = Self::unique_collection_id(rmrk_collection_id) + .map_err(|_| >::ResourceDoesntExist)?; + + let nft_id = rmrk_nft_id.into(); + let resource_id = rmrk_resource_id.into(); + + let budget = budget::Value::new(NESTING_BUDGET); + + let nft_owner = + >::find_topmost_owner(collection_id, nft_id, &budget) + .map_err(|_| >::ResourceDoesntExist)?; + + ensure!(cross_sender == nft_owner, >::NoPermission); + + let resource_collection_id: CollectionId = + Self::get_nft_property_decoded(collection_id, nft_id, ResourceCollection) + .map_err(|_| >::ResourceDoesntExist)?; + + let is_pending: bool = Self::get_nft_property_decoded( + resource_collection_id, + resource_id, + PendingResourceRemoval, + ) + .map_err(|_| >::ResourceDoesntExist)?; + + ensure!(is_pending, >::ResourceNotPending); + + let resource_collection = Self::get_typed_nft_collection( + resource_collection_id, + misc::CollectionType::Resource, + )?; + + >::burn(&resource_collection, &cross_sender, rmrk_resource_id.into()) + .map_err(Self::map_unique_err_to_proxy)?; + + Ok(()) + } + + #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))] + #[transactional] pub fn set_property( origin: OriginFor, #[pallet::compact] rmrk_collection_id: RmrkCollectionId, @@ -886,11 +937,8 @@ let sender = T::CrossAccountId::from_sub(sender); let budget = budget::Value::new(NESTING_BUDGET); - let nft_owner = >::find_topmost_owner( - collection_id, - token_id, - &budget, - ).map_err(Self::map_unique_err_to_proxy)?; + let nft_owner = >::find_topmost_owner(collection_id, token_id, &budget) + .map_err(Self::map_unique_err_to_proxy)?; let pending = sender != nft_owner; -- gitstuff