Contract Overview
Balance: 0 Ether
Ether Value: $0
Transactions: 3807 txns
Token Tracker: ETH.TOWN Hero (HERO)
Misc:
Address Watch: Add To Watch List
Contract Creator: 0x2efde4863c1920d34dc12dbc06b7f6fb8c77d86fat txn 0x301e24dfb3c851e2c6528b11f69be89794eb79d0fb9d45c7e9742167ad1e7c60
 Latest 25 transactions from a total of 3807 transactions

TxHash Age From To Value [TxFee]
0x5eff46fcfac5b2525f112f672f80e14560febe590a9bb3dc8b482a873b9642381 day 8 hrs ago0x9a6f70527abc589362bd5cd50e2d492579acabc0  IN   0x4fece400c0d3db0937162ab44bab34445626ecfe0 Ether0.000311754
0x949af0956c7f3e58076894852916d72fa65052bac80ca0ecfa6c5d3a64aa8b1b1 day 18 hrs ago0xb0c811f9aae43274dbf9e8af006bdef4529e77bf  IN   0x4fece400c0d3db0937162ab44bab34445626ecfe0 Ether0.000276888
0xa6eed78143d903bebcb0d78a55a273a3a74c96c5000d157280d8b5da086944151 day 20 hrs ago0x9a6f70527abc589362bd5cd50e2d492579acabc0  IN   0x4fece400c0d3db0937162ab44bab34445626ecfe0 Ether0.000311754
0xc949e555ff1775af9603b6d90e8b604068afa84026f6d2f3e6aae227cdd4976f1 day 20 hrs ago0x9a6f70527abc589362bd5cd50e2d492579acabc0  IN   0x4fece400c0d3db0937162ab44bab34445626ecfe0 Ether0.000311754
0x610e64ee6726750fbc35156217391612ed9b22d96dd04b729d30c8b1070564663 days 13 hrs ago0xe2c567cd62bc1fa94d75f0bd7611b231ad02fa73  IN   0x4fece400c0d3db0937162ab44bab34445626ecfe0 Ether0.00023074
0x0bca04e77eaa66f9081036d14a54d0bd8da3d2f4eba28d3716aef7e8d8b5eabd4 days 10 hrs ago0x36e058332ae39efad2315776b9c844e30d07388b  IN   0x4fece400c0d3db0937162ab44bab34445626ecfe0 Ether0.000623508
0x0aa42c001967586703d15a3af97df6a8c77bef518262cd270568a324fc9da7e85 days 11 hrs ago0x88396cfaf6f0b1e80ae41c39bd9b35c63ed2c492  IN   0x4fece400c0d3db0937162ab44bab34445626ecfe0 Ether0.00014523
0x826fba2f9f018390550cd28c24a973acf346eff150decb28c444b0e51bc114425 days 11 hrs ago0x88396cfaf6f0b1e80ae41c39bd9b35c63ed2c492  IN   0x4fece400c0d3db0937162ab44bab34445626ecfe0 Ether0.0003224106
0xf714a63ff1f176afd14e4877d1f15e837c32388fdd897c3b2427eb276f8b183b5 days 21 hrs ago0xabf53f5d50139925f4daf2d92da46847ac565095  IN   0x4fece400c0d3db0937162ab44bab34445626ecfe0 Ether0.00041971606
0xd5b2a074208cb4005a7ad756a3deb473f854d8e61df47a4ef2e821dee8b042625 days 23 hrs ago0x9a6f70527abc589362bd5cd50e2d492579acabc0  IN   0x4fece400c0d3db0937162ab44bab34445626ecfe0 Ether0.000727426
0x667f8dd486914dfa5d32f25d93a1878665b527d6375dd1e66ad092d2b332bf746 days 4 hrs ago0x8ad144588f7b18c95f63769d849943f228228c8d  IN   0x4fece400c0d3db0937162ab44bab34445626ecfe0 Ether0.000155877
0x0fd9c753d6f72ce7cfbc203e4d6530cd6b5ec0a3e179ac84b1599cd6485ffcb36 days 9 hrs ago0xabf53f5d50139925f4daf2d92da46847ac565095  IN   0x4fece400c0d3db0937162ab44bab34445626ecfe0 Ether0.0000697104
0xbdf19c0c912b2360e5189e388663c41108c1fea19a9c95039e9287a83e7bb14c6 days 20 hrs ago0x62179f2d589081db4c4bffb1ef176bbd57540036  IN   0x4fece400c0d3db0937162ab44bab34445626ecfe0 Ether0.00014523
0xf341a5e956d5212162f23df9d5e2d408f145fa0dc40daf12c1d0831cca8820ec6 days 20 hrs ago0x9a6f70527abc589362bd5cd50e2d492579acabc0  IN   0x4fece400c0d3db0937162ab44bab34445626ecfe0 Ether0.000311754
0xa6f9f0a6d152669dd0db75a737a3eda97ee52332aacb327affe0f33c865756af6 days 20 hrs ago0x9a6f70527abc589362bd5cd50e2d492579acabc0  IN   0x4fece400c0d3db0937162ab44bab34445626ecfe0 Ether0.000311754
0x9adb60e2e9476ee09504eae5f73b576b0b5455cdfead6d50c3a5a3e7e22487d16 days 23 hrs ago0x9a6f70527abc589362bd5cd50e2d492579acabc0  IN   0x4fece400c0d3db0937162ab44bab34445626ecfe0 Ether0.00103918
0x06e1810841705c06615f4a6e0827c622654604f975213064f6fcbcb311fa4dad7 days 3 hrs ago0x3bc566525b4016e84e63211d590bfbf65c23212e  IN   0x4fece400c0d3db0937162ab44bab34445626ecfe0 Ether0.0001247016
0x40a79c2caa6c51576ba95fd170fe09ce0811a612c27b8528f9da3fdc87aab3e27 days 5 hrs ago0x8ad144588f7b18c95f63769d849943f228228c8d  IN   0x4fece400c0d3db0937162ab44bab34445626ecfe0 Ether0.000155877
0x50c2d55ece4fc2e39282c8b8357c00a3abfa02958f5d2019bad87a31e3457fbc7 days 5 hrs ago0x3bc566525b4016e84e63211d590bfbf65c23212e  IN   0x4fece400c0d3db0937162ab44bab34445626ecfe0 Ether0.000207836
0x9e51b0aeaeda52e07d817f335971a9458e037fda41afd67f78c132970417db598 days 1 hr ago0x9a6f70527abc589362bd5cd50e2d492579acabc0  IN   0x4fece400c0d3db0937162ab44bab34445626ecfe0 Ether0.00103918
0x260d1463206214b81d8a73659091218b35055ba9481d55c69375600bdd37de0c8 days 1 hr ago0x9a6f70527abc589362bd5cd50e2d492579acabc0  IN   0x4fece400c0d3db0937162ab44bab34445626ecfe0 Ether0.00103918
0xff82ea8ef8cf7aa38e32f18cd9f62ab3f6ac71543bc80cd06d8222a71d8d97818 days 19 hrs ago0xb65311584c536ce4b6cab253efe91dde5ce84718  IN   0x4fece400c0d3db0937162ab44bab34445626ecfe0 Ether0.0005622248
0x8eedc41146e63cded1fbd0a449c869d33a07e069d20332e0372e0ac95b24ca489 days 1 hr ago0x36e058332ae39efad2315776b9c844e30d07388b  IN   0x4fece400c0d3db0937162ab44bab34445626ecfe0 Ether0.000311754
0x8a1e165d39b134409aeb1e02be3fcb09f443b30c0a4f803f7de1adbf012f367a9 days 1 hr ago0x36e058332ae39efad2315776b9c844e30d07388b  IN   0x4fece400c0d3db0937162ab44bab34445626ecfe0 Ether0.000311754
0xa814d20bf4c6a963f2f6e0598a4187d0021ab1187fb6a35b0203f782b8de5dd510 days 3 hrs ago0x8ad144588f7b18c95f63769d849943f228228c8d  IN   0x4fece400c0d3db0937162ab44bab34445626ecfe0 Ether0.0001247016
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
View All
ParentTxHash Block Age From To Value
Warning: The Compiled Contract might be susceptible to ExpExponentCleanup (medium/high-severity), EventStructWrongData (very low-severity), NestedArrayFunctionCallDecoder (medium-severity) SolidityCompiler Bugs.

Contract Source Code Verified (Exact Match)
Contract Name: ETHero
Compiler Text: v0.4.21+commit.dfe3193c
Optimization Enabled: Yes
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

pragma solidity ^0.4.21;

// The contract uses code from zeppelin-solidity library
// licensed under MIT license
// https://github.com/OpenZeppelin/zeppelin-solidity

library SafeMath {
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        assert(c / a == b);
        return c;
    }

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

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

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

/**
 * @title ERC721 Non-Fungible Token Standard basic interface
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Basic {
    event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);
    event Approval(address indexed _owner, address indexed _approved, uint256 _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;
}

/**
 * @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() public view returns (string _name);
    function symbol() public 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 {
}

/**
 * @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,uint256,bytes)"))`,
     *  which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`
     */
    bytes4 constant ERC721_RECEIVED = 0xf0b9e5ba;

    /**
     * @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. This function MUST use 50,000 gas or less. Return of other
     *  than the magic value MUST result in the transaction being reverted.
     *  Note: the contract address is always the message sender.
     * @param _from The sending address
     * @param _tokenId The NFT identifier which is being transfered
     * @param _data Additional data with no specified format
     * @return `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`
     */
    function onERC721Received(address _from, uint256 _tokenId, bytes _data) public returns(bytes4);
}

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

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

    // 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));
        _;
    }

    /**
    * @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 existance 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
    * @dev The zero address indicates there is no approved address.
    * @dev There can only be one approved address per token at a given time.
    * @dev 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));

        if (getApproved(_tokenId) != address(0) || _to != address(0)) {
            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 a 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
    * @dev 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
    * @dev Usage of this method is discouraged, use `safeTransferFrom` whenever possible
    * @dev 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
    * @dev 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,uint256,bytes)"))`; otherwise,
    *  the transfer is reverted.
    * @dev 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)
    {
        safeTransferFrom(_from, _to, _tokenId, "");
    }

    /**
    * @dev Safely transfers the ownership of a given token ID to another address
    * @dev 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,uint256,bytes)"))`; otherwise,
    *  the transfer is reverted.
    * @dev 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);
        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);
        return _spender == owner || getApproved(_tokenId) == _spender || isApprovedForAll(owner, _spender);
    }

    /**
    * @dev Internal function to mint a new token
    * @dev 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
    * @dev 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
    * @dev 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);
            emit Approval(_owner, address(0), _tokenId);
        }
    }

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

    /**
     * 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 _user address to check
     * @return whether the target address is a contract
     */
    function _isContract(address _user) internal view returns (bool) {
        uint size;
        assembly { size := extcodesize(_user) }
        return size > 0;
    }

    /**
    * @dev Internal function to invoke `onERC721Received` on a target address
    * @dev 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 (!_isContract(_to)) {
            return true;
        }
        bytes4 retval = ERC721Receiver(_to).onERC721Received(_from, _tokenId, _data);
        return (retval == ERC721_RECEIVED);
    }

}

contract Owned {
    address owner;

    modifier onlyOwner {
        require(msg.sender == owner);
        _;
    }

    /// @dev Contract constructor
    function Owned() public {
        owner = msg.sender;
    }
}

contract HeroLogicInterface {
    function isTransferAllowed(address _from, address _to, uint256 _tokenId) public view returns (bool);
}

contract ETHero is Owned, ERC721, ERC721BasicToken {

    struct HeroData {
        uint16 fieldA;
        uint16 fieldB;
        uint32 fieldC;
        uint32 fieldD;
        uint32 fieldE;
        uint64 fieldF;
        uint64 fieldG;
    }

    // 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;

    // Prefix for token URIs
    string public tokenUriPrefix = "https://eth.town/hero-image/";

    // Interchangeable logic contract
    address public logicContract;

    // Incremental uniqueness index for the genome
    uint32 public uniquenessIndex = 0;
    // Last token ID
    uint256 public lastTokenId = 0;

    // Users' active heroes
    mapping(address => uint256) public activeHero;

    // Hero data
    mapping(uint256 => HeroData) public heroData;

    // Genomes
    mapping(uint256 => uint256) public genome;

    event ActiveHeroChanged(address indexed _from, uint256 _tokenId);

    modifier onlyLogicContract {
        require(msg.sender == logicContract || msg.sender == owner);
        _;
    }

    /**
    * @dev Constructor function
    */
    function ETHero() public {
        name_ = "ETH.TOWN Hero";
        symbol_ = "HERO";
    }

    /**
    * @dev Sets the token's interchangeable logic contract
    */
    function setLogicContract(address _logicContract) external onlyOwner {
        logicContract = _logicContract;
    }

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

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

    /**
    * @dev Internal function to check if transferring a specific token is allowed
    * @param _from transfer from
    * @param _to transfer to
    * @param _tokenId token to transfer
    */
    function _isTransferAllowed(address _from, address _to, uint256 _tokenId) internal view returns (bool) {
        if (logicContract == address(0)) {
            return true;
        }

        HeroLogicInterface logic = HeroLogicInterface(logicContract);
        return logic.isTransferAllowed(_from, _to, _tokenId);
    }

    /**
    * @dev Appends uint (in decimal) to a string
    * @param _str The prefix string
    * @param _value The uint to append
    * @return resulting string
    */
    function _appendUintToString(string _str, uint _value) internal pure returns (string) {
        uint maxLength = 100;
        bytes memory reversed = new bytes(maxLength);
        uint i = 0;
        while (_value != 0) {
            uint remainder = _value % 10;
            _value = _value / 10;
            reversed[i++] = byte(48 + remainder);
        }
        i--;

        bytes memory inStrB = bytes(_str);
        bytes memory s = new bytes(inStrB.length + i + 1);
        uint j;
        for (j = 0; j < inStrB.length; j++) {
            s[j] = inStrB[j];
        }
        for (j = 0; j <= i; j++) {
            s[j + inStrB.length] = reversed[i - j];
        }
        return string(s);
    }

    /**
    * @dev Returns an URI for a given token ID
    * @dev Throws if the token ID does not exist
    * @param _tokenId uint256 ID of the token to query
    */
    function tokenURI(uint256 _tokenId) public view returns (string) {
        require(exists(_tokenId));
        return _appendUintToString(tokenUriPrefix, genome[_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
    * @dev 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 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;

        if (activeHero[_to] == 0) {
            activeHero[_to] = _tokenId;
            emit ActiveHeroChanged(_to, _tokenId);
        }
    }

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

        // If a hero is removed from its owner, it no longer can be their active hero
        if (activeHero[_from] == _tokenId) {
            activeHero[_from] = 0;
            emit ActiveHeroChanged(_from, 0);
        }
    }

    /**
    * @dev Internal function to mint a new token
    * @dev 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 {
        require(_to != address(0));
        addTokenTo(_to, _tokenId);
        emit Transfer(address(0), _to, _tokenId);

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

    /**
    * @dev External function to mint a new token
    * @dev 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) external onlyLogicContract {
        _mint(_to, _tokenId);
    }

    /**
    * @dev Internal function to burn a specific token
    * @dev 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 {
        clearApproval(_owner, _tokenId);
        removeTokenFrom(_owner, _tokenId);
        emit Transfer(_owner, address(0), _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;

        // Clear genome data
        if (genome[_tokenId] != 0) {
            genome[_tokenId] = 0;
        }
    }

    /**
    * @dev External function to burn a specific token
    * @dev 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) external onlyLogicContract {
        _burn(_owner, _tokenId);
    }

    /**
    * @dev Transfers the ownership of a given token ID to another address
    * @dev Usage of this method is discouraged, use `safeTransferFrom` whenever possible
    * @dev 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(_isTransferAllowed(_from, _to, _tokenId));
        super.transferFrom(_from, _to, _tokenId);
    }

    /**
    * @dev Safely transfers the ownership of a given token ID to another address
    * @dev 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,uint256,bytes)"))`; otherwise,
    *  the transfer is reverted.
    * @dev 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)
    {
        require(_isTransferAllowed(_from, _to, _tokenId));
        super.safeTransferFrom(_from, _to, _tokenId);
    }

    /**
    * @dev Safely transfers the ownership of a given token ID to another address
    * @dev 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,uint256,bytes)"))`; otherwise,
    *  the transfer is reverted.
    * @dev 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)
    {
        require(_isTransferAllowed(_from, _to, _tokenId));
        super.safeTransferFrom(_from, _to, _tokenId, _data);
    }

    /**
    * @dev Allows to transfer a token to another owner
    * @param _to transfer to
    * @param _tokenId token to transfer
    */
    function transfer(address _to, uint256 _tokenId) external onlyOwnerOf(_tokenId) {
        require(_isTransferAllowed(msg.sender, _to, _tokenId));
        require(_to != address(0));

        clearApproval(msg.sender, _tokenId);
        removeTokenFrom(msg.sender, _tokenId);
        addTokenTo(_to, _tokenId);

        emit Transfer(msg.sender, _to, _tokenId);
    }

    /**
    * @dev Sets the specified token as user's active Hero
    * @param _tokenId the hero token to set as active
    */
    function setActiveHero(uint256 _tokenId) external onlyOwnerOf(_tokenId) {
        activeHero[msg.sender] = _tokenId;
        emit ActiveHeroChanged(msg.sender, _tokenId);
    }

    /**
    * @dev Queries list of tokens owned by a specific address
    * @param _owner the address to get tokens of
    */
    function tokensOfOwner(address _owner) external view returns (uint256[]) {
        return ownedTokens[_owner];
    }

    /**
    * @dev Gets the genome of the active hero
    * @param _owner the address to get hero of
    */
    function activeHeroGenome(address _owner) public view returns (uint256) {
        uint256 tokenId = activeHero[_owner];
        if (tokenId == 0) {
            return 0;
        }

        return genome[tokenId];
    }

    /**
    * @dev Increments uniqueness index. Overflow intentionally allowed.
    */
    function incrementUniquenessIndex() external onlyLogicContract {
        uniquenessIndex ++;
    }

    /**
    * @dev Increments lastTokenId
    */
    function incrementLastTokenId() external onlyLogicContract {
        lastTokenId ++;
    }

    /**
    * @dev Allows (re-)setting the uniqueness index
    * @param _uniquenessIndex new value
    */
    function setUniquenessIndex(uint32 _uniquenessIndex) external onlyOwner {
        uniquenessIndex = _uniquenessIndex;
    }

    /**
    * @dev Allows (re-)setting lastTokenId
    * @param _lastTokenId new value
    */
    function setLastTokenId(uint256 _lastTokenId) external onlyOwner {
        lastTokenId = _lastTokenId;
    }

    /**
    * @dev Allows setting hero data for a hero
    * @param _tokenId hero to set data for
    * @param _fieldA data to set
    * @param _fieldB data to set
    * @param _fieldC data to set
    * @param _fieldD data to set
    * @param _fieldE data to set
    * @param _fieldF data to set
    * @param _fieldG data to set
    */
    function setHeroData(
        uint256 _tokenId,
        uint16 _fieldA,
        uint16 _fieldB,
        uint32 _fieldC,
        uint32 _fieldD,
        uint32 _fieldE,
        uint64 _fieldF,
        uint64 _fieldG
    ) external onlyLogicContract {
        heroData[_tokenId] = HeroData(
            _fieldA,
            _fieldB,
            _fieldC,
            _fieldD,
            _fieldE,
            _fieldF,
            _fieldG
        );
    }

    /**
    * @dev Allows setting hero genome
    * @param _tokenId token to set data for
    * @param _genome genome data to set
    */
    function setGenome(uint256 _tokenId, uint256 _genome) external onlyLogicContract {
        genome[_tokenId] = _genome;
    }

    /**
    * @dev Allows the admin to forcefully transfer a token from one address to another
    * @param _from transfer from
    * @param _to transfer to
    * @param _tokenId token to transfer
    */
    function forceTransfer(address _from, address _to, uint256 _tokenId) external onlyLogicContract {
        require(_from != address(0));
        require(_to != address(0));

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

        emit Transfer(_from, _to, _tokenId);
    }

    /**
    * @dev External function to set the token URI prefix for all tokens
    * @param _uriPrefix prefix string to assign
    */
    function setTokenUriPrefix(string _uriPrefix) external onlyOwner {
        tokenUriPrefix = _uriPrefix;
    }


}

    Contract ABI  
[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"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":"_owner","type":"address"}],"name":"activeHeroGenome","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"activeHero","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"incrementUniquenessIndex","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"setActiveHero","outputs":[],"payable":false,"stateMutability":"nonpayable","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":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"forceTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"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":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":false,"inputs":[{"name":"_uriPrefix","type":"string"}],"name":"setTokenUriPrefix","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_logicContract","type":"address"}],"name":"setLogicContract","outputs":[],"payable":false,"stateMutability":"nonpayable","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":"_tokenId","type":"uint256"},{"name":"_fieldA","type":"uint16"},{"name":"_fieldB","type":"uint16"},{"name":"_fieldC","type":"uint32"},{"name":"_fieldD","type":"uint32"},{"name":"_fieldE","type":"uint32"},{"name":"_fieldF","type":"uint64"},{"name":"_fieldG","type":"uint64"}],"name":"setHeroData","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"heroData","outputs":[{"name":"fieldA","type":"uint16"},{"name":"fieldB","type":"uint16"},{"name":"fieldC","type":"uint32"},{"name":"fieldD","type":"uint32"},{"name":"fieldE","type":"uint32"},{"name":"fieldF","type":"uint64"},{"name":"fieldG","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"burn","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":"_uniquenessIndex","type":"uint32"}],"name":"setUniquenessIndex","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"incrementLastTokenId","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":"logicContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"genome","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_lastTokenId","type":"uint256"}],"name":"setLastTokenId","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":true,"inputs":[],"name":"uniquenessIndex","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_genome","type":"uint256"}],"name":"setGenome","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"lastTokenId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenUriPrefix","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":false,"name":"_tokenId","type":"uint256"}],"name":"ActiveHeroChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":false,"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 Switch To Opcodes View
606060405260408051908101604052601c81527f68747470733a2f2f6574682e746f776e2f6865726f2d696d6167652f000000006020820152600b9080516200004d92916020019062000127565b50600c805460a060020a63ffffffff02191690556000600d5534156200007257600080fd5b60008054600160a060020a03191633600160a060020a031617905560408051908101604052600d81527f4554482e544f574e204865726f0000000000000000000000000000000000000060208201526005908051620000d692916020019062000127565b5060408051908101604052600481527f4845524f00000000000000000000000000000000000000000000000000000000602082015260069080516200012092916020019062000127565b50620001cc565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200016a57805160ff19168380011785556200019a565b828001600101855582156200019a579182015b828111156200019a5782518255916020019190600101906200017d565b50620001a8929150620001ac565b5090565b620001c991905b80821115620001a85760008155600101620001b3565b90565b61222a80620001dc6000396000f3006060604052600436106101be5763ffffffff60e060020a60003504166306fdde0381146101c3578063081812fc1461024d578063095ea7b31461027f5780630b3464c3146102a35780631038a54e146102d457806314572dff146102f357806318160ddd146103065780631d6c0dfa1461031957806323b872dd1461032f5780632f745c591461035757806333bebb771461037957806340c10f19146103a157806342842e0e146103c35780634f558e79146103eb5780634f6ccce714610415578063532e48491461042b5780635aa4470f146104495780636352211e146104685780636a1af8b81461047e57806370a08231146104c957806373b31190146104e85780638462151c1461055557806395d89b41146105c75780639dc29fac146105da578063a22cb465146105fc578063a4482f4114610620578063a9059cbb1461063c578063b65c2b401461065e578063b88d4fde14610671578063c87b56dd146106dd578063cc0e97c9146106f3578063d847057614610706578063e81f35fd1461071c578063e985e9c514610732578063ea79f33d14610757578063f21f80d014610783578063f84ddf0b1461079c578063fce87fb0146107af575b600080fd5b34156101ce57600080fd5b6101d66107c2565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156102125780820151838201526020016101fa565b50505050905090810190601f16801561023f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561025857600080fd5b61026360043561086b565b604051600160a060020a03909116815260200160405180910390f35b341561028a57600080fd5b6102a1600160a060020a0360043516602435610886565b005b34156102ae57600080fd5b6102c2600160a060020a0360043516610982565b60405190815260200160405180910390f35b34156102df57600080fd5b6102c2600160a060020a03600435166109c3565b34156102fe57600080fd5b6102a16109d5565b341561031157600080fd5b6102c2610a59565b341561032457600080fd5b6102a1600435610a5f565b341561033a57600080fd5b6102a1600160a060020a0360043581169060243516604435610ada565b341561036257600080fd5b6102c2600160a060020a0360043516602435610b17565b341561038457600080fd5b6102a1600160a060020a0360043581169060243516604435610b65565b34156103ac57600080fd5b6102a1600160a060020a0360043516602435610c1d565b34156103ce57600080fd5b6102a1600160a060020a0360043581169060243516604435610c61565b34156103f657600080fd5b610401600435610c98565b604051901515815260200160405180910390f35b341561042057600080fd5b6102c2600435610cb5565b341561043657600080fd5b6102a16004803560248101910135610ceb565b341561045457600080fd5b6102a1600160a060020a0360043516610d12565b341561047357600080fd5b610263600435610d5c565b341561048957600080fd5b6102a160043561ffff6024358116906044351663ffffffff60643581169060843581169060a4351667ffffffffffffffff60c43581169060e43516610d86565b34156104d457600080fd5b6102c2600160a060020a0360043516610f79565b34156104f357600080fd5b6104fe600435610fac565b60405161ffff978816815295909616602086015263ffffffff93841660408087019190915292841660608601529216608084015267ffffffffffffffff91821660a0840152921660c082015260e001905180910390f35b341561056057600080fd5b610574600160a060020a036004351661103d565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156105b357808201518382015260200161059b565b505050509050019250505060405180910390f35b34156105d257600080fd5b6101d66110c0565b34156105e557600080fd5b6102a1600160a060020a0360043516602435611133565b341561060757600080fd5b6102a1600160a060020a03600435166024351515611173565b341561062b57600080fd5b6102a163ffffffff60043516611204565b341561064757600080fd5b6102a1600160a060020a0360043516602435611267565b341561066957600080fd5b6102a1611311565b341561067c57600080fd5b6102a1600160a060020a036004803582169160248035909116916044359160849060643590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061135295505050505050565b34156106e857600080fd5b6101d6600435611391565b34156106fe57600080fd5b610263611461565b341561071157600080fd5b6102c2600435611470565b341561072757600080fd5b6102a1600435611482565b341561073d57600080fd5b610401600160a060020a03600435811690602435166114a2565b341561076257600080fd5b61076a6114d0565b60405163ffffffff909116815260200160405180910390f35b341561078e57600080fd5b6102a16004356024356114f4565b34156107a757600080fd5b6102c261153c565b34156107ba57600080fd5b6101d6611542565b6107ca612114565b60058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108605780601f1061083557610100808354040283529160200191610860565b820191906000526020600020905b81548152906001019060200180831161084357829003601f168201915b505050505090505b90565b600090815260026020526040902054600160a060020a031690565b600061089182610d5c565b9050600160a060020a0383811690821614156108ac57600080fd5b80600160a060020a031633600160a060020a031614806108d157506108d181336114a2565b15156108dc57600080fd5b60006108e78361086b565b600160a060020a03161415806109055750600160a060020a03831615155b1561097d5760008281526002602052604090819020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0386811691821790925591908316907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a35b505050565b600160a060020a0381166000908152600e60205260408120548015156109ab57600091506109bd565b60008181526010602052604090205491505b50919050565b600e6020526000908152604090205481565b600c5433600160a060020a0390811691161480610a00575060005433600160a060020a039081169116145b1515610a0b57600080fd5b600c8054600163ffffffff74010000000000000000000000000000000000000000808404821692909201160277ffffffff000000000000000000000000000000000000000019909116179055565b60095490565b8033600160a060020a0316610a7382610d5c565b600160a060020a031614610a8657600080fd5b600160a060020a0333166000818152600e6020526040908190208490557f120a390cb4dcd5b400add7dd5a2fc0f7fe657034e6484e3f3667582369856b849084905190815260200160405180910390a25050565b80610ae533826115e0565b1515610af057600080fd5b610afb84848461163f565b1515610b0657600080fd5b610b118484846116e5565b50505050565b6000610b2283610f79565b8210610b2d57600080fd5b600160a060020a0383166000908152600760205260409020805483908110610b5157fe5b906000526020600020900154905092915050565b600c5433600160a060020a0390811691161480610b90575060005433600160a060020a039081169116145b1515610b9b57600080fd5b600160a060020a0383161515610bb057600080fd5b600160a060020a0382161515610bc557600080fd5b610bcf838261177e565b610bd9838261182d565b610be382826119cb565b81600160a060020a031683600160a060020a03166000805160206121df8339815191528360405190815260200160405180910390a3505050565b600c5433600160a060020a0390811691161480610c48575060005433600160a060020a039081169116145b1515610c5357600080fd5b610c5d8282611a92565b5050565b80610c6c33826115e0565b1515610c7757600080fd5b610c8284848461163f565b1515610c8d57600080fd5b610b11848484611b11565b600090815260016020526040902054600160a060020a0316151590565b6000610cbf610a59565b8210610cca57600080fd5b6009805483908110610cd857fe5b9060005260206000209001549050919050565b60005433600160a060020a03908116911614610d0657600080fd5b61097d600b8383612126565b60005433600160a060020a03908116911614610d2d57600080fd5b600c805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600081815260016020526040812054600160a060020a0316801515610d8057600080fd5b92915050565b600c5433600160a060020a0390811691161480610db1575060005433600160a060020a039081169116145b1515610dbc57600080fd5b60e0604051908101604090815261ffff808a168352881660208084019190915263ffffffff8089168385015287811660608501528616608084015267ffffffffffffffff80861660a0850152841660c084015260008b8152600f909152208151815461ffff191661ffff919091161781556020820151815461ffff91909116620100000263ffff0000199091161781556040820151815463ffffffff919091166401000000000267ffffffff00000000199091161781556060820151815463ffffffff9190911668010000000000000000026bffffffff0000000000000000199091161781556080820151815463ffffffff919091166c01000000000000000000000000026fffffffff0000000000000000000000001990911617815560a0820151815467ffffffffffffffff919091167001000000000000000000000000000000000277ffffffffffffffff000000000000000000000000000000001990911617815560c0820151815467ffffffffffffffff9190911678010000000000000000000000000000000000000000000000000277ffffffffffffffffffffffffffffffffffffffffffffffff909116179055505050505050505050565b6000600160a060020a0382161515610f9057600080fd5b50600160a060020a031660009081526003602052604090205490565b600f6020526000908152604090205461ffff808216916201000081049091169063ffffffff64010000000082048116916801000000000000000081048216916c010000000000000000000000008204169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041687565b611045612114565b6007600083600160a060020a0316600160a060020a031681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156110b457602002820191906000526020600020905b8154815260200190600101908083116110a0575b50505050509050919050565b6110c8612114565b60068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108605780601f1061083557610100808354040283529160200191610860565b600c5433600160a060020a039081169116148061115e575060005433600160a060020a039081169116145b151561116957600080fd5b610c5d8282611b41565b33600160a060020a031682600160a060020a03161415151561119457600080fd5b33600160a060020a0390811660008181526004602090815260408083209487168084529490915290819020805460ff19168515151790557f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190849051901515815260200160405180910390a35050565b60005433600160a060020a0390811691161461121f57600080fd5b600c805463ffffffff909216740100000000000000000000000000000000000000000277ffffffff000000000000000000000000000000000000000019909216919091179055565b8033600160a060020a031661127b82610d5c565b600160a060020a03161461128e57600080fd5b61129933848461163f565b15156112a457600080fd5b600160a060020a03831615156112b957600080fd5b6112c3338361177e565b6112cd338361182d565b6112d783836119cb565b82600160a060020a031633600160a060020a03166000805160206121df8339815191528460405190815260200160405180910390a3505050565b600c5433600160a060020a039081169116148061133c575060005433600160a060020a039081169116145b151561134757600080fd5b600d80546001019055565b8161135d33826115e0565b151561136857600080fd5b61137385858561163f565b151561137e57600080fd5b61138a85858585611c5a565b5050505050565b611399612114565b6113a282610c98565b15156113ad57600080fd5b610d80600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114465780601f1061141b57610100808354040283529160200191611446565b820191906000526020600020905b81548152906001019060200180831161142957829003601f168201915b5050506000868152601060205260409020549150611c929050565b600c54600160a060020a031681565b60106020526000908152604090205481565b60005433600160a060020a0390811691161461149d57600080fd5b600d55565b600160a060020a03918216600090815260046020908152604080832093909416825291909152205460ff1690565b600c5474010000000000000000000000000000000000000000900463ffffffff1681565b600c5433600160a060020a039081169116148061151f575060005433600160a060020a039081169116145b151561152a57600080fd5b60009182526010602052604090912055565b600d5481565b600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115d85780601f106115ad576101008083540402835291602001916115d8565b820191906000526020600020905b8154815290600101906020018083116115bb57829003601f168201915b505050505081565b6000806115ec83610d5c565b905080600160a060020a031684600160a060020a03161480611627575083600160a060020a031661161c8461086b565b600160a060020a0316145b80611637575061163781856114a2565b949350505050565b600c546000908190600160a060020a0316151561165f57600191506116dd565b50600c54600160a060020a03168063f7ebc39a86868660405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b15156116c457600080fd5b5af115156116d157600080fd5b50505060405180519250505b509392505050565b806116f033826115e0565b15156116fb57600080fd5b600160a060020a038416151561171057600080fd5b600160a060020a038316151561172557600080fd5b61172f848361177e565b611739848361182d565b61174383836119cb565b82600160a060020a031684600160a060020a03166000805160206121df8339815191528460405190815260200160405180910390a350505050565b81600160a060020a031661179182610d5c565b600160a060020a0316146117a457600080fd5b600081815260026020526040902054600160a060020a031615610c5d57600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169055600160a060020a038416907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259084905190815260200160405180910390a35050565b600080600061183c8585611e6e565b600084815260086020908152604080832054600160a060020a038916845260079092529091205490935061187790600163ffffffff611f0416565b600160a060020a03861660009081526007602052604090208054919350908390811061189f57fe5b6000918252602080832090910154600160a060020a03881683526007909152604090912080549192508291859081106118d457fe5b6000918252602080832090910192909255600160a060020a038716815260079091526040812080548490811061190657fe5b6000918252602080832090910192909255600160a060020a038716815260079091526040902080549061193d9060001983016121a4565b506000848152600860209081526040808320839055838352808320869055600160a060020a0388168352600e90915290205484141561138a57600160a060020a0385166000818152600e60205260408082208290557f120a390cb4dcd5b400add7dd5a2fc0f7fe657034e6484e3f3667582369856b8491905190815260200160405180910390a25050505050565b60006119d78383611f16565b50600160a060020a03821660009081526007602052604090208054908160018101611a0283826121a4565b506000918252602080832091909101849055838252600881526040808320849055600160a060020a0386168352600e909152902054151561097d57600160a060020a0383166000818152600e6020526040908190208490557f120a390cb4dcd5b400add7dd5a2fc0f7fe657034e6484e3f3667582369856b849084905190815260200160405180910390a2505050565b600160a060020a0382161515611aa757600080fd5b611ab182826119cb565b600160a060020a03821660006000805160206121df8339815191528360405190815260200160405180910390a3600980546000838152600a6020526040902081905560018101611b0183826121a4565b5060009182526020909120015550565b80611b1c33826115e0565b1515611b2757600080fd5b610b11848484602060405190810160405260008152611352565b6000806000611b50858561177e565b611b5a858561182d565b6000600160a060020a0386166000805160206121df8339815191528660405190815260200160405180910390a36000848152600a6020526040902054600954909350611bad90600163ffffffff611f0416565b9150600982815481101515611bbe57fe5b906000526020600020900154905080600984815481101515611bdc57fe5b60009182526020822001919091556009805484908110611bf857fe5b6000918252602090912001556009805490611c179060001983016121a4565b506000848152600a6020908152604080832083905583835280832086905586835260109091529020541561138a5750505060009081526010602052604081205550565b81611c6533826115e0565b1515611c7057600080fd5b611c7b858585610ada565b611c8785858585611fa6565b151561138a57600080fd5b611c9a612114565b6000611ca4612114565b600080611caf612114565b611cb7612114565b60006064965086604051805910611ccb5750595b818152601f19601f830116810160200160405290509550600094505b8815611d4a57600a89069350600a890498508360300160f860020a02868680600101975081518110611d1557fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611ce7565b6000199094019389925084835101600101604051805910611d685750595b818152601f19601f830116810160200160405290509150600090505b8251811015611def57828181518110611d9957fe5b016020015160f860020a900460f860020a02828281518110611db757fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101611d84565b5060005b848111611e61578581860381518110611e0857fe5b016020015160f860020a900460f860020a02828451830181518110611e2957fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101611df3565b5098975050505050505050565b81600160a060020a0316611e8182610d5c565b600160a060020a031614611e9457600080fd5b600160a060020a038216600090815260036020526040902054611ebe90600163ffffffff611f0416565b600160a060020a03909216600090815260036020908152604080832094909455918152600190915220805473ffffffffffffffffffffffffffffffffffffffff19169055565b600082821115611f1057fe5b50900390565b600081815260016020526040902054600160a060020a031615611f3857600080fd5b6000818152600160208181526040808420805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0388169081179091558452600390915290912054611f86916120f6565b600160a060020a0390921660009081526003602052604090209190915550565b600080611fb28561210c565b1515611fc157600191506120ed565b84600160a060020a031663f0b9e5ba8786866040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612040578082015183820152602001612028565b50505050905090810190601f16801561206d5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b151561208d57600080fd5b5af1151561209a57600080fd5b50505060405180517fffffffff0000000000000000000000000000000000000000000000000000000081167ff0b9e5ba000000000000000000000000000000000000000000000000000000001493509150505b50949350505050565b60008282018381101561210557fe5b9392505050565b6000903b1190565b60206040519081016040526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106121675782800160ff19823516178555612194565b82800160010185558215612194579182015b82811115612194578235825591602001919060010190612179565b506121a09291506121c4565b5090565b81548183558181151161097d5760008381526020902061097d9181019083015b61086891905b808211156121a057600081556001016121ca5600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a7230582017bfcef20c0dcc7aa0b7d98abedad0970445dcced96cd76799df1f4fc0358e930029

   Swarm Source:
bzzr://17bfcef20c0dcc7aa0b7d98abedad0970445dcced96cd76799df1f4fc0358e93

 

View All
Block Age transaction Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.