Bauer
medium
Front run of liquidateLoanFull() function
Borrower could listen the mempool in order to check if he sees a tx of liquidating his loan , if it happens he could front run this tx by sending a tx with higher gas fee to call the repayLoanMinimum()
function to make the minimum amount due for an active loan, this could update the lastRepaidTimestamp
and prevent his loan from being liquidated.
function _repayLoan(
uint256 _bidId,
Payment memory _payment,
uint256 _owedAmount,
bool _shouldWithdrawCollateral
) internal virtual {
Bid storage bid = bids[_bidId];
uint256 paymentAmount = _payment.principal + _payment.interest;
RepMark mark = reputationManager.updateAccountReputation(
bid.borrower,
_bidId
);
// Check if we are sending a payment or amount remaining
if (paymentAmount >= _owedAmount) {
paymentAmount = _owedAmount;
bid.state = BidState.PAID;
// Remove borrower's active bid
_borrowerBidsActive[bid.borrower].remove(_bidId);
// If loan is is being liquidated and backed by collateral, withdraw and send to borrower
if (_shouldWithdrawCollateral) {
collateralManager.withdraw(_bidId);
}
emit LoanRepaid(_bidId);
} else {
emit LoanRepayment(_bidId);
}
address lender = getLoanLender(_bidId);
// Send payment to the lender
bid.loanDetails.lendingToken.safeTransferFrom(
_msgSenderForMarket(bid.marketplaceId),
lender,
paymentAmount
);
// update our mappings
bid.loanDetails.totalRepaid.principal += _payment.principal;
bid.loanDetails.totalRepaid.interest += _payment.interest;
bid.loanDetails.lastRepaidTimestamp = uint32(block.timestamp);
// If the loan is paid in full and has a mark, we should update the current reputation
if (mark != RepMark.Good) {
reputationManager.updateAccountReputation(bid.borrower, _bidId);
}
}
function _canLiquidateLoan(uint256 _bidId, uint32 _liquidationDelay)
internal
view
returns (bool)
{
Bid storage bid = bids[_bidId];
// Make sure loan cannot be liquidated if it is not active
if (bid.state != BidState.ACCEPTED) return false;
if (bidDefaultDuration[_bidId] == 0) return false;
return (uint32(block.timestamp) -
_liquidationDelay -
lastRepaidTimestamp(_bidId) >
bidDefaultDuration[_bidId]);
}
Borrower can prevent his loan from being liquidated
https://github.com/sherlock-audit/2023-03-teller/blob/main/teller-protocol-v2/packages/contracts/contracts/TellerV2.sol#L965-L968 https://github.com/sherlock-audit/2023-03-teller/blob/main/teller-protocol-v2/packages/contracts/contracts/TellerV2.sol#L580-L599
Manual Review