Sponsored:   [Largest VC Funded] TEMCO, millions sold out in seconds. Join TEMCO's last presale at CoinBene!
Contract Overview
Balance: 0 Ether
Ether Value: $0
Transactions: 62 txns
Token Tracker: Su Squares (SU)
Misc:
Address Watch: Add To Watch List
Contract Creator: 0xf1ac3c963c377faf5737f41c294ca8c79565a610at txn 0x07bb215de77674c272b3a0e3f336642879f926df52e79d9ff8b26fdcbc4acb1b
 Latest 25 transactions from a total of 62 transactions

TxHash Age From To Value [TxFee]
0x2c41fe411a482044c1ed8c6419052f8102606cadf84490564307056fbad20d0028 days 17 hrs ago0xd859d7d8603d2dab768d679eeec25930c8fc59c1  IN   0xe9e3f9cfc1a64dfca53614a0182cfad56c10624f0 Ether0.000274812
0x98cc030a342b9c5db64cc16441ba2879dbf4e0049facedd25c1f13dab407402429 days 15 hrs ago0x7b91c5453eabd33e69083b55ce0dd450d6e2c8f4  IN   0xe9e3f9cfc1a64dfca53614a0182cfad56c10624f0 Ether0.0010317714
0x06e88a78d18c509b3bd59c2254379601f3300559f2b41132fd8cac20ee92ce0829 days 16 hrs ago0xd859d7d8603d2dab768d679eeec25930c8fc59c1  IN   0xe9e3f9cfc1a64dfca53614a0182cfad56c10624f0 Ether0.000890241
0xd0ed3f184623ccd5e26c70f252d9191f39011b156eee29e0090a8c1a2f2b18a829 days 16 hrs ago0x7b91c5453eabd33e69083b55ce0dd450d6e2c8f4  IN   0xe9e3f9cfc1a64dfca53614a0182cfad56c10624f0 Ether0.000611172
0xc4bab14d85e3fb5ac868bafa27728c645221657f1c5df15764affb8e7a490a0e31 days 23 hrs ago0x0239769a1adf4def9f07da824b80b9c4fcb59593  IN   0xe9e3f9cfc1a64dfca53614a0182cfad56c10624f0 Ether0.000989142
0x8a3fbd762f4172c5e2478cba3420bd4b8ff62d3f82280e0def61233593c21df633 days 15 hrs ago0x7b91c5453eabd33e69083b55ce0dd450d6e2c8f4  IN   0xe9e3f9cfc1a64dfca53614a0182cfad56c10624f0 Ether0.000753566
0xef0e6b725c376ff1880c2f65938c4e60a9a900463c3fc70d9a19c9eebf47276933 days 15 hrs ago0x7b91c5453eabd33e69083b55ce0dd450d6e2c8f4  IN   0xe9e3f9cfc1a64dfca53614a0182cfad56c10624f0 Ether0.0007367147
0xe3fdd966bbc72a35b30f7fd429c28357fa3fd57451c931b38ba18c9b967d4c9b34 days 23 hrs ago0x7b91c5453eabd33e69083b55ce0dd450d6e2c8f4  IN   0xe9e3f9cfc1a64dfca53614a0182cfad56c10624f0 Ether0.0002177835
0xcd3e0c593cb12d9fd8b31d7016eae7d6d46dfe5248435c09860feefcaffcbccc34 days 23 hrs ago0x7b91c5453eabd33e69083b55ce0dd450d6e2c8f4  IN   0xe9e3f9cfc1a64dfca53614a0182cfad56c10624f0 Ether0.0002177835
0x498e446d2a055e0ed68954cbf34181d007ec27d30f16076ed02643e08346297934 days 23 hrs ago0x7b91c5453eabd33e69083b55ce0dd450d6e2c8f4  IN   0xe9e3f9cfc1a64dfca53614a0182cfad56c10624f0 Ether0.0002177835
0x95263169edf37549b8bacf284e3c7ad696071de0a714c13ca9145e931b587c4634 days 23 hrs ago0x7b91c5453eabd33e69083b55ce0dd450d6e2c8f4  IN   0xe9e3f9cfc1a64dfca53614a0182cfad56c10624f0 Ether0.0002672835
0xdd2f5f8394103dc2b8a9e9d3f3291cb5006d63321f3ecb91cf4dae4e8ea8255434 days 23 hrs ago0x7b91c5453eabd33e69083b55ce0dd450d6e2c8f4  IN   0xe9e3f9cfc1a64dfca53614a0182cfad56c10624f0 Ether0.0005653857
0xf47d3da6e08856b6bda0da9731be0a4f032440f7855307aac094bd47eabc04d434 days 23 hrs ago0x7b91c5453eabd33e69083b55ce0dd450d6e2c8f4  IN   0xe9e3f9cfc1a64dfca53614a0182cfad56c10624f0 Ether0.0002177835
0x459dcfa4e2c0801136987e7fac715e67644de1556b342883016b078aec81ef0c34 days 23 hrs ago0x7b91c5453eabd33e69083b55ce0dd450d6e2c8f4  IN   0xe9e3f9cfc1a64dfca53614a0182cfad56c10624f0 Ether0.0002547798
0x2cb5ce2ab4ea307a13931242f0a5b62ed46e142208006483aeb66bd1ae768f1734 days 23 hrs ago0x7b91c5453eabd33e69083b55ce0dd450d6e2c8f4  IN   0xe9e3f9cfc1a64dfca53614a0182cfad56c10624f0 Ether0.0002547798
0x97aff1b67913e5a02c2ec1f1a6b114853315e7a7baf143994d9bac8b36706f0634 days 23 hrs ago0x7b91c5453eabd33e69083b55ce0dd450d6e2c8f4  IN   0xe9e3f9cfc1a64dfca53614a0182cfad56c10624f0 Ether0.0002545686
0x98e9855250a32929d050b33ac52c81c4b41f2e16aef5e24b9fbe55eb91e8ee7134 days 23 hrs ago0x7b91c5453eabd33e69083b55ce0dd450d6e2c8f4  IN   0xe9e3f9cfc1a64dfca53614a0182cfad56c10624f0 Ether0.0003040686
0x14f631654619fe89c03593fbb012a0dd6c5f4e454d22a5f6f8fcd11aeaa14f1834 days 23 hrs ago0x7b91c5453eabd33e69083b55ce0dd450d6e2c8f4  IN   0xe9e3f9cfc1a64dfca53614a0182cfad56c10624f0 Ether0.0003042798
0x3c3adf7766e414f807b23f08bf5ca21b99cf21e9c85d1831ac542b342d8ba44e34 days 23 hrs ago0x7b91c5453eabd33e69083b55ce0dd450d6e2c8f4  IN   0xe9e3f9cfc1a64dfca53614a0182cfad56c10624f0 Ether0.0005156745
0xd45a567e4daa94670ccfa73c265b678877b2efa01f949427075b75a390d02e5234 days 23 hrs ago0x7b91c5453eabd33e69083b55ce0dd450d6e2c8f4  IN   0xe9e3f9cfc1a64dfca53614a0182cfad56c10624f0 Ether0.0005651745
0xb963149c98c22f0ed2e44d76f1dc7a99b9aa8940de25e879e92c5232ad53fa5a35 days 7 mins ago0x7b91c5453eabd33e69083b55ce0dd450d6e2c8f4  IN   0xe9e3f9cfc1a64dfca53614a0182cfad56c10624f0 Ether0.0004583799
0x4e1416ddda750952753814593464b82b4c865451db66c42622752126725066ac35 days 1 hr ago0x7b91c5453eabd33e69083b55ce0dd450d6e2c8f4  IN   0xe9e3f9cfc1a64dfca53614a0182cfad56c10624f0 Ether0.0012244254
0x45dea07bd0645294be29548aee0b863f2929177e19cc19c8ce955c7b22bfb9c935 days 1 hr ago0x7b91c5453eabd33e69083b55ce0dd450d6e2c8f4  IN   0xe9e3f9cfc1a64dfca53614a0182cfad56c10624f0 Ether0.0012125982
0xccd307c60499e7762fed0d021a2328a419bfa5f579700fbf1b494ec28b1ce62935 days 1 hr ago0x7b91c5453eabd33e69083b55ce0dd450d6e2c8f4  IN   0xe9e3f9cfc1a64dfca53614a0182cfad56c10624f0 Ether0.0012223134
0x7ba6e279bf5fef716916938c5c91cd8155eae3f4070866f4d6923a1afb263d2435 days 1 hr ago0x7b91c5453eabd33e69083b55ce0dd450d6e2c8f4  IN   0xe9e3f9cfc1a64dfca53614a0182cfad56c10624f0 Ether0.0012223134
[ 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) SolidityCompiler Bugs.

Contract Source Code Verified (Exact Match)
Contract Name: SuMain
Compiler Text: v0.4.24+commit.e67f0147
Optimization Enabled: Yes
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

pragma solidity ^0.4.24;

/******************************************************************************\
*..................................SU SQUARES..................................*
*.....................Cute squares you own and personalize.....................*
*..............................................................................*
* First, I just want to say we are so excited and humbled to get this far and  *
* that you're even reading this. So thank you!                                 *
*                                                                              *
* This file is organized into multiple contracts that separate functionality   *
* into logical parts. The deployed contract, SuMain, is at the bottom and      *
* includes the rest of the file using inheritance.                             *
*                                                                              *
*  - ERC165, ERC721: These interfaces follow the official EIPs                 *
*  - AccessControl: A reusable CEO/CFO/COO access model                        *
*  - SupportsInterface: An implementation of ERC165                            *
*  - SuNFT: An implementation of ERC721                                        *
*  - SuOperation: The actual square data and the personalize function          *
*  - SuPromo, SuVending: How we grant or sell squares                          *
*..............................................................................*
*............................Su & William Entriken.............................*
*...................................(c) 2018...................................*
\******************************************************************************/

/* AccessControl.sol **********************************************************/

/// @title Reusable three-role access control inspired by CryptoKitties
/// @author William Entriken (https://phor.net)
/// @dev Keep the CEO wallet stored offline, I warned you.
contract AccessControl {
    /// @notice The account that can only reassign executive accounts
    address public executiveOfficerAddress;

    /// @notice The account that can collect funds from this contract
    address public financialOfficerAddress;

    /// @notice The account with administrative control of this contract
    address public operatingOfficerAddress;

    constructor() internal {
        executiveOfficerAddress = msg.sender;
    }

    /// @dev Only allowed by executive officer
    modifier onlyExecutiveOfficer() {
        require(msg.sender == executiveOfficerAddress);
        _;
    }

    /// @dev Only allowed by financial officer
    modifier onlyFinancialOfficer() {
        require(msg.sender == financialOfficerAddress);
        _;
    }

    /// @dev Only allowed by operating officer
    modifier onlyOperatingOfficer() {
        require(msg.sender == operatingOfficerAddress);
        _;
    }

    /// @notice Reassign the executive officer role
    /// @param _executiveOfficerAddress new officer address
    function setExecutiveOfficer(address _executiveOfficerAddress)
        external
        onlyExecutiveOfficer
    {
        require(_executiveOfficerAddress != address(0));
        executiveOfficerAddress = _executiveOfficerAddress;
    }

    /// @notice Reassign the financial officer role
    /// @param _financialOfficerAddress new officer address
    function setFinancialOfficer(address _financialOfficerAddress)
        external
        onlyExecutiveOfficer
    {
        require(_financialOfficerAddress != address(0));
        financialOfficerAddress = _financialOfficerAddress;
    }

    /// @notice Reassign the operating officer role
    /// @param _operatingOfficerAddress new officer address
    function setOperatingOfficer(address _operatingOfficerAddress)
        external
        onlyExecutiveOfficer
    {
        require(_operatingOfficerAddress != address(0));
        operatingOfficerAddress = _operatingOfficerAddress;
    }

    /// @notice Collect funds from this contract
    function withdrawBalance() external onlyFinancialOfficer {
        financialOfficerAddress.transfer(address(this).balance);
    }
}

/* ERC165.sol *****************************************************************/

/// @title ERC-165 Standard Interface Detection
/// @dev Reference https://eips.ethereum.org/EIPS/eip-165
interface ERC165 {
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

/* ERC721.sol *****************************************************************/

/// @title ERC-721 Non-Fungible Token Standard
/// @dev Reference https://eips.ethereum.org/EIPS/eip-721
interface ERC721 /* 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) external view returns (uint256);
    function ownerOf(uint256 _tokenId) external view returns (address);
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
    function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
    function approve(address _approved, uint256 _tokenId) external payable;
    function setApprovalForAll(address _operator, bool _approved) external;
    function getApproved(uint256 _tokenId) external view returns (address);
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
}

/// @title ERC-721 Non-Fungible Token Standard
interface ERC721TokenReceiver {
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes _data) external returns(bytes4);
}

/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension
interface ERC721Metadata /* is ERC721 */ {
    function name() external pure returns (string _name);
    function symbol() external pure returns (string _symbol);
    function tokenURI(uint256 _tokenId) external view returns (string);
}

/// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
interface ERC721Enumerable /* is ERC721 */ {
    function totalSupply() external view returns (uint256);
    function tokenByIndex(uint256 _index) external view returns (uint256);
    function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);
}

/* SupportsInterface.sol ******************************************************/

/// @title A reusable contract to comply with ERC-165
/// @author William Entriken (https://phor.net)
contract SupportsInterface is ERC165 {
    /// @dev Every interface that we support, do not set 0xffffffff to true
    mapping(bytes4 => bool) internal supportedInterfaces;

    constructor() internal {
        supportedInterfaces[0x01ffc9a7] = true; // 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.
    /// @return `true` if the contract implements `interfaceID` and
    ///  `interfaceID` is not 0xffffffff, `false` otherwise
    function supportsInterface(bytes4 interfaceID) external view returns (bool) {
        return supportedInterfaces[interfaceID] && (interfaceID != 0xffffffff);
    }
}

/* SuNFT.sol ******************************************************************/

/// @title Compliance with ERC-721 for Su Squares
/// @dev This implementation assumes:
///  - A fixed supply of NFTs, cannot mint or burn
///  - ids are numbered sequentially starting at 1.
///  - NFTs are initially assigned to this contract
///  - This contract does not externally call its own functions
/// @author William Entriken (https://phor.net)
contract SuNFT is ERC165, ERC721, ERC721Metadata, ERC721Enumerable, SupportsInterface {
    /// @dev The authorized address for each NFT
    mapping (uint256 => address) internal tokenApprovals;

    /// @dev The authorized operators for each address
    mapping (address => mapping (address => bool)) internal operatorApprovals;

    /// @dev Guarantees msg.sender is the owner of _tokenId
    /// @param _tokenId The token to validate belongs to msg.sender
    modifier onlyOwnerOf(uint256 _tokenId) {
        address owner = _tokenOwnerWithSubstitutions[_tokenId];
        // assert(msg.sender != address(this))
        require(msg.sender == owner);
        _;
    }

    modifier mustBeOwnedByThisContract(uint256 _tokenId) {
        require(_tokenId >= 1 && _tokenId <= TOTAL_SUPPLY);
        address owner = _tokenOwnerWithSubstitutions[_tokenId];
        require(owner == address(0) || owner == address(this));
        _;
    }

    modifier canOperate(uint256 _tokenId) {
        // assert(msg.sender != address(this))
        address owner = _tokenOwnerWithSubstitutions[_tokenId];
        require(msg.sender == owner || operatorApprovals[owner][msg.sender]);
        _;
    }

    modifier canTransfer(uint256 _tokenId) {
        // assert(msg.sender != address(this))
        address owner = _tokenOwnerWithSubstitutions[_tokenId];
        require(msg.sender == owner ||
          msg.sender == tokenApprovals[_tokenId] ||
          operatorApprovals[owner][msg.sender]);
        _;
    }

    modifier mustBeValidToken(uint256 _tokenId) {
        require(_tokenId >= 1 && _tokenId <= TOTAL_SUPPLY);
        _;
    }

    /// @dev This emits when ownership of any NFT changes by any mechanism.
    ///  This event emits when NFTs are created (`from` == 0) and destroyed
    ///  (`to` == 0). Exception: during contract creation, any number of NFTs
    ///  may be created and assigned without emitting Transfer. At the time of
    ///  any transfer, the approved address for that NFT (if any) is reset to none.
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);

    /// @dev This emits when the approved address for an NFT is changed or
    ///  reaffirmed. The zero address indicates there is no approved address.
    ///  When a Transfer event emits, this also indicates that the approved
    ///  address for that NFT (if any) is reset to none.
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);

    /// @dev This emits when an operator is enabled or disabled for an owner.
    ///  The operator can manage all NFTs of the owner.
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    /// @notice Count all NFTs assigned to an owner
    /// @dev NFTs assigned to the zero address are considered invalid, and this
    ///  function throws for queries about the zero address.
    /// @param _owner An address for whom to query the balance
    /// @return The number of NFTs owned by `_owner`, possibly zero
    function balanceOf(address _owner) external view returns (uint256) {
        require(_owner != address(0));
        return _tokensOfOwnerWithSubstitutions[_owner].length;
    }

    /// @notice Find the owner of an NFT
    /// @dev NFTs assigned to zero address are considered invalid, and queries
    ///  about them do throw.
    /// @param _tokenId The identifier for an NFT
    /// @return The address of the owner of the NFT
    function ownerOf(uint256 _tokenId)
        external
        view
        mustBeValidToken(_tokenId)
        returns (address _owner)
    {
        _owner = _tokenOwnerWithSubstitutions[_tokenId];
        // Do owner address substitution
        if (_owner == address(0)) {
            _owner = address(this);
        }
    }

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT. When transfer is complete, this function
    ///  checks if `_to` is a smart contract (code size > 0). If so, it calls
    ///  `onERC721Received` on `_to` and throws if the return value is not
    ///  `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    /// @param data Additional data with no specified format, sent in call to `_to`
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable
    {
        _safeTransferFrom(_from, _to, _tokenId, data);
    }

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev This works identically to the other function with an extra data parameter,
    ///  except this function just sets data to "".
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable
    {
        _safeTransferFrom(_from, _to, _tokenId, "");
    }

    /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
    ///  TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE
    ///  THEY MAY BE PERMANENTLY LOST
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function transferFrom(address _from, address _to, uint256 _tokenId)
        external
        payable
        mustBeValidToken(_tokenId)
        canTransfer(_tokenId)
    {
        address owner = _tokenOwnerWithSubstitutions[_tokenId];
        // Do owner address substitution
        if (owner == address(0)) {
            owner = address(this);
        }
        require(owner == _from);
        require(_to != address(0));
        _transfer(_tokenId, _to);
    }

    /// @notice Change or reaffirm the approved address for an NFT
    /// @dev The zero address indicates there is no approved address.
    ///  Throws unless `msg.sender` is the current NFT owner, or an authorized
    ///  operator of the current owner.
    /// @param _approved The new approved NFT controller
    /// @param _tokenId The NFT to approve
    function approve(address _approved, uint256 _tokenId)
        external
        payable
        // assert(mustBeValidToken(_tokenId))
        canOperate(_tokenId)
    {
        address _owner = _tokenOwnerWithSubstitutions[_tokenId];
        // Do owner address substitution
        if (_owner == address(0)) {
            _owner = address(this);
        }
        tokenApprovals[_tokenId] = _approved;
        emit Approval(_owner, _approved, _tokenId);
    }

    /// @notice Enable or disable approval for a third party ("operator") to
    ///  manage all of `msg.sender`'s assets
    /// @dev Emits the ApprovalForAll event. The contract MUST allow
    ///  multiple operators per owner.
    /// @param _operator Address to add to the set of authorized operators
    /// @param _approved True if operator is approved, false to revoke approval
    function setApprovalForAll(address _operator, bool _approved) external {
        operatorApprovals[msg.sender][_operator] = _approved;
        emit ApprovalForAll(msg.sender, _operator, _approved);
    }

    /// @notice Get the approved address for a single NFT
    /// @dev Throws if `_tokenId` is not a valid NFT.
    /// @param _tokenId The NFT to find the approved address for
    /// @return The approved address for this NFT, or the zero address if there is none
    function getApproved(uint256 _tokenId)
        external
        view
        mustBeValidToken(_tokenId)
        returns (address)
    {
        return tokenApprovals[_tokenId];
    }

    /// @notice Query if an address is an authorized operator for another address
    /// @param _owner The address that owns the NFTs
    /// @param _operator The address that acts on behalf of the owner
    /// @return True if `_operator` is an approved operator for `_owner`, false otherwise
    function isApprovedForAll(address _owner, address _operator) external view returns (bool) {
        return operatorApprovals[_owner][_operator];
    }

    // COMPLIANCE WITH ERC721Metadata //////////////////////////////////////////

    /// @notice A descriptive name for a collection of NFTs in this contract
    function name() external pure returns (string) {
        return "Su Squares";
    }

    /// @notice An abbreviated name for NFTs in this contract
    function symbol() external pure returns (string) {
        return "SU";
    }

    /// @notice A distinct Uniform Resource Identifier (URI) for a given asset.
    /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC
    ///  3986. The URI may point to a JSON file that conforms to the "ERC721
    ///  Metadata JSON Schema".
    function tokenURI(uint256 _tokenId)
        external
        view
        mustBeValidToken(_tokenId)
        returns (string _tokenURI)
    {
        _tokenURI = "https://tenthousandsu.com/erc721/00000.json";
        bytes memory _tokenURIBytes = bytes(_tokenURI);
        _tokenURIBytes[33] = byte(48+(_tokenId / 10000) % 10);
        _tokenURIBytes[34] = byte(48+(_tokenId / 1000) % 10);
        _tokenURIBytes[35] = byte(48+(_tokenId / 100) % 10);
        _tokenURIBytes[36] = byte(48+(_tokenId / 10) % 10);
        _tokenURIBytes[37] = byte(48+(_tokenId / 1) % 10);

    }

    // COMPLIANCE WITH ERC721Enumerable ////////////////////////////////////////

    /// @notice Count NFTs tracked by this contract
    /// @return A count of valid NFTs tracked by this contract, where each one
    ///  has an assigned and queryable owner not equal to the zero address
    function totalSupply() external view returns (uint256) {
        return TOTAL_SUPPLY;
    }

    /// @notice Enumerate valid NFTs
    /// @dev Throws if `_index` >= `totalSupply()`.
    /// @param _index A counter less than `totalSupply()`
    /// @return The token identifier for the `_index`th NFT,
    ///  (sort order not specified)
    function tokenByIndex(uint256 _index) external view returns (uint256) {
        require(_index < TOTAL_SUPPLY);
        return _index + 1;
    }

    /// @notice Enumerate NFTs assigned to an owner
    /// @dev Throws if `_index` >= `balanceOf(_owner)` or if
    ///  `_owner` is the zero address, representing invalid NFTs.
    /// @param _owner An address where we are interested in NFTs owned by them
    /// @param _index A counter less than `balanceOf(_owner)`
    /// @return The token identifier for the `_index`th NFT assigned to `_owner`,
    ///   (sort order not specified)
    function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256 _tokenId) {
        require(_owner != address(0));
        require(_index < _tokensOfOwnerWithSubstitutions[_owner].length);
        _tokenId = _tokensOfOwnerWithSubstitutions[_owner][_index];
        // Handle substitutions
        if (_owner == address(this)) {
            if (_tokenId == 0) {
                _tokenId = _index + 1;
            }
        }
    }

    // INTERNAL INTERFACE //////////////////////////////////////////////////////

    /// @dev Actually do a transfer, does NO precondition checking
    function _transfer(uint256 _tokenId, address _to) internal {
        // Here are the preconditions we are not checking:
        // assert(canTransfer(_tokenId))
        // assert(mustBeValidToken(_tokenId))
        require(_to != address(0));

        // Find the FROM address
        address from = _tokenOwnerWithSubstitutions[_tokenId];
        // Do owner address substitution
        if (from == address(0)) {
            from = address(this);
        }

        // Take away from the FROM address
        // The Entriken algorithm for deleting from an indexed, unsorted array
        uint256 indexToDelete = _ownedTokensIndexWithSubstitutions[_tokenId];
        // Do owned tokens substitution
        if (indexToDelete == 0) {
            indexToDelete = _tokenId - 1;
        } else {
            indexToDelete = indexToDelete - 1;
        }
        // We can only shrink an array from its end. If the item we want to
        // delete is in the middle then copy last item to middle and shrink
        // the end.
        if (indexToDelete != _tokensOfOwnerWithSubstitutions[from].length - 1) {
            uint256 lastNft = _tokensOfOwnerWithSubstitutions[from][_tokensOfOwnerWithSubstitutions[from].length - 1];
            // Do tokens of owner substitution
            if (lastNft == 0) {
                // assert(from ==  address(0) || from == address(this));
                lastNft = _tokensOfOwnerWithSubstitutions[from].length; // - 1 + 1
            }
            _tokensOfOwnerWithSubstitutions[from][indexToDelete] = lastNft;
            _ownedTokensIndexWithSubstitutions[lastNft] = indexToDelete + 1;
        }
        // Next line also deletes the contents at the last position of the array (gas refund)
        _tokensOfOwnerWithSubstitutions[from].length--;
        // Right now _ownedTokensIndexWithSubstitutions[_tokenId] is invalid, set it below based on the new owner

        // Give to the TO address
        _tokensOfOwnerWithSubstitutions[_to].push(_tokenId);
        _ownedTokensIndexWithSubstitutions[_tokenId] = (_tokensOfOwnerWithSubstitutions[_to].length - 1) + 1;

        // External processing
        _tokenOwnerWithSubstitutions[_tokenId] = _to;
        tokenApprovals[_tokenId] = address(0);
        emit Transfer(from, _to, _tokenId);
    }

    // PRIVATE STORAGE AND FUNCTIONS ///////////////////////////////////////////

    // See Solidity issue #3356, it would be clearer to initialize in SuMain
    uint256 private constant TOTAL_SUPPLY = 10000;

    bytes4 private constant ERC721_RECEIVED = bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"));

    /// @dev The owner of each NFT
    ///  If value == address(0), NFT is owned by address(this)
    ///  If value != address(0), NFT is owned by value
    ///  assert(This contract never assigns ownership to address(0) or destroys NFTs)
    ///  See commented out code in constructor, saves hella gas
    ///  In other words address(0) in storage means address(this) outside
    mapping (uint256 => address) private _tokenOwnerWithSubstitutions;

    /// @dev The list of NFTs owned by each address
    ///  Nomenclature: arr[key][index] = value
    ///  If key != address(this) or value != 0, then value represents an NFT
    ///  If key == address(this) and value == 0, then index + 1 is the NFT
    ///  assert(0 is not a valid NFT)
    ///  See commented out code in constructor, saves hella gas
    ///  In other words [0, 0, a, 0] is equivalent to [1, 2, a, 4] for address(this)
    mapping (address => uint256[]) private _tokensOfOwnerWithSubstitutions;

    /// @dev (Location + 1) of each NFT in its owner's list
    ///  Nomenclature: arr[nftId] = value
    ///  If value != 0, _tokensOfOwnerWithSubstitutions[owner][value - 1] = nftId
    ///  If value == 0, _tokensOfOwnerWithSubstitutions[owner][nftId - 1] = nftId
    ///  assert(2**256-1 is not a valid NFT)
    ///  See commented out code in constructor, saves hella gas
    ///  In other words mapping {a=>a} is equivalent to {a=>0}
    mapping (uint256 => uint256) private _ownedTokensIndexWithSubstitutions;

    // Due to implementation choices (no mint, no burn, contiguous NFT ids), it
    // is not necessary to keep an array of NFT ids nor where each NFT id is
    // located in that array.
    // address[] private nftIds;
    // mapping (uint256 => uint256) private nftIndexOfId;

    constructor() internal {
        // Publish interfaces with ERC-165
        supportedInterfaces[0x80ac58cd] = true; // ERC721
        supportedInterfaces[0x5b5e139f] = true; // ERC721Metadata
        supportedInterfaces[0x780e9d63] = true; // ERC721Enumerable
        supportedInterfaces[0x8153916a] = true; // ERC721 + 165 (not needed)

        // The effect of substitution makes storing address(this), address(this)
        // ..., address(this) for a total of TOTAL_SUPPLY times unnecessary at
        // deployment time
        // for (uint256 i = 1; i <= TOTAL_SUPPLY; i++) {
        //     _tokenOwnerWithSubstitutions[i] = address(this);
        // }

        // The effect of substitution makes storing 1, 2, ..., TOTAL_SUPPLY
        // unnecessary at deployment time
        _tokensOfOwnerWithSubstitutions[address(this)].length = TOTAL_SUPPLY;
        // for (uint256 i = 0; i < TOTAL_SUPPLY; i++) {
        //     _tokensOfOwnerWithSubstitutions[address(this)][i] = i + 1;
        // }
        // for (uint256 i = 1; i <= TOTAL_SUPPLY; i++) {
        //     _ownedTokensIndexWithSubstitutions[i] = i - 1;
        // }
    }

    /// @dev Actually perform the safeTransferFrom
    function _safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data)
        private
        mustBeValidToken(_tokenId)
        canTransfer(_tokenId)
    {
        address owner = _tokenOwnerWithSubstitutions[_tokenId];
        // Do owner address substitution
        if (owner == address(0)) {
            owner = address(this);
        }
        require(owner == _from);
        require(_to != address(0));
        _transfer(_tokenId, _to);

        // Do the callback after everything is done to avoid reentrancy attack
        uint256 codeSize;
        assembly { codeSize := extcodesize(_to) }
        if (codeSize == 0) {
            return;
        }
        bytes4 retval = ERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, data);
        require(retval == ERC721_RECEIVED);
    }
}

/* SuOperation.sol ************************************************************/

/// @title The features that square owners can use
/// @author William Entriken (https://phor.net)
contract SuOperation is SuNFT {
    /// @dev The personalization of a square has changed
    event Personalized(uint256 _nftId);

    /// @dev The main SuSquare struct. The owner may set these properties,
    ///  subject to certain rules. The actual 10x10 image is rendered on our
    ///  website using this data.
    struct SuSquare {
        /// @dev This increments on each update
        uint256 version;

        /// @dev A 10x10 pixel image, stored 8-bit RGB values from left-to-right
        ///  and top-to-bottom order (normal English reading order). So it is
        ///  exactly 300 bytes. Or it is an empty array.
        ///  So the first byte is the red channel for the top-left pixel, then
        ///  the blue, then the green, and then next is the red channel for the
        ///  pixel to the right of the first pixel.
        bytes rgbData;

        /// @dev The title of this square, at most 64 bytes,
        string title;

        /// @dev The URL of this square, at most 100 bytes, or empty string
        string href;
    }

    /// @notice All the Su Squares that ever exist or will exist. Each Su Square
    ///  represents a square on our webpage in a 100x100 grid. The squares are
    ///  arranged in left-to-right, top-to-bottom order. In other words, normal
    ///  English reading order. So suSquares[1] is the top-left location and
    ///  suSquares[100] is the top-right location. And suSquares[101] is
    ///  directly below suSquares[1].
    /// @dev There is no suSquares[0] -- that is an unused array index.
    SuSquare[10001] public suSquares;

    /// @notice Update the contents of your square, the first 3 personalizations
    ///  for a square are free then cost 10 Finney (0.01 Ether) each
    /// @param _squareId The top-left is 1, to its right is 2, ..., top-right is
    ///  100 and then 101 is below 1... the last one at bottom-right is 10000
    /// @param _squareId A 10x10 image for your square, in 8-bit RGB words
    ///  ordered like the squares are ordered. See Imagemagick's command
    ///  convert -size 10x10 -depth 8 in.rgb out.png
    /// @param _title A description of your square (max 64 bytes UTF-8)
    /// @param _href A hyperlink for your square (max 96 bytes)
    function personalizeSquare(
        uint256 _squareId,
        bytes _rgbData,
        string _title,
        string _href
    )
        external
        onlyOwnerOf(_squareId)
        payable
    {
        require(bytes(_title).length <= 64);
        require(bytes(_href).length <= 96);
        require(_rgbData.length == 300);
        suSquares[_squareId].version++;
        suSquares[_squareId].rgbData = _rgbData;
        suSquares[_squareId].title = _title;
        suSquares[_squareId].href = _href;
        if (suSquares[_squareId].version > 3) {
            require(msg.value == 10 finney);
        }
        emit Personalized(_squareId);
    }
}

/* SuPromo.sol ****************************************************************/

/// @title A limited pre-sale and promotional giveaway
/// @author William Entriken (https://phor.net)
contract SuPromo is AccessControl, SuNFT {
    uint256 constant PROMO_CREATION_LIMIT = 5000;

    /// @notice How many promo squares were granted
    uint256 public promoCreatedCount;

    /// @notice BEWARE, this does not use a safe transfer mechanism!
    ///  You must manually check the receiver can accept NFTs
    function grantToken(uint256 _tokenId, address _newOwner)
        external
        onlyOperatingOfficer
        mustBeValidToken(_tokenId)
        mustBeOwnedByThisContract(_tokenId)
    {
        require(promoCreatedCount < PROMO_CREATION_LIMIT);
        promoCreatedCount++;
        _transfer(_tokenId, _newOwner);
    }
}

/* SuVending.sol **************************************************************/

/// @title A token vending machine
/// @author William Entriken (https://phor.net)
contract SuVending is SuNFT {
    uint256 constant SALE_PRICE = 500 finney; // 0.5 Ether

    /// @notice The price is always 0.5 Ether, and you can buy any available square
    ///  Be sure you are calling this from a regular account (not a smart contract)
    ///  or if you are calling from a smart contract, make sure it can use
    ///  ERC-721 non-fungible tokens
    function purchase(uint256 _nftId)
        external
        payable
        mustBeValidToken(_nftId)
        mustBeOwnedByThisContract(_nftId)
    {
        require(msg.value == SALE_PRICE);
        _transfer(_nftId, msg.sender);
    }
}

/* SuMain.sol *****************************************************************/

/// @title The features that deed owners can use
/// @author William Entriken (https://phor.net)
contract SuMain is AccessControl, SuNFT, SuOperation, SuVending, SuPromo {
    constructor() public {
    }
}

    Contract ABI  
[{"constant":true,"inputs":[],"name":"executiveOfficerAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"promoCreatedCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","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":"_approved","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_newOwner","type":"address"}],"name":"grantToken","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":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_operatingOfficerAddress","type":"address"}],"name":"setOperatingOfficer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"_tokenId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":true,"stateMutability":"payable","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":"withdrawBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"_owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"operatingOfficerAddress","outputs":[{"name":"","type":"address"}],"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":"_squareId","type":"uint256"},{"name":"_rgbData","type":"bytes"},{"name":"_title","type":"string"},{"name":"_href","type":"string"}],"name":"personalizeSquare","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"financialOfficerAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","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":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"_tokenURI","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_financialOfficerAddress","type":"address"}],"name":"setFinancialOfficer","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":"_executiveOfficerAddress","type":"address"}],"name":"setExecutiveOfficer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_nftId","type":"uint256"}],"name":"purchase","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"suSquares","outputs":[{"name":"version","type":"uint256"},{"name":"rgbData","type":"bytes"},{"name":"title","type":"string"},{"name":"href","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_nftId","type":"uint256"}],"name":"Personalized","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 Switch To Opcodes View
60806040523480156200001157600080fd5b5060008054600160a060020a031916331781557f28b0ef64f7e82d3b26f3fd404bd0151552f792965f39c29ae82c0a78df67af9c805460ff1990811660019081179092557f41a75b24256f422320613da5706c374a0a7eea8e8d418281bda8820c6b34435680548216831790557fcca39824a677cee72cd3539fc56c0e5a676a28b60617ea00a9d38305722c8b6480548216831790557f785e4d925c4778965a1107f0c202069d496d641ab5dd08a13bd2b783950e105f80548216831790557fd81be3d5a8393f58461506a14b229ceec96395fa3c1be4c1e06a2e23a28bd07180549091169091179055308152600760205260409020612710906200011790826200011e565b506200016e565b8154818355818111156200014557600083815260209020620001459181019083016200014a565b505050565b6200016b91905b8082111562000167576000815560010162000151565b5090565b90565b6118ad806200017e6000396000f3006080604052600436106101685763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166215be71811461016d57806301ffc9a71461019e57806305e45546146101d457806306fdde03146101fb578063081812fc14610285578063095ea7b31461029d578063133252a6146102b657806318160ddd146102da57806323b872dd146102ef5780632aad292e1461030c5780632f745c591461032d57806342842e0e146103515780634f6ccce71461036e5780635fd8c710146103865780636352211e1461039b5780636bfa5edc146103b357806370a08231146103c857806376f14c98146103e957806395d89b4114610418578063a22cb4651461042d578063abe088a714610453578063b88d4fde14610468578063c87b56dd14610494578063d978a0d3146104ac578063e985e9c5146104cd578063ec13df6b146104f4578063efef39a114610515578063ffa6ab4414610520575b600080fd5b34801561017957600080fd5b50610182610683565b60408051600160a060020a039092168252519081900360200190f35b3480156101aa57600080fd5b506101c0600160e060020a031960043516610692565b604080519115158252519081900360200190f35b3480156101e057600080fd5b506101e96106cb565b60408051918252519081900360200190f35b34801561020757600080fd5b506102106106d2565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561024a578181015183820152602001610232565b50505050905090810190601f1680156102775780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561029157600080fd5b5061018260043561070a565b6102b4600160a060020a036004351660243561074c565b005b3480156102c257600080fd5b506102b4600435600160a060020a0360243516610832565b3480156102e657600080fd5b506101e96108ee565b6102b4600160a060020a03600435811690602435166044356108f4565b34801561031857600080fd5b506102b4600160a060020a03600435166109f1565b34801561033957600080fd5b506101e9600160a060020a0360043516602435610a4c565b6102b4600160a060020a0360043581169060243516604435610ae2565b34801561037a57600080fd5b506101e9600435610b03565b34801561039257600080fd5b506102b4610b1a565b3480156103a757600080fd5b50610182600435610b6e565b3480156103bf57600080fd5b50610182610bb8565b3480156103d457600080fd5b506101e9600160a060020a0360043516610bc7565b6102b4600480359060248035808201929081013591604435808201929081013591606435908101910135610bfa565b34801561042457600080fd5b50610210610d3e565b34801561043957600080fd5b506102b4600160a060020a03600435166024351515610d75565b34801561045f57600080fd5b50610182610de3565b6102b4600160a060020a0360048035821691602480359091169160443591606435908101910135610df2565b3480156104a057600080fd5b50610210600435610e2e565b3480156104b857600080fd5b506102b4600160a060020a0360043516610fcf565b3480156104d957600080fd5b506101c0600160a060020a036004358116906024351661102a565b34801561050057600080fd5b506102b4600160a060020a0360043516611058565b6102b46004356110b3565b34801561052c57600080fd5b50610538600435611150565b60405180858152602001806020018060200180602001848103845287818151815260200191508051906020019080838360005b8381101561058357818101518382015260200161056b565b50505050905090810190601f1680156105b05780820380516001836020036101000a031916815260200191505b50848103835286518152865160209182019188019080838360005b838110156105e35781810151838201526020016105cb565b50505050905090810190601f1680156106105780820380516001836020036101000a031916815260200191505b50848103825285518152855160209182019187019080838360005b8381101561064357818101518382015260200161062b565b50505050905090810190601f1680156106705780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b600054600160a060020a031681565b600160e060020a0319811660009081526003602052604081205460ff1680156106c55750600160e060020a031980831614155b92915050565b619c4d5481565b60408051808201909152600a81527f537520537175617265730000000000000000000000000000000000000000000060208201525b90565b6000816001811015801561072057506127108111155b151561072b57600080fd5b600083815260046020526040902054600160a060020a031691505b50919050565b6000818152600660205260408120548290600160a060020a0316338114806107975750600160a060020a038116600090815260056020908152604080832033845290915290205460ff165b15156107a257600080fd5b600084815260066020526040902054600160a060020a031692508215156107c7573092505b600084815260046020526040808220805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0389811691821790925591518793918716917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a45050505050565b600254600160a060020a0316331461084957600080fd5b816001811015801561085d57506127108111155b151561086857600080fd5b8260006001821015801561087e57506127108211155b151561088957600080fd5b50600081815260066020526040902054600160a060020a03168015806108b75750600160a060020a03811630145b15156108c257600080fd5b619c4d54611388116108d357600080fd5b619c4d805460010190556108e7858561131d565b5050505050565b61271090565b6000816001811015801561090a57506127108111155b151561091557600080fd5b6000838152600660205260409020548390600160a060020a0316338114806109535750600082815260046020526040902054600160a060020a031633145b806109815750600160a060020a038116600090815260056020908152604080832033845290915290205460ff165b151561098c57600080fd5b600085815260066020526040902054600160a060020a031693508315156109b1573093505b600160a060020a03848116908816146109c957600080fd5b600160a060020a03861615156109de57600080fd5b6109e8858761131d565b50505050505050565b600054600160a060020a03163314610a0857600080fd5b600160a060020a0381161515610a1d57600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6000600160a060020a0383161515610a6357600080fd5b600160a060020a0383166000908152600760205260409020548210610a8757600080fd5b600160a060020a0383166000908152600760205260409020805483908110610aab57fe5b9060005260206000200154905030600160a060020a031683600160a060020a031614156106c5578015156106c55750600101919050565b610afe8383836020604051908101604052806000815250611517565b505050565b60006127108210610b1357600080fd5b5060010190565b600154600160a060020a03163314610b3157600080fd5b600154604051600160a060020a0390911690303180156108fc02916000818181858888f19350505050158015610b6b573d6000803e3d6000fd5b50565b60008160018110158015610b8457506127108111155b1515610b8f57600080fd5b600083815260066020526040902054600160a060020a0316915081151561074657503092915050565b600254600160a060020a031681565b6000600160a060020a0382161515610bde57600080fd5b50600160a060020a031660009081526007602052604090205490565b6000878152600660205260409020548790600160a060020a0316338114610c2057600080fd5b6040851115610c2e57600080fd5b6060831115610c3c57600080fd5b61012c8714610c4a57600080fd5b6009896127118110610c5857fe5b6004020180546001019055878760098b6127118110610c7357fe5b600402016001019190610c879291906117c9565b50858560098b6127118110610c9857fe5b600402016002019190610cac9291906117c9565b50838360098b6127118110610cbd57fe5b600402016003019190610cd19291906117c9565b50600360098a6127118110610ce257fe5b60040201541115610d0057662386f26fc100003414610d0057600080fd5b604080518a815290517f95820ed330d949e85d003e7c553aa060e3cdffc1f8af4eb8c9cf988dca7878329181900360200190a1505050505050505050565b60408051808201909152600281527f5355000000000000000000000000000000000000000000000000000000000000602082015290565b336000818152600560209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b600154600160a060020a031681565b6108e785858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843750611517945050505050565b6060808260018110158015610e4557506127108111155b1515610e5057600080fd5b60408051606081018252602b81527f68747470733a2f2f74656e74686f7573616e6473752e636f6d2f65726337323160208201527f2f30303030302e6a736f6e0000000000000000000000000000000000000000009181019190915292508291507fff00000000000000000000000000000000000000000000000000000000000000600a61271086040660300160f860020a0216600081901a604184015350600a6103e885040660300160f860020a02826022815181101515610f0f57fe5b906020010190600160f860020a031916908160001a905350600a606485040660300160f860020a02826023815181101515610f4657fe5b906020010190600160f860020a031916908160001a905350600a8085040660300160f860020a02826024815181101515610f7c57fe5b906020010190600160f860020a031916908160001a905350600a840660300160f860020a02826025815181101515610fb057fe5b906020010190600160f860020a031916908160001a9053505050919050565b600054600160a060020a03163314610fe657600080fd5b600160a060020a0381161515610ffb57600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600160a060020a03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600054600160a060020a0316331461106f57600080fd5b600160a060020a038116151561108457600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b80600181101580156110c757506127108111155b15156110d257600080fd5b816000600182101580156110e857506127108211155b15156110f357600080fd5b50600081815260066020526040902054600160a060020a03168015806111215750600160a060020a03811630145b151561112c57600080fd5b346706f05b59d3b200001461114057600080fd5b61114a843361131d565b50505050565b600981612711811061115e57fe5b60040201805460018083018054604080516020600295841615610100026000190190931694909404601f8101839004830285018301909152808452939550919290918301828280156111f15780601f106111c6576101008083540402835291602001916111f1565b820191906000526020600020905b8154815290600101906020018083116111d457829003601f168201915b50505060028085018054604080516020601f60001961010060018716150201909416959095049283018590048502810185019091528181529596959450909250908301828280156112835780601f1061125857610100808354040283529160200191611283565b820191906000526020600020905b81548152906001019060200180831161126657829003601f168201915b5050505060038301805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529495949350908301828280156113135780601f106112e857610100808354040283529160200191611313565b820191906000526020600020905b8154815290600101906020018083116112f657829003601f168201915b5050505050905084565b60008080600160a060020a038416151561133657600080fd5b600085815260066020526040902054600160a060020a0316925082151561135b573092505b600085815260086020526040902054915081151561137e57600185039150611385565b6001820391505b600160a060020a03831660009081526007602052604090205460001901821461144c57600160a060020a0383166000908152600760205260409020805460001981019081106113d057fe5b9060005260206000200154905080600014156114015750600160a060020a0382166000908152600760205260409020545b600160a060020a038316600090815260076020526040902080548291908490811061142857fe5b60009182526020808320909101929092558281526008909152604090206001830190555b600160a060020a0383166000908152600760205260409020805490611475906000198301611847565b50600160a060020a0380851660008181526007602090815260408083208054600181018255818552838520018b9055548a8452600883528184205560068252808320805473ffffffffffffffffffffffffffffffffffffffff199081168617909155600490925280832080549092169091555188938716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a45050505050565b6000806000846001811015801561153057506127108111155b151561153b57600080fd5b6000868152600660205260409020548690600160a060020a0316338114806115795750600082815260046020526040902054600160a060020a031633145b806115a75750600160a060020a038116600090815260056020908152604080832033845290915290205460ff165b15156115b257600080fd5b600088815260066020526040902054600160a060020a031695508515156115d7573095505b600160a060020a03868116908b16146115ef57600080fd5b600160a060020a038916151561160457600080fd5b61160e888a61131d565b883b945084151561161e576117bd565b88600160a060020a031663150b7a02338c8b8b6040518563ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018085600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156116cf5781810151838201526020016116b7565b50505050905090810190601f1680156116fc5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561171e57600080fd5b505af1158015611732573d6000803e3d6000fd5b505050506040513d602081101561174857600080fd5b5051604080517f6f6e455243373231526563656976656428616464726573732c6164647265737381527f2c75696e743235362c62797465732900000000000000000000000000000000006020820152905190819003602f019020909450600160e060020a03198086169116146117bd57600080fd5b50505050505050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061180a5782800160ff19823516178555611837565b82800160010185558215611837579182015b8281111561183757823582559160200191906001019061181c565b50611843929150611867565b5090565b815481835581811115610afe57600083815260209020610afe9181019083015b61070791905b80821115611843576000815560010161186d5600a165627a7a72305820442b258250332058a1160f306a40a73245a4d60c6b0bdf7744ce14acc00a2cac0029

   Swarm Source:
bzzr://442b258250332058a1160f306a40a73245a4d60c6b0bdf7744ce14acc00a2cac

 

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.