Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
5,000 Freaks
Holders
251
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
20 FreaksLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
SpaceFreaksContractUpgraded
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-06-09 */ // 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 SpaceFreaksContractUpgraded 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 = 20; uint public _SUPPLY_PER_WALLET = 20; IERC20 public _SPACEDUST; uint256 public _REMIX_PRICE = 1 * (10**18); address public _FEE_RECEIVER; event new_remix( uint256 token_id, address wallet, uint256 price ); constructor() ERC721A("SpaceFreaks", "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 { 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."); _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":"_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
6080604052600b805460ff19169055611388600c556014600d819055600e55670de0b6b3a76400006010553480156200003757600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600b81526020016a5370616365467265616b7360a81b81525060405180604001604052806006815260200165467265616b7360d01b815250620000ac620000a66200022360201b60201c565b62000227565b6003620000ba83826200031c565b506004620000c982826200031c565b506000600190815560095550506daaeb6d7670e522a718067333cd4e3b156200021b5780156200016957604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200014a57600080fd5b505af11580156200015f573d6000803e3d6000fd5b505050506200021b565b6001600160a01b03821615620001ba5760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af2903906044016200012f565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200020157600080fd5b505af115801562000216573d6000803e3d6000fd5b505050505b5050620003e8565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620002a257607f821691505b602082108103620002c357634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200031757600081815260208120601f850160051c81016020861015620002f25750805b601f850160051c820191505b818110156200031357828155600101620002fe565b5050505b505050565b81516001600160401b0381111562000338576200033862000277565b62000350816200034984546200028d565b84620002c9565b602080601f8311600181146200038857600084156200036f5750858301515b600019600386901b1c1916600185901b17855562000313565b600085815260208120601f198616915b82811015620003b95788860151825594840194600190910190840162000398565b5085821015620003d85787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61204480620003f86000396000f3fe60806040526004361061021a5760003560e01c806370a0823111610123578063c87b56dd116100ab578063dbddb26a1161006f578063dbddb26a146105c1578063e985e9c5146105d6578063efdcd974146105f6578063f2fde38b14610616578063f77777471461063657600080fd5b8063c87b56dd14610531578063d44e6d2014610551578063d7d1e57e14610567578063d8fae8c514610587578063dab4c827146105a157600080fd5b806391267659116100f257806391267659146104b357806395d89b41146104d3578063a22cb465146104e8578063b88d4fde14610508578063c2047ebf1461051b57600080fd5b806370a0823114610440578063715018a614610460578063818668d7146104755780638da5cb5b1461049557600080fd5b80632b26a6bf116101a657806342966c681161017557806342966c68146103a0578063479ba2da146103c0578063502fb3ff146103e05780636352211e146104005780636730cfa01461042057600080fd5b80632b26a6bf146103375780632b7e66d2146103575780633bdf774c1461037757806342842e0e1461038d57600080fd5b80630d730acc116101ed5780630d730acc146102c357806318160ddd146102d65780631fbe829c146102f957806323b872dd1461030f57806324600fc31461032257600080fd5b806301ffc9a71461021f57806306fdde0314610254578063081812fc14610276578063095ea7b3146102ae575b600080fd5b34801561022b57600080fd5b5061023f61023a3660046119c8565b610656565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b506102696106a8565b60405161024b9190611a35565b34801561028257600080fd5b50610296610291366004611a48565b61073a565b6040516001600160a01b03909116815260200161024b565b6102c16102bc366004611a7d565b61077e565b005b6102c16102d1366004611a48565b61081e565b3480156102e257600080fd5b50600254600154035b60405190815260200161024b565b34801561030557600080fd5b506102eb600e5481565b6102c161031d366004611aa7565b610a33565b34801561032e57600080fd5b506102c1610aec565b34801561034357600080fd5b506102c1610352366004611a48565b610bd6565b34801561036357600080fd5b50600f54610296906001600160a01b031681565b34801561038357600080fd5b506102eb600c5481565b6102c161039b366004611aa7565b610be3565b3480156103ac57600080fd5b506102c16103bb366004611a48565b610c97565b3480156103cc57600080fd5b506102c16103db366004611ae3565b610ca5565b3480156103ec57600080fd5b506102c16103fb366004611a48565b610ccf565b34801561040c57600080fd5b5061029661041b366004611a48565b610df8565b34801561042c57600080fd5b50601154610296906001600160a01b031681565b34801561044c57600080fd5b506102eb61045b366004611ae3565b610e03565b34801561046c57600080fd5b506102c1610e52565b34801561048157600080fd5b506102c1610490366004611b0c565b610e66565b3480156104a157600080fd5b506000546001600160a01b0316610296565b3480156104bf57600080fd5b506102c16104ce366004611a48565b610e81565b3480156104df57600080fd5b50610269610e8e565b3480156104f457600080fd5b506102c1610503366004611b29565b610e9d565b6102c1610516366004611bec565b610f09565b34801561052757600080fd5b506102eb60105481565b34801561053d57600080fd5b5061026961054c366004611a48565b610fc4565b34801561055d57600080fd5b506102eb600d5481565b34801561057357600080fd5b506102c1610582366004611c68565b610ff8565b34801561059357600080fd5b50600b5461023f9060ff1681565b3480156105ad57600080fd5b506102c16105bc366004611a48565b611010565b3480156105cd57600080fd5b5061026961101d565b3480156105e257600080fd5b5061023f6105f1366004611cb1565b6110ab565b34801561060257600080fd5b506102c1610611366004611ae3565b6110d9565b34801561062257600080fd5b506102c1610631366004611ae3565b611103565b34801561064257600080fd5b506102c1610651366004611ce4565b611179565b60006301ffc9a760e01b6001600160e01b03198316148061068757506380ac58cd60e01b6001600160e01b03198316145b806106a25750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600380546106b790611d07565b80601f01602080910402602001604051908101604052809291908181526020018280546106e390611d07565b80156107305780601f1061070557610100808354040283529160200191610730565b820191906000526020600020905b81548152906001019060200180831161071357829003601f168201915b5050505050905090565b6000610745826111f4565b610762576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b600061078982610df8565b9050336001600160a01b038216146107c2576107a581336110ab565b6107c2576040516367d9dca160e11b815260040160405180910390fd5b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b3233146108725760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e7472616374000060448201526064015b60405180910390fd5b6002600954036108c45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610869565b6002600955600b5460ff1661090f5760405162461bcd60e51b81526020600482015260116024820152704d696e74206e6f7420737461727465642160781b6044820152606401610869565b600c54816109206002546001540390565b61092a9190611d57565b111561096a5760405162461bcd60e51b815260206004820152600f60248201526e4d696e7420636f6d706c657465642160881b6044820152606401610869565b600d548111156109bc5760405162461bcd60e51b815260206004820152601f60248201527f547269656420746f206d696e74206f766572206261746368206c696d69742e006044820152606401610869565b600e54816109c933610e03565b6109d39190611d57565b1115610a215760405162461bcd60e51b815260206004820181905260248201527f547269656420746f206d696e74206f7665722077616c6c6574206c696d69742e6044820152606401610869565b610a2b338261121c565b506001600955565b6daaeb6d7670e522a718067333cd4e3b15610adc57604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af1158015610a99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abd9190611d6a565b610adc57604051633b79c77360e21b8152336004820152602401610869565b610ae7838383611236565b505050565b610af46113c7565b600260095403610b465760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610869565b6002600955604051600090339047908381818185875af1925050503d8060008114610b8d576040519150601f19603f3d011682016040523d82523d6000602084013e610b92565b606091505b5050905080610a2b5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610869565b610bde6113c7565b600d55565b6daaeb6d7670e522a718067333cd4e3b15610c8c57604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af1158015610c49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6d9190611d6a565b610c8c57604051633b79c77360e21b8152336004820152602401610869565b610ae7838383611421565b610ca281600161143c565b50565b610cad6113c7565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b33610cd982610df8565b6001600160a01b031614610d2f5760405162461bcd60e51b815260206004820181905260248201527f596f75277265206e6f7420746865206f776e6572206f6620746865204e46542e6044820152606401610869565b600f546011546010546040516323b872dd60e01b81523360048201526001600160a01b03928316602482015260448101919091529116906323b872dd906064016020604051808303816000875af1158015610d8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db29190611d6a565b506010546040805183815233602082015280820192909252517f1bf4c2301fe31c472236d04b38da322696352ecd6d828b681dbbfb87f13e68cb9181900360600190a150565b60006106a282611575565b60006001600160a01b038216610e2c576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205467ffffffffffffffff1690565b610e5a6113c7565b610e6460006115e3565b565b610e6e6113c7565b600b805460ff1916911515919091179055565b610e896113c7565b600e55565b6060600480546106b790611d07565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6daaeb6d7670e522a718067333cd4e3b15610fb257604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af1158015610f6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f939190611d6a565b610fb257604051633b79c77360e21b8152336004820152602401610869565b610fbe84848484611633565b50505050565b6060600a610fd183611677565b604051602001610fe2929190611d87565b6040516020818303038152906040529050919050565b6110006113c7565b600a61100c8282611e54565b5050565b6110186113c7565b601055565b600a805461102a90611d07565b80601f016020809104026020016040519081016040528092919081815260200182805461105690611d07565b80156110a35780601f10611078576101008083540402835291602001916110a3565b820191906000526020600020905b81548152906001019060200180831161108657829003601f168201915b505050505081565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b6110e16113c7565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b61110b6113c7565b6001600160a01b0381166111705760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610869565b610ca2816115e3565b6111816113c7565b600c54826111926002546001540390565b61119c9190611d57565b11156111ea5760405162461bcd60e51b815260206004820152601860248201527f4e6f206d6f726520667265616b7320696e2073746f636b2100000000000000006044820152606401610869565b61100c818361121c565b6000600154821080156106a2575050600090815260056020526040902054600160e01b161590565b61100c828260405180602001604052806000815250611780565b600061124182611575565b9050836001600160a01b0316816001600160a01b0316146112745760405162a1148160e81b815260040160405180910390fd5b600082815260076020526040902080546112a08187335b6001600160a01b039081169116811491141790565b6112cb576112ae86336110ab565b6112cb57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166112f257604051633a954ecd60e21b815260040160405180910390fd5b80156112fd57600082555b6001600160a01b038681166000908152600660205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260056020526040812091909155600160e11b8416900361138f5760018401600081815260056020526040812054900361138d57600154811461138d5760008181526005602052604090208490555b505b83856001600160a01b0316876001600160a01b0316600080516020611fef83398151915260405160405180910390a45b505050505050565b6000546001600160a01b03163314610e645760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610869565b610ae783838360405180602001604052806000815250610f09565b600061144783611575565b90508060008061146586600090815260076020526040902080549091565b9150915084156114a55761147a81843361128b565b6114a55761148883336110ab565b6114a557604051632ce44b5f60e11b815260040160405180910390fd5b80156114b057600082555b6001600160a01b038316600081815260066020526040902080546fffffffffffffffffffffffffffffffff0190554260a01b17600360e01b17600087815260056020526040812091909155600160e11b8516900361153e5760018601600081815260056020526040812054900361153c57600154811461153c5760008181526005602052604090208590555b505b60405186906000906001600160a01b03861690600080516020611fef833981519152908390a4505060028054600101905550505050565b6000816001548110156115ca5760008181526005602052604081205490600160e01b821690036115c8575b806000036115c15750600019016000818152600560205260409020546115a0565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61163e848484610a33565b6001600160a01b0383163b15610fbe5761165a848484846117ed565b610fbe576040516368d2bf6b60e11b815260040160405180910390fd5b60608160000361169e5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156116c857806116b281611f14565b91506116c19050600a83611f43565b91506116a2565b60008167ffffffffffffffff8111156116e3576116e3611b60565b6040519080825280601f01601f19166020018201604052801561170d576020820181803683370190505b5090505b841561177857611722600183611f57565b915061172f600a86611f6a565b61173a906030611d57565b60f81b81838151811061174f5761174f611f7e565b60200101906001600160f81b031916908160001a905350611771600a86611f43565b9450611711565b949350505050565b61178a83836118d8565b6001600160a01b0383163b15610ae7576001548281035b6117b460008683806001019450866117ed565b6117d1576040516368d2bf6b60e11b815260040160405180910390fd5b8181106117a15781600154146117e657600080fd5b5050505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611822903390899088908890600401611f94565b6020604051808303816000875af192505050801561185d575060408051601f3d908101601f1916820190925261185a91810190611fd1565b60015b6118bb573d80801561188b576040519150601f19603f3d011682016040523d82523d6000602084013e611890565b606091505b5080516000036118b3576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b60015460008290036118fd5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526006602090815260408083208054680100000000000000018802019055848352600590915281206001851460e11b4260a01b17831790558284019083908390600080516020611fef8339815191528180a4600183015b8181146119885780836000600080516020611fef833981519152600080a4600101611962565b50816000036119a957604051622e076360e81b815260040160405180910390fd5b60015550505050565b6001600160e01b031981168114610ca257600080fd5b6000602082840312156119da57600080fd5b81356115c1816119b2565b60005b83811015611a005781810151838201526020016119e8565b50506000910152565b60008151808452611a218160208601602086016119e5565b601f01601f19169290920160200192915050565b6020815260006115c16020830184611a09565b600060208284031215611a5a57600080fd5b5035919050565b80356001600160a01b0381168114611a7857600080fd5b919050565b60008060408385031215611a9057600080fd5b611a9983611a61565b946020939093013593505050565b600080600060608486031215611abc57600080fd5b611ac584611a61565b9250611ad360208501611a61565b9150604084013590509250925092565b600060208284031215611af557600080fd5b6115c182611a61565b8015158114610ca257600080fd5b600060208284031215611b1e57600080fd5b81356115c181611afe565b60008060408385031215611b3c57600080fd5b611b4583611a61565b91506020830135611b5581611afe565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611b9157611b91611b60565b604051601f8501601f19908116603f01168101908282118183101715611bb957611bb9611b60565b81604052809350858152868686011115611bd257600080fd5b858560208301376000602087830101525050509392505050565b60008060008060808587031215611c0257600080fd5b611c0b85611a61565b9350611c1960208601611a61565b925060408501359150606085013567ffffffffffffffff811115611c3c57600080fd5b8501601f81018713611c4d57600080fd5b611c5c87823560208401611b76565b91505092959194509250565b600060208284031215611c7a57600080fd5b813567ffffffffffffffff811115611c9157600080fd5b8201601f81018413611ca257600080fd5b61177884823560208401611b76565b60008060408385031215611cc457600080fd5b611ccd83611a61565b9150611cdb60208401611a61565b90509250929050565b60008060408385031215611cf757600080fd5b82359150611cdb60208401611a61565b600181811c90821680611d1b57607f821691505b602082108103611d3b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156106a2576106a2611d41565b600060208284031215611d7c57600080fd5b81516115c181611afe565b6000808454611d9581611d07565b60018281168015611dad5760018114611dc257611df1565b60ff1984168752821515830287019450611df1565b8860005260208060002060005b85811015611de85781548a820152908401908201611dcf565b50505082870194505b505050508351611e058183602088016119e5565b01949350505050565b601f821115610ae757600081815260208120601f850160051c81016020861015611e355750805b601f850160051c820191505b818110156113bf57828155600101611e41565b815167ffffffffffffffff811115611e6e57611e6e611b60565b611e8281611e7c8454611d07565b84611e0e565b602080601f831160018114611eb75760008415611e9f5750858301515b600019600386901b1c1916600185901b1785556113bf565b600085815260208120601f198616915b82811015611ee657888601518255948401946001909101908401611ec7565b5085821015611f045787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060018201611f2657611f26611d41565b5060010190565b634e487b7160e01b600052601260045260246000fd5b600082611f5257611f52611f2d565b500490565b818103818111156106a2576106a2611d41565b600082611f7957611f79611f2d565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611fc790830184611a09565b9695505050505050565b600060208284031215611fe357600080fd5b81516115c1816119b256feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212205be227bbcbbeb329efc1d5309b05582dd6297bd95a239cacd570145c8fb2437464736f6c63430008120033
Deployed Bytecode
0x60806040526004361061021a5760003560e01c806370a0823111610123578063c87b56dd116100ab578063dbddb26a1161006f578063dbddb26a146105c1578063e985e9c5146105d6578063efdcd974146105f6578063f2fde38b14610616578063f77777471461063657600080fd5b8063c87b56dd14610531578063d44e6d2014610551578063d7d1e57e14610567578063d8fae8c514610587578063dab4c827146105a157600080fd5b806391267659116100f257806391267659146104b357806395d89b41146104d3578063a22cb465146104e8578063b88d4fde14610508578063c2047ebf1461051b57600080fd5b806370a0823114610440578063715018a614610460578063818668d7146104755780638da5cb5b1461049557600080fd5b80632b26a6bf116101a657806342966c681161017557806342966c68146103a0578063479ba2da146103c0578063502fb3ff146103e05780636352211e146104005780636730cfa01461042057600080fd5b80632b26a6bf146103375780632b7e66d2146103575780633bdf774c1461037757806342842e0e1461038d57600080fd5b80630d730acc116101ed5780630d730acc146102c357806318160ddd146102d65780631fbe829c146102f957806323b872dd1461030f57806324600fc31461032257600080fd5b806301ffc9a71461021f57806306fdde0314610254578063081812fc14610276578063095ea7b3146102ae575b600080fd5b34801561022b57600080fd5b5061023f61023a3660046119c8565b610656565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b506102696106a8565b60405161024b9190611a35565b34801561028257600080fd5b50610296610291366004611a48565b61073a565b6040516001600160a01b03909116815260200161024b565b6102c16102bc366004611a7d565b61077e565b005b6102c16102d1366004611a48565b61081e565b3480156102e257600080fd5b50600254600154035b60405190815260200161024b565b34801561030557600080fd5b506102eb600e5481565b6102c161031d366004611aa7565b610a33565b34801561032e57600080fd5b506102c1610aec565b34801561034357600080fd5b506102c1610352366004611a48565b610bd6565b34801561036357600080fd5b50600f54610296906001600160a01b031681565b34801561038357600080fd5b506102eb600c5481565b6102c161039b366004611aa7565b610be3565b3480156103ac57600080fd5b506102c16103bb366004611a48565b610c97565b3480156103cc57600080fd5b506102c16103db366004611ae3565b610ca5565b3480156103ec57600080fd5b506102c16103fb366004611a48565b610ccf565b34801561040c57600080fd5b5061029661041b366004611a48565b610df8565b34801561042c57600080fd5b50601154610296906001600160a01b031681565b34801561044c57600080fd5b506102eb61045b366004611ae3565b610e03565b34801561046c57600080fd5b506102c1610e52565b34801561048157600080fd5b506102c1610490366004611b0c565b610e66565b3480156104a157600080fd5b506000546001600160a01b0316610296565b3480156104bf57600080fd5b506102c16104ce366004611a48565b610e81565b3480156104df57600080fd5b50610269610e8e565b3480156104f457600080fd5b506102c1610503366004611b29565b610e9d565b6102c1610516366004611bec565b610f09565b34801561052757600080fd5b506102eb60105481565b34801561053d57600080fd5b5061026961054c366004611a48565b610fc4565b34801561055d57600080fd5b506102eb600d5481565b34801561057357600080fd5b506102c1610582366004611c68565b610ff8565b34801561059357600080fd5b50600b5461023f9060ff1681565b3480156105ad57600080fd5b506102c16105bc366004611a48565b611010565b3480156105cd57600080fd5b5061026961101d565b3480156105e257600080fd5b5061023f6105f1366004611cb1565b6110ab565b34801561060257600080fd5b506102c1610611366004611ae3565b6110d9565b34801561062257600080fd5b506102c1610631366004611ae3565b611103565b34801561064257600080fd5b506102c1610651366004611ce4565b611179565b60006301ffc9a760e01b6001600160e01b03198316148061068757506380ac58cd60e01b6001600160e01b03198316145b806106a25750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600380546106b790611d07565b80601f01602080910402602001604051908101604052809291908181526020018280546106e390611d07565b80156107305780601f1061070557610100808354040283529160200191610730565b820191906000526020600020905b81548152906001019060200180831161071357829003601f168201915b5050505050905090565b6000610745826111f4565b610762576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b600061078982610df8565b9050336001600160a01b038216146107c2576107a581336110ab565b6107c2576040516367d9dca160e11b815260040160405180910390fd5b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b3233146108725760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e7472616374000060448201526064015b60405180910390fd5b6002600954036108c45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610869565b6002600955600b5460ff1661090f5760405162461bcd60e51b81526020600482015260116024820152704d696e74206e6f7420737461727465642160781b6044820152606401610869565b600c54816109206002546001540390565b61092a9190611d57565b111561096a5760405162461bcd60e51b815260206004820152600f60248201526e4d696e7420636f6d706c657465642160881b6044820152606401610869565b600d548111156109bc5760405162461bcd60e51b815260206004820152601f60248201527f547269656420746f206d696e74206f766572206261746368206c696d69742e006044820152606401610869565b600e54816109c933610e03565b6109d39190611d57565b1115610a215760405162461bcd60e51b815260206004820181905260248201527f547269656420746f206d696e74206f7665722077616c6c6574206c696d69742e6044820152606401610869565b610a2b338261121c565b506001600955565b6daaeb6d7670e522a718067333cd4e3b15610adc57604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af1158015610a99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abd9190611d6a565b610adc57604051633b79c77360e21b8152336004820152602401610869565b610ae7838383611236565b505050565b610af46113c7565b600260095403610b465760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610869565b6002600955604051600090339047908381818185875af1925050503d8060008114610b8d576040519150601f19603f3d011682016040523d82523d6000602084013e610b92565b606091505b5050905080610a2b5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610869565b610bde6113c7565b600d55565b6daaeb6d7670e522a718067333cd4e3b15610c8c57604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af1158015610c49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6d9190611d6a565b610c8c57604051633b79c77360e21b8152336004820152602401610869565b610ae7838383611421565b610ca281600161143c565b50565b610cad6113c7565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b33610cd982610df8565b6001600160a01b031614610d2f5760405162461bcd60e51b815260206004820181905260248201527f596f75277265206e6f7420746865206f776e6572206f6620746865204e46542e6044820152606401610869565b600f546011546010546040516323b872dd60e01b81523360048201526001600160a01b03928316602482015260448101919091529116906323b872dd906064016020604051808303816000875af1158015610d8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db29190611d6a565b506010546040805183815233602082015280820192909252517f1bf4c2301fe31c472236d04b38da322696352ecd6d828b681dbbfb87f13e68cb9181900360600190a150565b60006106a282611575565b60006001600160a01b038216610e2c576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205467ffffffffffffffff1690565b610e5a6113c7565b610e6460006115e3565b565b610e6e6113c7565b600b805460ff1916911515919091179055565b610e896113c7565b600e55565b6060600480546106b790611d07565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6daaeb6d7670e522a718067333cd4e3b15610fb257604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af1158015610f6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f939190611d6a565b610fb257604051633b79c77360e21b8152336004820152602401610869565b610fbe84848484611633565b50505050565b6060600a610fd183611677565b604051602001610fe2929190611d87565b6040516020818303038152906040529050919050565b6110006113c7565b600a61100c8282611e54565b5050565b6110186113c7565b601055565b600a805461102a90611d07565b80601f016020809104026020016040519081016040528092919081815260200182805461105690611d07565b80156110a35780601f10611078576101008083540402835291602001916110a3565b820191906000526020600020905b81548152906001019060200180831161108657829003601f168201915b505050505081565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b6110e16113c7565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b61110b6113c7565b6001600160a01b0381166111705760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610869565b610ca2816115e3565b6111816113c7565b600c54826111926002546001540390565b61119c9190611d57565b11156111ea5760405162461bcd60e51b815260206004820152601860248201527f4e6f206d6f726520667265616b7320696e2073746f636b2100000000000000006044820152606401610869565b61100c818361121c565b6000600154821080156106a2575050600090815260056020526040902054600160e01b161590565b61100c828260405180602001604052806000815250611780565b600061124182611575565b9050836001600160a01b0316816001600160a01b0316146112745760405162a1148160e81b815260040160405180910390fd5b600082815260076020526040902080546112a08187335b6001600160a01b039081169116811491141790565b6112cb576112ae86336110ab565b6112cb57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166112f257604051633a954ecd60e21b815260040160405180910390fd5b80156112fd57600082555b6001600160a01b038681166000908152600660205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260056020526040812091909155600160e11b8416900361138f5760018401600081815260056020526040812054900361138d57600154811461138d5760008181526005602052604090208490555b505b83856001600160a01b0316876001600160a01b0316600080516020611fef83398151915260405160405180910390a45b505050505050565b6000546001600160a01b03163314610e645760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610869565b610ae783838360405180602001604052806000815250610f09565b600061144783611575565b90508060008061146586600090815260076020526040902080549091565b9150915084156114a55761147a81843361128b565b6114a55761148883336110ab565b6114a557604051632ce44b5f60e11b815260040160405180910390fd5b80156114b057600082555b6001600160a01b038316600081815260066020526040902080546fffffffffffffffffffffffffffffffff0190554260a01b17600360e01b17600087815260056020526040812091909155600160e11b8516900361153e5760018601600081815260056020526040812054900361153c57600154811461153c5760008181526005602052604090208590555b505b60405186906000906001600160a01b03861690600080516020611fef833981519152908390a4505060028054600101905550505050565b6000816001548110156115ca5760008181526005602052604081205490600160e01b821690036115c8575b806000036115c15750600019016000818152600560205260409020546115a0565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61163e848484610a33565b6001600160a01b0383163b15610fbe5761165a848484846117ed565b610fbe576040516368d2bf6b60e11b815260040160405180910390fd5b60608160000361169e5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156116c857806116b281611f14565b91506116c19050600a83611f43565b91506116a2565b60008167ffffffffffffffff8111156116e3576116e3611b60565b6040519080825280601f01601f19166020018201604052801561170d576020820181803683370190505b5090505b841561177857611722600183611f57565b915061172f600a86611f6a565b61173a906030611d57565b60f81b81838151811061174f5761174f611f7e565b60200101906001600160f81b031916908160001a905350611771600a86611f43565b9450611711565b949350505050565b61178a83836118d8565b6001600160a01b0383163b15610ae7576001548281035b6117b460008683806001019450866117ed565b6117d1576040516368d2bf6b60e11b815260040160405180910390fd5b8181106117a15781600154146117e657600080fd5b5050505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611822903390899088908890600401611f94565b6020604051808303816000875af192505050801561185d575060408051601f3d908101601f1916820190925261185a91810190611fd1565b60015b6118bb573d80801561188b576040519150601f19603f3d011682016040523d82523d6000602084013e611890565b606091505b5080516000036118b3576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b60015460008290036118fd5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526006602090815260408083208054680100000000000000018802019055848352600590915281206001851460e11b4260a01b17831790558284019083908390600080516020611fef8339815191528180a4600183015b8181146119885780836000600080516020611fef833981519152600080a4600101611962565b50816000036119a957604051622e076360e81b815260040160405180910390fd5b60015550505050565b6001600160e01b031981168114610ca257600080fd5b6000602082840312156119da57600080fd5b81356115c1816119b2565b60005b83811015611a005781810151838201526020016119e8565b50506000910152565b60008151808452611a218160208601602086016119e5565b601f01601f19169290920160200192915050565b6020815260006115c16020830184611a09565b600060208284031215611a5a57600080fd5b5035919050565b80356001600160a01b0381168114611a7857600080fd5b919050565b60008060408385031215611a9057600080fd5b611a9983611a61565b946020939093013593505050565b600080600060608486031215611abc57600080fd5b611ac584611a61565b9250611ad360208501611a61565b9150604084013590509250925092565b600060208284031215611af557600080fd5b6115c182611a61565b8015158114610ca257600080fd5b600060208284031215611b1e57600080fd5b81356115c181611afe565b60008060408385031215611b3c57600080fd5b611b4583611a61565b91506020830135611b5581611afe565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611b9157611b91611b60565b604051601f8501601f19908116603f01168101908282118183101715611bb957611bb9611b60565b81604052809350858152868686011115611bd257600080fd5b858560208301376000602087830101525050509392505050565b60008060008060808587031215611c0257600080fd5b611c0b85611a61565b9350611c1960208601611a61565b925060408501359150606085013567ffffffffffffffff811115611c3c57600080fd5b8501601f81018713611c4d57600080fd5b611c5c87823560208401611b76565b91505092959194509250565b600060208284031215611c7a57600080fd5b813567ffffffffffffffff811115611c9157600080fd5b8201601f81018413611ca257600080fd5b61177884823560208401611b76565b60008060408385031215611cc457600080fd5b611ccd83611a61565b9150611cdb60208401611a61565b90509250929050565b60008060408385031215611cf757600080fd5b82359150611cdb60208401611a61565b600181811c90821680611d1b57607f821691505b602082108103611d3b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156106a2576106a2611d41565b600060208284031215611d7c57600080fd5b81516115c181611afe565b6000808454611d9581611d07565b60018281168015611dad5760018114611dc257611df1565b60ff1984168752821515830287019450611df1565b8860005260208060002060005b85811015611de85781548a820152908401908201611dcf565b50505082870194505b505050508351611e058183602088016119e5565b01949350505050565b601f821115610ae757600081815260208120601f850160051c81016020861015611e355750805b601f850160051c820191505b818110156113bf57828155600101611e41565b815167ffffffffffffffff811115611e6e57611e6e611b60565b611e8281611e7c8454611d07565b84611e0e565b602080601f831160018114611eb75760008415611e9f5750858301515b600019600386901b1c1916600185901b1785556113bf565b600085815260208120601f198616915b82811015611ee657888601518255948401946001909101908401611ec7565b5085821015611f045787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060018201611f2657611f26611d41565b5060010190565b634e487b7160e01b600052601260045260246000fd5b600082611f5257611f52611f2d565b500490565b818103818111156106a2576106a2611d41565b600082611f7957611f79611f2d565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611fc790830184611a09565b9695505050505050565b600060208284031215611fe357600080fd5b81516115c1816119b256feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212205be227bbcbbeb329efc1d5309b05582dd6297bd95a239cacd570145c8fb2437464736f6c63430008120033
Deployed Bytecode Sourcemap
36694:4381:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14503:242;;;;;;;;;;-1:-1:-1;14503:242:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;14503:242:0;;;;;;;;14753:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;18329:218::-;;;;;;;;;;-1:-1:-1;18329:218:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;18329:218:0;1533:203:1;17913:408:0;;;;;;:::i;:::-;;:::i;:::-;;38372:500;;;;;;:::i;:::-;;:::i;12868:180::-;;;;;;;;;;-1:-1:-1;12999:12:0;;12983:13;;:28;12868:180;;;2324:25:1;;;2312:2;2297:18;12868:180:0;2178:177:1;36975:35:0;;;;;;;;;;;;;;;;37701:185;;;;;;:::i;:::-;;:::i;39115:191::-;;;;;;;;;;;;;:::i;39699:99::-;;;;;;;;;;-1:-1:-1;39699:99:0;;;;;:::i;:::-;;:::i;37019:24::-;;;;;;;;;;-1:-1:-1;37019:24:0;;;;-1:-1:-1;;;;;37019:24:0;;;36893:35;;;;;;;;;;;;;;;;37894:193;;;;;;:::i;:::-;;:::i;33869:94::-;;;;;;;;;;-1:-1:-1;33869:94:0;;;;;:::i;:::-;;:::i;40470:111::-;;;;;;;;;;-1:-1:-1;40470:111:0;;;;;:::i;:::-;;:::i;40655:415::-;;;;;;;;;;-1:-1:-1;40655:415:0;;;;;:::i;:::-;;:::i;15401:152::-;;;;;;;;;;-1:-1:-1;15401:152:0;;;;;:::i;:::-;;:::i;37101:28::-;;;;;;;;;;-1:-1:-1;37101:28:0;;;;-1:-1:-1;;;;;37101:28:0;;;13333:233;;;;;;;;;;-1:-1:-1;13333:233:0;;;;;:::i;:::-;;:::i;883:103::-;;;;;;;;;;;;;:::i;38939:95::-;;;;;;;;;;-1:-1:-1;38939:95:0;;;;;:::i;:::-;;:::i;648:87::-;;;;;;;;;;-1:-1:-1;694:7:0;721:6;-1:-1:-1;;;;;721:6:0;648:87;;39530:108;;;;;;;;;;-1:-1:-1;39530:108:0;;;;;:::i;:::-;;:::i;14861:104::-;;;;;;;;;;;;;:::i;18555:234::-;;;;;;;;;;-1:-1:-1;18555:234:0;;;;;:::i;:::-;;:::i;38095:218::-;;;;;;:::i;:::-;;:::i;37050:42::-;;;;;;;;;;;;;;;;39852:189;;;;;;;;;;-1:-1:-1;39852:189:0;;;;;:::i;:::-;;:::i;36936:32::-;;;;;;;;;;;;;;;;39363:102;;;;;;;;;;-1:-1:-1;39363:102:0;;;;;:::i;:::-;;:::i;36853:33::-;;;;;;;;;;-1:-1:-1;36853:33:0;;;;;;;;40116:90;;;;;;;;;;-1:-1:-1;40116:90:0;;;;;:::i;:::-;;:::i;36822:22::-;;;;;;;;;;;;;:::i;18797:164::-;;;;;;;;;;-1:-1:-1;18797:164:0;;;;;:::i;:::-;;:::i;40287:101::-;;;;;;;;;;-1:-1:-1;40287:101:0;;;;;:::i;:::-;;:::i;996:201::-;;;;;;;;;;-1:-1:-1;996:201:0;;;;;:::i;:::-;;:::i;37306:258::-;;;;;;;;;;-1:-1:-1;37306:258:0;;;;;:::i;:::-;;:::i;14503:242::-;14588:4;-1:-1:-1;;;;;;;;;14625:25:0;;;;:68;;-1:-1:-1;;;;;;;;;;14668:25:0;;;14625:68;:111;;;-1:-1:-1;;;;;;;;;;14711:25:0;;;14625:111;14605:131;14503:242;-1:-1:-1;;14503:242:0:o;14753:100::-;14807:13;14840:5;14833:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14753:100;:::o;18329:218::-;18405:7;18430:16;18438:7;18430;:16::i;:::-;18425:64;;18455:34;;-1:-1:-1;;;18455:34:0;;;;;;;;;;;18425:64;-1:-1:-1;18509:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;18509:30:0;;18329:218::o;17913:408::-;18002:13;18018:16;18026:7;18018;:16::i;:::-;18002:32;-1:-1:-1;29436:10:0;-1:-1:-1;;;;;18051:28:0;;;18047:175;;18099:44;18116:5;29436:10;18797:164;:::i;18099:44::-;18094:128;;18171:35;;-1:-1:-1;;;18171:35:0;;;;;;;;;;;18094:128;18234:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;18234:35:0;-1:-1:-1;;;;;18234:35:0;;;;;;;;;18285:28;;18234:24;;18285:28;;;;;;;17991:330;17913:408;;:::o;38372:500::-;37615:9;37628:10;37615:23;37607:66;;;;-1:-1:-1;;;37607:66:0;;6801:2:1;37607:66:0;;;6783:21:1;6840:2;6820:18;;;6813:30;6879:32;6859:18;;;6852:60;6929:18;;37607:66:0;;;;;;;;;1557:1:::1;1715:7;;:19:::0;1707:63:::1;;;::::0;-1:-1:-1;;;1707:63:0;;7160:2:1;1707:63:0::1;::::0;::::1;7142:21:1::0;7199:2;7179:18;;;7172:30;7238:33;7218:18;;;7211:61;7289:18;;1707:63:0::1;6958:355:1::0;1707:63:0::1;1557:1;1783:7;:18:::0;38510:13:::2;::::0;::::2;;38502:43;;;::::0;-1:-1:-1;;;38502:43:0;;7520:2:1;38502:43:0::2;::::0;::::2;7502:21:1::0;7559:2;7539:18;;;7532:30;-1:-1:-1;;;7578:18:1;;;7571:47;7635:18;;38502:43:0::2;7318:341:1::0;38502:43:0::2;38592:16;;38580:8;38564:13;12999:12:::0;;12983:13;;:28;;12868:180;38564:13:::2;:24;;;;:::i;:::-;:44;;38556:72;;;::::0;-1:-1:-1;;;38556:72:0;;8128:2:1;38556:72:0::2;::::0;::::2;8110:21:1::0;8167:2;8147:18;;;8140:30;-1:-1:-1;;;8186:18:1;;;8179:45;8241:18;;38556:72:0::2;7926:339:1::0;38556:72:0::2;38659:15;;38647:8;:27;;38639:71;;;::::0;-1:-1:-1;;;38639:71:0;;8472:2:1;38639:71:0::2;::::0;::::2;8454:21:1::0;8511:2;8491:18;;;8484:30;8550:33;8530:18;;;8523:61;8601:18;;38639:71:0::2;8270:355:1::0;38639:71:0::2;38765:18;;38753:8;38729:21;38739:10;38729:9;:21::i;:::-;:32;;;;:::i;:::-;:54;;38721:99;;;::::0;-1:-1:-1;;;38721:99:0;;8832:2:1;38721:99:0::2;::::0;::::2;8814:21:1::0;;;8851:18;;;8844:30;8910:34;8890:18;;;8883:62;8962:18;;38721:99:0::2;8630:356:1::0;38721:99:0::2;38833:31;38843:10;38855:8;38833:9;:31::i;:::-;-1:-1:-1::0;1513:1:0::1;1828:7;:22:::0;38372:500::o;37701:185::-;30322:42;31065:43;:47;31061:225;;31134:67;;-1:-1:-1;;;31134:67:0;;31183:4;31134:67;;;9203:34:1;31190:10:0;9253:18:1;;;9246:43;30322:42:0;;31134:40;;9138:18:1;;31134:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31129:146;;31229:30;;-1:-1:-1;;;31229:30:0;;31248:10;31229:30;;;1679:51:1;1652:18;;31229:30:0;1533:203:1;31129:146:0;37841:37:::1;37860:4;37866:2;37870:7;37841:18;:37::i;:::-;37701:185:::0;;;:::o;39115:191::-;607:13;:11;:13::i;:::-;1557:1:::1;1715:7;;:19:::0;1707:63:::1;;;::::0;-1:-1:-1;;;1707:63:0;;7160:2:1;1707:63:0::1;::::0;::::1;7142:21:1::0;7199:2;7179:18;;;7172:30;7238:33;7218:18;;;7211:61;7289:18;;1707:63:0::1;6958:355:1::0;1707:63:0::1;1557:1;1783:7;:18:::0;39202:49:::2;::::0;39184:12:::2;::::0;39202:10:::2;::::0;39225:21:::2;::::0;39184:12;39202:49;39184:12;39202:49;39225:21;39202:10;:49:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39183:68;;;39270:7;39262:36;;;::::0;-1:-1:-1;;;39262:36:0;;9962:2:1;39262:36:0::2;::::0;::::2;9944:21:1::0;10001:2;9981:18;;;9974:30;-1:-1:-1;;;10020:18:1;;;10013:46;10076:18;;39262:36:0::2;9760:340:1::0;39699:99:0;607:13;:11;:13::i;:::-;39768:15:::1;:22:::0;39699:99::o;37894:193::-;30322:42;31065:43;:47;31061:225;;31134:67;;-1:-1:-1;;;31134:67:0;;31183:4;31134:67;;;9203:34:1;31190:10:0;9253:18:1;;;9246:43;30322:42:0;;31134:40;;9138:18:1;;31134:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31129:146;;31229:30;;-1:-1:-1;;;31229:30:0;;31248:10;31229:30;;;1679:51:1;1652:18;;31229:30:0;1533:203:1;31129:146:0;38038:41:::1;38061:4;38067:2;38071:7;38038:22;:41::i;33869:94::-:0;33935:20;33941:7;33950:4;33935:5;:20::i;:::-;33869:94;:::o;40470:111::-;607:13;:11;:13::i;:::-;40540:10:::1;:33:::0;;-1:-1:-1;;;;;;40540:33:0::1;-1:-1:-1::0;;;;;40540:33:0;;;::::1;::::0;;;::::1;::::0;;40470:111::o;40655:415::-;40787:10;40766:17;40774:8;40766:7;:17::i;:::-;-1:-1:-1;;;;;40766:31:0;;40758:76;;;;-1:-1:-1;;;40758:76:0;;10307:2:1;40758:76:0;;;10289:21:1;;;10326:18;;;10319:30;10385:34;10365:18;;;10358:62;10437:18;;40758:76:0;10105:356:1;40758:76:0;40885:10;;40921:13;;40936:12;;40885:64;;-1:-1:-1;;;40885:64:0;;40909:10;40885:64;;;10706:34:1;-1:-1:-1;;;;;40921:13:0;;;10756:18:1;;;10749:43;10808:18;;;10801:34;;;;40885:10:0;;;:23;;10641:18:1;;40885:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;41039:12:0;;40967:95;;;11048:25:1;;;41014:10:0;11104:2:1;11089:18;;11082:60;11158:18;;;11151:34;;;;40967:95:0;;;;;;11036:2:1;40967:95:0;;;40655:415;:::o;15401:152::-;15473:7;15516:27;15535:7;15516:18;:27::i;13333:233::-;13405:7;-1:-1:-1;;;;;13429:19:0;;13425:60;;13457:28;;-1:-1:-1;;;13457:28:0;;;;;;;;;;;13425:60;-1:-1:-1;;;;;;13503:25:0;;;;;:18;:25;;;;;;11141:13;13503:55;;13333:233::o;883:103::-;607:13;:11;:13::i;:::-;948:30:::1;975:1;948:18;:30::i;:::-;883:103::o:0;38939:95::-;607:13;:11;:13::i;:::-;39007::::1;:19:::0;;-1:-1:-1;;39007:19:0::1;::::0;::::1;;::::0;;;::::1;::::0;;38939:95::o;39530:108::-;607:13;:11;:13::i;:::-;39605:18:::1;:25:::0;39530:108::o;14861:104::-;14917:13;14950:7;14943:14;;;;;:::i;18555:234::-;29436:10;18650:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;18650:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;18650:60:0;;;;;;;;;;18726:55;;540:41:1;;;18650:49:0;;29436:10;18726:55;;513:18:1;18726:55:0;;;;;;;18555:234;;:::o;38095:218::-;30322:42;31065:43;:47;31061:225;;31134:67;;-1:-1:-1;;;31134:67:0;;31183:4;31134:67;;;9203:34:1;31190:10:0;9253:18:1;;;9246:43;30322:42:0;;31134:40;;9138:18:1;;31134:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31129:146;;31229:30;;-1:-1:-1;;;31229:30:0;;31248:10;31229:30;;;1679:51:1;1652:18;;31229:30:0;1533:203:1;31129:146:0;38258:47:::1;38281:4;38287:2;38291:7;38300:4;38258:22;:47::i;:::-;38095:218:::0;;;;:::o;39852:189::-;39938:13;39995:8;40005:26;40022:8;40005:16;:26::i;:::-;39978:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39964:69;;39852:189;;;:::o;39363:102::-;607:13;:11;:13::i;:::-;39438:8:::1;:19;39449:8:::0;39438;:19:::1;:::i;:::-;;39363:102:::0;:::o;40116:90::-;607:13;:11;:13::i;:::-;40180:12:::1;:18:::0;40116:90::o;36822:22::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18797:164::-;-1:-1:-1;;;;;18918:25:0;;;18894:4;18918:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;18797:164::o;40287:101::-;607:13;:11;:13::i;:::-;40352::::1;:28:::0;;-1:-1:-1;;;;;;40352:28:0::1;-1:-1:-1::0;;;;;40352:28:0;;;::::1;::::0;;;::::1;::::0;;40287:101::o;996:201::-;607:13;:11;:13::i;:::-;-1:-1:-1;;;;;1085:22:0;::::1;1077:73;;;::::0;-1:-1:-1;;;1077:73:0;;14627:2:1;1077:73:0::1;::::0;::::1;14609:21:1::0;14666:2;14646:18;;;14639:30;14705:34;14685:18;;;14678:62;-1:-1:-1;;;14756:18:1;;;14749:36;14802:19;;1077:73:0::1;14425:402:1::0;1077:73:0::1;1161:28;1180:8;1161:18;:28::i;37306:258::-:0;607:13;:11;:13::i;:::-;37438:16:::1;;37426:8;37410:13;12999:12:::0;;12983:13;;:28;;12868:180;37410:13:::1;:24;;;;:::i;:::-;:44;;37388:118;;;::::0;-1:-1:-1;;;37388:118:0;;15034:2:1;37388:118:0::1;::::0;::::1;15016:21:1::0;15073:2;15053:18;;;15046:30;15112:26;15092:18;;;15085:54;15156:18;;37388:118:0::1;14832:348:1::0;37388:118:0::1;37527:29;37537:8;37547;37527:9;:29::i;18969:282::-:0;19034:4;19124:13;;19114:7;:23;19071:153;;;;-1:-1:-1;;19175:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;19175:44:0;:49;;18969:282::o;26502:112::-;26579:27;26589:2;26593:8;26579:27;;;;;;;;;;;;:9;:27::i;20064:1651::-;20206:27;20236;20255:7;20236:18;:27::i;:::-;20206:57;;20321:4;-1:-1:-1;;;;;20280:45:0;20296:19;-1:-1:-1;;;;;20280:45:0;;20276:86;;20334:28;;-1:-1:-1;;;20334:28:0;;;;;;;;;;;20276:86;20376:27;19877:24;;;:15;:24;;;;;20012:26;;20485:68;20012:26;20527:4;29436:10;20533:19;-1:-1:-1;;;;;19524:32:0;;;19467:28;;19585:20;;19607:30;;19582:56;;19259:397;20485:68;20480:180;;20573:43;20590:4;29436:10;18797:164;:::i;20573:43::-;20568:92;;20625:35;;-1:-1:-1;;;20625:35:0;;;;;;;;;;;20568:92;-1:-1:-1;;;;;20677:16:0;;20673:52;;20702:23;;-1:-1:-1;;;20702:23:0;;;;;;;;;;;20673:52;20821:15;20818:85;;;20886:1;20865:19;20858:30;20818:85;-1:-1:-1;;;;;20955:24:0;;;;;;;:18;:24;;;;;;20953:26;;-1:-1:-1;;20953:26:0;;;20997:22;;;;;;;;;20995:24;;-1:-1:-1;20995:24:0;;;17534:11;17509:23;17505:41;17492:63;-1:-1:-1;;;17492:63:0;21037:26;;;;:17;:26;;;;;:175;;;;-1:-1:-1;;;21233:47:0;;:52;;21229:370;;21338:1;21328:11;;21306:19;21364:30;;;:17;:30;;;;;;:35;;21360:224;;21445:13;;21430:11;:28;21426:139;;21489:30;;;;:17;:30;;;;;:52;;;21426:139;21287:312;21229:370;21646:7;21642:2;-1:-1:-1;;;;;21627:27:0;21636:4;-1:-1:-1;;;;;21627:27:0;-1:-1:-1;;;;;;;;;;;21627:27:0;;;;;;;;;21665:42;20195:1520;;;20064:1651;;;:::o;743:132::-;694:7;721:6;-1:-1:-1;;;;;721:6:0;29436:10;807:23;799:68;;;;-1:-1:-1;;;799:68:0;;15387:2:1;799:68:0;;;15369:21:1;;;15406:18;;;15399:30;15465:34;15445:18;;;15438:62;15517:18;;799:68:0;15185:356:1;21723:193:0;21869:39;21886:4;21892:2;21896:7;21869:39;;;;;;;;;;;;:16;:39::i;26719:1679::-;26799:27;26829;26848:7;26829:18;:27::i;:::-;26799:57;-1:-1:-1;26799:57:0;26869:12;;26991:35;27018:7;19766:27;19877:24;;;:15;:24;;;;;20012:26;;19877:24;;19664:392;26991:35;26934:92;;;;27043:13;27039:244;;;27092:68;27117:15;27134:4;29436:10;27140:19;29349:105;27092:68;27087:184;;27184:43;27201:4;29436:10;18797:164;:::i;27184:43::-;27179:92;;27236:35;;-1:-1:-1;;;27236:35:0;;;;;;;;;;;27179:92;27386:15;27383:101;;;27467:1;27446:19;27439:30;27383:101;-1:-1:-1;;;;;27534:24:0;;;;;;:18;:24;;;;;:60;;27562:32;27534:60;;;17534:11;17509:23;17505:41;17492:63;-1:-1:-1;;;17492:63:0;27611:26;;;;:17;:26;;;;;:205;;;;-1:-1:-1;;;27837:47:0;;:52;;27833:370;;27942:1;27932:11;;27910:19;27968:30;;;:17;:30;;;;;;:35;;27964:224;;28049:13;;28034:11;:28;28030:139;;28093:30;;;;:17;:30;;;;;:52;;;28030:139;27891:312;27833:370;28231:35;;28258:7;;28254:1;;-1:-1:-1;;;;;28231:35:0;;;-1:-1:-1;;;;;;;;;;;28231:35:0;28254:1;;28231:35;-1:-1:-1;;28365:12:0;:14;;;;;;-1:-1:-1;;;;26719:1679:0:o;16108:633::-;16175:7;16210;16312:13;;16305:4;:20;16301:373;;;16350:14;16367:23;;;:17;:23;;;;;;;-1:-1:-1;;;16419:24:0;;:29;;16415:240;;16479:113;16486:6;16496:1;16486:11;16479:113;;-1:-1:-1;;;16557:6:0;16539:25;;;;:17;:25;;;;;;16479:113;;;16625:6;16108:633;-1:-1:-1;;;16108:633:0:o;16415:240::-;16327:347;16301:373;16702:31;;-1:-1:-1;;;16702:31:0;;;;;;;;;;;1205:191;1279:16;1298:6;;-1:-1:-1;;;;;1315:17:0;;;-1:-1:-1;;;;;;1315:17:0;;;;;;1348:40;;1298:6;;;;;;;1348:40;;1279:16;1348:40;1268:128;1205:191;:::o;21924:407::-;22099:31;22112:4;22118:2;22122:7;22099:12;:31::i;:::-;-1:-1:-1;;;;;22145:14:0;;;:19;22141:183;;22184:56;22215:4;22221:2;22225:7;22234:5;22184:30;:56::i;:::-;22179:145;;22268:40;;-1:-1:-1;;;22268:40:0;;;;;;;;;;;2030:534;2086:13;2118:5;2127:1;2118:10;2114:53;;-1:-1:-1;;2145:10:0;;;;;;;;;;;;-1:-1:-1;;;2145:10:0;;;;;2030:534::o;2114:53::-;2192:5;2177:12;2233:78;2240:9;;2233:78;;2266:8;;;;:::i;:::-;;-1:-1:-1;2289:10:0;;-1:-1:-1;2297:2:0;2289:10;;:::i;:::-;;;2233:78;;;2321:19;2353:6;2343:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2343:17:0;;2321:39;;2371:154;2378:10;;2371:154;;2405:11;2415:1;2405:11;;:::i;:::-;;-1:-1:-1;2474:10:0;2482:2;2474:5;:10;:::i;:::-;2461:24;;:2;:24;:::i;:::-;2448:39;;2431:6;2438;2431:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;2431:56:0;;;;;;;;-1:-1:-1;2502:11:0;2511:2;2502:11;;:::i;:::-;;;2371:154;;;2549:6;2030:534;-1:-1:-1;;;;2030:534:0:o;25805:689::-;25936:19;25942:2;25946:8;25936:5;:19::i;:::-;-1:-1:-1;;;;;25997:14:0;;;:19;25993:483;;26051:13;;26099:14;;;26132:233;26163:62;26202:1;26206:2;26210:7;;;;;;26219:5;26163:30;:62::i;:::-;26158:167;;26261:40;;-1:-1:-1;;;26261:40:0;;;;;;;;;;;26158:167;26360:3;26352:5;:11;26132:233;;26447:3;26430:13;;:20;26426:34;;26452:8;;;26426:34;26018:458;;25805:689;;;:::o;22672:716::-;22856:88;;-1:-1:-1;;;22856:88:0;;22835:4;;-1:-1:-1;;;;;22856:45:0;;;;;:88;;29436:10;;22923:4;;22929:7;;22938:5;;22856:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22856:88:0;;;;;;;;-1:-1:-1;;22856:88:0;;;;;;;;;;;;:::i;:::-;;;22852:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23139:6;:13;23156:1;23139:18;23135:235;;23185:40;;-1:-1:-1;;;23185:40:0;;;;;;;;;;;23135:235;23328:6;23322:13;23313:6;23309:2;23305:15;23298:38;22852:529;-1:-1:-1;;;;;;23015:64:0;-1:-1:-1;;;23015:64:0;;-1:-1:-1;22672:716:0;;;;;;:::o;23396:1442::-;23492:13;;23469:20;23520:13;;;23516:44;;23542:18;;-1:-1:-1;;;23542:18:0;;;;;;;;;;;23516:44;-1:-1:-1;;;;;23674:22:0;;;;;;:18;:22;;;;11212:2;23674:22;;;:71;;23712:32;23700:45;;23674:71;;;23762:31;;;:17;:31;;;;;-1:-1:-1;17871:15:0;;17845:24;17841:46;17534:11;17509:23;17505:41;17502:52;17492:63;;23762:173;;23997:23;;;;23762:31;;23674:22;;-1:-1:-1;;;;;;;;;;;23674:22:0;;24124:215;24419:1;24405:12;24401:20;24359:279;24460:3;24451:7;24448:16;24359:279;;24611:7;24601:8;24598:1;-1:-1:-1;;;;;;;;;;;24568:1:0;24565;24560:59;24513:1;24500:15;24359:279;;;24363:77;24671:8;24683:1;24671:13;24667:45;;24693:19;;-1:-1:-1;;;24693:19:0;;;;;;;;;;;24667:45;24729:13;:19;-1:-1:-1;37701: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;7664:127::-;7725:10;7720:3;7716:20;7713:1;7706:31;7756:4;7753:1;7746:15;7780:4;7777:1;7770:15;7796:125;7861:9;;;7882:10;;;7879:36;;;7895:18;;:::i;9300:245::-;9367:6;9420:2;9408:9;9399:7;9395:23;9391:32;9388:52;;;9436:1;9433;9426:12;9388:52;9468:9;9462:16;9487:28;9509:5;9487:28;:::i;11322:1020::-;11498:3;11527:1;11560:6;11554:13;11590:36;11616:9;11590:36;:::i;:::-;11645:1;11662:18;;;11689:133;;;;11836:1;11831:356;;;;11655:532;;11689:133;-1:-1:-1;;11722:24:1;;11710:37;;11795:14;;11788:22;11776:35;;11767:45;;;-1:-1:-1;11689:133:1;;11831:356;11862:6;11859:1;11852:17;11892:4;11937:2;11934:1;11924:16;11962:1;11976:165;11990:6;11987:1;11984:13;11976:165;;;12068:14;;12055:11;;;12048:35;12111:16;;;;12005:10;;11976:165;;;11980:3;;;12170:6;12165:3;12161:16;12154:23;;11655:532;;;;;12218:6;12212:13;12234:68;12293:8;12288:3;12281:4;12273:6;12269:17;12234:68;:::i;:::-;12318:18;;11322:1020;-1:-1:-1;;;;11322:1020:1:o;12347:545::-;12449:2;12444:3;12441:11;12438:448;;;12485:1;12510:5;12506:2;12499:17;12555:4;12551:2;12541:19;12625:2;12613:10;12609:19;12606:1;12602:27;12596:4;12592:38;12661:4;12649:10;12646:20;12643:47;;;-1:-1:-1;12684:4:1;12643:47;12739:2;12734:3;12730:12;12727:1;12723:20;12717:4;12713:31;12703:41;;12794:82;12812:2;12805:5;12802:13;12794:82;;;12857:17;;;12838:1;12827:13;12794:82;;13068:1352;13194:3;13188:10;13221:18;13213:6;13210:30;13207:56;;;13243:18;;:::i;:::-;13272:97;13362:6;13322:38;13354:4;13348:11;13322:38;:::i;:::-;13316:4;13272:97;:::i;:::-;13424:4;;13488:2;13477:14;;13505:1;13500:663;;;;14207:1;14224:6;14221:89;;;-1:-1:-1;14276:19:1;;;14270:26;14221:89;-1:-1:-1;;13025:1:1;13021:11;;;13017:24;13013:29;13003:40;13049:1;13045:11;;;13000:57;14323:81;;13470:944;;13500:663;11269:1;11262:14;;;11306:4;11293:18;;-1:-1:-1;;13536:20:1;;;13654:236;13668:7;13665:1;13662:14;13654:236;;;13757:19;;;13751:26;13736:42;;13849:27;;;;13817:1;13805:14;;;;13684:19;;13654:236;;;13658:3;13918:6;13909:7;13906:19;13903:201;;;13979:19;;;13973:26;-1:-1:-1;;14062:1:1;14058:14;;;14074:3;14054:24;14050:37;14046:42;14031:58;14016:74;;13903:201;-1:-1:-1;;;;;14150:1:1;14134:14;;;14130:22;14117:36;;-1:-1:-1;13068:1352:1:o;15546:135::-;15585:3;15606:17;;;15603:43;;15626:18;;:::i;:::-;-1:-1:-1;15673:1:1;15662:13;;15546:135::o;15686:127::-;15747:10;15742:3;15738:20;15735:1;15728:31;15778:4;15775:1;15768:15;15802:4;15799:1;15792:15;15818:120;15858:1;15884;15874:35;;15889:18;;:::i;:::-;-1:-1:-1;15923:9:1;;15818:120::o;15943:128::-;16010:9;;;16031:11;;;16028:37;;;16045:18;;:::i;16076:112::-;16108:1;16134;16124:35;;16139:18;;:::i;:::-;-1:-1:-1;16173:9:1;;16076:112::o;16193:127::-;16254:10;16249:3;16245:20;16242:1;16235:31;16285:4;16282:1;16275:15;16309:4;16306:1;16299:15;16325:489;-1:-1:-1;;;;;16594:15:1;;;16576:34;;16646:15;;16641:2;16626:18;;16619:43;16693:2;16678:18;;16671:34;;;16741:3;16736:2;16721:18;;16714:31;;;16519:4;;16762:46;;16788:19;;16780:6;16762:46;:::i;:::-;16754:54;16325:489;-1:-1:-1;;;;;;16325:489:1:o;16819:249::-;16888:6;16941:2;16929:9;16920:7;16916:23;16912:32;16909:52;;;16957:1;16954;16947:12;16909:52;16989:9;16983:16;17008:30;17032:5;17008:30;:::i
Swarm Source
ipfs://5be227bbcbbeb329efc1d5309b05582dd6297bd95a239cacd570145c8fb24374
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.