Sponsored Link:    Chronologic - Self-Mining Ethereum token based on Proof of Time. Join the Contribution.
Contract Overview | AdExCrowdsale
ETH Balance: 0 Ether
ETH USD Value: $0
No Of Transactions: 34994 txns
Misc
Address Watch Add To Watch List
Contract Creator 0x8f493c12c4f5ff5fd510549e1e28ea3dd101e850at txn 0x9b4b73640dcf4ab15c0ab08c88ed22866ebe995a094436474e0f6713ef0e5712
Token Tracker
  Latest 25 txns from a total Of 34994 transactions View All

TxHash Age From To Value [TxFee]
0xcf4129afb70271ff0834464cf05dc06ef31515b65aa36ef9abfa9f0cd0220e4c14 mins ago0x2ba49a3d4669687dd448a5ad59b057ae10bb6ea4  IN   AdExCrowdsale0 Ether0.00047052
0x836f81e40b95b5d37b605b1caa6ad5ef34aa274d6f7f4882f4e8b92bf76ed78d19 mins ago0xc5859d4f42f0e4fc2ed10c399a7f67e8f2d834c0  IN   AdExCrowdsale0 Ether0.00231156
0xe808c42b57fd421b8d38de514900a30277867ac59d13531a12516aa06126ccbf19 mins ago0x3563b9ccfc8bf57dd6d5c08d7012880efa1a05da  IN   AdExCrowdsale0 Ether0.000038526
0xbd1d8db1f25860c7b5e7b9da1effd6d7aa9800ff4af3157310c5b5a93474147823 mins ago0x81e3ea221db59f21678bc1ae2006a5a44943317e  IN   AdExCrowdsale0 Ether0.00112539
0x0e890935351623fe588b4a7cb06c1608363b27e36eab7089453bc315ef9c7f4826 mins agoBittrex  IN   AdExCrowdsale0 Ether0.00196809
0x966b8363199581d559733d27c0a9db5075db5cd6b8cf559280098d0ba9e872e532 mins ago0xfd35665eac7e399a414e290f8908f54696001c35  IN   AdExCrowdsale0 Ether0.000308208
0x4e4a59f2057f208ea7ac14974a1f0f025134c086c8b68d50d13079383a99c14d43 mins agoBittrex  IN   AdExCrowdsale0 Ether0.001964826
0x182a8a3e5e48c6229b0bb3bae192096d17e25025c633221c5b20f5728d2e8ca243 mins agoBittrex  IN   AdExCrowdsale0 Ether0.002729826
0xcd8f31cec796d91149126cc91f3c2c1d6e8c6e9c66a8ff96b99386c71d880bf646 mins ago0x55037b0974001518099d1ab3a2dd65d102d5c055  IN   AdExCrowdsale0 Ether0.000038526
0x05f4df1ae4d6eeca242e4a6e66cf4279347da913d776cdd9b98d2f559ed8a9d91 hr 8 mins ago0xc48ed2bc654c94de283807056f1512e4b46ffcf2  IN   AdExCrowdsale0 Ether0.000809046
0xdf73ad2ef29e648aaff8a139c0b6b0b65638e2cdd1728633491e6b6cbd4ecf061 hr 13 mins ago0x225464f1ab587ac3ca3c65b49a3222e1130977a2  IN   AdExCrowdsale0 Ether0.00107052
0x45507805f6dba229cea8efad026400bed8d095bf21346732b912a8044da093041 hr 16 mins ago0x225464f1ab587ac3ca3c65b49a3222e1130977a2  IN   AdExCrowdsale0 Ether0.00107052
0xc7a015cb7d484789ccac14371ad37a4be0959fe3724456a24456429c8463889d1 hr 20 mins agoBittrex  IN   AdExCrowdsale0 Ether0.001961562
0xdc19404b89669552ac8803ab15f6897751c9f0ec00bb12b133aade1842aaa83e1 hr 23 mins ago0xba0b610267b3a9583564b7a70a645ab487ae1dd7  IN   AdExCrowdsale0 Ether0.00081039
0xf26b39f04c97b6dbd0bfee00a5dee69252314be754c850580a6b1782f0a979c91 hr 41 mins ago0x225464f1ab587ac3ca3c65b49a3222e1130977a2  IN   AdExCrowdsale0 Ether0.00107052
0x8c1702a0ee6deb7ed0de9da3ce01c80a8c25916e65f634209ee45004ca1f91841 hr 42 mins ago0x097501c95264ad3204159efaefdc5820783dbeae  IN   AdExCrowdsale0 Ether0.00038526
0x03bb1151787d18dec6441be98c2f9567a1e550fbe7b3ede32e9a4bbb877e1c3f1 hr 55 mins ago0x7072e2a1bf3b29393b77bc2786dc05da2bf1f18e  IN   AdExCrowdsale0 Ether0.00018306
0x8f647ec11ee40355b7009ff19a923d91a65ce3e37e7754535459f7d2dc74ba882 hrs ago0x097501c95264ad3204159efaefdc5820783dbeae  IN   AdExCrowdsale0 Ether0.00038526
0xa64c31aa126d9c09386641d915de28997c977d7b6b71b1822263263f00d71b752 hrs 1 min ago0xd1f8ab73ca2b35e69152fabb9ddaab234ef1c4cf  IN   AdExCrowdsale0 Ether0.00231156
0x905375d0d6e0d79e5b2716625e8ae510f9d57591387e67d92c383b63e0b242972 hrs 2 mins ago0x225464f1ab587ac3ca3c65b49a3222e1130977a2  IN   AdExCrowdsale0 Ether0.00106924
0x3c1883f9a7a78afd0c01abc8f68f908ed1c888036972537c2664b925fb3bfeb72 hrs 5 mins ago0xe53729bfbb148362fbfc1c532d2e1cf5e4d54f39  IN   AdExCrowdsale0 Ether0.000154104
0x4c56d1cf0d6f479831b548ad087533a8d3fabac7579a99a84bd66172721acfc22 hrs 5 mins agoliqui.io_2  IN   AdExCrowdsale0 Ether0.00112539
0x59b49ce34bfa63cfae9e4b1d6f8bcf48e4d12de779abebb0aee05047c0c023132 hrs 6 mins agoliqui.io_2  IN   AdExCrowdsale0 Ether0.001124046
0x46389d160ed607b6e986d1a1b9e7b513cb361de175a9f67240006450208b32cd2 hrs 14 mins agoBittrex  IN   AdExCrowdsale0 Ether0.001961562
0x220584e012729a1a2047446331c3b33406726d1bfed91b69fe78fdb1e07528732 hrs 21 mins agoBittrex  IN   AdExCrowdsale0 Ether0.002729826
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
  Latest 25 Internal Txns, Click here to View More View All
ParentTxHash Block Age From To Value
0x20cef361ff34460a83e2a9602085f997eca21893d26a7fcf030a5ea6eaed6dc2395408784 days 1 hr ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a70 Ether
0xf877c2b9fd4eeaf2ecf172bce753981783d0cf61a95481e73f010f6b65c9f7f6395408684 days 1 hr ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a1 Ether
0x8b7163738298563c5c4cc9c90b5471d7a6274eb6899544ab9cacdab52af6c246395408684 days 1 hr ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a1 Ether
0x4a811e32f3295940119bd0a824d7786c738b0fea31987f21a2edde58bcf70574395408684 days 1 hr ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a1 Ether
0xc92bc87f01ef9755ec3b5a16d8ed94bcef746393a66654bb1d6987e0469475a6395408584 days 1 hr ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a5 Ether
0x34ef3591e96c744de8a18ba9c5aaf08092137710517b98fe7602d22b83d58d4e395408484 days 1 hr ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a5 Ether
0xd0f0597ff65cf200155976a67628aad46e58c7091b2c4d5af33f3c0337f6494b395408284 days 1 hr ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a1 Ether
0xed0cf8aa40bb3113c4b597543d102ee5205cf0a0c7a013cf169b497cefffafd0395408284 days 1 hr ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a40 Ether
0x2cf718014f6c56e9450194454a5955855056cd03d10dd598b0ff308e94134e22395408284 days 1 hr ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a2 Ether
0x9b71ef70d62d8782a15d7476216f6a41b9b7ff10590f088d5c0c00db2625b934395407984 days 1 hr ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a2 Ether
0xd97856ea4e552e40868cb2de00d22598adcc3443c11f8b2d1884dabd439dfef7395407484 days 1 hr ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a1 Ether
0xbff165147b7cb8c7dbb6b94c79c38689f0083033162f6fd3dc2cb38de954ec13395407484 days 1 hr ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a0.4 Ether
0x9a2a67d8670d25a86acf2b42e842f1976d8795d1e4903e210384ec50259ff248395407284 days 1 hr ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a2 Ether
0x8865594a8f87c0436e96bac1f3c3a765f593b7ce6bbc9235523b58f7ca410b14395407284 days 1 hr ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a1 Ether
0x8de6662bbcd27d14653f775f0bfcf8e9f6f2967bd3dee3515cdb571cb841785b395406884 days 1 hr ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a0.2 Ether
0xc3ea9ae9577737da1f59caf58a77d4bd697bdc96d01b13134cecb6b2dac49891395406884 days 1 hr ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a1 Ether
0x218144c0237b08d351b8fd71c01990e81b09cd7d8d94d9820f9727905f78511c395406684 days 1 hr ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a3 Ether
0xf70aa8ea73c4882c502615444579de4950635abe97f2559f2bdba1ef977b3e35395406684 days 1 hr ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a0.99475 Ether
0xa75a74ed83aa1ad128c4f4e0d99722d6d17d9ce9b0330d41a8e82796756c49ea395406684 days 1 hr ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a2 Ether
0x8134c9700199840059b2cbb1eb943495c42aa79fdadc22e196583a17a1c1e649395406684 days 1 hr ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a5 Ether
0x737e8be28f2752926bd787e065330e388907025455657c1e3ac825fe0f189bce395406684 days 1 hr ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a49.93882261 Ether
0x6e255b6253f70ed5ddb23b207411695e95de1a86ba8e90fdb6674b4d038ff85a395406084 days 1 hr ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a4.44455785 Ether
0x2f800dd53d45a90f3e26ee5bb9ec392a2d0653a413c9c009f568ae1ebe59ffa3395406084 days 1 hr ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a0.5 Ether
0x58b01f8ccced5a7c549b8789157ce95612d21633dcddfe6281a7625265930378395405584 days 1 hr ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a1 Ether
0xde86b22ccd5472804c68c72e7c0e6e5b94cd34fc1f8a828538f347c029441427395405384 days 1 hr ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a5 Ether
[ Download CSV Export  ] 
Warning: The compiled contract might be susceptible to DelegateCallReturnValue (low-severity), ECRecoverMalformedInput (medium-severity), SkipEmptyStringLiteral (low-severity) Solidity compiler bugs.

Contract Source Code Verified
Note: Displaying matching verified source code at contract 0xe4ef6df2c125b61e7dba539734d84f31d52dddfe
Contract Name: ADXToken
Compiler Version: v0.4.11+commit.68ef5810
Optimization Enabled: Yes
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts
pragma solidity ^0.4.11;



/**
 * Math operations with safety checks
 */
library SafeMath {
  function mul(uint a, uint b) internal returns (uint) {
    uint c = a * b;
    assert(a == 0 || c / a == b);
    return c;
  }

  function div(uint a, uint b) internal returns (uint) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    uint c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return c;
  }

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

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

  function max64(uint64 a, uint64 b) internal constant returns (uint64) {
    return a >= b ? a : b;
  }

  function min64(uint64 a, uint64 b) internal constant returns (uint64) {
    return a < b ? a : b;
  }

  function max256(uint256 a, uint256 b) internal constant returns (uint256) {
    return a >= b ? a : b;
  }

  function min256(uint256 a, uint256 b) internal constant returns (uint256) {
    return a < b ? a : b;
  }

  function assert(bool assertion) internal {
    if (!assertion) {
      throw;
    }
  }
}


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




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

  mapping(address => uint) balances;

  /**
   * @dev Fix for the ERC20 short address attack.
   */
  modifier onlyPayloadSize(uint size) {
     if(msg.data.length < size + 4) {
       throw;
     }
     _;
  }

  /**
  * @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, uint _value) onlyPayloadSize(2 * 32) {
    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    Transfer(msg.sender, _to, _value);
  }

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

}




/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 is ERC20Basic {
  function allowance(address owner, address spender) constant returns (uint);
  function transferFrom(address from, address to, uint value);
  function approve(address spender, uint value);
  event Approval(address indexed owner, address indexed spender, uint value);
}




/**
 * @title Standard ERC20 token
 *
 * @dev Implemantation of the basic standart 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 BasicToken, ERC20 {

  mapping (address => mapping (address => uint)) 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 uint the amout of tokens to be transfered
   */
  function transferFrom(address _from, address _to, uint _value) onlyPayloadSize(3 * 32) {
    var _allowance = allowed[_from][msg.sender];

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

    balances[_to] = balances[_to].add(_value);
    balances[_from] = balances[_from].sub(_value);
    allowed[_from][msg.sender] = _allowance.sub(_value);
    Transfer(_from, _to, _value);
  }

  /**
   * @dev Aprove the passed address to spend the specified amount of tokens on beahlf of msg.sender.
   * @param _spender The address which will spend the funds.
   * @param _value The amount of tokens to be spent.
   */
  function approve(address _spender, uint _value) {

    // To change the approve amount you first have to reduce the addresses`
    //  allowance to zero by calling `approve(_spender, 0)` if it is not
    //  already 0 to mitigate the race condition described here:
    //  https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
    if ((_value != 0) && (allowed[msg.sender][_spender] != 0)) throw;

    allowed[msg.sender][_spender] = _value;
    Approval(msg.sender, _spender, _value);
  }

  /**
   * @dev Function to check the amount of tokens than 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 uint specifing the amount of tokens still avaible for the spender.
   */
  function allowance(address _owner, address _spender) constant returns (uint remaining) {
    return allowed[_owner][_spender];
  }

}


/**
 * @title LimitedTransferToken
 * @dev LimitedTransferToken defines the generic interface and the implementation to limit token 
 * transferability for different events. It is intended to be used as a base class for other token 
 * contracts. 
 * LimitedTransferToken has been designed to allow for different limiting factors,
 * this can be achieved by recursively calling super.transferableTokens() until the base class is 
 * hit. For example:
 *     function transferableTokens(address holder, uint64 time) constant public returns (uint256) {
 *       return min256(unlockedTokens, super.transferableTokens(holder, time));
 *     }
 * A working example is VestedToken.sol:
 * https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/VestedToken.sol
 */

contract LimitedTransferToken is ERC20 {

  /**
   * @dev Checks whether it can transfer or otherwise throws.
   */
  modifier canTransfer(address _sender, uint _value) {
   if (_value > transferableTokens(_sender, uint64(now))) throw;
   _;
  }

  /**
   * @dev Checks modifier and allows transfer if tokens are not locked.
   * @param _to The address that will recieve the tokens.
   * @param _value The amount of tokens to be transferred.
   */
  function transfer(address _to, uint _value) canTransfer(msg.sender, _value) {
    super.transfer(_to, _value);
  }

  /**
  * @dev Checks modifier and allows transfer if tokens are not locked.
  * @param _from The address that will send the tokens.
  * @param _to The address that will recieve the tokens.
  * @param _value The amount of tokens to be transferred.
  */
  function transferFrom(address _from, address _to, uint _value) canTransfer(_from, _value) {
    super.transferFrom(_from, _to, _value);
  }

  /**
   * @dev Default transferable tokens function returns all tokens for a holder (no limit).
   * @dev Overwriting transferableTokens(address holder, uint64 time) is the way to provide the 
   * specific logic for limiting token transferability for a holder over time.
   */
  function transferableTokens(address holder, uint64 time) constant public returns (uint256) {
    return balanceOf(holder);
  }
}


/**
 * @title Vested token
 * @dev Tokens that can be vested for a group of addresses.
 */
contract VestedToken is StandardToken, LimitedTransferToken {

  uint256 MAX_GRANTS_PER_ADDRESS = 20;

  struct TokenGrant {
    address granter;     // 20 bytes
    uint256 value;       // 32 bytes
    uint64 cliff;
    uint64 vesting;
    uint64 start;        // 3 * 8 = 24 bytes
    bool revokable;
    bool burnsOnRevoke;  // 2 * 1 = 2 bits? or 2 bytes?
  } // total 78 bytes = 3 sstore per operation (32 per sstore)

  mapping (address => TokenGrant[]) public grants;

  event NewTokenGrant(address indexed from, address indexed to, uint256 value, uint256 grantId);

  /**
   * @dev Grant tokens to a specified address
   * @param _to address The address which the tokens will be granted to.
   * @param _value uint256 The amount of tokens to be granted.
   * @param _start uint64 Time of the beginning of the grant.
   * @param _cliff uint64 Time of the cliff period.
   * @param _vesting uint64 The vesting period.
   */
  function grantVestedTokens(
    address _to,
    uint256 _value,
    uint64 _start,
    uint64 _cliff,
    uint64 _vesting,
    bool _revokable,
    bool _burnsOnRevoke
  ) public {

    // Check for date inconsistencies that may cause unexpected behavior
    if (_cliff < _start || _vesting < _cliff) {
      throw;
    }

    if (tokenGrantsCount(_to) > MAX_GRANTS_PER_ADDRESS) throw;   // To prevent a user being spammed and have his balance locked (out of gas attack when calculating vesting).

    uint count = grants[_to].push(
                TokenGrant(
                  _revokable ? msg.sender : 0, // avoid storing an extra 20 bytes when it is non-revokable
                  _value,
                  _cliff,
                  _vesting,
                  _start,
                  _revokable,
                  _burnsOnRevoke
                )
              );

    transfer(_to, _value);

    NewTokenGrant(msg.sender, _to, _value, count - 1);
  }

  /**
   * @dev Revoke the grant of tokens of a specifed address.
   * @param _holder The address which will have its tokens revoked.
   * @param _grantId The id of the token grant.
   */
  function revokeTokenGrant(address _holder, uint _grantId) public {
    TokenGrant grant = grants[_holder][_grantId];

    if (!grant.revokable) { // Check if grant was revokable
      throw;
    }

    if (grant.granter != msg.sender) { // Only granter can revoke it
      throw;
    }

    address receiver = grant.burnsOnRevoke ? 0xdead : msg.sender;

    uint256 nonVested = nonVestedTokens(grant, uint64(now));

    // remove grant from array
    delete grants[_holder][_grantId];
    grants[_holder][_grantId] = grants[_holder][grants[_holder].length.sub(1)];
    grants[_holder].length -= 1;

    balances[receiver] = balances[receiver].add(nonVested);
    balances[_holder] = balances[_holder].sub(nonVested);

    Transfer(_holder, receiver, nonVested);
  }


  /**
   * @dev Calculate the total amount of transferable tokens of a holder at a given time
   * @param holder address The address of the holder
   * @param time uint64 The specific time.
   * @return An uint representing a holder's total amount of transferable tokens.
   */
  function transferableTokens(address holder, uint64 time) constant public returns (uint256) {
    uint256 grantIndex = tokenGrantsCount(holder);

    if (grantIndex == 0) return balanceOf(holder); // shortcut for holder without grants

    // Iterate through all the grants the holder has, and add all non-vested tokens
    uint256 nonVested = 0;
    for (uint256 i = 0; i < grantIndex; i++) {
      nonVested = SafeMath.add(nonVested, nonVestedTokens(grants[holder][i], time));
    }

    // Balance - totalNonVested is the amount of tokens a holder can transfer at any given time
    uint256 vestedTransferable = SafeMath.sub(balanceOf(holder), nonVested);

    // Return the minimum of how many vested can transfer and other value
    // in case there are other limiting transferability factors (default is balanceOf)
    return SafeMath.min256(vestedTransferable, super.transferableTokens(holder, time));
  }

  /**
   * @dev Check the amount of grants that an address has.
   * @param _holder The holder of the grants.
   * @return A uint representing the total amount of grants.
   */
  function tokenGrantsCount(address _holder) constant returns (uint index) {
    return grants[_holder].length;
  }

  /**
   * @dev Calculate amount of vested tokens at a specifc time.
   * @param tokens uint256 The amount of tokens grantted.
   * @param time uint64 The time to be checked
   * @param start uint64 A time representing the begining of the grant
   * @param cliff uint64 The cliff period.
   * @param vesting uint64 The vesting period.
   * @return An uint representing the amount of vested tokensof a specif grant.
   *  transferableTokens
   *   |                         _/--------   vestedTokens rect
   *   |                       _/
   *   |                     _/
   *   |                   _/
   *   |                 _/
   *   |                /
   *   |              .|
   *   |            .  |
   *   |          .    |
   *   |        .      |
   *   |      .        |
   *   |    .          |
   *   +===+===========+---------+----------> time
   *      Start       Clift    Vesting
   */
  function calculateVestedTokens(
    uint256 tokens,
    uint256 time,
    uint256 start,
    uint256 cliff,
    uint256 vesting) constant returns (uint256)
    {
      // Shortcuts for before cliff and after vesting cases.
      if (time < cliff) return 0;
      if (time >= vesting) return tokens;

      // Interpolate all vested tokens.
      // As before cliff the shortcut returns 0, we can use just calculate a value
      // in the vesting rect (as shown in above's figure)

      // vestedTokens = tokens * (time - start) / (vesting - start)
      uint256 vestedTokens = SafeMath.div(
                                    SafeMath.mul(
                                      tokens,
                                      SafeMath.sub(time, start)
                                      ),
                                    SafeMath.sub(vesting, start)
                                    );

      return vestedTokens;
  }

  /**
   * @dev Get all information about a specifc grant.
   * @param _holder The address which will have its tokens revoked.
   * @param _grantId The id of the token grant.
   * @return Returns all the values that represent a TokenGrant(address, value, start, cliff,
   * revokability, burnsOnRevoke, and vesting) plus the vested value at the current time.
   */
  function tokenGrant(address _holder, uint _grantId) constant returns (address granter, uint256 value, uint256 vested, uint64 start, uint64 cliff, uint64 vesting, bool revokable, bool burnsOnRevoke) {
    TokenGrant grant = grants[_holder][_grantId];

    granter = grant.granter;
    value = grant.value;
    start = grant.start;
    cliff = grant.cliff;
    vesting = grant.vesting;
    revokable = grant.revokable;
    burnsOnRevoke = grant.burnsOnRevoke;

    vested = vestedTokens(grant, uint64(now));
  }

  /**
   * @dev Get the amount of vested tokens at a specific time.
   * @param grant TokenGrant The grant to be checked.
   * @param time The time to be checked
   * @return An uint representing the amount of vested tokens of a specific grant at a specific time.
   */
  function vestedTokens(TokenGrant grant, uint64 time) private constant returns (uint256) {
    return calculateVestedTokens(
      grant.value,
      uint256(time),
      uint256(grant.start),
      uint256(grant.cliff),
      uint256(grant.vesting)
    );
  }

  /**
   * @dev Calculate the amount of non vested tokens at a specific time.
   * @param grant TokenGrant The grant to be checked.
   * @param time uint64 The time to be checked
   * @return An uint representing the amount of non vested tokens of a specifc grant on the 
   * passed time frame.
   */
  function nonVestedTokens(TokenGrant grant, uint64 time) private constant returns (uint256) {
    return grant.value.sub(vestedTokens(grant, time));
  }

  /**
   * @dev Calculate the date when the holder can trasfer all its tokens
   * @param holder address The address of the holder
   * @return An uint representing the date of the last transferable tokens.
   */
  function lastTokenIsTransferableDate(address holder) constant public returns (uint64 date) {
    date = uint64(now);
    uint256 grantIndex = grants[holder].length;
    for (uint256 i = 0; i < grantIndex; i++) {
      date = SafeMath.max64(grants[holder][i].vesting, date);
    }
  }
}

// QUESTIONS FOR AUDITORS:
// - Considering we inherit from VestedToken, how much does that hit at our gas price?
// - Ensure max supply is 100,000,000
// - Ensure that even if not totalSupply is sold, tokens would still be transferrable after (we will up to totalSupply by creating adEx tokens)

// vesting: 365 days, 365 days / 4 vesting


contract ADXToken is VestedToken {
  //FIELDS
  string public name = "AdEx";
  string public symbol = "ADX";
  uint public decimals = 4;

  //CONSTANTS
  //Time limits
  uint public constant STAGE_ONE_TIME_END = 24 hours; // first day bonus
  uint public constant STAGE_TWO_TIME_END = 1 weeks; // first week bonus
  uint public constant STAGE_THREE_TIME_END = 4 weeks;
  
  // Multiplier for the decimals
  uint private constant DECIMALS = 10000;

  //Prices of ADX
  uint public constant PRICE_STANDARD    = 900*DECIMALS; // ADX received per one ETH; MAX_SUPPLY / (valuation / ethPrice)
  uint public constant PRICE_STAGE_ONE   = PRICE_STANDARD * 130/100; // 1ETH = 30% more ADX
  uint public constant PRICE_STAGE_TWO   = PRICE_STANDARD * 115/100; // 1ETH = 15% more ADX
  uint public constant PRICE_STAGE_THREE = PRICE_STANDARD;

  //ADX Token Limits
  uint public constant ALLOC_TEAM =         16000000*DECIMALS; // team + advisors
  uint public constant ALLOC_BOUNTIES =      2000000*DECIMALS;
  uint public constant ALLOC_WINGS =         2000000*DECIMALS;
  uint public constant ALLOC_CROWDSALE =    80000000*DECIMALS;
  uint public constant PREBUY_PORTION_MAX = 20000000*DECIMALS; // this is redundantly more than what will be pre-sold
  
  //ASSIGNED IN INITIALIZATION
  //Start and end times
  uint public publicStartTime; // Time in seconds public crowd fund starts.
  uint public privateStartTime; // Time in seconds when pre-buy can purchase up to 31250 ETH worth of ADX;
  uint public publicEndTime; // Time in seconds crowdsale ends
  uint public hardcapInEth;

  //Special Addresses
  address public multisigAddress; // Address to which all ether flows.
  address public adexTeamAddress; // Address to which ALLOC_TEAM, ALLOC_BOUNTIES, ALLOC_WINGS is (ultimately) sent to.
  address public ownerAddress; // Address of the contract owner. Can halt the crowdsale.
  address public preBuy1; // Address used by pre-buy
  address public preBuy2; // Address used by pre-buy
  address public preBuy3; // Address used by pre-buy
  uint public preBuyPrice1; // price for pre-buy
  uint public preBuyPrice2; // price for pre-buy
  uint public preBuyPrice3; // price for pre-buy

  //Running totals
  uint public etherRaised; // Total Ether raised.
  uint public ADXSold; // Total ADX created
  uint public prebuyPortionTotal; // Total of Tokens purchased by pre-buy. Not to exceed PREBUY_PORTION_MAX.
  
  //booleans
  bool public halted; // halts the crowd sale if true.

  // MODIFIERS
  //Is currently in the period after the private start time and before the public start time.
  modifier is_pre_crowdfund_period() {
    if (now >= publicStartTime || now < privateStartTime) throw;
    _;
  }

  //Is currently the crowdfund period
  modifier is_crowdfund_period() {
    if (now < publicStartTime) throw;
    if (isCrowdfundCompleted()) throw;
    _;
  }

  // Is completed
  modifier is_crowdfund_completed() {
    if (!isCrowdfundCompleted()) throw;
    _;
  }
  function isCrowdfundCompleted() internal returns (bool) {
    if (now > publicEndTime || ADXSold >= ALLOC_CROWDSALE || etherRaised >= hardcapInEth) return true;
    return false;
  }

  //May only be called by the owner address
  modifier only_owner() {
    if (msg.sender != ownerAddress) throw;
    _;
  }

  //May only be called if the crowdfund has not been halted
  modifier is_not_halted() {
    if (halted) throw;
    _;
  }

  // EVENTS
  event PreBuy(uint _amount);
  event Buy(address indexed _recipient, uint _amount);

  // Initialization contract assigns address of crowdfund contract and end time.
  function ADXToken(
    address _multisig,
    address _adexTeam,
    uint _publicStartTime,
    uint _privateStartTime,
    uint _hardcapInEth,
    address _prebuy1, uint _preBuyPrice1,
    address _prebuy2, uint _preBuyPrice2,
    address _prebuy3, uint _preBuyPrice3
  ) {
    ownerAddress = msg.sender;
    publicStartTime = _publicStartTime;
    privateStartTime = _privateStartTime;
    publicEndTime = _publicStartTime + 4 weeks;
    multisigAddress = _multisig;
    adexTeamAddress = _adexTeam;

    hardcapInEth = _hardcapInEth;

    preBuy1 = _prebuy1;
    preBuyPrice1 = _preBuyPrice1;
    preBuy2 = _prebuy2;
    preBuyPrice2 = _preBuyPrice2;
    preBuy3 = _prebuy3;
    preBuyPrice3 = _preBuyPrice3;

    balances[adexTeamAddress] += ALLOC_BOUNTIES;
    balances[adexTeamAddress] += ALLOC_WINGS;

    balances[ownerAddress] += ALLOC_TEAM;

    balances[ownerAddress] += ALLOC_CROWDSALE;
  }

  // Transfer amount of tokens from sender account to recipient.
  // Only callable after the crowd fund is completed
  function transfer(address _to, uint _value)
  {
    if (_to == msg.sender) return; // no-op, allow even during crowdsale, in order to work around using grantVestedTokens() while in crowdsale
    if (!isCrowdfundCompleted()) throw;
    super.transfer(_to, _value);
  }

  // Transfer amount of tokens from a specified address to a recipient.
  // Transfer amount of tokens from sender account to recipient.
  function transferFrom(address _from, address _to, uint _value)
    is_crowdfund_completed
  {
    super.transferFrom(_from, _to, _value);
  }

  //constant function returns the current ADX price.
  function getPriceRate()
      constant
      returns (uint o_rate)
  {
      uint delta = SafeMath.sub(now, publicStartTime);

      if (delta > STAGE_TWO_TIME_END) return PRICE_STAGE_THREE;
      if (delta > STAGE_ONE_TIME_END) return PRICE_STAGE_TWO;

      return (PRICE_STAGE_ONE);
  }

  // calculates wmount of ADX we get, given the wei and the rates we've defined per 1 eth
  function calcAmount(uint _wei, uint _rate) 
    constant
    returns (uint) 
  {
    return SafeMath.div(SafeMath.mul(_wei, _rate), 1 ether);
  } 
  
  // Given the rate of a purchase and the remaining tokens in this tranche, it
  // will throw if the sale would take it past the limit of the tranche.
  // Returns `amount` in scope as the number of ADX tokens that it will purchase.
  function processPurchase(uint _rate, uint _remaining)
    internal
    returns (uint o_amount)
  {
    o_amount = calcAmount(msg.value, _rate);

    if (o_amount > _remaining) throw;
    if (!multisigAddress.send(msg.value)) throw;

    balances[ownerAddress] = balances[ownerAddress].sub(o_amount);
    balances[msg.sender] = balances[msg.sender].add(o_amount);

    ADXSold += o_amount;
    etherRaised += msg.value;
  }

  //Special Function can only be called by pre-buy and only during the pre-crowdsale period.
  function preBuy()
    payable
    is_pre_crowdfund_period
    is_not_halted
  {
    // Pre-buy participants would get the first-day price, as well as a bonus of vested tokens
    uint priceVested = 0;

    if (msg.sender == preBuy1) priceVested = preBuyPrice1;
    if (msg.sender == preBuy2) priceVested = preBuyPrice2;
    if (msg.sender == preBuy3) priceVested = preBuyPrice3;

    if (priceVested == 0) throw;

    uint amount = processPurchase(PRICE_STAGE_ONE + priceVested, SafeMath.sub(PREBUY_PORTION_MAX, prebuyPortionTotal));
    grantVestedTokens(msg.sender, calcAmount(msg.value, priceVested), 
      uint64(now), uint64(now) + 91 days, uint64(now) + 365 days, 
      false, false
    );
    prebuyPortionTotal += amount;
    PreBuy(amount);
  }

  //Default function called by sending Ether to this address with no arguments.
  //Results in creation of new ADX Tokens if transaction would not exceed hard limit of ADX Token.
  function()
    payable
    is_crowdfund_period
    is_not_halted
  {
    uint amount = processPurchase(getPriceRate(), SafeMath.sub(ALLOC_CROWDSALE, ADXSold));
    Buy(msg.sender, amount);
  }

  // To be called at the end of crowdfund period
  // WARNING: transfer(), which is called by grantVestedTokens(), wants a minimum message length
  function grantVested(address _adexTeamAddress, address _adexFundAddress)
    is_crowdfund_completed
    only_owner
    is_not_halted
  {
    // Grant tokens pre-allocated for the team
    grantVestedTokens(
      _adexTeamAddress, ALLOC_TEAM,
      uint64(now), uint64(now) + 91 days , uint64(now) + 365 days, 
      false, false
    );

    // Grant tokens that remain after crowdsale to the AdEx fund, vested for 2 years
    grantVestedTokens(
      _adexFundAddress, balances[ownerAddress],
      uint64(now), uint64(now) + 182 days , uint64(now) + 730 days, 
      false, false
    );
  }

  //May be used by owner of contract to halt crowdsale and no longer except ether.
  function toggleHalt(bool _halted)
    only_owner
  {
    halted = _halted;
  }

  //failsafe drain
  function drain()
    only_owner
  {
    if (!ownerAddress.send(this.balance)) throw;
  }
}

  Contract ABI  
[{"constant":true,"inputs":[],"name":"PREBUY_PORTION_MAX","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_holder","type":"address"}],"name":"tokenGrantsCount","outputs":[{"name":"index","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"PRICE_STAGE_TWO","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"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":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"preBuy3","outputs":[{"name":"","type":"address"}],"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":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"preBuy1","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"publicEndTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"grants","outputs":[{"name":"granter","type":"address"},{"name":"value","type":"uint256"},{"name":"cliff","type":"uint64"},{"name":"vesting","type":"uint64"},{"name":"start","type":"uint64"},{"name":"revokable","type":"bool"},{"name":"burnsOnRevoke","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"ADXSold","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"preBuy2","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"multisigAddress","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"ALLOC_BOUNTIES","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"publicStartTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_holder","type":"address"},{"name":"_grantId","type":"uint256"}],"name":"tokenGrant","outputs":[{"name":"granter","type":"address"},{"name":"value","type":"uint256"},{"name":"vested","type":"uint256"},{"name":"start","type":"uint64"},{"name":"cliff","type":"uint64"},{"name":"vesting","type":"uint64"},{"name":"revokable","type":"bool"},{"name":"burnsOnRevoke","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"STAGE_TWO_TIME_END","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"holder","type":"address"}],"name":"lastTokenIsTransferableDate","outputs":[{"name":"date","type":"uint64"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"ALLOC_WINGS","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"STAGE_ONE_TIME_END","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_wei","type":"uint256"},{"name":"_rate","type":"uint256"}],"name":"calcAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"ALLOC_CROWDSALE","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"adexTeamAddress","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"getPriceRate","outputs":[{"name":"o_rate","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"privateStartTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_halted","type":"bool"}],"name":"toggleHalt","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"ownerAddress","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"PRICE_STAGE_ONE","outputs":[{"name":"","type":"uint256"}],"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":"_start","type":"uint64"},{"name":"_cliff","type":"uint64"},{"name":"_vesting","type":"uint64"},{"name":"_revokable","type":"bool"},{"name":"_burnsOnRevoke","type":"bool"}],"name":"grantVestedTokens","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"drain","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"prebuyPortionTotal","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"hardcapInEth","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"ALLOC_TEAM","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"halted","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"etherRaised","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"holder","type":"address"},{"name":"time","type":"uint64"}],"name":"transferableTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"preBuyPrice1","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"preBuyPrice2","outputs":[{"name":"","type":"uint256"}],"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":true,"inputs":[{"name":"tokens","type":"uint256"},{"name":"time","type":"uint256"},{"name":"start","type":"uint256"},{"name":"cliff","type":"uint256"},{"name":"vesting","type":"uint256"}],"name":"calculateVestedTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"PRICE_STAGE_THREE","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_adexTeamAddress","type":"address"},{"name":"_adexFundAddress","type":"address"}],"name":"grantVested","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_holder","type":"address"},{"name":"_grantId","type":"uint256"}],"name":"revokeTokenGrant","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"preBuyPrice3","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"PRICE_STANDARD","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"STAGE_THREE_TIME_END","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"preBuy","outputs":[],"payable":true,"type":"function"},{"inputs":[{"name":"_multisig","type":"address"},{"name":"_adexTeam","type":"address"},{"name":"_publicStartTime","type":"uint256"},{"name":"_privateStartTime","type":"uint256"},{"name":"_hardcapInEth","type":"uint256"},{"name":"_prebuy1","type":"address"},{"name":"_preBuyPrice1","type":"uint256"},{"name":"_prebuy2","type":"address"},{"name":"_preBuyPrice2","type":"uint256"},{"name":"_prebuy3","type":"address"},{"name":"_preBuyPrice3","type":"uint256"}],"payable":false,"type":"constructor"},{"payable":true,"type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_amount","type":"uint256"}],"name":"PreBuy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_recipient","type":"address"},{"indexed":false,"name":"_amount","type":"uint256"}],"name":"Buy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"grantId","type":"uint256"}],"name":"NewTokenGrant","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 Switch To Opcodes View
601460035560a0604052600460608190527f41644578000000000000000000000000000000000000000000000000000000006080908152620000459160059190620001e8565b506040805180820190915260038082527f414458000000000000000000000000000000000000000000000000000000000060209092019182526200008c91600691620001e8565b50600460075534156200009b57fe5b604051610160806200267683398101604090815281516020830151918301516060840151608085015160a086015160c087015160e08801516101008901516101208a0151610140909a0151979996979596949593949293919290915b600e8054600160a060020a031990811633600160a060020a0390811691909117835560088c905560098b90556224ea008c01600a55600c805483168f8316179055600d805483168e831617808255600b8c9055600f805485168c851617905560128a90556010805485168a851617905560138890556011805490941687841617909355601485905591811660009081526001602052604080822080546404a817c80090810190915593548316825280822080549094019093558354821681528281208054642540be400001905592541682529020805464ba43b740000190555b505050505050505050505062000292565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200022b57805160ff19168380011785556200025b565b828001600101855582156200025b579182015b828111156200025b5782518255916020019190600101906200023e565b5b506200026a9291506200026e565b5090565b6200028f91905b808211156200026a576000815560010162000275565b5090565b90565b6123d480620002a26000396000f3006060604052361561026f5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663028118a1811461031657806302a72a4c14610338578063031f22e71461036657806306fdde0314610388578063095ea7b3146104185780630fdfa5ee1461043957806318160ddd1461046557806323b872dd1461048757806327c1f423146104ae5780632c27e581146104da5780632c71e60a146104fc578063313ce5671461056d5780634433a4401461058f578063529865c9146105b15780635462870d146105dd57806354ecd994146106095780635fd1bbc41461062b578063600e85b71461064d5780636698baaa146106c75780636c182e99146106e95780636c9e27d6146106095780636f2590771461074457806370a08231146107665780637133c0c0146107945780637717403b146107bc5780637d264bad146107de5780638a4b08d91461080a5780638a7c63c51461082c5780638c3466901461084e5780638f84aa09146108655780638fd712ae1461089157806395d89b41146108b35780639754a4d9146109435780639890220b146109875780639b914973146109995780639d61e624146109bb578063a9059cbb146109dd578063b475a1c8146109fe578063b9b8af0b14610a20578063cd72ab6914610a44578063d347c20514610a66578063d719213e14610aa1578063dbc65f8514610ac3578063dd62ed3e14610ae5578063df3c211b14610b19578063e02f8d3314610b4a578063e877715814610b6c578063eb944e4c14610b90578063eed04e6914610bb1578063efe7926814610b4a578063f514f0f914610bf5578063f590aacc14610c17575b6103145b60006008544210156102855760006000fd5b61028d610c21565b156102985760006000fd5b60185460ff16156102a95760006000fd5b6102cd6102b4610c5e565b6102c86127106304c4b40002601654610cb1565b610cca565b604080518281529051919250600160a060020a033316917fe3d4187f6ca4248660cc0ac8b8056515bac4a8132be2eca31d6d0cc170722a7e9181900360200190a25b5b5b50565b005b341561031e57fe5b610326610dae565b60408051918252519081900360200190f35b341561034057fe5b610326600160a060020a0360043516610db7565b60408051918252519081900360200190f35b341561036e57fe5b610326610dd6565b60408051918252519081900360200190f35b341561039057fe5b610398610de2565b6040805160208082528351818301528351919283929083019185019080838382156103de575b8051825260208311156103de57601f1990920191602091820191016103be565b505050905090810190601f16801561040a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561042057fe5b610314600160a060020a0360043516602435610e70565b005b341561044157fe5b610449610f10565b60408051600160a060020a039092168252519081900360200190f35b341561046d57fe5b610326610f1f565b60408051918252519081900360200190f35b341561048f57fe5b610314600160a060020a0360043581169060243516604435610f25565b005b34156104b657fe5b610449610f4b565b60408051600160a060020a039092168252519081900360200190f35b34156104e257fe5b610326610f5a565b60408051918252519081900360200190f35b341561050457fe5b61051b600160a060020a0360043516602435610f60565b60408051600160a060020a039098168852602088019690965267ffffffffffffffff9485168787015292841660608701529216608085015290151560a0840152151560c0830152519081900360e00190f35b341561057557fe5b610326610fe6565b60408051918252519081900360200190f35b341561059757fe5b610326610fec565b60408051918252519081900360200190f35b34156105b957fe5b610449610ff2565b60408051600160a060020a039092168252519081900360200190f35b34156105e557fe5b610449611001565b60408051600160a060020a039092168252519081900360200190f35b341561061157fe5b610326611010565b60408051918252519081900360200190f35b341561063357fe5b610326611019565b60408051918252519081900360200190f35b341561065557fe5b61066c600160a060020a036004351660243561101f565b60408051600160a060020a03909916895260208901979097528787019590955267ffffffffffffffff9384166060880152918316608087015290911660a0850152151560c0840152151560e083015251908190036101000190f35b34156106cf57fe5b61032661123d565b60408051918252519081900360200190f35b34156106f157fe5b610705600160a060020a0360043516611244565b6040805167ffffffffffffffff9092168252519081900360200190f35b341561061157fe5b610326611010565b60408051918252519081900360200190f35b341561074c57fe5b6103266112df565b60408051918252519081900360200190f35b341561076e57fe5b610326600160a060020a03600435166112e6565b60408051918252519081900360200190f35b341561079c57fe5b610326600435602435611305565b60408051918252519081900360200190f35b34156107c457fe5b61032661132b565b60408051918252519081900360200190f35b34156107e657fe5b610449611334565b60408051600160a060020a039092168252519081900360200190f35b341561081257fe5b610326610c5e565b60408051918252519081900360200190f35b341561083457fe5b610326611343565b60408051918252519081900360200190f35b341561085657fe5b6103146004351515611349565b005b341561086d57fe5b610449611378565b60408051600160a060020a039092168252519081900360200190f35b341561089957fe5b610326611387565b60408051918252519081900360200190f35b34156108bb57fe5b610398611397565b6040805160208082528351818301528351919283929083019185019080838382156103de575b8051825260208311156103de57601f1990920191602091820191016103be565b505050905090810190601f16801561040a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561094b57fe5b610314600160a060020a036004351660243567ffffffffffffffff6044358116906064358116906084351660a435151560c4351515611425565b005b341561098f57fe5b6103146116a0565b005b34156109a157fe5b6103266116f6565b60408051918252519081900360200190f35b34156109c357fe5b6103266116fc565b60408051918252519081900360200190f35b34156109e557fe5b610314600160a060020a0360043516602435611702565b005b3415610a0657fe5b610326611744565b60408051918252519081900360200190f35b3415610a2857fe5b610a3061174d565b604080519115158252519081900360200190f35b3415610a4c57fe5b610326611756565b60408051918252519081900360200190f35b3415610a6e57fe5b610326600160a060020a036004351667ffffffffffffffff6024351661175c565b60408051918252519081900360200190f35b3415610aa957fe5b6103266118a5565b60408051918252519081900360200190f35b3415610acb57fe5b6103266118ab565b60408051918252519081900360200190f35b3415610aed57fe5b610326600160a060020a03600435811690602435166118b1565b60408051918252519081900360200190f35b3415610b2157fe5b6103266004356024356044356064356084356118de565b60408051918252519081900360200190f35b3415610b5257fe5b610326611937565b60408051918252519081900360200190f35b3415610b7457fe5b610314600160a060020a036004358116906024351661193e565b005b3415610b9857fe5b610314600160a060020a03600435166024356119e0565b005b3415610bb957fe5b610326611e09565b60408051918252519081900360200190f35b3415610b5257fe5b610326611937565b60408051918252519081900360200190f35b3415610bfd57fe5b610326611e16565b60408051918252519081900360200190f35b610314611e1d565b005b6000600a54421180610c3b575060165464ba43b740009010155b80610c4a5750600b5460155410155b15610c5757506001610c5b565b5060005b90565b60006000610c6e42600854610cb1565b905062093a80811115610c8657628954409150610cad565b62015180811115610ca1576064633db0d8c05b049150610cad565b60646345bcc8805b0491505b5090565b6000610cbf83831115611f47565b508082035b92915050565b6000610cd63484611305565b905081811115610ce65760006000fd5b600c54604051600160a060020a03909116903480156108fc02916000818181858888f193505050501515610d1a5760006000fd5b600e54600160a060020a0316600090815260016020526040902054610d45908263ffffffff610cb116565b600e54600160a060020a03908116600090815260016020526040808220939093553390911681522054610d7e908263ffffffff611f5816565b600160a060020a033316600090815260016020526040902055601680548201905560158054340190555b92915050565b642e90edd00081565b600160a060020a0381166000908152600460205260409020545b919050565b6064633db0d8c05b0481565b6005805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610e685780601f10610e3d57610100808354040283529160200191610e68565b820191906000526020600020905b815481529060010190602001808311610e4b57829003601f168201915b505050505081565b8015801590610ea35750600160a060020a0333811660009081526002602090815260408083209386168352929052205415155b15610eae5760006000fd5b600160a060020a03338116600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a35b5050565b601154600160a060020a031681565b60005481565b610f2d610c21565b1515610f395760006000fd5b610f44838383611f74565b5b5b505050565b600f54600160a060020a031681565b600a5481565b600460205281600052604060002081815481101515610f7b57fe5b906000526020600020906003020160005b5080546001820154600290920154600160a060020a03909116935090915067ffffffffffffffff80821691680100000000000000008104821691608060020a8204169060ff60c060020a820481169160c860020a90041687565b60075481565b60165481565b601054600160a060020a031681565b600c54600160a060020a031681565b6404a817c80081565b60085481565b600060006000600060006000600060006000600460008c600160a060020a0316600160a060020a031681526020019081526020016000208a81548110151561106357fe5b906000526020600020906003020160005b5090508060000160009054906101000a9004600160a060020a03169850806001015497508060020160109054906101000a900467ffffffffffffffff1695508060020160009054906101000a900467ffffffffffffffff1694508060020160089054906101000a900467ffffffffffffffff1693508060020160189054906101000a900460ff1692508060020160199054906101000a900460ff16915061122c8160e060405190810160405290816000820160009054906101000a9004600160a060020a0316600160a060020a0316600160a060020a03168152602001600182015481526020016002820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016002820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016002820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016002820160189054906101000a900460ff161515151581526020016002820160199054906101000a900460ff16151515158152505042611fa1565b96505b509295985092959890939650565b62093a8081565b600160a060020a03811660009081526004602052604081205442915b818110156112ce57600160a060020a038416600090815260046020526040902080546112c391908390811061129157fe5b906000526020600020906003020160005b506002015468010000000000000000900467ffffffffffffffff1684611ff1565b92505b600101611260565b5b5050919050565b6404a817c80081565b6201518081565b600160a060020a0381166000908152600160205260409020545b919050565b60006113226113148484612020565b670de0b6b3a764000061204f565b90505b92915050565b64ba43b7400081565b600d54600160a060020a031681565b60095481565b600e5433600160a060020a039081169116146113655760006000fd5b6018805460ff19168215151790555b5b50565b600e54600160a060020a031681565b60646345bcc880610dde565b0481565b6006805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610e685780601f10610e3d57610100808354040283529160200191610e68565b820191906000526020600020905b815481529060010190602001808311610e4b57829003601f168201915b505050505081565b60008567ffffffffffffffff168567ffffffffffffffff16108061145c57508467ffffffffffffffff168467ffffffffffffffff16105b156114675760006000fd5b60035461147389610db7565b111561147f5760006000fd5b600160a060020a03881660009081526004602052604090208054600181016114a783826122e0565b916000526020600020906003020160005b60e060405190810160405280876114d05760006114d2565b335b600160a060020a03908116825260208083018e905267ffffffffffffffff8c81166040808601919091528c82166060808701919091528f83166080808801919091528d151560a0808901919091528d151560c09889015288518b5473ffffffffffffffffffffffffffffffffffffffff19169716969096178a559387015160018a01559086015160029098018054918701519387015194870151969095015167ffffffffffffffff19909116978216979097176fffffffffffffffff0000000000000000191668010000000000000000928216929092029190911777ffffffffffffffff000000000000000000000000000000001916608060020a92909116919091021778ff000000000000000000000000000000000000000000000000191660c060020a921515929092029190911779ff00000000000000000000000000000000000000000000000000191660c860020a931515939093029290921790915550905061163f8888611702565b87600160a060020a031633600160a060020a03167ff9565aecd648a0466ffb964a79eeccdf1120ad6276189c687a6e9fe73984d9bb8960018503604051808381526020018281526020019250505060405180910390a35b5050505050505050565b600e5433600160a060020a039081169116146116bc5760006000fd5b600e54604051600160a060020a039182169130163180156108fc02916000818181858888f1935050505015156116f25760006000fd5b5b5b565b60175481565b600b5481565b33600160a060020a031682600160a060020a0316141561172157610f0c565b611729610c21565b15156117355760006000fd5b610f0c828261206c565b5b5050565b642540be400081565b60185460ff1681565b60155481565b6000600060006000600061176f87610db7565b935083151561178857611781876112e6565b945061189b565b60009250600091505b8382101561187157600160a060020a0387166000908152600460205260409020805461186391859161185e9190869081106117c857fe5b906000526020600020906003020160005b506040805160e0810182528254600160a060020a031681526001830154602082015260029092015467ffffffffffffffff8082169284019290925268010000000000000000810482166060840152608060020a8104909116608083015260ff60c060020a82048116151560a084015260c860020a90910416151560c082015289612097565b611f58565b92505b600190910190611791565b61188361187d886112e6565b84610cb1565b90506118988161189389896120c0565b6120d4565b94505b5050505092915050565b60125481565b60135481565b600160a060020a038083166000908152600260209081526040808320938516835292905220545b92915050565b60006000838610156118f3576000915061192d565b8286106119025786915061192d565b611927611918886119138989610cb1565b612020565b6119228588610cb1565b61204f565b90508091505b5095945050505050565b6289544081565b611946610c21565b15156119525760006000fd5b600e5433600160a060020a0390811691161461196e5760006000fd5b60185460ff161561197f5760006000fd5b61199f82642540be4000426277f88081016301e133808201600080611425565b600e54600160a060020a0316600090815260016020526040812054610f0c91839190429062eff1008201906303c2670083019080611425565b5b5b5b5b5050565b600160a060020a038216600090815260046020526040812080548291829185908110611a0857fe5b906000526020600020906003020160005b50600281015490935060c060020a900460ff161515611a385760006000fd5b825433600160a060020a03908116911614611a535760006000fd5b600283015460c860020a900460ff16611a6c5733611a70565b61dead5b6040805160e0810182528554600160a060020a0316815260018601546020820152600286015467ffffffffffffffff8082169383019390935268010000000000000000810483166060830152608060020a8104909216608082015260ff60c060020a83048116151560a083015260c860020a909204909116151560c0820152909250611afc9042612097565b600160a060020a038616600090815260046020526040902080549192509085908110611b2457fe5b906000526020600020906003020160005b50805473ffffffffffffffffffffffffffffffffffffffff19168155600060018083018290556002909201805479ffffffffffffffffffffffffffffffffffffffffffffffffffff19169055600160a060020a038716815260046020526040902080549091611baa919063ffffffff610cb116565b81548110611bb457fe5b906000526020600020906003020160005b50600160a060020a0386166000908152600460205260409020805486908110611bea57fe5b906000526020600020906003020160005b508154815473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03918216178255600180840154908301556002928301805493909201805467ffffffffffffffff191667ffffffffffffffff94851617808255835468010000000000000000908190048616026fffffffffffffffff000000000000000019909116178082558354608060020a9081900490951690940277ffffffffffffffff000000000000000000000000000000001990941693909317808455825460ff60c060020a918290048116151590910278ff0000000000000000000000000000000000000000000000001990921691909117808555925460c860020a9081900490911615150279ff0000000000000000000000000000000000000000000000000019909216919091179091558516600090815260046020526040902080546000190190611d4990826122e0565b50600160a060020a038216600090815260016020526040902054611d73908263ffffffff611f5816565b600160a060020a038084166000908152600160205260408082209390935590871681522054611da8908263ffffffff610cb116565b600160a060020a0380871660008181526001602090815260409182902094909455805185815290519286169391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a35b5050505050565b60145481565b6289544081565b6224ea0081565b6000600060085442101580611e33575060095442105b15611e3e5760006000fd5b60185460ff1615611e4f5760006000fd5b600f546000925033600160a060020a0390811691161415611e705760125491505b60105433600160a060020a0390811691161415611e8d5760135491505b60115433600160a060020a0390811691161415611eaa5760145491505b811515611eb75760006000fd5b611ede8260646345bcc8805b04016102c86127106301312d0002601754610cb1565b610cca565b9050611f0533611eee3485611305565b42426277f88001426301e133800160006000611425565b60178054820190556040805182815290517f9e352721883879ced8efbcaca8e7316a3367205e490f0829362d23c63819e8ee9181900360200190a15b5b5b5050565b80151561030f5760006000fd5b5b50565b6000828201611f6984821015611f47565b8091505b5092915050565b8281611f80824261175c565b811115611f8d5760006000fd5b611e028585856120ee565b5b5b5050505050565b600061132283602001518367ffffffffffffffff16856080015167ffffffffffffffff16866040015167ffffffffffffffff16876060015167ffffffffffffffff166118de565b90505b92915050565b60008167ffffffffffffffff168367ffffffffffffffff1610156120155781611322565b825b90505b92915050565b6000828202611f6984158061203f575083858381151561203c57fe5b04145b611f47565b8091505b5092915050565b60006000828481151561205e57fe5b0490508091505b5092915050565b3381612078824261175c565b8111156120855760006000fd5b61208f8484612212565b5b5b50505050565b60006113226120a68484611fa1565b60208501519063ffffffff610cb116565b90505b92915050565b6000611322836112e6565b90505b92915050565b60008183106120155781611322565b825b90505b92915050565b6000606060643610156121015760006000fd5b600160a060020a038086166000908152600260209081526040808320338516845282528083205493881683526001909152902054909250612148908463ffffffff611f5816565b600160a060020a03808616600090815260016020526040808220939093559087168152205461217d908463ffffffff610cb116565b600160a060020a0386166000908152600160205260409020556121a6828463ffffffff610cb116565b600160a060020a038087166000818152600260209081526040808320338616845282529182902094909455805187815290519288169391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a35b5b5050505050565b604060443610156122235760006000fd5b600160a060020a03331660009081526001602052604090205461224c908363ffffffff610cb116565b600160a060020a033381166000908152600160205260408082209390935590851681522054612281908363ffffffff611f5816565b600160a060020a038085166000818152600160209081526040918290209490945580518681529051919333909316927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35b5b505050565b815481835581811511610f4457600302816003028360005260206000209182019101610f449190612344565b5b505050565b815481835581811511610f4457600302816003028360005260206000209182019101610f449190612344565b5b505050565b610c5b91905b80821115610cad57805473ffffffffffffffffffffffffffffffffffffffff191681556000600182015560028101805479ffffffffffffffffffffffffffffffffffffffffffffffffffff1916905560030161234a565b5090565b905600a165627a7a72305820826d02e653aaddbc978d99fe74ac88ef6f430f39fe9d2a08592ef3c71e540b9d002900000000000000000000000020b014a0b669906781250cdcf9966d5c4ce1527a0000000000000000000000008f493c12c4f5ff5fd510549e1e28ea3dd101e850000000000000000000000000000000000000000000000000000000005955768400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000001523437df0c6f68fa555b244f012458668a4c9f00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

   Swarm Source:
bzzr://826d02e653aaddbc978d99fe74ac88ef6f430f39fe9d2a08592ef3c71e540b9d
View All
Block Age txn Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "downvote" button for any spammy posts, and the "upvote" for interesting conversations.