@@ -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
0 commit comments