pragma solidity^0.4.24;
contract SimpleToken{
mapping(address => uint256) public balanceOf;
constructor(uint ins) {
balanceOf[msg.sender] = ins;
}
function transfer(address _to,uint256 _value)public {
require(balanceOf[msg.sender]>_value);
require(balanceOf[_to]+_value>balanceOf[_to]);
balanceOf[msg.sender] -=_value;
balanceOf[_to] +=_value;
}
}
简单的发布代币合约。
Another 另一个合约 接口
pragma solidity^0.4.20;
contract ERC2Interface{
string public name;
string public symbol;
uint8 public decimals;//消耗数
uint public totalSupply;//总发布代币数量
function transfer(address _to,uint256 _value) returns (bool success);
function transferFrom(address _from,address _to,uint256 _value) returns (bool success);
//授权
function approve(address _spender,uint256 _value) returns (bool success);
function allowance(address _owner,address _spender) view returns (uint256 remaining);
//转账事件,委托事件
event Transfer(address indexed_from,address indexed_to,uint256 _value);
event Appraval(address indexed_owner,address indexed_spender,uint256 _value);
}
pragma solidity^0.4.20;
import './erc20interface.sol';
contract ERC20 is ERC2Interface{
//key:用户,value:代币
mapping (address => uint256) public balanceOf;
//委托
mapping (address =>mapping(address =>uint256)) public allowed;
//构造函数
constructor(string _name) public {
name=_name;//"UpChain";
symbol="UPT";//
decimals=0;//low gas
totalSupply=1000000;//all totalSupply
balanceOf[msg.sender]=totalSupply;
}
// zhuan zhang
function transfer(address _to,uint256 _value) returns (bool success){
require(_to !=address(0));//用户地址不为空
require(balanceOf[msg.sender]>=_value);//转帐的人的代币大于转出的代币
require(balanceOf[_to]+_value>=balanceOf[_to]);//接收者的代币加上获得的代币大于原先的代币
balanceOf[msg.sender] -=_value;//转账这扣钱
balanceOf[_to]+=_value;//接受加钱
emit Transfer(msg.sender,_to,_value);//触发转账事件
return true;
}
//某人转给某人多少钱
function transferFrom(address _from,address _to,uint256 _value) returns (bool success){
require(_to!=address(0));
require(allowed[_from][msg.sender]>=_value);
require(balanceOf[_from]>=_value);
require(balanceOf[_to]+_value>=balanceOf[_to]);
//授权相当于两个人,自己的钱减掉和授权的钱减掉
balanceOf[_from]-=_value;
balanceOf[_to]+=_value;
allowed[_from][msg.sender]-=_value;
emit Transfer(msg.sender,_to,_value);
return true;
}
// shouquan ,weituo ,shui 授权给谁 给 多少钱
function approve(address _spender,uint256 _value) returns (bool success){
// 先执行 allowed[_spender]=_value
//这里理解有点问题 allowed[msg.sender] +=allowed[_spender]
allowed[msg.sender][_spender]=_value;
emit Appraval(msg.sender,_spender,_value);
return true;
}
//授权额度
function allowance(address _owner,address _spender) view returns (uint256 remaining){
return allowed[_owner][_spender];
}
}
实现代币的管理者
pragma solidity^0.4.20;
contract owned {
address public owner ;
//构造函数,将这个地址赋值给管理者
constructor()public {
owner =msg.sender;
}
//修饰器,判断是不是管理者
modifier onlyOwner{
require(msg.sender==owner);
_;
}
//赋值给管理者
function transferOwnerShip(address newOwner)public onlyOwner {
owner =newOwner;
}
/* 不加onlyOwner 程序执行流程是这样的
function transferOwnerShip(address newOwner)public {
require(msg.sender==owner);
owner =newOwner;
}
*/
}
实现代币的增发(挖矿),实现资产冻结 ,实现代币销毁
pragma solidity^0.4.20;
import './owned.sol';
import './erc20.sol';
//继承ERC20,owned
contract AdvanceToken is ERC20 ,owned{
//判断账户是否冻结的状态
mapping(address=>bool) public frozenAccount;
event AddSupply(uint amount);
event FrozenFunds(address target,bool frozen);
event Burn(address target,uint256 value);
//构造函数,给代币名设置
constructor(string _name) ERC20(_name) public {
}
//挖矿 ,实现代币的增发,首先要判断是不是管理者onlyOwner
function mine(address target,uint amount) public onlyOwner{
totalSupply +=amount;//代币总数相加
balanceOf[target]+=amount;//管理者的钱
emit AddSupply(amount);
emit Transfer(0,target,amount);
}
//得管理者进行冻结账户
function freezeAccount(address target,bool freeze) public onlyOwner{
frozenAccount[target] =freeze;//给地址和true或false
emit FrozenFunds(target,freeze);
}
// 实现转账
function transfer(address _to,uint256 _value) public returns (bool success){
success= _transfer(msg.sender,_to,_value);//管理者转给某人
}
//某人转给某人
function transferFrom(address _from,address _to,uint256 _value)public returns (bool success){
require(allowed[_from][msg.sender]>=_value);//判断授权的金额是否大于转出去的钱
success =_transfer(_from,_to,_value);//进行转账
allowed[_from][msg.sender]-=_value;//授权的钱减少
}
//实现转账
function _transfer(address _from,address _to,uint256 _value) internal returns (bool success){
require(_to!=address(0));
require(frozenAccount[_from]);//判断转出者是否被冻结
require(balanceOf[_from]>=_value);//转出这是否有这么多钱
require(balanceOf[_to]+_value>=balanceOf[_to]);//接收者收到的钱是否大于原先的钱
balanceOf[_from]-=_value;//转出者减少
balanceOf[_to]+=_value;//接收者增加
emit Transfer(_from,_to,_value);
return true;
}
//某人销毁代币,
function burn(uint256 _value) public returns(bool success){
require(balanceOf[msg.sender]>=_value);//判断是否有这么多钱
totalSupply-=_value;//总代币减少
balanceOf[msg.sender]-=_value;//自己的钱减少
emit Burn(msg.sender,_value);
return true;
}
//销毁某人的钱
function burnFrom(address _from,uint256 _value) public returns(bool success){
require(balanceOf[msg.sender]>=_value);//判断有这么多钱
require(allowed[_from][msg.sender] >=_value);//授权销毁
totalSupply -=_value;//总的代币减少
// 逻辑貌似有问题
balanceOf[msg.sender]-=_value;//授权者的代币减少
allowed[_from][msg.sender]-=_value;//授权代币减少
emit Burn(msg.sender,_value);
return true;
}
}