ETH Price: $2,766.70 (+5.46%)

Contract

0x2cfBCB9e9C3D1ab06eF332f535266444aa8d9570
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Approval For...205904012024-08-23 9:26:5913 hrs ago1724405219IN
(0x2cfbcb9e9c3d1ab06ef332f535266444aa8d9570)'>FrankenPunks: Dr. ETHvil's Franken Monsters
0 ETH0.000029671.22662614
Set Approval For...205902452024-08-23 8:55:3514 hrs ago1724403335IN
(0x2cfbcb9e9c3d1ab06ef332f535266444aa8d9570)'>FrankenPunks: Dr. ETHvil's Franken Monsters
0 ETH0.000049121.06553621
Set Approval For...205882722024-08-23 2:17:4720 hrs ago1724379467IN
(0x2cfbcb9e9c3d1ab06ef332f535266444aa8d9570)'>FrankenPunks: Dr. ETHvil's Franken Monsters
0 ETH0.000055511.20393147
Set Approval For...205100232024-08-12 4:03:3511 days ago1723435415IN
(0x2cfbcb9e9c3d1ab06ef332f535266444aa8d9570)'>FrankenPunks: Dr. ETHvil's Franken Monsters
0 ETH0.000061631.33665028
Safe Transfer Fr...205007082024-08-10 20:49:1113 days ago1723322951IN
(0x2cfbcb9e9c3d1ab06ef332f535266444aa8d9570)'>FrankenPunks: Dr. ETHvil's Franken Monsters
0 ETH0.000060921.06352119
Transfer From204653682024-08-05 22:32:1118 days ago1722897131IN
(0x2cfbcb9e9c3d1ab06ef332f535266444aa8d9570)'>FrankenPunks: Dr. ETHvil's Franken Monsters
0 ETH0.000186053.41224986
Set Approval For...202499062024-07-06 20:38:2348 days ago1720298303IN
(0x2cfbcb9e9c3d1ab06ef332f535266444aa8d9570)'>FrankenPunks: Dr. ETHvil's Franken Monsters
0 ETH0.000079411.72241982
Set Approval For...201843172024-06-27 16:48:1157 days ago1719506891IN
(0x2cfbcb9e9c3d1ab06ef332f535266444aa8d9570)'>FrankenPunks: Dr. ETHvil's Franken Monsters
0 ETH0.0006689914.48670154
Set Approval For...201383922024-06-21 6:46:1163 days ago1718952371IN
(0x2cfbcb9e9c3d1ab06ef332f535266444aa8d9570)'>FrankenPunks: Dr. ETHvil's Franken Monsters
0 ETH0.000170333.69422259
Safe Transfer Fr...200030112024-06-02 8:41:5982 days ago1717317719IN
(0x2cfbcb9e9c3d1ab06ef332f535266444aa8d9570)'>FrankenPunks: Dr. ETHvil's Franken Monsters
0 ETH0.000204685.09403058
Set Approval For...199922512024-05-31 20:38:5984 days ago1717187939IN
(0x2cfbcb9e9c3d1ab06ef332f535266444aa8d9570)'>FrankenPunks: Dr. ETHvil's Franken Monsters
0 ETH0.000334817.26153709
Set Approval For...199920562024-05-31 19:59:4784 days ago1717185587IN
(0x2cfbcb9e9c3d1ab06ef332f535266444aa8d9570)'>FrankenPunks: Dr. ETHvil's Franken Monsters
0 ETH0.000374638.12514791
Set Approval For...199834472024-05-30 15:06:5985 days ago1717081619IN
(0x2cfbcb9e9c3d1ab06ef332f535266444aa8d9570)'>FrankenPunks: Dr. ETHvil's Franken Monsters
0 ETH0.0013739329.79825032
Set Approval For...199078352024-05-20 1:23:4795 days ago1716168227IN
(0x2cfbcb9e9c3d1ab06ef332f535266444aa8d9570)'>FrankenPunks: Dr. ETHvil's Franken Monsters
0 ETH0.000138973.01406012
Set Approval For...199061522024-05-19 19:45:1196 days ago1716147911IN
(0x2cfbcb9e9c3d1ab06ef332f535266444aa8d9570)'>FrankenPunks: Dr. ETHvil's Franken Monsters
0 ETH0.000156783.40044003
Set Approval For...198701332024-05-14 18:53:23101 days ago1715712803IN
(0x2cfbcb9e9c3d1ab06ef332f535266444aa8d9570)'>FrankenPunks: Dr. ETHvil's Franken Monsters
0 ETH0.000181256.91602236
Set Approval For...198701332024-05-14 18:53:23101 days ago1715712803IN
(0x2cfbcb9e9c3d1ab06ef332f535266444aa8d9570)'>FrankenPunks: Dr. ETHvil's Franken Monsters
0 ETH0.000318886.91602236
Set Approval For...198568772024-05-12 22:19:47103 days ago1715552387IN
(0x2cfbcb9e9c3d1ab06ef332f535266444aa8d9570)'>FrankenPunks: Dr. ETHvil's Franken Monsters
0 ETH0.00013883.01046929
Set Approval For...198396102024-05-10 12:23:35105 days ago1715343815IN
(0x2cfbcb9e9c3d1ab06ef332f535266444aa8d9570)'>FrankenPunks: Dr. ETHvil's Franken Monsters
0 ETH0.000198554.30639418
Set Approval For...197994012024-05-04 21:23:35111 days ago1714857815IN
(0x2cfbcb9e9c3d1ab06ef332f535266444aa8d9570)'>FrankenPunks: Dr. ETHvil's Franken Monsters
0 ETH0.000335017.25449794
Set Approval For...197936912024-05-04 2:13:59111 days ago1714788839IN
(0x2cfbcb9e9c3d1ab06ef332f535266444aa8d9570)'>FrankenPunks: Dr. ETHvil's Franken Monsters
0 ETH0.000234885.09430954
Set Approval For...197794822024-05-02 2:33:23113 days ago1714617203IN
(0x2cfbcb9e9c3d1ab06ef332f535266444aa8d9570)'>FrankenPunks: Dr. ETHvil's Franken Monsters
0 ETH0.000252075.46711086
Set Approval For...197769272024-05-01 17:59:11114 days ago1714586351IN
(0x2cfbcb9e9c3d1ab06ef332f535266444aa8d9570)'>FrankenPunks: Dr. ETHvil's Franken Monsters
0 ETH0.0004963910.76598886
Transfer From197631202024-04-29 19:42:23116 days ago1714419743IN
(0x2cfbcb9e9c3d1ab06ef332f535266444aa8d9570)'>FrankenPunks: Dr. ETHvil's Franken Monsters
0 ETH0.0004280811.43847095
Transfer From197631162024-04-29 19:41:35116 days ago1714419695IN
(0x2cfbcb9e9c3d1ab06ef332f535266444aa8d9570)'>FrankenPunks: Dr. ETHvil's Franken Monsters
0 ETH0.0004745511.23880355
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x17D2b92A...fA1C423b4
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
FrankenMonsters

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 6 : FrankenMonsters.sol
// SPDX-License-Identifier: MIT

/**
 ______ _____            _   _ _  ________ _   _ __  __  ____  _   _  _____ _______ ______ _____   _____ 
|  ____|  __ \     /\   | \ | | |/ /  ____| \ | |  \/  |/ __ \| \ | |/ ____|__   __|  ____|  __ \ / ____|
| |__  | |__) |   /  \  |  \| | ' /| |__  |  \| | \  / | |  | |  \| | (___    | |  | |__  | |__) | (___  
|  __| |  _  /   / /\ \ | . ` |  < |  __| | . ` | |\/| | |  | | . ` |\___ \   | |  |  __| |  _  / \___ \ 
| |    | | \ \  / ____ \| |\  | . \| |____| |\  | |  | | |__| | |\  |____) |  | |  | |____| | \ \ ____) |
|_|    |_|  \_\/_/    \_\_| \_|_|\_\______|_| \_|_|  |_|\____/|_| \_|_____/   |_|  |______|_|  \_\_____/ 
                                                                                                         
 */

pragma solidity ^0.8.17;

import { ERC721 } from "solmate/src/tokens/ERC721.sol";
import { Owned } from 'solmate/src/auth/Owned.sol';
import { LibString } from 'solmate/src/utils/LibString.sol';
import { IFrankenPunks } from "./IFrankenPunks.sol";
import "./FrankenMonstersErrors.sol";

/**
 * @title FrankenMonsters contract
 * @author New Fundamentals, LLC
 *
 * @notice 10,000 NFT collection to support the original 10,000 NFT collection of 3D FrankenPunks
 */
contract FrankenMonsters is ERC721, Owned {
    using LibString for uint256;

    event SetContractURI(string contractURI);
    event SetBaseURI(string baseTokenURI);
    event SetIsRevealed(bool isRevealed);
    event SetRoyaltyInfo(address royaltyRecipient, uint256 royaltyAmountNumerator);
    event SetFrankenPunksContractAddress(address frankenPunksContractAddress);
    event Withdrew(uint256 balance);

    bytes4 private constant INTERFACE_ID_ERC2981 = 0x2a55205a;
    uint16 public constant STARTING_INDEX = 10000;
    uint8 public constant LEGENDARY_SUPPLY = 10;
    uint16 public constant MAX_SUPPLY = 10000 + LEGENDARY_SUPPLY;
    uint64 private constant ROYALTY_AMOUNT_DENOMINATOR = 1e18;
    
    bool internal _isRevealed;

    uint16 internal _totalSupply;

    string internal _contractURI;
    string internal _baseTokenURI;

    address internal _royaltyRecipient;
    uint256 internal _royaltyAmountNumerator;

    address internal _frankenPunksContractAddress;

    /**
     * @param baseTokenURI A string you want the token URI to be set to, will be used as placeholder URI until reveal
     * @param frankenPunksContractAddress The contract address to access FrankenPunks ownership from
     */
    constructor(
        string memory baseTokenURI,
        address frankenPunksContractAddress
    ) ERC721("FrankenMonsters", "FM") Owned(msg.sender) {
        _baseTokenURI = baseTokenURI;
        _frankenPunksContractAddress = frankenPunksContractAddress;
    }

    /**
     * @dev Define all interfaces this contract supports. Make sure to always leave the super call at the end.
     * 
     * @notice Check support for a specific interface.
     * 
     * @param interfaceId An interface ID in byte4 to check support for.
     * 
     * @return isSupported A boolean defining support for the interface ID.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return (
            interfaceId == INTERFACE_ID_ERC2981 ||
            super.supportsInterface(interfaceId)
        );
    }

    /**
     * @notice Get the contract's metadata.
     * 
     * @return contractURI A string that defines the contract's URI to obtain the contract's metadata.
     */
    function contractURI() external view returns (string memory) {
        return _contractURI;
    }

    /**
     * @notice Get the total current supply of tokens.
     * 
     * @return totalSupply A number of the current supply of tokens within this contract.
     */
    function totalSupply() external view returns (uint16) {
        return _totalSupply;
    }

    /**
     * @notice Get a token's metadata
     * 
     * @param tokenId The ID of the token you wish to get's metadata
     * 
     * @return tokenURI A string that defines the token's URI to obtain the token's metadata.
     */
    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        if (_ownerOf[tokenId] == address(0)) {
            revert NonExistentToken(tokenId);
        }

        string memory baseURI = _baseTokenURI;

        if (!_isRevealed) {
            return baseURI;
        }

        return string(abi.encodePacked(baseURI, tokenId.toString(), ".json"));
    }

    /**
     * @dev Adapted from Nanopass: https://etherscan.io/address/0xf54cc94f1f2f5de012b6aa51f1e7ebdc43ef5afc#code
     * 
     * @notice Query tokens owned by an address, in a given range.
     *
     * @param owner An address you wish to query for.
     * @param startIndex The starting index of the range you wish to query through.
     * @param endIndex The ending index of the range you wish to query through.
     * 
     * @return tokenIds An array of token IDs within the range provided, that the address owns.
     */
    function tokensOfOwner(address owner, uint16 startIndex, uint16 endIndex) external view returns(uint16[] memory) {
        return _findTokensOfOwner(owner, startIndex, endIndex);
    }

    /**
     * @dev Adapted from Nanopass: https://etherscan.io/address/0xf54cc94f1f2f5de012b6aa51f1e7ebdc43ef5afc#code
     * 
     * @notice Query all tokens owned by an address.
     *
     * @param owner An address you wish to query for.
     * 
     * @return tokenIds An array of token IDs that the address owns.
     */
    function walletOfOwner(address owner) external view returns(uint16[] memory) {
        return _findTokensOfOwner(owner, _getMinTokenID(), _getMaxTokenID() + 1);
    }

    /**
     * @notice Implements ERC-2981 royalty info interface.
     * 
     * @param salePrice The sale price of the token.
     * 
     * @return royaltyInfo The royalty info consisting of (the address to pay, the amount to be paid).
     */
    function royaltyInfo(uint256 /* tokenId */, uint256 salePrice) external view returns (address, uint256) {
        return (_royaltyRecipient, salePrice * _royaltyAmountNumerator / ROYALTY_AMOUNT_DENOMINATOR);
    }

    /**
     * @notice Allows contract owner to set the contract URI. This is used to set metadata for thid-parties.
     * 
     * @param newContractURI A string you want the contract URI to be set to.
     */
    function setContractURI(string calldata newContractURI) external onlyOwner {
        _contractURI = newContractURI;
        emit SetContractURI(newContractURI);
    }

    /**
     * @notice Allows contract owner to set the base token URI. This is used in #tokenURI after reveal to compute the final URI of a token.
     * 
     * @param baseTokenURI A string you want the base token URI to be set to.
     */
    function setBaseURI(string calldata baseTokenURI) external onlyOwner {
        _baseTokenURI = baseTokenURI;
        emit SetBaseURI(baseTokenURI);
    }

    /**
     * @notice Allows contract owner to set if the tokens are revealed or not.
     * 
     * @param isRevealed A boolean value used to set if the contract should reveal the tokens or not.
     * @param baseTokenURI A string you want the base token URI to be set to.
     */
    function setIsRevealed(bool isRevealed, string calldata baseTokenURI) external onlyOwner {
        _baseTokenURI = baseTokenURI;
        _isRevealed = isRevealed;
        emit SetBaseURI(baseTokenURI);
        emit SetIsRevealed(isRevealed);
    }

    /**
     * @notice Allows contract owner to set royalty information.
     * 
     * @param royaltyRecipient An address to a wallet or contract who should get paid the royalties.
     * @param royaltyAmountNumerator A uint256 number used to calculate royalty amount.
     */
    function setRoyaltyInfo(address royaltyRecipient, uint256 royaltyAmountNumerator) external onlyOwner {
        _royaltyRecipient = royaltyRecipient;
        _royaltyAmountNumerator = royaltyAmountNumerator;
        emit SetRoyaltyInfo(royaltyRecipient, royaltyAmountNumerator);
    }

    /**
     * @notice Allows contract owner to set the FrankenPunks contrat address
     * 
     * @param frankenPunksContractAddress The FrankenPunks contract address
     */
    function setFrankenPunksContractAddress(address frankenPunksContractAddress) external onlyOwner {
        _frankenPunksContractAddress = frankenPunksContractAddress;
        emit SetFrankenPunksContractAddress(frankenPunksContractAddress);
    }

    /**
     * @notice Allows the contract owner to mint tokens and to airdrop all tokens to existing FrankenPunks holders.
     * 
     * @param numberToMint The number of tokens to mint
     * @param airdropEnabled A flag used to enable aidrops to FrankenPunks holders
     */
    function mintTokens(uint16 numberToMint, bool airdropEnabled) external onlyOwner {
        if (_totalSupply == MAX_SUPPLY) {
            revert AllTokensMinted();
        }

        if (numberToMint == 0) {
            revert MintZeroQuantity();
        }

        if (_totalSupply + numberToMint > MAX_SUPPLY) {
            revert  MintOverMaxSupply(numberToMint, MAX_SUPPLY - _totalSupply);   
        }

        IFrankenPunks frankenPunks = IFrankenPunks(_frankenPunksContractAddress);

        for (uint16 i = _totalSupply; i < _totalSupply + numberToMint; i++) {
            uint16 tokenId = STARTING_INDEX + i;
            address receiver = msg.sender;

            if (i < MAX_SUPPLY - LEGENDARY_SUPPLY && airdropEnabled) {
                try frankenPunks.ownerOf(i) returns (address frankenPunksOwner) {
                    receiver = frankenPunksOwner;
                } catch (bytes memory) {}
            }

            _mint(receiver, tokenId);
        }

        _totalSupply = _totalSupply + numberToMint;
    }

    /**
     * @notice Allows the contract owner to withdraw the balance of the contract.
     */
    function withdraw() external onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
        emit Withdrew(balance);
    }

    /**
     * @dev We don't intend on external folks sending payments to this contract.
     * 
     * @notice Allow the contract to receive a transaction.
     */
    receive() external payable {}

    /**
     * @dev Takes an address and an index range and looks to return all owned token IDs.
     * 
     * @param owner An address you wish to query for.
     * @param startIndex The starting index of the range you wish to query through.
     * @param endIndex The ending index of the range you wish to query through.
     * 
     * @return tokenIds An array of token IDs within the range provided, that the address owns.
     */
    function _findTokensOfOwner(address owner, uint16 startIndex, uint16 endIndex) internal view returns(uint16[] memory) {
        if (_totalSupply == 0) {
            revert SearchNotPossible();
        }

        uint256 maxTokenID = _getMaxTokenID();

        if (endIndex < startIndex || startIndex > maxTokenID || endIndex > maxTokenID + 1) {
            revert SearchOutOfRange(startIndex, endIndex, _getMinTokenID(), maxTokenID);
        }

        uint256 tokenCount = balanceOf(owner);
        uint256 rangeCount = endIndex - startIndex;
        uint256 maxArraySize = rangeCount < tokenCount ? rangeCount : tokenCount;
        uint256 ownerIndex = 0;

        uint16[] memory ownerTokens = new uint16[](maxArraySize);
        
        for (uint16 tokenId = startIndex; tokenId < endIndex; tokenId++) {
            if (ownerIndex == maxArraySize) break;

            if (ownerOf(tokenId) == owner) {
                ownerTokens[ownerIndex] = tokenId;
                ownerIndex++;
            }
        }

        return ownerTokens;
    }

    /**
     * @dev Returns the smallest token ID.
     * 
     * @return minTokenId The smallest token ID.
     */
    function _getMinTokenID() internal view returns(uint16) {
        if (_totalSupply == 0) {
            return 0;
        }

        return STARTING_INDEX;
    }

    /**
     * @dev Returns the largest token ID.
     * 
     * @return minTokenId The largest token ID.
     */
    function _getMaxTokenID() internal view returns(uint16) {
        if (_totalSupply == 0) {
            return 0;
        }

        return STARTING_INDEX + _totalSupply - 1;
    }
}

File 2 of 6 : IFrankenPunks.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.17;

interface IFrankenPunks {
    function ownerOf(uint256 tokenId) external view returns(address);
    function balanceOf(address owner) external view returns(uint256);
}

File 3 of 6 : FrankenMonstersErrors.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.17;

error NonExistentToken(uint256 tokenId);
error MintZeroQuantity();
error MintOverMaxSupply(uint16 numberToMint, uint16 remainingSupply);
error AllTokensMinted();
error SearchNotPossible();
error SearchOutOfRange(uint16 startIndex, uint16 endIndex, uint16 minTokenIndex, uint256 maxTokenIndex);

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

/// @notice Modern, minimalist, and gas efficient ERC-721 implementation.
/// @author Solmate (https://github.com/transmissions11/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);

        require(
            to.code.length == 0 ||
                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);

        require(
            to.code.length == 0 ||
                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);

        require(
            to.code.length == 0 ||
                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);

        require(
            to.code.length == 0 ||
                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/transmissions11/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 : Owned.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseTokenURI","type":"string"},{"internalType":"address","name":"frankenPunksContractAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AllTokensMinted","type":"error"},{"inputs":[{"internalType":"uint16","name":"numberToMint","type":"uint16"},{"internalType":"uint16","name":"remainingSupply","type":"uint16"}],"name":"MintOverMaxSupply","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"NonExistentToken","type":"error"},{"inputs":[],"name":"SearchNotPossible","type":"error"},{"inputs":[{"internalType":"uint16","name":"startIndex","type":"uint16"},{"internalType":"uint16","name":"endIndex","type":"uint16"},{"internalType":"uint16","name":"minTokenIndex","type":"uint16"},{"internalType":"uint256","name":"maxTokenIndex","type":"uint256"}],"name":"SearchOutOfRange","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":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseTokenURI","type":"string"}],"name":"SetBaseURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"contractURI","type":"string"}],"name":"SetContractURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"frankenPunksContractAddress","type":"address"}],"name":"SetFrankenPunksContractAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isRevealed","type":"bool"}],"name":"SetIsRevealed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"royaltyRecipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"royaltyAmountNumerator","type":"uint256"}],"name":"SetRoyaltyInfo","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"}],"name":"Withdrew","type":"event"},{"inputs":[],"name":"LEGENDARY_SUPPLY","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STARTING_INDEX","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"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":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"uint16","name":"numberToMint","type":"uint16"},{"internalType":"bool","name":"airdropEnabled","type":"bool"}],"name":"mintTokens","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":"","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"baseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newContractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"frankenPunksContractAddress","type":"address"}],"name":"setFrankenPunksContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isRevealed","type":"bool"},{"internalType":"string","name":"baseTokenURI","type":"string"}],"name":"setIsRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"royaltyRecipient","type":"address"},{"internalType":"uint256","name":"royaltyAmountNumerator","type":"uint256"}],"name":"setRoyaltyInfo","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":"owner","type":"address"},{"internalType":"uint16","name":"startIndex","type":"uint16"},{"internalType":"uint16","name":"endIndex","type":"uint16"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint16[]","name":"","type":"uint16[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"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":[{"internalType":"address","name":"owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint16[]","name":"","type":"uint16[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

Deployed Bytecode

0x6080604052600436106101d15760003560e01c80636ab65915116100f7578063a32deb8711610095578063e2e784d511610064578063e2e784d514610593578063e8a3d485146105b3578063e985e9c5146105c8578063f7de95e41461060357600080fd5b8063a32deb8714610513578063b88d4fde14610533578063c0ec0a8114610553578063c87b56dd1461057357600080fd5b8063938e3d7b116100d1578063938e3d7b1461049e5780639498d7eb146104be57806395d89b41146104de578063a22cb465146104f357600080fd5b80636ab659151461042957806370a08231146104505780638da5cb5b1461047e57600080fd5b806323b872dd1161016f57806342842e0e1161013e57806342842e0e1461039c578063438b6300146103bc57806355f804b3146103e95780636352211e1461040957600080fd5b806323b872dd146103135780632a55205a1461033357806332cb6b0c146103725780633ccfd60b1461038757600080fd5b8063095ea7b3116101ab578063095ea7b3146102825780630eaef989146102a457806313af4035146102c457806318160ddd146102e457600080fd5b806301ffc9a7146101dd57806306fdde0314610212578063081812fc1461023457600080fd5b366101d857005b600080fd5b3480156101e957600080fd5b506101fd6101f83660046118e8565b610619565b60405190151581526020015b60405180910390f35b34801561021e57600080fd5b50610227610644565b6040516102099190611930565b34801561024057600080fd5b5061026a61024f366004611963565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610209565b34801561028e57600080fd5b506102a261029d366004611991565b6106d2565b005b3480156102b057600080fd5b506102a26102bf3660046119bd565b6107b9565b3480156102d057600080fd5b506102a26102df3660046119bd565b610838565b3480156102f057600080fd5b50600654600160a81b900461ffff165b60405161ffff9091168152602001610209565b34801561031f57600080fd5b506102a261032e3660046119da565b6108ae565b34801561033f57600080fd5b5061035361034e366004611a1b565b610a75565b604080516001600160a01b039093168352602083019190915201610209565b34801561037e57600080fd5b50610300610ab6565b34801561039357600080fd5b506102a2610ac6565b3480156103a857600080fd5b506102a26103b73660046119da565b610b50565b3480156103c857600080fd5b506103dc6103d73660046119bd565b610c48565b6040516102099190611a3d565b3480156103f557600080fd5b506102a2610404366004611ac7565b610c6e565b34801561041557600080fd5b5061026a610424366004611963565b610ce3565b34801561043557600080fd5b5061043e600a81565b60405160ff9091168152602001610209565b34801561045c57600080fd5b5061047061046b3660046119bd565b610d3a565b604051908152602001610209565b34801561048a57600080fd5b5060065461026a906001600160a01b031681565b3480156104aa57600080fd5b506102a26104b9366004611ac7565b610d9d565b3480156104ca57600080fd5b506102a26104d9366004611b19565b610e06565b3480156104ea57600080fd5b50610227610ec9565b3480156104ff57600080fd5b506102a261050e366004611b6c565b610ed6565b34801561051f57600080fd5b506102a261052e366004611bb3565b610f42565b34801561053f57600080fd5b506102a261054e366004611bcf565b6111d9565b34801561055f57600080fd5b506103dc61056e366004611c42565b6112c1565b34801561057f57600080fd5b5061022761058e366004611963565b6112d6565b34801561059f57600080fd5b506102a26105ae366004611991565b6113ec565b3480156105bf57600080fd5b5061022761146f565b3480156105d457600080fd5b506101fd6105e3366004611c87565b600560209081526000928352604080842090915290825290205460ff1681565b34801561060f57600080fd5b5061030061271081565b60006001600160e01b0319821663152a902d60e11b148061063e575061063e82611501565b92915050565b6000805461065190611cc0565b80601f016020809104026020016040519081016040528092919081815260200182805461067d90611cc0565b80156106ca5780601f1061069f576101008083540402835291602001916106ca565b820191906000526020600020905b8154815290600101906020018083116106ad57829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b03163381148061071b57506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b61075d5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064015b60405180910390fd5b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6006546001600160a01b031633146107e35760405162461bcd60e51b815260040161075490611cfa565b600b80546001600160a01b0319166001600160a01b0383169081179091556040519081527f14b0885b935ef84d2182c33a0fc2314230e46e8eeb3a47951e9ad117a52fcf7a906020015b60405180910390a150565b6006546001600160a01b031633146108625760405162461bcd60e51b815260040161075490611cfa565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7690600090a350565b6000818152600260205260409020546001600160a01b038481169116146109045760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b6044820152606401610754565b6001600160a01b03821661094e5760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b6044820152606401610754565b336001600160a01b038416148061098857506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b806109a957506000818152600460205260409020546001600160a01b031633145b6109e65760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b6044820152606401610754565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600954600a5460009182916001600160a01b0390911690670de0b6b3a764000090610aa09086611d36565b610aaa9190611d4d565b915091505b9250929050565b610ac3600a612710611d6f565b81565b6006546001600160a01b03163314610af05760405162461bcd60e51b815260040161075490611cfa565b6040514790339082156108fc029083906000818181858888f19350505050158015610b1f573d6000803e3d6000fd5b506040518181527fb6b476da71cea8275cac6b1720c04966afaff5e637472cedb6cbd32c43a232519060200161082d565b610b5b8383836108ae565b6001600160a01b0382163b1580610c045750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610bd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf89190611d91565b6001600160e01b031916145b610c435760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b6044820152606401610754565b505050565b606061063e82610c5661154f565b610c5e611573565b610c69906001611d6f565b6115bc565b6006546001600160a01b03163314610c985760405162461bcd60e51b815260040161075490611cfa565b6008610ca5828483611e12565b507f23c8c9488efebfd474e85a7956de6f39b17c7ab88502d42a623db2d8e382bbaa8282604051610cd7929190611efb565b60405180910390a15050565b6000818152600260205260409020546001600160a01b031680610d355760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b6044820152606401610754565b919050565b60006001600160a01b038216610d815760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b6044820152606401610754565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610dc75760405162461bcd60e51b815260040161075490611cfa565b6007610dd4828483611e12565b507f5ca9f750836b0b7efdace104f07b5c9f0df0650c0fd24f5163e99044ae36ea528282604051610cd7929190611efb565b6006546001600160a01b03163314610e305760405162461bcd60e51b815260040161075490611cfa565b6008610e3d828483611e12565b506006805460ff60a01b1916600160a01b851515021790556040517f23c8c9488efebfd474e85a7956de6f39b17c7ab88502d42a623db2d8e382bbaa90610e879084908490611efb565b60405180910390a160405183151581527f40dcfa5db899ec74bc8371886cd6b7550aa92fd52a425b9c498a839183f2886c9060200160405180910390a1505050565b6001805461065190611cc0565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6006546001600160a01b03163314610f6c5760405162461bcd60e51b815260040161075490611cfa565b610f79600a612710611d6f565b60065461ffff918216600160a81b90910490911603610fab57604051634db085a760e01b815260040160405180910390fd5b8161ffff16600003610fd05760405163b562e8dd60e01b815260040160405180910390fd5b610fdd600a612710611d6f565b60065461ffff91821691610ffb918591600160a81b90910416611d6f565b61ffff161115611053576006548290600160a81b900461ffff16611022600a612710611d6f565b61102c9190611f0f565b604051633ba9a5c760e11b815261ffff928316600482015291166024820152604401610754565b600b546006546001600160a01b0390911690600160a81b900461ffff165b60065461108a908590600160a81b900461ffff16611d6f565b61ffff168161ffff16101561119e5760006110a782612710611d6f565b905033600a6110b881612710611d6f565b6110c29190611f0f565b61ffff168361ffff161080156110d55750845b1561117b576040516331a9108f60e11b815261ffff841660048201526001600160a01b03851690636352211e90602401602060405180830381865afa92505050801561113e575060408051601f3d908101601f1916820190925261113b91810190611f2a565b60015b611178573d80801561116c576040519150601f19603f3d011682016040523d82523d6000602084013e611171565b606091505b505061117b565b90505b611189818361ffff16611780565b5050808061119690611f47565b915050611071565b506006546111b8908490600160a81b900461ffff16611d6f565b600660156101000a81548161ffff021916908361ffff160217905550505050565b6111e48585856108ae565b6001600160a01b0384163b158061127b5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a029061122c9033908a90899089908990600401611f68565b6020604051808303816000875af115801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f9190611d91565b6001600160e01b031916145b6112ba5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b6044820152606401610754565b5050505050565b60606112ce8484846115bc565b949350505050565b6000818152600260205260409020546060906001600160a01b0316611311576040516338077a2b60e01b815260048101839052602401610754565b60006008805461132090611cc0565b80601f016020809104026020016040519081016040528092919081815260200182805461134c90611cc0565b80156113995780601f1061136e57610100808354040283529160200191611399565b820191906000526020600020905b81548152906001019060200180831161137c57829003601f168201915b50505050509050600660149054906101000a900460ff166113ba5792915050565b806113c48461188b565b6040516020016113d5929190611fa7565b604051602081830303815290604052915050919050565b6006546001600160a01b031633146114165760405162461bcd60e51b815260040161075490611cfa565b600980546001600160a01b0319166001600160a01b038416908117909155600a82905560408051918252602082018390527fff26d16febb506bdb66324138b1086facb8bd304fc773e610e0aa1593b7a07469101610cd7565b60606007805461147e90611cc0565b80601f01602080910402602001604051908101604052809291908181526020018280546114aa90611cc0565b80156114f75780601f106114cc576101008083540402835291602001916114f7565b820191906000526020600020905b8154815290600101906020018083116114da57829003601f168201915b5050505050905090565b60006301ffc9a760e01b6001600160e01b03198316148061153257506380ac58cd60e01b6001600160e01b03198316145b8061063e5750506001600160e01b031916635b5e139f60e01b1490565b600654600090600160a81b900461ffff16810361156c5750600090565b5061271090565b600654600090600160a81b900461ffff1681036115905750600090565b6006546001906115ad90600160a81b900461ffff16612710611d6f565b6115b79190611f0f565b905090565b600654606090600160a81b900461ffff166000036115ed576040516339e60cb560e11b815260040160405180910390fd5b60006115f7611573565b61ffff1690508361ffff168361ffff1610806116165750808461ffff16115b8061162e5750611627816001611fe6565b8361ffff16115b1561167457838361163d61154f565b604051636ec9d20b60e11b815261ffff93841660048201529183166024830152909116604482015260648101829052608401610754565b600061167f86610d3a565b9050600061168d8686611f0f565b61ffff16905060008282106116a257826116a4565b815b90506000808267ffffffffffffffff8111156116c2576116c2611dae565b6040519080825280602002602001820160405280156116eb578160200160208202803683370190505b509050885b8861ffff168161ffff16101561177257828414611772578a6001600160a01b031661171e8261ffff16610ce3565b6001600160a01b031603611760578082848151811061173f5761173f611ff9565b61ffff909216602092830291909101909101528261175c8161200f565b9350505b8061176a81611f47565b9150506116f0565b509998505050505050505050565b6001600160a01b0382166117ca5760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b6044820152606401610754565b6000818152600260205260409020546001600160a01b0316156118205760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b6044820152606401610754565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806118a55750819003601f19909101908152919050565b6001600160e01b0319811681146118e557600080fd5b50565b6000602082840312156118fa57600080fd5b8135611905816118cf565b9392505050565b60005b8381101561192757818101518382015260200161190f565b50506000910152565b602081526000825180602084015261194f81604085016020870161190c565b601f01601f19169190910160400192915050565b60006020828403121561197557600080fd5b5035919050565b6001600160a01b03811681146118e557600080fd5b600080604083850312156119a457600080fd5b82356119af8161197c565b946020939093013593505050565b6000602082840312156119cf57600080fd5b81356119058161197c565b6000806000606084860312156119ef57600080fd5b83356119fa8161197c565b92506020840135611a0a8161197c565b929592945050506040919091013590565b60008060408385031215611a2e57600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b81811015611a7957835161ffff1683529284019291840191600101611a59565b50909695505050505050565b60008083601f840112611a9757600080fd5b50813567ffffffffffffffff811115611aaf57600080fd5b602083019150836020828501011115610aaf57600080fd5b60008060208385031215611ada57600080fd5b823567ffffffffffffffff811115611af157600080fd5b611afd85828601611a85565b90969095509350505050565b80358015158114610d3557600080fd5b600080600060408486031215611b2e57600080fd5b611b3784611b09565b9250602084013567ffffffffffffffff811115611b5357600080fd5b611b5f86828701611a85565b9497909650939450505050565b60008060408385031215611b7f57600080fd5b8235611b8a8161197c565b9150611b9860208401611b09565b90509250929050565b803561ffff81168114610d3557600080fd5b60008060408385031215611bc657600080fd5b611b8a83611ba1565b600080600080600060808688031215611be757600080fd5b8535611bf28161197c565b94506020860135611c028161197c565b935060408601359250606086013567ffffffffffffffff811115611c2557600080fd5b611c3188828901611a85565b969995985093965092949392505050565b600080600060608486031215611c5757600080fd5b8335611c628161197c565b9250611c7060208501611ba1565b9150611c7e60408501611ba1565b90509250925092565b60008060408385031215611c9a57600080fd5b8235611ca58161197c565b91506020830135611cb58161197c565b809150509250929050565b600181811c90821680611cd457607f821691505b602082108103611cf457634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761063e5761063e611d20565b600082611d6a57634e487b7160e01b600052601260045260246000fd5b500490565b61ffff818116838216019080821115611d8a57611d8a611d20565b5092915050565b600060208284031215611da357600080fd5b8151611905816118cf565b634e487b7160e01b600052604160045260246000fd5b601f821115610c4357600081815260208120601f850160051c81016020861015611deb5750805b601f850160051c820191505b81811015611e0a57828155600101611df7565b505050505050565b67ffffffffffffffff831115611e2a57611e2a611dae565b611e3e83611e388354611cc0565b83611dc4565b6000601f841160018114611e725760008515611e5a5750838201355b600019600387901b1c1916600186901b1783556112ba565b600083815260209020601f19861690835b82811015611ea35786850135825560209485019460019092019101611e83565b5086821015611ec05760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6020815260006112ce602083018486611ed2565b61ffff828116828216039080821115611d8a57611d8a611d20565b600060208284031215611f3c57600080fd5b81516119058161197c565b600061ffff808316818103611f5e57611f5e611d20565b6001019392505050565b6001600160a01b0386811682528516602082015260408101849052608060608201819052600090611f9c9083018486611ed2565b979650505050505050565b60008351611fb981846020880161190c565b835190830190611fcd81836020880161190c565b64173539b7b760d91b9101908152600501949350505050565b8082018082111561063e5761063e611d20565b634e487b7160e01b600052603260045260246000fd5b60006001820161202157612021611d20565b506001019056fea2646970667358221220757fbd23f4656184118761fe2da05d881d9d4aa2a3416d95a10c322a165856c364736f6c63430008110033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

OVERVIEW

FrankenMonsters are a collection of 10,010 monsters created by Dr. ETHvil in the Punksville universe. Each FrankenMonster gives the holder the ability to participate in Punksville community governance. This includes a community-run treasury, control over project direction, and CryptoPunk IP rights.

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ 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.