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;