ETH Price: $2,628.13 (+5.83%)
Gas: 4 Gwei

Contract

0x0000000Ff428Cfe880A7b816FE1216184c728B21
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Approval For...191143562024-01-29 19:46:23192 days ago1706557583IN
0x0000000F...84c728B21
0 ETH0.0006257513.60612342
Set Approval For...191127202024-01-29 14:16:35192 days ago1706537795IN
0x0000000F...84c728B21
0 ETH0.000689714.969273
Set Approval For...170557512023-04-15 23:51:23481 days ago1681602683IN
0x0000000F...84c728B21
0 ETH0.0011743325.53397013
Set Approval For...167368862023-03-01 22:58:47526 days ago1677711527IN
0x0000000F...84c728B21
0 ETH0.0012218226.56654272
Transfer From166883082023-02-23 3:04:47533 days ago1677121487IN
0x0000000F...84c728B21
0 ETH0.0025952243.82499626
Set Approval For...166731192023-02-20 23:46:59535 days ago1676936819IN
0x0000000F...84c728B21
0 ETH0.0014038530.5245939
Safe Transfer Fr...166669242023-02-20 2:55:47536 days ago1676861747IN
0x0000000F...84c728B21
0 ETH0.0012341921.40477834
Withdraw166601222023-02-19 3:59:23537 days ago1676779163IN
0x0000000F...84c728B21
0 ETH0.0008184426.89678557
Mint166268292023-02-14 11:56:35542 days ago1676375795IN
0x0000000F...84c728B21
0.0048 ETH0.0008360714.99786926
Mint166268272023-02-14 11:56:11542 days ago1676375771IN
0x0000000F...84c728B21
0.0048 ETH0.0008161914.64125308
Mint166268242023-02-14 11:55:35542 days ago1676375735IN
0x0000000F...84c728B21
0.0048 ETH0.0008171414.65837812
Mint166266692023-02-14 11:24:23542 days ago1676373863IN
0x0000000F...84c728B21
0.0048 ETH0.0008361915
Mint166266592023-02-14 11:22:23542 days ago1676373743IN
0x0000000F...84c728B21
0.0048 ETH0.0010968115.05669422
Mint166261822023-02-14 9:45:59542 days ago1676367959IN
0x0000000F...84c728B21
0.0048 ETH0.0010846814.89004534
Mint166257322023-02-14 8:15:11542 days ago1676362511IN
0x0000000F...84c728B21
0.0048 ETH0.001144415.70998117
Mint166247242023-02-14 4:51:11542 days ago1676350271IN
0x0000000F...84c728B21
0.0048 ETH0.0010457514.3557485
Mint166236602023-02-14 1:17:35542 days ago1676337455IN
0x0000000F...84c728B21
0.0048 ETH0.0008873515.91779439
Mint166236552023-02-14 1:16:35542 days ago1676337395IN
0x0000000F...84c728B21
0.0048 ETH0.0008112214.55223252
Mint166236512023-02-14 1:15:47542 days ago1676337347IN
0x0000000F...84c728B21
0.0048 ETH0.0008753515.70251388
Mint166236472023-02-14 1:14:59542 days ago1676337299IN
0x0000000F...84c728B21
0.0048 ETH0.0008694215.59622177
Mint166236412023-02-14 1:13:47542 days ago1676337227IN
0x0000000F...84c728B21
0.0048 ETH0.0008822615.82649508
Mint166236352023-02-14 1:12:35542 days ago1676337155IN
0x0000000F...84c728B21
0.0048 ETH0.0008831815.84294761
Mint166236322023-02-14 1:11:59542 days ago1676337119IN
0x0000000F...84c728B21
0.0048 ETH0.0013107117.993022
Mint166234902023-02-14 0:43:23542 days ago1676335403IN
0x0000000F...84c728B21
0.0048 ETH0.0009496517.03546017
Mint166234872023-02-14 0:42:35542 days ago1676335355IN
0x0000000F...84c728B21
0.0048 ETH0.0012773817.53546017
View all transactions

Latest 5 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
166601222023-02-19 3:59:23537 days ago1676779163
0x0000000F...84c728B21
1.253 ETH
166258912023-02-14 8:47:23542 days ago1676364443
0x0000000F...84c728B21
0.0048 ETH
166258912023-02-14 8:47:23542 days ago1676364443
0x0000000F...84c728B21
0.0048 ETH
166258912023-02-14 8:47:23542 days ago1676364443
0x0000000F...84c728B21
0.0048 ETH
165964292023-02-10 6:00:59546 days ago1676008859  Contract Creation0 ETH
Loading...
Loading

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 : 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 2 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 3 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 4 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 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

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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