以太坊官方原文ERC20代币标准源码:Ethereum Developer Resources | ethereum.org

(注:本文是在原文的基础上,根据个人的理解,修改部分内容并添加了一些注释)

pragma solidity ^0.4.16;interface tokenRecipient { function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) external; }/*** owned是合约的管理者*/
contract owned {address public owner;/*** 初台化构造函数*/function owned () public {owner = msg.sender;}/*** 判断当前合约调用者是否是合约的所有者*/modifier onlyOwner {require (msg.sender == owner);_;}/*** 合约的所有者指派一个新的管理员* @param  newOwner address 新的管理员帐户地址*/function transferOwnership(address newOwner) onlyOwner public {if (newOwner != address(0)) {owner = newOwner;}}
}/*** 基础代币合约*/
contract TokenERC20 {string public name; //发行的代币名称string public symbol; //发行的代币符号uint8 public decimals = 18;  //代币单位,展示的小数点后面多少个0。uint256 public totalSupply; //发行的代币总量/*记录所有余额的映射*/mapping (address => uint256) public balanceOf;mapping (address => mapping (address => uint256)) public allowance;/* 在区块链上创建一个事件,用以通知客户端*///转帐通知事件event Transfer(address indexed from, address indexed to, uint256 value);  event Burn(address indexed from, uint256 value);  //减去用户余额事件/* 初始化合约,并且把初始的所有代币都给这合约的创建者* @param initialSupply 代币的总数* @param tokenName 代币名称* @param tokenSymbol 代币符号*/function TokenERC20(uint256 initialSupply, string tokenName, string tokenSymbol) public {//初始化总量totalSupply = initialSupply * 10 ** uint256(decimals);   //给指定帐户初始化代币总量,初始化用于奖励合约创建者balanceOf[msg.sender] = totalSupply;name = tokenName;symbol = tokenSymbol;}/*** 私有方法从一个帐户发送给另一个帐户代币* @param  _from address 发送代币的地址* @param  _to address 接受代币的地址* @param  _value uint256 接受代币的数量*/function _transfer(address _from, address _to, uint256 _value) internal {//避免转帐的地址是0x0require(_to != 0x0);//检查发送者是否拥有足够余额require(balanceOf[_from] >= _value);//检查是否溢出require(balanceOf[_to] + _value > balanceOf[_to]);//保存数据用于后面的判断uint previousBalances = balanceOf[_from] + balanceOf[_to];//从发送者减掉发送额balanceOf[_from] -= _value;//给接收者加上相同的量balanceOf[_to] += _value;//通知任何监听该交易的客户端Transfer(_from, _to, _value);//判断买、卖双方的数据是否和转换前一致assert(balanceOf[_from] + balanceOf[_to] == previousBalances);}/*** 从主帐户合约调用者发送给别人代币* @param  _to address 接受代币的地址* @param  _value uint256 接受代币的数量*/function transfer(address _to, uint256 _value) public {_transfer(msg.sender, _to, _value);}/*** 从某个指定的帐户中,向另一个帐户发送代币* 调用过程,会检查设置的允许最大交易额* @param  _from address 发送者地址* @param  _to address 接受者地址* @param  _value uint256 要转移的代币数量* @return success        是否交易成功*/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;}/*** 设置帐户允许支付的最大金额* 一般在智能合约的时候,避免支付过多,造成风险,加入时间参数,可以在 tokenRecipient 中做其他操作* @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;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;Burn(_from, _value);return true;}
}/*** 代币增发、* 代币冻结、* 代币自动销售和购买、* 高级代币功能*/
contract MyAdvancedToken is owned, TokenERC20 {//卖出的汇率,一个代币,可以卖出多少个以太币,单位是weiuint256 public sellPrice;//买入的汇率,1个以太币,可以买几个代币uint256 public buyPrice;//是否冻结帐户的列表mapping (address => bool) public frozenAccount;//定义一个事件,当有资产被冻结的时候,通知正在监听事件的客户端event FrozenFunds(address target, bool frozen);/*初始化合约,并且把初始的所有的令牌都给这合约的创建者* @param initialSupply 所有币的总数* @param tokenName 代币名称* @param tokenSymbol 代币符号*/function MyAdvancedToken(uint256 initialSupply,string tokenName,string tokenSymbol) TokenERC20(initialSupply, tokenName, tokenSymbol) public {}/*** 私有方法,从指定帐户转出余额* @param  _from address 发送代币的地址* @param  _to address 接受代币的地址* @param  _value uint256 接受代币的数量*/function _transfer(address _from, address _to, uint _value) internal {//避免转帐的地址是0x0require (_to != 0x0);//检查发送者是否拥有足够余额require (balanceOf[_from] > _value);//检查是否溢出require (balanceOf[_to] + _value > balanceOf[_to]);//检查 冻结帐户require(!frozenAccount[_from]);require(!frozenAccount[_to]);//从发送者减掉发送额balanceOf[_from] -= _value;//给接收者加上相同的量balanceOf[_to] += _value;//通知任何监听该交易的客户端Transfer(_from, _to, _value);}/*** 合约拥有者,可以为指定帐户创造一些代币* @param  target address 帐户地址* @param  mintedAmount uint256 增加的金额(单位是wei)*/function mintToken(address target, uint256 mintedAmount) onlyOwner public {//给指定地址增加代币,同时总量也相加balanceOf[target] += mintedAmount;totalSupply += mintedAmount;Transfer(0, this, mintedAmount);Transfer(this, target, mintedAmount);}/*** 增加冻结帐户名称** 你可能需要监管功能以便你能控制谁可以/谁不可以使用你创建的代币合约** @param  target address 帐户地址* @param  freeze bool    是否冻结*/function freezeAccount(address target, bool freeze) onlyOwner public {frozenAccount[target] = freeze;FrozenFunds(target, freeze);}/*** 设置买卖价格** 如果你想让ether(或其他代币)为你的代币进行背书,以便可以市场价自动化买卖代币,我们可以这么做。如果要使用浮动的价格,也可以在这里设置** @param newSellPrice 新的卖出价格* @param newBuyPrice 新的买入价格*/function setPrices(uint256 newSellPrice, uint256 newBuyPrice) onlyOwner public {sellPrice = newSellPrice;buyPrice = newBuyPrice;}/*** 使用以太币购买代币*/function buy() payable public {uint amount = msg.value / buyPrice;_transfer(this, msg.sender, amount);}/*** @dev 卖出代币* @return 要卖出的数量(单位是wei)*/function sell(uint256 amount) public {//检查合约的余额是否充足require(this.balance >= amount * sellPrice);_transfer(msg.sender, this, amount);msg.sender.transfer(amount * sellPrice);}
}

下一篇文章我们将讲到 如何 使用Remix编辑器发布以太坊ERC20高级代币合约

创建自己的ERC20加密货币(可管理、增发、兑换、冻结等高级功能的代币)相关推荐

  1. 实现一个可管理、增发、兑换、冻结等高级功能的代币

    本文首发于深入浅出区块链社区 原文链接:实现一个可管理.增发.兑换.冻结等高级功能的代币 本文主要介绍代币高级功能的实现: 代币管理.代币增发.代币兑换.资产冻结.Gas自动补充. 写在前面 在上一篇 ...

  2. 实现一个可管理、增发、兑换、冻结等高级功能的代币 1

    想知道更多区块链技术,请搜索[链客区块链技术问答社区] 链客,有问必答!! 实现代币的管理者 虽然区块链是去中心化的,但是实现对代币(合约)的管理,也在许多应用中有需求,为了对代币进行管理,首先需要给 ...

  3. 瑞士加密银行SEBA将发行B轮融资股票作为证券代币

    瑞士加密银行SEBA将向股东发行其B轮融资股票,作为基于区块链的证券代币.此前,瑞士通过一项新的分布式账本技术(DLT)法律,承认代币化证券是一种可以通过区块链转移其合法所有权的资产类别.SEBA表示 ...

  4. 给代币添加高级功能-代币管理、增发、兑换、冻结等

    最新内容会更新在主站深入浅出区块链社区 原文链接:实现一个可管理.增发.兑换.冻结等高级功能的代币 本文主要介绍代币高级功能的实现: 代币管理.代币增发.代币兑换.资产冻结.Gas自动补充. 写在前面 ...

  5. 哈佛梅森学者:数字加密货币的泡沫与机遇|万字长文干货

    硅谷Live / 实地探访 / 热点探秘 / 深度探讨 本文纯粹学术探讨,不够成对任何数字加密货币或ICO项目的投资意见. 作者简介:邹传伟,统计学学士.经济学硕士和经济学博士,副研究员.先后就读于北 ...

  6. 哈佛梅森学者邹传伟:泡沫与机遇——数字加密货币和区块链金融九问

    哈佛梅森学者邹传伟:泡沫与机遇--数字加密货币和区块链金融九问 原创 2018-01-23 邹传伟 南湖互联网金融评论 点击上方南湖互联网金融评论 关注我们 作者简介:邹传伟,统计学学士.经济学硕士和 ...

  7. 耐克为何不接受加密货币付款?

    作者 | btcread 译者 | 火火酱 责编 | Carol 出品 | 区块链大本营(ID:blockchain_camp) 在过去的三年中,加密货币支付正变得越来越流行,尤其用于发展中国家的点对 ...

  8. 全面盘点:稳定数字加密货币的由来与现状 |区块链捕手

    无论你承认与否,数字加密货币的时代正在飞速地到来:从最早的以物易物,到以金银充当货币,再到纸币的产生,人类货币的形态交替的时间越来越短.在接下来的20年内,人类将很可能迎来数字加密货币的全面崛起. 纵 ...

  9. 简报 | 美国:新立法建议将加密货币排除在证券法之外

    监管政策 美国:新立法建议将加密货币排除在证券法之外 12月20日,两名美国国会议员在众议院提出一项法案,将数字资产排除在证券之外.Reps.Warren Davidson(R)和Darren Sot ...

最新文章

  1. 人工智能之机器学习常见算法
  2. 服务器能安装ios系统吗,想给iPhone重装iOS,怎能不用iMazing
  3. dp线和hdmi区别_干货| 认识VGA、DVI、HDMI、DP视频接口
  4. linux以服务的方式启动mongodb,linux以服务的方式启动MongoDB
  5. a113 智能音箱芯片方案_高通入局智能音箱,首款四核单芯片方案曝光
  6. java poi读取word中附件_Java POI导入word, 带图片
  7. 如何嗅闻交换网络和ARP骗子-ARP解释的原则
  8. 组策略里更改更新和设置客户端首页
  9. mysql主从同步当天数据,mysql主从数据同步
  10. 不让html缓存图片吗,html – 如何强制Web浏览器不缓存图像
  11. wegame饥荒一直登录中_经历网游和单机发行的左右摇摆后,Wegame决定“我全都要”...
  12. Powershell管理系列(一)Active Direcrtory管理:用户管理
  13. cad文字递增快捷键_AutoCAD常用快捷键命令大全(文字版)
  14. uib-datepicker-popup使用
  15. 【信息学奥赛一本通 提高组】第三章 深搜的剪枝技巧
  16. 面试题---测试用例设计
  17. 激活数字营销新引擎,亚马逊云科技为企业带来数字化营销新体验
  18. 购买30万住房也能落户武汉
  19. sourceinsight 查看源码的利器
  20. 错误1053: 服务没有及时地响应启动或控制请求

热门文章

  1. U3D_API_解析
  2. Codeforces Round #840 (Div. 2) and Enigma 2022 - Cybros LNMIIT题解
  3. Android入门教程学习笔记
  4. CSS3选择器-组合选择器
  5. 通过页面验证hadoop是否安装成功的方法
  6. Concurrent 包结构介绍
  7. ANSYS中的轴承载荷(BearingLoad)_51CAE_新浪博客
  8. 【MVC】MVC分页
  9. 关闭Windows Server IE增强安全配置 解决Windows服务器无法上网的问题
  10. [BZOJ2876] [NOI2012]骑行川藏