
【完全保存版】Astarでのpsp22コントラクトの作成方法(ERC20に相当)
0 はじめに
今回は、ERC20に相当する、「psp22」のコントラクトを作成します。
「OpenBrush」の使い方にも慣れていきましょう。
1 コントラクトをデプロイする
まずは、こちらでgit cloneを行います。
git clone https://github.com/ytakahashi2020/psp_samples.git

できましたら、コントラクト作成用のファイルが入っているフォルダに移動します。
cd psp_samples/psp22/

後の流れは、下の記事の第1章第2節と同じです。
1点、下の「Upload and Instantiate Contract」の部分が初期値の設定のため、異なります。
下の例のように、ミントする量やNameなどを設定します。
それ以外は同じです。

以上で、コントラクトのデプロイが完了します。
2 コントラクトを触ってみよう
では、できたpsp22(ERC20に相当)のコントラクトを触ってみましょう。
1 totalSupply
まずは、totalSupplyを触ってみます。
デプロイ時にミントした量が表示されます。
なお、Ethereumなどと同様に、最小単位で表されるので、ミントした量を10の18乗した値が表示されます。

2 balanceOf
balanceOfも触ってみます。
どのアカウントがいくら持っているのかがわかります。

3 メタデータ(Name, Symbol, Decimals)
メタデータの「tokenName」も触ってみます。
デプロイ時に設定した名前が表示されています。
他のメタデータ(tokenSymbol, tokenDecimals)についても全く同じです。

4 送付
transferもやってみましょう。
下のように、「test2」に対して、送付を行います。

トランザクション実行後、送付元の「balanceOf」を見ると、減っていることがわかります。

送付先のアカウントを確認すると、きちんと送られていることがわかります。

5 ミント
ミントもしてみましょう。

確認すると、きちんとミントされていることがわかります。

6 バーン
下のように、バーンもしてみます。

「balanceOf」を確認すると、バーンされた分、減っていることがわかります。

7 increaseAllowance
次は、increaseAllowanceです。
いきなり、よくわからない名前が来ましたね。
まあ、まずはやってみましょう。
下のように、「account6」に5000を割り増しました。(increase)

「my account1」の「account6」に対する「allowance」を確認すると、上で設定した「5,000」となっていました。
これは、「account6」が「my account1」の残高のうち、5,000までは送付する権限が与えられていることを意味します。

では、やってみましょう。
「Caller」(呼び出し元)を「account6」に変え、「my account1」の持っている「4,000」を送付しようとすると、このようにうまくいきました。

一方、「allowance」の量を超える量を送付しようとすると、「InsufficientAllowance」でエラーになりました。

なお、「4,000」を送付したとき、きちんと送付ができていることも確認できました。

また、「allowance」で割り当てられていた「5,000」のうち、「4,000」を使ったので、残りは「1,000」になっていました。

8 approve
「approve」も基本的に「increaseAllowance」と同じです。
先ほどは設定した値を増加させたのに対し、こちらは単純に値を設定するだけです。
例えば、下のように、「30,000」を設定します。

すると、先ほどまで残っていた「1,000」と「30,000」の合計ではなく、単純に設定した値がセットされました。

3 OpenBrushを確認しよう
今回は、「OpenBrush」を使って、コントラクトを作成しました。
内容を簡単に見てみましょう。
なお、今回は詳細までは踏み込みません。
1 psp22.rs
こちらがメインのファイルになります。
上で出てきました、「total_supply」「balance_of」「allowance」「transfer」「transfer_from」がこちらに書いてありました。

さらに、「approve」「increase_allowance」「decrease_allowance」も下のようにありました。
このように、メインとなる関数は、「psp22.rs」に書かれています。

また、ストレージに使用するデータはこのように定義されています。

2 mintable.rs
mintable.rsでは「mint」が実装されています。
とはいえ、その中身は、「psp22.rs」の内部関数である、「_mint_to」関数が使用されています。

3 burnable.rs
「burnable.rs」も「mintable.rs」と同様です。
「burn」関数が実装されていますが、その実態は、「psp22.rs」の内部関数である、「_burn_from」関数が使われています。

4 metadata.rs
「metadata.rs」は上の二つとは少し違います。
下のように、構造体でデータを持ちます。
これにより、「psp22」に対して、新たな変数である「Name」や「symbol」などを追加できます。

そして、デフォルトの関数は、上のデータを取得する関数が並びます。
具体的には、「token_name」「token_symbol」「token_decimals」が実装されています。

4 作成したコントラクトを確認しよう
では、作成したコントラクトも確認してみましょう。
1 use
まずは、下のように、「OpenBrush」を使用する旨を記載しています。
具体的には、「mintable」「burnable」「metadata」を使用する旨を記載します。

なお、上で指定している、「openbrush」は「Cargo.toml」ファイルで指定しています。

2 structデータの設定
次に、データを下のように設定します。
psp22とmetadataのそれぞれのデータを設定しています。

3 Structへの実装
下のように、上で設定したStructに対し、ロジック部分を実装しています。
「PSP22」「PSP22Mitable」「PSP22Burnable」「PSP22Metadata」を設定しています。

4 追加関数の直接実装
最後に、コントラクトに対し、直接、実装を行っています。
「constructor」(デプロイ時に一度だけ行われる処理)として、「new」関数を作っています。
まずは、引数として渡したnameやsymbolなどを設定しています。

次に、下のように、引数として渡した量を呼び出し者に向けてミントを行っています。

そして、最後に作成したインスタンスを戻しています。

以上が大まかな流れになります。
ぜひやってみてください。
いいなと思ったら応援しよう!
