diff --git a/pallets/liquidity-mining/src/lib.rs b/pallets/liquidity-mining/src/lib.rs index 6ea307c2fc..6ec1496e98 100644 --- a/pallets/liquidity-mining/src/lib.rs +++ b/pallets/liquidity-mining/src/lib.rs @@ -44,7 +44,7 @@ mod mock; #[cfg(test)] mod tests; -const DEPOSIT_ID: LockIdentifier = *b"deposit "; +const DEPOSIT_ID: LockIdentifier = *b"lm/depos"; #[derive(Encode, Decode, Clone, Eq, PartialEq)] pub struct PoolInfo { @@ -93,7 +93,7 @@ impl PoolInfo { if let Some(block_startup) = self.block_startup { let block_retired = match self.block_retired { Some(block_retired) => block_retired, - None => self.duration + block_startup, + None => self.duration.saturating_add(block_startup), }; let n = min(frame_system::Pallet::::block_number(), block_retired); @@ -133,16 +133,10 @@ impl PoolInfo { let n = frame_system::Pallet::::block_number(); if let Some(block_startup) = self.block_startup { - let block_retired = block_startup + self.duration; + let block_retired = block_startup.saturating_add(self.duration); if n >= block_retired { self.state = PoolState::Retired; self.block_retired = Some(block_retired); - - Pallet::::deposit_event(Event::PoolRetired( - self.pool_id, - self.r#type, - self.trading_pair, - )); } } } @@ -167,7 +161,7 @@ impl PoolInfo { let user_deposit: u128 = deposit_data.deposit.saturated_into(); let amount = BalanceOf::::saturated_from( - (v_new - v_old).saturating_mul_int(user_deposit), + v_new.saturating_sub(v_old).saturating_mul_int(user_deposit), ); // Update the claimed of the reward @@ -263,7 +257,7 @@ impl RewardData { let duration: u128 = duration.saturated_into(); let per_block = total / duration; - let total = per_block * duration; + let total = per_block.saturating_mul(duration); (BalanceOf::::saturated_from(per_block), BalanceOf::::saturated_from(total)) }; @@ -294,9 +288,9 @@ impl RewardData { let pbpd = self.per_block_per_deposited(deposit); let b_prev = max(block_last_updated, block_startup); - let b_past: u128 = (n - b_prev).saturated_into(); + let b_past: u128 = n.saturating_sub(b_prev).saturated_into(); - let gain_avg_new = self.gain_avg + pbpd * b_past.into(); + let gain_avg_new = self.gain_avg.saturating_add(pbpd.saturating_mul(b_past.into())); self.gain_avg = gain_avg_new; } @@ -320,7 +314,7 @@ type AccountIdOf = ::AccountId; type BalanceOf = <::MultiCurrency as MultiCurrency>>::Balance; -type PoolId = u128; +type PoolId = u32; #[frame_support::pallet] pub mod pallet { @@ -363,6 +357,10 @@ pub mod pallet { #[pallet::constant] type MaximumCharged: Get; + /// The number of option rewards should be less than the value + #[pallet::constant] + type MaximumOptionRewards: Get; + /// ModuleID for creating sub account #[pallet::constant] type PalletId: Get; @@ -420,10 +418,10 @@ pub mod pallet { /// /// [pool_id, pool_type, trading_pair] PoolKilled(PoolId, PoolType, (CurrencyId, CurrencyId)), - /// The liquidity-pool has been retired + /// The liquidity-pool has been retired forcefully /// /// [pool_id, pool_type, trading_pair] - PoolRetired(PoolId, PoolType, (CurrencyId, CurrencyId)), + PoolRetiredForcefully(PoolId, PoolType, (CurrencyId, CurrencyId)), /// User has deposited some trading-pair to a liquidity-pool /// /// [pool_id, pool_type, trading_pair, amount_deposited, user] @@ -446,7 +444,7 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn pool_id)] - pub(crate) type NextOrderId = StorageValue<_, PoolId, ValueQuery>; + pub(crate) type NextPoolId = StorageValue<_, PoolId, ValueQuery>; #[pallet::storage] #[pallet::getter(fn charged_pids)] @@ -477,7 +475,7 @@ pub mod pallet { origin: OriginFor, trading_pair: (CurrencyId, CurrencyId), main_reward: (CurrencyId, BalanceOf), - option_rewards: Vec<(CurrencyId, BalanceOf)>, + option_rewards: BoundedVec<(CurrencyId, BalanceOf), T::MaximumOptionRewards>, #[pallet::compact] duration: BlockNumberFor, #[pallet::compact] min_deposit_to_start: BalanceOf, #[pallet::compact] after_block_to_start: BlockNumberFor, @@ -512,7 +510,7 @@ pub mod pallet { first_slot: LeasePeriod, last_slot: LeasePeriod, main_reward: (CurrencyId, BalanceOf), - option_rewards: Vec<(CurrencyId, BalanceOf)>, + option_rewards: BoundedVec<(CurrencyId, BalanceOf), T::MaximumOptionRewards>, #[pallet::compact] duration: BlockNumberFor, #[pallet::compact] min_deposit_to_start: BalanceOf, #[pallet::compact] after_block_to_start: BlockNumberFor, @@ -541,7 +539,7 @@ pub mod pallet { first_slot: LeasePeriod, last_slot: LeasePeriod, main_reward: (CurrencyId, BalanceOf), - option_rewards: Vec<(CurrencyId, BalanceOf)>, + option_rewards: BoundedVec<(CurrencyId, BalanceOf), T::MaximumOptionRewards>, #[pallet::compact] duration: BlockNumberFor, #[pallet::compact] min_deposit_to_start: BalanceOf, #[pallet::compact] after_block_to_start: BlockNumberFor, @@ -642,7 +640,7 @@ pub mod pallet { TotalPoolInfos::::insert(pid, pool_retired); } - Self::deposit_event(Event::PoolRetired(pid, r#type, trading_pair)); + Self::deposit_event(Event::PoolRetiredForcefully(pid, r#type, trading_pair)); Ok(().into()) } @@ -789,9 +787,9 @@ pub mod pallet { }; let try_redeemed = deposit_data.deposit; - let left_in_pool = max(pool.deposit - try_redeemed, minimum_in_pool); - let can_redeemed = pool.deposit - left_in_pool; - let left_in_user = deposit_data.deposit - can_redeemed; + let left_in_pool = max(pool.deposit.saturating_sub(try_redeemed), minimum_in_pool); + let can_redeemed = pool.deposit.saturating_sub(left_in_pool); + let left_in_user = deposit_data.deposit.saturating_sub(can_redeemed); ensure!(can_redeemed != Zero::zero(), Error::::TooLowDepositInPoolToRedeem); @@ -826,7 +824,7 @@ pub mod pallet { if pool.state == PoolState::Retired && pool.deposit == Zero::zero() { let investor = pool.investor.clone().ok_or(Error::::Unexpected)?; for (rtoken, reward) in pool.rewards.iter() { - let remain = reward.total - reward.claimed; + let remain = reward.total.saturating_sub(reward.claimed); T::MultiCurrency::transfer(*rtoken, &pool.keeper, &investor, remain)?; } @@ -917,7 +915,7 @@ pub mod pallet { origin: OriginFor, trading_pair: (CurrencyId, CurrencyId), main_reward: (CurrencyId, BalanceOf), - option_rewards: Vec<(CurrencyId, BalanceOf)>, + option_rewards: BoundedVec<(CurrencyId, BalanceOf), T::MaximumOptionRewards>, r#type: PoolType, duration: BlockNumberFor, min_deposit_to_start: BalanceOf, @@ -985,7 +983,7 @@ pub mod pallet { pub(crate) fn next_pool_id() -> PoolId { let next_pool_id = Self::pool_id(); - NextOrderId::::mutate(|current| *current += 1); + NextPoolId::::mutate(|current| *current = current.saturating_add(1)); next_pool_id } diff --git a/pallets/liquidity-mining/src/mock.rs b/pallets/liquidity-mining/src/mock.rs index 813371b98b..9b445b55ee 100644 --- a/pallets/liquidity-mining/src/mock.rs +++ b/pallets/liquidity-mining/src/mock.rs @@ -166,6 +166,7 @@ parameter_types! { pub const MinimumRewardPerBlock: Balance = 1_000; pub const MinimumDuration: BlockNumber = MINUTES; pub const MaximumApproved: u32 = 4; + pub const MaximumOptionRewards: u32 = 7; pub const LiquidityMiningPalletId: PalletId = PalletId(*b"mining##"); } @@ -179,6 +180,7 @@ impl lm::Config for T { type MinimumRewardPerBlock = MinimumRewardPerBlock; type MinimumDuration = MinimumDuration; type MaximumCharged = MaximumApproved; + type MaximumOptionRewards = MaximumOptionRewards; type PalletId = LiquidityMiningPalletId; } diff --git a/pallets/liquidity-mining/src/tests.rs b/pallets/liquidity-mining/src/tests.rs index 011c5822e1..8c2e1b3d75 100644 --- a/pallets/liquidity-mining/src/tests.rs +++ b/pallets/liquidity-mining/src/tests.rs @@ -16,6 +16,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use std::convert::TryInto; + use frame_support::{ assert_noop, assert_ok, dispatch::DispatchError, @@ -46,7 +48,7 @@ fn create_farming_pool_should_work() { 13, 20, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1_000 * UNIT, 0 @@ -73,7 +75,7 @@ fn create_mining_pool_should_work() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1_000 * UNIT, 0 @@ -104,7 +106,7 @@ fn create_mining_pool_with_wrong_currency_should_fail() { CurrencyId::VSToken(RelayChainTokenSymbol::get()), ), (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1_000 * UNIT, 0, @@ -120,7 +122,7 @@ fn create_mining_pool_with_wrong_currency_should_fail() { CurrencyId::VSToken(RelayChainTokenSymbol::get()), ), (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1_000 * UNIT, 0, @@ -138,8 +140,8 @@ fn increase_pid_when_create_pool_should_work() { assert_ok!(LM::create_pool( pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), (FARMING_DEPOSIT_1, FARMING_DEPOSIT_2), - (REWARD_1, REWARD_AMOUNT / NUM), - vec![(REWARD_2, REWARD_AMOUNT / NUM)], + (REWARD_1, REWARD_AMOUNT / NUM as Balance), + vec![(REWARD_2, REWARD_AMOUNT / NUM as Balance)].try_into().unwrap(), PoolType::Farming, DAYS, 1_000 * UNIT, @@ -159,7 +161,7 @@ fn create_pool_with_wrong_origin_should_fail() { Origin::root(), (FARMING_DEPOSIT_1, FARMING_DEPOSIT_2), (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), PoolType::Farming, DAYS, 1_000 * UNIT, @@ -173,7 +175,7 @@ fn create_pool_with_wrong_origin_should_fail() { Origin::none(), (FARMING_DEPOSIT_1, FARMING_DEPOSIT_2), (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), PoolType::Farming, DAYS, 1_000 * UNIT, @@ -187,7 +189,7 @@ fn create_pool_with_wrong_origin_should_fail() { Some(INVESTOR).into(), (FARMING_DEPOSIT_1, FARMING_DEPOSIT_2), (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), PoolType::Farming, DAYS, 1_000 * UNIT, @@ -206,7 +208,7 @@ fn create_pool_with_duplicate_trading_pair_should_fail() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), (FARMING_DEPOSIT_1, FARMING_DEPOSIT_1), (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), PoolType::Farming, DAYS, 1_000 * UNIT, @@ -225,7 +227,7 @@ fn create_pool_with_too_small_duration_should_fail() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), (FARMING_DEPOSIT_1, FARMING_DEPOSIT_2), (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), PoolType::Farming, MinimumDuration::get() - 1, 1_000 * UNIT, @@ -244,7 +246,7 @@ fn create_pool_with_wrong_condition_should_fail() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), (FARMING_DEPOSIT_1, FARMING_DEPOSIT_2), (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), PoolType::Farming, DAYS, MinimumDeposit::get() - 1, @@ -258,7 +260,7 @@ fn create_pool_with_wrong_condition_should_fail() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), (FARMING_DEPOSIT_1, FARMING_DEPOSIT_2), (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), PoolType::Farming, DAYS, MaximumDepositInPool::get() + 1, @@ -277,7 +279,7 @@ fn create_pool_with_too_small_per_block_should_fail() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), (FARMING_DEPOSIT_1, FARMING_DEPOSIT_2), (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), PoolType::Farming, (REWARD_AMOUNT + 1) as BlockNumber, 1_000 * UNIT, @@ -295,7 +297,7 @@ fn create_pool_with_duplicate_reward_should_fail() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), (FARMING_DEPOSIT_1, FARMING_DEPOSIT_2), (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_1, REWARD_AMOUNT)], + vec![(REWARD_1, REWARD_AMOUNT)].try_into().unwrap(), PoolType::Farming, DAYS, 1_000 * UNIT, @@ -312,7 +314,7 @@ fn charge_should_work() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), (FARMING_DEPOSIT_1, FARMING_DEPOSIT_2), (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), PoolType::Farming, DAYS, 1_000 * UNIT, @@ -358,7 +360,7 @@ fn charge_with_wrong_origin_should_fail() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), (FARMING_DEPOSIT_1, FARMING_DEPOSIT_2), (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), PoolType::Farming, DAYS, 1_000 * UNIT, @@ -381,7 +383,7 @@ fn charge_with_wrong_state_should_fail() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), (FARMING_DEPOSIT_1, FARMING_DEPOSIT_2), (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), PoolType::Farming, DAYS, 1_000 * UNIT, @@ -396,12 +398,14 @@ fn charge_with_wrong_state_should_fail() { #[test] fn charge_exceed_maximum_should_fail() { new_test_ext().execute_with(|| { - for i in 0..MaximumApproved::get() as u128 { + for i in 0..MaximumApproved::get() { assert_ok!(LM::create_pool( pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), (FARMING_DEPOSIT_1, FARMING_DEPOSIT_2), (REWARD_1, REWARD_AMOUNT / (MaximumApproved::get() + 1) as u128), - vec![(REWARD_2, REWARD_AMOUNT / (MaximumApproved::get() + 1) as u128)], + vec![(REWARD_2, REWARD_AMOUNT / (MaximumApproved::get() + 1) as u128)] + .try_into() + .unwrap(), PoolType::Farming, DAYS, 1_000 * UNIT, @@ -417,7 +421,9 @@ fn charge_exceed_maximum_should_fail() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), (FARMING_DEPOSIT_1, FARMING_DEPOSIT_2), (REWARD_1, REWARD_AMOUNT / (MaximumApproved::get() + 1) as u128), - vec![(REWARD_2, REWARD_AMOUNT / (MaximumApproved::get() + 1) as u128)], + vec![(REWARD_2, REWARD_AMOUNT / (MaximumApproved::get() + 1) as u128)] + .try_into() + .unwrap(), PoolType::Farming, DAYS, 1_000 * UNIT, @@ -425,11 +431,11 @@ fn charge_exceed_maximum_should_fail() { )); assert_noop!( - LM::charge(Some(INVESTOR).into(), MaximumApproved::get() as u128,), + LM::charge(Some(INVESTOR).into(), MaximumApproved::get()), Error::::ExceedMaximumCharged ); - assert!(!LM::charged_pids().contains(&(MaximumApproved::get() as u128))); + assert!(!LM::charged_pids().contains(&(MaximumApproved::get()))); }); } @@ -440,7 +446,7 @@ fn charge_without_enough_balance_should_fail() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), (FARMING_DEPOSIT_1, FARMING_DEPOSIT_2), (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), PoolType::Farming, DAYS, 1_000 * UNIT, @@ -463,7 +469,7 @@ fn kill_pool_should_work() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), (FARMING_DEPOSIT_1, FARMING_DEPOSIT_2), (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), PoolType::Farming, DAYS, 1_000 * UNIT, @@ -486,7 +492,7 @@ fn kill_pool_with_wrong_origin_should_fail() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), (FARMING_DEPOSIT_1, FARMING_DEPOSIT_2), (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), PoolType::Farming, DAYS, 1_000 * UNIT, @@ -506,7 +512,7 @@ fn kill_pool_with_wrong_state_should_fail() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), (FARMING_DEPOSIT_1, FARMING_DEPOSIT_2), (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), PoolType::Farming, DAYS, 1_000 * UNIT, @@ -529,7 +535,7 @@ fn deposit_to_mining_pool_charged_should_work() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1_000 * UNIT, 0 @@ -563,7 +569,7 @@ fn deposit_to_farming_pool_charged_should_work() { 13, 20, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1_000 * UNIT, 0 @@ -600,7 +606,7 @@ fn startup_pool_meet_conditions_should_auto_work() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1 * UNIT, 0 @@ -629,7 +635,7 @@ fn deposit_to_pool_ongoing_should_work() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1 * UNIT, 0 @@ -665,7 +671,7 @@ fn deposit_to_pool_ongoing_with_init_deposit_should_work() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1_000_000, 0 @@ -716,7 +722,7 @@ fn double_deposit_to_pool_ongoing_in_diff_block_should_work() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1_000_000, 0 @@ -770,7 +776,7 @@ fn double_deposit_to_pool_ongoing_in_same_block_should_work() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1_000_000, 0 @@ -816,7 +822,7 @@ fn deposit_with_wrong_pid_should_fail() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1_000_000, 0 @@ -838,7 +844,7 @@ fn deposit_with_wrong_state_should_fail() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1_000_000, 0 @@ -866,7 +872,7 @@ fn deposit_too_little_should_fail() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1_000_000, 0 @@ -891,7 +897,7 @@ fn deposit_with_wrong_origin_should_fail() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1_000_000, 0 @@ -914,7 +920,7 @@ fn deposit_exceed_the_limit_should_fail() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1_000_000, 0 @@ -938,7 +944,7 @@ fn redeem_from_pool_ongoing_should_work() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1 * UNIT, 0 @@ -1001,7 +1007,7 @@ fn redeem_from_pool_retired_should_work() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1 * UNIT, 0 @@ -1072,7 +1078,7 @@ fn double_redeem_from_pool_in_diff_state_should_work() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1 * UNIT, 0 @@ -1178,7 +1184,7 @@ fn redeem_with_wrong_pid_should_fail() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1 * UNIT, 0 @@ -1202,7 +1208,7 @@ fn redeem_with_wrong_state_should_fail() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1 * UNIT, 0 @@ -1225,7 +1231,7 @@ fn redeem_without_deposit_should_fail() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1 * UNIT, 0 @@ -1252,7 +1258,7 @@ fn redeem_all_deposit_from_pool_ongoing_should_fail() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1 * UNIT, 0 @@ -1281,7 +1287,7 @@ fn volunteer_to_redeem_should_work() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1 * UNIT, 0 @@ -1337,7 +1343,7 @@ fn volunteer_to_redeem_with_wrong_pid_should_fail() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1 * UNIT, 0 @@ -1361,7 +1367,7 @@ fn volunteer_to_redeem_with_wrong_state_should_fail() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1 * UNIT, 0 @@ -1398,7 +1404,7 @@ fn claim_from_pool_ongoing_should_work() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1 * UNIT, 0 @@ -1449,7 +1455,7 @@ fn claim_from_pool_retired_should_fail() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1 * UNIT, 0 @@ -1474,7 +1480,7 @@ fn claim_with_wrong_pid_should_fail() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1 * UNIT, 0 @@ -1499,7 +1505,7 @@ fn claim_with_wrong_origin_should_fail() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1 * UNIT, 0 @@ -1525,7 +1531,7 @@ fn claim_with_wrong_state_should_fail() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1 * UNIT, 0 @@ -1554,7 +1560,7 @@ fn claim_without_deposit_should_fail() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1 * UNIT, 0 @@ -1579,7 +1585,7 @@ fn double_claim_in_same_block_should_fail() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1 * UNIT, 0 @@ -1604,7 +1610,7 @@ fn force_retire_pool_charged_should_work() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1 * UNIT, 0 @@ -1670,7 +1676,7 @@ fn force_retire_pool_charged_with_no_deposit_should_work() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1 * UNIT, 0 @@ -1697,7 +1703,7 @@ fn force_retire_pool_ongoing_should_work() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1 * UNIT, 0 @@ -1776,7 +1782,7 @@ fn force_retire_pool_with_wrong_origin_should_fail() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1 * UNIT, 0 @@ -1798,7 +1804,7 @@ fn force_retire_pool_with_wrong_pool_state_should_fail() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1 * UNIT, 0 @@ -1831,7 +1837,7 @@ fn create_eb_farming_pool_should_work() { 13, 20, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1_000 * UNIT, 0 @@ -1859,7 +1865,7 @@ fn deposit_to_eb_farming_should_work() { 13, 20, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1_000_000, 0 @@ -1910,7 +1916,7 @@ fn redeem_from_eb_farming_should_work() { 13, 20, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1_000_000, 0 @@ -1978,7 +1984,7 @@ fn claim_from_eb_farming_should_work() { 13, 20, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1_000_000, 0 @@ -2044,7 +2050,7 @@ fn simple_integration_test() { pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(), MINING_TRADING_PAIR, (REWARD_1, REWARD_AMOUNT), - vec![(REWARD_2, REWARD_AMOUNT)], + vec![(REWARD_2, REWARD_AMOUNT)].try_into().unwrap(), DAYS, 1 * UNIT, 0 diff --git a/runtime/asgard/src/lib.rs b/runtime/asgard/src/lib.rs index aba71e0d16..c441882cf2 100644 --- a/runtime/asgard/src/lib.rs +++ b/runtime/asgard/src/lib.rs @@ -1145,7 +1145,8 @@ parameter_types! { pub const MinimumRewardPerBlock: Balance = 1_000; pub const MinimumDuration: BlockNumber = DAYS; pub const MaximumApproved: u32 = 8; - pub const LiquidityMiningPalletId: PalletId = PalletId(*b"mining##"); + pub const MaximumOptionRewards: u32 = 7; + pub const LiquidityMiningPalletId: PalletId = PalletId(*b"bf/lm###"); } impl bifrost_liquidity_mining::Config for Runtime { @@ -1159,6 +1160,7 @@ impl bifrost_liquidity_mining::Config for Runtime { type MinimumRewardPerBlock = MinimumRewardPerBlock; type MinimumDuration = MinimumDuration; type MaximumCharged = MaximumApproved; + type MaximumOptionRewards = MaximumOptionRewards; type PalletId = LiquidityMiningPalletId; } diff --git a/runtime/bifrost/src/lib.rs b/runtime/bifrost/src/lib.rs index d2f8752a70..cfef66fa00 100644 --- a/runtime/bifrost/src/lib.rs +++ b/runtime/bifrost/src/lib.rs @@ -203,7 +203,11 @@ parameter_types! { } pub fn get_all_pallet_accounts() -> Vec { - vec![TreasuryPalletId::get().into_account(), BifrostCrowdloanId::get().into_account()] + vec![ + TreasuryPalletId::get().into_account(), + BifrostCrowdloanId::get().into_account(), + LiquidityMiningPalletId::get().into_account(), + ] } impl frame_system::Config for Runtime { @@ -1044,14 +1048,15 @@ parameter_types! { pub const MaximumDepositInPool: Balance = 1_000_000_000 * DOLLARS; pub const MinimumDepositOfUser: Balance = 1_000_000; pub const MinimumRewardPerBlock: Balance = 1_000; - pub const MinimumDuration: BlockNumber = DAYS; + pub const MinimumDuration: BlockNumber = HOURS; + pub const MaximumOptionRewards: u32 = 7; pub const MaximumCharged: u32 = 32; } impl bifrost_liquidity_mining::Config for Runtime { type Event = Event; type ControlOrigin = - pallet_collective::EnsureProportionAtLeast<_2, _3, AccountId, CouncilCollective>; + pallet_collective::EnsureProportionAtLeast<_1, _2, AccountId, CouncilCollective>; type MultiCurrency = Currencies; type RelayChainTokenSymbol = RelayChainTokenSymbol; type MaximumDepositInPool = MaximumDepositInPool; @@ -1059,6 +1064,7 @@ impl bifrost_liquidity_mining::Config for Runtime { type MinimumRewardPerBlock = MinimumRewardPerBlock; type MinimumDuration = MinimumDuration; type MaximumCharged = MaximumCharged; + type MaximumOptionRewards = MaximumOptionRewards; type PalletId = LiquidityMiningPalletId; } diff --git a/runtime/dev/src/lib.rs b/runtime/dev/src/lib.rs index cf37e798c4..a6bd7c18c1 100644 --- a/runtime/dev/src/lib.rs +++ b/runtime/dev/src/lib.rs @@ -1115,6 +1115,7 @@ parameter_types! { pub const MinimumRewardPerBlock: Balance = 1_000; pub const MinimumDuration: BlockNumber = DAYS; pub const MaximumApproved: u32 = 8; + pub const MaximumOptionRewards: u32 = 7; pub const LiquidityMiningPalletId: PalletId = PalletId(*b"mining##"); } @@ -1129,6 +1130,7 @@ impl bifrost_liquidity_mining::Config for Runtime { type MinimumRewardPerBlock = MinimumRewardPerBlock; type MinimumDuration = MinimumDuration; type MaximumCharged = MaximumApproved; + type MaximumOptionRewards = MaximumOptionRewards; type PalletId = LiquidityMiningPalletId; }