MintとBurn
Mintは、TokenやCoinを鋳造する、つまり増やす行為。
Burnは、TokenやCoinを燃やす、つまり減らす行為。
ICOや何かで独自のTokenを作った場合に、それを増やしたり減らしたりするときにつかわれる。zeppelin-solidityのクラウドセールではEtherを送ってきた場合に、都度MintしてEtherの送金主に送られるなどの使い方がされている。
またICOが終了した場合に不要なTokenを減らしてTokenの価値を高めたりするのにBurnは使われる
zeppelin-solidityのライブラリを使えば比較的容易にTokenに組み込むことができてしまうが、なかなか使い方が解り難かったりしたので、自分のやり方を書いてみます
Tokenを作成
以前に作ったトークンを弄ってMintとBurnが出来るようにする
pragma solidity ^0.4.18;
import "zeppelin-solidity/contracts/token/ERC20/MintableToken.sol";
import "zeppelin-solidity/contracts/token/ERC20/BurnableToken.sol";
contract minaToken is MintableToken , BurnableToken {
string public name = "minaToken";
string public symbol = "MNTK";
uint public decimals = 3;
uint public INITIAL_SUPPLY = 10000 * (10 ** decimals);
address public owner;
function minaToken() public {
totalSupply_ = INITIAL_SUPPLY;
balances[msg.sender] = INITIAL_SUPPLY;
owner = msg.sender;
}
}
importで、MintableToken.sol
とBurnableToken.sol
を挿入する
import "zeppelin-solidity/contracts/token/ERC20/MintableToken.sol";
import "zeppelin-solidity/contracts/token/ERC20/BurnableToken.sol";
上で入れたライブラリを継承するようにする
contract minaToken is MintableToken , BurnableToken {
基本的にこれだけ
あとは自分の環境ではすでにデプロイしたものだったので、-r
のオプションで再デプロイ
truffle(develop)> migrate -r
コンソールからMintとBurn
truffleコマンドによる接続してからMintやBurnを実施
まずTokenのインスタンスを作成する
truffle(develop)> inst = minaToken.at(minaToken.address)
作ったインスタンスを使いアカウントの残高を確認。
私の場合、INITIAL_SUPPLY = 10000
と(10 * decimals 3)
の為に10000000
が初期のアカウントに発行されている
truffle(develop)> inst.balanceOf(web3.eth.accounts[0])
BigNumber { s: 1, e: 7, c: [ 10000000 ] }
Mintを実施。
発行先のアドレスと発行数を指定する
truffle(develop)> inst.mint(web3.eth.accounts[0],1000)
{ tx: '0x2f43ad8caf307be8ec1535102ce2b4e3711193b40e12685910d8587ad5b0238b',
receipt:
{ transactionHash: '0x2f43ad8caf307be8ec1535102ce2b4e3711193b40e12685910d8587ad5b0238b',
transactionIndex: 0,
blockHash: '0x835ab293692d068dc14e304b17994f3203135f3e51856cb952f92423b1fc24c9',
blockNumber: 5,
gasUsed: 38065,
cumulativeGasUsed: 38065,
contractAddress: null,
logs: [ [Object], [Object] ],
status: '0x01',
logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000010000008000000000000000000010000000000000000000000000000020000000000000000000800000000000000400000000010000000000000000000000000000000000000000000000000000000000000010000000002000080000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000004000000000000020000000000000000000000000000000000000000000000000000010000000000000' },
logs:
[ { logIndex: 0,
transactionIndex: 0,
transactionHash: '0x2f43ad8caf307be8ec1535102ce2b4e3711193b40e12685910d8587ad5b0238b',
blockHash: '0x835ab293692d068dc14e304b17994f3203135f3e51856cb952f92423b1fc24c9',
blockNumber: 5,
address: '0x345ca3e014aaf5dca488057592ee47305d9b3e10',
type: 'mined',
event: 'Mint',
args: [Object] },
{ logIndex: 1,
transactionIndex: 0,
transactionHash: '0x2f43ad8caf307be8ec1535102ce2b4e3711193b40e12685910d8587ad5b0238b',
blockHash: '0x835ab293692d068dc14e304b17994f3203135f3e51856cb952f92423b1fc24c9',
blockNumber: 5,
address: '0x345ca3e014aaf5dca488057592ee47305d9b3e10',
type: 'mined',
event: 'Transfer',
args: [Object] } ] }
発行したあと残高を確認すると、指定した1000増えている事が確認できる
truffle(develop)> inst.balanceOf(web3.eth.accounts[0])
BigNumber { s: 1, e: 7, c: [ 10001000 ] }
続いて発行した分をBurnしてみru
Burnの場合は、アドレスは指定できず接続したCoinbaseのアカウントからBurnされるようだ
truffle(develop)> inst.burn("1000")
{ tx: '0x87f658f6331c74343f403210776e6bb97f90276ab98339ad76f0ef8af6f92678',
receipt:
{ transactionHash: '0x87f658f6331c74343f403210776e6bb97f90276ab98339ad76f0ef8af6f92678',
transactionIndex: 0,
blockHash: '0x2322be05ad44516dda63a5236acfa640d4fa112b4e01223c90a1270f061c55c5',
blockNumber: 6,
gasUsed: 34459,
cumulativeGasUsed: 34459,
contractAddress: null,
logs: [ [Object] ],
status: '0x01',
logsBloom: '0x00000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000010000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000010000200002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000010000000000000' },
logs:
[ { logIndex: 0,
transactionIndex: 0,
transactionHash: '0x87f658f6331c74343f403210776e6bb97f90276ab98339ad76f0ef8af6f92678',
blockHash: '0x2322be05ad44516dda63a5236acfa640d4fa112b4e01223c90a1270f061c55c5',
blockNumber: 6,
address: '0x345ca3e014aaf5dca488057592ee47305d9b3e10',
type: 'mined',
event: 'Burn',
args: [Object] } ] }
成功したら残高を確認する
truffle(develop)> inst.balanceOf(web3.eth.accounts[0])
BigNumber { s: 1, e: 7, c: [ 10000000 ] }
解ってしまえば簡単な事ではあったけど、このやり方はあまり推奨されてないのかもしれない