--- a/pallets/proxy-rmrk-core/src/lib.rs +++ b/pallets/proxy-rmrk-core/src/lib.rs @@ -353,9 +353,10 @@ royalty_amount: Option, metadata: RmrkString, transferable: bool, + resources: Option> ) -> 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 { + 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, ) -> Result { --- a/primitives/data-structs/src/lib.rs +++ b/primitives/data-structs/src/lib.rs @@ -952,6 +952,8 @@ pub const RmrkPartsLimit: u32 = 25; #[derive(PartialEq)] pub const RmrkMaxPriorities: u32 = 25; + #[derive(PartialEq)] + pub const MaxResourcesOnMint: u32 = 100; } impl From for CollectionId {