The debt is subtracted twice from the new pool.
Currently whenever a loan is refinanced the debt is subtracted twice from the new pool's poolBalance. This isn't supposed to happen as the new pool's owner will lose twice as much from his poolBalance while his outstandingLoans will be equal to the debt, meaning there will be funds he will lose.
function testRefinanceIsSubtractedTwice() public {
vm.startPrank(lender1);
Pool memory lender1Pool = Pool({
lender: lender1,
loanToken: address(loanToken),
collateralToken: address(collateralToken),
minLoanSize: 100*10**18,
poolBalance: 1000*10**18,
maxLoanRatio: 2*10**18,
auctionLength: 1 days,
interestRate: 1000,
outstandingLoans: 0
});
bytes32 lender1PoolId = lender.setPool(lender1Pool);
vm.stopPrank();
vm.startPrank(borrower);
Borrow memory b = Borrow({
poolId: lender1PoolId,
debt: 500*10**18,
collateral: 500*10**18
});
Borrow[] memory borrows = new Borrow[](1);
borrows[0] = b;
lender.borrow(borrows);
vm.stopPrank();
vm.startPrank(lender2);
Pool memory lender2Pool = Pool({
lender: lender2,
loanToken: address(loanToken),
collateralToken: address(collateralToken),
minLoanSize: 100*10**18,
poolBalance: 1000*10**18,
maxLoanRatio: 2*10**18,
auctionLength: 1 days,
interestRate: 1000,
outstandingLoans: 0
});
bytes32 lender2PoolId = lender.setPool(lender2Pool);
vm.startPrank(borrower);
Refinance memory r = Refinance({
loanId: 0,
poolId: lender2PoolId,
debt: 500*10**18,
collateral: 500*10**18
});
Refinance[] memory rs = new Refinance[](1);
rs[0] = r;
lender.refinance(rs);
vm.stopPrank();
(,,,,uint256 lender2PoolAfterRefinancing,,,, uint256 outstandingLoans) = lender.pools(lender2PoolId);
assertEq(lender2PoolAfterRefinancing, 0);
assertEq(outstandingLoans, r.debt);
}
Loss of funds for the new lender of the loan.