ERC-721
NFT
Overview
Max Total Supply
5,969 ALPHASHARKS
Holders
1,414
Market
Volume (24H)
0.01 ETH
Min Price (24H)
$31.12 @ 0.010000 ETH
Max Price (24H)
$31.12 @ 0.010000 ETH
Other Info
Token Contract
Balance
6 ALPHASHARKSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
AlphaSharks
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import "erc721a/contracts/ERC721A.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/access/AccessControl.sol"; /* ░█████╗░██╗░░░░░██████╗░██╗░░██╗░█████╗░ ░██████╗██╗░░██╗░█████╗░██████╗░██╗░░██╗░██████╗ ██╔══██╗██║░░░░░██╔══██╗██║░░██║██╔══██╗ ██╔════╝██║░░██║██╔══██╗██╔══██╗██║░██╔╝██╔════╝ ███████║██║░░░░░██████╔╝███████║███████║ ╚█████╗░███████║███████║██████╔╝█████═╝░╚█████╗░ ██╔══██║██║░░░░░██╔═══╝░██╔══██║██╔══██║ ░╚═══██╗██╔══██║██╔══██║██╔══██╗██╔═██╗░░╚═══██╗ ██║░░██║███████╗██║░░░░░██║░░██║██║░░██║ ██████╔╝██║░░██║██║░░██║██║░░██║██║░╚██╗██████╔╝ ╚═╝░░╚═╝╚══════╝╚═╝░░░░░╚═╝░░╚═╝╚═╝░░╚═╝ ╚═════╝░╚═╝░░╚═╝╚═╝░░╚═╝╚═╝░░╚═╝╚═╝░░╚═╝╚═════╝░ */ contract AlphaSharks is AccessControl, ERC721A, Ownable { using SafeMath for uint256; using Strings for uint256; /** ADDRESSES */ address public stakingContract; address public breedingContract; address public sharkToken; /** ROLES */ bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant DAO_ROLE = keccak256("DAO_ROLE"); /** EVENTS */ event SetStakingContract(address _stakingContract); event SetBreedingContract(address _breedingContract); event SetSharkTokens(address _sharkToken); function setStakingContract(address _stakingContract) external onlyRole(DAO_ROLE) { stakingContract = _stakingContract; emit SetStakingContract(_stakingContract); } function setBreedingContract(address _breedingContract) external onlyRole(DAO_ROLE) { breedingContract = _breedingContract; emit SetBreedingContract(_breedingContract); } function setSharkTokensContract(address _sharkToken) external onlyRole(DAO_ROLE) { sharkToken = _sharkToken; emit SetSharkTokens(_sharkToken); } uint256 public MAXIMUM_SUPPLY = 6969; string public BASE_URI = "ipfs://abcd/"; constructor() ERC721A("AlphaSharks", "ALPHASHARKS") { // Owner is an admin _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); } function _baseURI() internal view override returns (string memory) { return BASE_URI; } function updateBaseURI(string memory _BASE_URI) external onlyOwner { BASE_URI = _BASE_URI; } function safeMint(address _to, uint256 quantity) external onlyRole(MINTER_ROLE) { require( totalSupply() + quantity <= MAXIMUM_SUPPLY, "Max supply reached" ); _safeMint(_to, quantity); } function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControl, ERC721A) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } function withdraw() public onlyOwner { require(address(this).balance > 0, "No ether to withdraw"); payable(owner()).transfer(address(this).balance); } }
// SPDX-License-Identifier: MIT // Creator: Chiru Labs pragma solidity ^0.8.4; import '@openzeppelin/contracts/token/ERC721/IERC721.sol'; import '@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol'; import '@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol'; import '@openzeppelin/contracts/utils/Address.sol'; import '@openzeppelin/contracts/utils/Context.sol'; import '@openzeppelin/contracts/utils/Strings.sol'; import '@openzeppelin/contracts/utils/introspection/ERC165.sol'; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev This is equivalent to _burn(tokenId, false) */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev 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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT // 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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControl.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "../utils/Context.sol"; import "../utils/Strings.sol"; import "../utils/introspection/ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, 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; }
// SPDX-License-Identifier: MIT // 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://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); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
{ "optimizer": { "enabled": true, "runs": 1000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_breedingContract","type":"address"}],"name":"SetBreedingContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_sharkToken","type":"address"}],"name":"SetSharkTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_stakingContract","type":"address"}],"name":"SetStakingContract","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":"BASE_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DAO_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":[],"name":"breedingContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"safeMint","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":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_breedingContract","type":"address"}],"name":"setBreedingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sharkToken","type":"address"}],"name":"setSharkTokensContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakingContract","type":"address"}],"name":"setStakingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sharkToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingContract","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_BASE_URI","type":"string"}],"name":"updateBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
611b39600d5560c0604052600c60808190526b697066733a2f2f616263642f60a01b60a09081526200003591600e9190620001e2565b503480156200004357600080fd5b506040518060400160405280600b81526020016a416c706861536861726b7360a81b8152506040518060400160405280600b81526020016a414c504841534841524b5360a81b8152508160039080519060200190620000a4929190620001e2565b508051620000ba906004906020840190620001e2565b5050600060015550620000cd33620000e0565b620000da60003362000132565b620002c4565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200013e828262000142565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff166200013e576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556200019e3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b828054620001f09062000288565b90600052602060002090601f0160209004810192826200021457600085556200025f565b82601f106200022f57805160ff19168380011785556200025f565b828001600101855582156200025f579182015b828111156200025f57825182559160200191906001019062000242565b506200026d92915062000271565b5090565b5b808211156200026d576000815560010162000272565b600181811c908216806200029d57607f821691505b602082108103620002be57634e487b7160e01b600052602260045260246000fd5b50919050565b61228a80620002d46000396000f3fe608060405234801561001057600080fd5b506004361061025c5760003560e01c80638da5cb5b11610145578063c87b56dd116100bd578063dd19da011161008c578063e9c2651811610071578063e9c2651814610536578063ee99205c1461055d578063f2fde38b1461057057600080fd5b8063dd19da01146104e7578063e985e9c5146104fa57600080fd5b8063c87b56dd14610492578063d5391393146104a5578063d547741f146104cc578063dbddb26a146104df57600080fd5b80639dd373b911610114578063a217fddf116100f9578063a217fddf14610464578063a22cb4651461046c578063b88d4fde1461047f57600080fd5b80639dd373b91461043e578063a14481941461045157600080fd5b80638da5cb5b146103db57806391d14854146103ec578063931688cb1461042357806395d89b411461043657600080fd5b80633ccfd60b116101d85780636352211e116101a7578063715018a61161018c578063715018a6146103ad578063836e3375146103b55780638c5527cf146103c857600080fd5b80636352211e1461038757806370a082311461039a57600080fd5b80633ccfd60b146103505780633d0c49241461035857806342842e0e146103615780634a4901681461037457600080fd5b806318160ddd1161022f578063248a9ca311610214578063248a9ca3146103075780632f2ff15d1461032a57806336568abe1461033d57600080fd5b806318160ddd146102de57806323b872dd146102f457600080fd5b806301ffc9a71461026157806306fdde0314610289578063081812fc1461029e578063095ea7b3146102c9575b600080fd5b61027461026f366004611d08565b610583565b60405190151581526020015b60405180910390f35b6102916105c9565b6040516102809190611d7d565b6102b16102ac366004611d90565b61065b565b6040516001600160a01b039091168152602001610280565b6102dc6102d7366004611dc5565b6106b8565b005b600254600154035b604051908152602001610280565b6102dc610302366004611def565b610777565b6102e6610315366004611d90565b60009081526020819052604090206001015490565b6102dc610338366004611e2b565b610782565b6102dc61034b366004611e2b565b6107a8565b6102dc610839565b6102e6600d5481565b6102dc61036f366004611def565b61091f565b600c546102b1906001600160a01b031681565b6102b1610395366004611d90565b61093a565b6102e66103a8366004611e57565b61094c565b6102dc6109b4565b600b546102b1906001600160a01b031681565b6102dc6103d6366004611e57565b610a1a565b6009546001600160a01b03166102b1565b6102746103fa366004611e2b565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6102dc610431366004611efe565b610a9b565b610291610b08565b6102dc61044c366004611e57565b610b17565b6102dc61045f366004611dc5565b610b90565b6102e6600081565b6102dc61047a366004611f47565b610c2e565b6102dc61048d366004611f83565b610cdc565b6102916104a0366004611d90565b610d2d565b6102e67f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6102dc6104da366004611e2b565b610dca565b610291610df0565b6102dc6104f5366004611e57565b610e7e565b610274610508366004611fff565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b6102e67f3b5d4cc60d3ec3516ee8ae083bd60934f6eb2a6c54b1229985c41bfb092b260381565b600a546102b1906001600160a01b031681565b6102dc61057e366004611e57565b610ef7565b60006001600160e01b031982166380ac58cd60e01b14806105b457506001600160e01b03198216635b5e139f60e01b145b806105c357506105c382610fd6565b92915050565b6060600380546105d890612029565b80601f016020809104026020016040519081016040528092919081815260200182805461060490612029565b80156106515780601f1061062657610100808354040283529160200191610651565b820191906000526020600020905b81548152906001019060200180831161063457829003601f168201915b5050505050905090565b600061066682611016565b61069c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b60006106c38261093a565b9050806001600160a01b0316836001600160a01b031603610710576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03821614801590610730575061072e8133610508565b155b15610767576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610772838383611042565b505050565b61077283838361109e565b60008281526020819052604090206001015461079e81336112da565b6107728383611358565b6001600160a01b038116331461082b5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b61083582826113f6565b5050565b6009546001600160a01b031633146108935760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610822565b600047116108e35760405162461bcd60e51b815260206004820152601460248201527f4e6f20657468657220746f2077697468647261770000000000000000000000006044820152606401610822565b6009546040516001600160a01b03909116904780156108fc02916000818181858888f1935050505015801561091c573d6000803e3d6000fd5b50565b61077283838360405180602001604052806000815250610cdc565b600061094582611475565b5192915050565b60006001600160a01b03821661098e576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205467ffffffffffffffff1690565b6009546001600160a01b03163314610a0e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610822565b610a1860006115aa565b565b7f3b5d4cc60d3ec3516ee8ae083bd60934f6eb2a6c54b1229985c41bfb092b2603610a4581336112da565b600b80546001600160a01b0319166001600160a01b0384169081179091556040519081527fa37277bd6844da20ea391d80d685321fb6a6f8e4ea6654f25efc77a779433c7a906020015b60405180910390a15050565b6009546001600160a01b03163314610af55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610822565b805161083590600e906020840190611c59565b6060600480546105d890612029565b7f3b5d4cc60d3ec3516ee8ae083bd60934f6eb2a6c54b1229985c41bfb092b2603610b4281336112da565b600a80546001600160a01b0319166001600160a01b0384169081179091556040519081527f77da29da4ba6bf0a49e709076c8fc946886ea566b52a1429ac484d59f879be3790602001610a8f565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610bbb81336112da565b600d5482610bcc6002546001540390565b610bd69190612079565b1115610c245760405162461bcd60e51b815260206004820152601260248201527f4d617820737570706c79207265616368656400000000000000000000000000006044820152606401610822565b61077283836115fc565b336001600160a01b03831603610c70576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610ce784848461109e565b6001600160a01b0383163b15158015610d095750610d0784848484611616565b155b15610d27576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060610d3882611016565b610d6e576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610d78611702565b90508051600003610d985760405180602001604052806000815250610dc3565b80610da284611711565b604051602001610db3929190612091565b6040516020818303038152906040525b9392505050565b600082815260208190526040902060010154610de681336112da565b61077283836113f6565b600e8054610dfd90612029565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2990612029565b8015610e765780601f10610e4b57610100808354040283529160200191610e76565b820191906000526020600020905b815481529060010190602001808311610e5957829003601f168201915b505050505081565b7f3b5d4cc60d3ec3516ee8ae083bd60934f6eb2a6c54b1229985c41bfb092b2603610ea981336112da565b600c80546001600160a01b0319166001600160a01b0384169081179091556040519081527fb41b08bd676943a09f3995ff71dee47aa96eda85456aa83caa12c64efdbbe3c390602001610a8f565b6009546001600160a01b03163314610f515760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610822565b6001600160a01b038116610fcd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610822565b61091c816115aa565b60006001600160e01b031982166380ac58cd60e01b148061100757506001600160e01b03198216635b5e139f60e01b145b806105c357506105c382611812565b6000600154821080156105c3575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006110a982611475565b9050836001600160a01b031681600001516001600160a01b0316146110fa576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000336001600160a01b038616148061111857506111188533610508565b806111335750336111288461065b565b6001600160a01b0316145b90508061116c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166111ac576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111b860008487611042565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661128e57600154821461128e578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1661083557611316816001600160a01b03166014611879565b611321836020611879565b6040516020016113329291906120c0565b60408051601f198184030181529082905262461bcd60e51b825261082291600401611d7d565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16610835576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556113b23390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1615610835576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60408051606081018252600080825260208201819052918101919091528160015481101561157857600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff161515918101829052906115765780516001600160a01b03161561150c579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215611571579392505050565b61150c565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610835828260405180602001604052806000815250611a3e565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061164b903390899088908890600401612141565b6020604051808303816000875af1925050508015611686575060408051601f3d908101601f191682019092526116839181019061217d565b60015b6116e4573d8080156116b4576040519150601f19603f3d011682016040523d82523d6000602084013e6116b9565b606091505b5080516000036116dc576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600e80546105d890612029565b6060816000036117385750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611762578061174c8161219a565b915061175b9050600a836121c9565b915061173c565b60008167ffffffffffffffff81111561177d5761177d611e72565b6040519080825280601f01601f1916602001820160405280156117a7576020820181803683370190505b5090505b84156116fa576117bc6001836121dd565b91506117c9600a866121f4565b6117d4906030612079565b60f81b8183815181106117e9576117e9612208565b60200101906001600160f81b031916908160001a90535061180b600a866121c9565b94506117ab565b60006001600160e01b031982167f7965db0b0000000000000000000000000000000000000000000000000000000014806105c357507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316146105c3565b6060600061188883600261221e565b611893906002612079565b67ffffffffffffffff8111156118ab576118ab611e72565b6040519080825280601f01601f1916602001820160405280156118d5576020820181803683370190505b509050600360fc1b816000815181106118f0576118f0612208565b60200101906001600160f81b031916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061193b5761193b612208565b60200101906001600160f81b031916908160001a905350600061195f84600261221e565b61196a906001612079565b90505b60018111156119ef577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106119ab576119ab612208565b1a60f81b8282815181106119c1576119c1612208565b60200101906001600160f81b031916908160001a90535060049490941c936119e88161223d565b905061196d565b508315610dc35760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610822565b610772838383600180546001600160a01b038516611a88576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600003611ac2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516600081815260066020908152604080832080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000811667ffffffffffffffff8083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600590925290912080546001600160e01b031916909217600160a01b429092169190910217905580808501838015611b8357506001600160a01b0387163b15155b15611c0b575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611bd46000888480600101955088611616565b611bf1576040516368d2bf6b60e11b815260040160405180910390fd5b808203611b89578260015414611c0657600080fd5b611c50565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808203611c0c575b506001556112d3565b828054611c6590612029565b90600052602060002090601f016020900481019282611c875760008555611ccd565b82601f10611ca057805160ff1916838001178555611ccd565b82800160010185558215611ccd579182015b82811115611ccd578251825591602001919060010190611cb2565b50611cd9929150611cdd565b5090565b5b80821115611cd95760008155600101611cde565b6001600160e01b03198116811461091c57600080fd5b600060208284031215611d1a57600080fd5b8135610dc381611cf2565b60005b83811015611d40578181015183820152602001611d28565b83811115610d275750506000910152565b60008151808452611d69816020860160208601611d25565b601f01601f19169290920160200192915050565b602081526000610dc36020830184611d51565b600060208284031215611da257600080fd5b5035919050565b80356001600160a01b0381168114611dc057600080fd5b919050565b60008060408385031215611dd857600080fd5b611de183611da9565b946020939093013593505050565b600080600060608486031215611e0457600080fd5b611e0d84611da9565b9250611e1b60208501611da9565b9150604084013590509250925092565b60008060408385031215611e3e57600080fd5b82359150611e4e60208401611da9565b90509250929050565b600060208284031215611e6957600080fd5b610dc382611da9565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611ea357611ea3611e72565b604051601f8501601f19908116603f01168101908282118183101715611ecb57611ecb611e72565b81604052809350858152868686011115611ee457600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611f1057600080fd5b813567ffffffffffffffff811115611f2757600080fd5b8201601f81018413611f3857600080fd5b6116fa84823560208401611e88565b60008060408385031215611f5a57600080fd5b611f6383611da9565b915060208301358015158114611f7857600080fd5b809150509250929050565b60008060008060808587031215611f9957600080fd5b611fa285611da9565b9350611fb060208601611da9565b925060408501359150606085013567ffffffffffffffff811115611fd357600080fd5b8501601f81018713611fe457600080fd5b611ff387823560208401611e88565b91505092959194509250565b6000806040838503121561201257600080fd5b61201b83611da9565b9150611e4e60208401611da9565b600181811c9082168061203d57607f821691505b60208210810361205d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561208c5761208c612063565b500190565b600083516120a3818460208801611d25565b8351908301906120b7818360208801611d25565b01949350505050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516120f8816017850160208801611d25565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351612135816028840160208801611d25565b01602801949350505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526121736080830184611d51565b9695505050505050565b60006020828403121561218f57600080fd5b8151610dc381611cf2565b6000600182016121ac576121ac612063565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826121d8576121d86121b3565b500490565b6000828210156121ef576121ef612063565b500390565b600082612203576122036121b3565b500690565b634e487b7160e01b600052603260045260246000fd5b600081600019048311821515161561223857612238612063565b500290565b60008161224c5761224c612063565b50600019019056fea2646970667358221220c3b2aae0de32e9434ac18ac02ff40f7590b9f1e096f200f1bb6f4350e5b854b364736f6c634300080d0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061025c5760003560e01c80638da5cb5b11610145578063c87b56dd116100bd578063dd19da011161008c578063e9c2651811610071578063e9c2651814610536578063ee99205c1461055d578063f2fde38b1461057057600080fd5b8063dd19da01146104e7578063e985e9c5146104fa57600080fd5b8063c87b56dd14610492578063d5391393146104a5578063d547741f146104cc578063dbddb26a146104df57600080fd5b80639dd373b911610114578063a217fddf116100f9578063a217fddf14610464578063a22cb4651461046c578063b88d4fde1461047f57600080fd5b80639dd373b91461043e578063a14481941461045157600080fd5b80638da5cb5b146103db57806391d14854146103ec578063931688cb1461042357806395d89b411461043657600080fd5b80633ccfd60b116101d85780636352211e116101a7578063715018a61161018c578063715018a6146103ad578063836e3375146103b55780638c5527cf146103c857600080fd5b80636352211e1461038757806370a082311461039a57600080fd5b80633ccfd60b146103505780633d0c49241461035857806342842e0e146103615780634a4901681461037457600080fd5b806318160ddd1161022f578063248a9ca311610214578063248a9ca3146103075780632f2ff15d1461032a57806336568abe1461033d57600080fd5b806318160ddd146102de57806323b872dd146102f457600080fd5b806301ffc9a71461026157806306fdde0314610289578063081812fc1461029e578063095ea7b3146102c9575b600080fd5b61027461026f366004611d08565b610583565b60405190151581526020015b60405180910390f35b6102916105c9565b6040516102809190611d7d565b6102b16102ac366004611d90565b61065b565b6040516001600160a01b039091168152602001610280565b6102dc6102d7366004611dc5565b6106b8565b005b600254600154035b604051908152602001610280565b6102dc610302366004611def565b610777565b6102e6610315366004611d90565b60009081526020819052604090206001015490565b6102dc610338366004611e2b565b610782565b6102dc61034b366004611e2b565b6107a8565b6102dc610839565b6102e6600d5481565b6102dc61036f366004611def565b61091f565b600c546102b1906001600160a01b031681565b6102b1610395366004611d90565b61093a565b6102e66103a8366004611e57565b61094c565b6102dc6109b4565b600b546102b1906001600160a01b031681565b6102dc6103d6366004611e57565b610a1a565b6009546001600160a01b03166102b1565b6102746103fa366004611e2b565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6102dc610431366004611efe565b610a9b565b610291610b08565b6102dc61044c366004611e57565b610b17565b6102dc61045f366004611dc5565b610b90565b6102e6600081565b6102dc61047a366004611f47565b610c2e565b6102dc61048d366004611f83565b610cdc565b6102916104a0366004611d90565b610d2d565b6102e67f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6102dc6104da366004611e2b565b610dca565b610291610df0565b6102dc6104f5366004611e57565b610e7e565b610274610508366004611fff565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b6102e67f3b5d4cc60d3ec3516ee8ae083bd60934f6eb2a6c54b1229985c41bfb092b260381565b600a546102b1906001600160a01b031681565b6102dc61057e366004611e57565b610ef7565b60006001600160e01b031982166380ac58cd60e01b14806105b457506001600160e01b03198216635b5e139f60e01b145b806105c357506105c382610fd6565b92915050565b6060600380546105d890612029565b80601f016020809104026020016040519081016040528092919081815260200182805461060490612029565b80156106515780601f1061062657610100808354040283529160200191610651565b820191906000526020600020905b81548152906001019060200180831161063457829003601f168201915b5050505050905090565b600061066682611016565b61069c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b60006106c38261093a565b9050806001600160a01b0316836001600160a01b031603610710576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03821614801590610730575061072e8133610508565b155b15610767576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610772838383611042565b505050565b61077283838361109e565b60008281526020819052604090206001015461079e81336112da565b6107728383611358565b6001600160a01b038116331461082b5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b61083582826113f6565b5050565b6009546001600160a01b031633146108935760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610822565b600047116108e35760405162461bcd60e51b815260206004820152601460248201527f4e6f20657468657220746f2077697468647261770000000000000000000000006044820152606401610822565b6009546040516001600160a01b03909116904780156108fc02916000818181858888f1935050505015801561091c573d6000803e3d6000fd5b50565b61077283838360405180602001604052806000815250610cdc565b600061094582611475565b5192915050565b60006001600160a01b03821661098e576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205467ffffffffffffffff1690565b6009546001600160a01b03163314610a0e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610822565b610a1860006115aa565b565b7f3b5d4cc60d3ec3516ee8ae083bd60934f6eb2a6c54b1229985c41bfb092b2603610a4581336112da565b600b80546001600160a01b0319166001600160a01b0384169081179091556040519081527fa37277bd6844da20ea391d80d685321fb6a6f8e4ea6654f25efc77a779433c7a906020015b60405180910390a15050565b6009546001600160a01b03163314610af55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610822565b805161083590600e906020840190611c59565b6060600480546105d890612029565b7f3b5d4cc60d3ec3516ee8ae083bd60934f6eb2a6c54b1229985c41bfb092b2603610b4281336112da565b600a80546001600160a01b0319166001600160a01b0384169081179091556040519081527f77da29da4ba6bf0a49e709076c8fc946886ea566b52a1429ac484d59f879be3790602001610a8f565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610bbb81336112da565b600d5482610bcc6002546001540390565b610bd69190612079565b1115610c245760405162461bcd60e51b815260206004820152601260248201527f4d617820737570706c79207265616368656400000000000000000000000000006044820152606401610822565b61077283836115fc565b336001600160a01b03831603610c70576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610ce784848461109e565b6001600160a01b0383163b15158015610d095750610d0784848484611616565b155b15610d27576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060610d3882611016565b610d6e576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610d78611702565b90508051600003610d985760405180602001604052806000815250610dc3565b80610da284611711565b604051602001610db3929190612091565b6040516020818303038152906040525b9392505050565b600082815260208190526040902060010154610de681336112da565b61077283836113f6565b600e8054610dfd90612029565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2990612029565b8015610e765780601f10610e4b57610100808354040283529160200191610e76565b820191906000526020600020905b815481529060010190602001808311610e5957829003601f168201915b505050505081565b7f3b5d4cc60d3ec3516ee8ae083bd60934f6eb2a6c54b1229985c41bfb092b2603610ea981336112da565b600c80546001600160a01b0319166001600160a01b0384169081179091556040519081527fb41b08bd676943a09f3995ff71dee47aa96eda85456aa83caa12c64efdbbe3c390602001610a8f565b6009546001600160a01b03163314610f515760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610822565b6001600160a01b038116610fcd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610822565b61091c816115aa565b60006001600160e01b031982166380ac58cd60e01b148061100757506001600160e01b03198216635b5e139f60e01b145b806105c357506105c382611812565b6000600154821080156105c3575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006110a982611475565b9050836001600160a01b031681600001516001600160a01b0316146110fa576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000336001600160a01b038616148061111857506111188533610508565b806111335750336111288461065b565b6001600160a01b0316145b90508061116c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166111ac576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111b860008487611042565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661128e57600154821461128e578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1661083557611316816001600160a01b03166014611879565b611321836020611879565b6040516020016113329291906120c0565b60408051601f198184030181529082905262461bcd60e51b825261082291600401611d7d565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16610835576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556113b23390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1615610835576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60408051606081018252600080825260208201819052918101919091528160015481101561157857600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff161515918101829052906115765780516001600160a01b03161561150c579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215611571579392505050565b61150c565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610835828260405180602001604052806000815250611a3e565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061164b903390899088908890600401612141565b6020604051808303816000875af1925050508015611686575060408051601f3d908101601f191682019092526116839181019061217d565b60015b6116e4573d8080156116b4576040519150601f19603f3d011682016040523d82523d6000602084013e6116b9565b606091505b5080516000036116dc576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600e80546105d890612029565b6060816000036117385750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611762578061174c8161219a565b915061175b9050600a836121c9565b915061173c565b60008167ffffffffffffffff81111561177d5761177d611e72565b6040519080825280601f01601f1916602001820160405280156117a7576020820181803683370190505b5090505b84156116fa576117bc6001836121dd565b91506117c9600a866121f4565b6117d4906030612079565b60f81b8183815181106117e9576117e9612208565b60200101906001600160f81b031916908160001a90535061180b600a866121c9565b94506117ab565b60006001600160e01b031982167f7965db0b0000000000000000000000000000000000000000000000000000000014806105c357507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316146105c3565b6060600061188883600261221e565b611893906002612079565b67ffffffffffffffff8111156118ab576118ab611e72565b6040519080825280601f01601f1916602001820160405280156118d5576020820181803683370190505b509050600360fc1b816000815181106118f0576118f0612208565b60200101906001600160f81b031916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061193b5761193b612208565b60200101906001600160f81b031916908160001a905350600061195f84600261221e565b61196a906001612079565b90505b60018111156119ef577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106119ab576119ab612208565b1a60f81b8282815181106119c1576119c1612208565b60200101906001600160f81b031916908160001a90535060049490941c936119e88161223d565b905061196d565b508315610dc35760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610822565b610772838383600180546001600160a01b038516611a88576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600003611ac2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516600081815260066020908152604080832080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000811667ffffffffffffffff8083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600590925290912080546001600160e01b031916909217600160a01b429092169190910217905580808501838015611b8357506001600160a01b0387163b15155b15611c0b575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611bd46000888480600101955088611616565b611bf1576040516368d2bf6b60e11b815260040160405180910390fd5b808203611b89578260015414611c0657600080fd5b611c50565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808203611c0c575b506001556112d3565b828054611c6590612029565b90600052602060002090601f016020900481019282611c875760008555611ccd565b82601f10611ca057805160ff1916838001178555611ccd565b82800160010185558215611ccd579182015b82811115611ccd578251825591602001919060010190611cb2565b50611cd9929150611cdd565b5090565b5b80821115611cd95760008155600101611cde565b6001600160e01b03198116811461091c57600080fd5b600060208284031215611d1a57600080fd5b8135610dc381611cf2565b60005b83811015611d40578181015183820152602001611d28565b83811115610d275750506000910152565b60008151808452611d69816020860160208601611d25565b601f01601f19169290920160200192915050565b602081526000610dc36020830184611d51565b600060208284031215611da257600080fd5b5035919050565b80356001600160a01b0381168114611dc057600080fd5b919050565b60008060408385031215611dd857600080fd5b611de183611da9565b946020939093013593505050565b600080600060608486031215611e0457600080fd5b611e0d84611da9565b9250611e1b60208501611da9565b9150604084013590509250925092565b60008060408385031215611e3e57600080fd5b82359150611e4e60208401611da9565b90509250929050565b600060208284031215611e6957600080fd5b610dc382611da9565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611ea357611ea3611e72565b604051601f8501601f19908116603f01168101908282118183101715611ecb57611ecb611e72565b81604052809350858152868686011115611ee457600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611f1057600080fd5b813567ffffffffffffffff811115611f2757600080fd5b8201601f81018413611f3857600080fd5b6116fa84823560208401611e88565b60008060408385031215611f5a57600080fd5b611f6383611da9565b915060208301358015158114611f7857600080fd5b809150509250929050565b60008060008060808587031215611f9957600080fd5b611fa285611da9565b9350611fb060208601611da9565b925060408501359150606085013567ffffffffffffffff811115611fd357600080fd5b8501601f81018713611fe457600080fd5b611ff387823560208401611e88565b91505092959194509250565b6000806040838503121561201257600080fd5b61201b83611da9565b9150611e4e60208401611da9565b600181811c9082168061203d57607f821691505b60208210810361205d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561208c5761208c612063565b500190565b600083516120a3818460208801611d25565b8351908301906120b7818360208801611d25565b01949350505050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516120f8816017850160208801611d25565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351612135816028840160208801611d25565b01602801949350505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526121736080830184611d51565b9695505050505050565b60006020828403121561218f57600080fd5b8151610dc381611cf2565b6000600182016121ac576121ac612063565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826121d8576121d86121b3565b500490565b6000828210156121ef576121ef612063565b500390565b600082612203576122036121b3565b500690565b634e487b7160e01b600052603260045260246000fd5b600081600019048311821515161561223857612238612063565b500290565b60008161224c5761224c612063565b50600019019056fea2646970667358221220c3b2aae0de32e9434ac18ac02ff40f7590b9f1e096f200f1bb6f4350e5b854b364736f6c634300080d0033
Deployed Bytecode Sourcemap
1974:2524:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3952:362;;;;;;:::i;:::-;;:::i;:::-;;;611:14:14;;604:22;586:41;;574:2;559:18;3952:362:12;;;;;;;;7579:98:13;;;:::i;:::-;;;;;;;:::i;9035:200::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1738:55:14;;;1720:74;;1708:2;1693:18;9035:200:13;1574:226:14;8612:362:13;;;;;;:::i;:::-;;:::i;:::-;;3822:297;4072:12;;4056:13;;:28;3822:297;;;2411:25:14;;;2399:2;2384:18;3822:297:13;2265:177:14;9874:164:13;;;;;;:::i;:::-;;:::i;4008:129:0:-;;;;;;:::i;:::-;4082:7;4108:12;;;;;;;;;;:22;;;;4008:129;4387:145;;;;;;:::i;:::-;;:::i;5404:214::-;;;;;;:::i;:::-;;:::i;4322:173:12:-;;;:::i;3212:36::-;;;;;;10104:179:13;;;;;;:::i;:::-;;:::i;2201:25:12:-;;;;;-1:-1:-1;;;;;2201:25:12;;;7394:123:13;;;;;;:::i;:::-;;:::i;4910:203::-;;;;;;:::i;:::-;;:::i;1668:101:2:-;;;:::i;2163:31:12:-;;;;;-1:-1:-1;;;;;2163:31:12;;;2790:216;;;;;;:::i;:::-;;:::i;1036:85:2:-;1108:6;;-1:-1:-1;;;;;1108:6:2;1036:85;;2909:145:0;;;;;;:::i;:::-;2995:4;3018:12;;;;;;;;;;;-1:-1:-1;;;;;3018:29:0;;;;;;;;;;;;;;;2909:145;3563:106:12;;;;;;:::i;:::-;;:::i;7741:102:13:-;;;:::i;2572:210:12:-;;;;;;:::i;:::-;;:::i;3677:267::-;;;;;;:::i;:::-;;:::i;2027:49:0:-;;2072:4;2027:49;;9302:282:13;;;;;;:::i;:::-;;:::i;10349:359::-;;;;;;:::i;:::-;;:::i;7909:313::-;;;;;;:::i;:::-;;:::i;2253:62:12:-;;2291:24;2253:62;;4766:147:0;;;;;;:::i;:::-;;:::i;3255:39:12:-;;;:::i;3014:190::-;;;;;;:::i;:::-;;:::i;9650:162:13:-;;;;;;:::i;:::-;-1:-1:-1;;;;;9770:25:13;;;9747:4;9770:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;9650:162;2322:56:12;;2357:21;2322:56;;2126:30;;;;;-1:-1:-1;;;;;2126:30:12;;;1918:198:2;;;;;;:::i;:::-;;:::i;3952:362:12:-;4106:4;-1:-1:-1;;;;;;4148:40:12;;-1:-1:-1;;;4148:40:12;;:105;;-1:-1:-1;;;;;;;4205:48:12;;-1:-1:-1;;;4205:48:12;4148:105;:158;;;;4270:36;4294:11;4270:23;:36::i;:::-;4128:178;3952:362;-1:-1:-1;;3952:362:12:o;7579:98:13:-;7633:13;7665:5;7658:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7579:98;:::o;9035:200::-;9103:7;9127:16;9135:7;9127;:16::i;:::-;9122:64;;9152:34;;;;;;;;;;;;;;9122:64;-1:-1:-1;9204:24:13;;;;:15;:24;;;;;;-1:-1:-1;;;;;9204:24:13;;9035:200::o;8612:362::-;8684:13;8700:24;8716:7;8700:15;:24::i;:::-;8684:40;;8744:5;-1:-1:-1;;;;;8738:11:13;:2;-1:-1:-1;;;;;8738:11:13;;8734:48;;8758:24;;;;;;;;;;;;;;8734:48;719:10:7;-1:-1:-1;;;;;8797:21:13;;;;;;:63;;-1:-1:-1;8823:37:13;8840:5;719:10:7;9650:162:13;:::i;8823:37::-;8822:38;8797:63;8793:136;;;8883:35;;;;;;;;;;;;;;8793:136;8939:28;8948:2;8952:7;8961:5;8939:8;:28::i;:::-;8674:300;8612:362;;:::o;9874:164::-;10003:28;10013:4;10019:2;10023:7;10003:9;:28::i;4387:145:0:-;4082:7;4108:12;;;;;;;;;;:22;;;2505:30;2516:4;719:10:7;2505::0;:30::i;:::-;4500:25:::1;4511:4;4517:7;4500:10;:25::i;5404:214::-:0;-1:-1:-1;;;;;5499:23:0;;719:10:7;5499:23:0;5491:83;;;;-1:-1:-1;;;5491:83:0;;6812:2:14;5491:83:0;;;6794:21:14;6851:2;6831:18;;;6824:30;6890:34;6870:18;;;6863:62;6961:17;6941:18;;;6934:45;6996:19;;5491:83:0;;;;;;;;;5585:26;5597:4;5603:7;5585:11;:26::i;:::-;5404:214;;:::o;4322:173:12:-;1108:6:2;;-1:-1:-1;;;;;1108:6:2;719:10:7;1248:23:2;1240:68;;;;-1:-1:-1;;;1240:68:2;;7228:2:14;1240:68:2;;;7210:21:14;;;7247:18;;;7240:30;7306:34;7286:18;;;7279:62;7358:18;;1240:68:2;7026:356:14;1240:68:2;4402:1:12::1;4378:21;:25;4370:58;;;::::0;-1:-1:-1;;;4370:58:12;;7589:2:14;4370:58:12::1;::::0;::::1;7571:21:14::0;7628:2;7608:18;;;7601:30;7667:22;7647:18;;;7640:50;7707:18;;4370:58:12::1;7387:344:14::0;4370:58:12::1;1108:6:2::0;;4439:48:12::1;::::0;-1:-1:-1;;;;;1108:6:2;;;;4465:21:12::1;4439:48:::0;::::1;;;::::0;::::1;::::0;;;4465:21;1108:6:2;4439:48:12;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;4322:173::o:0;10104:179:13:-;10237:39;10254:4;10260:2;10264:7;10237:39;;;;;;;;;;;;:16;:39::i;7394:123::-;7458:7;7484:21;7497:7;7484:12;:21::i;:::-;:26;;7394:123;-1:-1:-1;;7394:123:13:o;4910:203::-;4974:7;-1:-1:-1;;;;;4997:19:13;;4993:60;;5025:28;;;;;;;;;;;;;;4993:60;-1:-1:-1;;;;;;5078:19:13;;;;;:12;:19;;;;;:27;;;;4910:203::o;1668:101:2:-;1108:6;;-1:-1:-1;;;;;1108:6:2;719:10:7;1248:23:2;1240:68;;;;-1:-1:-1;;;1240:68:2;;7228:2:14;1240:68:2;;;7210:21:14;;;7247:18;;;7240:30;7306:34;7286:18;;;7279:62;7358:18;;1240:68:2;7026:356:14;1240:68:2;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;2790:216:12:-;2357:21;2505:30:0;2357:21:12;719:10:7;2505::0;:30::i;:::-;2908:16:12::1;:36:::0;;-1:-1:-1;;;;;;2908:36:12::1;-1:-1:-1::0;;;;;2908:36:12;::::1;::::0;;::::1;::::0;;;2960:38:::1;::::0;1720:74:14;;;2960:38:12::1;::::0;1708:2:14;1693:18;2960:38:12::1;;;;;;;;2790:216:::0;;:::o;3563:106::-;1108:6:2;;-1:-1:-1;;;;;1108:6:2;719:10:7;1248:23:2;1240:68;;;;-1:-1:-1;;;1240:68:2;;7228:2:14;1240:68:2;;;7210:21:14;;;7247:18;;;7240:30;7306:34;7286:18;;;7279:62;7358:18;;1240:68:2;7026:356:14;1240:68:2;3641:20:12;;::::1;::::0;:8:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;7741:102:13:-:0;7797:13;7829:7;7822:14;;;;;:::i;2572:210:12:-;2357:21;2505:30:0;2357:21:12;719:10:7;2505::0;:30::i;:::-;2688:15:12::1;:34:::0;;-1:-1:-1;;;;;;2688:34:12::1;-1:-1:-1::0;;;;;2688:34:12;::::1;::::0;;::::1;::::0;;;2738:36:::1;::::0;1720:74:14;;;2738:36:12::1;::::0;1708:2:14;1693:18;2738:36:12::1;1574:226:14::0;3677:267:12;2291:24;2505:30:0;2291:24:12;719:10:7;2505::0;:30::i;:::-;3841:14:12::1;;3829:8;3813:13;4072:12:13::0;;4056:13;;:28;;3822:297;3813:13:12::1;:24;;;;:::i;:::-;:42;;3791:110;;;::::0;-1:-1:-1;;;3791:110:12;;8260:2:14;3791:110:12::1;::::0;::::1;8242:21:14::0;8299:2;8279:18;;;8272:30;8338:20;8318:18;;;8311:48;8376:18;;3791:110:12::1;8058:342:14::0;3791:110:12::1;3912:24;3922:3;3927:8;3912:9;:24::i;9302:282:13:-:0;719:10:7;-1:-1:-1;;;;;9400:24:13;;;9396:54;;9433:17;;;;;;;;;;;;;;9396:54;719:10:7;9461:32:13;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;9461:42:13;;;;;;;;;;;;:53;;-1:-1:-1;;9461:53:13;;;;;;;;;;9529:48;;586:41:14;;;9461:42:13;;719:10:7;9529:48:13;;559:18:14;9529:48:13;;;;;;;9302:282;;:::o;10349:359::-;10510:28;10520:4;10526:2;10530:7;10510:9;:28::i;:::-;-1:-1:-1;;;;;10552:13:13;;1465:19:6;:23;;10552:76:13;;;;;10572:56;10603:4;10609:2;10613:7;10622:5;10572:30;:56::i;:::-;10571:57;10552:76;10548:154;;;10651:40;;-1:-1:-1;;;10651:40:13;;;;;;;;;;;10548:154;10349:359;;;;:::o;7909:313::-;7982:13;8012:16;8020:7;8012;:16::i;:::-;8007:59;;8037:29;;;;;;;;;;;;;;8007:59;8077:21;8101:10;:8;:10::i;:::-;8077:34;;8134:7;8128:21;8153:1;8128:26;:87;;;;;;;;;;;;;;;;;8181:7;8190:18;:7;:16;:18::i;:::-;8164:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8128:87;8121:94;7909:313;-1:-1:-1;;;7909:313:13:o;4766:147:0:-;4082:7;4108:12;;;;;;;;;;:22;;;2505:30;2516:4;719:10:7;2505::0;:30::i;:::-;4880:26:::1;4892:4;4898:7;4880:11;:26::i;3255:39:12:-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3014:190::-;2357:21;2505:30:0;2357:21:12;719:10:7;2505::0;:30::i;:::-;3129:10:12::1;:24:::0;;-1:-1:-1;;;;;;3129:24:12::1;-1:-1:-1::0;;;;;3129:24:12;::::1;::::0;;::::1;::::0;;;3169:27:::1;::::0;1720:74:14;;;3169:27:12::1;::::0;1708:2:14;1693:18;3169:27:12::1;1574:226:14::0;1918:198:2;1108:6;;-1:-1:-1;;;;;1108:6:2;719:10:7;1248:23:2;1240:68;;;;-1:-1:-1;;;1240:68:2;;7228:2:14;1240:68:2;;;7210:21:14;;;7247:18;;;7240:30;7306:34;7286:18;;;7279:62;7358:18;;1240:68:2;7026:356:14;1240:68:2;-1:-1:-1;;;;;2006:22:2;::::1;1998:73;;;::::0;-1:-1:-1;;;1998:73:2;;9082:2:14;1998:73:2::1;::::0;::::1;9064:21:14::0;9121:2;9101:18;;;9094:30;9160:34;9140:18;;;9133:62;9231:8;9211:18;;;9204:36;9257:19;;1998:73:2::1;8880:402:14::0;1998:73:2::1;2081:28;2100:8;2081:18;:28::i;4551:300:13:-:0;4653:4;-1:-1:-1;;;;;;4688:40:13;;-1:-1:-1;;;4688:40:13;;:104;;-1:-1:-1;;;;;;;4744:48:13;;-1:-1:-1;;;4744:48:13;4688:104;:156;;;;4808:36;4832:11;4808:23;:36::i;10954:184::-;11011:4;11074:13;;11064:7;:23;11034:97;;;;-1:-1:-1;;11104:20:13;;;;:11;:20;;;;;:27;-1:-1:-1;;;11104:27:13;;;;11103:28;;10954:184::o;18906:189::-;19016:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;19016:29:13;-1:-1:-1;;;;;19016:29:13;;;;;;;;;19060:28;;19016:24;;19060:28;;;;;;;18906:189;;;:::o;13976:2082::-;14086:35;14124:21;14137:7;14124:12;:21::i;:::-;14086:59;;14182:4;-1:-1:-1;;;;;14160:26:13;:13;:18;;;-1:-1:-1;;;;;14160:26:13;;14156:67;;14195:28;;;;;;;;;;;;;;14156:67;14234:22;719:10:7;-1:-1:-1;;;;;14260:20:13;;;;:72;;-1:-1:-1;14296:36:13;14313:4;719:10:7;9650:162:13;:::i;14296:36::-;14260:124;;;-1:-1:-1;719:10:7;14348:20:13;14360:7;14348:11;:20::i;:::-;-1:-1:-1;;;;;14348:36:13;;14260:124;14234:151;;14401:17;14396:66;;14427:35;;;;;;;;;;;;;;14396:66;-1:-1:-1;;;;;14476:16:13;;14472:52;;14501:23;;;;;;;;;;;;;;14472:52;14640:35;14657:1;14661:7;14670:4;14640:8;:35::i;:::-;-1:-1:-1;;;;;14965:18:13;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;14965:31:13;;;;;;;-1:-1:-1;;14965:31:13;;;;;;;15010:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;15010:29:13;;;;;;;;;;;15088:20;;;:11;:20;;;;;;15122:18;;-1:-1:-1;;;;;;15154:49:13;;;;-1:-1:-1;;;15187:15:13;15154:49;;;;;;;;;;15473:11;;15532:24;;;;;15574:13;;15088:20;;15532:24;;15574:13;15570:377;;15781:13;;15766:11;:28;15762:171;;15818:20;;15886:28;;;;15860:54;;-1:-1:-1;;;15860:54:13;-1:-1:-1;;;;;;15860:54:13;;;-1:-1:-1;;;;;15818:20:13;;15860:54;;;;15762:171;14941:1016;;;15991:7;15987:2;-1:-1:-1;;;;;15972:27:13;15981:4;-1:-1:-1;;;;;15972:27:13;;;;;;;;;;;16009:42;14076:1982;;13976:2082;;;:::o;3335:492:0:-;2995:4;3018:12;;;;;;;;;;;-1:-1:-1;;;;;3018:29:0;;;;;;;;;;;;3418:403;;3606:41;3634:7;-1:-1:-1;;;;;3606:41:0;3644:2;3606:19;:41::i;:::-;3718:38;3746:4;3753:2;3718:19;:38::i;:::-;3513:265;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;3513:265:0;;;;;;;;;;-1:-1:-1;;;3461:349:0;;;;;;;:::i;6861:233::-;2995:4;3018:12;;;;;;;;;;;-1:-1:-1;;;;;3018:29:0;;;;;;;;;;;;6939:149;;6982:6;:12;;;;;;;;;;;-1:-1:-1;;;;;6982:29:0;;;;;;;;;:36;;-1:-1:-1;;6982:36:0;7014:4;6982:36;;;7064:12;719:10:7;;640:96;7064:12:0;-1:-1:-1;;;;;7037:40:0;7055:7;-1:-1:-1;;;;;7037:40:0;7049:4;7037:40;;;;;;;;;;6861:233;;:::o;7219:234::-;2995:4;3018:12;;;;;;;;;;;-1:-1:-1;;;;;3018:29:0;;;;;;;;;;;;7298:149;;;7372:5;7340:12;;;;;;;;;;;-1:-1:-1;;;;;7340:29:0;;;;;;;;;;:37;;-1:-1:-1;;7340:37:0;;;7396:40;719:10:7;;7340:12:0;;7396:40;;7372:5;7396:40;7219:234;;:::o;6253:1084:13:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;6363:7:13;6443:13;;6436:4;:20;6405:868;;;6476:31;6510:17;;;:11;:17;;;;;;;;;6476:51;;;;;;;;;-1:-1:-1;;;;;6476:51:13;;;;-1:-1:-1;;;6476:51:13;;;;;;;;;;;-1:-1:-1;;;6476:51:13;;;;;;;;;;;;;;6545:714;;6594:14;;-1:-1:-1;;;;;6594:28:13;;6590:99;;6657:9;6253:1084;-1:-1:-1;;;6253:1084:13:o;6590:99::-;-1:-1:-1;;;7025:6:13;7069:17;;;;:11;:17;;;;;;;;;7057:29;;;;;;;;;-1:-1:-1;;;;;7057:29:13;;;;;-1:-1:-1;;;7057:29:13;;;;;;;;;;;-1:-1:-1;;;7057:29:13;;;;;;;;;;;;;7116:28;7112:107;;7183:9;6253:1084;-1:-1:-1;;;6253:1084:13:o;7112:107::-;6986:255;;;6458:815;6405:868;7299:31;;;;;;;;;;;;;;2270:187:2;2362:6;;;-1:-1:-1;;;;;2378:17:2;;;-1:-1:-1;;;;;;2378:17:2;;;;;;;2410:40;;2362:6;;;2378:17;2362:6;;2410:40;;2343:16;;2410:40;2333:124;2270:187;:::o;11144:102:13:-;11212:27;11222:2;11226:8;11212:27;;;;;;;;;;;;:9;:27::i;19576:650::-;19754:72;;-1:-1:-1;;;19754:72:13;;19734:4;;-1:-1:-1;;;;;19754:36:13;;;;;:72;;719:10:7;;19805:4:13;;19811:7;;19820:5;;19754:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19754:72:13;;;;;;;;-1:-1:-1;;19754:72:13;;;;;;;;;;;;:::i;:::-;;;19750:470;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19985:6;:13;20002:1;19985:18;19981:229;;20030:40;;-1:-1:-1;;;20030:40:13;;;;;;;;;;;19981:229;20170:6;20164:13;20155:6;20151:2;20147:15;20140:38;19750:470;-1:-1:-1;;;;;;19872:55:13;-1:-1:-1;;;19872:55:13;;-1:-1:-1;19750:470:13;19576:650;;;;;;:::o;3454:101:12:-;3506:13;3539:8;3532:15;;;;;:::i;328:703:8:-;384:13;601:5;610:1;601:10;597:51;;-1:-1:-1;;627:10:8;;;;;;;;;;;;-1:-1:-1;;;627:10:8;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:8;;-1:-1:-1;773:2:8;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:8;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:8;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;902:56:8;;;;;;;;-1:-1:-1;972:11:8;981:2;972:11;;:::i;:::-;;;844:150;;2620:202:0;2705:4;-1:-1:-1;;;;;;2728:47:0;;2743:32;2728:47;;:87;;-1:-1:-1;952:25:9;-1:-1:-1;;;;;;937:40:9;;;2779:36:0;829:155:9;1588:441:8;1663:13;1688:19;1720:10;1724:6;1720:1;:10;:::i;:::-;:14;;1733:1;1720:14;:::i;:::-;1710:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1710:25:8;;1688:47;;-1:-1:-1;;;1745:6:8;1752:1;1745:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;1745:15:8;;;;;;;;;1770;:6;1777:1;1770:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;1770:15:8;;;;;;;;-1:-1:-1;1800:9:8;1812:10;1816:6;1812:1;:10;:::i;:::-;:14;;1825:1;1812:14;:::i;:::-;1800:26;;1795:132;1832:1;1828;:5;1795:132;;;1866:12;1879:5;1887:3;1879:11;1866:25;;;;;;;:::i;:::-;;;;1854:6;1861:1;1854:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;1854:37:8;;;;;;;;-1:-1:-1;1915:1:8;1905:11;;;;;1835:3;;;:::i;:::-;;;1795:132;;;-1:-1:-1;1944:10:8;;1936:55;;;;-1:-1:-1;;;1936:55:8;;12255:2:14;1936:55:8;;;12237:21:14;;;12274:18;;;12267:30;12333:34;12313:18;;;12306:62;12385:18;;1936:55:8;12053:356:14;11597:157:13;11715:32;11721:2;11725:8;11735:5;11742:4;12157:13;;-1:-1:-1;;;;;12184:16:13;;12180:48;;12209:19;;;;;;;;;;;;;;12180:48;12242:8;12254:1;12242:13;12238:44;;12264:18;;;;;;;;;;;;;;12238:44;-1:-1:-1;;;;;12625:16:13;;;;;;:12;:16;;;;;;;;:44;;12683:49;;;12625:44;;;;;;;;12683:49;;;;-1:-1:-1;;12625:44:13;;;;;;12683:49;;;;;;;;;;;;;;;;12747:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;12796:66:13;;;;-1:-1:-1;;;12846:15:13;12796:66;;;;;;;;;;12747:25;12940:23;;;12982:4;:23;;;;-1:-1:-1;;;;;;12990:13:13;;1465:19:6;:23;;12990:15:13;12978:628;;;13025:309;13055:38;;13080:12;;-1:-1:-1;;;;;13055:38:13;;;13072:1;;13055:38;;13072:1;;13055:38;13120:69;13159:1;13163:2;13167:14;;;;;;13183:5;13120:30;:69::i;:::-;13115:172;;13224:40;;-1:-1:-1;;;13224:40:13;;;;;;;;;;;13115:172;13329:3;13313:12;:19;13025:309;;13413:12;13396:13;;:29;13392:43;;13427:8;;;13392:43;12978:628;;;13474:118;13504:40;;13529:14;;;;;-1:-1:-1;;;;;13504:40:13;;;13521:1;;13504:40;;13521:1;;13504:40;13587:3;13571:12;:19;13474:118;;12978:628;-1:-1:-1;13619:13:13;:28;13667:60;10349:359;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:177:14;-1:-1:-1;;;;;;92:5:14;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;638:258::-;710:1;720:113;734:6;731:1;728:13;720:113;;;810:11;;;804:18;791:11;;;784:39;756:2;749:10;720:113;;;851:6;848:1;845:13;842:48;;;-1:-1:-1;;886:1:14;868:16;;861:27;638:258::o;901:::-;943:3;981:5;975:12;1008:6;1003:3;996:19;1024:63;1080:6;1073:4;1068:3;1064:14;1057:4;1050:5;1046:16;1024:63;:::i;:::-;1141:2;1120:15;-1:-1:-1;;1116:29:14;1107:39;;;;1148:4;1103:50;;901:258;-1:-1:-1;;901:258:14:o;1164:220::-;1313:2;1302:9;1295:21;1276:4;1333:45;1374:2;1363:9;1359:18;1351:6;1333:45;:::i;1389:180::-;1448:6;1501:2;1489:9;1480:7;1476:23;1472:32;1469:52;;;1517:1;1514;1507:12;1469:52;-1:-1:-1;1540:23:14;;1389:180;-1:-1:-1;1389:180:14:o;1805:196::-;1873:20;;-1:-1:-1;;;;;1922:54:14;;1912:65;;1902:93;;1991:1;1988;1981:12;1902:93;1805:196;;;:::o;2006:254::-;2074:6;2082;2135:2;2123:9;2114:7;2110:23;2106:32;2103:52;;;2151:1;2148;2141:12;2103:52;2174:29;2193:9;2174:29;:::i;:::-;2164:39;2250:2;2235:18;;;;2222:32;;-1:-1:-1;;;2006:254:14:o;2447:328::-;2524:6;2532;2540;2593:2;2581:9;2572:7;2568:23;2564:32;2561:52;;;2609:1;2606;2599:12;2561:52;2632:29;2651:9;2632:29;:::i;:::-;2622:39;;2680:38;2714:2;2703:9;2699:18;2680:38;:::i;:::-;2670:48;;2765:2;2754:9;2750:18;2737:32;2727:42;;2447:328;;;;;:::o;3147:254::-;3215:6;3223;3276:2;3264:9;3255:7;3251:23;3247:32;3244:52;;;3292:1;3289;3282:12;3244:52;3328:9;3315:23;3305:33;;3357:38;3391:2;3380:9;3376:18;3357:38;:::i;:::-;3347:48;;3147:254;;;;;:::o;3406:186::-;3465:6;3518:2;3506:9;3497:7;3493:23;3489:32;3486:52;;;3534:1;3531;3524:12;3486:52;3557:29;3576:9;3557:29;:::i;3597:184::-;-1:-1:-1;;;3646:1:14;3639:88;3746:4;3743:1;3736:15;3770:4;3767:1;3760:15;3786:632;3851:5;3881:18;3922:2;3914:6;3911:14;3908:40;;;3928:18;;:::i;:::-;4003:2;3997:9;3971:2;4057:15;;-1:-1:-1;;4053:24:14;;;4079:2;4049:33;4045:42;4033:55;;;4103:18;;;4123:22;;;4100:46;4097:72;;;4149:18;;:::i;:::-;4189:10;4185:2;4178:22;4218:6;4209:15;;4248:6;4240;4233:22;4288:3;4279:6;4274:3;4270:16;4267:25;4264:45;;;4305:1;4302;4295:12;4264:45;4355:6;4350:3;4343:4;4335:6;4331:17;4318:44;4410:1;4403:4;4394:6;4386;4382:19;4378:30;4371:41;;;;3786:632;;;;;:::o;4423:451::-;4492:6;4545:2;4533:9;4524:7;4520:23;4516:32;4513:52;;;4561:1;4558;4551:12;4513:52;4601:9;4588:23;4634:18;4626:6;4623:30;4620:50;;;4666:1;4663;4656:12;4620:50;4689:22;;4742:4;4734:13;;4730:27;-1:-1:-1;4720:55:14;;4771:1;4768;4761:12;4720:55;4794:74;4860:7;4855:2;4842:16;4837:2;4833;4829:11;4794:74;:::i;4879:347::-;4944:6;4952;5005:2;4993:9;4984:7;4980:23;4976:32;4973:52;;;5021:1;5018;5011:12;4973:52;5044:29;5063:9;5044:29;:::i;:::-;5034:39;;5123:2;5112:9;5108:18;5095:32;5170:5;5163:13;5156:21;5149:5;5146:32;5136:60;;5192:1;5189;5182:12;5136:60;5215:5;5205:15;;;4879:347;;;;;:::o;5231:667::-;5326:6;5334;5342;5350;5403:3;5391:9;5382:7;5378:23;5374:33;5371:53;;;5420:1;5417;5410:12;5371:53;5443:29;5462:9;5443:29;:::i;:::-;5433:39;;5491:38;5525:2;5514:9;5510:18;5491:38;:::i;:::-;5481:48;;5576:2;5565:9;5561:18;5548:32;5538:42;;5631:2;5620:9;5616:18;5603:32;5658:18;5650:6;5647:30;5644:50;;;5690:1;5687;5680:12;5644:50;5713:22;;5766:4;5758:13;;5754:27;-1:-1:-1;5744:55:14;;5795:1;5792;5785:12;5744:55;5818:74;5884:7;5879:2;5866:16;5861:2;5857;5853:11;5818:74;:::i;:::-;5808:84;;;5231:667;;;;;;;:::o;5903:260::-;5971:6;5979;6032:2;6020:9;6011:7;6007:23;6003:32;6000:52;;;6048:1;6045;6038:12;6000:52;6071:29;6090:9;6071:29;:::i;:::-;6061:39;;6119:38;6153:2;6142:9;6138:18;6119:38;:::i;6168:437::-;6247:1;6243:12;;;;6290;;;6311:61;;6365:4;6357:6;6353:17;6343:27;;6311:61;6418:2;6410:6;6407:14;6387:18;6384:38;6381:218;;-1:-1:-1;;;6452:1:14;6445:88;6556:4;6553:1;6546:15;6584:4;6581:1;6574:15;6381:218;;6168:437;;;:::o;7736:184::-;-1:-1:-1;;;7785:1:14;7778:88;7885:4;7882:1;7875:15;7909:4;7906:1;7899:15;7925:128;7965:3;7996:1;7992:6;7989:1;7986:13;7983:39;;;8002:18;;:::i;:::-;-1:-1:-1;8038:9:14;;7925:128::o;8405:470::-;8584:3;8622:6;8616:13;8638:53;8684:6;8679:3;8672:4;8664:6;8660:17;8638:53;:::i;:::-;8754:13;;8713:16;;;;8776:57;8754:13;8713:16;8810:4;8798:17;;8776:57;:::i;:::-;8849:20;;8405:470;-1:-1:-1;;;;8405:470:14:o;9287:786::-;9698:25;9693:3;9686:38;9668:3;9753:6;9747:13;9769:62;9824:6;9819:2;9814:3;9810:12;9803:4;9795:6;9791:17;9769:62;:::i;:::-;9895:19;9890:2;9850:16;;;9882:11;;;9875:40;9940:13;;9962:63;9940:13;10011:2;10003:11;;9996:4;9984:17;;9962:63;:::i;:::-;10045:17;10064:2;10041:26;;9287:786;-1:-1:-1;;;;9287:786:14:o;10078:512::-;10272:4;-1:-1:-1;;;;;10382:2:14;10374:6;10370:15;10359:9;10352:34;10434:2;10426:6;10422:15;10417:2;10406:9;10402:18;10395:43;;10474:6;10469:2;10458:9;10454:18;10447:34;10517:3;10512:2;10501:9;10497:18;10490:31;10538:46;10579:3;10568:9;10564:19;10556:6;10538:46;:::i;:::-;10530:54;10078:512;-1:-1:-1;;;;;;10078:512:14:o;10595:249::-;10664:6;10717:2;10705:9;10696:7;10692:23;10688:32;10685:52;;;10733:1;10730;10723:12;10685:52;10765:9;10759:16;10784:30;10808:5;10784:30;:::i;10849:135::-;10888:3;10909:17;;;10906:43;;10929:18;;:::i;:::-;-1:-1:-1;10976:1:14;10965:13;;10849:135::o;10989:184::-;-1:-1:-1;;;11038:1:14;11031:88;11138:4;11135:1;11128:15;11162:4;11159:1;11152:15;11178:120;11218:1;11244;11234:35;;11249:18;;:::i;:::-;-1:-1:-1;11283:9:14;;11178:120::o;11303:125::-;11343:4;11371:1;11368;11365:8;11362:34;;;11376:18;;:::i;:::-;-1:-1:-1;11413:9:14;;11303:125::o;11433:112::-;11465:1;11491;11481:35;;11496:18;;:::i;:::-;-1:-1:-1;11530:9:14;;11433:112::o;11550:184::-;-1:-1:-1;;;11599:1:14;11592:88;11699:4;11696:1;11689:15;11723:4;11720:1;11713:15;11739:168;11779:7;11845:1;11841;11837:6;11833:14;11830:1;11827:21;11822:1;11815:9;11808:17;11804:45;11801:71;;;11852:18;;:::i;:::-;-1:-1:-1;11892:9:14;;11739:168::o;11912:136::-;11951:3;11979:5;11969:39;;11988:18;;:::i;:::-;-1:-1:-1;;;12024:18:14;;11912:136::o
Swarm Source
ipfs://c3b2aae0de32e9434ac18ac02ff40f7590b9f1e096f200f1bb6f4350e5b854b3
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.