Skip to content

Commit 84c7f2d

Browse files
Fix lm force retire (#337)
* 🐛 ($PALLET) Fix the bug of `force_retire_pool` * ✅ ($PALLET) Modify unit-test to cover bug range
1 parent d8e02b6 commit 84c7f2d

2 files changed

Lines changed: 44 additions & 16 deletions

File tree

pallets/liquidity-mining/src/lib.rs

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,18 @@ impl<T: Config> PoolInfo<T> {
202202

203203
Ok(().into())
204204
}
205+
206+
/// Try to return back the remain of reward from keeper to investor
207+
pub(crate) fn try_withdraw_remain(&self) -> DispatchResult {
208+
let investor = self.investor.clone().ok_or(Error::<T>::Unexpected)?;
209+
210+
for (rtoken, reward) in self.rewards.iter() {
211+
let remain = reward.total.saturating_sub(reward.claimed);
212+
T::MultiCurrency::transfer(*rtoken, &self.keeper, &investor, remain)?;
213+
}
214+
215+
Ok(().into())
216+
}
205217
}
206218

207219
#[derive(Encode, Decode, Copy, Clone, Eq, PartialEq, Debug)]
@@ -660,15 +672,20 @@ pub mod pallet {
660672
let r#type = pool.r#type;
661673
let trading_pair = pool.trading_pair;
662674

663-
if pool.deposit == Zero::zero() {
664-
TotalPoolInfos::<T>::remove(pid);
665-
} else {
666-
let pool_retired = PoolInfo {
667-
state: PoolState::Retired,
668-
block_retired: Some(frame_system::Pallet::<T>::block_number()),
669-
..pool
670-
};
671-
TotalPoolInfos::<T>::insert(pid, pool_retired);
675+
match pool.state {
676+
PoolState::Charged if pool.deposit == Zero::zero() => {
677+
pool.try_withdraw_remain()?;
678+
TotalPoolInfos::<T>::remove(pid);
679+
},
680+
PoolState::Charged | PoolState::Ongoing => {
681+
let pool_retired = PoolInfo {
682+
state: PoolState::Retired,
683+
block_retired: Some(frame_system::Pallet::<T>::block_number()),
684+
..pool
685+
};
686+
TotalPoolInfos::<T>::insert(pid, pool_retired);
687+
},
688+
_ => {},
672689
}
673690

674691
Self::deposit_event(Event::PoolRetiredForcefully(pid, r#type, trading_pair));
@@ -1009,12 +1026,7 @@ pub mod pallet {
10091026
};
10101027

10111028
if pool.state == PoolState::Retired && pool.deposit == Zero::zero() {
1012-
let investor = pool.investor.clone().ok_or(Error::<T>::Unexpected)?;
1013-
for (rtoken, reward) in pool.rewards.iter() {
1014-
let remain = reward.total.saturating_sub(reward.claimed);
1015-
T::MultiCurrency::transfer(*rtoken, &pool.keeper, &investor, remain)?;
1016-
}
1017-
1029+
pool.try_withdraw_remain()?;
10181030
pool.state = PoolState::Dead;
10191031
}
10201032

pallets/liquidity-mining/src/tests.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1791,7 +1791,7 @@ fn force_retire_pool_charged_should_work() {
17911791
}
17921792

17931793
#[test]
1794-
fn force_retire_pool_charged_with_no_deposit_should_work() {
1794+
fn force_retire_pool_charged_without_deposit_should_work() {
17951795
new_test_ext().execute_with(|| {
17961796
assert_ok!(LM::create_mining_pool(
17971797
pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(),
@@ -1806,11 +1806,27 @@ fn force_retire_pool_charged_with_no_deposit_should_work() {
18061806
// It is unable to call Collective::execute(..) which is private;
18071807
assert_ok!(LM::charge(Some(INVESTOR).into(), 0));
18081808

1809+
let keeper = LM::pool(0).unwrap().keeper;
1810+
18091811
assert_ok!(LM::force_retire_pool(
18101812
pallet_collective::RawOrigin::Member(TC_MEMBER_1).into(),
18111813
0
18121814
));
18131815

1816+
assert_eq!(Tokens::accounts(keeper.clone(), REWARD_1).free, 0);
1817+
assert_eq!(Tokens::accounts(keeper.clone(), REWARD_1).frozen, 0);
1818+
assert_eq!(Tokens::accounts(keeper.clone(), REWARD_1).reserved, 0);
1819+
assert_eq!(Tokens::accounts(keeper.clone(), REWARD_2).free, 0);
1820+
assert_eq!(Tokens::accounts(keeper.clone(), REWARD_2).frozen, 0);
1821+
assert_eq!(Tokens::accounts(keeper.clone(), REWARD_2).reserved, 0);
1822+
1823+
assert_eq!(Tokens::accounts(INVESTOR, REWARD_1).free, REWARD_AMOUNT);
1824+
assert_eq!(Tokens::accounts(INVESTOR, REWARD_1).frozen, 0);
1825+
assert_eq!(Tokens::accounts(INVESTOR, REWARD_1).reserved, 0);
1826+
assert_eq!(Tokens::accounts(INVESTOR, REWARD_2).free, REWARD_AMOUNT);
1827+
assert_eq!(Tokens::accounts(INVESTOR, REWARD_2).frozen, 0);
1828+
assert_eq!(Tokens::accounts(INVESTOR, REWARD_2).reserved, 0);
1829+
18141830
assert!(LM::pool(0).is_none());
18151831
});
18161832
}

0 commit comments

Comments
 (0)