以太坊ERC20代币合约,含批量转账功能,也含销毁功能

2020-10-14 18:20:07  [ 以太坊 ]      留言:0      阅读:31

来源:https://juejin.im/post/6844903778089451527


以太坊ERC20代币合约,含批量转账功能

官方的ERC20代币合约代码及使用方法的地址:

www.ethereum.org/token

本合约代码不同于官方代码,增加了批量转账功能。源码如下:

pragma solidity ^0.4.16;

interface tokenRecipient { function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) external; }

contract TCTToken {

    // 代币的公共变量:名称、代号、小数点后面的位数、代币发行总量

    string public name;

    string public symbol;

    uint8 public decimals = 6; // 官方建议18位

    uint256 public totalSupply;

    // 代币余额的数据

    mapping (address => uint256) public balanceOf;

    // 代付金额限制

    // 比如map[A][B]=60,意思是用户B可以使用A的钱进行消费,使用上限是60,此条数据由A来设置,一般B可以使中间担保平台

    mapping (address => mapping (address => uint256)) public allowance;

    // 交易成功事件,会通知给客户端

    event Transfer(address indexed from, address indexed to, uint256 value);

    // 将销毁的代币量通知给客户端

    event Burn(address indexed from, uint256 value);

    /**

    * 构造函数

    *

    * 初始化代币发行的参数

    */ function TCTToken (

        uint256 initialSupply,

        string tokenName,

        string tokenSymbol

    ) public {

        totalSupply = initialSupply * 10 ** uint256(decimals);  // 计算发行量

        balanceOf[msg.sender] = totalSupply;                // 将发行的币给创建者

        name = tokenName;                                  // 设置代币名称

        symbol = tokenSymbol;                              // 设置代币符号

    }

    /**

    * 内部转账,只能被本合约调用

    */ function _transfer(address _from, address _to, uint _value) internal {

        // 检测是否空地址

        require(_to != 0x0);

        // 检测余额是否充足

        require(balanceOf[_from] >= _value);

        // 检测溢出

        require(balanceOf[_to] + _value >= balanceOf[_to]);

        // 保存一个临时变量,用于最后检测值是否溢出

        uint previousBalances = balanceOf[_from] + balanceOf[_to];

        // 出账

        balanceOf[_from] -= _value;

        // 入账

        balanceOf[_to] += _value;

        emit Transfer(_from, _to, _value);

        // 检测值是否溢出,或者有数据计算错误

        assert(balanceOf[_from] + balanceOf[_to] == previousBalances);

    }

    /**

    * 代币转账

    *

    * 从自己的账户上给别人转账

    *

    * @param _to 转入账户

    * @param _value 转账金额

    */ function transfer(address _to, uint256 _value) public {

        _transfer(msg.sender, _to, _value);

    }

    /**

    * 从其他账户转账

    *

    * 从其他的账户上给别人转账

    *

    * @param _from 转出账户

    * @param _to 转入账户

    * @param _value 转账金额

    */ function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {

        require(_value <= allowance[_from][msg.sender]);    // 检查允许交易的金额

        allowance[_from][msg.sender] -= _value;

        _transfer(_from, _to, _value); return true;

    }

    /**

    * 设置代付金额限制

    *

    * 允许消费者使用的代币金额

    *

    * @param _spender 允许代付的账号

    * @param _value 允许代付的金额

    */ function approve(address _spender, uint256 _value) public

        returns (bool success) {

        allowance[msg.sender][_spender] = _value; return true;

    }

    /**

    * 设置代付金额限制并通知对方(合约)

    *

    * 设置代付金额限制

    *

    * @param _spender 允许代付的账号

    * @param _value 允许代付的金额

    * @param _extraData 回执数据

    */ function approveAndCall(address _spender, uint256 _value, bytes _extraData)

        public

        returns (bool success) {

        tokenRecipient spender = tokenRecipient(_spender); if (approve(_spender, _value)) {

            spender.receiveApproval(msg.sender, _value, this, _extraData); return true;

        }

    }

    /**

    * 销毁自己的代币

    *

    * 从系统中销毁代币

    *

    * @param _value 销毁量

    */ function burn(uint256 _value) public returns (bool success) {

        require(balanceOf[msg.sender] >= _value);  // 检测余额是否充足

        balanceOf[msg.sender] -= _value;            // 销毁代币

        totalSupply -= _value;                      // 从发行的币中删除

        emit Burn(msg.sender, _value); return true;

    }

    /**

    * 销毁别人的代币

    *

    * 从系统中销毁代币

    *

    * @param _from 销毁的地址

    * @param _value 销毁量

    */ function burnFrom(address _from, uint256 _value) public returns (bool success) {

        require(balanceOf[_from] >= _value);                // 检测余额是否充足

        require(_value <= allowance[_from][msg.sender]);    // 检测代付额度

        balanceOf[_from] -= _value;                        // 销毁代币

        allowance[_from][msg.sender] -= _value;            // 销毁额度

        totalSupply -= _value;                              // 从发行的币中删除

        emit Burn(_from, _value); return true;

    }



    /**

    * 批量转账

    *

    * 从自己的账户上给别人转账

    *

    * @param _to 转入账户

    * @param _value 转账金额

    */ function transferArray(address[] _to, uint256[] _value) public { for(uint256 i = 0; i < _to.length; i++){

            _transfer(msg.sender, _to[i], _value[i]);

        }

    }

}

来源:https://juejin.im/post/6844903778089451527


留言:


    更换校验码     

无觅相关文章插件,快速提升流量
分享到:
友荐云推荐 Process: 0.0347s ( Load:0.0003s Init:0.0008s Exec:0.0198s Template:0.0138s ) | DB :14 queries 1 writes | UseMem:3,026 kb