Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
0 BBOT
Holders
382
Total Transfers
-
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
BBOTS
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 1337 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// 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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol) pragma solidity ^0.8.0; import "../utils/introspection/IERC165.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); }
// 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); } }
// 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; } }
// 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"; } }
//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; } }
// 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; }
// 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; }
// 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; } }
// 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); }
// 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; } }
// 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); } }
// 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; } }
// 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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; interface BBOTSRendererEvents { event EntropyRequested(); event EntropyReceived(uint256 entropy); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; interface IMetadataRenderer { /*/////////////////////////////////////////////////////////////// RENDERING //////////////////////////////////////////////////////////////*/ function tokenURI(uint256 id) external view returns (string memory); }
//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); }
{ "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
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
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.