git.delta.rocks / unique-network / refs/commits / da5e7f48f1a3

difftreelog

feat(rmrk) add equippable extrinsic

Daniel Shiposha2022-06-20parent: #960c108.patch.diff
in: master

4 files changed

modifiedpallets/proxy-rmrk-core/src/lib.rsdiffbeforeafterboth
--- a/pallets/proxy-rmrk-core/src/lib.rs
+++ b/pallets/proxy-rmrk-core/src/lib.rs
@@ -1298,7 +1298,7 @@
 		collection.save()
 	}
 
-	fn check_collection_owner(
+	pub fn check_collection_owner(
 		collection: &NonfungibleHandle<T>,
 		account: &T::CrossAccountId,
 	) -> DispatchResult {
@@ -1363,7 +1363,11 @@
 		collection_id: CollectionId,
 	) -> Result<misc::CollectionType, DispatchError> {
 		Self::get_collection_property_decoded(collection_id, CollectionType)
-			.map_err(|_| <Error<T>>::CorruptedCollectionType.into())
+			.map_err(|err| if err != <Error<T>>::CollectionUnknown.into() {
+				<Error<T>>::CorruptedCollectionType.into()
+			} else {
+				err
+			})
 	}
 
 	pub fn ensure_collection_type(
modifiedpallets/proxy-rmrk-equip/src/lib.rsdiffbeforeafterboth
23use pallet_common::{Pallet as PalletCommon, Error as CommonError};23use pallet_common::{Pallet as PalletCommon, Error as CommonError};
24use pallet_rmrk_core::{24use pallet_rmrk_core::{
25 Pallet as PalletCore,25 Pallet as PalletCore,
26 Error as CoreError,
26 misc::{self, *},27 misc::{self, *},
27 property::RmrkProperty::*,28 property::RmrkProperty::*,
28};29};
70 issuer: T::AccountId,71 issuer: T::AccountId,
71 base_id: RmrkBaseId,72 base_id: RmrkBaseId,
72 },73 },
74 EquippablesUpdated {
75 base_id: RmrkBaseId,
76 slot_id: RmrkSlotId,
77 },
73 }78 }
7479
75 #[pallet::error]80 #[pallet::error]
79 NoAvailablePartId,84 NoAvailablePartId,
80 BaseDoesntExist,85 BaseDoesntExist,
81 NeedsDefaultThemeFirst,86 NeedsDefaultThemeFirst,
87 PartDoesntExist,
88 NoEquippableOnFixedPart,
82 }89 }
8390
84 #[pallet::call]91 #[pallet::call]
182189
183 let collection_id: CollectionId = base_id.into();190 let collection_id: CollectionId = base_id.into();
184191
185 let collection = <PalletCore<T>>::get_typed_nft_collection(192 let collection = Self::get_base(collection_id)?;
186 collection_id,
187 misc::CollectionType::Base,
188 )
189 .map_err(|_| <Error<T>>::BaseDoesntExist)?;
190 collection.check_is_external()?;
191193
192 if theme.name.as_slice() == b"default" {194 if theme.name.as_slice() == b"default" {
193 <BaseHasDefaultTheme<T>>::insert(collection_id, true);195 <BaseHasDefaultTheme<T>>::insert(collection_id, true);
223 Ok(())225 Ok(())
224 }226 }
227
228 #[transactional]
229 #[pallet::weight(<SelfWeightOf<T>>::equippable())]
230 pub fn equippable(
231 origin: OriginFor<T>,
232 base_id: RmrkBaseId,
233 slot_id: RmrkSlotId,
234 equippables: RmrkEquippableList,
235 ) -> DispatchResult {
236 let sender = ensure_signed(origin)?;
237
238 let base_collection_id = base_id.into();
239 let collection = Self::get_base(base_collection_id)?;
240
241 <PalletCore<T>>::check_collection_owner(&collection, &T::CrossAccountId::from_sub(sender))
242 .map_err(|err| if err == <CoreError<T>>::NoPermission.into() {
243 <Error<T>>::PermissionError.into()
244 } else {
245 err
246 })?;
247
248 let part_id = Self::internal_part_id(base_collection_id, slot_id)
249 .ok_or(<Error<T>>::PartDoesntExist)?;
250
251 let nft_type = <PalletCore<T>>::get_nft_type(base_collection_id, part_id)
252 .map_err(|_| <Error<T>>::PartDoesntExist)?;
253
254 match nft_type {
255 NftType::Regular | NftType::Theme => return Err(<Error<T>>::PermissionError.into()),
256 NftType::FixedPart => return Err(<Error<T>>::NoEquippableOnFixedPart.into()),
257 NftType::SlotPart => {
258 <PalletNft<T>>::set_scoped_token_property(
259 base_collection_id,
260 part_id,
261 PropertyScope::Rmrk,
262 <PalletCore<T>>::rmrk_property(EquippableList, &equippables)?,
263 )?;
264 }
265 }
266
267 Self::deposit_event(Event::EquippablesUpdated {
268 base_id,
269 slot_id,
270 });
271
272 Ok(())
273 }
225 }274 }
226}275}
227276
269 Ok(token_id)318 Ok(token_id)
270 }319 }
320
321 fn get_base(base_id: CollectionId) -> Result<NonfungibleHandle<T>, DispatchError> {
322 let collection = <PalletCore<T>>::get_typed_nft_collection(base_id, misc::CollectionType::Base)
323 .map_err(|err| if err == <CoreError<T>>::CollectionUnknown.into() {
324 <Error<T>>::BaseDoesntExist.into()
325 } else {
326 err
327 })?;
328 collection.check_is_external()?;
329
330 Ok(collection)
331 }
271}332}
272333
modifiedpallets/proxy-rmrk-equip/src/weights.rsdiffbeforeafterboth
--- a/pallets/proxy-rmrk-equip/src/weights.rs
+++ b/pallets/proxy-rmrk-equip/src/weights.rs
@@ -3,7 +3,7 @@
 //! Autogenerated weights for pallet_proxy_rmrk_equip
 //!
 //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2022-06-16, STEPS: `50`, REPEAT: 80, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! DATE: 2022-06-20, STEPS: `50`, REPEAT: 80, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024
 
 // Executed Command:
@@ -35,6 +35,7 @@
 pub trait WeightInfo {
 	fn create_base(b: u32, ) -> Weight;
 	fn theme_add(b: u32, ) -> Weight;
+	fn equippable() -> Weight;
 }
 
 /// Weights for pallet_proxy_rmrk_equip using the Substrate node and recommended hardware.
@@ -53,13 +54,13 @@
 	// Storage: Nonfungible Owned (r:0 w:1)
 	// Storage: RmrkEquip InernalPartId (r:0 w:1)
 	fn create_base(b: u32, ) -> Weight {
-		(43_216_000 as Weight)
+		(44_632_000 as Weight)
 			// Standard Error: 10_000
-			.saturating_add((16_253_000 as Weight).saturating_mul(b as Weight))
+			.saturating_add((16_912_000 as Weight).saturating_mul(b as Weight))
 			.saturating_add(T::DbWeight::get().reads(6 as Weight))
 			.saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(b as Weight)))
-			.saturating_add(T::DbWeight::get().writes(9 as Weight))
-			.saturating_add(T::DbWeight::get().writes((3 as Weight).saturating_mul(b as Weight)))
+			.saturating_add(T::DbWeight::get().writes(8 as Weight))
+			.saturating_add(T::DbWeight::get().writes((4 as Weight).saturating_mul(b as Weight)))
 	}
 	// Storage: Common CollectionProperties (r:1 w:0)
 	// Storage: Common CollectionById (r:1 w:0)
@@ -70,12 +71,21 @@
 	// Storage: Nonfungible TokenData (r:0 w:1)
 	// Storage: Nonfungible Owned (r:0 w:1)
 	fn theme_add(b: u32, ) -> Weight {
-		(39_467_000 as Weight)
-			// Standard Error: 15_000
-			.saturating_add((2_332_000 as Weight).saturating_mul(b as Weight))
+		(39_525_000 as Weight)
+			// Standard Error: 12_000
+			.saturating_add((2_494_000 as Weight).saturating_mul(b as Weight))
 			.saturating_add(T::DbWeight::get().reads(6 as Weight))
 			.saturating_add(T::DbWeight::get().writes(5 as Weight))
 	}
+	// Storage: Common CollectionProperties (r:1 w:0)
+	// Storage: Common CollectionById (r:1 w:0)
+	// Storage: RmrkEquip InernalPartId (r:1 w:0)
+	// Storage: Nonfungible TokenProperties (r:1 w:1)
+	fn equippable() -> Weight {
+		(27_371_000 as Weight)
+			.saturating_add(T::DbWeight::get().reads(4 as Weight))
+			.saturating_add(T::DbWeight::get().writes(1 as Weight))
+	}
 }
 
 // For backwards compatibility and tests
@@ -93,13 +103,13 @@
 	// Storage: Nonfungible Owned (r:0 w:1)
 	// Storage: RmrkEquip InernalPartId (r:0 w:1)
 	fn create_base(b: u32, ) -> Weight {
-		(43_216_000 as Weight)
+		(44_632_000 as Weight)
 			// Standard Error: 10_000
-			.saturating_add((16_253_000 as Weight).saturating_mul(b as Weight))
+			.saturating_add((16_912_000 as Weight).saturating_mul(b as Weight))
 			.saturating_add(RocksDbWeight::get().reads(6 as Weight))
 			.saturating_add(RocksDbWeight::get().reads((1 as Weight).saturating_mul(b as Weight)))
-			.saturating_add(RocksDbWeight::get().writes(9 as Weight))
-			.saturating_add(RocksDbWeight::get().writes((3 as Weight).saturating_mul(b as Weight)))
+			.saturating_add(RocksDbWeight::get().writes(8 as Weight))
+			.saturating_add(RocksDbWeight::get().writes((4 as Weight).saturating_mul(b as Weight)))
 	}
 	// Storage: Common CollectionProperties (r:1 w:0)
 	// Storage: Common CollectionById (r:1 w:0)
@@ -110,10 +120,19 @@
 	// Storage: Nonfungible TokenData (r:0 w:1)
 	// Storage: Nonfungible Owned (r:0 w:1)
 	fn theme_add(b: u32, ) -> Weight {
-		(39_467_000 as Weight)
-			// Standard Error: 15_000
-			.saturating_add((2_332_000 as Weight).saturating_mul(b as Weight))
+		(39_525_000 as Weight)
+			// Standard Error: 12_000
+			.saturating_add((2_494_000 as Weight).saturating_mul(b as Weight))
 			.saturating_add(RocksDbWeight::get().reads(6 as Weight))
 			.saturating_add(RocksDbWeight::get().writes(5 as Weight))
 	}
+	// Storage: Common CollectionProperties (r:1 w:0)
+	// Storage: Common CollectionById (r:1 w:0)
+	// Storage: RmrkEquip InernalPartId (r:1 w:0)
+	// Storage: Nonfungible TokenProperties (r:1 w:1)
+	fn equippable() -> Weight {
+		(27_371_000 as Weight)
+			.saturating_add(RocksDbWeight::get().reads(4 as Weight))
+			.saturating_add(RocksDbWeight::get().writes(1 as Weight))
+	}
 }
modifiedprimitives/data-structs/src/lib.rsdiffbeforeafterboth
--- a/primitives/data-structs/src/lib.rs
+++ b/primitives/data-structs/src/lib.rs
@@ -39,15 +39,15 @@
 // RMRK
 use rmrk_traits::{
 	CollectionInfo, NftInfo, ResourceInfo, PropertyInfo, BaseInfo, PartType, Theme, ThemeProperty,
-	ResourceTypes, BasicResource, ComposableResource, SlotResource,
+	ResourceTypes, BasicResource, ComposableResource, SlotResource, EquippableList,
 };
 pub use rmrk_traits::{
 	primitives::{
 		CollectionId as RmrkCollectionId, NftId as RmrkNftId, BaseId as RmrkBaseId,
-		PartId as RmrkPartId, ResourceId as RmrkResourceId,
+		SlotId as RmrkSlotId, PartId as RmrkPartId, ResourceId as RmrkResourceId,
 	},
 	NftChild as RmrkNftChild, AccountIdOrCollectionNftTuple as RmrkAccountIdOrCollectionNftTuple,
-	FixedPart as RmrkFixedPart, SlotPart as RmrkSlotPart, EquippableList as RmrkEquippableList,
+	FixedPart as RmrkFixedPart, SlotPart as RmrkSlotPart,
 };
 
 mod bounded;
@@ -987,8 +987,9 @@
 pub type RmrkResourceInfo = ResourceInfo<RmrkString, RmrkBoundedParts>;
 pub type RmrkPropertyInfo = PropertyInfo<RmrkKeyString, RmrkValueString>;
 pub type RmrkBaseInfo<AccountId> = BaseInfo<AccountId, RmrkString>;
-pub type RmrkPartType =
-	PartType<RmrkString, BoundedVec<RmrkCollectionId, RmrkMaxCollectionsEquippablePerPart>>;
+pub type BoundedEquippableCollectionIds = BoundedVec<RmrkCollectionId, RmrkMaxCollectionsEquippablePerPart>;
+pub type RmrkPartType = PartType<RmrkString, BoundedEquippableCollectionIds>;
+pub type RmrkEquippableList = EquippableList<BoundedEquippableCollectionIds>;
 pub type RmrkThemeProperty = ThemeProperty<RmrkString>;
 pub type RmrkTheme = Theme<RmrkString, Vec<RmrkThemeProperty>>;
 pub type RmrkBoundedTheme = Theme<RmrkString, BoundedVec<RmrkThemeProperty, MaxPropertiesPerTheme>>;