ETH Price: $2,100.96 (+2.94%)
Gas: 0.04 Gwei

Contract

0xd4e4078ca3495DE5B1d4dB434BEbc5a986197782
 

More Info

Private Name Tags

TokenTracker

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Approval For...246204372026-03-09 14:12:473 days ago1773065567IN
Autoglyphs: ☵ Token
0 ETH0.000056112.29909018
Set Approval For...246204212026-03-09 14:09:353 days ago1773065375IN
Autoglyphs: ☵ Token
0 ETH0.000057152.34171294
Set Approval For...246203102026-03-09 13:46:593 days ago1773064019IN
Autoglyphs: ☵ Token
0 ETH0.0000311.27024355
Set Approval For...246201942026-03-09 13:23:473 days ago1773062627IN
Autoglyphs: ☵ Token
0 ETH0.000038941.59557513
Set Approval For...246201922026-03-09 13:23:233 days ago1773062603IN
Autoglyphs: ☵ Token
0 ETH0.000039031.59384764
Set Approval For...246201832026-03-09 13:21:353 days ago1773062495IN
Autoglyphs: ☵ Token
0 ETH0.000021870.89332191
Set Approval For...246196102026-03-09 11:26:473 days ago1773055607IN
Autoglyphs: ☵ Token
0 ETH0.000037951.54966046
Set Approval For...245586292026-02-28 23:12:1112 days ago1772320331IN
Autoglyphs: ☵ Token
0 ETH0.000094932.04598419
Set Approval For...245011592026-02-20 22:49:2320 days ago1771627763IN
Autoglyphs: ☵ Token
0 ETH0.000001890.04086839
Safe Transfer Fr...243936822026-02-05 22:43:1135 days ago1770331391IN
Autoglyphs: ☵ Token
0 ETH0.000420794.23040983
Set Approval For...243934452026-02-05 21:55:2335 days ago1770328523IN
Autoglyphs: ☵ Token
0 ETH0.00026635.74942331
Set Approval For...243452802026-01-30 4:26:2342 days ago1769747183IN
Autoglyphs: ☵ Token
0 ETH0.000005950.12865682
Set Approval For...243452752026-01-30 4:25:2342 days ago1769747123IN
Autoglyphs: ☵ Token
0 ETH0.000008870.19117335
Set Approval For...243452712026-01-30 4:24:3542 days ago1769747075IN
Autoglyphs: ☵ Token
0 ETH0.000006740.14561683
Safe Transfer Fr...243452672026-01-30 4:23:4742 days ago1769747027IN
Autoglyphs: ☵ Token
0 ETH0.00000780.09150198
Safe Transfer Fr...243357582026-01-28 20:33:3543 days ago1769632415IN
Autoglyphs: ☵ Token
0 ETH0.000203382.10394231
Set Approval For...243348732026-01-28 17:36:1143 days ago1769621771IN
Autoglyphs: ☵ Token
0 ETH0.000105382.2753544
Safe Transfer Fr...243302722026-01-28 2:12:2344 days ago1769566343IN
Autoglyphs: ☵ Token
0 ETH0.000173972.03814366
Set Approval For...242872182026-01-22 2:02:3550 days ago1769047355IN
Autoglyphs: ☵ Token
0 ETH0.000002320.05021569
Safe Transfer Fr...242781892026-01-20 19:49:4751 days ago1768938587IN
Autoglyphs: ☵ Token
0 ETH0.000184992.09900569
Set Approval For...242773502026-01-20 17:01:2351 days ago1768928483IN
Autoglyphs: ☵ Token
0 ETH0.000110472.38504157
Set Approval For...242754062026-01-20 10:31:3551 days ago1768905095IN
Autoglyphs: ☵ Token
0 ETH0.000006760.1459843
Set Approval For...242708412026-01-19 19:13:5952 days ago1768850039IN
Autoglyphs: ☵ Token
0 ETH0.000095452.05703521
Set Approval For...242706392026-01-19 18:33:3552 days ago1768847615IN
Autoglyphs: ☵ Token
0 ETH0.000095492.05805483
Set Approval For...242705692026-01-19 18:19:3552 days ago1768846775IN
Autoglyphs: ☵ Token
0 ETH0.000096522.08012765
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
-75287202019-04-08 17:02:072530 days ago1554742927
Autoglyphs: ☵ Token
0.2 ETH
-75287192019-04-08 17:02:022530 days ago1554742922
Autoglyphs: ☵ Token
0.2 ETH
-75287192019-04-08 17:02:022530 days ago1554742922
Autoglyphs: ☵ Token
0.2 ETH
-75287182019-04-08 17:01:582530 days ago1554742918
Autoglyphs: ☵ Token
0.2 ETH
-75287182019-04-08 17:01:582530 days ago1554742918
Autoglyphs: ☵ Token
0.2 ETH
-75287172019-04-08 17:01:462530 days ago1554742906
Autoglyphs: ☵ Token
0.2 ETH
-75287172019-04-08 17:01:462530 days ago1554742906
Autoglyphs: ☵ Token
0.2 ETH
-75287162019-04-08 17:01:342530 days ago1554742894
Autoglyphs: ☵ Token
0.2 ETH
-75287142019-04-08 17:01:192530 days ago1554742879
Autoglyphs: ☵ Token
0.2 ETH
-75287132019-04-08 17:00:492530 days ago1554742849
Autoglyphs: ☵ Token
0.2 ETH
-75287132019-04-08 17:00:492530 days ago1554742849
Autoglyphs: ☵ Token
0.2 ETH
-75287122019-04-08 17:00:232530 days ago1554742823
Autoglyphs: ☵ Token
0.2 ETH
-75287112019-04-08 17:00:192530 days ago1554742819
Autoglyphs: ☵ Token
0.2 ETH
-75287102019-04-08 17:00:102530 days ago1554742810
Autoglyphs: ☵ Token
0.2 ETH
-75287092019-04-08 17:00:052530 days ago1554742805
Autoglyphs: ☵ Token
0.2 ETH
-75287092019-04-08 17:00:052530 days ago1554742805
Autoglyphs: ☵ Token
0.2 ETH
-75287082019-04-08 17:00:042530 days ago1554742804
Autoglyphs: ☵ Token
0.2 ETH
-75287082019-04-08 17:00:042530 days ago1554742804
Autoglyphs: ☵ Token
0.2 ETH
-75287072019-04-08 17:00:022530 days ago1554742802
Autoglyphs: ☵ Token
0.2 ETH
-75287062019-04-08 16:59:392530 days ago1554742779
Autoglyphs: ☵ Token
0.2 ETH
-75287052019-04-08 16:59:262530 days ago1554742766
Autoglyphs: ☵ Token
0.2 ETH
-75287042019-04-08 16:59:132530 days ago1554742753
Autoglyphs: ☵ Token
0.2 ETH
-75287042019-04-08 16:59:132530 days ago1554742753
Autoglyphs: ☵ Token
0.2 ETH
-75287032019-04-08 16:59:092530 days ago1554742749
Autoglyphs: ☵ Token
0.2 ETH
-75287022019-04-08 16:58:502530 days ago1554742730
Autoglyphs: ☵ Token
0.2 ETH
View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Autoglyphs

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
/**
 *Submitted for verification at Etherscan.io on 2019-04-05
*/

pragma solidity ^0.4.24;

/**
 *
 *      ***    **     ** ********  *******   ******   **     **    ** ********  **     **  ******
 *     ** **   **     **    **    **     ** **    **  **      **  **  **     ** **     ** **    **
 *    **   **  **     **    **    **     ** **        **       ****   **     ** **     ** **
 *   **     ** **     **    **    **     ** **   **** **        **    ********  *********  ******
 *   ********* **     **    **    **     ** **    **  **        **    **        **     **       **
 *   **     ** **     **    **    **     ** **    **  **        **    **        **     ** **    **
 *   **     **  *******     **     *******   ******   ********  **    **        **     **  ******
 *
 *
 *                                                                by Matt Hall and John Watkinson
 *
 *
 * The output of the 'tokenURI' function is a set of instructions to make a drawing.
 * Each symbol in the output corresponds to a cell, and there are 64x64 cells arranged in a square grid.
 * The drawing can be any size, and the pen's stroke width should be between 1/5th to 1/10th the size of a cell.
 * The drawing instructions for the nine different symbols are as follows:
 *
 *   .  Draw nothing in the cell.
 *   O  Draw a circle bounded by the cell.
 *   +  Draw centered lines vertically and horizontally the length of the cell.
 *   X  Draw diagonal lines connecting opposite corners of the cell.
 *   |  Draw a centered vertical line the length of the cell.
 *   -  Draw a centered horizontal line the length of the cell.
 *   \  Draw a line connecting the top left corner of the cell to the bottom right corner.
 *   /  Draw a line connecting the bottom left corner of teh cell to the top right corner.
 *   #  Fill in the cell completely.
 *
 */
interface ERC721TokenReceiver
{

    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes _data) external returns(bytes4);

}

contract Autoglyphs {

    event Generated(uint indexed index, address indexed a, string value);

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

    bytes4 internal constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02;

    uint public constant TOKEN_LIMIT = 512; // 8 for testing, 256 or 512 for prod;
    uint public constant ARTIST_PRINTS = 128; // 2 for testing, 64 for prod;

    uint public constant PRICE = 200 finney;

    // The beneficiary is 350.org
    address public constant BENEFICIARY = 0x50990F09d4f0cb864b8e046e7edC749dE410916b;

    mapping (uint => address) private idToCreator;
    mapping (uint => uint8) private idToSymbolScheme;

    // ERC 165
    mapping(bytes4 => bool) internal supportedInterfaces;

    /**
     * @dev A mapping from NFT ID to the address that owns it.
     */
    mapping (uint256 => address) internal idToOwner;

    /**
     * @dev A mapping from NFT ID to the seed used to make it.
     */
    mapping (uint256 => uint256) internal idToSeed;
    mapping (uint256 => uint256) internal seedToId;

    /**
     * @dev Mapping from NFT ID to approved address.
     */
    mapping (uint256 => address) internal idToApproval;

    /**
     * @dev Mapping from owner address to mapping of operator addresses.
     */
    mapping (address => mapping (address => bool)) internal ownerToOperators;

    /**
     * @dev Mapping from owner to list of owned NFT IDs.
     */
    mapping(address => uint256[]) internal ownerToIds;

    /**
     * @dev Mapping from NFT ID to its index in the owner tokens list.
     */
    mapping(uint256 => uint256) internal idToOwnerIndex;

    /**
     * @dev Total number of tokens.
     */
    uint internal numTokens = 0;

    /**
     * @dev Guarantees that the msg.sender is an owner or operator of the given NFT.
     * @param _tokenId ID of the NFT to validate.
     */
    modifier canOperate(uint256 _tokenId) {
        address tokenOwner = idToOwner[_tokenId];
        require(tokenOwner == msg.sender || ownerToOperators[tokenOwner][msg.sender]);
        _;
    }

    /**
     * @dev Guarantees that the msg.sender is allowed to transfer NFT.
     * @param _tokenId ID of the NFT to transfer.
     */
    modifier canTransfer(uint256 _tokenId) {
        address tokenOwner = idToOwner[_tokenId];
        require(
            tokenOwner == msg.sender
            || idToApproval[_tokenId] == msg.sender
            || ownerToOperators[tokenOwner][msg.sender]
        );
        _;
    }

    /**
     * @dev Guarantees that _tokenId is a valid Token.
     * @param _tokenId ID of the NFT to validate.
     */
    modifier validNFToken(uint256 _tokenId) {
        require(idToOwner[_tokenId] != address(0));
        _;
    }

    /**
     * @dev Contract constructor.
     */
    constructor() public {
        supportedInterfaces[0x01ffc9a7] = true; // ERC165
        supportedInterfaces[0x80ac58cd] = true; // ERC721
        supportedInterfaces[0x780e9d63] = true; // ERC721 Enumerable
        supportedInterfaces[0x5b5e139f] = true; // ERC721 Metadata
    }

    ///////////////////
    //// GENERATOR ////
    ///////////////////

    int constant ONE = int(0x100000000);
    uint constant USIZE = 64;
    int constant SIZE = int(USIZE);
    int constant HALF_SIZE = SIZE / int(2);

    int constant SCALE = int(0x1b81a81ab1a81a823);
    int constant HALF_SCALE = SCALE / int(2);

    bytes prefix = "data:text/plain;charset=utf-8,";

    string internal nftName = "Autoglyphs";
    string internal nftSymbol = "☵";

    // 0x2E = .
    // 0x4F = O
    // 0x2B = +
    // 0x58 = X
    // 0x7C = |
    // 0x2D = -
    // 0x5C = \
    // 0x2F = /
    // 0x23 = #

    function abs(int n) internal pure returns (int) {
        if (n >= 0) return n;
        return -n;
    }

    function getScheme(uint a) internal pure returns (uint8) {
        uint index = a % 83;
        uint8 scheme;
        if (index < 20) {
            scheme = 1;
        } else if (index < 35) {
            scheme = 2;
        } else if (index < 48) {
            scheme = 3;
        } else if (index < 59) {
            scheme = 4;
        } else if (index < 68) {
            scheme = 5;
        } else if (index < 73) {
            scheme = 6;
        } else if (index < 77) {
            scheme = 7;
        } else if (index < 80) {
            scheme = 8;
        } else if (index < 82) {
            scheme = 9;
        } else {
            scheme = 10;
        }
        return scheme;
    }

    /* * ** *** ***** ******** ************* ******** ***** *** ** * */

    // The following code generates art.

    function draw(uint id) public view returns (string) {
        uint a = uint(uint160(keccak256(abi.encodePacked(idToSeed[id]))));
        bytes memory output = new bytes(USIZE * (USIZE + 3) + 30);
        uint c;
        for (c = 0; c < 30; c++) {
            output[c] = prefix[c];
        }
        int x = 0;
        int y = 0;
        uint v = 0;
        uint value = 0;
        uint mod = (a % 11) + 5;
        bytes5 symbols;
        if (idToSymbolScheme[id] == 0) {
            revert();
        } else if (idToSymbolScheme[id] == 1) {
            symbols = 0x2E582F5C2E; // X/\
        } else if (idToSymbolScheme[id] == 2) {
            symbols = 0x2E2B2D7C2E; // +-|
        } else if (idToSymbolScheme[id] == 3) {
            symbols = 0x2E2F5C2E2E; // /\
        } else if (idToSymbolScheme[id] == 4) {
            symbols = 0x2E5C7C2D2F; // \|-/
        } else if (idToSymbolScheme[id] == 5) {
            symbols = 0x2E4F7C2D2E; // O|-
        } else if (idToSymbolScheme[id] == 6) {
            symbols = 0x2E5C5C2E2E; // \
        } else if (idToSymbolScheme[id] == 7) {
            symbols = 0x2E237C2D2B; // #|-+
        } else if (idToSymbolScheme[id] == 8) {
            symbols = 0x2E4F4F2E2E; // OO
        } else if (idToSymbolScheme[id] == 9) {
            symbols = 0x2E232E2E2E; // #
        } else {
            symbols = 0x2E234F2E2E; // #O
        }
        for (int i = int(0); i < SIZE; i++) {
            y = (2 * (i - HALF_SIZE) + 1);
            if (a % 3 == 1) {
                y = -y;
            } else if (a % 3 == 2) {
                y = abs(y);
            }
            y = y * int(a);
            for (int j = int(0); j < SIZE; j++) {
                x = (2 * (j - HALF_SIZE) + 1);
                if (a % 2 == 1) {
                    x = abs(x);
                }
                x = x * int(a);
                v = uint(x * y / ONE) % mod;
                if (v < 5) {
                    value = uint(symbols[v]);
                } else {
                    value = 0x2E;
                }
                output[c] = byte(bytes32(value << 248));
                c++;
            }
            output[c] = byte(0x25);
            c++;
            output[c] = byte(0x30);
            c++;
            output[c] = byte(0x41);
            c++;
        }
        string memory result = string(output);
        return result;
    }

    /* * ** *** ***** ******** ************* ******** ***** *** ** * */

    function creator(uint _id) external view returns (address) {
        return idToCreator[_id];
    }

    function symbolScheme(uint _id) external view returns (uint8) {
        return idToSymbolScheme[_id];
    }

    function createGlyph(uint seed) external payable returns (string) {
        return _mint(msg.sender, seed);
    }

    //////////////////////////
    //// ERC 721 and 165  ////
    //////////////////////////

    /**
     * @dev Returns whether the target address is a contract.
     * @param _addr Address to check.
     * @return True if _addr is a contract, false if not.
     */
    function isContract(address _addr) internal view returns (bool addressCheck) {
        uint256 size;
        assembly { size := extcodesize(_addr) } // solhint-disable-line
        addressCheck = size > 0;
    }

    /**
     * @dev Function to check which interfaces are suported by this contract.
     * @param _interfaceID Id of the interface.
     * @return True if _interfaceID is supported, false otherwise.
     */
    function supportsInterface(bytes4 _interfaceID) external view returns (bool) {
        return supportedInterfaces[_interfaceID];
    }

    /**
     * @dev Transfers the ownership of an NFT from one address to another address. This function can
     * be changed to payable.
     * @notice 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,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 {
        _safeTransferFrom(_from, _to, _tokenId, _data);
    }

    /**
     * @dev Transfers the ownership of an NFT from one address to another address. This function can
     * be changed to payable.
     * @notice 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 {
        _safeTransferFrom(_from, _to, _tokenId, "");
    }

    /**
     * @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. This function can be changed to payable.
     * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
     * they maybe be permanently lost.
     * @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 canTransfer(_tokenId) validNFToken(_tokenId) {
        address tokenOwner = idToOwner[_tokenId];
        require(tokenOwner == _from);
        require(_to != address(0));
        _transfer(_to, _tokenId);
    }

    /**
     * @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable.
     * @notice 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 Address to be approved for the given NFT ID.
     * @param _tokenId ID of the token to be approved.
     */
    function approve(address _approved, uint256 _tokenId) external canOperate(_tokenId) validNFToken(_tokenId) {
        address tokenOwner = idToOwner[_tokenId];
        require(_approved != tokenOwner);
        idToApproval[_tokenId] = _approved;
        emit Approval(tokenOwner, _approved, _tokenId);
    }

    /**
     * @dev Enables or disables approval for a third party ("operator") to manage all of
     * `msg.sender`'s assets. It also emits the ApprovalForAll event.
     * @notice This works even if sender doesn't own any tokens at the time.
     * @param _operator Address to add to the set of authorized operators.
     * @param _approved True if the operators is approved, false to revoke approval.
     */
    function setApprovalForAll(address _operator, bool _approved) external {
        ownerToOperators[msg.sender][_operator] = _approved;
        emit ApprovalForAll(msg.sender, _operator, _approved);
    }

    /**
     * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are
     * considered invalid, and this function throws for queries about the zero address.
     * @param _owner Address for whom to query the balance.
     * @return Balance of _owner.
     */
    function balanceOf(address _owner) external view returns (uint256) {
        require(_owner != address(0));
        return _getOwnerNFTCount(_owner);
    }

    /**
     * @dev Returns the address of the owner of the NFT. NFTs assigned to zero address are considered
     * invalid, and queries about them do throw.
     * @param _tokenId The identifier for an NFT.
     * @return Address of _tokenId owner.
     */
    function ownerOf(uint256 _tokenId) external view returns (address _owner) {
        _owner = idToOwner[_tokenId];
        require(_owner != address(0));
    }

    /**
     * @dev Get the approved address for a single NFT.
     * @notice Throws if `_tokenId` is not a valid NFT.
     * @param _tokenId ID of the NFT to query the approval of.
     * @return Address that _tokenId is approved for.
     */
    function getApproved(uint256 _tokenId) external view validNFToken(_tokenId) returns (address) {
        return idToApproval[_tokenId];
    }

    /**
     * @dev Checks if `_operator` is an approved operator for `_owner`.
     * @param _owner The address that owns the NFTs.
     * @param _operator The address that acts on behalf of the owner.
     * @return True if approved for all, false otherwise.
     */
    function isApprovedForAll(address _owner, address _operator) external view returns (bool) {
        return ownerToOperators[_owner][_operator];
    }

    /**
     * @dev Actually preforms the transfer.
     * @notice Does NO checks.
     * @param _to Address of a new owner.
     * @param _tokenId The NFT that is being transferred.
     */
    function _transfer(address _to, uint256 _tokenId) internal {
        address from = idToOwner[_tokenId];
        _clearApproval(_tokenId);

        _removeNFToken(from, _tokenId);
        _addNFToken(_to, _tokenId);

        emit Transfer(from, _to, _tokenId);
}

    /**
     * @dev Mints a new NFT.
     * @notice This is an internal function which should be called from user-implemented external
     * mint function. Its purpose is to show and properly initialize data structures when using this
     * implementation.
     * @param _to The address that will own the minted NFT.
     */
    function _mint(address _to, uint seed) internal returns (string) {
        require(_to != address(0));
        require(numTokens < TOKEN_LIMIT);
        uint amount = 0;
        if (numTokens >= ARTIST_PRINTS) {
            amount = PRICE;
            require(msg.value >= amount);
        }
        require(seedToId[seed] == 0);
        uint id = numTokens + 1;

        idToCreator[id] = _to;
        idToSeed[id] = seed;
        seedToId[seed] = id;
        uint a = uint(uint160(keccak256(abi.encodePacked(seed))));
        idToSymbolScheme[id] = getScheme(a);
        string memory uri = draw(id);
        emit Generated(id, _to, uri);

        numTokens = numTokens + 1;
        _addNFToken(_to, id);

        if (msg.value > amount) {
            msg.sender.transfer(msg.value - amount);
        }
        if (amount > 0) {
            BENEFICIARY.transfer(amount);
        }

        emit Transfer(address(0), _to, id);
        return uri;
    }

    /**
     * @dev Assigns a new NFT to an address.
     * @notice Use and override this function with caution. Wrong usage can have serious consequences.
     * @param _to Address to which we want to add the NFT.
     * @param _tokenId Which NFT we want to add.
     */
    function _addNFToken(address _to, uint256 _tokenId) internal {
        require(idToOwner[_tokenId] == address(0));
        idToOwner[_tokenId] = _to;

        uint256 length = ownerToIds[_to].push(_tokenId);
        idToOwnerIndex[_tokenId] = length - 1;
    }

    /**
     * @dev Removes a NFT from an address.
     * @notice Use and override this function with caution. Wrong usage can have serious consequences.
     * @param _from Address from wich we want to remove the NFT.
     * @param _tokenId Which NFT we want to remove.
     */
    function _removeNFToken(address _from, uint256 _tokenId) internal {
        require(idToOwner[_tokenId] == _from);
        delete idToOwner[_tokenId];

        uint256 tokenToRemoveIndex = idToOwnerIndex[_tokenId];
        uint256 lastTokenIndex = ownerToIds[_from].length - 1;

        if (lastTokenIndex != tokenToRemoveIndex) {
            uint256 lastToken = ownerToIds[_from][lastTokenIndex];
            ownerToIds[_from][tokenToRemoveIndex] = lastToken;
            idToOwnerIndex[lastToken] = tokenToRemoveIndex;
        }

        ownerToIds[_from].length--;
    }

    /**
     * @dev Helper function that gets NFT count of owner. This is needed for overriding in enumerable
     * extension to remove double storage (gas optimization) of owner nft count.
     * @param _owner Address for whom to query the count.
     * @return Number of _owner NFTs.
     */
    function _getOwnerNFTCount(address _owner) internal view returns (uint256) {
        return ownerToIds[_owner].length;
    }

    /**
     * @dev Actually perform the safeTransferFrom.
     * @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 memory _data) private canTransfer(_tokenId) validNFToken(_tokenId) {
        address tokenOwner = idToOwner[_tokenId];
        require(tokenOwner == _from);
        require(_to != address(0));

        _transfer(_to, _tokenId);

        if (isContract(_to)) {
            bytes4 retval = ERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data);
            require(retval == MAGIC_ON_ERC721_RECEIVED);
        }
    }

    /**
     * @dev Clears the current approval of a given NFT ID.
     * @param _tokenId ID of the NFT to be transferred.
     */
    function _clearApproval(uint256 _tokenId) private {
        if (idToApproval[_tokenId] != address(0)) {
            delete idToApproval[_tokenId];
        }
    }

    //// Enumerable

    function totalSupply() public view returns (uint256) {
        return numTokens;
    }

    function tokenByIndex(uint256 index) public view returns (uint256) {
        require(index < numTokens);
        return index;
    }

    /**
     * @dev returns the n-th NFT ID from a list of owner's tokens.
     * @param _owner Token owner's address.
     * @param _index Index number representing n-th token in owner's list of tokens.
     * @return Token id.
     */
    function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256) {
        require(_index < ownerToIds[_owner].length);
        return ownerToIds[_owner][_index];
    }

    //// Metadata

    /**
      * @dev Returns a descriptive name for a collection of NFTokens.
      * @return Representing name.
      */
    function name() external view returns (string memory _name) {
        _name = nftName;
    }

    /**
     * @dev Returns an abbreviated name for NFTokens.
     * @return Representing symbol.
     */
    function symbol() external view returns (string memory _symbol) {
        _symbol = nftSymbol;
    }

    /**
     * @dev A distinct URI (RFC 3986) for a given NFT.
     * @param _tokenId Id for which we want uri.
     * @return URI of _tokenId.
     */
    function tokenURI(uint256 _tokenId) external view validNFToken(_tokenId) returns (string memory) {
        return draw(_tokenId);
    }

}

Contract Security Audit

Contract ABI

API
[{"constant":true,"inputs":[{"name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_LIMIT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"_name","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_approved","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ARTIST_PRINTS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","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":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BENEFICIARY","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"symbolScheme","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"draw","outputs":[{"name":"","type":"string"}],"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":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"creator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","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":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PRICE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"_symbol","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"seed","type":"uint256"}],"name":"createGlyph","outputs":[{"name":"","type":"string"}],"payable":true,"stateMutability":"payable","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"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"index","type":"uint256"},{"indexed":true,"name":"a","type":"address"},{"indexed":false,"name":"value","type":"string"}],"name":"Generated","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"}]

6000600a5560c0604052601e60808190527f646174613a746578742f706c61696e3b636861727365743d7574662d382c000060a09081526200004591600b9190620001be565b5060408051808201909152600a8082527f4175746f676c797068730000000000000000000000000000000000000000000060209092019182526200008c91600c91620001be565b506040805180820190915260038082527fe298b500000000000000000000000000000000000000000000000000000000006020909201918252620000d391600d91620001be565b50348015620000e157600080fd5b5060026020527f71203db6a8b906f8e7c7701ea536708e3d7c6018d3ad50e5680c3241edacce178054600160ff1991821681179092557fe93570590271d95518ca425fa83dfa75d04081fc79a4d9a58f39c8df65a8e7a180548216831790557fdea2b207876963907afe1816d4888d650521cd53e74f3055eeb250c96c41fdc880548216831790557f5b5e139f000000000000000000000000000000000000000000000000000000006000527fe7f4f15f8a9f2f6fc23737b039e4cbf51e96102d2c02d512a4356c0910a430f58054909116909117905562000263565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200020157805160ff191683800117855562000231565b8280016001018555821562000231579182015b828111156200023157825182559160200191906001019062000214565b506200023f92915062000243565b5090565b6200026091905b808211156200023f57600081556001016200024a565b90565b6119ee80620002736000396000f30060806040526004361061013d5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166301ffc9a78114610142578063031bd4c41461018d57806306fdde03146101b4578063081812fc1461023e578063095ea7b314610272578063180f0afd1461029857806318160ddd146102ad57806323b872dd146102c25780632f745c59146102ec5780632f99c6cc1461031057806339749064146103255780633b3041471461035357806342842e0e1461036b5780634f6ccce714610395578063510b5158146103ad5780636352211e146103c557806370a08231146103dd5780638d859f3e146103fe57806395d89b4114610413578063a22cb46514610428578063b88d4fde1461044e578063c87b56dd14610487578063dba5a7f51461049f578063e985e9c5146104aa575b600080fd5b34801561014e57600080fd5b506101797bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19600435166104d1565b604080519115158252519081900360200190f35b34801561019957600080fd5b506101a2610509565b60408051918252519081900360200190f35b3480156101c057600080fd5b506101c961050f565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102035781810151838201526020016101eb565b50505050905090810190601f1680156102305780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561024a57600080fd5b506102566004356105a5565b60408051600160a060020a039092168252519081900360200190f35b34801561027e57600080fd5b50610296600160a060020a03600435166024356105e7565b005b3480156102a457600080fd5b506101a26106f8565b3480156102b957600080fd5b506101a26106fd565b3480156102ce57600080fd5b50610296600160a060020a0360043581169060243516604435610704565b3480156102f857600080fd5b506101a2600160a060020a03600435166024356107f1565b34801561031c57600080fd5b5061025661084c565b34801561033157600080fd5b5061033d600435610864565b6040805160ff9092168252519081900360200190f35b34801561035f57600080fd5b506101c9600435610879565b34801561037757600080fd5b50610296600160a060020a0360043581169060243516604435610ea7565b3480156103a157600080fd5b506101a2600435610ec8565b3480156103b957600080fd5b50610256600435610edd565b3480156103d157600080fd5b50610256600435610ef8565b3480156103e957600080fd5b506101a2600160a060020a0360043516610f1c565b34801561040a57600080fd5b506101a2610f42565b34801561041f57600080fd5b506101c9610f4e565b34801561043457600080fd5b50610296600160a060020a03600435166024351515610faf565b34801561045a57600080fd5b50610296600160a060020a036004803582169160248035909116916044359160643590810191013561101d565b34801561049357600080fd5b506101c9600435611060565b6101c9600435611098565b3480156104b657600080fd5b50610179600160a060020a03600435811690602435166110a4565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19811660009081526002602052604090205460ff165b919050565b61020081565b600c8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561059b5780601f106105705761010080835404028352916020019161059b565b820191906000526020600020905b81548152906001019060200180831161057e57829003601f168201915b5050505050905090565b6000818152600360205260408120548290600160a060020a031615156105ca57600080fd5b5050600090815260066020526040902054600160a060020a031690565b6000818152600360205260408120548290600160a060020a0316338114806106325750600160a060020a038116600090815260076020908152604080832033845290915290205460ff165b151561063d57600080fd5b6000848152600360205260409020548490600160a060020a0316151561066257600080fd5b600085815260036020526040902054600160a060020a039081169450861684141561068c57600080fd5b600085815260066020526040808220805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038a811691821790925591518893918816917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b608081565b600a545b90565b6000818152600360205260408120548290600160a060020a0316338114806107425750600082815260066020526040902054600160a060020a031633145b806107705750600160a060020a038116600090815260076020908152604080832033845290915290205460ff165b151561077b57600080fd5b6000848152600360205260409020548490600160a060020a031615156107a057600080fd5b600085815260036020526040902054600160a060020a039081169450871684146107c957600080fd5b600160a060020a03861615156107de57600080fd5b6107e886866110d2565b50505050505050565b600160a060020a038216600090815260086020526040812054821061081557600080fd5b600160a060020a038316600090815260086020526040902080548390811061083957fe5b9060005260206000200154905092915050565b7350990f09d4f0cb864b8e046e7edc749de410916b81565b60009081526001602052604090205460ff1690565b60606000606060008060008060008060008060006060600460008f815260200190815260200160002054604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b602083106108f15780518252601f1990920191602091820191016108d2565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060019004600160a060020a03169b506040600301604002601e016040519080825280601f01601f191660200182016040528015610965578160200160208202803883390190505b509a50600099505b601e8a10156109f057600b8a815460018160011615610100020316600290048110151561099657fe5b8154600116156109b55790600052602060002090602091828204019190065b9054901a60f860020a028b8b8151811015156109cd57fe5b906020010190600160f860020a031916908160001a90535060019099019861096d565b60008e8152600160205260408120549099508998508897508796506005600b8e0601955060ff161515610a2257600080fd5b60008e81526001602081905260409091205460ff161415610a65577f2e582f5c2e0000000000000000000000000000000000000000000000000000009350610c99565b60008e81526001602052604090205460ff1660021415610aa7577f2e2b2d7c2e0000000000000000000000000000000000000000000000000000009350610c99565b60008e81526001602052604090205460ff1660031415610ae9577f2e2f5c2e2e0000000000000000000000000000000000000000000000000000009350610c99565b60008e81526001602052604090205460ff1660041415610b2b577f2e5c7c2d2f0000000000000000000000000000000000000000000000000000009350610c99565b60008e81526001602052604090205460ff1660051415610b6d577f2e4f7c2d2e0000000000000000000000000000000000000000000000000000009350610c99565b60008e81526001602052604090205460ff1660061415610baf577f2e5c5c2e2e0000000000000000000000000000000000000000000000000000009350610c99565b60008e81526001602052604090205460ff1660071415610bf1577f2e237c2d2b0000000000000000000000000000000000000000000000000000009350610c99565b60008e81526001602052604090205460ff1660081415610c33577f2e4f4f2e2e0000000000000000000000000000000000000000000000000000009350610c99565b60008e81526001602052604090205460ff1660091415610c75577f2e232e2e2e0000000000000000000000000000000000000000000000000000009350610c99565b7f2e234f2e2e00000000000000000000000000000000000000000000000000000093505b600092505b6040831215610e95576001601f19840160020201975060038c0660011415610ccb57876000039750610ce3565b60038c0660021415610ce357610ce08861114d565b97505b968b0296600091505b6040821215610da1576002601f198301810260010199508c0660011415610d1957610d168961114d565b98505b978b029784640100000000898b0205811515610d3157fe5b0696506005871015610d5e57838760058110610d4957fe5b1a60f860020a0260f860020a90049550610d63565b602e95505b8a5160f860020a8702908c908c908110610d7957fe5b906020010190600160f860020a031916908160001a9053506001998a01999190910190610cec565b8a517f2500000000000000000000000000000000000000000000000000000000000000908c908c908110610dd157fe5b906020010190600160f860020a031916908160001a9053508a516001909a01997f3000000000000000000000000000000000000000000000000000000000000000908c908c908110610e1f57fe5b906020010190600160f860020a031916908160001a9053508a516001909a01997f4100000000000000000000000000000000000000000000000000000000000000908c908c908110610e6d57fe5b906020010190600160f860020a031916908160001a9053506001998a01999290920191610c9e565b50989c9b505050505050505050505050565b610ec38383836020604051908101604052806000815250611164565b505050565b600a546000908210610ed957600080fd5b5090565b600090815260208190526040902054600160a060020a031690565b600081815260036020526040902054600160a060020a031680151561050457600080fd5b6000600160a060020a0382161515610f3357600080fd5b610f3c826113be565b92915050565b6702c68af0bb14000081565b600d8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561059b5780601f106105705761010080835404028352916020019161059b565b336000818152600760209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b61105985858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843750611164945050505050565b5050505050565b6000818152600360205260409020546060908290600160a060020a0316151561108857600080fd5b61109183610879565b9392505050565b6060610f3c33836113d9565b600160a060020a03918216600090815260076020908152604080832093909416825291909152205460ff1690565b600081815260036020526040902054600160a060020a03166110f3826116cb565b6110fd8183611715565b611107838361184e565b8183600160a060020a031682600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080821261115d575080610504565b5060000390565b60008281526003602052604081205481908490600160a060020a0316338114806111a45750600082815260066020526040902054600160a060020a031633145b806111d25750600160a060020a038116600090815260076020908152604080832033845290915290205460ff165b15156111dd57600080fd5b6000868152600360205260409020548690600160a060020a0316151561120257600080fd5b600087815260036020526040902054600160a060020a0390811695508916851461122b57600080fd5b600160a060020a038816151561124057600080fd5b61124a88886110d2565b611253886118d7565b156113b3576040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a038c81166024850152604484018b90526080606485019081528a5160848601528a51918d169463150b7a0294938f938e938e93909160a490910190602085019080838360005b838110156112eb5781810151838201526020016112d3565b50505050905090810190601f1680156113185780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561133a57600080fd5b505af115801561134e573d6000803e3d6000fd5b505050506040513d602081101561136457600080fd5b505193507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1984167f150b7a0200000000000000000000000000000000000000000000000000000000146113b357600080fd5b505050505050505050565b600160a060020a031660009081526008602052604090205490565b60606000808083600160a060020a03871615156113f557600080fd5b600a546102001161140557600080fd5b600a546000945060801161142b576702c68af0bb14000093503484111561142b57600080fd5b6000868152600560205260409020541561144457600080fd5b600a54600101600081815260208181526040808320805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038d16179055600482528083208a9055898352600582529182902083905581518082018a90528251808203830181529083019283905280519396509282918401908083835b602083106114dd5780518252601f1990920191602091820191016114be565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060019004600160a060020a03169150611522826118df565b6000848152600160205260409020805460ff191660ff9290921691909117905561154b83610879565b905086600160a060020a0316837fa197d2acc8f19f456842a59ba3699aa028ad72b616fd9c26679a516e7443683e836040518080602001828103825283818151815260200191508051906020019080838360005b838110156115b757818101518382015260200161159f565b50505050905090810190601f1680156115e45780820380516001836020036101000a031916815260200191505b509250505060405180910390a3600a80546001019055611604878461184e565b8334111561163d5760405133903486900380156108fc02916000818181858888f1935050505015801561163b573d6000803e3d6000fd5b505b6000841115611689576040517350990f09d4f0cb864b8e046e7edc749de410916b9085156108fc029086906000818181858888f19350505050158015611687573d6000803e3d6000fd5b505b6040518390600160a060020a038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a49695505050505050565b600081815260066020526040902054600160a060020a031615611712576000818152600660205260409020805473ffffffffffffffffffffffffffffffffffffffff191690555b50565b60008181526003602052604081205481908190600160a060020a0386811691161461173f57600080fd5b6000848152600360209081526040808320805473ffffffffffffffffffffffffffffffffffffffff191690556009825280832054600160a060020a038916845260089092529091205490935060001901915081831461181d57600160a060020a03851660009081526008602052604090208054839081106117bc57fe5b90600052602060002001549050806008600087600160a060020a0316600160a060020a03168152602001908152602001600020848154811015156117fc57fe5b60009182526020808320909101929092558281526009909152604090208390555b600160a060020a0385166000908152600860205260409020805490611846906000198301611989565b505050505050565b600081815260036020526040812054600160a060020a03161561187057600080fd5b5060008181526003602090815260408083208054600160a060020a0390961673ffffffffffffffffffffffffffffffffffffffff19909616861790559382526008815283822080546001810182559083528183208101849055928252600990529190912055565b6000903b1190565b6000605382068160148210156118f757506001611091565b602382101561190857506002611091565b603082101561191957506003611091565b603b82101561192a57506004611091565b604482101561193b57506005611091565b604982101561194c57506006611091565b604d82101561195d57506007611091565b605082101561196e57506008611091565b605282101561197f57506009611091565b50600a9392505050565b815481835581811115610ec357600083815260209020610ec391810190830161070191905b80821115610ed957600081556001016119ae5600a165627a7a7230582069662652e9ee7a2a892beb921ad5db634b246c877785a36b59009934b8c2c8d20029

Deployed Bytecode

0x60806040526004361061013d5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166301ffc9a78114610142578063031bd4c41461018d57806306fdde03146101b4578063081812fc1461023e578063095ea7b314610272578063180f0afd1461029857806318160ddd146102ad57806323b872dd146102c25780632f745c59146102ec5780632f99c6cc1461031057806339749064146103255780633b3041471461035357806342842e0e1461036b5780634f6ccce714610395578063510b5158146103ad5780636352211e146103c557806370a08231146103dd5780638d859f3e146103fe57806395d89b4114610413578063a22cb46514610428578063b88d4fde1461044e578063c87b56dd14610487578063dba5a7f51461049f578063e985e9c5146104aa575b600080fd5b34801561014e57600080fd5b506101797bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19600435166104d1565b604080519115158252519081900360200190f35b34801561019957600080fd5b506101a2610509565b60408051918252519081900360200190f35b3480156101c057600080fd5b506101c961050f565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102035781810151838201526020016101eb565b50505050905090810190601f1680156102305780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561024a57600080fd5b506102566004356105a5565b60408051600160a060020a039092168252519081900360200190f35b34801561027e57600080fd5b50610296600160a060020a03600435166024356105e7565b005b3480156102a457600080fd5b506101a26106f8565b3480156102b957600080fd5b506101a26106fd565b3480156102ce57600080fd5b50610296600160a060020a0360043581169060243516604435610704565b3480156102f857600080fd5b506101a2600160a060020a03600435166024356107f1565b34801561031c57600080fd5b5061025661084c565b34801561033157600080fd5b5061033d600435610864565b6040805160ff9092168252519081900360200190f35b34801561035f57600080fd5b506101c9600435610879565b34801561037757600080fd5b50610296600160a060020a0360043581169060243516604435610ea7565b3480156103a157600080fd5b506101a2600435610ec8565b3480156103b957600080fd5b50610256600435610edd565b3480156103d157600080fd5b50610256600435610ef8565b3480156103e957600080fd5b506101a2600160a060020a0360043516610f1c565b34801561040a57600080fd5b506101a2610f42565b34801561041f57600080fd5b506101c9610f4e565b34801561043457600080fd5b50610296600160a060020a03600435166024351515610faf565b34801561045a57600080fd5b50610296600160a060020a036004803582169160248035909116916044359160643590810191013561101d565b34801561049357600080fd5b506101c9600435611060565b6101c9600435611098565b3480156104b657600080fd5b50610179600160a060020a03600435811690602435166110a4565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19811660009081526002602052604090205460ff165b919050565b61020081565b600c8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561059b5780601f106105705761010080835404028352916020019161059b565b820191906000526020600020905b81548152906001019060200180831161057e57829003601f168201915b5050505050905090565b6000818152600360205260408120548290600160a060020a031615156105ca57600080fd5b5050600090815260066020526040902054600160a060020a031690565b6000818152600360205260408120548290600160a060020a0316338114806106325750600160a060020a038116600090815260076020908152604080832033845290915290205460ff165b151561063d57600080fd5b6000848152600360205260409020548490600160a060020a0316151561066257600080fd5b600085815260036020526040902054600160a060020a039081169450861684141561068c57600080fd5b600085815260066020526040808220805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038a811691821790925591518893918816917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b608081565b600a545b90565b6000818152600360205260408120548290600160a060020a0316338114806107425750600082815260066020526040902054600160a060020a031633145b806107705750600160a060020a038116600090815260076020908152604080832033845290915290205460ff165b151561077b57600080fd5b6000848152600360205260409020548490600160a060020a031615156107a057600080fd5b600085815260036020526040902054600160a060020a039081169450871684146107c957600080fd5b600160a060020a03861615156107de57600080fd5b6107e886866110d2565b50505050505050565b600160a060020a038216600090815260086020526040812054821061081557600080fd5b600160a060020a038316600090815260086020526040902080548390811061083957fe5b9060005260206000200154905092915050565b7350990f09d4f0cb864b8e046e7edc749de410916b81565b60009081526001602052604090205460ff1690565b60606000606060008060008060008060008060006060600460008f815260200190815260200160002054604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b602083106108f15780518252601f1990920191602091820191016108d2565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060019004600160a060020a03169b506040600301604002601e016040519080825280601f01601f191660200182016040528015610965578160200160208202803883390190505b509a50600099505b601e8a10156109f057600b8a815460018160011615610100020316600290048110151561099657fe5b8154600116156109b55790600052602060002090602091828204019190065b9054901a60f860020a028b8b8151811015156109cd57fe5b906020010190600160f860020a031916908160001a90535060019099019861096d565b60008e8152600160205260408120549099508998508897508796506005600b8e0601955060ff161515610a2257600080fd5b60008e81526001602081905260409091205460ff161415610a65577f2e582f5c2e0000000000000000000000000000000000000000000000000000009350610c99565b60008e81526001602052604090205460ff1660021415610aa7577f2e2b2d7c2e0000000000000000000000000000000000000000000000000000009350610c99565b60008e81526001602052604090205460ff1660031415610ae9577f2e2f5c2e2e0000000000000000000000000000000000000000000000000000009350610c99565b60008e81526001602052604090205460ff1660041415610b2b577f2e5c7c2d2f0000000000000000000000000000000000000000000000000000009350610c99565b60008e81526001602052604090205460ff1660051415610b6d577f2e4f7c2d2e0000000000000000000000000000000000000000000000000000009350610c99565b60008e81526001602052604090205460ff1660061415610baf577f2e5c5c2e2e0000000000000000000000000000000000000000000000000000009350610c99565b60008e81526001602052604090205460ff1660071415610bf1577f2e237c2d2b0000000000000000000000000000000000000000000000000000009350610c99565b60008e81526001602052604090205460ff1660081415610c33577f2e4f4f2e2e0000000000000000000000000000000000000000000000000000009350610c99565b60008e81526001602052604090205460ff1660091415610c75577f2e232e2e2e0000000000000000000000000000000000000000000000000000009350610c99565b7f2e234f2e2e00000000000000000000000000000000000000000000000000000093505b600092505b6040831215610e95576001601f19840160020201975060038c0660011415610ccb57876000039750610ce3565b60038c0660021415610ce357610ce08861114d565b97505b968b0296600091505b6040821215610da1576002601f198301810260010199508c0660011415610d1957610d168961114d565b98505b978b029784640100000000898b0205811515610d3157fe5b0696506005871015610d5e57838760058110610d4957fe5b1a60f860020a0260f860020a90049550610d63565b602e95505b8a5160f860020a8702908c908c908110610d7957fe5b906020010190600160f860020a031916908160001a9053506001998a01999190910190610cec565b8a517f2500000000000000000000000000000000000000000000000000000000000000908c908c908110610dd157fe5b906020010190600160f860020a031916908160001a9053508a516001909a01997f3000000000000000000000000000000000000000000000000000000000000000908c908c908110610e1f57fe5b906020010190600160f860020a031916908160001a9053508a516001909a01997f4100000000000000000000000000000000000000000000000000000000000000908c908c908110610e6d57fe5b906020010190600160f860020a031916908160001a9053506001998a01999290920191610c9e565b50989c9b505050505050505050505050565b610ec38383836020604051908101604052806000815250611164565b505050565b600a546000908210610ed957600080fd5b5090565b600090815260208190526040902054600160a060020a031690565b600081815260036020526040902054600160a060020a031680151561050457600080fd5b6000600160a060020a0382161515610f3357600080fd5b610f3c826113be565b92915050565b6702c68af0bb14000081565b600d8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561059b5780601f106105705761010080835404028352916020019161059b565b336000818152600760209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b61105985858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843750611164945050505050565b5050505050565b6000818152600360205260409020546060908290600160a060020a0316151561108857600080fd5b61109183610879565b9392505050565b6060610f3c33836113d9565b600160a060020a03918216600090815260076020908152604080832093909416825291909152205460ff1690565b600081815260036020526040902054600160a060020a03166110f3826116cb565b6110fd8183611715565b611107838361184e565b8183600160a060020a031682600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080821261115d575080610504565b5060000390565b60008281526003602052604081205481908490600160a060020a0316338114806111a45750600082815260066020526040902054600160a060020a031633145b806111d25750600160a060020a038116600090815260076020908152604080832033845290915290205460ff165b15156111dd57600080fd5b6000868152600360205260409020548690600160a060020a0316151561120257600080fd5b600087815260036020526040902054600160a060020a0390811695508916851461122b57600080fd5b600160a060020a038816151561124057600080fd5b61124a88886110d2565b611253886118d7565b156113b3576040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a038c81166024850152604484018b90526080606485019081528a5160848601528a51918d169463150b7a0294938f938e938e93909160a490910190602085019080838360005b838110156112eb5781810151838201526020016112d3565b50505050905090810190601f1680156113185780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561133a57600080fd5b505af115801561134e573d6000803e3d6000fd5b505050506040513d602081101561136457600080fd5b505193507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1984167f150b7a0200000000000000000000000000000000000000000000000000000000146113b357600080fd5b505050505050505050565b600160a060020a031660009081526008602052604090205490565b60606000808083600160a060020a03871615156113f557600080fd5b600a546102001161140557600080fd5b600a546000945060801161142b576702c68af0bb14000093503484111561142b57600080fd5b6000868152600560205260409020541561144457600080fd5b600a54600101600081815260208181526040808320805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038d16179055600482528083208a9055898352600582529182902083905581518082018a90528251808203830181529083019283905280519396509282918401908083835b602083106114dd5780518252601f1990920191602091820191016114be565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060019004600160a060020a03169150611522826118df565b6000848152600160205260409020805460ff191660ff9290921691909117905561154b83610879565b905086600160a060020a0316837fa197d2acc8f19f456842a59ba3699aa028ad72b616fd9c26679a516e7443683e836040518080602001828103825283818151815260200191508051906020019080838360005b838110156115b757818101518382015260200161159f565b50505050905090810190601f1680156115e45780820380516001836020036101000a031916815260200191505b509250505060405180910390a3600a80546001019055611604878461184e565b8334111561163d5760405133903486900380156108fc02916000818181858888f1935050505015801561163b573d6000803e3d6000fd5b505b6000841115611689576040517350990f09d4f0cb864b8e046e7edc749de410916b9085156108fc029086906000818181858888f19350505050158015611687573d6000803e3d6000fd5b505b6040518390600160a060020a038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a49695505050505050565b600081815260066020526040902054600160a060020a031615611712576000818152600660205260409020805473ffffffffffffffffffffffffffffffffffffffff191690555b50565b60008181526003602052604081205481908190600160a060020a0386811691161461173f57600080fd5b6000848152600360209081526040808320805473ffffffffffffffffffffffffffffffffffffffff191690556009825280832054600160a060020a038916845260089092529091205490935060001901915081831461181d57600160a060020a03851660009081526008602052604090208054839081106117bc57fe5b90600052602060002001549050806008600087600160a060020a0316600160a060020a03168152602001908152602001600020848154811015156117fc57fe5b60009182526020808320909101929092558281526009909152604090208390555b600160a060020a0385166000908152600860205260409020805490611846906000198301611989565b505050505050565b600081815260036020526040812054600160a060020a03161561187057600080fd5b5060008181526003602090815260408083208054600160a060020a0390961673ffffffffffffffffffffffffffffffffffffffff19909616861790559382526008815283822080546001810182559083528183208101849055928252600990529190912055565b6000903b1190565b6000605382068160148210156118f757506001611091565b602382101561190857506002611091565b603082101561191957506003611091565b603b82101561192a57506004611091565b604482101561193b57506005611091565b604982101561194c57506006611091565b604d82101561195d57506007611091565b605082101561196e57506008611091565b605282101561197f57506009611091565b50600a9392505050565b815481835581811115610ec357600083815260209020610ec391810190830161070191905b80821115610ed957600081556001016119ae5600a165627a7a7230582069662652e9ee7a2a892beb921ad5db634b246c877785a36b59009934b8c2c8d20029

Swarm Source

bzzr://69662652e9ee7a2a892beb921ad5db634b246c877785a36b59009934b8c2c8d2

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

OVERVIEW

Autoglyphs are the “on-chain” generative art on the Ethereum blockchain.

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.