Contract 0x8f8221afbb33998d8584a2b05749ba73c37a938a

 

TxHash Block Age From To Value [TxFee]
0xea0dbb8bda6f103a4731f76a728336b113c98626667fe4e30b1c83c85893b30972511214 hrs 33 mins ago0x28656ca7dfebf94b6746e69cedac1f64e0ee674f IN  RequestNetwork0 Ether0.00044744
0xba5f3619e0490ab5dd1d3bf90d73b5f3b1c1d76b53bfc2ee8c80b1b13e0eed7772510664 hrs 57 mins ago0xf9e0b1fab09e954c689745037789cd23a21ddfc5 IN  RequestNetwork0 Ether0.00104744
0x93eba689451b963f498fd4625b7094be107cfbe49188c46e3e94f6b2f2f5e9c272510575 hrs 1 min ago0xf9e0b1fab09e954c689745037789cd23a21ddfc5 IN  RequestNetwork0 Ether0.001
0xae1d459dd2edb178ef75d765cebdbc3984cb8b1e02ebe4e412e72bd69d7bcd8672506847 hrs 5 mins ago0x4038009e27459a1aab2302785aecb8ceb06406e1 IN  RequestNetwork0 Ether0.0003025512
0x13b7e5507ae6ed9ea178c21aff09cee53961d8699a2724e7ef29d7407346ced672506547 hrs 15 mins ago0x986ccf5234d9cfbb25246f1a5bfa51f4ccfcb308 IN  RequestNetwork0 Ether0.00044872
0x6928f83ea21bb45aa5d9ec8fd22b30d216bf99574e57a5e2b78c04e267bfbc3a72505338 hrs 2 mins ago0x9b75c700fb9e3ee4e510969fc2bee74253355d64 IN  RequestNetwork0 Ether0.001529628
0x54ad9e7d2ac87b4f3e303b3a7c3d51bb294473b5d3a6d3b18802ac3a42a2e8e572504798 hrs 23 mins ago0x3dcf2a41860a896340fbc2c983d1176d3edc8591 IN  RequestNetwork0 Ether0.00044616
0x865736ca558883029cbe358ff4adae59faadc265150d36387f292e5841214bd372504618 hrs 30 mins ago0xca616a4c17168ae25ed6c3da455d282a94945a6a IN  RequestNetwork0 Ether0.00018718
0x995f2893966ddfcc1cc47599ced965fc3548ee70de9c65fa2c6c749a0f140c0d72503948 hrs 50 mins ago0x8bf4aa7e91c235ddee76a6909517e57aad11a6e4 IN  RequestNetwork0 Ether0.000783468
0xfbed73d7ef4951aa9985c6f1d4704e8e96c5a6838d7fdfab033ec389581cc9e572503739 hrs ago0x2702a2c9926f1218817639479b3081f09b8b8c90 IN  RequestNetwork0 Ether0.0002275416
0x3f3f44ca3d78796a86770c4d8ad4a9adfd75b0ab60f8e8d4067daaea67f8878f72503619 hrs 5 mins ago0x667561197ed802787cc9ec68e1561785b8e08bef IN  RequestNetwork0 Ether0.000224616
0x1902cc037d2e4bd843552fd3f04fcec3bd3d264665404b96748782a9730e5a8972503569 hrs 7 mins ago0x9abdefbabe7f459186b5cd58d17371b2e02ac8f8 IN  RequestNetwork0 Ether0.000314616
0x71c978c31ed0e5f303f5838e8151cebaf548b8a904fd079f0514d30b05b8ceb472502549 hrs 37 mins agoKucoin IN  RequestNetwork0 Ether0.0005970408
0x9fe0fdf844043e3754c8100eef2edadf50d009e6f1b251084eeb0b5109ed3be0725015710 hrs 7 mins ago0x1a7459d137412d15d5a70e8b7964b9299510eabf IN  RequestNetwork0 Ether0.0002762424
0xf2def8ef7ff625b8c5b83ecd923ec7bad2dfc7e2186e94b8c5d6204f0bc06aa1724987511 hrs 35 mins ago0x77883f81f011af6f0d0436b968246a5b4622f617 IN  RequestNetwork0 Ether0.002144628
0x1948cc63f57c791ba7b76ee4c13efcb1433eb668704e985546ea133119ca93f7724983211 hrs 53 mins ago0xb4a5f580220e031054c2bc65ad84d55543658893 IN  RequestNetwork0 Ether0.00044744
0xe55d3757879e90bd2928c6feb87e6b90286bad5f4443954ed20e09b2b3d7b550724977212 hrs 17 mins ago0xdac48e4fb43c261a07a08440932cc2cfbf22b51c IN  RequestNetwork0 Ether0.001532252
0x96ac28ea873dd3a2e2d3a6612fd821ee9d082873f973a350ae53679b7724b9a9724965512 hrs 55 mins agoBinance_4 IN  RequestNetwork0 Ether0.00209232
0x491177d5cb1b2ee427fe065d10fcb435ffeac511264c64ebb3e4ef679b4a79c1724951913 hrs 33 mins ago0xaf7a95cee2a925f1f40b6eed33c929af63f4bb56 IN  RequestNetwork0 Ether0.00044616
0x3e70caa4233b1e85db6715ae78fd52b06eb14aafe6b9bade808df1444c529d82724943914 hrs ago0x3e14073187b87e5ee21584678a4aaeb0276901c0 IN  RequestNetwork0 Ether0.0008421588
0x9155c721f22700a93e899058ac60b57d0ed535db24d68cc92555d4e5a3a3f0e6724928714 hrs 53 mins ago0x63691c07822c7beb6f81d6cadb3a6958969104ad IN  RequestNetwork0 Ether0.00044872
0x246de2f6968ee27ad9e33618fe765fd883f759af14c92e1c39da8f7e14d0006a724920915 hrs 24 mins ago0xf9ee7b307b4294a1734cdf3e93fce5f0513449d7 IN  RequestNetwork0 Ether0.00074872
0x731d388627e7e0917216d8aabac23b16e532048723c4c914c3a5511458d58df8724900316 hrs 31 mins ago0xbe6eea58bed1a4dad227cce8974abd660b2a6ce5 IN  RequestNetwork0 Ether0.00149488
0x41b5289e97cfcdcec5f1ced6f4bab4e9b0d02e2b65028f4c213e1efc4108c48c724897516 hrs 42 mins ago0xbe6eea58bed1a4dad227cce8974abd660b2a6ce5 IN  RequestNetwork0 Ether0.00044744
0x85d9af0653a9ed77fc6cde73c4b238be0009f0d30604d4f75c124eeaaaa205c7724897316 hrs 43 mins ago0xd5bd928d116fe1e9d5f11cda89615112f064372e IN  RequestNetwork0 Ether0.00044744
[ Download CSV Export 

Latest 1 Internal Transaction Internal Transactions as a result of Contract Execution

Parent TxHash Block Age From To Value
0x0ce57bf9142799a03d46614696ab36b458a9683ab1257bf2e10ce7f6cd54f8ad4345153502 days 14 hrs ago0x97208bf5dc25e6fd4719cfc2a3c1d1a59a974c3b  Contract Creation0 Ether
[ Download CSV Export 
Warning: The compiled contract might be susceptible to ExpExponentCleanup (medium/high-severity), NestedArrayFunctionCallDecoder (medium-severity), ZeroFunctionSelector (very low-severity) Solidity Compiler Bugs.

Contract Source Code Verified (Exact Match)
Contract Name: RequestToken
Compiler Version: v0.4.15+commit.bbb8e64f
Optimization Enabled: Yes
Runs (Optimizer):  200


Contract Source Code
pragma solidity 0.4.15;

/**
 * @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() {
    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) onlyOwner public {
    require(newOwner != address(0));
    OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }
}

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {
  function mul(uint256 a, uint256 b) internal constant returns (uint256) {
    uint256 c = a * b;
    assert(a == 0 || c / a == b);
    return c;
  }

  function div(uint256 a, uint256 b) internal constant 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;
  }

  function sub(uint256 a, uint256 b) internal constant returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  function add(uint256 a, uint256 b) internal constant returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}

/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/179
 */
contract ERC20Basic {
  uint256 public totalSupply;
  function balanceOf(address who) public constant returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 is ERC20Basic {
  function allowance(address owner, address spender) public constant 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);
}

/**
 * @title Basic token
 * @dev Basic version of StandardToken, with no allowances.
 */
contract BasicToken is ERC20Basic {
  using SafeMath for uint256;

  mapping(address => uint256) balances;

  /**
  * @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));

    // 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 constant returns (uint256 balance) {
    return balances[_owner];
  }
}

/**
 * @title Standard ERC20 token
 *
 * @dev Implementation of the basic standard token.
 * @dev https://github.com/ethereum/EIPs/issues/20
 * @dev Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
 */
contract StandardToken is ERC20, BasicToken {

  mapping (address => mapping (address => uint256)) 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));

    uint256 _allowance = allowed[_from][msg.sender];

    // Check is not needed because sub(_allowance, _value) will already throw if this condition is not met
    // require (_value <= _allowance);

    balances[_from] = balances[_from].sub(_value);
    balances[_to] = balances[_to].add(_value);
    allowed[_from][msg.sender] = _allowance.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 constant returns (uint256 remaining) {
    return allowed[_owner][_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
   */
  function increaseApproval (address _spender, uint _addedValue)
    returns (bool success) {
    allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
    Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

  function decreaseApproval (address _spender, uint _subtractedValue)
    returns (bool success) {
    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;
  }
}

/**
 * @title StandardCrowdsale 
 * @dev StandardCrowdsale is a base contract for managing a token crowdsale.
 * Crowdsales have a start and end timestamps, where investors can make
 * token purchases and the crowdsale will assign them tokens based
 * on a token per ETH rate. Funds collected are forwarded to a wallet
 * as they arrive.
 * @dev from Crowdsale by Zepellin with small changes. Changes are commented with "Request Modification"
 */
contract StandardCrowdsale {
    using SafeMath for uint256;

    // The token being sold
    StandardToken public token; // Request Modification : change to not mintable

    // start and end timestamps where investments are allowed (both inclusive)
    uint256 public startTime;
    uint256 public endTime;

    // address where funds are collected
    address public wallet;

    // how many token units a buyer gets per wei
    uint256 public rate;

    // amount of raised money in wei
    uint256 public weiRaised;

    /**
     * event for token purchase logging
     * @param purchaser who paid for the tokens
     * @param value weis paid for purchase
     * @param amount amount of tokens purchased
     */
    event TokenPurchase(address indexed purchaser, uint256 value, uint256 amount);

    function StandardCrowdsale(
        uint256 _startTime, 
        uint256 _endTime, 
        uint256 _rate, 
        address _wallet) 
    {
        require(_startTime >= now);
        require(_endTime >= _startTime);
        require(_rate > 0);
        require(_wallet != 0x0);

        startTime = _startTime;
        endTime = _endTime;
        rate = _rate;
        wallet = _wallet;

        token = createTokenContract(); // Request Modification : change to StandardToken + position
    }

    // creates the token to be sold.
    // Request Modification : change to StandardToken
    // override this method to have crowdsale of a specific mintable token.
    function createTokenContract() 
        internal 
        returns(StandardToken) 
    {
        return new StandardToken();
    }

    // fallback function can be used to buy tokens
    function () 
       payable 
    {
        buyTokens();
    }

    // low level token purchase function
    // Request Modification : change to not mint but transfer from this contract
    function buyTokens() 
       public 
       payable 
    {
        require(validPurchase());

        uint256 weiAmount = msg.value;

        // calculate token amount to be created
        uint256 tokens = weiAmount.mul(rate);

        // update state
        weiRaised = weiRaised.add(weiAmount);

        require(token.transfer(msg.sender, tokens)); // Request Modification : changed here - tranfer instead of mintable
        TokenPurchase(msg.sender, weiAmount, tokens);

        forwardFunds();
    }

    // send ether to the fund collection wallet
    // override to create custom fund forwarding mechanisms
    function forwardFunds() 
       internal 
    {
        wallet.transfer(msg.value);
    }

    // @return true if the transaction can buy tokens
    function validPurchase() 
        internal 
        returns(bool) 
    {
        bool withinPeriod = now >= startTime && now <= endTime;
        bool nonZeroPurchase = msg.value != 0;
        return withinPeriod && nonZeroPurchase;
    }

    // @return true if crowdsale event has ended
    function hasEnded() 
        public 
        constant 
        returns(bool) 
    {
        return now > endTime;
    }

    modifier onlyBeforeSale() {
        require(now < startTime);
        _;
    }

    // Request Modification : Add check 24hours before token sale
    modifier only24HBeforeSale() {
        require(now < startTime.sub(1 days));
        _;
    }
}

/**
 * @title CappedCrowdsale
 * @dev Extension of Crowdsale with a max amount of funds raised
 */
contract CappedCrowdsale is StandardCrowdsale {
  using SafeMath for uint256;

  uint256 public cap;

  function CappedCrowdsale(uint256 _cap) {
    require(_cap > 0);
    cap = _cap;
  }

  // overriding Crowdsale#validPurchase to add extra cap logic
  // @return true if investors can buy at the moment
  // Request Modification : delete constant because needed in son contract
  function validPurchase() internal returns (bool) {
    bool withinCap = weiRaised.add(msg.value) <= cap;
    return super.validPurchase() && withinCap;
  }

  // overriding Crowdsale#hasEnded to add cap logic
  // @return true if crowdsale event has ended
  function hasEnded() public constant returns (bool) {
    bool capReached = weiRaised >= cap;
    return super.hasEnded() || capReached;
  }
}

/**
 * @title ProgressiveIndividualCappedCrowdsale
 * @dev Extension of Crowdsale with a progressive individual cap
 * @dev This contract is not made for crowdsale superior to 256 * TIME_PERIOD_IN_SEC
 * @author Request.network
 */
contract ProgressiveIndividualCappedCrowdsale is StandardCrowdsale, Ownable {

    uint public constant TIME_PERIOD_IN_SEC = 1 days;
    uint public constant GAS_LIMIT_IN_WEI = 50000000000 wei; // limit gas price -50 Gwei wales stopper
    uint256 public baseEthCapPerAddress = 0 ether;

    mapping(address=>uint) public participated;

    /**
     * @dev overriding CappedCrowdsale#validPurchase to add an individual cap
     * @return true if investors can buy at the moment
     */
    function validPurchase() 
        internal 
        returns(bool)
    {
        require(tx.gasprice <= GAS_LIMIT_IN_WEI);
        uint ethCapPerAddress = getCurrentEthCapPerAddress();
        participated[msg.sender] = participated[msg.sender].add(msg.value);
        return super.validPurchase() && participated[msg.sender] <= ethCapPerAddress;
    }

    /**
     * @dev Set the individual cap for the first day. This function can not be called withing the 24h before the sale for security reasons
     * @param _baseEthCapPerAddress base cap in wei
     */
    function setBaseEthCapPerAddress(uint256 _baseEthCapPerAddress) 
        public
        onlyOwner 
        only24HBeforeSale
    {
        baseEthCapPerAddress = _baseEthCapPerAddress;
    }

    /**
     * @dev Get the current individual cap. 
     * @dev This amount increase everyday in an exponential way. Day 1: base cap, Day 2: 2 * base cap, Day 3: 4 * base cap ...
     * @return individual cap in wei
     */
    function getCurrentEthCapPerAddress() 
        public
        constant
        returns(uint)
    {
        if (block.timestamp < startTime) return 0;
        uint timeSinceStartInSec = block.timestamp.sub(startTime);
        uint currentPeriod = timeSinceStartInSec.div(TIME_PERIOD_IN_SEC).add(1);

        // for currentPeriod > 256 will always return baseEthCapPerAddress
        return (2 ** currentPeriod.sub(1)).mul(baseEthCapPerAddress);
    }
}

/**
 * @title WhitelistedCrowdsale
 * @dev This is an extension to add whitelist to a crowdsale
 * @author Request.network
 *
 */
contract WhitelistedCrowdsale is StandardCrowdsale, Ownable {
    
    mapping(address=>bool) public registered;

    event RegistrationStatusChanged(address target, bool isRegistered);

    /**
     * @dev Changes registration status of an address for participation.
     * @param target Address that will be registered/deregistered.
     * @param isRegistered New registration status of address.
     */
    function changeRegistrationStatus(address target, bool isRegistered)
        public
        onlyOwner
        only24HBeforeSale
    {
        registered[target] = isRegistered;
        RegistrationStatusChanged(target, isRegistered);
    }

    /**
     * @dev Changes registration statuses of addresses for participation.
     * @param targets Addresses that will be registered/deregistered.
     * @param isRegistered New registration status of addresses.
     */
    function changeRegistrationStatuses(address[] targets, bool isRegistered)
        public
        onlyOwner
        only24HBeforeSale
    {
        for (uint i = 0; i < targets.length; i++) {
            changeRegistrationStatus(targets[i], isRegistered);
        }
    }

    /**
     * @dev overriding Crowdsale#validPurchase to add whilelist
     * @return true if investors can buy at the moment, false otherwise
     */
    function validPurchase() internal returns (bool) {
        return super.validPurchase() && registered[msg.sender];
    }
}

/**
 * @title The RequestToken contract
 * @dev The Request Token contract
 * @dev inherite from StandardToken and Ownable by Zeppelin
 * @author Request.network
 */
contract RequestToken is StandardToken, Ownable {
    string  public  constant name = "Request Token";
    string  public  constant symbol = "REQ";
    uint8    public  constant decimals = 18;

    uint    public  transferableStartTime;

    address public  tokenSaleContract;
    address public  earlyInvestorWallet;


    modifier onlyWhenTransferEnabled() 
    {
        if ( now <= transferableStartTime ) {
            require(msg.sender == tokenSaleContract || msg.sender == earlyInvestorWallet || msg.sender == owner);
        }
        _;
    }

    modifier validDestination(address to) 
    {
        require(to != address(this));
        _;
    }

    function RequestToken(
        uint tokenTotalAmount, 
        uint _transferableStartTime, 
        address _admin, 
        address _earlyInvestorWallet) 
    {
        // Mint all tokens. Then disable minting forever.
        totalSupply = tokenTotalAmount * (10 ** uint256(decimals));

        balances[msg.sender] = totalSupply;
        Transfer(address(0x0), msg.sender, totalSupply);

        transferableStartTime = _transferableStartTime;
        tokenSaleContract = msg.sender;
        earlyInvestorWallet = _earlyInvestorWallet;

        transferOwnership(_admin); // admin could drain tokens and eth that were sent here by mistake
    }

    /**
     * @dev override transfer token for a specified address to add onlyWhenTransferEnabled and validDestination
     * @param _to The address to transfer to.
     * @param _value The amount to be transferred.
     */
    function transfer(address _to, uint _value)
        public
        validDestination(_to)
        onlyWhenTransferEnabled
        returns (bool) 
    {
        return super.transfer(_to, _value);
    }

    /**
     * @dev override transferFrom token for a specified address to add onlyWhenTransferEnabled and validDestination
     * @param _from The address to transfer from.
     * @param _to The address to transfer to.
     * @param _value The amount to be transferred.
     */
    function transferFrom(address _from, address _to, uint _value)
        public
        validDestination(_to)
        onlyWhenTransferEnabled
        returns (bool) 
    {
        return super.transferFrom(_from, _to, _value);
    }

    event Burn(address indexed _burner, uint _value);

    /**
     * @dev burn tokens
     * @param _value The amount to be burned.
     * @return always true (necessary in case of override)
     */
    function burn(uint _value) 
        public
        onlyWhenTransferEnabled
        returns (bool)
    {
        balances[msg.sender] = balances[msg.sender].sub(_value);
        totalSupply = totalSupply.sub(_value);
        Burn(msg.sender, _value);
        Transfer(msg.sender, address(0x0), _value);
        return true;
    }

    /**
     * @dev burn tokens in the behalf of someone
     * @param _from The address of the owner of the token.
     * @param _value The amount to be burned.
     * @return always true (necessary in case of override)
     */
    function burnFrom(address _from, uint256 _value) 
        public
        onlyWhenTransferEnabled
        returns(bool) 
    {
        assert(transferFrom(_from, msg.sender, _value));
        return burn(_value);
    }

    /**
     * @dev transfer to owner any tokens send by mistake on this contracts
     * @param token The address of the token to transfer.
     * @param amount The amount to be transfered.
     */
    function emergencyERC20Drain(ERC20 token, uint amount )
        public
        onlyOwner 
    {
        token.transfer(owner, amount);
    }
}

/**
 * @title RequestTokenSale
 * @dev 
 * We add new features to a base crowdsale using multiple inheritance.
 * We are using the following extensions:
 * CappedCrowdsale - sets a max boundary for raised funds
 * WhitelistedCrowdsale - add a whitelist
 * ProgressiveIndividualCappedCrowdsale - add a Progressive individual cap
 *
 * The code is based on the contracts of Open Zeppelin and we add our contracts : RequestTokenSale, WhiteListedCrowdsale, ProgressiveIndividualCappedCrowdsale and the Request Token
 *
 * @author Request.network
 */
contract RequestTokenSale is Ownable, CappedCrowdsale, WhitelistedCrowdsale, ProgressiveIndividualCappedCrowdsale {
    // hard cap of the token sale in ether
    uint private constant HARD_CAP_IN_WEI = 100000 ether;

    // Total of Request Token supply
    uint public constant TOTAL_REQUEST_TOKEN_SUPPLY = 1000000000;

    // Token sale rate from ETH to REQ
    uint private constant RATE_ETH_REQ = 5000;

    // Token initialy distributed for the team (15%)
    address public constant TEAM_VESTING_WALLET = 0xA76bC39aE4B88ef203C6Afe3fD219549d86D12f2;
    uint public constant TEAM_VESTING_AMOUNT = 150000000e18;

    // Token initialy distributed for the early investor (20%)
    address public constant EARLY_INVESTOR_WALLET = 0xa579E31b930796e3Df50A56829cF82Db98b6F4B3;
    uint public constant EARLY_INVESTOR_AMOUNT = 200000000e18;

    // Token initialy distributed for the early foundation (15%)
    // wallet use also to gather the ether of the token sale
    address private constant REQUEST_FOUNDATION_WALLET = 0xdD76B55ee6dAfe0c7c978bff69206d476a5b9Ce7;
    uint public constant REQUEST_FOUNDATION_AMOUNT = 150000000e18;

    // PERIOD WHEN TOKEN IS NOT TRANSFERABLE AFTER THE SALE
    uint public constant PERIOD_AFTERSALE_NOT_TRANSFERABLE_IN_SEC = 3 days;

    function RequestTokenSale(uint256 _startTime, uint256 _endTime)
      ProgressiveIndividualCappedCrowdsale()
      WhitelistedCrowdsale()
      CappedCrowdsale(HARD_CAP_IN_WEI)
      StandardCrowdsale(_startTime, _endTime, RATE_ETH_REQ, REQUEST_FOUNDATION_WALLET)
    {
        token.transfer(TEAM_VESTING_WALLET, TEAM_VESTING_AMOUNT);

        token.transfer(EARLY_INVESTOR_WALLET, EARLY_INVESTOR_AMOUNT);

        token.transfer(REQUEST_FOUNDATION_WALLET, REQUEST_FOUNDATION_AMOUNT);
    }

    /**
     * @dev Create the Request token (override createTokenContract of StandardCrowdsale)
     * @return the StandardToken created
     */
    function createTokenContract () 
      internal 
      returns(StandardToken) 
    {
        return new RequestToken(TOTAL_REQUEST_TOKEN_SUPPLY, endTime.add(PERIOD_AFTERSALE_NOT_TRANSFERABLE_IN_SEC), REQUEST_FOUNDATION_WALLET, EARLY_INVESTOR_WALLET);
    }

    /**
     * @dev Transfer the unsold tokens to the request Foundation multisign wallet 
     * @dev Only for owner
     * @return the StandardToken created
     */
    function drainRemainingToken () 
      public
      onlyOwner
    {
        require(hasEnded());
        token.transfer(REQUEST_FOUNDATION_WALLET, token.balanceOf(this));
    }
  
}

Contract ABI
[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"burn","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"tokenSaleContract","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"earlyInvestorWallet","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_value","type":"uint256"}],"name":"burnFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"amount","type":"uint256"}],"name":"emergencyERC20Drain","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"transferableStartTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[{"name":"tokenTotalAmount","type":"uint256"},{"name":"_transferableStartTime","type":"uint256"},{"name":"_admin","type":"address"},{"name":"_earlyInvestorWallet","type":"address"}],"payable":false,"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_burner","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Burn","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"}]

Contract Creation Code
6060604052341561000f57600080fd5b604051608080611081833981016040528080519190602001805191906020018051919060200180519150505b5b60038054600160a060020a03191633600160a060020a03161790555b670de0b6b3a764000084026000818155600160a060020a0333168082526001602052604080832084905590927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef915190815260200160405180910390a3600483905560058054600160a060020a03338116600160a060020a031992831617909255600680549284169290911691909117905561010082640100000000610bdd61010a82021704565b5b50505050610196565b60035433600160a060020a0390811691161461012557600080fd5b600160a060020a038116151561013a57600080fd5b600354600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360038054600160a060020a031916600160a060020a0383161790555b5b50565b610edc806101a56000396000f300606060405236156101045763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde038114610109578063095ea7b31461019457806318160ddd146101ca57806323b872dd146101ef578063313ce5671461022b57806342966c68146102545780635d5aa2771461027e57806366188463146102ad578063661990bc146102e357806370a082311461031257806379cc6790146103435780638da5cb5b1461037957806395d89b41146103a8578063a9059cbb14610433578063d73dd62314610469578063db0e16f11461049f578063dd62ed3e146104c3578063f2fde38b146104fa578063f6f5eb591461051b575b600080fd5b341561011457600080fd5b61011c610540565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156101595780820151818401525b602001610140565b50505050905090810190601f1680156101865780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561019f57600080fd5b6101b6600160a060020a0360043516602435610577565b604051901515815260200160405180910390f35b34156101d557600080fd5b6101dd6105e4565b60405190815260200160405180910390f35b34156101fa57600080fd5b6101b6600160a060020a03600435811690602435166044356105ea565b604051901515815260200160405180910390f35b341561023657600080fd5b61023e61067f565b60405160ff909116815260200160405180910390f35b341561025f57600080fd5b6101b6600435610684565b604051901515815260200160405180910390f35b341561028957600080fd5b6102916107bf565b604051600160a060020a03909116815260200160405180910390f35b34156102b857600080fd5b6101b6600160a060020a03600435166024356107ce565b604051901515815260200160405180910390f35b34156102ee57600080fd5b6102916108ca565b604051600160a060020a03909116815260200160405180910390f35b341561031d57600080fd5b6101dd600160a060020a03600435166108d9565b60405190815260200160405180910390f35b341561034e57600080fd5b6101b6600160a060020a03600435166024356108f8565b604051901515815260200160405180910390f35b341561038457600080fd5b61029161097a565b604051600160a060020a03909116815260200160405180910390f35b34156103b357600080fd5b61011c610989565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156101595780820151818401525b602001610140565b50505050905090810190601f1680156101865780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561043e57600080fd5b6101b6600160a060020a03600435166024356109c0565b604051901515815260200160405180910390f35b341561047457600080fd5b6101b6600160a060020a0360043516602435610a53565b604051901515815260200160405180910390f35b34156104aa57600080fd5b6104c1600160a060020a0360043516602435610af8565b005b34156104ce57600080fd5b6101dd600160a060020a0360043581169060243516610bb0565b60405190815260200160405180910390f35b341561050557600080fd5b6104c1600160a060020a0360043516610bdd565b005b341561052657600080fd5b6101dd610c76565b60405190815260200160405180910390f35b60408051908101604052600d81527f5265717565737420546f6b656e00000000000000000000000000000000000000602082015281565b600160a060020a03338116600081815260026020908152604080832094871680845294909152808220859055909291907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a35060015b92915050565b60005481565b60008230600160a060020a031681600160a060020a03161415151561060e57600080fd5b60045442116106665760055433600160a060020a0390811691161480610642575060065433600160a060020a039081169116145b8061065b575060035433600160a060020a039081169116145b151561066657600080fd5b5b610672858585610c7c565b91505b5b5b509392505050565b601281565b60045460009042116106df5760055433600160a060020a03908116911614806106bb575060065433600160a060020a039081169116145b806106d4575060035433600160a060020a039081169116145b15156106df57600080fd5b5b600160a060020a033316600090815260016020526040902054610709908363ffffffff610da816565b600160a060020a03331660009081526001602052604081209190915554610736908363ffffffff610da816565b600055600160a060020a0333167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58360405190815260200160405180910390a2600033600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405190815260200160405180910390a35060015b5b919050565b600554600160a060020a031681565b600160a060020a0333811660009081526002602090815260408083209386168352929052908120548083111561082b57600160a060020a033381166000908152600260209081526040808320938816835292905290812055610862565b61083b818463ffffffff610da816565b600160a060020a033381166000908152600260209081526040808320938916835292905220555b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020547f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925915190815260200160405180910390a3600191505b5092915050565b600654600160a060020a031681565b600160a060020a0381166000908152600160205260409020545b919050565b60045460009042116109535760055433600160a060020a039081169116148061092f575060065433600160a060020a039081169116145b80610948575060035433600160a060020a039081169116145b151561095357600080fd5b5b61095f8333846105ea565b151561096757fe5b61097082610684565b90505b5b92915050565b600354600160a060020a031681565b60408051908101604052600381527f5245510000000000000000000000000000000000000000000000000000000000602082015281565b60008230600160a060020a031681600160a060020a0316141515156109e457600080fd5b6004544211610a3c5760055433600160a060020a0390811691161480610a18575060065433600160a060020a039081169116145b80610a31575060035433600160a060020a039081169116145b1515610a3c57600080fd5b5b610a478484610dbf565b91505b5b5b5092915050565b600160a060020a033381166000908152600260209081526040808320938616835292905290812054610a8b908363ffffffff610e9616565b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020849055919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591905190815260200160405180910390a35060015b92915050565b60035433600160a060020a03908116911614610b1357600080fd5b600354600160a060020a038084169163a9059cbb9116836000604051602001526040517c010000000000000000000000000000000000000000000000000000000063ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610b8f57600080fd5b6102c65a03f11515610ba057600080fd5b505050604051805150505b5b5050565b600160a060020a038083166000908152600260209081526040808320938516835292905220545b92915050565b60035433600160a060020a03908116911614610bf857600080fd5b600160a060020a0381161515610c0d57600080fd5b600354600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b60045481565b600080600160a060020a0384161515610c9457600080fd5b50600160a060020a03808516600081815260026020908152604080832033909516835293815283822054928252600190529190912054610cda908463ffffffff610da816565b600160a060020a038087166000908152600160205260408082209390935590861681522054610d0f908463ffffffff610e9616565b600160a060020a038516600090815260016020526040902055610d38818463ffffffff610da816565b600160a060020a03808716600081815260026020908152604080832033861684529091529081902093909355908616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9086905190815260200160405180910390a3600191505b509392505050565b600082821115610db457fe5b508082035b92915050565b6000600160a060020a0383161515610dd657600080fd5b600160a060020a033316600090815260016020526040902054610dff908363ffffffff610da816565b600160a060020a033381166000908152600160205260408082209390935590851681522054610e34908363ffffffff610e9616565b600160a060020a0380851660008181526001602052604090819020939093559133909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060015b92915050565b600082820183811015610ea557fe5b8091505b50929150505600a165627a7a72305820a569b7054f9995c1906846443e96a492d28d975a665c2cdf93ae8ea466b8677c0029000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000059e99ef0000000000000000000000000dd76b55ee6dafe0c7c978bff69206d476a5b9ce7000000000000000000000000a579e31b930796e3df50a56829cf82db98b6f4b3


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

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000003B9ACA00
Arg [1] : 0000000000000000000000000000000000000000000000000000000059E99EF0
Arg [2] : 000000000000000000000000dD76B55ee6dAfe0c7c978bff69206d476a5b9Ce7
Arg [3] : 000000000000000000000000a579e31b930796e3df50a56829cf82db98b6f4b3


   Swarm Source:
bzzr://a569b7054f9995c1906846443e96a492d28d975a665c2cdf93ae8ea466b8677c
Block Age transaction Difficulty GasUsed Reward
Block Age Uncle Number Difficulty GasUsed Reward
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.