[ERC7621] 資産に裏付けされたオンチェーンのトークン化ファンドを作成する仕組みを理解しよう！

# はじめに

初めまして。
**CryptoGames**というブロックチェーンゲーム企業でエンジニアをしている **cardene（かるでね）** です！
スマートコントラクトを書いたり、フロントエンド・バックエンド・インフラと幅広く触れています。

https://cryptogames.co.jp/

代表的なゲームは**クリプトスペルズ**というブロックチェーンゲームです。

https://cryptospells.jp/

今回は、「**Basket Token Standard（BTS）**」と呼ばれるNFTを使用して、調整可能な比率と準備金を持つ担保付きトークン化ファンドとLPトークンの発行と`burn`の仕組みを提案している**ERC7621**についてまとめていきます！

:::note info
以下にまとめられているものを翻訳・要約・補足しながらまとめていきます。
:::

https://eips.ethereum.org/EIPS/eip-7621

他にも様々なEIPについてまとめています。

https://cardene.notion.site/ERC-EIP-2a03fa3ea33d43baa9ed82288f98d4a9?pvs=4

# 概要

この規格では、Basket Token Standard（BTS）というNFTを使用して、複数の**ERC20**トークンを含んだファンドの実装を提案しています。

:::note info
ファンドとは、多数の投資家から集めた資金を1つの大きな資金（プール）として管理・運用し、その運用益を投資家に分配する仕組みやその資金そのものを指します。
:::

BTSトークンはNFTとして発行され、ファンドの所有権を表します。
また、ファンドへの出資割合を表すLP（流動性提供）トークンも発行され、寄付や引き出しが行われる度に`mint`・`burn`されます。

BTSトークン所有者は、いつでもファンド内の各**ERC20**トークンの追加や削除を行うことで、各**ERC20**トークンから構成されるファンドの割合を変更できます。
BTSトークンは**ERC721**標準に基づいているため、オンチェーンで管理・送付ができます。

:::note info
**ERC20**トークンについては以下の記事を参考にしてください。
:::

https://chaldene.net/erc20

:::note info
**ERC721**トークンについては以下の記事を参考にしてください。
:::

https://chaldene.net/erc721


# 動機

現在、ブロックチェーン上で資産に裏付けられたトークン化投資ファンドの作成・管理するための標準化されたインフラストラクチャが存在しません。
そのため、標準化されたインフラストラクチャを提供することで、従来のファンド管理をブロックチェーン上で実装することが簡単になります。

これまでに提案されたEIPでは、他のアドレスから寄付が行われたときにLPトークンを発行する機能がありませんでした。
この規格では、ファンドの管理を効率的に行うためのリバランス機能と他アドレスからの寄付が行われたときにLPトークンを発行し、引き出しが行われたときはLPトークンを`burn`する機能を実装しています。

:::note info
雑談ですが、Google翻訳で**BTS**の翻訳をかけると「**防弾少年団**」となっていました。
この規格で提案されているBTSトークンとは全く関係がないのでご注意を。
:::

# 仕様

## BTS

BTSは、資産に裏付けされたオンチェーンのトークン化ファンドを作成するコントラクトです。
以下の機能を使用して、資産と流動性を管理できます。

- 初期化
    - 新しいファンドを作成して初期化設定を実行する。
- 寄付
    - 他のアドレスがファンドに資産を追加する。
- 引き出し
    - ユーザーがファンドから資産を引き出す。
- リバランス
    - ファンド内の資産の割合を調整する。
- トークン分配
    - 寄付や引き出しによってLPトークンを`mint`・`burn`する。

## 目的

BTSは、オンチェーン流草生を使用して、完全に資産に裏付けられたオンチェーントークン化ファンドを誰でも構築することを目的としています。

## 主な機能

### `initialize`
新しいBTSを作成し、基本情報と初期トークン構成を設定する。

- `name`
    - ファンドの名前。
- `symbol`
    - ファンドのシンボル。
- `creator`
    - ファンドの作成者。
- `tokens`
    - ファンドに含まれるトークンのアドレスの配列。
- `weights`
    - 各トークンの初期比率の配列。
- `token URI`
    - トークンのメタデータURI。
- `auto-rebalance`
    - 自動リバランスの設定（オプション）。

### `contribute`
- **概要**: ユーザーがETHをバスケットに追加する機能。
- **機能**:
  - ユーザーはETHを送信し、あらかじめ定義された比率に基づいて含まれるトークンを購入します。
- **役割**: ファンドに対する新しい資金の追加を促進します。

### `withdraw(uint256 _liquidity)`
LPトークン保有者が、そのLPトークンの量に沿って**ERC20**トークンを引き出す機能。

- `_liquidity`
    - LPトークンの量。

### `withdrawETH(uint256 _liquidity)`
LPトークン保有者が、そのLPトークンの量に沿ってETHを引き出す機能。
- `_liquidity`
    - LPトークンの量。

### `rebalance(address[] memory _newTokens, uint256[] memory _newWeights)`
ファンドオーナーがバスケット内のトークンの種類を量を手動調整する機能。
- `_newTokens`
    - 新しいトークンのアドレスの配列。
- `_newWeights`
    - 新しいトークンの比率の配列。

### `getTokenDetails`
指定されたインデックスのトークンの詳細情報を返す機能。
- `index`
    - トークンのインデックス。
- **戻り値**
  - トークンのアドレスとその比率。

### `totalTokens`
バスケット内のトークンの総数を返す機能。
- **戻り値**
  - トークンの総数。

## BTSトークンの分配
BTSトークンの分配は、`mint`実行時に行われます。
ユーザーがETHをコントラクトに送金すると、あらかじめ定められた比率に基づいて指定された**ERC20**トークンに交換されます。
これが完了すると、BTSコントラクトの`initialize`関数を使用して、送金者に対してBTSトークン（NFT）が`mint`されます。
このBTSトークンは、ファンドの所有権を表していてBTSの管理機能を提供します。
また、同時にBTS LPトークンもユーザーに`mint`されます。

## BTS LPトークンの分配
BTS LPトークンの分配は、`mint`関数と`contribute`関数の実行時に行われます。
ユーザーがETHを送金し、そのETHが指定された**ERC20**トークンに交換されると、コントラクトはユーザーに対してBTS LPトークンを`mint`します。
このBTS LPトークンは、ユーザーのBTSファンドに対するシェアを表します。
BTS LPトークンは**BTSPair**コントラクトで`mint`され、ユーザーが提供した流動性が反映され、`ContributedToBTS`イベントが発行されます。

### BTS LPトークンの`burn`
BTS LPトークンの`burn`は、`withdraw`関数の実行時に行われます。
ユーザーが引き出したいBTS LPトークンの量を指定すると、コントラクトはその量のBTS LPトークンをユーザーから**BTSPair**コントラクト（**btsPair**）に送られます。
その後、**BTSPair**コントラクトの`burn`関数が呼び出され、ユーザーのBTS LPトークン残高が減少します。
そして、引き出されたトークンの配列がユーザーに返され、`WithdrawnFromBTS`イベントが発行されます。

## イベント

### `ContributedToBTS(address indexed bts, uint256 amount)`
誰かがバスケットに ETH を追加したときに発行されたイベント。

### `WithdrawnFromBTS(address indexed bts, uint256[] amounts)`
BTS LP保有者がバスケットからトークンを引き出すときに発行されたイベント。

### `WithdrawnETHFromBTS(address indexed bts, uint256 amount)`
BTS LP保有者がバスケットからETHを引き出すときに発行されたイベント。

### `RebalanceBTS(address indexed bts, uint256[] oldWeights, uint256[] newWeights)`
所有者が手動でバスケットのバランスを再調整するときに発行されたイベント。

## BTSPair

BTS内の流送性を表す**ERC20**トークンのコントラクトです。
ファンド内の資産の管理と流動性提供者のシェアを正確に反映するために使用されます。

### `initialize`
新しいBTSPairを初期化する機能。
ファンドの名前と初期トークンの設定を実行します。

#### `rebalance`
ファンドオーナーによって、ペア内のトークンの種類と比率を手動で調整する機能。

#### `updateTokens`
新しいトークンを追加したり、既存のトークンを削除することで、ペア内のトークンの種類を変更する機能。

#### `mint`
新しいBTS LPトークンを作成してトークンの準備金を調整する機能。

#### burn
BTS LPトークンを`burn`して流動性提供者がファンドから資産を引き出す機能。

# 引用

Dominic Ryder <dom@alvaraprotocol.io>, Callum Mitchell-Clark (@AlvaraProtocol) <callum@alvaraprotocol.io>, Joey van Etten <joe@alvaraprotocol.io>, Michael Ryder <mike@alvaraprotocol.io>, "ERC-7621: Basket Token [DRAFT]," Ethereum Improvement Proposals, no. 7621, February 2024. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7621.

# 最後に

今回は「調整可能な比率と準備金を持つ担保付きトークン化ファンドとLPトークンの発行と`burn`の仕組みを提案している**ERC7621**」についてまとめてきました！
いかがだったでしょうか？

質問などがある方は以下のTwitterのDMなどからお気軽に質問してください！

[Twitter @cardene777](https://twitter.com/cardene777)

他の媒体でも情報発信しているのでぜひ他も見ていってください！

https://chaldene.net/

https://zenn.dev/heku

https://cardene.substack.com/

https://mirror.xyz/0xcE77b9fCd390847627c84359fC1Bc02fC78f0e58

https://cardene.notion.site/ERC-EIP-2a03fa3ea33d43baa9ed82288f98d4a9?pvs=4