ETH Price: $2,831.00 (-10.42%)
Gas: 14 Gwei

Contract

0x649247fc33915F89B0EA4c3dc6d3D3e3c5CeA6C8
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

TokenTracker

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Set Approval For...202259592024-07-03 12:23:5944 hrs ago1720009439IN
0x649247fc...3c5CeA6C8
0 ETH0.0009542520.71364313
Set Approval For...202127702024-07-01 16:09:593 days ago1719850199IN
0x649247fc...3c5CeA6C8
0 ETH0.000457159.92334491
Set Approval For...202064682024-06-30 19:03:354 days ago1719774215IN
0x649247fc...3c5CeA6C8
0 ETH0.000203614.41983873
Set Approval For...200965102024-06-15 10:10:5919 days ago1718446259IN
0x649247fc...3c5CeA6C8
0 ETH0.000184994.0155341
Set Approval For...200403562024-06-07 13:49:5927 days ago1717768199IN
0x649247fc...3c5CeA6C8
0 ETH0.0008033617.43825911
Set Approval For...200348372024-06-06 19:21:1128 days ago1717701671IN
0x649247fc...3c5CeA6C8
0 ETH0.0009557820.73604072
Set Approval For...199918462024-05-31 19:17:1134 days ago1717183031IN
0x649247fc...3c5CeA6C8
0 ETH0.0005536112.01712641
Set Approval For...199914012024-05-31 17:47:3534 days ago1717177655IN
0x649247fc...3c5CeA6C8
0 ETH0.0006415813.92653321
Set Approval For...198775952024-05-15 19:52:5950 days ago1715802779IN
0x649247fc...3c5CeA6C8
0 ETH0.000431689.37034795
Set Approval For...198293962024-05-09 2:05:4757 days ago1715220347IN
0x649247fc...3c5CeA6C8
0 ETH0.000187144.06230807
Redeem198067192024-05-05 21:57:4760 days ago1714946267IN
0x649247fc...3c5CeA6C8
0 ETH0.000245434.30692389
Set Approval For...197486672024-04-27 19:10:3568 days ago1714245035IN
0x649247fc...3c5CeA6C8
0 ETH0.000255875.55422843
Safe Transfer Fr...197157222024-04-23 4:30:4773 days ago1713846647IN
0x649247fc...3c5CeA6C8
0 ETH0.001396116.34210029
Set Approval For...196116922024-04-08 14:57:5987 days ago1712588279IN
0x649247fc...3c5CeA6C8
0 ETH0.0007307130.24873415
Set Approval For...195911482024-04-05 17:53:4790 days ago1712339627IN
0x649247fc...3c5CeA6C8
0 ETH0.0009852921.38735875
Redeem195636982024-04-01 21:37:1194 days ago1712007431IN
0x649247fc...3c5CeA6C8
0 ETH0.0015197724.59739417
Redeem195410412024-03-29 17:08:3597 days ago1711732115IN
0x649247fc...3c5CeA6C8
0 ETH0.0018766532.93184025
Set Approval For...194833692024-03-21 13:35:35105 days ago1711028135IN
0x649247fc...3c5CeA6C8
0 ETH0.0016731536.31836846
Set Approval For...194303512024-03-14 2:41:11113 days ago1710384071IN
0x649247fc...3c5CeA6C8
0 ETH0.0022358348.45659214
Redeem194049982024-03-10 13:29:35116 days ago1710077375IN
0x649247fc...3c5CeA6C8
0 ETH0.0027531348.31246906
Set Approval For...191634652024-02-05 17:11:23150 days ago1707153083IN
0x649247fc...3c5CeA6C8
0 ETH0.0012119826.30795806
Redeem191570042024-02-04 19:24:35151 days ago1707074675IN
0x649247fc...3c5CeA6C8
0 ETH0.0010748817.39694828
Redeem191441202024-02-02 23:56:23153 days ago1706918183IN
0x649247fc...3c5CeA6C8
0 ETH0.000882214.27833445
Set Approval For...190216652024-01-16 19:53:47170 days ago1705434827IN
0x649247fc...3c5CeA6C8
0 ETH0.0007935932.85165717
Set Approval For...190172482024-01-16 5:06:11171 days ago1705381571IN
0x649247fc...3c5CeA6C8
0 ETH0.0012374826.86149357
View all transactions

Latest 5 internal transactions

Advanced mode:
Parent Transaction Hash Block From To Value
168942262023-03-24 1:54:59469 days ago1679622899
0x649247fc...3c5CeA6C8
137 ETH
168813552023-03-22 6:28:47471 days ago1679466527
0x649247fc...3c5CeA6C8
0.1 ETH
168797792023-03-22 1:11:23471 days ago1679447483
0x649247fc...3c5CeA6C8
0.1 ETH
168796512023-03-22 0:45:47471 days ago1679445947
0x649247fc...3c5CeA6C8
0.5 ETH
168796342023-03-22 0:42:23471 days ago1679445743
0x649247fc...3c5CeA6C8
0.1 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Uniblocks

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 6 : Uniblocks.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

import "forge-std/interfaces/IERC20.sol";
import "solmate/tokens/ERC1155.sol";
import "solmate/Auth/Owned.sol";
import "solmate/utils/LibString.sol";
import "openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol";

contract Uniblocks is ERC1155, Owned {
    event Redemption(bytes32 indexed info, uint256 amount);

    string private _baseURI;
    uint256 public price = 0.1 ether;

    uint256 public totalSupply = 0;
    uint256 public totalRedeemed = 0;

    bool public finalized = false;
    uint256 public constant MAX_SUPPLY = 2000;
    uint256 private constant checkpoint1 = 666;
    uint256 private constant checkpoint2 = 1332;

    uint256 public premintStartTime;
    uint256 public constant PREMINT_DURATION = 1 hours;

    bytes32 public merkleRoot;

    constructor(
        string memory baseURI,
        bytes32 _merkleRoot,
        uint256 _premintStartTime,
        address owner
    ) Owned(owner) {
        _baseURI = baseURI;
        merkleRoot = _merkleRoot;
        premintStartTime = _premintStartTime;
    }

    function isPremintActive() public view returns (bool) {
        return
            block.timestamp >= premintStartTime &&
            block.timestamp <= premintStartTime + PREMINT_DURATION;
    }

    modifier onlyDuringPremint() {
        require(isPremintActive(), "Premint is not active");
        _;
    }

    modifier onlyWhitelist(bytes32[] calldata merkleProof) {
        require(
            MerkleProof.verify(
                merkleProof,
                merkleRoot,
                toBytes32(msg.sender)
            ) == true,
            "Invalid merkle proof"
        );
        _;
    }

    function setBaseURI(string memory newBaseURI) external onlyOwner {
        _baseURI = newBaseURI;
        emit URI(uriForSupply(totalSupply), 0);
        emit URI(string.concat(_baseURI, "f"), 1);
    }

    function _getCheckpoint(uint256 supply) internal pure returns (uint256) {
        if (supply < checkpoint1) return 1;
        if (supply < checkpoint2) return 2;
        if (supply < MAX_SUPPLY) return 3;
        return 4;
    }

    // set the URI based on the current checkpoint
    function uri(uint256 tokenId) public view override returns (string memory) {
        if (tokenId == 1) return string.concat(_baseURI, "r");

        return uriForSupply(totalSupply);
    }

    function uriForSupply(
        uint256 supply
    ) internal view returns (string memory) {
        if (finalized) return string.concat(_baseURI, "f");

        uint256 checkPoint = _getCheckpoint(supply);

        if (checkPoint == 4) return string.concat(_baseURI, "f");

        return string.concat(_baseURI, LibString.toString(checkPoint));
    }

    function toBytes32(address addr) internal pure returns (bytes32) {
        return bytes32(uint256(uint160(addr)));
    }

    function premint(
        uint256 amount,
        bytes32[] calldata merkleProof
    ) public payable onlyDuringPremint onlyWhitelist(merkleProof) {
        require(msg.value == price * amount, "Wrong amount of ETH sent");
        require(!finalized, "Minting has ended");
        require(totalSupply + amount <= MAX_SUPPLY, "Max supply reached");

        _mintTokens(msg.sender, amount);
    }

    function publicMint(uint256 amount) public payable {
        require(totalSupply + amount <= MAX_SUPPLY, "Max supply reached");
        require(msg.value == price * amount, "Wrong amount of ETH sent");
        require(
            block.timestamp >= premintStartTime + PREMINT_DURATION,
            "Public mint hasn't opened yet"
        );
        require(!finalized, "Minting has ended");

        _mintTokens(msg.sender, amount);
    }

    // burn tokenId 0 tokens and receive tokenId 1 tokens
    function redeem(uint256 amount, bytes32 info) public {
        require(
            amount <= balanceOf[msg.sender][0],
            "Not enough tokens to redeem"
        );
        _burn(msg.sender, 0, amount);
        _mint(msg.sender, 1, amount, "");
        totalRedeemed += amount;

        emit Redemption(info, amount);
    }

    function _mintTokens(address to, uint256 amount) internal {
        require(amount <= MAX_SUPPLY, "Minting more than max supply");
        require(totalSupply + amount <= MAX_SUPPLY, "Max supply reached");

        uint256 checkPointBefore = _getCheckpoint(totalSupply);
        uint256 checkPointAfter = _getCheckpoint(totalSupply + amount);

        if (checkPointBefore != checkPointAfter) {
            emit URI(uriForSupply(totalSupply + amount), 0);
        }

        totalSupply += amount;

        _mint(to, 0, amount, "");
    }

    function finalize() public onlyOwner {
        finalized = true;
        emit URI(string.concat(_baseURI, "f"), 0);
    }

    function setRoot(bytes32 _merkleRoot) public onlyOwner {
        merkleRoot = _merkleRoot;
    }

    function setPremintStartTime(uint256 _premintStartTime) public onlyOwner {
        premintStartTime = _premintStartTime;
    }

    function withdraw(address tokenAddress, uint256 amount) public onlyOwner {
        if (tokenAddress == address(0)) {
            payable(owner).transfer(amount);
        } else {
            IERC20 token = IERC20(tokenAddress);
            token.transfer(owner, amount);
        }
    }
}

File 2 of 6 : IERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2;

/// @dev Interface of the ERC20 standard as defined in the EIP.
/// @dev This includes the optional name, symbol, and decimals metadata.
interface IERC20 {
    /// @dev Emitted when `value` tokens are moved from one account (`from`) to another (`to`).
    event Transfer(address indexed from, address indexed to, uint256 value);

    /// @dev Emitted when the allowance of a `spender` for an `owner` is set, where `value`
    /// is the new allowance.
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /// @notice Returns the amount of tokens in existence.
    function totalSupply() external view returns (uint256);

    /// @notice Returns the amount of tokens owned by `account`.
    function balanceOf(address account) external view returns (uint256);

    /// @notice Moves `amount` tokens from the caller's account to `to`.
    function transfer(address to, uint256 amount) external returns (bool);

    /// @notice Returns the remaining number of tokens that `spender` is allowed
    /// to spend on behalf of `owner`
    function allowance(address owner, address spender) external view returns (uint256);

    /// @notice Sets `amount` as the allowance of `spender` over the caller's tokens.
    /// @dev Be aware of front-running risks: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
    function approve(address spender, uint256 amount) external returns (bool);

    /// @notice Moves `amount` tokens from `from` to `to` using the allowance mechanism.
    /// `amount` is then deducted from the caller's allowance.
    function transferFrom(address from, address to, uint256 amount) external returns (bool);

    /// @notice Returns the name of the token.
    function name() external view returns (string memory);

    /// @notice Returns the symbol of the token.
    function symbol() external view returns (string memory);

    /// @notice Returns the decimals places of the token.
    function decimals() external view returns (uint8);
}

File 3 of 6 : MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates merkle trees that are safe
 * against this attack out of the box.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

File 4 of 6 : Owned.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

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

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

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

    address public owner;

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

        _;
    }

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

    constructor(address _owner) {
        owner = _owner;

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

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

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

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

File 5 of 6 : ERC1155.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Minimalist and gas efficient standard ERC1155 implementation.
/// @author Solmate (https://github.com/transmissions11/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);

        require(
            to.code.length == 0
                ? to != address(0)
                : ERC1155TokenReceiver(to).onERC1155Received(msg.sender, from, id, amount, data) ==
                    ERC1155TokenReceiver.onERC1155Received.selector,
            "UNSAFE_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);

        require(
            to.code.length == 0
                ? to != address(0)
                : ERC1155TokenReceiver(to).onERC1155BatchReceived(msg.sender, from, ids, amounts, data) ==
                    ERC1155TokenReceiver.onERC1155BatchReceived.selector,
            "UNSAFE_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);

        require(
            to.code.length == 0
                ? to != address(0)
                : ERC1155TokenReceiver(to).onERC1155Received(msg.sender, address(0), id, amount, data) ==
                    ERC1155TokenReceiver.onERC1155Received.selector,
            "UNSAFE_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);

        require(
            to.code.length == 0
                ? to != address(0)
                : ERC1155TokenReceiver(to).onERC1155BatchReceived(msg.sender, address(0), ids, amounts, data) ==
                    ERC1155TokenReceiver.onERC1155BatchReceived.selector,
            "UNSAFE_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/transmissions11/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 6 of 6 : LibString.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"_premintStartTime","type":"uint256"},{"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":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"info","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Redemption","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":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PREMINT_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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":"finalize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPremintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"premint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"premintStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"info","type":"bytes32"}],"name":"redeem","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":"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":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_premintStartTime","type":"uint256"}],"name":"setPremintStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRedeemed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405267016345785d8a0000600455600060058190556006556007805460ff191690553480156200003157600080fd5b50604051620024e2380380620024e28339810160408190526200005491620000f4565b600280546001600160a01b0319166001600160a01b0383169081179091556040518291906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506003620000af85826200027e565b5050600991909155600855506200034a565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b0381168114620000ef57600080fd5b919050565b600080600080608085870312156200010b57600080fd5b84516001600160401b03808211156200012357600080fd5b818701915087601f8301126200013857600080fd5b8151818111156200014d576200014d620000c1565b604051601f8201601f19908116603f01168101908382118183101715620001785762000178620000c1565b81604052828152602093508a848487010111156200019557600080fd5b600091505b82821015620001b957848201840151818301850152908301906200019a565b6000848483010152809850505050808701519450505060408501519150620001e460608601620000d7565b905092959194509250565b600181811c908216806200020457607f821691505b6020821081036200022557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200027957600081815260208120601f850160051c81016020861015620002545750805b601f850160051c820191505b81811015620002755782815560010162000260565b5050505b505050565b81516001600160401b038111156200029a576200029a620000c1565b620002b281620002ab8454620001ef565b846200022b565b602080601f831160018114620002ea5760008415620002d15750858301515b600019600386901b1c1916600185901b17855562000275565b600085815260208120601f198616915b828110156200031b57888601518255948401946001909101908401620002fa565b50858210156200033a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612188806200035a6000396000f3fe60806040526004361061019b5760003560e01c806355f804b3116100ec578063dab5f3401161008a578063f242432a11610064578063f242432a14610495578063f2fde38b146104b5578063f35dad40146104d5578063f3fef3a3146104eb57600080fd5b8063dab5f34014610427578063df341adf14610447578063e985e9c51461045a57600080fd5b8063a035b1fe116100c6578063a035b1fe146103c1578063a22cb465146103d7578063b14cfbfe146103f7578063b3f05b971461040d57600080fd5b806355f804b3146103535780638da5cb5b146103735780639287c06b146103ab57600080fd5b80632db115441161015957806332cb6b0c1161013357806332cb6b0c146102db57806338366447146102f15780634bb278f3146103115780634e1273f41461032657600080fd5b80632db11544146102925780632eb2c2d6146102a55780632eb4a7ab146102c557600080fd5b8062fdd58e146101a057806301ffc9a7146101e857806309e76777146102185780630e89341c1461022d57806318160ddd1461025a57806322e4e61d14610270575b600080fd5b3480156101ac57600080fd5b506101d56101bb366004611764565b600060208181529281526040808220909352908152205481565b6040519081526020015b60405180910390f35b3480156101f457600080fd5b506102086102033660046117a4565b61050b565b60405190151581526020016101df565b34801561022457600080fd5b5061020861055d565b34801561023957600080fd5b5061024d6102483660046117c1565b610585565b6040516101df919061182a565b34801561026657600080fd5b506101d560055481565b34801561027c57600080fd5b5061029061028b36600461183d565b6105c2565b005b6102906102a03660046117c1565b6106a7565b3480156102b157600080fd5b506102906102c03660046118ed565b6107e0565b3480156102d157600080fd5b506101d560095481565b3480156102e757600080fd5b506101d56107d081565b3480156102fd57600080fd5b5061029061030c3660046117c1565b610a83565b34801561031d57600080fd5b50610290610ab2565b34801561033257600080fd5b506103466103413660046119a8565b610b32565b6040516101df9190611a14565b34801561035f57600080fd5b5061029061036e366004611a6e565b610c67565b34801561037f57600080fd5b50600254610393906001600160a01b031681565b6040516001600160a01b0390911681526020016101df565b3480156103b757600080fd5b506101d5610e1081565b3480156103cd57600080fd5b506101d560045481565b3480156103e357600080fd5b506102906103f2366004611b2d565b610d17565b34801561040357600080fd5b506101d560085481565b34801561041957600080fd5b506007546102089060ff1681565b34801561043357600080fd5b506102906104423660046117c1565b610d83565b610290610455366004611b64565b610db2565b34801561046657600080fd5b50610208610475366004611bb0565b600160209081526000928352604080842090915290825290205460ff1681565b3480156104a157600080fd5b506102906104b0366004611be3565b610f67565b3480156104c157600080fd5b506102906104d0366004611c5b565b611161565b3480156104e157600080fd5b506101d560065481565b3480156104f757600080fd5b50610290610506366004611764565b6111d7565b60006301ffc9a760e01b6001600160e01b03198316148061053c5750636cdb3d1360e11b6001600160e01b03198316145b8061055757506303a24d0760e21b6001600160e01b03198316145b92915050565b600060085442101580156105805750610e1060085461057c9190611c8c565b4211155b905090565b6060816001036105b75760036040516020016105a19190611d4c565b6040516020818303038152906040529050919050565b6105576005546112cc565b3360009081526020818152604080832083805290915290205482111561062f5760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f75676820746f6b656e7320746f2072656465656d000000000060448201526064015b60405180910390fd5b61063b33600084611346565b61065733600184604051806020016040528060008152506113ca565b81600660008282546106699190611c8c565b909155505060405182815281907f32446eadbad1c166cc88d69944ea729088d2d308da1b509835cc5bb06106a82e9060200160405180910390a25050565b6107d0816005546106b89190611c8c565b11156106d65760405162461bcd60e51b815260040161062690611d69565b806004546106e49190611d95565b341461072d5760405162461bcd60e51b815260206004820152601860248201527715dc9bdb99c8185b5bdd5b9d081bd988115512081cd95b9d60421b6044820152606401610626565b610e1060085461073d9190611c8c565b42101561078c5760405162461bcd60e51b815260206004820152601d60248201527f5075626c6963206d696e74206861736e2774206f70656e6564207965740000006044820152606401610626565b60075460ff16156107d35760405162461bcd60e51b8152602060048201526011602482015270135a5b9d1a5b99c81a185cc8195b991959607a1b6044820152606401610626565b6107dd338261150c565b50565b8483146108215760405162461bcd60e51b815260206004820152600f60248201526e0988a9c8ea890be9a92a69a82a8869608b1b6044820152606401610626565b336001600160a01b038916148061085b57506001600160a01b038816600090815260016020908152604080832033845290915290205460ff165b6108985760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b6044820152606401610626565b60008060005b87811015610953578888828181106108b8576108b8611dac565b9050602002013592508686828181106108d3576108d3611dac565b6001600160a01b038e1660009081526020818152604080832089845282528220805493909102949094013595508593925090610910908490611dc2565b90915550506001600160a01b038a1660009081526020818152604080832086845290915281208054849290610946908490611c8c565b909155505060010161089e565b50886001600160a01b03168a6001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8b8b8b8b6040516109a79493929190611e07565b60405180910390a46001600160a01b0389163b15610a4e5760405163bc197c8160e01b808252906001600160a01b038b169063bc197c81906109fb9033908f908e908e908e908e908e908e90600401611e62565b6020604051808303816000875af1158015610a1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3e9190611ec6565b6001600160e01b03191614610a5b565b6001600160a01b03891615155b610a775760405162461bcd60e51b815260040161062690611ee3565b50505050505050505050565b6002546001600160a01b03163314610aad5760405162461bcd60e51b815260040161062690611f0d565b600855565b6002546001600160a01b03163314610adc5760405162461bcd60e51b815260040161062690611f0d565b6007805460ff1916600117905560405160009060008051602061213383398151915290610b0e90600390602001611f33565b60408051601f1981840301815290829052610b289161182a565b60405180910390a2565b6060838214610b755760405162461bcd60e51b815260206004820152600f60248201526e0988a9c8ea890be9a92a69a82a8869608b1b6044820152606401610626565b8367ffffffffffffffff811115610b8e57610b8e611a58565b604051908082528060200260200182016040528015610bb7578160200160208202803683370190505b50905060005b84811015610c5e57600080878784818110610bda57610bda611dac565b9050602002016020810190610bef9190611c5b565b6001600160a01b03166001600160a01b031681526020019081526020016000206000858584818110610c2357610c23611dac565b90506020020135815260200190815260200160002054828281518110610c4b57610c4b611dac565b6020908102919091010152600101610bbd565b50949350505050565b6002546001600160a01b03163314610c915760405162461bcd60e51b815260040161062690611f0d565b6003610c9d8282611f96565b506000600080516020612133833981519152610cba6005546112cc565b604051610cc7919061182a565b60405180910390a260016000805160206121338339815191526003604051602001610cf29190611f33565b60408051601f1981840301815290829052610d0c9161182a565b60405180910390a250565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6002546001600160a01b03163314610dad5760405162461bcd60e51b815260040161062690611f0d565b600955565b610dba61055d565b610dfe5760405162461bcd60e51b81526020600482015260156024820152745072656d696e74206973206e6f742061637469766560581b6044820152606401610626565b8181610e4182828080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600954915033905061162f565b1515600114610e895760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b21036b2b935b63290383937b7b360611b6044820152606401610626565b84600454610e979190611d95565b3414610ee05760405162461bcd60e51b815260206004820152601860248201527715dc9bdb99c8185b5bdd5b9d081bd988115512081cd95b9d60421b6044820152606401610626565b60075460ff1615610f275760405162461bcd60e51b8152602060048201526011602482015270135a5b9d1a5b99c81a185cc8195b991959607a1b6044820152606401610626565b6107d085600554610f389190611c8c565b1115610f565760405162461bcd60e51b815260040161062690611d69565b610f60338661150c565b5050505050565b336001600160a01b0387161480610fa157506001600160a01b038616600090815260016020908152604080832033845290915290205460ff165b610fde5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b6044820152606401610626565b6001600160a01b0386166000908152602081815260408083208784529091528120805485929061100f908490611dc2565b90915550506001600160a01b03851660009081526020818152604080832087845290915281208054859290611045908490611c8c565b909155505060408051858152602081018590526001600160a01b03808816929089169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46001600160a01b0385163b156111305760405163f23a6e6160e01b808252906001600160a01b0387169063f23a6e61906110dd9033908b908a908a908a908a90600401612056565b6020604051808303816000875af11580156110fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111209190611ec6565b6001600160e01b0319161461113d565b6001600160a01b03851615155b6111595760405162461bcd60e51b815260040161062690611ee3565b505050505050565b6002546001600160a01b0316331461118b5760405162461bcd60e51b815260040161062690611f0d565b600280546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6002546001600160a01b031633146112015760405162461bcd60e51b815260040161062690611f0d565b6001600160a01b03821661124e576002546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611249573d6000803e3d6000fd5b505050565b60025460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101839052839182169063a9059cbb906044016020604051808303816000875af11580156112a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c6919061209d565b50505050565b60075460609060ff16156112ec5760036040516020016105a19190611f33565b60006112f783611645565b90508060040361132a5760036040516020016113139190611f33565b604051602081830303815290604052915050919050565b600361133582611685565b6040516020016113139291906120ba565b6001600160a01b03831660009081526020818152604080832085845290915281208054839290611377908490611dc2565b909155505060408051838152602081018390526000916001600160a01b0386169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4505050565b6001600160a01b038416600090815260208181526040808320868452909152812080548492906113fb908490611c8c565b909155505060408051848152602081018490526001600160a01b0386169160009133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46001600160a01b0384163b156114e35760405163f23a6e6160e01b808252906001600160a01b0386169063f23a6e61906114909033906000908990899089906004016120df565b6020604051808303816000875af11580156114af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d39190611ec6565b6001600160e01b031916146114f0565b6001600160a01b03841615155b6112c65760405162461bcd60e51b815260040161062690611ee3565b6107d081111561155e5760405162461bcd60e51b815260206004820152601c60248201527f4d696e74696e67206d6f7265207468616e206d617820737570706c79000000006044820152606401610626565b6107d08160055461156f9190611c8c565b111561158d5760405162461bcd60e51b815260040161062690611d69565b600061159a600554611645565b905060006115b4836005546115af9190611c8c565b611645565b90508082146115fa5760006000805160206121338339815191526115e4856005546115df9190611c8c565b6112cc565b6040516115f1919061182a565b60405180910390a25b826005600082825461160c9190611c8c565b925050819055506112c684600085604051806020016040528060008152506113ca565b60008261163c85846116c9565b14949350505050565b600061029a82101561165957506001919050565b61053482101561166b57506002919050565b6107d082101561167d57506003919050565b506004919050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a90048061169f5750819003601f19909101908152919050565b600081815b845181101561170e576116fa828683815181106116ed576116ed611dac565b6020026020010151611716565b91508061170681612119565b9150506116ce565b509392505050565b6000818310611732576000828152602084905260409020611741565b60008381526020839052604090205b9392505050565b80356001600160a01b038116811461175f57600080fd5b919050565b6000806040838503121561177757600080fd5b61178083611748565b946020939093013593505050565b6001600160e01b0319811681146107dd57600080fd5b6000602082840312156117b657600080fd5b81356117418161178e565b6000602082840312156117d357600080fd5b5035919050565b60005b838110156117f55781810151838201526020016117dd565b50506000910152565b600081518084526118168160208601602086016117da565b601f01601f19169290920160200192915050565b60208152600061174160208301846117fe565b6000806040838503121561185057600080fd5b50508035926020909101359150565b60008083601f84011261187157600080fd5b50813567ffffffffffffffff81111561188957600080fd5b6020830191508360208260051b85010111156118a457600080fd5b9250929050565b60008083601f8401126118bd57600080fd5b50813567ffffffffffffffff8111156118d557600080fd5b6020830191508360208285010111156118a457600080fd5b60008060008060008060008060a0898b03121561190957600080fd5b61191289611748565b975061192060208a01611748565b9650604089013567ffffffffffffffff8082111561193d57600080fd5b6119498c838d0161185f565b909850965060608b013591508082111561196257600080fd5b61196e8c838d0161185f565b909650945060808b013591508082111561198757600080fd5b506119948b828c016118ab565b999c989b5096995094979396929594505050565b600080600080604085870312156119be57600080fd5b843567ffffffffffffffff808211156119d657600080fd5b6119e28883890161185f565b909650945060208701359150808211156119fb57600080fd5b50611a088782880161185f565b95989497509550505050565b6020808252825182820181905260009190848201906040850190845b81811015611a4c57835183529284019291840191600101611a30565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215611a8057600080fd5b813567ffffffffffffffff80821115611a9857600080fd5b818401915084601f830112611aac57600080fd5b813581811115611abe57611abe611a58565b604051601f8201601f19908116603f01168101908382118183101715611ae657611ae6611a58565b81604052828152876020848701011115611aff57600080fd5b826020860160208301376000928101602001929092525095945050505050565b80151581146107dd57600080fd5b60008060408385031215611b4057600080fd5b611b4983611748565b91506020830135611b5981611b1f565b809150509250929050565b600080600060408486031215611b7957600080fd5b83359250602084013567ffffffffffffffff811115611b9757600080fd5b611ba38682870161185f565b9497909650939450505050565b60008060408385031215611bc357600080fd5b611bcc83611748565b9150611bda60208401611748565b90509250929050565b60008060008060008060a08789031215611bfc57600080fd5b611c0587611748565b9550611c1360208801611748565b94506040870135935060608701359250608087013567ffffffffffffffff811115611c3d57600080fd5b611c4989828a016118ab565b979a9699509497509295939492505050565b600060208284031215611c6d57600080fd5b61174182611748565b634e487b7160e01b600052601160045260246000fd5b8082018082111561055757610557611c76565b600181811c90821680611cb357607f821691505b602082108103611cd357634e487b7160e01b600052602260045260246000fd5b50919050565b60008154611ce681611c9f565b60018281168015611cfe5760018114611d1357611d42565b60ff1984168752821515830287019450611d42565b8560005260208060002060005b85811015611d395781548a820152908401908201611d20565b50505082870194505b5050505092915050565b6000611d588284611cd9565b603960f91b81526001019392505050565b60208082526012908201527113585e081cdd5c1c1b1e481c995858da195960721b604082015260600190565b808202811582820484141761055757610557611c76565b634e487b7160e01b600052603260045260246000fd5b8181038181111561055757610557611c76565b81835260006001600160fb1b03831115611dee57600080fd5b8260051b80836020870137939093016020019392505050565b604081526000611e1b604083018688611dd5565b8281036020840152611e2e818587611dd5565b979650505050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0389811682528816602082015260a060408201819052600090611e8f908301888a611dd5565b8281036060840152611ea2818789611dd5565b90508281036080840152611eb7818587611e39565b9b9a5050505050505050505050565b600060208284031215611ed857600080fd5b81516117418161178e565b60208082526010908201526f155394d0519157d49150d2541251539560821b604082015260600190565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b6000611f3f8284611cd9565b603360f91b81526001019392505050565b601f82111561124957600081815260208120601f850160051c81016020861015611f775750805b601f850160051c820191505b8181101561115957828155600101611f83565b815167ffffffffffffffff811115611fb057611fb0611a58565b611fc481611fbe8454611c9f565b84611f50565b602080601f831160018114611ff95760008415611fe15750858301515b600019600386901b1c1916600185901b178555611159565b600085815260208120601f198616915b8281101561202857888601518255948401946001909101908401612009565b50858210156120465787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b03878116825286166020820152604081018590526060810184905260a0608082018190526000906120919083018486611e39565b98975050505050505050565b6000602082840312156120af57600080fd5b815161174181611b1f565b60006120c68285611cd9565b83516120d68183602088016117da565b01949350505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090611e2e908301846117fe565b60006001820161212b5761212b611c76565b506001019056fe6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529ba26469706673582212208b5dcf375907bbd40a2ec39d6edcbe030b494e324b048224a597a59561828ec164736f6c634300081100330000000000000000000000000000000000000000000000000000000000000080ffea51b8559e37f6b3eb3702155de48f5a3e5ef3659ab5eba6a0c24b8c5fa4ca00000000000000000000000000000000000000000000000000000000641a4c0800000000000000000000000020352281fd7f94572cc739b946b1c930ec7630b8000000000000000000000000000000000000000000000000000000000000002368747470733a2f2f706c656173722e686f7573652f6170692f756e69626c6f636b732f0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061019b5760003560e01c806355f804b3116100ec578063dab5f3401161008a578063f242432a11610064578063f242432a14610495578063f2fde38b146104b5578063f35dad40146104d5578063f3fef3a3146104eb57600080fd5b8063dab5f34014610427578063df341adf14610447578063e985e9c51461045a57600080fd5b8063a035b1fe116100c6578063a035b1fe146103c1578063a22cb465146103d7578063b14cfbfe146103f7578063b3f05b971461040d57600080fd5b806355f804b3146103535780638da5cb5b146103735780639287c06b146103ab57600080fd5b80632db115441161015957806332cb6b0c1161013357806332cb6b0c146102db57806338366447146102f15780634bb278f3146103115780634e1273f41461032657600080fd5b80632db11544146102925780632eb2c2d6146102a55780632eb4a7ab146102c557600080fd5b8062fdd58e146101a057806301ffc9a7146101e857806309e76777146102185780630e89341c1461022d57806318160ddd1461025a57806322e4e61d14610270575b600080fd5b3480156101ac57600080fd5b506101d56101bb366004611764565b600060208181529281526040808220909352908152205481565b6040519081526020015b60405180910390f35b3480156101f457600080fd5b506102086102033660046117a4565b61050b565b60405190151581526020016101df565b34801561022457600080fd5b5061020861055d565b34801561023957600080fd5b5061024d6102483660046117c1565b610585565b6040516101df919061182a565b34801561026657600080fd5b506101d560055481565b34801561027c57600080fd5b5061029061028b36600461183d565b6105c2565b005b6102906102a03660046117c1565b6106a7565b3480156102b157600080fd5b506102906102c03660046118ed565b6107e0565b3480156102d157600080fd5b506101d560095481565b3480156102e757600080fd5b506101d56107d081565b3480156102fd57600080fd5b5061029061030c3660046117c1565b610a83565b34801561031d57600080fd5b50610290610ab2565b34801561033257600080fd5b506103466103413660046119a8565b610b32565b6040516101df9190611a14565b34801561035f57600080fd5b5061029061036e366004611a6e565b610c67565b34801561037f57600080fd5b50600254610393906001600160a01b031681565b6040516001600160a01b0390911681526020016101df565b3480156103b757600080fd5b506101d5610e1081565b3480156103cd57600080fd5b506101d560045481565b3480156103e357600080fd5b506102906103f2366004611b2d565b610d17565b34801561040357600080fd5b506101d560085481565b34801561041957600080fd5b506007546102089060ff1681565b34801561043357600080fd5b506102906104423660046117c1565b610d83565b610290610455366004611b64565b610db2565b34801561046657600080fd5b50610208610475366004611bb0565b600160209081526000928352604080842090915290825290205460ff1681565b3480156104a157600080fd5b506102906104b0366004611be3565b610f67565b3480156104c157600080fd5b506102906104d0366004611c5b565b611161565b3480156104e157600080fd5b506101d560065481565b3480156104f757600080fd5b50610290610506366004611764565b6111d7565b60006301ffc9a760e01b6001600160e01b03198316148061053c5750636cdb3d1360e11b6001600160e01b03198316145b8061055757506303a24d0760e21b6001600160e01b03198316145b92915050565b600060085442101580156105805750610e1060085461057c9190611c8c565b4211155b905090565b6060816001036105b75760036040516020016105a19190611d4c565b6040516020818303038152906040529050919050565b6105576005546112cc565b3360009081526020818152604080832083805290915290205482111561062f5760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f75676820746f6b656e7320746f2072656465656d000000000060448201526064015b60405180910390fd5b61063b33600084611346565b61065733600184604051806020016040528060008152506113ca565b81600660008282546106699190611c8c565b909155505060405182815281907f32446eadbad1c166cc88d69944ea729088d2d308da1b509835cc5bb06106a82e9060200160405180910390a25050565b6107d0816005546106b89190611c8c565b11156106d65760405162461bcd60e51b815260040161062690611d69565b806004546106e49190611d95565b341461072d5760405162461bcd60e51b815260206004820152601860248201527715dc9bdb99c8185b5bdd5b9d081bd988115512081cd95b9d60421b6044820152606401610626565b610e1060085461073d9190611c8c565b42101561078c5760405162461bcd60e51b815260206004820152601d60248201527f5075626c6963206d696e74206861736e2774206f70656e6564207965740000006044820152606401610626565b60075460ff16156107d35760405162461bcd60e51b8152602060048201526011602482015270135a5b9d1a5b99c81a185cc8195b991959607a1b6044820152606401610626565b6107dd338261150c565b50565b8483146108215760405162461bcd60e51b815260206004820152600f60248201526e0988a9c8ea890be9a92a69a82a8869608b1b6044820152606401610626565b336001600160a01b038916148061085b57506001600160a01b038816600090815260016020908152604080832033845290915290205460ff165b6108985760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b6044820152606401610626565b60008060005b87811015610953578888828181106108b8576108b8611dac565b9050602002013592508686828181106108d3576108d3611dac565b6001600160a01b038e1660009081526020818152604080832089845282528220805493909102949094013595508593925090610910908490611dc2565b90915550506001600160a01b038a1660009081526020818152604080832086845290915281208054849290610946908490611c8c565b909155505060010161089e565b50886001600160a01b03168a6001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8b8b8b8b6040516109a79493929190611e07565b60405180910390a46001600160a01b0389163b15610a4e5760405163bc197c8160e01b808252906001600160a01b038b169063bc197c81906109fb9033908f908e908e908e908e908e908e90600401611e62565b6020604051808303816000875af1158015610a1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3e9190611ec6565b6001600160e01b03191614610a5b565b6001600160a01b03891615155b610a775760405162461bcd60e51b815260040161062690611ee3565b50505050505050505050565b6002546001600160a01b03163314610aad5760405162461bcd60e51b815260040161062690611f0d565b600855565b6002546001600160a01b03163314610adc5760405162461bcd60e51b815260040161062690611f0d565b6007805460ff1916600117905560405160009060008051602061213383398151915290610b0e90600390602001611f33565b60408051601f1981840301815290829052610b289161182a565b60405180910390a2565b6060838214610b755760405162461bcd60e51b815260206004820152600f60248201526e0988a9c8ea890be9a92a69a82a8869608b1b6044820152606401610626565b8367ffffffffffffffff811115610b8e57610b8e611a58565b604051908082528060200260200182016040528015610bb7578160200160208202803683370190505b50905060005b84811015610c5e57600080878784818110610bda57610bda611dac565b9050602002016020810190610bef9190611c5b565b6001600160a01b03166001600160a01b031681526020019081526020016000206000858584818110610c2357610c23611dac565b90506020020135815260200190815260200160002054828281518110610c4b57610c4b611dac565b6020908102919091010152600101610bbd565b50949350505050565b6002546001600160a01b03163314610c915760405162461bcd60e51b815260040161062690611f0d565b6003610c9d8282611f96565b506000600080516020612133833981519152610cba6005546112cc565b604051610cc7919061182a565b60405180910390a260016000805160206121338339815191526003604051602001610cf29190611f33565b60408051601f1981840301815290829052610d0c9161182a565b60405180910390a250565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6002546001600160a01b03163314610dad5760405162461bcd60e51b815260040161062690611f0d565b600955565b610dba61055d565b610dfe5760405162461bcd60e51b81526020600482015260156024820152745072656d696e74206973206e6f742061637469766560581b6044820152606401610626565b8181610e4182828080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600954915033905061162f565b1515600114610e895760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b21036b2b935b63290383937b7b360611b6044820152606401610626565b84600454610e979190611d95565b3414610ee05760405162461bcd60e51b815260206004820152601860248201527715dc9bdb99c8185b5bdd5b9d081bd988115512081cd95b9d60421b6044820152606401610626565b60075460ff1615610f275760405162461bcd60e51b8152602060048201526011602482015270135a5b9d1a5b99c81a185cc8195b991959607a1b6044820152606401610626565b6107d085600554610f389190611c8c565b1115610f565760405162461bcd60e51b815260040161062690611d69565b610f60338661150c565b5050505050565b336001600160a01b0387161480610fa157506001600160a01b038616600090815260016020908152604080832033845290915290205460ff165b610fde5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b6044820152606401610626565b6001600160a01b0386166000908152602081815260408083208784529091528120805485929061100f908490611dc2565b90915550506001600160a01b03851660009081526020818152604080832087845290915281208054859290611045908490611c8c565b909155505060408051858152602081018590526001600160a01b03808816929089169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46001600160a01b0385163b156111305760405163f23a6e6160e01b808252906001600160a01b0387169063f23a6e61906110dd9033908b908a908a908a908a90600401612056565b6020604051808303816000875af11580156110fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111209190611ec6565b6001600160e01b0319161461113d565b6001600160a01b03851615155b6111595760405162461bcd60e51b815260040161062690611ee3565b505050505050565b6002546001600160a01b0316331461118b5760405162461bcd60e51b815260040161062690611f0d565b600280546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6002546001600160a01b031633146112015760405162461bcd60e51b815260040161062690611f0d565b6001600160a01b03821661124e576002546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611249573d6000803e3d6000fd5b505050565b60025460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101839052839182169063a9059cbb906044016020604051808303816000875af11580156112a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c6919061209d565b50505050565b60075460609060ff16156112ec5760036040516020016105a19190611f33565b60006112f783611645565b90508060040361132a5760036040516020016113139190611f33565b604051602081830303815290604052915050919050565b600361133582611685565b6040516020016113139291906120ba565b6001600160a01b03831660009081526020818152604080832085845290915281208054839290611377908490611dc2565b909155505060408051838152602081018390526000916001600160a01b0386169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4505050565b6001600160a01b038416600090815260208181526040808320868452909152812080548492906113fb908490611c8c565b909155505060408051848152602081018490526001600160a01b0386169160009133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46001600160a01b0384163b156114e35760405163f23a6e6160e01b808252906001600160a01b0386169063f23a6e61906114909033906000908990899089906004016120df565b6020604051808303816000875af11580156114af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d39190611ec6565b6001600160e01b031916146114f0565b6001600160a01b03841615155b6112c65760405162461bcd60e51b815260040161062690611ee3565b6107d081111561155e5760405162461bcd60e51b815260206004820152601c60248201527f4d696e74696e67206d6f7265207468616e206d617820737570706c79000000006044820152606401610626565b6107d08160055461156f9190611c8c565b111561158d5760405162461bcd60e51b815260040161062690611d69565b600061159a600554611645565b905060006115b4836005546115af9190611c8c565b611645565b90508082146115fa5760006000805160206121338339815191526115e4856005546115df9190611c8c565b6112cc565b6040516115f1919061182a565b60405180910390a25b826005600082825461160c9190611c8c565b925050819055506112c684600085604051806020016040528060008152506113ca565b60008261163c85846116c9565b14949350505050565b600061029a82101561165957506001919050565b61053482101561166b57506002919050565b6107d082101561167d57506003919050565b506004919050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a90048061169f5750819003601f19909101908152919050565b600081815b845181101561170e576116fa828683815181106116ed576116ed611dac565b6020026020010151611716565b91508061170681612119565b9150506116ce565b509392505050565b6000818310611732576000828152602084905260409020611741565b60008381526020839052604090205b9392505050565b80356001600160a01b038116811461175f57600080fd5b919050565b6000806040838503121561177757600080fd5b61178083611748565b946020939093013593505050565b6001600160e01b0319811681146107dd57600080fd5b6000602082840312156117b657600080fd5b81356117418161178e565b6000602082840312156117d357600080fd5b5035919050565b60005b838110156117f55781810151838201526020016117dd565b50506000910152565b600081518084526118168160208601602086016117da565b601f01601f19169290920160200192915050565b60208152600061174160208301846117fe565b6000806040838503121561185057600080fd5b50508035926020909101359150565b60008083601f84011261187157600080fd5b50813567ffffffffffffffff81111561188957600080fd5b6020830191508360208260051b85010111156118a457600080fd5b9250929050565b60008083601f8401126118bd57600080fd5b50813567ffffffffffffffff8111156118d557600080fd5b6020830191508360208285010111156118a457600080fd5b60008060008060008060008060a0898b03121561190957600080fd5b61191289611748565b975061192060208a01611748565b9650604089013567ffffffffffffffff8082111561193d57600080fd5b6119498c838d0161185f565b909850965060608b013591508082111561196257600080fd5b61196e8c838d0161185f565b909650945060808b013591508082111561198757600080fd5b506119948b828c016118ab565b999c989b5096995094979396929594505050565b600080600080604085870312156119be57600080fd5b843567ffffffffffffffff808211156119d657600080fd5b6119e28883890161185f565b909650945060208701359150808211156119fb57600080fd5b50611a088782880161185f565b95989497509550505050565b6020808252825182820181905260009190848201906040850190845b81811015611a4c57835183529284019291840191600101611a30565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215611a8057600080fd5b813567ffffffffffffffff80821115611a9857600080fd5b818401915084601f830112611aac57600080fd5b813581811115611abe57611abe611a58565b604051601f8201601f19908116603f01168101908382118183101715611ae657611ae6611a58565b81604052828152876020848701011115611aff57600080fd5b826020860160208301376000928101602001929092525095945050505050565b80151581146107dd57600080fd5b60008060408385031215611b4057600080fd5b611b4983611748565b91506020830135611b5981611b1f565b809150509250929050565b600080600060408486031215611b7957600080fd5b83359250602084013567ffffffffffffffff811115611b9757600080fd5b611ba38682870161185f565b9497909650939450505050565b60008060408385031215611bc357600080fd5b611bcc83611748565b9150611bda60208401611748565b90509250929050565b60008060008060008060a08789031215611bfc57600080fd5b611c0587611748565b9550611c1360208801611748565b94506040870135935060608701359250608087013567ffffffffffffffff811115611c3d57600080fd5b611c4989828a016118ab565b979a9699509497509295939492505050565b600060208284031215611c6d57600080fd5b61174182611748565b634e487b7160e01b600052601160045260246000fd5b8082018082111561055757610557611c76565b600181811c90821680611cb357607f821691505b602082108103611cd357634e487b7160e01b600052602260045260246000fd5b50919050565b60008154611ce681611c9f565b60018281168015611cfe5760018114611d1357611d42565b60ff1984168752821515830287019450611d42565b8560005260208060002060005b85811015611d395781548a820152908401908201611d20565b50505082870194505b5050505092915050565b6000611d588284611cd9565b603960f91b81526001019392505050565b60208082526012908201527113585e081cdd5c1c1b1e481c995858da195960721b604082015260600190565b808202811582820484141761055757610557611c76565b634e487b7160e01b600052603260045260246000fd5b8181038181111561055757610557611c76565b81835260006001600160fb1b03831115611dee57600080fd5b8260051b80836020870137939093016020019392505050565b604081526000611e1b604083018688611dd5565b8281036020840152611e2e818587611dd5565b979650505050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0389811682528816602082015260a060408201819052600090611e8f908301888a611dd5565b8281036060840152611ea2818789611dd5565b90508281036080840152611eb7818587611e39565b9b9a5050505050505050505050565b600060208284031215611ed857600080fd5b81516117418161178e565b60208082526010908201526f155394d0519157d49150d2541251539560821b604082015260600190565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b6000611f3f8284611cd9565b603360f91b81526001019392505050565b601f82111561124957600081815260208120601f850160051c81016020861015611f775750805b601f850160051c820191505b8181101561115957828155600101611f83565b815167ffffffffffffffff811115611fb057611fb0611a58565b611fc481611fbe8454611c9f565b84611f50565b602080601f831160018114611ff95760008415611fe15750858301515b600019600386901b1c1916600185901b178555611159565b600085815260208120601f198616915b8281101561202857888601518255948401946001909101908401612009565b50858210156120465787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b03878116825286166020820152604081018590526060810184905260a0608082018190526000906120919083018486611e39565b98975050505050505050565b6000602082840312156120af57600080fd5b815161174181611b1f565b60006120c68285611cd9565b83516120d68183602088016117da565b01949350505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090611e2e908301846117fe565b60006001820161212b5761212b611c76565b506001019056fe6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529ba26469706673582212208b5dcf375907bbd40a2ec39d6edcbe030b494e324b048224a597a59561828ec164736f6c63430008110033

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

0000000000000000000000000000000000000000000000000000000000000080ffea51b8559e37f6b3eb3702155de48f5a3e5ef3659ab5eba6a0c24b8c5fa4ca00000000000000000000000000000000000000000000000000000000641a4c0800000000000000000000000020352281fd7f94572cc739b946b1c930ec7630b8000000000000000000000000000000000000000000000000000000000000002368747470733a2f2f706c656173722e686f7573652f6170692f756e69626c6f636b732f0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string): https://pleasr.house/api/uniblocks/
Arg [1] : _merkleRoot (bytes32): 0xffea51b8559e37f6b3eb3702155de48f5a3e5ef3659ab5eba6a0c24b8c5fa4ca
Arg [2] : _premintStartTime (uint256): 1679445000
Arg [3] : owner (address): 0x20352281FD7F94572cC739b946b1c930Ec7630B8

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : ffea51b8559e37f6b3eb3702155de48f5a3e5ef3659ab5eba6a0c24b8c5fa4ca
Arg [2] : 00000000000000000000000000000000000000000000000000000000641a4c08
Arg [3] : 00000000000000000000000020352281fd7f94572cc739b946b1c930ec7630b8
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000023
Arg [5] : 68747470733a2f2f706c656173722e686f7573652f6170692f756e69626c6f63
Arg [6] : 6b732f0000000000000000000000000000000000000000000000000000000000


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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