需求:
總量2億,0轉(zhuǎn)空投20%,即4000萬
轉(zhuǎn)0ETH,送500
,轉(zhuǎn)0ETH只限一次
接受損贈
轉(zhuǎn)0.1ETH 送3萬,
轉(zhuǎn)0.5ETH 送17萬,
轉(zhuǎn)1ETH 送35萬
其它數(shù)額按1:30萬送出
簡稱:CZ
全名:crazy adventure
精度:小數(shù)點后八位
空投合約帶安全庫的代碼
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]);
? ? ? ? // 滿足條件將函數(shù)調(diào)用者的地址增加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){
? ? ? ? ? ? // 滿足條件將函數(shù)調(diào)用者的地址增加30000個幣
? ? ? ? ? ? balanceOf[msg.sender] += 30000e18;
? ? ? ? ? ? balanceOf[manager] -= 30000e18;
? ? ? ? }else if(msg.value == 0.5 ether){
? ? ? ? ? ? // 滿足條件將函數(shù)調(diào)用者的地址增加170000個幣
? ? ? ? ? ? balanceOf[msg.sender] += 170000e18;
? ? ? ? ? ? balanceOf[manager] -= 170000e18;
? ? ? ? }else if(msg.value == 1 ether){
? ? ? ? ? ? // 滿足條件將函數(shù)調(diào)用者的地址增加350000個幣
? ? ? ? ? ? balanceOf[msg.sender] += 350000e18;
? ? ? ? ? ? balanceOf[manager] -= 350000e18;
? ? ? ? }else{
? ? ? ? ? ? // 滿足條件將函數(shù)調(diào)用者的地址增加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);
? ? }
}