ETH Price: $3,336.08 (-1.16%)
Gas: 8 Gwei

Contract

0xAf038b0290C35A3210D5Cfda9f39ffcEEa1c1Ea5
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer150381812022-06-28 5:41:40763 days ago1656394900IN
0xAf038b02...EEa1c1Ea5
0 ETH0.0013975524.52372549
Approve108499252020-09-12 22:49:261416 days ago1599950966IN
0xAf038b02...EEa1c1Ea5
0 ETH0.0041259690
Transfer99816462020-05-01 17:19:241550 days ago1588353564IN
0xAf038b02...EEa1c1Ea5
0 ETH0.000214528
Transfer99816462020-05-01 17:19:241550 days ago1588353564IN
0xAf038b02...EEa1c1Ea5
0 ETH0.0002682710
Transfer99813622020-05-01 16:15:561550 days ago1588349756IN
0xAf038b02...EEa1c1Ea5
0 ETH0.000107264
Transfer99813622020-05-01 16:15:561550 days ago1588349756IN
0xAf038b02...EEa1c1Ea5
0 ETH0.000107264
Transfer99813622020-05-01 16:15:561550 days ago1588349756IN
0xAf038b02...EEa1c1Ea5
0 ETH0.000107264
Transfer99813622020-05-01 16:15:561550 days ago1588349756IN
0xAf038b02...EEa1c1Ea5
0 ETH0.000107264
Transfer99813622020-05-01 16:15:561550 days ago1588349756IN
0xAf038b02...EEa1c1Ea5
0 ETH0.000107264
Transfer97274102020-03-23 11:11:411590 days ago1584961901IN
0xAf038b02...EEa1c1Ea5
0 ETH0.0019211445
Transfer96809882020-03-16 6:36:081597 days ago1584340568IN
0xAf038b02...EEa1c1Ea5
0 ETH0.0023085183.4
Transfer96809552020-03-16 6:28:191597 days ago1584340099IN
0xAf038b02...EEa1c1Ea5
0 ETH0.0018779244
Transfer96496542020-03-11 10:23:351602 days ago1583922215IN
0xAf038b02...EEa1c1Ea5
0 ETH0.0003466
Transfer From92723802020-01-13 11:24:101660 days ago1578914650IN
0xAf038b02...EEa1c1Ea5
0 ETH0.0016054245
Approve92723592020-01-13 11:19:351660 days ago1578914375IN
0xAf038b02...EEa1c1Ea5
0 ETH0.0020640645
Transfer92723182020-01-13 11:10:111660 days ago1578913811IN
0xAf038b02...EEa1c1Ea5
0 ETH0.000265854.5
Transfer92554532020-01-10 21:12:081662 days ago1578690728IN
0xAf038b02...EEa1c1Ea5
0 ETH0.0025950645
Transfer91763202019-12-28 15:03:411675 days ago1577545421IN
0xAf038b02...EEa1c1Ea5
0 ETH0.000181693.15
Transfer From91294522019-12-19 6:52:461685 days ago1576738366IN
0xAf038b02...EEa1c1Ea5
0 ETH0.001606545
Transfer91294212019-12-19 6:45:231685 days ago1576737923IN
0xAf038b02...EEa1c1Ea5
0 ETH0.000128043
Transfer From91084152019-12-15 3:04:281689 days ago1576379068IN
0xAf038b02...EEa1c1Ea5
0 ETH0.001606545
Approve91083992019-12-15 2:59:581689 days ago1576378798IN
0xAf038b02...EEa1c1Ea5
0 ETH0.0020640645
Transfer91083602019-12-15 2:52:051689 days ago1576378325IN
0xAf038b02...EEa1c1Ea5
0 ETH0.000085362
Transfer91083252019-12-15 2:37:411689 days ago1576377461IN
0xAf038b02...EEa1c1Ea5
0 ETH0.000110724
Transfer From90876872019-12-11 7:58:071693 days ago1576051087IN
0xAf038b02...EEa1c1Ea5
0 ETH0.001606545
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
GigToken

Compiler Version
v0.4.19+commit.c4cbbb05

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-04-16
*/

pragma solidity 0.4.19;


/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;


  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  function Ownable() public {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    require(newOwner != address(0));
    OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}


contract ERC20Basic {
  function totalSupply() public view returns (uint256);
  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);
}


contract BasicToken is ERC20Basic {
  using SafeMath for uint256;

  mapping(address => uint256) balances;

  uint256 totalSupply_;

  /**
  * @dev total number of tokens in existence
  */
  function totalSupply() public view returns (uint256) {
    return totalSupply_;
  }

  /**
  * @dev transfer token for a specified address
  * @param _to The address to transfer to.
  * @param _value The amount to be transferred.
  */
  function transfer(address _to, uint256 _value) public returns (bool) {
    require(_to != address(0));
    require(_value <= balances[msg.sender]);

    // SafeMath.sub will throw if there is not enough balance.
    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    Transfer(msg.sender, _to, _value);
    return true;
  }

  /**
  * @dev Gets the balance of the specified address.
  * @param _owner The address to query the the balance of.
  * @return An uint256 representing the amount owned by the passed address.
  */
  function balanceOf(address _owner) public view returns (uint256 balance) {
    return balances[_owner];
  }

}


contract StandardToken is ERC20, BasicToken {

  mapping (address => mapping (address => uint256)) internal allowed;


  /**
   * @dev Transfer tokens from one address to another
   * @param _from address The address which you want to send tokens from
   * @param _to address The address which you want to transfer to
   * @param _value uint256 the amount of tokens to be transferred
   */
  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);
    Transfer(_from, _to, _value);
    return true;
  }

  /**
   * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
   *
   * Beware that changing an allowance with this method brings the risk that someone may use both the old
   * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
   * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
   * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   * @param _spender The address which will spend the funds.
   * @param _value The amount of tokens to be spent.
   */
  function approve(address _spender, uint256 _value) public returns (bool) {
    allowed[msg.sender][_spender] = _value;
    Approval(msg.sender, _spender, _value);
    return true;
  }

  /**
   * @dev Function to check the amount of tokens that an owner allowed to a spender.
   * @param _owner address The address which owns the funds.
   * @param _spender address The address which will spend the funds.
   * @return A uint256 specifying the amount of tokens still available for the spender.
   */
  function allowance(address _owner, address _spender) public view returns (uint256) {
    return allowed[_owner][_spender];
  }

  /**
   * @dev Increase the amount of tokens that an owner allowed to a spender.
   *
   * approve should be called when allowed[_spender] == 0. To increment
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   * @param _spender The address which will spend the funds.
   * @param _addedValue The amount of tokens to increase the allowance by.
   */
  function increaseApproval(address _spender, uint _addedValue) public returns (bool) {
    allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
    Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

  /**
   * @dev Decrease the amount of tokens that an owner allowed to a spender.
   *
   * approve should be called when allowed[_spender] == 0. To decrement
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   * @param _spender The address which will spend the funds.
   * @param _subtractedValue The amount of tokens to decrease the allowance by.
   */
  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);
    }
    Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

}


contract Multivest is Ownable {

    using SafeMath for uint256;

    /* public variables */
    mapping (address => bool) public allowedMultivests;

    /* events */
    event MultivestSet(address multivest);

    event MultivestUnset(address multivest);

    event Contribution(address holder, uint256 value, uint256 tokens);

    modifier onlyAllowedMultivests(address _addresss) {
        require(allowedMultivests[_addresss] == true);
        _;
    }

    /* constructor */
    function Multivest() public {}

    function setAllowedMultivest(address _address) public onlyOwner {
        allowedMultivests[_address] = true;
        MultivestSet(_address);
    }

    function unsetAllowedMultivest(address _address) public onlyOwner {
        allowedMultivests[_address] = false;
        MultivestUnset(_address);
    }

    function multivestBuy(address _address, uint256 _value) public onlyAllowedMultivests(msg.sender) {
        require(buy(_address, _value) == true);
    }

    function multivestBuy(
        address _address,
        uint8 _v,
        bytes32 _r,
        bytes32 _s
    ) public payable onlyAllowedMultivests(verify(keccak256(msg.sender), _v, _r, _s)) {
        require(_address == msg.sender && buy(msg.sender, msg.value) == true);
    }

    function verify(bytes32 _hash, uint8 _v, bytes32 _r, bytes32 _s) internal pure returns (address) {
        bytes memory prefix = "\x19Ethereum Signed Message:\n32";

        return ecrecover(keccak256(prefix, _hash), _v, _r, _s);
    }

    function buy(address _address, uint256 _value) internal returns (bool);

}


library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  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;
  }

  /**
  * @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) {
    assert(b <= a);
    return a - b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}


contract GigERC20 is StandardToken, Ownable {
    /* Public variables of the token */
    uint256 public creationBlock;

    uint8 public decimals;

    string public name;

    string public symbol;

    string public standard;

    bool public locked;

    /* Initializes contract with initial supply tokens to the creator of the contract */
    function GigERC20(
        uint256 _totalSupply,
        string _tokenName,
        uint8 _decimalUnits,
        string _tokenSymbol,
        bool _transferAllSupplyToOwner,
        bool _locked
    ) public {
        standard = "ERC20 0.1";
        locked = _locked;
        totalSupply_ = _totalSupply;

        if (_transferAllSupplyToOwner) {
            balances[msg.sender] = totalSupply_;
        } else {
            balances[this] = totalSupply_;
        }
        name = _tokenName;
        // Set the name for display purposes
        symbol = _tokenSymbol;
        // Set the symbol for display purposes
        decimals = _decimalUnits;
        // Amount of decimals for display purposes
        creationBlock = block.number;
    }

    function setLocked(bool _locked) public onlyOwner {
        locked = _locked;
    }

    /* public methods */
    function transfer(address _to, uint256 _value) public returns (bool) {
        require(locked == false);
        return super.transfer(_to, _value);
    }

    function approve(address _spender, uint256 _value) public returns (bool success) {
        if (locked) {
            return false;
        }
        return super.approve(_spender, _value);
    }

    function increaseApproval(address _spender, uint _addedValue) public returns (bool success) {
        if (locked) {
            return false;
        }
        return super.increaseApproval(_spender, _addedValue);
    }

    function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool success) {
        if (locked) {
            return false;
        }
        return super.decreaseApproval(_spender, _subtractedValue);
    }

    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
        if (locked) {
            return false;
        }

        return super.transferFrom(_from, _to, _value);
    }

}


/*
This contract manages the minters and the modifier to allow mint to happen only if called by minters
This contract contains basic minting functionality though
*/
contract MintingERC20 is GigERC20 {

    using SafeMath for uint256;

    //Variables
    mapping (address => bool) public minters;

    uint256 public maxSupply;

    //Modifiers
    modifier onlyMinters () {
        require(true == minters[msg.sender]);
        _;
    }

    function MintingERC20(
        uint256 _initialSupply,
        uint256 _maxSupply,
        string _tokenName,
        uint8 _decimals,
        string _symbol,
        bool _transferAllSupplyToOwner,
        bool _locked
    )
        public GigERC20(_initialSupply, _tokenName, _decimals, _symbol, _transferAllSupplyToOwner, _locked)
    {
        standard = "MintingERC20 0.1";
        minters[msg.sender] = true;
        maxSupply = _maxSupply;
    }

    function addMinter(address _newMinter) public onlyOwner {
        minters[_newMinter] = true;
    }

    function removeMinter(address _minter) public onlyOwner {
        minters[_minter] = false;
    }

    function mint(address _addr, uint256 _amount) public onlyMinters returns (uint256) {
        if (true == locked) {
            return uint256(0);
        }

        if (_amount == uint256(0)) {
            return uint256(0);
        }

        if (totalSupply_.add(_amount) > maxSupply) {
            return uint256(0);
        }

        totalSupply_ = totalSupply_.add(_amount);
        balances[_addr] = balances[_addr].add(_amount);
        Transfer(address(0), _addr, _amount);

        return _amount;
    }

}


contract GigToken is MintingERC20 {
    SellableToken public crowdSale; // Pre ICO & ICO
    SellableToken public privateSale;

    bool public transferFrozen = false;

    uint256 public crowdSaleEndTime;

    mapping(address => uint256) public lockedBalancesReleasedAfterOneYear;

    modifier onlyCrowdSale() {
        require(crowdSale != address(0) && msg.sender == address(crowdSale));

        _;
    }

    modifier onlySales() {
        require((privateSale != address(0) && msg.sender == address(privateSale)) ||
            (crowdSale != address(0) && msg.sender == address(crowdSale)));

        _;
    }

    event MaxSupplyBurned(uint256 burnedTokens);

    function GigToken(bool _locked) public
        MintingERC20(0, maxSupply, "GigBit", 18, "GBTC", false, _locked)
    {
        standard = "GBTC 0.1";

        maxSupply = uint256(1000000000).mul(uint256(10) ** decimals);
    }

    function setCrowdSale(address _crowdSale) public onlyOwner {
        require(_crowdSale != address(0));

        crowdSale = SellableToken(_crowdSale);

        crowdSaleEndTime = crowdSale.endTime();
    }

    function setPrivateSale(address _privateSale) public onlyOwner {
        require(_privateSale != address(0));

        privateSale = SellableToken(_privateSale);
    }

    function freezing(bool _transferFrozen) public onlyOwner {
        transferFrozen = _transferFrozen;
    }

    function isTransferAllowed(address _from, uint256 _value) public view returns (bool status) {
        uint256 senderBalance = balanceOf(_from);
        if (transferFrozen == true || senderBalance < _value) {
            return false;
        }

        uint256 lockedBalance = lockedBalancesReleasedAfterOneYear[_from];

        // check if holder tries to transfer more than locked tokens
    if (lockedBalance > 0 && senderBalance.sub(_value) < lockedBalance) {
            uint256 unlockTime = crowdSaleEndTime + 1 years;

            // fail if unlock time is not come
            if (crowdSaleEndTime == 0 || block.timestamp < unlockTime) {
                return false;
            }

            uint256 secsFromUnlock = block.timestamp.sub(unlockTime);

            // number of months over from unlock
            uint256 months = secsFromUnlock / 30 days;

            if (months > 12) {
                months = 12;
            }

            uint256 tokensPerMonth = lockedBalance / 12;

            uint256 unlockedBalance = tokensPerMonth.mul(months);

            uint256 actualLockedBalance = lockedBalance.sub(unlockedBalance);

            if (senderBalance.sub(_value) < actualLockedBalance) {
                return false;
            }
        }

        if (block.timestamp < crowdSaleEndTime &&
            crowdSale != address(0) &&
            crowdSale.isTransferAllowed(_from, _value) == false
        ) {
            return false;
        }


        return true;
    }

    function transfer(address _to, uint _value) public returns (bool) {
        require(isTransferAllowed(msg.sender, _value));

        return super.transfer(_to, _value);
    }

    function transferFrom(address _from, address _to, uint _value) public returns (bool success) {
        // transferFrom & approve are disabled before end of ICO
        require((crowdSaleEndTime <= block.timestamp) && isTransferAllowed(_from, _value));

        return super.transferFrom(_from, _to, _value);
    }

    function approve(address _spender, uint256 _value) public returns (bool success) {
        // transferFrom & approve are disabled before end of ICO

        require(crowdSaleEndTime <= block.timestamp);

        return super.approve(_spender, _value);
    }

    function increaseApproval(address _spender, uint _addedValue) public returns (bool success) {
        // transferFrom & approve are disabled before end of ICO

        require(crowdSaleEndTime <= block.timestamp);

        return super.increaseApproval(_spender, _addedValue);
    }

    function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool success) {
        // transferFrom & approve are disabled before end of ICO

        require(crowdSaleEndTime <= block.timestamp);

        return super.decreaseApproval(_spender, _subtractedValue);
    }

    function increaseLockedBalance(address _address, uint256 _tokens) public onlySales {
        lockedBalancesReleasedAfterOneYear[_address] =
            lockedBalancesReleasedAfterOneYear[_address].add(_tokens);
    }

    // burn tokens if soft cap is not reached
    function burnInvestorTokens(
        address _address,
        uint256 _amount
    ) public onlyCrowdSale returns (uint256) {
        require(block.timestamp > crowdSaleEndTime);

        require(_amount <= balances[_address]);

        balances[_address] = balances[_address].sub(_amount);

        totalSupply_ = totalSupply_.sub(_amount);

        Transfer(_address, address(0), _amount);

        return _amount;
    }

    // decrease max supply of tokens that are not sold
    function burnUnsoldTokens(uint256 _amount) public onlyCrowdSale {
        require(block.timestamp > crowdSaleEndTime);

        maxSupply = maxSupply.sub(_amount);

        MaxSupplyBurned(_amount);
    }
}

contract SellableToken is Multivest {
    uint256 public constant MONTH_IN_SEC = 2629743;
    GigToken public token;

    uint256 public minPurchase = 100 * 10 ** 5;
    uint256 public maxPurchase;

    uint256 public softCap;
    uint256 public hardCap;

    uint256 public startTime;
    uint256 public endTime;

    uint256 public maxTokenSupply;

    uint256 public soldTokens;

    uint256 public collectedEthers;

    address public etherHolder;

    uint256 public collectedUSD;

    uint256 public etherPriceInUSD;
    uint256 public priceUpdateAt;

    mapping(address => uint256) public etherBalances;

    Tier[] public tiers;

    struct Tier {
        uint256 discount;
        uint256 startTime;
        uint256 endTime;
    }

    event Refund(address _holder, uint256 _ethers, uint256 _tokens);
    event NewPriceTicker(string _price);

    function SellableToken(
        address _token,
        address _etherHolder,
        uint256 _startTime,
        uint256 _endTime,
        uint256 _maxTokenSupply,
        uint256 _etherPriceInUSD
    )
    public Multivest()
    {
        require(_token != address(0) && _etherHolder != address(0));
        token = GigToken(_token);

        require(_startTime < _endTime);
        etherHolder = _etherHolder;
        require((_maxTokenSupply == uint256(0)) || (_maxTokenSupply <= token.maxSupply()));

        startTime = _startTime;
        endTime = _endTime;
        maxTokenSupply = _maxTokenSupply;
        etherPriceInUSD = _etherPriceInUSD;

        priceUpdateAt = block.timestamp;
    }

    function setTokenContract(address _token) public onlyOwner {
        require(_token != address(0));
        token = GigToken(_token);
    }

    function setEtherHolder(address _etherHolder) public onlyOwner {
        if (_etherHolder != address(0)) {
            etherHolder = _etherHolder;
        }
    }

    function setPurchaseLimits(uint256 _min, uint256 _max) public onlyOwner {
        if (_min < _max) {
            minPurchase = _min;
            maxPurchase = _max;
        }
    }

    function mint(address _address, uint256 _tokenAmount) public onlyOwner returns (uint256) {
        return mintInternal(_address, _tokenAmount);
    }

    function isActive() public view returns (bool);

    function isTransferAllowed(address _from, uint256 _value) public view returns (bool);

    function withinPeriod() public view returns (bool);

    function getMinEthersInvestment() public view returns (uint256) {
        return uint256(1 ether).mul(minPurchase).div(etherPriceInUSD);
    }

    function calculateTokensAmount(uint256 _value) public view returns (uint256 tokenAmount, uint256 usdAmount);

    function calculateEthersAmount(uint256 _tokens) public view returns (uint256 ethers, uint256 bonus);

    function updatePreICOMaxTokenSupply(uint256 _amount) public;

    // set ether price in USD with 5 digits after the decimal point
    //ex. 308.75000
    //for updating the price through  multivest
    function setEtherInUSD(string _price) public onlyAllowedMultivests(msg.sender) {
        bytes memory bytePrice = bytes(_price);
        uint256 dot = bytePrice.length.sub(uint256(6));

        // check if dot is in 6 position  from  the last
        require(0x2e == uint(bytePrice[dot]));

        uint256 newPrice = uint256(10 ** 23).div(parseInt(_price, 5));

        require(newPrice > 0);

        etherPriceInUSD = parseInt(_price, 5);

        priceUpdateAt = block.timestamp;

        NewPriceTicker(_price);
    }

    function mintInternal(address _address, uint256 _tokenAmount) internal returns (uint256) {
        uint256 mintedAmount = token.mint(_address, _tokenAmount);

        require(mintedAmount == _tokenAmount);

        soldTokens = soldTokens.add(_tokenAmount);
        if (maxTokenSupply > 0) {
            require(maxTokenSupply >= soldTokens);
        }

        return _tokenAmount;
    }

    function transferEthers() internal;

    function parseInt(string _a, uint _b) internal pure returns (uint) {
        bytes memory bresult = bytes(_a);
        uint res = 0;
        bool decimals = false;
        for (uint i = 0; i < bresult.length; i++) {
            if ((bresult[i] >= 48) && (bresult[i] <= 57)) {
                if (decimals) {
                    if (_b == 0) break;
                    else _b--;
                }
                res *= 10;
                res += uint(bresult[i]) - 48;
            } else if (bresult[i] == 46) decimals = true;
        }
        if (_b > 0) res *= 10 ** _b;
        return res;
    }
}


contract TokenAllocation is Ownable {
    using SafeERC20 for ERC20Basic;
    using SafeMath for uint256;

    address public ecosystemIncentive = 0xd339D9aeDFFa244E09874D65290c09d64b2356E0;
    address public marketingAndBounty = 0x26d6EF95A51BF0A2048Def4Fb7c548c3BDE37410;
    address public liquidityFund = 0x3D458b6f9024CDD9A2a7528c2E6451DD3b29e4cc;
    address public treasure = 0x00dEaFC5959Dd0E164bB00D06B08d972A276bf8E;
    address public amirShaikh = 0x31b17e7a2F86d878429C03f3916d17555C0d4884;
    address public sadiqHameed = 0x27B5cb71ff083Bd6a34764fBf82700b3669137f3;
    address public omairLatif = 0x92Db818bF10Bf3BfB73942bbB1f184274aA63833;

    uint256 public icoEndTime;

    address public vestingApplicature;
    address public vestingSimonCocking;
    address public vestingNathanChristian;
    address public vestingEdwinVanBerg;

    mapping(address => bool) public tokenInited;
    address[] public vestings;

    event VestingCreated(
        address _vesting,
        address _beneficiary,
        uint256 _start,
        uint256 _cliff,
        uint256 _duration,
        uint256 _periods,
        bool _revocable
    );

    event VestingRevoked(address _vesting);

    function setICOEndTime(uint256 _icoEndTime) public onlyOwner {
        icoEndTime = _icoEndTime;
    }

    function initVesting() public onlyOwner() {
        require(vestingApplicature == address(0) &&
        vestingSimonCocking == address(0) &&
        vestingNathanChristian == address(0) &&
        vestingEdwinVanBerg == address(0) &&
        icoEndTime != 0
        );

        uint256 oneYearAfterIcoEnd = icoEndTime.add(1 years);

        vestingApplicature = createVesting(
            0x760864dcdC58FDA80dB6883ce442B6ce44921Cf9, oneYearAfterIcoEnd, 0, 1 years, 2, false
        );

        vestingSimonCocking = createVesting(
            0x7f438d78a51886B24752941ba98Cc00aBA217495, oneYearAfterIcoEnd, 0, 1 years, 2, true
        );

        vestingNathanChristian = createVesting(
            0xfD86B8B016de558Fe39B1697cBf525592A233B2c, oneYearAfterIcoEnd, 0, 1 years, 2, true
        );

        vestingEdwinVanBerg = createVesting(
            0x2451A73F35874028217bC833462CCd90c72dbE6D, oneYearAfterIcoEnd, 0, 1 years, 2, true
        );
    }

    function allocate(MintingERC20 token) public onlyOwner() {
        require(tokenInited[token] == false);

        tokenInited[token] = true;

        require(vestingApplicature != address(0));
        require(vestingSimonCocking != address(0));
        require(vestingNathanChristian != address(0));
        require(vestingEdwinVanBerg != address(0));

        uint256 tokenPrecision = uint256(10) ** uint256(token.decimals());

        // allocate funds
        token.mint(ecosystemIncentive, 200000000 * tokenPrecision);
        token.mint(marketingAndBounty, 50000000 * tokenPrecision);
        token.mint(liquidityFund, 50000000 * tokenPrecision);
        token.mint(treasure, 200000000 * tokenPrecision);

        // allocate funds to founders
        token.mint(amirShaikh, 73350000 * tokenPrecision);
        token.mint(sadiqHameed, 36675000 * tokenPrecision);
        token.mint(omairLatif, 36675000 * tokenPrecision);

        // allocate funds to advisors
        token.mint(vestingApplicature, 1500000 * tokenPrecision);
        token.mint(vestingSimonCocking, 750000 * tokenPrecision);
        token.mint(vestingNathanChristian, 750000 * tokenPrecision);
        token.mint(vestingEdwinVanBerg, 300000 * tokenPrecision);
    }

    function createVesting(
        address _beneficiary, uint256 _start, uint256 _cliff, uint256 _duration, uint256 _periods, bool _revocable
    ) public onlyOwner() returns (PeriodicTokenVesting) {
        PeriodicTokenVesting vesting = new PeriodicTokenVesting(
            _beneficiary, _start, _cliff, _duration, _periods, _revocable
        );

        vestings.push(vesting);

        VestingCreated(vesting, _beneficiary, _start, _cliff, _duration, _periods, _revocable);

        return vesting;
    }

    function revokeVesting(PeriodicTokenVesting _vesting, MintingERC20 token) public onlyOwner() {
        _vesting.revoke(token);

        VestingRevoked(_vesting);
    }
}


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 TokenVesting is Ownable {
  using SafeMath for uint256;
  using SafeERC20 for ERC20Basic;

  event Released(uint256 amount);
  event Revoked();

  // beneficiary of tokens after they are released
  address public beneficiary;

  uint256 public cliff;
  uint256 public start;
  uint256 public duration;

  bool public revocable;

  mapping (address => uint256) public released;
  mapping (address => bool) public revoked;

  /**
   * @dev Creates a vesting contract that vests its balance of any ERC20 token to the
   * _beneficiary, gradually in a linear fashion until _start + _duration. By then all
   * of the balance will have vested.
   * @param _beneficiary address of the beneficiary to whom vested tokens are transferred
   * @param _cliff duration in seconds of the cliff in which tokens will begin to vest
   * @param _duration duration in seconds of the period in which the tokens will vest
   * @param _revocable whether the vesting is revocable or not
   */
  function TokenVesting(address _beneficiary, uint256 _start, uint256 _cliff, uint256 _duration, bool _revocable) public {
    require(_beneficiary != address(0));
    require(_cliff <= _duration);

    beneficiary = _beneficiary;
    revocable = _revocable;
    duration = _duration;
    cliff = _start.add(_cliff);
    start = _start;
  }

  /**
   * @notice Transfers vested tokens to beneficiary.
   * @param token ERC20 token which is being vested
   */
  function release(ERC20Basic token) public {
    uint256 unreleased = releasableAmount(token);

    require(unreleased > 0);

    released[token] = released[token].add(unreleased);

    token.safeTransfer(beneficiary, unreleased);

    Released(unreleased);
  }

  /**
   * @notice Allows the owner to revoke the vesting. Tokens already vested
   * remain in the contract, the rest are returned to the owner.
   * @param token ERC20 token which is being vested
   */
  function revoke(ERC20Basic token) public onlyOwner {
    require(revocable);
    require(!revoked[token]);

    uint256 balance = token.balanceOf(this);

    uint256 unreleased = releasableAmount(token);
    uint256 refund = balance.sub(unreleased);

    revoked[token] = true;

    token.safeTransfer(owner, refund);

    Revoked();
  }

  /**
   * @dev Calculates the amount that has already vested but hasn't been released yet.
   * @param token ERC20 token which is being vested
   */
  function releasableAmount(ERC20Basic token) public view returns (uint256) {
    return vestedAmount(token).sub(released[token]);
  }

  /**
   * @dev Calculates the amount that has already vested.
   * @param token ERC20 token which is being vested
   */
  function vestedAmount(ERC20Basic token) public view returns (uint256) {
    uint256 currentBalance = token.balanceOf(this);
    uint256 totalBalance = currentBalance.add(released[token]);

    if (now < cliff) {
      return 0;
    } else if (now >= start.add(duration) || revoked[token]) {
      return totalBalance;
    } else {
      return totalBalance.mul(now.sub(start)).div(duration);
    }
  }
}


contract PeriodicTokenVesting is TokenVesting {
    uint256 public periods;

    function PeriodicTokenVesting(
        address _beneficiary, uint256 _start, uint256 _cliff, uint256 _duration, uint256 _periods, bool _revocable
    )
        public TokenVesting(_beneficiary, _start, _cliff, _duration, _revocable)
    {
        periods = _periods;
    }

    /**
    * @dev Calculates the amount that has already vested.
    * @param token ERC20 token which is being vested
    */
    function vestedAmount(ERC20Basic token) public view returns (uint256) {
        uint256 currentBalance = token.balanceOf(this);
        uint256 totalBalance = currentBalance.add(released[token]);

        if (now < cliff) {
            return 0;
        } else if (now >= start.add(duration * periods) || revoked[token]) {
            return totalBalance;
        } else {

            uint256 periodTokens = totalBalance.div(periods);

            uint256 periodsOver = now.sub(start).div(duration) + 1;

            if (periodsOver >= periods) {
                return totalBalance;
            }

            return periodTokens.mul(periodsOver);
        }
    }
}


contract PrivateSale is SellableToken {

    uint256 public price;
    uint256 public discount;
    SellableToken public crowdSale;

    function PrivateSale(
        address _token,
        address _etherHolder,
        uint256 _startTime,
        uint256 _endTime,
        uint256 _maxTokenSupply, //14000000000000000000000000
        uint256 _etherPriceInUSD
    ) public SellableToken(
        _token,
        _etherHolder,
        _startTime,
        _endTime,
        _maxTokenSupply,
        _etherPriceInUSD
    ) {
        price = 24800;// $0.2480 * 10 ^ 5
        discount = 75;// $75%
    }

    function changeSalePeriod(uint256 _start, uint256 _end) public onlyOwner {
        if (_start != 0 && _start < _end) {
            startTime = _start;
            endTime = _end;
        }
    }

    function isActive() public view returns (bool) {
        if (soldTokens == maxTokenSupply) {
            return false;
        }

        return withinPeriod();
    }

    function withinPeriod() public view returns (bool) {
        return block.timestamp >= startTime && block.timestamp <= endTime;
    }

    function calculateTokensAmount(uint256 _value) public view returns (uint256 tokenAmount, uint256 usdAmount) {
        if (_value == 0) {
            return (0, 0);
        }

        usdAmount = _value.mul(etherPriceInUSD);

        tokenAmount = usdAmount.div(price * (100 - discount) / 100);

        usdAmount = usdAmount.div(uint256(10) ** 18);

        if (usdAmount < minPurchase) {
            return (0, 0);
        }
    }

    function calculateEthersAmount(uint256 _tokens) public view returns (uint256 ethers, uint256 usdAmount) {
        if (_tokens == 0) {
            return (0, 0);
        }

        usdAmount = _tokens.mul((price * (100 - discount) / 100));
        ethers = usdAmount.div(etherPriceInUSD);

        if (ethers < getMinEthersInvestment()) {
            return (0, 0);
        }

        usdAmount = usdAmount.div(uint256(10) ** 18);
    }

    function getStats(uint256 _ethPerBtc) public view returns (
        uint256 start,
        uint256 end,
        uint256 sold,
        uint256 maxSupply,
        uint256 min,
        uint256 tokensPerEth,
        uint256 tokensPerBtc
    ) {
        start = startTime;
        end = endTime;
        sold = soldTokens;
        maxSupply = maxTokenSupply;
        min = minPurchase;
        uint256 usd;
        (tokensPerEth, usd) = calculateTokensAmount(1 ether);
        (tokensPerBtc, usd) = calculateTokensAmount(_ethPerBtc);
    }

    function setCrowdSale(address _crowdSale) public onlyOwner {
        require(_crowdSale != address(0));

        crowdSale = SellableToken(_crowdSale);
    }

    function moveUnsoldTokens() public onlyOwner {
        require(address(crowdSale) != address(0) && now >= endTime && !isActive() && maxTokenSupply > soldTokens);

        crowdSale.updatePreICOMaxTokenSupply(maxTokenSupply.sub(soldTokens));
        maxTokenSupply = soldTokens;
    }

    function updatePreICOMaxTokenSupply(uint256) public {
        require(false);
    }

    function isTransferAllowed(address, uint256) public view returns (bool) {
        return false;
    }

    function buy(address _address, uint256 _value) internal returns (bool) {
        if (_value == 0 || _address == address(0)) {
            return false;
        }

        uint256 tokenAmount;
        uint256 usdAmount;

        (tokenAmount, usdAmount) = calculateTokensAmount(_value);

        uint256 mintedAmount = mintInternal(_address, tokenAmount);
        collectedUSD = collectedUSD.add(usdAmount);
        require(usdAmount > 0 && mintedAmount > 0);

        collectedEthers = collectedEthers.add(_value);
        etherBalances[_address] = etherBalances[_address].add(_value);

        token.increaseLockedBalance(_address, mintedAmount);

        transferEthers();

        Contribution(_address, _value, tokenAmount);
        return true;
    }

    function transferEthers() internal {
        etherHolder.transfer(this.balance);
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_privateSale","type":"address"}],"name":"setPrivateSale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"creationBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"crowdSaleEndTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"_amount","type":"uint256"}],"name":"burnInvestorTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_locked","type":"bool"}],"name":"setLocked","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"_tokens","type":"uint256"}],"name":"increaseLockedBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_minter","type":"address"}],"name":"removeMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_transferFrozen","type":"bool"}],"name":"freezing","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_amount","type":"uint256"}],"name":"mint","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"standard","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_from","type":"address"},{"name":"_value","type":"uint256"}],"name":"isTransferAllowed","outputs":[{"name":"status","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"crowdSale","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newMinter","type":"address"}],"name":"addMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"transferFrozen","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"privateSale","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"lockedBalancesReleasedAfterOneYear","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"locked","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"burnUnsoldTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"maxSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"minters","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_crowdSale","type":"address"}],"name":"setCrowdSale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_locked","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"burnedTokens","type":"uint256"}],"name":"MaxSupplyBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]

6060604052600d805460a060020a60ff021916905534156200002057600080fd5b60405160208062001a3583398101604052808051600b54909250600091506040805190810160405280600681526020017f47696742697400000000000000000000000000000000000000000000000000008152506012604080519081016040908152600482527f4742544300000000000000000000000000000000000000000000000000000000602083015260038054600160a060020a03191633600160a060020a031617905560009087908790869086908690869086908051908101604052600981527f455243323020302e310000000000000000000000000000000000000000000000602082015260089080516200011f929160200190620002f5565b506009805460ff1916821515179055600186905581156200015c57600154600160a060020a03331660009081526020819052604090205562000179565b600154600160a060020a0330166000908152602081905260409020555b60068580516200018e929160200190620002f5565b506007838051620001a4929160200190620002f5565b50506005805460ff191660ff949094169390931790925550504360045550604090508051908101604052601081527f4d696e74696e67455243323020302e3100000000000000000000000000000000602082015260089080516200020d929160200190620002f5565b505050600160a060020a0333166000908152600a602052604090819020805460ff19166001179055600b9490945550919250829150505190810160405260088082527f4742544320302e31000000000000000000000000000000000000000000000000602083015290805162000288929160200190620002f5565b50600554620002b190633b9aca009060ff16600a0a6401000000006200113f620002bb82021704565b600b55506200039a565b600080831515620002d05760009150620002ee565b50828202828482811515620002e157fe5b0414620002ea57fe5b8091505b5092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200033857805160ff191683800117855562000368565b8280016001018555821562000368579182015b82811115620003685782518255916020019190600101906200034b565b50620003769291506200037a565b5090565b6200039791905b8082111562000376576000815560010162000381565b90565b61168b80620003aa6000396000f3006060604052600436106101925763ffffffff60e060020a60003504166306fdde038114610197578063095ea7b31461022157806309f68e9614610257578063176345141461027857806318160ddd1461029d57806318e3d998146102b05780631d1fe108146102c3578063211e28b6146102e557806323b872dd146102fd5780632a6adcec146103255780633092afd514610347578063313ce5671461036657806336a23dbf1461038f57806340c10f19146103a75780635a3b7e42146103c95780635eae177c146103dc57806366188463146103fe57806370a08231146104205780637770bd151461043f5780638da5cb5b1461046e57806395d89b4114610481578063983b2d5614610494578063a9059cbb146104b3578063ade4637a146104d5578063ba1f879f146104e8578063bace5bdb146104fb578063cf3090121461051a578063d0479abc1461052d578063d5abeb0114610543578063d73dd62314610556578063dd62ed3e14610578578063f2fde38b1461059d578063f46eccc4146105bc578063f4b5cbc4146105db575b600080fd5b34156101a257600080fd5b6101aa6105fa565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156101e65780820151838201526020016101ce565b50505050905090810190601f1680156102135780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561022c57600080fd5b610243600160a060020a0360043516602435610698565b604051901515815260200160405180910390f35b341561026257600080fd5b610276600160a060020a03600435166106be565b005b341561028357600080fd5b61028b61071d565b60405190815260200160405180910390f35b34156102a857600080fd5b61028b610723565b34156102bb57600080fd5b61028b610729565b34156102ce57600080fd5b61028b600160a060020a036004351660243561072f565b34156102f057600080fd5b6102766004351515610823565b341561030857600080fd5b610243600160a060020a0360043581169060243516604435610851565b341561033057600080fd5b610276600160a060020a036004351660243561088a565b341561035257600080fd5b610276600160a060020a0360043516610934565b341561037157600080fd5b610379610970565b60405160ff909116815260200160405180910390f35b341561039a57600080fd5b6102766004351515610979565b34156103b257600080fd5b61028b600160a060020a03600435166024356109d4565b34156103d457600080fd5b6101aa610ace565b34156103e757600080fd5b610243600160a060020a0360043516602435610b39565b341561040957600080fd5b610243600160a060020a0360043516602435610d20565b341561042b57600080fd5b61028b600160a060020a0360043516610d3d565b341561044a57600080fd5b610452610d58565b604051600160a060020a03909116815260200160405180910390f35b341561047957600080fd5b610452610d67565b341561048c57600080fd5b6101aa610d76565b341561049f57600080fd5b610276600160a060020a0360043516610de1565b34156104be57600080fd5b610243600160a060020a0360043516602435610e20565b34156104e057600080fd5b610243610e41565b34156104f357600080fd5b610452610e62565b341561050657600080fd5b61028b600160a060020a0360043516610e71565b341561052557600080fd5b610243610e83565b341561053857600080fd5b610276600435610e8c565b341561054e57600080fd5b61028b610f19565b341561056157600080fd5b610243600160a060020a0360043516602435610f1f565b341561058357600080fd5b61028b600160a060020a0360043581169060243516610f3c565b34156105a857600080fd5b610276600160a060020a0360043516610f67565b34156105c757600080fd5b610243600160a060020a0360043516611002565b34156105e657600080fd5b610276600160a060020a0360043516611017565b60068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106905780601f1061066557610100808354040283529160200191610690565b820191906000526020600020905b81548152906001019060200180831161067357829003601f168201915b505050505081565b600042600e54111515156106ab57600080fd5b6106b583836110d2565b90505b92915050565b60035433600160a060020a039081169116146106d957600080fd5b600160a060020a03811615156106ee57600080fd5b600d805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60045481565b60015490565b600e5481565b600c54600090600160a060020a03161580159061075a5750600c5433600160a060020a039081169116145b151561076557600080fd5b600e54421161077357600080fd5b600160a060020a03831660009081526020819052604090205482111561079857600080fd5b600160a060020a0383166000908152602081905260409020546107c1908363ffffffff6110f216565b600160a060020a0384166000908152602081905260409020556001546107ed908363ffffffff6110f216565b6001556000600160a060020a0384166000805160206116408339815191528460405190815260200160405180910390a350919050565b60035433600160a060020a0390811691161461083e57600080fd5b6009805460ff1916911515919091179055565b600042600e541115801561086a575061086a8483610b39565b151561087557600080fd5b610880848484611104565b90505b9392505050565b600d54600160a060020a0316158015906108b25750600d5433600160a060020a039081169116145b806108e05750600c54600160a060020a0316158015906108e05750600c5433600160a060020a039081169116145b15156108eb57600080fd5b600160a060020a0382166000908152600f6020526040902054610914908263ffffffff61112516565b600160a060020a039092166000908152600f602052604090209190915550565b60035433600160a060020a0390811691161461094f57600080fd5b600160a060020a03166000908152600a60205260409020805460ff19169055565b60055460ff1681565b60035433600160a060020a0390811691161461099457600080fd5b600d8054911515740100000000000000000000000000000000000000000274ff000000000000000000000000000000000000000019909216919091179055565b600160a060020a0333166000908152600a602052604081205460ff1615156001146109fe57600080fd5b60095460ff16151560011415610a16575060006106b8565b811515610a25575060006106b8565b600b54600154610a3b908463ffffffff61112516565b1115610a49575060006106b8565b600154610a5c908363ffffffff61112516565b600155600160a060020a038316600090815260208190526040902054610a88908363ffffffff61112516565b600160a060020a0384166000818152602081905260408082209390935590916000805160206116408339815191529085905190815260200160405180910390a350919050565b60088054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106905780601f1061066557610100808354040283529160200191610690565b6000806000806000806000806000610b508b610d3d565b600d5490985074010000000000000000000000000000000000000000900460ff16151560011480610b8057508988105b15610b8e5760009850610d12565b600160a060020a038b166000908152600f6020526040812054975087118015610bc5575086610bc3898c63ffffffff6110f216565b105b15610c6157600e546301e13380810196501580610be157508542105b15610bef5760009850610d12565b610bff428763ffffffff6110f216565b945062278d0085049350600c841115610c1757600c93505b600c87049250610c2d838563ffffffff61113f16565b9150610c3f878363ffffffff6110f216565b905080610c52898c63ffffffff6110f216565b1015610c615760009850610d12565b600e5442108015610c7c5750600c54600160a060020a031615155b8015610cff5750600c54600160a060020a0316635eae177c8c8c60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610ce257600080fd5b6102c65a03f11515610cf357600080fd5b50505060405180511590505b15610d0d5760009850610d12565b600198505b505050505050505092915050565b600042600e5411151515610d3357600080fd5b6106b5838361116a565b600160a060020a031660009081526020819052604090205490565b600c54600160a060020a031681565b600354600160a060020a031681565b60078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106905780601f1061066557610100808354040283529160200191610690565b60035433600160a060020a03908116911614610dfc57600080fd5b600160a060020a03166000908152600a60205260409020805460ff19166001179055565b6000610e2c3383610b39565b1515610e3757600080fd5b6106b5838361118a565b600d5474010000000000000000000000000000000000000000900460ff1681565b600d54600160a060020a031681565b600f6020526000908152604090205481565b60095460ff1681565b600c54600160a060020a031615801590610eb45750600c5433600160a060020a039081169116145b1515610ebf57600080fd5b600e544211610ecd57600080fd5b600b54610ee0908263ffffffff6110f216565b600b557f7174e2dc81bf5de8f9bf1dd00b511763f2ffb109c06de0f447be45348cc75af58160405190815260200160405180910390a150565b600b5481565b600042600e5411151515610f3257600080fd5b6106b583836111a7565b600160a060020a03918216600090815260026020908152604080832093909416825291909152205490565b60035433600160a060020a03908116911614610f8257600080fd5b600160a060020a0381161515610f9757600080fd5b600354600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600a6020526000908152604090205460ff1681565b60035433600160a060020a0390811691161461103257600080fd5b600160a060020a038116151561104757600080fd5b600c805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03838116919091179182905516633197cbb66000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156110b257600080fd5b6102c65a03f115156110c357600080fd5b5050506040518051600e555050565b60095460009060ff16156110e8575060006106b8565b6106b583836111c7565b6000828211156110fe57fe5b50900390565b60095460009060ff161561111a57506000610883565b610880848484611233565b60008282018381101561113457fe5b8091505b5092915050565b6000808315156111525760009150611138565b5082820282848281151561116257fe5b041461113457fe5b60095460009060ff1615611180575060006106b8565b6106b583836113a1565b60095460009060ff161561119d57600080fd5b6106b5838361149b565b60095460009060ff16156111bd575060006106b8565b6106b5838361159b565b600160a060020a03338116600081815260026020908152604080832094871680845294909152808220859055909291907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a350600192915050565b6000600160a060020a038316151561124a57600080fd5b600160a060020a03841660009081526020819052604090205482111561126f57600080fd5b600160a060020a03808516600090815260026020908152604080832033909416835292905220548211156112a257600080fd5b600160a060020a0384166000908152602081905260409020546112cb908363ffffffff6110f216565b600160a060020a038086166000908152602081905260408082209390935590851681522054611300908363ffffffff61112516565b600160a060020a0380851660009081526020818152604080832094909455878316825260028152838220339093168252919091522054611346908363ffffffff6110f216565b600160a060020a03808616600081815260026020908152604080832033861684529091529081902093909355908516916000805160206116408339815191529085905190815260200160405180910390a35060019392505050565b600160a060020a033381166000908152600260209081526040808320938616835292905290812054808311156113fe57600160a060020a033381166000908152600260209081526040808320938816835292905290812055611435565b61140e818463ffffffff6110f216565b600160a060020a033381166000908152600260209081526040808320938916835292905220555b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020547f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925915190815260200160405180910390a35060019392505050565b6000600160a060020a03831615156114b257600080fd5b600160a060020a0333166000908152602081905260409020548211156114d757600080fd5b600160a060020a033316600090815260208190526040902054611500908363ffffffff6110f216565b600160a060020a033381166000908152602081905260408082209390935590851681522054611535908363ffffffff61112516565b60008085600160a060020a0316600160a060020a031681526020019081526020016000208190555082600160a060020a031633600160a060020a03166000805160206116408339815191528460405190815260200160405180910390a350600192915050565b600160a060020a0333811660009081526002602090815260408083209386168352929052908120546115d3908363ffffffff61112516565b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020849055919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591905190815260200160405180910390a3506001929150505600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a72305820952cb2b31753a4a8295f98061add2ace92fba423d54132081121701fca0dfcb600290000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6060604052600436106101925763ffffffff60e060020a60003504166306fdde038114610197578063095ea7b31461022157806309f68e9614610257578063176345141461027857806318160ddd1461029d57806318e3d998146102b05780631d1fe108146102c3578063211e28b6146102e557806323b872dd146102fd5780632a6adcec146103255780633092afd514610347578063313ce5671461036657806336a23dbf1461038f57806340c10f19146103a75780635a3b7e42146103c95780635eae177c146103dc57806366188463146103fe57806370a08231146104205780637770bd151461043f5780638da5cb5b1461046e57806395d89b4114610481578063983b2d5614610494578063a9059cbb146104b3578063ade4637a146104d5578063ba1f879f146104e8578063bace5bdb146104fb578063cf3090121461051a578063d0479abc1461052d578063d5abeb0114610543578063d73dd62314610556578063dd62ed3e14610578578063f2fde38b1461059d578063f46eccc4146105bc578063f4b5cbc4146105db575b600080fd5b34156101a257600080fd5b6101aa6105fa565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156101e65780820151838201526020016101ce565b50505050905090810190601f1680156102135780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561022c57600080fd5b610243600160a060020a0360043516602435610698565b604051901515815260200160405180910390f35b341561026257600080fd5b610276600160a060020a03600435166106be565b005b341561028357600080fd5b61028b61071d565b60405190815260200160405180910390f35b34156102a857600080fd5b61028b610723565b34156102bb57600080fd5b61028b610729565b34156102ce57600080fd5b61028b600160a060020a036004351660243561072f565b34156102f057600080fd5b6102766004351515610823565b341561030857600080fd5b610243600160a060020a0360043581169060243516604435610851565b341561033057600080fd5b610276600160a060020a036004351660243561088a565b341561035257600080fd5b610276600160a060020a0360043516610934565b341561037157600080fd5b610379610970565b60405160ff909116815260200160405180910390f35b341561039a57600080fd5b6102766004351515610979565b34156103b257600080fd5b61028b600160a060020a03600435166024356109d4565b34156103d457600080fd5b6101aa610ace565b34156103e757600080fd5b610243600160a060020a0360043516602435610b39565b341561040957600080fd5b610243600160a060020a0360043516602435610d20565b341561042b57600080fd5b61028b600160a060020a0360043516610d3d565b341561044a57600080fd5b610452610d58565b604051600160a060020a03909116815260200160405180910390f35b341561047957600080fd5b610452610d67565b341561048c57600080fd5b6101aa610d76565b341561049f57600080fd5b610276600160a060020a0360043516610de1565b34156104be57600080fd5b610243600160a060020a0360043516602435610e20565b34156104e057600080fd5b610243610e41565b34156104f357600080fd5b610452610e62565b341561050657600080fd5b61028b600160a060020a0360043516610e71565b341561052557600080fd5b610243610e83565b341561053857600080fd5b610276600435610e8c565b341561054e57600080fd5b61028b610f19565b341561056157600080fd5b610243600160a060020a0360043516602435610f1f565b341561058357600080fd5b61028b600160a060020a0360043581169060243516610f3c565b34156105a857600080fd5b610276600160a060020a0360043516610f67565b34156105c757600080fd5b610243600160a060020a0360043516611002565b34156105e657600080fd5b610276600160a060020a0360043516611017565b60068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106905780601f1061066557610100808354040283529160200191610690565b820191906000526020600020905b81548152906001019060200180831161067357829003601f168201915b505050505081565b600042600e54111515156106ab57600080fd5b6106b583836110d2565b90505b92915050565b60035433600160a060020a039081169116146106d957600080fd5b600160a060020a03811615156106ee57600080fd5b600d805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60045481565b60015490565b600e5481565b600c54600090600160a060020a03161580159061075a5750600c5433600160a060020a039081169116145b151561076557600080fd5b600e54421161077357600080fd5b600160a060020a03831660009081526020819052604090205482111561079857600080fd5b600160a060020a0383166000908152602081905260409020546107c1908363ffffffff6110f216565b600160a060020a0384166000908152602081905260409020556001546107ed908363ffffffff6110f216565b6001556000600160a060020a0384166000805160206116408339815191528460405190815260200160405180910390a350919050565b60035433600160a060020a0390811691161461083e57600080fd5b6009805460ff1916911515919091179055565b600042600e541115801561086a575061086a8483610b39565b151561087557600080fd5b610880848484611104565b90505b9392505050565b600d54600160a060020a0316158015906108b25750600d5433600160a060020a039081169116145b806108e05750600c54600160a060020a0316158015906108e05750600c5433600160a060020a039081169116145b15156108eb57600080fd5b600160a060020a0382166000908152600f6020526040902054610914908263ffffffff61112516565b600160a060020a039092166000908152600f602052604090209190915550565b60035433600160a060020a0390811691161461094f57600080fd5b600160a060020a03166000908152600a60205260409020805460ff19169055565b60055460ff1681565b60035433600160a060020a0390811691161461099457600080fd5b600d8054911515740100000000000000000000000000000000000000000274ff000000000000000000000000000000000000000019909216919091179055565b600160a060020a0333166000908152600a602052604081205460ff1615156001146109fe57600080fd5b60095460ff16151560011415610a16575060006106b8565b811515610a25575060006106b8565b600b54600154610a3b908463ffffffff61112516565b1115610a49575060006106b8565b600154610a5c908363ffffffff61112516565b600155600160a060020a038316600090815260208190526040902054610a88908363ffffffff61112516565b600160a060020a0384166000818152602081905260408082209390935590916000805160206116408339815191529085905190815260200160405180910390a350919050565b60088054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106905780601f1061066557610100808354040283529160200191610690565b6000806000806000806000806000610b508b610d3d565b600d5490985074010000000000000000000000000000000000000000900460ff16151560011480610b8057508988105b15610b8e5760009850610d12565b600160a060020a038b166000908152600f6020526040812054975087118015610bc5575086610bc3898c63ffffffff6110f216565b105b15610c6157600e546301e13380810196501580610be157508542105b15610bef5760009850610d12565b610bff428763ffffffff6110f216565b945062278d0085049350600c841115610c1757600c93505b600c87049250610c2d838563ffffffff61113f16565b9150610c3f878363ffffffff6110f216565b905080610c52898c63ffffffff6110f216565b1015610c615760009850610d12565b600e5442108015610c7c5750600c54600160a060020a031615155b8015610cff5750600c54600160a060020a0316635eae177c8c8c60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610ce257600080fd5b6102c65a03f11515610cf357600080fd5b50505060405180511590505b15610d0d5760009850610d12565b600198505b505050505050505092915050565b600042600e5411151515610d3357600080fd5b6106b5838361116a565b600160a060020a031660009081526020819052604090205490565b600c54600160a060020a031681565b600354600160a060020a031681565b60078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106905780601f1061066557610100808354040283529160200191610690565b60035433600160a060020a03908116911614610dfc57600080fd5b600160a060020a03166000908152600a60205260409020805460ff19166001179055565b6000610e2c3383610b39565b1515610e3757600080fd5b6106b5838361118a565b600d5474010000000000000000000000000000000000000000900460ff1681565b600d54600160a060020a031681565b600f6020526000908152604090205481565b60095460ff1681565b600c54600160a060020a031615801590610eb45750600c5433600160a060020a039081169116145b1515610ebf57600080fd5b600e544211610ecd57600080fd5b600b54610ee0908263ffffffff6110f216565b600b557f7174e2dc81bf5de8f9bf1dd00b511763f2ffb109c06de0f447be45348cc75af58160405190815260200160405180910390a150565b600b5481565b600042600e5411151515610f3257600080fd5b6106b583836111a7565b600160a060020a03918216600090815260026020908152604080832093909416825291909152205490565b60035433600160a060020a03908116911614610f8257600080fd5b600160a060020a0381161515610f9757600080fd5b600354600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600a6020526000908152604090205460ff1681565b60035433600160a060020a0390811691161461103257600080fd5b600160a060020a038116151561104757600080fd5b600c805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03838116919091179182905516633197cbb66000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156110b257600080fd5b6102c65a03f115156110c357600080fd5b5050506040518051600e555050565b60095460009060ff16156110e8575060006106b8565b6106b583836111c7565b6000828211156110fe57fe5b50900390565b60095460009060ff161561111a57506000610883565b610880848484611233565b60008282018381101561113457fe5b8091505b5092915050565b6000808315156111525760009150611138565b5082820282848281151561116257fe5b041461113457fe5b60095460009060ff1615611180575060006106b8565b6106b583836113a1565b60095460009060ff161561119d57600080fd5b6106b5838361149b565b60095460009060ff16156111bd575060006106b8565b6106b5838361159b565b600160a060020a03338116600081815260026020908152604080832094871680845294909152808220859055909291907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a350600192915050565b6000600160a060020a038316151561124a57600080fd5b600160a060020a03841660009081526020819052604090205482111561126f57600080fd5b600160a060020a03808516600090815260026020908152604080832033909416835292905220548211156112a257600080fd5b600160a060020a0384166000908152602081905260409020546112cb908363ffffffff6110f216565b600160a060020a038086166000908152602081905260408082209390935590851681522054611300908363ffffffff61112516565b600160a060020a0380851660009081526020818152604080832094909455878316825260028152838220339093168252919091522054611346908363ffffffff6110f216565b600160a060020a03808616600081815260026020908152604080832033861684529091529081902093909355908516916000805160206116408339815191529085905190815260200160405180910390a35060019392505050565b600160a060020a033381166000908152600260209081526040808320938616835292905290812054808311156113fe57600160a060020a033381166000908152600260209081526040808320938816835292905290812055611435565b61140e818463ffffffff6110f216565b600160a060020a033381166000908152600260209081526040808320938916835292905220555b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020547f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925915190815260200160405180910390a35060019392505050565b6000600160a060020a03831615156114b257600080fd5b600160a060020a0333166000908152602081905260409020548211156114d757600080fd5b600160a060020a033316600090815260208190526040902054611500908363ffffffff6110f216565b600160a060020a033381166000908152602081905260408082209390935590851681522054611535908363ffffffff61112516565b60008085600160a060020a0316600160a060020a031681526020019081526020016000208190555082600160a060020a031633600160a060020a03166000805160206116408339815191528460405190815260200160405180910390a350600192915050565b600160a060020a0333811660009081526002602090815260408083209386168352929052908120546115d3908363ffffffff61112516565b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020849055919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591905190815260200160405180910390a3506001929150505600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a72305820952cb2b31753a4a8295f98061add2ace92fba423d54132081121701fca0dfcb60029

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _locked (bool): False

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000


Swarm Source

bzzr://952cb2b31753a4a8295f98061add2ace92fba423d54132081121701fca0dfcb6

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.