lending: Fix fee collection for borrows (#1039)
This commit is contained in:
parent
e2879c35df
commit
efed7c66f7
|
@ -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(())
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue