Solidity 发布代币合约

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;
    }
    
}
发布了36 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_40098405/article/details/102922253