ETH Price: $3,273.27 (+0.82%)
Gas: 1 Gwei

Token

 

Overview

Max Total Supply

680

Holders

249

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
regente.eth
0x6cdd7327a426aeb2e1259d2432efa5c1dec2dc4c
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:
Achievements

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion
File 1 of 4 : Achievements.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.14;

import "openzeppelin/utils/Strings.sol";
import "solmate/tokens/ERC1155.sol";

import "./Owned.sol";

/// @title Solarbots Achievements
/// @author Solarbots (https://solarbots.io)
/// @notice All achievements are soulbound,
/// i.e. can't be transferred by the token owner.
/// Only approved operators can mint, transfer, and burn
/// tokens. Token owners can only burn their own tokens.
contract Achievements is ERC1155, Owned {
    // ---------- CONSTANTS ----------

    /// @dev "Error(string)" signature: bytes32(bytes4(keccak256("Error(string)")))
    bytes32 private constant _ERROR_FUNCTION_SIGNATURE = 0x08c379a000000000000000000000000000000000000000000000000000000000;

    /// @dev bytes32(abi.encodePacked("INSUFFICIENT_BALANCE"))
    bytes32 private constant _INSUFFICIENT_BALANCE_MESSAGE = 0x494e53554646494349454e545f42414c414e4345000000000000000000000000;

    /// @dev "INSUFFICIENT_BALANCE" is 20 characters long
    uint256 private constant _INSUFFICIENT_BALANCE_LENGTH = 20;

    // ---------- STATE ----------

    /// @notice Metadata base URI
    string public baseURI;

    /// @notice Metadata URI suffix
    string public uriSuffix;

    // ---------- CONSTRUCTOR ----------

    /// @param owner Contract owner
    constructor(address owner) Owned(owner) {}

    // ---------- METADATA ----------

    /// @notice Get metadata URI
    /// @param id Token ID
    /// @return Metadata URI of token ID `id`
    function uri(uint256 id) public view override returns (string memory) {
        require(bytes(baseURI).length > 0, "NO_METADATA");
		return string(abi.encodePacked(baseURI, Strings.toString(id), uriSuffix));
    }

    /// @notice Set metadata base URI
    /// @param _baseURI New metadata base URI
    /// @dev Doesn't emit URI event, because `id` argument isn't used
    function setBaseURI(string calldata _baseURI) public onlyOwner {
        baseURI = _baseURI;
    }

    /// @notice Set metadata URI suffix
    /// @param _uriSuffix New metadata URI suffix
    /// @dev Doesn't emit URI event, because `id` argument isn't used
    function setURISuffix(string calldata _uriSuffix) public onlyOwner {
        uriSuffix = _uriSuffix;
    }

    // ---------- APPROVAL ----------

    /// @notice Grants or revokes permission to `operator` to transfer tokens
    /// @dev Only callable by contract owner
    /// @param operator Operator address
    /// @param approved Whether to grant or revoke permission
    function setApprovalForAll(
        address operator,
        bool approved
    ) public virtual override onlyOwner {
        isApprovedForAll[address(0)][operator] = approved;

        emit ApprovalForAll(address(0), operator, approved);
    }

    // ---------- TRANSFER ----------

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

        // Use assembly to perform optimized balance updates
        // Same balance updates in unoptimized Solidity:
        //
        // balanceOf[from][id] -= amount;
        // balanceOf[to][id] += amount;
        //
        /// @solidity memory-safe-assembly
        assembly {
            // Calculate the storage slot of `balanceOf[from]`
            // by concatenating the `from` address and the
            // slot of `balanceOf` in the scratch space used
            // by hashing methods, i.e. the first two 32 bytes
            // of memory. The keccak256 hash of the concatenated
            // values is the storage slot we're looking for.
            mstore(0x00, from)
            mstore(0x20, balanceOf.slot)
            let balanceOfFromSlot := keccak256(0x00, 0x40)

            // Calculate storage slot of `balanceOf[to]`
            mstore(0x00, to)
            // 0x20 still contains `balanceOf.slot`
            let balanceOfToSlot := keccak256(0x00, 0x40)

            // Calculate storage slot of `balanceOf[from][id]`
            mstore(0x00, id)
            mstore(0x20, balanceOfFromSlot)
            let amountFromSlot := keccak256(0x00, 0x40)

            // Calculate storage slot of `balanceOf[to][id]`
            // 0x00 still contains current id
            mstore(0x20, balanceOfToSlot)
            let amountToSlot := keccak256(0x00, 0x40)

            // Load amount currently stored in `balanceOf[from][id]`
            let currentAmountFrom := sload(amountFromSlot)
            // Revert with message "INSUFFICIENT_BALANCE" if the
            // transfer amount is greater than the current amount
            // of `from` to prevent an integer underflow
            if gt(amount, currentAmountFrom) {
                let freeMemory := mload(0x40)
                // Store "Error(string)" signature
                mstore(freeMemory, _ERROR_FUNCTION_SIGNATURE)
                // Store data offset
                mstore(add(freeMemory, 0x04), 0x20)
                // Store length of revert string
                mstore(add(freeMemory, 0x24), _INSUFFICIENT_BALANCE_LENGTH)
                // Store revert string
                mstore(add(freeMemory, 0x44), _INSUFFICIENT_BALANCE_MESSAGE)
                revert(freeMemory, 0x64)
            }
            // Subtract transfer amount from current amount of `from`
            let newAmountFrom := sub(currentAmountFrom, amount)

            // Load amount currently stored in `balanceOf[to][id]`
            let currentAmountTo := sload(amountToSlot)
            // Add transfer amount to current amount of `to`
            // Realistically this will never overflow
            let newAmountTo := add(currentAmountTo, amount)

            // Store new amount of `from` in `balanceOf[from][id]`
            sstore(amountFromSlot, newAmountFrom)
            // Store new amount of `to` in `balanceOf[to][id]`
            sstore(amountToSlot, newAmountTo)
        }

        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 override {
        require(isApprovedForAll[address(0)][msg.sender], "NOT_AUTHORIZED");
        require(ids.length == amounts.length, "LENGTH_MISMATCH");

        // Use assembly to perform optimized balance updates
        // Same balance updates in unoptimized Solidity:
        //
        // for (uint256 i = 0; i < ids.length; ++i) {
        //     uint256 id = ids[i];
        //     uint256 amount = amounts[i];
        //
        //     balanceOf[from][id] -= amount;
        //     balanceOf[to][id] += amount;
        // }
        /// @solidity memory-safe-assembly
        assembly {
            // Calculate the storage slot of `balanceOf[from]`
            // by concatenating the `from` address and the
            // slot of `balanceOf` in the scratch space used
            // by hashing methods, i.e. the first two 32 bytes
            // of memory. The keccak256 hash of the concatenated
            // values is the storage slot we're looking for.
            mstore(0x00, from)
            mstore(0x20, balanceOf.slot)
            let balanceOfFromSlot := keccak256(0x00, 0x40)

            // Calculate storage slot of `balanceOf[to]`
            mstore(0x00, to)
            // 0x20 still contains `balanceOf.slot`
            let balanceOfToSlot := keccak256(0x00, 0x40)

            // Calculate length of arrays `ids` and `amounts` in bytes
            let arrayLength := mul(ids.length, 0x20)

            // Loop over all values in `ids` and `amounts` by starting
            // with an index offset of 0 to access the first array element
            // and incrementing this index by 32 after each iteration to
            // access the next array element until the offset reaches the end
            // of the arrays, at which point all values the arrays contain
            // have been accessed
            for
                { let indexOffset := 0x00 }
                lt(indexOffset, arrayLength)
                { indexOffset := add(indexOffset, 0x20) }
            {
                // Load current array elements by adding offset of current
                // array index to start of each array's data area inside calldata
                let amount := calldataload(add(amounts.offset, indexOffset))

                // Calculate storage slot of `balanceOf[from][id]`
                // Load current id from calldata into the first 32 bytes of memory
                mstore(0x00, calldataload(add(ids.offset, indexOffset)))
                mstore(0x20, balanceOfFromSlot)
                let amountFromSlot := keccak256(0x00, 0x40)

                // Calculate storage slot of `balanceOf[to][id]`
                // 0x00 still contains current id
                mstore(0x20, balanceOfToSlot)
                let amountToSlot := keccak256(0x00, 0x40)

                // Load amount currently stored in `balanceOf[from][id]`
                let currentAmountFrom := sload(amountFromSlot)
                // Revert with message "INSUFFICIENT_BALANCE" if the
                // transfer amount is greater than the current amount
                // of `from` to prevent an integer underflow
                if gt(amount, currentAmountFrom) {
                    let freeMemory := mload(0x40)
                    // Store "Error(string)" signature: bytes32(bytes4(keccak256("Error(string)")))
                    mstore(freeMemory, _ERROR_FUNCTION_SIGNATURE)
                    // Store data offset
                    mstore(add(freeMemory, 0x04), 0x20)
                    // Store length of revert string
                    mstore(add(freeMemory, 0x24), _INSUFFICIENT_BALANCE_LENGTH)
                    // Store revert string
                    mstore(add(freeMemory, 0x44), _INSUFFICIENT_BALANCE_MESSAGE)
                    revert(freeMemory, 0x64)
                }
                // Subtract transfer amount from current amount of `from`
                let newAmountFrom := sub(currentAmountFrom, amount)

                // Load amount currently stored in `balanceOf[to][id]`
                let currentAmountTo := sload(amountToSlot)
                // Add transfer amount to current amount of `to`
                // Realistically this will never overflow
                let newAmountTo := add(currentAmountTo, amount)

                // Store new amount of `from` in `balanceOf[from][id]`
                sstore(amountFromSlot, newAmountFrom)
                // Store new amount of `to` in `balanceOf[to][id]`
                sstore(amountToSlot, newAmountTo)
            }
        }

        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");
    }

    // ---------- MINT ----------

    function mint(
        address to,
        uint256 id,
        uint256 amount
    ) public {
        require(isApprovedForAll[address(0)][msg.sender], "NOT_AUTHORIZED");

        // Realistically this will never overflow
        unchecked {
            balanceOf[to][id] += amount;
        }

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

    function mint(
        address[] calldata addresses,
        uint256[] calldata ids,
        uint256[] calldata amounts
    ) public {
        require(addresses.length == ids.length && ids.length == amounts.length, "LENGTH_MISMATCH");

        // Calculate array length in bytes
        uint256 arrayLength;
        unchecked {
            arrayLength = addresses.length * 0x20;
        }

        for (uint256 indexOffset = 0x00; indexOffset < arrayLength;) {
            address addr;
            uint256 id;
            uint256 amount;

            /// @solidity memory-safe-assembly
            assembly {
                // Load current array elements by adding offset of current
                // array index to start of each array's data area inside calldata
                addr := calldataload(add(addresses.offset, indexOffset))
                id := calldataload(add(ids.offset, indexOffset))
                amount := calldataload(add(amounts.offset, indexOffset))

                // Increment index offset by 32 for next iteration
                indexOffset := add(indexOffset, 0x20)
            }

            mint(addr, id, amount);
        }
    }

    function safeMint(
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) public {
        mint(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[] calldata ids,
        uint256[] calldata amounts
    ) public {
        require(isApprovedForAll[address(0)][msg.sender], "NOT_AUTHORIZED");
        require(ids.length == amounts.length, "LENGTH_MISMATCH");

        // Use assembly to perform optimized balance updates
        // Same balance updates in unoptimized Solidity:
        //
        // for (uint256 i = 0; i < ids.length; ++i) {
        //     uint256 id = ids[i];
        //     uint256 amount = amounts[i];
        //
        //     balanceOf[to][id] += amount;
        // }
        /// @solidity memory-safe-assembly
        assembly {
            // Calculate the storage slot of `balanceOf[to]`
            // by concatenating the `to` address and the
            // slot of `balanceOf` in the scratch space used
            // by hashing methods, i.e. the first two 32 bytes
            // of memory. The keccak256 hash of the concatenated
            // values is the storage slot we're looking for.
            mstore(0x00, to)
            mstore(0x20, balanceOf.slot)
            let balanceOfToSlot := keccak256(0x00, 0x40)

            // Store storage slot of `balanceOf[to]` in the second
            // 32 bytes of scratch space to later calculate the storage
            // slot of `balanceOf[to][id]` inside the loop
            mstore(0x20, balanceOfToSlot)

            // Calculate length of arrays `ids` and `amounts` in bytes
            let arrayLength := mul(ids.length, 0x20)

            // Loop over all values in `ids` and `amounts` by starting
            // with an index offset of 0 to access the first array element
            // and incrementing this index by 32 after each iteration to
            // access the next array element until the offset reaches the end
            // of the arrays, at which point all values the arrays contain
            // have been accessed
            for
                { let indexOffset := 0x00 }
                lt(indexOffset, arrayLength)
                { indexOffset := add(indexOffset, 0x20) }
            {
                // Load current array elements by adding offset of current
                // array index to start of each array's data area inside calldata
                let id := calldataload(add(ids.offset, indexOffset))
                let amount := calldataload(add(amounts.offset, indexOffset))

                // Calculate storage slot of `balanceOf[to][id]`
                mstore(0x00, id)
                // 0x20 still contains `balanceOfToSlot`
                let amountToSlot := keccak256(0x00, 0x40)

                // Load amount currently stored in `balanceOf[to][id]`
                let currentAmountTo := sload(amountToSlot)

                // Add mint amount to current amount of `to`
                // Realistically this will never overflow
                let newAmountTo := add(currentAmountTo, amount)

                // Store new amount in `balanceOf[to][id]`
                sstore(amountToSlot, newAmountTo)
            }
        }

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

    function batchMint(
        address[] calldata addresses,
        uint256[][] calldata ids,
        uint256[][] calldata amounts
    ) public {
        require(addresses.length == ids.length && ids.length == amounts.length, "LENGTH_MISMATCH");

        for (uint256 i = 0; i < addresses.length;) {
            address addr;

            /// @solidity memory-safe-assembly
            assembly {
                // Load current array element by adding offset of current
                // array index to start of array's data area inside calldata
                let indexOffset := mul(i, 0x20)
                addr := calldataload(add(addresses.offset, indexOffset))
            }

            batchMint(addr, ids[i], amounts[i]);

            unchecked {
                i++;
            }
        }
    }

    function safeBatchMint(
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) public {
        batchMint(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");
    }

    // ---------- BURN ----------

    function burn(
        address from,
        uint256 id,
        uint256 amount
    ) public virtual {
        require(msg.sender == from || isApprovedForAll[address(0)][msg.sender], "NOT_AUTHORIZED");

        // Use assembly to perform optimized balance update
        // Same balance update in unoptimized Solidity:
        //
        // balanceOf[from][id] -= amount;
        //
        /// @solidity memory-safe-assembly
        assembly {
            // Calculate the storage slot of `balanceOf[from]`
            // by concatenating the `from` address and the
            // slot of `balanceOf` in the scratch space used
            // by hashing methods, i.e. the first two 32 bytes
            // of memory. The keccak256 hash of the concatenated
            // values is the storage slot we're looking for.
            mstore(0x00, from)
            mstore(0x20, balanceOf.slot)
            let balanceOfFromSlot := keccak256(0x00, 0x40)

            // Calculate storage slot of `balanceOf[from][id]`
            mstore(0x00, id)
            mstore(0x20, balanceOfFromSlot)
            let amountFromSlot := keccak256(0x00, 0x40)

            // Load amount currently stored in `balanceOf[from][id]`
            let currentAmountFrom := sload(amountFromSlot)
            // Revert with message "INSUFFICIENT_BALANCE" if the burn
            // amount is greater than the current amount of `from` to
            // prevent an integer underflow
            if gt(amount, currentAmountFrom) {
                let freeMemory := mload(0x40)
                // Store "Error(string)" signature: bytes32(bytes4(keccak256("Error(string)")))
                mstore(freeMemory, _ERROR_FUNCTION_SIGNATURE)
                // Store data offset
                mstore(add(freeMemory, 0x04), 0x20)
                // Store length of revert string
                mstore(add(freeMemory, 0x24), _INSUFFICIENT_BALANCE_LENGTH)
                // Store revert string
                mstore(add(freeMemory, 0x44), _INSUFFICIENT_BALANCE_MESSAGE)
                revert(freeMemory, 0x64)
            }
            // Subtract burn amount from current amount of `from`
            let newAmountFrom := sub(currentAmountFrom, amount)

            // Store new amount of `from` in `balanceOf[from][id]`
            sstore(amountFromSlot, newAmountFrom)
        }

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

    function batchBurn(
        address from,
        uint256[] calldata ids,
        uint256[] calldata amounts
    ) public virtual {
        require(msg.sender == from || isApprovedForAll[address(0)][msg.sender], "NOT_AUTHORIZED");
        require(ids.length == amounts.length, "LENGTH_MISMATCH");

        // Use assembly to perform optimized balance updates
        // Same balance updates in unoptimized Solidity:
        //
        // for (uint256 i = 0; i < ids.length; ++i) {
        //     uint256 id = ids[i];
        //     uint256 amount = amounts[i];
        //
        //     balanceOf[from][id] -= amount;
        // }
        /// @solidity memory-safe-assembly
        assembly {
            // Calculate the storage slot of `balanceOf[from]`
            // by concatenating the `from` address and the
            // slot of `balanceOf` in the scratch space used
            // by hashing methods, i.e. the first two 32 bytes
            // of memory. The keccak256 hash of the concatenated
            // values is the storage slot we're looking for.
            mstore(0x00, from)
            mstore(0x20, balanceOf.slot)
            let balanceOfFromSlot := keccak256(0x00, 0x40)

            // Store storage slot of `balanceOf[from]` in the second
            // 32 bytes of scratch space to later calculate the storage
            // slot of `balanceOf[from][id]` inside the loop
            mstore(0x20, balanceOfFromSlot)

            // Calculate length of arrays `ids` and `amounts` in bytes
            let arrayLength := mul(ids.length, 0x20)

            // Loop over all values in `ids` and `amounts` by starting
            // with an index offset of 0 to access the first array element
            // and incrementing this index by 32 after each iteration to
            // access the next array element until the offset reaches the end
            // of the arrays, at which point all values the arrays contain
            // have been accessed
            for
                { let indexOffset := 0x00 }
                lt(indexOffset, arrayLength)
                { indexOffset := add(indexOffset, 0x20) }
            {
                // Load current array elements by adding offset of current
                // array index to start of each array's data area inside calldata
                let id := calldataload(add(ids.offset, indexOffset))
                let amount := calldataload(add(amounts.offset, indexOffset))

                // Calculate storage slot of `balanceOf[from][id]`
                mstore(0x00, id)
                // 0x20 still contains `balanceOfFromSlot`
                let amountFromSlot := keccak256(0x00, 0x40)

                // Load amount currently stored in `balanceOf[from][id]`
                let currentAmountFrom := sload(amountFromSlot)
                // Revert with message "INSUFFICIENT_BALANCE" if the burn
                // amount is greater than the current amount of `from` to
                // prevent an integer underflow
                if gt(amount, currentAmountFrom) {
                    let freeMemory := mload(0x40)
                    // Store "Error(string)" signature: bytes32(bytes4(keccak256("Error(string)")))
                    mstore(freeMemory, _ERROR_FUNCTION_SIGNATURE)
                    // Store data offset
                    mstore(add(freeMemory, 0x04), 0x20)
                    // Store length of revert string
                    mstore(add(freeMemory, 0x24), _INSUFFICIENT_BALANCE_LENGTH)
                    // Store revert string
                    mstore(add(freeMemory, 0x44), _INSUFFICIENT_BALANCE_MESSAGE)
                    revert(freeMemory, 0x64)
                }
                // Subtract burn amount from current amount of `from`
                let newAmountFrom := sub(currentAmountFrom, amount)

                // Store new amount of `from` in `balanceOf[from][id]`
                sstore(amountFromSlot, newAmountFrom)
            }
        }

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

File 2 of 4 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

File 3 of 4 : 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 4 : Owned.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.14;

/// @notice Simple contract ownership module
/// @author Solarbots (https://solarbots.io)
abstract contract Owned {
    address public owner;

    event OwnershipTransfer(address indexed previousOwner, address indexed newOwner);

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

        _;
    }

    constructor(address _owner) {
        owner = _owner;

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

    function setOwner(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "INVALID_OWNER");

        owner = newOwner;

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransfer","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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"batchBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[][]","name":"ids","type":"uint256[][]"},{"internalType":"uint256[][]","name":"amounts","type":"uint256[][]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"safeBatchMint","outputs":[],"stateMutability":"nonpayable","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":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","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":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setURISuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50604051620029c6380380620029c6833981016040819052620000349162000088565b600280546001600160a01b0319166001600160a01b0383169081179091556040518291906000907f22500af037c600dd7b720644ab6e358635085601d9ac508ad83eb2d6b2d729ca908290a35050620000ba565b6000602082840312156200009b57600080fd5b81516001600160a01b0381168114620000b357600080fd5b9392505050565b6128fc80620000ca6000396000f3fe608060405234801561001057600080fd5b50600436106101815760003560e01c80635cfa9297116100d85780638da5cb5b1161008c578063f242432a11610066578063f242432a1461037a578063f5298aca1461038d578063f6eb127a146103a057600080fd5b80638da5cb5b146102f4578063a22cb46514610339578063e985e9c51461034c57600080fd5b806378b34f05116100bd57806378b34f05146102bb5780637970ce9f146102ce57806381b3e575146102e157600080fd5b80635cfa9297146102a05780636c0360eb146102b357600080fd5b806313af40351161013a5780634e1273f4116101145780634e1273f4146102655780635503a0e81461028557806355f804b31461028d57600080fd5b806313af40351461022c578063156e29f61461023f5780632eb2c2d61461025257600080fd5b80630ca834801161016b5780630ca83480146101e45780630d6a5bbb146101f95780630e89341c1461020c57600080fd5b8062fdd58e1461018657806301ffc9a7146101c1575b600080fd5b6101ae610194366004611d8a565b600060208181529281526040808220909352908152205481565b6040519081526020015b60405180910390f35b6101d46101cf366004611de5565b6103b3565b60405190151581526020016101b8565b6101f76101f2366004611e55565b610498565b005b6101f7610207366004611f18565b610630565b61021f61021a366004611fc3565b6107e0565b6040516101b8919061200c565b6101f761023a36600461205d565b610875565b6101f761024d366004612078565b6109b0565b6101f76102603660046120ab565b610aa0565b610278610273366004612166565b610e3d565b6040516101b891906121d2565b61021f610f9a565b6101f761029b366004612216565b611028565b6101f76102ae366004612258565b6110a0565b61021f611248565b6101f76102c93660046122af565b611255565b6101f76102dc3660046122af565b611316565b6101f76102ef366004612216565b6113a4565b6002546103149073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b8565b6101f7610347366004612349565b611417565b6101d461035a366004612385565b600160209081526000928352604080842090915290825290205460ff1681565b6101f76103883660046123b8565b611526565b6101f761039b366004612078565b611819565b6101f76103ae366004611e55565b61197a565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061044657507fd9b67a26000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b8061049257507f0e89341c000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604090205460ff1661051b5760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064015b60405180910390fd5b82811461056a5760405162461bcd60e51b815260206004820152600f60248201527f4c454e4754485f4d49534d4154434800000000000000000000000000000000006044820152606401610512565b600085815260208181526040822081528402905b818110156105a4578581013560009081526040902080548583013501905560200161057e565b50508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87878787604051610621949392919061246d565b60405180910390a45050505050565b61063d8787878787610498565b73ffffffffffffffffffffffffffffffffffffffff87163b15610774576040517fbc197c81000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff89169063bc197c81906106bd9033906000908c908c908c908c908c908c906004016124e8565b6020604051808303816000875af11580156106dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107009190612559565b7fffffffff00000000000000000000000000000000000000000000000000000000161461076f5760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610512565b6107d7565b73ffffffffffffffffffffffffffffffffffffffff87166107d75760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610512565b50505050505050565b60606000600380546107f190612576565b9050116108405760405162461bcd60e51b815260206004820152600b60248201527f4e4f5f4d455441444154410000000000000000000000000000000000000000006044820152606401610512565b600361084b83611b6d565b600460405160200161085f93929190612699565b6040516020818303038152906040529050919050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146108dc5760405162461bcd60e51b815260206004820152600960248201527f4e4f545f4f574e455200000000000000000000000000000000000000000000006044820152606401610512565b73ffffffffffffffffffffffffffffffffffffffff811661093f5760405162461bcd60e51b815260206004820152600d60248201527f494e56414c49445f4f574e4552000000000000000000000000000000000000006044820152606401610512565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907f22500af037c600dd7b720644ab6e358635085601d9ac508ad83eb2d6b2d729ca90600090a350565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604090205460ff16610a2e5760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610512565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208684528252808320805486019055805186815291820185905233917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6291015b60405180910390a4505050565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604090205460ff16610b1e5760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610512565b848314610b6d5760405162461bcd60e51b815260206004820152600f60248201527f4c454e4754485f4d49534d4154434800000000000000000000000000000000006044820152606401610512565b87600052600060205260406000208760005260406000206020870260005b81811015610c145780880135818b0135600052846020526040600020846020526040600020815480841115610bff5760405162461bcd60e51b815260206004820152601460248201527f494e53554646494349454e545f42414c414e43450000000000000000000000006044820152606481fd5b81549084900390925591019055602001610b8b565b505050508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb89898989604051610c92949392919061246d565b60405180910390a473ffffffffffffffffffffffffffffffffffffffff87163b15610dd0576040517fbc197c81000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff89169063bc197c8190610d199033908d908c908c908c908c908c908c906004016124e8565b6020604051808303816000875af1158015610d38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5c9190612559565b7fffffffff000000000000000000000000000000000000000000000000000000001614610dcb5760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610512565b610e33565b73ffffffffffffffffffffffffffffffffffffffff8716610e335760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610512565b5050505050505050565b6060838214610e8e5760405162461bcd60e51b815260206004820152600f60248201527f4c454e4754485f4d49534d4154434800000000000000000000000000000000006044820152606401610512565b8367ffffffffffffffff811115610ea757610ea76126c1565b604051908082528060200260200182016040528015610ed0578160200160208202803683370190505b50905060005b84811015610f9157600080878784818110610ef357610ef36126f0565b9050602002016020810190610f08919061205d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858584818110610f5657610f566126f0565b90506020020135815260200190815260200160002054828281518110610f7e57610f7e6126f0565b6020908102919091010152600101610ed6565b50949350505050565b60048054610fa790612576565b80601f0160208091040260200160405190810160405280929190818152602001828054610fd390612576565b80156110205780601f10610ff557610100808354040283529160200191611020565b820191906000526020600020905b81548152906001019060200180831161100357829003601f168201915b505050505081565b60025473ffffffffffffffffffffffffffffffffffffffff16331461108f5760405162461bcd60e51b815260206004820152600960248201527f4e4f545f4f574e455200000000000000000000000000000000000000000000006044820152606401610512565b61109b60038383611caa565b505050565b6110ab8585856109b0565b73ffffffffffffffffffffffffffffffffffffffff85163b156111de576040517ff23a6e61000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff87169063f23a6e61906111279033906000908a908a908a908a9060040161271f565b6020604051808303816000875af1158015611146573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116a9190612559565b7fffffffff0000000000000000000000000000000000000000000000000000000016146111d95760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610512565b611241565b73ffffffffffffffffffffffffffffffffffffffff85166112415760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610512565b5050505050565b60038054610fa790612576565b848314801561126357508281145b6112af5760405162461bcd60e51b815260206004820152600f60248201527f4c454e4754485f4d49534d4154434800000000000000000000000000000000006044820152606401610512565b60005b858110156107d7576020810287013561130d818787858181106112d7576112d76126f0565b90506020028101906112e99190612771565b8787878181106112fb576112fb6126f0565b90506020028101906101f29190612771565b506001016112b2565b848314801561132457508281145b6113705760405162461bcd60e51b815260206004820152600f60248201527f4c454e4754485f4d49534d4154434800000000000000000000000000000000006044820152606401610512565b6020850260005b81811015610e335760208101908881013590878101359086013561139c8383836109b0565b505050611377565b60025473ffffffffffffffffffffffffffffffffffffffff16331461140b5760405162461bcd60e51b815260206004820152600960248201527f4e4f545f4f574e455200000000000000000000000000000000000000000000006044820152606401610512565b61109b60048383611caa565b60025473ffffffffffffffffffffffffffffffffffffffff16331461147e5760405162461bcd60e51b815260206004820152600960248201527f4e4f545f4f574e455200000000000000000000000000000000000000000000006044820152606401610512565b73ffffffffffffffffffffffffffffffffffffffff821660008181527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb496020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604090205460ff166115a45760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610512565b60008681526020818152604080832088845281842088855290835281842092529091208154808611156116165760405162461bcd60e51b815260206004820152601460248201527f494e53554646494349454e545f42414c414e43450000000000000000000000006044820152606481fd5b8154908690039092559084019055604080518581526020810185905273ffffffffffffffffffffffffffffffffffffffff878116929089169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a473ffffffffffffffffffffffffffffffffffffffff85163b156117ae576040517ff23a6e61000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff87169063f23a6e61906116f79033908b908a908a908a908a9060040161271f565b6020604051808303816000875af1158015611716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173a9190612559565b7fffffffff0000000000000000000000000000000000000000000000000000000016146117a95760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610512565b611811565b73ffffffffffffffffffffffffffffffffffffffff85166118115760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610512565b505050505050565b3373ffffffffffffffffffffffffffffffffffffffff8416148061186b57503360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604090205460ff165b6118b75760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610512565b826000526000602052604060002082600052806020525060406000208054808311156119225760405162461bcd60e51b815260206004820152601460248201527f494e53554646494349454e545f42414c414e43450000000000000000000000006044820152606481fd5b8290039055604080518381526020810183905260009173ffffffffffffffffffffffffffffffffffffffff86169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f629101610a93565b3373ffffffffffffffffffffffffffffffffffffffff861614806119cc57503360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604090205460ff165b611a185760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610512565b828114611a675760405162461bcd60e51b815260206004820152600f60248201527f4c454e4754485f4d49534d4154434800000000000000000000000000000000006044820152606401610512565b600085815260208181526040822081528402905b81811015611af05780860135818501358160005260406000209150815480821115611ae55760405162461bcd60e51b815260206004820152601460248201527f494e53554646494349454e545f42414c414e43450000000000000000000000006044820152606481fd5b039055602001611a7b565b5050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87878787604051610621949392919061246d565b606081600003611bb057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611bda5780611bc481612808565b9150611bd39050600a8361286f565b9150611bb4565b60008167ffffffffffffffff811115611bf557611bf56126c1565b6040519080825280601f01601f191660200182016040528015611c1f576020820181803683370190505b5090505b8415611ca257611c34600183612883565b9150611c41600a8661289a565b611c4c9060306128ae565b60f81b818381518110611c6157611c616126f0565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611c9b600a8661286f565b9450611c23565b949350505050565b828054611cb690612576565b90600052602060002090601f016020900481019282611cd85760008555611d3c565b82601f10611d0f578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555611d3c565b82800160010185558215611d3c579182015b82811115611d3c578235825591602001919060010190611d21565b50611d48929150611d4c565b5090565b5b80821115611d485760008155600101611d4d565b803573ffffffffffffffffffffffffffffffffffffffff81168114611d8557600080fd5b919050565b60008060408385031215611d9d57600080fd5b611da683611d61565b946020939093013593505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611de257600080fd5b50565b600060208284031215611df757600080fd5b8135611e0281611db4565b9392505050565b60008083601f840112611e1b57600080fd5b50813567ffffffffffffffff811115611e3357600080fd5b6020830191508360208260051b8501011115611e4e57600080fd5b9250929050565b600080600080600060608688031215611e6d57600080fd5b611e7686611d61565b9450602086013567ffffffffffffffff80821115611e9357600080fd5b611e9f89838a01611e09565b90965094506040880135915080821115611eb857600080fd5b50611ec588828901611e09565b969995985093965092949392505050565b60008083601f840112611ee857600080fd5b50813567ffffffffffffffff811115611f0057600080fd5b602083019150836020828501011115611e4e57600080fd5b60008060008060008060006080888a031215611f3357600080fd5b611f3c88611d61565b9650602088013567ffffffffffffffff80821115611f5957600080fd5b611f658b838c01611e09565b909850965060408a0135915080821115611f7e57600080fd5b611f8a8b838c01611e09565b909650945060608a0135915080821115611fa357600080fd5b50611fb08a828b01611ed6565b989b979a50959850939692959293505050565b600060208284031215611fd557600080fd5b5035919050565b60005b83811015611ff7578181015183820152602001611fdf565b83811115612006576000848401525b50505050565b602081526000825180602084015261202b816040850160208701611fdc565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60006020828403121561206f57600080fd5b611e0282611d61565b60008060006060848603121561208d57600080fd5b61209684611d61565b95602085013595506040909401359392505050565b60008060008060008060008060a0898b0312156120c757600080fd5b6120d089611d61565b97506120de60208a01611d61565b9650604089013567ffffffffffffffff808211156120fb57600080fd5b6121078c838d01611e09565b909850965060608b013591508082111561212057600080fd5b61212c8c838d01611e09565b909650945060808b013591508082111561214557600080fd5b506121528b828c01611ed6565b999c989b5096995094979396929594505050565b6000806000806040858703121561217c57600080fd5b843567ffffffffffffffff8082111561219457600080fd5b6121a088838901611e09565b909650945060208701359150808211156121b957600080fd5b506121c687828801611e09565b95989497509550505050565b6020808252825182820181905260009190848201906040850190845b8181101561220a578351835292840192918401916001016121ee565b50909695505050505050565b6000806020838503121561222957600080fd5b823567ffffffffffffffff81111561224057600080fd5b61224c85828601611ed6565b90969095509350505050565b60008060008060006080868803121561227057600080fd5b61227986611d61565b94506020860135935060408601359250606086013567ffffffffffffffff8111156122a357600080fd5b611ec588828901611ed6565b600080600080600080606087890312156122c857600080fd5b863567ffffffffffffffff808211156122e057600080fd5b6122ec8a838b01611e09565b9098509650602089013591508082111561230557600080fd5b6123118a838b01611e09565b9096509450604089013591508082111561232a57600080fd5b5061233789828a01611e09565b979a9699509497509295939492505050565b6000806040838503121561235c57600080fd5b61236583611d61565b91506020830135801515811461237a57600080fd5b809150509250929050565b6000806040838503121561239857600080fd5b6123a183611d61565b91506123af60208401611d61565b90509250929050565b60008060008060008060a087890312156123d157600080fd5b6123da87611d61565b95506123e860208801611d61565b94506040870135935060608701359250608087013567ffffffffffffffff81111561241257600080fd5b61233789828a01611ed6565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561245057600080fd5b8260051b8083602087013760009401602001938452509192915050565b60408152600061248160408301868861241e565b828103602084015261249481858761241e565b979650505050505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600073ffffffffffffffffffffffffffffffffffffffff808b168352808a1660208401525060a0604083015261252260a08301888a61241e565b828103606084015261253581878961241e565b9050828103608084015261254a81858761249f565b9b9a5050505050505050505050565b60006020828403121561256b57600080fd5b8151611e0281611db4565b600181811c9082168061258a57607f821691505b6020821081036125c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8054600090600181811c90808316806125e357607f831692505b6020808410820361261d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b81801561263157600181146126605761268d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0086168952848901965061268d565b60008881526020902060005b868110156126855781548b82015290850190830161266c565b505084890196505b50505050505092915050565b60006126a582866125c9565b84516126b5818360208901611fdc565b612494818301866125c9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff808916835280881660208401525085604083015284606083015260a0608083015261276560a08301848661249f565b98975050505050505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126127a657600080fd5b83018035915067ffffffffffffffff8211156127c157600080fd5b6020019150600581901b3603821315611e4e57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612839576128396127d9565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261287e5761287e612840565b500490565b600082821015612895576128956127d9565b500390565b6000826128a9576128a9612840565b500690565b600082198211156128c1576128c16127d9565b50019056fea264697066735822122075817d2b83c38a0b1aa48e837f17930b93ea4900e9efe57e356abebd847dc29664736f6c634300080e00330000000000000000000000005a5fe90cd115d691ee99d90d3607f7005ea817e5

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101815760003560e01c80635cfa9297116100d85780638da5cb5b1161008c578063f242432a11610066578063f242432a1461037a578063f5298aca1461038d578063f6eb127a146103a057600080fd5b80638da5cb5b146102f4578063a22cb46514610339578063e985e9c51461034c57600080fd5b806378b34f05116100bd57806378b34f05146102bb5780637970ce9f146102ce57806381b3e575146102e157600080fd5b80635cfa9297146102a05780636c0360eb146102b357600080fd5b806313af40351161013a5780634e1273f4116101145780634e1273f4146102655780635503a0e81461028557806355f804b31461028d57600080fd5b806313af40351461022c578063156e29f61461023f5780632eb2c2d61461025257600080fd5b80630ca834801161016b5780630ca83480146101e45780630d6a5bbb146101f95780630e89341c1461020c57600080fd5b8062fdd58e1461018657806301ffc9a7146101c1575b600080fd5b6101ae610194366004611d8a565b600060208181529281526040808220909352908152205481565b6040519081526020015b60405180910390f35b6101d46101cf366004611de5565b6103b3565b60405190151581526020016101b8565b6101f76101f2366004611e55565b610498565b005b6101f7610207366004611f18565b610630565b61021f61021a366004611fc3565b6107e0565b6040516101b8919061200c565b6101f761023a36600461205d565b610875565b6101f761024d366004612078565b6109b0565b6101f76102603660046120ab565b610aa0565b610278610273366004612166565b610e3d565b6040516101b891906121d2565b61021f610f9a565b6101f761029b366004612216565b611028565b6101f76102ae366004612258565b6110a0565b61021f611248565b6101f76102c93660046122af565b611255565b6101f76102dc3660046122af565b611316565b6101f76102ef366004612216565b6113a4565b6002546103149073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b8565b6101f7610347366004612349565b611417565b6101d461035a366004612385565b600160209081526000928352604080842090915290825290205460ff1681565b6101f76103883660046123b8565b611526565b6101f761039b366004612078565b611819565b6101f76103ae366004611e55565b61197a565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061044657507fd9b67a26000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b8061049257507f0e89341c000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604090205460ff1661051b5760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064015b60405180910390fd5b82811461056a5760405162461bcd60e51b815260206004820152600f60248201527f4c454e4754485f4d49534d4154434800000000000000000000000000000000006044820152606401610512565b600085815260208181526040822081528402905b818110156105a4578581013560009081526040902080548583013501905560200161057e565b50508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87878787604051610621949392919061246d565b60405180910390a45050505050565b61063d8787878787610498565b73ffffffffffffffffffffffffffffffffffffffff87163b15610774576040517fbc197c81000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff89169063bc197c81906106bd9033906000908c908c908c908c908c908c906004016124e8565b6020604051808303816000875af11580156106dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107009190612559565b7fffffffff00000000000000000000000000000000000000000000000000000000161461076f5760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610512565b6107d7565b73ffffffffffffffffffffffffffffffffffffffff87166107d75760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610512565b50505050505050565b60606000600380546107f190612576565b9050116108405760405162461bcd60e51b815260206004820152600b60248201527f4e4f5f4d455441444154410000000000000000000000000000000000000000006044820152606401610512565b600361084b83611b6d565b600460405160200161085f93929190612699565b6040516020818303038152906040529050919050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146108dc5760405162461bcd60e51b815260206004820152600960248201527f4e4f545f4f574e455200000000000000000000000000000000000000000000006044820152606401610512565b73ffffffffffffffffffffffffffffffffffffffff811661093f5760405162461bcd60e51b815260206004820152600d60248201527f494e56414c49445f4f574e4552000000000000000000000000000000000000006044820152606401610512565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907f22500af037c600dd7b720644ab6e358635085601d9ac508ad83eb2d6b2d729ca90600090a350565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604090205460ff16610a2e5760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610512565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208684528252808320805486019055805186815291820185905233917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6291015b60405180910390a4505050565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604090205460ff16610b1e5760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610512565b848314610b6d5760405162461bcd60e51b815260206004820152600f60248201527f4c454e4754485f4d49534d4154434800000000000000000000000000000000006044820152606401610512565b87600052600060205260406000208760005260406000206020870260005b81811015610c145780880135818b0135600052846020526040600020846020526040600020815480841115610bff5760405162461bcd60e51b815260206004820152601460248201527f494e53554646494349454e545f42414c414e43450000000000000000000000006044820152606481fd5b81549084900390925591019055602001610b8b565b505050508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb89898989604051610c92949392919061246d565b60405180910390a473ffffffffffffffffffffffffffffffffffffffff87163b15610dd0576040517fbc197c81000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff89169063bc197c8190610d199033908d908c908c908c908c908c908c906004016124e8565b6020604051808303816000875af1158015610d38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5c9190612559565b7fffffffff000000000000000000000000000000000000000000000000000000001614610dcb5760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610512565b610e33565b73ffffffffffffffffffffffffffffffffffffffff8716610e335760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610512565b5050505050505050565b6060838214610e8e5760405162461bcd60e51b815260206004820152600f60248201527f4c454e4754485f4d49534d4154434800000000000000000000000000000000006044820152606401610512565b8367ffffffffffffffff811115610ea757610ea76126c1565b604051908082528060200260200182016040528015610ed0578160200160208202803683370190505b50905060005b84811015610f9157600080878784818110610ef357610ef36126f0565b9050602002016020810190610f08919061205d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858584818110610f5657610f566126f0565b90506020020135815260200190815260200160002054828281518110610f7e57610f7e6126f0565b6020908102919091010152600101610ed6565b50949350505050565b60048054610fa790612576565b80601f0160208091040260200160405190810160405280929190818152602001828054610fd390612576565b80156110205780601f10610ff557610100808354040283529160200191611020565b820191906000526020600020905b81548152906001019060200180831161100357829003601f168201915b505050505081565b60025473ffffffffffffffffffffffffffffffffffffffff16331461108f5760405162461bcd60e51b815260206004820152600960248201527f4e4f545f4f574e455200000000000000000000000000000000000000000000006044820152606401610512565b61109b60038383611caa565b505050565b6110ab8585856109b0565b73ffffffffffffffffffffffffffffffffffffffff85163b156111de576040517ff23a6e61000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff87169063f23a6e61906111279033906000908a908a908a908a9060040161271f565b6020604051808303816000875af1158015611146573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116a9190612559565b7fffffffff0000000000000000000000000000000000000000000000000000000016146111d95760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610512565b611241565b73ffffffffffffffffffffffffffffffffffffffff85166112415760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610512565b5050505050565b60038054610fa790612576565b848314801561126357508281145b6112af5760405162461bcd60e51b815260206004820152600f60248201527f4c454e4754485f4d49534d4154434800000000000000000000000000000000006044820152606401610512565b60005b858110156107d7576020810287013561130d818787858181106112d7576112d76126f0565b90506020028101906112e99190612771565b8787878181106112fb576112fb6126f0565b90506020028101906101f29190612771565b506001016112b2565b848314801561132457508281145b6113705760405162461bcd60e51b815260206004820152600f60248201527f4c454e4754485f4d49534d4154434800000000000000000000000000000000006044820152606401610512565b6020850260005b81811015610e335760208101908881013590878101359086013561139c8383836109b0565b505050611377565b60025473ffffffffffffffffffffffffffffffffffffffff16331461140b5760405162461bcd60e51b815260206004820152600960248201527f4e4f545f4f574e455200000000000000000000000000000000000000000000006044820152606401610512565b61109b60048383611caa565b60025473ffffffffffffffffffffffffffffffffffffffff16331461147e5760405162461bcd60e51b815260206004820152600960248201527f4e4f545f4f574e455200000000000000000000000000000000000000000000006044820152606401610512565b73ffffffffffffffffffffffffffffffffffffffff821660008181527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb496020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604090205460ff166115a45760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610512565b60008681526020818152604080832088845281842088855290835281842092529091208154808611156116165760405162461bcd60e51b815260206004820152601460248201527f494e53554646494349454e545f42414c414e43450000000000000000000000006044820152606481fd5b8154908690039092559084019055604080518581526020810185905273ffffffffffffffffffffffffffffffffffffffff878116929089169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a473ffffffffffffffffffffffffffffffffffffffff85163b156117ae576040517ff23a6e61000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff87169063f23a6e61906116f79033908b908a908a908a908a9060040161271f565b6020604051808303816000875af1158015611716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173a9190612559565b7fffffffff0000000000000000000000000000000000000000000000000000000016146117a95760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610512565b611811565b73ffffffffffffffffffffffffffffffffffffffff85166118115760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610512565b505050505050565b3373ffffffffffffffffffffffffffffffffffffffff8416148061186b57503360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604090205460ff165b6118b75760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610512565b826000526000602052604060002082600052806020525060406000208054808311156119225760405162461bcd60e51b815260206004820152601460248201527f494e53554646494349454e545f42414c414e43450000000000000000000000006044820152606481fd5b8290039055604080518381526020810183905260009173ffffffffffffffffffffffffffffffffffffffff86169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f629101610a93565b3373ffffffffffffffffffffffffffffffffffffffff861614806119cc57503360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604090205460ff165b611a185760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610512565b828114611a675760405162461bcd60e51b815260206004820152600f60248201527f4c454e4754485f4d49534d4154434800000000000000000000000000000000006044820152606401610512565b600085815260208181526040822081528402905b81811015611af05780860135818501358160005260406000209150815480821115611ae55760405162461bcd60e51b815260206004820152601460248201527f494e53554646494349454e545f42414c414e43450000000000000000000000006044820152606481fd5b039055602001611a7b565b5050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87878787604051610621949392919061246d565b606081600003611bb057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611bda5780611bc481612808565b9150611bd39050600a8361286f565b9150611bb4565b60008167ffffffffffffffff811115611bf557611bf56126c1565b6040519080825280601f01601f191660200182016040528015611c1f576020820181803683370190505b5090505b8415611ca257611c34600183612883565b9150611c41600a8661289a565b611c4c9060306128ae565b60f81b818381518110611c6157611c616126f0565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611c9b600a8661286f565b9450611c23565b949350505050565b828054611cb690612576565b90600052602060002090601f016020900481019282611cd85760008555611d3c565b82601f10611d0f578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555611d3c565b82800160010185558215611d3c579182015b82811115611d3c578235825591602001919060010190611d21565b50611d48929150611d4c565b5090565b5b80821115611d485760008155600101611d4d565b803573ffffffffffffffffffffffffffffffffffffffff81168114611d8557600080fd5b919050565b60008060408385031215611d9d57600080fd5b611da683611d61565b946020939093013593505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611de257600080fd5b50565b600060208284031215611df757600080fd5b8135611e0281611db4565b9392505050565b60008083601f840112611e1b57600080fd5b50813567ffffffffffffffff811115611e3357600080fd5b6020830191508360208260051b8501011115611e4e57600080fd5b9250929050565b600080600080600060608688031215611e6d57600080fd5b611e7686611d61565b9450602086013567ffffffffffffffff80821115611e9357600080fd5b611e9f89838a01611e09565b90965094506040880135915080821115611eb857600080fd5b50611ec588828901611e09565b969995985093965092949392505050565b60008083601f840112611ee857600080fd5b50813567ffffffffffffffff811115611f0057600080fd5b602083019150836020828501011115611e4e57600080fd5b60008060008060008060006080888a031215611f3357600080fd5b611f3c88611d61565b9650602088013567ffffffffffffffff80821115611f5957600080fd5b611f658b838c01611e09565b909850965060408a0135915080821115611f7e57600080fd5b611f8a8b838c01611e09565b909650945060608a0135915080821115611fa357600080fd5b50611fb08a828b01611ed6565b989b979a50959850939692959293505050565b600060208284031215611fd557600080fd5b5035919050565b60005b83811015611ff7578181015183820152602001611fdf565b83811115612006576000848401525b50505050565b602081526000825180602084015261202b816040850160208701611fdc565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60006020828403121561206f57600080fd5b611e0282611d61565b60008060006060848603121561208d57600080fd5b61209684611d61565b95602085013595506040909401359392505050565b60008060008060008060008060a0898b0312156120c757600080fd5b6120d089611d61565b97506120de60208a01611d61565b9650604089013567ffffffffffffffff808211156120fb57600080fd5b6121078c838d01611e09565b909850965060608b013591508082111561212057600080fd5b61212c8c838d01611e09565b909650945060808b013591508082111561214557600080fd5b506121528b828c01611ed6565b999c989b5096995094979396929594505050565b6000806000806040858703121561217c57600080fd5b843567ffffffffffffffff8082111561219457600080fd5b6121a088838901611e09565b909650945060208701359150808211156121b957600080fd5b506121c687828801611e09565b95989497509550505050565b6020808252825182820181905260009190848201906040850190845b8181101561220a578351835292840192918401916001016121ee565b50909695505050505050565b6000806020838503121561222957600080fd5b823567ffffffffffffffff81111561224057600080fd5b61224c85828601611ed6565b90969095509350505050565b60008060008060006080868803121561227057600080fd5b61227986611d61565b94506020860135935060408601359250606086013567ffffffffffffffff8111156122a357600080fd5b611ec588828901611ed6565b600080600080600080606087890312156122c857600080fd5b863567ffffffffffffffff808211156122e057600080fd5b6122ec8a838b01611e09565b9098509650602089013591508082111561230557600080fd5b6123118a838b01611e09565b9096509450604089013591508082111561232a57600080fd5b5061233789828a01611e09565b979a9699509497509295939492505050565b6000806040838503121561235c57600080fd5b61236583611d61565b91506020830135801515811461237a57600080fd5b809150509250929050565b6000806040838503121561239857600080fd5b6123a183611d61565b91506123af60208401611d61565b90509250929050565b60008060008060008060a087890312156123d157600080fd5b6123da87611d61565b95506123e860208801611d61565b94506040870135935060608701359250608087013567ffffffffffffffff81111561241257600080fd5b61233789828a01611ed6565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561245057600080fd5b8260051b8083602087013760009401602001938452509192915050565b60408152600061248160408301868861241e565b828103602084015261249481858761241e565b979650505050505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600073ffffffffffffffffffffffffffffffffffffffff808b168352808a1660208401525060a0604083015261252260a08301888a61241e565b828103606084015261253581878961241e565b9050828103608084015261254a81858761249f565b9b9a5050505050505050505050565b60006020828403121561256b57600080fd5b8151611e0281611db4565b600181811c9082168061258a57607f821691505b6020821081036125c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8054600090600181811c90808316806125e357607f831692505b6020808410820361261d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b81801561263157600181146126605761268d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0086168952848901965061268d565b60008881526020902060005b868110156126855781548b82015290850190830161266c565b505084890196505b50505050505092915050565b60006126a582866125c9565b84516126b5818360208901611fdc565b612494818301866125c9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff808916835280881660208401525085604083015284606083015260a0608083015261276560a08301848661249f565b98975050505050505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126127a657600080fd5b83018035915067ffffffffffffffff8211156127c157600080fd5b6020019150600581901b3603821315611e4e57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612839576128396127d9565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261287e5761287e612840565b500490565b600082821015612895576128956127d9565b500390565b6000826128a9576128a9612840565b500690565b600082198211156128c1576128c16127d9565b50019056fea264697066735822122075817d2b83c38a0b1aa48e837f17930b93ea4900e9efe57e356abebd847dc29664736f6c634300080e0033

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

0000000000000000000000005a5fe90cd115d691ee99d90d3607f7005ea817e5

-----Decoded View---------------
Arg [0] : owner (address): 0x5a5fe90CD115d691EE99d90D3607f7005Ea817e5

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000005a5fe90cd115d691ee99d90d3607f7005ea817e5


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.