ERC-721
Overview
Max Total Supply
64 JMD
Holders
33
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
20 JMDLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
DeSanteRecords
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-17 */ // File @openzeppelin/contracts/utils/introspection/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @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`, 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 be 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: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * 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 Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @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; } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (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 `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @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); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @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 tokenId); /** * @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); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 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://diligence.consensys.net/posts/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.5.11/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 functionCall(target, data, "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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(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) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(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) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason 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 { // 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File contracts/DeSanteRecords.sol pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MaxCopiesReached(); error MintToZeroAddress(); error NotEnoughEther(); error OwnerIndexOutOfBounds(); error OwnerIsOperator(); error OwnerQueryForNonexistentToken(); error QueryForNonexistentToken(); error SenderNotOwner(); error TokenAlreadyMinted(); error TokenIndexOutOfBounds(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); error URISetOfNonexistentSong(); contract DeSanteRecords is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable, Ownable { using Address for address; using Strings for uint256; // _tokenIds and _songIds for keeping track of the ongoing total tokenids, and total songids uint256 private _tokenIds; uint256 private _songIds; // Token name string private _name = "DeSante Records"; // Token symbol string private _symbol = "JMD"; struct tokenInfo { uint128 song; uint128 serial; } // 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; // Mapping for song URIs. Takes songId then songEdition into a string. mapping(uint256 => string) private _songURIs; // Mapping for the counters of songs minted for each song mapping(uint256 => uint256) private _songSerials; // Mapping for the extra info to each tokenId mapping(uint256 => tokenInfo) private _tokenIdInfo; //from erc721enumerable // //function returns the total supply of tokens minted by the contract function totalSupply() public view virtual override returns (uint256) { return _tokenIds; } function tokenByIndex(uint256 index) public view override returns (uint256) { if (index > _tokenIds) revert TokenIndexOutOfBounds(); return index; } function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { if (index > balanceOf(owner)) revert OwnerIndexOutOfBounds(); uint256 numMintedSoFar = _tokenIds; uint256 tokenIdsIdx; address currOwnershipAddr; unchecked { for (uint256 i; i <= numMintedSoFar; i++) { address ownership = _owners[i]; if (ownership != address(0)) { currOwnershipAddr = ownership; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } } // Execution should never reach this point. assert(false); return 0; } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _balances[owner]; } function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; if (owner == address(0)) revert OwnerQueryForNonexistentToken(); return owner; } function name() public view virtual override returns (string memory) { return _name; } //DMT function symbol() public view virtual override returns (string memory) { return _symbol; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); uint256 songId = songOfToken(tokenId); uint256 songSerial = serialOfToken(tokenId); string memory _tokenURI; // Shows different uri depending on serial number if (songSerial < 2) { _tokenURI = _songURIs[(songId * 3) - 2]; } else if (songSerial < 11) { _tokenURI = _songURIs[(songId * 3) - 1]; } else { _tokenURI = _songURIs[songId * 3]; } // Set baseURI string memory base = _baseURI(); // Concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } else { return ""; } } // // //URI Section // // //Define the baseURI string baseURI = "https://arweave.net/"; //Returns baseURI internally function _baseURI() internal view virtual returns (string memory) { return baseURI; } //sets the baseURI function setBaseURI(string memory base) public virtual { baseURI = base; } //sets the songURIs when minting a new song function _setSongURI(uint256 songId, string memory songURI1, string memory songURI2, string memory songURI3) internal virtual { if (!_exists(songId)) revert URISetOfNonexistentSong(); _songURIs[(songId * 3) - 2] = songURI1; _songURIs[(songId * 3) - 1] = songURI2; _songURIs[songId * 3] = songURI3; } //Changes the songURI for one edition of a song, when given the songId and songEdition function changeSongURI(uint256 songId, uint256 songEdition, string memory songURI) public onlyOwner virtual { if (!_exists(songId)) revert URISetOfNonexistentSong(); if (songEdition == 1) { _songURIs[(songId * 3) - 2] = songURI; } else if (songEdition == 2) { _songURIs[(songId * 3) - 1] = songURI; } else if (songEdition == 3) { _songURIs[songId * 3] = songURI; } } // //ERC721 Meat and Potatoes Section // function approve(address to, uint256 tokenId) public virtual override { address owner = ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId); } function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } // //Transfer Section // function transferFrom( address from, address to, uint256 tokenId ) public virtual override { if (!_isApprovedOrOwner(_msgSender(), tokenId)) revert TransferCallerNotOwnerNorApproved(); _transfer(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { if (!_isApprovedOrOwner(_msgSender(), tokenId)) revert TransferCallerNotOwnerNorApproved(); _transfer(from, to, tokenId); if (!_checkOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } // DM Herb on Discord that you split the bots. function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { if (!_exists(tokenId)) revert QueryForNonexistentToken(); address owner = ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } // //Minting Section! // function mintNewSong(string memory songURI1, string memory songURI2, string memory songURI3) public onlyOwner { // Updates the count of total tokenids and songids uint256 id = _tokenIds; id++; _tokenIds = id; uint256 songId = _songIds; songId++; _songIds = songId; _safeMint(msg.sender, id); _setSongURI(songId, songURI1, songURI2, songURI3); // Updates the count of how many of a particular song have been made uint256 songSerial = _songSerials[songId]; songSerial ++; _songSerials[songId] = songSerial; //makes it easy to look up the song or serial of a tokenid _tokenIdInfo[id].song = uint128(songId); _tokenIdInfo[id].serial = uint128(songSerial); } function ownerMintsCopy(uint256 tokenId, address to) public onlyOwner { //requires the sender to have the tokenId in their wallet if (ownerOf(tokenId) != msg.sender) revert SenderNotOwner(); //Gets the songId from the tokenId uint256 songId = songOfToken(tokenId); uint256 songSerial = _songSerials[songId]; //requires the current amount of copies that song to be less than what's set if (songSerial >= 100) revert MaxCopiesReached(); // Updates the count of total tokenids uint256 id = _tokenIds; id++; _tokenIds = id; _safeMint(to, id); //Updates the count of how many of a particular song have been made songSerial ++; _songSerials[songId] = songSerial; //makes it easy to look up the song or serial# of a tokenid _tokenIdInfo[id].song = uint128(songId); _tokenIdInfo[id].serial = uint128(songSerial); } function mintCopyTo(uint256 tokenId, address to) public payable { //requires eth if (msg.value < 0.05 ether) revert NotEnoughEther(); //requires the sender to have the tokenId in their walle if (ownerOf(tokenId) != msg.sender) revert SenderNotOwner(); //Gets the songId from the tokenId uint256 songId = songOfToken(tokenId); uint256 songSerial = _songSerials[songId]; //requires the current amount of copies that song to be less than what's set if (songSerial >= 100) revert MaxCopiesReached(); // Updates the count of total tokenids uint256 id = _tokenIds; id++; _tokenIds = id; _safeMint(to, id); //Updates the count of how many of a particular song have been made songSerial ++; _songSerials[songId] = songSerial; //makes it easy to look up the song or serial# of a tokenid _tokenIdInfo[id].song = uint128(songId); _tokenIdInfo[id].serial = uint128(songSerial); } function mintCopySong(uint256 tokenId) public payable { //requires eth if (msg.value < 0.05 ether) revert NotEnoughEther(); //requires the sender to have the tokenId in their wallet if (ownerOf(tokenId) != msg.sender) revert SenderNotOwner(); //Gets the songId from the tokenId uint256 songId = songOfToken(tokenId); uint256 songSerial = _songSerials[songId]; //requires the current amount of copies that song to be less than what's set if (songSerial >= 100) revert MaxCopiesReached(); // Updates the count of total tokenids uint256 id = _tokenIds; id++; _tokenIds = id; _safeMint(msg.sender, id); //Updates the count of how many of a particular song have been made songSerial ++; _songSerials[songId] = songSerial; //makes it easy to look up the song or serial# of a tokenid _tokenIdInfo[id].song = uint128(songId); _tokenIdInfo[id].serial = uint128(songSerial); } function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); if (!_checkOnERC721Received(address(0), to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } function _mint(address to, uint256 tokenId) internal virtual { if (to == address(0)) revert MintToZeroAddress(); if (_exists(tokenId)) revert TokenAlreadyMinted(); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } // //More ERC721 Functions Meat and Potatoes style Section // function _transfer( address from, address to, uint256 tokenId ) internal virtual { if (ownerOf(tokenId) != from) revert TransferFromIncorrectOwner(); if (to == address(0)) revert TransferToZeroAddress(); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ownerOf(tokenId), to, tokenId); } function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { if (owner == operator) revert OwnerIsOperator(); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } //This function is brought to you by Cheetah gang 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 { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } // //Other Functions Section // //function returns how many different songs have been created function amountOfSongs() public view virtual returns (uint256) { return _songIds; } //function returns what song a certain tokenid is function songOfToken(uint256 tokenId) public view virtual returns (uint256) { return _tokenIdInfo[tokenId].song; } //function returns what serial number a certain tokenid is function serialOfToken(uint256 tokenId) public view virtual returns (uint256) { return _tokenIdInfo[tokenId].serial; } //function returns how many of a song are minted function songSupply(uint256 songId) public view virtual returns (uint256) { return _songSerials[songId]; } //returns a songURI, when given the songId and songEdition function getSongURI(uint256 songId, uint256 songEdition) public view virtual returns (string memory) { if (!_exists(songId)) revert URIQueryForNonexistentToken(); string memory _songURI; if (songEdition == 1) { _songURI = _songURIs[(songId * 3) - 2]; } else if (songEdition == 2) { _songURI = _songURIs[(songId * 3) - 1]; } else if (songEdition == 3) { _songURI = _songURIs[songId * 3]; } string memory base = _baseURI(); return bytes(base).length > 0 ? string(abi.encodePacked(base, _songURI)) : ""; } // Function to withdraw all Ether from this contract. function withdraw() public onlyOwner{ uint amount = address(this).balance; // Payable address can receive Ether address payable owner; owner = payable(msg.sender); // send all Ether to owner (bool success, ) = owner.call{value: amount}(""); require(success, "Failed to send Ether"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MaxCopiesReached","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"NotEnoughEther","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerIsOperator","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"QueryForNonexistentToken","type":"error"},{"inputs":[],"name":"SenderNotOwner","type":"error"},{"inputs":[],"name":"TokenAlreadyMinted","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","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"},{"inputs":[],"name":"URISetOfNonexistentSong","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":"amountOfSongs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"songId","type":"uint256"},{"internalType":"uint256","name":"songEdition","type":"uint256"},{"internalType":"string","name":"songURI","type":"string"}],"name":"changeSongURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"songId","type":"uint256"},{"internalType":"uint256","name":"songEdition","type":"uint256"}],"name":"getSongURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mintCopySong","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"mintCopyTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"songURI1","type":"string"},{"internalType":"string","name":"songURI2","type":"string"},{"internalType":"string","name":"songURI3","type":"string"}],"name":"mintNewSong","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"ownerMintsCopy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"serialOfToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"base","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"songOfToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"songId","type":"uint256"}],"name":"songSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c0604052600f60808190526e446553616e7465205265636f72647360881b60a090815262000032916003919062000116565b506040805180820190915260038082526212935160ea1b60209092019182526200005f9160049162000116565b506040805180820190915260148082527f68747470733a2f2f617277656176652e6e65742f0000000000000000000000006020909201918252620000a691600c9162000116565b50348015620000b457600080fd5b50620000c033620000c6565b620001f9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200012490620001bc565b90600052602060002090601f01602090048101928262000148576000855562000193565b82601f106200016357805160ff191683800117855562000193565b8280016001018555821562000193579182015b828111156200019357825182559160200191906001019062000176565b50620001a1929150620001a5565b5090565b5b80821115620001a15760008155600101620001a6565b600181811c90821680620001d157607f821691505b60208210811415620001f357634e487b7160e01b600052602260045260246000fd5b50919050565b6120c380620002096000396000f3fe6080604052600436106101d85760003560e01c8063715018a611610102578063a22cb46511610095578063c87b56dd11610064578063c87b56dd14610570578063e8dce78f14610590578063e985e9c5146105a5578063f2fde38b146105ee57600080fd5b8063a22cb465146104fd578063b609e0a01461051d578063b88d4fde14610530578063bb2e4d551461055057600080fd5b806391b75014116100d157806391b75014146104555780639513cc021461048b57806395d89b41146104c85780639cacb06d146104dd57600080fd5b8063715018a6146103ef5780637609baba1461040457806383237cce146104175780638da5cb5b1461043757600080fd5b80633ccfd60b1161017a5780636352211e116101495780636352211e1461036257806363bdf90a146103825780636e4eff00146103a257806370a08231146103cf57600080fd5b80633ccfd60b146102ed57806342842e0e146103025780634f6ccce71461032257806355f804b31461034257600080fd5b8063095ea7b3116101b6578063095ea7b31461026c57806318160ddd1461028e57806323b872dd146102ad5780632f745c59146102cd57600080fd5b806301ffc9a7146101dd57806306fdde0314610212578063081812fc14610234575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004611d0d565b61060e565b60405190151581526020015b60405180910390f35b34801561021e57600080fd5b5061022761067b565b6040516102099190611f33565b34801561024057600080fd5b5061025461024f366004611dfc565b61070d565b6040516001600160a01b039091168152602001610209565b34801561027857600080fd5b5061028c610287366004611ce4565b610751565b005b34801561029a57600080fd5b506001545b604051908152602001610209565b3480156102b957600080fd5b5061028c6102c8366004611bf6565b6107de565b3480156102d957600080fd5b5061029f6102e8366004611ce4565b610810565b3480156102f957600080fd5b5061028c6108c1565b34801561030e57600080fd5b5061028c61031d366004611bf6565b610987565b34801561032e57600080fd5b5061029f61033d366004611dfc565b6109a2565b34801561034e57600080fd5b5061028c61035d366004611d45565b6109cb565b34801561036e57600080fd5b5061025461037d366004611dfc565b6109e2565b34801561038e57600080fd5b5061028c61039d366004611e14565b610a18565b3480156103ae57600080fd5b5061029f6103bd366004611dfc565b6000908152600a602052604090205490565b3480156103db57600080fd5b5061029f6103ea366004611baa565b610b29565b3480156103fb57600080fd5b5061028c610b6e565b61028c610412366004611dfc565b610ba4565b34801561042357600080fd5b50610227610432366004611e36565b610cb2565b34801561044357600080fd5b506000546001600160a01b0316610254565b34801561046157600080fd5b5061029f610470366004611dfc565b6000908152600b60205260409020546001600160801b031690565b34801561049757600080fd5b5061029f6104a6366004611dfc565b6000908152600b6020526040902054600160801b90046001600160801b031690565b3480156104d457600080fd5b50610227610ec0565b3480156104e957600080fd5b5061028c6104f8366004611d78565b610ecf565b34801561050957600080fd5b5061028c610518366004611caa565b610f97565b61028c61052b366004611e14565b610fa2565b34801561053c57600080fd5b5061028c61054b366004611c31565b610fca565b34801561055c57600080fd5b5061028c61056b366004611e57565b61102b565b34801561057c57600080fd5b5061022761058b366004611dfc565b6110f5565b34801561059c57600080fd5b5060025461029f565b3480156105b157600080fd5b506101fd6105c0366004611bc4565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b3480156105fa57600080fd5b5061028c610609366004611baa565b611321565b60006001600160e01b031982166380ac58cd60e01b148061063f57506001600160e01b03198216635b5e139f60e01b145b8061065a57506001600160e01b0319821663780e9d6360e01b145b8061067557506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805461068a90611ff5565b80601f01602080910402602001604051908101604052809291908181526020018280546106b690611ff5565b80156107035780601f106106d857610100808354040283529160200191610703565b820191906000526020600020905b8154815290600101906020018083116106e657829003601f168201915b5050505050905090565b6000610718826113bc565b610735576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b600061075c826109e2565b9050806001600160a01b0316836001600160a01b031614156107915760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906107b157506107af81336105c0565b155b156107cf576040516367d9dca160e11b815260040160405180910390fd5b6107d983836113d9565b505050565b6107e83382611447565b61080557604051632ce44b5f60e11b815260040160405180910390fd5b6107d98383836114ed565b600061081b83610b29565b82111561083b576040516306ed618760e11b815260040160405180910390fd5b600154600080805b8381116108aa576000818152600560205260409020546001600160a01b0316801561086c578092505b876001600160a01b0316836001600160a01b031614156108a1578684141561089a5750935061067592505050565b6001909301925b50600101610843565b50634e487b7160e01b600052600160045260246000fd5b6000546001600160a01b031633146108f45760405162461bcd60e51b81526004016108eb90611f46565b60405180910390fd5b60405147903390600090829084908381818185875af1925050503d806000811461093a576040519150601f19603f3d011682016040523d82523d6000602084013e61093f565b606091505b50509050806107d95760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b60448201526064016108eb565b6107d983838360405180602001604052806000815250610fca565b60006001548211156109c7576040516329c8c00760e21b815260040160405180910390fd5b5090565b80516109de90600c906020840190611a62565b5050565b6000818152600560205260408120546001600160a01b03168061067557604051636f96cda160e11b815260040160405180910390fd5b6000546001600160a01b03163314610a425760405162461bcd60e51b81526004016108eb90611f46565b33610a4c836109e2565b6001600160a01b031614610a7357604051630ca4a64560e11b815260040160405180910390fd5b6000828152600b60205260408120546001600160801b03166000818152600a602052604090205490915060648110610abe57604051634e5d53e160e01b815260040160405180910390fd5b60015480610acb81612030565b60018190559150610ade90508482611610565b81610ae881612030565b6000858152600a60209081526040808320849055948252600b9052929092206001600160801b03928316600160801b02929094169190911790925550505050565b60006001600160a01b038216610b52576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205490565b6000546001600160a01b03163314610b985760405162461bcd60e51b81526004016108eb90611f46565b610ba2600061162a565b565b66b1a2bc2ec50000341015610bcc57604051638a0d377960e01b815260040160405180910390fd5b33610bd6826109e2565b6001600160a01b031614610bfd57604051630ca4a64560e11b815260040160405180910390fd5b6000818152600b60205260408120546001600160801b03166000818152600a602052604090205490915060648110610c4857604051634e5d53e160e01b815260040160405180910390fd5b60015480610c5581612030565b60018190559150610c6890503382611610565b81610c7281612030565b6000858152600a60209081526040808320849055948252600b9052929092206001600160801b03928316600160801b029290941691909117909255505050565b6060610cbd836113bc565b610cda57604051630a14c4b560e41b815260040160405180910390fd5b60608260011415610d9e57600960006002610cf6876003611f93565b610d009190611fb2565b81526020019081526020016000208054610d1990611ff5565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4590611ff5565b8015610d925780601f10610d6757610100808354040283529160200191610d92565b820191906000526020600020905b815481529060010190602001808311610d7557829003601f168201915b50505050509050610e6a565b8260021415610db857600960006001610cf6876003611f93565b8260031415610e6a5760096000610dd0866003611f93565b81526020019081526020016000208054610de990611ff5565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1590611ff5565b8015610e625780601f10610e3757610100808354040283529160200191610e62565b820191906000526020600020905b815481529060010190602001808311610e4557829003601f168201915b505050505090505b6000610e7461167a565b90506000815111610e945760405180602001604052806000815250610eb7565b8082604051602001610ea7929190611ec7565b6040516020818303038152906040525b95945050505050565b60606004805461068a90611ff5565b6000546001600160a01b03163314610ef95760405162461bcd60e51b81526004016108eb90611f46565b60015480610f0681612030565b6001819055600254909250905080610f1d81612030565b60028190559150610f3090503383611610565b610f3c81868686611689565b6000818152600a602052604090205480610f5581612030565b6000848152600a60209081526040808320849055968252600b9052949094206001600160801b03948516600160801b0294909316939093179091555050505050565b6109de338383611763565b66b1a2bc2ec50000341015610a4257604051638a0d377960e01b815260040160405180910390fd5b610fd43383611447565b610ff157604051632ce44b5f60e11b815260040160405180910390fd5b610ffc8484846114ed565b61100884848484611803565b611025576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6000546001600160a01b031633146110555760405162461bcd60e51b81526004016108eb90611f46565b61105e836113bc565b61107b57604051630cb23d2360e21b815260040160405180910390fd5b81600114156110c15780600960006002611096876003611f93565b6110a09190611fb2565b81526020019081526020016000209080519060200190611025929190611a62565b81600214156110dc5780600960006001611096876003611f93565b81600314156107d95780600960006110a0866003611f93565b6060611100826113bc565b61111d57604051630a14c4b560e41b815260040160405180910390fd5b6000828152600b60205260409020546001600160801b0380821691600160801b900416606060028210156112045760096000600261115c866003611f93565b6111669190611fb2565b8152602001908152602001600020805461117f90611ff5565b80601f01602080910402602001604051908101604052809291908181526020018280546111ab90611ff5565b80156111f85780601f106111cd576101008083540402835291602001916111f8565b820191906000526020600020905b8154815290600101906020018083116111db57829003601f168201915b505050505090506112c7565b600b82101561121e5760096000600161115c866003611f93565b6009600061122d856003611f93565b8152602001908152602001600020805461124690611ff5565b80601f016020809104026020016040519081016040528092919081815260200182805461127290611ff5565b80156112bf5780601f10611294576101008083540402835291602001916112bf565b820191906000526020600020905b8154815290600101906020018083116112a257829003601f168201915b505050505090505b60006112d161167a565b8251909150156113085780826040516020016112ee929190611ec7565b604051602081830303815290604052945050505050919050565b5050604080516020810190915260008152949350505050565b6000546001600160a01b0316331461134b5760405162461bcd60e51b81526004016108eb90611f46565b6001600160a01b0381166113b05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108eb565b6113b98161162a565b50565b6000908152600560205260409020546001600160a01b0316151590565b600081815260076020526040902080546001600160a01b0319166001600160a01b038416908117909155819061140e826109e2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611452826113bc565b61146f57604051636c01c8cf60e11b815260040160405180910390fd5b600061147a836109e2565b9050806001600160a01b0316846001600160a01b031614806114b55750836001600160a01b03166114aa8461070d565b6001600160a01b0316145b806114e557506001600160a01b0380821660009081526008602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611500826109e2565b6001600160a01b0316146115265760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03821661154d57604051633a954ecd60e21b815260040160405180910390fd5b6115586000826113d9565b6001600160a01b0383166000908152600660205260408120805460019290611581908490611fb2565b90915550506001600160a01b03821660009081526006602052604081208054600192906115af908490611f7b565b909155505060008181526005602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6109de82826040518060200160405280600081525061195b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060600c805461068a90611ff5565b611692846113bc565b6116af57604051630cb23d2360e21b815260040160405180910390fd5b826009600060026116c1886003611f93565b6116cb9190611fb2565b815260200190815260200160002090805190602001906116ec929190611a62565b50816009600060016116ff886003611f93565b6117099190611fb2565b8152602001908152602001600020908051906020019061172a929190611a62565b50806009600061173b876003611f93565b8152602001908152602001600020908051906020019061175c929190611a62565b5050505050565b816001600160a01b0316836001600160a01b0316141561179657604051634c91180b60e01b815260040160405180910390fd5b6001600160a01b03838116600081815260086020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60006001600160a01b0384163b1561195057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611847903390899088908890600401611ef6565b602060405180830381600087803b15801561186157600080fd5b505af1925050508015611891575060408051601f3d908101601f1916820190925261188e91810190611d29565b60015b611936573d8080156118bf576040519150601f19603f3d011682016040523d82523d6000602084013e6118c4565b606091505b50805161192e5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016108eb565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506114e5565b506001949350505050565b611965838361198f565b6119726000848484611803565b6107d9576040516368d2bf6b60e11b815260040160405180910390fd5b6001600160a01b0382166119b557604051622e076360e81b815260040160405180910390fd5b6119be816113bc565b156119db5760405162a5a1f560e01b815260040160405180910390fd5b6001600160a01b0382166000908152600660205260408120805460019290611a04908490611f7b565b909155505060008181526005602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611a6e90611ff5565b90600052602060002090601f016020900481019282611a905760008555611ad6565b82601f10611aa957805160ff1916838001178555611ad6565b82800160010185558215611ad6579182015b82811115611ad6578251825591602001919060010190611abb565b506109c79291505b808211156109c75760008155600101611ade565b600067ffffffffffffffff80841115611b0d57611b0d612061565b604051601f8501601f19908116603f01168101908282118183101715611b3557611b35612061565b81604052809350858152868686011115611b4e57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114611b7f57600080fd5b919050565b600082601f830112611b94578081fd5b611ba383833560208501611af2565b9392505050565b600060208284031215611bbb578081fd5b611ba382611b68565b60008060408385031215611bd6578081fd5b611bdf83611b68565b9150611bed60208401611b68565b90509250929050565b600080600060608486031215611c0a578081fd5b611c1384611b68565b9250611c2160208501611b68565b9150604084013590509250925092565b60008060008060808587031215611c46578081fd5b611c4f85611b68565b9350611c5d60208601611b68565b925060408501359150606085013567ffffffffffffffff811115611c7f578182fd5b8501601f81018713611c8f578182fd5b611c9e87823560208401611af2565b91505092959194509250565b60008060408385031215611cbc578182fd5b611cc583611b68565b915060208301358015158114611cd9578182fd5b809150509250929050565b60008060408385031215611cf6578182fd5b611cff83611b68565b946020939093013593505050565b600060208284031215611d1e578081fd5b8135611ba381612077565b600060208284031215611d3a578081fd5b8151611ba381612077565b600060208284031215611d56578081fd5b813567ffffffffffffffff811115611d6c578182fd5b6114e584828501611b84565b600080600060608486031215611d8c578283fd5b833567ffffffffffffffff80821115611da3578485fd5b611daf87838801611b84565b94506020860135915080821115611dc4578384fd5b611dd087838801611b84565b93506040860135915080821115611de5578283fd5b50611df286828701611b84565b9150509250925092565b600060208284031215611e0d578081fd5b5035919050565b60008060408385031215611e26578182fd5b82359150611bed60208401611b68565b60008060408385031215611e48578182fd5b50508035926020909101359150565b600080600060608486031215611e6b578081fd5b8335925060208401359150604084013567ffffffffffffffff811115611e8f578182fd5b611df286828701611b84565b60008151808452611eb3816020860160208601611fc9565b601f01601f19169290920160200192915050565b60008351611ed9818460208801611fc9565b835190830190611eed818360208801611fc9565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611f2990830184611e9b565b9695505050505050565b602081526000611ba36020830184611e9b565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611f8e57611f8e61204b565b500190565b6000816000190483118215151615611fad57611fad61204b565b500290565b600082821015611fc457611fc461204b565b500390565b60005b83811015611fe4578181015183820152602001611fcc565b838111156110255750506000910152565b600181811c9082168061200957607f821691505b6020821081141561202a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156120445761204461204b565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146113b957600080fdfea2646970667358221220636977a54a9e0f0db1b65fa73bc02f79a61913a5526e7c8536e62701afc55ba964736f6c63430008040033
Deployed Bytecode
0x6080604052600436106101d85760003560e01c8063715018a611610102578063a22cb46511610095578063c87b56dd11610064578063c87b56dd14610570578063e8dce78f14610590578063e985e9c5146105a5578063f2fde38b146105ee57600080fd5b8063a22cb465146104fd578063b609e0a01461051d578063b88d4fde14610530578063bb2e4d551461055057600080fd5b806391b75014116100d157806391b75014146104555780639513cc021461048b57806395d89b41146104c85780639cacb06d146104dd57600080fd5b8063715018a6146103ef5780637609baba1461040457806383237cce146104175780638da5cb5b1461043757600080fd5b80633ccfd60b1161017a5780636352211e116101495780636352211e1461036257806363bdf90a146103825780636e4eff00146103a257806370a08231146103cf57600080fd5b80633ccfd60b146102ed57806342842e0e146103025780634f6ccce71461032257806355f804b31461034257600080fd5b8063095ea7b3116101b6578063095ea7b31461026c57806318160ddd1461028e57806323b872dd146102ad5780632f745c59146102cd57600080fd5b806301ffc9a7146101dd57806306fdde0314610212578063081812fc14610234575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004611d0d565b61060e565b60405190151581526020015b60405180910390f35b34801561021e57600080fd5b5061022761067b565b6040516102099190611f33565b34801561024057600080fd5b5061025461024f366004611dfc565b61070d565b6040516001600160a01b039091168152602001610209565b34801561027857600080fd5b5061028c610287366004611ce4565b610751565b005b34801561029a57600080fd5b506001545b604051908152602001610209565b3480156102b957600080fd5b5061028c6102c8366004611bf6565b6107de565b3480156102d957600080fd5b5061029f6102e8366004611ce4565b610810565b3480156102f957600080fd5b5061028c6108c1565b34801561030e57600080fd5b5061028c61031d366004611bf6565b610987565b34801561032e57600080fd5b5061029f61033d366004611dfc565b6109a2565b34801561034e57600080fd5b5061028c61035d366004611d45565b6109cb565b34801561036e57600080fd5b5061025461037d366004611dfc565b6109e2565b34801561038e57600080fd5b5061028c61039d366004611e14565b610a18565b3480156103ae57600080fd5b5061029f6103bd366004611dfc565b6000908152600a602052604090205490565b3480156103db57600080fd5b5061029f6103ea366004611baa565b610b29565b3480156103fb57600080fd5b5061028c610b6e565b61028c610412366004611dfc565b610ba4565b34801561042357600080fd5b50610227610432366004611e36565b610cb2565b34801561044357600080fd5b506000546001600160a01b0316610254565b34801561046157600080fd5b5061029f610470366004611dfc565b6000908152600b60205260409020546001600160801b031690565b34801561049757600080fd5b5061029f6104a6366004611dfc565b6000908152600b6020526040902054600160801b90046001600160801b031690565b3480156104d457600080fd5b50610227610ec0565b3480156104e957600080fd5b5061028c6104f8366004611d78565b610ecf565b34801561050957600080fd5b5061028c610518366004611caa565b610f97565b61028c61052b366004611e14565b610fa2565b34801561053c57600080fd5b5061028c61054b366004611c31565b610fca565b34801561055c57600080fd5b5061028c61056b366004611e57565b61102b565b34801561057c57600080fd5b5061022761058b366004611dfc565b6110f5565b34801561059c57600080fd5b5060025461029f565b3480156105b157600080fd5b506101fd6105c0366004611bc4565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b3480156105fa57600080fd5b5061028c610609366004611baa565b611321565b60006001600160e01b031982166380ac58cd60e01b148061063f57506001600160e01b03198216635b5e139f60e01b145b8061065a57506001600160e01b0319821663780e9d6360e01b145b8061067557506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805461068a90611ff5565b80601f01602080910402602001604051908101604052809291908181526020018280546106b690611ff5565b80156107035780601f106106d857610100808354040283529160200191610703565b820191906000526020600020905b8154815290600101906020018083116106e657829003601f168201915b5050505050905090565b6000610718826113bc565b610735576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b600061075c826109e2565b9050806001600160a01b0316836001600160a01b031614156107915760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906107b157506107af81336105c0565b155b156107cf576040516367d9dca160e11b815260040160405180910390fd5b6107d983836113d9565b505050565b6107e83382611447565b61080557604051632ce44b5f60e11b815260040160405180910390fd5b6107d98383836114ed565b600061081b83610b29565b82111561083b576040516306ed618760e11b815260040160405180910390fd5b600154600080805b8381116108aa576000818152600560205260409020546001600160a01b0316801561086c578092505b876001600160a01b0316836001600160a01b031614156108a1578684141561089a5750935061067592505050565b6001909301925b50600101610843565b50634e487b7160e01b600052600160045260246000fd5b6000546001600160a01b031633146108f45760405162461bcd60e51b81526004016108eb90611f46565b60405180910390fd5b60405147903390600090829084908381818185875af1925050503d806000811461093a576040519150601f19603f3d011682016040523d82523d6000602084013e61093f565b606091505b50509050806107d95760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b60448201526064016108eb565b6107d983838360405180602001604052806000815250610fca565b60006001548211156109c7576040516329c8c00760e21b815260040160405180910390fd5b5090565b80516109de90600c906020840190611a62565b5050565b6000818152600560205260408120546001600160a01b03168061067557604051636f96cda160e11b815260040160405180910390fd5b6000546001600160a01b03163314610a425760405162461bcd60e51b81526004016108eb90611f46565b33610a4c836109e2565b6001600160a01b031614610a7357604051630ca4a64560e11b815260040160405180910390fd5b6000828152600b60205260408120546001600160801b03166000818152600a602052604090205490915060648110610abe57604051634e5d53e160e01b815260040160405180910390fd5b60015480610acb81612030565b60018190559150610ade90508482611610565b81610ae881612030565b6000858152600a60209081526040808320849055948252600b9052929092206001600160801b03928316600160801b02929094169190911790925550505050565b60006001600160a01b038216610b52576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205490565b6000546001600160a01b03163314610b985760405162461bcd60e51b81526004016108eb90611f46565b610ba2600061162a565b565b66b1a2bc2ec50000341015610bcc57604051638a0d377960e01b815260040160405180910390fd5b33610bd6826109e2565b6001600160a01b031614610bfd57604051630ca4a64560e11b815260040160405180910390fd5b6000818152600b60205260408120546001600160801b03166000818152600a602052604090205490915060648110610c4857604051634e5d53e160e01b815260040160405180910390fd5b60015480610c5581612030565b60018190559150610c6890503382611610565b81610c7281612030565b6000858152600a60209081526040808320849055948252600b9052929092206001600160801b03928316600160801b029290941691909117909255505050565b6060610cbd836113bc565b610cda57604051630a14c4b560e41b815260040160405180910390fd5b60608260011415610d9e57600960006002610cf6876003611f93565b610d009190611fb2565b81526020019081526020016000208054610d1990611ff5565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4590611ff5565b8015610d925780601f10610d6757610100808354040283529160200191610d92565b820191906000526020600020905b815481529060010190602001808311610d7557829003601f168201915b50505050509050610e6a565b8260021415610db857600960006001610cf6876003611f93565b8260031415610e6a5760096000610dd0866003611f93565b81526020019081526020016000208054610de990611ff5565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1590611ff5565b8015610e625780601f10610e3757610100808354040283529160200191610e62565b820191906000526020600020905b815481529060010190602001808311610e4557829003601f168201915b505050505090505b6000610e7461167a565b90506000815111610e945760405180602001604052806000815250610eb7565b8082604051602001610ea7929190611ec7565b6040516020818303038152906040525b95945050505050565b60606004805461068a90611ff5565b6000546001600160a01b03163314610ef95760405162461bcd60e51b81526004016108eb90611f46565b60015480610f0681612030565b6001819055600254909250905080610f1d81612030565b60028190559150610f3090503383611610565b610f3c81868686611689565b6000818152600a602052604090205480610f5581612030565b6000848152600a60209081526040808320849055968252600b9052949094206001600160801b03948516600160801b0294909316939093179091555050505050565b6109de338383611763565b66b1a2bc2ec50000341015610a4257604051638a0d377960e01b815260040160405180910390fd5b610fd43383611447565b610ff157604051632ce44b5f60e11b815260040160405180910390fd5b610ffc8484846114ed565b61100884848484611803565b611025576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6000546001600160a01b031633146110555760405162461bcd60e51b81526004016108eb90611f46565b61105e836113bc565b61107b57604051630cb23d2360e21b815260040160405180910390fd5b81600114156110c15780600960006002611096876003611f93565b6110a09190611fb2565b81526020019081526020016000209080519060200190611025929190611a62565b81600214156110dc5780600960006001611096876003611f93565b81600314156107d95780600960006110a0866003611f93565b6060611100826113bc565b61111d57604051630a14c4b560e41b815260040160405180910390fd5b6000828152600b60205260409020546001600160801b0380821691600160801b900416606060028210156112045760096000600261115c866003611f93565b6111669190611fb2565b8152602001908152602001600020805461117f90611ff5565b80601f01602080910402602001604051908101604052809291908181526020018280546111ab90611ff5565b80156111f85780601f106111cd576101008083540402835291602001916111f8565b820191906000526020600020905b8154815290600101906020018083116111db57829003601f168201915b505050505090506112c7565b600b82101561121e5760096000600161115c866003611f93565b6009600061122d856003611f93565b8152602001908152602001600020805461124690611ff5565b80601f016020809104026020016040519081016040528092919081815260200182805461127290611ff5565b80156112bf5780601f10611294576101008083540402835291602001916112bf565b820191906000526020600020905b8154815290600101906020018083116112a257829003601f168201915b505050505090505b60006112d161167a565b8251909150156113085780826040516020016112ee929190611ec7565b604051602081830303815290604052945050505050919050565b5050604080516020810190915260008152949350505050565b6000546001600160a01b0316331461134b5760405162461bcd60e51b81526004016108eb90611f46565b6001600160a01b0381166113b05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108eb565b6113b98161162a565b50565b6000908152600560205260409020546001600160a01b0316151590565b600081815260076020526040902080546001600160a01b0319166001600160a01b038416908117909155819061140e826109e2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611452826113bc565b61146f57604051636c01c8cf60e11b815260040160405180910390fd5b600061147a836109e2565b9050806001600160a01b0316846001600160a01b031614806114b55750836001600160a01b03166114aa8461070d565b6001600160a01b0316145b806114e557506001600160a01b0380821660009081526008602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611500826109e2565b6001600160a01b0316146115265760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03821661154d57604051633a954ecd60e21b815260040160405180910390fd5b6115586000826113d9565b6001600160a01b0383166000908152600660205260408120805460019290611581908490611fb2565b90915550506001600160a01b03821660009081526006602052604081208054600192906115af908490611f7b565b909155505060008181526005602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6109de82826040518060200160405280600081525061195b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060600c805461068a90611ff5565b611692846113bc565b6116af57604051630cb23d2360e21b815260040160405180910390fd5b826009600060026116c1886003611f93565b6116cb9190611fb2565b815260200190815260200160002090805190602001906116ec929190611a62565b50816009600060016116ff886003611f93565b6117099190611fb2565b8152602001908152602001600020908051906020019061172a929190611a62565b50806009600061173b876003611f93565b8152602001908152602001600020908051906020019061175c929190611a62565b5050505050565b816001600160a01b0316836001600160a01b0316141561179657604051634c91180b60e01b815260040160405180910390fd5b6001600160a01b03838116600081815260086020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60006001600160a01b0384163b1561195057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611847903390899088908890600401611ef6565b602060405180830381600087803b15801561186157600080fd5b505af1925050508015611891575060408051601f3d908101601f1916820190925261188e91810190611d29565b60015b611936573d8080156118bf576040519150601f19603f3d011682016040523d82523d6000602084013e6118c4565b606091505b50805161192e5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016108eb565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506114e5565b506001949350505050565b611965838361198f565b6119726000848484611803565b6107d9576040516368d2bf6b60e11b815260040160405180910390fd5b6001600160a01b0382166119b557604051622e076360e81b815260040160405180910390fd5b6119be816113bc565b156119db5760405162a5a1f560e01b815260040160405180910390fd5b6001600160a01b0382166000908152600660205260408120805460019290611a04908490611f7b565b909155505060008181526005602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611a6e90611ff5565b90600052602060002090601f016020900481019282611a905760008555611ad6565b82601f10611aa957805160ff1916838001178555611ad6565b82800160010185558215611ad6579182015b82811115611ad6578251825591602001919060010190611abb565b506109c79291505b808211156109c75760008155600101611ade565b600067ffffffffffffffff80841115611b0d57611b0d612061565b604051601f8501601f19908116603f01168101908282118183101715611b3557611b35612061565b81604052809350858152868686011115611b4e57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114611b7f57600080fd5b919050565b600082601f830112611b94578081fd5b611ba383833560208501611af2565b9392505050565b600060208284031215611bbb578081fd5b611ba382611b68565b60008060408385031215611bd6578081fd5b611bdf83611b68565b9150611bed60208401611b68565b90509250929050565b600080600060608486031215611c0a578081fd5b611c1384611b68565b9250611c2160208501611b68565b9150604084013590509250925092565b60008060008060808587031215611c46578081fd5b611c4f85611b68565b9350611c5d60208601611b68565b925060408501359150606085013567ffffffffffffffff811115611c7f578182fd5b8501601f81018713611c8f578182fd5b611c9e87823560208401611af2565b91505092959194509250565b60008060408385031215611cbc578182fd5b611cc583611b68565b915060208301358015158114611cd9578182fd5b809150509250929050565b60008060408385031215611cf6578182fd5b611cff83611b68565b946020939093013593505050565b600060208284031215611d1e578081fd5b8135611ba381612077565b600060208284031215611d3a578081fd5b8151611ba381612077565b600060208284031215611d56578081fd5b813567ffffffffffffffff811115611d6c578182fd5b6114e584828501611b84565b600080600060608486031215611d8c578283fd5b833567ffffffffffffffff80821115611da3578485fd5b611daf87838801611b84565b94506020860135915080821115611dc4578384fd5b611dd087838801611b84565b93506040860135915080821115611de5578283fd5b50611df286828701611b84565b9150509250925092565b600060208284031215611e0d578081fd5b5035919050565b60008060408385031215611e26578182fd5b82359150611bed60208401611b68565b60008060408385031215611e48578182fd5b50508035926020909101359150565b600080600060608486031215611e6b578081fd5b8335925060208401359150604084013567ffffffffffffffff811115611e8f578182fd5b611df286828701611b84565b60008151808452611eb3816020860160208601611fc9565b601f01601f19169290920160200192915050565b60008351611ed9818460208801611fc9565b835190830190611eed818360208801611fc9565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611f2990830184611e9b565b9695505050505050565b602081526000611ba36020830184611e9b565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611f8e57611f8e61204b565b500190565b6000816000190483118215151615611fad57611fad61204b565b500290565b600082821015611fc457611fc461204b565b500390565b60005b83811015611fe4578181015183820152602001611fcc565b838111156110255750506000910152565b600181811c9082168061200957607f821691505b6020821081141561202a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156120445761204461204b565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146113b957600080fdfea2646970667358221220636977a54a9e0f0db1b65fa73bc02f79a61913a5526e7c8536e62701afc55ba964736f6c63430008040033
Deployed Bytecode Sourcemap
24285:17483:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26970:384;;;;;;;;;;-1:-1:-1;26970:384:0;;;;;:::i;:::-;;:::i;:::-;;;7905:14:1;;7898:22;7880:41;;7868:2;7853:18;26970:384:0;;;;;;;;27827:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30821:210::-;;;;;;;;;;-1:-1:-1;30821:210:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7203:32:1;;;7185:51;;7173:2;7158:18;30821:210:0;7140:102:1;30449:364:0;;;;;;;;;;-1:-1:-1;30449:364:0;;;;;:::i;:::-;;:::i;:::-;;25739:109;;;;;;;;;;-1:-1:-1;25829:9:0;;25739:109;;;9838:25:1;;;9826:2;9811:18;25739:109:0;9793:76:1;31414:267:0;;;;;;;;;;-1:-1:-1;31414:267:0;;;;;:::i;:::-;;:::i;26045:913::-;;;;;;;;;;-1:-1:-1;26045:913:0;;;;;:::i;:::-;;:::i;41409:352::-;;;;;;;;;;;;;:::i;31691:185::-;;;;;;;;;;-1:-1:-1;31691:185:0;;;;;:::i;:::-;;:::i;25858:177::-;;;;;;;;;;-1:-1:-1;25858:177:0;;;;;:::i;:::-;;:::i;29297:88::-;;;;;;;;;;-1:-1:-1;29297:88:0;;;;;:::i;:::-;;:::i;27578:237::-;;;;;;;;;;-1:-1:-1;27578:237:0;;;;;:::i;:::-;;:::i;33773:1046::-;;;;;;;;;;-1:-1:-1;33773:1046:0;;;;;:::i;:::-;;:::i;40493:118::-;;;;;;;;;;-1:-1:-1;40493:118:0;;;;;:::i;:::-;40558:7;40583:20;;;:12;:20;;;;;;;40493:118;27366:200;;;;;;;;;;-1:-1:-1;27366:200:0;;;;;:::i;:::-;;:::i;22689:103::-;;;;;;;;;;;;;:::i;35972:1128::-;;;;;;:::i;:::-;;:::i;40685:657::-;;;;;;;;;;-1:-1:-1;40685:657:0;;;;;:::i;:::-;;:::i;22038:87::-;;;;;;;;;;-1:-1:-1;22084:7:0;22111:6;-1:-1:-1;;;;;22111:6:0;22038:87;;40103:126;;;;;;;;;;-1:-1:-1;40103:126:0;;;;;:::i;:::-;40170:7;40195:21;;;:12;:21;;;;;:26;-1:-1:-1;;;;;40195:26:0;;40103:126;40301:130;;;;;;;;;;-1:-1:-1;40301:130:0;;;;;:::i;:::-;40370:7;40395:21;;;:12;:21;;;;;:28;-1:-1:-1;;;40395:28:0;;-1:-1:-1;;;;;40395:28:0;;40301:130;27954:108;;;;;;;;;;;;;:::i;32892:869::-;;;;;;;;;;-1:-1:-1;32892:869:0;;;;;:::i;:::-;;:::i;31039:155::-;;;;;;;;;;-1:-1:-1;31039:155:0;;;;;:::i;:::-;;:::i;34831:1129::-;;;;;;:::i;:::-;;:::i;31886:433::-;;;;;;;;;;-1:-1:-1;31886:433:0;;;;;:::i;:::-;;:::i;29887:496::-;;;;;;;;;;-1:-1:-1;29887:496:0;;;;;:::i;:::-;;:::i;28074:921::-;;;;;;;;;;-1:-1:-1;28074:921:0;;;;;:::i;:::-;;:::i;39945:95::-;;;;;;;;;;-1:-1:-1;40024:8:0;;39945:95;;31202:164;;;;;;;;;;-1:-1:-1;31202:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;31323:25:0;;;31299:4;31323:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;31202:164;22947:201;;;;;;;;;;-1:-1:-1;22947:201:0;;;;;:::i;:::-;;:::i;26970:384::-;27072:4;-1:-1:-1;;;;;;27113:40:0;;-1:-1:-1;;;27113:40:0;;:107;;-1:-1:-1;;;;;;;27172:48:0;;-1:-1:-1;;;27172:48:0;27113:107;:176;;;-1:-1:-1;;;;;;;27239:50:0;;-1:-1:-1;;;27239:50:0;27113:176;:231;;;-1:-1:-1;;;;;;;;;;20917:40:0;;;27308:36;27091:253;26970:384;-1:-1:-1;;26970:384:0:o;27827:104::-;27881:13;27916:5;27909:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27827:104;:::o;30821:210::-;30897:7;30922:16;30930:7;30922;:16::i;:::-;30917:64;;30947:34;;-1:-1:-1;;;30947:34:0;;;;;;;;;;;30917:64;-1:-1:-1;30999:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;30999:24:0;;30821:210::o;30449:364::-;30530:13;30546:16;30554:7;30546;:16::i;:::-;30530:32;;30583:5;-1:-1:-1;;;;;30577:11:0;:2;-1:-1:-1;;;;;30577:11:0;;30573:48;;;30597:24;;-1:-1:-1;;;30597:24:0;;;;;;;;;;;30573:48;17675:10;-1:-1:-1;;;;;30638:21:0;;;;;;:63;;-1:-1:-1;30664:37:0;30681:5;17675:10;31202:164;:::i;30664:37::-;30663:38;30638:63;30634:138;;;30725:35;;-1:-1:-1;;;30725:35:0;;;;;;;;;;;30634:138;30784:21;30793:2;30797:7;30784:8;:21::i;:::-;30449:364;;;:::o;31414:267::-;31551:41;17675:10;31584:7;31551:18;:41::i;:::-;31546:90;;31601:35;;-1:-1:-1;;;31601:35:0;;;;;;;;;;;31546:90;31645:28;31655:4;31661:2;31665:7;31645:9;:28::i;26045:913::-;26134:7;26168:16;26178:5;26168:9;:16::i;:::-;26160:5;:24;26156:60;;;26193:23;;-1:-1:-1;;;26193:23:0;;;;;;;;;;;26156:60;26254:9;;26229:22;;;26373:461;26394:14;26389:1;:19;26373:461;;26436:17;26456:10;;;:7;:10;;;;;;-1:-1:-1;;;;;26456:10:0;26491:23;;26487:105;;26561:9;26541:29;;26487:105;26637:5;-1:-1:-1;;;;;26616:26:0;:17;-1:-1:-1;;;;;26616:26:0;;26612:205;;;26688:5;26673:11;:20;26669:89;;;-1:-1:-1;26731:1:0;-1:-1:-1;26724:8:0;;-1:-1:-1;;;26724:8:0;26669:89;26782:13;;;;;26612:205;-1:-1:-1;26410:3:0;;26373:461;;;-1:-1:-1;;;;26914:13:0;;;;;;;;41409:352;22084:7;22111:6;-1:-1:-1;;;;;22111:6:0;17675:10;22258:23;22250:68;;;;-1:-1:-1;;;22250:68:0;;;;;;;:::i;:::-;;;;;;;;;41673:29:::1;::::0;41470:21:::1;::::0;41596:10:::1;::::0;41456:11:::1;::::0;41596:10;;41470:21;;41456:11;41673:29;41456:11;41673:29;41470:21;41596:10;41673:29:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41654:48;;;41721:7;41713:40;;;::::0;-1:-1:-1;;;41713:40:0;;9184:2:1;41713:40:0::1;::::0;::::1;9166:21:1::0;9223:2;9203:18;;;9196:30;-1:-1:-1;;;9242:18:1;;;9235:50;9302:18;;41713:40:0::1;9156:170:1::0;31691:185:0;31829:39;31846:4;31852:2;31856:7;31829:39;;;;;;;;;;;;:16;:39::i;25858:177::-;25925:7;25959:9;;25951:5;:17;25947:53;;;25977:23;;-1:-1:-1;;;25977:23:0;;;;;;;;;;;25947:53;-1:-1:-1;26020:5:0;25858:177::o;29297:88::-;29363:14;;;;:7;;:14;;;;;:::i;:::-;;29297:88;:::o;27578:237::-;27650:7;27688:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27688:16:0;27721:19;27717:63;;27749:31;;-1:-1:-1;;;27749:31:0;;;;;;;;;;;33773:1046;22084:7;22111:6;-1:-1:-1;;;;;22111:6:0;17675:10;22258:23;22250:68;;;;-1:-1:-1;;;22250:68:0;;;;;;;:::i;:::-;33978:10:::1;33958:16;33966:7:::0;33958::::1;:16::i;:::-;-1:-1:-1::0;;;;;33958:30:0::1;;33954:59;;33997:16;;-1:-1:-1::0;;;33997:16:0::1;;;;;;;;;;;33954:59;34072:14;40195:21:::0;;;:12;:21;;;;;:26;-1:-1:-1;;;;;40195:26:0;34122:18:::1;34143:20:::0;;;:12:::1;:20;::::0;;;;;34072:37;;-1:-1:-1;34282:3:0::1;34268:17:::0;::::1;34264:48;;34294:18;;-1:-1:-1::0;;;34294:18:0::1;;;;;;;;;;;34264:48;34390:9;::::0;;34412:4:::1;34390:9:::0;34412:4:::1;:::i;:::-;34429:9;:14:::0;;;34412:4;-1:-1:-1;34458:17:0::1;::::0;-1:-1:-1;34468:2:0;34412:4;34458:9:::1;:17::i;:::-;34569:13:::0;::::1;::::0;::::1;:::i;:::-;34595:20;::::0;;;:12:::1;:20;::::0;;;;;;;:33;;;34712:16;;;:12:::1;:16:::0;;;;;;-1:-1:-1;;;;;34764:45:0;;::::1;-1:-1:-1::0;;;34764:45:0::1;34712:39:::0;;;::::1;34764:45:::0;;;::::1;::::0;;;-1:-1:-1;;;;33773:1046:0:o;27366:200::-;27438:7;-1:-1:-1;;;;;27464:19:0;;27460:60;;27492:28;;-1:-1:-1;;;27492:28:0;;;;;;;;;;;27460:60;-1:-1:-1;;;;;;27540:16:0;;;;;:9;:16;;;;;;;27366:200::o;22689:103::-;22084:7;22111:6;-1:-1:-1;;;;;22111:6:0;17675:10;22258:23;22250:68;;;;-1:-1:-1;;;22250:68:0;;;;;;;:::i;:::-;22754:30:::1;22781:1;22754:18;:30::i;:::-;22689:103::o:0;35972:1128::-;36110:10;36098:9;:22;36094:51;;;36129:16;;-1:-1:-1;;;36129:16:0;;;;;;;;;;;36094:51;36251:10;36231:16;36239:7;36231;:16::i;:::-;-1:-1:-1;;;;;36231:30:0;;36227:59;;36270:16;;-1:-1:-1;;;36270:16:0;;;;;;;;;;;36227:59;36345:14;40195:21;;;:12;:21;;;;;:26;-1:-1:-1;;;;;40195:26:0;36395:18;36416:20;;;:12;:20;;;;;;36345:37;;-1:-1:-1;36555:3:0;36541:17;;36537:48;;36567:18;;-1:-1:-1;;;36567:18:0;;;;;;;;;;;36537:48;36663:9;;;36685:4;36663:9;36685:4;:::i;:::-;36702:9;:14;;;36685:4;-1:-1:-1;36731:25:0;;-1:-1:-1;36741:10:0;36685:4;36731:9;:25::i;:::-;36850:13;;;;:::i;:::-;36876:20;;;;:12;:20;;;;;;;;:33;;;36993:16;;;:12;:16;;;;;;-1:-1:-1;;;;;37045:45:0;;;-1:-1:-1;;;37045:45:0;36993:39;;;;37045:45;;;;;;;-1:-1:-1;;;35972:1128:0:o;40685:657::-;40771:13;40802:15;40810:6;40802:7;:15::i;:::-;40797:58;;40826:29;;-1:-1:-1;;;40826:29:0;;;;;;;;;;;40797:58;40866:22;40903:11;40918:1;40903:16;40899:306;;;40953:9;:27;40978:1;40964:10;:6;40973:1;40964:10;:::i;:::-;40963:16;;;;:::i;:::-;40953:27;;;;;;;;;;;40942:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40899:306;;;41009:11;41024:1;41009:16;41005:200;;;41059:9;:27;41084:1;41070:10;:6;41079:1;41070:10;:::i;41005:200::-;41115:11;41130:1;41115:16;41111:94;;;41165:9;:21;41175:10;:6;41184:1;41175:10;:::i;:::-;41165:21;;;;;;;;;;;41154:32;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41111:94;41215:18;41236:10;:8;:10::i;:::-;41215:31;;41285:1;41270:4;41264:18;:22;:70;;;;;;;;;;;;;;;;;41313:4;41319:8;41296:32;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41264:70;41257:77;40685:657;-1:-1:-1;;;;;40685:657:0:o;27954:108::-;28010:13;28045:7;28038:14;;;;;:::i;32892:869::-;22084:7;22111:6;-1:-1:-1;;;;;22111:6:0;17675:10;22258:23;22250:68;;;;-1:-1:-1;;;22250:68:0;;;;;;;:::i;:::-;33119:9:::1;::::0;;33141:4:::1;33119:9:::0;33141:4:::1;:::i;:::-;33158:9;:14:::0;;;33202:8:::1;::::0;33141:4;;-1:-1:-1;33202:8:0;-1:-1:-1;33202:8:0;33223::::1;33202::::0;33223::::1;:::i;:::-;33244;:17:::0;;;33223:8;-1:-1:-1;33276:25:0::1;::::0;-1:-1:-1;33286:10:0::1;33298:2:::0;33276:9:::1;:25::i;:::-;33314:49;33326:6;33334:8;33344;33354;33314:11;:49::i;:::-;33458:18;33479:20:::0;;;:12:::1;:20;::::0;;;;;;33512:13:::1;33479:20:::0;33512:13:::1;:::i;:::-;33538:20;::::0;;;:12:::1;:20;::::0;;;;;;;:33;;;33654:16;;;:12:::1;:16:::0;;;;;;-1:-1:-1;;;;;33706:45:0;;::::1;-1:-1:-1::0;;;33706:45:0::1;33654:39:::0;;;::::1;33706:45:::0;;;::::1;::::0;;;-1:-1:-1;;;;;32892:869:0:o;31039:155::-;31134:52;17675:10;31167:8;31177;31134:18;:52::i;34831:1129::-;34979:10;34967:9;:22;34963:51;;;34998:16;;-1:-1:-1;;;34998:16:0;;;;;;;;;;;31886:433;32056:41;17675:10;32089:7;32056:18;:41::i;:::-;32051:90;;32106:35;;-1:-1:-1;;;32106:35:0;;;;;;;;;;;32051:90;32150:28;32160:4;32166:2;32170:7;32150:9;:28::i;:::-;32192:48;32215:4;32221:2;32225:7;32234:5;32192:22;:48::i;:::-;32187:125;;32262:40;;-1:-1:-1;;;32262:40:0;;;;;;;;;;;32187:125;31886:433;;;;:::o;29887:496::-;22084:7;22111:6;-1:-1:-1;;;;;22111:6:0;17675:10;22258:23;22250:68;;;;-1:-1:-1;;;22250:68:0;;;;;;;:::i;:::-;30011:15:::1;30019:6;30011:7;:15::i;:::-;30006:54;;30035:25;;-1:-1:-1::0;;;30035:25:0::1;;;;;;;;;;;30006:54;30077:11;30092:1;30077:16;30073:303;;;30146:7:::0;30116:9:::1;:27;30141:1;30127:10;:6:::0;30136:1:::1;30127:10;:::i;:::-;30126:16;;;;:::i;:::-;30116:27;;;;;;;;;;;:37;;;;;;;;;;;;:::i;30073:303::-;30182:11;30197:1;30182:16;30178:198;;;30251:7:::0;30221:9:::1;:27;30246:1;30232:10;:6:::0;30241:1:::1;30232:10;:::i;30178:198::-;30287:11;30302:1;30287:16;30283:93;;;30350:7:::0;30326:9:::1;:21;30336:10;:6:::0;30345:1:::1;30336:10;:::i;28074:921::-:0;28147:13;28178:16;28186:7;28178;:16::i;:::-;28173:59;;28203:29;;-1:-1:-1;;;28203:29:0;;;;;;;;;;;28173:59;28243:14;40195:21;;;:12;:21;;;;;:26;-1:-1:-1;;;;;40195:26:0;;;;-1:-1:-1;;;40395:28:0;;;28345:23;28455:1;28442:14;;28438:247;;;28485:9;:27;28510:1;28496:10;:6;28505:1;28496:10;:::i;:::-;28495:16;;;;:::i;:::-;28485:27;;;;;;;;;;;28473:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28438:247;;;28547:2;28534:10;:15;28530:155;;;28578:9;:27;28603:1;28589:10;:6;28598:1;28589:10;:::i;28530:155::-;28650:9;:21;28660:10;:6;28669:1;28660:10;:::i;:::-;28650:21;;;;;;;;;;;28638:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28530:155;28719:18;28740:10;:8;:10::i;:::-;28838:23;;28719:31;;-1:-1:-1;28838:27:0;28834:150;;28913:4;28919:9;28896:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28882:48;;;;;;28074:921;;;:::o;28834:150::-;-1:-1:-1;;28963:9:0;;;;;;;;;-1:-1:-1;28963:9:0;;;28074:921;-1:-1:-1;;;;28074:921:0:o;22947:201::-;22084:7;22111:6;-1:-1:-1;;;;;22111:6:0;17675:10;22258:23;22250:68;;;;-1:-1:-1;;;22250:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23036:22:0;::::1;23028:73;;;::::0;-1:-1:-1;;;23028:73:0;;8777:2:1;23028:73:0::1;::::0;::::1;8759:21:1::0;8816:2;8796:18;;;8789:30;8855:34;8835:18;;;8828:62;-1:-1:-1;;;8906:18:1;;;8899:36;8952:19;;23028:73:0::1;8749:228:1::0;23028:73:0::1;23112:28;23131:8;23112:18;:28::i;:::-;22947:201:::0;:::o;32379:127::-;32444:4;32468:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32468:16:0;:30;;;32379:127::o;38475:167::-;38550:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;38550:29:0;-1:-1:-1;;;;;38550:29:0;;;;;;;;:24;;38604:16;38550:24;38604:7;:16::i;:::-;-1:-1:-1;;;;;38595:39:0;;;;;;;;;;;38475:167;;:::o;32516:324::-;32609:4;32631:16;32639:7;32631;:16::i;:::-;32626:56;;32656:26;;-1:-1:-1;;;32656:26:0;;;;;;;;;;;32626:56;32693:13;32709:16;32717:7;32709;:16::i;:::-;32693:32;;32755:5;-1:-1:-1;;;;;32744:16:0;:7;-1:-1:-1;;;;;32744:16:0;;:51;;;;32788:7;-1:-1:-1;;;;;32764:31:0;:20;32776:7;32764:11;:20::i;:::-;-1:-1:-1;;;;;32764:31:0;;32744:51;:87;;;-1:-1:-1;;;;;;31323:25:0;;;31299:4;31323:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;32799:32;32736:96;32516:324;-1:-1:-1;;;;32516:324:0:o;37970:495::-;38118:4;-1:-1:-1;;;;;38098:24:0;:16;38106:7;38098;:16::i;:::-;-1:-1:-1;;;;;38098:24:0;;38094:65;;38131:28;;-1:-1:-1;;;38131:28:0;;;;;;;;;;;38094:65;-1:-1:-1;;;;;38174:16:0;;38170:52;;38199:23;;-1:-1:-1;;;38199:23:0;;;;;;;;;;;38170:52;38287:29;38304:1;38308:7;38287:8;:29::i;:::-;-1:-1:-1;;;;;38329:15:0;;;;;;:9;:15;;;;;:20;;38348:1;;38329:15;:20;;38348:1;;38329:20;:::i;:::-;;;;-1:-1:-1;;;;;;;38360:13:0;;;;;;:9;:13;;;;;:18;;38377:1;;38360:13;:18;;38377:1;;38360:18;:::i;:::-;;;;-1:-1:-1;;38389:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;38389:21:0;-1:-1:-1;;;;;38389:21:0;;;;;;;;;38428:27;;38389:16;;38428:27;;;;;;;37970:495;;;:::o;37112:114::-;37190:26;37200:2;37204:7;37190:26;;;;;;;;;;;;:9;:26::i;23308:191::-;23382:16;23401:6;;-1:-1:-1;;;;;23418:17:0;;;-1:-1:-1;;;;;;23418:17:0;;;;;;23451:40;;23401:6;;;;;;;23451:40;;23382:16;23451:40;23308:191;;:::o;29166:99::-;29217:13;29250:7;29243:14;;;;;:::i;29442:345::-;29589:15;29597:6;29589:7;:15::i;:::-;29584:54;;29613:25;;-1:-1:-1;;;29613:25:0;;;;;;;;;;;29584:54;29679:8;29649:9;:27;29674:1;29660:10;:6;29669:1;29660:10;:::i;:::-;29659:16;;;;:::i;:::-;29649:27;;;;;;;;;;;:38;;;;;;;;;;;;:::i;:::-;-1:-1:-1;29728:8:0;29698:9;:27;29723:1;29709:10;:6;29718:1;29709:10;:::i;:::-;29708:16;;;;:::i;:::-;29698:27;;;;;;;;;;;:38;;;;;;;;;;;;:::i;:::-;-1:-1:-1;29771:8:0;29747:9;:21;29757:10;:6;29766:1;29757:10;:::i;:::-;29747:21;;;;;;;;;;;:32;;;;;;;;;;;;:::i;:::-;;29442:345;;;;:::o;38652:307::-;38803:8;-1:-1:-1;;;;;38794:17:0;:5;-1:-1:-1;;;;;38794:17:0;;38790:47;;;38820:17;;-1:-1:-1;;;38820:17:0;;;;;;;;;;;38790:47;-1:-1:-1;;;;;38848:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;38848:46:0;;;;;;;;;;38910:41;;7880::1;;;38910::0;;7853:18:1;38910:41:0;;;;;;;38652:307;;;:::o;39022:799::-;39177:4;-1:-1:-1;;;;;39198:13:0;;9902:20;9950:8;39194:620;;39234:72;;-1:-1:-1;;;39234:72:0;;-1:-1:-1;;;;;39234:36:0;;;;;:72;;17675:10;;39285:4;;39291:7;;39300:5;;39234:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39234:72:0;;;;;;;;-1:-1:-1;;39234:72:0;;;;;;;;;;;;:::i;:::-;;;39230:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39476:13:0;;39472:272;;39519:60;;-1:-1:-1;;;39519:60:0;;8358:2:1;39519:60:0;;;8340:21:1;8397:2;8377:18;;;8370:30;8436:34;8416:18;;;8409:62;-1:-1:-1;;;8487:18:1;;;8480:48;8545:19;;39519:60:0;8330:240:1;39472:272:0;39694:6;39688:13;39679:6;39675:2;39671:15;39664:38;39230:529;-1:-1:-1;;;;;;39357:51:0;-1:-1:-1;;;39357:51:0;;-1:-1:-1;39350:58:0;;39194:620;-1:-1:-1;39798:4:0;39022:799;;;;;;:::o;37238:319::-;37378:18;37384:2;37388:7;37378:5;:18::i;:::-;37414:54;37445:1;37449:2;37453:7;37462:5;37414:22;:54::i;:::-;37409:139;;37494:40;;-1:-1:-1;;;37494:40:0;;;;;;;;;;;37569:314;-1:-1:-1;;;;;37647:16:0;;37643:48;;37672:19;;-1:-1:-1;;;37672:19:0;;;;;;;;;;;37643:48;37708:16;37716:7;37708;:16::i;:::-;37704:49;;;37733:20;;-1:-1:-1;;;37733:20:0;;;;;;;;;;;37704:49;-1:-1:-1;;;;;37768:13:0;;;;;;:9;:13;;;;;:18;;37785:1;;37768:13;:18;;37785:1;;37768:18;:::i;:::-;;;;-1:-1:-1;;37799:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;37799:21:0;-1:-1:-1;;;;;37799:21:0;;;;;;;;37840:33;;37799:16;;;37840:33;;37799:16;;37840:33;37569:314;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:2;;813:1;810;803:12;747:2;699:124;;;:::o;828:229::-;871:5;924:3;917:4;909:6;905:17;901:27;891:2;;946:5;939;932:20;891:2;972:79;1047:3;1038:6;1025:20;1018:4;1010:6;1006:17;972:79;:::i;:::-;963:88;881:176;-1:-1:-1;;;881:176:1:o;1062:196::-;1121:6;1174:2;1162:9;1153:7;1149:23;1145:32;1142:2;;;1195:6;1187;1180:22;1142:2;1223:29;1242:9;1223:29;:::i;1263:270::-;1331:6;1339;1392:2;1380:9;1371:7;1367:23;1363:32;1360:2;;;1413:6;1405;1398:22;1360:2;1441:29;1460:9;1441:29;:::i;:::-;1431:39;;1489:38;1523:2;1512:9;1508:18;1489:38;:::i;:::-;1479:48;;1350:183;;;;;:::o;1538:338::-;1615:6;1623;1631;1684:2;1672:9;1663:7;1659:23;1655:32;1652:2;;;1705:6;1697;1690:22;1652:2;1733:29;1752:9;1733:29;:::i;:::-;1723:39;;1781:38;1815:2;1804:9;1800:18;1781:38;:::i;:::-;1771:48;;1866:2;1855:9;1851:18;1838:32;1828:42;;1642:234;;;;;:::o;1881:696::-;1976:6;1984;1992;2000;2053:3;2041:9;2032:7;2028:23;2024:33;2021:2;;;2075:6;2067;2060:22;2021:2;2103:29;2122:9;2103:29;:::i;:::-;2093:39;;2151:38;2185:2;2174:9;2170:18;2151:38;:::i;:::-;2141:48;;2236:2;2225:9;2221:18;2208:32;2198:42;;2291:2;2280:9;2276:18;2263:32;2318:18;2310:6;2307:30;2304:2;;;2355:6;2347;2340:22;2304:2;2383:22;;2436:4;2428:13;;2424:27;-1:-1:-1;2414:2:1;;2470:6;2462;2455:22;2414:2;2498:73;2563:7;2558:2;2545:16;2540:2;2536;2532:11;2498:73;:::i;:::-;2488:83;;;2011:566;;;;;;;:::o;2582:367::-;2647:6;2655;2708:2;2696:9;2687:7;2683:23;2679:32;2676:2;;;2729:6;2721;2714:22;2676:2;2757:29;2776:9;2757:29;:::i;:::-;2747:39;;2836:2;2825:9;2821:18;2808:32;2883:5;2876:13;2869:21;2862:5;2859:32;2849:2;;2910:6;2902;2895:22;2849:2;2938:5;2928:15;;;2666:283;;;;;:::o;2954:264::-;3022:6;3030;3083:2;3071:9;3062:7;3058:23;3054:32;3051:2;;;3104:6;3096;3089:22;3051:2;3132:29;3151:9;3132:29;:::i;:::-;3122:39;3208:2;3193:18;;;;3180:32;;-1:-1:-1;;;3041:177:1:o;3223:255::-;3281:6;3334:2;3322:9;3313:7;3309:23;3305:32;3302:2;;;3355:6;3347;3340:22;3302:2;3399:9;3386:23;3418:30;3442:5;3418:30;:::i;3483:259::-;3552:6;3605:2;3593:9;3584:7;3580:23;3576:32;3573:2;;;3626:6;3618;3611:22;3573:2;3663:9;3657:16;3682:30;3706:5;3682:30;:::i;3747:342::-;3816:6;3869:2;3857:9;3848:7;3844:23;3840:32;3837:2;;;3890:6;3882;3875:22;3837:2;3935:9;3922:23;3968:18;3960:6;3957:30;3954:2;;;4005:6;3997;3990:22;3954:2;4033:50;4075:7;4066:6;4055:9;4051:22;4033:50;:::i;4094:783::-;4201:6;4209;4217;4270:2;4258:9;4249:7;4245:23;4241:32;4238:2;;;4291:6;4283;4276:22;4238:2;4336:9;4323:23;4365:18;4406:2;4398:6;4395:14;4392:2;;;4427:6;4419;4412:22;4392:2;4455:50;4497:7;4488:6;4477:9;4473:22;4455:50;:::i;:::-;4445:60;;4558:2;4547:9;4543:18;4530:32;4514:48;;4587:2;4577:8;4574:16;4571:2;;;4608:6;4600;4593:22;4571:2;4636:52;4680:7;4669:8;4658:9;4654:24;4636:52;:::i;:::-;4626:62;;4741:2;4730:9;4726:18;4713:32;4697:48;;4770:2;4760:8;4757:16;4754:2;;;4791:6;4783;4776:22;4754:2;;4819:52;4863:7;4852:8;4841:9;4837:24;4819:52;:::i;:::-;4809:62;;;4228:649;;;;;:::o;4882:190::-;4941:6;4994:2;4982:9;4973:7;4969:23;4965:32;4962:2;;;5015:6;5007;5000:22;4962:2;-1:-1:-1;5043:23:1;;4952:120;-1:-1:-1;4952:120:1:o;5077:264::-;5145:6;5153;5206:2;5194:9;5185:7;5181:23;5177:32;5174:2;;;5227:6;5219;5212:22;5174:2;5268:9;5255:23;5245:33;;5297:38;5331:2;5320:9;5316:18;5297:38;:::i;5346:258::-;5414:6;5422;5475:2;5463:9;5454:7;5450:23;5446:32;5443:2;;;5496:6;5488;5481:22;5443:2;-1:-1:-1;;5524:23:1;;;5594:2;5579:18;;;5566:32;;-1:-1:-1;5433:171:1:o;5609:478::-;5696:6;5704;5712;5765:2;5753:9;5744:7;5740:23;5736:32;5733:2;;;5786:6;5778;5771:22;5733:2;5827:9;5814:23;5804:33;;5884:2;5873:9;5869:18;5856:32;5846:42;;5939:2;5928:9;5924:18;5911:32;5966:18;5958:6;5955:30;5952:2;;;6003:6;5995;5988:22;5952:2;6031:50;6073:7;6064:6;6053:9;6049:22;6031:50;:::i;6092:257::-;6133:3;6171:5;6165:12;6198:6;6193:3;6186:19;6214:63;6270:6;6263:4;6258:3;6254:14;6247:4;6240:5;6236:16;6214:63;:::i;:::-;6331:2;6310:15;-1:-1:-1;;6306:29:1;6297:39;;;;6338:4;6293:50;;6141:208;-1:-1:-1;;6141:208:1:o;6354:470::-;6533:3;6571:6;6565:13;6587:53;6633:6;6628:3;6621:4;6613:6;6609:17;6587:53;:::i;:::-;6703:13;;6662:16;;;;6725:57;6703:13;6662:16;6759:4;6747:17;;6725:57;:::i;:::-;6798:20;;6541:283;-1:-1:-1;;;;6541:283:1:o;7247:488::-;-1:-1:-1;;;;;7516:15:1;;;7498:34;;7568:15;;7563:2;7548:18;;7541:43;7615:2;7600:18;;7593:34;;;7663:3;7658:2;7643:18;;7636:31;;;7441:4;;7684:45;;7709:19;;7701:6;7684:45;:::i;:::-;7676:53;7450:285;-1:-1:-1;;;;;;7450:285:1:o;7932:219::-;8081:2;8070:9;8063:21;8044:4;8101:44;8141:2;8130:9;8126:18;8118:6;8101:44;:::i;9331:356::-;9533:2;9515:21;;;9552:18;;;9545:30;9611:34;9606:2;9591:18;;9584:62;9678:2;9663:18;;9505:182::o;9874:128::-;9914:3;9945:1;9941:6;9938:1;9935:13;9932:2;;;9951:18;;:::i;:::-;-1:-1:-1;9987:9:1;;9922:80::o;10007:168::-;10047:7;10113:1;10109;10105:6;10101:14;10098:1;10095:21;10090:1;10083:9;10076:17;10072:45;10069:2;;;10120:18;;:::i;:::-;-1:-1:-1;10160:9:1;;10059:116::o;10180:125::-;10220:4;10248:1;10245;10242:8;10239:2;;;10253:18;;:::i;:::-;-1:-1:-1;10290:9:1;;10229:76::o;10310:258::-;10382:1;10392:113;10406:6;10403:1;10400:13;10392:113;;;10482:11;;;10476:18;10463:11;;;10456:39;10428:2;10421:10;10392:113;;;10523:6;10520:1;10517:13;10514:2;;;-1:-1:-1;;10558:1:1;10540:16;;10533:27;10363:205::o;10573:380::-;10652:1;10648:12;;;;10695;;;10716:2;;10770:4;10762:6;10758:17;10748:27;;10716:2;10823;10815:6;10812:14;10792:18;10789:38;10786:2;;;10869:10;10864:3;10860:20;10857:1;10850:31;10904:4;10901:1;10894:15;10932:4;10929:1;10922:15;10786:2;;10628:325;;;:::o;10958:135::-;10997:3;-1:-1:-1;;11018:17:1;;11015:2;;;11038:18;;:::i;:::-;-1:-1:-1;11085:1:1;11074:13;;11005:88::o;11098:127::-;11159:10;11154:3;11150:20;11147:1;11140:31;11190:4;11187:1;11180:15;11214:4;11211:1;11204:15;11230:127;11291:10;11286:3;11282:20;11279:1;11272:31;11322:4;11319:1;11312:15;11346:4;11343:1;11336:15;11362:131;-1:-1:-1;;;;;;11436:32:1;;11426:43;;11416:2;;11483:1;11480;11473:12
Swarm Source
ipfs://636977a54a9e0f0db1b65fa73bc02f79a61913a5526e7c8536e62701afc55ba9
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.