---
# System prepended metadata

title: Untitled

---

BBB Day4 F team Masaru

## [H-3] 借り手が自分の貸し手となって資金を奪うことができる

### ■ カテゴリー
reentrancy

### ■ 条件
借り手は、createLoan() でローンを作成します。
同じ借り手がlend()を呼び出し、自分自身のローンに資金を供給します。借り手はlendチケットを受け取り、資金は自分自身に転送されます。
新しい貸し手が、ローンを買い取ろうとします。元の融資額＋経過利息が、元の貸し手（借り手と同じ人）に送られます。

### ■ ハッキングの詳細
CEIパターンがないため、借り手は、貸し出しチケットが新しい貸し手に転送される前に、直ちにrepayAndCloseLoan()を呼び出すことができる。


### ■ 修正方法
OpenZepperinのreentrancyGuardを使用する



## [M-5] `closeLoan`ではなく、`repayAndCloseLoan`をcallすると、借り手は資金を失う。

### ■ カテゴリー
ERC20　safeTransfer
### ■ 条件
closeLoanではなく、repayAndCloseLoanが呼ばれる（なぜ？）

### ■ ハッキングの詳細
`ERC20(loan.loanAssetContractAddress).safeTransferFrom(msg.sender, lender, interest + loan.loanAmount)` を実行します。`interest` はタイムスタンプ 0 から蓄積された高い値、`loan.loanAmount` は `createLoan` で設定した当初希望の最小ローン額 `minLoanAmount` になります。ユーザーが承認した場合、これらの資金は失われます。
### ■ 修正方法
```solodity
/// Before
ERC20(loan.loanAssetContractAddress).safeTransferFrom(msg.sender, lender, interest + loan.loanAmount);
        
///After
require(loan.lastAccumulatedTimestamp > 0, "loan was never matched by a lender. use closeLoan instead");
ERC20(loan.loanAssetContractAddress).safeTransferFrom(msg.sender, lender, interest + loan.loanAmount);


```

## [M-7] mintではなくsafeMintを使う

### ■ カテゴリー
ERC721 safeMint
### ■ 条件
`mintBorrowTicketTo` が ERC721 を適切に処理できない場合に問題となることがあります。

### ■ ハッキングの詳細
mintではなくsafeMintを使うべき


### ■ 修正方法
```solidity=
///before
function mint(address to, uint256 tokenId) external override loanFacilitatorOnly {
    _mint(to, tokenId);
}
///after
function mint(address to, uint256 tokenId) external override loanFacilitatorOnly {
    _safeMint(to, tokenId);
}
```
