git.delta.rocks / unique-network / refs/commits / 3e410d6948a5

difftreelog

fix(rmrk) rewrite existing parts if dups exist

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

3 files changed

modifiedpallets/proxy-rmrk-equip/src/benchmarking.rsdiffbeforeafterboth
--- 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<S: Get<u32>>(num: u32) -> BoundedVec<RmrkPartType, S> {
-	vec![create_max_part(); num as usize]
-		.try_into()
-		.expect("num <= S")
+	let mut parts: BoundedVec<RmrkPartType, S> = 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);
+		<T as pallet_common::Config>::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");
+
+		<Pallet<T>>::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)
 }
modifiedpallets/proxy-rmrk-equip/src/lib.rsdiffbeforeafterboth
141 let collection = <PalletCore<T>>::get_nft_collection(collection_id)?;141 let collection = <PalletCore<T>>::get_nft_collection(collection_id)?;
142142
143 for part in parts {143 for part in parts {
144 let part_id = part.id();
145 let part_token_id = Self::create_part(&cross_sender, &collection, part)?;144 Self::create_part(&cross_sender, &collection, part)?;
146
147 <InernalPartId<T>>::insert(collection_id, part_id, part_token_id);
148
149 <PalletNft<T>>::set_scoped_token_property(
150 collection_id,
151 part_token_id,
152 PropertyScope::Rmrk,
153 <PalletCore<T>>::rmrk_property(ExternalPartId, &part_id)?,
154 )?;
155 }145 }
156146
157 Self::deposit_event(Event::BaseCreated {147 Self::deposit_event(Event::BaseCreated {
279 sender: &T::CrossAccountId,269 sender: &T::CrossAccountId,
280 collection: &NonfungibleHandle<T>,270 collection: &NonfungibleHandle<T>,
281 part: RmrkPartType,271 part: RmrkPartType,
282 ) -> Result<TokenId, DispatchError> {272 ) -> DispatchResult {
283 let owner = sender;273 let owner = sender;
284274
275 let part_id = part.id();
285 let src = part.src();276 let src = part.src();
286 let z_index = part.z_index();277 let z_index = part.z_index();
287278
290 RmrkPartType::SlotPart(_) => NftType::SlotPart,281 RmrkPartType::SlotPart(_) => NftType::SlotPart,
291 };282 };
292283
293 let token_id = <PalletCore<T>>::create_nft(284 let token_id = match Self::internal_part_id(collection.id, part_id) {
285 Some(token_id) => token_id,
286 None => {
287 let token_id = <PalletCore<T>>::create_nft(
288 sender,
289 owner,
290 collection,
291 [].into_iter(),
292 )
293 .map_err(|err| match err {
294 DispatchError::Arithmetic(_) => <Error<T>>::NoAvailablePartId.into(),
295 err => err,
296 })?;
297
298 <InernalPartId<T>>::insert(collection.id, part_id, token_id);
299
300 <PalletNft<T>>::set_scoped_token_property(
301 collection.id,
302 token_id,
303 PropertyScope::Rmrk,
304 <PalletCore<T>>::rmrk_property(ExternalPartId, &part_id)?,
305 )?;
306
307 token_id
308 }
309 };
310
311 <PalletNft<T>>::set_scoped_token_properties(
294 sender,312 collection.id,
295 owner,313 token_id,
296 collection,314 PropertyScope::Rmrk,
297 [315 [
298 <PalletCore<T>>::rmrk_property(TokenType, &nft_type)?,316 <PalletCore<T>>::rmrk_property(TokenType, &nft_type)?,
299 <PalletCore<T>>::rmrk_property(Src, &src)?,317 <PalletCore<T>>::rmrk_property(Src, &src)?,
300 <PalletCore<T>>::rmrk_property(ZIndex, &z_index)?,318 <PalletCore<T>>::rmrk_property(ZIndex, &z_index)?,
301 ]319 ]
302 .into_iter(),320 .into_iter()
303 )
304 .map_err(|err| match err {
305 DispatchError::Arithmetic(_) => <Error<T>>::NoAvailablePartId.into(),
306 err => err,
307 })?;321 )?;
308322
309 if let RmrkPartType::SlotPart(part) = part {323 if let RmrkPartType::SlotPart(part) = part {
310 <PalletNft<T>>::set_scoped_token_property(324 <PalletNft<T>>::set_scoped_token_property(
315 )?;329 )?;
316 }330 }
317331
318 Ok(token_id)332 Ok(())
319 }333 }
320334
321 fn get_base(base_id: CollectionId) -> Result<NonfungibleHandle<T>, DispatchError> {335 fn get_base(base_id: CollectionId) -> Result<NonfungibleHandle<T>, DispatchError> {
modifiedpallets/proxy-rmrk-equip/src/weights.rsdiffbeforeafterboth
--- 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))
 	}