【完全保存版】thirdwebのステークコントラクトからコントラクト連携を学ぼう!
1 ERC20の作成について
当日、ステークコントラクトの報酬用・ステーキング用にコントラクトを作成します。
ERC20自体はこちらで簡単に作成できます。
動画の最初から3分51秒くらいまでで今回は十分です。
2 コントラクト関連携について
今回は、thirdwebのステークコントラクトをもとに、連携箇所を見ていきます。
「initialize」関数は初期化時に行われる関数です。
1 報酬用コントラクトの設定
ここで「rewardToken」というアドレスに報酬用コントラクトのアドレスを設定しています。
こんなイメージです。
2 ステーキングコントラクトの設定
次に、ステーキングコントラクト(預けるトークンのコントラクト)も見てみましょう。
「__Staking20_init」という箇所で何か設定されていそうです。
中身を見ると、「stakingToken」というアドレスにステーキングコントラクトのアドレスを設定していることがわかりました。
こんな感じです。
3 設定コントラクトの使用
そして、設定したコントラクトを使用するときは、このように、型変換を行っています。
4 一連の流れのまとめ
以下、簡単な流れをまとめます。
①トークンのミント
まず、報酬用コントラクト、ステーキング用コントラクトが共に10,000トークンがミントされているとします。
②approveの実行
次に、報酬用コントラクト、ステーキング用コントラクトの所有者がTokenStakeコントラクトに対して、approveを行います。
③報酬トークンの預け入れ
続いて、depositRewardTokensで報酬用トークンを1,000預け入れます。
④Stakeの実施
次に、Stakeを行い、Stakingトークンを100預けます。
⑤報酬の引き出し
一定時間経過後、報酬トークンを受け取ります。
5 コントラクトを作ってみよう
こちらの記事に沿って、実際に作ってみましょう。
3 オリジナルの連携コントラクトを作ってみよう
では、今度はRemixを使って、オリジナルコントラクトを作ってみましょう。
0 概要
メインとなるのは、こちらのStorageコントラクトです。
値を保存し、その値を取り出すことができます。
例えば、10という値を入れ、その10という値を取り出すことができます。
そして、もう一方が、「StorageCaller」コントラクトです。
このコントラクトから、「Storage」コントラクトを呼ぶことができます。
具体的には「store」関数で、20を新しく保存したり、「retrieve」関数でその20を取り出すことができます。
1 Storageコントラクトについて
まずは、「Storage」コントラクトを見てみましょう。
「Storage」の部分がコントラクト名です。
「function」が関数の印で、「store」と「retrieve」の2つの関数があることがわかります。
2 StorageCallerコントラクトについて
では、次にStorageCallerコントラクトも見てみましょう。
先ほどと同様、「StorageCaller」部分がコントラクト名です。
下の「constructor」がデプロイ時に一度だけ行われる処理です。
ここで、Storageコントラクトを設定しています。
下の部分で、「Storage」コントラクトの関数を使用しています。
5〜8行目で、「Storage」コントラクトの型を設定し、それをもとに型変換を行っています。
3 Remixでコントラクトを作ってみよう(Storage)
では、実際に作ってみましょう。
こちらから、Remixのページに行きます。
まずは、下のように、ワークスペースを作ります。
今回は、このまま「OK」で進みます。
今回使用する、「1_Storage.sol」というコントラクトを選択し、下のように表示されるのを確認します。
下のようにして、コンパイルを行います。
最後に、下のように「Deploy」でデプロイを行います。
なお、今回は「ENVIRONMENT」はそのままの「Remix VM」のままで問題ありません。
すると、このようにできました。
「Deployed Contracts」にあるのが、デプロイされたコントラクトです。
4 Remixでコントラクトを作ってみよう(StorageCaller)
続いて、「StorageCaller」コントラクトも作ってみましょう。
下のようにして、新しいファイルを作成します。
下のように、「StorageCaller.sol」というファイル名にしました。
次に、中身をコピペします。
今回は、こちらのGithubにあります。
下の場所に移動し、右のボタンで、コードをコピーします。
Remixでコードを貼り付けたとき、下のように警告が出ます。
これは、理解せずにコードを貼り付けてコントラクトを作成することに関する警告です。
今回については、問題ないので、「OK」で進みます。
先ほどと同様に、下のように、コンパイルを行います。
次に、デプロイですが、デプロイ時に、「Storage」コントラクトを設定する必要があります。
まずは下のようにして、第3節で作成した「Storage」コントラクトのアドレスをコピーします。
その上で、コントラクトが「StorageCaller」になっているのを確認し、アドレスを下のように貼り付け、「Deploy」を行います。
これで、下のように、デプロイが完了しました。
5 テストをしてみよう(Storage)
では、うまく行っているかを確認してみましょう。
まずは「Storage」コントラクトがうまく動くかを見てみましょう。
「store」で10を保存してみます。
「retrieve」を押すと、10が出てきました。
これで「Storage」コントラクトがうまく動いていることが確認できました。
6 テストをしてみよう(StorageCaller)
次に、「StorageCaller」コントラクトを確認してみましょう。
「callRetrieve」を押すと、10が返ってきました。
これで、「Storage」コントラクトの「retrieve」関数を実行していることがわかりました。
次に、「callStore」に20を入れて実行してみましょう。
「callRetrieve」を実行すると、20が返ってきました。
これにより、「callStore」も「Storage」コントラクトの「store」関数を実行していることがわかりました。
最後に、念の為、「Storage」コントラクトでも確認してみましょう。
「retrieve」関数を実行すると、きちんと20が返ってきたことがわかります。
今回は以上です。