[翻訳] ERC3156 Flash Loans (Flash Minter) 【Bunzzスマートコントラクトモジュール】

:::note info
本記事は下記の翻訳となります。
[『ERC3156 Flash Loans (Flash Minter) Smart Contract Module in Bunzz』](https://blog.bunzz.dev/erc-3156-flash-loans-flashminter-smart-contract-module-in-bunzz/)
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926720/fcdc3259-6a66-b560-7e40-a5216a88b628.png)

FlashMinter は ERC-3156：Flash Loans モジュールのサブモジュールであり、{ERC20}の拡張機能であり、フラッシュミントを可能にします。

フラッシュローンは、貸し手スマートコントラクトが借り手スマートコントラクトに資産を貸し出すトランザクションであり、資産がトランザクションの終了前に返却されることを条件としています。オプションの手数料も追加されます。

ERC-3156：Flash Loans は、貸し手がフラッシュローンリクエストを受け入れるためのインターフェースと、借り手が貸し手の実行内で一時的にトランザクションを制御するためのインターフェースを指定しています。

フラッシュローンの安全な実行手順も指定されています。

このモジュールとコードには、[https://bit.ly/3UcRDC4](https://bit.ly/3UcRDC4)からアクセスできます。

### 使用方法

貸し手は{IERC3156FlashLender}インターフェースを実装する必要があります。

フラッシュローンの受信者は{IERC3156FlashBorrower}インターフェースを実装する必要があります：

- フラッシュローンの受信者の参照実装 => FlashBorrower.sol (ERC-3156：Flash Loans サブモジュール)
- フラッシュマイントの参照実装 => FlashMinter.sol (ERC-3156：Flash Loans サブモジュール)
- フラッシュローンの参照実装 => FlashRender.sol (ERC-3156：Flash Loans サブモジュール)

次のように{flashLoan}関数を実装できます：

```
/**
  * @dev Loan `amount` tokens to `receiver`, and takes it back plus a `flashFee` after the callback.
  * @param receiver The contract receiving the tokens, needs to implement the `onFlashLoan(address user, uint256 amount, uint256 fee, bytes calldata)` interface.
  * @param token The loan currency.
  * @param amount The amount of tokens lent.
  * @param data A data parameter to be passed on to the `receiver` for any custom use.
*/
function flashLoan(
    IERC3156FlashBorrower receiver,
    address token,
    uint256 amount,
    bytes calldata data
) external override returns(bool) {
    require(
        supportedTokens[token],
        "FlashMinter: Unsupported currency"
    );
    uint256 fee = _flashFee(token, amount);
    _mint(address(receiver), amount);
    require(
        receiver.onFlashLoan(msg.sender, token, amount, fee, data) == CALLBACK_SUCCESS,
        "FlashMinter: Callback failed"
    );
    uint256 _allowance = allowance(address(receiver), address(this));
    require(
    _allowance >= (amount + fee),
    "FlashMinter: Repay not approved"
    );
    _approve(address(receiver), address(this), _allowance - (amount + fee));
    _burn(address(receiver), amount + fee);
    return true;
}
```

### 関数

**#WRITE**

- approve
- flashLoan
- transferOwnership
- renounceOwnership
- transferFrom
- increaseAllowance
- transfer
- decreaseAllowance

#READ

- balanceOf
- fee
- CALLBACK_SUCCESS
- totalSupply
- maxFlashLoan
- name
- owner
- allowance
- decimals
- flashFee
- symbol

このモジュールとコードには、[https://bit.ly/3UcRDC4](https://bit.ly/3UcRDC4)からアクセスできます。

---

---

:::note info
【Bunzz とは】
Bunzz はアジア最大級の DApps 開発インフラを運営する、web3×LLM におけるリーディングカンパニーです。「公共財としてのスマートコントラクト」の実現に向けて、各種 web3 インフラやサービスを開発・提供しております。

【Our Projects】

- **[Smart Contract Hub | スマートコントラクトの Github](https://www.bunzz.dev/)**
- **[DeCipher | "Read me" for All of Contracts](https://www.bunzz.dev/decipher)**
- **[Bunzz for Enterprise | Tier1 の技術リソースを日本企業に提供](https://enterprise.bunzz.dev/ja)**
- **[Bunzz Audit | 透明かつ持続的なコントラクト監査の仕組みを実現](hhttps://www.bunzz.dev/audit)**

【Social Links】

- [X(旧 Twitter))](https://twitter.com/BunzzDev)
- [Discord Community](https://t.co/6hHgssJdvW)
- [Youtube](https://www.youtube.com/@bunzzdev)
- [Instagram](https://www.instagram.com/bunzzdev/)

【お問合せ】
web3 開発・コンサルティングのご相談はこちらから 👉[Google Form](https://forms.gle/4tgQjWSw2MMMZW6E6)
:::

:::note info
Bunzz R&D エンジニア荒牧さんの著書[『スマートコントラクトの仕組みと法律』](https://amzn.to/3V03sNH)が好評発売中です 📕
<a href="https://amzn.to/3V03sNH" rel="nofollow" referrerpolicy="no-referrer-when-downgrade">
<img
    src="https://m.media-amazon.com/images/I/81wopoZ1K4L._SY522_.jpg"
    alt="『スマートコントラクトの仕組みと法律』（中央経済グループパブリッシング）"
    width="200px"
    height="auto"
    Style="border: 0px;"
  />
</a>
:::