LoginSignup
0
0

More than 3 years have passed since last update.

IOSTのハンズオンでのトークンコード

Last updated at Posted at 2019-11-04

IOSTで HANDS ON TOKEN という名前のトークンを作成します.
発行はコントラクトからのみ可能で,コントラクトは発行の際にコントラクトのオーナー権限をチェックします.
トークンは自由に送信できます.
注意すべき点は,このコントラクトにもトークンが送られてくる可能性があることです.このコントラクト独自のtransferメソッドを用意することで,このコントラクト宛に送られてきたトークンの送信を可能にします.transferメソッドも,外部から自由に呼び出しできないように,コントラクトオーナー権限をチェックします.


// このパラメータは書き換えてください
const tokenSymbol = 'hot';
const fullName = 'HANDSON_TOKEN';
const decimal = 6;
const totalSupply = 96000000;
class HandsOnToken {
    init() {
        // トークンの作成
        blockchain.callWithAuth('token.iost', 'create', [
            tokenSymbol,
            blockchain.contractName(),
            totalSupply,
            {
                fullName,
                decimal,
                canTransfer: true,
                onlyIssuerCanTransfer: false,
            }
        ]);
        // コントラクトのオーナーの設定
        storage.put('owner', tx.publisher);
    }
    can_update(data) {
        // オーナーの権限をチェック
        this._checkOwner();
        return true;
    }
    // トークンの発行
    issue(to, amount) {
        this._checkOwner();
        // 桁数を合わせる
        amount = this._amount(amount);
        // トークンの発行
        return this._callWithAuth('token.iost', 'issue', [tokenSymbol, to, amount]);
    }
    // このコントラクトからのトークン送信
    transfer(tokenSymbol, to, amount, memo) {
        this._checkOwner();
        amount = this._amount(amount);
        return this._callWithAuth('token.iost', 'transfer', [tokenSymbol, blockchain.contractName(), to, amount, memo]);
    }
    // トークンをいくらもっているか
    balanceOf(id) {
        return this._call('token.iost', 'balanceOf', [tokenSymbol, id]);
    }
    // 今までいくらトークンを発行したか
    supply() {
        return this._call('token.iost', 'supply', [tokenSymbol]);
    }
    // トークンの総発行枚数
    totalSupply() {
        return this._call('token.iost', 'totalSupply', [tokenSymbol]);
    }
    _amount(amount) {
        return new BigNumber(new BigNumber(amount).toFixed(decimal));
    }
    // コントラクトの権限を追加せずに呼び出し
    _call(contract, api, args) {
        const ret = blockchain.call(contract, api, args);
        if (ret && Array.isArray(ret) && ret.length >= 1) {
            return ret[0];
        }
        return null;
    }
    // コントラクトの権限を追加して呼び出し
    _callWithAuth(contract, api, args) {
        const ret = blockchain.callWithAuth(contract, api, args);
        if (ret && Array.isArray(ret) && ret.length >= 1) {
            return ret[0];
        }
        return null;
    }
    // オーナー権限の確認
    _checkOwner() {
        let owner = storage.get('owner');
        this._requireAuth(owner);
    }
    // 権限の確認
    _requireAuth(id) {
        if (!blockchain.requireAuth(id, 'active')) {
            throw new Error('permission denied');
        }
    }
}
module.exports = HandsOnToken;

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0