Feature Tip: Add private address tag to any address under My Name Tag !
ERC-1155
Overview
Max Total Supply
121 LOH
Holders
63
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:
Cover
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/IArrayErrors.sol'; import '@lambdalf-dev/ethereum-contracts/contracts/interfaces/IERC1155Errors.sol'; 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/IERC1155.sol'; import '@lambdalf-dev/ethereum-contracts/contracts/interfaces/IERC1155Receiver.sol'; import '@lambdalf-dev/ethereum-contracts/contracts/interfaces/IERC1155MetadataURI.sol'; import '@lambdalf-dev/ethereum-contracts/contracts/utils/ERC173.sol'; import '@lambdalf-dev/ethereum-contracts/contracts/utils/ERC2981.sol'; import "@openzeppelin/contracts/utils/structs/BitMaps.sol"; import "operator-filter-registry/src/DefaultOperatorFilterer.sol"; contract Cover is IERC1155Errors, IArrayErrors, INFTSupplyErrors, IERC165, IERC1155, IERC1155MetadataURI, DefaultOperatorFilterer, ERC2981, ERC173 { // ************************************** // ***** BYTECODE VARIABLES ***** // ************************************** uint256 public constant DEFAULT_SERIES_ID = 1; uint256 public constant VOLUME_1 = 100; uint256 public constant VOLUME_2 = 200; uint256 public constant VOLUME_3 = 300; uint256 public constant VOLUME_4 = 400; uint256 public constant VOLUME_5 = 500; uint256 public constant VOLUME_6 = 600; uint256 public constant VOLUME_7 = 700; string public constant name = "Life of HEL"; string public constant symbol = "LOH"; // ************************************** // ************************************** // ***** STORAGE VARIABLES ***** // ************************************** string private _uri = "https://mint.lifeofhel.xyz/api/"; // List of valid series BitMaps.BitMap private _validSeries; // Series ID mapped to balances mapping (uint256 => mapping(address => uint256)) private _balances; // Token owner mapped to operator approvals mapping (address => mapping(address => bool)) private _operatorApprovals; // Series ID mapped to minter mapping (uint256 => address) public minters; // ************************************** // ************************************** // ***** ERROR ***** // ************************************** /** * @dev Thrown when non minter tries to mint a token. * * @param account the address trying to mint * @param id the series ID being minted */ error NON_MINTER(address account, uint256 id); // ************************************** constructor(address royaltyRecipent_) { _setOwner(msg.sender); _setRoyaltyInfo(royaltyRecipent_, 750); } // ************************************** // ***** MODIFIER ***** // ************************************** /** * @dev Ensures that `id_` is a valid series * * @param id_ the series id to validate */ modifier isValidSeries(uint256 id_) { if (! BitMaps.get(_validSeries, id_)) { revert IERC1155_NON_EXISTANT_TOKEN(id_); } _; } /** * @dev Ensures that `sender_` is a registered minter * * @param sender_ the address to verify * @param id_ the series id to validate */ modifier isMinter(address sender_, uint256 id_) { if (minters[id_] != sender_) { revert NON_MINTER(sender_, id_); } _; } // ************************************** // ************************************** // ***** INTERNAL ***** // ************************************** /** * @dev Internal function that checks if the receiver address is able to handle batches of IERC1155 tokens. * * @param operator_ address sending the transaction * @param from_ address from where the tokens are sent * @param to_ address receiving the tokens * @param ids_ list of token types being sent * @param amounts_ list of amounts of tokens being sent * @param data_ additional data to accompany the call */ function _doSafeBatchTransferAcceptanceCheck( address operator_, address from_, address to_, uint256[] memory ids_, uint256[] memory amounts_, bytes memory data_ ) private { uint256 _size_; assembly { _size_ := extcodesize(to_) } if (_size_ > 0) { try IERC1155Receiver(to_).onERC1155BatchReceived(operator_, from_, ids_, amounts_, data_) returns (bytes4 retval) { if (retval != IERC1155Receiver.onERC1155BatchReceived.selector) { revert IERC1155_REJECTED_TRANSFER(); } } catch (bytes memory reason) { if (reason.length == 0) { revert IERC1155_REJECTED_TRANSFER(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } } /** * @dev Internal function that checks if the receiver address is able to handle IERC1155 tokens. * * @param operator_ address sending the transaction * @param from_ address from where the tokens are sent * @param to_ address receiving the tokens * @param id_ the token type being sent * @param amount_ the amount of tokens being sent * @param data_ additional data to accompany the call */ function _doSafeTransferAcceptanceCheck( address operator_, address from_, address to_, uint256 id_, uint256 amount_, bytes memory data_ ) private { uint256 _size_; assembly { _size_ := extcodesize(to_) } if (_size_ > 0) { try IERC1155Receiver(to_).onERC1155Received(operator_, from_, id_, amount_, data_) returns (bytes4 retval) { if (retval != IERC1155Receiver.onERC1155Received.selector) { revert IERC1155_REJECTED_TRANSFER(); } } catch (bytes memory reason) { if (reason.length == 0) { revert IERC1155_REJECTED_TRANSFER(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } } /** * @dev Internal function that checks if `operator_` is allowed to manage tokens on behalf of `owner_` * * @param owner_ address owning the tokens * @param operator_ address to check approval for */ function _isApprovedOrOwner(address owner_, address operator_) internal view returns (bool) { return owner_ == operator_ || isApprovedForAll(owner_, operator_); } /** * @dev Internal function that checks whether `id_` is an existing series. * * @param id_ the token type being verified */ function _isValidSeries(uint256 id_) internal view returns (bool) { return BitMaps.get(_validSeries, id_); } /** * @dev Internal function that mints `amount_` tokens from series `id_` into `recipient_`. * * @param recipient_ the address receiving the tokens * @param id_ the token type being sent * @param amount_ the amount of tokens being sent */ // function _mint(address recipient_, uint256 id_, uint256 amount_) internal { // unchecked { // _balances[id_][recipient_] += amount_; // } // emit TransferSingle(msg.sender, address(0), recipient_, id_, amount_); // } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. * * @param value_ the value being converted to its string 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 // solhint-disable-next-line for { let temp := value_ } 1 {} { 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) } } // ************************************** // ************************************** // ***** DELEGATE ***** // ************************************** // ********* // * Cover * // ********* /** * @notice Mints `qty_` amount of `id_` to the `recipient_` address. * * @param id_ the series id to mint * @param qty_ amount of tokens to mint * @param recipient_ address receiving the tokens * * Requirements: * * - `id_` must be a valid series * - Caller must be allowed to mint tokens */ function mintTo(uint256 id_, uint256 qty_, address recipient_) external isValidSeries(id_) isMinter(msg.sender, id_) { unchecked { _balances[id_][recipient_] += qty_; } emit TransferSingle(msg.sender, address(0), recipient_, id_, qty_); } // ********* // ************************************** // ************************************** // ***** PUBLIC ***** // ************************************** // ********* // * Cover * // ********* /** * @notice Burns `qty_` amount of `id_` on behalf of `tokenOwner_`. * * @param id_ the series id to mint * @param qty_ amount of tokens to mint * @param tokenOwner_ address owning the tokens * * Requirements: * * - `id_` must be a valid series * - Caller must be allowed to burn tokens * - `tokenOwner_` must own at least `qty_` tokens of series `id_` */ function burnFrom(uint256 id_, uint256 qty_, address tokenOwner_) external isValidSeries(id_) { if (! _isApprovedOrOwner(tokenOwner_, msg.sender)) { revert IERC1155_CALLER_NOT_APPROVED(tokenOwner_, msg.sender); } uint256 _balance_ = _balances[id_][tokenOwner_]; if (_balance_ < qty_) { revert IERC1155_INSUFFICIENT_BALANCE(tokenOwner_, id_, _balance_); } unchecked { _balances[id_][tokenOwner_] -= qty_; } emit TransferSingle(msg.sender, tokenOwner_, address(0), id_, qty_); } // ********* // ************ // * IERC1155 * // ************ /** * @notice Transfers `amounts_` amount(s) of `ids_` from the `from_` address to the `to_` address specified (with safety call). * * @param from_ Source address * @param to_ Target address * @param ids_ IDs of each token type (order and length must match `amounts_` array) * @param amounts_ Transfer amounts per token type (order and length must match `ids_` array) * @param data_ Additional data with no specified format, MUST be sent unaltered in call to the `ERC1155TokenReceiver` hook(s) on `to_` * * Requirements: * * - Caller must be approved to manage the tokens being transferred out of the `from_` account (see "Approval" section of the standard). * - MUST revert if `to_` is the zero address. * - MUST revert if length of `ids_` is not the same as length of `amounts_`. * - MUST revert if any of the balance(s) of the holder(s) for token(s) in `ids_` is lower than the respective amount(s) in `amounts_` sent to the recipient. * - MUST revert on any other error. * - MUST emit `TransferSingle` or `TransferBatch` event(s) such that all the balance changes are reflected (see "Safe Transfer Rules" section of the standard). * - Balance changes and events MUST follow the ordering of the arrays (_ids[0]/_amounts[0] before ids_[1]/_amounts[1], etc). * - After the above conditions for the transfer(s) in the batch are met, this function MUST check if `to_` is a smart contract (e.g. code size > 0). If so, it MUST call the relevant `ERC1155TokenReceiver` hook(s) on `to_` and act appropriately (see "Safe Transfer Rules" section of the standard). */ function safeBatchTransferFrom( address from_, address to_, uint256[] calldata ids_, uint256[] calldata amounts_, bytes calldata data_ ) external override onlyAllowedOperator(from_) { if (to_ == address(0)) { revert IERC1155_INVALID_TRANSFER(); } uint256 _len_ = ids_.length; if (amounts_.length != _len_) { revert ARRAY_LENGTH_MISMATCH(); } address _operator_ = msg.sender; if (! _isApprovedOrOwner(from_, _operator_)) { revert IERC1155_CALLER_NOT_APPROVED(from_, _operator_); } for (uint256 i; i < _len_;) { if (! _isValidSeries(ids_[i])) { revert IERC1155_NON_EXISTANT_TOKEN(ids_[i]); } uint256 _balance_ = _balances[ids_[i]][from_]; if (_balance_ < amounts_[i]) { revert IERC1155_INSUFFICIENT_BALANCE(from_, ids_[i], _balance_); } unchecked { _balances[ids_[i]][from_] = _balance_ - amounts_[i]; } _balances[ids_[i]][to_] += amounts_[i]; unchecked { ++i; } } emit TransferBatch(_operator_, from_, to_, ids_, amounts_); _doSafeBatchTransferAcceptanceCheck(_operator_, from_, to_, ids_, amounts_, data_); } /** * @notice Transfers `amount_` amount of an `id_` from the `from_` address to the `to_` address specified (with safety call). * * @param from_ Source address * @param to_ Target address * @param id_ ID of the token type * @param amount_ Transfer amount * @param data_ Additional data with no specified format, MUST be sent unaltered in call to `onERC1155Received` on `to_` * * Requirements: * * - Caller must be approved to manage the tokens being transferred out of the `from_` account (see "Approval" section of the standard). * - MUST revert if `to_` is the zero address. * - MUST revert if balance of holder for token type `id_` is lower than the `amount_` sent. * - MUST revert on any other error. * - MUST emit the `TransferSingle` event to reflect the balance change (see "Safe Transfer Rules" section of the standard). * - After the above conditions are met, this function MUST check if `to_` is a smart contract (e.g. code size > 0). If so, it MUST call `onERC1155Received` on `to_` and act appropriately (see "Safe Transfer Rules" section of the standard). */ function safeTransferFrom( address from_, address to_, uint256 id_, uint256 amount_, bytes calldata data_ ) external override isValidSeries(id_) onlyAllowedOperator(from_) { if (to_ == address(0)) { revert IERC1155_INVALID_TRANSFER(); } address _operator_ = msg.sender; if (! _isApprovedOrOwner(from_, _operator_)) { revert IERC1155_CALLER_NOT_APPROVED(from_, _operator_); } uint256 _balance_ = _balances[id_][from_]; if (_balance_ < amount_) { revert IERC1155_INSUFFICIENT_BALANCE(from_, id_, _balance_); } unchecked { _balances[id_][from_] = _balance_ - amount_; } _balances[id_][to_] += amount_; emit TransferSingle(_operator_, from_, to_, id_, amount_); _doSafeTransferAcceptanceCheck(_operator_, from_, to_, id_, amount_, data_); } /** * @notice Enable or disable approval for a third party ("operator") to manage all of the caller's tokens. * * @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 the ApprovalForAll event on success. */ function setApprovalForAll(address operator_, bool approved_) external override onlyAllowedOperatorApproval(operator_) { address _tokenOwner_ = msg.sender; if (_tokenOwner_ == operator_) { revert IERC1155_INVALID_CALLER_APPROVAL(); } _operatorApprovals[_tokenOwner_][operator_] = approved_; emit ApprovalForAll(_tokenOwner_, operator_, approved_); } // ************ // ************************************** // ************************************** // ***** CONTRACT OWNER ***** // ************************************** // ********* // * Cover * // ********* /** * @notice Creates a new series * * @param id_ the new series ID * @param minter_ the address allowed to mint (address zero to revoke minter status) * * Requirements: * * - Caller must be the contract owner * - `id_` must not be a valid series ID */ function createSeries(uint256 id_, address minter_) external onlyOwner { if (BitMaps.get(_validSeries, id_)) { revert IERC1155_EXISTANT_TOKEN(id_); } BitMaps.set(_validSeries, id_); minters[id_] = minter_; } /** * @notice Sets the minter of an existing series * * @param id_ the series ID * @param minter_ the address allowed to mint (address zero to revoke minter status) * * Requirements: * * - Caller must be the contract owner * - `id_` must be a valid series ID */ function setMinter(uint256 id_, address minter_) external onlyOwner isValidSeries(id_) { minters[id_] = minter_; } /** * @notice Updates the royalty recipient and rate. * * @param royaltyRecipient_ the new recipient of the royalties * @param royaltyRate_ the new royalty rate * * Requirements: * * - Caller must be the contract owner * - `royaltyRate_` must be between 0 and 10,000 */ function setRoyaltyInfo(address royaltyRecipient_, uint256 royaltyRate_) external onlyOwner { _setRoyaltyInfo(royaltyRecipient_, royaltyRate_); } /** * @notice Sets the uri of the tokens. * * @param uri_ The new uri of the tokens */ function setURI(string memory uri_) external onlyOwner { _uri = uri_; emit URI(uri_, DEFAULT_SERIES_ID); } // ********* // ************************************** // ************************************** // ***** VIEW ***** // ************************************** // ********* // * Cover * // ********* /** * @notice Returns whether series `id_` exists. * * @param id_ ID of the token type * * @return TRUE if the series exists, FALSE otherwise */ function exist(uint256 id_) public view returns (bool) { return _isValidSeries(id_); } // ********* // *********** // * IERC165 * // *********** /** * @notice Query if a contract implements an interface. * @dev Interface identification is specified in ERC-165. This function uses less than 30,000 gas. * * @param interfaceID_ the interface identifier, as specified in ERC-165 * * @return TRUE if the contract implements `interfaceID_` and `interfaceID_` is not 0xffffffff, FALSE otherwise */ function supportsInterface(bytes4 interfaceID_) public pure override returns (bool) { return interfaceID_ == type(IERC165).interfaceId || interfaceID_ == type(IERC173).interfaceId || interfaceID_ == type(IERC1155).interfaceId || interfaceID_ == type(IERC1155MetadataURI).interfaceId || interfaceID_ == type(IERC2981).interfaceId; } // *********** // ************ // * IERC1155 * // ************ /** * @notice Get the balance of an account's tokens. * * @param owner_ the address of the token holder * @param id_ ID of the token type * * @return `owner_`'s balance of the token type requested */ function balanceOf(address owner_, uint256 id_) public view override isValidSeries(id_) returns (uint256) { return _balances[id_][owner_]; } /** * @notice Get the balance of multiple account/token pairs * * @param owners_ the addresses of the token holders * @param ids_ ID of the token types * * @return the `owners_`' balance of the token types requested (i.e. balance for each (owner, id) pair) */ function balanceOfBatch(address[] calldata owners_, uint256[] calldata ids_) public view override returns (uint256[] memory) { uint256 _len_ = owners_.length; if (_len_ != ids_.length) { revert ARRAY_LENGTH_MISMATCH(); } uint256[] memory _balances_ = new uint256[](_len_); while (_len_ > 0) { unchecked { --_len_; } if (! _isValidSeries(ids_[_len_])) { revert IERC1155_NON_EXISTANT_TOKEN(ids_[_len_]); } _balances_[_len_] = _balances[ids_[_len_]][owners_[_len_]]; } return _balances_; } /** * @notice Queries the approval status of an operator for a given owner. * * @param owner_ the owner of the tokens * @param operator_ address of authorized operator * * @return TRUE if the operator is approved, FALSE if not */ function isApprovedForAll(address owner_, address operator_) public view override returns (bool) { return _operatorApprovals[owner_][operator_]; } // ************ // *********************** // * IERC1155MetadataURI * // *********************** /** * @dev Returns the URI for token type `id`. */ function uri(uint256 id_) external view isValidSeries(id_) returns (string memory) { return bytes(_uri).length > 0 ? string(abi.encodePacked(_uri, _toString(id_))) : _toString(id_); } // *********************** // ************************************** }
// SPDX-License-Identifier: MIT /** * Author: Lambdalf the White */ pragma solidity 0.8.17; interface IArrayErrors { /** * @dev Thrown when two related arrays have different lengths */ error ARRAY_LENGTH_MISMATCH(); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; // import "./IERC165.sol"; /** * @title ERC-1155 Multi Token Standard * @dev See https://eips.ethereum.org/EIPS/eip-1155 * Note: The ERC-165 identifier for this interface is 0xd9b67a26. */ interface IERC1155 /* is IERC165 */ { /** * @dev MUST emit when approval for a second party/operator address to manage all tokens for an owner address is * enabled or disabled (absence of an event assumes disabled). * * @param owner address that owns the tokens * @param operator address allowed or not to manage the tokens * @param approved whether the operator is allowed */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev MUST emit when the URI is updated for a token ID. * URIs are defined in RFC 3986. * The URI MUST point to a JSON file that conforms to the "ERC-1155 Metadata URI JSON Schema". * * @param value the new uri * @param id the token id involved */ event URI(string value, uint256 indexed id); /** * @dev Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, * including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard). * * The `operator` argument MUST be the address of an account/contract * that is approved to make the transfer (SHOULD be msg.sender). * The `from` argument MUST be the address of the holder whose balance is decreased. * The `to` argument MUST be the address of the recipient whose balance is increased. * The `ids` argument MUST be the list of tokens being transferred. * The `values` argument MUST be the list of number of tokens (matching the list and order of tokens specified in ids) * the holder balance is decreased by and match what the recipient balance is increased by. * When minting/creating tokens, the `from` argument MUST be set to `0x0` (i.e. zero address). * When burning/destroying tokens, the `to` argument MUST be set to `0x0` (i.e. zero address). * * @param operator address ordering the transfer * @param from address tokens are being transferred from * @param to address tokens are being transferred to * @param ids identifiers of the tokens being transferred * @param values amounts of tokens being transferred */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, * including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard). * * The `operator` argument MUST be the address of an account/contract * that is approved to make the transfer (SHOULD be msg.sender). * The `from` argument MUST be the address of the holder whose balance is decreased. * The `to` argument MUST be the address of the recipient whose balance is increased. * The `id` argument MUST be the token type being transferred. * The `value` argument MUST be the number of tokens the holder balance is decreased by * and match what the recipient balance is increased by. * When minting/creating tokens, the `from` argument MUST be set to `0x0` (i.e. zero address). * When burning/destroying tokens, the `to` argument MUST be set to `0x0` (i.e. zero address). * * @param operator address ordering the transfer * @param from address tokens are being transferred from * @param to address tokens are being transferred to * @param id identifier of the token being transferred * @param value amount of token being transferred */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @notice Transfers `values_` amount(s) of `ids_` from the `from_` address to the `to_` address specified * (with safety call). * * @dev Caller must be approved to manage the tokens being transferred out of the `from_` account * (see "Approval" section of the standard). * * MUST revert if `to_` is the zero address. * MUST revert if length of `ids_` is not the same as length of `values_`. * MUST revert if any of the balance(s) of the holder(s) for token(s) in `ids_` is lower than the respective amount(s) * in `values_` sent to the recipient. * MUST revert on any other error. * MUST emit {TransferSingle} or {TransferBatch} event(s) such that all the balance changes are reflected * (see "Safe Transfer Rules" section of the standard). * Balance changes and events MUST follow the ordering of the arrays * (ids_[0]/values_[0] before ids_[1]/values_[1], etc). * After the above conditions for the transfer(s) in the batch are met, * this function MUST check if `to_` is a smart contract (e.g. code size > 0). * If so, it MUST call the relevant `ERC1155TokenReceiver` hook(s) on `to_` * and act appropriately (see "Safe Transfer Rules" section of the standard). */ function safeBatchTransferFrom( address from_, address to_, uint256[] calldata ids_, uint256[] calldata values_, bytes calldata data_ ) external; /** * @notice Transfers `value_` amount of an `id_` from the `from_` address to the `to_` address specified * (with safety call). * * @dev Caller must be approved to manage the tokens being transferred out of the `from_` account * (see "Approval" section of the standard). * * MUST revert if `to_` is the zero address. * MUST revert if balance of holder for token `id_` is lower than the `value_` sent. * MUST revert on any other error. * MUST emit the {TransferSingle} event to reflect the balance change * (see "Safe Transfer Rules" section of the standard). * After the above conditions are met, this function MUST check if `to_` is a smart contract (e.g. code size > 0). * If so, it MUST call `onERC1155Received` on `to_` and act appropriately * (see "Safe Transfer Rules" section of the standard). */ function safeTransferFrom(address from_, address to_, uint256 id_, uint256 value_, bytes calldata data_) external; /** * @notice Enable or disable approval for `operator_` to manage all of the caller's tokens. * * @dev MUST emit the {ApprovalForAll} event on success. */ function setApprovalForAll(address operator_, bool approved_) external; /** * @notice Returns the balance of `owner_`'s tokens of type `id_`. */ function balanceOf(address owner_, uint256 id_) external view returns (uint256); /** * @notice Returns the balance of multiple account/token pairs. */ function balanceOfBatch(address[] calldata owners_, uint256[] calldata ids_) external view returns (uint256[] memory); /** * @notice Returns the approval status of `operator_` for `owner_`. */ function isApprovedForAll(address owner_, address operator_) external view returns (bool); }
// SPDX-License-Identifier: MIT /** * Author: Lambdalf the White */ pragma solidity 0.8.17; interface IERC1155Errors { /** * @dev Thrown when `operator` has not been approved to manage `tokenId` on behalf of `tokenOwner`. * * @param from address owning the token * @param operator address trying to manage the token */ error IERC1155_CALLER_NOT_APPROVED(address from, address operator); /** * @dev Thrown when trying to create series `id` that already exists. * * @param id identifier of the NFT being referenced */ error IERC1155_EXISTANT_TOKEN(uint256 id); /** * @dev Thrown when `from` tries to transfer more than they own. * * @param from address that the NFT are being transferred from * @param id identifier of the NFT being referenced * @param balance amount of tokens that the address owns */ error IERC1155_INSUFFICIENT_BALANCE(address from, uint256 id, uint256 balance); /** * @dev Thrown when operator tries to approve themselves for managing a token they own. */ error IERC1155_INVALID_CALLER_APPROVAL(); /** * @dev Thrown when a token is being transferred to the zero address. */ error IERC1155_INVALID_TRANSFER(); /** * @dev Thrown when the requested token doesn"t exist. * * @param id identifier of the NFT being referenced */ error IERC1155_NON_EXISTANT_TOKEN(uint256 id); /** * @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 IERC1155_NON_ERC1155_RECEIVER(address receiver); /** * @dev Thrown when an ERC1155Receiver contract rejects a transfer. */ error IERC1155_REJECTED_TRANSFER(); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; // import "./IERC1155.sol"; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. */ interface IERC1155MetadataURI /* is IERC1155 */ { /** * @dev Returns the URI for token type `id_`. * * If the `id_` substring is present in the URI, it must be replaced by clients with the actual token type ID. */ function uri(uint256 id_) external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; interface IERC1155Receiver { /** * @dev Handles the receipt of a single ERC1155 token type. * This function is called at the end of a {safeTransferFrom} after the balance has been updated. * To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). */ function onERC1155Received( address operator_, address from_, uint256 id_, uint256 value_, bytes calldata data_ ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. * This function is called at the end of a {safeBatchTransferFrom} after the balances have been updated. * To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). */ function onERC1155BatchReceived( address operator_, address from_, uint256[] calldata ids_, uint256[] calldata values_, bytes calldata data_ ) external returns (bytes4); }
// 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 /** * 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 // OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/BitMaps.sol) pragma solidity ^0.8.0; /** * @dev Library for managing uint256 to bool mapping in a compact and efficient way, providing the keys are sequential. * Largely inspired by Uniswap's https://github.com/Uniswap/merkle-distributor/blob/master/contracts/MerkleDistributor.sol[merkle-distributor]. */ library BitMaps { struct BitMap { mapping(uint256 => uint256) _data; } /** * @dev Returns whether the bit at `index` is set. */ function get(BitMap storage bitmap, uint256 index) internal view returns (bool) { uint256 bucket = index >> 8; uint256 mask = 1 << (index & 0xff); return bitmap._data[bucket] & mask != 0; } /** * @dev Sets the bit at `index` to the boolean `value`. */ function setTo( BitMap storage bitmap, uint256 index, bool value ) internal { if (value) { set(bitmap, index); } else { unset(bitmap, index); } } /** * @dev Sets the bit at `index`. */ function set(BitMap storage bitmap, uint256 index) internal { uint256 bucket = index >> 8; uint256 mask = 1 << (index & 0xff); bitmap._data[bucket] |= mask; } /** * @dev Unsets the bit at `index`. */ function unset(BitMap storage bitmap, uint256 index) internal { uint256 bucket = index >> 8; uint256 mask = 1 << (index & 0xff); bitmap._data[bucket] &= ~mask; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import {OperatorFilterer} from "./OperatorFilterer.sol"; import {CANONICAL_CORI_SUBSCRIPTION} from "./lib/Constants.sol"; /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. * @dev Please note that if your token contract does not provide an owner with EIP-173, it must provide * administration methods on the contract itself to interact with the registry otherwise the subscription * will be locked to the options set during construction. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { /// @dev The constructor that is called when the contract is being deployed. constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; interface IOperatorFilterRegistry { /** * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns * true if supplied registrant address is not registered. */ function isOperatorAllowed(address registrant, address operator) external view returns (bool); /** * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner. */ function register(address registrant) external; /** * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes. */ function registerAndSubscribe(address registrant, address subscription) external; /** * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another * address without subscribing. */ function registerAndCopyEntries(address registrant, address registrantToCopy) external; /** * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner. * Note that this does not remove any filtered addresses or codeHashes. * Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes. */ function unregister(address addr) external; /** * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered. */ function updateOperator(address registrant, address operator, bool filtered) external; /** * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates. */ function updateOperators(address registrant, address[] calldata operators, bool filtered) external; /** * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered. */ function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; /** * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates. */ function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; /** * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous * subscription if present. * Note that accounts with subscriptions may go on to subscribe to other accounts - in this case, * subscriptions will not be forwarded. Instead the former subscription's existing entries will still be * used. */ function subscribe(address registrant, address registrantToSubscribe) external; /** * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes. */ function unsubscribe(address registrant, bool copyExistingEntries) external; /** * @notice Get the subscription address of a given registrant, if any. */ function subscriptionOf(address addr) external returns (address registrant); /** * @notice Get the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscribers(address registrant) external returns (address[] memory); /** * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscriberAt(address registrant, uint256 index) external returns (address); /** * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr. */ function copyEntriesOf(address registrant, address registrantToCopy) external; /** * @notice Returns true if operator is filtered by a given address or its subscription. */ function isOperatorFiltered(address registrant, address operator) external returns (bool); /** * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription. */ function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); /** * @notice Returns true if a codeHash is filtered by a given address or its subscription. */ function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); /** * @notice Returns a list of filtered operators for a given address or its subscription. */ function filteredOperators(address addr) external returns (address[] memory); /** * @notice Returns the set of filtered codeHashes for a given address or its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashes(address addr) external returns (bytes32[] memory); /** * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredOperatorAt(address registrant, uint256 index) external returns (address); /** * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); /** * @notice Returns true if an address has registered */ function isRegistered(address addr) external returns (bool); /** * @dev Convenience method to compute the code hash of an arbitrary contract */ function codeHashOf(address addr) external returns (bytes32); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E; address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import {IOperatorFilterRegistry} from "./IOperatorFilterRegistry.sol"; import {CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS} from "./lib/Constants.sol"; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @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. * Please note that if your token contract does not provide an owner with EIP-173, it must provide * administration methods on the contract itself to interact with the registry otherwise the subscription * will be locked to the options set during construction. */ abstract contract OperatorFilterer { /// @dev Emitted when an operator is not allowed. error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS); /// @dev The constructor that is called when the contract is being deployed. constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // 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(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } /** * @dev A helper function to check if an operator is allowed. */ 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); } _; } /** * @dev A helper function to check if an operator approval is allowed. */ modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } /** * @dev A helper function to check if an operator is allowed. */ function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { // under normal circumstances, this function will revert rather than return false, but inheriting contracts // may specify their own OperatorFilterRegistry implementations, which may behave differently if (!OPERATOR_FILTER_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":"royaltyRecipent_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ARRAY_LENGTH_MISMATCH","type":"error"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"IERC1155_CALLER_NOT_APPROVED","type":"error"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"IERC1155_EXISTANT_TOKEN","type":"error"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"}],"name":"IERC1155_INSUFFICIENT_BALANCE","type":"error"},{"inputs":[],"name":"IERC1155_INVALID_CALLER_APPROVAL","type":"error"},{"inputs":[],"name":"IERC1155_INVALID_TRANSFER","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"IERC1155_NON_ERC1155_RECEIVER","type":"error"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"IERC1155_NON_EXISTANT_TOKEN","type":"error"},{"inputs":[],"name":"IERC1155_REJECTED_TRANSFER","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":[],"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":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"NON_MINTER","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":"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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"DEFAULT_SERIES_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VOLUME_1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VOLUME_2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VOLUME_3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VOLUME_4","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VOLUME_5","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VOLUME_6","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VOLUME_7","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners_","type":"address[]"},{"internalType":"uint256[]","name":"ids_","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"},{"internalType":"uint256","name":"qty_","type":"uint256"},{"internalType":"address","name":"tokenOwner_","type":"address"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"},{"internalType":"address","name":"minter_","type":"address"}],"name":"createSeries","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"exist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"operator_","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"},{"internalType":"uint256","name":"qty_","type":"uint256"},{"internalType":"address","name":"recipient_","type":"address"}],"name":"mintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"minters","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":"ids_","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts_","type":"uint256[]"},{"internalType":"bytes","name":"data_","type":"bytes"}],"name":"safeBatchTransferFrom","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":"uint256","name":"amount_","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":"id_","type":"uint256"},{"internalType":"address","name":"minter_","type":"address"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"royaltyRecipient_","type":"address"},{"internalType":"uint256","name":"royaltyRate_","type":"uint256"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID_","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner_","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c0604052601f60809081527f68747470733a2f2f6d696e742e6c6966656f6668656c2e78797a2f6170692f0060a0526003906200003e9082620002f1565b503480156200004c57600080fd5b5060405162002a5138038062002a518339810160408190526200006f91620003bd565b733cc6cdda760b79bafa08df41ecfa224f810dceb660016daaeb6d7670e522a718067333cd4e3b15620001cb5780156200011957604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b158015620000fa57600080fd5b505af11580156200010f573d6000803e3d6000fd5b50505050620001cb565b6001600160a01b038216156200016a5760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401620000df565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b158015620001b157600080fd5b505af1158015620001c6573d6000803e3d6000fd5b505050505b5050600280546001600160a01b03191633179055620001ed816102ee620001f4565b50620003ef565b6127108111156200022757604051632761fe9d60e11b815260048101829052612710602482015260440160405180910390fd5b600055600180546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200027757607f821691505b6020821081036200029857634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002ec57600081815260208120601f850160051c81016020861015620002c75750805b601f850160051c820191505b81811015620002e857828155600101620002d3565b5050505b505050565b81516001600160401b038111156200030d576200030d6200024c565b62000325816200031e845462000262565b846200029e565b602080601f8311600181146200035d5760008415620003445750858301515b600019600386901b1c1916600185901b178555620002e8565b600085815260208120601f198616915b828110156200038e578886015182559484019460019091019084016200036d565b5085821015620003ad5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215620003d057600080fd5b81516001600160a01b0381168114620003e857600080fd5b9392505050565b61265280620003ff6000396000f3fe608060405234801561001057600080fd5b50600436106101e45760003560e01c80635f97036f1161010f578063be4ca74f116100a2578063f077b82611610071578063f077b826146104a8578063f242432a146104b1578063f2fde38b146104c4578063f717aa51146104d757600080fd5b8063be4ca74f1461043e578063c25ed57214610451578063e2e784d514610459578063e985e9c51461046c57600080fd5b806395d89b41116100de57806395d89b41146103d35780639d07b8121461040f578063a048046b14610418578063a22cb4651461042b57600080fd5b80635f97036f1461037d5780636190e3a8146103865780638623ec7b146103995780638da5cb5b146103c257600080fd5b80632eb2c2d61161018757806346d5205c1161015657806346d5205c1461032f5780634e1273f4146103375780634ebbc92a146103575780635cc938ef1461036a57600080fd5b80632eb2c2d6146102de5780633e49776b146102f15780633ec746fe146102fa57806341f434341461030257600080fd5b806306fdde03116101c357806306fdde03146102475780630e89341c1461029057806313db4a72146102a35780632a55205a146102ac57600080fd5b8062fdd58e146101e957806301ffc9a71461020f57806302fe530514610232575b600080fd5b6101fc6101f7366004611c7d565b6104e0565b6040519081526020015b60405180910390f35b61022261021d366004611cd5565b610565565b6040519015158152602001610206565b610245610240366004611d21565b6106e2565b005b6102836040518060400160405280600b81526020017f4c696665206f662048454c00000000000000000000000000000000000000000081525081565b6040516102069190611e22565b61028361029e366004611e35565b610780565b6101fc6102bc81565b6102bf6102ba366004611e4e565b610833565b604080516001600160a01b039093168352602083019190915201610206565b6102456102ec366004611ef7565b610893565b6101fc6101f481565b6101fc60c881565b6103176daaeb6d7670e522a718067333cd4e81565b6040516001600160a01b039091168152602001610206565b6101fc600181565b61034a610345366004611fb2565b610ce1565b6040516102069190612059565b610222610365366004611e35565b610e5d565b61024561037836600461206c565b610e68565b6101fc61271081565b61024561039436600461206c565b610ff1565b6103176103a7366004611e35565b6007602052600090815260409020546001600160a01b031681565b6002546001600160a01b0316610317565b6102836040518060400160405280600381526020017f4c4f48000000000000000000000000000000000000000000000000000000000081525081565b6101fc61019081565b6102456104263660046120a1565b61111a565b6102456104393660046120db565b61120d565b61024561044c3660046120a1565b6112e6565b6101fc606481565b610245610467366004611c7d565b6113f6565b61022261047a366004612112565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6101fc61025881565b6102456104bf36600461213c565b611459565b6102456104d23660046121b4565b6116b5565b6101fc61012c81565b600881901c6000908152600460205260408120548290600160ff83161b1661053c576040517f4e28dd33000000000000000000000000000000000000000000000000000000008152600481018290526024015b60405180910390fd5b505060009081526005602090815260408083206001600160a01b03949094168352929052205490565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a70000000000000000000000000000000000000000000000000000000014806105f857507fffffffff0000000000000000000000000000000000000000000000000000000082167f7f5828d000000000000000000000000000000000000000000000000000000000145b8061064457507fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000145b8061069057507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b806106dc57507fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000145b92915050565b336106f56002546001600160a01b031690565b6001600160a01b031614610737576040517f55932a1b000000000000000000000000000000000000000000000000000000008152336004820152602401610533565b6003610743828261226b565b5060017f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b826040516107759190611e22565b60405180910390a250565b600881901c6000908152600460205260409020546060908290600160ff83161b166107da576040517f4e28dd3300000000000000000000000000000000000000000000000000000000815260048101829052602401610533565b6000600380546107e9906121cf565b9050116107fe576107f983611774565b61082a565b600361080984611774565b60405160200161081a929190612367565b6040516020818303038152906040525b91505b50919050565b6000808215806108435750600054155b1561085d5750506001546001600160a01b0316600061088c565b600061271084600054610870919061243b565b61087a9190612452565b6001546001600160a01b031693509150505b9250929050565b876001600160a01b03811633146108ad576108ad336117b8565b6001600160a01b0388166108ed576040517ff5d8ca3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85848114610927576040517f88adebd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336109328b826118a6565b61097b576040517f33d9226d0000000000000000000000000000000000000000000000000000000081526001600160a01b03808d16600483015282166024820152604401610533565b60005b82811015610bc3576109a78a8a8381811061099b5761099b61248d565b905060200201356118f4565b6109f9578989828181106109bd576109bd61248d565b905060200201356040517f4e28dd3300000000000000000000000000000000000000000000000000000000815260040161053391815260200190565b6000600560008c8c85818110610a1157610a1161248d565b90506020020135815260200190815260200160002060008e6001600160a01b03166001600160a01b03168152602001908152602001600020549050888883818110610a5e57610a5e61248d565b90506020020135811015610ad2578c8b8b84818110610a7f57610a7f61248d565b6040517f38cb6d310000000000000000000000000000000000000000000000000000000081526001600160a01b039094166004850152602002919091013560248301525060448101829052606401610533565b888883818110610ae457610ae461248d565b905060200201358103600560008d8d86818110610b0357610b0361248d565b90506020020135815260200190815260200160002060008f6001600160a01b03166001600160a01b0316815260200190815260200160002081905550888883818110610b5157610b5161248d565b90506020020135600560008d8d86818110610b6e57610b6e61248d565b90506020020135815260200190815260200160002060008e6001600160a01b03166001600160a01b031681526020019081526020016000206000828254610bb591906124bc565b90915550505060010161097e565b50896001600160a01b03168b6001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8c8c8c8c604051610c17949392919061251a565b60405180910390a4610cd4818c8c8c8c80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508b8b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020601f8f018190048102820181019092528d815292508d91508c908190840183828082843760009201919091525061191792505050565b5050505050505050505050565b606083828114610d1d576040517f88adebd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff811115610d3857610d38611cf2565b604051908082528060200260200182016040528015610d61578160200160208202803683370190505b5090505b8115610e53577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90910190610da585858481811061099b5761099b61248d565b610dbb578484838181106109bd576109bd61248d565b60056000868685818110610dd157610dd161248d565b9050602002013581526020019081526020016000206000888885818110610dfa57610dfa61248d565b9050602002016020810190610e0f91906121b4565b6001600160a01b03166001600160a01b0316815260200190815260200160002054818381518110610e4257610e4261248d565b602002602001018181525050610d65565b9695505050505050565b60006106dc826118f4565b600883901c6000908152600460205260409020548390600160ff83161b16610ebf576040517f4e28dd3300000000000000000000000000000000000000000000000000000000815260048101829052602401610533565b610ec982336118a6565b610f10576040517f33d9226d0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152336024820152604401610533565b60008481526005602090815260408083206001600160a01b038616845290915290205483811015610f86576040517f38cb6d310000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024810186905260448101829052606401610533565b60008581526005602090815260408083206001600160a01b0387168085529083528184208054899003905581518981529283018890529133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b600883901c6000908152600460205260409020548390600160ff83161b16611048576040517f4e28dd3300000000000000000000000000000000000000000000000000000000815260048101829052602401610533565b600084815260076020526040902054339085906001600160a01b031682146110ae576040517f8725edad0000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260248101829052604401610533565b60008681526005602090815260408083206001600160a01b03881680855290835281842080548a01905581518a8152928301899052929133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4505050505050565b3361112d6002546001600160a01b031690565b6001600160a01b03161461116f576040517f55932a1b000000000000000000000000000000000000000000000000000000008152336004820152602401610533565b600882901c6000908152600460205260409020548290600160ff83161b166111c6576040517f4e28dd3300000000000000000000000000000000000000000000000000000000815260048101829052602401610533565b5060009182526007602052604090912080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909216919091179055565b81611217816117b8565b336001600160a01b038416810361125a576040517f853c4cc600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381811660008181526006602090815260408083209489168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001688151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a350505050565b336112f96002546001600160a01b031690565b6001600160a01b03161461133b576040517f55932a1b000000000000000000000000000000000000000000000000000000008152336004820152602401610533565b600882901c600090815260046020526040902054600160ff84161b1615611391576040517f469b8e4500000000000000000000000000000000000000000000000000000000815260048101839052602401610533565b600882901c60009081526004602052604090208054600160ff85161b17905560009182526007602052604090912080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909216919091179055565b336114096002546001600160a01b031690565b6001600160a01b03161461144b576040517f55932a1b000000000000000000000000000000000000000000000000000000008152336004820152602401610533565b6114558282611aa4565b5050565b600884901c6000908152600460205260409020548490600160ff83161b166114b0576040517f4e28dd3300000000000000000000000000000000000000000000000000000000815260048101829052602401610533565b866001600160a01b03811633146114ca576114ca336117b8565b6001600160a01b03871661150a576040517ff5d8ca3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3361151589826118a6565b61155e576040517f33d9226d0000000000000000000000000000000000000000000000000000000081526001600160a01b03808b16600483015282166024820152604401610533565b60008781526005602090815260408083206001600160a01b038d168452909152902054868110156115d4576040517f38cb6d310000000000000000000000000000000000000000000000000000000081526001600160a01b038b1660048201526024810189905260448101829052606401610533565b60008881526005602090815260408083206001600160a01b038e8116855292528083208a85039055908b168252812080548992906116139084906124bc565b909155505060408051898152602081018990526001600160a01b03808c16928d821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46116a9828b8b8b8b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b2892505050565b50505050505050505050565b336116c86002546001600160a01b031690565b6001600160a01b03161461170a576040517f55932a1b000000000000000000000000000000000000000000000000000000008152336004820152602401610533565b600280546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a90048061178e5750819003601f19909101908152919050565b6daaeb6d7670e522a718067333cd4e3b156118a3576040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa15801561183e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611862919061254c565b6118a3576040517fede71dcc0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610533565b50565b6000816001600160a01b0316836001600160a01b031614806118ed57506001600160a01b0380841660009081526006602090815260408083209386168352929052205460ff165b9392505050565b600881901c600090815260046020526040812054600160ff84161b1615156106dc565b833b8015611a9b576040517fbc197c810000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063bc197c819061196c908a908a90899089908990600401612569565b6020604051808303816000875af19250505080156119a7575060408051601f3d908101601f191682019092526119a4918101906125c7565b60015b611a1e573d8080156119d5576040519150601f19603f3d011682016040523d82523d6000602084013e6119da565b606091505b508051600003611a16576040517fc52ab55f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014611a99576040517fc52ab55f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b50505050505050565b612710811115611aeb576040517f4ec3fd3a000000000000000000000000000000000000000000000000000000008152600481018290526127106024820152604401610533565b600055600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b833b8015611a9b576040517ff23a6e610000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063f23a6e6190611b7d908a908a908990899089906004016125e4565b6020604051808303816000875af1925050508015611bb8575060408051601f3d908101601f19168201909252611bb5918101906125c7565b60015b611be6573d8080156119d5576040519150601f19603f3d011682016040523d82523d6000602084013e6119da565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014611a99576040517fc52ab55f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b0381168114611c7857600080fd5b919050565b60008060408385031215611c9057600080fd5b611c9983611c61565b946020939093013593505050565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146118a357600080fd5b600060208284031215611ce757600080fd5b81356118ed81611ca7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215611d3357600080fd5b813567ffffffffffffffff80821115611d4b57600080fd5b818401915084601f830112611d5f57600080fd5b813581811115611d7157611d71611cf2565b604051601f8201601f19908116603f01168101908382118183101715611d9957611d99611cf2565b81604052828152876020848701011115611db257600080fd5b826020860160208301376000928101602001929092525095945050505050565b60005b83811015611ded578181015183820152602001611dd5565b50506000910152565b60008151808452611e0e816020860160208601611dd2565b601f01601f19169290920160200192915050565b6020815260006118ed6020830184611df6565b600060208284031215611e4757600080fd5b5035919050565b60008060408385031215611e6157600080fd5b50508035926020909101359150565b60008083601f840112611e8257600080fd5b50813567ffffffffffffffff811115611e9a57600080fd5b6020830191508360208260051b850101111561088c57600080fd5b60008083601f840112611ec757600080fd5b50813567ffffffffffffffff811115611edf57600080fd5b60208301915083602082850101111561088c57600080fd5b60008060008060008060008060a0898b031215611f1357600080fd5b611f1c89611c61565b9750611f2a60208a01611c61565b9650604089013567ffffffffffffffff80821115611f4757600080fd5b611f538c838d01611e70565b909850965060608b0135915080821115611f6c57600080fd5b611f788c838d01611e70565b909650945060808b0135915080821115611f9157600080fd5b50611f9e8b828c01611eb5565b999c989b5096995094979396929594505050565b60008060008060408587031215611fc857600080fd5b843567ffffffffffffffff80821115611fe057600080fd5b611fec88838901611e70565b9096509450602087013591508082111561200557600080fd5b5061201287828801611e70565b95989497509550505050565b600081518084526020808501945080840160005b8381101561204e57815187529582019590820190600101612032565b509495945050505050565b6020815260006118ed602083018461201e565b60008060006060848603121561208157600080fd5b833592506020840135915061209860408501611c61565b90509250925092565b600080604083850312156120b457600080fd5b823591506120c460208401611c61565b90509250929050565b80151581146118a357600080fd5b600080604083850312156120ee57600080fd5b6120f783611c61565b91506020830135612107816120cd565b809150509250929050565b6000806040838503121561212557600080fd5b61212e83611c61565b91506120c460208401611c61565b60008060008060008060a0878903121561215557600080fd5b61215e87611c61565b955061216c60208801611c61565b94506040870135935060608701359250608087013567ffffffffffffffff81111561219657600080fd5b6121a289828a01611eb5565b979a9699509497509295939492505050565b6000602082840312156121c657600080fd5b6118ed82611c61565b600181811c908216806121e357607f821691505b60208210810361082d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f82111561226657600081815260208120601f850160051c810160208610156122435750805b601f850160051c820191505b818110156122625782815560010161224f565b5050505b505050565b815167ffffffffffffffff81111561228557612285611cf2565b6122998161229384546121cf565b8461221c565b602080601f8311600181146122ec57600084156122b65750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612262565b600085815260208120601f198616915b8281101561231b578886015182559484019460019091019084016122fc565b508582101561235757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000808454612375816121cf565b6001828116801561238d57600181146123c0576123ef565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00841687528215158302870194506123ef565b8860005260208060002060005b858110156123e65781548a8201529084019082016123cd565b50505082870194505b505050508351612403818360208801611dd2565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820281158282048414176106dc576106dc61240c565b600082612488577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b808201808211156106dc576106dc61240c565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561250157600080fd5b8260051b80836020870137939093016020019392505050565b60408152600061252e6040830186886124cf565b82810360208401526125418185876124cf565b979650505050505050565b60006020828403121561255e57600080fd5b81516118ed816120cd565b60006001600160a01b03808816835280871660208401525060a0604083015261259560a083018661201e565b82810360608401526125a7818661201e565b905082810360808401526125bb8185611df6565b98975050505050505050565b6000602082840312156125d957600080fd5b81516118ed81611ca7565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261254160a0830184611df656fea26469706673582212207fe6c4ec0c7e4f0925b280a6ed797e14b929810e8c74ba0475c3db4c57e5b47f64736f6c63430008110033000000000000000000000000f0dc5a298a1ae12973723c3b83e16790baa96cc4
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101e45760003560e01c80635f97036f1161010f578063be4ca74f116100a2578063f077b82611610071578063f077b826146104a8578063f242432a146104b1578063f2fde38b146104c4578063f717aa51146104d757600080fd5b8063be4ca74f1461043e578063c25ed57214610451578063e2e784d514610459578063e985e9c51461046c57600080fd5b806395d89b41116100de57806395d89b41146103d35780639d07b8121461040f578063a048046b14610418578063a22cb4651461042b57600080fd5b80635f97036f1461037d5780636190e3a8146103865780638623ec7b146103995780638da5cb5b146103c257600080fd5b80632eb2c2d61161018757806346d5205c1161015657806346d5205c1461032f5780634e1273f4146103375780634ebbc92a146103575780635cc938ef1461036a57600080fd5b80632eb2c2d6146102de5780633e49776b146102f15780633ec746fe146102fa57806341f434341461030257600080fd5b806306fdde03116101c357806306fdde03146102475780630e89341c1461029057806313db4a72146102a35780632a55205a146102ac57600080fd5b8062fdd58e146101e957806301ffc9a71461020f57806302fe530514610232575b600080fd5b6101fc6101f7366004611c7d565b6104e0565b6040519081526020015b60405180910390f35b61022261021d366004611cd5565b610565565b6040519015158152602001610206565b610245610240366004611d21565b6106e2565b005b6102836040518060400160405280600b81526020017f4c696665206f662048454c00000000000000000000000000000000000000000081525081565b6040516102069190611e22565b61028361029e366004611e35565b610780565b6101fc6102bc81565b6102bf6102ba366004611e4e565b610833565b604080516001600160a01b039093168352602083019190915201610206565b6102456102ec366004611ef7565b610893565b6101fc6101f481565b6101fc60c881565b6103176daaeb6d7670e522a718067333cd4e81565b6040516001600160a01b039091168152602001610206565b6101fc600181565b61034a610345366004611fb2565b610ce1565b6040516102069190612059565b610222610365366004611e35565b610e5d565b61024561037836600461206c565b610e68565b6101fc61271081565b61024561039436600461206c565b610ff1565b6103176103a7366004611e35565b6007602052600090815260409020546001600160a01b031681565b6002546001600160a01b0316610317565b6102836040518060400160405280600381526020017f4c4f48000000000000000000000000000000000000000000000000000000000081525081565b6101fc61019081565b6102456104263660046120a1565b61111a565b6102456104393660046120db565b61120d565b61024561044c3660046120a1565b6112e6565b6101fc606481565b610245610467366004611c7d565b6113f6565b61022261047a366004612112565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6101fc61025881565b6102456104bf36600461213c565b611459565b6102456104d23660046121b4565b6116b5565b6101fc61012c81565b600881901c6000908152600460205260408120548290600160ff83161b1661053c576040517f4e28dd33000000000000000000000000000000000000000000000000000000008152600481018290526024015b60405180910390fd5b505060009081526005602090815260408083206001600160a01b03949094168352929052205490565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a70000000000000000000000000000000000000000000000000000000014806105f857507fffffffff0000000000000000000000000000000000000000000000000000000082167f7f5828d000000000000000000000000000000000000000000000000000000000145b8061064457507fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000145b8061069057507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b806106dc57507fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000145b92915050565b336106f56002546001600160a01b031690565b6001600160a01b031614610737576040517f55932a1b000000000000000000000000000000000000000000000000000000008152336004820152602401610533565b6003610743828261226b565b5060017f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b826040516107759190611e22565b60405180910390a250565b600881901c6000908152600460205260409020546060908290600160ff83161b166107da576040517f4e28dd3300000000000000000000000000000000000000000000000000000000815260048101829052602401610533565b6000600380546107e9906121cf565b9050116107fe576107f983611774565b61082a565b600361080984611774565b60405160200161081a929190612367565b6040516020818303038152906040525b91505b50919050565b6000808215806108435750600054155b1561085d5750506001546001600160a01b0316600061088c565b600061271084600054610870919061243b565b61087a9190612452565b6001546001600160a01b031693509150505b9250929050565b876001600160a01b03811633146108ad576108ad336117b8565b6001600160a01b0388166108ed576040517ff5d8ca3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85848114610927576040517f88adebd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336109328b826118a6565b61097b576040517f33d9226d0000000000000000000000000000000000000000000000000000000081526001600160a01b03808d16600483015282166024820152604401610533565b60005b82811015610bc3576109a78a8a8381811061099b5761099b61248d565b905060200201356118f4565b6109f9578989828181106109bd576109bd61248d565b905060200201356040517f4e28dd3300000000000000000000000000000000000000000000000000000000815260040161053391815260200190565b6000600560008c8c85818110610a1157610a1161248d565b90506020020135815260200190815260200160002060008e6001600160a01b03166001600160a01b03168152602001908152602001600020549050888883818110610a5e57610a5e61248d565b90506020020135811015610ad2578c8b8b84818110610a7f57610a7f61248d565b6040517f38cb6d310000000000000000000000000000000000000000000000000000000081526001600160a01b039094166004850152602002919091013560248301525060448101829052606401610533565b888883818110610ae457610ae461248d565b905060200201358103600560008d8d86818110610b0357610b0361248d565b90506020020135815260200190815260200160002060008f6001600160a01b03166001600160a01b0316815260200190815260200160002081905550888883818110610b5157610b5161248d565b90506020020135600560008d8d86818110610b6e57610b6e61248d565b90506020020135815260200190815260200160002060008e6001600160a01b03166001600160a01b031681526020019081526020016000206000828254610bb591906124bc565b90915550505060010161097e565b50896001600160a01b03168b6001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8c8c8c8c604051610c17949392919061251a565b60405180910390a4610cd4818c8c8c8c80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508b8b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020601f8f018190048102820181019092528d815292508d91508c908190840183828082843760009201919091525061191792505050565b5050505050505050505050565b606083828114610d1d576040517f88adebd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff811115610d3857610d38611cf2565b604051908082528060200260200182016040528015610d61578160200160208202803683370190505b5090505b8115610e53577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90910190610da585858481811061099b5761099b61248d565b610dbb578484838181106109bd576109bd61248d565b60056000868685818110610dd157610dd161248d565b9050602002013581526020019081526020016000206000888885818110610dfa57610dfa61248d565b9050602002016020810190610e0f91906121b4565b6001600160a01b03166001600160a01b0316815260200190815260200160002054818381518110610e4257610e4261248d565b602002602001018181525050610d65565b9695505050505050565b60006106dc826118f4565b600883901c6000908152600460205260409020548390600160ff83161b16610ebf576040517f4e28dd3300000000000000000000000000000000000000000000000000000000815260048101829052602401610533565b610ec982336118a6565b610f10576040517f33d9226d0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152336024820152604401610533565b60008481526005602090815260408083206001600160a01b038616845290915290205483811015610f86576040517f38cb6d310000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024810186905260448101829052606401610533565b60008581526005602090815260408083206001600160a01b0387168085529083528184208054899003905581518981529283018890529133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b600883901c6000908152600460205260409020548390600160ff83161b16611048576040517f4e28dd3300000000000000000000000000000000000000000000000000000000815260048101829052602401610533565b600084815260076020526040902054339085906001600160a01b031682146110ae576040517f8725edad0000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260248101829052604401610533565b60008681526005602090815260408083206001600160a01b03881680855290835281842080548a01905581518a8152928301899052929133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4505050505050565b3361112d6002546001600160a01b031690565b6001600160a01b03161461116f576040517f55932a1b000000000000000000000000000000000000000000000000000000008152336004820152602401610533565b600882901c6000908152600460205260409020548290600160ff83161b166111c6576040517f4e28dd3300000000000000000000000000000000000000000000000000000000815260048101829052602401610533565b5060009182526007602052604090912080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909216919091179055565b81611217816117b8565b336001600160a01b038416810361125a576040517f853c4cc600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381811660008181526006602090815260408083209489168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001688151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a350505050565b336112f96002546001600160a01b031690565b6001600160a01b03161461133b576040517f55932a1b000000000000000000000000000000000000000000000000000000008152336004820152602401610533565b600882901c600090815260046020526040902054600160ff84161b1615611391576040517f469b8e4500000000000000000000000000000000000000000000000000000000815260048101839052602401610533565b600882901c60009081526004602052604090208054600160ff85161b17905560009182526007602052604090912080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909216919091179055565b336114096002546001600160a01b031690565b6001600160a01b03161461144b576040517f55932a1b000000000000000000000000000000000000000000000000000000008152336004820152602401610533565b6114558282611aa4565b5050565b600884901c6000908152600460205260409020548490600160ff83161b166114b0576040517f4e28dd3300000000000000000000000000000000000000000000000000000000815260048101829052602401610533565b866001600160a01b03811633146114ca576114ca336117b8565b6001600160a01b03871661150a576040517ff5d8ca3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3361151589826118a6565b61155e576040517f33d9226d0000000000000000000000000000000000000000000000000000000081526001600160a01b03808b16600483015282166024820152604401610533565b60008781526005602090815260408083206001600160a01b038d168452909152902054868110156115d4576040517f38cb6d310000000000000000000000000000000000000000000000000000000081526001600160a01b038b1660048201526024810189905260448101829052606401610533565b60008881526005602090815260408083206001600160a01b038e8116855292528083208a85039055908b168252812080548992906116139084906124bc565b909155505060408051898152602081018990526001600160a01b03808c16928d821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46116a9828b8b8b8b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b2892505050565b50505050505050505050565b336116c86002546001600160a01b031690565b6001600160a01b03161461170a576040517f55932a1b000000000000000000000000000000000000000000000000000000008152336004820152602401610533565b600280546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a90048061178e5750819003601f19909101908152919050565b6daaeb6d7670e522a718067333cd4e3b156118a3576040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa15801561183e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611862919061254c565b6118a3576040517fede71dcc0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610533565b50565b6000816001600160a01b0316836001600160a01b031614806118ed57506001600160a01b0380841660009081526006602090815260408083209386168352929052205460ff165b9392505050565b600881901c600090815260046020526040812054600160ff84161b1615156106dc565b833b8015611a9b576040517fbc197c810000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063bc197c819061196c908a908a90899089908990600401612569565b6020604051808303816000875af19250505080156119a7575060408051601f3d908101601f191682019092526119a4918101906125c7565b60015b611a1e573d8080156119d5576040519150601f19603f3d011682016040523d82523d6000602084013e6119da565b606091505b508051600003611a16576040517fc52ab55f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014611a99576040517fc52ab55f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b50505050505050565b612710811115611aeb576040517f4ec3fd3a000000000000000000000000000000000000000000000000000000008152600481018290526127106024820152604401610533565b600055600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b833b8015611a9b576040517ff23a6e610000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063f23a6e6190611b7d908a908a908990899089906004016125e4565b6020604051808303816000875af1925050508015611bb8575060408051601f3d908101601f19168201909252611bb5918101906125c7565b60015b611be6573d8080156119d5576040519150601f19603f3d011682016040523d82523d6000602084013e6119da565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014611a99576040517fc52ab55f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b0381168114611c7857600080fd5b919050565b60008060408385031215611c9057600080fd5b611c9983611c61565b946020939093013593505050565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146118a357600080fd5b600060208284031215611ce757600080fd5b81356118ed81611ca7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215611d3357600080fd5b813567ffffffffffffffff80821115611d4b57600080fd5b818401915084601f830112611d5f57600080fd5b813581811115611d7157611d71611cf2565b604051601f8201601f19908116603f01168101908382118183101715611d9957611d99611cf2565b81604052828152876020848701011115611db257600080fd5b826020860160208301376000928101602001929092525095945050505050565b60005b83811015611ded578181015183820152602001611dd5565b50506000910152565b60008151808452611e0e816020860160208601611dd2565b601f01601f19169290920160200192915050565b6020815260006118ed6020830184611df6565b600060208284031215611e4757600080fd5b5035919050565b60008060408385031215611e6157600080fd5b50508035926020909101359150565b60008083601f840112611e8257600080fd5b50813567ffffffffffffffff811115611e9a57600080fd5b6020830191508360208260051b850101111561088c57600080fd5b60008083601f840112611ec757600080fd5b50813567ffffffffffffffff811115611edf57600080fd5b60208301915083602082850101111561088c57600080fd5b60008060008060008060008060a0898b031215611f1357600080fd5b611f1c89611c61565b9750611f2a60208a01611c61565b9650604089013567ffffffffffffffff80821115611f4757600080fd5b611f538c838d01611e70565b909850965060608b0135915080821115611f6c57600080fd5b611f788c838d01611e70565b909650945060808b0135915080821115611f9157600080fd5b50611f9e8b828c01611eb5565b999c989b5096995094979396929594505050565b60008060008060408587031215611fc857600080fd5b843567ffffffffffffffff80821115611fe057600080fd5b611fec88838901611e70565b9096509450602087013591508082111561200557600080fd5b5061201287828801611e70565b95989497509550505050565b600081518084526020808501945080840160005b8381101561204e57815187529582019590820190600101612032565b509495945050505050565b6020815260006118ed602083018461201e565b60008060006060848603121561208157600080fd5b833592506020840135915061209860408501611c61565b90509250925092565b600080604083850312156120b457600080fd5b823591506120c460208401611c61565b90509250929050565b80151581146118a357600080fd5b600080604083850312156120ee57600080fd5b6120f783611c61565b91506020830135612107816120cd565b809150509250929050565b6000806040838503121561212557600080fd5b61212e83611c61565b91506120c460208401611c61565b60008060008060008060a0878903121561215557600080fd5b61215e87611c61565b955061216c60208801611c61565b94506040870135935060608701359250608087013567ffffffffffffffff81111561219657600080fd5b6121a289828a01611eb5565b979a9699509497509295939492505050565b6000602082840312156121c657600080fd5b6118ed82611c61565b600181811c908216806121e357607f821691505b60208210810361082d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f82111561226657600081815260208120601f850160051c810160208610156122435750805b601f850160051c820191505b818110156122625782815560010161224f565b5050505b505050565b815167ffffffffffffffff81111561228557612285611cf2565b6122998161229384546121cf565b8461221c565b602080601f8311600181146122ec57600084156122b65750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612262565b600085815260208120601f198616915b8281101561231b578886015182559484019460019091019084016122fc565b508582101561235757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000808454612375816121cf565b6001828116801561238d57600181146123c0576123ef565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00841687528215158302870194506123ef565b8860005260208060002060005b858110156123e65781548a8201529084019082016123cd565b50505082870194505b505050508351612403818360208801611dd2565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820281158282048414176106dc576106dc61240c565b600082612488577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b808201808211156106dc576106dc61240c565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561250157600080fd5b8260051b80836020870137939093016020019392505050565b60408152600061252e6040830186886124cf565b82810360208401526125418185876124cf565b979650505050505050565b60006020828403121561255e57600080fd5b81516118ed816120cd565b60006001600160a01b03808816835280871660208401525060a0604083015261259560a083018661201e565b82810360608401526125a7818661201e565b905082810360808401526125bb8185611df6565b98975050505050505050565b6000602082840312156125d957600080fd5b81516118ed81611ca7565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261254160a0830184611df656fea26469706673582212207fe6c4ec0c7e4f0925b280a6ed797e14b929810e8c74ba0475c3db4c57e5b47f64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f0dc5a298a1ae12973723c3b83e16790baa96cc4
-----Decoded View---------------
Arg [0] : royaltyRecipent_ (address): 0xF0dc5A298a1AE12973723C3b83e16790baA96Cc4
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000f0dc5a298a1ae12973723c3b83e16790baa96cc4
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.