在MOAC公鏈上部署ERC-20智慧合約
阿新 • • 發佈:2019-02-19
附件:
本文所用合約程式碼TestToken20.sol。
注意:該程式碼為測試例項使用,非通用智慧合約程式碼。
pragma solidity ^0.4.16;
contract Token{
function balanceOf(address _owner) public constant returns (uint256 balance);
function transfer(address _to, uint256 _value) public returns (bool success);
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);
function approve(address _spender, uint256 _value) public returns (bool success);
function allowance(address _owner, address _spender) public constant returns (uint256 remaining);
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}
contract TokenDemo is Token {
uint256 public totalSupply; //發行總量
string public name; //名稱,例如"My test token"
uint8 public decimals; //返回token使用的小數點後幾位。比如如果設定為3,就是支援0.001表示.
string public symbol; //token簡稱,like MTT
function TokenDemo(uint256 initialAmount, string tokenName, uint8 decimalUnits, string tokenSymbol) public {
totalSupply = initialAmount * 10 ** uint256(decimalUnits); // 設定初始總量
balances[msg.sender] = totalSupply; // 初始token數量全部給予合約的建立者
name = tokenName;
decimals = decimalUnits;
symbol = tokenSymbol;
}
function transfer(address _to, uint256 _value) public returns (bool success) {
//預設totalSupply 不會超過最大值 (2^256 - 1).
//如果隨著時間的推移將會有新的token生成,則可以用下面這句避免溢位的異常
require(balances[msg.sender] >= _value && balances[_to] + _value > balances[_to]);
require(_to != 0x0);
balances[msg.sender] -= _value; //從訊息傳送者賬戶中減去token數量_value
balances[_to] += _value; //往接收賬戶增加token數量_value
Transfer(msg.sender, _to, _value); //觸發轉幣交易事件
return true;
}
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
require(balances[_from] >= _value && allowed[_from][msg.sender] >= _value);
balances[_to] += _value; //接收賬戶增加token數量_value
balances[_from] -= _value; //支出賬戶_from減去token數量_value
allowed[_from][msg.sender] -= _value; //訊息傳送者可以從賬戶_from中轉出的數量減少_value
Transfer(_from, _to, _value); //觸發轉幣交易事件
return true;
}
function balanceOf(address _owner) public constant returns (uint256 balance) {
return balances[_owner];
}
function approve(address _spender, uint256 _value) public returns (bool success)
{
allowed[msg.sender][_spender] = _value;
Approval(msg.sender, _spender, _value);
return true;
}
function allowance(address _owner, address _spender) public constant returns (uint256 remaining) {
return allowed[_owner][_spender]; //允許_spender從_owner中轉出的token數,也就是授權
}
mapping (address => uint256) balances;
mapping (address => mapping (address => uint256)) allowed;
}
程式碼不做過多解釋,參考註釋。
本文所用合約程式碼TestToken20.sol。
注意:該程式碼為測試例項使用,非通用智慧合約程式碼。
pragma solidity ^0.4.16;
contract Token{
function balanceOf(address _owner) public constant returns (uint256 balance);
function transfer(address _to, uint256 _value) public returns (bool success);
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);
function approve(address _spender, uint256 _value) public returns (bool success);
function allowance(address _owner, address _spender) public constant returns (uint256 remaining);
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}
contract TokenDemo is Token {
uint256 public totalSupply; //發行總量
string public name; //名稱,例如"My test token"
uint8 public decimals; //返回token使用的小數點後幾位。比如如果設定為3,就是支援0.001表示.
string public symbol; //token簡稱,like MTT
function TokenDemo(uint256 initialAmount, string tokenName, uint8 decimalUnits, string tokenSymbol) public {
totalSupply = initialAmount * 10 ** uint256(decimalUnits); // 設定初始總量
balances[msg.sender] = totalSupply; // 初始token數量全部給予合約的建立者
name = tokenName;
decimals = decimalUnits;
symbol = tokenSymbol;
}
function transfer(address _to, uint256 _value) public returns (bool success) {
//預設totalSupply 不會超過最大值 (2^256 - 1).
//如果隨著時間的推移將會有新的token生成,則可以用下面這句避免溢位的異常
require(balances[msg.sender] >= _value && balances[_to] + _value > balances[_to]);
require(_to != 0x0);
balances[msg.sender] -= _value; //從訊息傳送者賬戶中減去token數量_value
balances[_to] += _value; //往接收賬戶增加token數量_value
Transfer(msg.sender, _to, _value); //觸發轉幣交易事件
return true;
}
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
require(balances[_from] >= _value && allowed[_from][msg.sender] >= _value);
balances[_to] += _value; //接收賬戶增加token數量_value
balances[_from] -= _value; //支出賬戶_from減去token數量_value
allowed[_from][msg.sender] -= _value; //訊息傳送者可以從賬戶_from中轉出的數量減少_value
Transfer(_from, _to, _value); //觸發轉幣交易事件
return true;
}
function balanceOf(address _owner) public constant returns (uint256 balance) {
return balances[_owner];
}
function approve(address _spender, uint256 _value) public returns (bool success)
{
allowed[msg.sender][_spender] = _value;
Approval(msg.sender, _spender, _value);
return true;
}
function allowance(address _owner, address _spender) public constant returns (uint256 remaining) {
return allowed[_owner][_spender]; //允許_spender從_owner中轉出的token數,也就是授權
}
mapping (address => uint256) balances;
mapping (address => mapping (address => uint256)) allowed;
}
程式碼不做過多解釋,參考註釋。