How?

The Collateral Loan smart contract

/// @inheritdoc ILoanManager
 function createLoanWithCollateral(
 uint256 principal,
 uint256 repayment,
 uint256 duration,
 uint256 collateralId,
 uint256 poolId,
 address borrower
 ) external onlyOwner returns (LoanMetadata memory loanData) {
 ILendingPool pool = _pools[poolId]; loanData = LoanMetadata(
 LoanStatus.Issued,
 pool,
 true,
 collateralId,
 principal,
 repayment,
 0,
 duration,
 block.timestamp + duration,
 borrower
 ); assetWrapper.transferFrom(borrower, address(this), collateralId);
 _createLoan(loanData, pool);
 }

The Mini DAO

The user interface

In case of default

/// @inheritdoc ILoanManager
 function markLoanAsDefaulted(ILendingPool pool, uint256 loanId) external onlyOwner {
 LoanMetadata memory loan = _loans[pool][loanId];
 require(loan.status != LoanStatus.Repaid, “LoanManager: Loan already repaid”);
 require(loan.repaymentDate <= block.timestamp, “LoanManager: Loan timestamp is not finished”); _setLoanStatus(pool, loanId, LoanStatus.Defaulted);
 if (loan.hasCollateral) {
 assetWrapper.safeTransferFrom(address(this), owner(), loan.collateralId);
 }
 }

Loan repayment after default

Contracts: