lending: Fix fee collection for borrows (#1039)

This commit is contained in:
Justin Starry 2021-01-07 14:56:55 +08:00 committed by GitHub
parent e2879c35df
commit efed7c66f7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 41 additions and 41 deletions

View File

@ -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(())
}

View File

@ -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);
}