ETH Price: $3,098.53 (-1.93%)

Token

B-BOTS (BBOT)
 

Overview

Max Total Supply

0 BBOT

Holders

382

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 BBOT
0x1fbbbeae389c92d44c21de0288f3ec2f753b1102
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BBOTS

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 1337 runs

Other Settings:
default evmVersion
File 1 of 18 : BBOTS.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.13;

import {IERC165} from "@openzeppelin/contracts/interfaces/IERC165.sol";
import {IERC2981} from "@openzeppelin/contracts/interfaces/IERC2981.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {ERC721} from "@rari-capital/solmate/src/tokens/ERC721.sol";
import {CantBeEvil, LicenseVersion} from "@a16z/contracts/licenses/CantBeEvil.sol";

import {ERC721Checkpointable} from "src/base/ERC721Checkpointable.sol";
import {IBBOTSRenderer} from "src/interface/BBOTSRenderer.interface.sol";
import {IBBOTS, MintPhase, Ticket} from "src/interface/BBOTS.interface.sol";
import {ExternalRenderer} from "src/metadata/ExternalRenderer.sol";

//_/\\\\\\\\\\\\\__________________/\\\\\\\\\\\\\_________/\\\\\_______/\\\\\\\\\\\\\\\_____/\\\\\\\\\\\___
//_\/\\\/////////\\\_______________\/\\\/////////\\\_____/\\\///\\\____\///////\\\/////____/\\\/////////\\\_
// _\/\\\_______\/\\\_______________\/\\\_______\/\\\___/\\\/__\///\\\________\/\\\________\//\\\______\///__
//  _\/\\\\\\\\\\\\\\___/\\\\\\\\\\\_\/\\\\\\\\\\\\\\___/\\\______\//\\\_______\/\\\_________\////\\\_________
//   _\/\\\/////////\\\_\///////////__\/\\\/////////\\\_\/\\\_______\/\\\_______\/\\\____________\////\\\______
//    _\/\\\_______\/\\\_______________\/\\\_______\/\\\_\//\\\______/\\\________\/\\\_______________\////\\\___
//     _\/\\\_______\/\\\_______________\/\\\_______\/\\\__\///\\\__/\\\__________\/\\\________/\\\______\//\\\__
//      _\/\\\\\\\\\\\\\/________________\/\\\\\\\\\\\\\/_____\///\\\\\/___________\/\\\_______\///\\\\\\\\\\\/___
//       _\/////////////__________________\/////////////_________\/////_____________\///__________\///////////_____

/// @title B-BOTS: CC0 Media Model
/// @author ghard.eth
contract BBOTS is
    IBBOTS,
    ERC721Checkpointable,
    Ownable,
    ExternalRenderer,
    CantBeEvil
{
    /*///////////////////////////////////////////////////////////////
                            MINT STORAGE
    //////////////////////////////////////////////////////////////*/

    /** Total supply that can ever be minted */
    uint256 public immutable MAX_SUPPLY;
    /** Cost to mint (not applicable to admin) */
    uint256 public immutable MINT_COST;
    /** Max per address that can be minted (not applicable to admin) */
    uint256 public MAX_PER_ADDRESS;
    /** Total supply that is available to mint currently (not applicable to admin) */
    uint256 public AVAILABLE_SUPPLY;
    /** Next tokenId to be minted */
    uint256 public nextId;

    bytes32 public constant TICKET_TYPEHASH =
        keccak256("Ticket(address buyer)");

    mapping(address => uint256) public numMinted;

    MintPhase public mintPhase = MintPhase.Locked;
    address public gatekeeper;

    /*///////////////////////////////////////////////////////////////
                              ROYALTIES
    //////////////////////////////////////////////////////////////*/

    address recipient;
    uint256 royaltyBps;

    constructor(
        IBBOTSRenderer _renderer,
        address _gatekeeper,
        address _recipient,
        uint256 _royaltyBps,
        uint256 _maxSupply,
        uint256 _maxPerAddress,
        uint256 _availableSupply,
        uint256 _mintCost,
        string memory _name,
        string memory _symbol
    )
        ERC721Checkpointable(_name, _symbol)
        ExternalRenderer(_renderer)
        CantBeEvil(LicenseVersion.CBE_CC0)
    {
        gatekeeper = _gatekeeper;

        recipient = _recipient;
        royaltyBps = _royaltyBps;

        if (_availableSupply > _maxSupply) revert InvalidAvailableSupply();

        MAX_SUPPLY = _maxSupply;
        MAX_PER_ADDRESS = _maxPerAddress;
        AVAILABLE_SUPPLY = _availableSupply;
        MINT_COST = _mintCost;
    }

    /*///////////////////////////////////////////////////////////////
                        		MINTING
    //////////////////////////////////////////////////////////////*/

    /// @dev validates payment exceeds minting costs
    modifier validatePayment(uint256 _amt) {
        if (msg.value != _amt * MINT_COST) revert InvalidPayment();
        _;
    }

    /// @dev validates that contract is in the expected phase
    modifier validatePhase(MintPhase _expected) {
        if (mintPhase != _expected) revert InvalidMintPhase();
        _;
    }

    /// @dev validates that call wont exceed available supply
    modifier validateAvailableSupply(uint256 _amt) {
        if (nextId + _amt > AVAILABLE_SUPPLY) revert AvailableSupplyExceeded();
        _;
    }

    /// @dev validates that call wont exceed total supply
    modifier validateTotalSupply(uint256 _amt) {
        if (nextId + _amt > MAX_SUPPLY) revert TotalSupplyExceeded();
        _;
    }

    /// @dev validates address cant mint more than MAX_PER_ADDRESS
    modifier validateAddressSupply(uint256 _amt) {
        numMinted[msg.sender] += _amt;
        if (numMinted[msg.sender] > MAX_PER_ADDRESS) revert MaxMintsExceeded();
        _;
    }

    /// @dev validates that the ticket was signed by the gatekeeper for the caller
    modifier validateTicket(Ticket calldata _ticket) {
        bytes32 domainSeparator = keccak256(
            abi.encode(
                DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                getChainId(),
                address(this)
            )
        );

        bytes32 structHash = keccak256(abi.encode(TICKET_TYPEHASH, msg.sender));

        bytes32 digest = keccak256(
            abi.encodePacked("\x19\x01", domainSeparator, structHash)
        );

        address signatory = ecrecover(digest, _ticket.v, _ticket.r, _ticket.s);

        if (signatory != gatekeeper) revert InvalidTicket();
        _;
    }

    /**
     * @notice Sets the phase which allows who can mint
     * @dev Only callable by owner
     */
    function setMintPhase(MintPhase _phase) external onlyOwner {
        mintPhase = _phase;

        emit MintPhaseSet(_phase);
    }

    /**
     * @notice Sets supply available for public and allowlist minting
     * @dev only callable by owner
     */
    function setAvailableSupply(uint256 _amt) external onlyOwner {
        // Available supply can never be more than max supply
        if (_amt > MAX_SUPPLY) revert InvalidAvailableSupply();
        // Available supply can never be less than current supply
        if (_amt < nextId) revert InvalidAvailableSupply();

        AVAILABLE_SUPPLY = _amt;
        emit AvailableSupplySet(_amt);
    }

    /**
     * @notice Sets how many can be minted per address
     * @dev only callable by owner
     */
    function setMaxPerAddress(uint256 _amt) external onlyOwner {
        MAX_PER_ADDRESS = _amt;
        emit MaxPerAddressSet(_amt);
    }

    /**
     * @notice Allows owner to mint directly `_amt` of B-BOTS to `_to`. Cant exceed total supply.
     * @dev Only callable by owner
     */
    function mintTo(address _to, uint256 _amt) external onlyOwner {
        _processMint(_to, _amt);
    }

    /**
     * @notice Allows an address on the allowlist to mint with a signed ticket.
     * @dev To be called during the allowlist minting phase
     */
    function mint(uint256 _amt, Ticket calldata _ticket)
        external
        payable
        validatePayment(_amt)
        validatePhase(MintPhase.Allow)
        validateTicket(_ticket)
        validateAddressSupply(_amt)
        validateAvailableSupply(_amt)
    {
        _processMint(msg.sender, _amt);
    }

    /**
     * @notice Allows anyone to mint up to `MAX_PER_ADDRESS`.
     * @dev To be called during the public minting phase
     */
    function mint(uint256 _amt)
        external
        payable
        validatePayment(_amt)
        validatePhase(MintPhase.Public)
        validateAddressSupply(_amt)
        validateAvailableSupply(_amt)
    {
        _processMint(msg.sender, _amt);
    }

    /// @dev validate total supply and call internal mint function
    function _processMint(address _to, uint256 _amt)
        internal
        validateTotalSupply(_amt)
    {
        for (uint256 i; i < _amt; i++) {
            // Assume minter can receive to save gas
            _mint(_to, nextId);
            nextId++;
        }
    }

    /*///////////////////////////////////////////////////////////////
                        		ROYALTIES
    //////////////////////////////////////////////////////////////*/

    /// @dev returns royalty info according to EIP-2981 standard
    function royaltyInfo(uint256, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount)
    {
        return (recipient, (salePrice * royaltyBps) / 10_000);
    }

    function updateRoyaltyRecipient(address _recipient) external onlyOwner {
        recipient = _recipient;
    }

    /// @dev send funds to recipient
    function sweep() external {
        (bool success, ) = recipient.call{
            value: address(this).balance
        }(new bytes(0));
        require(success);
    }

    /*///////////////////////////////////////////////////////////////
                        	   METADATA
    //////////////////////////////////////////////////////////////*/

    /**
     * @notice Get the metadata address for token `_id`. Will be updated after the reveal of each tranche
     */
    function tokenURI(uint256 id)
        public
        view
        override
        returns (string memory metadataUri)
    {
        return renderer.tokenURI(id);
    }

    function updateMetadataRenderer(address _renderer)
        external
        override
        onlyOwner
    {
        _updateMetadataRenderer(_renderer);
    }

    function lockMetadata() external override onlyOwner {
        _lockMetadata();
    }

    /*///////////////////////////////////////////////////////////////
                                UTILS
    //////////////////////////////////////////////////////////////*/

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(IERC165, ERC721, CantBeEvil)
        returns (bool)
    {
        return
            interfaceId == type(IERC2981).interfaceId ||
            ERC721.supportsInterface(interfaceId) ||
            CantBeEvil.supportsInterface(interfaceId) ||
            super.supportsInterface(interfaceId);
    }
}

File 2 of 18 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)

pragma solidity ^0.8.0;

import "../utils/introspection/IERC165.sol";

File 3 of 18 : IERC2981.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

import "../utils/introspection/IERC165.sol";

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

File 4 of 18 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 5 of 18 : 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 6 of 18 : CantBeEvil.sol
// SPDX-License-Identifier: MIT
// a16z Contracts v0.0.1 (CantBeEvil.sol)
pragma solidity ^0.8.13;

import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/utils/introspection/ERC165.sol";
import "./ICantBeEvil.sol";

enum LicenseVersion {
    CBE_CC0,
    CBE_ECR,
    CBE_NECR,
    CBE_NECR_HS,
    CBE_PR,
    CBE_PR_HS
}

contract CantBeEvil is ERC165, ICantBeEvil {
    using Strings for uint;
    string internal constant _BASE_LICENSE_URI = "ar://_D9kN1WrNWbCq55BSAGRbTB4bS3v8QAPTYmBThSbX3A/";
    LicenseVersion public licenseVersion; // return string
    constructor(LicenseVersion _licenseVersion) {
        licenseVersion = _licenseVersion;
    }

    function getLicenseURI() public view returns (string memory) {
        return string.concat(_BASE_LICENSE_URI, uint(licenseVersion).toString());
    }

    function getLicenseName() public view returns (string memory) {
        return _getLicenseVersionKeyByValue(licenseVersion);
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165) returns (bool) {
        return
            interfaceId == type(ICantBeEvil).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    function _getLicenseVersionKeyByValue(LicenseVersion _licenseVersion) internal pure returns (string memory) {
        require(uint8(_licenseVersion) <= 6);
        if (LicenseVersion.CBE_CC0 == _licenseVersion) return "CBE_CC0";
        if (LicenseVersion.CBE_ECR == _licenseVersion) return "CBE_ECR";
        if (LicenseVersion.CBE_NECR == _licenseVersion) return "CBE_NECR";
        if (LicenseVersion.CBE_NECR_HS == _licenseVersion) return "CBE_NECR_HS";
        if (LicenseVersion.CBE_PR == _licenseVersion) return "CBE_PR";
        else return "CBE_PR_HS";
    }
}

File 7 of 18 : ERC721Checkpointable.sol
//SPDX-License-Identifier: BSD-3-Clause
pragma solidity ^0.8.13;

import {ERC721} from "@rari-capital/solmate/src/tokens/ERC721.sol";

/// @notice This is port of the Nouns ERC721Checkpointable.sol using solmate as a base. For licensing information please check original implementation:
/// @notice https://github.com/nounsDAO/nouns-monorepo/blob/1.0.0/packages/nouns-contracts/contracts/base/ERC721Checkpointable.sol
abstract contract ERC721Checkpointable is ERC721 {
    /// @notice Defines decimals as per ERC-20 convention to make integrations with 3rd party governance platforms easier
    uint8 public constant decimals = 0;

    /// @notice A record of each accounts delegate
    mapping(address => address) private _delegates;

    /// @notice A checkpoint for marking number of votes from a given block
    struct Checkpoint {
        uint32 fromBlock;
        uint96 votes;
    }

    /// @notice A record of votes checkpoints for each account, by index
    mapping(address => mapping(uint32 => Checkpoint)) public checkpoints;

    /// @notice The number of checkpoints for each account
    mapping(address => uint32) public numCheckpoints;

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH =
        keccak256(
            "EIP712Domain(string name,uint256 chainId,address verifyingContract)"
        );

    /// @notice The EIP-712 typehash for the delegation struct used by the contract
    bytes32 public constant DELEGATION_TYPEHASH =
        keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");

    /// @notice A record of states for signing / validating signatures
    mapping(address => uint256) public nonces;

    /// @notice An event thats emitted when an account changes its delegate
    event DelegateChanged(
        address indexed delegator,
        address indexed fromDelegate,
        address indexed toDelegate
    );

    /// @notice An event thats emitted when a delegate account's vote balance changes
    event DelegateVotesChanged(
        address indexed delegate,
        uint256 previousBalance,
        uint256 newBalance
    );

    constructor(string memory _name, string memory _symbol)
        ERC721(_name, _symbol)
    {}

    function transferFrom(
        address from,
        address to,
        uint256 id
    ) public override {
        _beforeTokenTransfer(from, to, id);
        super.transferFrom(from, to, id);
    }

    function _mint(address to, uint256 id) internal virtual override {
        _beforeTokenTransfer(address(0), to, id);
        super._mint(to, id);
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 id
    ) internal virtual {
        /// @notice Differs from `_transferTokens()` to use `delegates` override method to simulate auto-delegation
        _moveDelegates(delegates(from), delegates(to), 1);
    }

    /**
     * @notice The votes a delegator can delegate, which is the current balance of the delegator.
     * @dev Used when calling `_delegate()`
     */
    function votesToDelegate(address delegator) public view returns (uint96) {
        return
            safe96(
                balanceOf(delegator),
                "ERC721Checkpointable::votesToDelegate: amount exceeds 96 bits"
            );
    }

    /**
     * @notice Overrides the standard `Comp.sol` delegates mapping to return
     * the delegator's own address if they haven't delegated.
     * This avoids having to delegate to oneself.
     */
    function delegates(address delegator) public view returns (address) {
        address current = _delegates[delegator];
        return current == address(0) ? delegator : current;
    }

    /**
     * @notice Delegate votes from `msg.sender` to `delegatee`
     * @param delegatee The address to delegate votes to
     */
    function delegate(address delegatee) public {
        if (delegatee == address(0)) delegatee = msg.sender;
        return _delegate(msg.sender, delegatee);
    }

    /**
     * @notice Delegates votes from signatory to `delegatee`
     * @param delegatee The address to delegate votes to
     * @param nonce The contract state required to match the signature
     * @param expiry The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function delegateBySig(
        address delegatee,
        uint256 nonce,
        uint256 expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public {
        bytes32 domainSeparator = keccak256(
            abi.encode(
                DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                getChainId(),
                address(this)
            )
        );

        bytes32 structHash = keccak256(
            abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry)
        );
        bytes32 digest = keccak256(
            abi.encodePacked("\x19\x01", domainSeparator, structHash)
        );
        address signatory = ecrecover(digest, v, r, s);
        require(
            signatory != address(0),
            "ERC721Checkpointable::delegateBySig: invalid signature"
        );
        require(
            nonce == nonces[signatory]++,
            "ERC721Checkpointable::delegateBySig: invalid nonce"
        );
        require(
            block.timestamp <= expiry,
            "ERC721Checkpointable::delegateBySig: signature expired"
        );

        return _delegate(signatory, delegatee);
    }

    /**
     * @notice Gets the current votes balance for `account`
     * @param account The address to get votes balance
     * @return The number of current votes for `account`
     */
    function getCurrentVotes(address account) external view returns (uint96) {
        uint32 nCheckpoints = numCheckpoints[account];
        return
            nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
    }

    /**
     * @notice Determine the prior number of votes for an account as of a block number
     * @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
     * @param account The address of the account to check
     * @param blockNumber The block number to get the vote balance at
     * @return The number of votes the account had as of the given block
     */
    function getPriorVotes(address account, uint256 blockNumber)
        public
        view
        returns (uint96)
    {
        require(
            blockNumber < block.number,
            "ERC721Checkpointable::getPriorVotes: not yet determined"
        );

        uint32 nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) {
            return 0;
        }

        // First check most recent balance
        if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
            return checkpoints[account][nCheckpoints - 1].votes;
        }

        // Next check implicit zero balance
        if (checkpoints[account][0].fromBlock > blockNumber) {
            return 0;
        }

        uint32 lower = 0;
        uint32 upper = nCheckpoints - 1;
        while (upper > lower) {
            uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            Checkpoint memory cp = checkpoints[account][center];
            if (cp.fromBlock == blockNumber) {
                return cp.votes;
            } else if (cp.fromBlock < blockNumber) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return checkpoints[account][lower].votes;
    }

    function _delegate(address delegator, address delegatee) internal {
        /// @notice differs from `_delegate()` in `Comp.sol` to use `delegates` override method to simulate auto-delegation
        address currentDelegate = delegates(delegator);

        _delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        uint96 amount = votesToDelegate(delegator);

        _moveDelegates(currentDelegate, delegatee, amount);
    }

    function _moveDelegates(
        address srcRep,
        address dstRep,
        uint96 amount
    ) internal {
        if (srcRep != dstRep && amount > 0) {
            if (srcRep != address(0)) {
                uint32 srcRepNum = numCheckpoints[srcRep];
                uint96 srcRepOld = srcRepNum > 0
                    ? checkpoints[srcRep][srcRepNum - 1].votes
                    : 0;
                uint96 srcRepNew = sub96(
                    srcRepOld,
                    amount,
                    "ERC721Checkpointable::_moveDelegates: amount underflows"
                );
                _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
            }

            if (dstRep != address(0)) {
                uint32 dstRepNum = numCheckpoints[dstRep];
                uint96 dstRepOld = dstRepNum > 0
                    ? checkpoints[dstRep][dstRepNum - 1].votes
                    : 0;
                uint96 dstRepNew = add96(
                    dstRepOld,
                    amount,
                    "ERC721Checkpointable::_moveDelegates: amount overflows"
                );
                _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
            }
        }
    }

    function _writeCheckpoint(
        address delegatee,
        uint32 nCheckpoints,
        uint96 oldVotes,
        uint96 newVotes
    ) internal {
        uint32 blockNumber = safe32(
            block.number,
            "ERC721Checkpointable::_writeCheckpoint: block number exceeds 32 bits"
        );

        if (
            nCheckpoints > 0 &&
            checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber
        ) {
            checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
        } else {
            checkpoints[delegatee][nCheckpoints] = Checkpoint(
                blockNumber,
                newVotes
            );
            numCheckpoints[delegatee] = nCheckpoints + 1;
        }

        emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

    function safe32(uint256 n, string memory errorMessage)
        internal
        pure
        returns (uint32)
    {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }

    function safe96(uint256 n, string memory errorMessage)
        internal
        pure
        returns (uint96)
    {
        require(n < 2**96, errorMessage);
        return uint96(n);
    }

    function add96(
        uint96 a,
        uint96 b,
        string memory errorMessage
    ) internal pure returns (uint96) {
        uint96 c = a + b;
        require(c >= a, errorMessage);
        return c;
    }

    function sub96(
        uint96 a,
        uint96 b,
        string memory errorMessage
    ) internal pure returns (uint96) {
        require(b <= a, errorMessage);
        return a - b;
    }

    function getChainId() internal view returns (uint256) {
        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        return chainId;
    }
}

File 8 of 18 : BBOTSRenderer.interface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

import {BBOTSRendererEvents} from "./BBOTSRenderer.events.sol";
import {IMetadataRenderer} from "./MetadataRenderer.interface.sol";

interface IBBOTSRenderer is BBOTSRendererEvents, IMetadataRenderer {
    error TooMuchEntropy();

    /*///////////////////////////////////////////////////////////////
                        	   RANDOMNESS
    //////////////////////////////////////////////////////////////*/

    function requestEntropy(bytes32 _keyHash, uint32 _callbackGasLimit)
        external;
}

File 9 of 18 : BBOTS.interface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

import {IERC2981} from "@openzeppelin/contracts/interfaces/IERC2981.sol";
import {BBOTSEvents, MintPhase, Ticket} from "./BBOTS.events.sol";

interface IBBOTS is IERC2981, BBOTSEvents {
    /*///////////////////////////////////////////////////////////////
                            ERRORS
    //////////////////////////////////////////////////////////////*/

    error InvalidMintPhase();
    error InvalidPayment();
    error InvalidTicket();
    error TotalSupplyExceeded();
    error AvailableSupplyExceeded();
    error MaxMintsExceeded();
    error InvalidAvailableSupply();

    /*///////////////////////////////////////////////////////////////
                        	MINTING
    //////////////////////////////////////////////////////////////*/

    function setMintPhase(MintPhase _phase) external;

    function mintTo(address _to, uint256 _amt) external;

    function mint(uint256 _amt, Ticket calldata _ticket) external payable;

    function mint(uint256 _amt) external payable;

    /*///////////////////////////////////////////////////////////////
                        	UTILS
    //////////////////////////////////////////////////////////////*/

    function updateMetadataRenderer(address _renderer) external;

    function lockMetadata() external;

    function sweep() external;
}

File 10 of 18 : ExternalRenderer.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

import {IMetadataRenderer} from "../interface/MetadataRenderer.interface.sol";

contract ExternalRenderer {
    error MetadataLocked();

    IMetadataRenderer public renderer;
    bool public metadataLocked;

    constructor(IMetadataRenderer _renderer) {
        renderer = _renderer;
    }

    modifier requireMetadataUnlocked() {
        if (metadataLocked) revert MetadataLocked();
        _;
    }

    function _updateMetadataRenderer(address _renderer)
        internal
        virtual
        requireMetadataUnlocked
    {
        renderer = IMetadataRenderer(_renderer);
    }

    function _lockMetadata() internal virtual requireMetadataUnlocked {
        metadataLocked = true;
    }
}

File 11 of 18 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 12 of 18 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 13 of 18 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(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);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

File 14 of 18 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 15 of 18 : ICantBeEvil.sol
// SPDX-License-Identifier: MIT
// a16z Contracts v0.0.1 (ICantBeEvil.sol)
pragma solidity ^0.8.13;

interface ICantBeEvil {
    function getLicenseURI() external view returns (string memory);
    function getLicenseName() external view returns (string memory);
}

File 16 of 18 : BBOTSRenderer.events.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

interface BBOTSRendererEvents {
    event EntropyRequested();
    event EntropyReceived(uint256 entropy);
}

File 17 of 18 : MetadataRenderer.interface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

interface IMetadataRenderer {
    /*///////////////////////////////////////////////////////////////
                        	   RENDERING
    //////////////////////////////////////////////////////////////*/

    function tokenURI(uint256 id) external view returns (string memory);
}

File 18 of 18 : BBOTS.events.sol
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.13;

enum MintPhase {
    Locked,
    Allow,
    Public
}

struct Ticket {
    uint8 v;
    bytes32 r;
    bytes32 s;
}

interface BBOTSEvents {
    /*///////////////////////////////////////////////////////////////
                            EVENTS
    //////////////////////////////////////////////////////////////*/

    event MintPhaseSet(MintPhase phase);
    event AvailableSupplySet(uint256 amt);
    event MaxPerAddressSet(uint256 amt);
}

Settings
{
  "remappings": [
    "@a16z/=lib/a16z-contracts/",
    "@chainlink/=lib/chainlink/",
    "@openzeppelin/=lib/openzeppelin-contracts/",
    "@rari-capital/solmate/=lib/solmate/",
    "a16z-contracts/=lib/a16z-contracts/",
    "chainlink/=lib/chainlink/contracts/src/v0.8/dev/vendor/@arbitrum/nitro-contracts/src/",
    "ds-test/=lib/solmate/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "solmate/=lib/solmate/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 1337
  },
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IBBOTSRenderer","name":"_renderer","type":"address"},{"internalType":"address","name":"_gatekeeper","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_royaltyBps","type":"uint256"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_maxPerAddress","type":"uint256"},{"internalType":"uint256","name":"_availableSupply","type":"uint256"},{"internalType":"uint256","name":"_mintCost","type":"uint256"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AvailableSupplyExceeded","type":"error"},{"inputs":[],"name":"InvalidAvailableSupply","type":"error"},{"inputs":[],"name":"InvalidMintPhase","type":"error"},{"inputs":[],"name":"InvalidPayment","type":"error"},{"inputs":[],"name":"InvalidTicket","type":"error"},{"inputs":[],"name":"MaxMintsExceeded","type":"error"},{"inputs":[],"name":"MetadataLocked","type":"error"},{"inputs":[],"name":"TotalSupplyExceeded","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":"amt","type":"uint256"}],"name":"AvailableSupplySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"MaxPerAddressSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum MintPhase","name":"phase","type":"uint8"}],"name":"MintPhaseSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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":"AVAILABLE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_ADDRESS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TICKET_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint96","name":"votes","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gatekeeper","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLicenseName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLicenseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"licenseVersion","outputs":[{"internalType":"enum LicenseVersion","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"metadataLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amt","type":"uint256"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct Ticket","name":"_ticket","type":"tuple"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amt","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPhase","outputs":[{"internalType":"enum MintPhase","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amt","type":"uint256"}],"name":"mintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"renderer","outputs":[{"internalType":"contract IMetadataRenderer","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"uint256","name":"_amt","type":"uint256"}],"name":"setAvailableSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amt","type":"uint256"}],"name":"setMaxPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum MintPhase","name":"_phase","type":"uint8"}],"name":"setMintPhase","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":"sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"metadataUri","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":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_renderer","type":"address"}],"name":"updateMetadataRenderer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"updateRoyaltyRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"votesToDelegate","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"}]

60c06040526010805460ff191690553480156200001b57600080fd5b5060405162003bc238038062003bc28339810160408190526200003e916200029f565b60008a838381818562000052838262000401565b50600162000061828262000401565b5050505050620000806200007a6200015160201b60201c565b62000155565b600b80546001600160a01b039092166001600160a01b03198316811782558392600161ff0160a01b03191617600160a81b836005811115620000c657620000c6620001a7565b02179055505060108054610100600160a81b0319166101006001600160a01b038c81169190910291909117909155601180546001600160a01b031916918a16919091179055601287905585841115620001325760405163709e2ded60e11b815260040160405180910390fd5b5050608093909352600c91909155600d5560a05250620004cd92505050565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052602160045260246000fd5b80516001600160a01b0381168114620001d557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200020257600080fd5b81516001600160401b03808211156200021f576200021f620001da565b604051601f8301601f19908116603f011681019082821181831017156200024a576200024a620001da565b816040528381526020925086838588010111156200026757600080fd5b600091505b838210156200028b57858201830151818301840152908201906200026c565b600093810190920192909252949350505050565b6000806000806000806000806000806101408b8d031215620002c057600080fd5b620002cb8b620001bd565b9950620002db60208c01620001bd565b9850620002eb60408c01620001bd565b975060608b0151965060808b0151955060a08b0151945060c08b0151935060e08b015192506101008b015160018060401b03808211156200032b57600080fd5b620003398e838f01620001f0565b93506101208d01519150808211156200035157600080fd5b50620003608d828e01620001f0565b9150509295989b9194979a5092959850565b600181811c908216806200038757607f821691505b602082108103620003a857634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003fc57600081815260208120601f850160051c81016020861015620003d75750805b601f850160051c820191505b81811015620003f857828155600101620003e3565b5050505b505050565b81516001600160401b038111156200041d576200041d620001da565b62000435816200042e845462000372565b84620003ae565b602080601f8311600181146200046d5760008415620004545750858301515b600019600386901b1c1916600185901b178555620003f8565b600085815260208120601f198616915b828110156200049e578886015182559484019460019091019084016200047d565b5085821015620004bd5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a0516136b36200050f600039600081816109bc01528181610c2d015261178a0152600081816105ed01528181611056015261203101526136b36000f3fe60806040526004361061034a5760003560e01c80636fcfff45116101bb578063a341793b116100f7578063c7db289311610095578063e9580e911161006f578063e9580e9114610a47578063e985e9c514610a67578063f1127ed814610aa2578063f2fde38b14610b1757600080fd5b8063c7db2893146109de578063c87b56dd146109f3578063e7a324dc14610a1357600080fd5b8063b4b5ea57116100d1578063b4b5ea571461094a578063b88d4fde1461096a578063c3cda5201461098a578063c662e481146109aa57600080fd5b8063a341793b146108fa578063a59c9c271461090f578063b438e12e1461093457600080fd5b80637ecebe001161016457806395d89b411161013e57806395d89b411461089d578063989bdbb6146108b2578063a0712d68146108c7578063a22cb465146108da57600080fd5b80637ecebe00146108325780638ada6b0f1461085f5780638da5cb5b1461087f57600080fd5b806375434a751161019557806375434a75146107a6578063782d6fe1146107da5780637bddd65b1461081257600080fd5b80636fcfff451461072957806370a0823114610771578063715018a61461079157600080fd5b80632aa4bf721161028a578063449a52f8116102335780635c19a95c1161020d5780635c19a95c146106b257806361b8ce8c146106d25780636352211e146106e857806369d2ceb11461070857600080fd5b8063449a52f81461064457806350a5292f14610664578063587cde1e1461069257600080fd5b806332cb6b0c1161026457806332cb6b0c146105db57806335faa4161461060f57806342842e0e1461062457600080fd5b80632aa4bf7214610574578063313ce5671461059457806331c07bbf146105bb57600080fd5b80630fc499f5116102f757806320606b70116102d157806320606b70146104b457806320fc7eb2146104e857806323b872dd146105155780632a55205a1461053557600080fd5b80630fc499f51461044d5780631723934d1461046d57806317881cbf1461048d57600080fd5b806308f0f8d21161032857806308f0f8d2146103f4578063095ea7b3146104095780630aaef2851461042957600080fd5b806301ffc9a71461034f57806306fdde0314610384578063081812fc146103a6575b600080fd5b34801561035b57600080fd5b5061036f61036a366004612dfb565b610b37565b60405190151581526020015b60405180910390f35b34801561039057600080fd5b50610399610b99565b60405161037b9190612e3c565b3480156103b257600080fd5b506103dc6103c1366004612e6f565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161037b565b610407610402366004612e88565b610c27565b005b34801561041557600080fd5b50610407610424366004612ed7565b610f2c565b34801561043557600080fd5b5061043f600c5481565b60405190815260200161037b565b34801561045957600080fd5b50610407610468366004612f01565b611022565b34801561047957600080fd5b50610407610488366004612e6f565b61104c565b34801561049957600080fd5b506010546104a79060ff1681565b60405161037b9190612f32565b3480156104c057600080fd5b5061043f7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b3480156104f457600080fd5b5061043f610503366004612f01565b600f6020526000908152604090205481565b34801561052157600080fd5b50610407610530366004612f4c565b6110f4565b34801561054157600080fd5b50610555610550366004612f88565b61110f565b604080516001600160a01b03909316835260208301919091520161037b565b34801561058057600080fd5b5061040761058f366004612f01565b611149565b3480156105a057600080fd5b506105a9600081565b60405160ff909116815260200161037b565b3480156105c757600080fd5b506104076105d6366004612faa565b61115d565b3480156105e757600080fd5b5061043f7f000000000000000000000000000000000000000000000000000000000000000081565b34801561061b57600080fd5b506104076111b8565b34801561063057600080fd5b5061040761063f366004612f4c565b611232565b34801561065057600080fd5b5061040761065f366004612ed7565b611332565b34801561067057600080fd5b50600b5461068590600160a81b900460ff1681565b60405161037b9190612fcb565b34801561069e57600080fd5b506103dc6106ad366004612f01565b611348565b3480156106be57600080fd5b506104076106cd366004612f01565b61137a565b3480156106de57600080fd5b5061043f600e5481565b3480156106f457600080fd5b506103dc610703366004612e6f565b611395565b34801561071457600080fd5b50600b5461036f90600160a01b900460ff1681565b34801561073557600080fd5b5061075c610744366004612f01565b60086020526000908152604090205463ffffffff1681565b60405163ffffffff909116815260200161037b565b34801561077d57600080fd5b5061043f61078c366004612f01565b6113ff565b34801561079d57600080fd5b50610407611473565b3480156107b257600080fd5b5061043f7fa75d75024d310ce63a6e2127bf4df06e844a7ba4f454a320cf12d5dbc743a37681565b3480156107e657600080fd5b506107fa6107f5366004612ed7565b611487565b6040516001600160601b03909116815260200161037b565b34801561081e57600080fd5b5061040761082d366004612e6f565b61172a565b34801561083e57600080fd5b5061043f61084d366004612f01565b60096020526000908152604090205481565b34801561086b57600080fd5b50600b546103dc906001600160a01b031681565b34801561088b57600080fd5b50600a546001600160a01b03166103dc565b3480156108a957600080fd5b50610399611767565b3480156108be57600080fd5b50610407611774565b6104076108d5366004612e6f565b611784565b3480156108e657600080fd5b506104076108f5366004612fdf565b6118a0565b34801561090657600080fd5b5061039961190c565b34801561091b57600080fd5b506010546103dc9061010090046001600160a01b031681565b34801561094057600080fd5b5061043f600d5481565b34801561095657600080fd5b506107fa610965366004612f01565b61192a565b34801561097657600080fd5b5061040761098536600461301b565b6119a8565b34801561099657600080fd5b506104076109a53660046130c7565b611a96565b3480156109b657600080fd5b5061043f7f000000000000000000000000000000000000000000000000000000000000000081565b3480156109ea57600080fd5b50610399611db5565b3480156109ff57600080fd5b50610399610a0e366004612e6f565b611e1c565b348015610a1f57600080fd5b5061043f7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b348015610a5357600080fd5b506107fa610a62366004612f01565b611ea7565b348015610a7357600080fd5b5061036f610a8236600461311f565b600560209081526000928352604080842090915290825290205460ff1681565b348015610aae57600080fd5b50610af3610abd366004613152565b600760209081526000928352604080842090915290825290205463ffffffff81169064010000000090046001600160601b031682565b6040805163ffffffff90931683526001600160601b0390911660208301520161037b565b348015610b2357600080fd5b50610407610b32366004612f01565b611ed3565b60006001600160e01b031982167f2a55205a000000000000000000000000000000000000000000000000000000001480610b755750610b7582611f60565b80610b845750610b8482611fe0565b80610b935750610b9382611fe0565b92915050565b60008054610ba690613187565b80601f0160208091040260200160405190810160405280929190818152602001828054610bd290613187565b8015610c1f5780601f10610bf457610100808354040283529160200191610c1f565b820191906000526020600020905b815481529060010190602001808311610c0257829003601f168201915b505050505081565b81610c527f0000000000000000000000000000000000000000000000000000000000000000826131d7565b3414610c715760405163078d696560e31b815260040160405180910390fd5b60018060105460ff166002811115610c8b57610c8b612f1c565b14610ca957604051637f0efd8560e01b815260040160405180910390fd5b8260007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666000604051610cdc91906131ee565b6040518091039020610ceb4690565b604080516020810194909452830191909152606082015230608082015260a00160405160208183030381529060405280519060200120905060007fa75d75024d310ce63a6e2127bf4df06e844a7ba4f454a320cf12d5dbc743a37633604051602001610d6a9291909182526001600160a01b0316602082015260400190565b60405160208183030381529060405280519060200120905060008282604051602001610dad92919061190160f01b81526002810192909252602282015260420190565b6040516020818303038152906040528051906020012090506000600182866000016020810190610ddd919061328d565b604080516000815260208181018084529490945260ff9092168282015291880135606082015290870135608082015260a0016020604051602081039080840390855afa158015610e31573d6000803e3d6000fd5b5050604051601f1901516010549092506001600160a01b0380841661010090920416149050610e8c576040517f6686db6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600f6020526040812080548b92839291610ead9084906132a8565b9091555050600c54336000908152600f60205260409020541115610ee45760405163c9352da560e01b815260040160405180910390fd5b89600d5481600e54610ef691906132a8565b1115610f155760405163d49b601960e01b815260040160405180910390fd5b610f1f338c61202e565b5050505050505050505050565b6000818152600260205260409020546001600160a01b031633811480610f7557506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b610fc65760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064015b60405180910390fd5b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b61102a6120db565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b6110546120db565b7f00000000000000000000000000000000000000000000000000000000000000008111156110955760405163709e2ded60e11b815260040160405180910390fd5b600e548110156110b85760405163709e2ded60e11b815260040160405180910390fd5b600d8190556040518181527fccd9dfd716eb536313759e5c6b9c4487cdd3ad5ed501b98dee62ac09a3887c3d906020015b60405180910390a150565b6110ff838383612135565b61110a838383612151565b505050565b60115460125460009182916001600160a01b03909116906127109061113490866131d7565b61113e91906132d1565b915091509250929050565b6111516120db565b61115a81612346565b50565b6111656120db565b6010805482919060ff1916600183600281111561118457611184612f1c565b02179055507fcd6a947eeb855527e1d795d7647fd0d9053113147eb4fad8c9127ab5161d75ea816040516110e99190612f32565b6011546040805160008082526020820192839052926001600160a01b03169147916111e2916132fb565b60006040518083038185875af1925050503d806000811461121f576040519150601f19603f3d011682016040523d82523d6000602084013e611224565b606091505b505090508061115a57600080fd5b61123d8383836110f4565b6001600160a01b0382163b15806112e65750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af11580156112b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112da9190613317565b6001600160e01b031916145b61110a5760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610fbd565b61133a6120db565b611344828261202e565b5050565b6001600160a01b0380821660009081526006602052604081205490911680156113715780611373565b825b9392505050565b6001600160a01b03811661138b5750335b61115a3382612393565b6000818152600260205260409020546001600160a01b0316806113fa5760405162461bcd60e51b815260206004820152600a60248201527f4e4f545f4d494e544544000000000000000000000000000000000000000000006044820152606401610fbd565b919050565b60006001600160a01b0382166114575760405162461bcd60e51b815260206004820152600c60248201527f5a45524f5f4144445245535300000000000000000000000000000000000000006044820152606401610fbd565b506001600160a01b031660009081526003602052604090205490565b61147b6120db565b6114856000612413565b565b60004382106114fe5760405162461bcd60e51b815260206004820152603760248201527f455243373231436865636b706f696e7461626c653a3a6765745072696f72566f60448201527f7465733a206e6f74207965742064657465726d696e65640000000000000000006064820152608401610fbd565b6001600160a01b03831660009081526008602052604081205463ffffffff169081900361152f576000915050610b93565b6001600160a01b03841660009081526007602052604081208491611554600185613334565b63ffffffff908116825260208201929092526040016000205416116115c8576001600160a01b038416600090815260076020526040812090611597600184613334565b63ffffffff16815260208101919091526040016000205464010000000090046001600160601b03169150610b939050565b6001600160a01b038416600090815260076020908152604080832083805290915290205463ffffffff16831015611603576000915050610b93565b600080611611600184613334565b90505b8163ffffffff168163ffffffff1611156116e457600060026116368484613334565b6116409190613358565b61164a9083613334565b6001600160a01b038816600090815260076020908152604080832063ffffffff8581168552908352928190208151808301909252549283168082526401000000009093046001600160601b0316918101919091529192508790036116b857602001519450610b939350505050565b805163ffffffff168711156116cf578193506116dd565b6116da600183613334565b92505b5050611614565b506001600160a01b038516600090815260076020908152604080832063ffffffff909416835292905220546001600160601b036401000000009091041691505092915050565b6117326120db565b600c8190556040518181527f0d279a5753fad2b01bf40c6d21bc82b9050db4f4fc517a1624e9193c430d82c6906020016110e9565b60018054610ba690613187565b61177c6120db565b611485612465565b806117af7f0000000000000000000000000000000000000000000000000000000000000000826131d7565b34146117ce5760405163078d696560e31b815260040160405180910390fd5b60028060105460ff1660028111156117e8576117e8612f1c565b1461180657604051637f0efd8560e01b815260040160405180910390fd5b336000908152600f60205260408120805485928392916118279084906132a8565b9091555050600c54336000908152600f6020526040902054111561185e5760405163c9352da560e01b815260040160405180910390fd5b83600d5481600e5461187091906132a8565b111561188f5760405163d49b601960e01b815260040160405180910390fd5b611899338661202e565b5050505050565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600b5460609061192590600160a81b900460ff166124c0565b905090565b6001600160a01b03811660009081526008602052604081205463ffffffff1680611955576000611373565b6001600160a01b038316600090815260076020526040812090611979600184613334565b63ffffffff16815260208101919091526040016000205464010000000090046001600160601b03169392505050565b6119b38585856110f4565b6001600160a01b0384163b1580611a4a5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a02906119fb9033908a9089908990899060040161337b565b6020604051808303816000875af1158015611a1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3e9190613317565b6001600160e01b031916145b6118995760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610fbd565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666000604051611ac891906131ee565b6040518091039020611ad74690565b60408051602080820195909552808201939093526060830191909152306080808401919091528151808403909101815260a0830182528051908401207fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60c08401526001600160a01b038b1660e084015261010083018a90526101208084018a90528251808503909101815261014084019092528151919093012061190160f01b610160830152610162820183905261018282018190529192506000906101a20160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015611c03573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611c8c5760405162461bcd60e51b815260206004820152603660248201527f455243373231436865636b706f696e7461626c653a3a64656c6567617465427960448201527f5369673a20696e76616c6964207369676e6174757265000000000000000000006064820152608401610fbd565b6001600160a01b0381166000908152600960205260408120805491611cb0836133cf565b919050558914611d285760405162461bcd60e51b815260206004820152603260248201527f455243373231436865636b706f696e7461626c653a3a64656c6567617465427960448201527f5369673a20696e76616c6964206e6f6e636500000000000000000000000000006064820152608401610fbd565b87421115611d9e5760405162461bcd60e51b815260206004820152603660248201527f455243373231436865636b706f696e7461626c653a3a64656c6567617465427960448201527f5369673a207369676e61747572652065787069726564000000000000000000006064820152608401610fbd565b611da8818b612393565b505050505b505050505050565b606060405180606001604052806031815260200161355f60319139600b54611df790600160a81b900460ff166005811115611df257611df2612f1c565b6126b7565b604051602001611e089291906133e8565b604051602081830303815290604052905090565b600b546040517fc87b56dd000000000000000000000000000000000000000000000000000000008152600481018390526060916001600160a01b03169063c87b56dd90602401600060405180830381865afa158015611e7f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b939190810190613417565b6000610b93611eb5836113ff565b6040518060600160405280603d815260200161360a603d91396127f4565b611edb6120db565b6001600160a01b038116611f575760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610fbd565b61115a81612413565b60006301ffc9a760e01b6001600160e01b031983161480611faa57507f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610b935750506001600160e01b0319167f5b5e139f000000000000000000000000000000000000000000000000000000001490565b60006001600160e01b031982167f649a51a8000000000000000000000000000000000000000000000000000000001480610b9357506301ffc9a760e01b6001600160e01b0319831614610b93565b807f000000000000000000000000000000000000000000000000000000000000000081600e5461205e91906132a8565b1115612096576040517ffd59427a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b828110156120d5576120ad84600e5461282c565b600e80549060006120bd836133cf565b919050555080806120cd906133cf565b915050612099565b50505050565b600a546001600160a01b031633146114855760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610fbd565b61110a61214184611348565b61214a84611348565b6001612842565b6000818152600260205260409020546001600160a01b038481169116146121ba5760405162461bcd60e51b815260206004820152600a60248201527f57524f4e475f46524f4d000000000000000000000000000000000000000000006044820152606401610fbd565b6001600160a01b0382166122105760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610fbd565b336001600160a01b038416148061224a57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b8061226b57506000818152600460205260409020546001600160a01b031633145b6122b75760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610fbd565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600b54600160a01b900460ff1615612371576040516313ef243160e11b815260040160405180910390fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600061239e83611348565b6001600160a01b0384811660008181526006602052604080822080546001600160a01b031916888616908117909155905194955093928516927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4600061240684611ea7565b90506120d5828483612842565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600b54600160a01b900460ff1615612490576040516313ef243160e11b815260040160405180910390fd5b600b80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b179055565b606060068260058111156124d6576124d6612f1c565b60ff1611156124e457600080fd5b8160058111156124f6576124f6612f1c565b60000361253657505060408051808201909152600781527f4342455f43433000000000000000000000000000000000000000000000000000602082015290565b81600581111561254857612548612f1c565b60010361258857505060408051808201909152600781527f4342455f45435200000000000000000000000000000000000000000000000000602082015290565b81600581111561259a5761259a612f1c565b6002036125da57505060408051808201909152600881527f4342455f4e454352000000000000000000000000000000000000000000000000602082015290565b8160058111156125ec576125ec612f1c565b60030361262c57505060408051808201909152600b81527f4342455f4e4543525f4853000000000000000000000000000000000000000000602082015290565b81600581111561263e5761263e612f1c565b60040361267e57505060408051808201909152600681527f4342455f50520000000000000000000000000000000000000000000000000000602082015290565b505060408051808201909152600981527f4342455f50525f48530000000000000000000000000000000000000000000000602082015290565b6060816000036126fa57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612724578061270e816133cf565b915061271d9050600a836132d1565b91506126fe565b60008167ffffffffffffffff81111561273f5761273f6132e5565b6040519080825280601f01601f191660200182016040528015612769576020820181803683370190505b5090505b84156127ec5761277e6001836134c4565b915061278b600a866134d7565b6127969060306132a8565b60f81b8183815181106127ab576127ab6134eb565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506127e5600a866132d1565b945061276d565b949350505050565b6000816c0100000000000000000000000084106128245760405162461bcd60e51b8152600401610fbd9190612e3c565b509192915050565b61283860008383612135565b61134482826129f0565b816001600160a01b0316836001600160a01b03161415801561286d57506000816001600160601b0316115b1561110a576001600160a01b03831615612933576001600160a01b03831660009081526008602052604081205463ffffffff1690816128ad5760006128fa565b6001600160a01b0385166000908152600760205260408120906128d1600185613334565b63ffffffff16815260208101919091526040016000205464010000000090046001600160601b03165b90506000612921828560405180606001604052806037815260200161364760379139612b16565b905061292f86848484612b58565b5050505b6001600160a01b0382161561110a576001600160a01b03821660009081526008602052604081205463ffffffff16908161296e5760006129bb565b6001600160a01b038416600090815260076020526040812090612992600185613334565b63ffffffff16815260208101919091526040016000205464010000000090046001600160601b03165b905060006129e2828560405180606001604052806036815260200161359060369139612d70565b9050611dad85848484612b58565b6001600160a01b038216612a465760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610fbd565b6000818152600260205260409020546001600160a01b031615612aab5760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f4d494e5445440000000000000000000000000000000000006044820152606401610fbd565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000836001600160601b0316836001600160601b031611158290612b4d5760405162461bcd60e51b8152600401610fbd9190612e3c565b506127ec8385613501565b6000612b7c436040518060800160405280604481526020016135c660449139612dbd565b905060008463ffffffff16118015612bd657506001600160a01b038516600090815260076020526040812063ffffffff831691612bba600188613334565b63ffffffff908116825260208201929092526040016000205416145b15612c5a576001600160a01b03851660009081526007602052604081208391612c00600188613334565b63ffffffff168152602081019190915260400160002080546001600160601b0392909216640100000000027fffffffffffffffffffffffffffffffff000000000000000000000000ffffffff909216919091179055612d1b565b60408051808201825263ffffffff80841682526001600160601b0380861660208085019182526001600160a01b038b166000908152600782528681208b8616825290915294909420925183549451909116640100000000027fffffffffffffffffffffffffffffffff00000000000000000000000000000000909416911617919091179055612cea846001613521565b6001600160a01b0386166000908152600860205260409020805463ffffffff191663ffffffff929092169190911790555b604080516001600160601b038086168252841660208201526001600160a01b038716917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050505050565b600080612d7d848661353e565b9050846001600160601b0316816001600160601b031610158390612db45760405162461bcd60e51b8152600401610fbd9190612e3c565b50949350505050565b60008164010000000084106128245760405162461bcd60e51b8152600401610fbd9190612e3c565b6001600160e01b03198116811461115a57600080fd5b600060208284031215612e0d57600080fd5b813561137381612de5565b60005b83811015612e33578181015183820152602001612e1b565b50506000910152565b6020815260008251806020840152612e5b816040850160208701612e18565b601f01601f19169190910160400192915050565b600060208284031215612e8157600080fd5b5035919050565b6000808284036080811215612e9c57600080fd5b833592506060601f1982011215612eb257600080fd5b506020830190509250929050565b80356001600160a01b03811681146113fa57600080fd5b60008060408385031215612eea57600080fd5b612ef383612ec0565b946020939093013593505050565b600060208284031215612f1357600080fd5b61137382612ec0565b634e487b7160e01b600052602160045260246000fd5b6020810160038310612f4657612f46612f1c565b91905290565b600080600060608486031215612f6157600080fd5b612f6a84612ec0565b9250612f7860208501612ec0565b9150604084013590509250925092565b60008060408385031215612f9b57600080fd5b50508035926020909101359150565b600060208284031215612fbc57600080fd5b81356003811061137357600080fd5b6020810160068310612f4657612f46612f1c565b60008060408385031215612ff257600080fd5b612ffb83612ec0565b91506020830135801515811461301057600080fd5b809150509250929050565b60008060008060006080868803121561303357600080fd5b61303c86612ec0565b945061304a60208701612ec0565b935060408601359250606086013567ffffffffffffffff8082111561306e57600080fd5b818801915088601f83011261308257600080fd5b81358181111561309157600080fd5b8960208285010111156130a357600080fd5b9699959850939650602001949392505050565b803560ff811681146113fa57600080fd5b60008060008060008060c087890312156130e057600080fd5b6130e987612ec0565b95506020870135945060408701359350613105606088016130b6565b92506080870135915060a087013590509295509295509295565b6000806040838503121561313257600080fd5b61313b83612ec0565b915061314960208401612ec0565b90509250929050565b6000806040838503121561316557600080fd5b61316e83612ec0565b9150602083013563ffffffff8116811461301057600080fd5b600181811c9082168061319b57607f821691505b6020821081036131bb57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610b9357610b936131c1565b600080835481600182811c91508083168061320a57607f831692505b6020808410820361322957634e487b7160e01b86526022600452602486fd5b81801561323d57600181146132525761327f565b60ff198616895284151585028901965061327f565b60008a81526020902060005b868110156132775781548b82015290850190830161325e565b505084890196505b509498975050505050505050565b60006020828403121561329f57600080fd5b611373826130b6565b80820180821115610b9357610b936131c1565b634e487b7160e01b600052601260045260246000fd5b6000826132e0576132e06132bb565b500490565b634e487b7160e01b600052604160045260246000fd5b6000825161330d818460208701612e18565b9190910192915050565b60006020828403121561332957600080fd5b815161137381612de5565b63ffffffff828116828216039080821115613351576133516131c1565b5092915050565b600063ffffffff8084168061336f5761336f6132bb565b92169190910492915050565b60006001600160a01b03808816835280871660208401525084604083015260806060830152826080830152828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b6000600182016133e1576133e16131c1565b5060010190565b600083516133fa818460208801612e18565b83519083019061340e818360208801612e18565b01949350505050565b60006020828403121561342957600080fd5b815167ffffffffffffffff8082111561344157600080fd5b818401915084601f83011261345557600080fd5b815181811115613467576134676132e5565b604051601f8201601f19908116603f0116810190838211818310171561348f5761348f6132e5565b816040528281528760208487010111156134a857600080fd5b6134b9836020830160208801612e18565b979650505050505050565b81810381811115610b9357610b936131c1565b6000826134e6576134e66132bb565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160601b03828116828216039080821115613351576133516131c1565b63ffffffff818116838216019080821115613351576133516131c1565b6001600160601b03818116838216019080821115613351576133516131c156fe61723a2f2f5f44396b4e3157724e576243713535425341475262544234625333763851415054596d42546853625833412f455243373231436865636b706f696e7461626c653a3a5f6d6f766544656c6567617465733a20616d6f756e74206f766572666c6f7773455243373231436865636b706f696e7461626c653a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473455243373231436865636b706f696e7461626c653a3a766f746573546f44656c65676174653a20616d6f756e7420657863656564732039362062697473455243373231436865636b706f696e7461626c653a3a5f6d6f766544656c6567617465733a20616d6f756e7420756e646572666c6f7773a2646970667358221220d43ae931cc5f320165b5a2ada5295caf59ca2a139aa5a70da0b6d12c4c7ba70464736f6c6343000811003300000000000000000000000003c4532747c9f3ce738ce8a9a4354c34d3d6f4ce000000000000000000000000f3bf905d380783fa4acf3ce0ecd62acc21d3ec1800000000000000000000000001ad5d7a192ef0c0f85b6697b9e20fc83c5418380000000000000000000000000000000000000000000000000000000000000258000000000000000000000000000000000000000000000000000000000000277500000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000001f40000000000000000000000000000000000000000000000000011c37937e080000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000006422d424f54530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000442424f5400000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061034a5760003560e01c80636fcfff45116101bb578063a341793b116100f7578063c7db289311610095578063e9580e911161006f578063e9580e9114610a47578063e985e9c514610a67578063f1127ed814610aa2578063f2fde38b14610b1757600080fd5b8063c7db2893146109de578063c87b56dd146109f3578063e7a324dc14610a1357600080fd5b8063b4b5ea57116100d1578063b4b5ea571461094a578063b88d4fde1461096a578063c3cda5201461098a578063c662e481146109aa57600080fd5b8063a341793b146108fa578063a59c9c271461090f578063b438e12e1461093457600080fd5b80637ecebe001161016457806395d89b411161013e57806395d89b411461089d578063989bdbb6146108b2578063a0712d68146108c7578063a22cb465146108da57600080fd5b80637ecebe00146108325780638ada6b0f1461085f5780638da5cb5b1461087f57600080fd5b806375434a751161019557806375434a75146107a6578063782d6fe1146107da5780637bddd65b1461081257600080fd5b80636fcfff451461072957806370a0823114610771578063715018a61461079157600080fd5b80632aa4bf721161028a578063449a52f8116102335780635c19a95c1161020d5780635c19a95c146106b257806361b8ce8c146106d25780636352211e146106e857806369d2ceb11461070857600080fd5b8063449a52f81461064457806350a5292f14610664578063587cde1e1461069257600080fd5b806332cb6b0c1161026457806332cb6b0c146105db57806335faa4161461060f57806342842e0e1461062457600080fd5b80632aa4bf7214610574578063313ce5671461059457806331c07bbf146105bb57600080fd5b80630fc499f5116102f757806320606b70116102d157806320606b70146104b457806320fc7eb2146104e857806323b872dd146105155780632a55205a1461053557600080fd5b80630fc499f51461044d5780631723934d1461046d57806317881cbf1461048d57600080fd5b806308f0f8d21161032857806308f0f8d2146103f4578063095ea7b3146104095780630aaef2851461042957600080fd5b806301ffc9a71461034f57806306fdde0314610384578063081812fc146103a6575b600080fd5b34801561035b57600080fd5b5061036f61036a366004612dfb565b610b37565b60405190151581526020015b60405180910390f35b34801561039057600080fd5b50610399610b99565b60405161037b9190612e3c565b3480156103b257600080fd5b506103dc6103c1366004612e6f565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161037b565b610407610402366004612e88565b610c27565b005b34801561041557600080fd5b50610407610424366004612ed7565b610f2c565b34801561043557600080fd5b5061043f600c5481565b60405190815260200161037b565b34801561045957600080fd5b50610407610468366004612f01565b611022565b34801561047957600080fd5b50610407610488366004612e6f565b61104c565b34801561049957600080fd5b506010546104a79060ff1681565b60405161037b9190612f32565b3480156104c057600080fd5b5061043f7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b3480156104f457600080fd5b5061043f610503366004612f01565b600f6020526000908152604090205481565b34801561052157600080fd5b50610407610530366004612f4c565b6110f4565b34801561054157600080fd5b50610555610550366004612f88565b61110f565b604080516001600160a01b03909316835260208301919091520161037b565b34801561058057600080fd5b5061040761058f366004612f01565b611149565b3480156105a057600080fd5b506105a9600081565b60405160ff909116815260200161037b565b3480156105c757600080fd5b506104076105d6366004612faa565b61115d565b3480156105e757600080fd5b5061043f7f000000000000000000000000000000000000000000000000000000000000277581565b34801561061b57600080fd5b506104076111b8565b34801561063057600080fd5b5061040761063f366004612f4c565b611232565b34801561065057600080fd5b5061040761065f366004612ed7565b611332565b34801561067057600080fd5b50600b5461068590600160a81b900460ff1681565b60405161037b9190612fcb565b34801561069e57600080fd5b506103dc6106ad366004612f01565b611348565b3480156106be57600080fd5b506104076106cd366004612f01565b61137a565b3480156106de57600080fd5b5061043f600e5481565b3480156106f457600080fd5b506103dc610703366004612e6f565b611395565b34801561071457600080fd5b50600b5461036f90600160a01b900460ff1681565b34801561073557600080fd5b5061075c610744366004612f01565b60086020526000908152604090205463ffffffff1681565b60405163ffffffff909116815260200161037b565b34801561077d57600080fd5b5061043f61078c366004612f01565b6113ff565b34801561079d57600080fd5b50610407611473565b3480156107b257600080fd5b5061043f7fa75d75024d310ce63a6e2127bf4df06e844a7ba4f454a320cf12d5dbc743a37681565b3480156107e657600080fd5b506107fa6107f5366004612ed7565b611487565b6040516001600160601b03909116815260200161037b565b34801561081e57600080fd5b5061040761082d366004612e6f565b61172a565b34801561083e57600080fd5b5061043f61084d366004612f01565b60096020526000908152604090205481565b34801561086b57600080fd5b50600b546103dc906001600160a01b031681565b34801561088b57600080fd5b50600a546001600160a01b03166103dc565b3480156108a957600080fd5b50610399611767565b3480156108be57600080fd5b50610407611774565b6104076108d5366004612e6f565b611784565b3480156108e657600080fd5b506104076108f5366004612fdf565b6118a0565b34801561090657600080fd5b5061039961190c565b34801561091b57600080fd5b506010546103dc9061010090046001600160a01b031681565b34801561094057600080fd5b5061043f600d5481565b34801561095657600080fd5b506107fa610965366004612f01565b61192a565b34801561097657600080fd5b5061040761098536600461301b565b6119a8565b34801561099657600080fd5b506104076109a53660046130c7565b611a96565b3480156109b657600080fd5b5061043f7f000000000000000000000000000000000000000000000000011c37937e08000081565b3480156109ea57600080fd5b50610399611db5565b3480156109ff57600080fd5b50610399610a0e366004612e6f565b611e1c565b348015610a1f57600080fd5b5061043f7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b348015610a5357600080fd5b506107fa610a62366004612f01565b611ea7565b348015610a7357600080fd5b5061036f610a8236600461311f565b600560209081526000928352604080842090915290825290205460ff1681565b348015610aae57600080fd5b50610af3610abd366004613152565b600760209081526000928352604080842090915290825290205463ffffffff81169064010000000090046001600160601b031682565b6040805163ffffffff90931683526001600160601b0390911660208301520161037b565b348015610b2357600080fd5b50610407610b32366004612f01565b611ed3565b60006001600160e01b031982167f2a55205a000000000000000000000000000000000000000000000000000000001480610b755750610b7582611f60565b80610b845750610b8482611fe0565b80610b935750610b9382611fe0565b92915050565b60008054610ba690613187565b80601f0160208091040260200160405190810160405280929190818152602001828054610bd290613187565b8015610c1f5780601f10610bf457610100808354040283529160200191610c1f565b820191906000526020600020905b815481529060010190602001808311610c0257829003601f168201915b505050505081565b81610c527f000000000000000000000000000000000000000000000000011c37937e080000826131d7565b3414610c715760405163078d696560e31b815260040160405180910390fd5b60018060105460ff166002811115610c8b57610c8b612f1c565b14610ca957604051637f0efd8560e01b815260040160405180910390fd5b8260007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666000604051610cdc91906131ee565b6040518091039020610ceb4690565b604080516020810194909452830191909152606082015230608082015260a00160405160208183030381529060405280519060200120905060007fa75d75024d310ce63a6e2127bf4df06e844a7ba4f454a320cf12d5dbc743a37633604051602001610d6a9291909182526001600160a01b0316602082015260400190565b60405160208183030381529060405280519060200120905060008282604051602001610dad92919061190160f01b81526002810192909252602282015260420190565b6040516020818303038152906040528051906020012090506000600182866000016020810190610ddd919061328d565b604080516000815260208181018084529490945260ff9092168282015291880135606082015290870135608082015260a0016020604051602081039080840390855afa158015610e31573d6000803e3d6000fd5b5050604051601f1901516010549092506001600160a01b0380841661010090920416149050610e8c576040517f6686db6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600f6020526040812080548b92839291610ead9084906132a8565b9091555050600c54336000908152600f60205260409020541115610ee45760405163c9352da560e01b815260040160405180910390fd5b89600d5481600e54610ef691906132a8565b1115610f155760405163d49b601960e01b815260040160405180910390fd5b610f1f338c61202e565b5050505050505050505050565b6000818152600260205260409020546001600160a01b031633811480610f7557506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b610fc65760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064015b60405180910390fd5b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b61102a6120db565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b6110546120db565b7f00000000000000000000000000000000000000000000000000000000000027758111156110955760405163709e2ded60e11b815260040160405180910390fd5b600e548110156110b85760405163709e2ded60e11b815260040160405180910390fd5b600d8190556040518181527fccd9dfd716eb536313759e5c6b9c4487cdd3ad5ed501b98dee62ac09a3887c3d906020015b60405180910390a150565b6110ff838383612135565b61110a838383612151565b505050565b60115460125460009182916001600160a01b03909116906127109061113490866131d7565b61113e91906132d1565b915091509250929050565b6111516120db565b61115a81612346565b50565b6111656120db565b6010805482919060ff1916600183600281111561118457611184612f1c565b02179055507fcd6a947eeb855527e1d795d7647fd0d9053113147eb4fad8c9127ab5161d75ea816040516110e99190612f32565b6011546040805160008082526020820192839052926001600160a01b03169147916111e2916132fb565b60006040518083038185875af1925050503d806000811461121f576040519150601f19603f3d011682016040523d82523d6000602084013e611224565b606091505b505090508061115a57600080fd5b61123d8383836110f4565b6001600160a01b0382163b15806112e65750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af11580156112b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112da9190613317565b6001600160e01b031916145b61110a5760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610fbd565b61133a6120db565b611344828261202e565b5050565b6001600160a01b0380821660009081526006602052604081205490911680156113715780611373565b825b9392505050565b6001600160a01b03811661138b5750335b61115a3382612393565b6000818152600260205260409020546001600160a01b0316806113fa5760405162461bcd60e51b815260206004820152600a60248201527f4e4f545f4d494e544544000000000000000000000000000000000000000000006044820152606401610fbd565b919050565b60006001600160a01b0382166114575760405162461bcd60e51b815260206004820152600c60248201527f5a45524f5f4144445245535300000000000000000000000000000000000000006044820152606401610fbd565b506001600160a01b031660009081526003602052604090205490565b61147b6120db565b6114856000612413565b565b60004382106114fe5760405162461bcd60e51b815260206004820152603760248201527f455243373231436865636b706f696e7461626c653a3a6765745072696f72566f60448201527f7465733a206e6f74207965742064657465726d696e65640000000000000000006064820152608401610fbd565b6001600160a01b03831660009081526008602052604081205463ffffffff169081900361152f576000915050610b93565b6001600160a01b03841660009081526007602052604081208491611554600185613334565b63ffffffff908116825260208201929092526040016000205416116115c8576001600160a01b038416600090815260076020526040812090611597600184613334565b63ffffffff16815260208101919091526040016000205464010000000090046001600160601b03169150610b939050565b6001600160a01b038416600090815260076020908152604080832083805290915290205463ffffffff16831015611603576000915050610b93565b600080611611600184613334565b90505b8163ffffffff168163ffffffff1611156116e457600060026116368484613334565b6116409190613358565b61164a9083613334565b6001600160a01b038816600090815260076020908152604080832063ffffffff8581168552908352928190208151808301909252549283168082526401000000009093046001600160601b0316918101919091529192508790036116b857602001519450610b939350505050565b805163ffffffff168711156116cf578193506116dd565b6116da600183613334565b92505b5050611614565b506001600160a01b038516600090815260076020908152604080832063ffffffff909416835292905220546001600160601b036401000000009091041691505092915050565b6117326120db565b600c8190556040518181527f0d279a5753fad2b01bf40c6d21bc82b9050db4f4fc517a1624e9193c430d82c6906020016110e9565b60018054610ba690613187565b61177c6120db565b611485612465565b806117af7f000000000000000000000000000000000000000000000000011c37937e080000826131d7565b34146117ce5760405163078d696560e31b815260040160405180910390fd5b60028060105460ff1660028111156117e8576117e8612f1c565b1461180657604051637f0efd8560e01b815260040160405180910390fd5b336000908152600f60205260408120805485928392916118279084906132a8565b9091555050600c54336000908152600f6020526040902054111561185e5760405163c9352da560e01b815260040160405180910390fd5b83600d5481600e5461187091906132a8565b111561188f5760405163d49b601960e01b815260040160405180910390fd5b611899338661202e565b5050505050565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600b5460609061192590600160a81b900460ff166124c0565b905090565b6001600160a01b03811660009081526008602052604081205463ffffffff1680611955576000611373565b6001600160a01b038316600090815260076020526040812090611979600184613334565b63ffffffff16815260208101919091526040016000205464010000000090046001600160601b03169392505050565b6119b38585856110f4565b6001600160a01b0384163b1580611a4a5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a02906119fb9033908a9089908990899060040161337b565b6020604051808303816000875af1158015611a1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3e9190613317565b6001600160e01b031916145b6118995760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610fbd565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666000604051611ac891906131ee565b6040518091039020611ad74690565b60408051602080820195909552808201939093526060830191909152306080808401919091528151808403909101815260a0830182528051908401207fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60c08401526001600160a01b038b1660e084015261010083018a90526101208084018a90528251808503909101815261014084019092528151919093012061190160f01b610160830152610162820183905261018282018190529192506000906101a20160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015611c03573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611c8c5760405162461bcd60e51b815260206004820152603660248201527f455243373231436865636b706f696e7461626c653a3a64656c6567617465427960448201527f5369673a20696e76616c6964207369676e6174757265000000000000000000006064820152608401610fbd565b6001600160a01b0381166000908152600960205260408120805491611cb0836133cf565b919050558914611d285760405162461bcd60e51b815260206004820152603260248201527f455243373231436865636b706f696e7461626c653a3a64656c6567617465427960448201527f5369673a20696e76616c6964206e6f6e636500000000000000000000000000006064820152608401610fbd565b87421115611d9e5760405162461bcd60e51b815260206004820152603660248201527f455243373231436865636b706f696e7461626c653a3a64656c6567617465427960448201527f5369673a207369676e61747572652065787069726564000000000000000000006064820152608401610fbd565b611da8818b612393565b505050505b505050505050565b606060405180606001604052806031815260200161355f60319139600b54611df790600160a81b900460ff166005811115611df257611df2612f1c565b6126b7565b604051602001611e089291906133e8565b604051602081830303815290604052905090565b600b546040517fc87b56dd000000000000000000000000000000000000000000000000000000008152600481018390526060916001600160a01b03169063c87b56dd90602401600060405180830381865afa158015611e7f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b939190810190613417565b6000610b93611eb5836113ff565b6040518060600160405280603d815260200161360a603d91396127f4565b611edb6120db565b6001600160a01b038116611f575760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610fbd565b61115a81612413565b60006301ffc9a760e01b6001600160e01b031983161480611faa57507f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610b935750506001600160e01b0319167f5b5e139f000000000000000000000000000000000000000000000000000000001490565b60006001600160e01b031982167f649a51a8000000000000000000000000000000000000000000000000000000001480610b9357506301ffc9a760e01b6001600160e01b0319831614610b93565b807f000000000000000000000000000000000000000000000000000000000000277581600e5461205e91906132a8565b1115612096576040517ffd59427a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b828110156120d5576120ad84600e5461282c565b600e80549060006120bd836133cf565b919050555080806120cd906133cf565b915050612099565b50505050565b600a546001600160a01b031633146114855760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610fbd565b61110a61214184611348565b61214a84611348565b6001612842565b6000818152600260205260409020546001600160a01b038481169116146121ba5760405162461bcd60e51b815260206004820152600a60248201527f57524f4e475f46524f4d000000000000000000000000000000000000000000006044820152606401610fbd565b6001600160a01b0382166122105760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610fbd565b336001600160a01b038416148061224a57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b8061226b57506000818152600460205260409020546001600160a01b031633145b6122b75760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610fbd565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600b54600160a01b900460ff1615612371576040516313ef243160e11b815260040160405180910390fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600061239e83611348565b6001600160a01b0384811660008181526006602052604080822080546001600160a01b031916888616908117909155905194955093928516927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4600061240684611ea7565b90506120d5828483612842565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600b54600160a01b900460ff1615612490576040516313ef243160e11b815260040160405180910390fd5b600b80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b179055565b606060068260058111156124d6576124d6612f1c565b60ff1611156124e457600080fd5b8160058111156124f6576124f6612f1c565b60000361253657505060408051808201909152600781527f4342455f43433000000000000000000000000000000000000000000000000000602082015290565b81600581111561254857612548612f1c565b60010361258857505060408051808201909152600781527f4342455f45435200000000000000000000000000000000000000000000000000602082015290565b81600581111561259a5761259a612f1c565b6002036125da57505060408051808201909152600881527f4342455f4e454352000000000000000000000000000000000000000000000000602082015290565b8160058111156125ec576125ec612f1c565b60030361262c57505060408051808201909152600b81527f4342455f4e4543525f4853000000000000000000000000000000000000000000602082015290565b81600581111561263e5761263e612f1c565b60040361267e57505060408051808201909152600681527f4342455f50520000000000000000000000000000000000000000000000000000602082015290565b505060408051808201909152600981527f4342455f50525f48530000000000000000000000000000000000000000000000602082015290565b6060816000036126fa57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612724578061270e816133cf565b915061271d9050600a836132d1565b91506126fe565b60008167ffffffffffffffff81111561273f5761273f6132e5565b6040519080825280601f01601f191660200182016040528015612769576020820181803683370190505b5090505b84156127ec5761277e6001836134c4565b915061278b600a866134d7565b6127969060306132a8565b60f81b8183815181106127ab576127ab6134eb565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506127e5600a866132d1565b945061276d565b949350505050565b6000816c0100000000000000000000000084106128245760405162461bcd60e51b8152600401610fbd9190612e3c565b509192915050565b61283860008383612135565b61134482826129f0565b816001600160a01b0316836001600160a01b03161415801561286d57506000816001600160601b0316115b1561110a576001600160a01b03831615612933576001600160a01b03831660009081526008602052604081205463ffffffff1690816128ad5760006128fa565b6001600160a01b0385166000908152600760205260408120906128d1600185613334565b63ffffffff16815260208101919091526040016000205464010000000090046001600160601b03165b90506000612921828560405180606001604052806037815260200161364760379139612b16565b905061292f86848484612b58565b5050505b6001600160a01b0382161561110a576001600160a01b03821660009081526008602052604081205463ffffffff16908161296e5760006129bb565b6001600160a01b038416600090815260076020526040812090612992600185613334565b63ffffffff16815260208101919091526040016000205464010000000090046001600160601b03165b905060006129e2828560405180606001604052806036815260200161359060369139612d70565b9050611dad85848484612b58565b6001600160a01b038216612a465760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610fbd565b6000818152600260205260409020546001600160a01b031615612aab5760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f4d494e5445440000000000000000000000000000000000006044820152606401610fbd565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000836001600160601b0316836001600160601b031611158290612b4d5760405162461bcd60e51b8152600401610fbd9190612e3c565b506127ec8385613501565b6000612b7c436040518060800160405280604481526020016135c660449139612dbd565b905060008463ffffffff16118015612bd657506001600160a01b038516600090815260076020526040812063ffffffff831691612bba600188613334565b63ffffffff908116825260208201929092526040016000205416145b15612c5a576001600160a01b03851660009081526007602052604081208391612c00600188613334565b63ffffffff168152602081019190915260400160002080546001600160601b0392909216640100000000027fffffffffffffffffffffffffffffffff000000000000000000000000ffffffff909216919091179055612d1b565b60408051808201825263ffffffff80841682526001600160601b0380861660208085019182526001600160a01b038b166000908152600782528681208b8616825290915294909420925183549451909116640100000000027fffffffffffffffffffffffffffffffff00000000000000000000000000000000909416911617919091179055612cea846001613521565b6001600160a01b0386166000908152600860205260409020805463ffffffff191663ffffffff929092169190911790555b604080516001600160601b038086168252841660208201526001600160a01b038716917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050505050565b600080612d7d848661353e565b9050846001600160601b0316816001600160601b031610158390612db45760405162461bcd60e51b8152600401610fbd9190612e3c565b50949350505050565b60008164010000000084106128245760405162461bcd60e51b8152600401610fbd9190612e3c565b6001600160e01b03198116811461115a57600080fd5b600060208284031215612e0d57600080fd5b813561137381612de5565b60005b83811015612e33578181015183820152602001612e1b565b50506000910152565b6020815260008251806020840152612e5b816040850160208701612e18565b601f01601f19169190910160400192915050565b600060208284031215612e8157600080fd5b5035919050565b6000808284036080811215612e9c57600080fd5b833592506060601f1982011215612eb257600080fd5b506020830190509250929050565b80356001600160a01b03811681146113fa57600080fd5b60008060408385031215612eea57600080fd5b612ef383612ec0565b946020939093013593505050565b600060208284031215612f1357600080fd5b61137382612ec0565b634e487b7160e01b600052602160045260246000fd5b6020810160038310612f4657612f46612f1c565b91905290565b600080600060608486031215612f6157600080fd5b612f6a84612ec0565b9250612f7860208501612ec0565b9150604084013590509250925092565b60008060408385031215612f9b57600080fd5b50508035926020909101359150565b600060208284031215612fbc57600080fd5b81356003811061137357600080fd5b6020810160068310612f4657612f46612f1c565b60008060408385031215612ff257600080fd5b612ffb83612ec0565b91506020830135801515811461301057600080fd5b809150509250929050565b60008060008060006080868803121561303357600080fd5b61303c86612ec0565b945061304a60208701612ec0565b935060408601359250606086013567ffffffffffffffff8082111561306e57600080fd5b818801915088601f83011261308257600080fd5b81358181111561309157600080fd5b8960208285010111156130a357600080fd5b9699959850939650602001949392505050565b803560ff811681146113fa57600080fd5b60008060008060008060c087890312156130e057600080fd5b6130e987612ec0565b95506020870135945060408701359350613105606088016130b6565b92506080870135915060a087013590509295509295509295565b6000806040838503121561313257600080fd5b61313b83612ec0565b915061314960208401612ec0565b90509250929050565b6000806040838503121561316557600080fd5b61316e83612ec0565b9150602083013563ffffffff8116811461301057600080fd5b600181811c9082168061319b57607f821691505b6020821081036131bb57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610b9357610b936131c1565b600080835481600182811c91508083168061320a57607f831692505b6020808410820361322957634e487b7160e01b86526022600452602486fd5b81801561323d57600181146132525761327f565b60ff198616895284151585028901965061327f565b60008a81526020902060005b868110156132775781548b82015290850190830161325e565b505084890196505b509498975050505050505050565b60006020828403121561329f57600080fd5b611373826130b6565b80820180821115610b9357610b936131c1565b634e487b7160e01b600052601260045260246000fd5b6000826132e0576132e06132bb565b500490565b634e487b7160e01b600052604160045260246000fd5b6000825161330d818460208701612e18565b9190910192915050565b60006020828403121561332957600080fd5b815161137381612de5565b63ffffffff828116828216039080821115613351576133516131c1565b5092915050565b600063ffffffff8084168061336f5761336f6132bb565b92169190910492915050565b60006001600160a01b03808816835280871660208401525084604083015260806060830152826080830152828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b6000600182016133e1576133e16131c1565b5060010190565b600083516133fa818460208801612e18565b83519083019061340e818360208801612e18565b01949350505050565b60006020828403121561342957600080fd5b815167ffffffffffffffff8082111561344157600080fd5b818401915084601f83011261345557600080fd5b815181811115613467576134676132e5565b604051601f8201601f19908116603f0116810190838211818310171561348f5761348f6132e5565b816040528281528760208487010111156134a857600080fd5b6134b9836020830160208801612e18565b979650505050505050565b81810381811115610b9357610b936131c1565b6000826134e6576134e66132bb565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160601b03828116828216039080821115613351576133516131c1565b63ffffffff818116838216019080821115613351576133516131c1565b6001600160601b03818116838216019080821115613351576133516131c156fe61723a2f2f5f44396b4e3157724e576243713535425341475262544234625333763851415054596d42546853625833412f455243373231436865636b706f696e7461626c653a3a5f6d6f766544656c6567617465733a20616d6f756e74206f766572666c6f7773455243373231436865636b706f696e7461626c653a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473455243373231436865636b706f696e7461626c653a3a766f746573546f44656c65676174653a20616d6f756e7420657863656564732039362062697473455243373231436865636b706f696e7461626c653a3a5f6d6f766544656c6567617465733a20616d6f756e7420756e646572666c6f7773a2646970667358221220d43ae931cc5f320165b5a2ada5295caf59ca2a139aa5a70da0b6d12c4c7ba70464736f6c63430008110033

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

00000000000000000000000003c4532747c9f3ce738ce8a9a4354c34d3d6f4ce000000000000000000000000f3bf905d380783fa4acf3ce0ecd62acc21d3ec1800000000000000000000000001ad5d7a192ef0c0f85b6697b9e20fc83c5418380000000000000000000000000000000000000000000000000000000000000258000000000000000000000000000000000000000000000000000000000000277500000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000001f40000000000000000000000000000000000000000000000000011c37937e080000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000006422d424f54530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000442424f5400000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _renderer (address): 0x03C4532747c9F3CE738CE8A9A4354C34d3d6F4ce
Arg [1] : _gatekeeper (address): 0xf3BF905d380783Fa4acF3Ce0EcD62ACc21d3ec18
Arg [2] : _recipient (address): 0x01aD5d7A192EF0C0F85B6697B9E20fC83c541838
Arg [3] : _royaltyBps (uint256): 600
Arg [4] : _maxSupply (uint256): 10101
Arg [5] : _maxPerAddress (uint256): 2
Arg [6] : _availableSupply (uint256): 8000
Arg [7] : _mintCost (uint256): 80000000000000000
Arg [8] : _name (string): B-BOTS
Arg [9] : _symbol (string): BBOT

-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 00000000000000000000000003c4532747c9f3ce738ce8a9a4354c34d3d6f4ce
Arg [1] : 000000000000000000000000f3bf905d380783fa4acf3ce0ecd62acc21d3ec18
Arg [2] : 00000000000000000000000001ad5d7a192ef0c0f85b6697b9e20fc83c541838
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000258
Arg [4] : 0000000000000000000000000000000000000000000000000000000000002775
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [6] : 0000000000000000000000000000000000000000000000000000000000001f40
Arg [7] : 000000000000000000000000000000000000000000000000011c37937e080000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [11] : 422d424f54530000000000000000000000000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [13] : 42424f5400000000000000000000000000000000000000000000000000000000


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.