From ef62acfbcfefbbed5bcf934447578c9e9ef07eec Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bastian=20K=C3=B6cher?= <git@kchr.de>
Date: Tue, 12 Dec 2023 12:37:52 +0100
Subject: [PATCH] pallet-uniques: Move migration over to `VersionedMigration`
 (#2687)

---
 prdoc/pr_2687.prdoc                      | 18 +++++++
 substrate/frame/uniques/src/migration.rs | 65 ++++++++++++------------
 2 files changed, 51 insertions(+), 32 deletions(-)
 create mode 100644 prdoc/pr_2687.prdoc

diff --git a/prdoc/pr_2687.prdoc b/prdoc/pr_2687.prdoc
new file mode 100644
index 00000000000..90e635d8052
--- /dev/null
+++ b/prdoc/pr_2687.prdoc
@@ -0,0 +1,18 @@
+title: "pallet-uniques: Move migration over to `VersionedMigration`"
+
+doc:
+  - audience: Runtime Dev
+    description: |
+      Moves the migration over to `VersionedMigration`. Thus, if you had
+      used `migrate_to_v1` before in a custom `OnRuntimeUpgrade` implementation
+      you can now directly use the `MigrateV0ToV1`.
+
+migrations:
+  runtime:
+    - reference: MigrateV0ToV1
+      description: |
+        Migrate the pallet storage from `0` to `1` by initializing
+        the `CollectionAccount` storage entry from all collections.
+
+crates:
+  - name: "pallet-uniques"
diff --git a/substrate/frame/uniques/src/migration.rs b/substrate/frame/uniques/src/migration.rs
index 6c92b753b4a..6b2bbf375e7 100644
--- a/substrate/frame/uniques/src/migration.rs
+++ b/substrate/frame/uniques/src/migration.rs
@@ -17,38 +17,39 @@
 
 //! Various pieces of common functionality.
 use super::*;
-use frame_support::traits::{Get, GetStorageVersion, PalletInfoAccess, StorageVersion};
-
-/// Migrate the pallet storage to v1.
-pub fn migrate_to_v1<T: Config<I>, I: 'static, P: GetStorageVersion + PalletInfoAccess>(
-) -> frame_support::weights::Weight {
-	let on_chain_storage_version = <P as GetStorageVersion>::on_chain_storage_version();
-	log::info!(
-		target: LOG_TARGET,
-		"Running migration storage v1 for uniques with storage version {:?}",
-		on_chain_storage_version,
-	);
-
-	if on_chain_storage_version < 1 {
-		let mut count = 0;
-		for (collection, detail) in Collection::<T, I>::iter() {
-			CollectionAccount::<T, I>::insert(&detail.owner, &collection, ());
-			count += 1;
+use frame_support::traits::{Get, OnRuntimeUpgrade};
+use sp_std::marker::PhantomData;
+
+mod v1 {
+	use super::*;
+
+	/// Actual implementation of the storage migration.
+	pub struct MigrateToV1Impl<T, I>(PhantomData<(T, I)>);
+
+	impl<T: Config<I>, I: 'static> OnRuntimeUpgrade for MigrateToV1Impl<T, I> {
+		fn on_runtime_upgrade() -> frame_support::weights::Weight {
+			let mut count = 0;
+			for (collection, detail) in Collection::<T, I>::iter() {
+				CollectionAccount::<T, I>::insert(&detail.owner, &collection, ());
+				count += 1;
+			}
+
+			log::info!(
+				target: LOG_TARGET,
+				"Storage migration v1 for uniques finished.",
+			);
+
+			// calculate and return migration weights
+			T::DbWeight::get().reads_writes(count as u64 + 1, count as u64 + 1)
 		}
-		StorageVersion::new(1).put::<P>();
-		log::info!(
-			target: LOG_TARGET,
-			"Running migration storage v1 for uniques with storage version {:?} was complete",
-			on_chain_storage_version,
-		);
-		// calculate and return migration weights
-		T::DbWeight::get().reads_writes(count as u64 + 1, count as u64 + 1)
-	} else {
-		log::warn!(
-			target: LOG_TARGET,
-			"Attempted to apply migration to v1 but failed because storage version is {:?}",
-			on_chain_storage_version,
-		);
-		T::DbWeight::get().reads(1)
 	}
 }
+
+/// Migrate the pallet storage from `0` to `1`.
+pub type MigrateV0ToV1<T, I> = frame_support::migrations::VersionedMigration<
+	0,
+	1,
+	v1::MigrateToV1Impl<T, I>,
+	Pallet<T, I>,
+	<T as frame_system::Config>::DbWeight,
+>;
-- 
GitLab