Feature Tip: Add private address tag to any address under My Name Tag !
Overview
TokenID
1827
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
PEPEEmbryos
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.18; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; import "./lib/ERC721A.sol"; import "./interfaces/IERC6551Registry.sol"; import "./interfaces/IERC2981.sol"; import "./lib/ERC2981.sol"; import "./lib/ERC721Royalty.sol"; contract PEPEEmbryos is ERC721A, Ownable, ERC721Royalty { bool public paused; bool public saleIsActive; uint256 private _salt = 490; string private _baseURIextended; uint256 public MAX_SUPPLY; /// @custom:precision 18 uint256 public wlPrice; bool public isWLMintOn; uint256 public currentPrice; uint256 public walletLimit; address public erc6551Registry; address public accountImplementation; bool public isFreeMintOn; uint256 public freeMintLimit; mapping(address => uint256) public freeMintedByUser; mapping(address => bool) public isWhitelistedUser; /** * @param _name NFT Name * @param _symbol NFT Symbol * @param _uri Token URI used for metadata * @param limit Wallet Limit * @param price Initial Price | precision:18 * @param maxSupply Maximum # of NFTs */ constructor( string memory _name, string memory _symbol, string memory _uri, uint256 limit, uint256 price, uint256 maxSupply, address _receiver, uint96 feeNumerator ) payable ERC721A(_name, _symbol) { _baseURIextended = _uri; currentPrice = price; walletLimit = limit; MAX_SUPPLY = maxSupply; isFreeMintOn = true; freeMintLimit = 10; _setDefaultRoyalty(_receiver, feeNumerator); } /** * @dev An external method for users to purchase and mint NFTs. Requires that the sale * is active, that the minted NFTs will not exceed the `MAX_SUPPLY`, and that a * sufficient payable value is sent. * @param amount The number of NFTs to mint. */ function publicMint(uint256 amount) external payable { uint256 ts = totalSupply(); // uint256 minted = _numberMinted(msg.sender); require(saleIsActive, "Sale must be active to mint tokens"); require(ts + amount <= MAX_SUPPLY, "Purchase would exceed max tokens"); require( currentPrice * amount == msg.value, "Sent value is not correct" ); _mint(amount, ts); } /** * @dev An external method for users to mint NFTs in free phase. * @param amount The number of NFTs to mint. */ function freeMint(uint256 amount) external { uint256 ts = totalSupply(); require(isFreeMintOn, "Free mint is diabled."); require( amount + freeMintedByUser[msg.sender] <= freeMintLimit, "Exceeds free limit" ); require(ts + amount <= MAX_SUPPLY, "Purchase would exceed max tokens"); _mint(amount, ts); freeMintedByUser[msg.sender] += amount; } /** * @dev An external method for whilteliste users to mint NFTs. * @param amount The number of NFTs to mint. */ function wlMint(uint256 amount) external payable { uint256 ts = totalSupply(); require(isWLMintOn, "WL mint is disabled."); require(isWhitelistedUser[msg.sender], "Address != whitelisted"); require(ts + amount <= MAX_SUPPLY, "Purchase would exceed max tokens"); require(wlPrice * amount == msg.value, "Sent value is not correct"); _mint(amount, ts); } function _mint(uint256 _amount, uint256 _ts) internal { require(!paused, "MINTING: Paused!"); _safeMint(msg.sender, _amount); for (uint256 i = 0; i < _amount; i++) { IERC6551Registry(erc6551Registry).createAccount( accountImplementation, getChainID(), address(this), _ts + i, _salt, "" ); } } function burn(uint256 tokenId) external { require(_exists(tokenId), "Invalid Id!"); require(ownerOf(tokenId) == msg.sender, "Not a NFT Owner"); _burn(tokenId); } /** * @dev A way for the owner to reserve a specifc number of NFTs without having to * interact with the sale. * @param to The address to send reserved NFTs to. * @param amount The number of NFTs to reserve. */ function reserve(address to, uint256 amount) external onlyOwner { uint256 ts = totalSupply(); require(ts + amount <= MAX_SUPPLY, "Purchase would exceed max tokens"); _safeMint(to, amount); } /** * @dev A way for the owner to withdraw all proceeds from the sale. */ function withdraw() external onlyOwner { uint256 balance = address(this).balance; payable(msg.sender).transfer(balance); } /** * @dev Sets whether or not the NFT sale is active. * @param isActive Whether or not the sale will be active. */ function setSaleIsActive(bool isActive) external onlyOwner { saleIsActive = isActive; } function setFreeMintLimit(uint256 _limit) external onlyOwner { freeMintLimit = _limit; } function setPauseStatus(bool _status) external onlyOwner { paused = _status; } function setWhitelistUsersStatus( address[] memory _users, bool _status ) external onlyOwner { for (uint256 i; i < _users.length; i++) { isWhitelistedUser[_users[i]] = _status; } } /** * @dev Sets the price of each NFT during the initial sale. * @param price The price of each NFT during the initial sale | precision:18 */ function setCurrentPrice(uint256 price) external onlyOwner { currentPrice = price; } /** * @dev Sets the price of each NFT for whitelisted users. * @param price The price of each NFT precision:18 */ function setWLPrice(uint256 price) external onlyOwner { wlPrice = price; } /** * @dev Sets the address of erc6551 registry contract * @param _addr new address of ERC6551 Registry contract */ function setRegistryAddress(address _addr) external onlyOwner { erc6551Registry = _addr; } /** * @dev Sets the address of erc6551 Implementation contract * @param _addr new address of implementation contract */ function setImplementationAddress(address _addr) external onlyOwner { accountImplementation = _addr; } /** * @dev Sets the maximum number of NFTs that can be sold to a specific address. * @param limit The maximum number of NFTs that be bought by a wallet. */ function setWalletLimit(uint256 limit) external onlyOwner { walletLimit = limit; } /** * @dev Updates the Roaylaty fee for NFT. * @param _receiver New Receiver of royalty. * @param feeNumerator Roaylaty Fee. */ function setFeeInfo( address _receiver, uint96 feeNumerator ) external onlyOwner { _setDefaultRoyalty(_receiver, feeNumerator); } /** * @dev Updates the baseURI that will be used to retrieve NFT metadata. * @param baseURI_ The baseURI to be used. */ function setBaseURI(string memory baseURI_) external onlyOwner { _baseURIextended = baseURI_; } function updateFreeMintStatus(bool status) external onlyOwner { isFreeMintOn = status; } function updateWLMintStatus(bool status) external onlyOwner { isWLMintOn = status; } function updateAccountSalt(uint256 _slt) external onlyOwner { _salt = _slt; } function _baseURI() internal view virtual override returns (string memory) { return _baseURIextended; } function supportsInterface( bytes4 interfaceId ) public view override(ERC721A, ERC721Royalty) returns (bool) { return super.supportsInterface(interfaceId); } function getChainID() public view returns (uint256) { uint256 id; assembly { id := chainid() } return id; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./extensions/IERC721Metadata.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/Strings.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {} /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such * that `ownerOf(tokenId)` is `a`. */ // solhint-disable-next-line func-name-mixedcase function __unsafe_increaseBalance(address account, uint256 amount) internal { _balances[account] += amount; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; import "../ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev See {ERC721-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual override { super._beforeTokenTransfer(from, to, firstTokenId, batchSize); if (batchSize > 1) { // Will only trigger during construction. Batch transferring (minting) is not available afterwards. revert("ERC721Enumerable: consecutive transfers not supported"); } uint256 tokenId = firstTokenId; if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./math/Math.sol"; import "./math/SignedMath.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo( uint256 tokenId, uint256 salePrice ) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IERC6551Registry { event AccountCreated( address account, address implementation, uint256 chainId, address tokenContract, uint256 tokenId, uint256 salt ); function createAccount( address implementation, uint256 chainId, address tokenContract, uint256 tokenId, uint256 seed, bytes calldata initData ) external returns (address); function account( address implementation, uint256 chainId, address tokenContract, uint256 tokenId, uint256 salt ) external view returns (address); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../interfaces/IERC2981.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface( bytes4 interfaceId ) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo( uint256 tokenId, uint256 salePrice ) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty( address receiver, uint96 feeNumerator ) internal virtual { require( feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice" ); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require( feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice" ); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "@openzeppelin/contracts/utils/Context.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface( bytes4 interfaceId ) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf( uint256 tokenId ) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI( uint256 tokenId ) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved( uint256 tokenId ) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll( address operator, bool approved ) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll( address owner, address operator ) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if ( to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data) ) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if ( !_checkContractOnERC721Received( address(0), to, updatedIndex++, _data ) ) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev This is equivalent to _burn(tokenId, false) */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId, address owner) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC2981.sol"; import "./ERC721A.sol"; abstract contract ERC721Royalty is ERC2981, ERC721A { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface( bytes4 interfaceId ) public view virtual override(ERC721A, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "berlin", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"uint256","name":"limit","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"stateMutability":"payable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accountImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"erc6551Registry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMintedByUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"isFreeMintOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWLMintOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelistedUser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setCurrentPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setFeeInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setFreeMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setImplementationAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setPauseStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setRegistryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isActive","type":"bool"}],"name":"setSaleIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setWLPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setWhitelistUsersStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_slt","type":"uint256"}],"name":"updateAccountSalt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"updateFreeMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"updateWLMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"walletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"wlMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"wlPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526101ea600b5560405162002dd338038062002dd38339810160408190526200002c91620002ff565b878760046200003c838262000462565b5060056200004b828262000462565b50506000600255506200005e33620000ae565b600c6200006c878262000462565b5060108490556011859055600d8390556013805460ff60a01b1916600160a01b179055600a601455620000a0828262000100565b50505050505050506200052e565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6127106001600160601b0382161115620001745760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084015b60405180910390fd5b6001600160a01b038216620001cc5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016200016b565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600055565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200022d57600080fd5b81516001600160401b03808211156200024a576200024a62000205565b604051601f8301601f19908116603f0116810190828211818310171562000275576200027562000205565b816040528381526020925086838588010111156200029257600080fd5b600091505b83821015620002b6578582018301518183018401529082019062000297565b600093810190920192909252949350505050565b80516001600160a01b0381168114620002e257600080fd5b919050565b80516001600160601b0381168114620002e257600080fd5b600080600080600080600080610100898b0312156200031d57600080fd5b88516001600160401b03808211156200033557600080fd5b620003438c838d016200021b565b995060208b01519150808211156200035a57600080fd5b620003688c838d016200021b565b985060408b01519150808211156200037f57600080fd5b506200038e8b828c016200021b565b965050606089015194506080890151935060a08901519250620003b460c08a01620002ca565b9150620003c460e08a01620002e7565b90509295985092959890939650565b600181811c90821680620003e857607f821691505b6020821081036200040957634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200045d57600081815260208120601f850160051c81016020861015620004385750805b601f850160051c820191505b81811015620004595782815560010162000444565b5050505b505050565b81516001600160401b038111156200047e576200047e62000205565b62000496816200048f8454620003d3565b846200040f565b602080601f831160018114620004ce5760008415620004b55750858301515b600019600386901b1c1916600185901b17855562000459565b600085815260208120601f198616915b82811015620004ff57888601518255948401946001909101908401620004de565b50858210156200051e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612895806200053e6000396000f3fe6080604052600436106102ff5760003560e01c80637c928fe911610190578063c87b56dd116100dc578063ecade2f011610095578063f2fde38b1161006f578063f2fde38b146108ec578063f34e4bdc1461090c578063f6a5b8e614610939578063fa02b8671461095957600080fd5b8063ecade2f01461088c578063f07b92cd146108ac578063f1d5f517146108cc57600080fd5b8063c87b56dd146107bb578063cc47a40b146107db578063d46e0aab146107fb578063d88c271e1461081b578063e985e9c51461084b578063eb8d24441461086b57600080fd5b8063a1ca2a5711610149578063b88d4fde11610123578063b88d4fde14610745578063bd2f6eb814610765578063c38bb53714610785578063c7f8d01a146107a557600080fd5b8063a1ca2a57146106e4578063a22cb46514610705578063ab7b49931461072557600080fd5b80637c928fe91461063b57806385faec0f1461065b5780638da5cb5b1461067b57806395d89b411461069957806399b2b20a146106ae5780639d1b464a146106ce57600080fd5b806332cb6b0c1161024f57806355f804b3116102085780636352211e116101e25780636352211e146105d35780636aabb947146105f357806370a0823114610606578063715018a61461062657600080fd5b806355f804b31461057f578063564b81ef1461059f5780635c975abb146105b257600080fd5b806332cb6b0c146104e45780633c8463a1146104fa5780633ccfd60b146105105780633dc7fdd61461052557806342842e0e1461053f57806342966c681461055f57600080fd5b8063095ea7b3116102bc57806318b200711161029657806318b200711461045257806323b872dd146104725780632a55205a146104925780632db11544146104d157600080fd5b8063095ea7b3146103f957806311464fbe1461041957806318160ddd1461043957600080fd5b806301ffc9a71461030457806302c8898914610339578063056d5afe1461035b57806306fdde0314610393578063081812fc146103b557806308346d85146103d5575b600080fd5b34801561031057600080fd5b5061032461031f366004612133565b610979565b60405190151581526020015b60405180910390f35b34801561034557600080fd5b50610359610354366004612165565b61098a565b005b34801561036757600080fd5b5060125461037b906001600160a01b031681565b6040516001600160a01b039091168152602001610330565b34801561039f57600080fd5b506103a86109b0565b60405161033091906121d0565b3480156103c157600080fd5b5061037b6103d03660046121e3565b610a42565b3480156103e157600080fd5b506103eb60145481565b604051908152602001610330565b34801561040557600080fd5b50610359610414366004612211565b610a86565b34801561042557600080fd5b5060135461037b906001600160a01b031681565b34801561044557600080fd5b50600354600254036103eb565b34801561045e57600080fd5b5061035961046d3660046121e3565b610b13565b34801561047e57600080fd5b5061035961048d36600461223d565b610b20565b34801561049e57600080fd5b506104b26104ad36600461227e565b610b2b565b604080516001600160a01b039093168352602083019190915201610330565b6103596104df3660046121e3565b610bd7565b3480156104f057600080fd5b506103eb600d5481565b34801561050657600080fd5b506103eb60115481565b34801561051c57600080fd5b50610359610ce7565b34801561053157600080fd5b50600f546103249060ff1681565b34801561054b57600080fd5b5061035961055a36600461223d565b610d1e565b34801561056b57600080fd5b5061035961057a3660046121e3565b610d39565b34801561058b57600080fd5b5061035961059a36600461233d565b610dda565b3480156105ab57600080fd5b50466103eb565b3480156105be57600080fd5b50600a5461032490600160a01b900460ff1681565b3480156105df57600080fd5b5061037b6105ee3660046121e3565b610dee565b6103596106013660046121e3565b610e00565b34801561061257600080fd5b506103eb610621366004612385565b610eed565b34801561063257600080fd5b50610359610f3b565b34801561064757600080fd5b506103596106563660046121e3565b610f4f565b34801561066757600080fd5b506103596106763660046121e3565b61106f565b34801561068757600080fd5b50600a546001600160a01b031661037b565b3480156106a557600080fd5b506103a861107c565b3480156106ba57600080fd5b506103596106c93660046123a2565b61108b565b3480156106da57600080fd5b506103eb60105481565b3480156106f057600080fd5b5060135461032490600160a01b900460ff1681565b34801561071157600080fd5b506103596107203660046123e7565b61109d565b34801561073157600080fd5b50610359610740366004612385565b611132565b34801561075157600080fd5b5061035961076036600461241c565b61115c565b34801561077157600080fd5b506103596107803660046121e3565b6111ad565b34801561079157600080fd5b506103596107a0366004612165565b6111ba565b3480156107b157600080fd5b506103eb600e5481565b3480156107c757600080fd5b506103a86107d63660046121e3565b6111e0565b3480156107e757600080fd5b506103596107f6366004612211565b611264565b34801561080757600080fd5b5061035961081636600461249b565b6112b3565b34801561082757600080fd5b50610324610836366004612385565b60166020526000908152604090205460ff1681565b34801561085757600080fd5b5061032461086636600461255e565b611322565b34801561087757600080fd5b50600a5461032490600160a81b900460ff1681565b34801561089857600080fd5b506103596108a7366004612385565b611350565b3480156108b857600080fd5b506103596108c7366004612165565b61137a565b3480156108d857600080fd5b506103596108e73660046121e3565b6113a0565b3480156108f857600080fd5b50610359610907366004612385565b6113ad565b34801561091857600080fd5b506103eb610927366004612385565b60156020526000908152604090205481565b34801561094557600080fd5b506103596109543660046121e3565b611423565b34801561096557600080fd5b50610359610974366004612165565b611430565b60006109848261144b565b92915050565b610992611456565b600a8054911515600160a81b0260ff60a81b19909216919091179055565b6060600480546109bf9061258c565b80601f01602080910402602001604051908101604052809291908181526020018280546109eb9061258c565b8015610a385780601f10610a0d57610100808354040283529160200191610a38565b820191906000526020600020905b815481529060010190602001808311610a1b57829003601f168201915b5050505050905090565b6000610a4d826114b0565b610a6a576040516333d1c03960e21b815260040160405180910390fd5b506000908152600860205260409020546001600160a01b031690565b6000610a9182610dee565b9050806001600160a01b0316836001600160a01b031603610ac55760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610ae55750610ae38133611322565b155b15610b03576040516367d9dca160e11b815260040160405180910390fd5b610b0e8383836114dc565b505050565b610b1b611456565b601055565b610b0e838383611538565b60008281526001602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610ba05750604080518082019091526000546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610bbf906001600160601b0316876125dc565b610bc991906125f3565b915196919550909350505050565b6000610be66003546002540390565b600a54909150600160a81b900460ff16610c525760405162461bcd60e51b815260206004820152602260248201527f53616c65206d7573742062652061637469766520746f206d696e7420746f6b656044820152616e7360f01b60648201526084015b60405180910390fd5b600d54610c5f8383612615565b1115610c7d5760405162461bcd60e51b8152600401610c4990612628565b3482601054610c8c91906125dc565b14610cd95760405162461bcd60e51b815260206004820152601960248201527f53656e742076616c7565206973206e6f7420636f7272656374000000000000006044820152606401610c49565b610ce38282611714565b5050565b610cef611456565b6040514790339082156108fc029083906000818181858888f19350505050158015610ce3573d6000803e3d6000fd5b610b0e8383836040518060200160405280600081525061115c565b610d42816114b0565b610d7c5760405162461bcd60e51b815260206004820152600b60248201526a496e76616c69642049642160a81b6044820152606401610c49565b33610d8682610dee565b6001600160a01b031614610dce5760405162461bcd60e51b815260206004820152600f60248201526e2737ba10309027232a1027bbb732b960891b6044820152606401610c49565b610dd781611847565b50565b610de2611456565b600c610ce382826126ab565b6000610df982611852565b5192915050565b6000610e0f6003546002540390565b600f5490915060ff16610e5b5760405162461bcd60e51b81526020600482015260146024820152732ba61036b4b73a1034b9903234b9b0b13632b21760611b6044820152606401610c49565b3360009081526016602052604090205460ff16610eb35760405162461bcd60e51b81526020600482015260166024820152751059191c995cdcc8084f481dda1a5d195b1a5cdd195960521b6044820152606401610c49565b600d54610ec08383612615565b1115610ede5760405162461bcd60e51b8152600401610c4990612628565b3482600e54610c8c91906125dc565b60006001600160a01b038216610f16576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600760205260409020546001600160401b031690565b610f43611456565b610f4d600061196c565b565b6000610f5e6003546002540390565b601354909150600160a01b900460ff16610fb25760405162461bcd60e51b8152602060048201526015602482015274233932b29036b4b73a1034b9903234b0b13632b21760591b6044820152606401610c49565b60145433600090815260156020526040902054610fcf9084612615565b11156110125760405162461bcd60e51b8152602060048201526012602482015271115e18d959591cc8199c9959481b1a5b5a5d60721b6044820152606401610c49565b600d5461101f8383612615565b111561103d5760405162461bcd60e51b8152600401610c4990612628565b6110478282611714565b3360009081526015602052604081208054849290611066908490612615565b90915550505050565b611077611456565b600b55565b6060600580546109bf9061258c565b611093611456565b610ce382826119be565b336001600160a01b038316036110c65760405163b06307db60e01b815260040160405180910390fd5b3360008181526009602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61113a611456565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b611167848484611538565b6001600160a01b0383163b15158015611189575061118784848484611abb565b155b156111a7576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6111b5611456565b601455565b6111c2611456565b600a8054911515600160a01b0260ff60a01b19909216919091179055565b60606111eb826114b0565b61120857604051630a14c4b560e41b815260040160405180910390fd5b6000611212611ba7565b90508051600003611232576040518060200160405280600081525061125d565b8061123c84611bb6565b60405160200161124d92919061276a565b6040516020818303038152906040525b9392505050565b61126c611456565b600061127b6003546002540390565b600d5490915061128b8383612615565b11156112a95760405162461bcd60e51b8152600401610c4990612628565b610b0e8383611c48565b6112bb611456565b60005b8251811015610b0e5781601660008584815181106112de576112de612799565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061131a816127af565b9150506112be565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b611358611456565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b611382611456565b60138054911515600160a01b0260ff60a01b19909216919091179055565b6113a8611456565b601155565b6113b5611456565b6001600160a01b03811661141a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c49565b610dd78161196c565b61142b611456565b600e55565b611438611456565b600f805460ff1916911515919091179055565b600061098482611c62565b600a546001600160a01b03163314610f4d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c49565b600060025482108015610984575050600090815260066020526040902054600160e01b900460ff161590565b60008281526008602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061154382611852565b9050836001600160a01b031681600001516001600160a01b03161461157a5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061159857506115988533611322565b806115b35750336115a884610a42565b6001600160a01b0316145b9050806115d357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0384166115fa57604051633a954ecd60e21b815260040160405180910390fd5b611606600084876114dc565b6001600160a01b038581166000908152600760209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600690945282852080546001600160e01b031916909417600160a01b429092169190910217835587018084529220805491939091166116da5760025482146116da57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b031660008051602061284083398151915260405160405180910390a45b5050505050565b600a54600160a01b900460ff16156117615760405162461bcd60e51b815260206004820152601060248201526f4d494e54494e473a205061757365642160801b6044820152606401610c49565b61176b3383611c48565b60005b82811015610b0e576012546013546001600160a01b039182169163da7323b39116463061179b8688612615565b600b546040516001600160e01b031960e088901b1681526001600160a01b03958616600482015260248101949094529390911660448301526064820152608481019190915260c060a4820152600060c482015260e4016020604051808303816000875af1158015611810573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183491906127c8565b508061183f816127af565b91505061176e565b610dd7816000611ca2565b60408051606081018252600080825260208201819052918101919091528160025481101561195357600081815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906119515780516001600160a01b0316156118e8579392505050565b5060001901600081815260066020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff161515928101929092521561194c579392505050565b6118e8565b505b604051636f96cda160e11b815260040160405180910390fd5b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6127106001600160601b0382161115611a2c5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610c49565b6001600160a01b038216611a825760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610c49565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600055565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611af09033908990889088906004016127e5565b6020604051808303816000875af1925050508015611b2b575060408051601f3d908101601f19168201909252611b2891810190612822565b60015b611b89573d808015611b59576040519150601f19603f3d011682016040523d82523d6000602084013e611b5e565b606091505b508051600003611b81576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600c80546109bf9061258c565b60606000611bc383611e56565b60010190506000816001600160401b03811115611be257611be26122a0565b6040519080825280601f01601f191660200182016040528015611c0c576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611c1657509392505050565b610ce3828260405180602001604052806000815250611f2e565b60006001600160e01b031982166380ac58cd60e01b1480611c9357506001600160e01b03198216635b5e139f60e01b145b80610984575061098482611f3b565b6000611cad83611852565b80519091508215611d13576000336001600160a01b0383161480611cd65750611cd68233611322565b80611cf1575033611ce686610a42565b6001600160a01b0316145b905080611d1157604051632ce44b5f60e11b815260040160405180910390fd5b505b611d1f600085836114dc565b6001600160a01b0380821660008181526007602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526006909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b178555918901808452922080549194909116611e1d576002548214611e1d57805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b03841690600080516020612840833981519152908390a450506003805460010190555050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611e955772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611ec1576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611edf57662386f26fc10000830492506010015b6305f5e1008310611ef7576305f5e100830492506008015b6127108310611f0b57612710830492506004015b60648310611f1d576064830492506002015b600a83106109845760010192915050565b610b0e8383836001611f70565b60006001600160e01b0319821663152a902d60e11b148061098457506301ffc9a760e01b6001600160e01b0319831614610984565b6002546001600160a01b038516611f9957604051622e076360e81b815260040160405180910390fd5b83600003611fba5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260076020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600690925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561206b57506001600160a01b0387163b15155b156120e1575b60405182906001600160a01b03891690600090600080516020612840833981519152908290a46120aa6000888480600101955088611abb565b6120c7576040516368d2bf6b60e11b815260040160405180910390fd5b8082036120715782600254146120dc57600080fd5b612114565b5b6040516001830192906001600160a01b03891690600090600080516020612840833981519152908290a48082036120e2575b5060025561170d565b6001600160e01b031981168114610dd757600080fd5b60006020828403121561214557600080fd5b813561125d8161211d565b8035801515811461216057600080fd5b919050565b60006020828403121561217757600080fd5b61125d82612150565b60005b8381101561219b578181015183820152602001612183565b50506000910152565b600081518084526121bc816020860160208601612180565b601f01601f19169290920160200192915050565b60208152600061125d60208301846121a4565b6000602082840312156121f557600080fd5b5035919050565b6001600160a01b0381168114610dd757600080fd5b6000806040838503121561222457600080fd5b823561222f816121fc565b946020939093013593505050565b60008060006060848603121561225257600080fd5b833561225d816121fc565b9250602084013561226d816121fc565b929592945050506040919091013590565b6000806040838503121561229157600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156122de576122de6122a0565b604052919050565b60006001600160401b038311156122ff576122ff6122a0565b612312601f8401601f19166020016122b6565b905082815283838301111561232657600080fd5b828260208301376000602084830101529392505050565b60006020828403121561234f57600080fd5b81356001600160401b0381111561236557600080fd5b8201601f8101841361237657600080fd5b611b9f848235602084016122e6565b60006020828403121561239757600080fd5b813561125d816121fc565b600080604083850312156123b557600080fd5b82356123c0816121fc565b915060208301356001600160601b03811681146123dc57600080fd5b809150509250929050565b600080604083850312156123fa57600080fd5b8235612405816121fc565b915061241360208401612150565b90509250929050565b6000806000806080858703121561243257600080fd5b843561243d816121fc565b9350602085013561244d816121fc565b92506040850135915060608501356001600160401b0381111561246f57600080fd5b8501601f8101871361248057600080fd5b61248f878235602084016122e6565b91505092959194509250565b600080604083850312156124ae57600080fd5b82356001600160401b03808211156124c557600080fd5b818501915085601f8301126124d957600080fd5b81356020828211156124ed576124ed6122a0565b8160051b92506124fe8184016122b6565b828152928401810192818101908985111561251857600080fd5b948201945b848610156125425785359350612532846121fc565b838252948201949082019061251d565b96506125519050878201612150565b9450505050509250929050565b6000806040838503121561257157600080fd5b823561257c816121fc565b915060208301356123dc816121fc565b600181811c908216806125a057607f821691505b6020821081036125c057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610984576109846125c6565b60008261261057634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610984576109846125c6565b6020808252818101527f507572636861736520776f756c6420657863656564206d617820746f6b656e73604082015260600190565b601f821115610b0e57600081815260208120601f850160051c810160208610156126845750805b601f850160051c820191505b818110156126a357828155600101612690565b505050505050565b81516001600160401b038111156126c4576126c46122a0565b6126d8816126d2845461258c565b8461265d565b602080601f83116001811461270d57600084156126f55750858301515b600019600386901b1c1916600185901b1785556126a3565b600085815260208120601f198616915b8281101561273c5788860151825594840194600190910190840161271d565b508582101561275a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000835161277c818460208801612180565b835190830190612790818360208801612180565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b6000600182016127c1576127c16125c6565b5060010190565b6000602082840312156127da57600080fd5b815161125d816121fc565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612818908301846121a4565b9695505050505050565b60006020828403121561283457600080fd5b815161125d8161211d56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220b09e2d3d9e5b223d4ea8ae29487c8f0cb845fc463a66cd10400e1f8bb301b17e64736f6c63430008120033000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011040000000000000000000000000d9b59d8f9620318bb05f7bf300d8121634491d7000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000000c5045504520456d6272796f73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045045504500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002968747470733a2f2f6d696e742e6c6966656f66706570652e636f6d2f706570652d6e66742d6170692f0000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102ff5760003560e01c80637c928fe911610190578063c87b56dd116100dc578063ecade2f011610095578063f2fde38b1161006f578063f2fde38b146108ec578063f34e4bdc1461090c578063f6a5b8e614610939578063fa02b8671461095957600080fd5b8063ecade2f01461088c578063f07b92cd146108ac578063f1d5f517146108cc57600080fd5b8063c87b56dd146107bb578063cc47a40b146107db578063d46e0aab146107fb578063d88c271e1461081b578063e985e9c51461084b578063eb8d24441461086b57600080fd5b8063a1ca2a5711610149578063b88d4fde11610123578063b88d4fde14610745578063bd2f6eb814610765578063c38bb53714610785578063c7f8d01a146107a557600080fd5b8063a1ca2a57146106e4578063a22cb46514610705578063ab7b49931461072557600080fd5b80637c928fe91461063b57806385faec0f1461065b5780638da5cb5b1461067b57806395d89b411461069957806399b2b20a146106ae5780639d1b464a146106ce57600080fd5b806332cb6b0c1161024f57806355f804b3116102085780636352211e116101e25780636352211e146105d35780636aabb947146105f357806370a0823114610606578063715018a61461062657600080fd5b806355f804b31461057f578063564b81ef1461059f5780635c975abb146105b257600080fd5b806332cb6b0c146104e45780633c8463a1146104fa5780633ccfd60b146105105780633dc7fdd61461052557806342842e0e1461053f57806342966c681461055f57600080fd5b8063095ea7b3116102bc57806318b200711161029657806318b200711461045257806323b872dd146104725780632a55205a146104925780632db11544146104d157600080fd5b8063095ea7b3146103f957806311464fbe1461041957806318160ddd1461043957600080fd5b806301ffc9a71461030457806302c8898914610339578063056d5afe1461035b57806306fdde0314610393578063081812fc146103b557806308346d85146103d5575b600080fd5b34801561031057600080fd5b5061032461031f366004612133565b610979565b60405190151581526020015b60405180910390f35b34801561034557600080fd5b50610359610354366004612165565b61098a565b005b34801561036757600080fd5b5060125461037b906001600160a01b031681565b6040516001600160a01b039091168152602001610330565b34801561039f57600080fd5b506103a86109b0565b60405161033091906121d0565b3480156103c157600080fd5b5061037b6103d03660046121e3565b610a42565b3480156103e157600080fd5b506103eb60145481565b604051908152602001610330565b34801561040557600080fd5b50610359610414366004612211565b610a86565b34801561042557600080fd5b5060135461037b906001600160a01b031681565b34801561044557600080fd5b50600354600254036103eb565b34801561045e57600080fd5b5061035961046d3660046121e3565b610b13565b34801561047e57600080fd5b5061035961048d36600461223d565b610b20565b34801561049e57600080fd5b506104b26104ad36600461227e565b610b2b565b604080516001600160a01b039093168352602083019190915201610330565b6103596104df3660046121e3565b610bd7565b3480156104f057600080fd5b506103eb600d5481565b34801561050657600080fd5b506103eb60115481565b34801561051c57600080fd5b50610359610ce7565b34801561053157600080fd5b50600f546103249060ff1681565b34801561054b57600080fd5b5061035961055a36600461223d565b610d1e565b34801561056b57600080fd5b5061035961057a3660046121e3565b610d39565b34801561058b57600080fd5b5061035961059a36600461233d565b610dda565b3480156105ab57600080fd5b50466103eb565b3480156105be57600080fd5b50600a5461032490600160a01b900460ff1681565b3480156105df57600080fd5b5061037b6105ee3660046121e3565b610dee565b6103596106013660046121e3565b610e00565b34801561061257600080fd5b506103eb610621366004612385565b610eed565b34801561063257600080fd5b50610359610f3b565b34801561064757600080fd5b506103596106563660046121e3565b610f4f565b34801561066757600080fd5b506103596106763660046121e3565b61106f565b34801561068757600080fd5b50600a546001600160a01b031661037b565b3480156106a557600080fd5b506103a861107c565b3480156106ba57600080fd5b506103596106c93660046123a2565b61108b565b3480156106da57600080fd5b506103eb60105481565b3480156106f057600080fd5b5060135461032490600160a01b900460ff1681565b34801561071157600080fd5b506103596107203660046123e7565b61109d565b34801561073157600080fd5b50610359610740366004612385565b611132565b34801561075157600080fd5b5061035961076036600461241c565b61115c565b34801561077157600080fd5b506103596107803660046121e3565b6111ad565b34801561079157600080fd5b506103596107a0366004612165565b6111ba565b3480156107b157600080fd5b506103eb600e5481565b3480156107c757600080fd5b506103a86107d63660046121e3565b6111e0565b3480156107e757600080fd5b506103596107f6366004612211565b611264565b34801561080757600080fd5b5061035961081636600461249b565b6112b3565b34801561082757600080fd5b50610324610836366004612385565b60166020526000908152604090205460ff1681565b34801561085757600080fd5b5061032461086636600461255e565b611322565b34801561087757600080fd5b50600a5461032490600160a81b900460ff1681565b34801561089857600080fd5b506103596108a7366004612385565b611350565b3480156108b857600080fd5b506103596108c7366004612165565b61137a565b3480156108d857600080fd5b506103596108e73660046121e3565b6113a0565b3480156108f857600080fd5b50610359610907366004612385565b6113ad565b34801561091857600080fd5b506103eb610927366004612385565b60156020526000908152604090205481565b34801561094557600080fd5b506103596109543660046121e3565b611423565b34801561096557600080fd5b50610359610974366004612165565b611430565b60006109848261144b565b92915050565b610992611456565b600a8054911515600160a81b0260ff60a81b19909216919091179055565b6060600480546109bf9061258c565b80601f01602080910402602001604051908101604052809291908181526020018280546109eb9061258c565b8015610a385780601f10610a0d57610100808354040283529160200191610a38565b820191906000526020600020905b815481529060010190602001808311610a1b57829003601f168201915b5050505050905090565b6000610a4d826114b0565b610a6a576040516333d1c03960e21b815260040160405180910390fd5b506000908152600860205260409020546001600160a01b031690565b6000610a9182610dee565b9050806001600160a01b0316836001600160a01b031603610ac55760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610ae55750610ae38133611322565b155b15610b03576040516367d9dca160e11b815260040160405180910390fd5b610b0e8383836114dc565b505050565b610b1b611456565b601055565b610b0e838383611538565b60008281526001602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610ba05750604080518082019091526000546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610bbf906001600160601b0316876125dc565b610bc991906125f3565b915196919550909350505050565b6000610be66003546002540390565b600a54909150600160a81b900460ff16610c525760405162461bcd60e51b815260206004820152602260248201527f53616c65206d7573742062652061637469766520746f206d696e7420746f6b656044820152616e7360f01b60648201526084015b60405180910390fd5b600d54610c5f8383612615565b1115610c7d5760405162461bcd60e51b8152600401610c4990612628565b3482601054610c8c91906125dc565b14610cd95760405162461bcd60e51b815260206004820152601960248201527f53656e742076616c7565206973206e6f7420636f7272656374000000000000006044820152606401610c49565b610ce38282611714565b5050565b610cef611456565b6040514790339082156108fc029083906000818181858888f19350505050158015610ce3573d6000803e3d6000fd5b610b0e8383836040518060200160405280600081525061115c565b610d42816114b0565b610d7c5760405162461bcd60e51b815260206004820152600b60248201526a496e76616c69642049642160a81b6044820152606401610c49565b33610d8682610dee565b6001600160a01b031614610dce5760405162461bcd60e51b815260206004820152600f60248201526e2737ba10309027232a1027bbb732b960891b6044820152606401610c49565b610dd781611847565b50565b610de2611456565b600c610ce382826126ab565b6000610df982611852565b5192915050565b6000610e0f6003546002540390565b600f5490915060ff16610e5b5760405162461bcd60e51b81526020600482015260146024820152732ba61036b4b73a1034b9903234b9b0b13632b21760611b6044820152606401610c49565b3360009081526016602052604090205460ff16610eb35760405162461bcd60e51b81526020600482015260166024820152751059191c995cdcc8084f481dda1a5d195b1a5cdd195960521b6044820152606401610c49565b600d54610ec08383612615565b1115610ede5760405162461bcd60e51b8152600401610c4990612628565b3482600e54610c8c91906125dc565b60006001600160a01b038216610f16576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600760205260409020546001600160401b031690565b610f43611456565b610f4d600061196c565b565b6000610f5e6003546002540390565b601354909150600160a01b900460ff16610fb25760405162461bcd60e51b8152602060048201526015602482015274233932b29036b4b73a1034b9903234b0b13632b21760591b6044820152606401610c49565b60145433600090815260156020526040902054610fcf9084612615565b11156110125760405162461bcd60e51b8152602060048201526012602482015271115e18d959591cc8199c9959481b1a5b5a5d60721b6044820152606401610c49565b600d5461101f8383612615565b111561103d5760405162461bcd60e51b8152600401610c4990612628565b6110478282611714565b3360009081526015602052604081208054849290611066908490612615565b90915550505050565b611077611456565b600b55565b6060600580546109bf9061258c565b611093611456565b610ce382826119be565b336001600160a01b038316036110c65760405163b06307db60e01b815260040160405180910390fd5b3360008181526009602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61113a611456565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b611167848484611538565b6001600160a01b0383163b15158015611189575061118784848484611abb565b155b156111a7576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6111b5611456565b601455565b6111c2611456565b600a8054911515600160a01b0260ff60a01b19909216919091179055565b60606111eb826114b0565b61120857604051630a14c4b560e41b815260040160405180910390fd5b6000611212611ba7565b90508051600003611232576040518060200160405280600081525061125d565b8061123c84611bb6565b60405160200161124d92919061276a565b6040516020818303038152906040525b9392505050565b61126c611456565b600061127b6003546002540390565b600d5490915061128b8383612615565b11156112a95760405162461bcd60e51b8152600401610c4990612628565b610b0e8383611c48565b6112bb611456565b60005b8251811015610b0e5781601660008584815181106112de576112de612799565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061131a816127af565b9150506112be565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b611358611456565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b611382611456565b60138054911515600160a01b0260ff60a01b19909216919091179055565b6113a8611456565b601155565b6113b5611456565b6001600160a01b03811661141a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c49565b610dd78161196c565b61142b611456565b600e55565b611438611456565b600f805460ff1916911515919091179055565b600061098482611c62565b600a546001600160a01b03163314610f4d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c49565b600060025482108015610984575050600090815260066020526040902054600160e01b900460ff161590565b60008281526008602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061154382611852565b9050836001600160a01b031681600001516001600160a01b03161461157a5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061159857506115988533611322565b806115b35750336115a884610a42565b6001600160a01b0316145b9050806115d357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0384166115fa57604051633a954ecd60e21b815260040160405180910390fd5b611606600084876114dc565b6001600160a01b038581166000908152600760209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600690945282852080546001600160e01b031916909417600160a01b429092169190910217835587018084529220805491939091166116da5760025482146116da57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b031660008051602061284083398151915260405160405180910390a45b5050505050565b600a54600160a01b900460ff16156117615760405162461bcd60e51b815260206004820152601060248201526f4d494e54494e473a205061757365642160801b6044820152606401610c49565b61176b3383611c48565b60005b82811015610b0e576012546013546001600160a01b039182169163da7323b39116463061179b8688612615565b600b546040516001600160e01b031960e088901b1681526001600160a01b03958616600482015260248101949094529390911660448301526064820152608481019190915260c060a4820152600060c482015260e4016020604051808303816000875af1158015611810573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183491906127c8565b508061183f816127af565b91505061176e565b610dd7816000611ca2565b60408051606081018252600080825260208201819052918101919091528160025481101561195357600081815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906119515780516001600160a01b0316156118e8579392505050565b5060001901600081815260066020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff161515928101929092521561194c579392505050565b6118e8565b505b604051636f96cda160e11b815260040160405180910390fd5b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6127106001600160601b0382161115611a2c5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610c49565b6001600160a01b038216611a825760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610c49565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600055565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611af09033908990889088906004016127e5565b6020604051808303816000875af1925050508015611b2b575060408051601f3d908101601f19168201909252611b2891810190612822565b60015b611b89573d808015611b59576040519150601f19603f3d011682016040523d82523d6000602084013e611b5e565b606091505b508051600003611b81576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600c80546109bf9061258c565b60606000611bc383611e56565b60010190506000816001600160401b03811115611be257611be26122a0565b6040519080825280601f01601f191660200182016040528015611c0c576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611c1657509392505050565b610ce3828260405180602001604052806000815250611f2e565b60006001600160e01b031982166380ac58cd60e01b1480611c9357506001600160e01b03198216635b5e139f60e01b145b80610984575061098482611f3b565b6000611cad83611852565b80519091508215611d13576000336001600160a01b0383161480611cd65750611cd68233611322565b80611cf1575033611ce686610a42565b6001600160a01b0316145b905080611d1157604051632ce44b5f60e11b815260040160405180910390fd5b505b611d1f600085836114dc565b6001600160a01b0380821660008181526007602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526006909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b178555918901808452922080549194909116611e1d576002548214611e1d57805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b03841690600080516020612840833981519152908390a450506003805460010190555050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611e955772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611ec1576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611edf57662386f26fc10000830492506010015b6305f5e1008310611ef7576305f5e100830492506008015b6127108310611f0b57612710830492506004015b60648310611f1d576064830492506002015b600a83106109845760010192915050565b610b0e8383836001611f70565b60006001600160e01b0319821663152a902d60e11b148061098457506301ffc9a760e01b6001600160e01b0319831614610984565b6002546001600160a01b038516611f9957604051622e076360e81b815260040160405180910390fd5b83600003611fba5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260076020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600690925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561206b57506001600160a01b0387163b15155b156120e1575b60405182906001600160a01b03891690600090600080516020612840833981519152908290a46120aa6000888480600101955088611abb565b6120c7576040516368d2bf6b60e11b815260040160405180910390fd5b8082036120715782600254146120dc57600080fd5b612114565b5b6040516001830192906001600160a01b03891690600090600080516020612840833981519152908290a48082036120e2575b5060025561170d565b6001600160e01b031981168114610dd757600080fd5b60006020828403121561214557600080fd5b813561125d8161211d565b8035801515811461216057600080fd5b919050565b60006020828403121561217757600080fd5b61125d82612150565b60005b8381101561219b578181015183820152602001612183565b50506000910152565b600081518084526121bc816020860160208601612180565b601f01601f19169290920160200192915050565b60208152600061125d60208301846121a4565b6000602082840312156121f557600080fd5b5035919050565b6001600160a01b0381168114610dd757600080fd5b6000806040838503121561222457600080fd5b823561222f816121fc565b946020939093013593505050565b60008060006060848603121561225257600080fd5b833561225d816121fc565b9250602084013561226d816121fc565b929592945050506040919091013590565b6000806040838503121561229157600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156122de576122de6122a0565b604052919050565b60006001600160401b038311156122ff576122ff6122a0565b612312601f8401601f19166020016122b6565b905082815283838301111561232657600080fd5b828260208301376000602084830101529392505050565b60006020828403121561234f57600080fd5b81356001600160401b0381111561236557600080fd5b8201601f8101841361237657600080fd5b611b9f848235602084016122e6565b60006020828403121561239757600080fd5b813561125d816121fc565b600080604083850312156123b557600080fd5b82356123c0816121fc565b915060208301356001600160601b03811681146123dc57600080fd5b809150509250929050565b600080604083850312156123fa57600080fd5b8235612405816121fc565b915061241360208401612150565b90509250929050565b6000806000806080858703121561243257600080fd5b843561243d816121fc565b9350602085013561244d816121fc565b92506040850135915060608501356001600160401b0381111561246f57600080fd5b8501601f8101871361248057600080fd5b61248f878235602084016122e6565b91505092959194509250565b600080604083850312156124ae57600080fd5b82356001600160401b03808211156124c557600080fd5b818501915085601f8301126124d957600080fd5b81356020828211156124ed576124ed6122a0565b8160051b92506124fe8184016122b6565b828152928401810192818101908985111561251857600080fd5b948201945b848610156125425785359350612532846121fc565b838252948201949082019061251d565b96506125519050878201612150565b9450505050509250929050565b6000806040838503121561257157600080fd5b823561257c816121fc565b915060208301356123dc816121fc565b600181811c908216806125a057607f821691505b6020821081036125c057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610984576109846125c6565b60008261261057634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610984576109846125c6565b6020808252818101527f507572636861736520776f756c6420657863656564206d617820746f6b656e73604082015260600190565b601f821115610b0e57600081815260208120601f850160051c810160208610156126845750805b601f850160051c820191505b818110156126a357828155600101612690565b505050505050565b81516001600160401b038111156126c4576126c46122a0565b6126d8816126d2845461258c565b8461265d565b602080601f83116001811461270d57600084156126f55750858301515b600019600386901b1c1916600185901b1785556126a3565b600085815260208120601f198616915b8281101561273c5788860151825594840194600190910190840161271d565b508582101561275a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000835161277c818460208801612180565b835190830190612790818360208801612180565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b6000600182016127c1576127c16125c6565b5060010190565b6000602082840312156127da57600080fd5b815161125d816121fc565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612818908301846121a4565b9695505050505050565b60006020828403121561283457600080fd5b815161125d8161211d56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220b09e2d3d9e5b223d4ea8ae29487c8f0cb845fc463a66cd10400e1f8bb301b17e64736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011040000000000000000000000000d9b59d8f9620318bb05f7bf300d8121634491d7000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000000c5045504520456d6272796f73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045045504500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002968747470733a2f2f6d696e742e6c6966656f66706570652e636f6d2f706570652d6e66742d6170692f0000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): PEPE Embryos
Arg [1] : _symbol (string): PEPE
Arg [2] : _uri (string): https://mint.lifeofpepe.com/pepe-nft-api/
Arg [3] : limit (uint256): 10
Arg [4] : price (uint256): 0
Arg [5] : maxSupply (uint256): 69696
Arg [6] : _receiver (address): 0xd9b59D8F9620318BB05f7Bf300D8121634491d70
Arg [7] : feeNumerator (uint96): 960
-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000011040
Arg [6] : 000000000000000000000000d9b59d8f9620318bb05f7bf300d8121634491d70
Arg [7] : 00000000000000000000000000000000000000000000000000000000000003c0
Arg [8] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [9] : 5045504520456d6272796f730000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [11] : 5045504500000000000000000000000000000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000029
Arg [13] : 68747470733a2f2f6d696e742e6c6966656f66706570652e636f6d2f70657065
Arg [14] : 2d6e66742d6170692f0000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
362:7868:14:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7886:181;;;;;;;;;;-1:-1:-1;7886:181:14;;;;;:::i;:::-;;:::i;:::-;;;565:14:20;;558:22;540:41;;528:2;513:18;7886:181:14;;;;;;;;5081:99;;;;;;;;;;-1:-1:-1;5081:99:14;;;;;:::i;:::-;;:::i;:::-;;732:30;;;;;;;;;;-1:-1:-1;732:30:14;;;;-1:-1:-1;;;;;732:30:14;;;;;;-1:-1:-1;;;;;1106:32:20;;;1088:51;;1076:2;1061:18;732:30:14;942:203:20;7584:98:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;9098:214::-;;;;;;;;;;-1:-1:-1;9098:214:18;;;;;:::i;:::-;;:::i;841:28:14:-;;;;;;;;;;;;;;;;;;;2237:25:20;;;2225:2;2210:18;841:28:14;2091:177:20;8675:362:18;;;;;;;;;;-1:-1:-1;8675:362:18;;;;;:::i;:::-;;:::i;768:36:14:-;;;;;;;;;;-1:-1:-1;768:36:14;;;;-1:-1:-1;;;;;768:36:14;;;3799:297:18;;;;;;;;;;-1:-1:-1;4049:12:18;;4033:13;;:28;3799:297;;5787:96:14;;;;;;;;;;-1:-1:-1;5787:96:14;;;;;:::i;:::-;;:::i;9995:164:18:-;;;;;;;;;;-1:-1:-1;9995:164:18;;;;;:::i;:::-;;:::i;773:462:17:-;;;;;;;;;;-1:-1:-1;773:462:17;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3635:32:20;;;3617:51;;3699:2;3684:18;;3677:34;;;;3590:18;773:462:17;3443:274:20;2034:445:14;;;;;;:::i;:::-;;:::i;549:25::-;;;;;;;;;;;;;;;;699:26;;;;;;;;;;;;;;;;4798:142;;;;;;;;;;;;;:::i;637:22::-;;;;;;;;;;-1:-1:-1;637:22:14;;;;;;;;10225:179:18;;;;;;;;;;-1:-1:-1;10225:179:18;;;;;:::i;:::-;;:::i;4051:189:14:-;;;;;;;;;;-1:-1:-1;4051:189:14;;;;;:::i;:::-;;:::i;7349:107::-;;;;;;;;;;-1:-1:-1;7349:107:14;;;;;:::i;:::-;;:::i;8073:155::-;;;;;;;;;;-1:-1:-1;8184:9:14;8073:155;;424:18;;;;;;;;;;-1:-1:-1;424:18:14;;;;-1:-1:-1;;;424:18:14;;;;;;7399:123:18;;;;;;;;;;-1:-1:-1;7399:123:18;;;;;:::i;:::-;;:::i;3185:405:14:-;;;;;;:::i;:::-;;:::i;4901:203:18:-;;;;;;;;;;-1:-1:-1;4901:203:18;;;;;:::i;:::-;;:::i;1824:101:0:-;;;;;;;;;;;;;:::i;2619:428:14:-;;;;;;;;;;-1:-1:-1;2619:428:14;;;;;:::i;:::-;;:::i;7670:89::-;;;;;;;;;;-1:-1:-1;7670:89:14;;;;;:::i;:::-;;:::i;1201:85:0:-;;;;;;;;;;-1:-1:-1;1273:6:0;;-1:-1:-1;;;;;1273:6:0;1201:85;;7746:102:18;;;;;;;;;;;;;:::i;7043:161:14:-;;;;;;;;;;-1:-1:-1;7043:161:14;;;;;:::i;:::-;;:::i;666:27::-;;;;;;;;;;;;;;;;811:24;;;;;;;;;;-1:-1:-1;811:24:14;;;;-1:-1:-1;;;811:24:14;;;;;;9379:304:18;;;;;;;;;;-1:-1:-1;9379:304:18;;;;;:::i;:::-;;:::i;6249:102:14:-;;;;;;;;;;-1:-1:-1;6249:102:14;;;;;:::i;:::-;;:::i;10470:393:18:-;;;;;;;;;;-1:-1:-1;10470:393:18;;;;;:::i;:::-;;:::i;5186:100:14:-;;;;;;;;;;-1:-1:-1;5186:100:14;;;;;:::i;:::-;;:::i;5292:90::-;;;;;;;;;;-1:-1:-1;5292:90:14;;;;;:::i;:::-;;:::i;609:22::-;;;;;;;;;;;;;;;;7914:371:18;;;;;;;;;;-1:-1:-1;7914:371:18;;;;;:::i;:::-;;:::i;4486:218:14:-;;;;;;;;;;-1:-1:-1;4486:218:14;;;;;:::i;:::-;;:::i;5388:232::-;;;;;;;;;;-1:-1:-1;5388:232:14;;;;;:::i;:::-;;:::i;932:49::-;;;;;;;;;;-1:-1:-1;932:49:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;9749:184:18;;;;;;;;;;-1:-1:-1;9749:184:18;;;;;:::i;:::-;;:::i;448:24:14:-;;;;;;;;;;-1:-1:-1;448:24:14;;;;-1:-1:-1;;;448:24:14;;;;;;6496:114;;;;;;;;;;-1:-1:-1;6496:114:14;;;;;:::i;:::-;;:::i;7462:100::-;;;;;;;;;;-1:-1:-1;7462:100:14;;;;;:::i;:::-;;:::i;6791:94::-;;;;;;;;;;-1:-1:-1;6791:94:14;;;;;:::i;:::-;;:::i;2074:198:0:-;;;;;;;;;;-1:-1:-1;2074:198:0;;;;;:::i;:::-;;:::i;875:51:14:-;;;;;;;;;;-1:-1:-1;875:51:14;;;;;:::i;:::-;;;;;;;;;;;;;;6022:86;;;;;;;;;;-1:-1:-1;6022:86:14;;;;;:::i;:::-;;:::i;7568:96::-;;;;;;;;;;-1:-1:-1;7568:96:14;;;;;:::i;:::-;;:::i;7886:181::-;8001:4;8024:36;8048:11;8024:23;:36::i;:::-;8017:43;7886:181;-1:-1:-1;;7886:181:14:o;5081:99::-;1094:13:0;:11;:13::i;:::-;5150:12:14::1;:23:::0;;;::::1;;-1:-1:-1::0;;;5150:23:14::1;-1:-1:-1::0;;;;5150:23:14;;::::1;::::0;;;::::1;::::0;;5081:99::o;7584:98:18:-;7638:13;7670:5;7663:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7584:98;:::o;9098:214::-;9180:7;9204:16;9212:7;9204;:16::i;:::-;9199:64;;9229:34;;-1:-1:-1;;;9229:34:18;;;;;;;;;;;9199:64;-1:-1:-1;9281:24:18;;;;:15;:24;;;;;;-1:-1:-1;;;;;9281:24:18;;9098:214::o;8675:362::-;8747:13;8763:24;8779:7;8763:15;:24::i;:::-;8747:40;;8807:5;-1:-1:-1;;;;;8801:11:18;:2;-1:-1:-1;;;;;8801:11:18;;8797:48;;8821:24;;-1:-1:-1;;;8821:24:18;;;;;;;;;;;8797:48;719:10:8;-1:-1:-1;;;;;8860:21:18;;;;;;:63;;-1:-1:-1;8886:37:18;8903:5;719:10:8;9749:184:18;:::i;8886:37::-;8885:38;8860:63;8856:136;;;8946:35;;-1:-1:-1;;;8946:35:18;;;;;;;;;;;8856:136;9002:28;9011:2;9015:7;9024:5;9002:8;:28::i;:::-;8737:300;8675:362;;:::o;5787:96:14:-;1094:13:0;:11;:13::i;:::-;5856:12:14::1;:20:::0;5787:96::o;9995:164:18:-;10124:28;10134:4;10140:2;10144:7;10124:9;:28::i;773:462:17:-;890:7;947:26;;;:17;:26;;;;;;;;918:55;;;;;;;;;-1:-1:-1;;;;;918:55:17;;;;;-1:-1:-1;;;918:55:17;;;-1:-1:-1;;;;;918:55:17;;;;;;;;890:7;;984:90;;-1:-1:-1;1034:29:17;;;;;;;;;-1:-1:-1;1034:29:17;-1:-1:-1;;;;;1034:29:17;;;;-1:-1:-1;;;1034:29:17;;-1:-1:-1;;;;;1034:29:17;;;;;984:90;1121:23;;;;1084:21;;1593:5;;1109:35;;-1:-1:-1;;;;;1109:35:17;:9;:35;:::i;:::-;1108:69;;;;:::i;:::-;1196:16;;;;;-1:-1:-1;773:462:17;;-1:-1:-1;;;;773:462:17:o;2034:445:14:-;2097:10;2110:13;4049:12:18;;4033:13;;:28;;3799:297;2110:13:14;2197:12;;2097:26;;-1:-1:-1;;;;2197:12:14;;;;2189:59;;;;-1:-1:-1;;;2189:59:14;;9549:2:20;2189:59:14;;;9531:21:20;9588:2;9568:18;;;9561:30;9627:34;9607:18;;;9600:62;-1:-1:-1;;;9678:18:20;;;9671:32;9720:19;;2189:59:14;;;;;;;;;2281:10;;2266:11;2271:6;2266:2;:11;:::i;:::-;:25;;2258:70;;;;-1:-1:-1;;;2258:70:14;;;;;;;:::i;:::-;2384:9;2374:6;2359:12;;:21;;;;:::i;:::-;:34;2338:106;;;;-1:-1:-1;;;2338:106:14;;10443:2:20;2338:106:14;;;10425:21:20;10482:2;10462:18;;;10455:30;10521:27;10501:18;;;10494:55;10566:18;;2338:106:14;10241:349:20;2338:106:14;2455:17;2461:6;2469:2;2455:5;:17::i;:::-;2087:392;2034:445;:::o;4798:142::-;1094:13:0;:11;:13::i;:::-;4896:37:14::1;::::0;4865:21:::1;::::0;4904:10:::1;::::0;4896:37;::::1;;;::::0;4865:21;;4847:15:::1;4896:37:::0;4847:15;4896:37;4865:21;4904:10;4896:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;10225:179:18::0;10358:39;10375:4;10381:2;10385:7;10358:39;;;;;;;;;;;;:16;:39::i;4051:189:14:-;4109:16;4117:7;4109;:16::i;:::-;4101:40;;;;-1:-1:-1;;;4101:40:14;;10797:2:20;4101:40:14;;;10779:21:20;10836:2;10816:18;;;10809:30;-1:-1:-1;;;10855:18:20;;;10848:41;10906:18;;4101:40:14;10595:335:20;4101:40:14;4179:10;4159:16;4167:7;4159;:16::i;:::-;-1:-1:-1;;;;;4159:30:14;;4151:58;;;;-1:-1:-1;;;4151:58:14;;11137:2:20;4151:58:14;;;11119:21:20;11176:2;11156:18;;;11149:30;-1:-1:-1;;;11195:18:20;;;11188:45;11250:18;;4151:58:14;10935:339:20;4151:58:14;4219:14;4225:7;4219:5;:14::i;:::-;4051:189;:::o;7349:107::-;1094:13:0;:11;:13::i;:::-;7422:16:14::1;:27;7441:8:::0;7422:16;:27:::1;:::i;7399:123:18:-:0;7463:7;7489:21;7502:7;7489:12;:21::i;:::-;:26;;7399:123;-1:-1:-1;;7399:123:18:o;3185:405:14:-;3244:10;3257:13;4049:12:18;;4033:13;;:28;;3799:297;3257:13:14;3289:10;;3244:26;;-1:-1:-1;3289:10:14;;3281:43;;;;-1:-1:-1;;;3281:43:14;;13685:2:20;3281:43:14;;;13667:21:20;13724:2;13704:18;;;13697:30;-1:-1:-1;;;13743:18:20;;;13736:50;13803:18;;3281:43:14;13483:344:20;3281:43:14;3360:10;3342:29;;;;:17;:29;;;;;;;;3334:64;;;;-1:-1:-1;;;3334:64:14;;14034:2:20;3334:64:14;;;14016:21:20;14073:2;14053:18;;;14046:30;-1:-1:-1;;;14092:18:20;;;14085:52;14154:18;;3334:64:14;13832:346:20;3334:64:14;3431:10;;3416:11;3421:6;3416:2;:11;:::i;:::-;:25;;3408:70;;;;-1:-1:-1;;;3408:70:14;;;;;;;:::i;:::-;3516:9;3506:6;3496:7;;:16;;;;:::i;4901:203:18:-;4965:7;-1:-1:-1;;;;;4988:19:18;;4984:60;;5016:28;;-1:-1:-1;;;5016:28:18;;;;;;;;;;;4984:60;-1:-1:-1;;;;;;5069:19:18;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;5069:27:18;;4901:203::o;1824:101:0:-;1094:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;2619:428:14:-;2672:10;2685:13;4049:12:18;;4033:13;;:28;;3799:297;2685:13:14;2717:12;;2672:26;;-1:-1:-1;;;;2717:12:14;;;;2709:46;;;;-1:-1:-1;;;2709:46:14;;14385:2:20;2709:46:14;;;14367:21:20;14424:2;14404:18;;;14397:30;-1:-1:-1;;;14443:18:20;;;14436:51;14504:18;;2709:46:14;14183:345:20;2709:46:14;2827:13;;2812:10;2795:28;;;;:16;:28;;;;;;2786:37;;:6;:37;:::i;:::-;:54;;2765:119;;;;-1:-1:-1;;;2765:119:14;;14735:2:20;2765:119:14;;;14717:21:20;14774:2;14754:18;;;14747:30;-1:-1:-1;;;14793:18:20;;;14786:48;14851:18;;2765:119:14;14533:342:20;2765:119:14;2917:10;;2902:11;2907:6;2902:2;:11;:::i;:::-;:25;;2894:70;;;;-1:-1:-1;;;2894:70:14;;;;;;;:::i;:::-;2975:17;2981:6;2989:2;2975:5;:17::i;:::-;3019:10;3002:28;;;;:16;:28;;;;;:38;;3034:6;;3002:28;:38;;3034:6;;3002:38;:::i;:::-;;;;-1:-1:-1;;;;2619:428:14:o;7670:89::-;1094:13:0;:11;:13::i;:::-;7740:5:14::1;:12:::0;7670:89::o;7746:102:18:-;7802:13;7834:7;7827:14;;;;;:::i;7043:161:14:-;1094:13:0;:11;:13::i;:::-;7154:43:14::1;7173:9;7184:12;7154:18;:43::i;9379:304:18:-:0;719:10:8;-1:-1:-1;;;;;9499:24:18;;;9495:54;;9532:17;;-1:-1:-1;;;9532:17:18;;;;;;;;;;;9495:54;719:10:8;9560:32:18;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;9560:42:18;;;;;;;;;;;;:53;;-1:-1:-1;;9560:53:18;;;;;;;;;;9628:48;;540:41:20;;;9560:42:18;;719:10:8;9628:48:18;;513:18:20;9628:48:18;;;;;;;9379:304;;:::o;6249:102:14:-;1094:13:0;:11;:13::i;:::-;6321:15:14::1;:23:::0;;-1:-1:-1;;;;;;6321:23:14::1;-1:-1:-1::0;;;;;6321:23:14;;;::::1;::::0;;;::::1;::::0;;6249:102::o;10470:393:18:-;10631:28;10641:4;10647:2;10651:7;10631:9;:28::i;:::-;-1:-1:-1;;;;;10686:13:18;;1702:19:7;:23;;10686:88:18;;;;;10718:56;10749:4;10755:2;10759:7;10768:5;10718:30;:56::i;:::-;10717:57;10686:88;10669:188;;;10806:40;;-1:-1:-1;;;10806:40:18;;;;;;;;;;;10669:188;10470:393;;;;:::o;5186:100:14:-;1094:13:0;:11;:13::i;:::-;5257::14::1;:22:::0;5186:100::o;5292:90::-;1094:13:0;:11;:13::i;:::-;5359:6:14::1;:16:::0;;;::::1;;-1:-1:-1::0;;;5359:16:14::1;-1:-1:-1::0;;;;5359:16:14;;::::1;::::0;;;::::1;::::0;;5292:90::o;7914:371:18:-;8001:13;8031:16;8039:7;8031;:16::i;:::-;8026:59;;8056:29;;-1:-1:-1;;;8056:29:18;;;;;;;;;;;8026:59;8096:21;8120:10;:8;:10::i;:::-;8096:34;;8165:7;8159:21;8184:1;8159:26;:119;;;;;;;;;;;;;;;;;8228:7;8237:18;:7;:16;:18::i;:::-;8211:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8159:119;8140:138;7914:371;-1:-1:-1;;;7914:371:18:o;4486:218:14:-;1094:13:0;:11;:13::i;:::-;4560:10:14::1;4573:13;4049:12:18::0;;4033:13;;:28;;3799:297;4573:13:14::1;4619:10;::::0;4560:26;;-1:-1:-1;4604:11:14::1;4609:6:::0;4560:26;4604:11:::1;:::i;:::-;:25;;4596:70;;;;-1:-1:-1::0;;;4596:70:14::1;;;;;;;:::i;:::-;4676:21;4686:2;4690:6;4676:9;:21::i;5388:232::-:0;1094:13:0;:11;:13::i;:::-;5516:9:14::1;5511:103;5531:6;:13;5527:1;:17;5511:103;;;5596:7;5565:17;:28;5583:6;5590:1;5583:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;5565:28:14::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;5565:28:14;:38;;-1:-1:-1;;5565:38:14::1;::::0;::::1;;::::0;;;::::1;::::0;;5546:3;::::1;::::0;::::1;:::i;:::-;;;;5511:103;;9749:184:18::0;-1:-1:-1;;;;;9891:25:18;;;9868:4;9891:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;9749:184::o;6496:114:14:-;1094:13:0;:11;:13::i;:::-;6574:21:14::1;:29:::0;;-1:-1:-1;;;;;;6574:29:14::1;-1:-1:-1::0;;;;;6574:29:14;;;::::1;::::0;;;::::1;::::0;;6496:114::o;7462:100::-;1094:13:0;:11;:13::i;:::-;7534:12:14::1;:21:::0;;;::::1;;-1:-1:-1::0;;;7534:21:14::1;-1:-1:-1::0;;;;7534:21:14;;::::1;::::0;;;::::1;::::0;;7462:100::o;6791:94::-;1094:13:0;:11;:13::i;:::-;6859:11:14::1;:19:::0;6791:94::o;2074:198:0:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2162:22:0;::::1;2154:73;;;::::0;-1:-1:-1;;;2154:73:0;;15855:2:20;2154:73:0::1;::::0;::::1;15837:21:20::0;15894:2;15874:18;;;15867:30;15933:34;15913:18;;;15906:62;-1:-1:-1;;;15984:18:20;;;15977:36;16030:19;;2154:73:0::1;15653:402:20::0;2154:73:0::1;2237:28;2256:8;2237:18;:28::i;6022:86:14:-:0;1094:13:0;:11;:13::i;:::-;6086:7:14::1;:15:::0;6022:86::o;7568:96::-;1094:13:0;:11;:13::i;:::-;7638:10:14::1;:19:::0;;-1:-1:-1;;7638:19:14::1;::::0;::::1;;::::0;;;::::1;::::0;;7568:96::o;225:183:19:-;342:4;365:36;389:11;365:23;:36::i;1359:130:0:-;1273:6;;-1:-1:-1;;;;;1273:6:0;719:10:8;1422:23:0;1414:68;;;;-1:-1:-1;;;1414:68:0;;16262:2:20;1414:68:0;;;16244:21:20;;;16281:18;;;16274:30;16340:34;16320:18;;;16313:62;16392:18;;1414:68:0;16060:356:20;11109:208:18;11166:4;11253:13;;11243:7;:23;11201:109;;;;-1:-1:-1;;11283:20:18;;;;:11;:20;;;;;:27;-1:-1:-1;;;11283:27:18;;;;11282:28;;11109:208::o;19239:159::-;19319:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;19319:29:18;-1:-1:-1;;;;;19319:29:18;;;;;;;;;19363:28;;19319:24;;19363:28;;;;;;;19239:159;;;:::o;14339:2052::-;14419:35;14457:21;14470:7;14457:12;:21::i;:::-;14419:59;;14515:4;-1:-1:-1;;;;;14493:26:18;:13;:18;;;-1:-1:-1;;;;;14493:26:18;;14489:67;;14528:28;;-1:-1:-1;;;14528:28:18;;;;;;;;;;;14489:67;14567:22;719:10:8;-1:-1:-1;;;;;14593:20:18;;;;:72;;-1:-1:-1;14629:36:18;14646:4;719:10:8;9749:184:18;:::i;14629:36::-;14593:124;;;-1:-1:-1;719:10:8;14681:20:18;14693:7;14681:11;:20::i;:::-;-1:-1:-1;;;;;14681:36:18;;14593:124;14567:151;;14734:17;14729:66;;14760:35;;-1:-1:-1;;;14760:35:18;;;;;;;;;;;14729:66;-1:-1:-1;;;;;14809:16:18;;14805:52;;14834:23;;-1:-1:-1;;;14834:23:18;;;;;;;;;;;14805:52;14973:35;14990:1;14994:7;15003:4;14973:8;:35::i;:::-;-1:-1:-1;;;;;15298:18:18;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;15298:31:18;;;-1:-1:-1;;;;;15298:31:18;;;-1:-1:-1;;15298:31:18;;;;;;;15343:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;15343:29:18;;;;;;;;;;;15421:20;;;:11;:20;;;;;;15455:18;;-1:-1:-1;;;;;;15487:49:18;;;;-1:-1:-1;;;15520:15:18;15487:49;;;;;;;;;;15806:11;;15865:24;;;;;15907:13;;15421:20;;15865:24;;15907:13;15903:377;;16114:13;;16099:11;:28;16095:171;;16151:20;;16219:28;;;;-1:-1:-1;;;;;16193:54:18;-1:-1:-1;;;16193:54:18;-1:-1:-1;;;;;;16193:54:18;;;-1:-1:-1;;;;;16151:20:18;;16193:54;;;;16095:171;15274:1016;;;16324:7;16320:2;-1:-1:-1;;;;;16305:27:18;16314:4;-1:-1:-1;;;;;16305:27:18;-1:-1:-1;;;;;;;;;;;16305:27:18;;;;;;;;;16342:42;14409:1982;;14339:2052;;;:::o;3596:449:14:-;3669:6;;-1:-1:-1;;;3669:6:14;;;;3668:7;3660:36;;;;-1:-1:-1;;;3660:36:14;;16623:2:20;3660:36:14;;;16605:21:20;16662:2;16642:18;;;16635:30;-1:-1:-1;;;16681:18:20;;;16674:46;16737:18;;3660:36:14;16421:340:20;3660:36:14;3706:30;3716:10;3728:7;3706:9;:30::i;:::-;3752:9;3747:292;3771:7;3767:1;:11;3747:292;;;3816:15;;3864:21;;-1:-1:-1;;;;;3816:15:14;;;;3799:47;;3864:21;8184:9;3941:4;3964:7;3970:1;3964:3;:7;:::i;:::-;3989:5;;3799:229;;-1:-1:-1;;;;;;3799:229:14;;;;;;;-1:-1:-1;;;;;17145:15:20;;;3799:229:14;;;17127:34:20;17177:18;;;17170:34;;;;17240:15;;;;17220:18;;;17213:43;17272:18;;;17265:34;17315:19;;;17308:35;;;;17380:3;17359:19;;;17352:32;-1:-1:-1;17400:19:20;;;17393:30;17440:19;;3799:229:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;3780:3:14;;;;:::i;:::-;;;;3747:292;;16469:87:18;16528:21;16534:7;16543:5;16528;:21::i;6244:1098::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;6368:7:18;6448:13;;6441:4;:20;6410:868;;;6481:31;6515:17;;;:11;:17;;;;;;;;;6481:51;;;;;;;;;-1:-1:-1;;;;;6481:51:18;;;;-1:-1:-1;;;6481:51:18;;-1:-1:-1;;;;;6481:51:18;;;;;;;;-1:-1:-1;;;6481:51:18;;;;;;;;;;;;;;6550:714;;6599:14;;-1:-1:-1;;;;;6599:28:18;;6595:99;;6662:9;6244:1098;-1:-1:-1;;;6244:1098:18:o;6595:99::-;-1:-1:-1;;;7030:6:18;7074:17;;;;:11;:17;;;;;;;;;7062:29;;;;;;;;;-1:-1:-1;;;;;7062:29:18;;;;;-1:-1:-1;;;7062:29:18;;-1:-1:-1;;;;;7062:29:18;;;;;;;;-1:-1:-1;;;7062:29:18;;;;;;;;;;;;;7121:28;7117:107;;7188:9;6244:1098;-1:-1:-1;;;6244:1098:18:o;7117:107::-;6991:255;;;6463:815;6410:868;7304:31;;-1:-1:-1;;;7304:31:18;;;;;;;;;;;2426:187:0;2518:6;;;-1:-1:-1;;;;;2534:17:0;;;-1:-1:-1;;;;;;2534:17:0;;;;;;;2566:40;;2518:6;;;2534:17;2518:6;;2566:40;;2499:16;;2566:40;2489:124;2426:187;:::o;1866:383:17:-;1593:5;-1:-1:-1;;;;;2003:33:17;;;;1982:122;;;;-1:-1:-1;;;1982:122:17;;17928:2:20;1982:122:17;;;17910:21:20;17967:2;17947:18;;;17940:30;18006:34;17986:18;;;17979:62;-1:-1:-1;;;18057:18:20;;;18050:40;18107:19;;1982:122:17;17726:406:20;1982:122:17;-1:-1:-1;;;;;2122:22:17;;2114:60;;;;-1:-1:-1;;;2114:60:17;;18339:2:20;2114:60:17;;;18321:21:20;18378:2;18358:18;;;18351:30;18417:27;18397:18;;;18390:55;18462:18;;2114:60:17;18137:349:20;2114:60:17;2207:35;;;;;;;;;-1:-1:-1;;;;;2207:35:17;;;;;;-1:-1:-1;;;;;2207:35:17;;;;;;;;;;-1:-1:-1;;;2185:57:17;;;;-1:-1:-1;2185:57:17;1866:383::o;19879:748:18:-;20069:150;;-1:-1:-1;;;20069:150:18;;20037:4;;-1:-1:-1;;;;;20069:36:18;;;;;:150;;719:10:8;;20153:4:18;;20175:7;;20200:5;;20069:150;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20069:150:18;;;;;;;;-1:-1:-1;;20069:150:18;;;;;;;;;;;;:::i;:::-;;;20053:568;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20386:6;:13;20403:1;20386:18;20382:229;;20431:40;;-1:-1:-1;;;20431:40:18;;;;;;;;;;;20382:229;20571:6;20565:13;20556:6;20552:2;20548:15;20541:38;20053:568;-1:-1:-1;;;;;;20273:55:18;-1:-1:-1;;;20273:55:18;;-1:-1:-1;20053:568:18;19879:748;;;;;;:::o;7765:115:14:-;7825:13;7857:16;7850:23;;;;;:::i;447:696:9:-;503:13;552:14;569:17;580:5;569:10;:17::i;:::-;589:1;569:21;552:38;;604:20;638:6;-1:-1:-1;;;;;627:18:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;627:18:9;-1:-1:-1;604:41:9;-1:-1:-1;765:28:9;;;781:2;765:28;820:280;-1:-1:-1;;851:5:9;-1:-1:-1;;;985:2:9;974:14;;969:30;851:5;956:44;1044:2;1035:11;;;-1:-1:-1;1064:21:9;820:280;1064:21;-1:-1:-1;1120:6:9;447:696;-1:-1:-1;;;447:696:9:o;11323:102:18:-;11391:27;11401:2;11405:8;11391:27;;;;;;;;;;;;:9;:27::i;4528:314::-;4644:4;-1:-1:-1;;;;;;4679:40:18;;-1:-1:-1;;;4679:40:18;;:104;;-1:-1:-1;;;;;;;4735:48:18;;-1:-1:-1;;;4735:48:18;4679:104;:156;;;;4799:36;4823:11;4799:23;:36::i;16773:2355::-;16852:35;16890:21;16903:7;16890:12;:21::i;:::-;16937:18;;16852:59;;-1:-1:-1;16966:284:18;;;;16999:22;719:10:8;-1:-1:-1;;;;;17025:20:18;;;;:76;;-1:-1:-1;17065:36:18;17082:4;719:10:8;9749:184:18;:::i;17065:36::-;17025:132;;;-1:-1:-1;719:10:8;17121:20:18;17133:7;17121:11;:20::i;:::-;-1:-1:-1;;;;;17121:36:18;;17025:132;16999:159;;17178:17;17173:66;;17204:35;;-1:-1:-1;;;17204:35:18;;;;;;;;;;;17173:66;16985:265;16966:284;17373:35;17390:1;17394:7;17403:4;17373:8;:35::i;:::-;-1:-1:-1;;;;;17732:18:18;;;17698:31;17732:18;;;:12;:18;;;;;;;;17764:24;;-1:-1:-1;;;;;;;;;;17764:24:18;;;;;;;;;-1:-1:-1;;17764:24:18;;;;17802:29;;;;;17787:1;17802:29;;;;;;;;-1:-1:-1;;17802:29:18;;;;;;;;;;17961:20;;;:11;:20;;;;;;17995;;-1:-1:-1;;;;18062:15:18;18029:49;;;-1:-1:-1;;;18029:49:18;-1:-1:-1;;;;;;18029:49:18;;;;;;;;;;18092:22;-1:-1:-1;;;18092:22:18;;;18380:11;;;18439:24;;;;;18481:13;;17732:18;;18439:24;;18481:13;18477:377;;18688:13;;18673:11;:28;18669:171;;18725:20;;18793:28;;;;-1:-1:-1;;;;;18767:54:18;-1:-1:-1;;;18767:54:18;-1:-1:-1;;;;;;18767:54:18;;;-1:-1:-1;;;;;18725:20:18;;18767:54;;;;18669:171;-1:-1:-1;;18879:35:18;;18906:7;;-1:-1:-1;18902:1:18;;-1:-1:-1;;;;;;18879:35:18;;;-1:-1:-1;;;;;;;;;;;18879:35:18;18902:1;;18879:35;-1:-1:-1;;19097:12:18;:14;;;;;;-1:-1:-1;;16773:2355:18:o;10139:916:12:-;10192:7;;-1:-1:-1;;;10267:17:12;;10263:103;;-1:-1:-1;;;10304:17:12;;;-1:-1:-1;10349:2:12;10339:12;10263:103;10392:8;10383:5;:17;10379:103;;10429:8;10420:17;;;-1:-1:-1;10465:2:12;10455:12;10379:103;10508:8;10499:5;:17;10495:103;;10545:8;10536:17;;;-1:-1:-1;10581:2:12;10571:12;10495:103;10624:7;10615:5;:16;10611:100;;10660:7;10651:16;;;-1:-1:-1;10695:1:12;10685:11;10611:100;10737:7;10728:5;:16;10724:100;;10773:7;10764:16;;;-1:-1:-1;10808:1:12;10798:11;10724:100;10850:7;10841:5;:16;10837:100;;10886:7;10877:16;;;-1:-1:-1;10921:1:12;10911:11;10837:100;10963:7;10954:5;:16;10950:66;;11000:1;10990:11;11042:6;10139:916;-1:-1:-1;;10139:916:12:o;11776:157:18:-;11894:32;11900:2;11904:8;11914:5;11921:4;11894:5;:32::i;472:251:17:-;588:4;-1:-1:-1;;;;;;623:41:17;;-1:-1:-1;;;623:41:17;;:93;;-1:-1:-1;;;;;;;;;;937:40:10;;;680:36:17;829:155:10;12180:1917:18;12336:13;;-1:-1:-1;;;;;12363:16:18;;12359:48;;12388:19;;-1:-1:-1;;;12388:19:18;;;;;;;;;;;12359:48;12421:8;12433:1;12421:13;12417:44;;12443:18;;-1:-1:-1;;;12443:18:18;;;;;;;;;;;12417:44;-1:-1:-1;;;;;12804:16:18;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;12862:49:18;;-1:-1:-1;;;;;12804:44:18;;;;;;;12862:49;;;;-1:-1:-1;;12804:44:18;;;;;;12862:49;;;;;;;;;;;;;;;;12926:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;12975:66:18;;;;-1:-1:-1;;;13025:15:18;12975:66;;;;;;;;;;12926:25;13119:23;;;13161:4;:23;;;;-1:-1:-1;;;;;;13169:13:18;;1702:19:7;:23;;13169:15:18;13157:812;;;13204:493;13234:38;;13259:12;;-1:-1:-1;;;;;13234:38:18;;;13251:1;;-1:-1:-1;;;;;;;;;;;13234:38:18;13251:1;;13234:38;13324:207;13392:1;13424:2;13456:14;;;;;;13500:5;13324:30;:207::i;:::-;13294:356;;13587:40;;-1:-1:-1;;;13587:40:18;;;;;;;;;;;13294:356;13692:3;13676:12;:19;13204:493;;13776:12;13759:13;;:29;13755:43;;13790:8;;;13755:43;13157:812;;;13837:118;13867:40;;13892:14;;;;;-1:-1:-1;;;;;13867:40:18;;;13884:1;;-1:-1:-1;;;;;;;;;;;13867:40:18;13884:1;;13867:40;13950:3;13934:12;:19;13837:118;;13157:812;-1:-1:-1;13982:13:18;:28;14030:60;10470:393;14:131:20;-1:-1:-1;;;;;;88:32:20;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:160::-;657:20;;713:13;;706:21;696:32;;686:60;;742:1;739;732:12;686:60;592:160;;;:::o;757:180::-;813:6;866:2;854:9;845:7;841:23;837:32;834:52;;;882:1;879;872:12;834:52;905:26;921:9;905:26;:::i;1150:250::-;1235:1;1245:113;1259:6;1256:1;1253:13;1245:113;;;1335:11;;;1329:18;1316:11;;;1309:39;1281:2;1274:10;1245:113;;;-1:-1:-1;;1392:1:20;1374:16;;1367:27;1150:250::o;1405:271::-;1447:3;1485:5;1479:12;1512:6;1507:3;1500:19;1528:76;1597:6;1590:4;1585:3;1581:14;1574:4;1567:5;1563:16;1528:76;:::i;:::-;1658:2;1637:15;-1:-1:-1;;1633:29:20;1624:39;;;;1665:4;1620:50;;1405:271;-1:-1:-1;;1405:271:20:o;1681:220::-;1830:2;1819:9;1812:21;1793:4;1850:45;1891:2;1880:9;1876:18;1868:6;1850:45;:::i;1906:180::-;1965:6;2018:2;2006:9;1997:7;1993:23;1989:32;1986:52;;;2034:1;2031;2024:12;1986:52;-1:-1:-1;2057:23:20;;1906:180;-1:-1:-1;1906:180:20:o;2273:131::-;-1:-1:-1;;;;;2348:31:20;;2338:42;;2328:70;;2394:1;2391;2384:12;2409:315;2477:6;2485;2538:2;2526:9;2517:7;2513:23;2509:32;2506:52;;;2554:1;2551;2544:12;2506:52;2593:9;2580:23;2612:31;2637:5;2612:31;:::i;:::-;2662:5;2714:2;2699:18;;;;2686:32;;-1:-1:-1;;;2409:315:20:o;2729:456::-;2806:6;2814;2822;2875:2;2863:9;2854:7;2850:23;2846:32;2843:52;;;2891:1;2888;2881:12;2843:52;2930:9;2917:23;2949:31;2974:5;2949:31;:::i;:::-;2999:5;-1:-1:-1;3056:2:20;3041:18;;3028:32;3069:33;3028:32;3069:33;:::i;:::-;2729:456;;3121:7;;-1:-1:-1;;;3175:2:20;3160:18;;;;3147:32;;2729:456::o;3190:248::-;3258:6;3266;3319:2;3307:9;3298:7;3294:23;3290:32;3287:52;;;3335:1;3332;3325:12;3287:52;-1:-1:-1;;3358:23:20;;;3428:2;3413:18;;;3400:32;;-1:-1:-1;3190:248:20:o;3722:127::-;3783:10;3778:3;3774:20;3771:1;3764:31;3814:4;3811:1;3804:15;3838:4;3835:1;3828:15;3854:275;3925:2;3919:9;3990:2;3971:13;;-1:-1:-1;;3967:27:20;3955:40;;-1:-1:-1;;;;;4010:34:20;;4046:22;;;4007:62;4004:88;;;4072:18;;:::i;:::-;4108:2;4101:22;3854:275;;-1:-1:-1;3854:275:20:o;4134:407::-;4199:5;-1:-1:-1;;;;;4225:6:20;4222:30;4219:56;;;4255:18;;:::i;:::-;4293:57;4338:2;4317:15;;-1:-1:-1;;4313:29:20;4344:4;4309:40;4293:57;:::i;:::-;4284:66;;4373:6;4366:5;4359:21;4413:3;4404:6;4399:3;4395:16;4392:25;4389:45;;;4430:1;4427;4420:12;4389:45;4479:6;4474:3;4467:4;4460:5;4456:16;4443:43;4533:1;4526:4;4517:6;4510:5;4506:18;4502:29;4495:40;4134:407;;;;;:::o;4546:451::-;4615:6;4668:2;4656:9;4647:7;4643:23;4639:32;4636:52;;;4684:1;4681;4674:12;4636:52;4724:9;4711:23;-1:-1:-1;;;;;4749:6:20;4746:30;4743:50;;;4789:1;4786;4779:12;4743:50;4812:22;;4865:4;4857:13;;4853:27;-1:-1:-1;4843:55:20;;4894:1;4891;4884:12;4843:55;4917:74;4983:7;4978:2;4965:16;4960:2;4956;4952:11;4917:74;:::i;5002:247::-;5061:6;5114:2;5102:9;5093:7;5089:23;5085:32;5082:52;;;5130:1;5127;5120:12;5082:52;5169:9;5156:23;5188:31;5213:5;5188:31;:::i;5254:435::-;5321:6;5329;5382:2;5370:9;5361:7;5357:23;5353:32;5350:52;;;5398:1;5395;5388:12;5350:52;5437:9;5424:23;5456:31;5481:5;5456:31;:::i;:::-;5506:5;-1:-1:-1;5563:2:20;5548:18;;5535:32;-1:-1:-1;;;;;5598:40:20;;5586:53;;5576:81;;5653:1;5650;5643:12;5576:81;5676:7;5666:17;;;5254:435;;;;;:::o;5694:315::-;5759:6;5767;5820:2;5808:9;5799:7;5795:23;5791:32;5788:52;;;5836:1;5833;5826:12;5788:52;5875:9;5862:23;5894:31;5919:5;5894:31;:::i;:::-;5944:5;-1:-1:-1;5968:35:20;5999:2;5984:18;;5968:35;:::i;:::-;5958:45;;5694:315;;;;;:::o;6014:795::-;6109:6;6117;6125;6133;6186:3;6174:9;6165:7;6161:23;6157:33;6154:53;;;6203:1;6200;6193:12;6154:53;6242:9;6229:23;6261:31;6286:5;6261:31;:::i;:::-;6311:5;-1:-1:-1;6368:2:20;6353:18;;6340:32;6381:33;6340:32;6381:33;:::i;:::-;6433:7;-1:-1:-1;6487:2:20;6472:18;;6459:32;;-1:-1:-1;6542:2:20;6527:18;;6514:32;-1:-1:-1;;;;;6558:30:20;;6555:50;;;6601:1;6598;6591:12;6555:50;6624:22;;6677:4;6669:13;;6665:27;-1:-1:-1;6655:55:20;;6706:1;6703;6696:12;6655:55;6729:74;6795:7;6790:2;6777:16;6772:2;6768;6764:11;6729:74;:::i;:::-;6719:84;;;6014:795;;;;;;;:::o;6814:1091::-;6904:6;6912;6965:2;6953:9;6944:7;6940:23;6936:32;6933:52;;;6981:1;6978;6971:12;6933:52;7021:9;7008:23;-1:-1:-1;;;;;7091:2:20;7083:6;7080:14;7077:34;;;7107:1;7104;7097:12;7077:34;7145:6;7134:9;7130:22;7120:32;;7190:7;7183:4;7179:2;7175:13;7171:27;7161:55;;7212:1;7209;7202:12;7161:55;7248:2;7235:16;7270:4;7293:2;7289;7286:10;7283:36;;;7299:18;;:::i;:::-;7345:2;7342:1;7338:10;7328:20;;7368:28;7392:2;7388;7384:11;7368:28;:::i;:::-;7430:15;;;7500:11;;;7496:20;;;7461:12;;;;7528:19;;;7525:39;;;7560:1;7557;7550:12;7525:39;7584:11;;;;7604:217;7620:6;7615:3;7612:15;7604:217;;;7700:3;7687:17;7674:30;;7717:31;7742:5;7717:31;:::i;:::-;7761:18;;;7637:12;;;;7799;;;;7604:217;;;7840:5;-1:-1:-1;7864:35:20;;-1:-1:-1;7880:18:20;;;7864:35;:::i;:::-;7854:45;;;;;;6814:1091;;;;;:::o;7910:388::-;7978:6;7986;8039:2;8027:9;8018:7;8014:23;8010:32;8007:52;;;8055:1;8052;8045:12;8007:52;8094:9;8081:23;8113:31;8138:5;8113:31;:::i;:::-;8163:5;-1:-1:-1;8220:2:20;8205:18;;8192:32;8233:33;8192:32;8233:33;:::i;8303:380::-;8382:1;8378:12;;;;8425;;;8446:61;;8500:4;8492:6;8488:17;8478:27;;8446:61;8553:2;8545:6;8542:14;8522:18;8519:38;8516:161;;8599:10;8594:3;8590:20;8587:1;8580:31;8634:4;8631:1;8624:15;8662:4;8659:1;8652:15;8516:161;;8303:380;;;:::o;8688:127::-;8749:10;8744:3;8740:20;8737:1;8730:31;8780:4;8777:1;8770:15;8804:4;8801:1;8794:15;8820:168;8893:9;;;8924;;8941:15;;;8935:22;;8921:37;8911:71;;8962:18;;:::i;9125:217::-;9165:1;9191;9181:132;;9235:10;9230:3;9226:20;9223:1;9216:31;9270:4;9267:1;9260:15;9298:4;9295:1;9288:15;9181:132;-1:-1:-1;9327:9:20;;9125:217::o;9750:125::-;9815:9;;;9836:10;;;9833:36;;;9849:18;;:::i;9880:356::-;10082:2;10064:21;;;10101:18;;;10094:30;10160:34;10155:2;10140:18;;10133:62;10227:2;10212:18;;9880:356::o;11405:545::-;11507:2;11502:3;11499:11;11496:448;;;11543:1;11568:5;11564:2;11557:17;11613:4;11609:2;11599:19;11683:2;11671:10;11667:19;11664:1;11660:27;11654:4;11650:38;11719:4;11707:10;11704:20;11701:47;;;-1:-1:-1;11742:4:20;11701:47;11797:2;11792:3;11788:12;11785:1;11781:20;11775:4;11771:31;11761:41;;11852:82;11870:2;11863:5;11860:13;11852:82;;;11915:17;;;11896:1;11885:13;11852:82;;;11856:3;;;11405:545;;;:::o;12126:1352::-;12252:3;12246:10;-1:-1:-1;;;;;12271:6:20;12268:30;12265:56;;;12301:18;;:::i;:::-;12330:97;12420:6;12380:38;12412:4;12406:11;12380:38;:::i;:::-;12374:4;12330:97;:::i;:::-;12482:4;;12546:2;12535:14;;12563:1;12558:663;;;;13265:1;13282:6;13279:89;;;-1:-1:-1;13334:19:20;;;13328:26;13279:89;-1:-1:-1;;12083:1:20;12079:11;;;12075:24;12071:29;12061:40;12107:1;12103:11;;;12058:57;13381:81;;12528:944;;12558:663;11352:1;11345:14;;;11389:4;11376:18;;-1:-1:-1;;12594:20:20;;;12712:236;12726:7;12723:1;12720:14;12712:236;;;12815:19;;;12809:26;12794:42;;12907:27;;;;12875:1;12863:14;;;;12742:19;;12712:236;;;12716:3;12976:6;12967:7;12964:19;12961:201;;;13037:19;;;13031:26;-1:-1:-1;;13120:1:20;13116:14;;;13132:3;13112:24;13108:37;13104:42;13089:58;13074:74;;12961:201;-1:-1:-1;;;;;13208:1:20;13192:14;;;13188:22;13175:36;;-1:-1:-1;12126:1352:20:o;14880:496::-;15059:3;15097:6;15091:13;15113:66;15172:6;15167:3;15160:4;15152:6;15148:17;15113:66;:::i;:::-;15242:13;;15201:16;;;;15264:70;15242:13;15201:16;15311:4;15299:17;;15264:70;:::i;:::-;15350:20;;14880:496;-1:-1:-1;;;;14880:496:20:o;15381:127::-;15442:10;15437:3;15433:20;15430:1;15423:31;15473:4;15470:1;15463:15;15497:4;15494:1;15487:15;15513:135;15552:3;15573:17;;;15570:43;;15593:18;;:::i;:::-;-1:-1:-1;15640:1:20;15629:13;;15513:135::o;17470:251::-;17540:6;17593:2;17581:9;17572:7;17568:23;17564:32;17561:52;;;17609:1;17606;17599:12;17561:52;17641:9;17635:16;17660:31;17685:5;17660:31;:::i;18491:489::-;-1:-1:-1;;;;;18760:15:20;;;18742:34;;18812:15;;18807:2;18792:18;;18785:43;18859:2;18844:18;;18837:34;;;18907:3;18902:2;18887:18;;18880:31;;;18685:4;;18928:46;;18954:19;;18946:6;18928:46;:::i;:::-;18920:54;18491:489;-1:-1:-1;;;;;;18491:489:20:o;18985:249::-;19054:6;19107:2;19095:9;19086:7;19082:23;19078:32;19075:52;;;19123:1;19120;19113:12;19075:52;19155:9;19149:16;19174:30;19198:5;19174:30;:::i
Swarm Source
ipfs://b09e2d3d9e5b223d4ea8ae29487c8f0cb845fc463a66cd10400e1f8bb301b17e
Loading...
Loading
Loading...
Loading
[ 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.