合约地址:https://etherscan.io/address/0xaf81fe7b506d07e0a87b6dead5302781520a0e22#code

pragma solidity ^0.4.18;contract Ownable {address public owner;event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);constructor() public {owner = msg.sender;}modifier onlyOwner() {require(msg.sender == owner);  _;}function transferOwnership(address newOwner) public onlyOwner {require(newOwner != address(0));emit OwnershipTransferred(owner, newOwner);owner = newOwner;}
}library SafeMath {function mul(uint256 a, uint256 b) internal pure returns (uint256) {if (a == 0) {return 0;}uint256 c = a * b;assert(c / a == b);return c;}function div(uint256 a, uint256 b) internal pure returns (uint256) {uint256 c = a / b;return c;}function sub(uint256 a, uint256 b) internal pure returns (uint256) {assert(b <= a);return a - b;}function add(uint256 a, uint256 b) internal pure returns (uint256) {uint256 c = a + b;assert(c >= a);return c;}
}contract ERC20Basic {uint256 public totalSupply;function balanceOf(address who) public view returns (uint256);function transfer(address to, uint256 value) public returns (bool);event Transfer(address indexed from, address indexed to, uint256 value);
}contract ERC20 is ERC20Basic {function allowance(address owner, address spender) public view returns (uint256);function transferFrom(address from, address to, uint256 value) public returns (bool);function approve(address spender, uint256 value) public returns (bool);event Approval(address indexed owner, address indexed spender, uint256 value);
}library SafeERC20 {function safeTransfer(ERC20Basic token, address to, uint256 value) internal {assert(token.transfer(to, value));}function safeTransferFrom(ERC20 token, address from, address to, uint256 value) internal {assert(token.transferFrom(from, to, value));}function safeApprove(ERC20 token, address spender, uint256 value) internal {assert(token.approve(spender, value));}
}contract StandardToken is ERC20 {using SafeMath for uint256;mapping(address => uint256) balances;mapping (address => mapping (address => uint256)) internal allowed;function transfer(address _to, uint256 _value) public returns (bool) {require(_to != address(0));require(_value <= balances[msg.sender]);balances[msg.sender] = balances[msg.sender].sub(_value);balances[_to] = balances[_to].add(_value);emit Transfer(msg.sender, _to, _value);return true;}function balanceOf(address _owner) public view returns (uint256 balance) {return balances[_owner];}function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {require(_to != address(0));require(_value <= balances[_from]);require(_value <= allowed[_from][msg.sender]);balances[_from] = balances[_from].sub(_value);balances[_to] = balances[_to].add(_value);allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);emit Transfer(_from, _to, _value);return true;}function approve(address _spender, uint256 _value) public returns (bool) {allowed[msg.sender][_spender] = _value;emit Approval(msg.sender, _spender, _value);return true;}function allowance(address _owner, address _spender) public view returns (uint256) {return allowed[_owner][_spender];}function increaseApproval(address _spender, uint _addedValue) public returns (bool) {allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);return true;}function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) {uint oldValue = allowed[msg.sender][_spender];if (_subtractedValue > oldValue) {allowed[msg.sender][_spender] = 0;} else {allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);}emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);return true;}
}contract TokenTimelock {using SafeERC20 for ERC20Basic;ERC20Basic public token;address public beneficiary;uint256 public releaseTime;constructor(ERC20Basic _token, address _beneficiary, uint256 _releaseTime) public {require(_releaseTime > now);token = _token;beneficiary = _beneficiary;releaseTime = _releaseTime;}function release() public {require(now >= releaseTime);uint256 amount = token.balanceOf(this);require(amount > 0);token.safeTransfer(beneficiary, amount);}
}contract MintableToken is StandardToken, Ownable {event Mint(address indexed to, uint256 amount);event MintFinished();bool public mintingFinished = false;modifier canMint() {require(!mintingFinished);_;}function mint(address _to, uint256 _amount) onlyOwner canMint public returns (bool) {totalSupply = totalSupply.add(_amount);balances[_to] = balances[_to].add(_amount);emit Mint(_to, _amount);emit Transfer(address(0), _to, _amount);return true;}function finishMinting() onlyOwner canMint public returns (bool) {mintingFinished = true;emit MintFinished();return true;}
}contract YiqiniuToken is MintableToken {string public constant name   = 'Yiqiniu';string public constant symbol = 'KEY';uint256 public constant decimals  = 18;event Burned(address indexed burner, uint256 value);function burn(uint256 _value) public onlyOwner {require(_value > 0);address burner = msg.sender;balances[burner] = balances[burner].sub(_value);totalSupply = totalSupply.sub(_value);emit Burned(burner, _value);}
}contract CrowdsaleConfig {uint256 public constant TOKEN_DECIMALS      = 18;uint256 public constant MIN_TOKEN_UNIT      = 10 ** uint256(TOKEN_DECIMALS);uint256 public constant TOTAL_SUPPLY_CAP        = 100000000 * MIN_TOKEN_UNIT;uint256 public constant PUBLIC_SALE_TOKEN_CAP   = TOTAL_SUPPLY_CAP / 100 * 30;uint256 public constant AGENCY_TOKEN_CAP        = TOTAL_SUPPLY_CAP / 100 * 20;uint256 public constant TEAM_TOKEN_CAP          = TOTAL_SUPPLY_CAP / 100 * 50;address public constant TEAM_ADDR       = 0xd589737E4CbeC49E862D3A54c75aF16e27dD8fC1;address public constant AGENCY_ADDR             = 0xc849e7225fF088e187136A670662e36adE5A89FC;address public constant WALLET_ADDR             = 0xd589737E4CbeC49E862D3A54c75aF16e27dD8fC1;
}contract YiqiniuCrowdsale is Ownable, CrowdsaleConfig{using SafeMath for uint256;using SafeERC20 for YiqiniuToken;// Token contractYiqiniuToken public token;uint64 public startTime;uint64 public endTime;uint256 public rate = 10000;uint256 public goalSale;uint256 public totalPurchased = 0;bool public CrowdsaleEnabled = false;mapping(address => bool) public isVerified;mapping(address => uint256) public tokensPurchased;uint256 public maxTokenPurchase = 100000 * MIN_TOKEN_UNIT;uint256 public minTokenPurchase = 1 * MIN_TOKEN_UNIT;TokenTimelock public AgencyLock1;TokenTimelock public AgencyLock2;event NewYiqiniuToken(address _add);constructor() public {startTime = uint64(now);endTime = uint64(now + 3600*24*4);goalSale = PUBLIC_SALE_TOKEN_CAP / 100 * 50;token = new YiqiniuToken();emit NewYiqiniuToken(address(token));token.mint(address(this), TOTAL_SUPPLY_CAP);token.finishMinting();uint64 TimeLock1 = uint64(now + 3600*24*5);uint64 TimeLock2 = uint64(now + 3600*24*6);AgencyLock1 = new TokenTimelock(token, AGENCY_ADDR, TimeLock1);AgencyLock2 = new TokenTimelock(token, AGENCY_ADDR, TimeLock2);token.safeTransfer(AgencyLock1, AGENCY_TOKEN_CAP/2);token.safeTransfer(AgencyLock2, AGENCY_TOKEN_CAP/2);token.safeTransfer(TEAM_ADDR,TEAM_TOKEN_CAP);}function releaseLockAgencyLock1() public {AgencyLock1.release();}function releaseLockAgencyLock2() public {AgencyLock2.release();}function () external payable {   buyTokens(msg.sender);}modifier canCrowdsale() {require(CrowdsaleEnabled);_;}function enableCrowdsale() public onlyOwner {CrowdsaleEnabled = true;}function closeCrowdsale() public onlyOwner {CrowdsaleEnabled = false;}function buyTokens(address participant) internal canCrowdsale {require(now >= startTime);require(now < endTime);require(msg.value != 0);require(isVerified[participant]);uint256 weiAmount = msg.value;uint256 tokens = weiAmount.mul(rate);tokensPurchased[participant] = tokensPurchased[participant].add(tokens);require(tokensPurchased[participant] >= minTokenPurchase);require(tokensPurchased[participant] <= maxTokenPurchase);totalPurchased = totalPurchased.add(tokens);token.safeTransfer(participant, tokens);}function setTokenPrice(uint256 _tokenRate) public onlyOwner {require(now > startTime);require(_tokenRate > 0);rate = _tokenRate;}function setLimitTokenPurchase(uint256 _minToken, uint256 _maxToken) public onlyOwner {require(goalSale >= maxTokenPurchase);minTokenPurchase = _minToken;maxTokenPurchase = _maxToken;}function addVerified (address[] _ads) public onlyOwner {for(uint i = 0; i < _ads.length; i++){isVerified[_ads[i]] = true;}}function removeVerified (address _address) public onlyOwner {isVerified[_address] = false;}function close() onlyOwner public {require(now >= endTime || totalPurchased >= goalSale);token.burn(token.balanceOf(this));WALLET_ADDR.transfer(address(this).balance);}
}

【智能合约审计】————16、YiqiniuCrowdsale相关推荐

  1. 区块链100讲:智能合约审计指南

    智能合约代码的审计,目前还不是技术社区内经常会讨论的主题.今年3月6日,发表在博客网站[Schneier on Security]上的一篇博客(原文链接:[https://www.schneier.c ...

  2. 智能合约审计之条件竞争

    文章前言 与大多数区块链一样,以太坊节点汇集交易并将其形成块,一旦矿工解决了共识机制(目前Ethereum的ETHASH PoW),这些交易就被认为是有效的,解决该区块的矿工也会选择来自该矿池的哪些交 ...

  3. 【智能合约系列009-如何做智能合约审计?】

    研究报告[Finding The Greedy, Prodigal, and Suicidal Contracts at Scale])指出,目前在以太坊中,有89%的智能合约代码都或多或少存在安全漏 ...

  4. 区块链安全100问 | 第七篇:智能合约审计流程及审计内容

    零时科技--专注于区块链安全领域 深圳零时科技有限公司(简称:零时科技),公司成立于2018年11月,是一家专注于区块链生态安全的实战创新型网络安全企业,团队扎根区块链安全与应用技术研究,以丰富的安全 ...

  5. 智能合约审计之访问控制

    基础知识 权限的概念 权限是指为了保证职责的有效履行,任职者必须具备的对某事项进行决策的范围和程度.它常常用"具有xxxxxxx的权利"来进行表达,比如:公司的CEO具有否定某项提 ...

  6. 智能合约审计之DDOS概述

    拒绝服务(DOS) 对智能合约进行DOS攻击的方法有很多种,其根本的目的是使合约在一段时间内或者永久无法正常运行,通过拒绝服务攻击,也可以使合约中的ether永远无法提取出来,下面将会列出几种常见的攻 ...

  7. 智能合约审计之权限校验错误

    Tx.origin鉴权 简单介绍 tx.origin是Solidity的一个全局变量,它遍历整个调用栈并返回最初发送调用(或事务)的帐户的地址,在智能合约中使用此变量进行身份验证可能会使合约受到类似网 ...

  8. 【智能合约审计】————11、MultiGamesToken

    合约地址:https://etherscan.io/address/0x52a5e1a56a124dce84e548ff96122246e46d599f#code pragma solidity ^0 ...

  9. 【智能合约审计】————17、YiqiniuToken

    合约地址:https://etherscan.io/address/0xa54ff78ac3fdf232d6eb5d547fbf2a6933d91cd3#code 审计结果: pragma solid ...

最新文章

  1. 面向开发者的2018年AI趋势分析
  2. [Silverlight入门系列]实现局部元素全屏(Element部分全屏)
  3. 002_SpringBoot整合Servlet
  4. linux c语言链表的简单应用之创建链表
  5. 实时获取ccd图像_四元数数控:CCD视觉检测定位系统在玻璃瓶缺陷的检测
  6. 利用Java生成静态HMTL页面的方法收集
  7. 怎么让员工服从管理_职场 | 在职场中,遇到不服从管理的员工,该怎么办呢?...
  8. mysql必知必会_MySQL必知必会
  9. poj2186Popular Cows(Kosaraju算法--有向图的强连通分量的分解)
  10. cisco 华三 对接_Cisco ACS 5.6与华为,H3C设备对接操作指引
  11. 压力测试工具siege的用法
  12. ambari下 hive metastore 启动失败
  13. 使用docker运行Mysql客户端
  14. 扩展ExoPlayer实现多音轨同时播放
  15. modbus软件开发linux,Linux C开发之用modbus实现串口通讯
  16. 6个超炫酷的HTML5电子书翻页动画
  17. 珠海 第十届亚洲机器人锦标赛_逾2000名选手云集珠海竞技第十届亚洲机器人锦标赛...
  18. 图像的MAP-MRF模型
  19. 招投标法、合同法、采购法
  20. Linux之CentOS7安装(VMware虚拟机安装及系统安装图文教程)

热门文章

  1. JS实现广告顺序轮播和随机轮播四份代码
  2. MySQL 免安装版配置教程
  3. 为了面试成功,社恐年轻人伪装“社牛”
  4. go 语言中 struct 中 json 是代表什么意思
  5. 绿色版PS关联psd文件直接打开方法
  6. ISA指令集基础应用
  7. 解决CAD文字显示问号,CMD控制台乱码
  8. npm 依赖?不熟知的 optionalDependencies(可选依赖项)
  9. 实时行情数据——证券市场(股票、期货、期权)
  10. 超全建筑成套3d模型素材网站整理