ETH Price: $3,249.59 (+3.73%)
 

Overview

ETH Balance

37.07 ETH

Eth Value

$120,462.32 (@ $3,249.59/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Approval For...217343832025-01-30 2:31:5919 hrs ago1738204319IN
Su Squares: SU Token
0 ETH0.000087451.88754855
Set Approval For...215753252025-01-07 21:37:1123 days ago1736285831IN
Su Squares: SU Token
0 ETH0.0005935812.81552456
Set Approval For...215548162025-01-05 0:51:5925 days ago1736038319IN
Su Squares: SU Token
0 ETH0.000283846.12822955
Set Approval For...215514102025-01-04 13:27:5926 days ago1735997279IN
Su Squares: SU Token
0 ETH0.001066923.03433677
Set Approval For...214239502024-12-17 18:08:5944 days ago1734458939IN
Su Squares: SU Token
0 ETH0.0012313226.58426188
Set Approval For...212356922024-11-21 11:05:3570 days ago1732187135IN
Su Squares: SU Token
0 ETH0.0005351211.55331184
Set Approval For...210541652024-10-27 3:06:1195 days ago1729998371IN
Su Squares: SU Token
0 ETH0.000174223.76154579
Personalize Squa...210253402024-10-23 2:37:3599 days ago1729651055IN
Su Squares: SU Token
0 ETH0.000557176.88858719
Personalize Squa...209896282024-10-18 3:01:23104 days ago1729220483IN
Su Squares: SU Token
0 ETH0.0028270928.26584156
Set Approval For...208896502024-10-04 4:05:23118 days ago1728014723IN
Su Squares: SU Token
0 ETH0.000158733.42711511
Set Approval For...208896492024-10-04 4:05:11118 days ago1728014711IN
Su Squares: SU Token
0 ETH0.00016253.50214726
Set Approval For...208798952024-10-02 19:26:23120 days ago1727897183IN
Su Squares: SU Token
0 ETH0.0017694338.20190763
Safe Transfer Fr...207632882024-09-16 12:50:35136 days ago1726491035IN
Su Squares: SU Token
0 ETH0.000542116.46376749
Set Approval For...205074052024-08-11 19:17:35172 days ago1723403855IN
Su Squares: SU Token
0 ETH0.000231424.99651886
Safe Transfer Fr...204232482024-07-31 1:27:59183 days ago1722389279IN
Su Squares: SU Token
0 ETH0.000602957.19015038
Set Approval For...203990202024-07-27 16:16:11187 days ago1722096971IN
Su Squares: SU Token
0 ETH0.000359787.76774913
Set Approval For...203393302024-07-19 8:18:11195 days ago1721377091IN
Su Squares: SU Token
0 ETH0.000339387.32720183
Set Approval For...203373382024-07-19 1:37:59195 days ago1721353079IN
Su Squares: SU Token
0 ETH0.000422319.11769933
Set Approval For...203299542024-07-18 0:53:11196 days ago1721263991IN
Su Squares: SU Token
0 ETH0.000259885.61084775
Set Approval For...202829802024-07-11 11:31:23203 days ago1720697483IN
Su Squares: SU Token
0 ETH0.000111614.57322339
Set Approval For...202319782024-07-04 8:32:47210 days ago1720081967IN
Su Squares: SU Token
0 ETH0.000301316.49366606
Transfer From201618302024-06-24 13:26:35220 days ago1719235595IN
Su Squares: SU Token
0 ETH0.000558076.8895013
Safe Transfer Fr...201560722024-06-23 18:06:47221 days ago1719166007IN
Su Squares: SU Token
0 ETH0.00027552.47655537
Set Approval For...197234532024-04-24 6:28:23281 days ago1713940103IN
Su Squares: SU Token
0 ETH0.000215138.78473688
Set Approval For...196161052024-04-09 5:48:11296 days ago1712641691IN
Su Squares: SU Token
0 ETH0.0009788721.12276176
View all transactions

Latest 5 internal transactions

Advanced mode:
Parent Transaction Hash Block
From
To
131618282021-09-04 22:07:121244 days ago1630793232
Su Squares: SU Token
15.25 ETH
131218782021-08-29 18:04:201250 days ago1630260260
Su Squares: SU Token
1 ETH
131172822021-08-29 0:56:361250 days ago1630198596
Su Squares: SU Token
6 ETH
131047292021-08-27 2:11:381252 days ago1630030298
Su Squares: SU Token
8.5 ETH
72931422019-03-02 23:36:492160 days ago1551569809
Su Squares: SU Token
1 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SuMain

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-11-05
*/

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 Security Audit

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"}]

60806040523480156200001157600080fd5b5060008054600160a060020a031916331781557f28b0ef64f7e82d3b26f3fd404bd0151552f792965f39c29ae82c0a78df67af9c805460ff1990811660019081179092557f41a75b24256f422320613da5706c374a0a7eea8e8d418281bda8820c6b34435680548216831790557fcca39824a677cee72cd3539fc56c0e5a676a28b60617ea00a9d38305722c8b6480548216831790557f785e4d925c4778965a1107f0c202069d496d641ab5dd08a13bd2b783950e105f80548216831790557fd81be3d5a8393f58461506a14b229ceec96395fa3c1be4c1e06a2e23a28bd07180549091169091179055308152600760205260409020612710906200011790826200011e565b506200016e565b8154818355818111156200014557600083815260209020620001459181019083016200014a565b505050565b6200016b91905b8082111562000167576000815560010162000151565b5090565b90565b6118ad806200017e6000396000f3006080604052600436106101685763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166215be71811461016d57806301ffc9a71461019e57806305e45546146101d457806306fdde03146101fb578063081812fc14610285578063095ea7b31461029d578063133252a6146102b657806318160ddd146102da57806323b872dd146102ef5780632aad292e1461030c5780632f745c591461032d57806342842e0e146103515780634f6ccce71461036e5780635fd8c710146103865780636352211e1461039b5780636bfa5edc146103b357806370a08231146103c857806376f14c98146103e957806395d89b4114610418578063a22cb4651461042d578063abe088a714610453578063b88d4fde14610468578063c87b56dd14610494578063d978a0d3146104ac578063e985e9c5146104cd578063ec13df6b146104f4578063efef39a114610515578063ffa6ab4414610520575b600080fd5b34801561017957600080fd5b50610182610683565b60408051600160a060020a039092168252519081900360200190f35b3480156101aa57600080fd5b506101c0600160e060020a031960043516610692565b604080519115158252519081900360200190f35b3480156101e057600080fd5b506101e96106cb565b60408051918252519081900360200190f35b34801561020757600080fd5b506102106106d2565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561024a578181015183820152602001610232565b50505050905090810190601f1680156102775780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561029157600080fd5b5061018260043561070a565b6102b4600160a060020a036004351660243561074c565b005b3480156102c257600080fd5b506102b4600435600160a060020a0360243516610832565b3480156102e657600080fd5b506101e96108ee565b6102b4600160a060020a03600435811690602435166044356108f4565b34801561031857600080fd5b506102b4600160a060020a03600435166109f1565b34801561033957600080fd5b506101e9600160a060020a0360043516602435610a4c565b6102b4600160a060020a0360043581169060243516604435610ae2565b34801561037a57600080fd5b506101e9600435610b03565b34801561039257600080fd5b506102b4610b1a565b3480156103a757600080fd5b50610182600435610b6e565b3480156103bf57600080fd5b50610182610bb8565b3480156103d457600080fd5b506101e9600160a060020a0360043516610bc7565b6102b4600480359060248035808201929081013591604435808201929081013591606435908101910135610bfa565b34801561042457600080fd5b50610210610d3e565b34801561043957600080fd5b506102b4600160a060020a03600435166024351515610d75565b34801561045f57600080fd5b50610182610de3565b6102b4600160a060020a0360048035821691602480359091169160443591606435908101910135610df2565b3480156104a057600080fd5b50610210600435610e2e565b3480156104b857600080fd5b506102b4600160a060020a0360043516610fcf565b3480156104d957600080fd5b506101c0600160a060020a036004358116906024351661102a565b34801561050057600080fd5b506102b4600160a060020a0360043516611058565b6102b46004356110b3565b34801561052c57600080fd5b50610538600435611150565b60405180858152602001806020018060200180602001848103845287818151815260200191508051906020019080838360005b8381101561058357818101518382015260200161056b565b50505050905090810190601f1680156105b05780820380516001836020036101000a031916815260200191505b50848103835286518152865160209182019188019080838360005b838110156105e35781810151838201526020016105cb565b50505050905090810190601f1680156106105780820380516001836020036101000a031916815260200191505b50848103825285518152855160209182019187019080838360005b8381101561064357818101518382015260200161062b565b50505050905090810190601f1680156106705780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b600054600160a060020a031681565b600160e060020a0319811660009081526003602052604081205460ff1680156106c55750600160e060020a031980831614155b92915050565b619c4d5481565b60408051808201909152600a81527f537520537175617265730000000000000000000000000000000000000000000060208201525b90565b6000816001811015801561072057506127108111155b151561072b57600080fd5b600083815260046020526040902054600160a060020a031691505b50919050565b6000818152600660205260408120548290600160a060020a0316338114806107975750600160a060020a038116600090815260056020908152604080832033845290915290205460ff165b15156107a257600080fd5b600084815260066020526040902054600160a060020a031692508215156107c7573092505b600084815260046020526040808220805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0389811691821790925591518793918716917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a45050505050565b600254600160a060020a0316331461084957600080fd5b816001811015801561085d57506127108111155b151561086857600080fd5b8260006001821015801561087e57506127108211155b151561088957600080fd5b50600081815260066020526040902054600160a060020a03168015806108b75750600160a060020a03811630145b15156108c257600080fd5b619c4d54611388116108d357600080fd5b619c4d805460010190556108e7858561131d565b5050505050565b61271090565b6000816001811015801561090a57506127108111155b151561091557600080fd5b6000838152600660205260409020548390600160a060020a0316338114806109535750600082815260046020526040902054600160a060020a031633145b806109815750600160a060020a038116600090815260056020908152604080832033845290915290205460ff165b151561098c57600080fd5b600085815260066020526040902054600160a060020a031693508315156109b1573093505b600160a060020a03848116908816146109c957600080fd5b600160a060020a03861615156109de57600080fd5b6109e8858761131d565b50505050505050565b600054600160a060020a03163314610a0857600080fd5b600160a060020a0381161515610a1d57600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6000600160a060020a0383161515610a6357600080fd5b600160a060020a0383166000908152600760205260409020548210610a8757600080fd5b600160a060020a0383166000908152600760205260409020805483908110610aab57fe5b9060005260206000200154905030600160a060020a031683600160a060020a031614156106c5578015156106c55750600101919050565b610afe8383836020604051908101604052806000815250611517565b505050565b60006127108210610b1357600080fd5b5060010190565b600154600160a060020a03163314610b3157600080fd5b600154604051600160a060020a0390911690303180156108fc02916000818181858888f19350505050158015610b6b573d6000803e3d6000fd5b50565b60008160018110158015610b8457506127108111155b1515610b8f57600080fd5b600083815260066020526040902054600160a060020a0316915081151561074657503092915050565b600254600160a060020a031681565b6000600160a060020a0382161515610bde57600080fd5b50600160a060020a031660009081526007602052604090205490565b6000878152600660205260409020548790600160a060020a0316338114610c2057600080fd5b6040851115610c2e57600080fd5b6060831115610c3c57600080fd5b61012c8714610c4a57600080fd5b6009896127118110610c5857fe5b6004020180546001019055878760098b6127118110610c7357fe5b600402016001019190610c879291906117c9565b50858560098b6127118110610c9857fe5b600402016002019190610cac9291906117c9565b50838360098b6127118110610cbd57fe5b600402016003019190610cd19291906117c9565b50600360098a6127118110610ce257fe5b60040201541115610d0057662386f26fc100003414610d0057600080fd5b604080518a815290517f95820ed330d949e85d003e7c553aa060e3cdffc1f8af4eb8c9cf988dca7878329181900360200190a1505050505050505050565b60408051808201909152600281527f5355000000000000000000000000000000000000000000000000000000000000602082015290565b336000818152600560209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b600154600160a060020a031681565b6108e785858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843750611517945050505050565b6060808260018110158015610e4557506127108111155b1515610e5057600080fd5b60408051606081018252602b81527f68747470733a2f2f74656e74686f7573616e6473752e636f6d2f65726337323160208201527f2f30303030302e6a736f6e0000000000000000000000000000000000000000009181019190915292508291507fff00000000000000000000000000000000000000000000000000000000000000600a61271086040660300160f860020a0216600081901a604184015350600a6103e885040660300160f860020a02826022815181101515610f0f57fe5b906020010190600160f860020a031916908160001a905350600a606485040660300160f860020a02826023815181101515610f4657fe5b906020010190600160f860020a031916908160001a905350600a8085040660300160f860020a02826024815181101515610f7c57fe5b906020010190600160f860020a031916908160001a905350600a840660300160f860020a02826025815181101515610fb057fe5b906020010190600160f860020a031916908160001a9053505050919050565b600054600160a060020a03163314610fe657600080fd5b600160a060020a0381161515610ffb57600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600160a060020a03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600054600160a060020a0316331461106f57600080fd5b600160a060020a038116151561108457600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b80600181101580156110c757506127108111155b15156110d257600080fd5b816000600182101580156110e857506127108211155b15156110f357600080fd5b50600081815260066020526040902054600160a060020a03168015806111215750600160a060020a03811630145b151561112c57600080fd5b346706f05b59d3b200001461114057600080fd5b61114a843361131d565b50505050565b600981612711811061115e57fe5b60040201805460018083018054604080516020600295841615610100026000190190931694909404601f8101839004830285018301909152808452939550919290918301828280156111f15780601f106111c6576101008083540402835291602001916111f1565b820191906000526020600020905b8154815290600101906020018083116111d457829003601f168201915b50505060028085018054604080516020601f60001961010060018716150201909416959095049283018590048502810185019091528181529596959450909250908301828280156112835780601f1061125857610100808354040283529160200191611283565b820191906000526020600020905b81548152906001019060200180831161126657829003601f168201915b5050505060038301805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529495949350908301828280156113135780601f106112e857610100808354040283529160200191611313565b820191906000526020600020905b8154815290600101906020018083116112f657829003601f168201915b5050505050905084565b60008080600160a060020a038416151561133657600080fd5b600085815260066020526040902054600160a060020a0316925082151561135b573092505b600085815260086020526040902054915081151561137e57600185039150611385565b6001820391505b600160a060020a03831660009081526007602052604090205460001901821461144c57600160a060020a0383166000908152600760205260409020805460001981019081106113d057fe5b9060005260206000200154905080600014156114015750600160a060020a0382166000908152600760205260409020545b600160a060020a038316600090815260076020526040902080548291908490811061142857fe5b60009182526020808320909101929092558281526008909152604090206001830190555b600160a060020a0383166000908152600760205260409020805490611475906000198301611847565b50600160a060020a0380851660008181526007602090815260408083208054600181018255818552838520018b9055548a8452600883528184205560068252808320805473ffffffffffffffffffffffffffffffffffffffff199081168617909155600490925280832080549092169091555188938716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a45050505050565b6000806000846001811015801561153057506127108111155b151561153b57600080fd5b6000868152600660205260409020548690600160a060020a0316338114806115795750600082815260046020526040902054600160a060020a031633145b806115a75750600160a060020a038116600090815260056020908152604080832033845290915290205460ff165b15156115b257600080fd5b600088815260066020526040902054600160a060020a031695508515156115d7573095505b600160a060020a03868116908b16146115ef57600080fd5b600160a060020a038916151561160457600080fd5b61160e888a61131d565b883b945084151561161e576117bd565b88600160a060020a031663150b7a02338c8b8b6040518563ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018085600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156116cf5781810151838201526020016116b7565b50505050905090810190601f1680156116fc5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561171e57600080fd5b505af1158015611732573d6000803e3d6000fd5b505050506040513d602081101561174857600080fd5b5051604080517f6f6e455243373231526563656976656428616464726573732c6164647265737381527f2c75696e743235362c62797465732900000000000000000000000000000000006020820152905190819003602f019020909450600160e060020a03198086169116146117bd57600080fd5b50505050505050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061180a5782800160ff19823516178555611837565b82800160010185558215611837579182015b8281111561183757823582559160200191906001019061181c565b50611843929150611867565b5090565b815481835581811115610afe57600083815260209020610afe9181019083015b61070791905b80821115611843576000815560010161186d5600a165627a7a72305820442b258250332058a1160f306a40a73245a4d60c6b0bdf7744ce14acc00a2cac0029

Deployed Bytecode

0x6080604052600436106101685763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166215be71811461016d57806301ffc9a71461019e57806305e45546146101d457806306fdde03146101fb578063081812fc14610285578063095ea7b31461029d578063133252a6146102b657806318160ddd146102da57806323b872dd146102ef5780632aad292e1461030c5780632f745c591461032d57806342842e0e146103515780634f6ccce71461036e5780635fd8c710146103865780636352211e1461039b5780636bfa5edc146103b357806370a08231146103c857806376f14c98146103e957806395d89b4114610418578063a22cb4651461042d578063abe088a714610453578063b88d4fde14610468578063c87b56dd14610494578063d978a0d3146104ac578063e985e9c5146104cd578063ec13df6b146104f4578063efef39a114610515578063ffa6ab4414610520575b600080fd5b34801561017957600080fd5b50610182610683565b60408051600160a060020a039092168252519081900360200190f35b3480156101aa57600080fd5b506101c0600160e060020a031960043516610692565b604080519115158252519081900360200190f35b3480156101e057600080fd5b506101e96106cb565b60408051918252519081900360200190f35b34801561020757600080fd5b506102106106d2565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561024a578181015183820152602001610232565b50505050905090810190601f1680156102775780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561029157600080fd5b5061018260043561070a565b6102b4600160a060020a036004351660243561074c565b005b3480156102c257600080fd5b506102b4600435600160a060020a0360243516610832565b3480156102e657600080fd5b506101e96108ee565b6102b4600160a060020a03600435811690602435166044356108f4565b34801561031857600080fd5b506102b4600160a060020a03600435166109f1565b34801561033957600080fd5b506101e9600160a060020a0360043516602435610a4c565b6102b4600160a060020a0360043581169060243516604435610ae2565b34801561037a57600080fd5b506101e9600435610b03565b34801561039257600080fd5b506102b4610b1a565b3480156103a757600080fd5b50610182600435610b6e565b3480156103bf57600080fd5b50610182610bb8565b3480156103d457600080fd5b506101e9600160a060020a0360043516610bc7565b6102b4600480359060248035808201929081013591604435808201929081013591606435908101910135610bfa565b34801561042457600080fd5b50610210610d3e565b34801561043957600080fd5b506102b4600160a060020a03600435166024351515610d75565b34801561045f57600080fd5b50610182610de3565b6102b4600160a060020a0360048035821691602480359091169160443591606435908101910135610df2565b3480156104a057600080fd5b50610210600435610e2e565b3480156104b857600080fd5b506102b4600160a060020a0360043516610fcf565b3480156104d957600080fd5b506101c0600160a060020a036004358116906024351661102a565b34801561050057600080fd5b506102b4600160a060020a0360043516611058565b6102b46004356110b3565b34801561052c57600080fd5b50610538600435611150565b60405180858152602001806020018060200180602001848103845287818151815260200191508051906020019080838360005b8381101561058357818101518382015260200161056b565b50505050905090810190601f1680156105b05780820380516001836020036101000a031916815260200191505b50848103835286518152865160209182019188019080838360005b838110156105e35781810151838201526020016105cb565b50505050905090810190601f1680156106105780820380516001836020036101000a031916815260200191505b50848103825285518152855160209182019187019080838360005b8381101561064357818101518382015260200161062b565b50505050905090810190601f1680156106705780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b600054600160a060020a031681565b600160e060020a0319811660009081526003602052604081205460ff1680156106c55750600160e060020a031980831614155b92915050565b619c4d5481565b60408051808201909152600a81527f537520537175617265730000000000000000000000000000000000000000000060208201525b90565b6000816001811015801561072057506127108111155b151561072b57600080fd5b600083815260046020526040902054600160a060020a031691505b50919050565b6000818152600660205260408120548290600160a060020a0316338114806107975750600160a060020a038116600090815260056020908152604080832033845290915290205460ff165b15156107a257600080fd5b600084815260066020526040902054600160a060020a031692508215156107c7573092505b600084815260046020526040808220805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0389811691821790925591518793918716917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a45050505050565b600254600160a060020a0316331461084957600080fd5b816001811015801561085d57506127108111155b151561086857600080fd5b8260006001821015801561087e57506127108211155b151561088957600080fd5b50600081815260066020526040902054600160a060020a03168015806108b75750600160a060020a03811630145b15156108c257600080fd5b619c4d54611388116108d357600080fd5b619c4d805460010190556108e7858561131d565b5050505050565b61271090565b6000816001811015801561090a57506127108111155b151561091557600080fd5b6000838152600660205260409020548390600160a060020a0316338114806109535750600082815260046020526040902054600160a060020a031633145b806109815750600160a060020a038116600090815260056020908152604080832033845290915290205460ff165b151561098c57600080fd5b600085815260066020526040902054600160a060020a031693508315156109b1573093505b600160a060020a03848116908816146109c957600080fd5b600160a060020a03861615156109de57600080fd5b6109e8858761131d565b50505050505050565b600054600160a060020a03163314610a0857600080fd5b600160a060020a0381161515610a1d57600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6000600160a060020a0383161515610a6357600080fd5b600160a060020a0383166000908152600760205260409020548210610a8757600080fd5b600160a060020a0383166000908152600760205260409020805483908110610aab57fe5b9060005260206000200154905030600160a060020a031683600160a060020a031614156106c5578015156106c55750600101919050565b610afe8383836020604051908101604052806000815250611517565b505050565b60006127108210610b1357600080fd5b5060010190565b600154600160a060020a03163314610b3157600080fd5b600154604051600160a060020a0390911690303180156108fc02916000818181858888f19350505050158015610b6b573d6000803e3d6000fd5b50565b60008160018110158015610b8457506127108111155b1515610b8f57600080fd5b600083815260066020526040902054600160a060020a0316915081151561074657503092915050565b600254600160a060020a031681565b6000600160a060020a0382161515610bde57600080fd5b50600160a060020a031660009081526007602052604090205490565b6000878152600660205260409020548790600160a060020a0316338114610c2057600080fd5b6040851115610c2e57600080fd5b6060831115610c3c57600080fd5b61012c8714610c4a57600080fd5b6009896127118110610c5857fe5b6004020180546001019055878760098b6127118110610c7357fe5b600402016001019190610c879291906117c9565b50858560098b6127118110610c9857fe5b600402016002019190610cac9291906117c9565b50838360098b6127118110610cbd57fe5b600402016003019190610cd19291906117c9565b50600360098a6127118110610ce257fe5b60040201541115610d0057662386f26fc100003414610d0057600080fd5b604080518a815290517f95820ed330d949e85d003e7c553aa060e3cdffc1f8af4eb8c9cf988dca7878329181900360200190a1505050505050505050565b60408051808201909152600281527f5355000000000000000000000000000000000000000000000000000000000000602082015290565b336000818152600560209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b600154600160a060020a031681565b6108e785858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843750611517945050505050565b6060808260018110158015610e4557506127108111155b1515610e5057600080fd5b60408051606081018252602b81527f68747470733a2f2f74656e74686f7573616e6473752e636f6d2f65726337323160208201527f2f30303030302e6a736f6e0000000000000000000000000000000000000000009181019190915292508291507fff00000000000000000000000000000000000000000000000000000000000000600a61271086040660300160f860020a0216600081901a604184015350600a6103e885040660300160f860020a02826022815181101515610f0f57fe5b906020010190600160f860020a031916908160001a905350600a606485040660300160f860020a02826023815181101515610f4657fe5b906020010190600160f860020a031916908160001a905350600a8085040660300160f860020a02826024815181101515610f7c57fe5b906020010190600160f860020a031916908160001a905350600a840660300160f860020a02826025815181101515610fb057fe5b906020010190600160f860020a031916908160001a9053505050919050565b600054600160a060020a03163314610fe657600080fd5b600160a060020a0381161515610ffb57600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600160a060020a03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600054600160a060020a0316331461106f57600080fd5b600160a060020a038116151561108457600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b80600181101580156110c757506127108111155b15156110d257600080fd5b816000600182101580156110e857506127108211155b15156110f357600080fd5b50600081815260066020526040902054600160a060020a03168015806111215750600160a060020a03811630145b151561112c57600080fd5b346706f05b59d3b200001461114057600080fd5b61114a843361131d565b50505050565b600981612711811061115e57fe5b60040201805460018083018054604080516020600295841615610100026000190190931694909404601f8101839004830285018301909152808452939550919290918301828280156111f15780601f106111c6576101008083540402835291602001916111f1565b820191906000526020600020905b8154815290600101906020018083116111d457829003601f168201915b50505060028085018054604080516020601f60001961010060018716150201909416959095049283018590048502810185019091528181529596959450909250908301828280156112835780601f1061125857610100808354040283529160200191611283565b820191906000526020600020905b81548152906001019060200180831161126657829003601f168201915b5050505060038301805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529495949350908301828280156113135780601f106112e857610100808354040283529160200191611313565b820191906000526020600020905b8154815290600101906020018083116112f657829003601f168201915b5050505050905084565b60008080600160a060020a038416151561133657600080fd5b600085815260066020526040902054600160a060020a0316925082151561135b573092505b600085815260086020526040902054915081151561137e57600185039150611385565b6001820391505b600160a060020a03831660009081526007602052604090205460001901821461144c57600160a060020a0383166000908152600760205260409020805460001981019081106113d057fe5b9060005260206000200154905080600014156114015750600160a060020a0382166000908152600760205260409020545b600160a060020a038316600090815260076020526040902080548291908490811061142857fe5b60009182526020808320909101929092558281526008909152604090206001830190555b600160a060020a0383166000908152600760205260409020805490611475906000198301611847565b50600160a060020a0380851660008181526007602090815260408083208054600181018255818552838520018b9055548a8452600883528184205560068252808320805473ffffffffffffffffffffffffffffffffffffffff199081168617909155600490925280832080549092169091555188938716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a45050505050565b6000806000846001811015801561153057506127108111155b151561153b57600080fd5b6000868152600660205260409020548690600160a060020a0316338114806115795750600082815260046020526040902054600160a060020a031633145b806115a75750600160a060020a038116600090815260056020908152604080832033845290915290205460ff165b15156115b257600080fd5b600088815260066020526040902054600160a060020a031695508515156115d7573095505b600160a060020a03868116908b16146115ef57600080fd5b600160a060020a038916151561160457600080fd5b61160e888a61131d565b883b945084151561161e576117bd565b88600160a060020a031663150b7a02338c8b8b6040518563ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018085600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156116cf5781810151838201526020016116b7565b50505050905090810190601f1680156116fc5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561171e57600080fd5b505af1158015611732573d6000803e3d6000fd5b505050506040513d602081101561174857600080fd5b5051604080517f6f6e455243373231526563656976656428616464726573732c6164647265737381527f2c75696e743235362c62797465732900000000000000000000000000000000006020820152905190819003602f019020909450600160e060020a03198086169116146117bd57600080fd5b50505050505050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061180a5782800160ff19823516178555611837565b82800160010185558215611837579182015b8281111561183757823582559160200191906001019061181c565b50611843929150611867565b5090565b815481835581811115610afe57600083815260209020610afe9181019083015b61070791905b80821115611843576000815560010161186d5600a165627a7a72305820442b258250332058a1160f306a40a73245a4d60c6b0bdf7744ce14acc00a2cac0029

Swarm Source

bzzr://442b258250332058a1160f306a40a73245a4d60c6b0bdf7744ce14acc00a2cac

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

OVERVIEW

Su Squares, cute squares you own and personalize

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.