Contract 0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc

 

TxHash Block Age From To Value [TxFee]
0xefa9cec995407ea5e03ddbd7465d9f179a5e1dbc6231eb63771c77891d221b39702931469 days 15 hrs ago0xf3860788d1597cecf938424baabe976fac87dc26 IN  0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0 Ether0.0001297351
0x7d73735e46412dfd94f97afdb012e705be1d10a8f3cea0f3be68bd9024393079702928369 days 15 hrs ago0xf3860788d1597cecf938424baabe976fac87dc26 IN  0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0 Ether0.0001298055
0xc6ea572e2ba6dc95673fcf9f0823b4fd34ed064e1dc3acd40a89306ab5d574fe702928269 days 15 hrs ago0xf3860788d1597cecf938424baabe976fac87dc26 IN  0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0 Ether0.0001297351
0xab2f22f52d9ed14585f479f3d6c929b851daee7ce3afd411a0d4af8e981d12ce702923369 days 15 hrs ago0xf3860788d1597cecf938424baabe976fac87dc26 IN  0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0 Ether0.0002289903
0x7478d63f97ed56a30a7f5a79986e3d35c031e1296baf43a84ab09d6843774f16702923169 days 15 hrs ago0xf3860788d1597cecf938424baabe976fac87dc26 IN  0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0 Ether0.0002291311
0x262d79bbdb81cb8d57b5b55bda361f46e6ae47718986539617ae216927d90c37702922069 days 15 hrs ago0xf3860788d1597cecf938424baabe976fac87dc26 IN  0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0 Ether0.0002289903
0x0ada5035c34e2ceae92dd5c6b6749e04e4df8d243bcd3749789944c401c43944694459084 days 5 hrs ago0xf3860788d1597cecf938424baabe976fac87dc26 IN  0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0 Ether0.0002714115
0x163e461edc9b28ad4367d84194367445d84b051aa43623f544b699499d923517694458784 days 5 hrs ago0xf3860788d1597cecf938424baabe976fac87dc26 IN  0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0 Ether0.000259611
0x64f3bdf83a1821d7614fa729076a1d29605189e9eb490301f39fa6a2c205ee00693279886 days 5 hrs ago0xf3860788d1597cecf938424baabe976fac87dc26 IN  0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0 Ether0.0004375665
0x72eaa2f14df5719751cb5ab6001b97f0e5de2561f3ce4c51eed2a054e60e7c97693279586 days 5 hrs ago0xf3860788d1597cecf938424baabe976fac87dc26 IN  0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0 Ether0.0004371633
0x1e8062d0e73ba1219771e8af440cd3d0901e3047a99b4d6bc4a58fa4c5df3c0a691532889 days 5 hrs ago0xf3860788d1597cecf938424baabe976fac87dc26 IN  0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0 Ether0.0009235127
0xab4c40c45ba99d48b9fca7d54c2676698ec53c00608fafe478308a90fb15c281691291389 days 15 hrs ago0xf3860788d1597cecf938424baabe976fac87dc26 IN  0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0 Ether0.0002948525
0x0a853e7e3b240ec52c3e5dad573001f6f8e1d4ab0e885ad7690be2a916fd6b77691291389 days 15 hrs ago0xf3860788d1597cecf938424baabe976fac87dc26 IN  0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0 Ether0.0002950125
0xb2d51da6ae585b3b9b8bafbe08ce480303239feb3356510318e321bec512d531691288989 days 15 hrs ago0xf3860788d1597cecf938424baabe976fac87dc26 IN  0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0 Ether0.0002950125
0x1eec81d022cc3c63c8bb665f97b0b039d82fc0c9568dc25c66377e86af779721691288989 days 15 hrs ago0xf3860788d1597cecf938424baabe976fac87dc26 IN  0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0 Ether0.0002950125
0x846000948d23457869860983cf7f944e72929b7bd2890e2c5fadd467f77204e0691287889 days 15 hrs ago0xf3860788d1597cecf938424baabe976fac87dc26 IN  0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0 Ether0.0002950125
0xcf2cb11158b3cd2919552f4da3e0cb9be14c33079e82e7c9cfc9f49942b37a36691287889 days 15 hrs ago0xf3860788d1597cecf938424baabe976fac87dc26 IN  0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0 Ether0.0002950125
0xb3df4ade5732005d820bdb1bf0c8578d43d40b6f2454cb9bbcc86a0481583cf2691287489 days 15 hrs ago0xf3860788d1597cecf938424baabe976fac87dc26 IN  0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0 Ether0.000283212
0xb231ec5fe79c42a9d212be68f8c9bbefa927a1e16ced03d66aa857fa2375fbce691287489 days 15 hrs ago0xf3860788d1597cecf938424baabe976fac87dc26 IN  0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0 Ether0.0002950125
0x03535913dc2ba52ce1e3d7863c93bc56dbcec8830efa72d7ecab349e6e87ba5d691274689 days 15 hrs ago0xf3860788d1597cecf938424baabe976fac87dc26 IN  0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0 Ether0.000666768
0xcec301347a4d263e1e52f26efecaaaf71f3d18dbb96ffef2eebcc10ee847b424691274189 days 15 hrs ago0xf3860788d1597cecf938424baabe976fac87dc26 IN  0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0 Ether0.0006661536
0xd9d9f35a6f006d2d4d55414b44d683fc6de9a091bf7c6757a8bb8749c41797ab691273489 days 16 hrs ago0xf3860788d1597cecf938424baabe976fac87dc26 IN  0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0 Ether0.0006663584
0x636a5f636059202d8546e5cf2b90ed69672529073ea41554350b1b44aa9c5e37691273189 days 16 hrs ago0xf3860788d1597cecf938424baabe976fac87dc26 IN  0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0 Ether0.0006665632
0xf89571179c61b9cca29fec6578e634739a4a13bb4df41c4d17d51e988509b707691272489 days 16 hrs ago0xf3860788d1597cecf938424baabe976fac87dc26 IN  0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0 Ether0.0006665632
0x3bf4371d64d0af41f58d5e130595baabce562893c238743929249bc9e2b65b79691271789 days 16 hrs ago0xf3860788d1597cecf938424baabe976fac87dc26 IN  0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0 Ether0.0006663584
[ Download CSV Export 

Latest 11 internal transactions Internal Transactions as a result of Contract Execution

Parent TxHash Block Age From To Value
0x40829cc29c9a710295494fb420ed5b4c4191a7aebb9f3a35ec9daafca2c7df116772070112 days 23 hrs ago0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0xf3860788d1597cecf938424baabe976fac87dc260.001 Ether
0x4114c9c2939273dcc2d25f8d8a6c0c080e8be4d4656aa49c6a3c3c9533a989946453155165 days 1 hr ago0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0xf3860788d1597cecf938424baabe976fac87dc260.001 Ether
0xa67987ddc693b8b12971548decf54bfb04c543d78b438915ef31abc6b5680a716453155165 days 1 hr ago0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0xf3860788d1597cecf938424baabe976fac87dc260.001 Ether
0xd1e14c9f779e2bca728bb0e6083f4d6e5b5c1f5d9881dbdbaee4fa637e3e672f6204054206 days 11 hrs ago0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0xf3860788d1597cecf938424baabe976fac87dc260.001 Ether
0xf8d535a5d7c74f7e5bb94753c7e89dd39814eb575b8ffaf9f0a22fd93c6aeb8e6140674217 days 4 hrs ago0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0xf3860788d1597cecf938424baabe976fac87dc260.001 Ether
0xf0e3c844b8dd2929f399055a7da59a9779d78bb610c2ae6df36aaa1e5714aba56134736218 days 4 hrs ago0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0xf3860788d1597cecf938424baabe976fac87dc260.01 Ether
0xfb94916449847b811ef2a71f70de87bce9928fbbe56bea66af39b87fd3b30d176131818218 days 16 hrs ago0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0xf3860788d1597cecf938424baabe976fac87dc260.001 Ether
0x839cf296fddeebacc41f73153e4dd194cba9fae2f3baa9f0214b4f920230915a6101457223 days 19 hrs ago0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0xf3860788d1597cecf938424baabe976fac87dc260.001 Ether
0xe1e5bb0f5f15bb234373f35c8c07d99234f1428c8cfd71a6fe079540bb3679766053090231 days 23 hrs ago0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0xf3860788d1597cecf938424baabe976fac87dc260.001 Ether
0xd76043c1e5e83801b6619b1390fc0434612992066ed73257d5ea88d6471c437f6043805233 days 12 hrs ago0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0xf3860788d1597cecf938424baabe976fac87dc260.01 Ether
0x3481a720ad4476025acbf4649f4340e82cb98e536051edfd52fe817ba3cd874c6036869234 days 16 hrs ago0x7f737b66921d18b008dc9c3a9b933a3bf559f1bc0xf3860788d1597cecf938424baabe976fac87dc260.001 Ether
[ Download CSV Export 
Warning: The compiled contract might be susceptible to ExpExponentCleanup (medium/high-severity), EventStructWrongData (very low-severity) Solidity Compiler Bugs.

Contract Source Code Verified (Exact Match)
Contract Name: InterfaceToken
Compiler Version: v0.4.24+commit.e67f0147
Optimization Enabled: Yes
Runs (Optimizer):  200


Contract Source Code
pragma solidity ^0.4.24;

// File: contracts/Strings.sol

library Strings {
  // via https://github.com/oraclize/ethereum-api/blob/master/oraclizeAPI_0.5.sol
  function strConcat(string _a, string _b, string _c, string _d, string _e) internal pure returns (string) {
    bytes memory _ba = bytes(_a);
    bytes memory _bb = bytes(_b);
    bytes memory _bc = bytes(_c);
    bytes memory _bd = bytes(_d);
    bytes memory _be = bytes(_e);
    string memory abcde = new string(_ba.length + _bb.length + _bc.length + _bd.length + _be.length);
    bytes memory babcde = bytes(abcde);
    uint k = 0;
    for (uint i = 0; i < _ba.length; i++) babcde[k++] = _ba[i];
    for (i = 0; i < _bb.length; i++) babcde[k++] = _bb[i];
    for (i = 0; i < _bc.length; i++) babcde[k++] = _bc[i];
    for (i = 0; i < _bd.length; i++) babcde[k++] = _bd[i];
    for (i = 0; i < _be.length; i++) babcde[k++] = _be[i];
    return string(babcde);
  }

  function strConcat(string _a, string _b, string _c, string _d) internal pure returns (string) {
    return strConcat(_a, _b, _c, _d, "");
  }

  function strConcat(string _a, string _b, string _c) internal pure returns (string) {
    return strConcat(_a, _b, _c, "", "");
  }

  function strConcat(string _a, string _b) internal pure returns (string) {
    return strConcat(_a, _b, "", "", "");
  }
}

// File: openzeppelin-solidity/contracts/ownership/Ownable.sol

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


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


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

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

  /**
   * @dev Allows the current owner to relinquish control of the contract.
   * @notice Renouncing to ownership will leave the contract without an owner.
   * It will not be possible to call the functions with the `onlyOwner`
   * modifier anymore.
   */
  function renounceOwnership() public onlyOwner {
    emit OwnershipRenounced(owner);
    owner = address(0);
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function transferOwnership(address _newOwner) public onlyOwner {
    _transferOwnership(_newOwner);
  }

  /**
   * @dev Transfers control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function _transferOwnership(address _newOwner) internal {
    require(_newOwner != address(0));
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }
}

// File: openzeppelin-solidity/contracts/ownership/rbac/Roles.sol

/**
 * @title Roles
 * @author Francisco Giordano (@frangio)
 * @dev Library for managing addresses assigned to a Role.
 * See RBAC.sol for example usage.
 */
library Roles {
  struct Role {
    mapping (address => bool) bearer;
  }

  /**
   * @dev give an address access to this role
   */
  function add(Role storage role, address addr)
    internal
  {
    role.bearer[addr] = true;
  }

  /**
   * @dev remove an address' access to this role
   */
  function remove(Role storage role, address addr)
    internal
  {
    role.bearer[addr] = false;
  }

  /**
   * @dev check if an address has this role
   * // reverts
   */
  function check(Role storage role, address addr)
    view
    internal
  {
    require(has(role, addr));
  }

  /**
   * @dev check if an address has this role
   * @return bool
   */
  function has(Role storage role, address addr)
    view
    internal
    returns (bool)
  {
    return role.bearer[addr];
  }
}

// File: openzeppelin-solidity/contracts/ownership/rbac/RBAC.sol

/**
 * @title RBAC (Role-Based Access Control)
 * @author Matt Condon (@Shrugs)
 * @dev Stores and provides setters and getters for roles and addresses.
 * Supports unlimited numbers of roles and addresses.
 * See //contracts/mocks/RBACMock.sol for an example of usage.
 * This RBAC method uses strings to key roles. It may be beneficial
 * for you to write your own implementation of this interface using Enums or similar.
 * It's also recommended that you define constants in the contract, like ROLE_ADMIN below,
 * to avoid typos.
 */
contract RBAC {
  using Roles for Roles.Role;

  mapping (string => Roles.Role) private roles;

  event RoleAdded(address indexed operator, string role);
  event RoleRemoved(address indexed operator, string role);

  /**
   * @dev reverts if addr does not have role
   * @param _operator address
   * @param _role the name of the role
   * // reverts
   */
  function checkRole(address _operator, string _role)
    view
    public
  {
    roles[_role].check(_operator);
  }

  /**
   * @dev determine if addr has role
   * @param _operator address
   * @param _role the name of the role
   * @return bool
   */
  function hasRole(address _operator, string _role)
    view
    public
    returns (bool)
  {
    return roles[_role].has(_operator);
  }

  /**
   * @dev add a role to an address
   * @param _operator address
   * @param _role the name of the role
   */
  function addRole(address _operator, string _role)
    internal
  {
    roles[_role].add(_operator);
    emit RoleAdded(_operator, _role);
  }

  /**
   * @dev remove a role from an address
   * @param _operator address
   * @param _role the name of the role
   */
  function removeRole(address _operator, string _role)
    internal
  {
    roles[_role].remove(_operator);
    emit RoleRemoved(_operator, _role);
  }

  /**
   * @dev modifier to scope access to a single role (uses msg.sender as addr)
   * @param _role the name of the role
   * // reverts
   */
  modifier onlyRole(string _role)
  {
    checkRole(msg.sender, _role);
    _;
  }

  /**
   * @dev modifier to scope access to a set of roles (uses msg.sender as addr)
   * @param _roles the names of the roles to scope access to
   * // reverts
   *
   * @TODO - when solidity supports dynamic arrays as arguments to modifiers, provide this
   *  see: https://github.com/ethereum/solidity/issues/2467
   */
  // modifier onlyRoles(string[] _roles) {
  //     bool hasAnyRole = false;
  //     for (uint8 i = 0; i < _roles.length; i++) {
  //         if (hasRole(msg.sender, _roles[i])) {
  //             hasAnyRole = true;
  //             break;
  //         }
  //     }

  //     require(hasAnyRole);

  //     _;
  // }
}

// File: openzeppelin-solidity/contracts/access/Whitelist.sol

/**
 * @title Whitelist
 * @dev The Whitelist contract has a whitelist of addresses, and provides basic authorization control functions.
 * This simplifies the implementation of "user permissions".
 */
contract Whitelist is Ownable, RBAC {
  string public constant ROLE_WHITELISTED = "whitelist";

  /**
   * @dev Throws if operator is not whitelisted.
   * @param _operator address
   */
  modifier onlyIfWhitelisted(address _operator) {
    checkRole(_operator, ROLE_WHITELISTED);
    _;
  }

  /**
   * @dev add an address to the whitelist
   * @param _operator address
   * @return true if the address was added to the whitelist, false if the address was already in the whitelist
   */
  function addAddressToWhitelist(address _operator)
    onlyOwner
    public
  {
    addRole(_operator, ROLE_WHITELISTED);
  }

  /**
   * @dev getter to determine if address is in whitelist
   */
  function whitelist(address _operator)
    public
    view
    returns (bool)
  {
    return hasRole(_operator, ROLE_WHITELISTED);
  }

  /**
   * @dev add addresses to the whitelist
   * @param _operators addresses
   * @return true if at least one address was added to the whitelist,
   * false if all addresses were already in the whitelist
   */
  function addAddressesToWhitelist(address[] _operators)
    onlyOwner
    public
  {
    for (uint256 i = 0; i < _operators.length; i++) {
      addAddressToWhitelist(_operators[i]);
    }
  }

  /**
   * @dev remove an address from the whitelist
   * @param _operator address
   * @return true if the address was removed from the whitelist,
   * false if the address wasn't in the whitelist in the first place
   */
  function removeAddressFromWhitelist(address _operator)
    onlyOwner
    public
  {
    removeRole(_operator, ROLE_WHITELISTED);
  }

  /**
   * @dev remove addresses from the whitelist
   * @param _operators addresses
   * @return true if at least one address was removed from the whitelist,
   * false if all addresses weren't in the whitelist in the first place
   */
  function removeAddressesFromWhitelist(address[] _operators)
    onlyOwner
    public
  {
    for (uint256 i = 0; i < _operators.length; i++) {
      removeAddressFromWhitelist(_operators[i]);
    }
  }

}

// File: openzeppelin-solidity/contracts/math/SafeMath.sol

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
    // Gas optimization: this is cheaper than asserting 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (a == 0) {
      return 0;
    }

    c = a * b;
    assert(c / a == b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    // uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return a / b;
  }

  /**
  * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

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

// File: openzeppelin-solidity/contracts/introspection/ERC165.sol

/**
 * @title ERC165
 * @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md
 */
interface ERC165 {

  /**
   * @notice Query if a contract implements an interface
   * @param _interfaceId The interface identifier, as specified in ERC-165
   * @dev Interface identification is specified in ERC-165. This function
   * uses less than 30,000 gas.
   */
  function supportsInterface(bytes4 _interfaceId)
    external
    view
    returns (bool);
}

// File: openzeppelin-solidity/contracts/introspection/SupportsInterfaceWithLookup.sol

/**
 * @title SupportsInterfaceWithLookup
 * @author Matt Condon (@shrugs)
 * @dev Implements ERC165 using a lookup table.
 */
contract SupportsInterfaceWithLookup is ERC165 {
  bytes4 public constant InterfaceId_ERC165 = 0x01ffc9a7;
  /**
   * 0x01ffc9a7 ===
   *   bytes4(keccak256('supportsInterface(bytes4)'))
   */

  /**
   * @dev a mapping of interface id to whether or not it's supported
   */
  mapping(bytes4 => bool) internal supportedInterfaces;

  /**
   * @dev A contract implementing SupportsInterfaceWithLookup
   * implement ERC165 itself
   */
  constructor()
    public
  {
    _registerInterface(InterfaceId_ERC165);
  }

  /**
   * @dev implement supportsInterface(bytes4) using a lookup table
   */
  function supportsInterface(bytes4 _interfaceId)
    external
    view
    returns (bool)
  {
    return supportedInterfaces[_interfaceId];
  }

  /**
   * @dev private method for registering an interface
   */
  function _registerInterface(bytes4 _interfaceId)
    internal
  {
    require(_interfaceId != 0xffffffff);
    supportedInterfaces[_interfaceId] = true;
  }
}

// File: openzeppelin-solidity/contracts/token/ERC721/ERC721Basic.sol

/**
 * @title ERC721 Non-Fungible Token Standard basic interface
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Basic is ERC165 {
  event Transfer(
    address indexed _from,
    address indexed _to,
    uint256 indexed _tokenId
  );
  event Approval(
    address indexed _owner,
    address indexed _approved,
    uint256 indexed _tokenId
  );
  event ApprovalForAll(
    address indexed _owner,
    address indexed _operator,
    bool _approved
  );

  function balanceOf(address _owner) public view returns (uint256 _balance);
  function ownerOf(uint256 _tokenId) public view returns (address _owner);
  function exists(uint256 _tokenId) public view returns (bool _exists);

  function approve(address _to, uint256 _tokenId) public;
  function getApproved(uint256 _tokenId)
    public view returns (address _operator);

  function setApprovalForAll(address _operator, bool _approved) public;
  function isApprovedForAll(address _owner, address _operator)
    public view returns (bool);

  function transferFrom(address _from, address _to, uint256 _tokenId) public;
  function safeTransferFrom(address _from, address _to, uint256 _tokenId)
    public;

  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes _data
  )
    public;
}

// File: openzeppelin-solidity/contracts/token/ERC721/ERC721.sol

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Enumerable is ERC721Basic {
  function totalSupply() public view returns (uint256);
  function tokenOfOwnerByIndex(
    address _owner,
    uint256 _index
  )
    public
    view
    returns (uint256 _tokenId);

  function tokenByIndex(uint256 _index) public view returns (uint256);
}


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Metadata is ERC721Basic {
  function name() external view returns (string _name);
  function symbol() external view returns (string _symbol);
  function tokenURI(uint256 _tokenId) public view returns (string);
}


/**
 * @title ERC-721 Non-Fungible Token Standard, full implementation interface
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721 is ERC721Basic, ERC721Enumerable, ERC721Metadata {
}

// File: openzeppelin-solidity/contracts/AddressUtils.sol

/**
 * Utility library of inline functions on addresses
 */
library AddressUtils {

  /**
   * Returns whether the target address is a contract
   * @dev This function will return false if invoked during the constructor of a contract,
   * as the code is not actually created until after the constructor finishes.
   * @param addr address to check
   * @return whether the target address is a contract
   */
  function isContract(address addr) internal view returns (bool) {
    uint256 size;
    // XXX Currently there is no better way to check if there is a contract in an address
    // than to check the size of the code at that address.
    // See https://ethereum.stackexchange.com/a/14016/36603
    // for more details about how this works.
    // TODO Check this again before the Serenity release, because all addresses will be
    // contracts then.
    // solium-disable-next-line security/no-inline-assembly
    assembly { size := extcodesize(addr) }
    return size > 0;
  }

}

// File: openzeppelin-solidity/contracts/token/ERC721/ERC721Receiver.sol

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
contract ERC721Receiver {
  /**
   * @dev Magic value to be returned upon successful reception of an NFT
   *  Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`,
   *  which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`
   */
  bytes4 internal constant ERC721_RECEIVED = 0x150b7a02;

  /**
   * @notice Handle the receipt of an NFT
   * @dev The ERC721 smart contract calls this function on the recipient
   * after a `safetransfer`. This function MAY throw to revert and reject the
   * transfer. Return of other than the magic value MUST result in the 
   * transaction being reverted.
   * Note: the contract address is always the message sender.
   * @param _operator The address which called `safeTransferFrom` function
   * @param _from The address which previously owned the token
   * @param _tokenId The NFT identifier which is being transfered
   * @param _data Additional data with no specified format
   * @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
   */
  function onERC721Received(
    address _operator,
    address _from,
    uint256 _tokenId,
    bytes _data
  )
    public
    returns(bytes4);
}

// File: openzeppelin-solidity/contracts/token/ERC721/ERC721BasicToken.sol

/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721BasicToken is SupportsInterfaceWithLookup, ERC721Basic {

  bytes4 private constant InterfaceId_ERC721 = 0x80ac58cd;
  /*
   * 0x80ac58cd ===
   *   bytes4(keccak256('balanceOf(address)')) ^
   *   bytes4(keccak256('ownerOf(uint256)')) ^
   *   bytes4(keccak256('approve(address,uint256)')) ^
   *   bytes4(keccak256('getApproved(uint256)')) ^
   *   bytes4(keccak256('setApprovalForAll(address,bool)')) ^
   *   bytes4(keccak256('isApprovedForAll(address,address)')) ^
   *   bytes4(keccak256('transferFrom(address,address,uint256)')) ^
   *   bytes4(keccak256('safeTransferFrom(address,address,uint256)')) ^
   *   bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)'))
   */

  bytes4 private constant InterfaceId_ERC721Exists = 0x4f558e79;
  /*
   * 0x4f558e79 ===
   *   bytes4(keccak256('exists(uint256)'))
   */

  using SafeMath for uint256;
  using AddressUtils for address;

  // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
  // which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`
  bytes4 private constant ERC721_RECEIVED = 0x150b7a02;

  // Mapping from token ID to owner
  mapping (uint256 => address) internal tokenOwner;

  // Mapping from token ID to approved address
  mapping (uint256 => address) internal tokenApprovals;

  // Mapping from owner to number of owned token
  mapping (address => uint256) internal ownedTokensCount;

  // Mapping from owner to operator approvals
  mapping (address => mapping (address => bool)) internal operatorApprovals;

  /**
   * @dev Guarantees msg.sender is owner of the given token
   * @param _tokenId uint256 ID of the token to validate its ownership belongs to msg.sender
   */
  modifier onlyOwnerOf(uint256 _tokenId) {
    require(ownerOf(_tokenId) == msg.sender);
    _;
  }

  /**
   * @dev Checks msg.sender can transfer a token, by being owner, approved, or operator
   * @param _tokenId uint256 ID of the token to validate
   */
  modifier canTransfer(uint256 _tokenId) {
    require(isApprovedOrOwner(msg.sender, _tokenId));
    _;
  }

  constructor()
    public
  {
    // register the supported interfaces to conform to ERC721 via ERC165
    _registerInterface(InterfaceId_ERC721);
    _registerInterface(InterfaceId_ERC721Exists);
  }

  /**
   * @dev Gets the balance of the specified address
   * @param _owner address to query the balance of
   * @return uint256 representing the amount owned by the passed address
   */
  function balanceOf(address _owner) public view returns (uint256) {
    require(_owner != address(0));
    return ownedTokensCount[_owner];
  }

  /**
   * @dev Gets the owner of the specified token ID
   * @param _tokenId uint256 ID of the token to query the owner of
   * @return owner address currently marked as the owner of the given token ID
   */
  function ownerOf(uint256 _tokenId) public view returns (address) {
    address owner = tokenOwner[_tokenId];
    require(owner != address(0));
    return owner;
  }

  /**
   * @dev Returns whether the specified token exists
   * @param _tokenId uint256 ID of the token to query the existence of
   * @return whether the token exists
   */
  function exists(uint256 _tokenId) public view returns (bool) {
    address owner = tokenOwner[_tokenId];
    return owner != address(0);
  }

  /**
   * @dev Approves another address to transfer the given token ID
   * The zero address indicates there is no approved address.
   * There can only be one approved address per token at a given time.
   * Can only be called by the token owner or an approved operator.
   * @param _to address to be approved for the given token ID
   * @param _tokenId uint256 ID of the token to be approved
   */
  function approve(address _to, uint256 _tokenId) public {
    address owner = ownerOf(_tokenId);
    require(_to != owner);
    require(msg.sender == owner || isApprovedForAll(owner, msg.sender));

    tokenApprovals[_tokenId] = _to;
    emit Approval(owner, _to, _tokenId);
  }

  /**
   * @dev Gets the approved address for a token ID, or zero if no address set
   * @param _tokenId uint256 ID of the token to query the approval of
   * @return address currently approved for the given token ID
   */
  function getApproved(uint256 _tokenId) public view returns (address) {
    return tokenApprovals[_tokenId];
  }

  /**
   * @dev Sets or unsets the approval of a given operator
   * An operator is allowed to transfer all tokens of the sender on their behalf
   * @param _to operator address to set the approval
   * @param _approved representing the status of the approval to be set
   */
  function setApprovalForAll(address _to, bool _approved) public {
    require(_to != msg.sender);
    operatorApprovals[msg.sender][_to] = _approved;
    emit ApprovalForAll(msg.sender, _to, _approved);
  }

  /**
   * @dev Tells whether an operator is approved by a given owner
   * @param _owner owner address which you want to query the approval of
   * @param _operator operator address which you want to query the approval of
   * @return bool whether the given operator is approved by the given owner
   */
  function isApprovedForAll(
    address _owner,
    address _operator
  )
    public
    view
    returns (bool)
  {
    return operatorApprovals[_owner][_operator];
  }

  /**
   * @dev Transfers the ownership of a given token ID to another address
   * Usage of this method is discouraged, use `safeTransferFrom` whenever possible
   * Requires the msg sender to be the owner, approved, or operator
   * @param _from current owner of the token
   * @param _to address to receive the ownership of the given token ID
   * @param _tokenId uint256 ID of the token to be transferred
  */
  function transferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    public
    canTransfer(_tokenId)
  {
    require(_from != address(0));
    require(_to != address(0));

    clearApproval(_from, _tokenId);
    removeTokenFrom(_from, _tokenId);
    addTokenTo(_to, _tokenId);

    emit Transfer(_from, _to, _tokenId);
  }

  /**
   * @dev Safely transfers the ownership of a given token ID to another address
   * If the target address is a contract, it must implement `onERC721Received`,
   * which is called upon a safe transfer, and return the magic value
   * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
   * the transfer is reverted.
   *
   * Requires the msg sender to be the owner, approved, or operator
   * @param _from current owner of the token
   * @param _to address to receive the ownership of the given token ID
   * @param _tokenId uint256 ID of the token to be transferred
  */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    public
    canTransfer(_tokenId)
  {
    // solium-disable-next-line arg-overflow
    safeTransferFrom(_from, _to, _tokenId, "");
  }

  /**
   * @dev Safely transfers the ownership of a given token ID to another address
   * If the target address is a contract, it must implement `onERC721Received`,
   * which is called upon a safe transfer, and return the magic value
   * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
   * the transfer is reverted.
   * Requires the msg sender to be the owner, approved, or operator
   * @param _from current owner of the token
   * @param _to address to receive the ownership of the given token ID
   * @param _tokenId uint256 ID of the token to be transferred
   * @param _data bytes data to send along with a safe transfer check
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes _data
  )
    public
    canTransfer(_tokenId)
  {
    transferFrom(_from, _to, _tokenId);
    // solium-disable-next-line arg-overflow
    require(checkAndCallSafeTransfer(_from, _to, _tokenId, _data));
  }

  /**
   * @dev Returns whether the given spender can transfer a given token ID
   * @param _spender address of the spender to query
   * @param _tokenId uint256 ID of the token to be transferred
   * @return bool whether the msg.sender is approved for the given token ID,
   *  is an operator of the owner, or is the owner of the token
   */
  function isApprovedOrOwner(
    address _spender,
    uint256 _tokenId
  )
    internal
    view
    returns (bool)
  {
    address owner = ownerOf(_tokenId);
    // Disable solium check because of
    // https://github.com/duaraghav8/Solium/issues/175
    // solium-disable-next-line operator-whitespace
    return (
      _spender == owner ||
      getApproved(_tokenId) == _spender ||
      isApprovedForAll(owner, _spender)
    );
  }

  /**
   * @dev Internal function to mint a new token
   * Reverts if the given token ID already exists
   * @param _to The address that will own the minted token
   * @param _tokenId uint256 ID of the token to be minted by the msg.sender
   */
  function _mint(address _to, uint256 _tokenId) internal {
    require(_to != address(0));
    addTokenTo(_to, _tokenId);
    emit Transfer(address(0), _to, _tokenId);
  }

  /**
   * @dev Internal function to burn a specific token
   * Reverts if the token does not exist
   * @param _tokenId uint256 ID of the token being burned by the msg.sender
   */
  function _burn(address _owner, uint256 _tokenId) internal {
    clearApproval(_owner, _tokenId);
    removeTokenFrom(_owner, _tokenId);
    emit Transfer(_owner, address(0), _tokenId);
  }

  /**
   * @dev Internal function to clear current approval of a given token ID
   * Reverts if the given address is not indeed the owner of the token
   * @param _owner owner of the token
   * @param _tokenId uint256 ID of the token to be transferred
   */
  function clearApproval(address _owner, uint256 _tokenId) internal {
    require(ownerOf(_tokenId) == _owner);
    if (tokenApprovals[_tokenId] != address(0)) {
      tokenApprovals[_tokenId] = address(0);
    }
  }

  /**
   * @dev Internal function to add a token ID to the list of a given address
   * @param _to address representing the new owner of the given token ID
   * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address
   */
  function addTokenTo(address _to, uint256 _tokenId) internal {
    require(tokenOwner[_tokenId] == address(0));
    tokenOwner[_tokenId] = _to;
    ownedTokensCount[_to] = ownedTokensCount[_to].add(1);
  }

  /**
   * @dev Internal function to remove a token ID from the list of a given address
   * @param _from address representing the previous owner of the given token ID
   * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address
   */
  function removeTokenFrom(address _from, uint256 _tokenId) internal {
    require(ownerOf(_tokenId) == _from);
    ownedTokensCount[_from] = ownedTokensCount[_from].sub(1);
    tokenOwner[_tokenId] = address(0);
  }

  /**
   * @dev Internal function to invoke `onERC721Received` on a target address
   * The call is not executed if the target address is not a contract
   * @param _from address representing the previous owner of the given token ID
   * @param _to target address that will receive the tokens
   * @param _tokenId uint256 ID of the token to be transferred
   * @param _data bytes optional data to send along with the call
   * @return whether the call correctly returned the expected magic value
   */
  function checkAndCallSafeTransfer(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes _data
  )
    internal
    returns (bool)
  {
    if (!_to.isContract()) {
      return true;
    }
    bytes4 retval = ERC721Receiver(_to).onERC721Received(
      msg.sender, _from, _tokenId, _data);
    return (retval == ERC721_RECEIVED);
  }
}

// File: openzeppelin-solidity/contracts/token/ERC721/ERC721Token.sol

/**
 * @title Full ERC721 Token
 * This implementation includes all the required and some optional functionality of the ERC721 standard
 * Moreover, it includes approve all functionality using operator terminology
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Token is SupportsInterfaceWithLookup, ERC721BasicToken, ERC721 {

  bytes4 private constant InterfaceId_ERC721Enumerable = 0x780e9d63;
  /**
   * 0x780e9d63 ===
   *   bytes4(keccak256('totalSupply()')) ^
   *   bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) ^
   *   bytes4(keccak256('tokenByIndex(uint256)'))
   */

  bytes4 private constant InterfaceId_ERC721Metadata = 0x5b5e139f;
  /**
   * 0x5b5e139f ===
   *   bytes4(keccak256('name()')) ^
   *   bytes4(keccak256('symbol()')) ^
   *   bytes4(keccak256('tokenURI(uint256)'))
   */

  // Token name
  string internal name_;

  // Token symbol
  string internal symbol_;

  // Mapping from owner to list of owned token IDs
  mapping(address => uint256[]) internal ownedTokens;

  // Mapping from token ID to index of the owner tokens list
  mapping(uint256 => uint256) internal ownedTokensIndex;

  // Array with all token ids, used for enumeration
  uint256[] internal allTokens;

  // Mapping from token id to position in the allTokens array
  mapping(uint256 => uint256) internal allTokensIndex;

  // Optional mapping for token URIs
  mapping(uint256 => string) internal tokenURIs;

  /**
   * @dev Constructor function
   */
  constructor(string _name, string _symbol) public {
    name_ = _name;
    symbol_ = _symbol;

    // register the supported interfaces to conform to ERC721 via ERC165
    _registerInterface(InterfaceId_ERC721Enumerable);
    _registerInterface(InterfaceId_ERC721Metadata);
  }

  /**
   * @dev Gets the token name
   * @return string representing the token name
   */
  function name() external view returns (string) {
    return name_;
  }

  /**
   * @dev Gets the token symbol
   * @return string representing the token symbol
   */
  function symbol() external view returns (string) {
    return symbol_;
  }

  /**
   * @dev Returns an URI for a given token ID
   * Throws if the token ID does not exist. May return an empty string.
   * @param _tokenId uint256 ID of the token to query
   */
  function tokenURI(uint256 _tokenId) public view returns (string) {
    require(exists(_tokenId));
    return tokenURIs[_tokenId];
  }

  /**
   * @dev Gets the token ID at a given index of the tokens list of the requested owner
   * @param _owner address owning the tokens list to be accessed
   * @param _index uint256 representing the index to be accessed of the requested tokens list
   * @return uint256 token ID at the given index of the tokens list owned by the requested address
   */
  function tokenOfOwnerByIndex(
    address _owner,
    uint256 _index
  )
    public
    view
    returns (uint256)
  {
    require(_index < balanceOf(_owner));
    return ownedTokens[_owner][_index];
  }

  /**
   * @dev Gets the total amount of tokens stored by the contract
   * @return uint256 representing the total amount of tokens
   */
  function totalSupply() public view returns (uint256) {
    return allTokens.length;
  }

  /**
   * @dev Gets the token ID at a given index of all the tokens in this contract
   * Reverts if the index is greater or equal to the total number of tokens
   * @param _index uint256 representing the index to be accessed of the tokens list
   * @return uint256 token ID at the given index of the tokens list
   */
  function tokenByIndex(uint256 _index) public view returns (uint256) {
    require(_index < totalSupply());
    return allTokens[_index];
  }

  /**
   * @dev Internal function to set the token URI for a given token
   * Reverts if the token ID does not exist
   * @param _tokenId uint256 ID of the token to set its URI
   * @param _uri string URI to assign
   */
  function _setTokenURI(uint256 _tokenId, string _uri) internal {
    require(exists(_tokenId));
    tokenURIs[_tokenId] = _uri;
  }

  /**
   * @dev Internal function to add a token ID to the list of a given address
   * @param _to address representing the new owner of the given token ID
   * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address
   */
  function addTokenTo(address _to, uint256 _tokenId) internal {
    super.addTokenTo(_to, _tokenId);
    uint256 length = ownedTokens[_to].length;
    ownedTokens[_to].push(_tokenId);
    ownedTokensIndex[_tokenId] = length;
  }

  /**
   * @dev Internal function to remove a token ID from the list of a given address
   * @param _from address representing the previous owner of the given token ID
   * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address
   */
  function removeTokenFrom(address _from, uint256 _tokenId) internal {
    super.removeTokenFrom(_from, _tokenId);

    uint256 tokenIndex = ownedTokensIndex[_tokenId];
    uint256 lastTokenIndex = ownedTokens[_from].length.sub(1);
    uint256 lastToken = ownedTokens[_from][lastTokenIndex];

    ownedTokens[_from][tokenIndex] = lastToken;
    ownedTokens[_from][lastTokenIndex] = 0;
    // Note that this will handle single-element arrays. In that case, both tokenIndex and lastTokenIndex are going to
    // be zero. Then we can make sure that we will remove _tokenId from the ownedTokens list since we are first swapping
    // the lastToken to the first position, and then dropping the element placed in the last position of the list

    ownedTokens[_from].length--;
    ownedTokensIndex[_tokenId] = 0;
    ownedTokensIndex[lastToken] = tokenIndex;
  }

  /**
   * @dev Internal function to mint a new token
   * Reverts if the given token ID already exists
   * @param _to address the beneficiary that will own the minted token
   * @param _tokenId uint256 ID of the token to be minted by the msg.sender
   */
  function _mint(address _to, uint256 _tokenId) internal {
    super._mint(_to, _tokenId);

    allTokensIndex[_tokenId] = allTokens.length;
    allTokens.push(_tokenId);
  }

  /**
   * @dev Internal function to burn a specific token
   * Reverts if the token does not exist
   * @param _owner owner of the token to burn
   * @param _tokenId uint256 ID of the token being burned by the msg.sender
   */
  function _burn(address _owner, uint256 _tokenId) internal {
    super._burn(_owner, _tokenId);

    // Clear metadata (if any)
    if (bytes(tokenURIs[_tokenId]).length != 0) {
      delete tokenURIs[_tokenId];
    }

    // Reorg all tokens array
    uint256 tokenIndex = allTokensIndex[_tokenId];
    uint256 lastTokenIndex = allTokens.length.sub(1);
    uint256 lastToken = allTokens[lastTokenIndex];

    allTokens[tokenIndex] = lastToken;
    allTokens[lastTokenIndex] = 0;

    allTokens.length--;
    allTokensIndex[_tokenId] = 0;
    allTokensIndex[lastToken] = tokenIndex;
  }

}

// File: contracts/InterfaceToken.sol

/**
  * @title InterfaceToken
  * https://www.interfacetoken.com/
  */
contract InterfaceToken is ERC721Token, Whitelist {
  using SafeMath for uint256;

  event Minted(address indexed _owner, uint256 indexed _tokenId, bytes32 _blockhash, bytes32 _nickname);

  string internal tokenBaseURI = "https://ipfs.infura.io/ipfs/";
  string internal defaultTokenURI = "Qma4QoWXq7YzFUkREXW9wKVYPZmKzS5pkckaSjwY8Gc489";

  uint256 public purchaseTokenPointer = 1000000000;
  uint256 public costOfToken = 0.01 ether;

  mapping(uint256 => bytes32) internal tokenIdToNickname;

  mapping(uint256 => bytes32) internal tokenIdToBlockhash;
  mapping(bytes32 => uint256) internal blockhashToTokenId;

  constructor() public ERC721Token("Interface Token", "TOKN") {
    super.addAddressToWhitelist(msg.sender);
  }

  function() public payable {
    buyTokens("");
  }

  /**
   * @dev Mint a new InterfaceToken token
   * @dev Reverts if not called by curator
   * @param _blockhash an Ethereum block hash
   * @param _tokenId unique token ID
   * @param _nickname char stamp of token owner
   */
  function mint(bytes32 _blockhash, uint256 _tokenId, bytes32 _nickname) external onlyIfWhitelisted(msg.sender) {
    require(_tokenId < purchaseTokenPointer); // ensure under number where buying tokens takes place
    _mint(_blockhash, _tokenId, _nickname, msg.sender);
  }

  /**
   * @dev Mint a new InterfaceToken token (with recipient)
   * @dev Reverts if not called by curator
   * @param _blockhash an Ethereum block hash
   * @param _tokenId unique token ID
   * @param _nickname char stamp of token owner
   * @param _recipient owner of the newly minted token
   */
  function mintTransfer(bytes32 _blockhash, uint256 _tokenId, bytes32 _nickname, address _recipient) external onlyIfWhitelisted(msg.sender) {
    require(_tokenId < purchaseTokenPointer); // ensure under number where buying tokens takes place
    _mint(_blockhash, _tokenId, _nickname, _recipient);
  }

  /**
   * @dev Purchases a new InterfaceToken token
   * @dev Reverts if not called by curator
   * @param _nickname char stamp of token owner
   */
  function buyToken(bytes32 _nickname) public payable {
    require(msg.value >= costOfToken);

    _mint(keccak256(abi.encodePacked(purchaseTokenPointer, _nickname)), purchaseTokenPointer, _nickname, msg.sender);
    purchaseTokenPointer = purchaseTokenPointer.add(1);

    // reconcile payments
    owner.transfer(costOfToken);
    msg.sender.transfer(msg.value - costOfToken);
  }

  /**
   * @dev Purchases multiple new InterfaceToken tokens
   * @dev Reverts if not called by curator
   * @param _nickname char stamp of token owner
   */
  function buyTokens(bytes32 _nickname) public payable {
    require(msg.value >= costOfToken);

    uint i = 0;
    for (i; i < (msg.value / costOfToken); i++) {
      _mint(keccak256(abi.encodePacked(purchaseTokenPointer, _nickname)), purchaseTokenPointer, _nickname, msg.sender);
      purchaseTokenPointer = purchaseTokenPointer.add(1);
    }

    // reconcile payments
    owner.transfer(costOfToken * i);
    msg.sender.transfer(msg.value - (costOfToken * i));
  }

  function _mint(bytes32 _blockhash, uint256 _tokenId, bytes32 _nickname, address _recipient) internal {
    require(_recipient !=  address(0));
    require(blockhashToTokenId[_blockhash] == 0);
    require(tokenIdToBlockhash[_tokenId] == 0);

    // mint the token with sender as owner
    super._mint(_recipient, _tokenId);

    // set data
    tokenIdToBlockhash[_tokenId] = _blockhash;
    blockhashToTokenId[_blockhash] = _tokenId;
    tokenIdToNickname[_tokenId] = _nickname;

    emit Minted(_recipient, _tokenId, _blockhash, _nickname);
  }

  /**
   * @dev Utility function changing the cost of the token
   * @dev Reverts if not called by owner
   * @param _costOfToken cost in wei
   */
  function setCostOfToken(uint256 _costOfToken) external onlyIfWhitelisted(msg.sender) {
    costOfToken = _costOfToken;
  }

  /**
   * @dev Utility function for updating a nickname if you own the token
   * @dev Reverts if not called by owner
   * @param _tokenId the  token ID
   * @param _nickname char stamp of token owner
   */
  function setNickname(uint256 _tokenId, bytes32 _nickname) external onlyOwnerOf(_tokenId) {
    tokenIdToNickname[_tokenId] = _nickname;
  }

  /**
   * @dev Return owned tokens
   * @param _owner address to query
   */
  function tokensOf(address _owner) public view returns (uint256[] _tokenIds) {
    return ownedTokens[_owner];
  }

  /**
   * @dev checks for owned tokens
   * @param _owner address to query
   */
  function hasTokens(address _owner) public view returns (bool) {
    return ownedTokens[_owner].length > 0;
  }

  /**
   * @dev checks for owned tokens
   * @param _owner address to query
   */
  function firstToken(address _owner) public view returns (uint256 _tokenId) {
    require(hasTokens(_owner));
    return ownedTokens[_owner][0];
  }

  /**
   * @dev Return handle of token
   * @param _tokenId token ID for handle lookup
   */
  function nicknameOf(uint256 _tokenId) public view returns (bytes32 _nickname) {
    return tokenIdToNickname[_tokenId];
  }

  /**
   * @dev Get token URI fro the given token, useful for testing purposes
   * @param _tokenId the token ID
   * @return the token ID or only the base URI if not found
   */
  function tokenURI(uint256 _tokenId) public view returns (string) {
    if (bytes(tokenURIs[_tokenId]).length == 0) {
      return Strings.strConcat(tokenBaseURI, defaultTokenURI);
    }

    return Strings.strConcat(tokenBaseURI, tokenURIs[_tokenId]);
  }

  /**
   * @dev Allows management to update the base tokenURI path
   * @dev Reverts if not called by owner
   * @param _newBaseURI the new base URI to set
   */
  function setTokenBaseURI(string _newBaseURI) external onlyOwner {
    tokenBaseURI = _newBaseURI;
  }

  /**
   * @dev Allows management to update the default token URI
   * @dev Reverts if not called by owner
   * @param _defaultTokenURI the new default URI to set
   */
  function setDefaultTokenURI(string _defaultTokenURI) external onlyOwner {
    defaultTokenURI = _defaultTokenURI;
  }

  /**
   * @dev Utility function for updating an assets token URI
   * @dev Reverts if not called by management
   * @param _tokenId the token ID
   * @param _uri the token URI, will be concatenated with baseUri
   */
  function setTokenURI(uint256 _tokenId, string _uri) external onlyIfWhitelisted(msg.sender) {
    require(exists(_tokenId));
    _setTokenURI(_tokenId, _uri);
  }

  /**
   * @dev Return blockhash of the  token
   * @param _tokenId the token ID
   */
  function blockhashOf(uint256 _tokenId) public view returns (bytes32 hash) {
    return tokenIdToBlockhash[_tokenId];
  }

  /**
 * @dev Return token ID of a Blockhash
 * @param _blockhash blockhash reference
 */
  function tokenIdOf(bytes32 _blockhash) public view returns (uint256 hash) {
    return blockhashToTokenId[_blockhash];
  }

  /**
   * @dev Return blockhash of the  token
   * @param _tokenId the token ID
   */
  function burn(uint256 _tokenId) public {
    super._burn(msg.sender, _tokenId);

    bytes32 tokenBlockhash = tokenIdToBlockhash[_tokenId];

    if (tokenIdToBlockhash[_tokenId].length != 0) {
      delete tokenIdToBlockhash[_tokenId];
    }

    if (tokenIdToNickname[_tokenId].length != 0) {
      delete tokenIdToNickname[_tokenId];
    }

    if (blockhashToTokenId[tokenBlockhash] != 0) {
      delete blockhashToTokenId[tokenBlockhash];
    }
  }
}

Contract ABI
[{"constant":true,"inputs":[{"name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"blockhashOf","outputs":[{"name":"hash","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_operator","type":"address"},{"name":"_role","type":"string"}],"name":"checkRole","outputs":[],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_uri","type":"string"}],"name":"setTokenURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ROLE_WHITELISTED","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"InterfaceId_ERC165","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"costOfToken","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_nickname","type":"bytes32"}],"name":"setNickname","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_operator","type":"address"},{"name":"_role","type":"string"}],"name":"hasRole","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_operators","type":"address[]"}],"name":"removeAddressesFromWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"}],"name":"removeAddressFromWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"hasTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_blockhash","type":"bytes32"},{"name":"_tokenId","type":"uint256"},{"name":"_nickname","type":"bytes32"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"nicknameOf","outputs":[{"name":"_nickname","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"tokensOf","outputs":[{"name":"_tokenIds","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"purchaseTokenPointer","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_blockhash","type":"bytes32"},{"name":"_tokenId","type":"uint256"},{"name":"_nickname","type":"bytes32"},{"name":"_recipient","type":"address"}],"name":"mintTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"firstToken","outputs":[{"name":"_tokenId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"}],"name":"addAddressToWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newBaseURI","type":"string"}],"name":"setTokenBaseURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_operator","type":"address"}],"name":"whitelist","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_defaultTokenURI","type":"string"}],"name":"setDefaultTokenURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_costOfToken","type":"uint256"}],"name":"setCostOfToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_blockhash","type":"bytes32"}],"name":"tokenIdOf","outputs":[{"name":"hash","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nickname","type":"bytes32"}],"name":"buyToken","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_operators","type":"address[]"}],"name":"addAddressesToWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nickname","type":"bytes32"}],"name":"buyTokens","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"},{"indexed":false,"name":"_blockhash","type":"bytes32"},{"indexed":false,"name":"_nickname","type":"bytes32"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"operator","type":"address"},{"indexed":false,"name":"role","type":"string"}],"name":"RoleAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"operator","type":"address"},{"indexed":false,"name":"role","type":"string"}],"name":"RoleRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_operator","type":"address"},{"indexed":false,"name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"}]

Contract Creation Code
60c0604052601c60808190527f68747470733a2f2f697066732e696e667572612e696f2f697066732f0000000060a09081526200004091600e9190620004c3565b5060408051606081018252602e8082527f516d6134516f57587137597a46556b5245585739774b5659505a6d4b7a533570602083019081527f6b636b61536a77593847633438390000000000000000000000000000000000009290930191909152620000af91600f91620004c3565b50633b9aca00601055662386f26fc10000601155348015620000d057600080fd5b50604080518082018252600f81527f496e7465726661636520546f6b656e00000000000000000000000000000000006020808301919091528251808401909352600483527f544f4b4e0000000000000000000000000000000000000000000000000000000090830152906200016e7f01ffc9a700000000000000000000000000000000000000000000000000000000640100000000620002a0810204565b620001a27f80ac58cd00000000000000000000000000000000000000000000000000000000640100000000620002a0810204565b620001d67f4f558e7900000000000000000000000000000000000000000000000000000000640100000000620002a0810204565b8151620001eb906005906020850190620004c3565b50805162000201906006906020840190620004c3565b50620002367f780e9d6300000000000000000000000000000000000000000000000000000000640100000000620002a0810204565b6200026a7f5b5e139f00000000000000000000000000000000000000000000000000000000640100000000620002a0810204565b5050600c8054600160a060020a031916339081179091556200029a906401000000006200135f6200030d82021704565b62000568565b7fffffffff000000000000000000000000000000000000000000000000000000008082161415620002d057600080fd5b7fffffffff00000000000000000000000000000000000000000000000000000000166000908152602081905260409020805460ff19166001179055565b600c54600160a060020a031633146200032557600080fd5b62000375816040805190810160405280600981526020017f77686974656c697374000000000000000000000000000000000000000000000081525062000378640100000000026401000000009004565b50565b620003f482600d836040518082805190602001908083835b60208310620003b15780518252601f19909201916020918201910162000390565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220929150506401000000006200049e8102620024201704565b81600160a060020a03167fbfec83d64eaa953f2708271a023ab9ee82057f8f3578d548c1a4ba0b5b700489826040518080602001828103825283818151815260200191508051906020019080838360005b838110156200045f57818101518382015260200162000445565b50505050905090810190601f1680156200048d5780820380516001836020036101000a031916815260200191505b509250505060405180910390a25050565b600160a060020a0316600090815260209190915260409020805460ff19166001179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200050657805160ff191683800117855562000536565b8280016001018555821562000536579182015b828111156200053657825182559160200191906001019062000519565b506200054492915062000548565b5090565b6200056591905b808211156200054457600081556001016200054f565b90565b6128bf80620005786000396000f30060806040526004361061023a5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166301ffc9a7811461024657806306fdde031461027c57806307518c8e14610306578063081812fc14610330578063095ea7b3146103645780630988ca8c14610388578063162094c4146103ef57806318160ddd1461041357806318b919e91461042857806319fa8f501461043d5780631bcf468b1461046f578063202c413d14610484578063217fe6c61461049f57806323b872dd1461050657806324953eaa14610530578063286dd3f5146105855780632f745c59146105a65780633cefc1e0146105ca57806340786dec146105eb57806342842e0e1461060957806342966c68146106335780634f558e791461064b5780634f6ccce71461066357806354f50f1b1461067b5780635a3f2672146106935780635cbb2ac3146107045780636352211e14610719578063699ac46f146107315780636f37f48b1461075b57806370a082311461077c578063715018a61461079d5780637b9417c8146107b25780638da5cb5b146107d35780638ef79e91146107e857806395d89b41146108085780639b19251a1461081d578063a125c8241461083e578063a22cb4651461085e578063a7dbfcaa14610884578063b88d4fde1461089c578063c87b56dd1461090b578063cd5bfb6314610923578063dffd5e571461093b578063e2ec6ec314610946578063e985e9c51461099b578063ea7000d6146109c2578063f2fde38b146109cd575b61024460006109ee565b005b34801561025257600080fd5b50610268600160e060020a031960043516610b3f565b604080519115158252519081900360200190f35b34801561028857600080fd5b50610291610b62565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102cb5781810151838201526020016102b3565b50505050905090810190601f1680156102f85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561031257600080fd5b5061031e600435610bf9565b60408051918252519081900360200190f35b34801561033c57600080fd5b50610348600435610c0b565b60408051600160a060020a039092168252519081900360200190f35b34801561037057600080fd5b50610244600160a060020a0360043516602435610c26565b34801561039457600080fd5b5060408051602060046024803582810135601f8101859004850286018501909652858552610244958335600160a060020a0316953695604494919390910191908190840183828082843750949750610cdc9650505050505050565b3480156103fb57600080fd5b50610244600480359060248035908101910135610d4a565b34801561041f57600080fd5b5061031e610dcc565b34801561043457600080fd5b50610291610dd2565b34801561044957600080fd5b50610452610df7565b60408051600160e060020a03199092168252519081900360200190f35b34801561047b57600080fd5b5061031e610e1b565b34801561049057600080fd5b50610244600435602435610e21565b3480156104ab57600080fd5b5060408051602060046024803582810135601f8101859004850286018501909652858552610268958335600160a060020a0316953695604494919390910191908190840183828082843750949750610e529650505050505050565b34801561051257600080fd5b50610244600160a060020a0360043581169060243516604435610ec5565b34801561053c57600080fd5b506040805160206004803580820135838102808601850190965280855261024495369593946024949385019291829185019084908082843750949750610f6a9650505050505050565b34801561059157600080fd5b50610244600160a060020a0360043516610fb9565b3480156105b257600080fd5b5061031e600160a060020a0360043516602435611000565b3480156105d657600080fd5b50610268600160a060020a036004351661104d565b3480156105f757600080fd5b50610244600435602435604435611069565b34801561061557600080fd5b50610244600160a060020a03600435811690602435166044356110b1565b34801561063f57600080fd5b506102446004356110e3565b34801561065757600080fd5b50610268600435611134565b34801561066f57600080fd5b5061031e600435611151565b34801561068757600080fd5b5061031e600435611186565b34801561069f57600080fd5b506106b4600160a060020a0360043516611198565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156106f05781810151838201526020016106d8565b505050509050019250505060405180910390f35b34801561071057600080fd5b5061031e611204565b34801561072557600080fd5b5061034860043561120a565b34801561073d57600080fd5b50610244600435602435604435600160a060020a0360643516611234565b34801561076757600080fd5b5061031e600160a060020a0360043516611283565b34801561078857600080fd5b5061031e600160a060020a03600435166112be565b3480156107a957600080fd5b506102446112f1565b3480156107be57600080fd5b50610244600160a060020a036004351661135f565b3480156107df57600080fd5b506103486113a3565b3480156107f457600080fd5b5061024460048035602481019101356113b2565b34801561081457600080fd5b506102916113d5565b34801561082957600080fd5b50610268600160a060020a0360043516611436565b34801561084a57600080fd5b506102446004803560248101910135611465565b34801561086a57600080fd5b50610244600160a060020a03600435166024351515611488565b34801561089057600080fd5b5061024460043561150c565b3480156108a857600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261024494600160a060020a0381358116956024803590921695604435953695608494019181908401838280828437509497506115409650505050505050565b34801561091757600080fd5b50610291600435611578565b34801561092f57600080fd5b5061031e6004356117c8565b6102446004356117da565b34801561095257600080fd5b5060408051602060048035808201358381028086018501909652808552610244953695939460249493850192918291850190849080828437509497506118fe9650505050505050565b3480156109a757600080fd5b50610268600160a060020a036004358116906024351661194d565b6102446004356109ee565b3480156109d957600080fd5b50610244600160a060020a036004351661197b565b601154600090341015610a0057600080fd5b5060005b60115434811515610a1157fe5b04811015610ac957601054604080516020808201939093528082018590528151808203830181526060909101918290528051610aaa939192918291908401908083835b60208310610a735780518252601f199092019160209182019101610a54565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020601054843361199b565b601054610abe90600163ffffffff611a6616565b601055600101610a04565b600c54601154604051600160a060020a039092169190830280156108fc02916000818181858888f19350505050158015610b07573d6000803e3d6000fd5b5060115460405133918302340380156108fc02916000818181858888f19350505050158015610b3a573d6000803e3d6000fd5b505050565b600160e060020a0319811660009081526020819052604090205460ff165b919050565b60058054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610bee5780601f10610bc357610100808354040283529160200191610bee565b820191906000526020600020905b815481529060010190602001808311610bd157829003601f168201915b505050505090505b90565b60009081526013602052604090205490565b600090815260026020526040902054600160a060020a031690565b6000610c318261120a565b9050600160a060020a038381169082161415610c4c57600080fd5b33600160a060020a0382161480610c685750610c68813361194d565b1515610c7357600080fd5b600082815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610d4682600d836040518082805190602001908083835b60208310610d125780518252601f199092019160209182019101610cf3565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922092915050611a73565b5050565b33610d7881604080519081016040528060098152602001600080516020612874833981519152815250610cdc565b610d8184611134565b1515610d8c57600080fd5b610dc68484848080601f01602080910402602001604051908101604052809392919081815260200183838082843750611a88945050505050565b50505050565b60095490565b6040805180820190915260098152600080516020612874833981519152602082015281565b7f01ffc9a70000000000000000000000000000000000000000000000000000000081565b60115481565b8133610e2c8261120a565b600160a060020a031614610e3f57600080fd5b5060009182526012602052604090912055565b6000610ebe83600d846040518082805190602001908083835b60208310610e8a5780518252601f199092019160209182019101610e6b565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922092915050611abb565b9392505050565b80610ed03382611ada565b1515610edb57600080fd5b600160a060020a0384161515610ef057600080fd5b600160a060020a0383161515610f0557600080fd5b610f0f8483611b39565b610f198483611ba8565b610f238383611ce1565b8183600160a060020a031685600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b600c54600090600160a060020a03163314610f8457600080fd5b5060005b8151811015610d4657610fb18282815181101515610fa257fe5b90602001906020020151610fb9565b600101610f88565b600c54600160a060020a03163314610fd057600080fd5b610ffd81604080519081016040528060098152602001600080516020612874833981519152815250611d2a565b50565b600061100b836112be565b821061101657600080fd5b600160a060020a038316600090815260076020526040902080548390811061103a57fe5b9060005260206000200154905092915050565b600160a060020a03166000908152600760205260408120541190565b3361109781604080519081016040528060098152602001600080516020612874833981519152815250610cdc565b60105483106110a557600080fd5b610dc68484843361199b565b806110bc3382611ada565b15156110c757600080fd5b610dc68484846020604051908101604052806000815250611540565b60006110ef3383611e3b565b5060008181526013602090815260408083208054908490556012835281842084905580845260149092529091205415610d465760009081526014602052604081205550565b600090815260016020526040902054600160a060020a0316151590565b600061115b610dcc565b821061116657600080fd5b600980548390811061117457fe5b90600052602060002001549050919050565b60009081526012602052604090205490565b600160a060020a0381166000908152600760209081526040918290208054835181840281018401909452808452606093928301828280156111f857602002820191906000526020600020905b8154815260200190600101908083116111e4575b50505050509050919050565b60105481565b600081815260016020526040812054600160a060020a031680151561122e57600080fd5b92915050565b3361126281604080519081016040528060098152602001600080516020612874833981519152815250610cdc565b601054841061127057600080fd5b61127c8585858561199b565b5050505050565b600061128e8261104d565b151561129957600080fd5b600160a060020a03821660009081526007602052604081208054909190811061117457fe5b6000600160a060020a03821615156112d557600080fd5b50600160a060020a031660009081526003602052604090205490565b600c54600160a060020a0316331461130857600080fd5b600c54604051600160a060020a03909116907ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482090600090a2600c805473ffffffffffffffffffffffffffffffffffffffff19169055565b600c54600160a060020a0316331461137657600080fd5b610ffd81604080519081016040528060098152602001600080516020612874833981519152815250611f35565b600c54600160a060020a031681565b600c54600160a060020a031633146113c957600080fd5b610b3a600e8383612709565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610bee5780601f10610bc357610100808354040283529160200191610bee565b600061122e82604080519081016040528060098152602001600080516020612874833981519152815250610e52565b600c54600160a060020a0316331461147c57600080fd5b610b3a600f8383612709565b600160a060020a03821633141561149e57600080fd5b336000818152600460209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b3361153a81604080519081016040528060098152602001600080516020612874833981519152815250610cdc565b50601155565b8161154b3382611ada565b151561155657600080fd5b611561858585610ec5565b61156d85858585612007565b151561127c57600080fd5b6000818152600b60205260409020546060906002600019610100600184161502019091160415156116cf57600e8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526116c893909290918301828280156116305780601f1061160557610100808354040283529160200191611630565b820191906000526020600020905b81548152906001019060200180831161161357829003601f168201915b5050600f8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152955091935091508301828280156116be5780601f10611693576101008083540402835291602001916116be565b820191906000526020600020905b8154815290600101906020018083116116a157829003601f168201915b5050505050612174565b9050610b5d565b600e8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815261122e939092909183018282801561175c5780601f106117315761010080835404028352916020019161175c565b820191906000526020600020905b81548152906001019060200180831161173f57829003601f168201915b5050506000868152600b60209081526040918290208054835160026001831615610100026000190190921691909104601f8101849004840282018401909452838152945092508301828280156116be5780601f10611693576101008083540402835291602001916116be565b60009081526014602052604090205490565b6011543410156117e957600080fd5b60105460408051602080820193909352808201849052815180820383018152606090910191829052805161187a939192918291908401908083835b602083106118435780518252601f199092019160209182019101611824565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020601054833361199b565b60105461188e90600163ffffffff611a6616565b601055600c54601154604051600160a060020a039092169181156108fc0291906000818181858888f193505050501580156118cd573d6000803e3d6000fd5b506011546040513391340380156108fc02916000818181858888f19350505050158015610d46573d6000803e3d6000fd5b600c54600090600160a060020a0316331461191857600080fd5b5060005b8151811015610d4657611945828281518110151561193657fe5b9060200190602002015161135f565b60010161191c565b600160a060020a03918216600090815260046020908152604080832093909416825291909152205460ff1690565b600c54600160a060020a0316331461199257600080fd5b610ffd816121a9565b600160a060020a03811615156119b057600080fd5b600084815260146020526040902054156119c957600080fd5b600083815260136020526040902054156119e257600080fd5b6119ec8184612227565b6000838152601360209081526040808320879055868352601482528083208690558583526012825291829020849055815186815290810184905281518592600160a060020a038516927f524f2cbda4d6611f91af397a555f7d212dde00cbf933069a6267518e0c4a27d7929081900390910190a350505050565b8181018281101561122e57fe5b611a7d8282611abb565b1515610d4657600080fd5b611a9182611134565b1515611a9c57600080fd5b6000828152600b602090815260409091208251610b3a92840190612787565b600160a060020a03166000908152602091909152604090205460ff1690565b600080611ae68361120a565b905080600160a060020a031684600160a060020a03161480611b21575083600160a060020a0316611b1684610c0b565b600160a060020a0316145b80611b315750611b31818561194d565b949350505050565b81600160a060020a0316611b4c8261120a565b600160a060020a031614611b5f57600080fd5b600081815260026020526040902054600160a060020a031615610d46576000908152600260205260409020805473ffffffffffffffffffffffffffffffffffffffff1916905550565b6000806000611bb78585612276565b600084815260086020908152604080832054600160a060020a0389168452600790925290912054909350611bf290600163ffffffff61230c16565b600160a060020a038616600090815260076020526040902080549193509083908110611c1a57fe5b90600052602060002001549050806007600087600160a060020a0316600160a060020a0316815260200190815260200160002084815481101515611c5a57fe5b6000918252602080832090910192909255600160a060020a0387168152600790915260408120805484908110611c8c57fe5b6000918252602080832090910192909255600160a060020a0387168152600790915260409020805490611cc39060001983016127f5565b50600093845260086020526040808520859055908452909220555050565b6000611ced838361231e565b50600160a060020a039091166000908152600760209081526040808320805460018101825590845282842081018590559383526008909152902055565b611d9482600d836040518082805190602001908083835b60208310611d605780518252601f199092019160209182019101611d41565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220929150506123ae565b81600160a060020a03167fd211483f91fc6eff862467f8de606587a30c8fc9981056f051b897a418df803a826040518080602001828103825283818151815260200191508051906020019080838360005b83811015611dfd578181015183820152602001611de5565b50505050905090810190601f168015611e2a5780820380516001836020036101000a031916815260200191505b509250505060405180910390a25050565b6000806000611e4a85856123d0565b6000848152600b60205260409020546002600019610100600184161502019091160415611e88576000848152600b60205260408120611e8891612819565b6000848152600a6020526040902054600954909350611eae90600163ffffffff61230c16565b9150600982815481101515611ebf57fe5b9060005260206000200154905080600984815481101515611edc57fe5b60009182526020822001919091556009805484908110611ef857fe5b6000918252602090912001556009805490611f179060001983016127f5565b506000938452600a6020526040808520859055908452909220555050565b611f9f82600d836040518082805190602001908083835b60208310611f6b5780518252601f199092019160209182019101611f4c565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922092915050612420565b81600160a060020a03167fbfec83d64eaa953f2708271a023ab9ee82057f8f3578d548c1a4ba0b5b7004898260405180806020018281038252838181518152602001915080519060200190808383600083811015611dfd578181015183820152602001611de5565b60008061201c85600160a060020a0316612445565b151561202b576001915061216b565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a03898116602485015260448401889052608060648501908152875160848601528751918a169463150b7a0294938c938b938b93909160a490910190602085019080838360005b838110156120be5781810151838201526020016120a6565b50505050905090810190601f1680156120eb5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561210d57600080fd5b505af1158015612121573d6000803e3d6000fd5b505050506040513d602081101561213757600080fd5b5051600160e060020a031981167f150b7a020000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b604080516020818101835260008083528351808301855281815284519283019094528152606092610ebe92869286929061244d565b600160a060020a03811615156121be57600080fd5b600c54604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600c805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b61223182826126ae565b600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af015550565b81600160a060020a03166122898261120a565b600160a060020a03161461229c57600080fd5b600160a060020a0382166000908152600360205260409020546122c690600163ffffffff61230c16565b600160a060020a03909216600090815260036020908152604080832094909455918152600190915220805473ffffffffffffffffffffffffffffffffffffffff19169055565b60008282111561231857fe5b50900390565b600081815260016020526040902054600160a060020a03161561234057600080fd5b6000818152600160208181526040808420805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038816908117909155845260039091529091205461238e91611a66565b600160a060020a0390921660009081526003602052604090209190915550565b600160a060020a0316600090815260209190915260409020805460ff19169055565b6123da8282611b39565b6123e48282611ba8565b6040518190600090600160a060020a038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600160a060020a0316600090815260209190915260409020805460ff19166001179055565b6000903b1190565b6060806060806060806060806000808e98508d97508c96508b95508a94508451865188518a518c51010101016040519080825280601f01601f1916602001820160405280156124a6578160200160208202803883390190505b50935083925060009150600090505b88518110156125135788818151811015156124cc57fe5b90602001015160f860020a900460f860020a0283838060010194508151811015156124f357fe5b906020010190600160f860020a031916908160001a9053506001016124b5565b5060005b875181101561257557878181518110151561252e57fe5b90602001015160f860020a900460f860020a02838380600101945081518110151561255557fe5b906020010190600160f860020a031916908160001a905350600101612517565b5060005b86518110156125d757868181518110151561259057fe5b90602001015160f860020a900460f860020a0283838060010194508151811015156125b757fe5b906020010190600160f860020a031916908160001a905350600101612579565b5060005b85518110156126395785818151811015156125f257fe5b90602001015160f860020a900460f860020a02838380600101945081518110151561261957fe5b906020010190600160f860020a031916908160001a9053506001016125db565b5060005b845181101561269b57848181518110151561265457fe5b90602001015160f860020a900460f860020a02838380600101945081518110151561267b57fe5b906020010190600160f860020a031916908160001a90535060010161263d565b50909d9c50505050505050505050505050565b600160a060020a03821615156126c357600080fd5b6126cd8282611ce1565b6040518190600160a060020a038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061274a5782800160ff19823516178555612777565b82800160010185558215612777579182015b8281111561277757823582559160200191906001019061275c565b50612783929150612859565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106127c857805160ff1916838001178555612777565b82800160010185558215612777579182015b828111156127775782518255916020019190600101906127da565b815481835581811115610b3a57600083815260209020610b3a918101908301612859565b50805460018160011615610100020316600290046000825580601f1061283f5750610ffd565b601f016020900490600052602060002090810190610ffd91905b610bf691905b80821115612783576000815560010161285f560077686974656c6973740000000000000000000000000000000000000000000000a165627a7a723058204bb646803552ffd6380b0f5b927d53256f9389e54bba41f72a3774472614dd5d0029


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