Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
429 FREAKS
Holders
78
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
5 FREAKSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
SpaceFreaksgg
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-06-10 */ // SpaceFreaks.gg // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } pragma solidity ^0.8.0; abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor() { _transferOwnership(_msgSender()); } modifier onlyOwner() { _checkOwner(); _; } function owner() public view virtual returns (address) { return _owner; } function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } pragma solidity ^0.8.0; abstract contract ReentrancyGuard { uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } modifier nonReentrant() { require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); _status = _ENTERED; _; _status = _NOT_ENTERED; } } pragma solidity ^0.8.0; library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; function toString(uint256 value) internal pure returns (string memory) { 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); } 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); } 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); } function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } pragma solidity ^0.8.0; library EnumerableSet { struct Set { // Storage of set values bytes32[] _values; mapping(bytes32 => uint256) _indexes; } function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); set._indexes[value] = set._values.length; return true; } else { return false; } } function _remove(Set storage set, bytes32 value) private returns (bool) { uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; set._values[toDeleteIndex] = lastValue; set._indexes[lastValue] = valueIndex; } set._values.pop(); delete set._indexes[value]; return true; } else { return false; } } function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } function _length(Set storage set) private view returns (uint256) { return set._values.length; } function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } struct Bytes32Set { Set _inner; } function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } struct AddressSet { Set _inner; } function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } struct UintSet { Set _inner; } function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } } pragma solidity ^0.8.4; interface IERC721A { error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); error MintERC2309QuantityExceedsLimit(); error OwnershipNotInitializedForExtraData(); struct TokenOwnership { address addr; uint64 startTimestamp; bool burned; uint24 extraData; } function totalSupply() external view returns (uint256); function supportsInterface(bytes4 interfaceId) external view returns (bool); event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); function balanceOf(address owner) external view returns (uint256 balance); function ownerOf(uint256 tokenId) external view returns (address owner); function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; function transferFrom( address from, address to, uint256 tokenId ) external payable; function approve(address to, uint256 tokenId) external payable; function setApprovalForAll(address operator, bool _approved) external; function getApproved(uint256 tokenId) external view returns (address operator); function isApprovedForAll(address owner, address operator) external view returns (bool); function name() external view returns (string memory); function symbol() external view returns (string memory); function tokenURI(uint256 tokenId) external view returns (string memory); event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } pragma solidity ^0.8.4; interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } contract ERC721A is IERC721A { struct TokenApprovalRef { address value; } uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; uint256 private constant _BITPOS_NUMBER_MINTED = 64; uint256 private constant _BITPOS_NUMBER_BURNED = 128; uint256 private constant _BITPOS_AUX = 192; uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; uint256 private constant _BITPOS_START_TIMESTAMP = 160; uint256 private constant _BITMASK_BURNED = 1 << 224; uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; uint256 private constant _BITPOS_EXTRA_DATA = 232; uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; uint256 private _currentIndex; uint256 private _burnCounter; string private _name; string private _symbol; mapping(uint256 => uint256) private _packedOwnerships; mapping(address => uint256) private _packedAddressData; mapping(uint256 => TokenApprovalRef) private _tokenApprovals; mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } function _startTokenId() internal view virtual returns (uint256) { return 0; } function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } function totalSupply() public view virtual override returns (uint256) { unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } function _totalMinted() internal view virtual returns (uint256) { unchecked { return _currentIndex - _startTokenId(); } } function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == 0x01ffc9a7 || interfaceId == 0x80ac58cd || interfaceId == 0x5b5e139f; } function name() public view virtual override returns (string memory) { return _name; } function symbol() public view virtual override returns (string memory) { return _symbol; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } function _baseURI() internal view virtual returns (string memory) { return ''; } function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; if (packed & _BITMASK_BURNED == 0) { while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } function approve(address to, uint256 tokenId) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { owner := and(owner, _BITMASK_ADDRESS) msgSender := and(msgSender, _BITMASK_ADDRESS) result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); assembly { if approvedAddress { sstore(approvedAddressSlot, 0) } } unchecked { --_packedAddressData[from]; ++_packedAddressData[to]; _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; if (_packedOwnerships[nextTokenId] == 0) { if (nextTokenId != _currentIndex) { _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); unchecked { _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; assembly { toMasked := and(to, _BITMASK_ADDRESS) log4( 0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, startTokenId ) for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); unchecked { _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); assembly { if approvedAddress { sstore(approvedAddressSlot, 0) } } unchecked { _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; if (_packedOwnerships[nextTokenId] == 0) { if (nextTokenId != _currentIndex) { _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); unchecked { _burnCounter++; } } function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { let m := add(mload(0x40), 0xa0) mstore(0x40, m) str := sub(m, 0x20) mstore(str, 0) let end := str for { let temp := value } 1 {} { str := sub(str, 1) mstore8(str, add(48, mod(temp, 10))) temp := div(temp, 10) if iszero(temp) { break } } let length := sub(end, str) str := sub(str, 0x20) mstore(str, length) } } } pragma solidity ^0.8.13; contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry constant operatorFilterRegistry = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { if (address(operatorFilterRegistry).code.length > 0) { if (subscribe) { operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { operatorFilterRegistry.register(address(this)); } } } } modifier onlyAllowedOperator() virtual { if (address(operatorFilterRegistry).code.length > 0) { if (!operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)) { revert OperatorNotAllowed(msg.sender); } } _; } } pragma solidity ^0.8.13; contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {} } pragma solidity ^0.8.13; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } pragma solidity ^0.8.4; interface IERC721ABurnable is IERC721A { function burn(uint256 tokenId) external; } pragma solidity ^0.8.4; abstract contract ERC721ABurnable is ERC721A, IERC721ABurnable { function burn(uint256 tokenId) public virtual override { _burn(tokenId, true); } } interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); function decimals() external returns (uint8); } pragma solidity ^0.8.16; contract SpaceFreaksgg is Ownable, ERC721A, ReentrancyGuard, ERC721ABurnable, DefaultOperatorFilterer{ string public BASE_URI; bool public _MINT_ENABLED = false; uint public _COLLECTION_SIZE = 5000; uint public _MAX_BATCH_SIZE = 5; uint public _SUPPLY_PER_WALLET = 5; uint public _MINT_PRICE = 0.01 * (10**18); IERC20 public _SPACEDUST; uint256 public _REMIX_PRICE = 1 * (10**18); address public _FEE_RECEIVER = address(0x6FAA2178C9ec2574c1DfF9A18D9b0EBc1Adb5803); event new_remix( uint256 token_id, address wallet, uint256 price ); constructor() ERC721A("SpaceFreaks.gg", "FREAKS") {} function TeamMint(uint256 quantity, address receiver) public onlyOwner { require( totalSupply() + quantity <= _COLLECTION_SIZE, "No more freaks in stock!" ); _safeMint(receiver, quantity); } modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract"); _; } function transferFrom(address from, address to, uint256 tokenId) public payable override (ERC721A, IERC721A) onlyAllowedOperator { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public payable override (ERC721A, IERC721A) onlyAllowedOperator { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public payable override (ERC721A, IERC721A) onlyAllowedOperator { super.safeTransferFrom(from, to, tokenId, data); } /** * @dev Mint new SpaceFreaks **/ function mintNft(uint quantity) external payable callerIsUser nonReentrant { uint _PRICE = _MINT_PRICE * quantity; require(_MINT_ENABLED, "Mint not started!"); require(totalSupply() + quantity <= _COLLECTION_SIZE, "Mint completed!"); require(quantity <= _MAX_BATCH_SIZE, "Tried to mint over batch limit."); require(balanceOf(msg.sender) + quantity <= _SUPPLY_PER_WALLET, "Tried to mint over wallet limit."); require(msg.value >= _PRICE, "Ether value does not match desired mint price for the given quantity!"); payable(_FEE_RECEIVER).transfer(_PRICE); if (msg.value > _PRICE) { payable(msg.sender).transfer(msg.value - _PRICE); } _safeMint(msg.sender, quantity); } /** * @dev Enable / disable public mint **/ function setPublicMintEnabled(bool val) public onlyOwner { _MINT_ENABLED = val; } /** * @dev Withdraw potential stuck funds in contract **/ function withdrawFunds() external onlyOwner nonReentrant { (bool success, ) = msg.sender.call{value: address(this).balance}(""); require(success, "Transfer failed."); } /** * @dev Set collection URI **/ function collectionUrI(string memory _baseURI) public onlyOwner { BASE_URI = _baseURI; } /** * @dev Change max mint per wallet **/ function changeSupplyPerWallet(uint256 _new) external onlyOwner { _SUPPLY_PER_WALLET = _new; } /** * @dev Update mint batch size **/ function setMaxBatchSize(uint256 _new) external onlyOwner { _MAX_BATCH_SIZE = _new; } /** * @dev Return tokenURI **/ function tokenURI(uint256 _tokenId) public view override (ERC721A, IERC721A) returns (string memory) { return string(abi.encodePacked(BASE_URI, Strings.toString(_tokenId))); } /** * @dev Function to update the cost of remix **/ function setRemixPrice(uint256 val) public onlyOwner { _REMIX_PRICE = val; } /** * @dev Function to set the spacedust fee receiver **/ function setFeeReceiver(address val) public onlyOwner { _FEE_RECEIVER = address(val); } /** * @dev Function to set the spacedust token address **/ function setSpaceDustAddress(address val) public onlyOwner { _SPACEDUST = IERC20(address(val)); } /** * @dev Function to start the remix process **/ function remixNft(uint256 token_id) public { // Check owner of requested remix token require(ownerOf(token_id) == msg.sender, "You're not the owner of the NFT."); // Check tokens sent _SPACEDUST.transferFrom(msg.sender, _FEE_RECEIVER, _REMIX_PRICE); emit new_remix( token_id, msg.sender, _REMIX_PRICE ); } }
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":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"token_id","type":"uint256"},{"indexed":false,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"new_remix","type":"event"},{"inputs":[],"name":"BASE_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"TeamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_COLLECTION_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_FEE_RECEIVER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_MAX_BATCH_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_MINT_ENABLED","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_REMIX_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_SPACEDUST","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_SUPPLY_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"changeSupplyPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"collectionUrI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintNft","outputs":[],"stateMutability":"payable","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":[{"internalType":"uint256","name":"token_id","type":"uint256"}],"name":"remixNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","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":"val","type":"address"}],"name":"setFeeReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"setMaxBatchSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"setPublicMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setRemixPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"val","type":"address"}],"name":"setSpaceDustAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600b805460ff19169055611388600c556005600d819055600e55662386f26fc10000600f55670de0b6b3a7640000601155601280546001600160a01b031916736faa2178c9ec2574c1dff9a18d9b0ebc1adb58031790553480156200006857600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600e81526020016d5370616365467265616b732e676760901b81525060405180604001604052806006815260200165465245414b5360d01b815250620000e0620000da6200025760201b60201c565b6200025b565b6003620000ee838262000350565b506004620000fd828262000350565b506000600190815560095550506daaeb6d7670e522a718067333cd4e3b156200024f5780156200019d57604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200017e57600080fd5b505af115801562000193573d6000803e3d6000fd5b505050506200024f565b6001600160a01b03821615620001ee5760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af29039060440162000163565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200023557600080fd5b505af11580156200024a573d6000803e3d6000fd5b505050505b50506200041c565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620002d657607f821691505b602082108103620002f757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200034b57600081815260208120601f850160051c81016020861015620003265750805b601f850160051c820191505b81811015620003475782815560010162000332565b5050505b505050565b81516001600160401b038111156200036c576200036c620002ab565b62000384816200037d8454620002c1565b84620002fd565b602080601f831160018114620003bc5760008415620003a35750858301515b600019600386901b1c1916600185901b17855562000347565b600085815260208120601f198616915b82811015620003ed57888601518255948401946001909101908401620003cc565b50858210156200040c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612198806200042c6000396000f3fe6080604052600436106102255760003560e01c8063715018a611610123578063c87b56dd116100ab578063dbddb26a1161006f578063dbddb26a146105e2578063e985e9c5146105f7578063efdcd97414610617578063f2fde38b14610637578063f77777471461065757600080fd5b8063c87b56dd14610552578063d44e6d2014610572578063d7d1e57e14610588578063d8fae8c5146105a8578063dab4c827146105c257600080fd5b806395d89b41116100f257806395d89b41146104de578063a22cb465146104f3578063a3ca1f8114610513578063b88d4fde14610529578063c2047ebf1461053c57600080fd5b8063715018a61461046b578063818668d7146104805780638da5cb5b146104a057806391267659146104be57600080fd5b80632b26a6bf116101b1578063479ba2da11610175578063479ba2da146103cb578063502fb3ff146103eb5780636352211e1461040b5780636730cfa01461042b57806370a082311461044b57600080fd5b80632b26a6bf146103425780632b7e66d2146103625780633bdf774c1461038257806342842e0e1461039857806342966c68146103ab57600080fd5b80630d730acc116101f85780630d730acc146102ce57806318160ddd146102e15780631fbe829c1461030457806323b872dd1461031a57806324600fc31461032d57600080fd5b806301ffc9a71461022a57806306fdde031461025f578063081812fc14610281578063095ea7b3146102b9575b600080fd5b34801561023657600080fd5b5061024a610245366004611b05565b610677565b60405190151581526020015b60405180910390f35b34801561026b57600080fd5b506102746106c9565b6040516102569190611b72565b34801561028d57600080fd5b506102a161029c366004611b85565b61075b565b6040516001600160a01b039091168152602001610256565b6102cc6102c7366004611bba565b61079f565b005b6102cc6102dc366004611b85565b61083f565b3480156102ed57600080fd5b50600254600154035b604051908152602001610256565b34801561031057600080fd5b506102f6600e5481565b6102cc610328366004611be4565b610b68565b34801561033957600080fd5b506102cc610c21565b34801561034e57600080fd5b506102cc61035d366004611b85565b610d13565b34801561036e57600080fd5b506010546102a1906001600160a01b031681565b34801561038e57600080fd5b506102f6600c5481565b6102cc6103a6366004611be4565b610d20565b3480156103b757600080fd5b506102cc6103c6366004611b85565b610dd4565b3480156103d757600080fd5b506102cc6103e6366004611c20565b610de2565b3480156103f757600080fd5b506102cc610406366004611b85565b610e0c565b34801561041757600080fd5b506102a1610426366004611b85565b610f35565b34801561043757600080fd5b506012546102a1906001600160a01b031681565b34801561045757600080fd5b506102f6610466366004611c20565b610f40565b34801561047757600080fd5b506102cc610f8f565b34801561048c57600080fd5b506102cc61049b366004611c49565b610fa3565b3480156104ac57600080fd5b506000546001600160a01b03166102a1565b3480156104ca57600080fd5b506102cc6104d9366004611b85565b610fbe565b3480156104ea57600080fd5b50610274610fcb565b3480156104ff57600080fd5b506102cc61050e366004611c66565b610fda565b34801561051f57600080fd5b506102f6600f5481565b6102cc610537366004611d29565b611046565b34801561054857600080fd5b506102f660115481565b34801561055e57600080fd5b5061027461056d366004611b85565b611101565b34801561057e57600080fd5b506102f6600d5481565b34801561059457600080fd5b506102cc6105a3366004611da5565b611135565b3480156105b457600080fd5b50600b5461024a9060ff1681565b3480156105ce57600080fd5b506102cc6105dd366004611b85565b61114d565b3480156105ee57600080fd5b5061027461115a565b34801561060357600080fd5b5061024a610612366004611dee565b6111e8565b34801561062357600080fd5b506102cc610632366004611c20565b611216565b34801561064357600080fd5b506102cc610652366004611c20565b611240565b34801561066357600080fd5b506102cc610672366004611e21565b6112b6565b60006301ffc9a760e01b6001600160e01b0319831614806106a857506380ac58cd60e01b6001600160e01b03198316145b806106c35750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600380546106d890611e44565b80601f016020809104026020016040519081016040528092919081815260200182805461070490611e44565b80156107515780601f1061072657610100808354040283529160200191610751565b820191906000526020600020905b81548152906001019060200180831161073457829003601f168201915b5050505050905090565b600061076682611331565b610783576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b60006107aa82610f35565b9050336001600160a01b038216146107e3576107c681336111e8565b6107e3576040516367d9dca160e11b815260040160405180910390fd5b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b3233146108935760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e7472616374000060448201526064015b60405180910390fd5b6002600954036108e55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161088a565b6002600955600f546000906108fb908390611e94565b600b5490915060ff166109445760405162461bcd60e51b81526020600482015260116024820152704d696e74206e6f7420737461727465642160781b604482015260640161088a565b600c54826109556002546001540390565b61095f9190611eab565b111561099f5760405162461bcd60e51b815260206004820152600f60248201526e4d696e7420636f6d706c657465642160881b604482015260640161088a565b600d548211156109f15760405162461bcd60e51b815260206004820152601f60248201527f547269656420746f206d696e74206f766572206261746368206c696d69742e00604482015260640161088a565b600e54826109fe33610f40565b610a089190611eab565b1115610a565760405162461bcd60e51b815260206004820181905260248201527f547269656420746f206d696e74206f7665722077616c6c6574206c696d69742e604482015260640161088a565b80341015610ada5760405162461bcd60e51b815260206004820152604560248201527f45746865722076616c756520646f6573206e6f74206d6174636820646573697260448201527f6564206d696e7420707269636520666f722074686520676976656e207175616e606482015264746974792160d81b608482015260a40161088a565b6012546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610b14573d6000803e3d6000fd5b5080341115610b5557336108fc610b2b8334611ebe565b6040518115909202916000818181858888f19350505050158015610b53573d6000803e3d6000fd5b505b610b5f3383611359565b50506001600955565b6daaeb6d7670e522a718067333cd4e3b15610c1157604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af1158015610bce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf29190611ed1565b610c1157604051633b79c77360e21b815233600482015260240161088a565b610c1c838383611373565b505050565b610c29611504565b600260095403610c7b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161088a565b6002600955604051600090339047908381818185875af1925050503d8060008114610cc2576040519150601f19603f3d011682016040523d82523d6000602084013e610cc7565b606091505b5050905080610d0b5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b604482015260640161088a565b506001600955565b610d1b611504565b600d55565b6daaeb6d7670e522a718067333cd4e3b15610dc957604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af1158015610d86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610daa9190611ed1565b610dc957604051633b79c77360e21b815233600482015260240161088a565b610c1c83838361155e565b610ddf816001611579565b50565b610dea611504565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b33610e1682610f35565b6001600160a01b031614610e6c5760405162461bcd60e51b815260206004820181905260248201527f596f75277265206e6f7420746865206f776e6572206f6620746865204e46542e604482015260640161088a565b6010546012546011546040516323b872dd60e01b81523360048201526001600160a01b03928316602482015260448101919091529116906323b872dd906064016020604051808303816000875af1158015610ecb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eef9190611ed1565b506011546040805183815233602082015280820192909252517f1bf4c2301fe31c472236d04b38da322696352ecd6d828b681dbbfb87f13e68cb9181900360600190a150565b60006106c3826116b2565b60006001600160a01b038216610f69576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205467ffffffffffffffff1690565b610f97611504565b610fa16000611720565b565b610fab611504565b600b805460ff1916911515919091179055565b610fc6611504565b600e55565b6060600480546106d890611e44565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6daaeb6d7670e522a718067333cd4e3b156110ef57604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af11580156110ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d09190611ed1565b6110ef57604051633b79c77360e21b815233600482015260240161088a565b6110fb84848484611770565b50505050565b6060600a61110e836117b4565b60405160200161111f929190611eee565b6040516020818303038152906040529050919050565b61113d611504565b600a6111498282611fbb565b5050565b611155611504565b601155565b600a805461116790611e44565b80601f016020809104026020016040519081016040528092919081815260200182805461119390611e44565b80156111e05780601f106111b5576101008083540402835291602001916111e0565b820191906000526020600020905b8154815290600101906020018083116111c357829003601f168201915b505050505081565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b61121e611504565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b611248611504565b6001600160a01b0381166112ad5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161088a565b610ddf81611720565b6112be611504565b600c54826112cf6002546001540390565b6112d99190611eab565b11156113275760405162461bcd60e51b815260206004820152601860248201527f4e6f206d6f726520667265616b7320696e2073746f636b210000000000000000604482015260640161088a565b6111498183611359565b6000600154821080156106c3575050600090815260056020526040902054600160e01b161590565b6111498282604051806020016040528060008152506118bd565b600061137e826116b2565b9050836001600160a01b0316816001600160a01b0316146113b15760405162a1148160e81b815260040160405180910390fd5b600082815260076020526040902080546113dd8187335b6001600160a01b039081169116811491141790565b611408576113eb86336111e8565b61140857604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661142f57604051633a954ecd60e21b815260040160405180910390fd5b801561143a57600082555b6001600160a01b038681166000908152600660205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260056020526040812091909155600160e11b841690036114cc576001840160008181526005602052604081205490036114ca5760015481146114ca5760008181526005602052604090208490555b505b83856001600160a01b0316876001600160a01b031660008051602061214383398151915260405160405180910390a45b505050505050565b6000546001600160a01b03163314610fa15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161088a565b610c1c83838360405180602001604052806000815250611046565b6000611584836116b2565b9050806000806115a286600090815260076020526040902080549091565b9150915084156115e2576115b78184336113c8565b6115e2576115c583336111e8565b6115e257604051632ce44b5f60e11b815260040160405180910390fd5b80156115ed57600082555b6001600160a01b038316600081815260066020526040902080546fffffffffffffffffffffffffffffffff0190554260a01b17600360e01b17600087815260056020526040812091909155600160e11b8516900361167b576001860160008181526005602052604081205490036116795760015481146116795760008181526005602052604090208590555b505b60405186906000906001600160a01b03861690600080516020612143833981519152908390a4505060028054600101905550505050565b6000816001548110156117075760008181526005602052604081205490600160e01b82169003611705575b806000036116fe5750600019016000818152600560205260409020546116dd565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61177b848484610b68565b6001600160a01b0383163b156110fb576117978484848461192a565b6110fb576040516368d2bf6b60e11b815260040160405180910390fd5b6060816000036117db5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561180557806117ef8161207b565b91506117fe9050600a836120aa565b91506117df565b60008167ffffffffffffffff81111561182057611820611c9d565b6040519080825280601f01601f19166020018201604052801561184a576020820181803683370190505b5090505b84156118b55761185f600183611ebe565b915061186c600a866120be565b611877906030611eab565b60f81b81838151811061188c5761188c6120d2565b60200101906001600160f81b031916908160001a9053506118ae600a866120aa565b945061184e565b949350505050565b6118c78383611a15565b6001600160a01b0383163b15610c1c576001548281035b6118f1600086838060010194508661192a565b61190e576040516368d2bf6b60e11b815260040160405180910390fd5b8181106118de57816001541461192357600080fd5b5050505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061195f9033908990889088906004016120e8565b6020604051808303816000875af192505050801561199a575060408051601f3d908101601f1916820190925261199791810190612125565b60015b6119f8573d8080156119c8576040519150601f19603f3d011682016040523d82523d6000602084013e6119cd565b606091505b5080516000036119f0576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6001546000829003611a3a5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526006602090815260408083208054680100000000000000018802019055848352600590915281206001851460e11b4260a01b178317905582840190839083906000805160206121438339815191528180a4600183015b818114611ac55780836000600080516020612143833981519152600080a4600101611a9f565b5081600003611ae657604051622e076360e81b815260040160405180910390fd5b60015550505050565b6001600160e01b031981168114610ddf57600080fd5b600060208284031215611b1757600080fd5b81356116fe81611aef565b60005b83811015611b3d578181015183820152602001611b25565b50506000910152565b60008151808452611b5e816020860160208601611b22565b601f01601f19169290920160200192915050565b6020815260006116fe6020830184611b46565b600060208284031215611b9757600080fd5b5035919050565b80356001600160a01b0381168114611bb557600080fd5b919050565b60008060408385031215611bcd57600080fd5b611bd683611b9e565b946020939093013593505050565b600080600060608486031215611bf957600080fd5b611c0284611b9e565b9250611c1060208501611b9e565b9150604084013590509250925092565b600060208284031215611c3257600080fd5b6116fe82611b9e565b8015158114610ddf57600080fd5b600060208284031215611c5b57600080fd5b81356116fe81611c3b565b60008060408385031215611c7957600080fd5b611c8283611b9e565b91506020830135611c9281611c3b565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611cce57611cce611c9d565b604051601f8501601f19908116603f01168101908282118183101715611cf657611cf6611c9d565b81604052809350858152868686011115611d0f57600080fd5b858560208301376000602087830101525050509392505050565b60008060008060808587031215611d3f57600080fd5b611d4885611b9e565b9350611d5660208601611b9e565b925060408501359150606085013567ffffffffffffffff811115611d7957600080fd5b8501601f81018713611d8a57600080fd5b611d9987823560208401611cb3565b91505092959194509250565b600060208284031215611db757600080fd5b813567ffffffffffffffff811115611dce57600080fd5b8201601f81018413611ddf57600080fd5b6118b584823560208401611cb3565b60008060408385031215611e0157600080fd5b611e0a83611b9e565b9150611e1860208401611b9e565b90509250929050565b60008060408385031215611e3457600080fd5b82359150611e1860208401611b9e565b600181811c90821680611e5857607f821691505b602082108103611e7857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176106c3576106c3611e7e565b808201808211156106c3576106c3611e7e565b818103818111156106c3576106c3611e7e565b600060208284031215611ee357600080fd5b81516116fe81611c3b565b6000808454611efc81611e44565b60018281168015611f145760018114611f2957611f58565b60ff1984168752821515830287019450611f58565b8860005260208060002060005b85811015611f4f5781548a820152908401908201611f36565b50505082870194505b505050508351611f6c818360208801611b22565b01949350505050565b601f821115610c1c57600081815260208120601f850160051c81016020861015611f9c5750805b601f850160051c820191505b818110156114fc57828155600101611fa8565b815167ffffffffffffffff811115611fd557611fd5611c9d565b611fe981611fe38454611e44565b84611f75565b602080601f83116001811461201e57600084156120065750858301515b600019600386901b1c1916600185901b1785556114fc565b600085815260208120601f198616915b8281101561204d5788860151825594840194600190910190840161202e565b508582101561206b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006001820161208d5761208d611e7e565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826120b9576120b9612094565b500490565b6000826120cd576120cd612094565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061211b90830184611b46565b9695505050505050565b60006020828403121561213757600080fd5b81516116fe81611aef56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122028b409df4b5e414018fb673171b86a38fde4ed71afb93470fef9ffbff7dd65c964736f6c63430008120033
Deployed Bytecode
0x6080604052600436106102255760003560e01c8063715018a611610123578063c87b56dd116100ab578063dbddb26a1161006f578063dbddb26a146105e2578063e985e9c5146105f7578063efdcd97414610617578063f2fde38b14610637578063f77777471461065757600080fd5b8063c87b56dd14610552578063d44e6d2014610572578063d7d1e57e14610588578063d8fae8c5146105a8578063dab4c827146105c257600080fd5b806395d89b41116100f257806395d89b41146104de578063a22cb465146104f3578063a3ca1f8114610513578063b88d4fde14610529578063c2047ebf1461053c57600080fd5b8063715018a61461046b578063818668d7146104805780638da5cb5b146104a057806391267659146104be57600080fd5b80632b26a6bf116101b1578063479ba2da11610175578063479ba2da146103cb578063502fb3ff146103eb5780636352211e1461040b5780636730cfa01461042b57806370a082311461044b57600080fd5b80632b26a6bf146103425780632b7e66d2146103625780633bdf774c1461038257806342842e0e1461039857806342966c68146103ab57600080fd5b80630d730acc116101f85780630d730acc146102ce57806318160ddd146102e15780631fbe829c1461030457806323b872dd1461031a57806324600fc31461032d57600080fd5b806301ffc9a71461022a57806306fdde031461025f578063081812fc14610281578063095ea7b3146102b9575b600080fd5b34801561023657600080fd5b5061024a610245366004611b05565b610677565b60405190151581526020015b60405180910390f35b34801561026b57600080fd5b506102746106c9565b6040516102569190611b72565b34801561028d57600080fd5b506102a161029c366004611b85565b61075b565b6040516001600160a01b039091168152602001610256565b6102cc6102c7366004611bba565b61079f565b005b6102cc6102dc366004611b85565b61083f565b3480156102ed57600080fd5b50600254600154035b604051908152602001610256565b34801561031057600080fd5b506102f6600e5481565b6102cc610328366004611be4565b610b68565b34801561033957600080fd5b506102cc610c21565b34801561034e57600080fd5b506102cc61035d366004611b85565b610d13565b34801561036e57600080fd5b506010546102a1906001600160a01b031681565b34801561038e57600080fd5b506102f6600c5481565b6102cc6103a6366004611be4565b610d20565b3480156103b757600080fd5b506102cc6103c6366004611b85565b610dd4565b3480156103d757600080fd5b506102cc6103e6366004611c20565b610de2565b3480156103f757600080fd5b506102cc610406366004611b85565b610e0c565b34801561041757600080fd5b506102a1610426366004611b85565b610f35565b34801561043757600080fd5b506012546102a1906001600160a01b031681565b34801561045757600080fd5b506102f6610466366004611c20565b610f40565b34801561047757600080fd5b506102cc610f8f565b34801561048c57600080fd5b506102cc61049b366004611c49565b610fa3565b3480156104ac57600080fd5b506000546001600160a01b03166102a1565b3480156104ca57600080fd5b506102cc6104d9366004611b85565b610fbe565b3480156104ea57600080fd5b50610274610fcb565b3480156104ff57600080fd5b506102cc61050e366004611c66565b610fda565b34801561051f57600080fd5b506102f6600f5481565b6102cc610537366004611d29565b611046565b34801561054857600080fd5b506102f660115481565b34801561055e57600080fd5b5061027461056d366004611b85565b611101565b34801561057e57600080fd5b506102f6600d5481565b34801561059457600080fd5b506102cc6105a3366004611da5565b611135565b3480156105b457600080fd5b50600b5461024a9060ff1681565b3480156105ce57600080fd5b506102cc6105dd366004611b85565b61114d565b3480156105ee57600080fd5b5061027461115a565b34801561060357600080fd5b5061024a610612366004611dee565b6111e8565b34801561062357600080fd5b506102cc610632366004611c20565b611216565b34801561064357600080fd5b506102cc610652366004611c20565b611240565b34801561066357600080fd5b506102cc610672366004611e21565b6112b6565b60006301ffc9a760e01b6001600160e01b0319831614806106a857506380ac58cd60e01b6001600160e01b03198316145b806106c35750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600380546106d890611e44565b80601f016020809104026020016040519081016040528092919081815260200182805461070490611e44565b80156107515780601f1061072657610100808354040283529160200191610751565b820191906000526020600020905b81548152906001019060200180831161073457829003601f168201915b5050505050905090565b600061076682611331565b610783576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b60006107aa82610f35565b9050336001600160a01b038216146107e3576107c681336111e8565b6107e3576040516367d9dca160e11b815260040160405180910390fd5b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b3233146108935760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e7472616374000060448201526064015b60405180910390fd5b6002600954036108e55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161088a565b6002600955600f546000906108fb908390611e94565b600b5490915060ff166109445760405162461bcd60e51b81526020600482015260116024820152704d696e74206e6f7420737461727465642160781b604482015260640161088a565b600c54826109556002546001540390565b61095f9190611eab565b111561099f5760405162461bcd60e51b815260206004820152600f60248201526e4d696e7420636f6d706c657465642160881b604482015260640161088a565b600d548211156109f15760405162461bcd60e51b815260206004820152601f60248201527f547269656420746f206d696e74206f766572206261746368206c696d69742e00604482015260640161088a565b600e54826109fe33610f40565b610a089190611eab565b1115610a565760405162461bcd60e51b815260206004820181905260248201527f547269656420746f206d696e74206f7665722077616c6c6574206c696d69742e604482015260640161088a565b80341015610ada5760405162461bcd60e51b815260206004820152604560248201527f45746865722076616c756520646f6573206e6f74206d6174636820646573697260448201527f6564206d696e7420707269636520666f722074686520676976656e207175616e606482015264746974792160d81b608482015260a40161088a565b6012546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610b14573d6000803e3d6000fd5b5080341115610b5557336108fc610b2b8334611ebe565b6040518115909202916000818181858888f19350505050158015610b53573d6000803e3d6000fd5b505b610b5f3383611359565b50506001600955565b6daaeb6d7670e522a718067333cd4e3b15610c1157604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af1158015610bce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf29190611ed1565b610c1157604051633b79c77360e21b815233600482015260240161088a565b610c1c838383611373565b505050565b610c29611504565b600260095403610c7b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161088a565b6002600955604051600090339047908381818185875af1925050503d8060008114610cc2576040519150601f19603f3d011682016040523d82523d6000602084013e610cc7565b606091505b5050905080610d0b5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b604482015260640161088a565b506001600955565b610d1b611504565b600d55565b6daaeb6d7670e522a718067333cd4e3b15610dc957604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af1158015610d86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610daa9190611ed1565b610dc957604051633b79c77360e21b815233600482015260240161088a565b610c1c83838361155e565b610ddf816001611579565b50565b610dea611504565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b33610e1682610f35565b6001600160a01b031614610e6c5760405162461bcd60e51b815260206004820181905260248201527f596f75277265206e6f7420746865206f776e6572206f6620746865204e46542e604482015260640161088a565b6010546012546011546040516323b872dd60e01b81523360048201526001600160a01b03928316602482015260448101919091529116906323b872dd906064016020604051808303816000875af1158015610ecb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eef9190611ed1565b506011546040805183815233602082015280820192909252517f1bf4c2301fe31c472236d04b38da322696352ecd6d828b681dbbfb87f13e68cb9181900360600190a150565b60006106c3826116b2565b60006001600160a01b038216610f69576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205467ffffffffffffffff1690565b610f97611504565b610fa16000611720565b565b610fab611504565b600b805460ff1916911515919091179055565b610fc6611504565b600e55565b6060600480546106d890611e44565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6daaeb6d7670e522a718067333cd4e3b156110ef57604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af11580156110ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d09190611ed1565b6110ef57604051633b79c77360e21b815233600482015260240161088a565b6110fb84848484611770565b50505050565b6060600a61110e836117b4565b60405160200161111f929190611eee565b6040516020818303038152906040529050919050565b61113d611504565b600a6111498282611fbb565b5050565b611155611504565b601155565b600a805461116790611e44565b80601f016020809104026020016040519081016040528092919081815260200182805461119390611e44565b80156111e05780601f106111b5576101008083540402835291602001916111e0565b820191906000526020600020905b8154815290600101906020018083116111c357829003601f168201915b505050505081565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b61121e611504565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b611248611504565b6001600160a01b0381166112ad5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161088a565b610ddf81611720565b6112be611504565b600c54826112cf6002546001540390565b6112d99190611eab565b11156113275760405162461bcd60e51b815260206004820152601860248201527f4e6f206d6f726520667265616b7320696e2073746f636b210000000000000000604482015260640161088a565b6111498183611359565b6000600154821080156106c3575050600090815260056020526040902054600160e01b161590565b6111498282604051806020016040528060008152506118bd565b600061137e826116b2565b9050836001600160a01b0316816001600160a01b0316146113b15760405162a1148160e81b815260040160405180910390fd5b600082815260076020526040902080546113dd8187335b6001600160a01b039081169116811491141790565b611408576113eb86336111e8565b61140857604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661142f57604051633a954ecd60e21b815260040160405180910390fd5b801561143a57600082555b6001600160a01b038681166000908152600660205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260056020526040812091909155600160e11b841690036114cc576001840160008181526005602052604081205490036114ca5760015481146114ca5760008181526005602052604090208490555b505b83856001600160a01b0316876001600160a01b031660008051602061214383398151915260405160405180910390a45b505050505050565b6000546001600160a01b03163314610fa15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161088a565b610c1c83838360405180602001604052806000815250611046565b6000611584836116b2565b9050806000806115a286600090815260076020526040902080549091565b9150915084156115e2576115b78184336113c8565b6115e2576115c583336111e8565b6115e257604051632ce44b5f60e11b815260040160405180910390fd5b80156115ed57600082555b6001600160a01b038316600081815260066020526040902080546fffffffffffffffffffffffffffffffff0190554260a01b17600360e01b17600087815260056020526040812091909155600160e11b8516900361167b576001860160008181526005602052604081205490036116795760015481146116795760008181526005602052604090208590555b505b60405186906000906001600160a01b03861690600080516020612143833981519152908390a4505060028054600101905550505050565b6000816001548110156117075760008181526005602052604081205490600160e01b82169003611705575b806000036116fe5750600019016000818152600560205260409020546116dd565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61177b848484610b68565b6001600160a01b0383163b156110fb576117978484848461192a565b6110fb576040516368d2bf6b60e11b815260040160405180910390fd5b6060816000036117db5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561180557806117ef8161207b565b91506117fe9050600a836120aa565b91506117df565b60008167ffffffffffffffff81111561182057611820611c9d565b6040519080825280601f01601f19166020018201604052801561184a576020820181803683370190505b5090505b84156118b55761185f600183611ebe565b915061186c600a866120be565b611877906030611eab565b60f81b81838151811061188c5761188c6120d2565b60200101906001600160f81b031916908160001a9053506118ae600a866120aa565b945061184e565b949350505050565b6118c78383611a15565b6001600160a01b0383163b15610c1c576001548281035b6118f1600086838060010194508661192a565b61190e576040516368d2bf6b60e11b815260040160405180910390fd5b8181106118de57816001541461192357600080fd5b5050505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061195f9033908990889088906004016120e8565b6020604051808303816000875af192505050801561199a575060408051601f3d908101601f1916820190925261199791810190612125565b60015b6119f8573d8080156119c8576040519150601f19603f3d011682016040523d82523d6000602084013e6119cd565b606091505b5080516000036119f0576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6001546000829003611a3a5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526006602090815260408083208054680100000000000000018802019055848352600590915281206001851460e11b4260a01b178317905582840190839083906000805160206121438339815191528180a4600183015b818114611ac55780836000600080516020612143833981519152600080a4600101611a9f565b5081600003611ae657604051622e076360e81b815260040160405180910390fd5b60015550505050565b6001600160e01b031981168114610ddf57600080fd5b600060208284031215611b1757600080fd5b81356116fe81611aef565b60005b83811015611b3d578181015183820152602001611b25565b50506000910152565b60008151808452611b5e816020860160208601611b22565b601f01601f19169290920160200192915050565b6020815260006116fe6020830184611b46565b600060208284031215611b9757600080fd5b5035919050565b80356001600160a01b0381168114611bb557600080fd5b919050565b60008060408385031215611bcd57600080fd5b611bd683611b9e565b946020939093013593505050565b600080600060608486031215611bf957600080fd5b611c0284611b9e565b9250611c1060208501611b9e565b9150604084013590509250925092565b600060208284031215611c3257600080fd5b6116fe82611b9e565b8015158114610ddf57600080fd5b600060208284031215611c5b57600080fd5b81356116fe81611c3b565b60008060408385031215611c7957600080fd5b611c8283611b9e565b91506020830135611c9281611c3b565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611cce57611cce611c9d565b604051601f8501601f19908116603f01168101908282118183101715611cf657611cf6611c9d565b81604052809350858152868686011115611d0f57600080fd5b858560208301376000602087830101525050509392505050565b60008060008060808587031215611d3f57600080fd5b611d4885611b9e565b9350611d5660208601611b9e565b925060408501359150606085013567ffffffffffffffff811115611d7957600080fd5b8501601f81018713611d8a57600080fd5b611d9987823560208401611cb3565b91505092959194509250565b600060208284031215611db757600080fd5b813567ffffffffffffffff811115611dce57600080fd5b8201601f81018413611ddf57600080fd5b6118b584823560208401611cb3565b60008060408385031215611e0157600080fd5b611e0a83611b9e565b9150611e1860208401611b9e565b90509250929050565b60008060408385031215611e3457600080fd5b82359150611e1860208401611b9e565b600181811c90821680611e5857607f821691505b602082108103611e7857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176106c3576106c3611e7e565b808201808211156106c3576106c3611e7e565b818103818111156106c3576106c3611e7e565b600060208284031215611ee357600080fd5b81516116fe81611c3b565b6000808454611efc81611e44565b60018281168015611f145760018114611f2957611f58565b60ff1984168752821515830287019450611f58565b8860005260208060002060005b85811015611f4f5781548a820152908401908201611f36565b50505082870194505b505050508351611f6c818360208801611b22565b01949350505050565b601f821115610c1c57600081815260208120601f850160051c81016020861015611f9c5750805b601f850160051c820191505b818110156114fc57828155600101611fa8565b815167ffffffffffffffff811115611fd557611fd5611c9d565b611fe981611fe38454611e44565b84611f75565b602080601f83116001811461201e57600084156120065750858301515b600019600386901b1c1916600185901b1785556114fc565b600085815260208120601f198616915b8281101561204d5788860151825594840194600190910190840161202e565b508582101561206b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006001820161208d5761208d611e7e565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826120b9576120b9612094565b500490565b6000826120cd576120cd612094565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061211b90830184611b46565b9695505050505050565b60006020828403121561213757600080fd5b81516116fe81611aef56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122028b409df4b5e414018fb673171b86a38fde4ed71afb93470fef9ffbff7dd65c964736f6c63430008120033
Deployed Bytecode Sourcemap
36644:4767:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14492:239;;;;;;;;;;-1:-1:-1;14492:239:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;14492:239:0;;;;;;;;14739:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;18315:218::-;;;;;;;;;;-1:-1:-1;18315:218:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;18315:218:0;1533:203:1;17899:408:0;;;;;;:::i;:::-;;:::i;:::-;;38395:821;;;;;;:::i;:::-;;:::i;12857:180::-;;;;;;;;;;-1:-1:-1;12988:12:0;;12972:13;;:28;12857:180;;;2324:25:1;;;2312:2;2297:18;12857:180:0;2178:177:1;36905:34:0;;;;;;;;;;;;;;;;37724:185;;;;;;:::i;:::-;;:::i;39459:191::-;;;;;;;;;;;;;:::i;40043:99::-;;;;;;;;;;-1:-1:-1;40043:99:0;;;;;:::i;:::-;;:::i;36997:24::-;;;;;;;;;;-1:-1:-1;36997:24:0;;;;-1:-1:-1;;;;;36997:24:0;;;36825:35;;;;;;;;;;;;;;;;37917:193;;;;;;:::i;:::-;;:::i;33819:94::-;;;;;;;;;;-1:-1:-1;33819:94:0;;;;;:::i;:::-;;:::i;40814:111::-;;;;;;;;;;-1:-1:-1;40814:111:0;;;;;:::i;:::-;;:::i;40999:407::-;;;;;;;;;;-1:-1:-1;40999:407:0;;;;;:::i;:::-;;:::i;15387:152::-;;;;;;;;;;-1:-1:-1;15387:152:0;;;;;:::i;:::-;;:::i;37079:82::-;;;;;;;;;;-1:-1:-1;37079:82:0;;;;-1:-1:-1;;;;;37079:82:0;;;13322:233;;;;;;;;;;-1:-1:-1;13322:233:0;;;;;:::i;:::-;;:::i;897:103::-;;;;;;;;;;;;;:::i;39283:95::-;;;;;;;;;;-1:-1:-1;39283:95:0;;;;;:::i;:::-;;:::i;662:87::-;;;;;;;;;;-1:-1:-1;708:7:0;735:6;-1:-1:-1;;;;;735:6:0;662:87;;39874:108;;;;;;;;;;-1:-1:-1;39874:108:0;;;;;:::i;:::-;;:::i;14847:104::-;;;;;;;;;;;;;:::i;18541:234::-;;;;;;;;;;-1:-1:-1;18541:234:0;;;;;:::i;:::-;;:::i;36946:41::-;;;;;;;;;;;;;;;;38118:218;;;;;;:::i;:::-;;:::i;37028:42::-;;;;;;;;;;;;;;;;40196:189;;;;;;;;;;-1:-1:-1;40196:189:0;;;;;:::i;:::-;;:::i;36867:31::-;;;;;;;;;;;;;;;;39707:102;;;;;;;;;;-1:-1:-1;39707:102:0;;;;;:::i;:::-;;:::i;36785:33::-;;;;;;;;;;-1:-1:-1;36785:33:0;;;;;;;;40460:90;;;;;;;;;;-1:-1:-1;40460:90:0;;;;;:::i;:::-;;:::i;36754:22::-;;;;;;;;;;;;;:::i;18783:164::-;;;;;;;;;;-1:-1:-1;18783:164:0;;;;;:::i;:::-;;:::i;40631:101::-;;;;;;;;;;-1:-1:-1;40631:101:0;;;;;:::i;:::-;;:::i;1010:201::-;;;;;;;;;;-1:-1:-1;1010:201:0;;;;;:::i;:::-;;:::i;37337:250::-;;;;;;;;;;-1:-1:-1;37337:250:0;;;;;:::i;:::-;;:::i;14492:239::-;14577:4;-1:-1:-1;;;;;;;;;14614:25:0;;;;:67;;-1:-1:-1;;;;;;;;;;14656:25:0;;;14614:67;:109;;;-1:-1:-1;;;;;;;;;;14698:25:0;;;14614:109;14594:129;14492:239;-1:-1:-1;;14492:239:0:o;14739:100::-;14793:13;14826:5;14819:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14739:100;:::o;18315:218::-;18391:7;18416:16;18424:7;18416;:16::i;:::-;18411:64;;18441:34;;-1:-1:-1;;;18441:34:0;;;;;;;;;;;18411:64;-1:-1:-1;18495:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;18495:30:0;;18315:218::o;17899:408::-;17988:13;18004:16;18012:7;18004;:16::i;:::-;17988:32;-1:-1:-1;29386:10:0;-1:-1:-1;;;;;18037:28:0;;;18033:175;;18085:44;18102:5;29386:10;18783:164;:::i;18085:44::-;18080:128;;18157:35;;-1:-1:-1;;;18157:35:0;;;;;;;;;;;18080:128;18220:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;18220:35:0;-1:-1:-1;;;;;18220:35:0;;;;;;;;;18271:28;;18220:24;;18271:28;;;;;;;17977:330;17899:408;;:::o;38395:821::-;37638:9;37651:10;37638:23;37630:66;;;;-1:-1:-1;;;37630:66:0;;6801:2:1;37630:66:0;;;6783:21:1;6840:2;6820:18;;;6813:30;6879:32;6859:18;;;6852:60;6929:18;;37630:66:0;;;;;;;;;1571:1:::1;1721:7;;:19:::0;1713:63:::1;;;::::0;-1:-1:-1;;;1713:63:0;;7160:2:1;1713:63:0::1;::::0;::::1;7142:21:1::0;7199:2;7179:18;;;7172:30;7238:33;7218:18;;;7211:61;7289:18;;1713:63:0::1;6958:355:1::0;1713:63:0::1;1571:1;1789:7;:18:::0;38536:11:::2;::::0;38522::::2;::::0;38536:22:::2;::::0;38550:8;;38536:22:::2;:::i;:::-;38579:13;::::0;38522:36;;-1:-1:-1;38579:13:0::2;;38571:43;;;::::0;-1:-1:-1;;;38571:43:0;;7825:2:1;38571:43:0::2;::::0;::::2;7807:21:1::0;7864:2;7844:18;;;7837:30;-1:-1:-1;;;7883:18:1;;;7876:47;7940:18;;38571:43:0::2;7623:341:1::0;38571:43:0::2;38661:16;;38649:8;38633:13;12988:12:::0;;12972:13;;:28;;12857:180;38633:13:::2;:24;;;;:::i;:::-;:44;;38625:72;;;::::0;-1:-1:-1;;;38625:72:0;;8301:2:1;38625:72:0::2;::::0;::::2;8283:21:1::0;8340:2;8320:18;;;8313:30;-1:-1:-1;;;8359:18:1;;;8352:45;8414:18;;38625:72:0::2;8099:339:1::0;38625:72:0::2;38728:15;;38716:8;:27;;38708:71;;;::::0;-1:-1:-1;;;38708:71:0;;8645:2:1;38708:71:0::2;::::0;::::2;8627:21:1::0;8684:2;8664:18;;;8657:30;8723:33;8703:18;;;8696:61;8774:18;;38708:71:0::2;8443:355:1::0;38708:71:0::2;38834:18;;38822:8;38798:21;38808:10;38798:9;:21::i;:::-;:32;;;;:::i;:::-;:54;;38790:99;;;::::0;-1:-1:-1;;;38790:99:0;;9005:2:1;38790:99:0::2;::::0;::::2;8987:21:1::0;;;9024:18;;;9017:30;9083:34;9063:18;;;9056:62;9135:18;;38790:99:0::2;8803:356:1::0;38790:99:0::2;38921:6;38908:9;:19;;38900:101;;;::::0;-1:-1:-1;;;38900:101:0;;9366:2:1;38900:101:0::2;::::0;::::2;9348:21:1::0;9405:2;9385:18;;;9378:30;9444:34;9424:18;;;9417:62;9515:34;9495:18;;;9488:62;-1:-1:-1;;;9566:19:1;;;9559:36;9612:19;;38900:101:0::2;9164:473:1::0;38900:101:0::2;39022:13;::::0;39014:39:::2;::::0;-1:-1:-1;;;;;39022:13:0;;::::2;::::0;39014:39;::::2;;;::::0;39046:6;;39022:13:::2;39014:39:::0;39022:13;39014:39;39046:6;39022:13;39014:39;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;39082:6;39070:9;:18;39066:99;;;39113:10;39105:48;39134:18;39146:6:::0;39134:9:::2;:18;:::i;:::-;39105:48;::::0;;::::2;::::0;;::::2;::::0;::::2;::::0;;;;;;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;39066:99;39177:31;39187:10;39199:8;39177:9;:31::i;:::-;-1:-1:-1::0;;1527:1:0::1;1834:7;:22:::0;38395:821::o;37724:185::-;30272:42;31015:43;:47;31011:225;;31084:67;;-1:-1:-1;;;31084:67:0;;31133:4;31084:67;;;9987:34:1;31140:10:0;10037:18:1;;;10030:43;30272:42:0;;31084:40;;9922:18:1;;31084:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31079:146;;31179:30;;-1:-1:-1;;;31179:30:0;;31198:10;31179:30;;;1679:51:1;1652:18;;31179:30:0;1533:203:1;31079:146:0;37864:37:::1;37883:4;37889:2;37893:7;37864:18;:37::i;:::-;37724:185:::0;;;:::o;39459:191::-;621:13;:11;:13::i;:::-;1571:1:::1;1721:7;;:19:::0;1713:63:::1;;;::::0;-1:-1:-1;;;1713:63:0;;7160:2:1;1713:63:0::1;::::0;::::1;7142:21:1::0;7199:2;7179:18;;;7172:30;7238:33;7218:18;;;7211:61;7289:18;;1713:63:0::1;6958:355:1::0;1713:63:0::1;1571:1;1789:7;:18:::0;39546:49:::2;::::0;39528:12:::2;::::0;39546:10:::2;::::0;39569:21:::2;::::0;39528:12;39546:49;39528:12;39546:49;39569:21;39546:10;:49:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39527:68;;;39614:7;39606:36;;;::::0;-1:-1:-1;;;39606:36:0;;10746:2:1;39606:36:0::2;::::0;::::2;10728:21:1::0;10785:2;10765:18;;;10758:30;-1:-1:-1;;;10804:18:1;;;10797:46;10860:18;;39606:36:0::2;10544:340:1::0;39606:36:0::2;-1:-1:-1::0;1527:1:0::1;1834:7;:22:::0;39459:191::o;40043:99::-;621:13;:11;:13::i;:::-;40112:15:::1;:22:::0;40043:99::o;37917:193::-;30272:42;31015:43;:47;31011:225;;31084:67;;-1:-1:-1;;;31084:67:0;;31133:4;31084:67;;;9987:34:1;31140:10:0;10037:18:1;;;10030:43;30272:42:0;;31084:40;;9922:18:1;;31084:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31079:146;;31179:30;;-1:-1:-1;;;31179:30:0;;31198:10;31179:30;;;1679:51:1;1652:18;;31179:30:0;1533:203:1;31079:146:0;38061:41:::1;38084:4;38090:2;38094:7;38061:22;:41::i;33819:94::-:0;33885:20;33891:7;33900:4;33885:5;:20::i;:::-;33819:94;:::o;40814:111::-;621:13;:11;:13::i;:::-;40884:10:::1;:33:::0;;-1:-1:-1;;;;;;40884:33:0::1;-1:-1:-1::0;;;;;40884:33:0;;;::::1;::::0;;;::::1;::::0;;40814:111::o;40999:407::-;41131:10;41110:17;41118:8;41110:7;:17::i;:::-;-1:-1:-1;;;;;41110:31:0;;41102:76;;;;-1:-1:-1;;;41102:76:0;;11091:2:1;41102:76:0;;;11073:21:1;;;11110:18;;;11103:30;11169:34;11149:18;;;11142:62;11221:18;;41102:76:0;10889:356:1;41102:76:0;41221:10;;41257:13;;41272:12;;41221:64;;-1:-1:-1;;;41221:64:0;;41245:10;41221:64;;;11490:34:1;-1:-1:-1;;;;;41257:13:0;;;11540:18:1;;;11533:43;11592:18;;;11585:34;;;;41221:10:0;;;:23;;11425:18:1;;41221:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;41375:12:0;;41303:95;;;11832:25:1;;;41350:10:0;11888:2:1;11873:18;;11866:60;11942:18;;;11935:34;;;;41303:95:0;;;;;;11820:2:1;41303:95:0;;;40999:407;:::o;15387:152::-;15459:7;15502:27;15521:7;15502:18;:27::i;13322:233::-;13394:7;-1:-1:-1;;;;;13418:19:0;;13414:60;;13446:28;;-1:-1:-1;;;13446:28:0;;;;;;;;;;;13414:60;-1:-1:-1;;;;;;13492:25:0;;;;;:18;:25;;;;;;11130:13;13492:55;;13322:233::o;897:103::-;621:13;:11;:13::i;:::-;962:30:::1;989:1;962:18;:30::i;:::-;897:103::o:0;39283:95::-;621:13;:11;:13::i;:::-;39351::::1;:19:::0;;-1:-1:-1;;39351:19:0::1;::::0;::::1;;::::0;;;::::1;::::0;;39283:95::o;39874:108::-;621:13;:11;:13::i;:::-;39949:18:::1;:25:::0;39874:108::o;14847:104::-;14903:13;14936:7;14929:14;;;;;:::i;18541:234::-;29386:10;18636:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;18636:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;18636:60:0;;;;;;;;;;18712:55;;540:41:1;;;18636:49:0;;29386:10;18712:55;;513:18:1;18712:55:0;;;;;;;18541:234;;:::o;38118:218::-;30272:42;31015:43;:47;31011:225;;31084:67;;-1:-1:-1;;;31084:67:0;;31133:4;31084:67;;;9987:34:1;31140:10:0;10037:18:1;;;10030:43;30272:42:0;;31084:40;;9922:18:1;;31084:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31079:146;;31179:30;;-1:-1:-1;;;31179:30:0;;31198:10;31179:30;;;1679:51:1;1652:18;;31179:30:0;1533:203:1;31079:146:0;38281:47:::1;38304:4;38310:2;38314:7;38323:4;38281:22;:47::i;:::-;38118:218:::0;;;;:::o;40196:189::-;40282:13;40339:8;40349:26;40366:8;40349:16;:26::i;:::-;40322:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40308:69;;40196:189;;;:::o;39707:102::-;621:13;:11;:13::i;:::-;39782:8:::1;:19;39793:8:::0;39782;:19:::1;:::i;:::-;;39707:102:::0;:::o;40460:90::-;621:13;:11;:13::i;:::-;40524:12:::1;:18:::0;40460:90::o;36754:22::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18783:164::-;-1:-1:-1;;;;;18904:25:0;;;18880:4;18904:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;18783:164::o;40631:101::-;621:13;:11;:13::i;:::-;40696::::1;:28:::0;;-1:-1:-1;;;;;;40696:28:0::1;-1:-1:-1::0;;;;;40696:28:0;;;::::1;::::0;;;::::1;::::0;;40631:101::o;1010:201::-;621:13;:11;:13::i;:::-;-1:-1:-1;;;;;1099:22:0;::::1;1091:73;;;::::0;-1:-1:-1;;;1091:73:0;;15411:2:1;1091:73:0::1;::::0;::::1;15393:21:1::0;15450:2;15430:18;;;15423:30;15489:34;15469:18;;;15462:62;-1:-1:-1;;;15540:18:1;;;15533:36;15586:19;;1091:73:0::1;15209:402:1::0;1091:73:0::1;1175:28;1194:8;1175:18;:28::i;37337:250::-:0;621:13;:11;:13::i;:::-;37469:16:::1;;37457:8;37441:13;12988:12:::0;;12972:13;;:28;;12857:180;37441:13:::1;:24;;;;:::i;:::-;:44;;37419:118;;;::::0;-1:-1:-1;;;37419:118:0;;15818:2:1;37419:118:0::1;::::0;::::1;15800:21:1::0;15857:2;15837:18;;;15830:30;15896:26;15876:18;;;15869:54;15940:18;;37419:118:0::1;15616:348:1::0;37419:118:0::1;37550:29;37560:8;37570;37550:9;:29::i;18955:282::-:0;19020:4;19110:13;;19100:7;:23;19057:153;;;;-1:-1:-1;;19161:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;19161:44:0;:49;;18955:282::o;26480:112::-;26557:27;26567:2;26571:8;26557:27;;;;;;;;;;;;:9;:27::i;20050:1649::-;20192:27;20222;20241:7;20222:18;:27::i;:::-;20192:57;;20307:4;-1:-1:-1;;;;;20266:45:0;20282:19;-1:-1:-1;;;;;20266:45:0;;20262:86;;20320:28;;-1:-1:-1;;;20320:28:0;;;;;;;;;;;20262:86;20362:27;19863:24;;;:15;:24;;;;;19998:26;;20471:68;19998:26;20513:4;29386:10;20519:19;-1:-1:-1;;;;;19510:32:0;;;19453:28;;19571:20;;19593:30;;19568:56;;19245:397;20471:68;20466:180;;20559:43;20576:4;29386:10;18783:164;:::i;20559:43::-;20554:92;;20611:35;;-1:-1:-1;;;20611:35:0;;;;;;;;;;;20554:92;-1:-1:-1;;;;;20663:16:0;;20659:52;;20688:23;;-1:-1:-1;;;20688:23:0;;;;;;;;;;;20659:52;20807:15;20804:85;;;20872:1;20851:19;20844:30;20804:85;-1:-1:-1;;;;;20941:24:0;;;;;;;:18;:24;;;;;;20939:26;;-1:-1:-1;;20939:26:0;;;20982:22;;;;;;;;;20980:24;;-1:-1:-1;20980:24:0;;;17520:11;17495:23;17491:41;17478:63;-1:-1:-1;;;17478:63:0;21021:26;;;;:17;:26;;;;;:175;;;;-1:-1:-1;;;21217:47:0;;:52;;21213:370;;21322:1;21312:11;;21290:19;21348:30;;;:17;:30;;;;;;:35;;21344:224;;21429:13;;21414:11;:28;21410:139;;21473:30;;;;:17;:30;;;;;:52;;;21410:139;21271:312;21213:370;21630:7;21626:2;-1:-1:-1;;;;;21611:27:0;21620:4;-1:-1:-1;;;;;21611:27:0;-1:-1:-1;;;;;;;;;;;21611:27:0;;;;;;;;;21649:42;20181:1518;;;20050:1649;;;:::o;757:132::-;708:7;735:6;-1:-1:-1;;;;;735:6:0;29386:10;821:23;813:68;;;;-1:-1:-1;;;813:68:0;;16171:2:1;813:68:0;;;16153:21:1;;;16190:18;;;16183:30;16249:34;16229:18;;;16222:62;16301:18;;813:68:0;15969:356:1;21707:193:0;21853:39;21870:4;21876:2;21880:7;21853:39;;;;;;;;;;;;:16;:39::i;26697:1651::-;26777:27;26807;26826:7;26807:18;:27::i;:::-;26777:57;-1:-1:-1;26777:57:0;26847:12;;26969:35;26996:7;19752:27;19863:24;;;:15;:24;;;;;19998:26;;19863:24;;19650:392;26969:35;26912:92;;;;27021:13;27017:232;;;27058:68;27083:15;27100:4;29386:10;27106:19;29299:105;27058:68;27053:184;;27150:43;27167:4;29386:10;18783:164;:::i;27150:43::-;27145:92;;27202:35;;-1:-1:-1;;;27202:35:0;;;;;;;;;;;27145:92;27352:15;27349:85;;;27417:1;27396:19;27389:30;27349:85;-1:-1:-1;;;;;27484:24:0;;;;;;:18;:24;;;;;:60;;27512:32;27484:60;;;17520:11;17495:23;17491:41;17478:63;-1:-1:-1;;;17478:63:0;27561:26;;;;:17;:26;;;;;:205;;;;-1:-1:-1;;;27787:47:0;;:52;;27783:370;;27892:1;27882:11;;27860:19;27918:30;;;:17;:30;;;;;;:35;;27914:224;;27999:13;;27984:11;:28;27980:139;;28043:30;;;;:17;:30;;;;;:52;;;27980:139;27841:312;27783:370;28181:35;;28208:7;;28204:1;;-1:-1:-1;;;;;28181:35:0;;;-1:-1:-1;;;;;;;;;;;28181:35:0;28204:1;;28181:35;-1:-1:-1;;28315:12:0;:14;;;;;;-1:-1:-1;;;;26697:1651:0:o;16094:633::-;16161:7;16196;16298:13;;16291:4;:20;16287:373;;;16336:14;16353:23;;;:17;:23;;;;;;;-1:-1:-1;;;16405:24:0;;:29;;16401:240;;16465:113;16472:6;16482:1;16472:11;16465:113;;-1:-1:-1;;;16543:6:0;16525:25;;;;:17;:25;;;;;;16465:113;;;16611:6;16094:633;-1:-1:-1;;;16094:633:0:o;16401:240::-;16313:347;16287:373;16688:31;;-1:-1:-1;;;16688:31:0;;;;;;;;;;;1219:191;1293:16;1312:6;;-1:-1:-1;;;;;1329:17:0;;;-1:-1:-1;;;;;;1329:17:0;;;;;;1362:40;;1312:6;;;;;;;1362:40;;1293:16;1362:40;1282:128;1219:191;:::o;21908:407::-;22083:31;22096:4;22102:2;22106:7;22083:12;:31::i;:::-;-1:-1:-1;;;;;22129:14:0;;;:19;22125:183;;22168:56;22199:4;22205:2;22209:7;22218:5;22168:30;:56::i;:::-;22163:145;;22252:40;;-1:-1:-1;;;22252:40:0;;;;;;;;;;;2036:534;2092:13;2124:5;2133:1;2124:10;2120:53;;-1:-1:-1;;2151:10:0;;;;;;;;;;;;-1:-1:-1;;;2151:10:0;;;;;2036:534::o;2120:53::-;2198:5;2183:12;2239:78;2246:9;;2239:78;;2272:8;;;;:::i;:::-;;-1:-1:-1;2295:10:0;;-1:-1:-1;2303:2:0;2295:10;;:::i;:::-;;;2239:78;;;2327:19;2359:6;2349:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2349:17:0;;2327:39;;2377:154;2384:10;;2377:154;;2411:11;2421:1;2411:11;;:::i;:::-;;-1:-1:-1;2480:10:0;2488:2;2480:5;:10;:::i;:::-;2467:24;;:2;:24;:::i;:::-;2454:39;;2437:6;2444;2437:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;2437:56:0;;;;;;;;-1:-1:-1;2508:11:0;2517:2;2508:11;;:::i;:::-;;;2377:154;;;2555:6;2036:534;-1:-1:-1;;;;2036:534:0:o;25783:689::-;25914:19;25920:2;25924:8;25914:5;:19::i;:::-;-1:-1:-1;;;;;25975:14:0;;;:19;25971:483;;26029:13;;26077:14;;;26110:233;26141:62;26180:1;26184:2;26188:7;;;;;;26197:5;26141:30;:62::i;:::-;26136:167;;26239:40;;-1:-1:-1;;;26239:40:0;;;;;;;;;;;26136:167;26338:3;26330:5;:11;26110:233;;26425:3;26408:13;;:20;26404:34;;26430:8;;;26404:34;25996:458;;25783:689;;;:::o;22656:716::-;22840:88;;-1:-1:-1;;;22840:88:0;;22819:4;;-1:-1:-1;;;;;22840:45:0;;;;;:88;;29386:10;;22907:4;;22913:7;;22922:5;;22840:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22840:88:0;;;;;;;;-1:-1:-1;;22840:88:0;;;;;;;;;;;;:::i;:::-;;;22836:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23123:6;:13;23140:1;23123:18;23119:235;;23169:40;;-1:-1:-1;;;23169:40:0;;;;;;;;;;;23119:235;23312:6;23306:13;23297:6;23293:2;23289:15;23282:38;22836:529;-1:-1:-1;;;;;;22999:64:0;-1:-1:-1;;;22999:64:0;;-1:-1:-1;22656:716:0;;;;;;:::o;23380:1436::-;23476:13;;23453:20;23504:13;;;23500:44;;23526:18;;-1:-1:-1;;;23526:18:0;;;;;;;;;;;23500:44;-1:-1:-1;;;;;23658:22:0;;;;;;:18;:22;;;;11201:2;23658:22;;;:71;;23696:32;23684:45;;23658:71;;;23746:31;;;:17;:31;;;;;-1:-1:-1;17857:15:0;;17831:24;17827:46;17520:11;17495:23;17491:41;17488:52;17478:63;;23746:173;;23981:23;;;;23746:31;;23658:22;;-1:-1:-1;;;;;;;;;;;23658:22:0;;24108:209;24397:1;24383:12;24379:20;24337:279;24438:3;24429:7;24426:16;24337:279;;24589:7;24579:8;24576:1;-1:-1:-1;;;;;;;;;;;24546:1:0;24543;24538:59;24491:1;24478:15;24337:279;;;24341:77;24649:8;24661:1;24649:13;24645:45;;24671:19;;-1:-1:-1;;;24671:19:0;;;;;;;;;;;24645:45;24707:13;:19;-1:-1:-1;37724:185:0;;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2360:328::-;2437:6;2445;2453;2506:2;2494:9;2485:7;2481:23;2477:32;2474:52;;;2522:1;2519;2512:12;2474:52;2545:29;2564:9;2545:29;:::i;:::-;2535:39;;2593:38;2627:2;2616:9;2612:18;2593:38;:::i;:::-;2583:48;;2678:2;2667:9;2663:18;2650:32;2640:42;;2360:328;;;;;:::o;2916:186::-;2975:6;3028:2;3016:9;3007:7;3003:23;2999:32;2996:52;;;3044:1;3041;3034:12;2996:52;3067:29;3086:9;3067:29;:::i;3107:118::-;3193:5;3186:13;3179:21;3172:5;3169:32;3159:60;;3215:1;3212;3205:12;3230:241;3286:6;3339:2;3327:9;3318:7;3314:23;3310:32;3307:52;;;3355:1;3352;3345:12;3307:52;3394:9;3381:23;3413:28;3435:5;3413:28;:::i;3476:315::-;3541:6;3549;3602:2;3590:9;3581:7;3577:23;3573:32;3570:52;;;3618:1;3615;3608:12;3570:52;3641:29;3660:9;3641:29;:::i;:::-;3631:39;;3720:2;3709:9;3705:18;3692:32;3733:28;3755:5;3733:28;:::i;:::-;3780:5;3770:15;;;3476:315;;;;;:::o;3796:127::-;3857:10;3852:3;3848:20;3845:1;3838:31;3888:4;3885:1;3878:15;3912:4;3909:1;3902:15;3928:631;3992:5;4022:18;4063:2;4055:6;4052:14;4049:40;;;4069:18;;:::i;:::-;4144:2;4138:9;4112:2;4198:15;;-1:-1:-1;;4194:24:1;;;4220:2;4190:33;4186:42;4174:55;;;4244:18;;;4264:22;;;4241:46;4238:72;;;4290:18;;:::i;:::-;4330:10;4326:2;4319:22;4359:6;4350:15;;4389:6;4381;4374:22;4429:3;4420:6;4415:3;4411:16;4408:25;4405:45;;;4446:1;4443;4436:12;4405:45;4496:6;4491:3;4484:4;4476:6;4472:17;4459:44;4551:1;4544:4;4535:6;4527;4523:19;4519:30;4512:41;;;;3928:631;;;;;:::o;4564:666::-;4659:6;4667;4675;4683;4736:3;4724:9;4715:7;4711:23;4707:33;4704:53;;;4753:1;4750;4743:12;4704:53;4776:29;4795:9;4776:29;:::i;:::-;4766:39;;4824:38;4858:2;4847:9;4843:18;4824:38;:::i;:::-;4814:48;;4909:2;4898:9;4894:18;4881:32;4871:42;;4964:2;4953:9;4949:18;4936:32;4991:18;4983:6;4980:30;4977:50;;;5023:1;5020;5013:12;4977:50;5046:22;;5099:4;5091:13;;5087:27;-1:-1:-1;5077:55:1;;5128:1;5125;5118:12;5077:55;5151:73;5216:7;5211:2;5198:16;5193:2;5189;5185:11;5151:73;:::i;:::-;5141:83;;;4564:666;;;;;;;:::o;5235:450::-;5304:6;5357:2;5345:9;5336:7;5332:23;5328:32;5325:52;;;5373:1;5370;5363:12;5325:52;5413:9;5400:23;5446:18;5438:6;5435:30;5432:50;;;5478:1;5475;5468:12;5432:50;5501:22;;5554:4;5546:13;;5542:27;-1:-1:-1;5532:55:1;;5583:1;5580;5573:12;5532:55;5606:73;5671:7;5666:2;5653:16;5648:2;5644;5640:11;5606:73;:::i;5690:260::-;5758:6;5766;5819:2;5807:9;5798:7;5794:23;5790:32;5787:52;;;5835:1;5832;5825:12;5787:52;5858:29;5877:9;5858:29;:::i;:::-;5848:39;;5906:38;5940:2;5929:9;5925:18;5906:38;:::i;:::-;5896:48;;5690:260;;;;;:::o;5955:254::-;6023:6;6031;6084:2;6072:9;6063:7;6059:23;6055:32;6052:52;;;6100:1;6097;6090:12;6052:52;6136:9;6123:23;6113:33;;6165:38;6199:2;6188:9;6184:18;6165:38;:::i;6214:380::-;6293:1;6289:12;;;;6336;;;6357:61;;6411:4;6403:6;6399:17;6389:27;;6357:61;6464:2;6456:6;6453:14;6433:18;6430:38;6427:161;;6510:10;6505:3;6501:20;6498:1;6491:31;6545:4;6542:1;6535:15;6573:4;6570:1;6563:15;6427:161;;6214:380;;;:::o;7318:127::-;7379:10;7374:3;7370:20;7367:1;7360:31;7410:4;7407:1;7400:15;7434:4;7431:1;7424:15;7450:168;7523:9;;;7554;;7571:15;;;7565:22;;7551:37;7541:71;;7592:18;;:::i;7969:125::-;8034:9;;;8055:10;;;8052:36;;;8068:18;;:::i;9642:128::-;9709:9;;;9730:11;;;9727:37;;;9744:18;;:::i;10084:245::-;10151:6;10204:2;10192:9;10183:7;10179:23;10175:32;10172:52;;;10220:1;10217;10210:12;10172:52;10252:9;10246:16;10271:28;10293:5;10271:28;:::i;12106:1020::-;12282:3;12311:1;12344:6;12338:13;12374:36;12400:9;12374:36;:::i;:::-;12429:1;12446:18;;;12473:133;;;;12620:1;12615:356;;;;12439:532;;12473:133;-1:-1:-1;;12506:24:1;;12494:37;;12579:14;;12572:22;12560:35;;12551:45;;;-1:-1:-1;12473:133:1;;12615:356;12646:6;12643:1;12636:17;12676:4;12721:2;12718:1;12708:16;12746:1;12760:165;12774:6;12771:1;12768:13;12760:165;;;12852:14;;12839:11;;;12832:35;12895:16;;;;12789:10;;12760:165;;;12764:3;;;12954:6;12949:3;12945:16;12938:23;;12439:532;;;;;13002:6;12996:13;13018:68;13077:8;13072:3;13065:4;13057:6;13053:17;13018:68;:::i;:::-;13102:18;;12106:1020;-1:-1:-1;;;;12106:1020:1:o;13131:545::-;13233:2;13228:3;13225:11;13222:448;;;13269:1;13294:5;13290:2;13283:17;13339:4;13335:2;13325:19;13409:2;13397:10;13393:19;13390:1;13386:27;13380:4;13376:38;13445:4;13433:10;13430:20;13427:47;;;-1:-1:-1;13468:4:1;13427:47;13523:2;13518:3;13514:12;13511:1;13507:20;13501:4;13497:31;13487:41;;13578:82;13596:2;13589:5;13586:13;13578:82;;;13641:17;;;13622:1;13611:13;13578:82;;13852:1352;13978:3;13972:10;14005:18;13997:6;13994:30;13991:56;;;14027:18;;:::i;:::-;14056:97;14146:6;14106:38;14138:4;14132:11;14106:38;:::i;:::-;14100:4;14056:97;:::i;:::-;14208:4;;14272:2;14261:14;;14289:1;14284:663;;;;14991:1;15008:6;15005:89;;;-1:-1:-1;15060:19:1;;;15054:26;15005:89;-1:-1:-1;;13809:1:1;13805:11;;;13801:24;13797:29;13787:40;13833:1;13829:11;;;13784:57;15107:81;;14254:944;;14284:663;12053:1;12046:14;;;12090:4;12077:18;;-1:-1:-1;;14320:20:1;;;14438:236;14452:7;14449:1;14446:14;14438:236;;;14541:19;;;14535:26;14520:42;;14633:27;;;;14601:1;14589:14;;;;14468:19;;14438:236;;;14442:3;14702:6;14693:7;14690:19;14687:201;;;14763:19;;;14757:26;-1:-1:-1;;14846:1:1;14842:14;;;14858:3;14838:24;14834:37;14830:42;14815:58;14800:74;;14687:201;-1:-1:-1;;;;;14934:1:1;14918:14;;;14914:22;14901:36;;-1:-1:-1;13852:1352:1:o;16330:135::-;16369:3;16390:17;;;16387:43;;16410:18;;:::i;:::-;-1:-1:-1;16457:1:1;16446:13;;16330:135::o;16470:127::-;16531:10;16526:3;16522:20;16519:1;16512:31;16562:4;16559:1;16552:15;16586:4;16583:1;16576:15;16602:120;16642:1;16668;16658:35;;16673:18;;:::i;:::-;-1:-1:-1;16707:9:1;;16602:120::o;16727:112::-;16759:1;16785;16775:35;;16790:18;;:::i;:::-;-1:-1:-1;16824:9:1;;16727:112::o;16844:127::-;16905:10;16900:3;16896:20;16893:1;16886:31;16936:4;16933:1;16926:15;16960:4;16957:1;16950:15;16976:489;-1:-1:-1;;;;;17245:15:1;;;17227:34;;17297:15;;17292:2;17277:18;;17270:43;17344:2;17329:18;;17322:34;;;17392:3;17387:2;17372:18;;17365:31;;;17170:4;;17413:46;;17439:19;;17431:6;17413:46;:::i;:::-;17405:54;16976:489;-1:-1:-1;;;;;;16976:489:1:o;17470:249::-;17539:6;17592:2;17580:9;17571:7;17567:23;17563:32;17560:52;;;17608:1;17605;17598:12;17560:52;17640:9;17634:16;17659:30;17683:5;17659:30;:::i
Swarm Source
ipfs://28b409df4b5e414018fb673171b86a38fde4ed71afb93470fef9ffbff7dd65c9
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.