ETH Price: $3,105.46 (+0.78%)
Gas: 4 Gwei

Token

Manny Crowds (MC)
 

Overview

Max Total Supply

0 MC

Holders

103

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
mannys.game: Deployer
Balance
16 MC
0xf3a45ee798fc560ce080d143d12312185f84aa72
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:
MannysCrowd

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 6 : Owned.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;

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

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

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

    address public owner;

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

        _;
    }

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

    constructor(address _owner) {
        owner = _owner;

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

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

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

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

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

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

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

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

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

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*//////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

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

    /*//////////////////////////////////////////////////////////////
                            EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

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

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*//////////////////////////////////////////////////////////////
                               ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*//////////////////////////////////////////////////////////////
                             EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            address recoveredAddress = ecrecover(
                keccak256(
                    abi.encodePacked(
                        "\x19\x01",
                        DOMAIN_SEPARATOR(),
                        keccak256(
                            abi.encode(
                                keccak256(
                                    "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                                ),
                                owner,
                                spender,
                                value,
                                nonces[owner]++,
                                deadline
                            )
                        )
                    )
                ),
                v,
                r,
                s
            );

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

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

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

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

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

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}

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

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

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

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

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

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

    string public name;

    string public symbol;

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

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

    mapping(uint256 => address) internal _ownerOf;

    mapping(address => uint256) internal _balanceOf;

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

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

        return _balanceOf[owner];
    }

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

    mapping(uint256 => address) public getApproved;

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

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

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

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

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

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

        getApproved[id] = spender;

        emit Approval(owner, spender, id);
    }

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

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

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

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

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

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

            _balanceOf[to]++;
        }

        _ownerOf[id] = to;

        delete getApproved[id];

        emit Transfer(from, to, id);
    }

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

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

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

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

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

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

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

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

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

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

        _ownerOf[id] = to;

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

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

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

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

        delete _ownerOf[id];

        delete getApproved[id];

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

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

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

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

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

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

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

File 4 of 6 : LibBitmap.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;

/// @notice Efficient bitmap library for mapping integers to single bit booleans.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/LibBitmap.sol)
library LibBitmap {
    struct Bitmap {
        mapping(uint256 => uint256) map;
    }

    function get(Bitmap storage bitmap, uint256 index) internal view returns (bool isSet) {
        uint256 value = bitmap.map[index >> 8] & (1 << (index & 0xff));

        assembly {
            isSet := value // Assign isSet to whether the value is non zero.
        }
    }

    function set(Bitmap storage bitmap, uint256 index) internal {
        bitmap.map[index >> 8] |= (1 << (index & 0xff));
    }

    function unset(Bitmap storage bitmap, uint256 index) internal {
        bitmap.map[index >> 8] &= ~(1 << (index & 0xff));
    }

    function setTo(
        Bitmap storage bitmap,
        uint256 index,
        bool shouldSet
    ) internal {
        uint256 value = bitmap.map[index >> 8];

        assembly {
            // The following sets the bit at `shift` without branching.
            let shift := and(index, 0xff)
            // Isolate the bit at `shift`.
            let x := and(shr(shift, value), 1)
            // Xor it with `shouldSet`. Results in 1 if both are different, else 0.
            x := xor(x, shouldSet)
            // Shifts the bit back. Then, xor with value.
            // Only the bit at `shift` will be flipped if they differ.
            // Every other bit will stay the same, as they are xor'ed with zeroes.
            value := xor(value, shl(shift, x))
        }
        bitmap.map[index >> 8] = value;
    }
}

File 5 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/Rari-Capital/solmate/blob/main/src/utils/LibString.sol)
library LibString {
    function toString(uint256 n) internal pure returns (string memory str) {
        if (n == 0) return "0"; // Otherwise it'd output an empty string for 0.

        assembly {
            let k := 78 // Start with the max length a uint256 string could be.

            // We'll store our string at the first chunk of free memory.
            str := mload(0x40)

            // The length of our string will start off at the max of 78.
            mstore(str, k)

            // Update the free memory pointer to prevent overriding our string.
            // Add 128 to the str pointer instead of 78 because we want to maintain
            // the Solidity convention of keeping the free memory pointer word aligned.
            mstore(0x40, add(str, 128))

            // We'll populate the string from right to left.
            // prettier-ignore
            for {} n {} {
                // The ASCII digit offset for '0' is 48.
                let char := add(48, mod(n, 10))

                // Write the current character into str.
                mstore(add(str, k), char)

                k := sub(k, 1)
                n := div(n, 10)
            }

            // Shift the pointer to the start of the string.
            str := add(str, k)

            // Set the length of the string to the correct value.
            mstore(str, sub(78, k))
        }
    }
}

File 6 of 6 : MannysCrowd.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;
import {ERC721} from "solmate/tokens/ERC721.sol";
import {ERC20} from "solmate/tokens/ERC20.sol";
import {Owned} from "solmate/auth/Owned.sol";
import {LibString} from "solmate/utils/LibString.sol";
import {LibBitmap} from "solmate/utils/LibBitmap.sol";

interface MannysGame {
    function ownerOf(uint256 _tokenId) external view returns (address);

    function tokensByOwner(address _owner)
        external
        view
        returns (uint16[] memory);
}

contract MannysCrowd is ERC721, Owned {
    /* -------------------------------------------------------------------------- */
    /*                                  CONSTANTS                                 */
    /* -------------------------------------------------------------------------- */
    MannysGame private constant MANNYS_GAME =
        MannysGame(0x2bd58A19C7E4AbF17638c5eE6fA96EE5EB53aed9);
    address private constant MANNY_DAO =
        0xd0fA4e10b39f3aC9c95deA8151F90b20c497d187;
    uint256 public constant PUBLIC_MINT_PRICE = 0.0404 ether;
    uint256 public immutable PUBLIC_MINT_ENABLED_AFTER;

    /* -------------------------------------------------------------------------- */
    /*                                    DATA                                    */
    /* -------------------------------------------------------------------------- */
    using LibBitmap for LibBitmap.Bitmap;
    LibBitmap.Bitmap private mints;
    string private _baseURI = "https://mannys-crowd.32swords.com/token/";
    bool public MERGING_ENABLED = false;
    mapping(uint256 => uint256[]) public merged;

    /* -------------------------------------------------------------------------- */
    /*                               EVENTS & ERRORS                              */
    /* -------------------------------------------------------------------------- */
    event CrowdsMerged(uint256 tokenIdBase, uint256 tokenIdMerge);
    event MetadataUpdate(uint256 tokenId);
    event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId);
    error AlreadyMinted(uint256 tokenId);
    error NothingToMint(address owner);
    error NotOwner(uint256 tokenId);
    error MintingNotOpen();
    error InvalidMintFee();
    error OwnerMintClosed();
    error MergingNotOpen();

    /* -------------------------------------------------------------------------- */
    /*                                    INIT                                    */
    /* -------------------------------------------------------------------------- */
    constructor() ERC721("Manny Crowds", "MC") Owned(msg.sender) {
        PUBLIC_MINT_ENABLED_AFTER = block.timestamp + 4.04 days;
    }

    /* -------------------------------------------------------------------------- */
    /*                                   MINTING                                  */
    /* -------------------------------------------------------------------------- */
    function mintOne(uint256 tokenId) external payable {
        // If caller is not owner of token, require public minting to be open & fee to be paid
        if (MANNYS_GAME.ownerOf(tokenId) != msg.sender) {
            if (block.timestamp < PUBLIC_MINT_ENABLED_AFTER)
                revert MintingNotOpen();
            if (msg.value != PUBLIC_MINT_PRICE) revert InvalidMintFee();
        } else if (block.timestamp > PUBLIC_MINT_ENABLED_AFTER) {
            // If caller is owner of token and public minting has started, require fee to be paid
            if (msg.value != PUBLIC_MINT_PRICE) revert InvalidMintFee();
        }

        // Mint token if not already minted
        if (mints.get(tokenId)) revert AlreadyMinted(tokenId);
        mints.set(tokenId);
        _mint(msg.sender, tokenId);
    }

    function mintSomeOwned(uint16[] calldata tokenIds) external {
        // Don't allow batch free minting after public minting opens
        if (block.timestamp > PUBLIC_MINT_ENABLED_AFTER)
            revert OwnerMintClosed();

        if (tokenIds.length == 0) revert NothingToMint(msg.sender);

        // Loop through all included Mannys
        for (uint256 i = 0; i < tokenIds.length; i++) {
            // Check ownership of each token
            if (MANNYS_GAME.ownerOf(tokenIds[i]) != msg.sender)
                revert NotOwner(tokenIds[i]);
            // Mint crowd if not already minted. Otherwise just skip to next token
            if (!mints.get(tokenIds[i])) {
                mints.set(tokenIds[i]);
                _mint(msg.sender, tokenIds[i]);
            }
        }
    }

    function mintAllOwned() external {
        // Don't allow batch free minting after public minting opens
        if (block.timestamp > PUBLIC_MINT_ENABLED_AFTER)
            revert OwnerMintClosed();

        // Get all Mannys owned by sender
        uint16[] memory tokenIds = MANNYS_GAME.tokensByOwner(msg.sender);
        if (tokenIds.length == 0) revert NothingToMint(msg.sender);

        // Loop through all owned Mannys
        for (uint256 i = 0; i < tokenIds.length; i++) {
            // Mint crowd if not already minted. Otherwise just skip to next token
            if (!mints.get(tokenIds[i])) {
                mints.set(tokenIds[i]);
                _mint(msg.sender, tokenIds[i]);
            }
        }
    }

    /* -------------------------------------------------------------------------- */
    /*                                   MERGING                                  */
    /* -------------------------------------------------------------------------- */
    function merge(uint256 tokenIdToKeep, uint256 tokenIdToBurn) external {
        if (!MERGING_ENABLED) revert MergingNotOpen();

        // Verify ownership of both tokens
        if (ownerOf(tokenIdToKeep) != msg.sender)
            revert NotOwner(tokenIdToKeep);
        if (ownerOf(tokenIdToBurn) != msg.sender)
            revert NotOwner(tokenIdToBurn);

        // Add burn token to base token's merge list
        merged[tokenIdToKeep].push(tokenIdToBurn);

        // If the token to burn already has others merged into it, move those to the token to keep
        if (merged[tokenIdToBurn].length > 0) {
            for (uint256 i = 0; i < merged[tokenIdToBurn].length; i++) {
                merged[tokenIdToKeep].push(merged[tokenIdToBurn][i]);
            }
        }
        delete merged[tokenIdToBurn];

        // Burn the token
        _burn(tokenIdToBurn);

        // Emit event to trigger new rendering job
        emit CrowdsMerged(tokenIdToKeep, tokenIdToBurn);
    }

    /* -------------------------------------------------------------------------- */
    /*                                  METADATA                                  */
    /* -------------------------------------------------------------------------- */
    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns (string memory)
    {
        return string.concat(_baseURI, LibString.toString(tokenId));
    }

    function refreshMetadata(uint256 tokenId) external {
        emit MetadataUpdate(tokenId);
    }

    function refreshMetadataBatch(uint256 fromTokenId, uint256 toTokenId)
        external
    {
        emit BatchMetadataUpdate(fromTokenId, toTokenId);
    }

    function refreshMetadataAll() external {
        emit BatchMetadataUpdate(0, 1616);
    }

    /* -------------------------------------------------------------------------- */
    /*                                  MANNYDAO                                  */
    /* -------------------------------------------------------------------------- */
    function withdraw() external {
        (bool sent, ) = MANNY_DAO.call{value: address(this).balance}("");
        require(sent, "Failed to send Ether");
    }

    function withdrawERC20(address tokenAddress, uint256 amount) external {
        ERC20(tokenAddress).transfer(MANNY_DAO, amount);
    }

    /* -------------------------------------------------------------------------- */
    /*                                    ADMIN                                   */
    /* -------------------------------------------------------------------------- */
    function setMergingEnabled(bool status) external onlyOwner {
        MERGING_ENABLED = status;
    }

    function setBaseURI(string calldata baseURI) external onlyOwner {
        _baseURI = baseURI;
    }
}

Settings
{
  "remappings": [
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "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":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"AlreadyMinted","type":"error"},{"inputs":[],"name":"InvalidMintFee","type":"error"},{"inputs":[],"name":"MergingNotOpen","type":"error"},{"inputs":[],"name":"MintingNotOpen","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"NotOwner","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"NothingToMint","type":"error"},{"inputs":[],"name":"OwnerMintClosed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_toTokenId","type":"uint256"}],"name":"BatchMetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenIdBase","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenIdMerge","type":"uint256"}],"name":"CrowdsMerged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"MetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MERGING_ENABLED","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_MINT_ENABLED_AFTER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenIdToKeep","type":"uint256"},{"internalType":"uint256","name":"tokenIdToBurn","type":"uint256"}],"name":"merge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"merged","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintAllOwned","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mintOne","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"mintSomeOwned","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"refreshMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refreshMetadataAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"internalType":"uint256","name":"toTokenId","type":"uint256"}],"name":"refreshMetadataBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setMergingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"}]

610100604052602860a0818152906200230360c03980516200002a916008916020909101906200010f565b506009805460ff191690553480156200004257600080fd5b50604080518082018252600c81526b4d616e6e792043726f77647360a01b6020808301918252835180850190945260028452614d4360f01b9084015281513393916200009291600091906200010f565b508051620000a89060019060208401906200010f565b5050600680546001600160a01b0319166001600160a01b0384169081179091556040519091506000907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a350620001064262055380620001b5565b60805262000218565b8280546200011d90620001dc565b90600052602060002090601f0160209004810192826200014157600085556200018c565b82601f106200015c57805160ff19168380011785556200018c565b828001600101855582156200018c579182015b828111156200018c5782518255916020019190600101906200016f565b506200019a9291506200019e565b5090565b5b808211156200019a57600081556001016200019f565b60008219821115620001d757634e487b7160e01b600052601160045260246000fd5b500190565b600181811c90821680620001f157607f821691505b6020821081036200021257634e487b7160e01b600052602260045260246000fd5b50919050565b6080516120b362000250600039600081816104680152818161062601528181610a6a015281816113cb015261143801526120b36000f3fe6080604052600436106101cd5760003560e01c806370a08231116100f7578063aca5dfb511610095578063cb3cb5c411610064578063cb3cb5c414610544578063d1c2babb14610557578063d95ba42f14610577578063e985e9c51461059757600080fd5b8063aca5dfb5146104ca578063b70a4201146104ea578063b88d4fde14610504578063c87b56dd1461052457600080fd5b806395d89b41116100d157806395d89b411461044157806397ab1a8b14610456578063a1db97821461048a578063a22cb465146104aa57600080fd5b806370a08231146103e157806382ed582d146104015780638da5cb5b1461042157600080fd5b80631b670e071161016f57806342842e0e1161013e57806342842e0e1461035857806355f804b3146103785780636352211e146103985780636bde2627146103b857600080fd5b80631b670e07146102ee5780631e76c0f01461030357806323b872dd146103235780633ccfd60b1461034357600080fd5b8063081812fc116101ab578063081812fc1461024b578063095ea7b31461029957806313af4035146102b95780631ac22673146102d957600080fd5b806301ffc9a7146101d2578063061dddb01461020757806306fdde0314610229575b600080fd5b3480156101de57600080fd5b506101f26101ed3660046119fa565b6105d2565b60405190151581526020015b60405180910390f35b34801561021357600080fd5b50610227610222366004611a1e565b610624565b005b34801561023557600080fd5b5061023e610882565b6040516101fe9190611ac3565b34801561025757600080fd5b50610281610266366004611af6565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016101fe565b3480156102a557600080fd5b506102276102b4366004611b24565b610910565b3480156102c557600080fd5b506102276102d4366004611b50565b6109f2565b3480156102e557600080fd5b50610227610a68565b3480156102fa57600080fd5b50610227610bf8565b34801561030f57600080fd5b5061022761031e366004611b6d565b610c35565b34801561032f57600080fd5b5061022761033e366004611b8f565b610c73565b34801561034f57600080fd5b50610227610e3a565b34801561036457600080fd5b50610227610373366004611b8f565b610ee0565b34801561038457600080fd5b50610227610393366004611c19565b610fd0565b3480156103a457600080fd5b506102816103b3366004611af6565b611006565b3480156103c457600080fd5b506103d3668f879600ed000081565b6040519081526020016101fe565b3480156103ed57600080fd5b506103d36103fc366004611b50565b61105d565b34801561040d57600080fd5b5061022761041c366004611c69565b6110c0565b34801561042d57600080fd5b50600654610281906001600160a01b031681565b34801561044d57600080fd5b5061023e6110fd565b34801561046257600080fd5b506103d37f000000000000000000000000000000000000000000000000000000000000000081565b34801561049657600080fd5b506102276104a5366004611b24565b61110a565b3480156104b657600080fd5b506102276104c5366004611c86565b61118f565b3480156104d657600080fd5b506103d36104e5366004611b6d565b6111fb565b3480156104f657600080fd5b506009546101f29060ff1681565b34801561051057600080fd5b5061022761051f366004611cbf565b61122c565b34801561053057600080fd5b5061023e61053f366004611af6565b611311565b610227610552366004611af6565b611345565b34801561056357600080fd5b50610227610572366004611b6d565b6114eb565b34801561058357600080fd5b50610227610592366004611af6565b61166e565b3480156105a357600080fd5b506101f26105b2366004611d32565b600560209081526000928352604080842090915290825290205460ff1681565b60006301ffc9a760e01b6001600160e01b03198316148061060357506380ac58cd60e01b6001600160e01b03198316145b8061061e5750635b5e139f60e01b6001600160e01b03198316145b92915050565b7f00000000000000000000000000000000000000000000000000000000000000004211156106655760405163ce29c3e360e01b815260040160405180910390fd5b600081900361068e57604051637543414d60e11b81523360048201526024015b60405180910390fd5b60005b8181101561087d5733732bd58a19c7e4abf17638c5ee6fa96ee5eb53aed9636352211e8585858181106106c6576106c6611d60565b90506020020160208101906106db9190611d86565b6040516001600160e01b031960e084901b16815261ffff9091166004820152602401602060405180830381865afa15801561071a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073e9190611da3565b6001600160a01b0316146107935782828281811061075e5761075e611d60565b90506020020160208101906107739190611d86565b6040516309acb99760e31b815261ffff9091166004820152602401610685565b6107e08383838181106107a8576107a8611d60565b90506020020160208101906107bd9190611d86565b60ff600882901c81166000908152600760205260409020546001919092161b1690565b61086b576108378383838181106107f9576107f9611d60565b905060200201602081019061080e9190611d86565b600881901c60ff908116600090815260076020526040902080546001939092169290921b179055565b61086b3384848481811061084d5761084d611d60565b90506020020160208101906108629190611d86565b61ffff166116f2565b8061087581611dc0565b915050610691565b505050565b6000805461088f90611de7565b80601f01602080910402602001604051908101604052809291908181526020018280546108bb90611de7565b80156109085780601f106108dd57610100808354040283529160200191610908565b820191906000526020600020905b8154815290600101906020018083116108eb57829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b03163381148061095957506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6109965760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b6044820152606401610685565b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6006546001600160a01b03163314610a1c5760405162461bcd60e51b815260040161068590611e21565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7690600090a350565b7f0000000000000000000000000000000000000000000000000000000000000000421115610aa95760405163ce29c3e360e01b815260040160405180910390fd5b6040516301a7034560e31b8152336004820152600090732bd58a19c7e4abf17638c5ee6fa96ee5eb53aed990630d381a2890602401600060405180830381865afa158015610afb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b239190810190611e68565b90508051600003610b4957604051637543414d60e11b8152336004820152602401610685565b60005b8151811015610bf457610b86828281518110610b6a57610b6a611d60565b602002602001015161ffff1660076116a490919063ffffffff16565b610be257610bbb828281518110610b9f57610b9f611d60565b602002602001015161ffff1660076116c990919063ffffffff16565b610be233838381518110610bd157610bd1611d60565b602002602001015161ffff166116f2565b80610bec81611dc0565b915050610b4c565b5050565b604080516000815261065060208201527f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c910160405180910390a1565b60408051838152602081018390527f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91015b60405180910390a15050565b6000818152600260205260409020546001600160a01b03848116911614610cc95760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b6044820152606401610685565b6001600160a01b038216610d135760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b6044820152606401610685565b336001600160a01b0384161480610d4d57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b80610d6e57506000818152600460205260409020546001600160a01b031633145b610dab5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b6044820152606401610685565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60405160009073d0fa4e10b39f3ac9c95dea8151f90b20c497d1879047908381818185875af1925050503d8060008114610e90576040519150601f19603f3d011682016040523d82523d6000602084013e610e95565b606091505b5050905080610edd5760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b6044820152606401610685565b50565b610eeb838383610c73565b6001600160a01b0382163b1561087d57604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610f62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f869190611f2d565b6001600160e01b0319161461087d5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b6044820152606401610685565b6006546001600160a01b03163314610ffa5760405162461bcd60e51b815260040161068590611e21565b61087d60088383611931565b6000818152600260205260409020546001600160a01b0316806110585760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b6044820152606401610685565b919050565b60006001600160a01b0382166110a45760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b6044820152606401610685565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146110ea5760405162461bcd60e51b815260040161068590611e21565b6009805460ff1916911515919091179055565b6001805461088f90611de7565b60405163a9059cbb60e01b815273d0fa4e10b39f3ac9c95dea8151f90b20c497d1876004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af115801561116b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087d9190611f4a565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a602052816000526040600020818154811061121757600080fd5b90600052602060002001600091509150505481565b611237858585610c73565b6001600160a01b0384163b1561130a57604051630a85bd0160e11b808252906001600160a01b0386169063150b7a029061127d9033908a90899089908990600401611f67565b6020604051808303816000875af115801561129c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c09190611f2d565b6001600160e01b0319161461130a5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b6044820152606401610685565b5050505050565b6060600861131e836117fd565b60405160200161132f929190611fd7565b6040516020818303038152906040529050919050565b6040516331a9108f60e11b8152600481018290523390732bd58a19c7e4abf17638c5ee6fa96ee5eb53aed990636352211e90602401602060405180830381865afa158015611397573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113bb9190611da3565b6001600160a01b031614611436577f000000000000000000000000000000000000000000000000000000000000000042101561140a5760405163287485d160e11b815260040160405180910390fd5b668f879600ed000034146114315760405163c288bf8f60e01b815260040160405180910390fd5b611485565b7f000000000000000000000000000000000000000000000000000000000000000042111561148557668f879600ed000034146114855760405163c288bf8f60e01b815260040160405180910390fd5b600881901c600090815260076020526040902054600160ff83161b16156114c2576040516314b27b7f60e31b815260048101829052602401610685565b600881901c60009081526007602052604090208054600160ff84161b179055610edd33826116f2565b60095460ff1661150e57604051635b7c112360e01b815260040160405180910390fd5b3361151883611006565b6001600160a01b031614611542576040516309acb99760e31b815260048101839052602401610685565b3361154c82611006565b6001600160a01b031614611576576040516309acb99760e31b815260048101829052602401610685565b6000828152600a602090815260408083208054600181018255908452918320909101839055828252902054156116185760005b6000828152600a6020526040902054811015611616576000838152600a602052604080822084835291208054839081106115e5576115e5611d60565b600091825260208083209091015483546001810185559383529120909101558061160e81611dc0565b9150506115a9565b505b6000818152600a6020526040812061162f916119b5565b61163881611864565b60408051838152602081018390527feafce1be7f2817eede92eab29057fdfca33fb74acb8b916b365f2a150cd139129101610c67565b6040518181527ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79060200160405180910390a150565b600881901c6000908152602092909252604090912054600160ff9092169190911b1690565b600881901c600090815260209290925260409091208054600160ff9093169290921b9091179055565b6001600160a01b03821661173c5760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b6044820152606401610685565b6000818152600260205260409020546001600160a01b0316156117925760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b6044820152606401610685565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060816000036118245750506040805180820190915260018152600360fc1b602082015290565b604e6040519150808252608082016040525b821561185557600a808406603001828401529092049160001901611836565b604e8190039101908152919050565b6000818152600260205260409020546001600160a01b0316806118b65760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b6044820152606401610685565b6001600160a01b038116600081815260036020908152604080832080546000190190558583526002825280832080546001600160a01b031990811690915560049092528083208054909216909155518492907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b82805461193d90611de7565b90600052602060002090601f01602090048101928261195f57600085556119a5565b82601f106119785782800160ff198235161785556119a5565b828001600101855582156119a5579182015b828111156119a557823582559160200191906001019061198a565b506119b19291506119cf565b5090565b5080546000825590600052602060002090810190610edd91905b5b808211156119b157600081556001016119d0565b6001600160e01b031981168114610edd57600080fd5b600060208284031215611a0c57600080fd5b8135611a17816119e4565b9392505050565b60008060208385031215611a3157600080fd5b823567ffffffffffffffff80821115611a4957600080fd5b818501915085601f830112611a5d57600080fd5b813581811115611a6c57600080fd5b8660208260051b8501011115611a8157600080fd5b60209290920196919550909350505050565b60005b83811015611aae578181015183820152602001611a96565b83811115611abd576000848401525b50505050565b6020815260008251806020840152611ae2816040850160208701611a93565b601f01601f19169190910160400192915050565b600060208284031215611b0857600080fd5b5035919050565b6001600160a01b0381168114610edd57600080fd5b60008060408385031215611b3757600080fd5b8235611b4281611b0f565b946020939093013593505050565b600060208284031215611b6257600080fd5b8135611a1781611b0f565b60008060408385031215611b8057600080fd5b50508035926020909101359150565b600080600060608486031215611ba457600080fd5b8335611baf81611b0f565b92506020840135611bbf81611b0f565b929592945050506040919091013590565b60008083601f840112611be257600080fd5b50813567ffffffffffffffff811115611bfa57600080fd5b602083019150836020828501011115611c1257600080fd5b9250929050565b60008060208385031215611c2c57600080fd5b823567ffffffffffffffff811115611c4357600080fd5b611c4f85828601611bd0565b90969095509350505050565b8015158114610edd57600080fd5b600060208284031215611c7b57600080fd5b8135611a1781611c5b565b60008060408385031215611c9957600080fd5b8235611ca481611b0f565b91506020830135611cb481611c5b565b809150509250929050565b600080600080600060808688031215611cd757600080fd5b8535611ce281611b0f565b94506020860135611cf281611b0f565b935060408601359250606086013567ffffffffffffffff811115611d1557600080fd5b611d2188828901611bd0565b969995985093965092949392505050565b60008060408385031215611d4557600080fd5b8235611d5081611b0f565b91506020830135611cb481611b0f565b634e487b7160e01b600052603260045260246000fd5b61ffff81168114610edd57600080fd5b600060208284031215611d9857600080fd5b8135611a1781611d76565b600060208284031215611db557600080fd5b8151611a1781611b0f565b600060018201611de057634e487b7160e01b600052601160045260246000fd5b5060010190565b600181811c90821680611dfb57607f821691505b602082108103611e1b57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b634e487b7160e01b600052604160045260246000fd5b805161105881611d76565b60006020808385031215611e7b57600080fd5b825167ffffffffffffffff80821115611e9357600080fd5b818501915085601f830112611ea757600080fd5b815181811115611eb957611eb9611e47565b8060051b604051601f19603f83011681018181108582111715611ede57611ede611e47565b604052918252848201925083810185019188831115611efc57600080fd5b938501935b82851015611f2157611f1285611e5d565b84529385019392850192611f01565b98975050505050505050565b600060208284031215611f3f57600080fd5b8151611a17816119e4565b600060208284031215611f5c57600080fd5b8151611a1781611c5b565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b60008151611fcd818560208601611a93565b9290920192915050565b600080845481600182811c915080831680611ff357607f831692505b6020808410820361201257634e487b7160e01b86526022600452602486fd5b818015612026576001811461203757612064565b60ff19861689528489019650612064565b60008b81526020902060005b8681101561205c5781548b820152908501908301612043565b505084890196505b5050505050506120748185611fbb565b9594505050505056fea26469706673582212201d52b469d808d60fe3f4ac5ddd0002d2b4bb317be4995916be0c7897a8ccc13964736f6c634300080d003368747470733a2f2f6d616e6e79732d63726f77642e333273776f7264732e636f6d2f746f6b656e2f

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c806370a08231116100f7578063aca5dfb511610095578063cb3cb5c411610064578063cb3cb5c414610544578063d1c2babb14610557578063d95ba42f14610577578063e985e9c51461059757600080fd5b8063aca5dfb5146104ca578063b70a4201146104ea578063b88d4fde14610504578063c87b56dd1461052457600080fd5b806395d89b41116100d157806395d89b411461044157806397ab1a8b14610456578063a1db97821461048a578063a22cb465146104aa57600080fd5b806370a08231146103e157806382ed582d146104015780638da5cb5b1461042157600080fd5b80631b670e071161016f57806342842e0e1161013e57806342842e0e1461035857806355f804b3146103785780636352211e146103985780636bde2627146103b857600080fd5b80631b670e07146102ee5780631e76c0f01461030357806323b872dd146103235780633ccfd60b1461034357600080fd5b8063081812fc116101ab578063081812fc1461024b578063095ea7b31461029957806313af4035146102b95780631ac22673146102d957600080fd5b806301ffc9a7146101d2578063061dddb01461020757806306fdde0314610229575b600080fd5b3480156101de57600080fd5b506101f26101ed3660046119fa565b6105d2565b60405190151581526020015b60405180910390f35b34801561021357600080fd5b50610227610222366004611a1e565b610624565b005b34801561023557600080fd5b5061023e610882565b6040516101fe9190611ac3565b34801561025757600080fd5b50610281610266366004611af6565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016101fe565b3480156102a557600080fd5b506102276102b4366004611b24565b610910565b3480156102c557600080fd5b506102276102d4366004611b50565b6109f2565b3480156102e557600080fd5b50610227610a68565b3480156102fa57600080fd5b50610227610bf8565b34801561030f57600080fd5b5061022761031e366004611b6d565b610c35565b34801561032f57600080fd5b5061022761033e366004611b8f565b610c73565b34801561034f57600080fd5b50610227610e3a565b34801561036457600080fd5b50610227610373366004611b8f565b610ee0565b34801561038457600080fd5b50610227610393366004611c19565b610fd0565b3480156103a457600080fd5b506102816103b3366004611af6565b611006565b3480156103c457600080fd5b506103d3668f879600ed000081565b6040519081526020016101fe565b3480156103ed57600080fd5b506103d36103fc366004611b50565b61105d565b34801561040d57600080fd5b5061022761041c366004611c69565b6110c0565b34801561042d57600080fd5b50600654610281906001600160a01b031681565b34801561044d57600080fd5b5061023e6110fd565b34801561046257600080fd5b506103d37f000000000000000000000000000000000000000000000000000000006409150781565b34801561049657600080fd5b506102276104a5366004611b24565b61110a565b3480156104b657600080fd5b506102276104c5366004611c86565b61118f565b3480156104d657600080fd5b506103d36104e5366004611b6d565b6111fb565b3480156104f657600080fd5b506009546101f29060ff1681565b34801561051057600080fd5b5061022761051f366004611cbf565b61122c565b34801561053057600080fd5b5061023e61053f366004611af6565b611311565b610227610552366004611af6565b611345565b34801561056357600080fd5b50610227610572366004611b6d565b6114eb565b34801561058357600080fd5b50610227610592366004611af6565b61166e565b3480156105a357600080fd5b506101f26105b2366004611d32565b600560209081526000928352604080842090915290825290205460ff1681565b60006301ffc9a760e01b6001600160e01b03198316148061060357506380ac58cd60e01b6001600160e01b03198316145b8061061e5750635b5e139f60e01b6001600160e01b03198316145b92915050565b7f00000000000000000000000000000000000000000000000000000000640915074211156106655760405163ce29c3e360e01b815260040160405180910390fd5b600081900361068e57604051637543414d60e11b81523360048201526024015b60405180910390fd5b60005b8181101561087d5733732bd58a19c7e4abf17638c5ee6fa96ee5eb53aed9636352211e8585858181106106c6576106c6611d60565b90506020020160208101906106db9190611d86565b6040516001600160e01b031960e084901b16815261ffff9091166004820152602401602060405180830381865afa15801561071a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073e9190611da3565b6001600160a01b0316146107935782828281811061075e5761075e611d60565b90506020020160208101906107739190611d86565b6040516309acb99760e31b815261ffff9091166004820152602401610685565b6107e08383838181106107a8576107a8611d60565b90506020020160208101906107bd9190611d86565b60ff600882901c81166000908152600760205260409020546001919092161b1690565b61086b576108378383838181106107f9576107f9611d60565b905060200201602081019061080e9190611d86565b600881901c60ff908116600090815260076020526040902080546001939092169290921b179055565b61086b3384848481811061084d5761084d611d60565b90506020020160208101906108629190611d86565b61ffff166116f2565b8061087581611dc0565b915050610691565b505050565b6000805461088f90611de7565b80601f01602080910402602001604051908101604052809291908181526020018280546108bb90611de7565b80156109085780601f106108dd57610100808354040283529160200191610908565b820191906000526020600020905b8154815290600101906020018083116108eb57829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b03163381148061095957506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6109965760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b6044820152606401610685565b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6006546001600160a01b03163314610a1c5760405162461bcd60e51b815260040161068590611e21565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7690600090a350565b7f0000000000000000000000000000000000000000000000000000000064091507421115610aa95760405163ce29c3e360e01b815260040160405180910390fd5b6040516301a7034560e31b8152336004820152600090732bd58a19c7e4abf17638c5ee6fa96ee5eb53aed990630d381a2890602401600060405180830381865afa158015610afb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b239190810190611e68565b90508051600003610b4957604051637543414d60e11b8152336004820152602401610685565b60005b8151811015610bf457610b86828281518110610b6a57610b6a611d60565b602002602001015161ffff1660076116a490919063ffffffff16565b610be257610bbb828281518110610b9f57610b9f611d60565b602002602001015161ffff1660076116c990919063ffffffff16565b610be233838381518110610bd157610bd1611d60565b602002602001015161ffff166116f2565b80610bec81611dc0565b915050610b4c565b5050565b604080516000815261065060208201527f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c910160405180910390a1565b60408051838152602081018390527f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91015b60405180910390a15050565b6000818152600260205260409020546001600160a01b03848116911614610cc95760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b6044820152606401610685565b6001600160a01b038216610d135760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b6044820152606401610685565b336001600160a01b0384161480610d4d57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b80610d6e57506000818152600460205260409020546001600160a01b031633145b610dab5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b6044820152606401610685565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60405160009073d0fa4e10b39f3ac9c95dea8151f90b20c497d1879047908381818185875af1925050503d8060008114610e90576040519150601f19603f3d011682016040523d82523d6000602084013e610e95565b606091505b5050905080610edd5760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b6044820152606401610685565b50565b610eeb838383610c73565b6001600160a01b0382163b1561087d57604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610f62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f869190611f2d565b6001600160e01b0319161461087d5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b6044820152606401610685565b6006546001600160a01b03163314610ffa5760405162461bcd60e51b815260040161068590611e21565b61087d60088383611931565b6000818152600260205260409020546001600160a01b0316806110585760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b6044820152606401610685565b919050565b60006001600160a01b0382166110a45760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b6044820152606401610685565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146110ea5760405162461bcd60e51b815260040161068590611e21565b6009805460ff1916911515919091179055565b6001805461088f90611de7565b60405163a9059cbb60e01b815273d0fa4e10b39f3ac9c95dea8151f90b20c497d1876004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af115801561116b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087d9190611f4a565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a602052816000526040600020818154811061121757600080fd5b90600052602060002001600091509150505481565b611237858585610c73565b6001600160a01b0384163b1561130a57604051630a85bd0160e11b808252906001600160a01b0386169063150b7a029061127d9033908a90899089908990600401611f67565b6020604051808303816000875af115801561129c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c09190611f2d565b6001600160e01b0319161461130a5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b6044820152606401610685565b5050505050565b6060600861131e836117fd565b60405160200161132f929190611fd7565b6040516020818303038152906040529050919050565b6040516331a9108f60e11b8152600481018290523390732bd58a19c7e4abf17638c5ee6fa96ee5eb53aed990636352211e90602401602060405180830381865afa158015611397573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113bb9190611da3565b6001600160a01b031614611436577f000000000000000000000000000000000000000000000000000000006409150742101561140a5760405163287485d160e11b815260040160405180910390fd5b668f879600ed000034146114315760405163c288bf8f60e01b815260040160405180910390fd5b611485565b7f000000000000000000000000000000000000000000000000000000006409150742111561148557668f879600ed000034146114855760405163c288bf8f60e01b815260040160405180910390fd5b600881901c600090815260076020526040902054600160ff83161b16156114c2576040516314b27b7f60e31b815260048101829052602401610685565b600881901c60009081526007602052604090208054600160ff84161b179055610edd33826116f2565b60095460ff1661150e57604051635b7c112360e01b815260040160405180910390fd5b3361151883611006565b6001600160a01b031614611542576040516309acb99760e31b815260048101839052602401610685565b3361154c82611006565b6001600160a01b031614611576576040516309acb99760e31b815260048101829052602401610685565b6000828152600a602090815260408083208054600181018255908452918320909101839055828252902054156116185760005b6000828152600a6020526040902054811015611616576000838152600a602052604080822084835291208054839081106115e5576115e5611d60565b600091825260208083209091015483546001810185559383529120909101558061160e81611dc0565b9150506115a9565b505b6000818152600a6020526040812061162f916119b5565b61163881611864565b60408051838152602081018390527feafce1be7f2817eede92eab29057fdfca33fb74acb8b916b365f2a150cd139129101610c67565b6040518181527ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79060200160405180910390a150565b600881901c6000908152602092909252604090912054600160ff9092169190911b1690565b600881901c600090815260209290925260409091208054600160ff9093169290921b9091179055565b6001600160a01b03821661173c5760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b6044820152606401610685565b6000818152600260205260409020546001600160a01b0316156117925760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b6044820152606401610685565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060816000036118245750506040805180820190915260018152600360fc1b602082015290565b604e6040519150808252608082016040525b821561185557600a808406603001828401529092049160001901611836565b604e8190039101908152919050565b6000818152600260205260409020546001600160a01b0316806118b65760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b6044820152606401610685565b6001600160a01b038116600081815260036020908152604080832080546000190190558583526002825280832080546001600160a01b031990811690915560049092528083208054909216909155518492907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b82805461193d90611de7565b90600052602060002090601f01602090048101928261195f57600085556119a5565b82601f106119785782800160ff198235161785556119a5565b828001600101855582156119a5579182015b828111156119a557823582559160200191906001019061198a565b506119b19291506119cf565b5090565b5080546000825590600052602060002090810190610edd91905b5b808211156119b157600081556001016119d0565b6001600160e01b031981168114610edd57600080fd5b600060208284031215611a0c57600080fd5b8135611a17816119e4565b9392505050565b60008060208385031215611a3157600080fd5b823567ffffffffffffffff80821115611a4957600080fd5b818501915085601f830112611a5d57600080fd5b813581811115611a6c57600080fd5b8660208260051b8501011115611a8157600080fd5b60209290920196919550909350505050565b60005b83811015611aae578181015183820152602001611a96565b83811115611abd576000848401525b50505050565b6020815260008251806020840152611ae2816040850160208701611a93565b601f01601f19169190910160400192915050565b600060208284031215611b0857600080fd5b5035919050565b6001600160a01b0381168114610edd57600080fd5b60008060408385031215611b3757600080fd5b8235611b4281611b0f565b946020939093013593505050565b600060208284031215611b6257600080fd5b8135611a1781611b0f565b60008060408385031215611b8057600080fd5b50508035926020909101359150565b600080600060608486031215611ba457600080fd5b8335611baf81611b0f565b92506020840135611bbf81611b0f565b929592945050506040919091013590565b60008083601f840112611be257600080fd5b50813567ffffffffffffffff811115611bfa57600080fd5b602083019150836020828501011115611c1257600080fd5b9250929050565b60008060208385031215611c2c57600080fd5b823567ffffffffffffffff811115611c4357600080fd5b611c4f85828601611bd0565b90969095509350505050565b8015158114610edd57600080fd5b600060208284031215611c7b57600080fd5b8135611a1781611c5b565b60008060408385031215611c9957600080fd5b8235611ca481611b0f565b91506020830135611cb481611c5b565b809150509250929050565b600080600080600060808688031215611cd757600080fd5b8535611ce281611b0f565b94506020860135611cf281611b0f565b935060408601359250606086013567ffffffffffffffff811115611d1557600080fd5b611d2188828901611bd0565b969995985093965092949392505050565b60008060408385031215611d4557600080fd5b8235611d5081611b0f565b91506020830135611cb481611b0f565b634e487b7160e01b600052603260045260246000fd5b61ffff81168114610edd57600080fd5b600060208284031215611d9857600080fd5b8135611a1781611d76565b600060208284031215611db557600080fd5b8151611a1781611b0f565b600060018201611de057634e487b7160e01b600052601160045260246000fd5b5060010190565b600181811c90821680611dfb57607f821691505b602082108103611e1b57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b634e487b7160e01b600052604160045260246000fd5b805161105881611d76565b60006020808385031215611e7b57600080fd5b825167ffffffffffffffff80821115611e9357600080fd5b818501915085601f830112611ea757600080fd5b815181811115611eb957611eb9611e47565b8060051b604051601f19603f83011681018181108582111715611ede57611ede611e47565b604052918252848201925083810185019188831115611efc57600080fd5b938501935b82851015611f2157611f1285611e5d565b84529385019392850192611f01565b98975050505050505050565b600060208284031215611f3f57600080fd5b8151611a17816119e4565b600060208284031215611f5c57600080fd5b8151611a1781611c5b565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b60008151611fcd818560208601611a93565b9290920192915050565b600080845481600182811c915080831680611ff357607f831692505b6020808410820361201257634e487b7160e01b86526022600452602486fd5b818015612026576001811461203757612064565b60ff19861689528489019650612064565b60008b81526020902060005b8681101561205c5781548b820152908501908301612043565b505084890196505b5050505050506120748185611fbb565b9594505050505056fea26469706673582212201d52b469d808d60fe3f4ac5ddd0002d2b4bb317be4995916be0c7897a8ccc13964736f6c634300080d0033

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.