git.delta.rocks / unique-network / refs/commits / 1946e45ceb05

difftreelog

feat(rmrk) add resource at minting

Daniel Shiposha2022-06-14parent: #dacc78c.patch.diff
in: master

2 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
@@ -353,9 +353,10 @@
 			royalty_amount: Option<Permill>,
 			metadata: RmrkString,
 			transferable: bool,
+			resources: Option<BoundedVec<RmrkResourceTypes, MaxResourcesOnMint>>
 		) -> DispatchResult {
 			let sender = ensure_signed(origin)?;
-			let sender = T::CrossAccountId::from_sub(sender);
+			let cross_sender = T::CrossAccountId::from_sub(sender.clone());
 			let cross_owner = T::CrossAccountId::from_sub(owner.clone());
 
 			let collection = Self::get_typed_nft_collection(
@@ -370,7 +371,7 @@
 			});
 
 			let nft_id = Self::create_nft(
-				&sender,
+				&cross_sender,
 				&cross_owner,
 				&collection,
 				[
@@ -390,6 +391,17 @@
 				err => Self::map_unique_err_to_proxy(err),
 			})?;
 
+			if let Some(resources) = resources {
+				for resource in resources {
+					Self::resource_add(
+						sender.clone(),
+						collection.id,
+						nft_id,
+						resource
+					)?;
+				}
+			}
+
 			Self::deposit_event(Event::NftMinted {
 				owner,
 				collection_id,
@@ -921,15 +933,7 @@
 				sender,
 				collection_id,
 				nft_id.into(),
-				[
-					Self::rmrk_property(TokenType, &NftType::Resource)?,
-					Self::rmrk_property(ResourceType, &misc::ResourceType::Basic)?,
-					Self::rmrk_property(Src, &resource.src)?,
-					Self::rmrk_property(Metadata, &resource.metadata)?,
-					Self::rmrk_property(License, &resource.license)?,
-					Self::rmrk_property(Thumb, &resource.thumb)?,
-				]
-				.into_iter(),
+				RmrkResourceTypes::Basic(resource),
 			)?;
 
 			Self::deposit_event(Event::ResourceAdded {
@@ -959,17 +963,7 @@
 				sender,
 				collection_id,
 				nft_id.into(),
-				[
-					Self::rmrk_property(TokenType, &NftType::Resource)?,
-					Self::rmrk_property(ResourceType, &misc::ResourceType::Composable)?,
-					Self::rmrk_property(Parts, &resource.parts)?,
-					Self::rmrk_property(Base, &resource.base)?,
-					Self::rmrk_property(Src, &resource.src)?,
-					Self::rmrk_property(Metadata, &resource.metadata)?,
-					Self::rmrk_property(License, &resource.license)?,
-					Self::rmrk_property(Thumb, &resource.thumb)?,
-				]
-				.into_iter(),
+				RmrkResourceTypes::Composable(resource)
 			)?;
 
 			Self::deposit_event(Event::ResourceAdded {
@@ -999,17 +993,7 @@
 				sender,
 				collection_id,
 				nft_id.into(),
-				[
-					Self::rmrk_property(TokenType, &NftType::Resource)?,
-					Self::rmrk_property(ResourceType, &misc::ResourceType::Slot)?,
-					Self::rmrk_property(Base, &resource.base)?,
-					Self::rmrk_property(Src, &resource.src)?,
-					Self::rmrk_property(Metadata, &resource.metadata)?,
-					Self::rmrk_property(Slot, &resource.slot)?,
-					Self::rmrk_property(License, &resource.license)?,
-					Self::rmrk_property(Thumb, &resource.thumb)?,
-				]
-				.into_iter(),
+				RmrkResourceTypes::Slot(resource),
 			)?;
 
 			Self::deposit_event(Event::ResourceAdded {
@@ -1177,6 +1161,68 @@
 	fn resource_add(
 		sender: T::AccountId,
 		collection_id: CollectionId,
+		nft_id: TokenId,
+		resource: RmrkResourceTypes
+	) -> Result<RmrkResourceId, DispatchError> {
+		match resource {
+			RmrkResourceTypes::Basic(resource) => {
+				Self::resource_add_helper(
+					sender,
+					collection_id,
+					nft_id,
+					[
+						Self::rmrk_property(TokenType, &NftType::Resource)?,
+						Self::rmrk_property(ResourceType, &misc::ResourceType::Basic)?,
+						Self::rmrk_property(Src, &resource.src)?,
+						Self::rmrk_property(Metadata, &resource.metadata)?,
+						Self::rmrk_property(License, &resource.license)?,
+						Self::rmrk_property(Thumb, &resource.thumb)?,
+					]
+					.into_iter(),
+				)
+			},
+			RmrkResourceTypes::Composable(resource) => {
+				Self::resource_add_helper(
+					sender,
+					collection_id,
+					nft_id.into(),
+					[
+						Self::rmrk_property(TokenType, &NftType::Resource)?,
+						Self::rmrk_property(ResourceType, &misc::ResourceType::Composable)?,
+						Self::rmrk_property(Parts, &resource.parts)?,
+						Self::rmrk_property(Base, &resource.base)?,
+						Self::rmrk_property(Src, &resource.src)?,
+						Self::rmrk_property(Metadata, &resource.metadata)?,
+						Self::rmrk_property(License, &resource.license)?,
+						Self::rmrk_property(Thumb, &resource.thumb)?,
+					]
+					.into_iter(),
+				)
+			},
+			RmrkResourceTypes::Slot(resource) => {
+				Self::resource_add_helper(
+					sender,
+					collection_id,
+					nft_id.into(),
+					[
+						Self::rmrk_property(TokenType, &NftType::Resource)?,
+						Self::rmrk_property(ResourceType, &misc::ResourceType::Slot)?,
+						Self::rmrk_property(Base, &resource.base)?,
+						Self::rmrk_property(Src, &resource.src)?,
+						Self::rmrk_property(Metadata, &resource.metadata)?,
+						Self::rmrk_property(Slot, &resource.slot)?,
+						Self::rmrk_property(License, &resource.license)?,
+						Self::rmrk_property(Thumb, &resource.thumb)?,
+					]
+					.into_iter(),
+				)
+			}
+		}
+	}
+
+	fn resource_add_helper(
+		sender: T::AccountId,
+		collection_id: CollectionId,
 		token_id: TokenId,
 		resource_properties: impl Iterator<Item = Property>,
 	) -> Result<RmrkResourceId, DispatchError> {
modifiedprimitives/data-structs/src/lib.rsdiffbeforeafterboth
952 pub const RmrkPartsLimit: u32 = 25;952 pub const RmrkPartsLimit: u32 = 25;
953 #[derive(PartialEq)]953 #[derive(PartialEq)]
954 pub const RmrkMaxPriorities: u32 = 25;954 pub const RmrkMaxPriorities: u32 = 25;
955 #[derive(PartialEq)]
956 pub const MaxResourcesOnMint: u32 = 100;
955}957}
956958
957impl From<RmrkCollectionId> for CollectionId {959impl From<RmrkCollectionId> for CollectionId {