From 8c72832dd59d7910717e60f7068ff05adc8050fd Mon Sep 17 00:00:00 2001
From: Liam Aharon <liam.aharon@hotmail.com>
Date: Wed, 17 Apr 2024 15:34:11 +0400
Subject: [PATCH] make admin Option

---
 substrate/frame/asset-rewards/src/lib.rs   | 25 ++++++++++++----------
 substrate/frame/asset-rewards/src/tests.rs | 24 ++++++++++-----------
 2 files changed, 26 insertions(+), 23 deletions(-)

diff --git a/substrate/frame/asset-rewards/src/lib.rs b/substrate/frame/asset-rewards/src/lib.rs
index 472bf9869e4..d15abb28d46 100644
--- a/substrate/frame/asset-rewards/src/lib.rs
+++ b/substrate/frame/asset-rewards/src/lib.rs
@@ -145,7 +145,10 @@ pub struct PoolInfo<AccountId, AssetId, Balance, BlockNumber> {
 	/// The block the pool will cease distributing rewards.
 	expiry_block: BlockNumber,
 	/// The permissioned account that can manage this pool.
-	admin: AccountId,
+	///
+	/// This is currently always `Some`, and only an `Option` so in the future permissionless
+	/// pools may be enabled without storage migration.
+	admin: Option<AccountId>,
 	/// The total amount of tokens staked in this pool.
 	total_tokens_staked: Balance,
 	/// Total rewards accumulated per token, up to the `last_update_block`.
@@ -273,7 +276,7 @@ pub mod pallet {
 			/// The block the pool will cease to accumulate rewards.
 			expiry_block: BlockNumberFor<T>,
 			/// The account allowed to modify the pool.
-			admin: T::AccountId,
+			admin: Option<T::AccountId>,
 		},
 		/// A pool reward rate was modified by the admin.
 		PoolRewardRateModified {
@@ -287,7 +290,7 @@ pub mod pallet {
 			/// The modified pool.
 			pool_id: PoolId,
 			/// The new admin.
-			new_admin: T::AccountId,
+			new_admin: Option<T::AccountId>,
 		},
 		/// A pool expiry block was modified by the admin.
 		PoolExpiryBlockModified {
@@ -360,7 +363,7 @@ pub mod pallet {
 				reward_per_token_stored: 0u32.into(),
 				last_update_block: 0u32.into(),
 				expiry_block,
-				admin: admin.clone(),
+				admin: Some(admin.clone()),
 			};
 
 			// Insert it into storage.
@@ -376,7 +379,7 @@ pub mod pallet {
 				reward_asset_id: *reward_asset_id,
 				reward_rate_per_block,
 				expiry_block,
-				admin,
+				admin: Some(admin),
 			});
 
 			Ok(())
@@ -508,7 +511,7 @@ pub mod pallet {
 				.or_else(|_| ensure_signed(origin))?;
 
 			let pool_info = Pools::<T>::get(pool_id).ok_or(Error::<T>::NonExistentPool)?;
-			ensure!(caller == pool_info.admin, BadOrigin);
+			ensure!(Some(caller) == pool_info.admin, BadOrigin);
 
 			// Always start by updating the pool rewards.
 			let rewards_per_token = Self::reward_per_token(&pool_info)?;
@@ -538,11 +541,11 @@ pub mod pallet {
 				.or_else(|_| ensure_signed(origin))?;
 
 			let mut pool_info = Pools::<T>::get(pool_id).ok_or(Error::<T>::NonExistentPool)?;
-			ensure!(pool_info.admin == caller, BadOrigin);
-			pool_info.admin = new_admin.clone();
+			ensure!(pool_info.admin == Some(caller), BadOrigin);
+			pool_info.admin = Some(new_admin.clone());
 			Pools::<T>::insert(pool_id, pool_info);
 
-			Self::deposit_event(Event::PoolAdminModified { pool_id, new_admin });
+			Self::deposit_event(Event::PoolAdminModified { pool_id, new_admin: Some(new_admin) });
 
 			Ok(())
 		}
@@ -565,7 +568,7 @@ pub mod pallet {
 			);
 
 			let pool_info = Pools::<T>::get(pool_id).ok_or(Error::<T>::NonExistentPool)?;
-			ensure!(pool_info.admin == caller, BadOrigin);
+			ensure!(pool_info.admin == Some(caller), BadOrigin);
 
 			// Always start by updating the pool rewards.
 			let reward_per_token = Self::reward_per_token(&pool_info)?;
@@ -617,7 +620,7 @@ pub mod pallet {
 				.or_else(|_| ensure_signed(origin))?;
 
 			let pool_info = Pools::<T>::get(pool_id).ok_or(Error::<T>::NonExistentPool)?;
-			ensure!(pool_info.admin == caller, BadOrigin);
+			ensure!(pool_info.admin == Some(caller), BadOrigin);
 
 			T::Assets::transfer(
 				pool_info.reward_asset_id,
diff --git a/substrate/frame/asset-rewards/src/tests.rs b/substrate/frame/asset-rewards/src/tests.rs
index 906ee8d75e7..583581a8df8 100644
--- a/substrate/frame/asset-rewards/src/tests.rs
+++ b/substrate/frame/asset-rewards/src/tests.rs
@@ -132,7 +132,7 @@ mod create_pool {
 					reward_asset_id: DEFAULT_REWARD_ASSET_ID,
 					reward_rate_per_block: DEFAULT_REWARD_RATE_PER_BLOCK,
 					expiry_block: DEFAULT_EXPIRY_BLOCK,
-					admin: PermissionedAccountId::get(),
+					admin: Some(PermissionedAccountId::get()),
 				}]
 			);
 
@@ -147,7 +147,7 @@ mod create_pool {
 						reward_asset_id: DEFAULT_REWARD_ASSET_ID,
 						reward_rate_per_block: DEFAULT_REWARD_RATE_PER_BLOCK,
 						expiry_block: DEFAULT_EXPIRY_BLOCK,
-						admin: PermissionedAccountId::get(),
+						admin: Some(PermissionedAccountId::get()),
 						total_tokens_staked: 0,
 						reward_per_token_stored: 0,
 						last_update_block: 0
@@ -179,7 +179,7 @@ mod create_pool {
 					staked_asset_id: staked_asset_id.clone(),
 					reward_asset_id: reward_asset_id.clone(),
 					reward_rate_per_block,
-					admin,
+					admin: Some(admin),
 					expiry_block,
 				}]
 			);
@@ -195,7 +195,7 @@ mod create_pool {
 							staked_asset_id: DEFAULT_STAKED_ASSET_ID,
 							reward_asset_id: DEFAULT_REWARD_ASSET_ID,
 							reward_rate_per_block: DEFAULT_REWARD_RATE_PER_BLOCK,
-							admin: PermissionedAccountId::get(),
+							admin: Some(PermissionedAccountId::get()),
 							expiry_block: DEFAULT_EXPIRY_BLOCK,
 							total_tokens_staked: 0,
 							reward_per_token_stored: 0,
@@ -208,7 +208,7 @@ mod create_pool {
 							staked_asset_id,
 							reward_asset_id,
 							reward_rate_per_block,
-							admin,
+							admin: Some(admin),
 							total_tokens_staked: 0,
 							expiry_block,
 							reward_per_token_stored: 0,
@@ -246,7 +246,7 @@ mod create_pool {
 					reward_asset_id: asset.clone(),
 					reward_rate_per_block: DEFAULT_REWARD_RATE_PER_BLOCK,
 					expiry_block: DEFAULT_EXPIRY_BLOCK,
-					admin: PermissionedAccountId::get(),
+					admin: Some(PermissionedAccountId::get()),
 				}]
 			);
 
@@ -261,7 +261,7 @@ mod create_pool {
 						reward_asset_id: asset,
 						reward_rate_per_block: DEFAULT_REWARD_RATE_PER_BLOCK,
 						expiry_block: DEFAULT_EXPIRY_BLOCK,
-						admin: PermissionedAccountId::get(),
+						admin: Some(PermissionedAccountId::get()),
 						total_tokens_staked: 0,
 						reward_per_token_stored: 0,
 						last_update_block: 0
@@ -637,9 +637,9 @@ mod set_pool_admin {
 			// Check state
 			assert_eq!(
 				*events().last().unwrap(),
-				Event::<MockRuntime>::PoolAdminModified { pool_id, new_admin }
+				Event::<MockRuntime>::PoolAdminModified { pool_id, new_admin: Some(new_admin) }
 			);
-			assert_eq!(Pools::<MockRuntime>::get(pool_id).unwrap().admin, new_admin);
+			assert_eq!(Pools::<MockRuntime>::get(pool_id).unwrap().admin, Some(new_admin));
 		});
 	}
 
@@ -656,9 +656,9 @@ mod set_pool_admin {
 			// Check state
 			assert_eq!(
 				*events().last().unwrap(),
-				Event::<MockRuntime>::PoolAdminModified { pool_id, new_admin }
+				Event::<MockRuntime>::PoolAdminModified { pool_id, new_admin: Some(new_admin) }
 			);
-			assert_eq!(Pools::<MockRuntime>::get(pool_id).unwrap().admin, new_admin);
+			assert_eq!(Pools::<MockRuntime>::get(pool_id).unwrap().admin, Some(new_admin));
 		});
 	}
 
@@ -1373,7 +1373,7 @@ fn integration() {
 					reward_asset_id,
 					reward_rate_per_block: 100,
 					expiry_block: 25,
-					admin
+					admin: Some(admin)
 				},
 				Event::Staked { who: staker1, pool_id, amount: 100 },
 				Event::Staked { who: staker2, pool_id, amount: 100 },
-- 
GitLab