difftreelog
feat(rmrk) add resource at minting
in: master
2 files changed
pallets/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> {
primitives/data-structs/src/lib.rsdiffbeforeafterboth952 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}956958957impl From<RmrkCollectionId> for CollectionId {959impl From<RmrkCollectionId> for CollectionId {