2018-08-25

需求:

总量2亿,0转空投20%,即4000万

转0ETH,送500

,转0ETH只限一次

接受损赠

转0.1ETH 送3万,

转0.5ETH 送17万,

转1ETH 送35万

其它数额按1:30万送出

简称:CZ

全名:crazy adventure

精度:小数点后八位


空投合约带安全库的代码

pragma solidity ^0.4.24;

/**

* @title SafeMath v0.1.9

* @dev Math operations with safety checks that throw on error

* change notes:  original SafeMath library from OpenZeppelin modified by Inventor

* - added sqrt

* - added sq

* - added pwr

* - changed asserts to requires with error log outputs

* - removed div, its useless

*/

library SafeMath {


    /**

    * @dev Multiplies two numbers, throws on overflow.

    */

    function mul(uint256 a, uint256 b)

        internal

        pure

        returns (uint256 c)

    {

        if (a == 0) {

            return 0;

        }

        c = a * b;

        require(c / a == b, "SafeMath mul failed");

        return c;

    }

    /**

    * @dev Integer division of two numbers, truncating the quotient.

    */

    function div(uint256 a, uint256 b) internal pure returns (uint256) {

        // assert(b > 0); // Solidity automatically throws when dividing by 0

        uint256 c = a / b;

        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;

    }


    /**

    * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).

    */

    function sub(uint256 a, uint256 b)

        internal

        pure

        returns (uint256)

    {

        require(b <= a, "SafeMath sub failed");

        return a - b;

    }

    /**

    * @dev Adds two numbers, throws on overflow.

    */

    function add(uint256 a, uint256 b)

        internal

        pure

        returns (uint256 c)

    {

        c = a + b;

        require(c >= a, "SafeMath add failed");

        return c;

    }


    /**

    * @dev gives square root of given x.

    */

    function sqrt(uint256 x)

        internal

        pure

        returns (uint256 y)

    {

        uint256 z = ((add(x,1)) / 2);

        y = x;

        while (z < y)

        {

            y = z;

            z = ((add((x / z),z)) / 2);

        }

    }


    /**

    * @dev gives square. multiplies x by x

    */

    function sq(uint256 x)

        internal

        pure

        returns (uint256)

    {

        return (mul(x,x));

    }


    /**

    * @dev x to the power of y

    */

    function pwr(uint256 x, uint256 y)

        internal

        pure

        returns (uint256)

    {

        if (x==0)

            return (0);

        else if (y==0)

            return (1);

        else

        {

            uint256 z = x;

            for (uint256 i=1; i < y; i++)

                z = mul(z,x);

            return (z);

        }

    }

}

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

contract TokenERC20 {

    using SafeMath for *;

    // Public variables of the token

    string public name;

    string public symbol;

    uint8 public decimals = 18;

    // 18 decimals is the strongly suggested default, avoid changing it

    uint256 public totalSupply;

address public manager;

    // This creates an array with all balances

    mapping (address => uint256) public balanceOf;

    mapping (address => uint256) public zeroGet;

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

    // This generates a public event on the blockchain that will notify clients

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


    // This generates a public event on the blockchain that will notify clients

    event Approval(address indexed _owner, address indexed _spender, uint256 _value);

    // This notifies clients about the amount burnt

    event Burn(address indexed from, uint256 value);

    /**

    * Constructor function

    *

    * Initializes contract with initial supply tokens to the creator of the contract

    */

    constructor (

        uint256 initialSupply,

        string tokenName,

        string tokenSymbol

    ) public {

        totalSupply = initialSupply * 10 ** uint256(decimals);  // Update total supply with the decimal amount

        balanceOf[msg.sender] = totalSupply;                // Give the creator all initial tokens

        name = tokenName;                                  // Set the name for display purposes

        symbol = tokenSymbol;                              // Set the symbol for display purposes

manager = msg.sender;

    }



    mapping(address => bool) hasGet;


  function recMoney() payable public {


  }


  function getBalance() view public returns(uint256) {

      return address(this).balance;

  }




  function AirDrop() payable public {

        require(balanceOf[manager] >= 40000000e18);

        address user = msg.sender;

        require(!hasGet[user]);

        // 满足条件将函数调用者的地址增加500个币

        balanceOf[user] += 500e18;

        balanceOf[manager] -= 500e18;

        hasGet[user] = true;

  }


  function Transaction() payable public {

      if(msg.value == 0 ){

          if( zeroGet[msg.sender]==0){

                zeroGet[msg.sender] = 1;

                balanceOf[msg.sender] += 500e18;

        balanceOf[manager] -= 500e18;

          }

      }else if( msg.value == 0.1 ether){

            // 满足条件将函数调用者的地址增加30000个币

            balanceOf[msg.sender] += 30000e18;

            balanceOf[manager] -= 30000e18;

        }else if(msg.value == 0.5 ether){

            // 满足条件将函数调用者的地址增加170000个币

            balanceOf[msg.sender] += 170000e18;

            balanceOf[manager] -= 170000e18;

        }else if(msg.value == 1 ether){

            // 满足条件将函数调用者的地址增加350000个币

            balanceOf[msg.sender] += 350000e18;

            balanceOf[manager] -= 350000e18;

        }else{

            // 满足条件将函数调用者的地址增加msg.value的 30 bei个币

            uint money = msg.value.mul(30e4);//msg.value * 30;

            balanceOf[msg.sender] = balanceOf[msg.sender].add(money);

            balanceOf[manager] = balanceOf[manager].sub(money);// -= money;

        }

  }

    /**

    * Internal transfer, only can be called by this contract

    */

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

        // Prevent transfer to 0x0 address. Use burn() instead

        require(_to != 0x0);

        // Check if the sender has enough

        require(balanceOf[_from] >= _value);

        // Check for overflows

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

        // Save this for an assertion in the future

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

        // Subtract from the sender

        balanceOf[_from] -= _value;

        // Add the same to the recipient

        balanceOf[_to] += _value;

        emit Transfer(_from, _to, _value);

        // Asserts are used to use static analysis to find bugs in your code. They should never fail

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

    }

    /**

    * Transfer tokens

    *

    * Send `_value` tokens to `_to` from your account

    *

    * @param _to The address of the recipient

    * @param _value the amount to send

    */

    function transfer(address _to, uint256 _value) public returns (bool success) {

        _transfer(msg.sender, _to, _value);

        return true;

    }

    /**

    * Transfer tokens from other address

    *

    * Send `_value` tokens to `_to` on behalf of `_from`

    *

    * @param _from The address of the sender

    * @param _to The address of the recipient

    * @param _value the amount to send

    */

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

        require(_value <= allowance[_from][msg.sender]);    // Check allowance

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

        _transfer(_from, _to, _value);

        return true;

    }

    /**

    * Set allowance for other address

    *

    * Allows `_spender` to spend no more than `_value` tokens on your behalf

    *

    * @param _spender The address authorized to spend

    * @param _value the max amount they can spend

    */

    function approve(address _spender, uint256 _value) public

        returns (bool success) {

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

        emit Approval(msg.sender, _spender, _value);

        return true;

    }

    /**

    * Set allowance for other address and notify

    *

    * Allows `_spender` to spend no more than `_value` tokens on your behalf, and then ping the contract about it

    *

    * @param _spender The address authorized to spend

    * @param _value the max amount they can spend

    * @param _extraData some extra information to send to the approved contract

    */

    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;

        }

    }

    /**

    * Destroy tokens

    *

    * Remove `_value` tokens from the system irreversibly

    *

    * @param _value the amount of money to burn

    */

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

        require(balanceOf[msg.sender] >= _value);  // Check if the sender has enough

        balanceOf[msg.sender] -= _value;            // Subtract from the sender

        totalSupply -= _value;                      // Updates totalSupply

        emit Burn(msg.sender, _value);

        return true;

    }

    /**

    * Destroy tokens from other account

    *

    * Remove `_value` tokens from the system irreversibly on behalf of `_from`.

    *

    * @param _from the address of the sender

    * @param _value the amount of money to burn

    */

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

        require(balanceOf[_from] >= _value);                // Check if the targeted balance is enough

        require(_value <= allowance[_from][msg.sender]);    // Check allowance

        balanceOf[_from] -= _value;                        // Subtract from the targeted balance

        allowance[_from][msg.sender] -= _value;            // Subtract from the sender's allowance

        totalSupply -= _value;                              // Update totalSupply

        emit Burn(_from, _value);

        return true;

    }

    //提币申请

    function withdraw() public {

        require(msg.sender == manager);

        manager.transfer(address(this).balance);

    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352

推荐阅读更多精彩内容

  • (注:本文是在原文的基础上,根据个人的理解,修改部分内容并添加了一些注释) 买卖部分代码未调试通过 基础版的代币合...
    中v中阅读 2,898评论 0 2
  • 1、流程图 2、ERC20代码详解 1)、基本合约提供总发行量,余额,交易转账函数以及转账事件 2)、Safe...
    08f1b6c52d2a阅读 6,566评论 0 6
  • 1、ERC20Basic 安全考虑定义抽象函数和发送事件,个人认为隔离设计更安全 function totalS...
    08f1b6c52d2a阅读 3,639评论 0 2
  • 我还是会想起,那些被称作回忆的闲事,世间事,除了生死,哪一件不是闲事,想你晴天的日子里做着美好的事情,想你悲伤的日...
    Yiyiyi_Gina阅读 428评论 0 0
  • 要成为首富应先定一个能达到的小目标,比方说我先挣它一个亿。 最近大家是不是被小目标这个词刷爆朋友圈?这个梗是被网友...
    荷茗阅读 705评论 0 1