Sponsored:   Ubex.com - Additional 17% of tokens are available for purchase! Trading on exchanges already started.
 Latest 25 txns from a total Of 102390 transactions

TxHash Age From To Value [TxFee]
0x9ab0703550813da6fb72fcc11bff7afe3bbdc57cec1af2dd3e5d77a168d957e14 mins agoBittrex_1  IN   AdEx0 Ether0.0053526
0xb789bfd3b776f9f3e09e67e269e83d0ff457dda455b4a2946460c05b3a4ee91310 mins ago0xb13dd98705529193c5f1371366f39e15897978e9  IN   AdEx0 Ether0.001579566
0x2922e5ec84f3619b0562c2cc4f103976874f31a638cecb4ed9603c8a5dc3a84d1 hr 4 mins ago0x40120b5a5994f7e3afe3c0a3dc56d1ccb0b75262  IN   AdEx0 Ether0.0004718
0x35f2c2c5ba24ce8e3df8c178b72b5342bec2f2b4feb9af36fcbca45d578b305c1 hr 13 mins agoBittrex_1  IN   AdEx0 Ether0.005359
0x50c610c9be8b32a7dc67c91f53c74411a68330ec340d4671b430218a44c9b9152 hrs 23 mins agoBittrex_1  IN   AdEx0 Ether0.0053526
0x3e1cd05544fd11abef4c43e7cd0a235b15cede7277e1b2c841159ed370cd3c203 hrs 34 mins ago0x8ec966672b566414b2fa76f3901a0625e8176e84  IN   AdEx0 Ether0.00047052
0xc0726f7b67409e3fcabf84464ce0f0e90c6078758626ece0ddf5dbab1f4d09343 hrs 35 mins agoHitBTC_2  IN   AdEx0 Ether0.00211893
0x0ae747dccf5cf5d0cb636ac9350bdf6c1e4df74fb6004eab7364aa01a0b1a0743 hrs 48 mins agoBittrex_1  IN   AdEx0 Ether0.0053526
0x59b88f9b63126fd5a44b1210fb688d7d2fd9afcfd7ab8c0f6f63176b3cb2b9993 hrs 58 mins ago0x81e3ea221db59f21678bc1ae2006a5a44943317e  IN   AdEx0 Ether0.00214104
0x8f6718c0a799d9ea0ba065b478dc84f4238b6225f2605b13c12fc32d2256d9d53 hrs 59 mins agoHitBTC_2  IN   AdEx0 Ether0.0019263
0x4cf83a556810b95b3637af3de93cb535e2f4a4837be6ed5f848d94c3636c55c54 hrs 24 mins ago0x40120b5a5994f7e3afe3c0a3dc56d1ccb0b75262  IN   AdEx0 Ether0.000688014
0x6a234df7988f51a1d70116f2968a1284c583a3ba922e2bdade6742c90c931d204 hrs 24 mins ago0x40120b5a5994f7e3afe3c0a3dc56d1ccb0b75262  IN   AdEx0 Ether0.00098462448
0x0ea423513ec76a4921fe631b6e7e31aac398dcab72e3bbd76747d5e3837e2ad44 hrs 24 mins ago0x40120b5a5994f7e3afe3c0a3dc56d1ccb0b75262  IN   AdEx0 Ether0.00120309
0x443e8a47b76adae6b36f1699ccfce7b06a83444307ec4bec3112abc740b445354 hrs 24 mins ago0x40120b5a5994f7e3afe3c0a3dc56d1ccb0b75262  IN   AdEx0 Ether0.001299582
0x16aec566f677029752b99097dd5f38efdd2fbab8a79cc0d3dbc7bceb82c4e06d4 hrs 24 mins ago0x40120b5a5994f7e3afe3c0a3dc56d1ccb0b75262  IN   AdEx0 Ether0.00152892
0xc9e35be8d2bacfd7d42bff602359289b73da3aa8dc7f9548ad2c5ea9821369094 hrs 24 mins ago0x40120b5a5994f7e3afe3c0a3dc56d1ccb0b75262  IN   AdEx0 Ether0.001390858462
0x66f6004a2a22e245d5606261bef059d6903a319b734564b60c3db94370ead9604 hrs 24 mins ago0x40120b5a5994f7e3afe3c0a3dc56d1ccb0b75262  IN   AdEx0 Ether0.001299582
0xdac85f3272c2269a5b1f792d2bfc6dccfd216cf07632b78e837768c2064b5bca4 hrs 24 mins ago0x40120b5a5994f7e3afe3c0a3dc56d1ccb0b75262  IN   AdEx0 Ether0.001554402
0xa59b58395efff7eec1765a8cffc966d0076dd97bb23bda5e553b8f7cfdc013054 hrs 24 mins ago0x40120b5a5994f7e3afe3c0a3dc56d1ccb0b75262  IN   AdEx0 Ether0.00152892
0x3a1f1554351058c7a153b55c7651b39276ff77d7f2aec19b4f6686eaba7a5f294 hrs 24 mins ago0x40120b5a5994f7e3afe3c0a3dc56d1ccb0b75262  IN   AdEx0 Ether0.001554402
0xcb6b445537ace6a4f03729b6a885fec626bd28452ebbd8786e5d1ccc18c002704 hrs 24 mins ago0x40120b5a5994f7e3afe3c0a3dc56d1ccb0b75262  IN   AdEx0 Ether0.00152892
0x6185fd1d64b9527292ba8b74e9b1afb4ae9e2afa86d3025d739676289b52c3ac4 hrs 25 mins ago0x40120b5a5994f7e3afe3c0a3dc56d1ccb0b75262  IN   AdEx0 Ether0.00152892
0x018cc70939b3c1cc42890820e3c0038571e8bec9321ffb889753fe211ce208884 hrs 25 mins ago0x40120b5a5994f7e3afe3c0a3dc56d1ccb0b75262  IN   AdEx0 Ether0.00152892
0x48e71d1f38ed946e5af567fd307e79b3f7d70a857b77efb450e1aca5cf8b3e9a4 hrs 25 mins ago0x40120b5a5994f7e3afe3c0a3dc56d1ccb0b75262  IN   AdEx0 Ether0.001554402
0x664be814725aca83ef068bfa8236d0a2c2972c51afb73efabe2eb70ec42375224 hrs 25 mins ago0x40120b5a5994f7e3afe3c0a3dc56d1ccb0b75262  IN   AdEx0 Ether0.00152892
[ 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
0x20cef361ff34460a83e2a9602085f997eca21893d26a7fcf030a5ea6eaed6dc23954087412 days 20 hrs ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a70 Ether
0xf877c2b9fd4eeaf2ecf172bce753981783d0cf61a95481e73f010f6b65c9f7f63954086412 days 20 hrs ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a1 Ether
0x8b7163738298563c5c4cc9c90b5471d7a6274eb6899544ab9cacdab52af6c2463954086412 days 20 hrs ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a1 Ether
0x4a811e32f3295940119bd0a824d7786c738b0fea31987f21a2edde58bcf705743954086412 days 20 hrs ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a1 Ether
0xc92bc87f01ef9755ec3b5a16d8ed94bcef746393a66654bb1d6987e0469475a63954085412 days 20 hrs ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a5 Ether
0x34ef3591e96c744de8a18ba9c5aaf08092137710517b98fe7602d22b83d58d4e3954084412 days 20 hrs ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a5 Ether
0xd0f0597ff65cf200155976a67628aad46e58c7091b2c4d5af33f3c0337f6494b3954082412 days 20 hrs ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a1 Ether
0xed0cf8aa40bb3113c4b597543d102ee5205cf0a0c7a013cf169b497cefffafd03954082412 days 20 hrs ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a40 Ether
0x2cf718014f6c56e9450194454a5955855056cd03d10dd598b0ff308e94134e223954082412 days 20 hrs ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a2 Ether
0x9b71ef70d62d8782a15d7476216f6a41b9b7ff10590f088d5c0c00db2625b9343954079412 days 20 hrs ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a2 Ether
0xd97856ea4e552e40868cb2de00d22598adcc3443c11f8b2d1884dabd439dfef73954074412 days 20 hrs ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a1 Ether
0xbff165147b7cb8c7dbb6b94c79c38689f0083033162f6fd3dc2cb38de954ec133954074412 days 20 hrs ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a0.4 Ether
0x9a2a67d8670d25a86acf2b42e842f1976d8795d1e4903e210384ec50259ff2483954072412 days 20 hrs ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a2 Ether
0x8865594a8f87c0436e96bac1f3c3a765f593b7ce6bbc9235523b58f7ca410b143954072412 days 20 hrs ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a1 Ether
0x8de6662bbcd27d14653f775f0bfcf8e9f6f2967bd3dee3515cdb571cb841785b3954068412 days 20 hrs ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a0.2 Ether
0xc3ea9ae9577737da1f59caf58a77d4bd697bdc96d01b13134cecb6b2dac498913954068412 days 20 hrs ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a1 Ether
0x218144c0237b08d351b8fd71c01990e81b09cd7d8d94d9820f9727905f78511c3954066412 days 20 hrs ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a3 Ether
0xf70aa8ea73c4882c502615444579de4950635abe97f2559f2bdba1ef977b3e353954066412 days 20 hrs ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a0.99475 Ether
0xa75a74ed83aa1ad128c4f4e0d99722d6d17d9ce9b0330d41a8e82796756c49ea3954066412 days 20 hrs ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a2 Ether
0x8134c9700199840059b2cbb1eb943495c42aa79fdadc22e196583a17a1c1e6493954066412 days 20 hrs ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a5 Ether
0x737e8be28f2752926bd787e065330e388907025455657c1e3ac825fe0f189bce3954066412 days 20 hrs ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a49.93882261 Ether
0x6e255b6253f70ed5ddb23b207411695e95de1a86ba8e90fdb6674b4d038ff85a3954060412 days 20 hrs ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a4.44455785 Ether
0x2f800dd53d45a90f3e26ee5bb9ec392a2d0653a413c9c009f568ae1ebe59ffa33954060412 days 20 hrs ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a0.5 Ether
0x58b01f8ccced5a7c549b8789157ce95612d21633dcddfe6281a76252659303783954055412 days 20 hrs ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a1 Ether
0xde86b22ccd5472804c68c72e7c0e6e5b94cd34fc1f8a828538f347c0294414273954053412 days 20 hrs ago0x4470bb87d77b963a013db939be332f927f2b992e0x20b014a0b669906781250cdcf9966d5c4ce1527a5 Ether
[ Download CSV Export  ] 
Warning: The compiled contract might be susceptible to NestedArrayFunctionCallDecoder (medium-severity), ZeroFunctionSelector (very low-severity), DelegateCallReturnValue (low-severity), ECRecoverMalformedInput (medium-severity), SkipEmptyStringLiteral (low-severity) Solidity compiler bugs.

Contract Source Code Verified (Similar match)
Note: Displaying similar matching verified source code at contract 0xE4Ef6df2c125B61e7DBa539734d84f31D52DddFE(excluding Constructor Arguments if any)
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.