--- a/pallets/proxy-rmrk-equip/src/benchmarking.rs +++ b/pallets/proxy-rmrk-equip/src/benchmarking.rs @@ -21,9 +21,9 @@ vec![0; S::get() as usize].try_into().expect("size == S") } -fn create_max_part() -> RmrkPartType { +fn create_max_part(id: RmrkSlotId) -> RmrkPartType { RmrkPartType::SlotPart(RmrkSlotPart { - id: 42, + id, equippable: RmrkEquippableList::Custom(create_u32_array()), src: create_data(), z: 1, @@ -31,9 +31,13 @@ } fn create_parts_array>(num: u32) -> BoundedVec { - vec![create_max_part(); num as usize] - .try_into() - .expect("num <= S") + let mut parts: BoundedVec = vec![].try_into().expect("0 <= S"); + + for i in 0..num { + parts.try_push(create_max_part(i)).expect("num <= S"); + } + + parts } fn create_max_theme_property() -> RmrkThemeProperty { @@ -90,4 +94,27 @@ let theme = create_max_theme(create_data(), b); }: _(RawOrigin::Signed(caller), base_id, theme) + + equippable { + let caller = account("caller", 0, SEED); + ::Currency::deposit_creating(&caller, T::CollectionCreationPrice::get()); + + let base_id = 1; + let slot_id = 42; + + let base_type = create_data(); + let symbol = create_data(); + let parts = vec! { + RmrkPartType::SlotPart(RmrkSlotPart { + id: slot_id, + equippable: RmrkEquippableList::All, + src: create_data(), + z: 1, + }) + }.try_into().expect("1 <= RmrkPartsLimit"); + + >::create_base(RawOrigin::Signed(caller.clone()).into(), base_type, symbol, parts)?; + + let equippables = RmrkEquippableList::Custom(create_u32_array()); + }: _(RawOrigin::Signed(caller), base_id, slot_id, equippables) } --- a/pallets/proxy-rmrk-equip/src/lib.rs +++ b/pallets/proxy-rmrk-equip/src/lib.rs @@ -141,17 +141,7 @@ let collection = >::get_nft_collection(collection_id)?; for part in parts { - let part_id = part.id(); - let part_token_id = Self::create_part(&cross_sender, &collection, part)?; - - >::insert(collection_id, part_id, part_token_id); - - >::set_scoped_token_property( - collection_id, - part_token_id, - PropertyScope::Rmrk, - >::rmrk_property(ExternalPartId, &part_id)?, - )?; + Self::create_part(&cross_sender, &collection, part)?; } Self::deposit_event(Event::BaseCreated { @@ -279,9 +269,10 @@ sender: &T::CrossAccountId, collection: &NonfungibleHandle, part: RmrkPartType, - ) -> Result { + ) -> DispatchResult { let owner = sender; + let part_id = part.id(); let src = part.src(); let z_index = part.z_index(); @@ -290,32 +281,55 @@ RmrkPartType::SlotPart(_) => NftType::SlotPart, }; - let token_id = >::create_nft( - sender, - owner, - collection, + let token_id = match Self::internal_part_id(collection.id, part_id) { + Some(token_id) => token_id, + None => { + let token_id = >::create_nft( + sender, + owner, + collection, + [].into_iter(), + ) + .map_err(|err| match err { + DispatchError::Arithmetic(_) => >::NoAvailablePartId.into(), + err => err, + })?; + + >::insert(collection.id, part_id, token_id); + + >::set_scoped_token_property( + collection.id, + token_id, + PropertyScope::Rmrk, + >::rmrk_property(ExternalPartId, &part_id)?, + )?; + + token_id + } + }; + + >::set_scoped_token_properties( + collection.id, + token_id, + PropertyScope::Rmrk, [ >::rmrk_property(TokenType, &nft_type)?, >::rmrk_property(Src, &src)?, >::rmrk_property(ZIndex, &z_index)?, ] - .into_iter(), - ) - .map_err(|err| match err { - DispatchError::Arithmetic(_) => >::NoAvailablePartId.into(), - err => err, - })?; + .into_iter() + )?; if let RmrkPartType::SlotPart(part) = part { >::set_scoped_token_property( collection.id, token_id, PropertyScope::Rmrk, - >::rmrk_property(EquippableList, &part.equippable)?, + >::rmrk_property(EquippableList, &part.equippable)? )?; } - Ok(token_id) + Ok(()) } fn get_base(base_id: CollectionId) -> Result, DispatchError> { --- a/pallets/proxy-rmrk-equip/src/weights.rs +++ b/pallets/proxy-rmrk-equip/src/weights.rs @@ -47,18 +47,18 @@ // Storage: Common CollectionPropertyPermissions (r:0 w:1) // Storage: Common CollectionProperties (r:0 w:1) // Storage: Common CollectionById (r:0 w:1) + // Storage: RmrkEquip InernalPartId (r:1 w:1) // Storage: Nonfungible TokensMinted (r:1 w:1) // Storage: Nonfungible AccountBalance (r:1 w:1) // Storage: Nonfungible TokenProperties (r:1 w:1) // Storage: Nonfungible TokenData (r:0 w:1) // Storage: Nonfungible Owned (r:0 w:1) - // Storage: RmrkEquip InernalPartId (r:0 w:1) fn create_base(b: u32, ) -> Weight { - (44_632_000 as Weight) - // Standard Error: 10_000 - .saturating_add((16_912_000 as Weight).saturating_mul(b as Weight)) + (44_927_000 as Weight) + // Standard Error: 9_000 + .saturating_add((18_896_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().reads((2 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))) } @@ -71,9 +71,9 @@ // Storage: Nonfungible TokenData (r:0 w:1) // Storage: Nonfungible Owned (r:0 w:1) fn theme_add(b: u32, ) -> Weight { - (39_525_000 as Weight) - // Standard Error: 12_000 - .saturating_add((2_494_000 as Weight).saturating_mul(b as Weight)) + (39_120_000 as Weight) + // Standard Error: 11_000 + .saturating_add((2_367_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)) } @@ -82,7 +82,7 @@ // Storage: RmrkEquip InernalPartId (r:1 w:0) // Storage: Nonfungible TokenProperties (r:1 w:1) fn equippable() -> Weight { - (27_371_000 as Weight) + (27_172_000 as Weight) .saturating_add(T::DbWeight::get().reads(4 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } @@ -96,18 +96,18 @@ // Storage: Common CollectionPropertyPermissions (r:0 w:1) // Storage: Common CollectionProperties (r:0 w:1) // Storage: Common CollectionById (r:0 w:1) + // Storage: RmrkEquip InernalPartId (r:1 w:1) // Storage: Nonfungible TokensMinted (r:1 w:1) // Storage: Nonfungible AccountBalance (r:1 w:1) // Storage: Nonfungible TokenProperties (r:1 w:1) // Storage: Nonfungible TokenData (r:0 w:1) // Storage: Nonfungible Owned (r:0 w:1) - // Storage: RmrkEquip InernalPartId (r:0 w:1) fn create_base(b: u32, ) -> Weight { - (44_632_000 as Weight) - // Standard Error: 10_000 - .saturating_add((16_912_000 as Weight).saturating_mul(b as Weight)) + (44_927_000 as Weight) + // Standard Error: 9_000 + .saturating_add((18_896_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().reads((2 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))) } @@ -120,9 +120,9 @@ // Storage: Nonfungible TokenData (r:0 w:1) // Storage: Nonfungible Owned (r:0 w:1) fn theme_add(b: u32, ) -> Weight { - (39_525_000 as Weight) - // Standard Error: 12_000 - .saturating_add((2_494_000 as Weight).saturating_mul(b as Weight)) + (39_120_000 as Weight) + // Standard Error: 11_000 + .saturating_add((2_367_000 as Weight).saturating_mul(b as Weight)) .saturating_add(RocksDbWeight::get().reads(6 as Weight)) .saturating_add(RocksDbWeight::get().writes(5 as Weight)) } @@ -131,7 +131,7 @@ // Storage: RmrkEquip InernalPartId (r:1 w:0) // Storage: Nonfungible TokenProperties (r:1 w:1) fn equippable() -> Weight { - (27_371_000 as Weight) + (27_172_000 as Weight) .saturating_add(RocksDbWeight::get().reads(4 as Weight)) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) }