NEO(ネオ)上でNEP5を使ってICOをしてみよう

Keymakers
Keymakers
May 17, 2018 · 9 min read

前回までで、NEP5の発行を通してスマートコントラクトの仕組みがある程度掴めたと思いますので、今回は実際にICOを行ってみたいと思います。

↓NEP5トークンの発行の仕方はこちらから↓

お好きなディレクトリで以下のフォルダをダウンロードします。

$ git clone https://github.com/neonexchange/neo-ico-template.git$ cd neo-ico-template
$ python3.6 -m venv venv
$ . venv/bin/activate
$ np-prompt -p -v

事前準備としては、ICO参加者を3名として行うので、以下のコマンドでwalletを3つ準備しておきます。

neo> create wallet ICO #wallet名

そして、メインのwalletから他の3つのwalletにNEOとgasを送っておきます。

# send {assetId or name} {address} {amount} (--from-addr={addr})
neo> send NEO AVW5nxuDnMgNY1KyprJACorj1qyQ8Dej5x 1000

ICOの概要

ICO開始:block number :41850

ICO終了:block number :41950

発行トークン:KEYcoin

シンボル:KEY

総発行枚数:7,500,000 # 2,500,000はOWNERへ自動的に分配

ICO可能枚数:5,000,000

交換レート:1 NEO= 500 KEYcoin

一人あたりの最大購入量: 1000NEO(=500,000 KEYcoin)

上記のパラメーターの設定を以下のファイル内で行います。

neo-ico-template/nex/token.py

注意する項目としては、TOKEN_OWNERには、自分の(ICOを行う側の)walletのscript hashを入れることになります。walletのscript hashは以下の操作でわかります。

neo> config sc-events on
Smart contract event logging is now enabled
neo> wallet
[I 180517 06:54:40 UserWallet:538] Script hash b'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9' <class 'bytes'>

ICOコントラクトのbuild/import

さて、準備が整ったところで、ICOを開始していきます。

neo> build ico_template.py test 0710 05 True False name []

neo-ico-templateフォルダ内に、ico_template.avmファイルが生成されたのが確認できます。

neo> import contract ico_template.avm 0710 05 True False

Contract Name以下は、任意に設定できます。

ICO準備

deploy []メソッドを使って、コントラクトの初期化をします。

neo> testinvoke 0xca8da2db6230fa0561733aa96a88b7548ea3fcac deploy []

passwordを入力して、コントラクトのhash値がブロックの中に格納されるとinvoke成功です。

ICOに参加するためには、KYC(know your customer)に則り、ICO参加者のアドレスをOWNERが登録する必要があります。

neo> testinvoke 0xca8da2db6230fa0561733aa96a88b7548ea3fcac crowdsale_register ["AVW5nxuDnMgNY1KyprJACorj1qyQ8Dej5x"]

ICOの登録状況の登録状況は以下のコマンドで、01、すなわち、Trueが返ってきたら登録しているということになります。

neo> testinvoke 0xca8da2db6230fa0561733aa96a88b7548ea3fcac crowdsale_status ["AVW5nxuDnMgNY1KyprJACorj1qyQ8Dej5x"]

同様に他の参加者のwalletもKYCの登録をします。

ICOスタート

はじめに、OWNER walletに初期配布分のKEYcoinが入っているか確認します。

neo> import token 0xca8da2db6230fa0561733aa96a88b7548ea3fcac

KEYcoinを追加して、walletを開きます。

初期配布分の2,500,000枚のKEYcoinがwalletの中に入っています。

次に、ICO参加者のウォレットを開けて、送金を行います。注意点としては、ICOに参加できるのは、登録済walletが各々一回のみであるという点です。

neo> testinvoke 0xca8da2db6230fa0561733aa96a88b7548ea3fcac mintTokens [] --attach-neo=500

wallet ICOからは、500NEO送金してみました。

きちんとwallet ICOにKEYcoinが反映されているか確認します。

neo> testinvoke 0xca8da2db6230fa0561733aa96a88b7548ea3fcac balanceOf ["AVW5nxuDnMgNY1KyprJACorj1qyQ8Dej5x"]b'\x00\x90\x1e\xc4\xbc\x16'
>>> val = b'\x00\x90\x1e\xc4\xbc\x16'>>> int.from_bytes(val, byteorder="little")25000000000000

I NEOあたり500 KEYcoinなので、500*500*100000000と一致するのがわかります。

wallet ICOの中にKEYcoinを追加します。

neo> import token 0xca8da2db6230fa0561733aa96a88b7548ea3fcac

walletを開いて確認して見ると以下のように、きちんと“[KEY]: 250000”が反映されています。

以上が基本的なICOのやり方になります。

次にwallet ICO2を開いて、wallet ICO2からは、以下のように最大購入量の1000NEO送金してみます。

walletの中身を見ると無事に購入できていることがわかります。

最大購入量をオーバーするとどうなるのか検証するために、ICO3からは1200NEOを送金してみます。

先ほどのbalanceOf []メソッドで残高を確認してみます。

KEYcoinの残高は0です。つまり、ICOは失敗していることがわかります。

wallet ICO3のアカウントも確認してみます。

wallet ICO3の方をみて見ると、NEOも空になったままです。すなわち、この参加者は、一人当たりの最大購入量を守らなかったために、送ったNEO全てを失ったことになります。基本的なICOコントラクトは、テンプレートを参照にすれば問題ありませんが、実際にICOを行うとなれば、エラーが出た処理をきちんと含んでいる必要があります。興味がある方は、ソースコードを吟味してみるとなお理解が深まると思います。

ICOトークンの送金

ICOで発行されたKEYcoinは、NEP5に準拠しているので、送金等の機能ももちろん使えます。OWNER walletからwallet ICO3に送金してみます。

# send {assetId or name} {address} {amount} (--from-addr={addr})
neo> send KEY AGpaxQw31dMVf2SmknTVGxnmCJHgJpSx6C 10000 --from-addr=AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y

無事に送金することができました。

今回のICOでは、売れ残ったトークンはバーンされていますが、ロックアップや参加者への均等配布も検討してみると面白いと思います。

参考文献

23

23 claps
Keymakers

Written by

Keymakers

Keymakersは、NEOの日本人開発者向けコミュニティです。