@@ -772,20 +772,19 @@ impl Processor {
772772 // To prevent a faulty manager fee account from preventing withdrawals
773773 // if the token program does not own the account, or if the account is not
774774 // initialized
775- let fee_lamports_opt = if stake_pool. manager_fee_account
776- == * user_pool_token_account_info. key
775+ let fee_lamports = if stake_pool. manager_fee_account == * user_pool_token_account_info. key
777776 || check_manager_fee_info ( manager_fee_account_info, & stake_pool) . is_err ( )
778777 {
779- Some ( 0 )
778+ 0
780779 } else {
781780 let pool_tokens_fee = stake_pool
782781 . calc_pool_tokens_stake_withdrawal_fee ( pool_tokens_in)
783782 . ok_or ( StakeDepositInterceptorError :: CalculationFailure ) ?;
784783 match stake_pool. calc_lamports_withdraw_amount ( pool_tokens_fee) {
785- Some ( lamports) => Some ( lamports) ,
784+ Some ( lamports) => lamports,
786785 None => {
787786 msg ! ( "Failed to calculate lamports withdraw amount from pool tokens fee; treating manager fee as 0" ) ;
788- Some ( 0 )
787+ 0
789788 }
790789 }
791790 } ;
@@ -824,49 +823,47 @@ impl Processor {
824823 ] ,
825824 ) ?;
826825
827- if let Some ( fee_lamports) = fee_lamports_opt {
828- if fee_lamports > 0 {
829- Hopper :: load (
826+ if fee_lamports > 0 {
827+ Hopper :: load (
828+ program_id,
829+ fee_rebate_hopper_info,
830+ whitelist_info. key ,
831+ stake_deposit_authority_info. key ,
832+ true ,
833+ ) ?;
834+
835+ let hopper_balance = fee_rebate_hopper_info. lamports ( ) ;
836+ let rent = Rent :: get ( ) ?;
837+ let min_balance = rent. minimum_balance ( fee_rebate_hopper_info. data_len ( ) ) ;
838+ let available = hopper_balance. saturating_sub ( min_balance) ;
839+ let rebate_lamports = fee_lamports. min ( available) ;
840+
841+ // If there are no funds in the Hopper, the TX should still succeed and no 0.1% rebate will be sent ( This is an extreme edge case )
842+ if rebate_lamports > 0 {
843+ let ( _, hopper_bump, mut hopper_seeds) = Hopper :: find_program_address (
830844 program_id,
831- fee_rebate_hopper_info,
832845 whitelist_info. key ,
833846 stake_deposit_authority_info. key ,
834- true ,
847+ ) ;
848+ hopper_seeds. push ( vec ! [ hopper_bump] ) ;
849+
850+ invoke_signed (
851+ & transfer (
852+ fee_rebate_hopper_info. key ,
853+ fee_rebate_recipient_info. key ,
854+ rebate_lamports,
855+ ) ,
856+ & [
857+ fee_rebate_hopper_info. clone ( ) ,
858+ fee_rebate_recipient_info. clone ( ) ,
859+ system_program_info. clone ( ) ,
860+ ] ,
861+ & [ hopper_seeds
862+ . iter ( )
863+ . map ( |seed| seed. as_slice ( ) )
864+ . collect :: < Vec < & [ u8 ] > > ( )
865+ . as_slice ( ) ] ,
835866 ) ?;
836-
837- let hopper_balance = fee_rebate_hopper_info. lamports ( ) ;
838- let rent = Rent :: get ( ) ?;
839- let min_balance = rent. minimum_balance ( fee_rebate_hopper_info. data_len ( ) ) ;
840- let available = hopper_balance. saturating_sub ( min_balance) ;
841- let rebate_lamports = fee_lamports. min ( available) ;
842-
843- // If there are no funds in the Hopper, the TX should still succeed and no 0.1% rebate will be sent ( This is an extreme edge case )
844- if rebate_lamports > 0 {
845- let ( _, hopper_bump, mut hopper_seeds) = Hopper :: find_program_address (
846- program_id,
847- whitelist_info. key ,
848- stake_deposit_authority_info. key ,
849- ) ;
850- hopper_seeds. push ( vec ! [ hopper_bump] ) ;
851-
852- invoke_signed (
853- & transfer (
854- fee_rebate_hopper_info. key ,
855- fee_rebate_recipient_info. key ,
856- rebate_lamports,
857- ) ,
858- & [
859- fee_rebate_hopper_info. clone ( ) ,
860- fee_rebate_recipient_info. clone ( ) ,
861- system_program_info. clone ( ) ,
862- ] ,
863- & [ hopper_seeds
864- . iter ( )
865- . map ( |seed| seed. as_slice ( ) )
866- . collect :: < Vec < & [ u8 ] > > ( )
867- . as_slice ( ) ] ,
868- ) ?;
869- }
870867 }
871868 }
872869
0 commit comments