ETH Price: $3,260.07 (-0.18%)
Gas: 1 Gwei

Contract

0xcB6179d546861AEED88242111a7BD5315b709E1D
 

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
Set Approval For...177425402023-07-21 15:54:47371 days ago1689954887IN
0xcB6179d5...15b709E1D
0 ETH0.0017156437.19067184
Set Approval For...170897092023-04-20 19:19:11463 days ago1682018351IN
0xcB6179d5...15b709E1D
0 ETH0.0029277763.4996691
Set Approval For...169501482023-03-31 22:27:47483 days ago1680301667IN
0xcB6179d5...15b709E1D
0 ETH0.0011597425.1075971
Approve169144872023-03-26 22:11:23488 days ago1679868683IN
0xcB6179d5...15b709E1D
0 ETH0.00125926.04433423
Set Approval For...168497532023-03-17 19:58:35497 days ago1679083115IN
0xcB6179d5...15b709E1D
0 ETH0.0013047528.24687698
Set Approval For...168497522023-03-17 19:58:23497 days ago1679083103IN
0xcB6179d5...15b709E1D
0 ETH0.0012549227.16809592
Set Approval For...168497402023-03-17 19:55:47497 days ago1679082947IN
0xcB6179d5...15b709E1D
0 ETH0.0012195726.45089969
Withdraw168281852023-03-14 19:11:11500 days ago1678821071IN
0xcB6179d5...15b709E1D
0 ETH0.0013900445.21935826
Mint One168162442023-03-13 2:58:11502 days ago1678676291IN
0xcB6179d5...15b709E1D
0.0404 ETH0.0019228229.00318508
Mint One167989572023-03-10 16:37:35504 days ago1678466255IN
0xcB6179d5...15b709E1D
0.0404 ETH0.0024330736.69962107
Mint One167989012023-03-10 16:26:11504 days ago1678465571IN
0xcB6179d5...15b709E1D
0.0404 ETH0.0023313235.17119183
Mint One167988752023-03-10 16:20:47504 days ago1678465247IN
0xcB6179d5...15b709E1D
0.0404 ETH0.0021665332.6851595
Mint One167988642023-03-10 16:18:35504 days ago1678465115IN
0xcB6179d5...15b709E1D
0.0404 ETH0.0024190536.48819631
Mint One167987462023-03-10 15:54:35504 days ago1678463675IN
0xcB6179d5...15b709E1D
0.0404 ETH0.0022017733.21082425
Mint One167923252023-03-09 18:07:23505 days ago1678385243IN
0xcB6179d5...15b709E1D
0.0404 ETH0.0036605843.89981919
Mint One167873652023-03-09 1:23:59506 days ago1678325039IN
0xcB6179d5...15b709E1D
0.0404 ETH0.0021741126.07327111
Safe Transfer Fr...167869792023-03-09 0:06:11506 days ago1678320371IN
0xcB6179d5...15b709E1D
0 ETH0.0026023238.74760589
Safe Transfer Fr...167869732023-03-09 0:04:59506 days ago1678320299IN
0xcB6179d5...15b709E1D
0 ETH0.0025493340.71255075
Mint One167869712023-03-09 0:04:35506 days ago1678320275IN
0xcB6179d5...15b709E1D
0.0404 ETH0.0028691843.27773673
Mint One167869582023-03-09 0:01:59506 days ago1678320119IN
0xcB6179d5...15b709E1D
0.0404 ETH0.0029315644.21872025
Mint One167869462023-03-08 23:59:35506 days ago1678319975IN
0xcB6179d5...15b709E1D
0.0404 ETH0.0026842940.49621098
Mint One167869342023-03-08 23:57:11506 days ago1678319831IN
0xcB6179d5...15b709E1D
0.0404 ETH0.0024368936.75721789
Mint One167869332023-03-08 23:56:59506 days ago1678319819IN
0xcB6179d5...15b709E1D
0.0404 ETH0.0025025737.74799612
Mint One167869312023-03-08 23:56:35506 days ago1678319795IN
0xcB6179d5...15b709E1D
0.0404 ETH0.0025177937.97751024
Mint One167869242023-03-08 23:55:11506 days ago1678319711IN
0xcB6179d5...15b709E1D
0.0404 ETH0.0022092333.32326841
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To
168281852023-03-14 19:11:11500 days ago1678821071
0xcB6179d5...15b709E1D
1.5756 ETH
Loading...
Loading

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 : 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;
    }
}

File 2 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 3 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 4 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 5 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 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/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))
        }
    }
}

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

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.