Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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;

kunroku
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away