diff --git a/token-lending/program/src/processor.rs b/token-lending/program/src/processor.rs index 8359ad62..31cac012 100644 --- a/token-lending/program/src/processor.rs +++ b/token-lending/program/src/processor.rs @@ -570,7 +570,7 @@ fn process_borrow( let cumulative_borrow_rate = borrow_reserve.state.cumulative_borrow_rate_wads; let deposit_reserve_collateral_exchange_rate = deposit_reserve.state.collateral_exchange_rate(); - let (borrow_amount, collateral_deposit_amount) = match amount_type { + let (borrow_amount, mut collateral_deposit_amount) = match amount_type { BorrowAmountType::LiquidityBorrowAmount => { let borrow_amount = amount; @@ -619,13 +619,12 @@ fn process_borrow( } }; - let (borrow_fee, host_fee) = deposit_reserve + let (mut borrow_fee, host_fee) = deposit_reserve .config .fees .calculate_borrow_fees(collateral_deposit_amount)?; // update amount actually deposited - let collateral_deposit_amount = collateral_deposit_amount - borrow_fee; - let owner_fee = borrow_fee - host_fee; + collateral_deposit_amount -= borrow_fee; borrow_reserve.state.add_borrow(borrow_amount)?; @@ -685,6 +684,33 @@ fn process_borrow( token_program: token_program_id.clone(), })?; + // transfer host fees if host is specified + if let Ok(host_fee_recipient) = next_account_info(account_info_iter) { + if host_fee > 0 { + borrow_fee -= host_fee; + spl_token_transfer(TokenTransferParams { + source: source_collateral_info.clone(), + destination: host_fee_recipient.clone(), + amount: host_fee, + authority: user_transfer_authority_info.clone(), + authority_signer_seeds: &[], + token_program: token_program_id.clone(), + })?; + } + } + + // transfer remaining fees to owner + if borrow_fee > 0 { + spl_token_transfer(TokenTransferParams { + source: source_collateral_info.clone(), + destination: deposit_reserve_collateral_fees_receiver_info.clone(), + amount: borrow_fee, + authority: user_transfer_authority_info.clone(), + authority_signer_seeds: &[], + token_program: token_program_id.clone(), + })?; + } + // borrow liquidity spl_token_transfer(TokenTransferParams { source: borrow_reserve_liquidity_supply_info.clone(), @@ -743,39 +769,6 @@ fn process_borrow( token_program: token_program_id.clone(), })?; - // transfer owner fees - if owner_fee > 0 { - spl_token_transfer(TokenTransferParams { - source: deposit_reserve_collateral_supply_info.clone(), - destination: deposit_reserve_collateral_fees_receiver_info.clone(), - amount: owner_fee, - authority: lending_market_authority_info.clone(), - authority_signer_seeds, - token_program: token_program_id.clone(), - })?; - } - - // transfer host fees - if host_fee > 0 { - // if host specified, transfer to that account, otherwise transfer to - // owner - let host_fee_recipient = if let Ok(deposit_reserve_collateral_host_info) = - next_account_info(account_info_iter) - { - deposit_reserve_collateral_host_info - } else { - deposit_reserve_collateral_fees_receiver_info - }; - spl_token_transfer(TokenTransferParams { - source: deposit_reserve_collateral_supply_info.clone(), - destination: host_fee_recipient.clone(), - amount: host_fee, - authority: lending_market_authority_info.clone(), - authority_signer_seeds, - token_program: token_program_id.clone(), - })?; - } - Ok(()) } diff --git a/token-lending/program/tests/borrow.rs b/token-lending/program/tests/borrow.rs index 0d1ce81e..7d205213 100644 --- a/token-lending/program/tests/borrow.rs +++ b/token-lending/program/tests/borrow.rs @@ -103,11 +103,18 @@ async fn test_success() { .fees .calculate_borrow_fees(borrow_amount) .unwrap(); - let sol_fee_balance = - get_token_balance(&mut banks_client, sol_reserve.collateral_fees_receiver).await; + assert!(total_fee > 0); assert!(host_fee > 0); - assert_eq!(total_fee - host_fee, sol_fee_balance); + + let sol_collateral_supply = + get_token_balance(&mut banks_client, sol_reserve.collateral_supply).await; + assert_eq!(sol_collateral_supply, borrow_amount - total_fee); + + let sol_fee_balance = + get_token_balance(&mut banks_client, sol_reserve.collateral_fees_receiver).await; + assert_eq!(sol_fee_balance, total_fee - host_fee); + let sol_host_balance = get_token_balance(&mut banks_client, sol_reserve.collateral_host).await; - assert_eq!(host_fee, sol_host_balance); + assert_eq!(sol_host_balance, host_fee); }