diff --git a/substrate/frame/asset-rewards/src/lib.rs b/substrate/frame/asset-rewards/src/lib.rs index 1883b1dffba04535c8ad93cf55e6c8c47f906d80..c582ca3bf0544b00203f2377fd3f556513630906 100644 --- a/substrate/frame/asset-rewards/src/lib.rs +++ b/substrate/frame/asset-rewards/src/lib.rs @@ -118,7 +118,7 @@ pub mod pallet { traits::tokens::{AssetId, Preservation}, }; use frame_system::pallet_prelude::*; - use sp_runtime::traits::{AccountIdConversion, EnsureDiv, Saturating}; + use sp_runtime::traits::{AccountIdConversion, BadOrigin, EnsureDiv, Saturating}; #[pallet::pallet] pub struct Pallet<T>(_); @@ -228,11 +228,13 @@ pub mod pallet { pool_id: PoolId, }, /// A pool was modified by the admin. - PoolModifed { + PoolModified { /// The modified pool. pool_id: PoolId, - /// The new reward rate. - new_reward_rate_per_block: T::Balance, + /// The reward rate after the modification. + new_reward_rate_per_block: Option<T::Balance>, + /// The admin after the modification. + new_admin: Option<T::AccountId>, }, } @@ -345,6 +347,9 @@ pub mod pallet { staker.amount.saturating_accrue(amount); PoolStakers::<T>::insert(pool_id, &caller, staker); + // Emit event. + Self::deposit_event(Event::Staked { who: caller, pool_id, amount }); + Ok(()) } @@ -375,6 +380,9 @@ pub mod pallet { staker.amount.saturating_reduce(amount); PoolStakers::<T>::insert(pool_id, &caller, staker); + // Emit event. + Self::deposit_event(Event::Unstaked { who: caller, pool_id, amount }); + Ok(()) } @@ -398,7 +406,6 @@ pub mod pallet { let mut staker_info = PoolStakers::<T>::get(pool_id, &caller).unwrap_or_default(); let pool_info = Pools::<T>::get(pool_id).ok_or(Error::<T>::NonExistentPool)?; let pool_account_id = Self::pool_account_id(&pool_id)?; - T::Assets::transfer( pool_info.reward_asset_id, &pool_account_id, @@ -407,19 +414,43 @@ pub mod pallet { Preservation::Preserve, )?; - // Reset staker unclaimed rewards. + // Emit event. + Self::deposit_event(Event::RewardsHarvested { + who: caller, + staker, + pool_id, + amount: staker_info.rewards, + }); + + // Reset staker rewards. staker_info.rewards = 0u32.into(); Ok(()) } - /// Modify the reward rate of a pool. + /// Modify the parameters of a pool. pub fn modify_pool( - _origin: OriginFor<T>, - _pool_id: PoolId, - _new_reward_rate: T::Balance, + origin: OriginFor<T>, + pool_id: PoolId, + new_reward_rate_per_block: Option<T::Balance>, + new_admin: Option<T::AccountId>, ) -> DispatchResult { - todo!() + let caller = 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.reward_rate_per_block = + new_reward_rate_per_block.unwrap_or(pool_info.reward_rate_per_block); + pool_info.admin = new_admin.clone().unwrap_or(pool_info.admin); + Pools::<T>::insert(pool_id, pool_info); + + Self::deposit_event(Event::PoolModified { + pool_id, + new_reward_rate_per_block, + new_admin, + }); + + Ok(()) } /// Convinience method to deposit reward tokens into a pool. diff --git a/substrate/frame/asset-rewards/src/tests.rs b/substrate/frame/asset-rewards/src/tests.rs index ddcc8b5d29672be5120d5c96ded8d2d0a71d2123..3e28f25f316c3b9005b568fc752bbe7187065d61 100644 --- a/substrate/frame/asset-rewards/src/tests.rs +++ b/substrate/frame/asset-rewards/src/tests.rs @@ -261,6 +261,12 @@ mod stake { // Check that the user's staked amount is updated assert_eq!(PoolStakers::<MockRuntime>::get(pool_id, user).unwrap().amount, 1000); + // Event is emitted. + assert_eq!( + *events().last().unwrap(), + Event::<MockRuntime>::Staked { who: user, amount: 1000, pool_id: 0 } + ); + // Check that the pool's total tokens staked is updated assert_eq!(Pools::<MockRuntime>::get(pool_id).unwrap().total_tokens_staked, 1000); @@ -269,6 +275,12 @@ mod stake { // User stakes more tokens assert_ok!(StakingRewards::stake(RuntimeOrigin::signed(user), pool_id, 500)); + // Event is emitted. + assert_eq!( + *events().last().unwrap(), + Event::<MockRuntime>::Staked { who: user, amount: 500, pool_id: 0 } + ); + // Check that the user's staked amount is updated assert_eq!(PoolStakers::<MockRuntime>::get(pool_id, user).unwrap().amount, 1500); @@ -330,6 +342,12 @@ mod unstake { // User unstakes tokens assert_ok!(StakingRewards::unstake(RuntimeOrigin::signed(user), pool_id, 500)); + // Event is emitted. + assert_eq!( + *events().last().unwrap(), + Event::<MockRuntime>::Unstaked { who: user, amount: 500, pool_id: 0 } + ); + // Check that the user's staked amount is updated assert_eq!(PoolStakers::<MockRuntime>::get(pool_id, user).unwrap().amount, 500);