Sui DevnetでERC20トークンを作成する
コード自体は下記にあるものと全く同じものを使っています。
module token::mycoin {
use std::option;
use sui::coin;
use sui::transfer;
use sui::tx_context::{Self, TxContext};
struct MYCOIN has drop {}
fun init(witness: MYCOIN, ctx: &mut TxContext) {
let (treasury, metadata) = coin::create_currency(witness, 6, b"MYCOIN", b"", b"", option::none(), ctx);
transfer::freeze_object(metadata);
transfer::transfer(treasury, tx_context::sender(ctx))
}
}
その後、
sui move build
sui client publish --gas-budget 1000
とすることで、デプロイすることが出来ます。(sui cliのインストールが必要です)
デプロイしたときのログに、Transaction Hashという項目があるので、そこの値をコピーしてsui explorerで検索してみます。
Createdの項目に3つオブジェクトIDが書かれているので、それらを見ていきます。
一つはタイプがTreasuryCapとなっているもの、もう一つはCoinMetadataとなっているもの、後はパッケージいうなればスマートコントラクト自体です。
CoinMetadataは今さっき発行したERC20トークンの情報を持っており、例えばdecimalsや名前、説明などを持っています(浮動小数点を持つ値をブロックチェーン上では持たないので、小数点以下をdecimalsで表現してます)
TreasuryCapはtotalSupplyをもっていたり、トークンのミントやバーンを行う際に必要になるオブジェクトです。
最初のコードを見てもらえばわかりますが、transfer::transfer()で作っているので、ownerを持ちます。ownerがあるということはtxの署名者と一致しなければ変更できないため、mintやburnはデプロイしたアカウント同一のアカウントで行う必要があります。
実際にミントしてみる
ミントする場合は、先程あげたコントラクトからではなく、sui::coinのfunctionから行います。(デプロイしたスマコンに埋め込むのもありです)
上記がそうで、mint_and_transferというのを使ってmintします。
sui client call --gas-budget 1000 --package 0x0000000000000000000000000000000000000002 --module "coin" --function "mint_and_transfer" --args 0x0485325552bcd56019ab3395a8dd025894d89bf9 1000000 0x0befb65cd4e5389246fe56a96b9827563900add1 --type-args 0x3f1fe5007bf1b8064c9d2e1caac96b2e3fbea7e2::mycoin::MYCOIN
こんな感じです。これは"0x0000000000000000000000000000000000000002"パッケージの"coin"というモジュールの"mint_and_transfer"というfunctionを実行する。引数に--argsで設定したものを、ジェネリクス型に--type-argsで設定したものを渡す
という意味合いです。
第一引数にTreasuryCapのオブジェクト、第二引数にamount、第三引数に渡したいアカウントを指定します。
--type-argsに設定しているのは、作成したERC20トークンのタイプです。
さきほどのはsui-walletで作成したアカウントに送っており、確認してみるとたしかにMYCOINが増えていることがわかりますね。無事mintできています。
先程使用したTreasuryCapオブジェクトをsui explorerで確認してみます。
total_supplyのfieldsのvalueが先程mintした値分増えていることがわかります。
Discussion