Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0xcF2Bc3205c58F44A74eb489884C2619D51FF6bc1
Balance 0 ETH
Nonce 1
Code Size 5419 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

5419 bytes
0x608060405234801561001057600080fd5b50600436106101585760003560e01c806370a08231116100c3578063b88d4fde1161007c578063b88d4fde14610302578063c87b56dd14610315578063cf456ae714610328578063d547cfb71461033b578063e985e9c514610343578063f2fde38b1461035657600080fd5b806370a08231146102725780637222ebe114610293578063893d20e8146102a057806395d89b41146102b1578063a22cb465146102d7578063b7f47d32146102ea57600080fd5b806340c10f191161011557806340c10f191461020057806342842e0e1461021357806342966c681461022657806355f804b3146102395780636352211e1461024c578063687e17531461025f57600080fd5b806301ffc9a71461015d57806306fdde0314610185578063081812fc1461019a57806308abf026146101c5578063095ea7b3146101da57806323b872dd146101ed575b600080fd5b61017061016b366004610f65565b610369565b60405190151581526020015b60405180910390f35b61018d6103bb565b60405161017c9190610fbb565b6101ad6101a8366004610fee565b61044d565b6040516001600160a01b03909116815260200161017c565b6101d86101d336600461101c565b6104a6565b005b6101d86101e8366004611039565b6104f8565b6101d86101fb366004611065565b610599565b6101d861020e366004611039565b6105ca565b6101d8610221366004611065565b610607565b6101d8610234366004610fee565b610612565b6101d8610247366004611132565b610697565b6101ad61025a366004610fee565b6106d4565b6101d861026d366004611190565b610709565b61028561028036600461101c565b610746565b60405190815260200161017c565b6005546101709060ff1681565b6007546001600160a01b03166101ad565b60408051808201909152600a815269425542424c454e46543360b01b602082015261018d565b6101d86102e53660046111ab565b61078a565b6005546101ad9061010090046001600160a01b031681565b6101d86103103660046111e0565b610795565b61018d610323366004610fee565b6107a6565b6101d86103363660046111ab565b61080f565b61018d61088a565b610170610351366004611260565b610899565b6101d861036436600461101c565b6108db565b60006001600160e01b031982166380ac58cd60e01b148061039a57506001600160e01b03198216635b5e139f60e01b145b806103b557506001600160e01b031982166301ffc9a760e01b145b92915050565b6060600080546103ca90611299565b80601f01602080910402602001604051908101604052809291908181526020018280546103f690611299565b80156104435780601f1061041857610100808354040283529160200191610443565b820191906000526020600020905b81548152906001019060200180831161042657829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661048a5760405162461bcd60e51b8152600401610481906112d3565b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b6007546001600160a01b031633146104d05760405162461bcd60e51b8152600401610481906112fa565b600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6000610503826106d4565b9050806001600160a01b0316836001600160a01b0316036105365760405162461bcd60e51b81526004016104819061131d565b336001600160a01b038216148061055257506105528133610899565b61058a5760405162461bcd60e51b81526020600482015260096024820152682337b93134b23232b760b91b6044820152606401610481565b610594838361094d565b505050565b6105a333826109bb565b6105bf5760405162461bcd60e51b8152600401610481906112fa565b610594838383610a16565b3360009081526008602052604090205460ff166105f95760405162461bcd60e51b8152600401610481906112fa565b6106038282610afb565b5050565b610594838383610599565b6000818152600260205260409020546001600160a01b0316806106685760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d0955493915160921b6044820152606401610481565b61067233836109bb565b61068e5760405162461bcd60e51b8152600401610481906112fa565b61060382610c13565b6007546001600160a01b031633146106c15760405162461bcd60e51b8152600401610481906112fa565b8051610603906006906020840190610ecc565b6000818152600260205260408120546001600160a01b0316806103b55760405162461bcd60e51b8152600401610481906112d3565b6007546001600160a01b031633146107335760405162461bcd60e51b8152600401610481906112fa565b6005805460ff1916911515919091179055565b60006001600160a01b03821661076e5760405162461bcd60e51b815260040161048190611341565b506001600160a01b031660009081526001602052604090205490565b610603338383610c92565b6107a0848484610599565b50505050565b6000818152600260205260409020546060906001600160a01b03166107dd5760405162461bcd60e51b8152600401610481906112d3565b60066107e883610d30565b6040516020016107f9929190611380565b6040516020818303038152906040529050919050565b6007546001600160a01b031633146108395760405162461bcd60e51b8152600401610481906112fa565b6001600160a01b03821661085f5760405162461bcd60e51b815260040161048190611341565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b6060600680546103ca90611299565b6001600160a01b03808316600090815260046020908152604080832093851683529290529081205460ff16806108d457506108d48383610e31565b9392505050565b6007546001600160a01b031633146109055760405162461bcd60e51b8152600401610481906112fa565b6001600160a01b03811661092b5760405162461bcd60e51b815260040161048190611341565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b600081815260036020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610982826106d4565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b039081169084168114806109ea57506109ea8185610899565b80610a0e5750836001600160a01b0316610a038461044d565b6001600160a01b0316145b949350505050565b6000818152600260205260409020546001600160a01b03848116911614610a4f5760405162461bcd60e51b8152600401610481906112fa565b6001600160a01b038216610a755760405162461bcd60e51b815260040161048190611341565b610a7e81610ebe565b6001600160a01b038084166000818152600160208181526040808420805460001901905594871680845285842080549093019092558583526002905283822080546001600160a01b031916821790559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b038216610b215760405162461bcd60e51b815260040161048190611341565b6000818152600260205260409020546001600160a01b03168015610ba757826001600160a01b0316816001600160a01b031603610b705760405162461bcd60e51b81526004016104819061131d565b60405162461bcd60e51b815260206004820152600c60248201526b544f4b454e5f45584953545360a01b6044820152606401610481565b6001600160a01b038316600081815260016020818152604080842080549093019092558583526002905280822080546001600160a01b0319168417905551849291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4505050565b6000610c1e826106d4565b9050610c2982610ebe565b6001600160a01b03811660008181526001602090815260408083208054600019019055858352600290915280822080546001600160a01b0319169055518492907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b816001600160a01b0316836001600160a01b031603610cc35760405162461bcd60e51b81526004016104819061131d565b6001600160a01b03838116600081815260046020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b606081600003610d575750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610d815780610d6b8161143c565b9150610d7a9050600a8361146b565b9150610d5b565b60008167ffffffffffffffff811115610d9c57610d9c6110a6565b6040519080825280601f01601f191660200182016040528015610dc6576020820181803683370190505b5090505b8415610a0e57610ddb60018361147f565b9150610de8600a86611496565b610df39060306114aa565b60f81b818381518110610e0857610e086114c2565b60200101906001600160f81b031916908160001a905350610e2a600a8661146b565b9450610dca565b60055460009060ff16610e46575060006103b5565b60055460405163c455279160e01b81526001600160a01b038581166004830152610100909204821691841690829063c455279190602401602060405180830381865afa158015610e9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0391906114d8565b610ec960008261094d565b50565b828054610ed890611299565b90600052602060002090601f016020900481019282610efa5760008555610f40565b82601f10610f1357805160ff1916838001178555610f40565b82800160010185558215610f40579182015b82811115610f40578251825591602001919060010190610f25565b50610f4c929150610f50565b5090565b5b80821115610f4c5760008155600101610f51565b600060208284031215610f7757600080fd5b81356001600160e01b0319811681146108d457600080fd5b60005b83811015610faa578181015183820152602001610f92565b838111156107a05750506000910152565b6020815260008251806020840152610fda816040850160208701610f8f565b601f01601f19169190910160400192915050565b60006020828403121561100057600080fd5b5035919050565b6001600160a01b0381168114610ec957600080fd5b60006020828403121561102e57600080fd5b81356108d481611007565b6000806040838503121561104c57600080fd5b823561105781611007565b946020939093013593505050565b60008060006060848603121561107a57600080fd5b833561108581611007565b9250602084013561109581611007565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156110d7576110d76110a6565b604051601f8501601f19908116603f011681019082821181831017156110ff576110ff6110a6565b8160405280935085815286868601111561111857600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561114457600080fd5b813567ffffffffffffffff81111561115b57600080fd5b8201601f8101841361116c57600080fd5b610a0e848235602084016110bc565b8035801515811461118b57600080fd5b919050565b6000602082840312156111a257600080fd5b6108d48261117b565b600080604083850312156111be57600080fd5b82356111c981611007565b91506111d76020840161117b565b90509250929050565b600080600080608085870312156111f657600080fd5b843561120181611007565b9350602085013561121181611007565b925060408501359150606085013567ffffffffffffffff81111561123457600080fd5b8501601f8101871361124557600080fd5b611254878235602084016110bc565b91505092959194509250565b6000806040838503121561127357600080fd5b823561127e81611007565b9150602083013561128e81611007565b809150509250929050565b600181811c908216806112ad57607f821691505b6020821081036112cd57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600d908201526c24a72b20a624a22faa27a5a2a760991b604082015260600190565b6020808252600990820152682327a92124a22222a760b91b604082015260600190565b6020808252600a9082015269125111535413d511539560b21b604082015260600190565b6020808252600990820152682d22a927afa0a2222960b91b604082015260600190565b60008151611376818560208601610f8f565b9290920192915050565b600080845481600182811c91508083168061139c57607f831692505b602080841082036113bb57634e487b7160e01b86526022600452602486fd5b8180156113cf57600181146113e05761140d565b60ff1986168952848901965061140d565b60008b81526020902060005b868110156114055781548b8201529085019083016113ec565b505084890196505b50505050505061141d8185611364565b95945050505050565b634e487b7160e01b600052601160045260246000fd5b60006001820161144e5761144e611426565b5060010190565b634e487b7160e01b600052601260045260246000fd5b60008261147a5761147a611455565b500490565b60008282101561149157611491611426565b500390565b6000826114a5576114a5611455565b500690565b600082198211156114bd576114bd611426565b500190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156114ea57600080fd5b81516108d48161100756fea2646970667358221220386a922d734cb582609ede3d8bc648a592887df62df52e46f85536974bfadc8f64736f6c634300080e0033

Verified Source Code Partial Match

Compiler: v0.8.14+commit.80d49f37 EVM: constantinople Optimization: Yes (200 runs)
BubblehouseNFTV3.sol 365 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract OwnableDelegateProxy {}
// Used to delegate ownership of a contract to another address, to save on unneeded transactions to approve contract use for users
contract OpenSeaProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

interface IERC721 is IERC165 {
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    function balanceOf(address owner) external view returns (uint256 balance);
    function ownerOf(uint256 tokenId) external view returns (address owner);
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
    function safeTransferFrom(address from, address to, uint256 tokenId) external;
    function transferFrom(address from, address to, uint256 tokenId) external;

    function approve(address to, uint256 tokenId) external;
    function setApprovalForAll(address operator, bool _approved) external;
    function getApproved(uint256 tokenId) external view returns (address operator);
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

interface IERC721Metadata is IERC721 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

contract BubblehouseNFT3 is IERC165, IERC721, IERC721Metadata {

    // --- Init ---

    constructor(string memory name_, address openSeaProxyRegistryAddress_, string memory baseURI_, address sharedWallet_) {
        _name = name_;
        _owner = msg.sender;
        openSeaProxyRegistryAddress = openSeaProxyRegistryAddress_;
        isOpenSeaEnabled = (openSeaProxyRegistryAddress_ != address(0));
        _baseURI = baseURI_;
        if (sharedWallet_ != address(0)) {
            _isMinter[sharedWallet_] = true;
        }
    }


    // --- Name and symbol ---

    string private _name;

    function name() public view override returns (string memory) {
        return _name;
    }

    function symbol() public pure override returns (string memory) {
        return "BUBBLENFT3";
    }


    // --- ERC165 ---

    function supportsInterface(bytes4 interfaceId) public pure override returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            interfaceId == type(IERC165).interfaceId;
    }


    // --- Delegation ---

    function _msgSender() internal view returns (address) {
        // TODO: support for OpenSea's metatransactions?
        return msg.sender;
    }


    // --- Balances ----

    // owner address => token count
    mapping(address => uint256) private _balances;

    function balanceOf(address owner) public view override returns (uint256) {
        require(owner != address(0), "ZERO_ADDR");
        return _balances[owner];
    }


    // --- Owners ---

    // token ID => owner address
    mapping(uint256 => address) private _owners;

    function ownerOf(uint256 tokenId) public view override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "INVALID_TOKEN");
        return owner;
    }

    function _exists(uint256 tokenId) internal view returns (bool) {
        return _owners[tokenId] != address(0);
    }



    // --- Approvals ---

    // token ID => approved address
    mapping(uint256 => address) private _tokenApprovals;

    // owner => operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    function approve(address to, uint256 tokenId) public override {
        address owner = ownerOf(tokenId);
        require(to != owner, "IDEMPOTENT");
        require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "Forbidden");
        _approve(to, tokenId);
    }

    function getApproved(uint256 tokenId) public view override returns (address) {
        require(_exists(tokenId), "INVALID_TOKEN");
        return _tokenApprovals[tokenId];
    }

    function setApprovalForAll(address operator, bool approved) public override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    function isApprovedForAll(address owner, address operator) public view override returns (bool) {
        return _operatorApprovals[owner][operator] || isOpenSeaOperator(owner, operator);
    }

    function _approve(address to, uint256 tokenId) internal {
        _tokenApprovals[tokenId] = to;
        emit Approval(ownerOf(tokenId), to, tokenId);
    }

    function _clearApproval(uint256 tokenId) internal {
        _approve(address(0), tokenId);
    }

    function _setApprovalForAll(address owner, address operator, bool approved) internal {
        require(owner != operator, "IDEMPOTENT");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }


    // --- OpenSea ---

    bool public isOpenSeaEnabled = true;
    address public openSeaProxyRegistryAddress;

    function isOpenSeaOperator(address owner, address operator) internal view returns (bool) {
        if (!isOpenSeaEnabled) {
            return false;
        }
        OpenSeaProxyRegistry proxyRegistry = OpenSeaProxyRegistry(openSeaProxyRegistryAddress);
        return (address(proxyRegistry.proxies(owner)) == operator);
    }

    function setOpenSeaEnabled(bool enabled) external onlyOwner {
        isOpenSeaEnabled = enabled;
    }

    function setOpenSeaProxyRegistryAddress(address addr) external onlyOwner {
        openSeaProxyRegistryAddress = addr;
    }


    // -- Access checks ---

    // Returns whether `spender` is allowed to manage `tokenId`.
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {
        address owner = _owners[tokenId];
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }


    // --- Metadata ---

    string private _baseURI;

    function setBaseURI(string memory newBaseURI) public onlyOwner {
        _baseURI = newBaseURI;
    }

    function baseTokenURI() public view returns (string memory) {
        return _baseURI;
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), "INVALID_TOKEN");
        return string(abi.encodePacked(_baseURI, intToString(tokenId)));
    }



    // --- Minting ---

    function mint(address to, uint256 tokenId) public onlyMinter {
        _mint(to, tokenId);
    }

    function _mint(address to, uint256 tokenId) internal {
        require(to != address(0), "ZERO_ADDR");

        address owner = _owners[tokenId];
        if (owner != address(0)) {
            if (owner == to) {
                revert("IDEMPOTENT");
            }
            revert("TOKEN_EXISTS");
        }

        _beforeTokenTransfer(address(0), to, tokenId);

        unchecked { _balances[to] += 1; }
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }


    // --- Transfers ---

    function transferFrom(address from, address to, uint256 tokenId) public override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "FORBIDDEN");
        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override {
        transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory /*data*/) public override {
        transferFrom(from, to, tokenId);
    }

    function _transfer(address from, address to, uint256 tokenId) internal {
        require(_owners[tokenId] == from, "FORBIDDEN");
        require(to != address(0), "ZERO_ADDR");

        _beforeTokenTransfer(from, to, tokenId);

        _clearApproval(tokenId);

        unchecked {
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }


    // --- Burn ---

    function burn(uint256 tokenId) public {
        address owner = _owners[tokenId];
        if (owner == address(0)) {
            revert("ALREADY_BURNED");
        }
        require(_isApprovedOrOwner(_msgSender(), tokenId), "FORBIDDEN");
        _burn(tokenId);
    }

    function _burn(uint256 tokenId) internal {
        address owner = ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        _clearApproval(tokenId);

        unchecked {
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }


    // --- Hooks ---
    //
    // Zero `from` is mint, zero `to` is burn.

    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal {}
    function _afterTokenTransfer(address from, address to, uint256 tokenId) internal {}


    // --- Ownership ---

    address private _owner;

    modifier onlyOwner() {
        require(_owner == msg.sender, "FORBIDDEN");
        _;
    }

    function getOwner() public view returns (address) {
        return _owner;
    }

    function transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0), "ZERO_ADDR");
        _owner = newOwner;
    }


    // --- Minters ---

    mapping(address => bool) private _isMinter;

    modifier onlyMinter() {
        require(_isMinter[msg.sender], "FORBIDDEN");
        _;
    }

    function setMinter(address addr, bool authorized) external onlyOwner {
        require(addr != address(0), "ZERO_ADDR");
        _isMinter[addr] = authorized;
    }


    // --- Utils ---
    
    // From @openzeppelin/contracts/utils/Strings.sol
    function intToString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

}

Read Contract

balanceOf 0x70a08231 → uint256
baseTokenURI 0xd547cfb7 → string
getApproved 0x081812fc → address
getOwner 0x893d20e8 → address
isApprovedForAll 0xe985e9c5 → bool
isOpenSeaEnabled 0x7222ebe1 → bool
name 0x06fdde03 → string
openSeaProxyRegistryAddress 0xb7f47d32 → address
ownerOf 0x6352211e → address
supportsInterface 0x01ffc9a7 → bool
symbol 0x95d89b41 → string
tokenURI 0xc87b56dd → string

Write Contract 12 functions

These functions modify contract state and require a wallet transaction to execute.

approve 0x095ea7b3
address to
uint256 tokenId
burn 0x42966c68
uint256 tokenId
mint 0x40c10f19
address to
uint256 tokenId
safeTransferFrom 0x42842e0e
address from
address to
uint256 tokenId
safeTransferFrom 0xb88d4fde
address from
address to
uint256 tokenId
bytes
setApprovalForAll 0xa22cb465
address operator
bool approved
setBaseURI 0x55f804b3
string newBaseURI
setMinter 0xcf456ae7
address addr
bool authorized
setOpenSeaEnabled 0x687e1753
bool enabled
setOpenSeaProxyRegistryAddress 0x08abf026
address addr
transferFrom 0x23b872dd
address from
address to
uint256 tokenId
transferOwnership 0xf2fde38b
address newOwner

Recent Transactions

No transactions found for this address