实现EIP20Interface代币接口
pragma solidity ^0.4.24;
contract EIP20Interface {
//获取token发布的总量,比如:EOS 10亿
uint256 public totalSupply;
// //获取token名字,比如:“kongyixueyuan”
// function name() view returns (string name);
// //获取token简称,比如:"KYXYB"
// function symbol() view returns (string symbol);
// //获取小数位,比如以太坊的decimals为18:10^18
// function decimals() view returns (uint8 decimals);
// //获取token发布的总量,比如:EOS 10亿
// function totalSupply() view returns (uint256 totalSupply);
//获取_owner地址的余额
function balanceOf(address _owner) view returns (uint256 balance);
//转帐:调用方向_to转_value个token
function transfer(address _to, uint256 _value) returns (bool success);
//转帐:从_from向_to转_value个token
function transferFrom(address _from, address _to, uint256 _value) returns (bool success);
//允许_spender从自己(调用方)帐户转走_value个token
function approve(address _spender, uint256 _value) returns (bool success);
//自己(_owner)查询_spender地址一共可以转走自己多少个token
function allowance(address _owner, address _spender) view returns (uint256 remaining);
//转帐的时候必须要调用的事件,如transfer,transferFrom方法
event Transfer(address indexed _from, address indexed _to, uint256 _value);
//成功执行approve后调用的事件
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}
contract MyToken is EIP20Interface{
//获取token名字,比如:“kongyixueyuan”
string public name;
//获取token简称,比如:"KYXYB"
string public symbol;
//获取小数位,比如以太坊的decimals为18:10^18
uint8 public decimals;
//获取token发布的总量,比如:EOS 10亿
uint256 public totalSupply;
//存储币拥有者拥有的币的余额
mapping(address=>uint256) balances;
//任何地址
/**
允许0xca35b7d915458ef540ade6068dfe2f44e8fa733c
转走gate.io =>100
转走huobi =>100
允许地址 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c
转走gate.io =>10
转走huobi =>200
*/
//外层address代表0x14723a09acff6d2a60dcdf7aa4aff308fddc160c
//value的map代表 转走gate.io =>10
mapping(address=> mapping(address=>uint256)) allowances;
//传4个状态变量,要加下划线
function MyToken(
string _name,
string _symbol,
uint8 _decimals,
uint256 _totalSupply) {
//获取参数的值
name=_name;
symbol=_symbol;
decimals=_decimals;
totalSupply=_totalSupply;
//将币的总量给发起人
balances[msg.sender]=_totalSupply;
}
//获取_owner地址的余额
function balanceOf(address _owner) view returns (uint256 balance){
//返回_owner所对应的余额
return balances[_owner];
}
//转帐:调用方向_to转_value个token
function transfer(address _to, uint256 _value) returns (bool success){
//判断要转的
require(balances[_to]+_value>balances[_to] && balances[msg.sender] > _value && _value > 0);
//只是改了值,并没有真正转帐
balances[_to]+=_value;
balances[msg.sender]-=_value;
//转帐后必须调用event Transfer方法才能实现真正转帐
Transfer(msg.sender,_to,_value);
//必须返回true
return true;
}
//转帐:从_from向_to转_value个token
function transferFrom(address _from, address _to, uint256 _value) returns (bool success){
return true;
}
//允许_spender从自己(调用方)帐户转走_value个token
function approve(address _spender, uint256 _value) returns (bool success){
//条件判断,防止异常
require(balances[msg.sender] > _value && _value > 0);
//存储到allowances的自己的msg.sender,允许_spender转走自己帐户_value个token
//自己可以多次调用这个方法,允许别人转走自己指定的金额
//如果已经设置过了别人转走的金额,比如已经第一次设置了10个,但是现在又要求可以转走100个
//那么实际上它能转走100个,就是再次调用这个方法,就会重置当前的值。并不是累加
allowances[msg.sender][_spender] = _value;
//调用这个方法
Approval(msg.sender,_spender,_value);
return true;
}
//自己(_owner)查询_spender地址一共可以转走自己多少个token
function allowance(address _owner, address _spender) view returns (uint256 remaining){
//后面key可以从前面key转走多少
return allowances[_owner][_spender];
}
}