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 cumulative_borrow_rate = borrow_reserve.state.cumulative_borrow_rate_wads;
|
||||||
let deposit_reserve_collateral_exchange_rate = deposit_reserve.state.collateral_exchange_rate();
|
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 => {
|
BorrowAmountType::LiquidityBorrowAmount => {
|
||||||
let borrow_amount = amount;
|
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
|
.config
|
||||||
.fees
|
.fees
|
||||||
.calculate_borrow_fees(collateral_deposit_amount)?;
|
.calculate_borrow_fees(collateral_deposit_amount)?;
|
||||||
// update amount actually deposited
|
// update amount actually deposited
|
||||||
let collateral_deposit_amount = collateral_deposit_amount - borrow_fee;
|
collateral_deposit_amount -= borrow_fee;
|
||||||
let owner_fee = borrow_fee - host_fee;
|
|
||||||
|
|
||||||
borrow_reserve.state.add_borrow(borrow_amount)?;
|
borrow_reserve.state.add_borrow(borrow_amount)?;
|
||||||
|
|
||||||
|
@ -685,6 +684,33 @@ fn process_borrow(
|
||||||
token_program: token_program_id.clone(),
|
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
|
// borrow liquidity
|
||||||
spl_token_transfer(TokenTransferParams {
|
spl_token_transfer(TokenTransferParams {
|
||||||
source: borrow_reserve_liquidity_supply_info.clone(),
|
source: borrow_reserve_liquidity_supply_info.clone(),
|
||||||
|
@ -743,39 +769,6 @@ fn process_borrow(
|
||||||
token_program: token_program_id.clone(),
|
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(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -103,11 +103,18 @@ async fn test_success() {
|
||||||
.fees
|
.fees
|
||||||
.calculate_borrow_fees(borrow_amount)
|
.calculate_borrow_fees(borrow_amount)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let sol_fee_balance =
|
|
||||||
get_token_balance(&mut banks_client, sol_reserve.collateral_fees_receiver).await;
|
|
||||||
assert!(total_fee > 0);
|
assert!(total_fee > 0);
|
||||||
assert!(host_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;
|
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