ETH Price: $2,549.69 (-1.97%)

Token

DIRTONCHAIN (DIRTONCHAIN)
 

Overview

Max Total Supply

119 DIRTONCHAIN

Holders

62

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
csc.eth
0x9115b05c877ac8f2f8c02aeaea35f58427790e66
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
DIRTONCHAIN

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion
File 1 of 5 : DIRTONCHAIN.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;

/*//////////////////////////////////////////////////////////////
                        EXTERNAL IMPORTS
//////////////////////////////////////////////////////////////*/

import "solmate/utils/MerkleProofLib.sol";
import {ERC1155} from "solmate/tokens/ERC1155.sol";
import {Owned} from "solmate/auth/Owned.sol";

/*//////////////////////////////////////////////////////////////
                        INTERNAL IMPORTS
//////////////////////////////////////////////////////////////*/

import "./LilBase64.sol";

/*//////////////////////////////////////////////////////////////
                                STRUCTURES
//////////////////////////////////////////////////////////////*/
library Structures {
    /// @notice Structure for royalty info per token ID
    /// @param creator for token
    /// @param royaltyBasisPoints for token
    struct RoyaltyReceiver {
        address creator;
        uint16 royaltyBasisPoints;
    }
}

/*//////////////////////////////////////////////////////////////
                                EVENTS
//////////////////////////////////////////////////////////////*/

library Events {
    /// @notice Emitted after Merkle root is changed
    /// @param tokenId for which Merkle root was set or updated
    /// @param oldMerkleRoot used for validating claims against a token ID
    /// @param newMerkleRoot used for validating claims against a token ID
    event MerkleRootChanged(
        uint256 tokenId,
        bytes32 oldMerkleRoot,
        bytes32 newMerkleRoot
    );

    /// @notice Emitted after contract is enabled or disabled
    /// @param oldEnabled status of contract
    /// @param newEnabled status of contract
    event EnabledChanged(bool oldEnabled, bool newEnabled);

    /// @notice Emitted after image data is changed
    /// @param tokenId for which image data was set or updated
    /// @param oldImageData used for a token ID
    /// @param newImageData used for a token ID
    event ImageDataChanged(
        uint256 tokenId,
        string oldImageData,
        string newImageData
    );

    /// @notice Emitted after name is changed
    /// @param tokenId for which name was set or updated
    /// @param oldName used for a token ID
    /// @param newName used for a token ID
    event NameChanged(uint256 tokenId, string oldName, string newName);

    /// @notice Emitted after description is changed
    /// @param tokenId for which description was set or updated
    /// @param oldDescription used for a token ID
    /// @param newDescription used for a token ID
    event DescriptionChanged(
        uint256 tokenId,
        string oldDescription,
        string newDescription
    );

    /// @notice Emitted after contract name is changed
    /// @param oldName of contract
    /// @param newName of contract
    event NameChanged(string oldName, string newName);

    /// @notice Emitted after royalties are changed
    /// @param tokenId for which royalty was set or updated
    /// @param oldRoyalties of ID
    /// @param newRoyalties of ID
    event RoyaltyChanged(
        uint256 tokenId,
        Structures.RoyaltyReceiver oldRoyalties,
        Structures.RoyaltyReceiver newRoyalties
    );

    /// @notice Emitted after contract symbol is changed
    /// @param oldSymbol of contract
    /// @param newSymbol of contract
    event SymbolChanged(string oldSymbol, string newSymbol);
}

/*//////////////////////////////////////////////////////////////
                            CONTRACT
//////////////////////////////////////////////////////////////*/

/// @title DIRTONCHAIN
/// @notice Commemorative Dirt tokens claimable by members of a Merkle tree
/// @author DefDAO <https://definitely.shop/>
contract DIRTONCHAIN is Owned, ERC1155 {
    /*//////////////////////////////////////////////////////////////
                             MUTABLE STORAGE
    //////////////////////////////////////////////////////////////*/

    /// @notice Token name (not in ERC1155 standard but still used)
    string public name;

    /// @notice Token symbol (not in ERC1155 standard but still used)
    string public symbol;

    /// @notice Overall contract status
    bool public enabled;

    /// @notice Mapping of Merkle roots for different NFTs
    mapping(uint256 => bytes32) public merkleRoots;

    /// @notice Mapping of image data
    mapping(uint256 => string) public imageData;

    /// @notice Mapping of descriptions
    mapping(uint256 => string) public descriptions;

    /// @notice Mapping of names
    mapping(uint256 => string) public names;

    /// @notice Mapping of mint status for hashed address + ID combos (as integers)
    mapping(uint256 => bool) public mintStatus;

    /// @notice Mapping of royalty rates
    mapping(uint256 => Structures.RoyaltyReceiver) public mintRoyalties;

    /*//////////////////////////////////////////////////////////////
                                MODIFIERS
    //////////////////////////////////////////////////////////////*/

    /// @notice Throws if called when minting is not enabled
    modifier mintingEnabled() {
        if (!enabled) {
            revert MintingNotEnabled();
        }
        _;
    }

    /// @notice Throws if mint attempted on a token that was already minted
    modifier tokenNotYetClaimed(uint256 tokenId) {
        if (
            mintStatus[uint256(keccak256(abi.encode(msg.sender, tokenId)))] !=
            false
        ) {
            revert NotAllowedToMintAgain();
        }
        _;
    }

    /// @notice Throws if mint attempted on a token that does not exists
    modifier tokenExists(uint256 tokenId) {
        if (merkleRoots[tokenId] == 0) {
            revert TokenDoesNotExist();
        }
        _;
    }

    /// @notice Throws if burn attempted on a token not owned by sender
    modifier hasToken(uint256 tokenId, address burner) {
        if (balanceOf[burner][tokenId] == 0) {
            revert NotAllowedToBurn();
        }
        _;
    }

    /*//////////////////////////////////////////////////////////////
                                 ERRORS
    //////////////////////////////////////////////////////////////*/

    /// @notice Thrown if minting attempted when contract not enabled
    error MintingNotEnabled();

    /// @notice Thrown if burn attempted on token not owned by address
    error NotAllowedToBurn();

    /// @notice Thrown if address has already minted its token for token ID
    error NotAllowedToMintAgain();

    /// @notice Thrown if address is not part of Merkle tree for token ID
    error NotInMerkle();

    /// @notice Thrown if a non-existent token is queried
    error TokenDoesNotExist();

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

    /// @notice Creates a new DIRTONCHAIN contract
    /// @param _enabled to start
    /// @param _initialMerkleRoot to start
    /// @param _initialImageData to start
    constructor(
        bool _enabled,
        bytes32 _initialMerkleRoot,
        string memory _initialImageData,
        string memory _initialName,
        string memory _initialDescription,
        address _initialCreator,
        uint16 _initialRoyalty
    ) Owned(msg.sender) {
        enabled = _enabled;
        merkleRoots[1] = _initialMerkleRoot;
        imageData[1] = _initialImageData;
        names[1] = _initialName;
        descriptions[1] = _initialDescription;
        mintRoyalties[1] = Structures.RoyaltyReceiver({
            creator: _initialCreator,
            royaltyBasisPoints: _initialRoyalty
        });
        name = "DIRTONCHAIN";
        symbol = "DIRTONCHAIN";
    }

    /* solhint-disable quotes */
    /// @notice Generates base64 payload for token
    /// @param tokenId for this specific token
    /// @return generatedTokenURIBase64 for this specific token
    function generateTokenURIBase64(uint256 tokenId)
        public
        view
        returns (string memory generatedTokenURIBase64)
    {
        generatedTokenURIBase64 = LilBase64.encode(
            bytes(
                string.concat(
                    '{"name": "',
                    names[tokenId],
                    '", "description": "',
                    descriptions[tokenId],
                    '", "image": "',
                    imageData[tokenId],
                    '"}'
                )
            )
        );
    }

    /* solhint-enable quotes */
    /// @notice Mint a token
    /// @param tokenId of token being minted
    /// @param proof of mint eligibility
    function mint(uint256 tokenId, bytes32[] calldata proof)
        external
        tokenExists(tokenId)
        tokenNotYetClaimed(tokenId)
        mintingEnabled
    {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        bool isValidLeaf = MerkleProofLib.verify(
            proof,
            merkleRoots[tokenId],
            leaf
        );
        if (!isValidLeaf) revert NotInMerkle();

        mintStatus[uint256(keccak256(abi.encode(msg.sender, tokenId)))] = true;
        _mint(msg.sender, tokenId, 1, "");
    }

    /// @notice Burn a token
    /// @param tokenId of token being burned
    function burn(uint256 tokenId) external hasToken(tokenId, msg.sender) {
        _burn(msg.sender, tokenId, 1);
    }

    /// @notice Gets URI for a specific token
    /// @param tokenId of token being queried
    /// @return base64 URI of token being queried
    function uri(uint256 tokenId)
        public
        view
        override
        tokenExists(tokenId)
        returns (string memory)
    {
        return
            string(
                abi.encodePacked(
                    "data:application/json;base64,",
                    generateTokenURIBase64(tokenId)
                )
            );
    }

    /// @notice Set a new Merkle root for a given token ID
    /// @param tokenId to get a new or updated Merkle root
    /// @param _merkleRoot to be used for validating claims
    function ownerSetMerkleRoot(uint256 tokenId, bytes32 _merkleRoot)
        public
        onlyOwner
    {
        emit Events.MerkleRootChanged(
            tokenId,
            merkleRoots[tokenId],
            _merkleRoot
        );
        merkleRoots[tokenId] = _merkleRoot;
    }

    /// @notice Set new image data for a given token ID
    /// @param tokenId to get new or updated image data
    /// @param _imageData to be used
    function ownerSetImageData(uint256 tokenId, string calldata _imageData)
        public
        onlyOwner
    {
        emit Events.ImageDataChanged(tokenId, imageData[tokenId], _imageData);
        imageData[tokenId] = _imageData;
    }

    /// @notice Set new name for a given token ID
    /// @param tokenId to get new or updated name
    /// @param _name to be used
    function ownerSetName(uint256 tokenId, string calldata _name)
        public
        onlyOwner
    {
        emit Events.NameChanged(tokenId, names[tokenId], _name);
        names[tokenId] = _name;
    }

    /// @notice Set new description for a given token ID
    /// @param tokenId to get new or updated description
    /// @param _description to be used
    function ownerSetDescription(uint256 tokenId, string calldata _description)
        public
        onlyOwner
    {
        emit Events.DescriptionChanged(
            tokenId,
            descriptions[tokenId],
            _description
        );
        descriptions[tokenId] = _description;
    }

    /// @notice Update the contract's enabled status
    /// @param _enabled status for the contract
    function ownerSetEnabled(bool _enabled) public onlyOwner {
        emit Events.EnabledChanged(enabled, _enabled);
        enabled = _enabled;
    }

    /// @notice Update the contract's name
    /// @param _name for the contract
    function ownerSetName(string calldata _name) public onlyOwner {
        emit Events.NameChanged(name, _name);
        name = _name;
    }

    /// @notice Update the royalty info for a mint
    /// @param tokenId to get new or updated royalty info
    /// @param _creator to get royalty
    /// @param _royalty amount as percentage
    function ownerSetRoyaltyInfo(
        uint256 tokenId,
        address _creator,
        uint16 _royalty
    ) public onlyOwner {
        Structures.RoyaltyReceiver memory newRoyalty = Structures
            .RoyaltyReceiver({creator: _creator, royaltyBasisPoints: _royalty});
        emit Events.RoyaltyChanged(tokenId, mintRoyalties[tokenId], newRoyalty);
        mintRoyalties[tokenId] = newRoyalty;
    }

    /// @notice Update the contract's symbol
    /// @param _symbol for the contract
    function ownerSetSymbol(string calldata _symbol) public onlyOwner {
        emit Events.SymbolChanged(symbol, _symbol);
        symbol = _symbol;
    }

    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        public
        view
        returns (address receiver, uint256 royaltyAmount)
    {
        receiver = mintRoyalties[tokenId].creator;
        royaltyAmount =
            ((mintRoyalties[tokenId].royaltyBasisPoints / 100) * salePrice) /
            100;
    }

    function supportsInterface(bytes4 interfaceId)
        public
        pure
        override
        returns (bool)
    {
        return
            interfaceId == 0x2a55205a || // ERC165 Interface ID for ERC2981
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0xd9b67a26 || // ERC165 Interface ID for ERC1155
            interfaceId == 0x0e89341c; // ERC165 Interface ID for ERC1155MetadataURI
    }
}

File 2 of 5 : MerkleProofLib.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;

/// @notice Gas optimized merkle proof verification library.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/MerkleProofLib.sol)
library MerkleProofLib {
    function verify(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool isValid) {
        assembly {
            let computedHash := leaf // The hash starts as the leaf hash.

            // Initialize data to the offset of the proof in the calldata.
            let data := proof.offset

            // Iterate over proof elements to compute root hash.
            for {
                // Left shifting by 5 is like multiplying by 32.
                let end := add(data, shl(5, proof.length))
            } lt(data, end) {
                data := add(data, 32) // Shift 1 word per cycle.
            } {
                // Load the current proof element.
                let loadedData := calldataload(data)

                // Slot where computedHash should be put in scratch space.
                // If computedHash > loadedData: slot 32, otherwise: slot 0.
                let computedHashSlot := shl(5, gt(computedHash, loadedData))

                // Store elements to hash contiguously in scratch space.
                // The xor puts loadedData in whichever slot computedHash is
                // not occupying, so 0 if computedHashSlot is 32, 32 otherwise.
                mstore(computedHashSlot, computedHash)
                mstore(xor(computedHashSlot, 32), loadedData)

                computedHash := keccak256(0, 64) // Hash both slots of scratch space.
            }

            isValid := eq(computedHash, root) // The proof is valid if the roots match.
        }
    }
}

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

/// @notice Minimalist and gas efficient standard ERC1155 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC1155.sol)
abstract contract ERC1155 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event TransferSingle(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256 id,
        uint256 amount
    );

    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] amounts
    );

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

    event URI(string value, uint256 indexed id);

    /*//////////////////////////////////////////////////////////////
                             ERC1155 STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(address => mapping(uint256 => uint256)) public balanceOf;

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

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

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

    /*//////////////////////////////////////////////////////////////
                              ERC1155 LOGIC
    //////////////////////////////////////////////////////////////*/

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

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

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) public virtual {
        require(msg.sender == from || isApprovedForAll[from][msg.sender], "NOT_AUTHORIZED");

        balanceOf[from][id] -= amount;
        balanceOf[to][id] += amount;

        emit TransferSingle(msg.sender, from, to, id, amount);

        if (to.code.length != 0) {
            require(
                ERC1155TokenReceiver(to).onERC1155Received(msg.sender, from, id, amount, data) ==
                    ERC1155TokenReceiver.onERC1155Received.selector,
                "UNSAFE_RECIPIENT"
            );
        } else require(to != address(0), "INVALID_RECIPIENT");
    }

    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) public virtual {
        require(ids.length == amounts.length, "LENGTH_MISMATCH");

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

        // Storing these outside the loop saves ~15 gas per iteration.
        uint256 id;
        uint256 amount;

        for (uint256 i = 0; i < ids.length; ) {
            id = ids[i];
            amount = amounts[i];

            balanceOf[from][id] -= amount;
            balanceOf[to][id] += amount;

            // An array can't have a total length
            // larger than the max uint256 value.
            unchecked {
                ++i;
            }
        }

        emit TransferBatch(msg.sender, from, to, ids, amounts);

        if (to.code.length != 0) {
            require(
                ERC1155TokenReceiver(to).onERC1155BatchReceived(msg.sender, from, ids, amounts, data) ==
                    ERC1155TokenReceiver.onERC1155BatchReceived.selector,
                "UNSAFE_RECIPIENT"
            );
        } else require(to != address(0), "INVALID_RECIPIENT");
    }

    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids)
        public
        view
        virtual
        returns (uint256[] memory balances)
    {
        require(owners.length == ids.length, "LENGTH_MISMATCH");

        balances = new uint256[](owners.length);

        // Unchecked because the only math done is incrementing
        // the array index counter which cannot possibly overflow.
        unchecked {
            for (uint256 i = 0; i < owners.length; ++i) {
                balances[i] = balanceOf[owners[i]][ids[i]];
            }
        }
    }

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

    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0xd9b67a26 || // ERC165 Interface ID for ERC1155
            interfaceId == 0x0e89341c; // ERC165 Interface ID for ERC1155MetadataURI
    }

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

    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        balanceOf[to][id] += amount;

        emit TransferSingle(msg.sender, address(0), to, id, amount);

        if (to.code.length != 0) {
            require(
                ERC1155TokenReceiver(to).onERC1155Received(msg.sender, address(0), id, amount, data) ==
                    ERC1155TokenReceiver.onERC1155Received.selector,
                "UNSAFE_RECIPIENT"
            );
        } else require(to != address(0), "INVALID_RECIPIENT");
    }

    function _batchMint(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        uint256 idsLength = ids.length; // Saves MLOADs.

        require(idsLength == amounts.length, "LENGTH_MISMATCH");

        for (uint256 i = 0; i < idsLength; ) {
            balanceOf[to][ids[i]] += amounts[i];

            // An array can't have a total length
            // larger than the max uint256 value.
            unchecked {
                ++i;
            }
        }

        emit TransferBatch(msg.sender, address(0), to, ids, amounts);

        if (to.code.length != 0) {
            require(
                ERC1155TokenReceiver(to).onERC1155BatchReceived(msg.sender, address(0), ids, amounts, data) ==
                    ERC1155TokenReceiver.onERC1155BatchReceived.selector,
                "UNSAFE_RECIPIENT"
            );
        } else require(to != address(0), "INVALID_RECIPIENT");
    }

    function _batchBurn(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        uint256 idsLength = ids.length; // Saves MLOADs.

        require(idsLength == amounts.length, "LENGTH_MISMATCH");

        for (uint256 i = 0; i < idsLength; ) {
            balanceOf[from][ids[i]] -= amounts[i];

            // An array can't have a total length
            // larger than the max uint256 value.
            unchecked {
                ++i;
            }
        }

        emit TransferBatch(msg.sender, from, address(0), ids, amounts);
    }

    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        balanceOf[from][id] -= amount;

        emit TransferSingle(msg.sender, from, address(0), id, amount);
    }
}

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

    function onERC1155BatchReceived(
        address,
        address,
        uint256[] calldata,
        uint256[] calldata,
        bytes calldata
    ) external virtual returns (bytes4) {
        return ERC1155TokenReceiver.onERC1155BatchReceived.selector;
    }
}

File 4 of 5 : 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/Rari-Capital/solmate/blob/main/src/auth/Owned.sol)
abstract contract Owned {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event OwnerUpdated(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 OwnerUpdated(address(0), _owner);
    }

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

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

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

File 5 of 5 : LilBase64.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;

/// [MIT License]
/// @title LilBase64
/// @notice Provides a function for encoding some bytes in base64 (no decode)
/// @author Brecht Devos <[email protected]>
library LilBase64 {
    bytes internal constant TABLE =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        /* solhint-disable no-inline-assembly, no-empty-blocks */
        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(
                    out,
                    and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF)
                )
                out := shl(8, out)
                out := add(
                    out,
                    and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF)
                )
                out := shl(8, out)
                out := add(
                    out,
                    and(mload(add(tablePtr, and(input, 0x3F))), 0xFF)
                )
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }
        /* solhint-enable no-inline-assembly, no-empty-blocks */

        return string(result);
    }
}

Settings
{
  "remappings": [
    "base64-sol/=packages/contracts/lib/base64/",
    "base64/=packages/contracts/lib/base64/",
    "ds-test/=packages/contracts/lib/solmate/lib/ds-test/src/",
    "forge-std/=packages/contracts/lib/forge-std/src/",
    "solmate/=packages/contracts/lib/solmate/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":[{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"bytes32","name":"_initialMerkleRoot","type":"bytes32"},{"internalType":"string","name":"_initialImageData","type":"string"},{"internalType":"string","name":"_initialName","type":"string"},{"internalType":"string","name":"_initialDescription","type":"string"},{"internalType":"address","name":"_initialCreator","type":"address"},{"internalType":"uint16","name":"_initialRoyalty","type":"uint16"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"MintingNotEnabled","type":"error"},{"inputs":[],"name":"NotAllowedToBurn","type":"error"},{"inputs":[],"name":"NotAllowedToMintAgain","type":"error"},{"inputs":[],"name":"NotInMerkle","type":"error"},{"inputs":[],"name":"TokenDoesNotExist","type":"error"},{"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":"OwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"balances","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"descriptions","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"generateTokenURIBase64","outputs":[{"internalType":"string","name":"generatedTokenURIBase64","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"imageData","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"merkleRoots","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintRoyalties","outputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint16","name":"royaltyBasisPoints","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"names","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":"tokenId","type":"uint256"},{"internalType":"string","name":"_description","type":"string"}],"name":"ownerSetDescription","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"ownerSetEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_imageData","type":"string"}],"name":"ownerSetImageData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"ownerSetMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_name","type":"string"}],"name":"ownerSetName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"ownerSetName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"_creator","type":"address"},{"internalType":"uint16","name":"_royalty","type":"uint16"}],"name":"ownerSetRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_symbol","type":"string"}],"name":"ownerSetSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","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":"uint256","name":"amount","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":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50604051620035cf380380620035cf83398101604081905262000034916200032c565b600080546001600160a01b031916339081178255604051909182917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a3506005805460ff191688151517905560016000527f3e5fec24aa4dc4e5aee2e025e51e1392c72a2500577559fae9665c6d52bd6a3186905560076020527fb39221ace053465ec3453ce2b36430bd138b997ecea25c1043da0c366812b828620000de868262000495565b50600160005260096020527f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a3662000116858262000495565b50600160005260086020527fad67d757c34507f157cacfa2e3153e9f260a2244f30428821be7be64587ac55f6200014e848262000495565b506040805180820182526001600160a01b03808516825261ffff80851660208085019182526001600052600b80825294517f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cf80549351909416600160a01b026001600160b01b031990931694169390931717905582518084019093529082526a2224a92a27a721a420a4a760a91b90820152600390620001ef908262000495565b5060408051808201909152600b81526a2224a92a27a721a420a4a760a91b602082015260049062000221908262000495565b505050505050505062000561565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200025757600080fd5b81516001600160401b03808211156200027457620002746200022f565b604051601f8301601f19908116603f011681019082821181831017156200029f576200029f6200022f565b81604052838152602092508683858801011115620002bc57600080fd5b600091505b83821015620002e05785820183015181830184015290820190620002c1565b83821115620002f25760008385830101525b9695505050505050565b80516001600160a01b03811681146200031457600080fd5b919050565b805161ffff811681146200031457600080fd5b600080600080600080600060e0888a0312156200034857600080fd5b875180151581146200035957600080fd5b602089015160408a015191985096506001600160401b03808211156200037e57600080fd5b6200038c8b838c0162000245565b965060608a0151915080821115620003a357600080fd5b620003b18b838c0162000245565b955060808a0151915080821115620003c857600080fd5b50620003d78a828b0162000245565b935050620003e860a08901620002fc565b9150620003f860c0890162000319565b905092959891949750929550565b600181811c908216806200041b57607f821691505b6020821081036200043c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200049057600081815260208120601f850160051c810160208610156200046b5750805b601f850160051c820191505b818110156200048c5782815560010162000477565b5050505b505050565b81516001600160401b03811115620004b157620004b16200022f565b620004c981620004c2845462000406565b8462000442565b602080601f831160018114620005015760008415620004e85750858301515b600019600386901b1c1916600185901b1785556200048c565b600085815260208120601f198616915b82811015620005325788860151825594840194600190910190840162000511565b5085821015620005515787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61305e80620005716000396000f3fe608060405234801561001057600080fd5b50600436106101e45760003560e01c806355cdccc61161010f578063da3a222f116100a2578063eef0c77911610071578063eef0c779146104bb578063f242432a146104ce578063fbc1fbe7146104e1578063ff7473fc146104f457600080fd5b8063da3a222f14610454578063e6f859e714610467578063e985e9c51461047a578063eec8d84d146104a857600080fd5b806395d89b41116100de57806395d89b4114610413578063a22cb4651461041b578063ba41b0c61461042e578063ce1c95ee1461044157600080fd5b806355cdccc61461038857806371c5ecb11461039b578063824a72f7146103bb5780638da5cb5b146103ce57600080fd5b8063238dafe0116101875780633f1cdbdf116101565780633f1cdbdf1461031f57806342966c68146103425780634622ab03146103555780634e1273f41461036857600080fd5b8063238dafe0146102ad5780632a55205a146102ba5780632eb2c2d6146102f957806336730c1c1461030c57600080fd5b806306fdde03116101c357806306fdde031461026a57806309ba02e3146102725780630e89341c1461028757806313af40351461029a57600080fd5b8062fdd58e146101e957806301ffc9a714610227578063061ba2f11461024a575b600080fd5b6102146101f7366004612324565b600160209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b61023a61023536600461237f565b610577565b604051901515815260200161021e565b61025d6102583660046123a3565b6106a8565b60405161021e9190612432565b61025d610742565b610285610280366004612445565b61074f565b005b61025d6102953660046123a3565b6108ef565b6102856102a836600461248c565b61096c565b60055461023a9060ff1681565b6102cd6102c83660046124a7565b610a5d565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260208301919091520161021e565b610285610307366004612557565b610ad2565b61028561031a366004612612565b610f2a565b61023a61032d3660046123a3565b600a6020526000908152604090205460ff1681565b6102856103503660046123a3565b610ff9565b61025d6103633660046123a3565b61105a565b61037b610376366004612654565b611073565b60405161021e91906126c0565b6102856103963660046124a7565b6111eb565b6102146103a93660046123a3565b60066020526000908152604090205481565b6102856103c9366004612704565b6112cd565b6000546103ee9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161021e565b61025d6113b9565b610285610429366004612760565b6113c6565b61028561043c36600461278a565b61145d565b61028561044f366004612704565b611681565b6102856104623660046127c9565b611767565b61025d6104753660046123a3565b61185c565b61023a6104883660046127e4565b600260209081526000928352604080842090915290825290205460ff1681565b6102856104b6366004612704565b611875565b61025d6104c93660046123a3565b61195b565b6102856104dc36600461280e565b6119a4565b6102856104ef366004612612565b611d11565b6105486105023660046123a3565b600b6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900461ffff1682565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835261ffff90911660208301520161021e565b60007f2a55205a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061060a57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b8061065657507fd9b67a26000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b806106a257507f0e89341c000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b600760205260009081526040902080546106c190612886565b80601f01602080910402602001604051908101604052809291908181526020018280546106ed90612886565b801561073a5780601f1061070f5761010080835404028352916020019161073a565b820191906000526020600020905b81548152906001019060200180831161071d57829003601f168201915b505050505081565b600380546106c190612886565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b60408051808201825273ffffffffffffffffffffffffffffffffffffffff848116825261ffff84811660208085019182526000898152600b825286902086518a815290548086169282019290925260a091821c841696810196909652845190931660608601525116608084015290917fe18786ec8c9119144e08345df5f8009d5f113a8e2ba24623b2bdaaa3f4486fe8910160405180910390a16000938452600b6020908152604090942081518154959092015161ffff1674010000000000000000000000000000000000000000027fffffffffffffffffffff0000000000000000000000000000000000000000000090951673ffffffffffffffffffffffffffffffffffffffff90921691909117939093179092555050565b6000818152600660205260408120546060918391900361093b576040517fceea21b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109448361195b565b60405160200161095491906128d3565b60405160208183030381529060405291505b50919050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146109ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107cc565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b6000828152600b602052604081205473ffffffffffffffffffffffffffffffffffffffff811691906064908490610ab190839074010000000000000000000000000000000000000000900461ffff16612976565b61ffff16610abf9190612997565b610ac991906129d4565b90509250929050565b848314610b3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4c454e4754485f4d49534d41544348000000000000000000000000000000000060448201526064016107cc565b3373ffffffffffffffffffffffffffffffffffffffff89161480610b8f575073ffffffffffffffffffffffffffffffffffffffff8816600090815260026020908152604080832033845290915290205460ff165b610bf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016107cc565b60008060005b87811015610cce57888882818110610c1557610c156129e8565b905060200201359250868682818110610c3057610c306129e8565b73ffffffffffffffffffffffffffffffffffffffff8e16600090815260016020908152604080832089845282528220805493909102949094013595508593925090610c7c908490612a17565b909155505073ffffffffffffffffffffffffffffffffffffffff8a16600090815260016020908152604080832086845290915281208054849290610cc1908490612a2e565b9091555050600101610bfb565b508873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8b8b8b8b604051610d499493929190612a95565b60405180910390a473ffffffffffffffffffffffffffffffffffffffff89163b15610ea1576040517fbc197c81000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff8b169063bc197c8190610dd09033908f908e908e908e908e908e908e90600401612b10565b6020604051808303816000875af1158015610def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e139190612b81565b7fffffffff000000000000000000000000000000000000000000000000000000001614610e9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f554e534146455f524543495049454e540000000000000000000000000000000060448201526064016107cc565b610f1e565b73ffffffffffffffffffffffffffffffffffffffff8916610f1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f524543495049454e5400000000000000000000000000000060448201526064016107cc565b50505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610fab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107cc565b7fd7ad744cc76ebad190995130eec8ba506b3605612d23b5b9cef8e27f14d138b460048383604051610fdf93929190612c39565b60405180910390a16004610ff4828483612cde565b505050565b3360008181526001602090815260408083208584529091528120548392910361104e576040517f225e797800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ff433846001611ddb565b600960205260009081526040902080546106c190612886565b60608382146110de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4c454e4754485f4d49534d41544348000000000000000000000000000000000060448201526064016107cc565b8367ffffffffffffffff8111156110f7576110f7612c69565b604051908082528060200260200182016040528015611120578160200160208202803683370190505b50905060005b848110156111e25760016000878784818110611144576111446129e8565b9050602002016020810190611159919061248c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008585848181106111a7576111a76129e8565b905060200201358152602001908152602001600020548282815181106111cf576111cf6129e8565b6020908102919091010152600101611126565b50949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461126c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107cc565b600082815260066020908152604091829020548251858152918201529081018290527f04c9029ff6e1c93c237a73a6215b410b7d5da15081897c70baa40b4b70c9c5ba9060600160405180910390a160009182526006602052604090912055565b60005473ffffffffffffffffffffffffffffffffffffffff16331461134e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107cc565b6000838152600960205260409081902090517fd03378e710a4f526d1030d6dd70e5c0999dcaf843ca8a83aadcb0946a251de8e916113929186919086908690612df9565b60405180910390a160008381526009602052604090206113b3828483612cde565b50505050565b600480546106c190612886565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000838152600660205260408120548491036114a5576040517fceea21b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805133602080830191909152818301879052825180830384018152606090920183528151918101919091206000908152600a9091522054849060ff161561151a576040517ff5e79fe200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055460ff16611556576040517f3990ac6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b16602082015260009060340160405160208183030381529060405280519060200120905060006115c38686600660008b81526020019081526020016000205485611e7b565b9050806115fc576040517f8a585be200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080513360208083018290528284018b9052835180840385018152606084018086528151918301919091206000908152600a90925284822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155608090940190945283526116789290918a91611ebb565b50505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611702576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107cc565b6000838152600760205260409081902090517fe05159d70cd0a8c0a2b560a013f275d63402060866a4c7d88939a171af3fa47a916117469186919086908690612df9565b60405180910390a160008381526007602052604090206113b3828483612cde565b60005473ffffffffffffffffffffffffffffffffffffffff1633146117e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107cc565b6005546040805160ff9092161515825282151560208301527f08aed1f06296396343441adcceab9d7976ec03393a50caa84e62c1f50c330141910160405180910390a1600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b600860205260009081526040902080546106c190612886565b60005473ffffffffffffffffffffffffffffffffffffffff1633146118f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107cc565b6000838152600860205260409081902090517fbb899218462f97dbf31b80fa02f799d474b4e4674119081af62a1fcc938274339161193a9186919086908690612df9565b60405180910390a160008381526008602052604090206113b3828483612cde565b600081815260096020908152604080832060088352818420600784529382902091516060946106a29461199094919201612eb6565b60405160208183030381529060405261211e565b3373ffffffffffffffffffffffffffffffffffffffff871614806119f8575073ffffffffffffffffffffffffffffffffffffffff8616600090815260026020908152604080832033845290915290205460ff165b611a5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016107cc565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260016020908152604080832087845290915281208054859290611a9e908490612a17565b909155505073ffffffffffffffffffffffffffffffffffffffff8516600090815260016020908152604080832087845290915281208054859290611ae3908490612a2e565b9091555050604080518581526020810185905273ffffffffffffffffffffffffffffffffffffffff808816929089169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a473ffffffffffffffffffffffffffffffffffffffff85163b15611c8c576040517ff23a6e61000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff87169063f23a6e6190611bbb9033908b908a908a908a908a90600401612f7a565b6020604051808303816000875af1158015611bda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfe9190612b81565b7fffffffff000000000000000000000000000000000000000000000000000000001614611c87576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f554e534146455f524543495049454e540000000000000000000000000000000060448201526064016107cc565b611d09565b73ffffffffffffffffffffffffffffffffffffffff8516611d09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f524543495049454e5400000000000000000000000000000060448201526064016107cc565b505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611d92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107cc565b7f6c20b91d1723b78732eba64ff11ebd7966a6e4af568a00fa4f6b72c20f58b02a60038383604051611dc693929190612c39565b60405180910390a16003610ff4828483612cde565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020908152604080832085845290915281208054839290611e1b908490612a17565b9091555050604080518381526020810183905260009173ffffffffffffffffffffffffffffffffffffffff86169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4505050565b600081858560051b81015b80821015611eae57813580841160051b93845260209384185260406000209290910190611e86565b5050909214949350505050565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260016020908152604080832086845290915281208054849290611efb908490612a2e565b9091555050604080518481526020810184905273ffffffffffffffffffffffffffffffffffffffff86169160009133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a473ffffffffffffffffffffffffffffffffffffffff84163b156120a1576040517ff23a6e61000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff86169063f23a6e6190611fd0903390600090899089908990600401612fcc565b6020604051808303816000875af1158015611fef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120139190612b81565b7fffffffff00000000000000000000000000000000000000000000000000000000161461209c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f554e534146455f524543495049454e540000000000000000000000000000000060448201526064016107cc565b6113b3565b73ffffffffffffffffffffffffffffffffffffffff84166113b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f524543495049454e5400000000000000000000000000000060448201526064016107cc565b80516060906000819003612142575050604080516020810190915260008152919050565b60006003612151836002612a2e565b61215b91906129d4565b612166906004612997565b90506000612175826020612a2e565b67ffffffffffffffff81111561218d5761218d612c69565b6040519080825280601f01601f1916602001820160405280156121b7576020820181803683370190505b5090506000604051806060016040528060408152602001613012604091399050600181016020830160005b86811015612243576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b8352600490920191016121e2565b50600386066001811461225d57600281146122a7576122ed565b7f3d3d0000000000000000000000000000000000000000000000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8301526122ed565b7f3d000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301525b505050918152949350505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461231f57600080fd5b919050565b6000806040838503121561233757600080fd5b612340836122fb565b946020939093013593505050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461237c57600080fd5b50565b60006020828403121561239157600080fd5b813561239c8161234e565b9392505050565b6000602082840312156123b557600080fd5b5035919050565b60005b838110156123d75781810151838201526020016123bf565b838111156113b35750506000910152565b600081518084526124008160208601602086016123bc565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061239c60208301846123e8565b60008060006060848603121561245a57600080fd5b8335925061246a602085016122fb565b9150604084013561ffff8116811461248157600080fd5b809150509250925092565b60006020828403121561249e57600080fd5b61239c826122fb565b600080604083850312156124ba57600080fd5b50508035926020909101359150565b60008083601f8401126124db57600080fd5b50813567ffffffffffffffff8111156124f357600080fd5b6020830191508360208260051b850101111561250e57600080fd5b9250929050565b60008083601f84011261252757600080fd5b50813567ffffffffffffffff81111561253f57600080fd5b60208301915083602082850101111561250e57600080fd5b60008060008060008060008060a0898b03121561257357600080fd5b61257c896122fb565b975061258a60208a016122fb565b9650604089013567ffffffffffffffff808211156125a757600080fd5b6125b38c838d016124c9565b909850965060608b01359150808211156125cc57600080fd5b6125d88c838d016124c9565b909650945060808b01359150808211156125f157600080fd5b506125fe8b828c01612515565b999c989b5096995094979396929594505050565b6000806020838503121561262557600080fd5b823567ffffffffffffffff81111561263c57600080fd5b61264885828601612515565b90969095509350505050565b6000806000806040858703121561266a57600080fd5b843567ffffffffffffffff8082111561268257600080fd5b61268e888389016124c9565b909650945060208701359150808211156126a757600080fd5b506126b4878288016124c9565b95989497509550505050565b6020808252825182820181905260009190848201906040850190845b818110156126f8578351835292840192918401916001016126dc565b50909695505050505050565b60008060006040848603121561271957600080fd5b83359250602084013567ffffffffffffffff81111561273757600080fd5b61274386828701612515565b9497909650939450505050565b8035801515811461231f57600080fd5b6000806040838503121561277357600080fd5b61277c836122fb565b9150610ac960208401612750565b60008060006040848603121561279f57600080fd5b83359250602084013567ffffffffffffffff8111156127bd57600080fd5b612743868287016124c9565b6000602082840312156127db57600080fd5b61239c82612750565b600080604083850312156127f757600080fd5b612800836122fb565b9150610ac9602084016122fb565b60008060008060008060a0878903121561282757600080fd5b612830876122fb565b955061283e602088016122fb565b94506040870135935060608701359250608087013567ffffffffffffffff81111561286857600080fd5b61287489828a01612515565b979a9699509497509295939492505050565b600181811c9082168061289a57607f821691505b602082108103610966577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161290b81601d8501602087016123bc565b91909101601d0192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061ffff8084168061298b5761298b612918565b92169190910492915050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156129cf576129cf612947565b500290565b6000826129e3576129e3612918565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082821015612a2957612a29612947565b500390565b60008219821115612a4157612a41612947565b500190565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115612a7857600080fd5b8260051b8083602087013760009401602001938452509192915050565b604081526000612aa9604083018688612a46565b8281036020840152612abc818587612a46565b979650505050505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600073ffffffffffffffffffffffffffffffffffffffff808b168352808a1660208401525060a06040830152612b4a60a08301888a612a46565b8281036060840152612b5d818789612a46565b90508281036080840152612b72818587612ac7565b9b9a5050505050505050505050565b600060208284031215612b9357600080fd5b815161239c8161234e565b60008154612bab81612886565b808552602060018381168015612bc85760018114612c0057612c2e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838901528284151560051b8901019550612c2e565b866000528260002060005b85811015612c265781548a8201860152908301908401612c0b565b890184019650505b505050505092915050565b604081526000612c4c6040830186612b9e565b8281036020840152612c5f818587612ac7565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115610ff457600081815260208120601f850160051c81016020861015612cbf5750805b601f850160051c820191505b81811015611d0957828155600101612ccb565b67ffffffffffffffff831115612cf657612cf6612c69565b612d0a83612d048354612886565b83612c98565b6000601f841160018114612d5c5760008515612d265750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355612df2565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015612dab5786850135825560209485019460019092019101612d8b565b5086821015612de6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b848152606060208201526000612e126060830186612b9e565b8281036040840152612abc818587612ac7565b60008154612e3281612886565b60018281168015612e4a5760018114612e7d57612eac565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450612eac565b8560005260208060002060005b85811015612ea35781548a820152908401908201612e8a565b50505082870194505b5050505092915050565b7f7b226e616d65223a20220000000000000000000000000000000000000000000081526000612ee8600a830186612e25565b7f222c20226465736372697074696f6e223a2022000000000000000000000000008152612f186013820186612e25565b90507f222c2022696d616765223a2022000000000000000000000000000000000000008152612f4a600d820185612e25565b7f227d00000000000000000000000000000000000000000000000000000000000081526002019695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808916835280881660208401525085604083015284606083015260a06080830152612fc060a083018486612ac7565b98975050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a06080830152612abc60a08301846123e856fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa164736f6c634300080f000a0000000000000000000000000000000000000000000000000000000000000001ea8c0c04021f9d39fd5eb0ae11eadae6f293566dddb593bbfacc3a820034eac900000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000058407666cb296e79d69aa7b1e676a7b4f8bc039f00000000000000000000000000000000000000000000000000000000000003e80000000000000000000000000000000000000000000000000000000000000042697066733a2f2f6261667962656963666b377a783676726969757636736e6e3276666875627637366a6c6f62656762376f626a336c376663727574357035726e6165000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001153657074656d6265722053686f7765727300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001455c2253657074656d6265722053686f776572735c22206973206120446972742044414f20636f6d6d697373696f6e2066726f6d204e6577204f726c65616e732d6261736564206172746973742c20536563726574736f7765722e2044726177696e67206f6e207468652076697375616c20766f636162756c61727920686520646576656c6f70656420666f722074686520312c313131206e6f6e2d66756e6769626c6520666c6f77657273206b6e6f776e20617320426c6f6f6d6572732c20536563726574736f77657220696d6167696e657320446972747920696e20746865206d69647374206f6620612053657074656d626572207261696e73746f726d2c20616e2065786f74696320666c6f77657220626c6f73736f6d696e672066726f6d2068697320666f7265686561642e205768617420636f756c64206265206265747465723f000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101e45760003560e01c806355cdccc61161010f578063da3a222f116100a2578063eef0c77911610071578063eef0c779146104bb578063f242432a146104ce578063fbc1fbe7146104e1578063ff7473fc146104f457600080fd5b8063da3a222f14610454578063e6f859e714610467578063e985e9c51461047a578063eec8d84d146104a857600080fd5b806395d89b41116100de57806395d89b4114610413578063a22cb4651461041b578063ba41b0c61461042e578063ce1c95ee1461044157600080fd5b806355cdccc61461038857806371c5ecb11461039b578063824a72f7146103bb5780638da5cb5b146103ce57600080fd5b8063238dafe0116101875780633f1cdbdf116101565780633f1cdbdf1461031f57806342966c68146103425780634622ab03146103555780634e1273f41461036857600080fd5b8063238dafe0146102ad5780632a55205a146102ba5780632eb2c2d6146102f957806336730c1c1461030c57600080fd5b806306fdde03116101c357806306fdde031461026a57806309ba02e3146102725780630e89341c1461028757806313af40351461029a57600080fd5b8062fdd58e146101e957806301ffc9a714610227578063061ba2f11461024a575b600080fd5b6102146101f7366004612324565b600160209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b61023a61023536600461237f565b610577565b604051901515815260200161021e565b61025d6102583660046123a3565b6106a8565b60405161021e9190612432565b61025d610742565b610285610280366004612445565b61074f565b005b61025d6102953660046123a3565b6108ef565b6102856102a836600461248c565b61096c565b60055461023a9060ff1681565b6102cd6102c83660046124a7565b610a5d565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260208301919091520161021e565b610285610307366004612557565b610ad2565b61028561031a366004612612565b610f2a565b61023a61032d3660046123a3565b600a6020526000908152604090205460ff1681565b6102856103503660046123a3565b610ff9565b61025d6103633660046123a3565b61105a565b61037b610376366004612654565b611073565b60405161021e91906126c0565b6102856103963660046124a7565b6111eb565b6102146103a93660046123a3565b60066020526000908152604090205481565b6102856103c9366004612704565b6112cd565b6000546103ee9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161021e565b61025d6113b9565b610285610429366004612760565b6113c6565b61028561043c36600461278a565b61145d565b61028561044f366004612704565b611681565b6102856104623660046127c9565b611767565b61025d6104753660046123a3565b61185c565b61023a6104883660046127e4565b600260209081526000928352604080842090915290825290205460ff1681565b6102856104b6366004612704565b611875565b61025d6104c93660046123a3565b61195b565b6102856104dc36600461280e565b6119a4565b6102856104ef366004612612565b611d11565b6105486105023660046123a3565b600b6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900461ffff1682565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835261ffff90911660208301520161021e565b60007f2a55205a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061060a57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b8061065657507fd9b67a26000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b806106a257507f0e89341c000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b600760205260009081526040902080546106c190612886565b80601f01602080910402602001604051908101604052809291908181526020018280546106ed90612886565b801561073a5780601f1061070f5761010080835404028352916020019161073a565b820191906000526020600020905b81548152906001019060200180831161071d57829003601f168201915b505050505081565b600380546106c190612886565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b60408051808201825273ffffffffffffffffffffffffffffffffffffffff848116825261ffff84811660208085019182526000898152600b825286902086518a815290548086169282019290925260a091821c841696810196909652845190931660608601525116608084015290917fe18786ec8c9119144e08345df5f8009d5f113a8e2ba24623b2bdaaa3f4486fe8910160405180910390a16000938452600b6020908152604090942081518154959092015161ffff1674010000000000000000000000000000000000000000027fffffffffffffffffffff0000000000000000000000000000000000000000000090951673ffffffffffffffffffffffffffffffffffffffff90921691909117939093179092555050565b6000818152600660205260408120546060918391900361093b576040517fceea21b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109448361195b565b60405160200161095491906128d3565b60405160208183030381529060405291505b50919050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146109ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107cc565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b6000828152600b602052604081205473ffffffffffffffffffffffffffffffffffffffff811691906064908490610ab190839074010000000000000000000000000000000000000000900461ffff16612976565b61ffff16610abf9190612997565b610ac991906129d4565b90509250929050565b848314610b3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4c454e4754485f4d49534d41544348000000000000000000000000000000000060448201526064016107cc565b3373ffffffffffffffffffffffffffffffffffffffff89161480610b8f575073ffffffffffffffffffffffffffffffffffffffff8816600090815260026020908152604080832033845290915290205460ff165b610bf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016107cc565b60008060005b87811015610cce57888882818110610c1557610c156129e8565b905060200201359250868682818110610c3057610c306129e8565b73ffffffffffffffffffffffffffffffffffffffff8e16600090815260016020908152604080832089845282528220805493909102949094013595508593925090610c7c908490612a17565b909155505073ffffffffffffffffffffffffffffffffffffffff8a16600090815260016020908152604080832086845290915281208054849290610cc1908490612a2e565b9091555050600101610bfb565b508873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8b8b8b8b604051610d499493929190612a95565b60405180910390a473ffffffffffffffffffffffffffffffffffffffff89163b15610ea1576040517fbc197c81000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff8b169063bc197c8190610dd09033908f908e908e908e908e908e908e90600401612b10565b6020604051808303816000875af1158015610def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e139190612b81565b7fffffffff000000000000000000000000000000000000000000000000000000001614610e9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f554e534146455f524543495049454e540000000000000000000000000000000060448201526064016107cc565b610f1e565b73ffffffffffffffffffffffffffffffffffffffff8916610f1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f524543495049454e5400000000000000000000000000000060448201526064016107cc565b50505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610fab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107cc565b7fd7ad744cc76ebad190995130eec8ba506b3605612d23b5b9cef8e27f14d138b460048383604051610fdf93929190612c39565b60405180910390a16004610ff4828483612cde565b505050565b3360008181526001602090815260408083208584529091528120548392910361104e576040517f225e797800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ff433846001611ddb565b600960205260009081526040902080546106c190612886565b60608382146110de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4c454e4754485f4d49534d41544348000000000000000000000000000000000060448201526064016107cc565b8367ffffffffffffffff8111156110f7576110f7612c69565b604051908082528060200260200182016040528015611120578160200160208202803683370190505b50905060005b848110156111e25760016000878784818110611144576111446129e8565b9050602002016020810190611159919061248c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008585848181106111a7576111a76129e8565b905060200201358152602001908152602001600020548282815181106111cf576111cf6129e8565b6020908102919091010152600101611126565b50949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461126c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107cc565b600082815260066020908152604091829020548251858152918201529081018290527f04c9029ff6e1c93c237a73a6215b410b7d5da15081897c70baa40b4b70c9c5ba9060600160405180910390a160009182526006602052604090912055565b60005473ffffffffffffffffffffffffffffffffffffffff16331461134e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107cc565b6000838152600960205260409081902090517fd03378e710a4f526d1030d6dd70e5c0999dcaf843ca8a83aadcb0946a251de8e916113929186919086908690612df9565b60405180910390a160008381526009602052604090206113b3828483612cde565b50505050565b600480546106c190612886565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000838152600660205260408120548491036114a5576040517fceea21b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805133602080830191909152818301879052825180830384018152606090920183528151918101919091206000908152600a9091522054849060ff161561151a576040517ff5e79fe200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055460ff16611556576040517f3990ac6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b16602082015260009060340160405160208183030381529060405280519060200120905060006115c38686600660008b81526020019081526020016000205485611e7b565b9050806115fc576040517f8a585be200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080513360208083018290528284018b9052835180840385018152606084018086528151918301919091206000908152600a90925284822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155608090940190945283526116789290918a91611ebb565b50505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611702576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107cc565b6000838152600760205260409081902090517fe05159d70cd0a8c0a2b560a013f275d63402060866a4c7d88939a171af3fa47a916117469186919086908690612df9565b60405180910390a160008381526007602052604090206113b3828483612cde565b60005473ffffffffffffffffffffffffffffffffffffffff1633146117e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107cc565b6005546040805160ff9092161515825282151560208301527f08aed1f06296396343441adcceab9d7976ec03393a50caa84e62c1f50c330141910160405180910390a1600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b600860205260009081526040902080546106c190612886565b60005473ffffffffffffffffffffffffffffffffffffffff1633146118f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107cc565b6000838152600860205260409081902090517fbb899218462f97dbf31b80fa02f799d474b4e4674119081af62a1fcc938274339161193a9186919086908690612df9565b60405180910390a160008381526008602052604090206113b3828483612cde565b600081815260096020908152604080832060088352818420600784529382902091516060946106a29461199094919201612eb6565b60405160208183030381529060405261211e565b3373ffffffffffffffffffffffffffffffffffffffff871614806119f8575073ffffffffffffffffffffffffffffffffffffffff8616600090815260026020908152604080832033845290915290205460ff165b611a5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016107cc565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260016020908152604080832087845290915281208054859290611a9e908490612a17565b909155505073ffffffffffffffffffffffffffffffffffffffff8516600090815260016020908152604080832087845290915281208054859290611ae3908490612a2e565b9091555050604080518581526020810185905273ffffffffffffffffffffffffffffffffffffffff808816929089169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a473ffffffffffffffffffffffffffffffffffffffff85163b15611c8c576040517ff23a6e61000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff87169063f23a6e6190611bbb9033908b908a908a908a908a90600401612f7a565b6020604051808303816000875af1158015611bda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfe9190612b81565b7fffffffff000000000000000000000000000000000000000000000000000000001614611c87576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f554e534146455f524543495049454e540000000000000000000000000000000060448201526064016107cc565b611d09565b73ffffffffffffffffffffffffffffffffffffffff8516611d09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f524543495049454e5400000000000000000000000000000060448201526064016107cc565b505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611d92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107cc565b7f6c20b91d1723b78732eba64ff11ebd7966a6e4af568a00fa4f6b72c20f58b02a60038383604051611dc693929190612c39565b60405180910390a16003610ff4828483612cde565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020908152604080832085845290915281208054839290611e1b908490612a17565b9091555050604080518381526020810183905260009173ffffffffffffffffffffffffffffffffffffffff86169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4505050565b600081858560051b81015b80821015611eae57813580841160051b93845260209384185260406000209290910190611e86565b5050909214949350505050565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260016020908152604080832086845290915281208054849290611efb908490612a2e565b9091555050604080518481526020810184905273ffffffffffffffffffffffffffffffffffffffff86169160009133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a473ffffffffffffffffffffffffffffffffffffffff84163b156120a1576040517ff23a6e61000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff86169063f23a6e6190611fd0903390600090899089908990600401612fcc565b6020604051808303816000875af1158015611fef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120139190612b81565b7fffffffff00000000000000000000000000000000000000000000000000000000161461209c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f554e534146455f524543495049454e540000000000000000000000000000000060448201526064016107cc565b6113b3565b73ffffffffffffffffffffffffffffffffffffffff84166113b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f524543495049454e5400000000000000000000000000000060448201526064016107cc565b80516060906000819003612142575050604080516020810190915260008152919050565b60006003612151836002612a2e565b61215b91906129d4565b612166906004612997565b90506000612175826020612a2e565b67ffffffffffffffff81111561218d5761218d612c69565b6040519080825280601f01601f1916602001820160405280156121b7576020820181803683370190505b5090506000604051806060016040528060408152602001613012604091399050600181016020830160005b86811015612243576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b8352600490920191016121e2565b50600386066001811461225d57600281146122a7576122ed565b7f3d3d0000000000000000000000000000000000000000000000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8301526122ed565b7f3d000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301525b505050918152949350505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461231f57600080fd5b919050565b6000806040838503121561233757600080fd5b612340836122fb565b946020939093013593505050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461237c57600080fd5b50565b60006020828403121561239157600080fd5b813561239c8161234e565b9392505050565b6000602082840312156123b557600080fd5b5035919050565b60005b838110156123d75781810151838201526020016123bf565b838111156113b35750506000910152565b600081518084526124008160208601602086016123bc565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061239c60208301846123e8565b60008060006060848603121561245a57600080fd5b8335925061246a602085016122fb565b9150604084013561ffff8116811461248157600080fd5b809150509250925092565b60006020828403121561249e57600080fd5b61239c826122fb565b600080604083850312156124ba57600080fd5b50508035926020909101359150565b60008083601f8401126124db57600080fd5b50813567ffffffffffffffff8111156124f357600080fd5b6020830191508360208260051b850101111561250e57600080fd5b9250929050565b60008083601f84011261252757600080fd5b50813567ffffffffffffffff81111561253f57600080fd5b60208301915083602082850101111561250e57600080fd5b60008060008060008060008060a0898b03121561257357600080fd5b61257c896122fb565b975061258a60208a016122fb565b9650604089013567ffffffffffffffff808211156125a757600080fd5b6125b38c838d016124c9565b909850965060608b01359150808211156125cc57600080fd5b6125d88c838d016124c9565b909650945060808b01359150808211156125f157600080fd5b506125fe8b828c01612515565b999c989b5096995094979396929594505050565b6000806020838503121561262557600080fd5b823567ffffffffffffffff81111561263c57600080fd5b61264885828601612515565b90969095509350505050565b6000806000806040858703121561266a57600080fd5b843567ffffffffffffffff8082111561268257600080fd5b61268e888389016124c9565b909650945060208701359150808211156126a757600080fd5b506126b4878288016124c9565b95989497509550505050565b6020808252825182820181905260009190848201906040850190845b818110156126f8578351835292840192918401916001016126dc565b50909695505050505050565b60008060006040848603121561271957600080fd5b83359250602084013567ffffffffffffffff81111561273757600080fd5b61274386828701612515565b9497909650939450505050565b8035801515811461231f57600080fd5b6000806040838503121561277357600080fd5b61277c836122fb565b9150610ac960208401612750565b60008060006040848603121561279f57600080fd5b83359250602084013567ffffffffffffffff8111156127bd57600080fd5b612743868287016124c9565b6000602082840312156127db57600080fd5b61239c82612750565b600080604083850312156127f757600080fd5b612800836122fb565b9150610ac9602084016122fb565b60008060008060008060a0878903121561282757600080fd5b612830876122fb565b955061283e602088016122fb565b94506040870135935060608701359250608087013567ffffffffffffffff81111561286857600080fd5b61287489828a01612515565b979a9699509497509295939492505050565b600181811c9082168061289a57607f821691505b602082108103610966577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161290b81601d8501602087016123bc565b91909101601d0192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061ffff8084168061298b5761298b612918565b92169190910492915050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156129cf576129cf612947565b500290565b6000826129e3576129e3612918565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082821015612a2957612a29612947565b500390565b60008219821115612a4157612a41612947565b500190565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115612a7857600080fd5b8260051b8083602087013760009401602001938452509192915050565b604081526000612aa9604083018688612a46565b8281036020840152612abc818587612a46565b979650505050505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600073ffffffffffffffffffffffffffffffffffffffff808b168352808a1660208401525060a06040830152612b4a60a08301888a612a46565b8281036060840152612b5d818789612a46565b90508281036080840152612b72818587612ac7565b9b9a5050505050505050505050565b600060208284031215612b9357600080fd5b815161239c8161234e565b60008154612bab81612886565b808552602060018381168015612bc85760018114612c0057612c2e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838901528284151560051b8901019550612c2e565b866000528260002060005b85811015612c265781548a8201860152908301908401612c0b565b890184019650505b505050505092915050565b604081526000612c4c6040830186612b9e565b8281036020840152612c5f818587612ac7565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115610ff457600081815260208120601f850160051c81016020861015612cbf5750805b601f850160051c820191505b81811015611d0957828155600101612ccb565b67ffffffffffffffff831115612cf657612cf6612c69565b612d0a83612d048354612886565b83612c98565b6000601f841160018114612d5c5760008515612d265750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355612df2565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015612dab5786850135825560209485019460019092019101612d8b565b5086821015612de6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b848152606060208201526000612e126060830186612b9e565b8281036040840152612abc818587612ac7565b60008154612e3281612886565b60018281168015612e4a5760018114612e7d57612eac565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450612eac565b8560005260208060002060005b85811015612ea35781548a820152908401908201612e8a565b50505082870194505b5050505092915050565b7f7b226e616d65223a20220000000000000000000000000000000000000000000081526000612ee8600a830186612e25565b7f222c20226465736372697074696f6e223a2022000000000000000000000000008152612f186013820186612e25565b90507f222c2022696d616765223a2022000000000000000000000000000000000000008152612f4a600d820185612e25565b7f227d00000000000000000000000000000000000000000000000000000000000081526002019695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808916835280881660208401525085604083015284606083015260a06080830152612fc060a083018486612ac7565b98975050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a06080830152612abc60a08301846123e856fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa164736f6c634300080f000a

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000000000000000000000000000000000000000001ea8c0c04021f9d39fd5eb0ae11eadae6f293566dddb593bbfacc3a820034eac900000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000058407666cb296e79d69aa7b1e676a7b4f8bc039f00000000000000000000000000000000000000000000000000000000000003e80000000000000000000000000000000000000000000000000000000000000042697066733a2f2f6261667962656963666b377a783676726969757636736e6e3276666875627637366a6c6f62656762376f626a336c376663727574357035726e6165000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001153657074656d6265722053686f7765727300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001455c2253657074656d6265722053686f776572735c22206973206120446972742044414f20636f6d6d697373696f6e2066726f6d204e6577204f726c65616e732d6261736564206172746973742c20536563726574736f7765722e2044726177696e67206f6e207468652076697375616c20766f636162756c61727920686520646576656c6f70656420666f722074686520312c313131206e6f6e2d66756e6769626c6520666c6f77657273206b6e6f776e20617320426c6f6f6d6572732c20536563726574736f77657220696d6167696e657320446972747920696e20746865206d69647374206f6620612053657074656d626572207261696e73746f726d2c20616e2065786f74696320666c6f77657220626c6f73736f6d696e672066726f6d2068697320666f7265686561642e205768617420636f756c64206265206265747465723f000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _enabled (bool): True
Arg [1] : _initialMerkleRoot (bytes32): 0xea8c0c04021f9d39fd5eb0ae11eadae6f293566dddb593bbfacc3a820034eac9
Arg [2] : _initialImageData (string): ipfs://bafybeicfk7zx6vriiuv6snn2vfhubv76jlobegb7obj3l7fcrut5p5rnae
Arg [3] : _initialName (string): September Showers
Arg [4] : _initialDescription (string): \"September Showers\" is a Dirt DAO commission from New Orleans-based artist, Secretsower. Drawing on the visual vocabulary he developed for the 1,111 non-fungible flowers known as Bloomers, Secretsower imagines Dirty in the midst of a September rainstorm, an exotic flower blossoming from his forehead. What could be better?
Arg [5] : _initialCreator (address): 0x58407666Cb296E79D69Aa7B1E676a7b4F8Bc039F
Arg [6] : _initialRoyalty (uint16): 1000

-----Encoded View---------------
25 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [1] : ea8c0c04021f9d39fd5eb0ae11eadae6f293566dddb593bbfacc3a820034eac9
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [4] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [5] : 00000000000000000000000058407666cb296e79d69aa7b1e676a7b4f8bc039f
Arg [6] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000042
Arg [8] : 697066733a2f2f6261667962656963666b377a783676726969757636736e6e32
Arg [9] : 76666875627637366a6c6f62656762376f626a336c376663727574357035726e
Arg [10] : 6165000000000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000011
Arg [12] : 53657074656d6265722053686f77657273000000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000145
Arg [14] : 5c2253657074656d6265722053686f776572735c222069732061204469727420
Arg [15] : 44414f20636f6d6d697373696f6e2066726f6d204e6577204f726c65616e732d
Arg [16] : 6261736564206172746973742c20536563726574736f7765722e204472617769
Arg [17] : 6e67206f6e207468652076697375616c20766f636162756c6172792068652064
Arg [18] : 6576656c6f70656420666f722074686520312c313131206e6f6e2d66756e6769
Arg [19] : 626c6520666c6f77657273206b6e6f776e20617320426c6f6f6d6572732c2053
Arg [20] : 6563726574736f77657220696d6167696e657320446972747920696e20746865
Arg [21] : 206d69647374206f6620612053657074656d626572207261696e73746f726d2c
Arg [22] : 20616e2065786f74696320666c6f77657220626c6f73736f6d696e672066726f
Arg [23] : 6d2068697320666f7265686561642e205768617420636f756c64206265206265
Arg [24] : 747465723f000000000000000000000000000000000000000000000000000000


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

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