ERC-721
Overview
Max Total Supply
233 AFP
Holders
194
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 AFPLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
AsteriaPass
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 10000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT /** * Team: Asteria Labs * Author: Lambdalf the White */ pragma solidity 0.8.17; import "@lambdalf-dev/ethereum-contracts/contracts/interfaces/INFTSupplyErrors.sol"; import "@lambdalf-dev/ethereum-contracts/contracts/interfaces/IERC165.sol"; import "@lambdalf-dev/ethereum-contracts/contracts/interfaces/IERC721.sol"; import "@lambdalf-dev/ethereum-contracts/contracts/interfaces/IERC721Errors.sol"; import "@lambdalf-dev/ethereum-contracts/contracts/interfaces/IERC721Metadata.sol"; import "@lambdalf-dev/ethereum-contracts/contracts/interfaces/IERC721Receiver.sol"; import "@lambdalf-dev/ethereum-contracts/contracts/utils/ERC173.sol"; import "@lambdalf-dev/ethereum-contracts/contracts/utils/ERC2981.sol"; import "operator-filter-registry/src/UpdatableOperatorFilterer.sol"; contract AsteriaPass is INFTSupplyErrors, IERC721Errors, IERC721, IERC721Metadata, IERC165, ERC173, ERC2981, UpdatableOperatorFilterer { // ************************************** // ***** BYTECODE VARIABLES ***** // ************************************** address public constant DEFAULT_SUBSCRIPTION = address( 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6 ); address public constant DEFAULT_OPERATOR_FILTER_REGISTRY = address( 0x000000000000AAeB6D7670E522A718067333cd4E ); string public constant name = "Asteria Founders Pass"; // solhint-disable-line string public constant symbol = "AFP"; // solhint-disable-line // ************************************** // ************************************** // ***** STORAGE VARIABLES ***** // ************************************** address public delegate; bool public mintingClosed; uint256 public totalSupply; string private _baseURI = "https://afp-auction-site.vercel.app/api/meta/"; // Mapping from token ID to approved address mapping(uint256 => address) private _approvals; // List of owner addresses mapping(uint256 => address) private _owners; // Token owners mapped to balance mapping(address => uint256) private _balances; // Token owner mapped to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ************************************** // ************************************** // ***** ERROR ***** // ************************************** /** * @dev Thrown when trying to mint a token that already exists. * * @param tokenId the token being minted */ error AFP_ALREADY_EXIST(uint256 tokenId); /** * @dev Thrown when non delegated user tries to claim a token. */ error AFP_NOT_DELEGATE(); /** * @dev Thrown when trying to mint after closing supply. */ error AFP_SUPPLY_CLOSED(); /** * @dev Thrown when trying to call a non existant function or trying to send eth to the contract. */ error AFP_UNKNOWN(); // ************************************** constructor(address royaltiesRecipient_) UpdatableOperatorFilterer(DEFAULT_OPERATOR_FILTER_REGISTRY, DEFAULT_SUBSCRIPTION, true) { _setOwner(msg.sender); _setRoyaltyInfo(royaltiesRecipient_, 1000); } // ************************************** // ***** MODIFIER ***** // ************************************** /** * @dev Ensures the token exist. * A token exists if it has been minted and is not owned by the null address. * * @param tokenId_ identifier of the NFT being referenced */ modifier exists(uint256 tokenId_) { if (! _exists(tokenId_)) { revert IERC721_NONEXISTANT_TOKEN(tokenId_); } _; } // ************************************** // ************************************** // ***** INTERNAL ***** // ************************************** /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from_ address owning the token being transferred * @param to_ address the token is being transferred to * @param tokenId_ identifier of the NFT being referenced * @param data_ optional data to send along with the call * * @return whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from_, address to_, uint256 tokenId_, bytes memory data_) internal returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. // // IMPORTANT // It is unsafe to assume that an address not flagged by this method // is an externally-owned account (EOA) and not a contract. // // Among others, the following types of addresses will not be flagged: // // - an externally-owned account // - a contract in construction // - an address where a contract will be created // - an address where a contract lived, but was destroyed uint256 _size_; assembly { _size_ := extcodesize(to_) } // If address is a contract, check that it is aware of how to handle ERC721 tokens if (_size_ > 0) { try IERC721Receiver(to_).onERC721Received(msg.sender, from_, tokenId_, data_) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert IERC721_NON_ERC721_RECEIVER(to_); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Internal function returning whether a token exists. * A token exists if it has been minted and is not owned by the null address. * * Note: this function must be overriden if tokens are burnable. * * @param tokenId_ identifier of the NFT being referenced * * @return whether the token exists */ function _exists(uint256 tokenId_) internal view returns (bool) { if (tokenId_ == 0) { return false; } return _owners[tokenId_] != address(0); } /** * @dev Internal function returning whether `operator_` is allowed to handle `tokenId_` * * Note: To avoid multiple checks for the same data, it is assumed * that existence of `tokenId_` has been verified prior via {_exists} * If it hasn't been verified, this function might panic * * @param operator_ address that tries to handle the token * @param tokenId_ identifier of the NFT being referenced * * @return whether `operator_` is allowed to manage the token */ function _isApprovedOrOwner(address tokenOwner_, address operator_, uint256 tokenId_) internal view returns (bool) { return operator_ == tokenOwner_ || operator_ == getApproved(tokenId_) || isApprovedForAll(tokenOwner_, operator_); } /** * @dev Mints a token and transfer it to `to_`. * * This internal function can be used to perform token minting. * If the Vested Pass contract is set, it will also burn a vested pass from the token receiver * * @param to_ address receiving the tokens * * Emits a {Transfer} event. */ function _mint(address to_, uint256 tokenId_) internal { unchecked { ++_balances[to_]; ++totalSupply; } _owners[tokenId_] = to_; emit Transfer(address(0), to_, tokenId_); } /** * @dev Internal function returning the owner of the `tokenId_` token. * * @param tokenId_ identifier of the NFT being referenced * * @return address of the token owner */ function _ownerOf(uint256 tokenId_) internal view returns (address) { return _owners[tokenId_]; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value_) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value_ } 1 {} { // solhint-disable-line str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } /** * @dev Transfers `tokenId_` from `from_` to `to_`. * * This internal function can be used to implement alternative mechanisms to perform * token transfer, such as signature-based, or token burning. * * @param from_ the current owner of the NFT * @param to_ the new owner * @param tokenId_ identifier of the NFT being referenced * * Emits a {Transfer} event. */ function _transfer(address from_, address to_, uint256 tokenId_) internal { unchecked { ++_balances[to_]; --_balances[from_]; } _owners[tokenId_] = to_; _approvals[tokenId_] = address(0); emit Transfer(from_, to_, tokenId_); } // ************************************** // ************************************** // ***** PUBLIC ***** // ************************************** // *********** // * IERC721 * // *********** /** * @dev Gives permission to `to_` to transfer the token number `tokenId_` on behalf of its owner. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * @param to_ The new approved NFT controller * @param tokenId_ The NFT to approve * * Requirements: * * - The token number `tokenId_` must exist. * - The caller must own the token or be an approved operator. * - Must emit an {Approval} event. */ function approve(address to_, uint256 tokenId_) public override exists(tokenId_) onlyAllowedOperatorApproval(msg.sender) { address _tokenOwner_ = _ownerOf(tokenId_); if (to_ == _tokenOwner_) { revert IERC721_INVALID_APPROVAL(to_); } bool _isApproved_ = _isApprovedOrOwner(_tokenOwner_, msg.sender, tokenId_); if (! _isApproved_) { revert IERC721_CALLER_NOT_APPROVED(_tokenOwner_, msg.sender, tokenId_); } _approvals[tokenId_] = to_; emit Approval(_tokenOwner_, to_, tokenId_); } /** * @dev Transfers the token number `tokenId_` from `from_` to `to_`. * * @param from_ The current owner of the NFT * @param to_ The new owner * @param tokenId_ identifier of the NFT being referenced * * Requirements: * * - The token number `tokenId_` must exist. * - `from_` must be the token owner. * - The caller must own the token or be an approved operator. * - `to_` must not be the zero address. * - If `to_` is a contract, it must implement {IERC721Receiver-onERC721Received} with a return value of `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`, * - Must emit a {Transfer} event. */ function safeTransferFrom(address from_, address to_, uint256 tokenId_) public override { safeTransferFrom(from_, to_, tokenId_, ""); } /** * @dev Transfers the token number `tokenId_` from `from_` to `to_`. * * @param from_ The current owner of the NFT * @param to_ The new owner * @param tokenId_ identifier of the NFT being referenced * @param data_ Additional data with no specified format, sent in call to `to_` * * Requirements: * * - The token number `tokenId_` must exist. * - `from_` must be the token owner. * - The caller must own the token or be an approved operator. * - `to_` must not be the zero address. * - If `to_` is a contract, it must implement {IERC721Receiver-onERC721Received} with a return value of `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`, * - Must emit a {Transfer} event. */ function safeTransferFrom(address from_, address to_, uint256 tokenId_, bytes memory data_) public override { transferFrom(from_, to_, tokenId_); if (! _checkOnERC721Received(from_, to_, tokenId_, data_)) { revert IERC721_NON_ERC721_RECEIVER(to_); } } /** * @dev Allows or disallows `operator_` to manage the caller's tokens on their behalf. * * @param operator_ Address to add to the set of authorized operators * @param approved_ True if the operator is approved, false to revoke approval * * Requirements: * * - Must emit an {ApprovalForAll} event. */ function setApprovalForAll(address operator_, bool approved_) public override onlyAllowedOperatorApproval(msg.sender) { address _account_ = msg.sender; if (operator_ == _account_) { revert IERC721_INVALID_APPROVAL(operator_); } _operatorApprovals[_account_][operator_] = approved_; emit ApprovalForAll(_account_, operator_, approved_); } /** * @dev Transfers the token number `tokenId_` from `from_` to `to_`. * * @param from_ the current owner of the NFT * @param to_ the new owner * @param tokenId_ identifier of the NFT being referenced * * Requirements: * * - The token number `tokenId_` must exist. * - `from_` must be the token owner. * - The caller must own the token or be an approved operator. * - `to_` must not be the zero address. * - Must emit a {Transfer} event. */ function transferFrom(address from_, address to_, uint256 tokenId_) public override onlyAllowedOperator(msg.sender) { if (to_ == address(0)) { revert IERC721_INVALID_TRANSFER(); } address _tokenOwner_ = ownerOf(tokenId_); if (from_ != _tokenOwner_) { revert IERC721_INVALID_TRANSFER_FROM(_tokenOwner_, from_, tokenId_); } if (! _isApprovedOrOwner(_tokenOwner_, msg.sender, tokenId_)) { revert IERC721_CALLER_NOT_APPROVED(_tokenOwner_, msg.sender, tokenId_); } _transfer(_tokenOwner_, to_, tokenId_); } // *********** // ************************************** // ************************************** // ***** DELEGATE ***** // ************************************** /** * @dev Airdrops a token to `account_`. * * @param account_ the address receiving the token * @param tokenId_ identifier of the NFT being airdropped */ function airdrop(address account_, uint256 tokenId_) external { if (mintingClosed) { revert AFP_SUPPLY_CLOSED(); } if (msg.sender != delegate) { revert AFP_NOT_DELEGATE(); } if (_owners[tokenId_] != address(0)) { revert AFP_ALREADY_EXIST(tokenId_); } _mint(account_, tokenId_); } // ************************************** // ************************************** // ***** CONTRACT_OWNER ***** // ************************************** /** * @dev Closes minting, locking the supply. */ function closeMinting() external onlyOwner { mintingClosed = true; } /** * @dev Updates the baseURI for the tokens. * * @param baseURI_ the new baseURI for the tokens * * Requirements: * * - Caller must be the contract owner. */ function setBaseURI(string memory baseURI_) external onlyOwner { _baseURI = baseURI_; } /** * @dev Updates the royalty recipient and rate. * * @param newRoyaltyRecipient_ the new recipient of the royalties * @param newRoyaltyRate_ the new royalty rate * * Requirements: * * - Caller must be the contract owner. * - `newRoyaltyRate_` cannot be higher than 10,000. */ function setRoyaltyInfo(address newRoyaltyRecipient_, uint256 newRoyaltyRate_) external onlyOwner { _setRoyaltyInfo(newRoyaltyRecipient_, newRoyaltyRate_); } /** * @dev Sets the address allowed to mint the tokens. * * @param delegateAddress_ the address allowed to mint tokens * * Requirements: * * - Caller must be the contract owner. */ function setDelegate(address delegateAddress_) external onlyOwner { delegate = delegateAddress_; } // ************************************** // ************************************** // ***** VIEW ***** // ************************************** // *********** // * IERC721 * // *********** /** * @dev Returns the number of tokens in `tokenOwner_`'s account. * * @param tokenOwner_ address that owns tokens * * @return the nomber of tokens owned by `tokenOwner_` */ function balanceOf(address tokenOwner_) public view override returns (uint256) { if (tokenOwner_ == address(0)) { return 0; } return _balances[tokenOwner_]; } /** * @dev Returns the address that has been specifically allowed to manage `tokenId_` on behalf of its owner. * * @param tokenId_ the NFT that has been approved * * @return the address allowed to manage `tokenId_` * * Requirements: * * - `tokenId_` must exist. * * Note: See {Approve} */ function getApproved(uint256 tokenId_) public view override exists(tokenId_) returns (address) { return _approvals[tokenId_]; } /** * @dev Returns whether `operator_` is allowed to manage tokens on behalf of `tokenOwner_`. * * @param tokenOwner_ address that owns tokens * @param operator_ address that tries to manage tokens * * @return whether `operator_` is allowed to handle `tokenOwner`'s tokens * * Note: See {setApprovalForAll} */ function isApprovedForAll(address tokenOwner_, address operator_) public view override returns (bool) { return _operatorApprovals[tokenOwner_][operator_]; } /** * @dev Returns the owner of the token number `tokenId_`. * * @param tokenId_ the NFT to verify ownership of * * @return the owner of token number `tokenId_` * * Requirements: * * - `tokenId_` must exist. */ function ownerOf(uint256 tokenId_) public view override exists(tokenId_) returns (address) { return _ownerOf(tokenId_); } // *********** // ******************* // * IERC721Metadata * // ******************* /** * @dev A distinct Uniform Resource Identifier (URI) for a given asset. * * @param tokenId_ the NFT that has been approved * * @return the URI of the token * * Requirements: * * - `tokenId_` must exist. */ function tokenURI(uint256 tokenId_) public view override exists(tokenId_) returns (string memory) { return bytes(_baseURI).length > 0 ? string(abi.encodePacked(_baseURI, _toString(tokenId_))) : _toString(tokenId_); } // ******************* // *********** // * IERC165 * // *********** /** * @dev Query if a contract implements an interface. * @dev see https://eips.ethereum.org/EIPS/eip-165 * * @param interfaceId_ the interface identifier, as specified in ERC-165 * * @return true if the contract implements the specified interface, false otherwise * * Requirements: * * - This function must use less than 30,000 gas. */ function supportsInterface(bytes4 interfaceId_) public view override returns (bool) { return interfaceId_ == type(IERC721).interfaceId || interfaceId_ == type(IERC721Metadata).interfaceId || interfaceId_ == type(IERC173).interfaceId || interfaceId_ == type(IERC165).interfaceId || interfaceId_ == type(IERC2981).interfaceId; } // *********** // *********** // * IERC173 * // *********** /** * @dev Returns the address of the current contract owner. * * @return address : the current contract owner */ function owner() public view override(ERC173, UpdatableOperatorFilterer) returns (address) { return ERC173.owner(); } // *********** // ************************************** // FALLBACK, can't receive eth fallback() external payable { revert AFP_UNKNOWN(); } receive() external payable { revert AFP_UNKNOWN(); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; interface IERC165 { /** * @notice Returns if a contract implements an interface. * @dev Interface identification is specified in ERC-165. This function uses less than 30,000 gas. */ function supportsInterface(bytes4 interfaceId_) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; // import "./IERC165.sol"; /** * @dev Required interface of an ERC173 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-173[EIP]. */ interface IERC173 /* is IERC165 */ { /** * @dev This emits when ownership of a contract changes. * * @param previousOwner the previous contract owner * @param newOwner the new contract owner */ event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @notice Set the address of the new owner of the contract. * @dev Set newOwner_ to address(0) to renounce any ownership. */ function transferOwnership(address newOwner_) external; /** * @notice Returns the address of the owner. */ function owner() external view returns(address); }
// SPDX-License-Identifier: MIT /** * Author: Lambdalf the White */ pragma solidity 0.8.17; interface IERC173Errors { /** * @dev Thrown when `operator` is not the contract owner. * * @param operator address trying to use a function reserved to contract owner without authorization */ error IERC173_NOT_OWNER(address operator); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; // import "./IERC165.sol"; /** * @dev Interface for the NFT Royalty Standard */ interface IERC2981 /* is IERC165 */ { /** * ERC165 bytes to add to interface array - set in parent contract implementing this standard * * bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a * bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a; * _registerInterface(_INTERFACE_ID_ERC2981); * * @notice Called with the sale price to determine how much royalty is owed and to whom. */ function royaltyInfo( uint256 tokenId_, uint256 salePrice_ ) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: MIT /** * Author: Lambdalf the White */ pragma solidity 0.8.17; interface IERC2981Errors { /** * @dev Thrown when the desired royalty rate is higher than 10,000 * * @param royaltyRate the desired royalty rate * @param royaltyBase the maximum royalty rate */ error IERC2981_INVALID_ROYALTIES(uint256 royaltyRate, uint256 royaltyBase); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; // import "./IERC165.sol"; /** * @title ERC-721 Non-Fungible Token Standard * @dev See https://eips.ethereum.org/EIPS/eip-721 * Note: the ERC-165 identifier for this interface is 0x80ac58cd. */ interface IERC721 /* is IERC165 */ { /** * @dev This emits when the approved address for an NFT is changed or reaffirmed. * The zero address indicates there is no approved address. * When a Transfer event emits, this also indicates that the approved address for that NFT (if any) is reset to none. * * @param owner address that owns the token * @param approved address that is allowed to manage the token * @param tokenId identifier of the token being approved */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev This emits when an operator is enabled or disabled for an owner. The operator can manage all NFTs of the owner. * * @param owner address that owns the tokens * @param operator address that is allowed or not to manage the tokens * @param approved whether the operator is allowed or not */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev This emits when ownership of any NFT changes by any mechanism. * This event emits when NFTs are created (`from` == 0) and destroyed (`to` == 0). * Exception: during contract creation, any number of NFTs may be created and assigned without emitting Transfer. * At the time of any transfer, the approved address for that NFT (if any) is reset to none. * * @param from address the token is being transferred from * @param to address the token is being transferred to * @param tokenId identifier of the token being transferred */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @notice Change or reaffirm the approved address for an NFT * @dev The zero address indicates there is no approved address. * Throws unless `msg.sender` is the current NFT owner, or an authorized operator of the current owner. */ function approve(address approved_, uint256 tokenId_) external; /** * @notice Transfers the ownership of an NFT from one address to another address * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved address for this NFT. * Throws if `from_` is not the current owner. * Throws if `to_` is the zero address. * Throws if `tokenId_` is not a valid NFT. * When transfer is complete, this function checks if `to_` is a smart contract (code size > 0). * If so, it calls {onERC721Received} on `to_` and throws if the return value is not * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`. */ function safeTransferFrom(address from_, address to_, uint256 tokenId_, bytes calldata data_) external; /** * @notice Transfers the ownership of an NFT from one address to another address * @dev This works identically to the other function with an extra data parameter, * except this function just sets data to "". */ function safeTransferFrom(address from_, address to_, uint256 tokenId_) external; /** * @notice Enable or disable approval for a third party ("operator") to manage all of `msg.sender`'s assets. * @dev Emits the ApprovalForAll event. The contract MUST allow multiple operators per owner. */ function setApprovalForAll(address operator_, bool approved_) external; /** * @notice Transfer ownership of an NFT. * The caller is responsible to confirm that `to_` is capable of receiving nfts or * else they may be permanently lost * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved address for this NFT. * Throws if `from_` is not the current owner. * Throws if `to_` is the zero address. * Throws if `tokenId_` is not a valid NFT. */ function transferFrom(address from_, address to_, uint256 tokenId_) external; /** * @notice Count all NFTs assigned to an owner * @dev NFTs assigned to the zero address are considered invalid. Throws for queries about the zero address. */ function balanceOf(address owner_) external view returns (uint256); /** * @notice Get the approved address for a single NFT * @dev Throws if `tokenId_` is not a valid NFT. */ function getApproved(uint256 tokenId_) external view returns (address); /** * @notice Query if an address is an authorized operator for another address */ function isApprovedForAll(address owner_, address operator_) external view returns (bool); /** * @notice Find the owner of an NFT * @dev NFTs assigned to zero address are considered invalid, and queries * about them do throw. */ function ownerOf(uint256 tokenId_) external view returns (address); }
// SPDX-License-Identifier: MIT /** * Author: Lambdalf the White */ pragma solidity 0.8.17; interface IERC721Errors { /** * @dev Thrown when `operator` has not been approved to manage `tokenId` on behalf of `tokenOwner`. * * @param tokenOwner address owning the token * @param operator address trying to manage the token * @param tokenId identifier of the NFT being referenced */ error IERC721_CALLER_NOT_APPROVED(address tokenOwner, address operator, uint256 tokenId); /** * @dev Thrown when `operator` tries to approve themselves for managing a token they own. * * @param operator address that is trying to approve themselves */ error IERC721_INVALID_APPROVAL(address operator); /** * @dev Thrown when a token is being transferred to the zero address. */ error IERC721_INVALID_TRANSFER(); /** * @dev Thrown when a token is being transferred from an address that doesn"t own it. * * @param tokenOwner address owning the token * @param from address that the NFT is being transferred from * @param tokenId identifier of the NFT being referenced */ error IERC721_INVALID_TRANSFER_FROM(address tokenOwner, address from, uint256 tokenId); /** * @dev Thrown when the requested token doesn"t exist. * * @param tokenId identifier of the NFT being referenced */ error IERC721_NONEXISTANT_TOKEN(uint256 tokenId); /** * @dev Thrown when a token is being safely transferred to a contract unable to handle it. * * @param receiver address unable to receive the token */ error IERC721_NON_ERC721_RECEIVER(address receiver); /** * @dev Thrown when trying to get the token at an index that doesn"t exist. * * @param index the inexistant index */ error IERC721Enumerable_INDEX_OUT_OF_BOUNDS(uint256 index); /** * @dev Thrown when trying to get the token owned by `tokenOwner` at an index that doesn"t exist. * * @param tokenOwner address owning the token * @param index the inexistant index */ error IERC721Enumerable_OWNER_INDEX_OUT_OF_BOUNDS(address tokenOwner, uint256 index); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; // import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 * Note: the ERC-165 identifier for this interface is 0x5b5e139f. */ interface IERC721Metadata /* is IERC721 */ { /** * @notice A descriptive name for a collection of NFTs in this contract */ function name() external view returns (string memory); /** * @notice An abbreviated name for NFTs in this contract */ function symbol() external view returns (string memory); /** * @notice A distinct Uniform Resource Identifier (URI) for a given asset. * @dev Throws if `tokenId_` is not a valid NFT. URIs are defined in RFC 3986. * The URI may point to a JSON file that conforms to the "ERC721 Metadata JSON Schema". */ function tokenURI(uint256 tokenId_) external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; /** * @dev Note: the ERC-165 identifier for this interface is 0x150b7a02. */ interface IERC721Receiver { /** * @notice Handle the receipt of an NFT * @dev The ERC721 smart contract calls this function on the recipient * after a `transfer`. This function MAY throw to revert and reject the * transfer. Return of other than the magic value MUST result in the * transaction being reverted. * Note: the contract address is always the message sender. */ function onERC721Received( address operator_, address from_, uint256 tokenId_, bytes calldata data_ ) external returns(bytes4); }
// SPDX-License-Identifier: MIT /** * Author: Lambdalf the White */ pragma solidity 0.8.17; interface INFTSupplyErrors { /** * @dev Thrown when trying to mint 0 token. */ error NFT_INVALID_QTY(); /** * @dev Thrown when trying to set max supply to an invalid amount. */ error NFT_INVALID_SUPPLY(); /** * @dev Thrown when trying to mint more tokens than the max allowed per transaction. * * @param qtyRequested the amount of tokens requested * @param maxBatch the maximum amount that can be minted per transaction */ error NFT_MAX_BATCH(uint256 qtyRequested, uint256 maxBatch); /** * @dev Thrown when trying to mint more tokens from the reserve than the amount left. * * @param qtyRequested the amount of tokens requested * @param reserveLeft the amount of tokens left in the reserve */ error NFT_MAX_RESERVE(uint256 qtyRequested, uint256 reserveLeft); /** * @dev Thrown when trying to mint more tokens than the amount left to be minted (except reserve). * * @param qtyRequested the amount of tokens requested * @param remainingSupply the amount of tokens left in the reserve */ error NFT_MAX_SUPPLY(uint256 qtyRequested, uint256 remainingSupply); }
// SPDX-License-Identifier: MIT /** * Author: Lambdalf the White */ pragma solidity 0.8.17; import "../interfaces/IERC173.sol"; import "../interfaces/IERC173Errors.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 ERC173 is IERC173, IERC173Errors { // The owner of the contract address private _owner; // ************************************** // ***** MODIFIER ***** // ************************************** /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { if (owner() != msg.sender) { revert IERC173_NOT_OWNER(msg.sender); } _; } // ************************************** // ************************************** // ***** INTERNAL ***** // ************************************** /** * @dev Sets the contract owner. * * Note: This function needs to be called in the contract constructor to initialize the contract owner, * if it is not, then parts of the contract might be non functional * * @param owner_ : address that owns the contract */ function _setOwner(address owner_) internal { _owner = owner_; } // ************************************** // ************************************** // ***** CONTRACT OWNER ***** // ************************************** /** * @dev Transfers ownership of the contract to `newOwner_`. * * @param newOwner_ : address of the new contract owner * * Requirements: * * - Caller must be the contract owner. */ function transferOwnership(address newOwner_) public virtual onlyOwner { address _oldOwner_ = _owner; _owner = newOwner_; emit OwnershipTransferred(_oldOwner_, newOwner_); } // ************************************** // ************************************** // ***** VIEW ***** // ************************************** /** * @dev Returns the address of the current contract owner. * * @return address : the current contract owner */ function owner() public view virtual returns (address) { return _owner; } // ************************************** }
// SPDX-License-Identifier: MIT /** * Author: Lambdalf the White */ pragma solidity 0.8.17; import "../interfaces/IERC2981.sol"; import "../interfaces/IERC2981Errors.sol"; abstract contract ERC2981 is IERC2981, IERC2981Errors { // Royalty rate is stored out of 10,000 instead of a percentage to allow for // up to two digits below the unit such as 2.5% or 1.25%. uint public constant ROYALTY_BASE = 10000; // Represents the percentage of royalties on each sale on secondary markets. // Set to 0 to have no royalties. uint256 private _royaltyRate; // Address of the recipient of the royalties. address private _royaltyRecipient; // ************************************** // ***** INTERNAL ***** // ************************************** /** * @dev Sets the royalty rate to `royaltyRate_` and the royalty recipient to `royaltyRecipient_`. * * @param royaltyRecipient_ the address that will receive royalty payments * @param royaltyRate_ the percentage of the sale price that will be taken off as royalties, * expressed in Basis Points (100 BP = 1%) * * Requirements: * * - `royaltyRate_` cannot be higher than `10,000`; */ function _setRoyaltyInfo(address royaltyRecipient_, uint256 royaltyRate_) internal virtual { if (royaltyRate_ > ROYALTY_BASE) { revert IERC2981_INVALID_ROYALTIES(royaltyRate_, ROYALTY_BASE); } _royaltyRate = royaltyRate_; _royaltyRecipient = royaltyRecipient_; } // ************************************** // ************************************** // ***** VIEW ***** // ************************************** /** * @notice Called with the sale price to determine how much royalty is owed and to whom. * * Note: This function should be overriden to revert on a query for non existent token. * * @param tokenId_ identifier of the NFT being referenced * @param salePrice_ the sale price of the token sold * * @return address the address receiving the royalties * @return uint256 the royalty payment amount */ /* solhint-disable no-unused-vars */ function royaltyInfo(uint256 tokenId_, uint256 salePrice_) public view virtual override returns (address, uint256) { if (salePrice_ == 0 || _royaltyRate == 0) { return (_royaltyRecipient, 0); } uint256 _royaltyAmount_ = _royaltyRate * salePrice_ / ROYALTY_BASE; return (_royaltyRecipient, _royaltyAmount_); } /* solhint-enable no-unused-vars */ // ************************************** }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import {IOperatorFilterRegistry} from "./IOperatorFilterRegistry.sol"; /** * @title UpdatableOperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. This contract allows the Owner to update the * OperatorFilterRegistry address via updateOperatorFilterRegistryAddress, including to the zero address, * which will bypass registry checks. * Note that OpenSea will still disable creator fee enforcement if filtered operators begin fulfilling orders * on-chain, eg, if the registry is revoked or bypassed. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract UpdatableOperatorFilterer { error OperatorNotAllowed(address operator); error OnlyOwner(); IOperatorFilterRegistry public operatorFilterRegistry; constructor(address _registry, address subscriptionOrRegistrantToCopy, bool subscribe) { IOperatorFilterRegistry registry = IOperatorFilterRegistry(_registry); operatorFilterRegistry = registry; // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(registry).code.length > 0) { if (subscribe) { registry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { registry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { registry.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } /** * @notice Update the address that the contract will make OperatorFilter checks against. When set to the zero * address, checks will be bypassed. OnlyOwner. */ function updateOperatorFilterRegistryAddress(address newRegistry) public virtual { if (msg.sender != owner()) { revert OnlyOwner(); } operatorFilterRegistry = IOperatorFilterRegistry(newRegistry); } /** * @dev assume the contract has an owner, but leave specific Ownable implementation up to inheriting contract */ function owner() public view virtual returns (address); function _checkFilterOperator(address operator) internal view virtual { IOperatorFilterRegistry registry = operatorFilterRegistry; // Check registry code length to facilitate testing in environments without a deployed registry. if (address(registry) != address(0) && address(registry).code.length > 0) { if (!registry.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } }
{ "viaIR": false, "optimizer": { "enabled": true, "runs": 10000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"royaltiesRecipient_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"AFP_ALREADY_EXIST","type":"error"},{"inputs":[],"name":"AFP_NOT_DELEGATE","type":"error"},{"inputs":[],"name":"AFP_SUPPLY_CLOSED","type":"error"},{"inputs":[],"name":"AFP_UNKNOWN","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"IERC173_NOT_OWNER","type":"error"},{"inputs":[{"internalType":"uint256","name":"royaltyRate","type":"uint256"},{"internalType":"uint256","name":"royaltyBase","type":"uint256"}],"name":"IERC2981_INVALID_ROYALTIES","type":"error"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"IERC721Enumerable_INDEX_OUT_OF_BOUNDS","type":"error"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"IERC721Enumerable_OWNER_INDEX_OUT_OF_BOUNDS","type":"error"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"IERC721_CALLER_NOT_APPROVED","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"IERC721_INVALID_APPROVAL","type":"error"},{"inputs":[],"name":"IERC721_INVALID_TRANSFER","type":"error"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"IERC721_INVALID_TRANSFER_FROM","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"IERC721_NONEXISTANT_TOKEN","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"IERC721_NON_ERC721_RECEIVER","type":"error"},{"inputs":[],"name":"NFT_INVALID_QTY","type":"error"},{"inputs":[],"name":"NFT_INVALID_SUPPLY","type":"error"},{"inputs":[{"internalType":"uint256","name":"qtyRequested","type":"uint256"},{"internalType":"uint256","name":"maxBatch","type":"uint256"}],"name":"NFT_MAX_BATCH","type":"error"},{"inputs":[{"internalType":"uint256","name":"qtyRequested","type":"uint256"},{"internalType":"uint256","name":"reserveLeft","type":"uint256"}],"name":"NFT_MAX_RESERVE","type":"error"},{"inputs":[{"internalType":"uint256","name":"qtyRequested","type":"uint256"},{"internalType":"uint256","name":"remainingSupply","type":"uint256"}],"name":"NFT_MAX_SUPPLY","type":"error"},{"inputs":[],"name":"OnlyOwner","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"DEFAULT_OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_SUBSCRIPTION","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner_","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"closeMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"delegate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner_","type":"address"},{"internalType":"address","name":"operator_","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingClosed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilterRegistry","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"uint256","name":"salePrice_","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","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":"tokenId_","type":"uint256"},{"internalType":"bytes","name":"data_","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator_","type":"address"},{"internalType":"bool","name":"approved_","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegateAddress_","type":"address"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRoyaltyRecipient_","type":"address"},{"internalType":"uint256","name":"newRoyaltyRate_","type":"uint256"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId_","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","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":"newRegistry","type":"address"}],"name":"updateOperatorFilterRegistryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e0604052602d608081815290620022c660a039600690620000229082620002f1565b503480156200003057600080fd5b50604051620022f3380380620022f38339810160408190526200005391620003bd565b600380546001600160a01b0319166daaeb6d7670e522a718067333cd4e908117909155733cc6cdda760b79bafa08df41ecfa224f810dceb6600182803b15620001a85781156200010757604051633e9f1edf60e11b81523060048201526001600160a01b038481166024830152821690637d3e3dbe906044015b600060405180830381600087803b158015620000e857600080fd5b505af1158015620000fd573d6000803e3d6000fd5b50505050620001a8565b6001600160a01b038316156200014c5760405163a0af290360e01b81523060048201526001600160a01b03848116602483015282169063a0af290390604401620000cd565b604051632210724360e11b81523060048201526001600160a01b03821690634420e48690602401600060405180830381600087803b1580156200018e57600080fd5b505af1158015620001a3573d6000803e3d6000fd5b505050505b50505050620001bd33620001d260201b60201c565b620001cb816103e8620001f4565b50620003ef565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6127108111156200022757604051632761fe9d60e11b815260048101829052612710602482015260440160405180910390fd5b600155600280546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200027757607f821691505b6020821081036200029857634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002ec57600081815260208120601f850160051c81016020861015620002c75750805b601f850160051c820191505b81811015620002e857828155600101620002d3565b5050505b505050565b81516001600160401b038111156200030d576200030d6200024c565b62000325816200031e845462000262565b846200029e565b602080601f8311600181146200035d5760008415620003445750858301515b600019600386901b1c1916600185901b178555620002e8565b600085815260208120601f198616915b828110156200038e578886015182559484019460019091019084016200036d565b5085821015620003ad5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215620003d057600080fd5b81516001600160a01b0381168114620003e857600080fd5b9392505050565b611ec780620003ff6000396000f3fe6080604052600436106101c65760003560e01c80638da5cb5b116100f7578063b8d1e53211610095578063e2e784d511610064578063e2e784d5146105fd578063e985e9c51461061d578063f2fde38b14610666578063f9c0611c14610686576101fd565b8063b8d1e5321461057d578063c87b56dd1461059d578063c89e4361146105bd578063ca5eb5e1146105dd576101fd565b8063a49225f8116100d1578063a49225f8146104e9578063b0ccc31e1461050b578063b2b93b731461052b578063b88d4fde1461055d576101fd565b80638da5cb5b1461046257806395d89b4114610480578063a22cb465146104c9576101fd565b806342842e0e116101645780636352211e1161013e5780636352211e146103ed57806370a082311461040d57806387491c601461042d5780638ba4cc3c14610442576101fd565b806342842e0e1461039757806355f804b3146103b75780635f97036f146103d7576101fd565b8063095ea7b3116101a0578063095ea7b3146102f257806318160ddd1461031457806323b872dd146103385780632a55205a14610358576101fd565b806301ffc9a71461022f57806306fdde0314610264578063081812fc146102ba576101fd565b366101fd576040517f34890cd600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f34890cd600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b34801561023b57600080fd5b5061024f61024a3660046117d2565b6106ae565b60405190151581526020015b60405180910390f35b34801561027057600080fd5b506102ad6040518060400160405280601581526020017f4173746572696120466f756e646572732050617373000000000000000000000081525081565b60405161025b919061185d565b3480156102c657600080fd5b506102da6102d5366004611870565b61082b565b6040516001600160a01b03909116815260200161025b565b3480156102fe57600080fd5b5061031261030d3660046118a5565b610896565b005b34801561032057600080fd5b5061032a60055481565b60405190815260200161025b565b34801561034457600080fd5b506103126103533660046118cf565b610a19565b34801561036457600080fd5b5061037861037336600461190b565b610b37565b604080516001600160a01b03909316835260208301919091520161025b565b3480156103a357600080fd5b506103126103b23660046118cf565b610b97565b3480156103c357600080fd5b506103126103d23660046119f0565b610bb7565b3480156103e357600080fd5b5061032a61271081565b3480156103f957600080fd5b506102da610408366004611870565b610c1c565b34801561041957600080fd5b5061032a610428366004611a39565b610c81565b34801561043957600080fd5b50610312610cb5565b34801561044e57600080fd5b5061031261045d3660046118a5565b610d4b565b34801561046e57600080fd5b506000546001600160a01b03166102da565b34801561048c57600080fd5b506102ad6040518060400160405280600381526020017f414650000000000000000000000000000000000000000000000000000000000081525081565b3480156104d557600080fd5b506103126104e4366004611a62565b610e40565b3480156104f557600080fd5b506102da6daaeb6d7670e522a718067333cd4e81565b34801561051757600080fd5b506003546102da906001600160a01b031681565b34801561053757600080fd5b5060045461024f9074010000000000000000000000000000000000000000900460ff1681565b34801561056957600080fd5b50610312610578366004611a99565b610f25565b34801561058957600080fd5b50610312610598366004611a39565b610f83565b3480156105a957600080fd5b506102ad6105b8366004611870565b611001565b3480156105c957600080fd5b506004546102da906001600160a01b031681565b3480156105e957600080fd5b506103126105f8366004611a39565b61109d565b34801561060957600080fd5b506103126106183660046118a5565b61112c565b34801561062957600080fd5b5061024f610638366004611b15565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205460ff1690565b34801561067257600080fd5b50610312610681366004611a39565b61118b565b34801561069257600080fd5b506102da733cc6cdda760b79bafa08df41ecfa224f810dceb681565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061074157507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061078d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f7f5828d000000000000000000000000000000000000000000000000000000000145b806107d957507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b8061082557507fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000145b92915050565b60008161083781611248565b610875576040517f1cf4d9a4000000000000000000000000000000000000000000000000000000008152600481018290526024015b60405180910390fd5b6000838152600760205260409020546001600160a01b031691505b50919050565b806108a081611248565b6108d9576040517f1cf4d9a40000000000000000000000000000000000000000000000000000000081526004810182905260240161086c565b336108e381611278565b6000838152600860205260409020546001600160a01b03908116908516819003610944576040517ff2b21e1c0000000000000000000000000000000000000000000000000000000081526001600160a01b038616600482015260240161086c565b600061095182338761136c565b9050806109a2576040517f19f48dff0000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201523360248201526044810186905260640161086c565b60008581526007602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a811691821790925591518893918616917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b336001600160a01b038316610a5a576040517f14242cb600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610a6583610c1c565b9050806001600160a01b0316856001600160a01b031614610acc576040517fe02b28e70000000000000000000000000000000000000000000000000000000081526001600160a01b038083166004830152861660248201526044810184905260640161086c565b610ad781338561136c565b610b25576040517f19f48dff0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201523360248201526044810184905260640161086c565b610b308185856113df565b5050505050565b600080821580610b475750600154155b15610b615750506002546001600160a01b03166000610b90565b600061271084600154610b749190611b48565b610b7e9190611b86565b6002546001600160a01b031693509150505b9250929050565b610bb283838360405180602001604052806000815250610f25565b505050565b33610bca6000546001600160a01b031690565b6001600160a01b031614610c0c576040517f55932a1b00000000000000000000000000000000000000000000000000000000815233600482015260240161086c565b6006610c188282611c5c565b5050565b600081610c2881611248565b610c61576040517f1cf4d9a40000000000000000000000000000000000000000000000000000000081526004810182905260240161086c565b6000838152600860205260409020546001600160a01b03165b9392505050565b60006001600160a01b038216610c9957506000919050565b506001600160a01b031660009081526009602052604090205490565b33610cc86000546001600160a01b031690565b6001600160a01b031614610d0a576040517f55932a1b00000000000000000000000000000000000000000000000000000000815233600482015260240161086c565b600480547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055565b60045474010000000000000000000000000000000000000000900460ff1615610da0576040517f7e1603b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004546001600160a01b03163314610de4576040517f50a851ce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600860205260409020546001600160a01b031615610e36576040517f158fb1e50000000000000000000000000000000000000000000000000000000081526004810182905260240161086c565b610c1882826114a3565b33610e4a81611278565b336001600160a01b038416819003610e99576040517ff2b21e1c0000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161086c565b6001600160a01b038181166000818152600a602090815260408083209489168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001688151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a350505050565b610f30848484610a19565b610f3c84848484611532565b610f7d576040517f015be56a0000000000000000000000000000000000000000000000000000000081526001600160a01b038416600482015260240161086c565b50505050565b6000546001600160a01b03163314610fc7576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60608161100d81611248565b611046576040517f1cf4d9a40000000000000000000000000000000000000000000000000000000081526004810182905260240161086c565b60006006805461105590611bc1565b90501161106a57611065836116bb565b610c7a565b6006611075846116bb565b604051602001611086929190611d76565b604051602081830303815290604052915050919050565b336110b06000546001600160a01b031690565b6001600160a01b0316146110f2576040517f55932a1b00000000000000000000000000000000000000000000000000000000815233600482015260240161086c565b600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b3361113f6000546001600160a01b031690565b6001600160a01b031614611181576040517f55932a1b00000000000000000000000000000000000000000000000000000000815233600482015260240161086c565b610c18828261171d565b3361119e6000546001600160a01b031690565b6001600160a01b0316146111e0576040517f55932a1b00000000000000000000000000000000000000000000000000000000815233600482015260240161086c565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008160000361125a57506000919050565b506000908152600860205260409020546001600160a01b0316151590565b6003546001600160a01b0316801580159061129d57506000816001600160a01b03163b115b15610c18576040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03838116602483015282169063c617113490604401602060405180830381865afa158015611307573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132b9190611e1b565b610c18576040517fede71dcc0000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161086c565b6000836001600160a01b0316836001600160a01b031614806113a757506113928261082b565b6001600160a01b0316836001600160a01b0316145b806113d757506001600160a01b038085166000908152600a602090815260408083209387168352929052205460ff165b949350505050565b6001600160a01b0380831660008181526009602090815260408083208054600101905593871680835284832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190558583526008825284832080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811686179091556007909252848320805490921690915592518493917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b038216600081815260096020908152604080832080546001908101909155600580549091019055848352600890915280822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000833b80156116af576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063150b7a02906115879033908a9089908990600401611e38565b6020604051808303816000875af19250505080156115e0575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526115dd91810190611e74565b60015b611662573d80801561160e576040519150601f19603f3d011682016040523d82523d6000602084013e611613565b606091505b50805160000361165a576040517f015be56a0000000000000000000000000000000000000000000000000000000081526001600160a01b038716600482015260240161086c565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001491506113d79050565b50600195945050505050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806116d557508190037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101908152919050565b612710811115611764576040517f4ec3fd3a00000000000000000000000000000000000000000000000000000000815260048101829052612710602482015260440161086c565b600155600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146117cf57600080fd5b50565b6000602082840312156117e457600080fd5b8135610c7a816117a1565b60005b8381101561180a5781810151838201526020016117f2565b50506000910152565b6000815180845261182b8160208601602086016117ef565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610c7a6020830184611813565b60006020828403121561188257600080fd5b5035919050565b80356001600160a01b03811681146118a057600080fd5b919050565b600080604083850312156118b857600080fd5b6118c183611889565b946020939093013593505050565b6000806000606084860312156118e457600080fd5b6118ed84611889565b92506118fb60208501611889565b9150604084013590509250925092565b6000806040838503121561191e57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff808411156119775761197761192d565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156119bd576119bd61192d565b816040528093508581528686860111156119d657600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611a0257600080fd5b813567ffffffffffffffff811115611a1957600080fd5b8201601f81018413611a2a57600080fd5b6113d78482356020840161195c565b600060208284031215611a4b57600080fd5b610c7a82611889565b80151581146117cf57600080fd5b60008060408385031215611a7557600080fd5b611a7e83611889565b91506020830135611a8e81611a54565b809150509250929050565b60008060008060808587031215611aaf57600080fd5b611ab885611889565b9350611ac660208601611889565b925060408501359150606085013567ffffffffffffffff811115611ae957600080fd5b8501601f81018713611afa57600080fd5b611b098782356020840161195c565b91505092959194509250565b60008060408385031215611b2857600080fd5b611b3183611889565b9150611b3f60208401611889565b90509250929050565b8082028115828204841417610825577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082611bbc577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680611bd557607f821691505b602082108103610890577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f821115610bb257600081815260208120601f850160051c81016020861015611c355750805b601f850160051c820191505b81811015611c5457828155600101611c41565b505050505050565b815167ffffffffffffffff811115611c7657611c7661192d565b611c8a81611c848454611bc1565b84611c0e565b602080601f831160018114611cdd5760008415611ca75750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611c54565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015611d2a57888601518255948401946001909101908401611d0b565b5085821015611d6657878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000808454611d8481611bc1565b60018281168015611d9c5760018114611dcf57611dfe565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450611dfe565b8860005260208060002060005b85811015611df55781548a820152908401908201611ddc565b50505082870194505b505050508351611e128183602088016117ef565b01949350505050565b600060208284031215611e2d57600080fd5b8151610c7a81611a54565b60006001600160a01b03808716835280861660208401525083604083015260806060830152611e6a6080830184611813565b9695505050505050565b600060208284031215611e8657600080fd5b8151610c7a816117a156fea264697066735822122080f66feb0c41f061d7b916fc9cac01af1629637272a392651b05385de86c106664736f6c6343000811003368747470733a2f2f6166702d61756374696f6e2d736974652e76657263656c2e6170702f6170692f6d6574612f000000000000000000000000b94aca4c0764b4fbc8c66570f54366bb94fa2375
Deployed Bytecode
0x6080604052600436106101c65760003560e01c80638da5cb5b116100f7578063b8d1e53211610095578063e2e784d511610064578063e2e784d5146105fd578063e985e9c51461061d578063f2fde38b14610666578063f9c0611c14610686576101fd565b8063b8d1e5321461057d578063c87b56dd1461059d578063c89e4361146105bd578063ca5eb5e1146105dd576101fd565b8063a49225f8116100d1578063a49225f8146104e9578063b0ccc31e1461050b578063b2b93b731461052b578063b88d4fde1461055d576101fd565b80638da5cb5b1461046257806395d89b4114610480578063a22cb465146104c9576101fd565b806342842e0e116101645780636352211e1161013e5780636352211e146103ed57806370a082311461040d57806387491c601461042d5780638ba4cc3c14610442576101fd565b806342842e0e1461039757806355f804b3146103b75780635f97036f146103d7576101fd565b8063095ea7b3116101a0578063095ea7b3146102f257806318160ddd1461031457806323b872dd146103385780632a55205a14610358576101fd565b806301ffc9a71461022f57806306fdde0314610264578063081812fc146102ba576101fd565b366101fd576040517f34890cd600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f34890cd600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b34801561023b57600080fd5b5061024f61024a3660046117d2565b6106ae565b60405190151581526020015b60405180910390f35b34801561027057600080fd5b506102ad6040518060400160405280601581526020017f4173746572696120466f756e646572732050617373000000000000000000000081525081565b60405161025b919061185d565b3480156102c657600080fd5b506102da6102d5366004611870565b61082b565b6040516001600160a01b03909116815260200161025b565b3480156102fe57600080fd5b5061031261030d3660046118a5565b610896565b005b34801561032057600080fd5b5061032a60055481565b60405190815260200161025b565b34801561034457600080fd5b506103126103533660046118cf565b610a19565b34801561036457600080fd5b5061037861037336600461190b565b610b37565b604080516001600160a01b03909316835260208301919091520161025b565b3480156103a357600080fd5b506103126103b23660046118cf565b610b97565b3480156103c357600080fd5b506103126103d23660046119f0565b610bb7565b3480156103e357600080fd5b5061032a61271081565b3480156103f957600080fd5b506102da610408366004611870565b610c1c565b34801561041957600080fd5b5061032a610428366004611a39565b610c81565b34801561043957600080fd5b50610312610cb5565b34801561044e57600080fd5b5061031261045d3660046118a5565b610d4b565b34801561046e57600080fd5b506000546001600160a01b03166102da565b34801561048c57600080fd5b506102ad6040518060400160405280600381526020017f414650000000000000000000000000000000000000000000000000000000000081525081565b3480156104d557600080fd5b506103126104e4366004611a62565b610e40565b3480156104f557600080fd5b506102da6daaeb6d7670e522a718067333cd4e81565b34801561051757600080fd5b506003546102da906001600160a01b031681565b34801561053757600080fd5b5060045461024f9074010000000000000000000000000000000000000000900460ff1681565b34801561056957600080fd5b50610312610578366004611a99565b610f25565b34801561058957600080fd5b50610312610598366004611a39565b610f83565b3480156105a957600080fd5b506102ad6105b8366004611870565b611001565b3480156105c957600080fd5b506004546102da906001600160a01b031681565b3480156105e957600080fd5b506103126105f8366004611a39565b61109d565b34801561060957600080fd5b506103126106183660046118a5565b61112c565b34801561062957600080fd5b5061024f610638366004611b15565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205460ff1690565b34801561067257600080fd5b50610312610681366004611a39565b61118b565b34801561069257600080fd5b506102da733cc6cdda760b79bafa08df41ecfa224f810dceb681565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061074157507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061078d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f7f5828d000000000000000000000000000000000000000000000000000000000145b806107d957507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b8061082557507fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000145b92915050565b60008161083781611248565b610875576040517f1cf4d9a4000000000000000000000000000000000000000000000000000000008152600481018290526024015b60405180910390fd5b6000838152600760205260409020546001600160a01b031691505b50919050565b806108a081611248565b6108d9576040517f1cf4d9a40000000000000000000000000000000000000000000000000000000081526004810182905260240161086c565b336108e381611278565b6000838152600860205260409020546001600160a01b03908116908516819003610944576040517ff2b21e1c0000000000000000000000000000000000000000000000000000000081526001600160a01b038616600482015260240161086c565b600061095182338761136c565b9050806109a2576040517f19f48dff0000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201523360248201526044810186905260640161086c565b60008581526007602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a811691821790925591518893918616917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b336001600160a01b038316610a5a576040517f14242cb600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610a6583610c1c565b9050806001600160a01b0316856001600160a01b031614610acc576040517fe02b28e70000000000000000000000000000000000000000000000000000000081526001600160a01b038083166004830152861660248201526044810184905260640161086c565b610ad781338561136c565b610b25576040517f19f48dff0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201523360248201526044810184905260640161086c565b610b308185856113df565b5050505050565b600080821580610b475750600154155b15610b615750506002546001600160a01b03166000610b90565b600061271084600154610b749190611b48565b610b7e9190611b86565b6002546001600160a01b031693509150505b9250929050565b610bb283838360405180602001604052806000815250610f25565b505050565b33610bca6000546001600160a01b031690565b6001600160a01b031614610c0c576040517f55932a1b00000000000000000000000000000000000000000000000000000000815233600482015260240161086c565b6006610c188282611c5c565b5050565b600081610c2881611248565b610c61576040517f1cf4d9a40000000000000000000000000000000000000000000000000000000081526004810182905260240161086c565b6000838152600860205260409020546001600160a01b03165b9392505050565b60006001600160a01b038216610c9957506000919050565b506001600160a01b031660009081526009602052604090205490565b33610cc86000546001600160a01b031690565b6001600160a01b031614610d0a576040517f55932a1b00000000000000000000000000000000000000000000000000000000815233600482015260240161086c565b600480547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055565b60045474010000000000000000000000000000000000000000900460ff1615610da0576040517f7e1603b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004546001600160a01b03163314610de4576040517f50a851ce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600860205260409020546001600160a01b031615610e36576040517f158fb1e50000000000000000000000000000000000000000000000000000000081526004810182905260240161086c565b610c1882826114a3565b33610e4a81611278565b336001600160a01b038416819003610e99576040517ff2b21e1c0000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161086c565b6001600160a01b038181166000818152600a602090815260408083209489168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001688151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a350505050565b610f30848484610a19565b610f3c84848484611532565b610f7d576040517f015be56a0000000000000000000000000000000000000000000000000000000081526001600160a01b038416600482015260240161086c565b50505050565b6000546001600160a01b03163314610fc7576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60608161100d81611248565b611046576040517f1cf4d9a40000000000000000000000000000000000000000000000000000000081526004810182905260240161086c565b60006006805461105590611bc1565b90501161106a57611065836116bb565b610c7a565b6006611075846116bb565b604051602001611086929190611d76565b604051602081830303815290604052915050919050565b336110b06000546001600160a01b031690565b6001600160a01b0316146110f2576040517f55932a1b00000000000000000000000000000000000000000000000000000000815233600482015260240161086c565b600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b3361113f6000546001600160a01b031690565b6001600160a01b031614611181576040517f55932a1b00000000000000000000000000000000000000000000000000000000815233600482015260240161086c565b610c18828261171d565b3361119e6000546001600160a01b031690565b6001600160a01b0316146111e0576040517f55932a1b00000000000000000000000000000000000000000000000000000000815233600482015260240161086c565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008160000361125a57506000919050565b506000908152600860205260409020546001600160a01b0316151590565b6003546001600160a01b0316801580159061129d57506000816001600160a01b03163b115b15610c18576040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03838116602483015282169063c617113490604401602060405180830381865afa158015611307573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132b9190611e1b565b610c18576040517fede71dcc0000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161086c565b6000836001600160a01b0316836001600160a01b031614806113a757506113928261082b565b6001600160a01b0316836001600160a01b0316145b806113d757506001600160a01b038085166000908152600a602090815260408083209387168352929052205460ff165b949350505050565b6001600160a01b0380831660008181526009602090815260408083208054600101905593871680835284832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190558583526008825284832080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811686179091556007909252848320805490921690915592518493917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b038216600081815260096020908152604080832080546001908101909155600580549091019055848352600890915280822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000833b80156116af576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063150b7a02906115879033908a9089908990600401611e38565b6020604051808303816000875af19250505080156115e0575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526115dd91810190611e74565b60015b611662573d80801561160e576040519150601f19603f3d011682016040523d82523d6000602084013e611613565b606091505b50805160000361165a576040517f015be56a0000000000000000000000000000000000000000000000000000000081526001600160a01b038716600482015260240161086c565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001491506113d79050565b50600195945050505050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806116d557508190037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101908152919050565b612710811115611764576040517f4ec3fd3a00000000000000000000000000000000000000000000000000000000815260048101829052612710602482015260440161086c565b600155600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146117cf57600080fd5b50565b6000602082840312156117e457600080fd5b8135610c7a816117a1565b60005b8381101561180a5781810151838201526020016117f2565b50506000910152565b6000815180845261182b8160208601602086016117ef565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610c7a6020830184611813565b60006020828403121561188257600080fd5b5035919050565b80356001600160a01b03811681146118a057600080fd5b919050565b600080604083850312156118b857600080fd5b6118c183611889565b946020939093013593505050565b6000806000606084860312156118e457600080fd5b6118ed84611889565b92506118fb60208501611889565b9150604084013590509250925092565b6000806040838503121561191e57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff808411156119775761197761192d565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156119bd576119bd61192d565b816040528093508581528686860111156119d657600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611a0257600080fd5b813567ffffffffffffffff811115611a1957600080fd5b8201601f81018413611a2a57600080fd5b6113d78482356020840161195c565b600060208284031215611a4b57600080fd5b610c7a82611889565b80151581146117cf57600080fd5b60008060408385031215611a7557600080fd5b611a7e83611889565b91506020830135611a8e81611a54565b809150509250929050565b60008060008060808587031215611aaf57600080fd5b611ab885611889565b9350611ac660208601611889565b925060408501359150606085013567ffffffffffffffff811115611ae957600080fd5b8501601f81018713611afa57600080fd5b611b098782356020840161195c565b91505092959194509250565b60008060408385031215611b2857600080fd5b611b3183611889565b9150611b3f60208401611889565b90509250929050565b8082028115828204841417610825577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082611bbc577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680611bd557607f821691505b602082108103610890577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f821115610bb257600081815260208120601f850160051c81016020861015611c355750805b601f850160051c820191505b81811015611c5457828155600101611c41565b505050505050565b815167ffffffffffffffff811115611c7657611c7661192d565b611c8a81611c848454611bc1565b84611c0e565b602080601f831160018114611cdd5760008415611ca75750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611c54565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015611d2a57888601518255948401946001909101908401611d0b565b5085821015611d6657878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000808454611d8481611bc1565b60018281168015611d9c5760018114611dcf57611dfe565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450611dfe565b8860005260208060002060005b85811015611df55781548a820152908401908201611ddc565b50505082870194505b505050508351611e128183602088016117ef565b01949350505050565b600060208284031215611e2d57600080fd5b8151610c7a81611a54565b60006001600160a01b03808716835280861660208401525083604083015260806060830152611e6a6080830184611813565b9695505050505050565b600060208284031215611e8657600080fd5b8151610c7a816117a156fea264697066735822122080f66feb0c41f061d7b916fc9cac01af1629637272a392651b05385de86c106664736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b94aca4c0764b4fbc8c66570f54366bb94fa2375
-----Decoded View---------------
Arg [0] : royaltiesRecipient_ (address): 0xB94ACa4C0764b4Fbc8c66570f54366BB94Fa2375
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000b94aca4c0764b4fbc8c66570f54366bb94fa2375
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.