From 7af354be2fe50156e26a7c98d237651e9d4731a0 Mon Sep 17 00:00:00 2001 From: yooml Date: Mon, 6 Jan 2025 19:00:05 +0800 Subject: [PATCH 1/6] =?UTF-8?q?refactor:=20=F0=9F=92=A1=20rename=20fn?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pallets/bb-bnc/src/lib.rs | 105 +++++++++++++++++------------------ pallets/bb-bnc/src/traits.rs | 4 +- 2 files changed, 54 insertions(+), 55 deletions(-) diff --git a/pallets/bb-bnc/src/lib.rs b/pallets/bb-bnc/src/lib.rs index ad6126afa4..458261d77b 100644 --- a/pallets/bb-bnc/src/lib.rs +++ b/pallets/bb-bnc/src/lib.rs @@ -654,7 +654,7 @@ pub mod pallet { } impl Pallet { - pub fn _checkpoint( + pub fn checkpoint( who: &AccountIdOf, position: PositionId, old_locked: LockedBalance, BlockNumberFor>, @@ -834,7 +834,7 @@ pub mod pallet { Ok(()) } - pub fn _deposit_for( + pub fn deposit_for_inner( who: &AccountIdOf, position: PositionId, value: BalanceOf, @@ -843,22 +843,22 @@ pub mod pallet { ) -> DispatchResult { let current_block_number: BlockNumberFor = T::BlockNumberProvider::current_block_number(); - let mut _locked = locked_balance; + let mut locked = locked_balance; let supply_before = Supply::::get(); let supply_after = supply_before .checked_add(value) .ok_or(ArithmeticError::Overflow)?; Supply::::set(supply_after); - let old_locked = _locked.clone(); - _locked.amount = _locked + let old_locked = locked.clone(); + locked.amount = locked .amount .checked_add(value) .ok_or(ArithmeticError::Overflow)?; if unlock_time != Zero::zero() { - _locked.end = unlock_time + locked.end = unlock_time } - Locked::::insert(position, _locked.clone()); + Locked::::insert(position, locked.clone()); let free_balance = T::MultiCurrency::free_balance(T::TokenType::get(), &who); if value != BalanceOf::::zero() { @@ -876,7 +876,7 @@ pub mod pallet { who, position, old_locked, - _locked.clone(), + locked.clone(), UserMarkupInfos::::get(who).as_ref(), )?; @@ -884,8 +884,8 @@ pub mod pallet { who: who.clone(), position, value, - total_value: _locked.amount, - end: _locked.end, + total_value: locked.amount, + end: locked.end, now: current_block_number, }); Self::deposit_event(Event::Supply { @@ -1040,7 +1040,7 @@ pub mod pallet { .ok_or(ArithmeticError::Overflow)?; } - Self::_checkpoint(who, position, old_locked.clone(), new_locked.clone())?; + Self::checkpoint(who, position, old_locked.clone(), new_locked.clone())?; Ok(()) } @@ -1111,14 +1111,14 @@ pub mod pallet { LockedTokens::::insert(¤cy_id, &who, locked_token); UserPositions::::get(&who).into_iter().try_for_each( |position| -> DispatchResult { - let _locked: LockedBalance, BlockNumberFor> = + let locked: LockedBalance, BlockNumberFor> = Locked::::get(position); - ensure!(!_locked.amount.is_zero(), Error::::ArgumentsError); + ensure!(!locked.amount.is_zero(), Error::::ArgumentsError); Self::markup_calc( &who, position, - _locked.clone(), - _locked, + locked.clone(), + locked, Some(&user_markup_info), ) }, @@ -1161,14 +1161,14 @@ pub mod pallet { LockedTokens::::remove(¤cy_id, &who); UserPositions::::get(&who).into_iter().try_for_each( |position| -> DispatchResult { - let _locked: LockedBalance, BlockNumberFor> = + let locked: LockedBalance, BlockNumberFor> = Locked::::get(position); - ensure!(!_locked.amount.is_zero(), Error::::ArgumentsError); // TODO + ensure!(!locked.amount.is_zero(), Error::::ArgumentsError); // TODO Self::markup_calc( &who, position, - _locked.clone(), - _locked, + locked.clone(), + locked, Some(&user_markup_info), ) }, @@ -1241,14 +1241,14 @@ pub mod pallet { LockedTokens::::insert(¤cy_id, &who, locked_token); UserPositions::::get(&who).into_iter().try_for_each( |position| -> DispatchResult { - let _locked: LockedBalance, BlockNumberFor> = + let locked: LockedBalance, BlockNumberFor> = Locked::::get(position); - ensure!(!_locked.amount.is_zero(), Error::::ArgumentsError); // TODO + ensure!(!locked.amount.is_zero(), Error::::ArgumentsError); // TODO Self::markup_calc( &who, position, - _locked.clone(), - _locked, + locked.clone(), + locked, Some(&user_markup_info), ) }, @@ -1278,14 +1278,14 @@ pub mod pallet { pub fn withdraw_no_ensure( who: &AccountIdOf, position: PositionId, - mut _locked: LockedBalance, BlockNumberFor>, + mut locked: LockedBalance, BlockNumberFor>, if_fast: Option, ) -> DispatchResult { - let value = _locked.amount; - let old_locked: LockedBalance, BlockNumberFor> = _locked.clone(); - _locked.end = Zero::zero(); - _locked.amount = Zero::zero(); - Locked::::insert(position, _locked.clone()); + let value = locked.amount; + let old_locked: LockedBalance, BlockNumberFor> = locked.clone(); + locked.end = Zero::zero(); + locked.amount = Zero::zero(); + Locked::::insert(position, locked.clone()); let supply_before = Supply::::get(); let supply_after = supply_before @@ -1314,7 +1314,7 @@ pub mod pallet { } } - Self::_checkpoint(who, position, old_locked, _locked.clone())?; + Self::checkpoint(who, position, old_locked, locked.clone())?; T::FarmingInfo::refresh_gauge_pool(who)?; Self::deposit_event(Event::Withdrawn { @@ -1349,12 +1349,12 @@ pub mod pallet { /// This function will check the lock and redeem it regardless of whether it has expired. pub fn redeem_unlock_inner(who: &AccountIdOf, position: PositionId) -> DispatchResult { - let mut _locked = Locked::::get(position); + let locked = Locked::::get(position); let current_block_number: BlockNumberFor = T::BlockNumberProvider::current_block_number(); - ensure!(_locked.end > current_block_number, Error::::Expired); - let fast = Self::redeem_commission(_locked.end - current_block_number)?; - Self::withdraw_no_ensure(who, position, _locked, Some(fast)) + ensure!(locked.end > current_block_number, Error::::Expired); + let fast = Self::redeem_commission(locked.end - current_block_number)?; + Self::withdraw_no_ensure(who, position, locked, Some(fast)) } fn set_ve_locked(who: &AccountIdOf, new_locked_balance: BalanceOf) -> DispatchResult { @@ -1388,11 +1388,11 @@ impl BbBNCInterface, CurrencyIdOf, BalanceOf, Bl unlock_time: BlockNumberFor, ) -> DispatchResult { let new_position = Position::::get(); - let mut user_positions = UserPositions::::get(who); - user_positions - .try_push(new_position) - .map_err(|_| Error::::ExceedsMaxPositions)?; - UserPositions::::insert(who, user_positions); + UserPositions::::try_mutate(who, |user_positions| { + user_positions + .try_push(new_position) + .map_err(|_| Error::::ExceedsMaxPositions) + })?; Position::::set(new_position + 1); let bb_config = BbConfigs::::get(); @@ -1400,8 +1400,7 @@ impl BbBNCInterface, CurrencyIdOf, BalanceOf, Bl let current_block_number: BlockNumberFor = T::BlockNumberProvider::current_block_number(); - let _locked: LockedBalance, BlockNumberFor> = - Locked::::get(new_position); + let locked: LockedBalance, BlockNumberFor> = Locked::::get(new_position); let real_unlock_time: BlockNumberFor = unlock_time .saturating_add(current_block_number) .checked_div(&T::Week::get()) @@ -1423,11 +1422,11 @@ impl BbBNCInterface, CurrencyIdOf, BalanceOf, Bl .ok_or(ArithmeticError::Overflow)?; ensure!(real_unlock_time <= max_block, Error::::ArgumentsError); ensure!( - _locked.amount == BalanceOf::::zero(), + locked.amount == BalanceOf::::zero(), Error::::LockExist ); // Withdraw old tokens first - Self::_deposit_for(who, new_position, value, real_unlock_time, _locked)?; + Self::deposit_for_inner(who, new_position, value, real_unlock_time, locked)?; T::FarmingInfo::refresh_gauge_pool(who)?; Self::deposit_event(Event::LockCreated { who: who.to_owned(), @@ -1474,7 +1473,7 @@ impl BbBNCInterface, CurrencyIdOf, BalanceOf, Bl Error::::LockNotExist ); - Self::_deposit_for( + Self::deposit_for_inner( who, position, BalanceOf::::zero(), @@ -1498,15 +1497,15 @@ impl BbBNCInterface, CurrencyIdOf, BalanceOf, Bl ) -> DispatchResult { let bb_config = BbConfigs::::get(); ensure!(value >= bb_config.min_mint, Error::::BelowMinimumMint); - let _locked: LockedBalance, BlockNumberFor> = Locked::::get(position); + let locked: LockedBalance, BlockNumberFor> = Locked::::get(position); ensure!( - _locked.amount > BalanceOf::::zero(), + locked.amount > BalanceOf::::zero(), Error::::LockNotExist ); // Need to be executed after create_lock let current_block_number: BlockNumberFor = T::BlockNumberProvider::current_block_number(); - ensure!(_locked.end > current_block_number, Error::::Expired); // Cannot add to expired/non-existent lock - Self::_deposit_for(who, position, value, Zero::zero(), _locked)?; + ensure!(locked.end > current_block_number, Error::::Expired); // Cannot add to expired/non-existent lock + Self::deposit_for_inner(who, position, value, Zero::zero(), locked)?; T::FarmingInfo::refresh_gauge_pool(who)?; Self::deposit_event(Event::AmountIncreased { who: who.to_owned(), @@ -1518,17 +1517,17 @@ impl BbBNCInterface, CurrencyIdOf, BalanceOf, Bl #[transactional] fn deposit_for(who: &AccountIdOf, position: u128, value: BalanceOf) -> DispatchResult { - let _locked: LockedBalance, BlockNumberFor> = Locked::::get(position); - Self::_deposit_for(who, position, value, Zero::zero(), _locked) + let locked: LockedBalance, BlockNumberFor> = Locked::::get(position); + Self::deposit_for_inner(who, position, value, Zero::zero(), locked) } #[transactional] fn withdraw_inner(who: &AccountIdOf, position: u128) -> DispatchResult { - let mut _locked = Locked::::get(position); + let locked = Locked::::get(position); let current_block_number: BlockNumberFor = T::BlockNumberProvider::current_block_number(); - ensure!(current_block_number >= _locked.end, Error::::Expired); - Self::withdraw_no_ensure(who, position, _locked, None) + ensure!(current_block_number >= locked.end, Error::::Expired); + Self::withdraw_no_ensure(who, position, locked, None) } fn balance_of( diff --git a/pallets/bb-bnc/src/traits.rs b/pallets/bb-bnc/src/traits.rs index efd6433923..c22bc0fd92 100644 --- a/pallets/bb-bnc/src/traits.rs +++ b/pallets/bb-bnc/src/traits.rs @@ -35,8 +35,8 @@ pub trait BbBNCInterface { who: &AccountId, value: Balance, unlock_time: BlockNumber, - ) -> DispatchResult; // Deposit `_value` BNC for `who` and lock until `_unlock_time` - fn increase_amount_inner(who: &AccountId, position: u128, value: Balance) -> DispatchResult; // Deposit `_value` additional BNC for `who` without modifying the unlock time + ) -> DispatchResult; // Deposit `value` BNC for `who` and lock until `_unlock_time` + fn increase_amount_inner(who: &AccountId, position: u128, value: Balance) -> DispatchResult; // Deposit `value` additional BNC for `who` without modifying the unlock time fn increase_unlock_time_inner( who: &AccountId, position: u128, From 0bc6a022bc312e0d38f8eac92f01163100245914 Mon Sep 17 00:00:00 2001 From: yooml Date: Mon, 6 Jan 2025 21:24:26 +0800 Subject: [PATCH 2/6] =?UTF-8?q?fix:=20=F0=9F=90=9B=20set=5Fincentive?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pallets/bb-bnc/src/lib.rs | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/pallets/bb-bnc/src/lib.rs b/pallets/bb-bnc/src/lib.rs index 458261d77b..b26bf6264e 100644 --- a/pallets/bb-bnc/src/lib.rs +++ b/pallets/bb-bnc/src/lib.rs @@ -591,9 +591,6 @@ pub mod pallet { ) -> DispatchResult { T::ControlOrigin::ensure_origin(origin)?; - if !TotalLock::::contains_key(currency_id) { - TotalLock::::insert(currency_id, BalanceOf::::zero()); - } let current_block_number: BlockNumberFor = T::BlockNumberProvider::current_block_number(); MarkupCoefficient::::insert( @@ -1290,7 +1287,7 @@ pub mod pallet { let supply_before = Supply::::get(); let supply_after = supply_before .checked_sub(value) - .ok_or(ArithmeticError::Overflow)?; + .ok_or(ArithmeticError::Underflow)?; Supply::::set(supply_after); // BNC should be transferred before checkpoint @@ -1650,16 +1647,17 @@ impl BbBNCInterface, CurrencyIdOf, BalanceOf, Bl rewards_duration: Option>, controller: Option>, ) { - let mut incentive_config = IncentiveConfigs::::get(pool_id); - - if let Some(rewards_duration) = rewards_duration { - incentive_config.rewards_duration = rewards_duration; - }; - if let Some(controller) = controller { - incentive_config.incentive_controller = Some(controller.clone()); - } - IncentiveConfigs::::set(pool_id, incentive_config.clone()); - Self::deposit_event(Event::IncentiveSet { incentive_config }); + IncentiveConfigs::::mutate(pool_id, |incentive_config| { + if let Some(rewards_duration) = rewards_duration { + incentive_config.rewards_duration = rewards_duration; + }; + if let Some(controller) = controller { + incentive_config.incentive_controller = Some(controller.clone()); + } + Self::deposit_event(Event::IncentiveSet { + incentive_config: incentive_config.clone(), + }); + }) } #[transactional] From e242a9d66298496fd2292e79600b51fdbf209c52 Mon Sep 17 00:00:00 2001 From: yooml Date: Tue, 7 Jan 2025 10:36:19 +0800 Subject: [PATCH 3/6] =?UTF-8?q?fix:=20=F0=9F=90=9B=20withdraw=5Fmarkup=5Fi?= =?UTF-8?q?nner?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pallets/bb-bnc/src/lib.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pallets/bb-bnc/src/lib.rs b/pallets/bb-bnc/src/lib.rs index b26bf6264e..d014368efd 100644 --- a/pallets/bb-bnc/src/lib.rs +++ b/pallets/bb-bnc/src/lib.rs @@ -1134,7 +1134,10 @@ pub mod pallet { who: &AccountIdOf, currency_id: CurrencyIdOf, ) -> DispatchResult { - let _ = MarkupCoefficient::::get(currency_id).ok_or(Error::::ArgumentsError)?; // Ensure it is the correct token type. + ensure!( + MarkupCoefficient::::contains_key(currency_id), + Error::::ArgumentsError + ); // Ensure it is the correct token type. let mut user_markup_info = UserMarkupInfos::::get(&who).unwrap_or_default(); From a86014105264c1e06050a383387204dce8f26894 Mon Sep 17 00:00:00 2001 From: yooml Date: Thu, 16 Jan 2025 10:08:59 +0800 Subject: [PATCH 4/6] =?UTF-8?q?fix:=20=F0=9F=90=9B=20rwi=20as=20constant?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pallets/bb-bnc/src/lib.rs | 67 +++++++++++++++++------------------- pallets/bb-bnc/src/tests.rs | 49 ++++++++++++++++++++++++++ pallets/bb-bnc/src/traits.rs | 1 + 3 files changed, 82 insertions(+), 35 deletions(-) diff --git a/pallets/bb-bnc/src/lib.rs b/pallets/bb-bnc/src/lib.rs index d014368efd..1e06135215 100644 --- a/pallets/bb-bnc/src/lib.rs +++ b/pallets/bb-bnc/src/lib.rs @@ -588,6 +588,7 @@ pub mod pallet { currency_id: CurrencyId, markup: FixedU128, hardcap: FixedU128, + rwi: FixedU128, ) -> DispatchResult { T::ControlOrigin::ensure_origin(origin)?; @@ -599,6 +600,7 @@ pub mod pallet { markup_coefficient: markup, hardcap, update_block: current_block_number, + rwi, }, ); Ok(()) @@ -1069,8 +1071,7 @@ pub mod pallet { }); locked_token.amount = locked_token.amount.saturating_add(value); - let left: FixedU128 = FixedU128::checked_from_integer(locked_token.amount) - .and_then(|x| x.checked_mul(&markup_coefficient.markup_coefficient)) + let Ri = FixedU128::checked_from_integer(locked_token.amount) .and_then(|x| { x.checked_div(&FixedU128::checked_from_integer(TotalLock::::get( currency_id, @@ -1078,21 +1079,20 @@ pub mod pallet { }) .ok_or(ArithmeticError::Overflow)?; - let total_issuance = T::MultiCurrency::total_issuance(currency_id); - let right: FixedU128 = FixedU128::checked_from_integer(locked_token.amount) - .and_then(|x| x.checked_mul(&markup_coefficient.markup_coefficient)) - .and_then(|x| x.checked_div(&FixedU128::checked_from_integer(total_issuance)?)) + let Ni = locked_token.amount; + let Ti = T::MultiCurrency::total_issuance(currency_id); + let Wi = markup_coefficient.markup_coefficient; + let left = markup_coefficient + .rwi + .checked_mul(&Ri) .ok_or(ArithmeticError::Overflow)?; + let right = FixedU128::checked_from_integer(Ni) + .and_then(|x| x.checked_mul(&Wi)) + .and_then(|x| x.checked_div(&FixedU128::checked_from_integer(Ti)?)) + .ok_or(ArithmeticError::Overflow)?; + let B = left.checked_add(&right).ok_or(ArithmeticError::Overflow)?; - let currency_id_markup_coefficient: FixedU128 = - left.checked_add(&right).ok_or(ArithmeticError::Overflow)?; - let new_markup_coefficient = match markup_coefficient - .hardcap - .cmp(¤cy_id_markup_coefficient) - { - Ordering::Less => markup_coefficient.hardcap, - Ordering::Equal | Ordering::Greater => currency_id_markup_coefficient, - }; + let new_markup_coefficient = markup_coefficient.hardcap.min(B); Self::update_markup_info( &who, user_markup_info @@ -1200,8 +1200,10 @@ pub mod pallet { if locked_token.refresh_block <= markup_coefficient.update_block { locked_token.refresh_block = current_block_number; - let left: FixedU128 = FixedU128::checked_from_integer(locked_token.amount) - .and_then(|x| x.checked_mul(&markup_coefficient.markup_coefficient)) + let mut user_markup_info = + UserMarkupInfos::::get(&who).ok_or(Error::::LockNotExist)?; + + let Ri = FixedU128::checked_from_integer(locked_token.amount) .and_then(|x| { x.checked_div(&FixedU128::checked_from_integer(TotalLock::::get( currency_id, @@ -1209,26 +1211,21 @@ pub mod pallet { }) .ok_or(ArithmeticError::Overflow)?; - let total_issuance = T::MultiCurrency::total_issuance(currency_id); - let right: FixedU128 = FixedU128::checked_from_integer(locked_token.amount) - .and_then(|x| x.checked_mul(&markup_coefficient.markup_coefficient)) - .and_then(|x| { - x.checked_div(&FixedU128::checked_from_integer(total_issuance)?) - }) - .ok_or(ArithmeticError::Overflow)?; - let currency_id_markup_coefficient: FixedU128 = - left.checked_add(&right).ok_or(ArithmeticError::Overflow)?; + let Ni = locked_token.amount; + let Ti = T::MultiCurrency::total_issuance(currency_id); + let Wi = markup_coefficient.markup_coefficient; - let mut user_markup_info = - UserMarkupInfos::::get(&who).ok_or(Error::::LockNotExist)?; + let left = markup_coefficient + .rwi + .checked_mul(&Ri) + .ok_or(ArithmeticError::Overflow)?; + let right = FixedU128::checked_from_integer(Ni) + .and_then(|x| x.checked_mul(&Wi)) + .and_then(|x| x.checked_div(&FixedU128::checked_from_integer(Ti)?)) + .ok_or(ArithmeticError::Overflow)?; + let B = left.checked_add(&right).ok_or(ArithmeticError::Overflow)?; - let new_markup_coefficient = match markup_coefficient - .hardcap - .cmp(¤cy_id_markup_coefficient) - { - Ordering::Less => markup_coefficient.hardcap, - Ordering::Equal | Ordering::Greater => currency_id_markup_coefficient, - }; + let new_markup_coefficient = markup_coefficient.hardcap.min(B); Self::update_markup_info( &who, user_markup_info diff --git a/pallets/bb-bnc/src/tests.rs b/pallets/bb-bnc/src/tests.rs index 3b0e142e01..788990c7b2 100644 --- a/pallets/bb-bnc/src/tests.rs +++ b/pallets/bb-bnc/src/tests.rs @@ -28,6 +28,7 @@ use frame_support::{assert_noop, assert_ok}; const POSITIONID0: u128 = 0; const POSITIONID1: u128 = 1; +const RWI: FixedU128 = FixedU128::from_inner(100_000_000_000_000_000); #[test] fn create_lock_should_work() { @@ -660,12 +661,14 @@ fn deposit_markup_before_lock_should_work() { VBNC, FixedU128::from_inner(100_000_000_000_000_000), // 0.1 FixedU128::saturating_from_integer(1), + RWI, )); assert_ok!(BbBNC::deposit_markup( RuntimeOrigin::signed(BOB), VBNC, 10_000_000_000_000 )); + assert_eq!(TotalLock::::get(VBNC), 10_000_000_000_000); assert_ok!(BbBNC::create_lock_inner( &BOB, 10_000_000_000_000, @@ -716,6 +719,7 @@ fn deposit_markup_before_lock_should_not_work() { VBNC, FixedU128::from_inner(100_000_000_000_000_000), // 0.1 FixedU128::saturating_from_integer(1), + RWI, )); assert_noop!( @@ -765,6 +769,7 @@ fn deposit_markup_before_lock_should_work2() { VBNC, FixedU128::from_inner(100_000_000_000_000_000), // 0.1 FixedU128::saturating_from_integer(1), + RWI, )); assert_ok!(BbBNC::deposit_markup( RuntimeOrigin::signed(BOB), @@ -842,6 +847,7 @@ fn deposit_markup_after_lock_should_work2() { MOVR, FixedU128::from_inner(500_000_000_000_000_000), // 0.5 FixedU128::saturating_from_integer(1), + FixedU128::from_inner(500_000_000_000_000_000), )); assert_eq!( UserPointHistory::::get(POSITIONID0, U256::from(1)), @@ -939,6 +945,7 @@ fn deposit_markup_after_lock_should_not_work2() { MOVR, FixedU128::from_inner(500_000_000_000_000_000), // 0.5 FixedU128::saturating_from_integer(1), + FixedU128::from_inner(500_000_000_000_000_000), )); assert_ok!(BbBNC::deposit_markup( RuntimeOrigin::signed(BOB), @@ -1009,11 +1016,17 @@ fn deposit_markup_after_lock_should_work() { 10_000_000_000_000, System::block_number() + 365 * 86400 / 12, )); + assert_ok!(BbBNC::create_lock_inner( + &ALICE, + 10_000_000_000_000, + System::block_number() + 365 * 86400 / 12, + )); assert_ok!(BbBNC::set_markup_coefficient( RuntimeOrigin::root(), VBNC, FixedU128::from_inner(100_000_000_000_000_000), // 0.1 FixedU128::saturating_from_integer(1), + FixedU128::from_inner(100_000_000_000_000_000), )); assert_eq!( @@ -1030,6 +1043,13 @@ fn deposit_markup_after_lock_should_work() { VBNC, 10_000_000_000_000 )); + assert_eq!(TotalLock::::get(VBNC), 10_000_000_000_000); + assert_ok!(BbBNC::deposit_markup( + RuntimeOrigin::signed(ALICE), + VBNC, + 10_000_000_000_000 + )); + assert_eq!(TotalLock::::get(VBNC), 20_000_000_000_000); assert_eq!( UserPointHistory::::get(POSITIONID0, U256::from(2)), Point { @@ -1047,6 +1067,26 @@ fn deposit_markup_after_lock_should_work() { BbBNC::balance_of(&BOB, Some(System::block_number())), Ok(2796030953200) ); + assert_eq!( + BbBNC::balance_of(&ALICE, Some(System::block_number())), + Ok(2668976276500) + ); + assert_ok!(BbBNC::set_markup_coefficient( + RuntimeOrigin::root(), + VBNC, + FixedU128::from_inner(100_000_000_000_000_000), // 0.1 + FixedU128::saturating_from_integer(1), + FixedU128::from_inner(50_000_000_000_000_000), // 0.05 + )); + assert_ok!(BbBNC::refresh_inner(VBNC)); + assert_eq!( + BbBNC::balance_of(&BOB, Some(System::block_number())), + Ok(2605450273740) + ); + assert_eq!( + BbBNC::balance_of(&ALICE, Some(System::block_number())), + Ok(2605450273740) + ); }); } @@ -1074,6 +1114,7 @@ fn withdraw_markup_after_lock_should_work() { VBNC, FixedU128::from_inner(100_000_000_000_000_000), // 0.1 FixedU128::saturating_from_integer(1), + RWI, )); assert_ok!(BbBNC::deposit_markup( RuntimeOrigin::signed(BOB), @@ -1129,6 +1170,7 @@ fn redeem_unlock_should_work() { VKSM, FixedU128::from_inner(FixedU128::DIV / 10), // 0.1 FixedU128::saturating_from_integer(1), + RWI, )); assert_ok!(BbBNC::deposit_markup( RuntimeOrigin::signed(BOB), @@ -1207,6 +1249,7 @@ fn withdraw_markup_after_lock_should_work3() { VBNC, FixedU128::from_inner(100_000_000_000_000_000), // 0.1 FixedU128::saturating_from_integer(1), + RWI, )); assert_ok!(BbBNC::deposit_markup( RuntimeOrigin::signed(BOB), @@ -1289,6 +1332,7 @@ fn withdraw_markup_after_lock_should_not_work() { VBNC, FixedU128::from_inner(100_000_000_000_000_000), // 0.1 FixedU128::saturating_from_integer(1), + RWI, )); assert_ok!(BbBNC::deposit_markup( RuntimeOrigin::signed(BOB), @@ -1372,6 +1416,7 @@ fn redeem_unlock_after_360_days_should_work() { VKSM, FixedU128::from_inner(FixedU128::DIV / 10), // 0.1 FixedU128::saturating_from_integer(1), + RWI, )); assert_ok!(BbBNC::deposit_markup( RuntimeOrigin::signed(BOB), @@ -1441,6 +1486,7 @@ fn redeem_unlock_after_360_days_should_not_work() { VKSM, FixedU128::from_inner(FixedU128::DIV / 10), // 0.1 FixedU128::saturating_from_integer(1), + RWI, )); assert_ok!(BbBNC::deposit_markup( RuntimeOrigin::signed(BOB), @@ -1485,6 +1531,7 @@ fn redeem_unlock_after_360_days_should_work2() { VKSM, FixedU128::from_inner(FixedU128::DIV / 10), // 0.1 FixedU128::saturating_from_integer(1), + RWI, )); assert_ok!(BbBNC::deposit_markup( RuntimeOrigin::signed(BOB), @@ -1579,6 +1626,7 @@ fn refresh_should_work() { VBNC, FixedU128::from_inner(100_000_000_000_000_000), // 0.1 FixedU128::saturating_from_integer(1), + RWI, )); assert_ok!(BbBNC::deposit_markup( RuntimeOrigin::signed(BOB), @@ -1596,6 +1644,7 @@ fn refresh_should_work() { VBNC, FixedU128::from_inner(200_000_000_000_000_000), // 0.2 FixedU128::saturating_from_integer(1), + FixedU128::from_inner(200_000_000_000_000_000) )); assert_eq!( UserPointHistory::::get(POSITIONID0, U256::one()), diff --git a/pallets/bb-bnc/src/traits.rs b/pallets/bb-bnc/src/traits.rs index c22bc0fd92..50dddadc93 100644 --- a/pallets/bb-bnc/src/traits.rs +++ b/pallets/bb-bnc/src/traits.rs @@ -194,6 +194,7 @@ pub struct MarkupCoefficientInfo { pub markup_coefficient: FixedU128, pub hardcap: FixedU128, pub update_block: BlockNumber, + pub rwi: FixedU128, } pub trait MarkupInfo { From 7babdcf11cb8a2c446cf8e6e3f9f8c1c0de422fc Mon Sep 17 00:00:00 2001 From: yooml Date: Thu, 16 Jan 2025 10:56:39 +0800 Subject: [PATCH 5/6] =?UTF-8?q?fix:=20=F0=9F=90=9B=20benchmark?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pallets/bb-bnc/src/benchmarking.rs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/pallets/bb-bnc/src/benchmarking.rs b/pallets/bb-bnc/src/benchmarking.rs index f6bff885f4..d074af5324 100644 --- a/pallets/bb-bnc/src/benchmarking.rs +++ b/pallets/bb-bnc/src/benchmarking.rs @@ -345,6 +345,7 @@ mod benchmarks { CurrencyId::VToken(TokenSymbol::BNC), 10_000.into(), 10_000_000_000_000.into(), + 1_000.into(), ); Ok(()) @@ -391,7 +392,8 @@ mod benchmarks { RawOrigin::Root.into(), CurrencyId::VToken(TokenSymbol::BNC), 1_000.into(), - 10_000_000_000_000.into() + 10_000_000_000_000.into(), + 1_000.into(), )); >::set_block_number((2 * 365 * 86400 / 12u32).into()); @@ -446,7 +448,8 @@ mod benchmarks { RawOrigin::Root.into(), CurrencyId::VToken(TokenSymbol::BNC), 1_000.into(), - 10_000_000_000_000.into() + 10_000_000_000_000.into(), + 1_000.into(), )); assert_ok!(BbBNC::::deposit_markup( @@ -507,7 +510,8 @@ mod benchmarks { RawOrigin::Root.into(), CurrencyId::VToken(TokenSymbol::BNC), 1_000.into(), - 10_000_000_000_000.into() + 10_000_000_000_000.into(), + 1_000.into(), )); assert_ok!(BbBNC::::deposit_markup( @@ -565,7 +569,8 @@ mod benchmarks { RawOrigin::Root.into(), CurrencyId::VToken(TokenSymbol::BNC), 1_000.into(), - 10_000_000_000_000.into() + 10_000_000_000_000.into(), + 1_000.into(), )); assert_ok!(BbBNC::::deposit_markup( From 1aeddf22a8d41757ffc5b58be574ba4734c120ab Mon Sep 17 00:00:00 2001 From: yooml Date: Thu, 16 Jan 2025 14:33:48 +0800 Subject: [PATCH 6/6] =?UTF-8?q?style:=20=F0=9F=92=84=20clippy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pallets/bb-bnc/src/lib.rs | 42 +++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/pallets/bb-bnc/src/lib.rs b/pallets/bb-bnc/src/lib.rs index 1e06135215..e143dc27db 100644 --- a/pallets/bb-bnc/src/lib.rs +++ b/pallets/bb-bnc/src/lib.rs @@ -48,7 +48,7 @@ use frame_system::pallet_prelude::*; pub use incentive::*; use orml_traits::{LockIdentifier, MultiCurrency, MultiLockableCurrency}; use sp_core::{U256, U512}; -use sp_std::{borrow::ToOwned, cmp::Ordering, collections::btree_map::BTreeMap, vec, vec::Vec}; +use sp_std::{borrow::ToOwned, collections::btree_map::BTreeMap, vec, vec::Vec}; pub use traits::{BbBNCInterface, LockedToken, MarkupCoefficientInfo, MarkupInfo, UserMarkupInfo}; pub use weights::WeightInfo; @@ -1071,7 +1071,7 @@ pub mod pallet { }); locked_token.amount = locked_token.amount.saturating_add(value); - let Ri = FixedU128::checked_from_integer(locked_token.amount) + let ri = FixedU128::checked_from_integer(locked_token.amount) .and_then(|x| { x.checked_div(&FixedU128::checked_from_integer(TotalLock::::get( currency_id, @@ -1079,20 +1079,20 @@ pub mod pallet { }) .ok_or(ArithmeticError::Overflow)?; - let Ni = locked_token.amount; - let Ti = T::MultiCurrency::total_issuance(currency_id); - let Wi = markup_coefficient.markup_coefficient; + let ni = locked_token.amount; + let ti = T::MultiCurrency::total_issuance(currency_id); + let wi = markup_coefficient.markup_coefficient; let left = markup_coefficient .rwi - .checked_mul(&Ri) + .checked_mul(&ri) .ok_or(ArithmeticError::Overflow)?; - let right = FixedU128::checked_from_integer(Ni) - .and_then(|x| x.checked_mul(&Wi)) - .and_then(|x| x.checked_div(&FixedU128::checked_from_integer(Ti)?)) + let right = FixedU128::checked_from_integer(ni) + .and_then(|x| x.checked_mul(&wi)) + .and_then(|x| x.checked_div(&FixedU128::checked_from_integer(ti)?)) .ok_or(ArithmeticError::Overflow)?; - let B = left.checked_add(&right).ok_or(ArithmeticError::Overflow)?; + let b = left.checked_add(&right).ok_or(ArithmeticError::Overflow)?; - let new_markup_coefficient = markup_coefficient.hardcap.min(B); + let new_markup_coefficient = markup_coefficient.hardcap.min(b); Self::update_markup_info( &who, user_markup_info @@ -1203,7 +1203,7 @@ pub mod pallet { let mut user_markup_info = UserMarkupInfos::::get(&who).ok_or(Error::::LockNotExist)?; - let Ri = FixedU128::checked_from_integer(locked_token.amount) + let ri = FixedU128::checked_from_integer(locked_token.amount) .and_then(|x| { x.checked_div(&FixedU128::checked_from_integer(TotalLock::::get( currency_id, @@ -1211,21 +1211,21 @@ pub mod pallet { }) .ok_or(ArithmeticError::Overflow)?; - let Ni = locked_token.amount; - let Ti = T::MultiCurrency::total_issuance(currency_id); - let Wi = markup_coefficient.markup_coefficient; + let ni = locked_token.amount; + let ti = T::MultiCurrency::total_issuance(currency_id); + let wi = markup_coefficient.markup_coefficient; let left = markup_coefficient .rwi - .checked_mul(&Ri) + .checked_mul(&ri) .ok_or(ArithmeticError::Overflow)?; - let right = FixedU128::checked_from_integer(Ni) - .and_then(|x| x.checked_mul(&Wi)) - .and_then(|x| x.checked_div(&FixedU128::checked_from_integer(Ti)?)) + let right = FixedU128::checked_from_integer(ni) + .and_then(|x| x.checked_mul(&wi)) + .and_then(|x| x.checked_div(&FixedU128::checked_from_integer(ti)?)) .ok_or(ArithmeticError::Overflow)?; - let B = left.checked_add(&right).ok_or(ArithmeticError::Overflow)?; + let b = left.checked_add(&right).ok_or(ArithmeticError::Overflow)?; - let new_markup_coefficient = markup_coefficient.hardcap.min(B); + let new_markup_coefficient = markup_coefficient.hardcap.min(b); Self::update_markup_info( &who, user_markup_info