ETH Price: $3,393.49 (+1.68%)
Gas: 6 Gwei

Token

CheckTheChain (CTC)
 

Overview

Max Total Supply

286 CTC

Holders

145

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
Sybil Delegate: transmissions11
Balance
1 CTC
0x7ed52863829ab99354f3a0503a622e82acd5f7d3
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CheckTheChain

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion
File 1 of 8 : Owned.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Simple single owner authorization mixin.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Owned.sol)
abstract contract Owned {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event OwnershipTransferred(address indexed user, address indexed newOwner);

    /*//////////////////////////////////////////////////////////////
                            OWNERSHIP STORAGE
    //////////////////////////////////////////////////////////////*/

    address public owner;

    modifier onlyOwner() virtual {
        require(msg.sender == owner, "UNAUTHORIZED");

        _;
    }

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(address _owner) {
        owner = _owner;

        emit OwnershipTransferred(address(0), _owner);
    }

    /*//////////////////////////////////////////////////////////////
                             OWNERSHIP LOGIC
    //////////////////////////////////////////////////////////////*/

    function transferOwnership(address newOwner) public virtual onlyOwner {
        owner = newOwner;

        emit OwnershipTransferred(msg.sender, newOwner);
    }
}

File 2 of 8 : ERC721.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern, minimalist, and gas efficient ERC-721 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 indexed id);

    event Approval(address indexed owner, address indexed spender, uint256 indexed id);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /*//////////////////////////////////////////////////////////////
                         METADATA STORAGE/LOGIC
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    function tokenURI(uint256 id) public view virtual returns (string memory);

    /*//////////////////////////////////////////////////////////////
                      ERC721 BALANCE/OWNER STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(uint256 => address) internal _ownerOf;

    mapping(address => uint256) internal _balanceOf;

    function ownerOf(uint256 id) public view virtual returns (address owner) {
        require((owner = _ownerOf[id]) != address(0), "NOT_MINTED");
    }

    function balanceOf(address owner) public view virtual returns (uint256) {
        require(owner != address(0), "ZERO_ADDRESS");

        return _balanceOf[owner];
    }

    /*//////////////////////////////////////////////////////////////
                         ERC721 APPROVAL STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(uint256 => address) public getApproved;

    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(string memory _name, string memory _symbol) {
        name = _name;
        symbol = _symbol;
    }

    /*//////////////////////////////////////////////////////////////
                              ERC721 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 id) public virtual {
        address owner = _ownerOf[id];

        require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED");

        getApproved[id] = spender;

        emit Approval(owner, spender, id);
    }

    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function transferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        require(from == _ownerOf[id], "WRONG_FROM");

        require(to != address(0), "INVALID_RECIPIENT");

        require(
            msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id],
            "NOT_AUTHORIZED"
        );

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            _balanceOf[from]--;

            _balanceOf[to]++;
        }

        _ownerOf[id] = to;

        delete getApproved[id];

        emit Transfer(from, to, id);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes calldata data
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    /*//////////////////////////////////////////////////////////////
                              ERC165 LOGIC
    //////////////////////////////////////////////////////////////*/

    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
            interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 id) internal virtual {
        require(to != address(0), "INVALID_RECIPIENT");

        require(_ownerOf[id] == address(0), "ALREADY_MINTED");

        // Counter overflow is incredibly unrealistic.
        unchecked {
            _balanceOf[to]++;
        }

        _ownerOf[id] = to;

        emit Transfer(address(0), to, id);
    }

    function _burn(uint256 id) internal virtual {
        address owner = _ownerOf[id];

        require(owner != address(0), "NOT_MINTED");

        // Ownership check above ensures no underflow.
        unchecked {
            _balanceOf[owner]--;
        }

        delete _ownerOf[id];

        delete getApproved[id];

        emit Transfer(owner, address(0), id);
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL SAFE MINT LOGIC
    //////////////////////////////////////////////////////////////*/

    function _safeMint(address to, uint256 id) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function _safeMint(
        address to,
        uint256 id,
        bytes memory data
    ) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }
}

/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721TokenReceiver {
    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external virtual returns (bytes4) {
        return ERC721TokenReceiver.onERC721Received.selector;
    }
}

File 3 of 8 : LibString.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;

/// @notice Efficient library for creating string representations of integers.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/LibString.sol)
/// @author Modified from Solady (https://github.com/Vectorized/solady/blob/main/src/utils/LibString.sol)
library LibString {
    function toString(int256 value) internal pure returns (string memory str) {
        if (value >= 0) return toString(uint256(value));

        unchecked {
            str = toString(uint256(-value));

            /// @solidity memory-safe-assembly
            assembly {
                // Note: This is only safe because we over-allocate memory
                // and write the string from right to left in toString(uint256),
                // and thus can be sure that sub(str, 1) is an unused memory location.

                let length := mload(str) // Load the string length.
                // Put the - character at the start of the string contents.
                mstore(str, 45) // 45 is the ASCII code for the - character.
                str := sub(str, 1) // Move back the string pointer by a byte.
                mstore(str, add(length, 1)) // Update the string length.
            }
        }
    }

    function toString(uint256 value) internal pure returns (string memory str) {
        /// @solidity memory-safe-assembly
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but we allocate 160 bytes
            // to keep the free memory pointer word aligned. We'll need 1 word for the length, 1 word for the
            // trailing zeros padding, and 3 other words for a max of 78 digits. In total: 5 * 32 = 160 bytes.
            let newFreeMemoryPointer := add(mload(0x40), 160)

            // Update the free memory pointer to avoid overriding our string.
            mstore(0x40, newFreeMemoryPointer)

            // Assign str to the end of the zone of newly allocated memory.
            str := sub(newFreeMemoryPointer, 32)

            // Clean the last word of memory it may not be overwritten.
            mstore(str, 0)

            // Cache the end of the memory to calculate the length later.
            let end := str

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                // Move the pointer 1 byte to the left.
                str := sub(str, 1)

                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))

                // Keep dividing temp until zero.
                temp := div(temp, 10)

                 // prettier-ignore
                if iszero(temp) { break }
            }

            // Compute and cache the final total length of the string.
            let length := sub(end, str)

            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 32)

            // Store the string's length at the start of memory allocated for our string.
            mstore(str, length)
        }
    }
}

File 4 of 8 : CheckTheChain.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

import {Owned} from "solmate/auth/Owned.sol";
import {ERC721} from "solmate/tokens/ERC721.sol";
import {LibString} from "solmate/utils/LibString.sol";

import "@/contracts/utils/ColormapDataConstants.sol";
import {IColormapRegistry} from "@/contracts/interfaces/IColormapRegistry.sol";
import {Base64} from "@/contracts/utils/Base64.sol";

contract CheckTheChain is ERC721, Owned {
    // -------------------------------------------------------------------------
    // Constants
    // -------------------------------------------------------------------------

    /// @notice The minting period.
    uint256 constant MINT_LENGTH = 5 days;

    /// @notice Mint fee.
    uint256 constant MINT_FEE = 0.0048 ether;

    /// @notice Salt used to compute the seed in {CheckTheChain-tokenURI}.
    bytes32 constant SALT = bytes32("CheckTheChain");

    /// @notice The owner address.
    address constant OWNER_ADDRESS = 0xA85572Cd96f1643458f17340b6f0D6549Af482F5;

    // -------------------------------------------------------------------------
    // Storage
    // -------------------------------------------------------------------------

    /// @notice The start of the minting period.
    uint256 immutable mintStart;

    /// @notice The colormap registry.
    IColormapRegistry immutable colormapRegistry;

    /// @notice The total number of tokens.
    uint256 public totalSupply;

    // -------------------------------------------------------------------------
    // Constructor + Mint
    // -------------------------------------------------------------------------

    /// @notice Deploys the contract.
    constructor() ERC721("CheckTheChain", "CTC") Owned(OWNER_ADDRESS) {
        mintStart = block.timestamp;

        colormapRegistry = IColormapRegistry(
            0x0000000012883D1da628e31c0FE52e35DcF95D50
        );

        // Mint 25 to the owner.
        for (uint256 i = 1; i < 26; ) {
            _mint(OWNER_ADDRESS, i);
            unchecked {
                ++i;
            }
        }
        totalSupply = 25;
    }

    /// @notice Mints a token to the sender.
    function mint() external payable {
        unchecked {
            if (block.timestamp > mintStart + MINT_LENGTH) {
                revert("MINTING_NOT_STARTED");
            }
            if (msg.value < MINT_FEE) {
                revert("INSUFFICIENT_FEE");
            }

            _mint(msg.sender, ++totalSupply);
        }
    }

    /// @notice Withdraw contract funds to the contract owner `owner`.
    function withdraw() external onlyOwner {
        (bool success, ) = payable(owner).call{value: address(this).balance}(
            ""
        );
        require(success);
    }

    // -------------------------------------------------------------------------
    // ERC721Metadata
    // -------------------------------------------------------------------------

    /// @inheritdoc ERC721
    function tokenURI(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(_ownerOf[_tokenId] != address(0), "NOT_MINTED");

        uint256 seed = uint256(keccak256(abi.encodePacked(_tokenId, SALT)));

        (
            bytes32 colormapHash,
            string memory colormapName,
            bool isDark
        ) = _getColormap(seed % 18);

        return
            string.concat(
                "data:application/json;base64,",
                Base64.encode(
                    abi.encodePacked(
                        '{"name":"Check the Chain #',
                        LibString.toString(_tokenId),
                        '","description":"On-chain checks, inspired by VV.",',
                        '"image_data":"data:image/svg+xml;base64,',
                        Base64.encode(
                            abi.encodePacked(
                                _renderSvg(seed, colormapHash, isDark)
                            )
                        ),
                        '","attributes":[{"trait_type":"Colormap","value":"',
                        colormapName,
                        '"}]}'
                    )
                )
            );
    }

    // -------------------------------------------------------------------------
    // Helper Functions
    // -------------------------------------------------------------------------

    function _renderSvg(
        uint256 _seed,
        bytes32 _colormapHash,
        bool _isDark
    ) internal view returns (string memory) {
        string memory svgContents;

        uint256 i;
        while (_seed != 0 && i < 80) {
            // Position along the colormap.
            uint8 position = uint8(1 << (_seed & 7));
            string memory color = colormapRegistry.getValueAsHexString(
                _colormapHash,
                position
            );

            unchecked {
                {
                    svgContents = string.concat(
                        svgContents,
                        '<g transform="translate(',
                        LibString.toString(uint256(196 + (i & 7) * 40)),
                        " ",
                        LibString.toString(uint256(160 + (i >> 3) * 40)),
                        ')"><rect x="-20" y="-20" width="40" height="40" stroke="#',
                        _isDark ? "E6E6E6" : "191919",
                        '" fill="#',
                        _isDark ? "F5F5F5" : "111111",
                        '"/><circle r="4" fill="#',
                        color,
                        '"/><circle cx="6" r="4" fill="#',
                        color,
                        '"/><circle cx="-6" r="4" fill="#',
                        color
                    );
                }
                {
                    svgContents = string.concat(
                        svgContents,
                        '"/><circle cy="-6" r="4" fill="#',
                        color,
                        '"/><circle cy="6" r="4" fill="#',
                        color,
                        '"/><circle cx="4.243" cy="4.243" r="4" fill="#',
                        color,
                        '"/><circle cx="4.243" cy="-4.243" r="4" fill="#',
                        color,
                        '"/><circle cx="-4.243" cy="4.243" r="4" fill="#',
                        color,
                        '"/><circle cx="-4.243" cy="-4.243" r="4" fill="#',
                        color,
                        '"/><path d="m-.6 3.856 4.56-6.844c.566-.846-.75-1.724-1.316-.878L-1.38 2.177-2.75.809c-.718-.722-1.837.396-1.117 1.116l2.17 2.15a.784.784 0 0 0 .879-.001.767.767 0 0 0 .218-.218Z" fill="#',
                        _isDark ? "F5F5F5" : "111111",
                        '"/></g>'
                    );
                }
                _seed >>= 3;
                ++i;
            }
        }

        return
            string.concat(
                '<svg width="680" height="680" viewBox="0 0 680 680" fill="none" xmlns="http://www.w3.org/2000/svg">',
                '<path xmlns="http://www.w3.org/2000/svg" d="M680 0H0V680H680V0Z" fill="',
                _isDark ? "white" : "black",
                '"/>',
                svgContents,
                "</svg>"
            );
    }

    function _getColormap(uint256 _index)
        internal
        pure
        returns (
            bytes32,
            string memory,
            bool
        )
    {
        if (_index < 9) {
            if (_index < 4) {
                if (_index < 2) {
                    if (_index == 0) {
                        return (
                            GNUPLOT_COLORMAP_HASH,
                            GNUPLOT_NAME,
                            GNUPLOT_IS_DARK
                        );
                    }
                    return (CMRMAP_COLORMAP_HASH, CMRMAP_NAME, CMRMAP_IS_DARK);
                }
                if (_index == 2) {
                    return (WISTIA_COLORMAP_HASH, WISTIA_NAME, WISTIA_IS_DARK);
                }
                return (AUTUMN_COLORMAP_HASH, AUTUMN_NAME, AUTUMN_IS_DARK);
            }
            if (_index < 6) {
                if (_index == 4) {
                    return (BINARY_COLORMAP_HASH, BINARY_NAME, BINARY_IS_DARK);
                }
                return (BONE_COLORMAP_HASH, BONE_NAME, BONE_IS_DARK);
            }
            if (_index < 7) {
                if (_index == 6) {
                    return (COOL_COLORMAP_HASH, COOL_NAME, COOL_IS_DARK);
                }
                return (COPPER_COLORMAP_HASH, COPPER_NAME, COPPER_IS_DARK);
            }
            return (
                GIST_RAINBOW_COLORMAP_HASH,
                GIST_RAINBOW_NAME,
                GIST_RAINBOW_IS_DARK
            );
        }
        if (_index < 13) {
            if (_index < 11) {
                if (_index == 9) {
                    return (
                        GIST_STERN_COLORMAP_HASH,
                        GIST_STERN_NAME,
                        GIST_STERN_IS_DARK
                    );
                }
                return (GRAY_COLORMAP_HASH, GRAY_NAME, GRAY_IS_DARK);
            }
            if (_index == 11) {
                return (HOT_COLORMAP_HASH, HOT_NAME, HOT_IS_DARK);
            }
            return (HSV_COLORMAP_HASH, HSV_NAME, HSV_IS_DARK);
        }
        if (_index < 15) {
            if (_index == 13) {
                return (JET_COLORMAP_HASH, JET_NAME, JET_IS_DARK);
            }
            return (SPRING_COLORMAP_HASH, SPRING_NAME, SPRING_IS_DARK);
        }
        if (_index < 17) {
            if (_index == 15) {
                return (SUMMER_COLORMAP_HASH, SUMMER_NAME, SUMMER_IS_DARK);
            }
            return (TERRAIN_COLORMAP_HASH, TERRAIN_NAME, TERRAIN_IS_DARK);
        }
        return (WINTER_COLORMAP_HASH, WINTER_NAME, WINTER_IS_DARK);
    }
}

File 5 of 8 : IColormapRegistry.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

import {IPaletteGenerator} from "@/contracts/interfaces/IPaletteGenerator.sol";

/// @title The interface for the colormap registry.
/// @author fiveoutofnine
/// @dev A colormap may be defined in 2 ways: (1) via segment data and (2) via a
/// ``palette generator.''
///     1. via segment data
///     2. or via a palette generator ({IPaletteGenerator}).
/// Segment data contains 1 `uint256` each for red, green, and blue describing
/// their intensity values along the colormap. Each `uint256` contains 24-bit
/// words bitpacked together with the following structure (bits are
/// right-indexed):
///     | Bits      | Meaning                                              |
///     | --------- | ---------------------------------------------------- |
///     | `23 - 16` | Position in the colormap the segment begins from     |
///     | `15 - 08` | Intensity of R, G, or B the previous segment ends at |
///     | `07 - 00` | Intensity of R, G, or B the next segment starts at   |
/// Given some position, the output will be computed via linear interpolations
/// on the segment data for R, G, and B. A maximum of 10 of these segments fit
/// within 256 bits, so up to 9 segments can be defined. If you need more
/// granularity or a nonlinear palette function, you may implement
/// {IPaletteGenerator} and define a colormap with that.
interface IColormapRegistry {
    // -------------------------------------------------------------------------
    // Errors
    // -------------------------------------------------------------------------

    /// @notice Emitted when a colormap already exists.
    /// @param _colormapHash Hash of the colormap's definition.
    error ColormapAlreadyExists(bytes32 _colormapHash);

    /// @notice Emitted when a colormap does not exist.
    /// @param _colormapHash Hash of the colormap's definition.
    error ColormapDoesNotExist(bytes32 _colormapHash);

    /// @notice Emitted when a segment data used to define a colormap does not
    /// follow the representation outlined in {IColormapRegistry}.
    /// @param _segmentData Segment data for 1 of R, G, or B. See
    /// {IColormapRegistry} for its representation.
    error SegmentDataInvalid(uint256 _segmentData);

    // -------------------------------------------------------------------------
    // Structs
    // -------------------------------------------------------------------------

    /// @notice Segment data that defines a colormap when read via piece-wise
    /// linear interpolation.
    /// @dev Each param contains 24-bit words, so each one may contain at most
    /// 9 (24*10 - 1) segments. See {IColormapRegistry} for how the segment data
    /// should be structured.
    /// @param r Segment data for red's color value along the colormap.
    /// @param g Segment data for green's color value along the colormap.
    /// @param b Segment data for blue's color value along the colormap.
    struct SegmentData {
        uint256 r;
        uint256 g;
        uint256 b;
    }

    // -------------------------------------------------------------------------
    // Events
    // -------------------------------------------------------------------------

    /// @notice Emitted when a colormap is registered via a palette generator
    /// function.
    /// @param _hash Hash of `_paletteGenerator`.
    /// @param _paletteGenerator Instance of {IPaletteGenerator} for the
    /// colormap.
    event RegisterColormap(bytes32 _hash, IPaletteGenerator _paletteGenerator);

    /// @notice Emitted when a colormap is registered via segment data.
    /// @param _hash Hash of `_segmentData`.
    /// @param _segmentData Segment data defining the colormap.
    event RegisterColormap(bytes32 _hash, SegmentData _segmentData);

    // -------------------------------------------------------------------------
    // Storage
    // -------------------------------------------------------------------------

    /// @param _colormapHash Hash of the colormap's definition (segment data).
    /// @return uint256 Segment data for red's color value along the colormap.
    /// @return uint256 Segment data for green's color value along the colormap.
    /// @return uint256 Segment data for blue's color value along the colormap.
    function segments(bytes32 _colormapHash)
        external
        view
        returns (
            uint256,
            uint256,
            uint256
        );

    /// @param _colormapHash Hash of the colormap's definition (palette
    /// generator).
    /// @return IPaletteGenerator Instance of {IPaletteGenerator} for the
    /// colormap.
    function paletteGenerators(bytes32 _colormapHash)
        external
        view
        returns (IPaletteGenerator);

    // -------------------------------------------------------------------------
    // Actions
    // -------------------------------------------------------------------------

    /// @notice Register a colormap with a palette generator.
    /// @param _paletteGenerator Instance of {IPaletteGenerator} for the
    /// colormap.
    function register(IPaletteGenerator _paletteGenerator) external;

    /// @notice Register a colormap with segment data that will be read via
    /// piece-wise linear interpolation.
    /// @dev See {IColormapRegistry} for how the segment data should be
    /// structured.
    /// @param _segmentData Segment data defining the colormap.
    function register(SegmentData memory _segmentData) external;

    // -------------------------------------------------------------------------
    // View
    // -------------------------------------------------------------------------

    /// @notice Get the red, green, and blue color values of a color in a
    /// colormap at some position.
    /// @dev Each color value will be returned as a 18 decimal fixed-point
    /// number in [0, 1]. Note that the function *will not* revert if
    /// `_position` is an invalid input (i.e. greater than 1e18). This
    /// responsibility is left to the implementation of {IPaletteGenerator}s.
    /// @param _colormapHash Hash of the colormap's definition.
    /// @param _position 18 decimal fixed-point number in [0, 1] representing
    /// the position in the colormap (i.e. 0 being min, and 1 being max).
    /// @return uint256 Intensity of red in that color at the position
    /// `_position`.
    /// @return uint256 Intensity of green in that color at the position
    /// `_position`.
    /// @return uint256 Intensity of blue in that color at the position
    /// `_position`.
    function getValue(bytes32 _colormapHash, uint256 _position)
        external
        view
        returns (
            uint256,
            uint256,
            uint256
        );

    /// @notice Get the red, green, and blue color values of a color in a
    /// colormap at some position.
    /// @dev Each color value will be returned as a `uint8` number in [0, 255].
    /// @param _colormapHash Hash of the colormap's definition.
    /// @param _position Position in the colormap (i.e. 0 being min, and 255
    /// being max).
    /// @return uint8 Intensity of red in that color at the position
    /// `_position`.
    /// @return uint8 Intensity of green in that color at the position
    /// `_position`.
    /// @return uint8 Intensity of blue in that color at the position
    /// `_position`.
    function getValueAsUint8(bytes32 _colormapHash, uint8 _position)
        external
        view
        returns (
            uint8,
            uint8,
            uint8
        );

    /// @notice Get the hexstring for a color in a colormap at some position.
    /// @param _colormapHash Hash of the colormap's definition.
    /// @param _position Position in the colormap (i.e. 0 being min, and 255
    /// being max).
    /// @return string Hexstring excluding ``#'' (e.g. `007CFF`) of the color
    /// at the position `_position`.
    function getValueAsHexString(bytes32 _colormapHash, uint8 _position)
        external
        view
        returns (string memory);
}

File 6 of 8 : IPaletteGenerator.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

/// @title The interface for a palette generator.
/// @author fiveoutofnine
/// @dev `IPaletteGenerator` contains generator functions for a color's red,
/// green, and blue color values. Each of these functions is intended to take in
/// a 18 decimal fixed-point number in [0, 1] representing the position in the
/// colormap and return the corresponding 18 decimal fixed-point number in
/// [0, 1] representing the value of each respective color.
interface IPaletteGenerator {
    // -------------------------------------------------------------------------
    // Errors
    // -------------------------------------------------------------------------

    /// @notice Reverts if the position is not a valid input.
    /// @dev The position is not a valid input if it is greater than 1e18.
    /// @param _position Position in the colormap.
    error InvalidPosition(uint256 _position);

    // -------------------------------------------------------------------------
    // Generators
    // -------------------------------------------------------------------------

    /// @notice Computes the intensity of red of the palette at some position.
    /// @dev The function should revert if `_position` is not a valid input
    /// (i.e. greater than 1e18). Also, the return value for all inputs must be
    /// a 18 decimal.
    /// @param _position Position in the colormap.
    /// @return uint256 Intensity of red in that color at the position
    /// `_position`.
    function r(uint256 _position) external pure returns (uint256);

    /// @notice Computes the intensity of green of the palette at some position.
    /// @dev The function should revert if `_position` is not a valid input
    /// (i.e. greater than 1e18). Also, the return value for all inputs must be
    /// a 18 decimal.
    /// @param _position Position in the colormap.
    /// @return uint256 Intensity of green in that color at the position
    /// `_position`.
    function g(uint256 _position) external pure returns (uint256);

    /// @notice Computes the intensity of blue of the palette at some position.
    /// @dev The function should revert if `_position` is not a valid input
    /// (i.e. greater than 1e18). Also, the return value for all inputs must be
    /// a 18 decimal.
    /// @param _position Position in the colormap.
    /// @return uint256 Intensity of blue in that color at the position
    /// `_position`.
    function b(uint256 _position) external pure returns (uint256);
}

File 7 of 8 : Base64.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

/// @title Base64
/// @author Brecht Devos - <[email protected]>
/// @notice Provides a function for encoding some bytes in base64
library Base64 {
    string internal constant TABLE =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678"
        "9+/";

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return "";
        string memory table = TABLE;
        uint256 encodedLength = ((data.length + 2) / 3) << 2;
        string memory result = new string(encodedLength + 0x20);

        assembly {
            mstore(result, encodedLength)
            let tablePtr := add(table, 1)
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))
            let resultPtr := add(result, 0x20)

            for {

            } lt(dataPtr, endPtr) {

            } {
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)
                mstore(
                    resultPtr,
                    shl(0xF8, mload(add(tablePtr, and(shr(0x12, input), 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
                mstore(
                    resultPtr,
                    shl(0xF8, mload(add(tablePtr, and(shr(0xC, input), 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
                mstore(
                    resultPtr,
                    shl(0xF8, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
                mstore(
                    resultPtr,
                    shl(0xF8, mload(add(tablePtr, and(input, 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
            }
            switch mod(mload(data), 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(0xF0, 0x3D3D))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(0xF8, 0x3D))
            }
        }

        return result;
    }
}

File 8 of 8 : ColormapDataConstants.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

bytes32 constant GNUPLOT_COLORMAP_HASH = 0xfd29b65966772202ffdb08f653439b30c849f91409915665d99dbfa5e5dab938;
string constant GNUPLOT_NAME = "gnuplot";
bool constant GNUPLOT_IS_DARK = true;

bytes32 constant CMRMAP_COLORMAP_HASH = 0x850ce48e7291439b1e41d21fc3f75dddd97580a4ff94aa9ebdd2bcbd423ea1e8;
string constant CMRMAP_NAME = "CMRmap";
bool constant CMRMAP_IS_DARK = true;

bytes32 constant WISTIA_COLORMAP_HASH = 0x4f5e8ea8862eff315c110b682ee070b459ba8983a7575c9a9c4c25007039109d;
string constant WISTIA_NAME = "Wistia";
bool constant WISTIA_IS_DARK = false;

bytes32 constant AUTUMN_COLORMAP_HASH = 0xf2e92189cb6903b98d854cd74ece6c3fafdb2d3472828a950633fdaa52e05032;
string constant AUTUMN_NAME = "autumn";
bool constant AUTUMN_IS_DARK = false;

bytes32 constant BINARY_COLORMAP_HASH = 0xa33e6c7c5627ecabfd54c4d85f9bf04815fe89a91379fcf56ccd8177e086db21;
string constant BINARY_NAME = "binary";
bool constant BINARY_IS_DARK = false;

bytes32 constant BONE_COLORMAP_HASH = 0xaa84b30df806b46f859a413cb036bc91466307aec5903fc4635c00a421f25d5c;
string constant BONE_NAME = "bone";
bool constant BONE_IS_DARK = true;

bytes32 constant COOL_COLORMAP_HASH = 0x864a6ee98b9b21ac0291523750d637250405c24a6575e1f75cfbd7209a810ce6;
string constant COOL_NAME = "cool";
bool constant COOL_IS_DARK = false;

bytes32 constant COPPER_COLORMAP_HASH = 0xfd60cd3811f002814944a7d36167b7c9436187a389f2ee476dc883e37dc76bd2;
string constant COPPER_NAME = "copper";
bool constant COPPER_IS_DARK = true;

bytes32 constant GIST_RAINBOW_COLORMAP_HASH = 0xa8309447f8bd3b5e5e88a0abc05080b7682e4456c388b8636d45f5abb2ad2587;
string constant GIST_RAINBOW_NAME = "gist_rainbow";
bool constant GIST_RAINBOW_IS_DARK = false;

bytes32 constant GIST_STERN_COLORMAP_HASH = 0x3be719b0c342797212c4cb33fde865ed9cbe486eb67176265bc0869b54dee925;
string constant GIST_STERN_NAME = "gist_stern";
bool constant GIST_STERN_IS_DARK = true;

bytes32 constant GRAY_COLORMAP_HASH = 0xca0da6b6309ed2117508207d68a59a18ccaf54ba9aa329f4f60a77481fcf2027;
string constant GRAY_NAME = "gray";
bool constant GRAY_IS_DARK = true;

bytes32 constant HOT_COLORMAP_HASH = 0x5ccb29670bb9de0e3911d8e47bde627b0e3640e49c3d6a88d51ff699160dfbe1;
string constant HOT_NAME = "hot";
bool constant HOT_IS_DARK = true;

bytes32 constant HSV_COLORMAP_HASH = 0x3de8f27f386dab3dbab473f3cc16870a717fe5692b4f6a45003d175c559dfcba;
string constant HSV_NAME = "hsv";
bool constant HSV_IS_DARK = false;

bytes32 constant JET_COLORMAP_HASH = 0x026736ef8439ebcf8e7b8006bf8cb7482ced84d71b900407a9ed63e1b7bfe234;
string constant JET_NAME = "jet";
bool constant JET_IS_DARK = true;

bytes32 constant SPRING_COLORMAP_HASH = 0xc1806ea961848ac00c1f20aa0611529da522a7bd125a3036fe4641b07ee5c61c;
string constant SPRING_NAME = "spring";
bool constant SPRING_IS_DARK = false;

bytes32 constant SUMMER_COLORMAP_HASH = 0x87970b686eb726750ec792d49da173387a567764d691294d764e53439359c436;
string constant SUMMER_NAME = "summer";
bool constant SUMMER_IS_DARK = false;

bytes32 constant TERRAIN_COLORMAP_HASH = 0xaa6277ab923279cf59d78b9b5b7fb5089c90802c353489571fca3c138056fb1b;
string constant TERRAIN_NAME = "terrain";
bool constant TERRAIN_IS_DARK = true;

bytes32 constant WINTER_COLORMAP_HASH = 0xdc1cecffc00e2f3196daaf53c27e53e6052a86dc875adb91607824d62469b2bf;
string constant WINTER_NAME = "winter";
bool constant WINTER_IS_DARK = true;

Settings
{
  "remappings": [
    "@/contracts/=src/",
    "@/script/=script/",
    "@/test/=test/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "solmate/=lib/solmate/src/",
    "trig/=lib/solidity-trigonometry/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 1000000
  },
  "metadata": {
    "bytecodeHash": "none"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040523480156200001157600080fd5b5073a85572cd96f1643458f17340b6f0d6549af482f56040518060400160405280600d81526020016c21b432b1b5aa3432a1b430b4b760991b8152506040518060400160405280600381526020016243544360e81b81525081600090816200007a9190620002ea565b506001620000898282620002ea565b5050600680546001600160a01b0319166001600160a01b0384169081179091556040519091506000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350426080526f12883d1da628e31c0fe52e35dcf95d5060a05260015b601a81101562000126576200011d73a85572cd96f1643458f17340b6f0d6549af482f58262000132565b600101620000f3565b506019600755620003b6565b6001600160a01b038216620001825760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b60448201526064015b60405180910390fd5b6000818152600260205260409020546001600160a01b031615620001da5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b604482015260640162000179565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200027057607f821691505b6020821081036200029157634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002e557600081815260208120601f850160051c81016020861015620002c05750805b601f850160051c820191505b81811015620002e157828155600101620002cc565b5050505b505050565b81516001600160401b0381111562000306576200030662000245565b6200031e816200031784546200025b565b8462000297565b602080601f8311600181146200035657600084156200033d5750858301515b600019600386901b1c1916600185901b178555620002e1565b600085815260208120601f198616915b82811015620003875788860151825594840194600190910190840162000366565b5085821015620003a65787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051612f2d620003dc6000396000611c55015260006106950152612f2d6000f3fe6080604052600436106101295760003560e01c80636352211e116100a5578063a22cb46511610074578063c87b56dd11610059578063c87b56dd14610352578063e985e9c514610372578063f2fde38b146103ad57600080fd5b8063a22cb46514610312578063b88d4fde1461033257600080fd5b80636352211e1461029057806370a08231146102b05780638da5cb5b146102d057806395d89b41146102fd57600080fd5b80631249c58b116100fc57806323b872dd116100e157806323b872dd1461023b5780633ccfd60b1461025b57806342842e0e1461027057600080fd5b80631249c58b1461020f57806318160ddd1461021757600080fd5b806301ffc9a71461012e57806306fdde0314610163578063081812fc14610185578063095ea7b3146101ed575b600080fd5b34801561013a57600080fd5b5061014e610149366004612181565b6103cd565b60405190151581526020015b60405180910390f35b34801561016f57600080fd5b506101786104b2565b60405161015a91906121c9565b34801561019157600080fd5b506101c86101a036600461221a565b60046020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161015a565b3480156101f957600080fd5b5061020d610208366004612257565b610540565b005b61020d61068f565b34801561022357600080fd5b5061022d60075481565b60405190815260200161015a565b34801561024757600080fd5b5061020d610256366004612281565b6107a7565b34801561026757600080fd5b5061020d610a6e565b34801561027c57600080fd5b5061020d61028b366004612281565b610b5f565b34801561029c57600080fd5b506101c86102ab36600461221a565b610cc9565b3480156102bc57600080fd5b5061022d6102cb3660046122bd565b610d5a565b3480156102dc57600080fd5b506006546101c89073ffffffffffffffffffffffffffffffffffffffff1681565b34801561030957600080fd5b50610178610e02565b34801561031e57600080fd5b5061020d61032d3660046122d8565b610e0f565b34801561033e57600080fd5b5061020d61034d366004612314565b610ea6565b34801561035e57600080fd5b5061017861036d36600461221a565b611000565b34801561037e57600080fd5b5061014e61038d3660046123af565b600560209081526000928352604080842090915290825290205460ff1681565b3480156103b957600080fd5b5061020d6103c83660046122bd565b61119c565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061046057507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b806104ac57507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b600080546104bf906123e2565b80601f01602080910402602001604051908101604052809291908181526020018280546104eb906123e2565b80156105385780601f1061050d57610100808354040283529160200191610538565b820191906000526020600020905b81548152906001019060200180831161051b57829003601f168201915b505050505081565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16338114806105a3575073ffffffffffffffffffffffffffffffffffffffff8116600090815260056020908152604080832033845290915290205460ff165b61060e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064015b60405180910390fd5b60008281526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b620697807f00000000000000000000000000000000000000000000000000000000000000000142111561071e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4d494e54494e475f4e4f545f53544152544544000000000000000000000000006044820152606401610605565b66110d9316ec000034101561078f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f494e53554646494349454e545f464545000000000000000000000000000000006044820152606401610605565b60078054600101908190556107a590339061128e565b565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff848116911614610837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f57524f4e475f46524f4d000000000000000000000000000000000000000000006044820152606401610605565b73ffffffffffffffffffffffffffffffffffffffff82166108b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610605565b3373ffffffffffffffffffffffffffffffffffffffff84161480610908575073ffffffffffffffffffffffffffffffffffffffff8316600090815260056020908152604080832033845290915290205460ff165b80610936575060008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1633145b61099c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610605565b73ffffffffffffffffffffffffffffffffffffffff808416600081815260036020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019055938616808352848320805460010190558583526002825284832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60065473ffffffffffffffffffffffffffffffffffffffff163314610aef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610605565b60065460405160009173ffffffffffffffffffffffffffffffffffffffff169047908381818185875af1925050503d8060008114610b49576040519150601f19603f3d011682016040523d82523d6000602084013e610b4e565b606091505b5050905080610b5c57600080fd5b50565b610b6a8383836107a7565b73ffffffffffffffffffffffffffffffffffffffff82163b1580610c5e57506040517f150b7a020000000000000000000000000000000000000000000000000000000080825233600483015273ffffffffffffffffffffffffffffffffffffffff858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610c16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3a9190612435565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b610cc4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610605565b505050565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1680610d55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4e4f545f4d494e544544000000000000000000000000000000000000000000006044820152606401610605565b919050565b600073ffffffffffffffffffffffffffffffffffffffff8216610dd9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5a45524f5f4144445245535300000000000000000000000000000000000000006044820152606401610605565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b600180546104bf906123e2565b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610eb18585856107a7565b73ffffffffffffffffffffffffffffffffffffffff84163b1580610f9357506040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff86169063150b7a0290610f2c9033908a90899089908990600401612452565b6020604051808303816000875af1158015610f4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6f9190612435565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b610ff9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610605565b5050505050565b60008181526002602052604090205460609073ffffffffffffffffffffffffffffffffffffffff1661108e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4e4f545f4d494e544544000000000000000000000000000000000000000000006044820152606401610605565b6000827f436865636b546865436861696e000000000000000000000000000000000000006040516020016110cc929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012090506000808061111b611116601286612500565b611427565b92509250925061117261112d87611b81565b61115f61113b878786611be3565b60405160200161114b9190612530565b604051602081830303815290604052611f80565b8460405160200161114b9392919061254c565b60405160200161118291906126ce565b604051602081830303815290604052945050505050919050565b60065473ffffffffffffffffffffffffffffffffffffffff16331461121d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610605565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b73ffffffffffffffffffffffffffffffffffffffff821661130b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610605565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1615611397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f414c52454144595f4d494e5445440000000000000000000000000000000000006044820152606401610605565b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020908152604080832080546001019055848352600290915280822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006060600060098410156117da5760048410156115d857600284101561151057836000036114b057505060408051808201909152600781527f676e75706c6f740000000000000000000000000000000000000000000000000060208201527ffd29b65966772202ffdb08f653439b30c849f91409915665d99dbfa5e5dab93891506001611b7a565b505060408051808201909152600681527f434d526d6170000000000000000000000000000000000000000000000000000060208201527f850ce48e7291439b1e41d21fc3f75dddd97580a4ff94aa9ebdd2bcbd423ea1e891506001611b7a565b8360020361157857505060408051808201909152600681527f576973746961000000000000000000000000000000000000000000000000000060208201527f4f5e8ea8862eff315c110b682ee070b459ba8983a7575c9a9c4c25007039109d91506000611b7a565b505060408051808201909152600681527f617574756d6e000000000000000000000000000000000000000000000000000060208201527ff2e92189cb6903b98d854cd74ece6c3fafdb2d3472828a950633fdaa52e0503291506000611b7a565b60068410156116a9578360040361164957505060408051808201909152600681527f62696e617279000000000000000000000000000000000000000000000000000060208201527fa33e6c7c5627ecabfd54c4d85f9bf04815fe89a91379fcf56ccd8177e086db2191506000611b7a565b505060408051808201909152600481527f626f6e650000000000000000000000000000000000000000000000000000000060208201527faa84b30df806b46f859a413cb036bc91466307aec5903fc4635c00a421f25d5c91506001611b7a565b600784101561177a578360060361171a57505060408051808201909152600481527f636f6f6c0000000000000000000000000000000000000000000000000000000060208201527f864a6ee98b9b21ac0291523750d637250405c24a6575e1f75cfbd7209a810ce691506000611b7a565b505060408051808201909152600681527f636f70706572000000000000000000000000000000000000000000000000000060208201527ffd60cd3811f002814944a7d36167b7c9436187a389f2ee476dc883e37dc76bd291506001611b7a565b505060408051808201909152600c81527f676973745f7261696e626f77000000000000000000000000000000000000000060208201527fa8309447f8bd3b5e5e88a0abc05080b7682e4456c388b8636d45f5abb2ad258791506000611b7a565b600d84101561197c57600b8410156118b4578360090361185457505060408051808201909152600a81527f676973745f737465726e0000000000000000000000000000000000000000000060208201527f3be719b0c342797212c4cb33fde865ed9cbe486eb67176265bc0869b54dee92591506001611b7a565b505060408051808201909152600481527f677261790000000000000000000000000000000000000000000000000000000060208201527fca0da6b6309ed2117508207d68a59a18ccaf54ba9aa329f4f60a77481fcf202791506001611b7a565b83600b0361191c57505060408051808201909152600381527f686f74000000000000000000000000000000000000000000000000000000000060208201527f5ccb29670bb9de0e3911d8e47bde627b0e3640e49c3d6a88d51ff699160dfbe191506001611b7a565b505060408051808201909152600381527f687376000000000000000000000000000000000000000000000000000000000060208201527f3de8f27f386dab3dbab473f3cc16870a717fe5692b4f6a45003d175c559dfcba91506000611b7a565b600f841015611a4d5783600d036119ed57505060408051808201909152600381527f6a6574000000000000000000000000000000000000000000000000000000000060208201527f026736ef8439ebcf8e7b8006bf8cb7482ced84d71b900407a9ed63e1b7bfe23491506001611b7a565b505060408051808201909152600681527f737072696e67000000000000000000000000000000000000000000000000000060208201527fc1806ea961848ac00c1f20aa0611529da522a7bd125a3036fe4641b07ee5c61c91506000611b7a565b6011841015611b1e5783600f03611abe57505060408051808201909152600681527f73756d6d6572000000000000000000000000000000000000000000000000000060208201527f87970b686eb726750ec792d49da173387a567764d691294d764e53439359c43691506000611b7a565b505060408051808201909152600781527f7465727261696e0000000000000000000000000000000000000000000000000060208201527faa6277ab923279cf59d78b9b5b7fb5089c90802c353489571fca3c138056fb1b91506001611b7a565b505060408051808201909152600681527f77696e746572000000000000000000000000000000000000000000000000000060208201527fdc1cecffc00e2f3196daaf53c27e53e6052a86dc875adb91607824d62469b2bf915060015b9193909250565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a900480611b9b57508190037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101908152919050565b60608060005b8515801590611bf85750605081105b15611edd576040517f730236ca000000000000000000000000000000000000000000000000000000008152600481018690526001600788161b60ff811660248301529060009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063730236ca90604401600060405180830381865afa158015611c9c573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611ce29190810190612742565b905083611cf78460071660280260c401611b81565b611d0a600386901c60280260a001611b81565b88611d4a576040518060400160405280600681526020017f3139313931390000000000000000000000000000000000000000000000000000815250611d81565b6040518060400160405280600681526020017f45364536453600000000000000000000000000000000000000000000000000008152505b89611dc1576040518060400160405280600681526020017f3131313131310000000000000000000000000000000000000000000000000000815250611df8565b6040518060400160405280600681526020017f46354635463500000000000000000000000000000000000000000000000000008152505b858687604051602001611e1298979695949392919061280d565b6040516020818303038152906040529350838182838485868c611e6a576040518060400160405280600681526020017f3131313131310000000000000000000000000000000000000000000000000000815250611ea1565b6040518060400160405280600681526020017f46354635463500000000000000000000000000000000000000000000000000008152505b604051602001611eb89897969594939291906129cc565b6040516020818303038152906040529350600388901c97508260010192505050611be9565b83611f1d576040518060400160405280600581526020017f626c61636b000000000000000000000000000000000000000000000000000000815250611f54565b6040518060400160405280600581526020017f77686974650000000000000000000000000000000000000000000000000000008152505b82604051602001611f66929190612d03565b604051602081830303815290604052925050509392505050565b60608151600003611f9f57505060408051602081019091526000815290565b6000604051806060016040528060408152602001612ee160409139905060006002600385516002611fd09190612e92565b611fda9190612ecc565b901b90506000611feb826020612e92565b67ffffffffffffffff81111561200357612003612713565b6040519080825280601f01601f19166020018201604052801561202d576020820181803683370190505b509050818152600183018586518101602084015b8183101561209b5760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401612041565b6003895106600181146120b557600281146120ff57612145565b7f3d3d0000000000000000000000000000000000000000000000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe830152612145565b7f3d000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301525b509398975050505050505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610b5c57600080fd5b60006020828403121561219357600080fd5b813561219e81612153565b9392505050565b60005b838110156121c05781810151838201526020016121a8565b50506000910152565b60208152600082518060208401526121e88160408501602087016121a5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60006020828403121561222c57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610d5557600080fd5b6000806040838503121561226a57600080fd5b61227383612233565b946020939093013593505050565b60008060006060848603121561229657600080fd5b61229f84612233565b92506122ad60208501612233565b9150604084013590509250925092565b6000602082840312156122cf57600080fd5b61219e82612233565b600080604083850312156122eb57600080fd5b6122f483612233565b91506020830135801515811461230957600080fd5b809150509250929050565b60008060008060006080868803121561232c57600080fd5b61233586612233565b945061234360208701612233565b935060408601359250606086013567ffffffffffffffff8082111561236757600080fd5b818801915088601f83011261237b57600080fd5b81358181111561238a57600080fd5b89602082850101111561239c57600080fd5b9699959850939650602001949392505050565b600080604083850312156123c257600080fd5b6123cb83612233565b91506123d960208401612233565b90509250929050565b600181811c908216806123f657607f821691505b60208210810361242f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561244757600080fd5b815161219e81612153565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015260806060830152826080830152828460a0840137600060a0848401015260a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011683010190509695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261250f5761250f6124d1565b500690565b600081516125268185602086016121a5565b9290920192915050565b600082516125428184602087016121a5565b9190910192915050565b7f7b226e616d65223a22436865636b2074686520436861696e202300000000000081526000845161258481601a8501602089016121a5565b7f222c226465736372697074696f6e223a224f6e2d636861696e20636865636b73601a918401918201527f2c20696e7370697265642062792056562e222c00000000000000000000000000603a8201527f22696d6167655f64617461223a22646174613a696d6167652f7376672b786d6c604d8201527f3b6261736536342c000000000000000000000000000000000000000000000000606d82015284516126338160758401602089016121a5565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a2243607592909101918201527f6f6c6f726d6170222c2276616c7565223a220000000000000000000000000000609582015283516126978160a78401602088016121a5565b7f227d5d7d0000000000000000000000000000000000000000000000000000000060a7929091019182015260ab0195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161270681601d8501602087016121a5565b91909101601d0192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561275457600080fd5b815167ffffffffffffffff8082111561276c57600080fd5b818401915084601f83011261278057600080fd5b81518181111561279257612792612713565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156127d8576127d8612713565b816040528281528760208487010111156127f157600080fd5b6128028360208301602088016121a5565b979650505050505050565b6000895161281f818460208e016121a5565b7f3c67207472616e73666f726d3d227472616e736c6174652800000000000000009083019081528951612859816018840160208e016121a5565b7f2000000000000000000000000000000000000000000000000000000000000000601892909101918201528851612897816019840160208d016121a5565b7f29223e3c7265637420783d222d32302220793d222d3230222077696474683d22601992909101918201527f343022206865696768743d22343022207374726f6b653d22230000000000000060398201526128f56052820189612514565b7f222066696c6c3d22230000000000000000000000000000000000000000000000815290506129276009820188612514565b7f222f3e3c636972636c6520723d2234222066696c6c3d22230000000000000000815290506129596018820187612514565b7f222f3e3c636972636c652063783d22362220723d2234222066696c6c3d2223008152905061298b601f820186612514565b7f222f3e3c636972636c652063783d222d362220723d2234222066696c6c3d2223815290506129bd6020820185612514565b9b9a5050505050505050505050565b600089516129de818460208e016121a5565b80830190507f222f3e3c636972636c652063793d222d362220723d2234222066696c6c3d222381528951612a19816020840160208e016121a5565b8082019150507f222f3e3c636972636c652063793d22362220723d2234222066696c6c3d22230060208201528851612a5881603f840160208d016121a5565b7f222f3e3c636972636c652063783d22342e323433222063793d22342e32343322603f92909101918201527f20723d2234222066696c6c3d2223000000000000000000000000000000000000605f8201528751612abc81606d840160208c016121a5565b612cc6612cc0612bd9612bd3612b84612b7e612b2f612b29606d898b01017f222f3e3c636972636c652063783d22342e323433222063793d222d342e32343381527f2220723d2234222066696c6c3d222300000000000000000000000000000000006020820152602f0190565b8f612514565b7f222f3e3c636972636c652063783d222d342e323433222063793d22342e32343381527f2220723d2234222066696c6c3d222300000000000000000000000000000000006020820152602f0190565b8c612514565b7f222f3e3c636972636c652063783d222d342e323433222063793d222d342e323481527f332220723d2234222066696c6c3d222300000000000000000000000000000000602082015260300190565b89612514565b7f222f3e3c7061746820643d226d2d2e3620332e38353620342e35362d362e383481527f34632e3536362d2e3834362d2e37352d312e3732342d312e3331362d2e38373860208201527f4c2d312e333820322e3137372d322e37352e383039632d2e3731382d2e37323260408201527f2d312e3833372e3339362d312e31313720312e3131366c322e313720322e313560608201527f612e3738342e373834203020302030202e3837392d2e3030312e3736372e373660808201527f37203020302030202e3231382d2e3231385a222066696c6c3d2223000000000060a082015260bb0190565b86612514565b915050612cf2817f222f3e3c2f673e000000000000000000000000000000000000000000000000009052565b6007019a9950505050505050505050565b7f3c7376672077696474683d2236383022206865696768743d223638302220766981527f6577426f783d223020302036383020363830222066696c6c3d226e6f6e65222060208201527f786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737660408201527f67223e000000000000000000000000000000000000000000000000000000000060608201527f3c7061746820786d6c6e733d22687474703a2f2f7777772e77332e6f72672f3260638201527f3030302f7376672220643d224d36383020304830563638304836383056305a2260838201527f2066696c6c3d220000000000000000000000000000000000000000000000000060a382015260008351612e1f8160aa8501602088016121a5565b7f222f3e000000000000000000000000000000000000000000000000000000000060aa918401918201528351612e5c8160ad8401602088016121a5565b7f3c2f7376673e000000000000000000000000000000000000000000000000000060ad929091019182015260b301949350505050565b808201808211156104ac577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082612edb57612edb6124d1565b50049056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa164736f6c6343000811000a

Deployed Bytecode

0x6080604052600436106101295760003560e01c80636352211e116100a5578063a22cb46511610074578063c87b56dd11610059578063c87b56dd14610352578063e985e9c514610372578063f2fde38b146103ad57600080fd5b8063a22cb46514610312578063b88d4fde1461033257600080fd5b80636352211e1461029057806370a08231146102b05780638da5cb5b146102d057806395d89b41146102fd57600080fd5b80631249c58b116100fc57806323b872dd116100e157806323b872dd1461023b5780633ccfd60b1461025b57806342842e0e1461027057600080fd5b80631249c58b1461020f57806318160ddd1461021757600080fd5b806301ffc9a71461012e57806306fdde0314610163578063081812fc14610185578063095ea7b3146101ed575b600080fd5b34801561013a57600080fd5b5061014e610149366004612181565b6103cd565b60405190151581526020015b60405180910390f35b34801561016f57600080fd5b506101786104b2565b60405161015a91906121c9565b34801561019157600080fd5b506101c86101a036600461221a565b60046020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161015a565b3480156101f957600080fd5b5061020d610208366004612257565b610540565b005b61020d61068f565b34801561022357600080fd5b5061022d60075481565b60405190815260200161015a565b34801561024757600080fd5b5061020d610256366004612281565b6107a7565b34801561026757600080fd5b5061020d610a6e565b34801561027c57600080fd5b5061020d61028b366004612281565b610b5f565b34801561029c57600080fd5b506101c86102ab36600461221a565b610cc9565b3480156102bc57600080fd5b5061022d6102cb3660046122bd565b610d5a565b3480156102dc57600080fd5b506006546101c89073ffffffffffffffffffffffffffffffffffffffff1681565b34801561030957600080fd5b50610178610e02565b34801561031e57600080fd5b5061020d61032d3660046122d8565b610e0f565b34801561033e57600080fd5b5061020d61034d366004612314565b610ea6565b34801561035e57600080fd5b5061017861036d36600461221a565b611000565b34801561037e57600080fd5b5061014e61038d3660046123af565b600560209081526000928352604080842090915290825290205460ff1681565b3480156103b957600080fd5b5061020d6103c83660046122bd565b61119c565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061046057507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b806104ac57507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b600080546104bf906123e2565b80601f01602080910402602001604051908101604052809291908181526020018280546104eb906123e2565b80156105385780601f1061050d57610100808354040283529160200191610538565b820191906000526020600020905b81548152906001019060200180831161051b57829003601f168201915b505050505081565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16338114806105a3575073ffffffffffffffffffffffffffffffffffffffff8116600090815260056020908152604080832033845290915290205460ff165b61060e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064015b60405180910390fd5b60008281526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b620697807f0000000000000000000000000000000000000000000000000000000063e5dd9b0142111561071e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4d494e54494e475f4e4f545f53544152544544000000000000000000000000006044820152606401610605565b66110d9316ec000034101561078f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f494e53554646494349454e545f464545000000000000000000000000000000006044820152606401610605565b60078054600101908190556107a590339061128e565b565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff848116911614610837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f57524f4e475f46524f4d000000000000000000000000000000000000000000006044820152606401610605565b73ffffffffffffffffffffffffffffffffffffffff82166108b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610605565b3373ffffffffffffffffffffffffffffffffffffffff84161480610908575073ffffffffffffffffffffffffffffffffffffffff8316600090815260056020908152604080832033845290915290205460ff165b80610936575060008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1633145b61099c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610605565b73ffffffffffffffffffffffffffffffffffffffff808416600081815260036020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019055938616808352848320805460010190558583526002825284832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60065473ffffffffffffffffffffffffffffffffffffffff163314610aef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610605565b60065460405160009173ffffffffffffffffffffffffffffffffffffffff169047908381818185875af1925050503d8060008114610b49576040519150601f19603f3d011682016040523d82523d6000602084013e610b4e565b606091505b5050905080610b5c57600080fd5b50565b610b6a8383836107a7565b73ffffffffffffffffffffffffffffffffffffffff82163b1580610c5e57506040517f150b7a020000000000000000000000000000000000000000000000000000000080825233600483015273ffffffffffffffffffffffffffffffffffffffff858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610c16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3a9190612435565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b610cc4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610605565b505050565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1680610d55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4e4f545f4d494e544544000000000000000000000000000000000000000000006044820152606401610605565b919050565b600073ffffffffffffffffffffffffffffffffffffffff8216610dd9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5a45524f5f4144445245535300000000000000000000000000000000000000006044820152606401610605565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b600180546104bf906123e2565b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610eb18585856107a7565b73ffffffffffffffffffffffffffffffffffffffff84163b1580610f9357506040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff86169063150b7a0290610f2c9033908a90899089908990600401612452565b6020604051808303816000875af1158015610f4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6f9190612435565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b610ff9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610605565b5050505050565b60008181526002602052604090205460609073ffffffffffffffffffffffffffffffffffffffff1661108e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4e4f545f4d494e544544000000000000000000000000000000000000000000006044820152606401610605565b6000827f436865636b546865436861696e000000000000000000000000000000000000006040516020016110cc929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012090506000808061111b611116601286612500565b611427565b92509250925061117261112d87611b81565b61115f61113b878786611be3565b60405160200161114b9190612530565b604051602081830303815290604052611f80565b8460405160200161114b9392919061254c565b60405160200161118291906126ce565b604051602081830303815290604052945050505050919050565b60065473ffffffffffffffffffffffffffffffffffffffff16331461121d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610605565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b73ffffffffffffffffffffffffffffffffffffffff821661130b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610605565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1615611397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f414c52454144595f4d494e5445440000000000000000000000000000000000006044820152606401610605565b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020908152604080832080546001019055848352600290915280822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006060600060098410156117da5760048410156115d857600284101561151057836000036114b057505060408051808201909152600781527f676e75706c6f740000000000000000000000000000000000000000000000000060208201527ffd29b65966772202ffdb08f653439b30c849f91409915665d99dbfa5e5dab93891506001611b7a565b505060408051808201909152600681527f434d526d6170000000000000000000000000000000000000000000000000000060208201527f850ce48e7291439b1e41d21fc3f75dddd97580a4ff94aa9ebdd2bcbd423ea1e891506001611b7a565b8360020361157857505060408051808201909152600681527f576973746961000000000000000000000000000000000000000000000000000060208201527f4f5e8ea8862eff315c110b682ee070b459ba8983a7575c9a9c4c25007039109d91506000611b7a565b505060408051808201909152600681527f617574756d6e000000000000000000000000000000000000000000000000000060208201527ff2e92189cb6903b98d854cd74ece6c3fafdb2d3472828a950633fdaa52e0503291506000611b7a565b60068410156116a9578360040361164957505060408051808201909152600681527f62696e617279000000000000000000000000000000000000000000000000000060208201527fa33e6c7c5627ecabfd54c4d85f9bf04815fe89a91379fcf56ccd8177e086db2191506000611b7a565b505060408051808201909152600481527f626f6e650000000000000000000000000000000000000000000000000000000060208201527faa84b30df806b46f859a413cb036bc91466307aec5903fc4635c00a421f25d5c91506001611b7a565b600784101561177a578360060361171a57505060408051808201909152600481527f636f6f6c0000000000000000000000000000000000000000000000000000000060208201527f864a6ee98b9b21ac0291523750d637250405c24a6575e1f75cfbd7209a810ce691506000611b7a565b505060408051808201909152600681527f636f70706572000000000000000000000000000000000000000000000000000060208201527ffd60cd3811f002814944a7d36167b7c9436187a389f2ee476dc883e37dc76bd291506001611b7a565b505060408051808201909152600c81527f676973745f7261696e626f77000000000000000000000000000000000000000060208201527fa8309447f8bd3b5e5e88a0abc05080b7682e4456c388b8636d45f5abb2ad258791506000611b7a565b600d84101561197c57600b8410156118b4578360090361185457505060408051808201909152600a81527f676973745f737465726e0000000000000000000000000000000000000000000060208201527f3be719b0c342797212c4cb33fde865ed9cbe486eb67176265bc0869b54dee92591506001611b7a565b505060408051808201909152600481527f677261790000000000000000000000000000000000000000000000000000000060208201527fca0da6b6309ed2117508207d68a59a18ccaf54ba9aa329f4f60a77481fcf202791506001611b7a565b83600b0361191c57505060408051808201909152600381527f686f74000000000000000000000000000000000000000000000000000000000060208201527f5ccb29670bb9de0e3911d8e47bde627b0e3640e49c3d6a88d51ff699160dfbe191506001611b7a565b505060408051808201909152600381527f687376000000000000000000000000000000000000000000000000000000000060208201527f3de8f27f386dab3dbab473f3cc16870a717fe5692b4f6a45003d175c559dfcba91506000611b7a565b600f841015611a4d5783600d036119ed57505060408051808201909152600381527f6a6574000000000000000000000000000000000000000000000000000000000060208201527f026736ef8439ebcf8e7b8006bf8cb7482ced84d71b900407a9ed63e1b7bfe23491506001611b7a565b505060408051808201909152600681527f737072696e67000000000000000000000000000000000000000000000000000060208201527fc1806ea961848ac00c1f20aa0611529da522a7bd125a3036fe4641b07ee5c61c91506000611b7a565b6011841015611b1e5783600f03611abe57505060408051808201909152600681527f73756d6d6572000000000000000000000000000000000000000000000000000060208201527f87970b686eb726750ec792d49da173387a567764d691294d764e53439359c43691506000611b7a565b505060408051808201909152600781527f7465727261696e0000000000000000000000000000000000000000000000000060208201527faa6277ab923279cf59d78b9b5b7fb5089c90802c353489571fca3c138056fb1b91506001611b7a565b505060408051808201909152600681527f77696e746572000000000000000000000000000000000000000000000000000060208201527fdc1cecffc00e2f3196daaf53c27e53e6052a86dc875adb91607824d62469b2bf915060015b9193909250565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a900480611b9b57508190037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101908152919050565b60608060005b8515801590611bf85750605081105b15611edd576040517f730236ca000000000000000000000000000000000000000000000000000000008152600481018690526001600788161b60ff811660248301529060009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000012883d1da628e31c0fe52e35dcf95d50169063730236ca90604401600060405180830381865afa158015611c9c573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611ce29190810190612742565b905083611cf78460071660280260c401611b81565b611d0a600386901c60280260a001611b81565b88611d4a576040518060400160405280600681526020017f3139313931390000000000000000000000000000000000000000000000000000815250611d81565b6040518060400160405280600681526020017f45364536453600000000000000000000000000000000000000000000000000008152505b89611dc1576040518060400160405280600681526020017f3131313131310000000000000000000000000000000000000000000000000000815250611df8565b6040518060400160405280600681526020017f46354635463500000000000000000000000000000000000000000000000000008152505b858687604051602001611e1298979695949392919061280d565b6040516020818303038152906040529350838182838485868c611e6a576040518060400160405280600681526020017f3131313131310000000000000000000000000000000000000000000000000000815250611ea1565b6040518060400160405280600681526020017f46354635463500000000000000000000000000000000000000000000000000008152505b604051602001611eb89897969594939291906129cc565b6040516020818303038152906040529350600388901c97508260010192505050611be9565b83611f1d576040518060400160405280600581526020017f626c61636b000000000000000000000000000000000000000000000000000000815250611f54565b6040518060400160405280600581526020017f77686974650000000000000000000000000000000000000000000000000000008152505b82604051602001611f66929190612d03565b604051602081830303815290604052925050509392505050565b60608151600003611f9f57505060408051602081019091526000815290565b6000604051806060016040528060408152602001612ee160409139905060006002600385516002611fd09190612e92565b611fda9190612ecc565b901b90506000611feb826020612e92565b67ffffffffffffffff81111561200357612003612713565b6040519080825280601f01601f19166020018201604052801561202d576020820181803683370190505b509050818152600183018586518101602084015b8183101561209b5760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401612041565b6003895106600181146120b557600281146120ff57612145565b7f3d3d0000000000000000000000000000000000000000000000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe830152612145565b7f3d000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301525b509398975050505050505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610b5c57600080fd5b60006020828403121561219357600080fd5b813561219e81612153565b9392505050565b60005b838110156121c05781810151838201526020016121a8565b50506000910152565b60208152600082518060208401526121e88160408501602087016121a5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60006020828403121561222c57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610d5557600080fd5b6000806040838503121561226a57600080fd5b61227383612233565b946020939093013593505050565b60008060006060848603121561229657600080fd5b61229f84612233565b92506122ad60208501612233565b9150604084013590509250925092565b6000602082840312156122cf57600080fd5b61219e82612233565b600080604083850312156122eb57600080fd5b6122f483612233565b91506020830135801515811461230957600080fd5b809150509250929050565b60008060008060006080868803121561232c57600080fd5b61233586612233565b945061234360208701612233565b935060408601359250606086013567ffffffffffffffff8082111561236757600080fd5b818801915088601f83011261237b57600080fd5b81358181111561238a57600080fd5b89602082850101111561239c57600080fd5b9699959850939650602001949392505050565b600080604083850312156123c257600080fd5b6123cb83612233565b91506123d960208401612233565b90509250929050565b600181811c908216806123f657607f821691505b60208210810361242f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561244757600080fd5b815161219e81612153565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015260806060830152826080830152828460a0840137600060a0848401015260a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011683010190509695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261250f5761250f6124d1565b500690565b600081516125268185602086016121a5565b9290920192915050565b600082516125428184602087016121a5565b9190910192915050565b7f7b226e616d65223a22436865636b2074686520436861696e202300000000000081526000845161258481601a8501602089016121a5565b7f222c226465736372697074696f6e223a224f6e2d636861696e20636865636b73601a918401918201527f2c20696e7370697265642062792056562e222c00000000000000000000000000603a8201527f22696d6167655f64617461223a22646174613a696d6167652f7376672b786d6c604d8201527f3b6261736536342c000000000000000000000000000000000000000000000000606d82015284516126338160758401602089016121a5565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a2243607592909101918201527f6f6c6f726d6170222c2276616c7565223a220000000000000000000000000000609582015283516126978160a78401602088016121a5565b7f227d5d7d0000000000000000000000000000000000000000000000000000000060a7929091019182015260ab0195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161270681601d8501602087016121a5565b91909101601d0192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561275457600080fd5b815167ffffffffffffffff8082111561276c57600080fd5b818401915084601f83011261278057600080fd5b81518181111561279257612792612713565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156127d8576127d8612713565b816040528281528760208487010111156127f157600080fd5b6128028360208301602088016121a5565b979650505050505050565b6000895161281f818460208e016121a5565b7f3c67207472616e73666f726d3d227472616e736c6174652800000000000000009083019081528951612859816018840160208e016121a5565b7f2000000000000000000000000000000000000000000000000000000000000000601892909101918201528851612897816019840160208d016121a5565b7f29223e3c7265637420783d222d32302220793d222d3230222077696474683d22601992909101918201527f343022206865696768743d22343022207374726f6b653d22230000000000000060398201526128f56052820189612514565b7f222066696c6c3d22230000000000000000000000000000000000000000000000815290506129276009820188612514565b7f222f3e3c636972636c6520723d2234222066696c6c3d22230000000000000000815290506129596018820187612514565b7f222f3e3c636972636c652063783d22362220723d2234222066696c6c3d2223008152905061298b601f820186612514565b7f222f3e3c636972636c652063783d222d362220723d2234222066696c6c3d2223815290506129bd6020820185612514565b9b9a5050505050505050505050565b600089516129de818460208e016121a5565b80830190507f222f3e3c636972636c652063793d222d362220723d2234222066696c6c3d222381528951612a19816020840160208e016121a5565b8082019150507f222f3e3c636972636c652063793d22362220723d2234222066696c6c3d22230060208201528851612a5881603f840160208d016121a5565b7f222f3e3c636972636c652063783d22342e323433222063793d22342e32343322603f92909101918201527f20723d2234222066696c6c3d2223000000000000000000000000000000000000605f8201528751612abc81606d840160208c016121a5565b612cc6612cc0612bd9612bd3612b84612b7e612b2f612b29606d898b01017f222f3e3c636972636c652063783d22342e323433222063793d222d342e32343381527f2220723d2234222066696c6c3d222300000000000000000000000000000000006020820152602f0190565b8f612514565b7f222f3e3c636972636c652063783d222d342e323433222063793d22342e32343381527f2220723d2234222066696c6c3d222300000000000000000000000000000000006020820152602f0190565b8c612514565b7f222f3e3c636972636c652063783d222d342e323433222063793d222d342e323481527f332220723d2234222066696c6c3d222300000000000000000000000000000000602082015260300190565b89612514565b7f222f3e3c7061746820643d226d2d2e3620332e38353620342e35362d362e383481527f34632e3536362d2e3834362d2e37352d312e3732342d312e3331362d2e38373860208201527f4c2d312e333820322e3137372d322e37352e383039632d2e3731382d2e37323260408201527f2d312e3833372e3339362d312e31313720312e3131366c322e313720322e313560608201527f612e3738342e373834203020302030202e3837392d2e3030312e3736372e373660808201527f37203020302030202e3231382d2e3231385a222066696c6c3d2223000000000060a082015260bb0190565b86612514565b915050612cf2817f222f3e3c2f673e000000000000000000000000000000000000000000000000009052565b6007019a9950505050505050505050565b7f3c7376672077696474683d2236383022206865696768743d223638302220766981527f6577426f783d223020302036383020363830222066696c6c3d226e6f6e65222060208201527f786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737660408201527f67223e000000000000000000000000000000000000000000000000000000000060608201527f3c7061746820786d6c6e733d22687474703a2f2f7777772e77332e6f72672f3260638201527f3030302f7376672220643d224d36383020304830563638304836383056305a2260838201527f2066696c6c3d220000000000000000000000000000000000000000000000000060a382015260008351612e1f8160aa8501602088016121a5565b7f222f3e000000000000000000000000000000000000000000000000000000000060aa918401918201528351612e5c8160ad8401602088016121a5565b7f3c2f7376673e000000000000000000000000000000000000000000000000000060ad929091019182015260b301949350505050565b808201808211156104ac577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082612edb57612edb6124d1565b50049056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa164736f6c6343000811000a

Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.