![見出し画像](https://assets.st-note.com/production/uploads/images/112553344/rectangle_large_type_2_6cb593127d92e5e379806fcf2b8edab5.png?width=1200)
【完全保存版】thirdwebによる分割配布コントラクトの作成とソースコードの確認について
0 はじめに
この記事では、「thirdweb」でトークンを分割配布する「split」コントラクトを作成・実行します。
その後、後半で、そのコントラクトのソースコードを読んでみます。
なお、こちらの資料は、2023年のHRハッカソンの勉強会で使う事を予定しています。
1 Splitコントラクトを作成する
まずは、thirdwebでコントラクトを作ってみましょう。
「Go to Dashboard」でダッシュボードに行きます。
![](https://assets.st-note.com/img/1691187665781-uy9L1oMNFz.png?width=1200)
「Browse contracts」を選択
![](https://assets.st-note.com/img/1691187687073-fpnVBzSds5.png?width=1200)
「Split」を選択
![](https://assets.st-note.com/img/1691187712339-fiqVJ59BAd.png?width=1200)
「Deploy now」を選択
![](https://assets.st-note.com/img/1691187733278-14PiNhbXKc.png?width=1200)
「Name」や「Symbol」に任意の値を入れます。
また、「Split Settings」に任意のアドレスと%を合計100%になるように入れます。
できたら、「Deploy Now」
![](https://assets.st-note.com/img/1691187788179-V6IhTcuN9q.png?width=1200)
これで、コントラクトができました。
2 分割配布を実行する
こちらがコントラクトアドレスになります。
まず、準備として、メタマスクなどから、こちらのアドレスに配布用のトークンを送付しておきます。
![](https://assets.st-note.com/img/1691187913229-luiDFFxDJ0.png?width=1200)
このように、約0.1Astrをコントラクトに送付しました。
![](https://assets.st-note.com/img/1691187844800-CrzXBwX7in.png?width=1200)
では、事前に登録してあるアドレスに分割してみましょう。
「Explorer」の「Write」の「distribute」から「Execute」で実行します。
![](https://assets.st-note.com/img/1691188004811-ivQH89cEeS.png?width=1200)
しばらくすると、このようになり、実行が完了したことが示されました。
![](https://assets.st-note.com/img/1691188028209-bxdCWKFjvk.png?width=1200)
実際に分割先のアドレスを見ると、下のように指定した割合に応じて分割していることが確認できました。
![](https://assets.st-note.com/img/1691188054330-ldok9R7Ars.png?width=1200)
![](https://assets.st-note.com/img/1691188080368-CIi6oX05qP.png?width=1200)
3 ソースコードを確認する
1 確認方法について
では、ソースコードを確認してみましょう。
この画面で確認ができます。
「Sources」から「Split.sol」を開きます。
![](https://assets.st-note.com/img/1691188122876-aSi5H1YcZO.png?width=1200)
2 distribute関数について
本日、確認してみたいのが、こちらの「distribute」関数です。
![](https://assets.st-note.com/img/1691188487221-o04E9J5ZWB.png?width=1200)
大まかには、「payeeCount」という関数で、支払い先のアカウント数を取得して
![](https://assets.st-note.com/img/1691188521428-bD5ml6bWTb.png?width=1200)
その個数分、「_release」関数で配布を行なっていそうです。
![](https://assets.st-note.com/img/1691188549750-u9yvojjkn8.png?width=1200)
3 payeeCount関数について
では、まずは、「payeeCount」関数を確認してみましょう。
「PaymentSplitterUpgradable.sol」を確認します。
![](https://assets.st-note.com/img/1691188650527-sqEaVunCt2.png?width=1200)
すると、下のように、関数が確認できました。
どうやら、「_payees」の長さを返しているようです。
![](https://assets.st-note.com/img/1691188672134-VKQ3VvTKgM.png?width=1200)
「_payees」を見ると、アドレスの配列であることが確認できます。
デプロイ時に設定したアドレスのリストであることが推測できます。
![](https://assets.st-note.com/img/1691188696318-aRXu6Hlq7H.png?width=1200)
4 _release関数について
次に、「_release」関数も見てみましょう
まずは、「shares」という関数を使っているようです。
配布先の人がいるかどうかを確認しているようですね。
![](https://assets.st-note.com/img/1691188793395-JHQUjZhUZY.png?width=1200)
5 shares関数について
「PaymentSplitterUpgradable.sol」に下のように関数がありました。
「_shares」のmappingの値を返しているようです。
![](https://assets.st-note.com/img/1691189164006-SJ9SGkrTA5.png?width=1200)
「_shares」はこのようになっていました。
![](https://assets.st-note.com/img/1691189189231-DhjFRJMWOh.png?width=1200)
次に、こちらを見てみましょう。
「address(this).balance」でこのコントラクト自身の残高と「totalReleased」関数の結果を合計しているようです。
今までコントラクトとして受け取った全額を取得しているようです。
![](https://assets.st-note.com/img/1691188811183-6SKJwl8B5j.png?width=1200)
6 totalReleased関数について
「PaymentSplitterUpgradable.sol」に下のように関数がありました。
「_totalReleased」の値を返しているようです。
![](https://assets.st-note.com/img/1691189298403-aYuJBc5WMj.png?width=1200)
「_totalReleased」は下のように定められていました。
![](https://assets.st-note.com/img/1691189315500-leITHG6rhk.png?width=1200)
7 _pendingPayment関数について
次に、「_pendingPayment」関数を確認してみましょう。
これは、今から支払う予定の額を求めているようです。
![](https://assets.st-note.com/img/1691188833948-cCw8ZpERoU.png?width=1200)
「PaymentSplitterUpgradable.sol」に下のように関数がありました。
どうやら、計算を行っているようですね。
![](https://assets.st-note.com/img/1691189476798-NXtLHGwoWV.png?width=1200)
8 released関数について
「_pendingPayment」の引数として用いている、「released」関数もこちらにありました。
「_released」のmappingの値を返しているようです。
![](https://assets.st-note.com/img/1691189499583-LZc3oQBYah.png?width=1200)
「_released」はこちらにありました。
![](https://assets.st-note.com/img/1691189518329-6RUzZDhQmP.png?width=1200)
その下では、支払額が0の時、0を返しているようです。
![](https://assets.st-note.com/img/1691188856596-oicOrhhumu.png?width=1200)
次に、mappingの値を更新しています。
![](https://assets.st-note.com/img/1691188870223-DYAHEoPZQp.png?width=1200)
9 AddressUpgradableライブラリについて
次に、下の部分を見てみましょう。
「AddressUpgradable」ライブラリの「sendValue」関数を使っているようです。
![](https://assets.st-note.com/img/1691188893265-Scam4Es2lM.png?width=1200)
「AddressUpgradable.sol」の中にライブラリがあることが確認できました。
![](https://assets.st-note.com/img/1691189780679-ZsIO7j7o1z.png?width=1200)
「sendValue」関数がこちらにあります。
残高を確認したのち、call関数で送っているようです。
![](https://assets.st-note.com/img/1691189837851-vI0zdsmMHa.png?width=1200)
なお、call関数が関連する、「fallback」関数については、こちらをご参照ください。
10 PaymentReleasedイベントについて
最後に、「PaymentReleased」というイベントを発火しています。
![](https://assets.st-note.com/img/1691188905851-yQpSTgnZg8.png?width=1200)
イベントはこちらにありました。
![](https://assets.st-note.com/img/1691189942167-wSUwuWqq7z.png?width=1200)
今回は、以上です。
thirdwebのコードを確認することで、いい勉強になるのではと思っています。
よかったらやってみてください。
いいなと思ったら応援しよう!
![ユウキ](https://assets.st-note.com/production/uploads/images/52347520/profile_e7d36b385c74618d7fec56da47f68a35.jpeg?width=600&crop=1:1,smart)